From d08ed4118535d23d5c0a6b6fd519c7856543af09 Mon Sep 17 00:00:00 2001 From: Roman Priesol Date: Fri, 11 Sep 2026 20:52:11 +0200 Subject: [PATCH] Replace offline basemap pipeline with Planetiler, unify online/offline styling MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Offline tiles were built from Protomaps' own basemap schema, needing a completely separate hand-tuned theme (protomaps-themes-base + OFFLINE_THEME) from the online Liberty style's ONLINE_STYLE_PATCH — the two could never be made to match exactly no matter how much either side got tuned (today's session found and fixed several mismatches: building opacity, park boundaries, road casings, road widths). Offline.pmtiles is now built with Planetiler's default OpenMapTiles profile against Geofabrik per-country OSM extracts (osmium-merged when more than one country is selected), the same vector schema Liberty already expects. offlineStyle() now clones the same Liberty JSON (vendored as a local snapshot for reliability with no internet) and applies the identical ONLINE_STYLE_PATCH, just repointed at local PMTiles/glyphs/sprite — one palette instead of two, correct on both sides by construction. Also vendors Liberty's icon sprite for the first time (offline had none before), adds Java/osmium-tool/planetiler.jar to the Docker image, and removes the now-unused protomaps-themes-base dependency and the theme-comparison debug page that found today's bugs. --- Dockerfile | 20 +- TODO.adoc | 2 +- app.rb | 7 +- docker-compose.yaml | 6 +- docs/architecture.adoc | 132 +- docs/development.adoc | 92 +- docs/nps-resources.adoc | 12 +- docs/third-party-notices.adoc | 62 +- lib/maptool/pmtiles_builder.rb | 273 ++- public/js/map.js | 202 +- public/js/offline_data.js | 16 +- public/theme_preview.html | 111 - public/vendor/liberty-sprite/ofm.json | 1850 +++++++++++++++++ public/vendor/liberty-sprite/ofm.png | Bin 0 -> 49454 bytes public/vendor/liberty-sprite/ofm@2x.json | 1850 +++++++++++++++++ public/vendor/liberty-sprite/ofm@2x.png | Bin 0 -> 118872 bytes public/vendor/liberty-style/liberty.json | 1 + .../protomaps-themes-base.js | 16 - test/test_app.rb | 4 +- test/test_pmtiles_builder.rb | 141 +- views/layout.erb | 1 - 21 files changed, 4286 insertions(+), 512 deletions(-) delete mode 100644 public/theme_preview.html create mode 100644 public/vendor/liberty-sprite/ofm.json create mode 100644 public/vendor/liberty-sprite/ofm.png create mode 100644 public/vendor/liberty-sprite/ofm@2x.json create mode 100644 public/vendor/liberty-sprite/ofm@2x.png create mode 100644 public/vendor/liberty-style/liberty.json delete mode 100644 public/vendor/protomaps-themes-base/protomaps-themes-base.js diff --git a/Dockerfile b/Dockerfile index 89e6fea..447d04f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -3,9 +3,14 @@ FROM ruby:4.0.6-slim-bookworm # build-essential: puma has a native (C) extension; harmless if the # platform-specific gem in Gemfile.lock already has a precompiled binary # matching this base image, but keeps the build working if it doesn't. -# ca-certificates/curl: needed for the go-pmtiles download below (also -# handy for anyone debugging inside a running container). -RUN apt-get update && apt-get install --no-install-recommends -y build-essential ca-certificates curl \ +# ca-certificates/curl: needed for the go-pmtiles/planetiler.jar downloads +# below (also handy for anyone debugging inside a running container). +# default-jre-headless: Planetiler is a JVM tool (see PLANETILER_VERSION +# below) — headless since this never touches a display. +# osmium-tool: merges multiple countries' OSM extracts into one file before +# handing them to Planetiler (lib/maptool/pmtiles_builder.rb) — a normal +# Debian package, no separate download/pinning needed like the other two. +RUN apt-get update && apt-get install --no-install-recommends -y build-essential ca-certificates curl default-jre-headless osmium-tool \ && rm -rf /var/lib/apt/lists/* # The `pmtiles` CLI (lib/maptool/pmtiles_builder.rb's "Regenerate for @@ -26,6 +31,15 @@ RUN set -eux; \ curl -fsSL "https://github.com/protomaps/go-pmtiles/releases/download/v${PMTILES_VERSION}/go-pmtiles_${PMTILES_VERSION}_Linux_${pmtiles_arch}.tar.gz" \ | tar xz -C /usr/local/bin pmtiles +# Planetiler (lib/maptool/pmtiles_builder.rb's offline.pmtiles build, +# replacing an earlier Protomaps-CDN-based pipeline — see +# docs/development.adoc) — a single JVM fat jar, no per-arch variant needed +# unlike go-pmtiles above. Default PLANETILER_JAR path (pmtiles_builder.rb) +# expects it here. +ARG PLANETILER_VERSION=0.10.2 +RUN curl -fsSL "https://github.com/onthegomap/planetiler/releases/download/v${PLANETILER_VERSION}/planetiler.jar" \ + -o /usr/local/lib/planetiler.jar + WORKDIR /app COPY Gemfile Gemfile.lock ./ diff --git a/TODO.adoc b/TODO.adoc index abf11fc..7d9a18e 100644 --- a/TODO.adoc +++ b/TODO.adoc @@ -8,7 +8,7 @@ independence from connectivity. == Offline data and cartography -* [ ] Offline vector tiles (PMTiles/MBTiles) for Europe/world via Planetiler or MapTiler +* [x] Offline vector tiles (PMTiles/MBTiles) for Europe/world via Planetiler or MapTiler — Geofabrik per-country extracts, `osmium merge`, Planetiler's default OpenMapTiles profile straight to PMTiles (`lib/maptool/pmtiles_builder.rb`); offline now shares the exact same style/palette as online (`ONLINE_STYLE_PATCH`) instead of a separate protomaps-schema theme * [x] Shaded relief / DEM layer — hillshade toggle in the sidebar, sourced from public Terrarium tiles online; reads `data/terrain.pmtiles` for offline if one's been generated (see docs/development.adoc), otherwise the toggle is online-only for now ** [ ] Terrain slope readout for parking (numeric, not just visual shading) * [ ] Contour lines from OSM for hikes and mountain passes diff --git a/app.rb b/app.rb index 2a2b678..5bcf475 100644 --- a/app.rb +++ b/app.rb @@ -260,10 +260,9 @@ module Maptool end # Regenerates offline.pmtiles for the currently selected regions (see - # POST /api/offline-regions above) by extracting them from Protomaps' - # own daily full-planet basemap build — see - # lib/maptool/pmtiles_builder.rb. Runs in the background; poll - # build-status below for progress. + # POST /api/offline-regions above) by downloading each from Geofabrik + # and tiling them with Planetiler — see lib/maptool/pmtiles_builder.rb. + # Runs in the background; poll build-status below for progress. post "/api/offline-tiles/build" do require_login! begin diff --git a/docker-compose.yaml b/docker-compose.yaml index d656209..d86f454 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -60,7 +60,11 @@ services: # docs/development.adoc for how the deploy job treats this # directory). A private plugin (app.rb's PLUGINS_DIRS) also belongs # under here, at data/plugins// — nothing further to mount, - # this one bind already covers the whole data/ tree. + # this one bind already covers the whole data/ tree. An offline.pmtiles + # build's own scratch work (Dir.mktmpdir, lib/maptool/pmtiles_builder.rb) + # happens outside this mount, in the container's own filesystem — a + # large country's .osm.pbf plus Planetiler's working set can be + # several GB, worth knowing if the host is ever short on space there. - ./data:/app/data # Fakes a GNSS fix (a loop around Bratislava, see diff --git a/docs/architecture.adoc b/docs/architecture.adoc index 622be2c..3b3b665 100644 --- a/docs/architecture.adoc +++ b/docs/architecture.adoc @@ -44,18 +44,33 @@ opened in a browser. Map data is vector, not raster: the app ships https://maplibre.org[MapLibre GL JS] (vendored, see below) and the map -view (`public/js/map.js`) offers two styles: +view (`public/js/map.js`) offers two styles, both **the same +OpenMapTiles-schema Liberty style** (https://tiles.openfreemap.org/styles/liberty[OpenFreeMap +"liberty"]), just pointed at different vector sources: -* *Online* — a full hosted vector style, - https://tiles.openfreemap.org/styles/liberty[OpenFreeMap "liberty"], +* *Online* — Liberty's own hosted tiles, `tiles.openfreemap.org`, requires internet access. -* *Offline* — built at runtime from a local - https://github.com/protomaps/PMTiles[PMTiles] archive at - `data/offline.pmtiles`, served as-is (see below) at - `/tiles/offline.pmtiles`, decoded client-side by +* *Offline* — a local https://github.com/protomaps/PMTiles[PMTiles] + archive at `data/offline.pmtiles`, built by + https://github.com/onthegomap/planetiler[Planetiler] from an OSM + extract (see `docs/development.adoc`), served as-is at + `/tiles/offline.pmtiles` and decoded client-side by https://github.com/protomaps/PMTiles[pmtiles.js] registered as a - `pmtiles://` protocol handler, and styled with base layers from - https://github.com/protomaps/basemaps[protomaps-themes-base]. + `pmtiles://` protocol handler. + +Using the same schema both ways is deliberate: an earlier version of +this app built offline tiles from Protomaps' own basemap schema +instead, which needed a *separate* hand-tuned theme +(`protomaps-themes-base` + a since-removed `OFFLINE_THEME`) to +approximate the online look — two independently-maintained palettes +that drifted out of sync (building opacity, road casings, park +boundaries) every time one side changed. Planetiler's default profile +*is* OpenMapTiles, so `offlineStyle()` now just clones the same parsed +Liberty JSON `ONLINE_STYLE` already fetched, repoints its `sources`, +`glyphs`, and `sprite` at local copies, and applies the exact same +`ONLINE_STYLE_PATCH` recolor (below) — one palette, one place to tune +it, correct on both sides by construction rather than by re-checking +every time something changes. `GET /api/offline-tiles` reports whether `data/offline.pmtiles` is present (`{"available": true|false}`); the frontend uses it once, on @@ -72,28 +87,35 @@ support) just returns byte ranges of the file; pmtiles.js in the browser reads the archive's own directory and requests only the bytes it needs for the tiles on screen. -=== Offline text labels and color palette +No PMTiles file ships with the repository — it is built locally or +in-app (see `docs/development.adoc`) and stays gitignored because such +extracts are typically large binary files. Geofabrik's per-country +extracts are OSM data, ODbL-licensed, same attribution +(`© OpenStreetMap contributors`) the map already shows either way — no +separate licensing story the way the old Protomaps-basemap pipeline's +NPS-Park-Tiles color research needed. + +=== Offline text labels, sprite, and color palette Label rendering in MapLibre needs a "glyphs" server serving font PBF -ranges (256 Unicode code points each); `data/offline.pmtiles`'s fields -(`name`, `name:en`, `script`, ...) match what -`protomaps-themes-base`'s `layers(source, theme, { lang: "en" })` -expects for its label layers (verified against the actual PMTiles -vector layer schema), so passing that option turns labels on. The -glyphs themselves are vendored under `public/vendor/fonts/` — Noto -Sans Regular/Italic/Medium, ranges `0-255` and `256-511` -(Basic Latin + Latin-1 Supplement + Latin Extended-A, SIL OFL -licensed, from +ranges (256 Unicode code points each). The glyphs Liberty's style +references are vendored under `public/vendor/fonts/` — Noto Sans +Regular/Italic/Medium, ranges `0-255` and `256-511` (Basic Latin + +Latin-1 Supplement + Latin Extended-A, SIL OFL licensed, from https://github.com/protomaps/basemaps-assets[protomaps/basemaps-assets]), covering accented Latin place names (Slovak, Czech, Polish, German, ...). Labels in other scripts (Cyrillic, Greek, CJK, ...) won't render -offline, since those glyph ranges aren't vendored. +offline, since those glyph ranges aren't vendored. Liberty's icon +sprite (shields, POI icons) is likewise vendored as a one-time +snapshot under `public/vendor/liberty-sprite/` — both `offlineStyle()` +and the online style otherwise share identical `glyphs`/`sprite` +roles, just resolved to local vs. `tiles.openfreemap.org` URLs. -`public/js/map.js`'s `OFFLINE_THEME` nudges a couple dozen color roles -from `protomaps-themes-base`'s stock "light" theme towards the -National Park Service's own "Park Tiles" cartography — a warm, -Harpers-Ferry-Center-derived look. A few of these values are the -genuine paint colors pulled from a public Park Tiles style JSON +`public/js/map.js`'s `ONLINE_STYLE_PATCH` — applied to whichever +source is loaded, online or offline (see above) — nudges Liberty's +OpenMapTiles layer ids towards a warm, National Park Service +"Park Tiles"-inspired look. A few of these values are the genuine +paint colors pulled from a public Park Tiles style JSON (`nps.gov/lib/npmap.js/style/ck72fwp2642dv07o7tbqinvz4.json`, the "Imagery" variant — the only one of NPS's four styles served from a plain, unauthenticated URL; "Standard"/"Slate"/"Light" resolve through @@ -101,50 +123,36 @@ Mapbox Studio's private API with an access token, which isn't something to piggyback on even though it's technically visible in their own JS bundle) — background, the park/protected-area green, the two road-importance tiers, and the park-boundary line color. The rest -are reasoned to match that same warm family (olive greens, muted blue) -rather than sourced. This is deliberately partial — labels, casings, -and roles with no clean real-color anchor are left at theme -defaults — not the kind of full per-layer recolor a previous iteration -of this app did (and removed, along with any dependency on OsmAnd's -own tile server, which this app cannot use per OsmAnd's terms -restricting tile use to "personal, non-commercial use within OsmAnd -applications and platforms"). +are reasoned to match that same warm family (olive greens, muted blue, +brown road casings) rather than sourced. This is deliberately +partial — labels, halos, rail, and minor overlays (cemetery/hospital/ +school/pitch/track shading) are left at Liberty's own defaults. + Recreating the *color choices* is fine — that's not the kind of thing a data license restricts — but the actual Park Tiles *service* stays off-limits: its OSM/terrain layers are licensed through Mapbox Atlas (a commercial, non-sublicensable data service scoped to NPS), and it's built for park visitors specifically (park-unit and trailhead -labeling prioritized), not general-purpose worldwide cartography. +labeling prioritized), not general-purpose worldwide cartography — +irrelevant to this app either way now, since it never talks to NPS's +tile service, only ever OpenFreeMap/Geofabrik. -No PMTiles file ships with the repository — it is expected to be -supplied locally (see `docs/development.adoc`) and stays gitignored -because such extracts are typically large binary files. - -The Online map (OpenFreeMap Liberty) gets the same treatment via -`ONLINE_STYLE_PATCH`, a separate hand-built table — Liberty is an -OpenMapTiles-schema style, with its own layer ids (`landcover_wood`, -`road_secondary_tertiary`, `boundary_2`, ...) that don't correspond to -protomaps' theme roles, so the two palettes can't share one object, -only the same underlying color choices. `loadOnlineStyle` -(`public/js/map.js`) fetches Liberty's `style.json` once, patches it -in place, and uses the resulting object everywhere `ONLINE_STYLE` used -to be a plain URL string — MapLibre accepts a style object anywhere it -accepts a style URL, so `applyStyle`'s `map.setStyle(... : ONLINE_STYLE)` -needed no change. That fetch runs before the map (and the rest of the -page) is constructed — a top-level `await` — so there's no flash of -Liberty's own colors before the patch lands; a 3s timeout and a -catch-all fall back to the plain URL (letting MapLibre fetch and -render it unpatched) rather than block the whole page's startup on a -remote style server, since this app is meant to keep working offline -in the field, independent of whether the online map itself loads. -Only the layers that dominate the map's overall color read are -patched (land cover, water, parks, roads, boundaries, buildings) — -same deliberately-partial scope as `OFFLINE_THEME`, not a full -per-layer recolor. Road casings are the one addition with no -protomaps-role equivalent to reuse, since offline roads don't get a -separate outline color there; `#c9a66b` is reasoned to fit the family -rather than sourced from anywhere real. +`loadOnlineStyle` (`public/js/map.js`) fetches Liberty's live +`style.json` once, patches it in place, and uses the resulting object +everywhere `ONLINE_STYLE` used to be a plain URL string — MapLibre +accepts a style object anywhere it accepts a style URL, so +`applyStyle`'s `map.setStyle(... : ONLINE_STYLE)` needed no change. +That fetch runs before the map (and the rest of the page) is +constructed — a top-level `await` — so there's no flash of Liberty's +own colors before the patch lands; a 3s timeout and a catch-all fall +back to the plain URL (letting MapLibre fetch and render it unpatched) +rather than block the whole page's startup on a remote style server. +Offline mode can't rely on that same live fetch succeeding — the field +usage this app is built for is exactly when it won't — so +`offlineStyle()` instead clones a vendored, point-in-time snapshot of +the same Liberty JSON (`public/vendor/liberty-style/liberty.json`), +patches it the same way, and repoints it at the local PMTiles/glyphs/ +sprite described above. == Map permalink diff --git a/docs/development.adoc b/docs/development.adoc index 7d49a2a..894eef3 100644 --- a/docs/development.adoc +++ b/docs/development.adoc @@ -23,40 +23,31 @@ explicit cache headers, so an edit to `public/` (or `views/`) can appear not to have taken effect on the next reload. Force a real reload (e.g. Ctrl/Cmd+Shift+R) if that happens. -`/theme_preview.html` is a standalone debug page (not linked from the -app itself) for comparing offline base-map themes side by side: a bare -`protomaps-themes-base` theme, an iframe of the real app's offline -style, and one of its online style, with pan/zoom kept in sync across -all three via the same URL-hash mechanism `map.js` already uses for -shareable links. It's a plain static file, so nothing gates it to -development — it's reachable on a production instance too, same as any -other file under `public/`. Harmless if it stays that way (it shows -nothing `/` doesn't already), but worth knowing if that's ever not the -case. - == Offline map data To enable the offline style, place a PMTiles file at `data/offline.pmtiles` (see `docs/architecture.adoc` for how it is -served and styled). Logged-in users can generate this from the app -itself — see "In-app regeneration" below — or it can be built by hand: +served and styled — the same OpenMapTiles schema/style the online map +uses, just from local data). Logged-in users can generate this from +the app itself — see "In-app regeneration" below — or it can be built +by hand: -* Extract a region from Protomaps' own daily full-planet basemap build - (https://build-metadata.protomaps.dev/builds.json[build index], - files at `https://build.protomaps.com/`, ~120GB, ODbL/OSM - attribution) with the - https://github.com/protomaps/go-pmtiles[go-pmtiles] CLI's `extract` - subcommand, which pulls only the byte ranges covering a bbox over - HTTP range requests rather than the whole file: - `pmtiles extract https://build.protomaps.com/ data/offline.pmtiles --bbox=west,south,east,north --maxzoom=15`. - (The old `app.protomaps.com` extract-builder UI this section used to - point at has since redirected elsewhere — this is the same - underlying mechanism, just the CLI instead of a web UI.) -* To convert some other vector tile source (e.g. an `.mbtiles` file) - into PMTiles instead, use the same CLI's `convert` subcommand: - `pmtiles convert in.mbtiles data/offline.pmtiles`. Its schema is - what `protomaps-themes-base` (the styling library used for the - offline style) expects. +* Download one or more country extracts from + https://download.geofabrik.de[Geofabrik] (`.osm.pbf`, ODbL/OSM + attribution) — e.g. + `curl -O https://download.geofabrik.de/europe/slovakia-latest.osm.pbf`. +* If more than one country, merge them with + https://github.com/osmcode/osmium-tool[osmium-tool]: + `osmium merge slovakia-latest.osm.pbf austria-latest.osm.pbf -o merged.osm.pbf` + (each Geofabrik file is already clipped to that country's real + border, so no separate bbox/polygon clip step is needed either + before or after — skip this step entirely for a single country). +* Tile it with https://github.com/onthegomap/planetiler[Planetiler]'s + default profile, which *is* OpenMapTiles — no `--profile` flag + needed — writing PMTiles directly: + `java -jar planetiler.jar --osm-path=merged.osm.pbf --output=data/offline.pmtiles` + (needs Java 21+; `planetiler.jar` from + https://github.com/onthegomap/planetiler/releases/latest[the latest release]). Once the file is in place, `GET /api/offline-tiles` reports `available: true` and the map defaults to the offline style. @@ -113,14 +104,15 @@ just what changed — fine given extraction is fast (byte-range requests against remote archives, not per-tile fetches), but worth revisiting if someone selects half of Europe at once and finds it slow. -This wraps exactly the manual `go-pmtiles` workflows documented above -(`lib/maptool/pmtiles_builder.rb`) — the server needs the -https://github.com/protomaps/go-pmtiles[go-pmtiles] CLI installed and -on `PATH` (override with the `PMTILES_BIN` env var if it lives -somewhere else), using `--region=` (a `FeatureCollection` of -the selected countries — go-pmtiles treats multiple features as their -union already, no union/dissolve math needed on this side) rather than -`--bbox=` for precise, per-country extraction. terrain.pmtiles extracts +This wraps exactly the manual workflows documented above +(`lib/maptool/pmtiles_builder.rb`). offline.pmtiles downloads each +selected country's Geofabrik extract, `osmium merge`s them if there's +more than one, then tiles the result with Planetiler — the server +needs `osmium` and `java` + `planetiler.jar` installed and on `PATH` +(override with the `OSMIUM_BIN`/`JAVA_BIN`/`PLANETILER_JAR` env vars if +they live somewhere else; the Docker image installs all three, see +`Dockerfile`). terrain.pmtiles still uses `go-pmtiles` +(`PMTILES_BIN`) against Mapterhorn, unrelated to this — it extracts `planet.pmtiles` (always) plus whichever Mapterhorn regional chunks intersect the selection, `merge`s them if there was more than one — always safe regardless of how many/which countries are selected, since @@ -139,18 +131,20 @@ starting a second while one's running gets a 409, as does starting either with nothing selected yet. Each successful build also writes a small sidecar (`offline.pmtiles. -meta.json` / `terrain.pmtiles.meta.json` — the Protomaps build date used, -or the Mapterhorn source names/md5sums) recording what was actually -built, since the `.pmtiles` file itself carries no such record. `GET -/api/offline-tiles`/`/api/terrain-tiles` include it as `meta`, shown in -the panel next to the existing size/updated line. `GET .../check-update` -compares that recorded build against the live upstream index/manifest -(without rebuilding anything) and reports `update_available: true/false/ -null` — `null` means "don't know" (no local build yet, or the upstream -check itself failed), kept as its own route rather than folded into the -plain status endpoints above since those are on the page-load hot path -(the topbar's offline-status dot) and this one reaches an external -service, only worth doing when the Offline data panel is actually open. +meta.json` — each source country's code/Geofabrik slug/Last-Modified; +`terrain.pmtiles.meta.json` — the Mapterhorn source names/md5sums) +recording what was actually built, since the `.pmtiles` file itself +carries no such record. `GET /api/offline-tiles`/`/api/terrain-tiles` +include it as `meta`, shown in the panel next to the existing +size/updated line. `GET .../check-update` compares that recorded build +against each source's live upstream state (a Geofabrik `HEAD` per +country for offline, the Mapterhorn manifest for terrain — without +rebuilding anything) and reports `update_available: true/false/null` — +`null` means "don't know" (no local build yet, or a check itself +failed), kept as its own route rather than folded into the plain +status endpoints above since those are on the page-load hot path (the +topbar's offline-status dot) and this one reaches an external service, +only worth doing when the Offline data panel is actually open. == Camper-relevant POIs (Overpass) diff --git a/docs/nps-resources.adoc b/docs/nps-resources.adoc index 12f3a5b..227bb1c 100644 --- a/docs/nps-resources.adoc +++ b/docs/nps-resources.adoc @@ -24,8 +24,8 @@ checking here before searching from zero next time. | MIT (per `package.json`); the whole `npmap5-plugins` repo is separately public domain as a US government work -| Park Tiles color palette (offline + online basemap themes) -| `public/js/map.js`'s `OFFLINE_THEME` and `ONLINE_STYLE_PATCH` +| Park Tiles color palette (shared offline + online basemap theme) +| `public/js/map.js`'s `ONLINE_STYLE_PATCH` | Colors only — see <> for why the actual tile service isn't used | `overview` (top-right minimap/inset control) @@ -187,7 +187,7 @@ why this app uses OpenFreeMap Liberty as its actual basemap, not Park Tiles — see `docs/architecture.adoc`'s "Offline maps" section. Recreating the *color choices* is a different matter — not the kind of -thing a data license restricts — and is what `OFFLINE_THEME` in +thing a data license restricts — and is what `ONLINE_STYLE_PATCH` in `public/js/map.js` actually does (see `docs/architecture.adoc`). === Public style JSON (source for the real colors we did pull) @@ -219,11 +219,11 @@ embedded credentials, even when technically reachable: |=== Colors actually pulled from the Imagery style JSON and used in -`OFFLINE_THEME`: background (`hsl(40, 37%, 97%)`, a warm cream), the +`ONLINE_STYLE_PATCH`: background (`hsl(40, 37%, 97%)`, a warm cream), the park/protected-area green (`#b3e378`), the two road-importance tiers (`#fdefbe`/`#fef7dd`), and the park-boundary line color (`#546619`, dark -olive). The rest of `OFFLINE_THEME` extends that same warm/olive family -by eye rather than from a sourced value. +olive). The rest of `ONLINE_STYLE_PATCH` extends that same warm/olive +family by eye rather than from a sourced value. === Legend / cartographic hierarchy diff --git a/docs/third-party-notices.adoc b/docs/third-party-notices.adoc index d6d589e..776ff84 100644 --- a/docs/third-party-notices.adoc +++ b/docs/third-party-notices.adoc @@ -18,10 +18,6 @@ BSD-3-Clause licensed. | 4.5.0 | https://github.com/protomaps/PMTiles -| protomaps-themes-base -| 4.5.0 -| https://github.com/protomaps/basemaps - | maplibre-contour (Overlays panel's "Contour lines", `public/js/contour.js`) | 0.1.0 | https://github.com/onthegomap/maplibre-contour @@ -91,38 +87,62 @@ for free use under the SIL Open Font License" per the site; no `OFL.txt` ships in its own download zips, unlike Noto Sans above |=== -The online map style (not vendored, fetched at runtime when the -"Online" layer is selected) is -https://tiles.openfreemap.org/styles/liberty[OpenFreeMap "liberty"], -built from https://www.openstreetmap.org[OpenStreetMap] data. +The map style — https://tiles.openfreemap.org/styles/liberty[OpenFreeMap +"liberty"], built from https://www.openstreetmap.org[OpenStreetMap] +data — is used two ways (see `docs/architecture.adoc`): fetched live +at runtime for the "Online" layer, and as a one-time vendored snapshot +(`public/vendor/liberty-style/liberty.json`) that the "Offline" layer +repoints at local data instead. Its icon sprite is vendored the same +way, under `public/vendor/liberty-sprite/` (`ofm.json`/`ofm.png` + +`@2x` variants, from `tiles.openfreemap.org/sprites/`). Neither has +been re-checked against a specific upstream version pin the way the +table above does — re-fetch both from `tiles.openfreemap.org` if +Liberty's own style/sprite ever visibly drifts from what's vendored. -`terrain.pmtiles` (`lib/maptool/pmtiles_builder.rb`'s in-app +`data/offline.pmtiles` (`lib/maptool/pmtiles_builder.rb`'s in-app regeneration, or the manual recipe in `docs/development.adoc`) is -extracted at build time, not vendored, from -https://mapterhorn.com[Mapterhorn] — a Protomaps-affiliated project -publishing pre-built Terrarium-encoded terrain as PMTiles. Per-region -source licenses vary (CC-BY-4.0 and similar); see +built at build time, not vendored, from +https://download.geofabrik.de[Geofabrik]'s per-country OpenStreetMap +extracts (ODbL). + +`terrain.pmtiles` (same regeneration mechanism) is extracted at build +time, not vendored, from https://mapterhorn.com[Mapterhorn] — a +Protomaps-affiliated project publishing pre-built Terrarium-encoded +terrain as PMTiles. Per-region source licenses vary (CC-BY-4.0 and +similar); see https://download.mapterhorn.com/attribution.json[their own attribution list] for the full provenance. Not a frontend asset like the above, but also baked into this app's own Docker image (not a separate container the way kiwix-serve/gpsd are — -see `docs/deployment.adoc`/`docs/development.adoc`): the `pmtiles` CLI -(`go-pmtiles`), installed as a static binary in the `Dockerfile` for -`lib/maptool/pmtiles_builder.rb`'s in-app offline.pmtiles/terrain.pmtiles -regeneration. BSD-3-Clause, same as pmtiles.js/MapLibre GL above. +see `docs/deployment.adoc`/`docs/development.adoc`): three CLI tools +`lib/maptool/pmtiles_builder.rb` shells out to for offline.pmtiles/ +terrain.pmtiles regeneration. -[cols="1,1,2"] +[cols="1,1,1,2"] |=== -| Tool | Version | Source +| Tool | Version | License | Source | go-pmtiles (`pmtiles` CLI) | 1.31.2 +| BSD-3-Clause | https://github.com/protomaps/go-pmtiles + +| Planetiler (`planetiler.jar`) +| 0.10.2 +| Apache-2.0 +| https://github.com/onthegomap/planetiler + +| osmium-tool (`osmium`, installed via the `osmium-tool` Debian package) +| (Debian bookworm's packaged version) +| GPL-3.0 +| https://github.com/osmcode/osmium-tool |=== To update a vendored library: download its package (e.g. `npm pack @`), replace the corresponding files under `public/vendor//`, and update the version in this file. To -update go-pmtiles, bump `PMTILES_VERSION` in the `Dockerfile` and the -version here. +update go-pmtiles or Planetiler, bump `PMTILES_VERSION`/ +`PLANETILER_VERSION` in the `Dockerfile` and the version here — +osmium-tool tracks whatever version Debian bookworm currently packages, +nothing to pin on this side. diff --git a/lib/maptool/pmtiles_builder.rb b/lib/maptool/pmtiles_builder.rb index 6b6cc17..9aa5319 100644 --- a/lib/maptool/pmtiles_builder.rb +++ b/lib/maptool/pmtiles_builder.rb @@ -9,12 +9,10 @@ module Maptool # Regenerates data/offline.pmtiles and data/terrain.pmtiles for the # currently *selected* regions (data/offline_regions.json, an array of # Natural Earth iso_a2 country codes — see available_regions/ - # selected_regions/set_selected_regions below) by shelling out to - # go-pmtiles — the same tool docs/development.adoc already documents - # running by hand. No job queue: each build runs on its own background - # Thread and reports into a Mutex-guarded status Hash a route can poll, - # the same shape app.rb's own GNSS poller (GNSS_LATEST/GNSS_LATEST_MUTEX) - # already uses. + # selected_regions/set_selected_regions below). No job queue: each build + # runs on its own background Thread and reports into a Mutex-guarded + # status Hash a route can poll, the same shape app.rb's own GNSS poller + # (GNSS_LATEST/GNSS_LATEST_MUTEX) already uses. module PmtilesBuilder class BuildError < StandardError; end @@ -22,24 +20,71 @@ module Maptool # countries, filtered to Europe and trimmed to name/iso_a2/iso_a3 — # see the plan this was built from for the exact filter. 110m is # deliberately coarse (a km or so of border precision, not - # survey-grade) — fine for "which tiles to grab," a same-schema swap + # survey-grade) — fine for "which country to grab," a same-schema swap # to Natural Earth's 50m/10m cut if that ever needs to be tighter. REGIONS_FILE = File.join(__dir__, "data", "europe_countries.geojson") - # Protomaps' own daily full-planet basemap build index — extract_offline - # below only pulls the HTTP byte ranges covering the requested region - # (go-pmtiles's `extract` supports a remote source over range requests), - # never the whole ~120GB file. - PROTOMAPS_BUILDS_INDEX = "https://build-metadata.protomaps.dev/builds.json" - PROTOMAPS_BUILD_BASE = "https://build.protomaps.com" + # Every iso_a2 code in REGIONS_FILE mapped to its Geofabrik download + # slug (https://download.geofabrik.de/-latest.osm.pbf) — Geofabrik + # names regions, not ISO codes, and doesn't always split the way a + # country border does, so this table exists rather than deriving the + # slug from the country name. Two known quirks worth knowing about, + # not worth working around: + # - RU has no "europe/" prefix (Russia is its own top-level index, + # and unlike every other entry here is a single ~4GB file covering + # the whole country rather than a European-only slice). + # - GB's "great-britain" slug is England/Scotland/Wales only — + # Northern Ireland lives in "ireland-and-northern-ireland" instead + # (bundled with IE, not GB). Selecting GB alone won't include NI. + GEOFABRIK_SLUGS = { + "AL" => "europe/albania", + "AT" => "europe/austria", + "BY" => "europe/belarus", + "BE" => "europe/belgium", + "BA" => "europe/bosnia-herzegovina", + "BG" => "europe/bulgaria", + "HR" => "europe/croatia", + "CZ" => "europe/czech-republic", + "DK" => "europe/denmark", + "EE" => "europe/estonia", + "FI" => "europe/finland", + "FR" => "europe/france", + "DE" => "europe/germany", + "GR" => "europe/greece", + "HU" => "europe/hungary", + "IS" => "europe/iceland", + "IE" => "europe/ireland-and-northern-ireland", + "IT" => "europe/italy", + "XK" => "europe/kosovo", + "LV" => "europe/latvia", + "LT" => "europe/lithuania", + "LU" => "europe/luxembourg", + "MD" => "europe/moldova", + "ME" => "europe/montenegro", + "NL" => "europe/netherlands", + "MK" => "europe/macedonia", + "NO" => "europe/norway", + "PL" => "europe/poland", + "PT" => "europe/portugal", + "RO" => "europe/romania", + "RU" => "russia", + "RS" => "europe/serbia", + "SK" => "europe/slovakia", + "SI" => "europe/slovenia", + "ES" => "europe/spain", + "SE" => "europe/sweden", + "CH" => "europe/switzerland", + "UA" => "europe/ukraine", + "GB" => "europe/great-britain", + }.freeze # Mapterhorn (a Protomaps-affiliated project) publishes Terrarium- # encoded terrain as pre-built PMTiles archives: one global # planet.pmtiles (z0-12) plus ~450 regional chunks (z13 up to a - # per-region max, 13-18) — same "extract only the region's byte ranges - # from a remote archive" story as offline.pmtiles above, so no more - # fetching individual tiles or building an MBTiles file ourselves the - # way an earlier version of this file did. + # per-region max, 13-18) — extract_offline below no longer touches + # Protomaps at all (see GEOFABRIK_SLUGS above), but terrain stays on + # this same "extract only the region's byte ranges from a remote + # archive" story via go-pmtiles, unrelated to the basemap swap. MAPTERHORN_MANIFEST_URL = "https://download.mapterhorn.com/download_urls.json" MAPTERHORN_PLANET_NAME = "planet.pmtiles" # Matches the online hillshade layer's own cap (public/js/overlays.js's @@ -102,28 +147,22 @@ module Maptool end private_class_method :region_features - # Writes the FeatureCollection of just the selected countries into - # `dir` — this *is* the file go-pmtiles' `--region=` reads. No - # union/dissolve needed: go-pmtiles treats a FeatureCollection's - # features as one combined MultiPolygon on its own (confirmed against - # its own source, pmtiles/region.go's UnmarshalRegion). Also returns a - # plain aggregate [south,west,north,east] (min/max over every ring - # coordinate, no geometry library) used only for the Mapterhorn - # chunk-intersection check below — approximate is fine there, the - # `--region=` file is what does the real precise selection. - def self.region_geojson_and_bbox(codes, dir) + # Still used by terrain (below) to compute the aggregate bbox Mapterhorn + # chunk intersection needs — offline.pmtiles no longer needs this at + # all, since each Geofabrik country file is already clipped to that + # country's real border (more accurate than this 110m polygon, not + # less), so there's no separate "--region=" precision step for it + # anymore. + def self.region_bbox(codes) selected = region_features.select { |f| codes.include?(f["properties"]["iso_a2"]) } raise BuildError, "no matching regions for #{codes.join(", ")}" if selected.empty? - path = File.join(dir, "region.geojson") - File.write(path, JSON.generate(type: "FeatureCollection", features: selected)) - coords = selected.flat_map { |f| ring_coordinates(f["geometry"]) } lons = coords.map { |lng, _lat| lng } lats = coords.map { |_lng, lat| lat } - [path, [lats.min, lons.min, lats.max, lons.max]] + [lats.min, lons.min, lats.max, lons.max] end - private_class_method :region_geojson_and_bbox + private_class_method :region_bbox def self.ring_coordinates(geometry) case geometry["type"] @@ -140,21 +179,21 @@ module Maptool # finishes — raises BuildError (the caller turns this into an error # response) if nothing's selected yet, or one's already running. # - # fetch_build_url exists as an injectable seam so tests can exercise the - # rest of this (temp path, go-pmtiles invocation, atomic rename) without - # a real network call — same reasoning test_helper.rb already gives for - # keeping /api/plugins route tests off the real Overpass API. - def self.build_offline(data_dir:, fetch_build_url: method(:latest_protomaps_build_url)) + # download_extract exists as an injectable seam so tests can exercise + # the rest of this (scratch dir, osmium/planetiler invocation, atomic + # rename) without a real network call — same reasoning test_helper.rb + # already gives for keeping /api/plugins route tests off the real + # Overpass API. + def self.build_offline(data_dir:, download_extract: method(:download_extract)) codes = selected_regions(data_dir) raise BuildError, "select at least one region first" if codes.empty? begin_run!(OFFLINE_MUTEX, OFFLINE_STATUS) - Thread.new { run_job(OFFLINE_MUTEX, OFFLINE_STATUS) { extract_offline(codes, data_dir, fetch_build_url) } } + Thread.new { run_job(OFFLINE_MUTEX, OFFLINE_STATUS) { extract_offline(codes, data_dir, download_extract) } } end - # fetch_manifest: same injectable-seam reasoning as fetch_build_url - # above, for the one Mapterhorn manifest lookup this needs instead of - # the Protomaps build index. + # fetch_manifest: same injectable-seam reasoning as download_extract + # above, for the one Mapterhorn manifest lookup this needs. def self.build_terrain(data_dir:, fetch_manifest: method(:fetch_mapterhorn_manifest)) codes = selected_regions(data_dir) raise BuildError, "select at least one region first" if codes.empty? @@ -181,56 +220,103 @@ module Maptool # --- offline.pmtiles --- - def self.extract_offline(codes, data_dir, fetch_build_url) - source = fetch_build_url.call + # One Geofabrik .osm.pbf per selected country (already clipped to that + # country's real border), osmium-merged into one file if more than one + # was selected (skipped entirely for a single country — nothing to + # merge), then tiled by Planetiler using its default OpenMapTiles + # profile straight to PMTiles — the same vector schema + # tiles.openfreemap.org's Liberty style already expects, so + # public/js/map.js's offlineStyle() can reuse ONLINE_STYLE_PATCH + # unchanged instead of a separate protomaps-themes-base palette. + def self.extract_offline(codes, data_dir, download_extract) scratch_dir = Dir.mktmpdir("maptool-offline") - region_path, = region_geojson_and_bbox(codes, scratch_dir) - tmp_path = File.join(data_dir, "offline.pmtiles.tmp") + sources = codes.map do |code| + slug = GEOFABRIK_SLUGS.fetch(code) { raise BuildError, "no Geofabrik source known for region #{code}" } + dest = File.join(scratch_dir, "#{code}.osm.pbf") + last_modified = download_extract.call(geofabrik_url(slug), dest) + { "code" => code, "slug" => slug, "last_modified" => last_modified, "path" => dest } + end - run_pmtiles!("extract", source, tmp_path, "--region=#{region_path}", "--maxzoom=15") + osm_path = + if sources.size == 1 + sources.first["path"] + else + merged_path = File.join(scratch_dir, "merged.osm.pbf") + run_osmium!("merge", *sources.map { |s| s["path"] }, "-o", merged_path) + merged_path + end + + tmp_path = File.join(data_dir, "offline.pmtiles.tmp") + run_planetiler!("--osm-path=#{osm_path}", "--output=#{tmp_path}") File.rename(tmp_path, File.join(data_dir, "offline.pmtiles")) - File.write(offline_meta_path(data_dir), JSON.generate(source: File.basename(URI(source).path))) + File.write(offline_meta_path(data_dir), JSON.generate(sources: sources.map { |s| s.slice("code", "slug", "last_modified") })) ensure FileUtils.remove_entry(scratch_dir) if scratch_dir && Dir.exist?(scratch_dir) File.delete(tmp_path) if tmp_path && File.exist?(tmp_path) end private_class_method :extract_offline - def self.latest_protomaps_build_url - response = Net::HTTP.get_response(URI(PROTOMAPS_BUILDS_INDEX)) - raise BuildError, "could not reach #{PROTOMAPS_BUILDS_INDEX}" unless response.is_a?(Net::HTTPSuccess) - - builds = JSON.parse(response.body) - raise BuildError, "protomaps build index was empty" if builds.empty? - - "#{PROTOMAPS_BUILD_BASE}/#{builds.last.fetch("key")}" - rescue JSON::ParserError - raise BuildError, "protomaps build index was not valid JSON" + def self.geofabrik_url(slug) + "https://download.geofabrik.de/#{slug}-latest.osm.pbf" end - private_class_method :latest_protomaps_build_url + private_class_method :geofabrik_url - # Sidecar recording which Protomaps build (a date-stamped filename, e.g. - # "20260910.pmtiles") the on-disk offline.pmtiles was actually extracted - # from — the file itself carries no such record. nil if never built (or - # built before this existed). + # Real network implementation of the download_extract seam above — + # streams the extract to dest and returns its Last-Modified header + # (free off the same GET, no separate HEAD needed) for the sidecar + # meta / update-check below. + def self.download_extract(url, dest) + uri = URI(url) + response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.get(uri) } + raise BuildError, "could not download #{url} (HTTP #{response.code})" unless response.is_a?(Net::HTTPSuccess) + + File.binwrite(dest, response.body) + response["last-modified"] + end + + # Sidecar recording which Geofabrik sources (country code, slug, and + # that request's Last-Modified) the on-disk offline.pmtiles was + # actually built from — the file itself carries no such record. nil if + # never built (or built before this existed). def self.offline_meta(data_dir) read_json(offline_meta_path(data_dir)) end - # Compares the persisted build against the current latest without - # rebuilding anything — nil (not true/false) if there's nothing to - # compare yet (no local build) or the upstream index couldn't be - # reached, so the caller can tell "don't know" apart from "no". - def self.offline_update_available?(data_dir, fetch_build_url: method(:latest_protomaps_build_url)) + # Compares each currently-selected country's live Geofabrik + # Last-Modified against what's recorded, without downloading anything + # — nil (not true/false) if there's nothing to compare yet (no local + # build, nothing selected) or a check couldn't be completed, so the + # caller can tell "don't know" apart from "no". Also naturally reports + # "yes" if the selection changed since the last build (a country now + # relevant that wasn't recorded, or vice versa) — same reasoning + # terrain_update_available? below already uses. + def self.offline_update_available?(data_dir, fetch_last_modified: method(:fetch_geofabrik_last_modified)) meta = offline_meta(data_dir) return nil unless meta - latest = File.basename(URI(fetch_build_url.call).path) - latest != meta["source"] + codes = selected_regions(data_dir) + return nil if codes.empty? + + current = codes.map do |code| + slug = GEOFABRIK_SLUGS[code] + return nil unless slug + + { "code" => code, "last_modified" => fetch_last_modified.call(geofabrik_url(slug)) } + end.sort_by { |s| s["code"] } + recorded = (meta["sources"] || []).map { |s| s.slice("code", "last_modified") }.sort_by { |s| s["code"] } + current != recorded rescue BuildError nil end + def self.fetch_geofabrik_last_modified(url) + uri = URI(url) + response = Net::HTTP.start(uri.host, uri.port, use_ssl: uri.scheme == "https") { |http| http.head(uri) } + raise BuildError, "could not reach #{url}" unless response.is_a?(Net::HTTPSuccess) + + response["last-modified"] + end + def self.offline_meta_path(data_dir) File.join(data_dir, "offline.pmtiles.meta.json") end @@ -258,8 +344,10 @@ module Maptool raise BuildError, "mapterhorn manifest is missing #{MAPTERHORN_PLANET_NAME}" unless planet scratch_dir = Dir.mktmpdir("maptool-terrain") - region_path, bbox = region_geojson_and_bbox(codes, scratch_dir) - south, west, north, east = bbox + south, west, north, east = region_bbox(codes) + region_path = File.join(scratch_dir, "region.geojson") + selected = region_features.select { |f| codes.include?(f["properties"]["iso_a2"]) } + File.write(region_path, JSON.generate(type: "FeatureCollection", features: selected)) chunks = items.select { |item| item["name"] != MAPTERHORN_PLANET_NAME && bbox_intersects?(item, south, west, north, east) } @@ -322,13 +410,10 @@ module Maptool planet = items.find { |item| item["name"] == MAPTERHORN_PLANET_NAME } return nil unless planet - Dir.mktmpdir do |dir| - _region_path, bbox = region_geojson_and_bbox(codes, dir) - south, west, north, east = bbox - chunks = items.select { |item| item["name"] != MAPTERHORN_PLANET_NAME && bbox_intersects?(item, south, west, north, east) } - current = [planet, *chunks].map { |i| { "name" => i["name"], "md5sum" => i["md5sum"] } }.sort_by { |s| s["name"] } - current != (meta["sources"] || []).sort_by { |s| s["name"] } - end + south, west, north, east = region_bbox(codes) + chunks = items.select { |item| item["name"] != MAPTERHORN_PLANET_NAME && bbox_intersects?(item, south, west, north, east) } + current = [planet, *chunks].map { |i| { "name" => i["name"], "md5sum" => i["md5sum"] } }.sort_by { |s| s["name"] } + current != (meta["sources"] || []).sort_by { |s| s["name"] } rescue BuildError nil end @@ -347,12 +432,24 @@ module Maptool end private_class_method :read_json - # ENV read lazily (not a load-time constant) so tests can point this at - # a fake script without a require-order dance. + # ENV read lazily (not load-time constants) so tests can point these at + # fake binaries without a require-order dance. def self.pmtiles_bin ENV.fetch("PMTILES_BIN", "pmtiles") end + def self.osmium_bin + ENV.fetch("OSMIUM_BIN", "osmium") + end + + def self.java_bin + ENV.fetch("JAVA_BIN", "java") + end + + def self.planetiler_jar + ENV.fetch("PLANETILER_JAR", "/usr/local/lib/planetiler.jar") + end + def self.run_pmtiles!(*args) _stdout, stderr, status = Open3.capture3(pmtiles_bin, *args) raise BuildError, "pmtiles exited with status #{status.exitstatus}: #{stderr.strip}" unless status.success? @@ -360,5 +457,21 @@ module Maptool raise BuildError, "could not run '#{pmtiles_bin}' (#{e.message}) — is go-pmtiles installed and on PATH? See docs/development.adoc." end private_class_method :run_pmtiles! + + def self.run_osmium!(*args) + _stdout, stderr, status = Open3.capture3(osmium_bin, *args) + raise BuildError, "osmium exited with status #{status.exitstatus}: #{stderr.strip}" unless status.success? + rescue Errno::ENOENT, Errno::EACCES => e + raise BuildError, "could not run '#{osmium_bin}' (#{e.message}) — is osmium-tool installed and on PATH? See docs/development.adoc." + end + private_class_method :run_osmium! + + def self.run_planetiler!(*args) + _stdout, stderr, status = Open3.capture3(java_bin, "-jar", planetiler_jar, *args) + raise BuildError, "planetiler exited with status #{status.exitstatus}: #{stderr.strip}" unless status.success? + rescue Errno::ENOENT, Errno::EACCES => e + raise BuildError, "could not run '#{java_bin} -jar #{planetiler_jar}' (#{e.message}) — is Java and planetiler.jar installed? See docs/development.adoc." + end + private_class_method :run_planetiler! end end diff --git a/public/js/map.js b/public/js/map.js index 7a189d7..dce4127 100644 --- a/public/js/map.js +++ b/public/js/map.js @@ -28,29 +28,46 @@ const CENTER = [17.1077, 48.1486]; const ZOOM = 13; const ONLINE_STYLE_URL = "https://tiles.openfreemap.org/styles/liberty"; -// Recolors OpenFreeMap Liberty to the same NPS-inspired palette as -// OFFLINE_THEME below — warm cream ground, muted roads/boundaries — mapped -// onto Liberty's OpenMapTiles layer ids instead of protomaps' theme roles -// (the two schemas don't share layer names, so this is a separate -// hand-built table, not a shared object). Only the layers that dominate the -// map's overall color read are touched; labels, halos, rail, and minor -// overlays (cemetery/hospital/school/pitch/track shading, building -// outlines) are left at Liberty's own defaults — same "not a full -// recolor" scope as OFFLINE_THEME. Road casings have no protomaps-role -// equivalent to reuse (offline roads don't get a separate outline), so -// #c9a66b there is reasoned to fit the family rather than sourced from -// anywhere real. +// Recolors OpenFreeMap Liberty to a warm, NPS-Park-Tiles-inspired palette — +// cream ground, muted roads/boundaries — mapped onto Liberty's OpenMapTiles +// layer ids. Applied identically regardless of which PMTiles data actually +// backs the "openmaptiles" source (see offlineStyle() below): offline tiles +// are built by Planetiler's own OpenMapTiles profile (docs/development.adoc), +// the same schema Liberty already expects, so one patch serves both — +// no separate offline theme/palette to keep in sync. Only the layers that +// dominate the map's overall color read are touched; labels, halos, rail, +// and minor overlays (cemetery/hospital/school/pitch/track shading, +// building outlines) are left at Liberty's own defaults. // -// wood/grass are deliberately left unpatched — Liberty's own green reads -// better than this app's earlier brown/khaki recolor, and OFFLINE_THEME's -// wood_a/scrub_a below were changed to match Liberty's green instead. +// wood/grass are deliberately left unpatched — Liberty's own green (a +// translucent landcover_wood/landcover_grass wash) already reads well over +// the patched cream background. const ONLINE_STYLE_PATCH = { background: { "background-color": "#f9f6ef" }, + // Liberty washes every built-up area in a translucent gray-tan below + // z12 (landuse_residential, maxzoom 12 — gone by this app's default + // z13) that the offline schema has no equivalent of; protomaps just + // leaves that ground as plain background/earth. Matched to background + // here rather than left alone, so a zoomed-out view doesn't read as + // visibly dingier online than offline. + landuse_residential: { "fill-color": "#f9f6ef" }, landcover_sand: { "fill-color": "#f0e4c4" }, water: { "fill-color": "#a3cedf" }, - park: { "fill-color": "#b3e378" }, - park_outline: { "line-color": "#546619" }, - building: { "fill-color": "#ded7cc" }, + // fill-outline-color isn't touched by a plain fill-color patch — Liberty + // draws it separately, defaulting to a bright green that reads as a + // distinct border around named conservation areas (e.g. the Malé + // Karpaty CHKO). Matched to the fill itself, and park_outline's own + // dashed line hidden below, so a reserve blends in as ordinary forest — + // offline has no equivalent stroke at all (see park_a/park_b below), + // and the point was never to call reserves out as visibly different, + // on either side. + park: { "fill-color": "#b3e378", "fill-outline-color": "#b3e378" }, + park_outline: { "line-opacity": 0 }, + // fill-opacity: 0.5 matches the offline theme's own "buildings" layer — + // without it, Liberty's dense individual building footprints (each with + // its own outline) paint fully opaque and read much heavier/grayer than + // offline's softer, half-transparent fill over the same cream ground. + building: { "fill-color": "#ded7cc", "fill-opacity": 0.5 }, boundary_2: { "line-color": "#546619" }, boundary_3: { "line-color": "#546619" }, @@ -58,19 +75,30 @@ const ONLINE_STYLE_PATCH = { // minor (residential/service/track), pedestrian — each repeated for its // tunnel_/bridge_ counterpart so a road doesn't change color when it // dips into a tunnel or crosses a bridge. Rail is left alone. - road_motorway: { "line-color": "#fdefbe" }, - road_trunk_primary: { "line-color": "#fdefbe" }, - road_secondary_tertiary: { "line-color": "#fef7dd" }, - road_link: { "line-color": "#fef7dd" }, - road_motorway_link: { "line-color": "#fef7dd" }, + // + // line-width below is a flat number, not Liberty's own zoom-interpolated + // expression — picked to match the offline theme's actual rendered width + // at this app's default zoom (13; verified live via queryRenderedFeatures + // on both sides), since without it Liberty's own curve draws surface + // roads roughly twice as thick as offline at street level, reading as a + // much bolder road network online. + // ponytail: tuned for z13 only, not a matching curve across all zooms — + // will drift back apart at very different zoom levels. Upgrade path: + // sample offline's width at a few more zooms and replace with a matching + // ["interpolate", ["linear"], ["zoom"], ...] expression. + road_motorway: { "line-color": "#fdefbe", "line-width": 2.26 }, + road_trunk_primary: { "line-color": "#fdefbe", "line-width": 2.26 }, + road_secondary_tertiary: { "line-color": "#fef7dd", "line-width": 1.87 }, + road_link: { "line-color": "#fef7dd", "line-width": 1 }, + road_motorway_link: { "line-color": "#fef7dd", "line-width": 1 }, road_minor: { "line-color": "#fffdf8" }, road_service_track: { "line-color": "#fffdf8" }, road_path_pedestrian: { "line-color": "#e9e2d8" }, - road_motorway_casing: { "line-color": "#c9a66b" }, - road_trunk_primary_casing: { "line-color": "#c9a66b" }, - road_secondary_tertiary_casing: { "line-color": "#c9a66b" }, - road_link_casing: { "line-color": "#c9a66b" }, - road_motorway_link_casing: { "line-color": "#c9a66b" }, + road_motorway_casing: { "line-color": "#c9a66b", "line-width": 1.48 }, + road_trunk_primary_casing: { "line-color": "#c9a66b", "line-width": 1.48 }, + road_secondary_tertiary_casing: { "line-color": "#c9a66b", "line-width": 1 }, + road_link_casing: { "line-color": "#c9a66b", "line-width": 1.5 }, + road_motorway_link_casing: { "line-color": "#c9a66b", "line-width": 1.5 }, road_minor_casing: { "line-color": "#c9a66b" }, road_service_track_casing: { "line-color": "#c9a66b" }, @@ -161,95 +189,45 @@ async function loadOnlineStyle() { const ONLINE_STYLE = await loadOnlineStyle(); +// A vendored copy of the same Liberty style ONLINE_STYLE fetches live +// (public/vendor/liberty-style/liberty.json — a point-in-time snapshot, not +// auto-updated) that offlineStyle() below patches+repoints the exact same +// way. Offline mode can't depend on ONLINE_STYLE_URL actually being +// reachable — that fetch failing/timing out is the normal case in the +// field, not an edge case — so this is a local, same-origin fetch instead +// (fast and always available, since it's served by this app itself). +const OFFLINE_STYLE_TEMPLATE = await fetch("/vendor/liberty-style/liberty.json").then((response) => response.json()); + const protocol = new pmtiles.Protocol(); addProtocol("pmtiles", protocol.tile); -// Nudged from protomaps-themes-base's stock "light" theme towards the -// National Park Service's own "Park Tiles" cartography — a warm, -// Harpers-Ferry-Center-derived look. Not their actual map: a handful of -// values below (marked) are the genuine paint colors pulled from a public -// Park Tiles style JSON -// (nps.gov/lib/npmap.js/style/ck72fwp2642dv07o7tbqinvz4.json, the "Imagery" -// variant — the only one of their four styles served from a plain, -// unauthenticated URL; "Standard"/"Slate"/"Light" resolve through Mapbox -// Studio's private API with an access token, which isn't something to -// piggyback on even though it's technically visible in their own JS bundle). -// The rest are reasoned to match that same family (warm cream ground, olive -// greens, muted blue) rather than sourced. Not a full recolor: labels, -// casings, and roles with no clean real-color anchor are left at theme -// defaults. +// Builds the offline style from OFFLINE_STYLE_TEMPLATE — the identical +// Liberty JSON + ONLINE_STYLE_PATCH recolor as the online map, just +// repointed at a local PMTiles source instead of tiles.openfreemap.org. +// This works because data/offline.pmtiles is now built by Planetiler's own +// OpenMapTiles profile (see docs/development.adoc), the same vector schema +// Liberty expects — before that, offline tiles used a different schema +// (protomaps' own basemaps) needing a completely separate hand-tuned +// theme (protomaps-themes-base + OFFLINE_THEME) that could never be made +// to match ONLINE_STYLE_PATCH's look exactly, no matter how much either +// side got tuned. // -// Recreating the color choices is legitimate — that's not the kind of thing -// a data license restricts (see docs/architecture.adoc's "Offline maps" -// section) — what stays off-limits is their actual tile *service*: its -// OSM/terrain layers are licensed through Mapbox Atlas, a commercial, -// non-sublicensable data service scoped to NPS. -const OFFLINE_THEME = { - ...protomaps_themes_base.namedTheme("light"), - background: "#f9f6ef", // real: Park Tiles' own background, hsl(40, 37%, 97%) - earth: "#f9f6ef", - water: "#a3cedf", - // Matches OpenFreeMap Liberty's own wood/grass green (its landcover_wood - // hsla(98,61%,72%,0.7) and landcover_grass rgba(176,213,154,1) at 0.3 - // opacity, blended over the cream background) — the online map's actual - // look whenever ONLINE_STYLE_PATCH's brown/khaki recolor fails to apply - // (see loadOnlineStyle's fetch fallback) turned out to be the look this - // app's users actually want, so offline was changed to match it instead - // of chasing the patch's own reliability. - wood_a: "#c3e8ab", - wood_b: "#a8d888", - scrub_a: "#dcecc9", - scrub_b: "#cfe3b8", - // Close to wood_b, not the more saturated Park Tiles green: protomaps' - // theme routes "forest"/"nature_reserve"/"protected_area" (e.g. the Malé - // Karpaty CHKO boundary) through this same park_a/park_b pair as actual - // named parks — Liberty's online style doesn't make that reserve-boundary - // distinction at all, so a visibly different green here reads as an - // offline-only blotch rather than a deliberate distinction. - park_a: "#c3e8ab", - park_b: "#a8d888", - sand: "#f0e4c4", - beach: "#f0e4c4", - buildings: "#ded7cc", - pedestrian: "#e9e2d8", - highway: "#fdefbe", // real: Park Tiles' primary/highway road color - major: "#fef7dd", // real: Park Tiles' secondary road color - // "minor" (singular) is never actually read by protomaps' own paint - // expressions — only the zoom-interpolated minor_a/minor_b pair is, so a - // plain "minor" key here was dead: ordinary streets were silently - // falling back to the base theme's default pale yellow instead of this - // app's cream. - minor_a: "#fffdf8", - minor_b: "#fffdf8", - link: "#fef7dd", - // Distinct brown, not cream: protomaps' "other"/"path" kind is what a - // camper actually needs called out — unpaved tracks and footpaths, - // separate from paved minor_road/service (minor_service, left at the - // base theme's default since it's real driveways/parking aisles, not - // unpaved). Already rendered dashed by the theme itself; this just picks - // a real "dirt" tone instead of unstyled white. - other: "#c9a66b", - boundaries: "#546619", // real: Park Tiles' park-boundary line color -}; - +// glyphs/sprite point at vendored local copies (public/vendor/fonts, +// public/vendor/liberty-sprite) rather than tiles.openfreemap.org's — +// glyphs are Latin-only (see docs/architecture.adoc: labels in other +// scripts won't render offline), sprite is a one-time snapshot like +// OFFLINE_STYLE_TEMPLATE itself. ne2_shaded (Liberty's low-zoom shaded- +// relief backdrop, z0-6 only) is left pointing at its remote URL +// unchanged — offline usage is regional, not whole-earth zoomed out, so +// this only ever silently fails to load at a zoom level offline users +// aren't in, the same graceful-degradation story as this app's other +// online-only extras (Wikipedia, live radar). function offlineStyle() { - const pmtilesUrl = `${window.location.origin}/tiles/offline.pmtiles`; - - return { - version: 8, - glyphs: `${window.location.origin}/vendor/fonts/{fontstack}/{range}.pbf`, - sources: { - offline: { - type: "vector", - url: `pmtiles://${pmtilesUrl}`, - attribution: "© OpenStreetMap contributors", - }, - }, - // lang: "en" pulls in labels_layers (see docs/architecture.adoc) — only - // the Latin-script glyph ranges are vendored, so labels using other - // scripts won't render offline. - layers: protomaps_themes_base.layers("offline", OFFLINE_THEME, { lang: "en" }), - }; + const style = patchOnlineStyle(structuredClone(OFFLINE_STYLE_TEMPLATE)); + style.sources.openmaptiles.url = `pmtiles://${window.location.origin}/tiles/offline.pmtiles`; + style.glyphs = `${window.location.origin}/vendor/fonts/{fontstack}/{range}.pbf`; + style.sprite = `${window.location.origin}/vendor/liberty-sprite/ofm`; + return style; } // A sidebar icon that opens a full-height side panel (like the GPX one) diff --git a/public/js/offline_data.js b/public/js/offline_data.js index 91c5e6d..5cee5da 100644 --- a/public/js/offline_data.js +++ b/public/js/offline_data.js @@ -37,13 +37,13 @@ function flagIconUrl(code) { return `/vendor/flag-icons/1x1/${code.toLowerCase()}.svg`; } -// meta.source is a Protomaps build filename like "20260910.pmtiles" — the -// leading 8 digits are its build date. +// meta.sources is one entry per country the current build covers (see +// lib/maptool/pmtiles_builder.rb) — listing the codes is more useful here +// than a count, since they're exactly what RegionPicker's checklist above +// already shows. function formatOfflineMeta(meta) { if (!meta) return ""; - const match = meta.source.match(/^(\d{4})(\d{2})(\d{2})/); - const date = match ? `${match[1]}-${match[2]}-${match[3]}` : meta.source; - return ` · Protomaps ${date}`; + return ` · ${meta.sources.map((s) => s.code).join(", ")}`; } function formatTerrainMeta(meta) { @@ -172,9 +172,9 @@ class DataFileRow { } // Separate from _refreshStatus's own fetch (and only called once, right - // after — not polled): this one reaches an external service (Protomaps' - // build index or Mapterhorn's manifest, see - // lib/maptool/pmtiles_builder.rb), so it's kept off the hot status path + // after — not polled): this one reaches an external service (Geofabrik + // or Mapterhorn's manifest, see lib/maptool/pmtiles_builder.rb), so it's + // kept off the hot status path // and just silently skipped if it fails, same as everywhere else this // app degrades gracefully when an optional network check doesn't answer. async _checkUpdate() { diff --git a/public/theme_preview.html b/public/theme_preview.html deleted file mode 100644 index c5eac67..0000000 --- a/public/theme_preview.html +++ /dev/null @@ -1,111 +0,0 @@ - - - - -Offline theme preview - - - - -
-
-
light (bare base theme)
-
-
-
-
offline (current app)
- -
-
-
online (current app)
- -
-
- - - - - diff --git a/public/vendor/liberty-sprite/ofm.json b/public/vendor/liberty-sprite/ofm.json new file mode 100644 index 0000000..99fd5bc --- /dev/null +++ b/public/vendor/liberty-sprite/ofm.json @@ -0,0 +1,1850 @@ +{ + "aerialway": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 147, + "y": 190 + }, + "aerialway_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 252, + "y": 169 + }, + "airfield": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 166, + "y": 190 + }, + "airfield_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 267, + "y": 169 + }, + "airport": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 185, + "y": 190 + }, + "airport_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 438, + "y": 211 + }, + "alcohol_shop": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 64, + "y": 0 + }, + "alcohol_shop_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 455, + "y": 211 + }, + "american_football": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 85, + "y": 0 + }, + "american_football_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 472, + "y": 211 + }, + "amusement_park": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 106, + "y": 0 + }, + "amusement_park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 489, + "y": 211 + }, + "aquarium": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 64 + }, + "aquarium_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 246, + "y": 230 + }, + "arrow": { + "height": 7, + "pixelRatio": 1, + "width": 10, + "x": 72, + "y": 249 + }, + "art_gallery": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 64 + }, + "art_gallery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 263, + "y": 230 + }, + "attraction": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 64 + }, + "attraction_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 280, + "y": 230 + }, + "bakery": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 64 + }, + "bakery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 297, + "y": 230 + }, + "bank": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 64 + }, + "bank_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 314, + "y": 230 + }, + "bar": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 64 + }, + "bar_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 331, + "y": 230 + }, + "baseball": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 85 + }, + "baseball_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 348, + "y": 230 + }, + "basketball": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 85 + }, + "basketball_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 365, + "y": 230 + }, + "beer": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 85 + }, + "beer_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 382, + "y": 230 + }, + "bicycle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 85 + }, + "bicycle_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 399, + "y": 230 + }, + "bicycle_rental": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 85 + }, + "bicycle_rental_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 416, + "y": 230 + }, + "building": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 204, + "y": 190 + }, + "building_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 282, + "y": 169 + }, + "bus": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 223, + "y": 190 + }, + "bus_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 297, + "y": 169 + }, + "butcher": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 85 + }, + "butcher_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 433, + "y": 230 + }, + "cafe": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 106 + }, + "cafe_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 450, + "y": 230 + }, + "campsite": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 106 + }, + "campsite_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 467, + "y": 230 + }, + "car": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 0, + "y": 211 + }, + "car_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 312, + "y": 169 + }, + "castle": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 106 + }, + "castle_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 484, + "y": 230 + }, + "cemetery": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 106 + }, + "cemetery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 64 + }, + "cinema": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 106 + }, + "cinema_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 64 + }, + "circle": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 19, + "y": 211 + }, + "circle_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 327, + "y": 169 + }, + "circle_11_black": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 64 + }, + "circle_stroked": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 38, + "y": 211 + }, + "circle_stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 342, + "y": 169 + }, + "clothing_store": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 106 + }, + "clothing_store_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 64 + }, + "college": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 64 + }, + "college_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 64 + }, + "commercial": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 57, + "y": 211 + }, + "commercial_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 357, + "y": 169 + }, + "cricket": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 64 + }, + "cricket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 64 + }, + "cross": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 76, + "y": 211 + }, + "cross_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 372, + "y": 169 + }, + "dam": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 95, + "y": 211 + }, + "dam_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 387, + "y": 169 + }, + "danger": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 64 + }, + "danger_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 64 + }, + "default_1": { + "height": 18, + "pixelRatio": 1, + "width": 18, + "x": 228, + "y": 230 + }, + "default_2": { + "height": 18, + "pixelRatio": 1, + "width": 25, + "x": 247, + "y": 211 + }, + "default_3": { + "height": 18, + "pixelRatio": 1, + "width": 32, + "x": 272, + "y": 211 + }, + "default_4": { + "height": 18, + "pixelRatio": 1, + "width": 39, + "x": 304, + "y": 211 + }, + "default_5": { + "height": 18, + "pixelRatio": 1, + "width": 45, + "x": 343, + "y": 211 + }, + "default_6": { + "height": 18, + "pixelRatio": 1, + "width": 50, + "x": 388, + "y": 211 + }, + "dentist": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 64 + }, + "dentist_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 64 + }, + "doctors": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 64 + }, + "doctors_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 64 + }, + "dog_park": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 64 + }, + "dog_park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 64 + }, + "dot_10": { + "height": 10, + "pixelRatio": 1, + "width": 10, + "x": 53, + "y": 249 + }, + "dot_11": { + "height": 11, + "pixelRatio": 1, + "width": 11, + "x": 42, + "y": 249 + }, + "dot_9": { + "height": 9, + "pixelRatio": 1, + "width": 9, + "x": 63, + "y": 249 + }, + "drinking_water": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 85 + }, + "drinking_water_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 64 + }, + "embassy": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 85 + }, + "embassy_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 64 + }, + "entrance": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 114, + "y": 211 + }, + "entrance_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 402, + "y": 169 + }, + "fast_food": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 85 + }, + "fast_food_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 64 + }, + "ferry": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 133, + "y": 211 + }, + "ferry_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 417, + "y": 169 + }, + "fire_station": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 85 + }, + "fire_station_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 64 + }, + "florist": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 85 + }, + "fuel": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 152, + "y": 211 + }, + "fuel_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 432, + "y": 169 + }, + "furniture": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 85 + }, + "garden": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 106 + }, + "garden_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 64 + }, + "gift": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 106 + }, + "gift_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 85 + }, + "golf": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 106 + }, + "golf_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 85 + }, + "grocery": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 106 + }, + "grocery_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 85 + }, + "hairdresser": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 106 + }, + "hairdresser_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 85 + }, + "harbor": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 171, + "y": 211 + }, + "harbor_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 447, + "y": 169 + }, + "heart": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 106 + }, + "heart_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 85 + }, + "heliport": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 190, + "y": 211 + }, + "heliport_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 462, + "y": 169 + }, + "hospital": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 127, + "y": 0 + }, + "hospital_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 85 + }, + "ice_cream": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 148, + "y": 0 + }, + "ice_cream_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 85 + }, + "industry": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 209, + "y": 211 + }, + "industry_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 477, + "y": 169 + }, + "information": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 169, + "y": 0 + }, + "information_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 85 + }, + "laundry": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 190, + "y": 0 + }, + "laundry_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 85 + }, + "library": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 211, + "y": 0 + }, + "library_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 85 + }, + "lighthouse": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 232, + "y": 0 + }, + "lighthouse_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 85 + }, + "lodging": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 127 + }, + "lodging_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 85 + }, + "marker": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 228, + "y": 211 + }, + "marker_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 492, + "y": 169 + }, + "monument": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 127 + }, + "monument_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 85 + }, + "mountain": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 127 + }, + "mountain_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 85 + }, + "museum": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 127 + }, + "museum_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 85 + }, + "music": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 127 + }, + "music_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 106 + }, + "oneway": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 127 + }, + "park": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 127 + }, + "park_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 106 + }, + "parking": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 0, + "y": 230 + }, + "parking_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 242, + "y": 190 + }, + "parking_garage": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 19, + "y": 230 + }, + "parking_garage_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 257, + "y": 190 + }, + "pedestrian_polygon": { + "height": 64, + "pixelRatio": 1, + "width": 64, + "x": 0, + "y": 0 + }, + "pharmacy": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 127 + }, + "pharmacy_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 106 + }, + "picnic_site": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 127 + }, + "picnic_site_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 106 + }, + "pitch": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 127 + }, + "pitch_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 106 + }, + "place_of_worship": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 127 + }, + "place_of_worship_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 106 + }, + "playground": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 127 + }, + "playground_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 106 + }, + "police": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 148 + }, + "police_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 106 + }, + "post": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 148 + }, + "post_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 106 + }, + "prison": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 148 + }, + "prison_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 106 + }, + "railway": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 38, + "y": 230 + }, + "railway_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 272, + "y": 190 + }, + "railway_light": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 57, + "y": 230 + }, + "railway_light_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 287, + "y": 190 + }, + "railway_metro": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 76, + "y": 230 + }, + "railway_metro_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 302, + "y": 190 + }, + "ranger_station": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 148 + }, + "ranger_station_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 106 + }, + "religious_christian": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 148 + }, + "religious_christian_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 106 + }, + "religious_jewish": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 148 + }, + "religious_jewish_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 106 + }, + "religious_muslim": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 148 + }, + "religious_muslim_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 106 + }, + "restaurant": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 148 + }, + "restaurant_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 106 + }, + "road_1": { + "height": 14, + "pixelRatio": 1, + "width": 14, + "x": 498, + "y": 148 + }, + "road_2": { + "height": 14, + "pixelRatio": 1, + "width": 20, + "x": 437, + "y": 190 + }, + "road_3": { + "height": 14, + "pixelRatio": 1, + "width": 25, + "x": 457, + "y": 190 + }, + "road_4": { + "height": 14, + "pixelRatio": 1, + "width": 31, + "x": 253, + "y": 0 + }, + "road_5": { + "height": 14, + "pixelRatio": 1, + "width": 36, + "x": 284, + "y": 0 + }, + "road_6": { + "height": 14, + "pixelRatio": 1, + "width": 40, + "x": 320, + "y": 0 + }, + "roadblock": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 148 + }, + "roadblock_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 127 + }, + "rocket": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 148 + }, + "rocket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 127 + }, + "school": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 148 + }, + "school_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 127 + }, + "shelter": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 148 + }, + "shelter_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 303, + "y": 127 + }, + "shop": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 169 + }, + "shop_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 320, + "y": 127 + }, + "skiing": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 169 + }, + "skiing_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 337, + "y": 127 + }, + "soccer": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 169 + }, + "soccer_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 354, + "y": 127 + }, + "square": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 95, + "y": 230 + }, + "square_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 317, + "y": 190 + }, + "square_stroked": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 114, + "y": 230 + }, + "square_stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 332, + "y": 190 + }, + "stadium": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 169 + }, + "stadium_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 371, + "y": 127 + }, + "star": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 133, + "y": 230 + }, + "star_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 347, + "y": 190 + }, + "star_stroked": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 152, + "y": 230 + }, + "star_stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 362, + "y": 190 + }, + "suitcase": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 169 + }, + "suitcase_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 388, + "y": 127 + }, + "sushi": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 169 + }, + "sushi_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 405, + "y": 127 + }, + "swimming": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 169 + }, + "swimming_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 422, + "y": 127 + }, + "telephone": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 147, + "y": 169 + }, + "telephone_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 439, + "y": 127 + }, + "tennis": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 168, + "y": 169 + }, + "tennis_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 456, + "y": 127 + }, + "theatre": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 189, + "y": 169 + }, + "theatre_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 473, + "y": 127 + }, + "toilets": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 210, + "y": 169 + }, + "toilets_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 490, + "y": 127 + }, + "town_hall": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 231, + "y": 169 + }, + "town_hall_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 252, + "y": 148 + }, + "triangle": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 171, + "y": 230 + }, + "triangle_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 377, + "y": 190 + }, + "triangle_stroked": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 190, + "y": 230 + }, + "triangle_stroked_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 392, + "y": 190 + }, + "us-highway_1": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 269, + "y": 148 + }, + "us-highway_2": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 286, + "y": 148 + }, + "us-highway_3": { + "height": 17, + "pixelRatio": 1, + "width": 21, + "x": 303, + "y": 148 + }, + "us-interstate_1": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 324, + "y": 148 + }, + "us-interstate_2": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 341, + "y": 148 + }, + "us-interstate_3": { + "height": 17, + "pixelRatio": 1, + "width": 21, + "x": 358, + "y": 148 + }, + "us-state_1": { + "height": 14, + "pixelRatio": 1, + "width": 17, + "x": 482, + "y": 190 + }, + "us-state_2": { + "height": 14, + "pixelRatio": 1, + "width": 22, + "x": 360, + "y": 0 + }, + "us-state_3": { + "height": 14, + "pixelRatio": 1, + "width": 27, + "x": 382, + "y": 0 + }, + "us-state_4": { + "height": 14, + "pixelRatio": 1, + "width": 32, + "x": 409, + "y": 0 + }, + "us-state_5": { + "height": 14, + "pixelRatio": 1, + "width": 37, + "x": 441, + "y": 0 + }, + "us-state_6": { + "height": 14, + "pixelRatio": 1, + "width": 42, + "x": 0, + "y": 249 + }, + "veterinary": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 0, + "y": 190 + }, + "veterinary_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 379, + "y": 148 + }, + "volcano": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 21, + "y": 190 + }, + "volcano_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 396, + "y": 148 + }, + "warehouse": { + "height": 19, + "pixelRatio": 1, + "width": 19, + "x": 209, + "y": 230 + }, + "warehouse_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 407, + "y": 190 + }, + "waste_basket": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 42, + "y": 190 + }, + "waste_basket_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 413, + "y": 148 + }, + "water": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 63, + "y": 190 + }, + "water_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 430, + "y": 148 + }, + "wetland": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 84, + "y": 190 + }, + "wetland_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 447, + "y": 148 + }, + "wetland_bg_11": { + "height": 15, + "pixelRatio": 1, + "width": 15, + "x": 422, + "y": 190 + }, + "wheelchair": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 105, + "y": 190 + }, + "wheelchair_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 464, + "y": 148 + }, + "zoo": { + "height": 21, + "pixelRatio": 1, + "width": 21, + "x": 126, + "y": 190 + }, + "zoo_11": { + "height": 17, + "pixelRatio": 1, + "width": 17, + "x": 481, + "y": 148 + } +} \ No newline at end of file diff --git a/public/vendor/liberty-sprite/ofm.png b/public/vendor/liberty-sprite/ofm.png new file mode 100644 index 0000000000000000000000000000000000000000..8ac87bc1ccd91b37a44ae70e811642ee9d60c212 GIT binary patch literal 49454 zcmcG$Wmr|+_xHOf=@RKpcPS-oO1czj5Ku~5K-hGLG}0v?5>nD2CDOI&M!GjC-3@1P z-@oU7e$RED>pE}FS#N+1*I09oSz~<0cM_(mERTytfdv2nuA+jBIshPp-y)%7JOaN= zCEhIpfFGbJBdO_@w$q570O?9(D*R*V>hiq)cqskb<#E@|r3i;$cC1`>EFIfRdbZev zO-7GT-_a%98k|N_O6{)!S!&;dl0X6kqw3?clacpcX4_w`n z^BX+Q#0Fd3`R_Qr$t~4%U8;s-Fz-e?{*BGnI9t5pRGjR&Z3@4!=;c}fzSl_$iumOk zpUQoc@!|KN^V9oFv%7}6)#?0fN?tgUPlzs0)%)VDN zm~lpv^<~U9D1UShxHZhWxNj`bI3U21f+m}BM8J<{;THEZ-FQWO^1g(hXeClp%+wlIXgXvWgL{UX$$nL|356&x=Ha0fO%F2TV zO)th^RakdML8Uj3*6gqnPm8{Lp&Af&N(b4H?t84oT z8r<@c;TrM{G4}e}RE>W3{B4)!9~QpLfykM?VGC~De)rz{-)aMn7U^-k&Ua%9qltfH zoX2{fhlt-Scj@Zt2KhVW=H{*iv@cyP&J_(?FBsjwVZCeqER05zMIRWTWq#hesVipA zpH%Ya&z}?jKb_u6KVRHX=+9=Amf}U)a8OumH�owsBeb_%P_!(tX3BbWduyHQ?0G zPBR>SqJE0{dzMmh!~#FQ7;}+!O=OW?OrMI*Rs0&;LPJ_ih=xj1`&qIgbJH!aZlgVO z9f4ywzo5XB!y^qOKUHkv%%@qJG#m|BEg9M87)YaUoBI3vrB3{s*LecY$?eMTIiB1b zW+`X+s}i)eo+0_AJP~8!Pr`9`yiaEbbVQIMe~$23^Sd>5?iGcO;c5!i?sn7LHB!C` z#uI-fVAD%mG?_Q@ymu<-+lS0X&4Ggfo>(XI^zjoKmNR~s>)Vh$#MaQlzZmpb-8skcX zrW`C*3Vv~Na#L!t+M=c#Sy+&*eVYi>o(3LRys|56tSk*pu=SqK0W_&8WPhi!qpX|y z9fTYNsP5Q`ktZLN6Wphx4YX%LOghA*PxJxdqs3I={#qQZ~pe=GxyV zLe2ueFkY8e$-wk1&H@h1cDi6tgX(lq%_jiyU?D=I|J?S*mp5^Hs0=nhjr4fjp`{fZE$(=Ok#aH7H|}0mU({FM z-0sw%A@=s`R|SvJ=jt)e=a*&?o{!GF-#g(}E&<$zRi600;V~;IgT}|j{cKuK z`MQw*@1EyN_)9qGk(49`dS%2CTeA2-jNm;@r}~AlM#c z#-RzdF5>7(T6?AR(vNBf`Z~%7yELxhMsD=aAL&Wfz9#@VOVKNs0Ule=5K||7RQ1iP z?RRQ=N)BUos>Zn3fNw(tk-0Z#ImMD_o{r8?=h>$nrN_R!bFO&*v#A0gnPQk+y`JD}pb+jgQBA-ORJq6O){ zhB+?BhIqHls8t@&9{P2CB&pg(7{TmdZfyZ9rCS z+I_D6^N#KJk|2u5hew7riDM;bOCRnev>;7|`ft#+b z9H(=jhMAv{)X+ce9v&N!%C9tTwF?dp$Ko%SFG=$&#FsGr%aV6&nx;FA+olUBL3J&V zOf3YV4&j-9Q8Ig{)qL9dt49C06-|PF4Ep)sb>Lj5rM{yE962cHs`<+!{YsHK;vM^O z5Tf2fQ|7U|ozzdv4s5rt&lreE9X&$9kc>E}(bCeAy!55UxWC>ue3ABq{j}oKpJ?mC z=Fdg~+;k=o-OeJaC_4f-ZeLH7;Tt=D4Eq7foqMd#`+eDOpFTgFc%1DV6m%Nonw)@y za|h?|1Hamuk(Q@b4!l!?$WzBu4kt6B&5k?J+KVwiD4DA7$h3GxX&}Fkp+5$-R%F&eQ6nZu@u_=#ZR z1wir7b50J1Z`GHE|Ga?#T%e~X{%w6Po#ua;kA5)k4gBK+ z{yjeM=(Ij={>O$K!9ygs^YdSWZ}7md{{J>F1DfCck9%MlgjiBKU;pFCPku(&%SK=R z$E(EuWuD=|JPm;R@I+omfP2x*P1!##CPYPji-BHW{2zZy|M)NSG!N$g$EOw#K3(_y z*9I-^loWKz?B5^CAX2jbWj^%5{Qvm$|JNa7K>dHoN(Tyro?G0ni@G1J8d7vMe@tth z)S0AsRa;?7wk8JWb?8gtxPgN;(q7i;o%XRo}SLh%L}fm zsfpX$`#3r}D#gyhp{T5k$8)yGb7$G87VA5l2By7d;)9`~q4Ky*g*iEl>Uw%Fg@uI` zR8;V-K7M3gTU$e&&C((3i$9Ocen!AP`CW)#-gha6Q2YrM)qKL2FY>}7B4JeJG?6hQ zQ&m|~pt%o&ckNcJM2Pn$Ci@a$<-1qsnT7I=OABfLOW8MXCQWp*BX)l}g6=bg6n!_ydzA@!{$()sxJ+F7yU*dX)uZdO z*x)M7HxN~b$M4@t_mR9BtZC4h-j@oeL2e#4yVZR;Y$6Ps=O=ye*m@tcG9ljH6$N>V zN`?>uZsPB?evhOBudeVO`xM7;>N$LifH+1qoPOja=Vy%SPjO9zKojJ7D|w%>)zd;%!cS z$sb~i`O`kev#^Z#WW)QIRokn%aRmE9b3oeNfG=5JwBnyS9kanSXAXsv_C=Ol`STIp z304!&%t@bX7r{EGx;TiCo%&J~u7#P}_PLJbvUkDm7 za%?Ek?Ut0}-EP8Kc0w!U$B+?*;#}-}&e1tq z{O*FP7(6IpJ>*um2o=3UX%K zh@QH_V%?9ByXoVPl-qnNVlu)X3KO9AFBYs=;Y#*`Yo>7*;-XT6qL+RZ&E2smFXgQ+ ze6FswPcR+KHZv4FwSu;-E0FgOJ9P@$(jU~o7()X;oDk&#j$FWwvdNa39qxxdxu()3OT=2Er{ z3T#J)PQNb!5KPPPO8ro{c%-5c)K#~v*?GHe(?qW9kavean&y(`B#;odH=&muGGmTW z^6_CgRAf+FK+5!nz%cu#Ydbsd;qI5$G^D*#c#?#h)!7^3190S}U?MT^STM1_o2V{@ zK5IOW+q&8LL!-g;-F}04>@0B7r>q~-cyW5pv=F^_ih8rUO!v#WXV*|Vhv2t*=eH#D zJ}ah#1wSl_9oi%@Oaev0OgX+>veSinp`sH>I|>E;xVxnl<`lUv)JJfmYarW#1#hht z-&~gN#wX*Z1wZTfZ6tE`mJ7*C%xyW^taZiONo2x?vJADmG`EU7W9Pz4DCJ<{Ri3B+ zQIuBSmQVim@*@`r+N>a1_!hCcm!+Wh`OB!C+)v*v7hRa5+VsDA@7vx~HZ!JVaPm(y zAK7xuHFm}#W~Th}?qA+pKDFu{aB$|TKVOZ(jPGwtXETrC>QZ^aHXr>%+B3H;gAL%t z!|;U!IG;s6Il7#)s(SsF$NKRD8TyzZwj$Q$!M(hglwtJvuIXpRVp#UhDxtc^4(+YC z+0@q)T_aquCq;A7-Q&cjmp%CkGDq@NCTL8wblcchZ%^I@w$V_x+f)3E;#eo;k3ED- zS7P~a^5HJqp$!VU{cfc0l~VS@^fi#)=<|07|2s{oocWw3>512g-AUH_$e$RzgYMX+ zSleq=OQQK60!+J!*5A|QW)d2PD$*s?J_=0#rtjZGYBIWxH5QNJ80>?2i)&@Ixu0Ej zDd?-y>$@Qh)EGBYD)Yyhp|d2XnhM^ zX2OxDqu#vyoPOFh_JW@ZJ%pj`OGOw8xH{)0CY7-O#L_Hn^5w`FDW-3YQZl#kv#3f| zpveOwny`OP)l<_`%5-P?3vnIIbT(x?dp%;py7D>dE?l7FhS%{vTEWpX^1vrF9XqhK z8h=4BVeHG6h@;gK$Lh?l))&jm9ctw!*}L`c%1z=Ky8fu`r`~O^e=5kS{?)QyHv@aX zd%H?U3JrR)wMC+&!J)VHo44W(w%G^wyMJ5X0!C{N>hz|k<+gT>pQ+^Ey0cX?!$pr6 zKIpE3N!Jwh^=!s4B5e=-39u~!CmFdVUdTKSNOk)AEx{nB1?kL5g;^NE= z^%p3;g5UkpG3M_TbBg4h4MEt8`V@^V&{6mgJ~RWPGny7kD!$9`A)BWlFRWb+y(don>;h#0AwCB=Ij&%{a3{{60ak}=t}bl$mS zk?HYQGP*7*B@i56i~H9%Ul;7iLr%$; z=3BTY2CDQHV~*x7-%#zNYXIdn0TC$eLVn@Ity^_JBsyRwgEF};>+m_ns8a7am?1ZOg9fIYiI~L0j`p7tEMu9UpSVRn3n~1 zi@JJRMv;@aSYwvqRbvj{8F*G|T}68q*duSfGN1O5An#kRTQQ9aRDLx#hR@-cem_<@ zUh9Y6OB%6@qrLx;McI5Im=^Kn=T8!Z^nTt8;O3g&`O1vL!ZmtLd+2Be-FCsy2UoCroC=vJQ03!WTg z{mPVVOFg|P`K%%4KHkYC_^0ye9nn^WOWFm%4R2OiK`B>RLRsq2om4k}d}9gmuNo!e z-B?n|ed#w=-5yUaMNNa9r8v1S_ZOI=0N za|SwV4)4h!3p*CB^UZBx7v&VXQ{Ee;(Fl!`9K^~sowdGXFU^^8{TQ?v2#W0~vBgi)$z%ojd z*x!W-WdkOn%e$o0GvU zHnm!Do&s zR(uJMeRj`gkd&O&)c|&cNrDiPo9eN_oc-$i*(|4)5rXYFX-|j{-Q2e(*$ed0yh(>N zPafv(?20Dk9{~UJ8xHySC%whTcVK z!eKmP%|AjcUB&SXzrChh8r;KkD0IC(8FZW-MB@8e2+{P&x_BvJ{vzAbTSNSAs=a1 z6jELcPA0X~1~_XPVK!Wx9XEMH2TQ5VoVS`>oE0y!O*bwpG|7!-L40*q6rzO0YICZ5 zN#1^%oPt6)F%gZ4m>{b(*7jS@79D)CSwiMDEy_acF^tpiAMHAYh^|H8Xo8btec)0= z{r92nsJ%NM%RzJsv0ntnq8;ST?`12G^au@eBq-6wR@Qu>Wpy>sU8?_R0ZH}|Im`B; zir2Oo`({~32D83CH4}kG+Y)UM8?+(6n204N*|+6feXkC>us;VExM!19P7@vee1>T$ z-NO8uV)<&u+nLJ8Rd2cOO9o>tZtlj>(xg(OZ&8myZaSI#TGy%HNqUb7zDO@C-R_KKQ>##2H-C9ixkeU2MO;>uo zQ-D|ZR{4B03DmGQJy~5 z|Ltaua+9FRKSyOi=nowwq7Os~X<*`8YE;rV}V7hMDK z^38}^I#KxxOAJrugK2&$0oyK*1}c`fb9hLh(5?2bxA!rFsa`|vX%`uao>p-qhfyka`Lbg{Y)4tP&b&c?B%CV@SMxu$v4 zS_r31nqto%)3Z4l@ho^!ZeN`D>~aP}QNCcX8?oV=L>{#=d`Y}@hR;yV7Dt^~Iudk1 z%sctI5e9rvOX@@-_#+LrTfZ;yLT6DBFh;372oyAAbc}GlYgw<($t~!KMQOqDvqlT? z?&3wu+;w62hMC#sPyHhJXFrLbY*oZ=Kl0MayT2NxvHdDvlG9Oor}oyT+m30p0j07| z)!BhdjhvyRjh69OekIOa#Cw4na;q%U$J4M_X5;Gc!ITcVY&S@tjSs-Zs|=rOR~18KL2Y><pd<5NG5ORQGOk)KIAIGs<-* zb9V$%wC5RhE4eB>%#M25pOCKqwJD#S&IpT6{Rk;U8}%_Jw`OV3M$0eX?cGO6VA`gR^(^QmZ-3P~l7TFtE0hqLh=3YeJu;O3jgV-PmfpSxaCZp8PumNHLeG1-qMysAmV zf!DAYQ+JTjL4uaJaO64MDBG7YW{q7UeugnE{BNDaRNxDDTh=Z?Ug+4YV1RJ1+(lEw zOKjZwa^E3eUc^87xwxstu=3{hYp#{Z+QTh*_dy9{B)YRYDht{RUI&u0yGVP{Lel{| zeOTL0^b(5>3fW^ngyHzIHzVC&#)6_!dhH+M;H0H@WJP(8dXUG#qMR(jlZbiPKT;HY zF8b;&puh>^Yxw2)4T0a^TbUK20~g)A1!J z3%GJ4k+;VP_1hv-^1CcVm_&b29&mpql$}jKJ1BbmDvsBdb64_nF$Ab-kA0-<0`v9S zc?H|`9so-lS;oi|SSKV#yqY~icw;$&V^aYjq+P%t{GpLQGjA^^oBrYI=Q~eB$A=nB zGN3^R$Bqp|O>a+r5h&C_#sW_>Jz*z!1L={CKnNTcyaEMC<7u~_HNcufJN^L~yedm! z$jcO!N%9F#AWNh`64Qa|!~<0J5rRIje6NE%23$Uh1Tqu069HZ!c#XX&8zTRSl`@F7 zuUYa1Te`R5m!8?8x?M|334~iPW(qc3T97e=Fnbar)v`TBJM-zXi_EUWODdVv*gUX~ zaJt9HCy;#fBKwqg|NTFJ+|p4!BmBn?b|uQT6FMb^HYfTVs?HO7JB$&CiMzU^CEmc{ z+VX#hH7Ytiu{;C6l$^jSX588s|dj!Ay0koLU;Oe;A zGHS^I!x(ZwmWLCz&Q0@+_w|*0a_Z{04<|8{$|9D^1LRm~oOJSbLWC>2sHk%!0~S0Fb3Hoczcz@d#T$Vh%K{%d*jv&Ts=3J>kecKl(RNKObp z7}SfL)fYUlk6~JM9dr*at*-oG&YV9id1rrpoEFYh91TZ8$2YNaD=l`51ow3=uNor-3)Y2K@QS(L( zt}{E_Rp)#4WIQ&w7PA`c%d@V*1*4}AVi%gDg{MpY>CMmRrW5S0bdfc;W7C}?A6g?5wL=r=+QFXXf;ir`UGP; z9oP?{(i8&ui{z|iG0K|X_nXeTWgo0cB6&&eM_Mlqlr9CxLHGG^glHnQxY5D!N+d$H zSIOlNUhHcoskRu_ghr|SZUQ1O-l;=Lq?Ye(iWhUv<759R}6R5yaqu(&MPBm9T}x;JC-12 zW6>`n`JM?m43+INO6W;6Bkq@;In=-R;T0=R>eC4oSF=Dd;r#=`IMluk}-WSe}P_@l) z$IChh>EcccmO+FoET^iG$oop`FhpJRn{XiycHNkih5Ss2Z|!|!kRka(_%O#>IUf}| zam${jv}7_Moix_6Tb->o|C{SG4mHKI=lJz&n*Lb%g$EYTl8IPQ#mYVBUp60iH6J4D z7e52joM$()M?^}vjE3uujv_Dt^99C{<}0KE9*UPmv=Sh@Z|329ox;ak*fFm99cQj- z{`F!>yn!Sx6HwrDXz)Xn;bdx;!ZdJay#x?tX$V|q?J!x}5d862*rbM~XZR%LO}D5t zn@;t5o+6T8yIM|H-&Aw}8&LbVvODjWzv;p<`i}z(cj`1~aY4PAlpNeY&=Ay|x<&c50MGkmiI2=AUM=1#i+k-UCIIVW8-knv&O!DEI+haEg?7li9c7T z$={%wQnj;}Gt@eCN4$GJv+U>Nib(b=tR;<#H66_=z6_CeR`ahXA?!vFDKua# z*i@_!<;#AQP*(m6uzCT|VuX!Y22I1lFZ6`}cE_1S$0mFy^63(S{RTCB6UUWWf(j>F z^_Od9jM}4L8Vhte1GUPiQf893NE@MyPK3F3&h2c{o?FhN_ErpATfZo07sBFw3uZZa z4$VL<5KRbW@k9-J{Obl%4MFBfNA4S)`zfS2divXEtomXz0Qkqw61jSd0!H&d~QpFA=?C5ah z;e@YDYept_%Gm0|zCoY@@fW7T$qpzs=R1X&Xt>;L=pYf7dwWhiW3z~Ivl9ycGkUuF6)QMDx#df(A9y@$PxcNpit3rBHed=VFK$t@ zJx)^cz~iJquoz_CkrtjRycHcgo6hG-vFcl17gMjxmvFV_vTFDpP&z-SK|L#eKXq20 z1S`MB&l*B8+pZ*pfm&fcRIy;BBfc>!a_f`3K29vZP!#D$HpWZDz_!nH^^&+ztfp0f z=3aruTdOV@lU>HhrT$0OUh1r<)2*sMj68PDyy$neO?jzaFYJVGK@FsnUd==Z3>2pI zliI|doREZwONm?hq*UC87vc^&vmbEAtp57mAXSU4T}ddm4Q5Gt;EcTg33A%UDtH~>n1zlr{0YmQJ>nFuk;I80eZXw zG^6k-WZEKm3lkKf^HD_GM%3<kiTKUts=lXKH-2?`lPtqUa*6>%{egJWX*m{5wg@Z8zCMnv#g-%RSW0XB8j z7MY-U0o5f<8x0r~ca&?`V7Xa_{AklX*^(|TrRrc9ml_4PHQR_6FQmDlD(-&L9p*Y_5O+82}ruH?S zKuXu(e_rLeAlCo%^-ivgBc%v$I_G-!a%kMV*FrUgggmymbS}O`i}GhbH9E%;^PN-C zLB814#!Ep~4PEdjVyATI2A63z@eSu+re&VZ5*d&8@z_E<0y+l!hdJ6>KpNC|rG^O5 zCi)dYB<67zw?WFU7JvU6cWa!3BAIvhG4T!epHkfo@~*Z+s0tj@7|((|nYLm{@T*?u z3rM|*Oj>EseV|>;P0%7en(^YB-x>ZbQSprt$6XC7SU<&vs0~_^qxd~9>P@ef1b+k= z$?AqZwy=8w5a!#=)vlbd{ch%c3dY=1TRu|LeZ7U}827fi%**(`G09`OwmD55_Imb*UNT6qoA6GeA8u3xo6I z`m0CS_;{6w11c0-!h>s#P<|l&o(1ok3ekbYI*44p_T#f5oztDhn%}b_`S`9YRILJ| z4@D8}k@(a>&opn)pdPCRH^dhd*Y_=3$+m_mB3ER zer-`mA+bgWQvQ@K`rW)XQnL3_*NY8ZU9l_#LWr)R4V*FwJ)0cgPr}m%N?ytB-XRm%t5nJ(#|A)FU7b?yr0uW=^>SU6W;Ps7?sG`35n_#6DSC-0bIRQ>h! z7~U&zbmp0!PLwuEdt;0_WsRZBY>Do^aW9=EYR?+|#M3jMeP7gm%Yi9H;Fx#K zs9pXiIa37DqG%fmgA^Hk5Kq2l3bNlcH*}B^l*&weJb>VkEm+sj%lJMMzTz0WFLIco zBZEv#;eQm`p+_oonA_URS#)ysM0hvTD8m39#+K{TcSg@wgXVS!_va_Ck)W9Ksy>sq zes!%1Pu~l6K@I`YL65Hrini=jSUPU2#_=@?bA6ab1y zw3IQfemkyP(K%bZ!6F98^Z%f?2*d4a4dGT63l=d{3+ex$?Tb%?(r`1t~A0S#a&Q#^z#J>L5~lrRe3%J!1N1F~TM-K4}e zWc`;fm5yx)%yY|q{uwXZqjiuUn z#{-jx-gel_zs<71pm&`xyw*1y3D3BGPV#YYBgfU?PtC^tO%%+p7RuhrOJbqV$aO9^Y7r!<-T@2Sx?6DGw|}8Z=1Ly z;>+61KDxziBqRH#Nyddxn9s#EC>Gf#UFxVi$=)mt)ugVupH7aJuwPNG3>nrL`>q4}kuT%7rX$D*rSGx~X}8e_T{FJf13ugM67Y{fbUWcu?rh00o+K$dhIsI5q)w55 zt@Qdx`MC!xSsJH*dwwO$Sm)K(U3?d@YmR(QnM(GJ-NBDP-_~;b$6|PlE!&kajA-}==SkEI@ojB) z?*!aS)_kM1TG3c5Z@*pDAwK2R_jnsUE4Od69iE$$-S|2sySh5EU*A44kA5Te+gN75 zaS8fk;Bd=YS1R-F>>b(DuFl~!WRPH(PNou<3hD4tS@Y5fLN=X4_GkWn8IuTN*m{qA zX|t#KAmg(lY3^|Bem=GpjxyFlc$=7kw_xB9xjJx*&i1d`bjc;12Ze%pKOx($z(GLp z`KSz@&Ux@y>PPJpkztP{ke=kmcMXR;5rFY~PhYLfe9LUpRUMXrN4(1PH+)>CoiZp7 zG6)*?36v5G+gF$=o|_g<11(a}A_qCSL{%hw*`>BlEQ)(-W19*&@+_G66*L7RuDe>8 z&Lb$EEyY}R^ca^R@*Od5NiBGgvrB0IHetcCic2*Tb!DXe&0~iZ`P$E^Q;<}N>D$6S zx^)65K7m1^YQd=$3d%+?nGa&)f#pEL#K+c2J7{8f$y7XNmTRF(w}DFY*Ux-(2M+cU zCN1pGRR-x$jvQ!-HZHMik=M(mg4&gl>@}kGtzYEY4iEm}ND$JI`gw_6mJ(IV4t)Fz zsyA)a0aceiWALO-L=^@nRaNalZNecf@!~=W>Of ztbk7C)*{okuS#}SI5YVzlf*KZYxM7?y(iywl4HG zhD{^OX8vw7?EckwR`^$7<`=yT=LBp0vW(uCr1W0!C#vICcM56}P{>+icQEYc(eOcR zgT|-(%TM>oAbd;dLHZZpc?|7WNlQy_E!~i`z=|Hp)R8Rn?y23OTv5Br&f-um%-K`i zKd**8`@Aj*(kKvZn$UTvi-x?ss;0dlH8!x49+lzNn#9LflpaCm9rg5L7d6mFu1aDR zB?d-M)7n{^ao+dRZFxXE=ByCwcgq40AS@Tzt=_nIWPSEDTDP%qvRiGX{7yjAwb^rE@ zC>8p2ItxC**!43CGdx|9RZV)g=V)*-y(|x@D;NYbQV9 zkrxARRt9t*Ye9FwTa0)Y^O+hLc*XVgwz)7e)gB2SDL@ z@^b!#s|ZBIKw(?YXS9Ek6?sG@IIGOnwg z49&bE!iWso?4SJngz2I4VU+K0cUC)fYaa(-4-G$YBfo}5=^Jjo+P1A#T0BQ#3&A0{ zBV&HwTcR&U_V^foIM8J5%sayz(n&!=Z}Vmiuzzak%bFGT*u?u~`B&>$NqB6+ zyVoxJ19TZ>O^W72uNc8gehk@g=3gs1+%BwjUd-?}2GEbJw$0_*YZCIC2Q`tVNA+c? zGZG2-w(}ClL!deZtYZHatM21j(Zo-T`W_nKtoMy%qJS9Gct@Mmc)eHlnba|qe>?;q z^;Qcxj}4xon6>sVp!o>}MGxQwXg>uxKD;bsKP%~pbX8g`K$X>(*S{j0)xhqRG{_TpG5Nmmp?&Feve`9QI3s$6l!Q9weTh=Z9m%3vYhSF9?Rh~vz*zmyv9AvyH!4yX1tL7G`TgsZk89Tb!;(w49ZbX z^@{JU^T9NHY3T5<3g1>JiSk;+&Q(FkNEQyWP@&?xU7R2`W~RP~gzEQ|%+Hr6#c^@A8_{Zv44dR}Ed)-NHCg zqcE@ye#s;Oq%X2be{Zay&h*Lr{XlM-Mm7dwJp$PKn>2BBF)!0=>knr-knbvAM(H4& zY9mZOc?N_Q?j0k3Pk=Ow<((Q~u8NJ$uXo0={)Ufy2cSbDi&I?{48~O_V#Z1SY@SW8 zQfG>CAuUZP?mqjNhH%w5eK8>A(vTmA7EzAe4(xbY)AJFcI|{oz=HG#W|7)QC_ey0H zPj@hg{;KlpyfCMmt#Cm#T;~4$xvh>YcmbCc)DT>v=D_Kw0j!)?UHp3+`9t zFU5@Z3~Sw@V$gSa_A_#iY`#4h5wa4r$>0JnwQ;|~TBVIn?ZqNevDL~&RG&EUYY5Ga zjjYTvs{>>qsz@zflKph+Amy^`6R~)y_*tkYHa*nTCk>QGYAjGLd14|#yD~+cmw?}k zSS-rW$|*5|g=yJDqGvT!8(AgW`Y^o^AQ>O!<0MsHDrJKY=Thsl!cYn_TqCJpP^#&}6iVhK4e} zG6azabzXD`n(yw{()bQWr z0Oi%i)Cz;X*gln~9W7W#O}05Id2DDo z*i4d+qhnbol!#f>dlr5`vM&sIiEpqrEzAa@L}Kigt~5}kiWC%~7qFfh|9{c;mO*i~ zQP*Z;L4vz9PJ)Ht&?H!Z0Kq-DO9<``jYDt^(!m1+3GObzL*womoZ!wJ^1Ry7(9?$+zNs^c<IrVlf|5Q2OU@~JfR`OgjQRX`G8 zTOZ&DX(j1nPsAByh|WG>yrz%|6e*q$BFu3!d}DOGhk%8URfoS5E`QjY8t47nE%0?W zjO(DQo^bwaoa16OJeokd#c}k)$gqt_0hTgl)SH^IVOI$_4f6^PyMN4Cxv0WZZ~Y{u zezks3`J!-D`>&DoSb`*?vWD4>m~|8BK2ei+T|%5f#S{qK74(h~5?PlCTA+*l(>jpo zYWol(|M~vTF2h&UwtR*=_O?fIp``)KGX{N&rEXGB(v5HOh_qcuE?tRIOK&#MUsClu zX?75T&=zaw<$Z6>z_zbIuIEr*#0oTbLsv8~g8FVppx@iIG%WmZtAUK2Y8mXlnfeuuCH#-N!0qj+AO`=$wn^+GfB9>?PwCPzhpkT?03MR6bv!o2 zX#WL%44I4;2jrX|R4G4HW>c(g3=%o3ejU`zXtkMwfx0DmR@b^-n$98s^W>W0Vg zq9Cf2h9)4kJN3apUATM`7-%;q-|Wc59v|rh#vd6QYW66{CY83_z&P%&DEw+;x8>xU zB?<(~LxYyRMKNki^aSUfF^3ZzPF4&)yCPMX&vRsysVGt@Nw4HFd1^5>pT{fBSFK}8 zD7|&)tP;f4e>*(R|1q`aj&qxA?RfXnR2l{74gjon5EHeEftDiSFlQFh>1ffa> zaS$sH6+y4=GaX?3C4UG?7J-(07&014)PF# zc7q>zUp|)~_I?fTdX1mOf(qMP!J++v?B4eCmjbW|Um-XJ0t&)!*e5*uR^G37r01TPmUL z$V{X9T7Nn0ky-#MqK2U4BZ&!EL0@EM+#nse3=o1C6(Wms6mn43H_C?$Ws)&0?AAer zx?ZwI!UCtasPdiEX4Z90t{02+k`Qv#f-t*34(?sy(KWS{Y3oZ)eTh{M?rdrFJdpp< z*+@^e9$K6isBa}i6@UFPDyeb=svPTZk|MCdrh@{yRp0G5nadKHox-|ZbZiVJU^L!t zQU|H+YN;hi(AR|rHr%l?|NNk_)%^;U9|IH-y0Yclc^C61*ny0~nh3-=47g3dU*ZZq zZnCOK+vtVj7tBjTNsmg;BoUpR4x&;mg1wU|#Fgf$ulxcrBJ4I?LKuiaV=m<)}M(=;Rp1 z=9J~wPeO2ib0#zLKFL-FRM=#H#Yaa+s_X|2ofnPJ*WKIpEPtij zwO*5il(%(1_sayF4DJEhU~le;jJGlS`_IVdy?+f%WG%pNe}}7OhRKDyWWl7_BK!Oq z6^WKxV&Vk>D(eh$1X3QG!<$t1N%usnYbpDKOu1x34}}V8uSf0|A-Z+@fUQ45r~&rB z-y9!3kq8J5G-uA8*E&35n&oBR%OC@L+|mlag0m)(Ql;rtMY2~%@e+r^>FKM|w%iOw zc}C(@9`g)Y&PAKSrep6tEvO7i?!t!11Y*?^zg|0_A*j-NKDXT_D)J*Q(dzq^PcY zW{kS%Bsw!y5f#?zmjvB-_`1rM2+HKv4P=_L z?U;+8uRYp%$iR7(Pw+X6$9rPY>!m740=5LAYiKppPPNSU{(Bd2Fr&CPu$2N}l%wZTlgi|3tpl@cif4IpCb& zG0r`@A>8wi3=8+T{h-<;O6%;wCS5Tk=7ieWu|%1tx84KOX_n7 z#&}ALOEHU9LObE5vz8*?c*7;fN?)<^I!F_NB1w$*m0m`wgU0iK_^<)yuCvSKyrfLd zjo-rSL40A6_6x%gyfWp@2-L9kUUWx)pBquney?5-CAefa?WOqUZMK-dtGUpa?n08u(EJsxM`f749U~B3EHlU!s+7s|ifa|liZFz~La74=Pyv6twF&>leB2f9Kh|WS-w+L3KC+yz1hxV2Dk>X6qE1Z}Gw2>5*ILJHBe-TVdF<>#*z4|z2)CHK8xUK$N+d>MF7u_m~-(2DKOJPrw zHXVgJ`!3*06xyE%DYrk#bN~2akhyQt%S3eO5HkqH(BU&)dW2^<- zH|HDW=5N{6(B4cUHLzlX2k2Gv4K7|VCb!*#v*(bBk1evmk> z+sQ)ONP+l6W6DY&?Ji9oac16^*^0gAPoWQNsE4zqUo?u4OYZKT)$m0D4z5zU^g44u z^3&3G*Ag-eHz%{Q!14RKz`~p}@AgxF)$53{^}aG(oC%G?ChVMJMyjX!^21THOwqt# z9}wh_7uD7H!s)~N9~Of6@1!FoStGX-0s6+i%R|78o#*GbPCIGSx!Zs>N9~VJr#J#N#1r0BnOq0zH7;}B?9rE50%zSPjxpR zu50_ASmI|^#PQUqqYQZnyzWWdL);YoNlEq$&_WaRByrA9C;9uEgQq_sb@F$+{wIln zOz!2#;@C?35ms#Wzd3HKgJhnc{7K0z^bw^1nADxO8a=C$00e-G?n4Ef9aG<$fd#Wb z;AXBshArx>fZXDy!2Kqk)C+xefq0CV)TINqzej){hni-#4&PdUMq>YGFgn>=Z2oIW z3Gj79tBK4@)Z@(o`t`ojmO$zA{+)qKdVoJ%3I)t7@e1p{KY<<;L*fCX(k_3*4ZpK3 zdumajj&A796%N|0Wc&%NG*vLl<`#j9M7JGJJ`jsIw2^9N4;#(W=d@G z7X1~vU!wIF3TZ#PFJ3XPI6a>M#tE(jHl302&T>?5T8<^AlR*2m>WhbOB_J*Zrf8() znA627ZU-}-`IV$@nYn~=q~6)zAwO4+x6kg49szy)?70} z6ZS(8pl*(re5201qV%CQ1G|5W?N>=&#lQWwySg<`nD(|?{;29a}8pIxK8$@CXZ-mR8OOTnc=6DuQ5a6i0ph35rNid*= z8986mQ}0XXuX=`d=2m^Ir=gLV&ZCpu#!RJ6ANCOUaG<;cW-gYU>j#j(cvV(``0cMi zN-U%j+#04ZfZy6doH;Kq?R_)p1RyG{x5;U{mff%rkh{Ve@(4X>K^qk7$}^VWG1S}9 zHK$<+X`c%lge+)+_IH8gvpxtmHCwsQM*#Fg5|6{Z@OrI~W&XhGaVzbnNbj)9LJdQkmKA*DTnJ!7mL=eVDE?-e;(37uoEux zU&Za$x@8ft$hNe$z=6ClE)I=kr@>{O&%KtDuoQeKuho#mxkiKQEH3n%lyzH31$4Jd z7FRjMxL*-c$4L;@`;$HIhySc_-m-d&YhggRl+ zKR?^K1BanB5&)Uu(*#h45^({ZMR9fD2xv-nIjS)8HyR4aICP*g`;^CVS;eNGsGwli zUq7}nQF0RU8$%Eg%*2vRzI<%gVY4m~3|0kHTtIcele*}B6nitEB5fhgOmueF2w+mC z@^|pO7DybA{`{u92xvhyWex%Ja_LpLN-MRpz7=239mU?~`(f2p`&>YYk5xY#hug;b z2d;mTIlFNEiwgq#n1O%GM^(41v_%2T!R^E4Nh;~?kZmbYc|bA)ooOJ5+PxSfNMGn> z4t$FH3y)b%2(#!z5oZmF6$`{600XE9o&Yk?yl`p6rBYRryF7bwW{?`5^y&A%`Y(lQ?>V9qgEi$EP>oaktfiogW^^1 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�FwS3 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 olQ2YWWH)Tuo8!N!lp=62imS=",["get","admin_level"],3],["<=",["get","admin_level"],6],["!=",["get","maritime"],1],["!=",["get","disputed"],1],["!",["has","claimed_by"]]],"paint":{"line-color":"hsl(0,0%,70%)","line-dasharray":[1,1],"line-width":["interpolate",["linear",1],["zoom"],7,1,11,2]}},{"id":"boundary_2","type":"line","source":"openmaptiles","source-layer":"boundary","filter":["all",["==",["get","admin_level"],2],["!=",["get","maritime"],1],["!=",["get","disputed"],1],["!",["has","claimed_by"]]],"layout":{"line-cap":"round","line-join":"round"},"paint":{"line-color":"hsl(248,1%,41%)","line-opacity":["interpolate",["linear"],["zoom"],0,0.4,4,1],"line-width":["interpolate",["linear"],["zoom"],3,1,5,1.2,12,3]}},{"id":"boundary_disputed","type":"line","source":"openmaptiles","source-layer":"boundary","filter":["all",["!=",["get","maritime"],1],["==",["get","disputed"],1]],"paint":{"line-color":"hsl(248,1%,41%)","line-dasharray":[1,2],"line-width":["interpolate",["linear"],["zoom"],3,1,5,1.2,12,3]}},{"id":"waterway_line_label","type":"symbol","source":"openmaptiles","source-layer":"waterway","minzoom":10,"filter":["match",["geometry-type"],["LineString","MultiLineString"],true,false],"layout":{"symbol-placement":"line","symbol-spacing":350,"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"]," ",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-letter-spacing":0.2,"text-max-width":5,"text-size":14},"paint":{"text-color":"#74aee9","text-halo-color":"rgba(255,255,255,0.7)","text-halo-width":1.5}},{"id":"water_name_point_label","type":"symbol","source":"openmaptiles","source-layer":"water_name","filter":["match",["geometry-type"],["MultiPoint","Point"],true,false],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-letter-spacing":0.2,"text-max-width":5,"text-size":["interpolate",["linear"],["zoom"],0,10,8,14]},"paint":{"text-color":"#495e91","text-halo-color":"rgba(255,255,255,0.7)","text-halo-width":1.5}},{"id":"water_name_line_label","type":"symbol","source":"openmaptiles","source-layer":"water_name","filter":["match",["geometry-type"],["LineString","MultiLineString"],true,false],"layout":{"symbol-placement":"line","symbol-spacing":350,"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"]," ",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-letter-spacing":0.2,"text-max-width":5,"text-size":14},"paint":{"text-color":"#495e91","text-halo-color":"rgba(255,255,255,0.7)","text-halo-width":1.5}},{"id":"poi_r20","type":"symbol","source":"openmaptiles","source-layer":"poi","minzoom":17,"filter":["all",["match",["geometry-type"],["MultiPoint","Point"],true,false],[">=",["get","rank"],20]],"layout":{"icon-image":["match",["get","subclass"],["florist","furniture"],["get","subclass"],["get","class"]],"text-anchor":"top","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-max-width":9,"text-offset":[0,0.6],"text-size":12},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-color":"#ffffff","text-halo-width":1}},{"id":"poi_r7","type":"symbol","source":"openmaptiles","source-layer":"poi","minzoom":16,"filter":["all",["match",["geometry-type"],["MultiPoint","Point"],true,false],[">=",["get","rank"],7],["<",["get","rank"],20]],"layout":{"icon-image":["match",["get","subclass"],["florist","furniture"],["get","subclass"],["get","class"]],"text-anchor":"top","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-max-width":9,"text-offset":[0,0.6],"text-size":12},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-color":"#ffffff","text-halo-width":1}},{"id":"poi_r1","type":"symbol","source":"openmaptiles","source-layer":"poi","minzoom":15,"filter":["all",["match",["geometry-type"],["MultiPoint","Point"],true,false],[">=",["get","rank"],1],["<",["get","rank"],7]],"layout":{"icon-image":["match",["get","subclass"],["florist","furniture"],["get","subclass"],["get","class"]],"text-anchor":"top","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-max-width":9,"text-offset":[0,0.6],"text-size":12},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-color":"#ffffff","text-halo-width":1}},{"id":"poi_transit","type":"symbol","source":"openmaptiles","source-layer":"poi","filter":["match",["get","class"],["airport","bus","rail"],true,false],"layout":{"icon-image":["to-string",["get","class"]],"icon-size":0.7,"text-anchor":"left","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-max-width":9,"text-offset":[0.9,0],"text-size":12},"paint":{"text-color":"#2e5a80","text-halo-blur":0.5,"text-halo-color":"#ffffff","text-halo-width":1}},{"id":"highway-name-path","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":15.5,"filter":["==",["get","class"],"path"],"layout":{"symbol-placement":"line","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"]," ",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"map","text-size":["interpolate",["linear"],["zoom"],13,12,14,13]},"paint":{"text-color":"hsl(30,23%,62%)","text-halo-color":"#f8f4f0","text-halo-width":0.5}},{"id":"highway-name-minor","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":15,"filter":["all",["match",["geometry-type"],["LineString","MultiLineString"],true,false],["match",["get","class"],["minor","service","track"],true,false]],"layout":{"symbol-placement":"line","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"]," ",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"map","text-size":["interpolate",["linear"],["zoom"],13,12,14,13]},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-width":1}},{"id":"highway-name-major","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":12.2,"filter":["match",["get","class"],["primary","secondary","tertiary","trunk"],true,false],"layout":{"symbol-placement":"line","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"]," ",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"map","text-size":["interpolate",["linear"],["zoom"],13,12,14,13]},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-width":1}},{"id":"highway-shield-non-us","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":8,"filter":["all",["<=",["get","ref_length"],6],["match",["geometry-type"],["LineString","MultiLineString"],true,false],["match",["get","network"],["us-highway","us-interstate","us-state"],false,true]],"layout":{"icon-image":["concat","road_",["get","ref_length"]],"icon-rotation-alignment":"viewport","icon-size":1,"symbol-placement":["step",["zoom"],"point",11,"line"],"symbol-spacing":200,"text-field":["to-string",["get","ref"]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"viewport","text-size":10}},{"id":"highway-shield-us-interstate","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":7,"filter":["all",["<=",["get","ref_length"],6],["match",["geometry-type"],["LineString","MultiLineString"],true,false],["match",["get","network"],["us-interstate"],true,false]],"layout":{"icon-image":["concat",["get","network"],"_",["get","ref_length"]],"icon-rotation-alignment":"viewport","icon-size":1,"symbol-placement":["step",["zoom"],"point",7,"line",8,"line"],"symbol-spacing":200,"text-field":["to-string",["get","ref"]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"viewport","text-size":10}},{"id":"road_shield_us","type":"symbol","source":"openmaptiles","source-layer":"transportation_name","minzoom":9,"filter":["all",["<=",["get","ref_length"],6],["match",["geometry-type"],["LineString","MultiLineString"],true,false],["match",["get","network"],["us-highway","us-state"],true,false]],"layout":{"icon-image":["concat",["get","network"],"_",["get","ref_length"]],"icon-rotation-alignment":"viewport","icon-size":1,"symbol-placement":["step",["zoom"],"point",11,"line"],"symbol-spacing":200,"text-field":["to-string",["get","ref"]],"text-font":["Noto Sans Regular"],"text-rotation-alignment":"viewport","text-size":10}},{"id":"airport","type":"symbol","source":"openmaptiles","source-layer":"aerodrome_label","minzoom":10,"filter":["all",["has","iata"]],"layout":{"icon-image":"airport_11","icon-size":1,"text-anchor":"top","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-max-width":9,"text-offset":[0,0.6],"text-optional":true,"text-padding":2,"text-size":12},"paint":{"text-color":"#666","text-halo-blur":0.5,"text-halo-color":"#ffffff","text-halo-width":1}},{"id":"label_other","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":8,"filter":["match",["get","class"],["city","continent","country","state","town","village"],false,true],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-letter-spacing":0.1,"text-max-width":9,"text-size":["interpolate",["linear"],["zoom"],8,9,12,10],"text-transform":"uppercase"},"paint":{"text-color":"#333","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_village","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":9,"filter":["==",["get","class"],"village"],"layout":{"icon-allow-overlap":true,"icon-image":["step",["zoom"],"circle_11_black",10,""],"icon-optional":false,"icon-size":0.2,"text-anchor":"bottom","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-max-width":8,"text-size":["interpolate",["exponential",1.2],["zoom"],7,10,11,12]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_town","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":6,"filter":["==",["get","class"],"town"],"layout":{"icon-allow-overlap":true,"icon-image":["step",["zoom"],"circle_11_black",10,""],"icon-optional":false,"icon-size":0.2,"text-anchor":"bottom","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-max-width":8,"text-size":["interpolate",["exponential",1.2],["zoom"],7,12,11,14]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_state","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":5,"maxzoom":8,"filter":["==",["get","class"],"state"],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Italic"],"text-letter-spacing":0.2,"text-max-width":9,"text-size":["interpolate",["linear"],["zoom"],5,10,8,14],"text-transform":"uppercase"},"paint":{"text-color":"#333","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_city","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":3,"filter":["all",["==",["get","class"],"city"],["!=",["get","capital"],2]],"layout":{"icon-allow-overlap":true,"icon-image":["step",["zoom"],"circle_11_black",9,""],"icon-optional":false,"icon-size":0.4,"text-anchor":"bottom","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Regular"],"text-max-width":8,"text-offset":[0,-0.1],"text-size":["interpolate",["exponential",1.2],["zoom"],4,11,7,13,11,18]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_city_capital","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":3,"filter":["all",["==",["get","class"],"city"],["==",["get","capital"],2]],"layout":{"icon-allow-overlap":true,"icon-image":["step",["zoom"],"circle_11_black",9,""],"icon-optional":false,"icon-size":0.5,"text-anchor":"bottom","text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Bold"],"text-max-width":8,"text-offset":[0,-0.2],"text-size":["interpolate",["exponential",1.2],["zoom"],4,12,7,14,11,20]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_country_3","type":"symbol","source":"openmaptiles","source-layer":"place","minzoom":2,"maxzoom":9,"filter":["all",["==",["get","class"],"country"],[">=",["get","rank"],3]],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Bold"],"text-max-width":6.25,"text-size":["interpolate",["linear"],["zoom"],3,9,7,17]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_country_2","type":"symbol","source":"openmaptiles","source-layer":"place","maxzoom":9,"filter":["all",["==",["get","class"],"country"],["==",["get","rank"],2]],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Bold"],"text-max-width":6.25,"text-size":["interpolate",["linear"],["zoom"],2,9,5,17]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}},{"id":"label_country_1","type":"symbol","source":"openmaptiles","source-layer":"place","maxzoom":9,"filter":["all",["==",["get","class"],"country"],["==",["get","rank"],1]],"layout":{"text-field":["case",["has","name:nonlatin"],["concat",["get","name:latin"],"\n",["get","name:nonlatin"]],["coalesce",["get","name_en"],["get","name"]]],"text-font":["Noto Sans Bold"],"text-max-width":6.25,"text-size":["interpolate",["linear"],["zoom"],1,9,4,17]},"paint":{"text-color":"#000","text-halo-blur":1,"text-halo-color":"#fff","text-halo-width":1}}]} diff --git a/public/vendor/protomaps-themes-base/protomaps-themes-base.js b/public/vendor/protomaps-themes-base/protomaps-themes-base.js deleted file mode 100644 index 10cf583..0000000 --- a/public/vendor/protomaps-themes-base/protomaps-themes-base.js +++ /dev/null @@ -1,16 +0,0 @@ -"use strict";var protomaps_themes_base=(()=>{var f=Object.defineProperty;var D=Object.getOwnPropertyDescriptor;var T=Object.getOwnPropertyNames,x=Object.getOwnPropertySymbols;var j=Object.prototype.hasOwnProperty,$=Object.prototype.propertyIsEnumerable;var z=(a,e,i)=>e in a?f(a,e,{enumerable:!0,configurable:!0,writable:!0,value:i}):a[e]=i,b=(a,e)=>{for(var i in e||(e={}))j.call(e,i)&&z(a,i,e[i]);if(x)for(var i of x(e))$.call(e,i)&&z(a,i,e[i]);return a};var l=(a,e)=>f(a,"name",{value:e,configurable:!0});var C=(a,e)=>{for(var i in e)f(a,i,{get:e[i],enumerable:!0})},P=(a,e,i,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of T(e))!j.call(a,r)&&r!==i&&f(a,r,{get:()=>e[r],enumerable:!(n=D(e,r))||n.enumerable});return a};var A=a=>P(f({},"__esModule",{value:!0}),a);var W={};C(W,{default:()=>S,labels:()=>I,labelsWithCustomTheme:()=>K,language_script_pairs:()=>m,layers:()=>B,layersWithCustomTheme:()=>V,layersWithPartialCustomTheme:()=>F,namedTheme:()=>H,noLabels:()=>E,noLabelsWithCustomTheme:()=>G});function t(a,e){let i="script";return a==="name"?i="script":a==="name2"?i="script2":a==="name3"&&(i="script3"),[["coalesce",["get",`pgf:${a}`],["get",a]],{"text-font":["case",["==",["get",i],"Devanagari"],["literal",["Noto Sans Devanagari Regular v1"]],["literal",[e||"Noto Sans Regular"]]]}]}l(t,"get_name_block");function c(a,e,i){let n="name";return i==="name"?n="":i==="name2"?n="2":i==="name3"&&(n="3"),e==="Latin"?["has",`script${n}`]:a==="ja"?["all",["!=",["get",`script${n}`],"Han"],["!=",["get",`script${n}`],"Hiragana"],["!=",["get",`script${n}`],"Katakana"],["!=",["get",`script${n}`],"Mixed-Japanese"]]:["!=",["get",`script${n}`],e]}l(c,"is_not_in_target_script");function o(a){return a==="Devanagari"?{"text-font":["literal",["Noto Sans Devanagari Regular v1"]]}:{}}l(o,"get_font_formatting");function v(a){let e=m.find(i=>i.lang===a);return e===void 0?"Latin":e.script}l(v,"get_default_script");function L(a,e){let i=e||v(a),n;return i==="Devanagari"?n="pgf:":n="",["format",["coalesce",["get",`${n}name:${a}`],["get","name:en"]],o(i)]}l(L,"get_country_name");function s(a,e,i){let n=e||v(a),r;return n==="Devanagari"?r="pgf:":r="",["case",["all",["any",["has","name"],["has","pgf:name"]],["!",["any",["has","name2"],["has","pgf:name2"]]],["!",["any",["has","name3"],["has","pgf:name3"]]]],["case",c(a,n,"name"),["case",["any",["is-supported-script",["get","name"]],["has","pgf:name"]],["format",["coalesce",["get",`${r}name:${a}`],["get","name:en"]],o(n),` -`,{},["case",["all",["!",["has",`${r}name:${a}`]],["has","name:en"],["!",["has","script"]]],"",["coalesce",["get","pgf:name"],["get","name"]]],{"text-font":["case",["==",["get","script"],"Devanagari"],["literal",["Noto Sans Devanagari Regular v1"]],["literal",[i||"Noto Sans Regular"]]]}],["get","name:en"]],["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name"],["get","name"]],o(n)]],["all",["any",["has","name"],["has","pgf:name"]],["any",["has","name2"],["has","pgf:name2"]],["!",["any",["has","name3"],["has","pgf:name3"]]]],["case",["all",c(a,n,"name"),c(a,n,"name2")],["format",["get",`${r}name:${a}`],o(n),` -`,{},...t("name"),` -`,{},...t("name2")],["case",c(a,n,"name2"),["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name"],["get","name"]],o(n),` -`,{},...t("name2")],["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name2"],["get","name2"]],o(n),` -`,{},...t("name")]]],["case",["all",c(a,n,"name"),c(a,n,"name2"),c(a,n,"name3")],["format",["get",`${r}name:${a}`],o(n),` -`,{},...t("name"),` -`,{},...t("name2"),` -`,{},...t("name3")],["case",["!",c(a,n,"name")],["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name"],["get","name"]],o(n),` -`,{},...t("name2"),` -`,{},...t("name3")],["!",c(a,n,"name2")],["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name2"],["get","name2"]],o(n),` -`,{},...t("name"),` -`,{},...t("name3")],["format",["coalesce",["get",`${r}name:${a}`],["get","pgf:name3"],["get","name3"]],o(n),` -`,{},...t("name"),` -`,{},...t("name2")]]]]}l(s,"get_multiline_name");var m=[{lang:"ar",full_name:"Arabic",script:"Arabic"},{lang:"cs",full_name:"Czech",script:"Latin"},{lang:"bg",full_name:"Bulgarian",script:"Cyrillic"},{lang:"da",full_name:"Danish",script:"Latin"},{lang:"de",full_name:"German",script:"Latin"},{lang:"el",full_name:"Greek",script:"Greek"},{lang:"en",full_name:"English",script:"Latin"},{lang:"es",full_name:"Spanish",script:"Latin"},{lang:"et",full_name:"Estonian",script:"Latin"},{lang:"fa",full_name:"Persian",script:"Arabic"},{lang:"fi",full_name:"Finnish",script:"Latin"},{lang:"fr",full_name:"French",script:"Latin"},{lang:"ga",full_name:"Irish",script:"Latin"},{lang:"he",full_name:"Hebrew",script:"Hebrew"},{lang:"hi",full_name:"Hindi",script:"Devanagari"},{lang:"hr",full_name:"Croatian",script:"Latin"},{lang:"hu",full_name:"Hungarian",script:"Latin"},{lang:"id",full_name:"Indonesian",script:"Latin"},{lang:"it",full_name:"Italian",script:"Latin"},{lang:"ja",full_name:"Japanese",script:""},{lang:"ko",full_name:"Korean",script:"Hangul"},{lang:"lt",full_name:"Lithuanian",script:"Latin"},{lang:"lv",full_name:"Latvian",script:"Latin"},{lang:"ne",full_name:"Nepali",script:"Devanagari"},{lang:"nl",full_name:"Dutch",script:"Latin"},{lang:"no",full_name:"Norwegian",script:"Latin"},{lang:"mr",full_name:"Marathi",script:"Devanagari"},{lang:"mt",full_name:"Maltese",script:"Latin"},{lang:"pl",full_name:"Polish",script:"Latin"},{lang:"pt",full_name:"Portuguese",script:"Latin"},{lang:"ro",full_name:"Romanian",script:"Latin"},{lang:"ru",full_name:"Russian",script:"Cyrillic"},{lang:"sk",full_name:"Slovak",script:"Latin"},{lang:"sl",full_name:"Slovenian",script:"Latin"},{lang:"sv",full_name:"Swedish",script:"Latin"},{lang:"tr",full_name:"Turkish",script:"Latin"},{lang:"uk",full_name:"Ukrainian",script:"Cyrillic"},{lang:"ur",full_name:"Urdu",script:"Arabic"},{lang:"vi",full_name:"Vietnamese",script:"Latin"},{lang:"zh-Hans",full_name:"Chinese (Simplified)",script:"Han"},{lang:"zh-Hant",full_name:"Chinese (Traditional)",script:"Han"}];function _(a,e){return[{id:"background",type:"background",paint:{"background-color":e.background}},{id:"earth",type:"fill",filter:["==","$type","Polygon"],source:a,"source-layer":"earth",paint:{"fill-color":e.earth}},...e.landcover?[{id:"landcover",type:"fill",source:a,"source-layer":"landcover",paint:{"fill-color":["match",["get","kind"],"grassland",e.landcover.grassland,"barren",e.landcover.barren,"urban_area",e.landcover.urban_area,"farmland",e.landcover.farmland,"glacier",e.landcover.glacier,"scrub",e.landcover.scrub,e.landcover.forest],"fill-opacity":["interpolate",["linear"],["zoom"],5,1,7,0]}}]:[],{id:"landuse_park",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","national_park","park","cemetery","protected_area","nature_reserve","forest","golf_course","wood","nature_reserve","forest","scrub","grassland","grass","military","naval_base","airfield"],paint:{"fill-opacity":["interpolate",["linear"],["zoom"],6,0,11,1],"fill-color":["case",["in",["get","kind"],["literal",["national_park","park","cemetery","protected_area","nature_reserve","forest","golf_course"]]],e.park_b,["in",["get","kind"],["literal",["wood","nature_reserve","forest"]]],e.wood_b,["in",["get","kind"],["literal",["scrub","grassland","grass"]]],e.scrub_b,["in",["get","kind"],["literal",["glacier"]]],e.glacier,["in",["get","kind"],["literal",["sand"]]],e.sand,["in",["get","kind"],["literal",["military","naval_base","airfield"]]],e.zoo,e.earth]}},{id:"landuse_urban_green",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","allotments","village_green","playground"],paint:{"fill-color":e.park_b,"fill-opacity":.7}},{id:"landuse_hospital",type:"fill",source:a,"source-layer":"landuse",filter:["==","kind","hospital"],paint:{"fill-color":e.hospital}},{id:"landuse_industrial",type:"fill",source:a,"source-layer":"landuse",filter:["==","kind","industrial"],paint:{"fill-color":e.industrial}},{id:"landuse_school",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","school","university","college"],paint:{"fill-color":e.school}},{id:"landuse_beach",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","beach"],paint:{"fill-color":e.beach}},{id:"landuse_zoo",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","zoo"],paint:{"fill-color":e.zoo}},{id:"landuse_aerodrome",type:"fill",source:a,"source-layer":"landuse",filter:["in","kind","aerodrome"],paint:{"fill-color":e.aerodrome}},{id:"roads_runway",type:"line",source:a,"source-layer":"roads",filter:["==","kind_detail","runway"],paint:{"line-color":e.runway,"line-width":["interpolate",["exponential",1.6],["zoom"],10,0,12,4,18,30]}},{id:"roads_taxiway",type:"line",source:a,"source-layer":"roads",minzoom:13,filter:["==","kind_detail","taxiway"],paint:{"line-color":e.runway,"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,15,6]}},{id:"landuse_runway",type:"fill",source:a,"source-layer":"landuse",filter:["any",["in","kind","runway","taxiway"]],paint:{"fill-color":e.runway}},{id:"water",type:"fill",filter:["==","$type","Polygon"],source:a,"source-layer":"water",paint:{"fill-color":e.water}},{id:"water_stream",type:"line",source:a,"source-layer":"water",minzoom:14,filter:["in","kind","stream"],paint:{"line-color":e.water,"line-width":.5}},{id:"water_river",type:"line",source:a,"source-layer":"water",minzoom:9,filter:["in","kind","river"],paint:{"line-color":e.water,"line-width":["interpolate",["exponential",1.6],["zoom"],9,0,9.5,1,18,12]}},{id:"landuse_pedestrian",type:"fill",source:a,"source-layer":"landuse",filter:["==","kind","pedestrian"],paint:{"fill-color":e.pedestrian}},{id:"landuse_pier",type:"fill",source:a,"source-layer":"landuse",filter:["==","kind","pier"],paint:{"fill-color":e.pier}},{id:"roads_tunnels_other_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["in","kind","other","path"]],paint:{"line-color":e.tunnel_other_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],14,0,20,7]}},{id:"roads_tunnels_minor_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["==","kind","minor_road"]],paint:{"line-color":e.tunnel_minor_casing,"line-dasharray":[3,2],"line-gap-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],12,0,12.5,1]}},{id:"roads_tunnels_link_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["has","is_link"]],paint:{"line-color":e.tunnel_link_casing,"line-dasharray":[3,2],"line-gap-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],12,0,12.5,1]}},{id:"roads_tunnels_major_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.tunnel_major_casing,"line-dasharray":[3,2],"line-gap-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,.5,18,13],"line-width":["interpolate",["exponential",1.6],["zoom"],9,0,9.5,1]}},{id:"roads_tunnels_highway_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.tunnel_highway_casing,"line-dasharray":[6,.5],"line-gap-width":["interpolate",["exponential",1.6],["zoom"],3,0,3.5,.5,18,15],"line-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,1,20,15]}},{id:"roads_tunnels_other",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["in","kind","other","path"]],paint:{"line-color":e.tunnel_other,"line-dasharray":[4.5,.5],"line-width":["interpolate",["exponential",1.6],["zoom"],14,0,20,7]}},{id:"roads_tunnels_minor",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["==","kind","minor_road"]],paint:{"line-color":e.tunnel_minor,"line-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11]}},{id:"roads_tunnels_link",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["has","is_link"]],paint:{"line-color":e.tunnel_minor,"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11]}},{id:"roads_tunnels_major",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["==","kind","major_road"]],paint:{"line-color":e.tunnel_major,"line-width":["interpolate",["exponential",1.6],["zoom"],6,0,12,1.6,15,3,18,13]}},{id:"roads_tunnels_highway",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_tunnel"],["==",["get","kind"],"highway"],["!",["has","is_link"]]],paint:{"line-color":e.tunnel_highway,"line-width":["interpolate",["exponential",1.6],["zoom"],3,0,6,1.1,12,1.6,15,5,18,15]}},{id:"buildings",type:"fill",source:a,"source-layer":"buildings",filter:["in","kind","building","building_part"],paint:{"fill-color":e.buildings,"fill-opacity":.5}},{id:"roads_pier",type:"line",source:a,"source-layer":"roads",filter:["==","kind_detail","pier"],paint:{"line-color":e.pier,"line-width":["interpolate",["exponential",1.6],["zoom"],12,0,12.5,.5,20,16]}},{id:"roads_minor_service_casing",type:"line",source:a,"source-layer":"roads",minzoom:13,filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","minor_road"],["==","kind_detail","service"]],paint:{"line-color":e.minor_service_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],13,0,18,8],"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,.8]}},{id:"roads_minor_casing",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","minor_road"],["!=","kind_detail","service"]],paint:{"line-color":e.minor_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],12,0,12.5,1]}},{id:"roads_link_casing",type:"line",source:a,"source-layer":"roads",minzoom:13,filter:["has","is_link"],paint:{"line-color":e.minor_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1.5]}},{id:"roads_major_casing_late",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.major_casing_late,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],6,0,12,1.6,15,3,18,13],"line-width":["interpolate",["exponential",1.6],["zoom"],9,0,9.5,1]}},{id:"roads_highway_casing_late",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.highway_casing_late,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],3,0,3.5,.5,18,15],"line-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,1,20,15]}},{id:"roads_other",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["in","kind","other","path"],["!=","kind_detail","pier"]],paint:{"line-color":e.other,"line-dasharray":[3,1],"line-width":["interpolate",["exponential",1.6],["zoom"],14,0,20,7]}},{id:"roads_link",type:"line",source:a,"source-layer":"roads",filter:["has","is_link"],paint:{"line-color":e.link,"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11]}},{id:"roads_minor_service",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","minor_road"],["==","kind_detail","service"]],paint:{"line-color":e.minor_service,"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,18,8]}},{id:"roads_minor",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","minor_road"],["!=","kind_detail","service"]],paint:{"line-color":["interpolate",["exponential",1.6],["zoom"],11,e.minor_a,16,e.minor_b],"line-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11]}},{id:"roads_major_casing_early",type:"line",source:a,"source-layer":"roads",maxzoom:12,filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.major_casing_early,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,.5,18,13],"line-width":["interpolate",["exponential",1.6],["zoom"],9,0,9.5,1]}},{id:"roads_major",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.major,"line-width":["interpolate",["exponential",1.6],["zoom"],6,0,12,1.6,15,3,18,13]}},{id:"roads_highway_casing_early",type:"line",source:a,"source-layer":"roads",maxzoom:12,filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.highway_casing_early,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],3,0,3.5,.5,18,15],"line-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,1]}},{id:"roads_highway",type:"line",source:a,"source-layer":"roads",filter:["all",["!has","is_tunnel"],["!has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.highway,"line-width":["interpolate",["exponential",1.6],["zoom"],3,0,6,1.1,12,1.6,15,5,18,15]}},{id:"roads_rail",type:"line",source:a,"source-layer":"roads",filter:["==","kind","rail"],paint:{"line-dasharray":[.3,.75],"line-opacity":.5,"line-color":e.railway,"line-width":["interpolate",["exponential",1.6],["zoom"],3,0,6,.15,18,9]}},{id:"boundaries_country",type:"line",source:a,"source-layer":"boundaries",filter:["<=","kind_detail",2],paint:{"line-color":e.boundaries,"line-width":.7,"line-dasharray":["step",["zoom"],["literal",[2]],4,["literal",[2,1]]]}},{id:"boundaries",type:"line",source:a,"source-layer":"boundaries",filter:[">","kind_detail",2],paint:{"line-color":e.boundaries,"line-width":.4,"line-dasharray":["step",["zoom"],["literal",[2]],4,["literal",[2,1]]]}},{id:"roads_bridges_other_casing",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["in","kind","other","path"]],paint:{"line-color":e.bridges_other_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],14,0,20,7]}},{id:"roads_bridges_link_casing",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["has","is_link"]],paint:{"line-color":e.bridges_minor_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],12,0,12.5,1.5]}},{id:"roads_bridges_minor_casing",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["==","kind","minor_road"]],paint:{"line-color":e.bridges_minor_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11],"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,.8]}},{id:"roads_bridges_major_casing",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.bridges_major_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,.5,18,10],"line-width":["interpolate",["exponential",1.6],["zoom"],9,0,9.5,1.5]}},{id:"roads_bridges_other",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["in","kind","other","path"]],paint:{"line-color":e.bridges_other,"line-dasharray":[2,1],"line-width":["interpolate",["exponential",1.6],["zoom"],14,0,20,7]}},{id:"roads_bridges_minor",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["==","kind","minor_road"]],paint:{"line-color":e.bridges_minor,"line-width":["interpolate",["exponential",1.6],["zoom"],11,0,12.5,.5,15,2,18,11]}},{id:"roads_bridges_link",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["has","is_link"]],paint:{"line-color":e.bridges_minor,"line-width":["interpolate",["exponential",1.6],["zoom"],13,0,13.5,1,18,11]}},{id:"roads_bridges_major",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["==","kind","major_road"]],paint:{"line-color":e.bridges_major,"line-width":["interpolate",["exponential",1.6],["zoom"],6,0,12,1.6,15,3,18,13]}},{id:"roads_bridges_highway_casing",type:"line",source:a,"source-layer":"roads",minzoom:12,filter:["all",["has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.bridges_highway_casing,"line-gap-width":["interpolate",["exponential",1.6],["zoom"],3,0,3.5,.5,18,15],"line-width":["interpolate",["exponential",1.6],["zoom"],7,0,7.5,1,20,15]}},{id:"roads_bridges_highway",type:"line",source:a,"source-layer":"roads",filter:["all",["has","is_bridge"],["==","kind","highway"],["!has","is_link"]],paint:{"line-color":e.bridges_highway,"line-width":["interpolate",["exponential",1.6],["zoom"],3,0,6,1.1,12,1.6,15,5,18,15]}}]}l(_,"nolabels_layers");function d(a,e,i,n){return[{id:"address_label",type:"symbol",source:a,"source-layer":"buildings",minzoom:18,filter:["==","kind","address"],layout:{"symbol-placement":"point","text-font":[e.italic||"Noto Sans Italic"],"text-field":["get","addr_housenumber"],"text-size":12},paint:{"text-color":e.address_label,"text-halo-color":e.address_label_halo,"text-halo-width":1}},{id:"water_waterway_label",type:"symbol",source:a,"source-layer":"water",minzoom:13,filter:["in","kind","river","stream"],layout:{"symbol-placement":"line","text-font":[e.italic||"Noto Sans Italic"],"text-field":s(i,n,e.regular),"text-size":12,"text-letter-spacing":.2},paint:{"text-color":e.ocean_label,"text-halo-color":e.water,"text-halo-width":1}},{id:"roads_labels_minor",type:"symbol",source:a,"source-layer":"roads",minzoom:15,filter:["in","kind","minor_road","other","path"],layout:{"symbol-sort-key":["get","min_zoom"],"symbol-placement":"line","text-font":[e.regular||"Noto Sans Regular"],"text-field":s(i,n,e.regular),"text-size":12},paint:{"text-color":e.roads_label_minor,"text-halo-color":e.roads_label_minor_halo,"text-halo-width":1}},{id:"water_label_ocean",type:"symbol",source:a,"source-layer":"water",filter:["in","kind","sea","ocean","bay","strait","fjord"],layout:{"text-font":[e.italic||"Noto Sans Italic"],"text-field":s(i,n,e.regular),"text-size":["interpolate",["linear"],["zoom"],3,10,10,12],"text-letter-spacing":.1,"text-max-width":9,"text-transform":"uppercase"},paint:{"text-color":e.ocean_label,"text-halo-width":1,"text-halo-color":e.water}},{id:"water_label_lakes",type:"symbol",source:a,"source-layer":"water",filter:["in","kind","lake","water"],layout:{"text-font":[e.italic||"Noto Sans Italic"],"text-field":s(i,n,e.regular),"text-size":["interpolate",["linear"],["zoom"],3,10,6,12,10,12],"text-letter-spacing":.1,"text-max-width":9},paint:{"text-color":e.ocean_label,"text-halo-color":e.water,"text-halo-width":1}},{id:"roads_labels_major",type:"symbol",source:a,"source-layer":"roads",minzoom:11,filter:["in","kind","highway","major_road"],layout:{"symbol-sort-key":["get","min_zoom"],"symbol-placement":"line","text-font":[e.regular||"Noto Sans Regular"],"text-field":s(i,n,e.regular),"text-size":12},paint:{"text-color":e.roads_label_major,"text-halo-color":e.roads_label_major_halo,"text-halo-width":1}},...e.pois?[{id:"pois",type:"symbol",source:a,"source-layer":"pois",filter:["all",["in",["get","kind"],["literal",["beach","forest","marina","park","peak","zoo","garden","bench","aerodrome","station","bus_stop","ferry_terminal","stadium","university","library","school","animal","toilets","drinking_water"]]],[">=",["zoom"],["+",["get","min_zoom"],0]]],layout:{"icon-image":["match",["get","kind"],"station","train_station",["get","kind"]],"text-font":[e.regular||"Noto Sans Regular"],"text-justify":"auto","text-field":s(i,n,e.regular),"text-size":["interpolate",["linear"],["zoom"],17,10,19,16],"text-max-width":8,"text-offset":[1.1,0],"text-variable-anchor":["left","right"]},paint:{"text-color":["case",["in",["get","kind"],["literal",["beach","forest","marina","park","peak","zoo","garden","bench"]]],e.pois.green,["in",["get","kind"],["literal",["aerodrome","station","bus_stop","ferry_terminal"]]],e.pois.lapis,["in",["get","kind"],["literal",["stadium","university","library","school","animal","toilets","drinking_water"]]],e.pois.slategray,e.earth],"text-halo-color":e.earth,"text-halo-width":1}}]:[],{id:"places_subplace",type:"symbol",source:a,"source-layer":"places",filter:["==","kind","neighbourhood"],layout:{"symbol-sort-key":["get","min_zoom"],"text-field":s(i,n,e.regular),"text-font":[e.regular||"Noto Sans Regular"],"text-max-width":7,"text-letter-spacing":.1,"text-padding":["interpolate",["linear"],["zoom"],5,2,8,4,12,18,15,20],"text-size":["interpolate",["exponential",1.2],["zoom"],11,8,14,14,18,24],"text-transform":"uppercase"},paint:{"text-color":e.subplace_label,"text-halo-color":e.subplace_label_halo,"text-halo-width":1}},{id:"places_locality",type:"symbol",source:a,"source-layer":"places",filter:["==","kind","locality"],layout:{"icon-image":["step",["zoom"],"townspot",8,""],"icon-size":.7,"text-field":s(i,n,e.regular),"text-font":["case",["<=",["get","min_zoom"],5],["literal",[e.bold||"Noto Sans Medium"]],["literal",[e.regular||"Noto Sans Regular"]]],"text-padding":["interpolate",["linear"],["zoom"],5,3,8,7,12,11],"text-size":["interpolate",["linear"],["zoom"],2,["case",["<",["get","population_rank"],13],8,[">=",["get","population_rank"],13],13,0],4,["case",["<",["get","population_rank"],13],10,[">=",["get","population_rank"],13],15,0],6,["case",["<",["get","population_rank"],12],11,[">=",["get","population_rank"],12],17,0],8,["case",["<",["get","population_rank"],11],11,[">=",["get","population_rank"],11],18,0],10,["case",["<",["get","population_rank"],9],12,[">=",["get","population_rank"],9],20,0],15,["case",["<",["get","population_rank"],8],12,[">=",["get","population_rank"],8],22,0]],"icon-padding":["interpolate",["linear"],["zoom"],0,0,8,4,10,8,12,6,22,2],"text-justify":"auto","text-anchor":["step",["zoom"],"left",8,"center"],"text-radial-offset":.4},paint:{"text-color":e.city_label,"text-halo-color":e.city_label_halo,"text-halo-width":1}},{id:"places_region",type:"symbol",source:a,"source-layer":"places",filter:["==","kind","region"],layout:{"symbol-sort-key":["get","min_zoom"],"text-field":["step",["zoom"],["get","name:short"],6,s(i,n,e.regular)],"text-font":[e.regular||"Noto Sans Regular"],"text-size":["interpolate",["linear"],["zoom"],3,11,7,16],"text-radial-offset":.2,"text-anchor":"center","text-transform":"uppercase"},paint:{"text-color":e.state_label,"text-halo-color":e.state_label_halo,"text-halo-width":1}},{id:"places_country",type:"symbol",source:a,"source-layer":"places",filter:["==","kind","country"],layout:{"symbol-sort-key":["get","min_zoom"],"text-field":L(i,n),"text-font":[e.bold||"Noto Sans Medium"],"text-size":["interpolate",["linear"],["zoom"],2,["case",["<",["get","population_rank"],10],8,[">=",["get","population_rank"],10],12,0],6,["case",["<",["get","population_rank"],8],10,[">=",["get","population_rank"],8],18,0],8,["case",["<",["get","population_rank"],7],11,[">=",["get","population_rank"],7],20,0]],"icon-padding":["interpolate",["linear"],["zoom"],0,2,14,2,16,20,17,2,22,2],"text-transform":"uppercase"},paint:{"text-color":e.country_label,"text-halo-color":e.earth,"text-halo-width":1}}]}l(d,"labels_layers");var N={background:"#dddddd",earth:"#ededed",park_a:"#bfc99c",park_b:"#bfc99c",hospital:"#ffeae8",industrial:"#f8ffed",school:"#f2fef9",wood_a:"#bfc99c",wood_b:"#bfc99c",pedestrian:"#eef0f0",scrub_a:"#bfc99c",scrub_b:"#bfc99c",glacier:"#ffffff",sand:"#ebe7da",beach:"#ebe7da",aerodrome:"#dbe7e7",runway:"#d1d9d9",water:"#84b7cf",zoo:"#ebe6ed",military:"#ebe6ed",tunnel_other_casing:"#ffffff",tunnel_minor_casing:"#e2e2e2",tunnel_link_casing:"#e2e2e2",tunnel_major_casing:"#e3cfd3",tunnel_highway_casing:"#ebcea2",tunnel_other:"#f7f7f7",tunnel_minor:"#ebebeb",tunnel_link:"#ebebeb",tunnel_major:"#ebebeb",tunnel_highway:"#ebebeb",pier:"#ededed",buildings:"#cbcece",minor_service_casing:"#e2e2e2",minor_casing:"#e2e2e2",link_casing:"#e2e2e2",major_casing_late:"#e3cfd3",highway_casing_late:"#ebcea2",other:"#ffffff",minor_service:"#ffffff",minor_a:"#fff2bb",minor_b:"#fff2bb",link:"#fff2bb",major_casing_early:"#e3cfd3",major:"#ffdf59",highway_casing_early:"#ebcea2",highway:"#e9ac77",railway:"#b3bcc9",boundaries:"#5c4a6b",waterway_label:"#a4cae1",bridges_other_casing:"#ffffff",bridges_minor_casing:"#e2e2e2",bridges_link_casing:"#e1e1e1",bridges_major_casing:"#e3cfd3",bridges_highway_casing:"#ebcea2",bridges_other:"#ffffff",bridges_minor:"#ffffff",bridges_link:"#e1e1e1",bridges_major:"#ffffff",bridges_highway:"#fefffc",roads_label_minor:"#91888b",roads_label_minor_halo:"#ffffff",roads_label_major:"#91888b",roads_label_major_halo:"#ffffff",ocean_label:"#ffffff",peak_label:"#61bb5b",subplace_label:"#757d91",subplace_label_halo:"#ffffff",city_label:"#3c3c3c",city_label_halo:"#ffffff",state_label:"#777777",state_label_halo:"#ffffff",country_label:"#9590aa",address_label:"#91888b",address_label_halo:"#ffffff"},h={background:"#cccccc",earth:"#e2dfda",park_a:"#cfddd5",park_b:"#9cd3b4",hospital:"#e4dad9",industrial:"#d1dde1",school:"#e4ded7",wood_a:"#d0ded0",wood_b:"#a0d9a0",pedestrian:"#e3e0d4",scrub_a:"#cedcd7",scrub_b:"#99d2bb",glacier:"#e7e7e7",sand:"#e2e0d7",beach:"#e8e4d0",aerodrome:"#dadbdf",runway:"#e9e9ed",water:"#80deea",zoo:"#c6dcdc",military:"#dcdcdc",tunnel_other_casing:"#e0e0e0",tunnel_minor_casing:"#e0e0e0",tunnel_link_casing:"#e0e0e0",tunnel_major_casing:"#e0e0e0",tunnel_highway_casing:"#e0e0e0",tunnel_other:"#d5d5d5",tunnel_minor:"#d5d5d5",tunnel_link:"#d5d5d5",tunnel_major:"#d5d5d5",tunnel_highway:"#d5d5d5",pier:"#e0e0e0",buildings:"#cccccc",minor_service_casing:"#e0e0e0",minor_casing:"#e0e0e0",link_casing:"#e0e0e0",major_casing_late:"#e0e0e0",highway_casing_late:"#e0e0e0",other:"#ebebeb",minor_service:"#ebebeb",minor_a:"#ebebeb",minor_b:"#ffffff",link:"#ffffff",major_casing_early:"#e0e0e0",major:"#ffffff",highway_casing_early:"#e0e0e0",highway:"#ffffff",railway:"#a7b1b3",boundaries:"#adadad",waterway_label:"#ffffff",bridges_other_casing:"#e0e0e0",bridges_minor_casing:"#e0e0e0",bridges_link_casing:"#e0e0e0",bridges_major_casing:"#e0e0e0",bridges_highway_casing:"#e0e0e0",bridges_other:"#ebebeb",bridges_minor:"#ffffff",bridges_link:"#ffffff",bridges_major:"#f5f5f5",bridges_highway:"#ffffff",roads_label_minor:"#91888b",roads_label_minor_halo:"#ffffff",roads_label_major:"#938a8d",roads_label_major_halo:"#ffffff",ocean_label:"#728dd4",peak_label:"#7e9aa0",subplace_label:"#8f8f8f",subplace_label_halo:"#e0e0e0",city_label:"#5c5c5c",city_label_halo:"#e0e0e0",state_label:"#b3b3b3",state_label_halo:"#e0e0e0",country_label:"#a3a3a3",address_label:"#91888b",address_label_halo:"#ffffff",pois:{blue:"#1A8CBD",green:"#20834D",lapis:"#315BCF",pink:"#EF56BA",red:"#F2567A",slategray:"#6A5B8F",tangerine:"#CB6704",turquoise:"#00C3D4"},landcover:{grassland:"rgba(210, 239, 207, 1)",barren:"rgba(255, 243, 215, 1)",urban_area:"rgba(230, 230, 230, 1)",farmland:"rgba(216, 239, 210, 1)",glacier:"rgba(255, 255, 255, 1)",scrub:"rgba(234, 239, 210, 1)",forest:"rgba(196, 231, 210, 1)"}},u={background:"#34373d",earth:"#1f1f1f",park_a:"#1c2421",park_b:"#192a24",hospital:"#252424",industrial:"#222222",school:"#262323",wood_a:"#202121",wood_b:"#202121",pedestrian:"#1e1e1e",scrub_a:"#222323",scrub_b:"#222323",glacier:"#1c1c1c",sand:"#212123",beach:"#28282a",aerodrome:"#1e1e1e",runway:"#333333",water:"#31353f",zoo:"#222323",military:"#242323",tunnel_other_casing:"#141414",tunnel_minor_casing:"#141414",tunnel_link_casing:"#141414",tunnel_major_casing:"#141414",tunnel_highway_casing:"#141414",tunnel_other:"#292929",tunnel_minor:"#292929",tunnel_link:"#292929",tunnel_major:"#292929",tunnel_highway:"#292929",pier:"#333333",buildings:"#111111",minor_service_casing:"#1f1f1f",minor_casing:"#1f1f1f",link_casing:"#1f1f1f",major_casing_late:"#1f1f1f",highway_casing_late:"#1f1f1f",other:"#333333",minor_service:"#333333",minor_a:"#3d3d3d",minor_b:"#333333",link:"#3d3d3d",major_casing_early:"#1f1f1f",major:"#3d3d3d",highway_casing_early:"#1f1f1f",highway:"#474747",railway:"#000000",boundaries:"#5b6374",waterway_label:"#717784",bridges_other_casing:"#2b2b2b",bridges_minor_casing:"#1f1f1f",bridges_link_casing:"#1f1f1f",bridges_major_casing:"#1f1f1f",bridges_highway_casing:"#1f1f1f",bridges_other:"#333333",bridges_minor:"#333333",bridges_link:"#3d3d3d",bridges_major:"#3d3d3d",bridges_highway:"#474747",roads_label_minor:"#525252",roads_label_minor_halo:"#1f1f1f",roads_label_major:"#666666",roads_label_major_halo:"#1f1f1f",ocean_label:"#717784",peak_label:"#898080",subplace_label:"#525252",subplace_label_halo:"#1f1f1f",city_label:"#7a7a7a",city_label_halo:"#212121",state_label:"#3d3d3d",state_label_halo:"#1f1f1f",country_label:"#5c5c5c",address_label:"#525252",address_label_halo:"#1f1f1f",pois:{blue:"#4299BB",green:"#30C573",lapis:"#2B5CEA",pink:"#EF56BA",red:"#F2567A",slategray:"#93939F",tangerine:"#F19B6E",turquoise:"#00C3D4"},landcover:{grassland:"rgba(30, 41, 31, 1)",barren:"rgba(38, 38, 36, 1)",urban_area:"rgba(28, 28, 28, 1)",farmland:"rgba(31, 36, 32, 1)",glacier:"rgba(43, 43, 43, 1)",scrub:"rgba(34, 36, 30, 1)",forest:"rgba(28, 41, 37, 1)"}},y={background:"#ffffff",earth:"#ffffff",park_a:"#fcfcfc",park_b:"#fcfcfc",hospital:"#f8f8f8",industrial:"#fcfcfc",school:"#f8f8f8",wood_a:"#fafafa",wood_b:"#fafafa",pedestrian:"#fdfdfd",scrub_a:"#fafafa",scrub_b:"#fafafa",glacier:"#fcfcfc",sand:"#fafafa",beach:"#f6f6f6",aerodrome:"#fdfdfd",runway:"#efefef",water:"#dcdcdc",zoo:"#f7f7f7",military:"#fcfcfc",tunnel_other_casing:"#d6d6d6",tunnel_minor_casing:"#fcfcfc",tunnel_link_casing:"#fcfcfc",tunnel_major_casing:"#fcfcfc",tunnel_highway_casing:"#fcfcfc",tunnel_other:"#d6d6d6",tunnel_minor:"#d6d6d6",tunnel_link:"#d6d6d6",tunnel_major:"#d6d6d6",tunnel_highway:"#d6d6d6",pier:"#efefef",buildings:"#efefef",minor_service_casing:"#ffffff",minor_casing:"#ffffff",link_casing:"#ffffff",major_casing_late:"#ffffff",highway_casing_late:"#ffffff",other:"#f5f5f5",minor_service:"#f5f5f5",minor_a:"#ebebeb",minor_b:"#f5f5f5",link:"#ebebeb",major_casing_early:"#ffffff",major:"#ebebeb",highway_casing_early:"#ffffff",highway:"#ebebeb",railway:"#d6d6d6",boundaries:"#adadad",waterway_label:"#adadad",bridges_other_casing:"#ffffff",bridges_minor_casing:"#ffffff",bridges_link_casing:"#ffffff",bridges_major_casing:"#ffffff",bridges_highway_casing:"#ffffff",bridges_other:"#f5f5f5",bridges_minor:"#f5f5f5",bridges_link:"#ebebeb",bridges_major:"#ebebeb",bridges_highway:"#ebebeb",roads_label_minor:"#adadad",roads_label_minor_halo:"#ffffff",roads_label_major:"#999999",roads_label_major_halo:"#ffffff",ocean_label:"#adadad",peak_label:"#adadad",subplace_label:"#8f8f8f",subplace_label_halo:"#ffffff",city_label:"#5c5c5c",city_label_halo:"#ffffff",state_label:"#b3b3b3",state_label_halo:"#ffffff",country_label:"#b8b8b8",address_label:"#adadad",address_label_halo:"#ffffff"},w={background:"#a3a3a3",earth:"#cccccc",park_a:"#c2c2c2",park_b:"#c2c2c2",hospital:"#d0d0d0",industrial:"#c6c6c6",school:"#d0d0d0",wood_a:"#c2c2c2",wood_b:"#c2c2c2",pedestrian:"#c4c4c4",scrub_a:"#c2c2c2",scrub_b:"#c2c2c2",glacier:"#d2d2d2",sand:"#d2d2d2",beach:"#d2d2d2",aerodrome:"#c9c9c9",runway:"#f5f5f5",water:"#a3a3a3",zoo:"#c7c7c7",military:"#bfbfbf",tunnel_other_casing:"#b8b8b8",tunnel_minor_casing:"#b8b8b8",tunnel_link_casing:"#b8b8b8",tunnel_major_casing:"#b8b8b8",tunnel_highway_casing:"#b8b8b8",tunnel_other:"#d6d6d6",tunnel_minor:"#d6d6d6",tunnel_link:"#d6d6d6",tunnel_major:"#d6d6d6",tunnel_highway:"#d6d6d6",pier:"#b8b8b8",buildings:"#e0e0e0",minor_service_casing:"#cccccc",minor_casing:"#cccccc",link_casing:"#cccccc",major_casing_late:"#cccccc",highway_casing_late:"#cccccc",other:"#e0e0e0",minor_service:"#e0e0e0",minor_a:"#ebebeb",minor_b:"#e0e0e0",link:"#ebebeb",major_casing_early:"#cccccc",major:"#ebebeb",highway_casing_early:"#cccccc",highway:"#ebebeb",railway:"#f5f5f5",boundaries:"#5c5c5c",waterway_label:"#7a7a7a",bridges_other_casing:"#cccccc",bridges_minor_casing:"#cccccc",bridges_link_casing:"#cccccc",bridges_major_casing:"#cccccc",bridges_highway_casing:"#cccccc",bridges_other:"#e0e0e0",bridges_minor:"#e0e0e0",bridges_link:"#ebebeb",bridges_major:"#ebebeb",bridges_highway:"#ebebeb",roads_label_minor:"#999999",roads_label_minor_halo:"#e0e0e0",roads_label_major:"#8f8f8f",roads_label_major_halo:"#ebebeb",ocean_label:"#7a7a7a",peak_label:"#5c5c5c",subplace_label:"#7a7a7a",subplace_label_halo:"#cccccc",city_label:"#474747",city_label_halo:"#cccccc",state_label:"#999999",state_label_halo:"#cccccc",country_label:"#858585",address_label:"#999999",address_label_halo:"#e0e0e0"},k={background:"#2b2b2b",earth:"#141414",park_a:"#181818",park_b:"#181818",hospital:"#1d1d1d",industrial:"#101010",school:"#111111",wood_a:"#1a1a1a",wood_b:"#1a1a1a",pedestrian:"#191919",scrub_a:"#1c1c1c",scrub_b:"#1c1c1c",glacier:"#191919",sand:"#161616",beach:"#1f1f1f",aerodrome:"#191919",runway:"#323232",water:"#333333",zoo:"#191919",military:"#121212",tunnel_other_casing:"#101010",tunnel_minor_casing:"#101010",tunnel_link_casing:"#101010",tunnel_major_casing:"#101010",tunnel_highway_casing:"#101010",tunnel_other:"#292929",tunnel_minor:"#292929",tunnel_link:"#292929",tunnel_major:"#292929",tunnel_highway:"#292929",pier:"#0a0a0a",buildings:"#0a0a0a",minor_service_casing:"#141414",minor_casing:"#141414",link_casing:"#141414",major_casing_late:"#141414",highway_casing_late:"#141414",other:"#1f1f1f",minor_service:"#1f1f1f",minor_a:"#292929",minor_b:"#1f1f1f",link:"#1f1f1f",major_casing_early:"#141414",major:"#292929",highway_casing_early:"#141414",highway:"#292929",railway:"#292929",boundaries:"#707070",waterway_label:"#707070",bridges_other_casing:"#141414",bridges_minor_casing:"#141414",bridges_link_casing:"#141414",bridges_major_casing:"#141414",bridges_highway_casing:"#141414",bridges_other:"#1f1f1f",bridges_minor:"#1f1f1f",bridges_link:"#292929",bridges_major:"#292929",bridges_highway:"#292929",roads_label_minor:"#525252",roads_label_minor_halo:"#141414",roads_label_major:"#5c5c5c",roads_label_major_halo:"#141414",ocean_label:"#707070",peak_label:"#707070",subplace_label:"#5c5c5c",subplace_label_halo:"#141414",city_label:"#999999",city_label_halo:"#141414",state_label:"#3d3d3d",state_label_halo:"#141414",country_label:"#707070",address_label:"#525252",address_label_halo:"#141414"},R={light:h,dark:u,white:y,grayscale:w,black:k,contrast:N},g=R;function H(a){switch(a){case"light":return h;case"dark":return u;case"white":return y;case"grayscale":return w;case"black":return k}throw new Error("Theme not found")}l(H,"namedTheme");function B(a,e,i){let n=[];return i!=null&&i.labelsOnly||(n=_(a,e)),i!=null&&i.lang&&(n=n.concat(d(a,e,i.lang))),n}l(B,"layers");function S(a,e,i,n){let r=g[e];return _(a,r).concat(d(a,r,i,n))}l(S,"default");function E(a,e){let i=g[e];return _(a,i)}l(E,"noLabels");function I(a,e,i,n){let r=g[e];return d(a,r,i,n)}l(I,"labels");function V(a,e,i,n){return _(a,e).concat(d(a,e,i,n))}l(V,"layersWithCustomTheme");function F(a,e,i,n,r){let p=b(b({},g[e]),i);return _(a,p).concat(d(a,p,n,r))}l(F,"layersWithPartialCustomTheme");function G(a,e){return _(a,e)}l(G,"noLabelsWithCustomTheme");function K(a,e,i,n){return d(a,e,i,n)}l(K,"labelsWithCustomTheme");return A(W);})(); -//# sourceMappingURL=protomaps-themes-base.js.map \ No newline at end of file diff --git a/test/test_app.rb b/test/test_app.rb index 41d0a31..972e242 100644 --- a/test/test_app.rb +++ b/test/test_app.rb @@ -402,13 +402,13 @@ class AppTest < Minitest::Test assert_equal 409, response.status end - # fetch_build_url blocks on a Queue, called directly (not through the + # download_extract blocks on a Queue, called directly (not through the # route, which has no way to inject a fake) so the build is # deterministically still "running" when the route call below happens. def test_offline_tiles_build_is_409_when_one_is_already_running Maptool::PmtilesBuilder.set_selected_regions(Maptool::App::DATA_DIR, ["SK"]) gate = Queue.new - thread = Maptool::PmtilesBuilder.build_offline(data_dir: Maptool::App::DATA_DIR, fetch_build_url: -> { gate.pop }) + thread = Maptool::PmtilesBuilder.build_offline(data_dir: Maptool::App::DATA_DIR, download_extract: ->(_url, _dest) { gate.pop }) response = request.post("/api/offline-tiles/build", **logged_in_env) assert_equal 409, response.status diff --git a/test/test_pmtiles_builder.rb b/test/test_pmtiles_builder.rb index 8ed619d..7c45401 100644 --- a/test/test_pmtiles_builder.rb +++ b/test/test_pmtiles_builder.rb @@ -3,14 +3,15 @@ require "maptool/pmtiles_builder" require "tmpdir" require "fileutils" -# Network calls (the protomaps build index, the mapterhorn manifest) are +# Network calls (Geofabrik downloads/HEADs, the mapterhorn manifest) are # never exercised here — same "keep this offline/deterministic" reasoning # test_helper.rb already gives for /api/plugins staying off the real -# Overpass API — build_offline/build_terrain take fetch_build_url/ -# fetch_manifest precisely so tests can swap those out. A fake `pmtiles` -# CLI (PMTILES_BIN) stands in for the real go-pmtiles binary, logging each -# invocation's subcommand + first arg to PMTILES_LOG so tests can assert on -# what actually got called (e.g. "was merge invoked, and with what"). +# Overpass API — build_offline/build_terrain take download_extract/ +# fetch_manifest precisely so tests can swap those out. Fake `pmtiles`, +# `osmium`, and `java` binaries (PMTILES_BIN/OSMIUM_BIN/JAVA_BIN) stand in +# for the real tools, logging each invocation's subcommand/first arg to +# PMTILES_LOG so tests can assert on what actually got called (e.g. "was +# merge invoked, and with what"). # # Country codes below are real ones from the vendored # lib/maptool/data/europe_countries.geojson (Slovakia, Iceland, Spain) — @@ -46,8 +47,45 @@ class PmtilesBuilderTest < Minitest::Test File.write(@pmtiles_fail, "#!/bin/sh\necho 'boom' >&2\nexit 1\n") File.chmod(0o755, @pmtiles_fail) + # osmium merge PBF1 PBF2 ... -o OUTPUT — output is always "-o"'s next + # arg, unlike pmtiles' varying-position output above. + @osmium_ok = File.join(@bin_dir, "osmium-ok") + File.write(@osmium_ok, <<~SH) + #!/bin/sh + echo "osmium $1" >> "$PMTILES_LOG" + prev="" + for arg; do + if [ "$prev" = "-o" ]; then echo fake > "$arg"; fi + prev="$arg" + done + SH + File.chmod(0o755, @osmium_ok) + + # Stands in for `java -jar planetiler.jar --osm-path=... --output=OUT` + # — PLANETILER_JAR itself is irrelevant here (this fake ignores -jar's + # argument entirely), only JAVA_BIN needs pointing at it. + @java_ok = File.join(@bin_dir, "java-ok") + File.write(@java_ok, <<~SH) + #!/bin/sh + echo "planetiler ${3%%=*}" >> "$PMTILES_LOG" + for arg; do + case "$arg" in + --output=*) echo fake > "${arg#--output=}" ;; + esac + done + SH + File.chmod(0o755, @java_ok) + + @java_fail = File.join(@bin_dir, "java-fail") + File.write(@java_fail, "#!/bin/sh\necho 'boom' >&2\nexit 1\n") + File.chmod(0o755, @java_fail) + @original_pmtiles_bin = ENV["PMTILES_BIN"] + @original_osmium_bin = ENV["OSMIUM_BIN"] + @original_java_bin = ENV["JAVA_BIN"] ENV["PMTILES_LOG"] = @log + ENV["OSMIUM_BIN"] = @osmium_ok + ENV["JAVA_BIN"] = @java_ok Maptool::PmtilesBuilder.reset! end @@ -55,10 +93,22 @@ class PmtilesBuilderTest < Minitest::Test FileUtils.remove_entry(@data_dir) FileUtils.remove_entry(@bin_dir) ENV["PMTILES_BIN"] = @original_pmtiles_bin + ENV["OSMIUM_BIN"] = @original_osmium_bin + ENV["JAVA_BIN"] = @original_java_bin ENV.delete("PMTILES_LOG") Maptool::PmtilesBuilder.reset! end + # download_extract stub: writes a marker file (same "fake" content the + # pmtiles/osmium/java fixtures use) instead of hitting Geofabrik, and + # returns a fixed Last-Modified so sidecar-meta assertions are stable. + def fake_download(last_modified: "Wed, 10 Sep 2026 08:00:01 GMT") + ->(_url, dest) { + File.write(dest, "fake") + last_modified + } + end + def log_lines File.exist?(@log) ? File.readlines(@log, chomp: true) : [] end @@ -107,21 +157,36 @@ class PmtilesBuilderTest < Minitest::Test def test_build_offline_raises_with_no_selection assert_raises(Maptool::PmtilesBuilder::BuildError) do - Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "unused" }) + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) end end def test_build_offline_writes_the_file_and_reports_done select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_ok - thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }) + thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) thread.join assert_path_exists File.join(@data_dir, "offline.pmtiles") refute_path_exists File.join(@data_dir, "offline.pmtiles.tmp") assert_equal "done", Maptool::PmtilesBuilder.offline_status[:state] - assert_equal ["extract https://example.com/fake.pmtiles"], log_lines - assert_equal({ "source" => "fake.pmtiles" }, Maptool::PmtilesBuilder.offline_meta(@data_dir)) + assert_equal ["planetiler --osm-path"], log_lines + assert_equal( + { "sources" => [{ "code" => "SK", "slug" => "europe/slovakia", "last_modified" => "Wed, 10 Sep 2026 08:00:01 GMT" }] }, + Maptool::PmtilesBuilder.offline_meta(@data_dir), + ) + end + + # Two countries selected — osmium merge should run before planetiler, + # each downloaded source recorded in the sidecar meta. + def test_build_offline_merges_multiple_selected_countries + select_regions("SK", "AT") + thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) + thread.join + + assert_equal "done", Maptool::PmtilesBuilder.offline_status[:state] + assert_equal ["osmium merge", "planetiler --osm-path"], log_lines + codes = Maptool::PmtilesBuilder.offline_meta(@data_dir)["sources"].map { |s| s["code"] } + assert_equal %w[SK AT], codes end def test_offline_meta_is_nil_before_any_build @@ -129,38 +194,45 @@ class PmtilesBuilderTest < Minitest::Test end def test_offline_update_available_is_nil_before_any_build - assert_nil Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }) + assert_nil Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_last_modified: ->(_url) { "unused" }) end def test_offline_update_available_is_false_when_unchanged select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_ok - Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }).join + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download).join - refute Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }) + refute Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_last_modified: ->(_url) { "Wed, 10 Sep 2026 08:00:01 GMT" }) end - def test_offline_update_available_is_true_when_a_newer_build_exists + def test_offline_update_available_is_true_when_a_newer_extract_exists select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_ok - Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/old.pmtiles" }).join + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download).join - assert Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_build_url: -> { "https://example.com/new.pmtiles" }) + assert Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_last_modified: ->(_url) { "Thu, 11 Sep 2026 08:00:01 GMT" }) end - def test_offline_update_available_is_nil_when_the_index_is_unreachable + # Same recorded source, but the selection has since grown — recorded + # sources no longer match what the current selection would need. + def test_offline_update_available_is_true_when_the_selection_grew select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_ok - Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }).join + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download).join - fetch_build_url = -> { raise Maptool::PmtilesBuilder::BuildError, "could not reach index" } - assert_nil Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_build_url: fetch_build_url) + select_regions("SK", "AT") + assert Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_last_modified: ->(_url) { "Wed, 10 Sep 2026 08:00:01 GMT" }) + end + + def test_offline_update_available_is_nil_when_geofabrik_is_unreachable + select_regions("SK") + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download).join + + fetch_last_modified = ->(_url) { raise Maptool::PmtilesBuilder::BuildError, "could not reach geofabrik" } + assert_nil Maptool::PmtilesBuilder.offline_update_available?(@data_dir, fetch_last_modified: fetch_last_modified) end def test_build_offline_reports_an_error_status_on_non_zero_exit select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_fail - thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }) + ENV["JAVA_BIN"] = @java_fail + thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) thread.join refute_path_exists File.join(@data_dir, "offline.pmtiles") @@ -169,31 +241,30 @@ class PmtilesBuilderTest < Minitest::Test assert_match(/exited with status/, status[:message]) end - def test_build_offline_reports_a_clear_error_when_the_binary_is_missing + def test_build_offline_reports_a_clear_error_when_planetiler_is_missing select_regions("SK") - ENV["PMTILES_BIN"] = File.join(@bin_dir, "does-not-exist") - thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "https://example.com/fake.pmtiles" }) + ENV["JAVA_BIN"] = File.join(@bin_dir, "does-not-exist") + thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) thread.join status = Maptool::PmtilesBuilder.offline_status assert_equal "error", status[:state] - assert_match(/go-pmtiles installed/, status[:message]) + assert_match(/Java and planetiler\.jar installed/, status[:message]) end - # fetch_build_url blocks on a Queue so the build is deterministically + # download_extract blocks on a Queue so the build is deterministically # still "running" when the second call happens, rather than racing a real # one to see which state wins. def test_build_offline_raises_when_one_is_already_running select_regions("SK") - ENV["PMTILES_BIN"] = @pmtiles_ok gate = Queue.new - thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { gate.pop }) + thread = Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: ->(_url, _dest) { gate.pop }) assert_raises(Maptool::PmtilesBuilder::BuildError) do - Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, fetch_build_url: -> { "unused" }) + Maptool::PmtilesBuilder.build_offline(data_dir: @data_dir, download_extract: fake_download) end ensure - gate.push("https://example.com/fake.pmtiles") + gate.push("Wed, 10 Sep 2026 08:00:01 GMT") thread&.join end diff --git a/views/layout.erb b/views/layout.erb index 8a9304e..76e4089 100644 --- a/views/layout.erb +++ b/views/layout.erb @@ -20,7 +20,6 @@ } - <%# Vendored libs above don't change between deploys, so they're left unversioned; app.js's own modules do, and map.js statically imports