mapwright 0.18.0__tar.gz → 0.19.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {mapwright-0.18.0 → mapwright-0.19.0}/CHANGELOG.md +18 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/PKG-INFO +7 -3
- {mapwright-0.18.0 → mapwright-0.19.0}/README.md +6 -2
- mapwright-0.19.0/docs/gallery/hint.png +0 -0
- mapwright-0.19.0/docs/gallery/hint.svg +1 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/examples/gallery.py +24 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/pyproject.toml +1 -1
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/__init__.py +1 -1
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/terrain.py +62 -2
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_terrain.py +64 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/.github/workflows/ci.yml +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/.github/workflows/publish.yml +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/.gitignore +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/LICENSE +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/NOTICE +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-old.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-old.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-young.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/age-young.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/archipelago.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/archipelago.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/arctic.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/arctic.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/README.md +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_castle_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_large_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_town_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/city_village_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_compass_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_creature_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/decoration_ship_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/dune_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/hill_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/hill_2.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/manifest.json +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_mid_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_old_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_old_2.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_young_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/mountain_young_2.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_cactus_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_deciduous_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_deciduous_2.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_pine_1.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/atlas_pack/tree_pine_2.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/citadel.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/citadel.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/continent.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/continent.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/desert.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/desert.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/dungeon.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/dungeon.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/highlands.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/highlands.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/islands.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/islands.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/pangaea.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/pangaea.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/port.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/port.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/regions.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/regions.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/roads.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/roads.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-atoll.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-atoll.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-isthmus.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/template-isthmus.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-blueprint.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-blueprint.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-citadel-neon.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-citadel-neon.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dune.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dune.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dungeon-blueprint.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-dungeon-blueprint.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-neon.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-neon.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-parchment.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/theme-parchment.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/town.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/town.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/tropical.png +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/docs/gallery/tropical.svg +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/examples/benchmark.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_geometry.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_graph.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/_serde.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/affordances.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/atlas_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/config.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/dungeon.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/dungeon_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/names.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/regions.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/rng.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/roads.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/settlement.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/settlement_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/svg_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/src/mapwright/themes.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_affordances.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_api_contract.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_atlas_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_config.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_dungeon.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_dungeon_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_geometry.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_graph.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_names.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_properties.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_regions.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_rng.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_roads.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_serialize.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_settlement.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_svg_renderer.py +0 -0
- {mapwright-0.18.0 → mapwright-0.19.0}/tests/test_themes.py +0 -0
|
@@ -8,6 +8,24 @@ All notable changes to mapwright are documented here. The format follows
|
|
|
8
8
|
`tests/test_api_contract.py`). While the version is `0.x`, minor versions may
|
|
9
9
|
make breaking changes; these will always be noted here.
|
|
10
10
|
|
|
11
|
+
## [0.19.0] — 2026-06-02
|
|
12
|
+
|
|
13
|
+
### Added
|
|
14
|
+
- **`elevation_hint` — art-direct the continent's shape.**
|
|
15
|
+
`RegionalTerrainGenerator.generate(..., elevation_hint=…)` lets a host (or an
|
|
16
|
+
LLM) supply the *macro* land/sea/elevation shape while mapwright fills in
|
|
17
|
+
organic coastlines, erosion, rivers and climate. Pass a coarse 2D grid (e.g. a
|
|
18
|
+
16×16 nested list; rows north→south, cols west→east) or a callable
|
|
19
|
+
`f(x_norm, y_norm) -> elevation` over normalised [0, 1] coords. Only relative
|
|
20
|
+
ordering matters; `sea_level` still sets how much floods, and the full
|
|
21
|
+
hydrology/biome pipeline runs on top, so the result stays coherent (rivers
|
|
22
|
+
form, coasts are organic). Takes precedence over `template`; set
|
|
23
|
+
`edge_falloff=0` to allow land at the map borders. Purely additive — the
|
|
24
|
+
default (`elevation_hint=None`) output is byte-identical. This is the
|
|
25
|
+
most on-philosophy answer to "make shapes non-circular": the caller draws the
|
|
26
|
+
shape, mapwright does the physics (the mapgen4 hint-map idea, clean-room).
|
|
27
|
+
Gallery gains a hint-driven crescent continent.
|
|
28
|
+
|
|
11
29
|
## [0.18.0] — 2026-06-02
|
|
12
30
|
|
|
13
31
|
### Added
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mapwright
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.19.0
|
|
4
4
|
Summary: Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG.
|
|
5
5
|
Project-URL: Homepage, https://github.com/sligara7/mapwright
|
|
6
6
|
Project-URL: Repository, https://github.com/sligara7/mapwright
|
|
@@ -104,9 +104,13 @@ produced by [`examples/gallery.py`](examples/gallery.py):
|
|
|
104
104
|
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-young.png" alt="young jagged terrain"><br><sub><code>land_age=0</code> (young)</sub></td>
|
|
105
105
|
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-old.png" alt="old worn terrain"><br><sub><code>land_age=1</code> (old)</sub></td>
|
|
106
106
|
</tr>
|
|
107
|
+
<tr>
|
|
108
|
+
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/hint.png" alt="continent shaped by a caller-supplied elevation hint"><br><sub><code>elevation_hint=…</code></sub></td>
|
|
109
|
+
<td colspan="2" align="left"><sub>A continent whose macro shape is <b>art-directed</b> by a caller-supplied <code>elevation_hint</code> (a coarse painted land/elevation mask). The host (or an LLM) draws the shape; mapwright fills in organic coasts, erosion, rivers and climate — so maps need never look circular.</sub></td>
|
|
110
|
+
</tr>
|
|
107
111
|
</table>
|
|
108
112
|
|
|
109
|
-
The
|
|
113
|
+
The `land_age` pair above are the **same continent** at `land_age=0` (young, jagged,
|
|
110
114
|
snow-capped peaks) vs `land_age=1` (old, worn down to rounded hills) — a mapwright-original
|
|
111
115
|
"geological age" knob.
|
|
112
116
|
|
|
@@ -224,7 +228,7 @@ Settlement presets: `hamlet`, `village`, `town`, `city`, `port`, `citadel`.
|
|
|
224
228
|
|-----------|--------------|
|
|
225
229
|
| `SeededRNG` | One seed drives everything; `.derive(label)` yields independent, reproducible sub-streams (unifies stdlib + numpy). |
|
|
226
230
|
| `NameGenerator` | Order-k character Markov names over hand-authored culture namebases; reproducible across processes. |
|
|
227
|
-
| `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. |
|
|
231
|
+
| `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. Accepts a `template=` archetype or an `elevation_hint=` (caller-drawn macro shape). |
|
|
228
232
|
| `compute_cell_polygons` | Reconstructs convex Voronoi polygons (half-plane clipping) for vector rendering. |
|
|
229
233
|
| `RegionalSVGRenderer` | Shaded-relief (hillshade) SVG: biome polygons, coastline, rivers, roads, labelled markers. Takes a `theme=`. |
|
|
230
234
|
| `Theme` / `THEMES` | A render palette + biome vocabulary; re-skins the same terrain — and its towns and dungeons — via one `theme=` (parchment / neon / dune / blueprint, or your own). The "Dominant Medium" layer. |
|
|
@@ -77,9 +77,13 @@ produced by [`examples/gallery.py`](examples/gallery.py):
|
|
|
77
77
|
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-young.png" alt="young jagged terrain"><br><sub><code>land_age=0</code> (young)</sub></td>
|
|
78
78
|
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/age-old.png" alt="old worn terrain"><br><sub><code>land_age=1</code> (old)</sub></td>
|
|
79
79
|
</tr>
|
|
80
|
+
<tr>
|
|
81
|
+
<td align="center"><img width="240" src="https://raw.githubusercontent.com/sligara7/mapwright/main/docs/gallery/hint.png" alt="continent shaped by a caller-supplied elevation hint"><br><sub><code>elevation_hint=…</code></sub></td>
|
|
82
|
+
<td colspan="2" align="left"><sub>A continent whose macro shape is <b>art-directed</b> by a caller-supplied <code>elevation_hint</code> (a coarse painted land/elevation mask). The host (or an LLM) draws the shape; mapwright fills in organic coasts, erosion, rivers and climate — so maps need never look circular.</sub></td>
|
|
83
|
+
</tr>
|
|
80
84
|
</table>
|
|
81
85
|
|
|
82
|
-
The
|
|
86
|
+
The `land_age` pair above are the **same continent** at `land_age=0` (young, jagged,
|
|
83
87
|
snow-capped peaks) vs `land_age=1` (old, worn down to rounded hills) — a mapwright-original
|
|
84
88
|
"geological age" knob.
|
|
85
89
|
|
|
@@ -197,7 +201,7 @@ Settlement presets: `hamlet`, `village`, `town`, `city`, `port`, `citadel`.
|
|
|
197
201
|
|-----------|--------------|
|
|
198
202
|
| `SeededRNG` | One seed drives everything; `.derive(label)` yields independent, reproducible sub-streams (unifies stdlib + numpy). |
|
|
199
203
|
| `NameGenerator` | Order-k character Markov names over hand-authored culture namebases; reproducible across processes. |
|
|
200
|
-
| `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. |
|
|
204
|
+
| `RegionalTerrainGenerator` | Voronoi cells (Lloyd-relaxed) → **tectonic-plate** heightmap (organic coasts + mountain ranges at plate collisions; percentile sea level) → Planchon–Darboux depression fill → flux + hydraulic/creep erosion → rivers + inland lakes → latitude/elevation climate with **rain-shadow** → Whittaker biomes. Accepts a `template=` archetype or an `elevation_hint=` (caller-drawn macro shape). |
|
|
201
205
|
| `compute_cell_polygons` | Reconstructs convex Voronoi polygons (half-plane clipping) for vector rendering. |
|
|
202
206
|
| `RegionalSVGRenderer` | Shaded-relief (hillshade) SVG: biome polygons, coastline, rivers, roads, labelled markers. Takes a `theme=`. |
|
|
203
207
|
| `Theme` / `THEMES` | A render palette + biome vocabulary; re-skins the same terrain — and its towns and dungeons — via one `theme=` (parchment / neon / dune / blueprint, or your own). The "Dominant Medium" layer. |
|
|
Binary file
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="576" height="396" viewBox="0 0 576 396"><rect width="576" height="396" fill="#183e56"/><g stroke-linejoin="round"><polygon points="0.0,0.0 19.7,0.0 17.4,20.7 0.0,20.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.7,0.0 41.3,0.0 42.2,18.0 21.3,24.4 17.4,20.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="41.3,0.0 65.8,0.0 66.7,18.2 47.2,22.1 42.2,18.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="65.8,0.0 90.3,0.0 88.1,19.4 67.0,22.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="90.3,0.0 112.7,0.0 109.2,22.1 94.2,24.1 88.1,19.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="112.7,0.0 130.8,0.0 134.2,27.0 108.6,25.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="130.8,0.0 154.0,0.0 155.4,17.6 134.7,27.5 134.2,27.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="154.0,0.0 175.5,0.0 175.5,20.0 165.7,23.8 155.4,17.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="175.5,0.0 194.7,0.0 195.8,20.2 186.2,23.4 175.5,20.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="194.7,0.0 220.5,0.0 222.1,12.3 202.7,23.3 195.8,20.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="220.5,0.0 252.1,0.0 245.4,14.4 222.2,13.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="252.1,0.0 259.9,0.0 273.0,21.6 249.3,24.1 245.4,14.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="259.9,0.0 285.0,0.0 283.5,18.5 273.9,23.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="285.0,0.0 309.2,0.0 310.6,11.9 294.7,22.4 283.5,18.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="309.2,0.0 338.5,0.0 336.1,11.0 316.5,15.9 310.6,11.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="338.5,0.0 359.7,0.0 362.0,20.3 355.5,24.0 342.7,22.3 336.1,11.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="359.7,0.0 384.4,0.0 384.3,14.6 373.7,23.3 362.0,20.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="384.4,0.0 413.0,0.0 413.1,1.8 404.3,20.4 401.8,21.9 384.3,14.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="404.3,20.4 413.1,1.8 432.2,19.1 426.5,30.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="413.0,0.0 443.1,0.0 441.1,14.9 432.2,19.1 413.1,1.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="443.1,0.0 464.4,0.0 467.3,14.5 464.1,19.2 452.9,22.7 441.1,14.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="464.4,0.0 491.6,0.0 489.2,14.5 467.3,14.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="491.6,0.0 519.7,0.0 520.7,6.6 511.4,22.2 491.3,18.2 489.2,14.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="530.3,37.9 510.6,23.5 520.7,6.6 535.5,15.3 535.5,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="519.7,0.0 551.1,0.0 549.9,9.8 535.5,15.3 520.7,6.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="551.1,0.0 576.0,0.0 576.0,19.1 549.0,16.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,44.2 0.0,20.6 17.4,20.7 21.3,24.4 22.6,42.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="22.5,41.2 21.3,24.4 42.2,18.0 47.2,22.1 47.2,36.4 35.1,44.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="47.2,36.4 47.2,22.1 71.6,17.2 70.0,37.9 60.9,45.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="70.0,37.9 71.2,21.9 88.1,19.4 94.2,24.1 91.3,47.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="91.2,48.6 94.2,24.1 114.7,21.4 110.6,43.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="120.0,51.3 110.6,43.8 113.9,25.8 134.2,27.0 135.7,28.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="134.2,27.8 155.4,17.6 165.7,23.8 164.2,37.2 154.3,44.6 144.1,41.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="164.2,37.2 165.7,23.8 175.5,20.0 186.2,23.4 183.8,45.8 180.3,47.6" fill="#ced7c5" stroke="#ced7c5" stroke-width="0.5"/><polygon points="183.8,45.8 186.2,23.4 195.8,20.2 202.7,23.3 206.5,35.3 199.2,48.8" fill="#c7cfbe" stroke="#c7cfbe" stroke-width="0.5"/><polygon points="206.5,35.3 202.7,23.3 222.9,11.9 230.3,41.3" fill="#d1c095" stroke="#d1c095" stroke-width="0.5"/><polygon points="229.6,38.8 223.2,13.2 245.4,14.4 249.3,24.1 246.6,33.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="246.6,33.5 249.3,24.1 275.1,21.4 272.8,40.8 256.1,44.2" fill="#c2cbba" stroke="#c2cbba" stroke-width="0.5"/><polygon points="272.8,41.3 275.0,22.5 283.5,18.5 294.7,22.4 300.4,39.3 291.4,46.3" fill="#bdc5b5" stroke="#bdc5b5" stroke-width="0.5"/><polygon points="300.4,39.3 294.7,22.4 310.6,11.9 316.5,15.9 319.9,30.9 310.7,42.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="319.9,30.9 316.5,15.9 336.1,11.0 342.7,22.3 334.7,33.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="342.7,22.3 355.5,24.0 355.5,49.9 350.0,52.2 338.7,48.4 334.7,33.0" fill="#cfbe94" stroke="#cfbe94" stroke-width="0.5"/><polygon points="355.5,49.9 355.5,24.0 362.0,20.3 373.7,23.3 377.1,34.1 363.3,51.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="377.1,34.1 373.7,23.3 384.3,14.6 401.8,21.9 398.8,39.6 393.4,43.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="398.8,39.6 401.8,21.9 404.3,20.4 426.5,30.1 427.2,37.4 418.5,45.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="427.2,37.4 426.5,30.1 432.2,19.1 441.1,14.9 452.9,22.7 449.8,41.9 445.5,45.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="449.8,41.9 452.9,22.7 464.1,19.2 478.6,44.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="474.6,37.6 464.1,19.2 467.3,14.5 489.2,14.5 491.3,18.2 486.5,33.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="491.3,18.2 513.3,22.6 500.8,47.7 486.5,33.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="509.5,52.5 501.7,45.8 512.2,24.8 530.3,37.9 529.4,42.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="535.5,33.8 535.5,15.3 560.4,5.8 550.1,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="556.1,17.5 576.0,19.1 576.0,38.5 555.5,39.4 550.1,33.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,67.0 0.0,44.2 20.8,42.9 19.3,60.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.3,60.6 21.0,40.9 35.1,44.0 42.9,61.6 38.0,68.9 28.6,69.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="42.9,61.6 35.1,44.0 47.3,36.4 60.9,45.7 60.3,56.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="60.3,56.9 60.9,45.7 70.0,37.9 91.8,47.9 90.8,56.0 67.5,64.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="90.6,57.9 91.7,48.5 110.6,43.8 120.0,51.3 123.5,62.6" fill="#fffec6" stroke="#fffec6" stroke-width="0.5"/><polygon points="122.3,58.8 120.0,51.3 135.1,29.1 144.1,41.9 132.7,62.2" fill="#e8f2de" stroke="#e8f2de" stroke-width="0.5"/><polygon points="132.7,62.2 144.1,41.9 154.3,44.6 158.8,60.2 151.7,67.8 134.3,64.4" fill="#e6f0dc" stroke="#e6f0dc" stroke-width="0.5"/><polygon points="158.8,60.2 154.3,44.6 164.2,37.2 180.3,47.6 174.7,61.5" fill="#dbe4d1" stroke="#dbe4d1" stroke-width="0.5"/><polygon points="176.6,65.0 174.7,61.5 180.3,47.6 183.8,45.8 199.2,48.8 205.5,61.5 196.7,70.0" fill="#ced7c6" stroke="#ced7c6" stroke-width="0.5"/><polygon points="205.5,61.5 199.2,48.8 206.5,35.3 228.2,40.7 227.9,49.4 210.7,62.3" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="227.9,49.4 228.3,39.3 246.6,33.5 256.1,44.2 252.8,55.8 238.0,59.2" fill="#c4ccbb" stroke="#c4ccbb" stroke-width="0.5"/><polygon points="252.8,55.8 256.1,44.2 273.4,40.7 273.4,64.9 260.7,66.4" fill="#d3dcca" stroke="#d3dcca" stroke-width="0.5"/><polygon points="273.4,41.4 291.4,46.3 291.4,60.5 273.4,67.2" fill="#b1b8a9" stroke="#b1b8a9" stroke-width="0.5"/><polygon points="291.4,60.5 291.4,46.3 300.4,39.3 310.7,42.0 314.3,48.9 307.5,66.8 302.7,69.0" fill="#b6beae" stroke="#b6beae" stroke-width="0.5"/><polygon points="327.7,74.4 307.5,66.8 314.3,48.9 329.9,53.2" fill="#a6ad9f" stroke="#a6ad9f" stroke-width="0.5"/><polygon points="310.7,42.0 319.9,30.9 334.7,33.0 338.7,48.4 329.9,53.2 314.3,48.9" fill="#aab1a2" stroke="#aab1a2" stroke-width="0.5"/><polygon points="363.3,51.3 377.1,34.1 393.4,43.5 391.7,51.7 369.9,57.8" fill="#c9b88f" stroke="#c9b88f" stroke-width="0.5"/><polygon points="372.0,74.5 369.9,57.8 391.7,51.7 393.5,56.0 381.1,77.5" fill="#8c9286" stroke="#8c9286" stroke-width="0.5"/><polygon points="393.5,56.0 391.7,51.7 393.4,43.5 398.8,39.6 418.5,45.4 418.5,63.2 404.7,65.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="418.5,63.2 418.5,45.4 427.2,37.4 445.5,45.4 445.5,58.6 435.9,65.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="445.5,58.6 445.5,45.4 449.8,41.9 470.8,43.9 474.7,58.9 461.9,68.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="474.7,58.9 469.6,39.3 486.5,33.5 498.5,45.5 482.3,60.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="499.9,44.2 509.5,52.5 510.9,65.9 488.8,69.4 482.3,60.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="510.9,65.8 509.5,52.5 529.4,42.5 538.7,59.6 533.2,67.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="538.7,59.6 529.4,42.5 530.3,37.9 535.5,33.8 550.1,33.8 555.5,39.4 550.6,58.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,38.5 576.0,59.3 550.2,60.4 555.5,39.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,75.9 0.0,67.0 19.3,60.6 28.6,69.5 19.0,85.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.4,93.6 19.0,85.0 28.6,69.5 38.0,68.9 46.5,83.4 33.2,96.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.5,83.4 38.0,68.9 42.9,61.6 60.3,56.9 67.5,64.5 67.5,73.4 52.9,85.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="67.5,73.4 67.5,64.5 91.8,55.6 95.8,77.7 91.1,84.1 79.6,84.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="95.8,77.7 92.3,58.2 118.0,61.9 111.1,77.5" fill="#edf7e3" stroke="#edf7e3" stroke-width="0.5"/><polygon points="111.1,77.5 119.8,57.9 132.7,62.2 134.3,64.4 131.2,81.5 118.7,85.8" fill="#f1fbe6" stroke="#f1fbe6" stroke-width="0.5"/><polygon points="131.2,81.5 134.3,64.4 151.7,67.8 155.2,82.4 150.3,87.3 137.0,86.4" fill="#c9c27e" stroke="#c9c27e" stroke-width="0.5"/><polygon points="155.2,82.4 151.7,67.8 158.8,60.2 174.7,61.5 176.6,65.0 172.9,81.7 168.7,84.9" fill="#c6bf7c" stroke="#c6bf7c" stroke-width="0.5"/><polygon points="172.9,81.7 176.6,65.0 196.7,70.0 195.6,88.2" fill="#b3ad70" stroke="#b3ad70" stroke-width="0.5"/><polygon points="195.7,86.6 196.7,70.0 205.5,61.5 210.7,62.3 222.9,79.0 215.5,92.1" fill="#b8b173" stroke="#b8b173" stroke-width="0.5"/><polygon points="222.9,79.0 210.7,62.3 227.9,49.4 238.0,59.2 235.5,76.7" fill="#b9b274" stroke="#b9b274" stroke-width="0.5"/><polygon points="235.0,80.0 238.0,59.2 252.8,55.8 260.7,66.4 255.6,77.1" fill="#b3ac70" stroke="#b3ac70" stroke-width="0.5"/><polygon points="255.7,77.0 260.7,66.4 275.4,64.7 280.7,84.3 262.5,87.9" fill="#908b5a" stroke="#908b5a" stroke-width="0.5"/><polygon points="281.7,88.0 275.8,66.3 291.4,60.5 302.7,69.0 300.1,78.1" fill="#7f7b50" stroke="#7f7b50" stroke-width="0.5"/><polygon points="312.2,93.2 300.1,78.1 302.7,69.0 307.5,66.8 333.6,76.6" fill="#7e8378" stroke="#7e8378" stroke-width="0.5"/><polygon points="338.7,48.4 350.0,52.2 346.8,74.9 333.8,80.0 327.3,77.6 329.9,53.2" fill="#a9b1a2" stroke="#a9b1a2" stroke-width="0.5"/><polygon points="346.8,74.9 350.0,52.2 355.5,49.9 363.3,51.3 369.9,57.8 372.0,74.5 360.8,81.3" fill="#9ba194" stroke="#9ba194" stroke-width="0.5"/><polygon points="380.5,78.7 393.5,56.0 404.7,65.1 398.0,79.9" fill="#888e82" stroke="#888e82" stroke-width="0.5"/><polygon points="398.0,79.9 404.7,65.1 418.5,63.2 418.5,85.5 402.2,85.5" fill="#baaa85" stroke="#baaa85" stroke-width="0.5"/><polygon points="418.5,87.7 418.5,63.2 435.9,65.6 438.3,86.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="438.3,86.3 435.9,65.6 445.5,58.6 461.9,68.9 461.8,76.7 442.1,89.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="461.8,76.7 461.9,68.9 474.7,58.9 482.3,60.9 488.8,69.4 487.3,86.8 470.5,86.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="487.4,85.9 488.8,69.4 510.8,66.0 510.8,83.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="510.8,85.6 510.8,65.8 533.2,67.2 534.9,79.9 527.8,88.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="534.9,79.9 533.2,67.2 538.7,59.6 552.5,58.7 557.8,87.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,59.3 576.0,82.9 557.1,83.8 552.8,60.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,104.5 0.0,75.9 19.0,85.0 21.4,93.6 11.7,104.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="42.7,113.9 33.2,96.1 46.5,83.4 52.9,85.0 60.2,100.7 46.0,114.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="60.2,100.7 52.9,85.0 67.5,73.4 79.6,84.2 69.2,101.9" fill="#ffffc6" stroke="#ffffc6" stroke-width="0.5"/><polygon points="69.2,101.9 79.6,84.2 91.1,84.1 95.9,96.8 87.2,109.9 76.3,110.0" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="95.9,96.8 91.1,84.1 95.8,77.7 111.1,77.5 118.7,85.8 116.5,97.2 110.7,101.1" fill="#eff9e5" stroke="#eff9e5" stroke-width="0.5"/><polygon points="116.5,97.2 118.7,85.8 131.2,81.5 137.0,86.4 132.3,105.2" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="132.1,105.9 137.0,86.4 150.3,87.3 151.0,107.3" fill="#ccc480" stroke="#ccc480" stroke-width="0.5"/><polygon points="150.9,106.0 150.3,87.3 155.2,82.4 168.7,84.9 171.9,105.3" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="171.9,105.3 168.7,84.9 172.9,81.7 194.1,87.7 188.7,102.3 172.9,106.0" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="188.7,102.3 194.6,86.3 215.5,92.1 218.7,102.6 207.6,113.0 198.6,113.2" fill="#e3e7eb" stroke="#e3e7eb" stroke-width="0.5"/><polygon points="218.7,102.6 215.5,92.1 222.9,79.0 238.9,76.1 242.7,102.0 227.5,106.2" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="242.7,102.0 239.4,79.4 255.7,77.1 262.5,87.9 258.8,99.2 247.6,104.1" fill="#79754c" stroke="#79754c" stroke-width="0.5"/><polygon points="258.8,99.2 262.5,87.9 283.7,83.7 285.3,94.6 271.7,107.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="285.3,94.6 284.2,86.6 300.1,78.1 312.2,93.2 310.9,102.3 294.0,102.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="310.8,102.7 312.2,93.2 330.7,78.9 333.8,80.0 339.2,102.2 330.8,108.6" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="339.2,102.2 333.8,80.0 346.8,74.9 360.7,81.3 360.7,100.8 353.2,105.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="372.0,74.5 382.5,78.0 382.5,101.6 374.6,105.4 360.7,100.7 360.7,81.3" fill="#8e9488" stroke="#8e9488" stroke-width="0.5"/><polygon points="382.5,101.6 382.5,78.8 398.0,79.9 402.2,85.5 397.4,104.8" fill="#8b9185" stroke="#8b9185" stroke-width="0.5"/><polygon points="396.5,108.4 402.2,85.5 420.9,85.5 417.8,105.4" fill="#477643" stroke="#477643" stroke-width="0.5"/><polygon points="417.8,105.4 420.5,87.6 438.3,86.3 442.1,89.1 444.2,99.2 423.4,109.7" fill="#4b7c46" stroke="#4b7c46" stroke-width="0.5"/><polygon points="444.7,101.6 442.1,89.1 461.8,76.7 470.5,86.8 463.6,104.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="463.6,104.7 470.5,86.8 486.7,86.8 489.7,98.8 483.8,109.7 472.0,113.4 468.4,111.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="489.7,98.8 486.5,86.0 512.9,83.6 507.9,103.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="507.9,103.7 512.4,85.8 527.8,88.0 531.0,100.9 512.4,112.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="531.0,100.9 527.8,88.0 534.9,79.9 553.9,86.4 553.2,90.2 540.0,105.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,82.9 576.0,111.5 564.5,109.1 553.2,90.2 554.3,84.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,136.0 0.0,104.5 11.7,104.8 20.0,120.6 3.7,136.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="20.0,120.6 11.7,104.8 21.4,93.6 33.2,96.1 42.7,113.9 28.2,122.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.0,114.5 60.2,100.7 69.2,101.9 76.3,110.0 68.6,129.2 53.0,124.2" fill="#62a25c" stroke="#62a25c" stroke-width="0.5"/><polygon points="68.7,128.9 76.3,110.0 87.2,109.9 94.6,120.0 85.7,132.3" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="94.6,120.0 87.2,109.9 95.9,96.8 110.7,101.1 110.4,118.7 105.9,122.3" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="110.4,118.7 110.7,101.1 116.5,97.2 133.1,105.5 126.9,121.6" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="126.9,121.6 132.9,106.0 149.7,107.2 150.7,126.5 132.1,130.2" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="150.7,126.5 149.6,106.0 171.9,105.3 172.9,106.0 173.3,121.9 155.0,129.5" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="173.4,123.4 172.9,106.0 188.7,102.3 198.6,113.2 190.4,126.2" fill="#b5b8bb" stroke="#b5b8bb" stroke-width="0.5"/><polygon points="207.6,113.0 218.7,102.6 227.5,106.2 230.7,129.1 217.5,137.7 216.6,137.3" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="230.7,129.1 227.5,106.2 242.7,102.0 247.6,104.1 251.0,120.9 243.4,130.8" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="251.0,120.9 247.6,104.1 258.8,99.2 271.7,107.3 275.1,124.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="274.6,121.8 271.7,107.3 285.3,94.6 294.0,102.5 287.6,120.9 283.1,123.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="287.6,120.9 294.0,102.5 311.4,102.3 307.8,123.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="307.8,123.0 311.3,102.9 330.8,108.6 330.8,127.3 318.7,131.2 311.6,129.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="330.8,127.3 330.8,108.6 339.2,102.2 353.2,105.3 353.2,126.5 335.5,130.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="353.3,131.7 353.3,105.3 360.7,100.7 374.6,105.4 375.8,127.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="375.8,127.6 374.6,105.4 382.5,101.6 400.3,105.5 398.8,123.3 378.8,129.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="398.8,123.3 400.1,107.9 417.8,105.4 423.4,109.7 427.2,125.9 425.0,129.2 405.1,130.2" fill="#355731" stroke="#355731" stroke-width="0.5"/><polygon points="427.2,125.9 423.4,109.7 447.6,97.6 443.5,123.6" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="443.5,123.6 446.9,101.9 463.6,104.7 468.4,111.6 450.4,128.1" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="474.4,127.6 472.0,113.4 483.8,109.7 498.4,123.6 490.1,136.3" fill="#bdad87" stroke="#bdad87" stroke-width="0.5"/><polygon points="483.8,109.7 489.7,98.8 507.9,103.7 512.4,112.2 511.6,119.3 498.4,123.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="511.6,119.3 512.4,112.2 531.0,100.9 540.0,105.9 544.2,116.6 542.8,122.5 517.6,125.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="544.2,116.6 540.0,105.9 553.2,90.2 564.5,109.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="564.5,109.1 576.0,111.5 576.0,127.9 560.9,131.0 543.2,120.5 544.2,116.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="3.7,136.1 20.0,120.6 28.2,122.6 33.0,143.6 17.2,148.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="33.0,143.6 28.2,122.6 42.7,113.9 46.0,114.5 53.0,124.2 41.2,147.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="40.3,149.6 53.0,124.2 68.4,129.1 66.5,147.8" fill="#5f9d59" stroke="#5f9d59" stroke-width="0.5"/><polygon points="66.3,149.4 68.4,128.9 85.7,132.3 91.2,143.4 88.1,149.4" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="91.2,143.4 85.7,132.3 94.6,120.0 105.9,122.3 107.1,139.7" fill="#c9c17d" stroke="#c9c17d" stroke-width="0.5"/><polygon points="107.1,139.7 105.9,122.3 110.4,118.7 126.9,121.6 132.1,130.2 128.4,141.3 111.5,143.1" fill="#c5be7b" stroke="#c5be7b" stroke-width="0.5"/><polygon points="128.4,141.3 132.1,130.2 150.7,126.5 155.0,129.5 157.4,142.7 153.5,149.1 131.8,146.9" fill="#ffffff" stroke="#ffffff" stroke-width="0.5"/><polygon points="157.4,142.7 155.0,129.5 175.5,121.0 175.5,145.0" fill="#acafb2" stroke="#acafb2" stroke-width="0.5"/><polygon points="175.5,146.2 175.5,123.8 190.4,126.2 196.6,139.9 194.2,143.2" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="196.6,139.9 190.4,126.2 198.6,113.2 207.6,113.0 216.6,137.3" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="221.3,149.9 217.5,137.7 230.7,129.1 243.4,130.8 250.1,145.0 243.7,158.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="250.1,145.0 243.4,130.8 251.0,120.9 271.1,124.0 265.3,143.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="265.3,143.1 272.0,121.3 283.1,123.5 291.5,145.3 290.5,147.0 275.0,152.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="291.5,145.3 283.1,123.5 287.6,120.9 307.8,123.0 311.6,129.4 300.1,142.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="321.6,154.9 318.7,131.2 330.8,127.3 335.5,130.0 338.2,148.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="338.2,148.7 335.5,130.0 359.1,125.3 357.3,145.3 344.0,152.0" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="357.3,145.3 358.6,130.7 375.8,127.6 378.8,129.6 381.9,145.1 371.7,156.5 370.5,156.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="381.9,145.1 378.8,129.6 398.8,123.3 405.1,130.2 400.9,150.1" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="400.8,150.1 405.1,130.2 425.0,129.2 428.0,143.9 418.6,154.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="428.0,143.9 425.0,129.2 427.2,125.9 443.5,123.6 450.4,128.1 455.3,139.5 445.7,150.4" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="468.4,111.6 472.0,113.4 474.4,127.6 460.9,140.1 455.3,139.5 450.4,128.1" fill="#497844" stroke="#497844" stroke-width="0.5"/><polygon points="474.4,127.6 490.1,136.3 490.4,140.5 470.7,149.2 460.9,140.1" fill="#4d7f48" stroke="#4d7f48" stroke-width="0.5"/><polygon points="490.4,140.5 490.1,136.3 498.4,123.6 511.6,119.3 517.6,125.5 518.4,142.3 504.4,152.0 496.1,148.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="518.4,142.3 517.6,125.5 541.1,122.7 541.1,149.3 535.9,151.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="541.1,119.2 560.9,131.0 553.6,146.6 541.1,151.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,127.9 576.0,152.6 553.6,146.6 560.9,131.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,167.6 0.0,136.0 3.7,136.1 17.2,148.1 13.7,165.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="13.7,165.3 17.2,148.1 33.0,143.6 42.5,148.4 42.1,156.8 36.9,164.6 18.5,169.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="42.1,156.8 42.4,149.5 67.8,147.7 68.4,169.0 64.0,174.7" fill="#578f52" stroke="#578f52" stroke-width="0.5"/><polygon points="68.4,169.0 67.8,149.4 88.1,149.4 93.6,166.6" fill="#5d9957" stroke="#5d9957" stroke-width="0.5"/><polygon points="94.4,168.9 88.1,149.4 91.2,143.4 107.1,139.7 111.5,143.1 108.2,165.1 102.4,169.2" fill="#c3bc7a" stroke="#c3bc7a" stroke-width="0.5"/><polygon points="108.2,165.1 111.5,143.1 128.4,141.3 131.8,146.9 129.8,166.2" fill="#b1aa6f" stroke="#b1aa6f" stroke-width="0.5"/><polygon points="129.8,165.6 131.8,146.9 153.5,149.1 155.0,158.9 146.9,168.5" fill="#928a80" stroke="#928a80" stroke-width="0.5"/><polygon points="155.0,158.9 153.5,149.1 157.4,142.7 176.8,145.1 174.7,166.6" fill="#ced1d5" stroke="#ced1d5" stroke-width="0.5"/><polygon points="174.7,166.6 176.7,146.0 194.2,143.3 198.1,170.4" fill="#5c5751" stroke="#5c5751" stroke-width="0.5"/><polygon points="197.4,165.5 194.2,143.2 196.6,139.9 216.6,137.3 217.5,137.7 221.3,149.9 211.8,166.3" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="211.8,166.3 221.3,149.9 243.7,158.2 244.8,162.6 238.5,170.7 217.0,173.8" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="244.8,162.6 243.7,158.2 250.1,145.0 265.3,143.1 275.0,152.1 271.2,166.4 258.7,170.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="271.2,166.4 275.0,152.1 290.5,147.0 297.1,164.4 285.2,178.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="297.1,164.4 290.5,147.0 291.5,145.3 300.1,142.8 319.3,158.0 317.6,167.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="300.1,142.8 311.6,129.4 318.7,131.2 322.3,160.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="317.5,167.7 319.7,155.6 338.2,148.7 344.0,152.0 345.8,164.8 335.2,174.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="345.8,164.8 344.0,152.0 357.3,145.3 370.5,156.4 356.3,168.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="371.7,156.5 381.9,145.1 400.9,150.1 396.1,166.5 378.4,166.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="396.1,166.5 400.9,150.1 418.6,154.4 422.0,167.0 402.3,177.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="422.0,167.0 418.6,154.4 428.0,143.9 445.7,150.4 446.4,157.1 439.4,166.3 424.6,168.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="446.4,157.1 445.7,150.4 455.3,139.5 460.9,140.1 470.7,149.2 472.1,169.0 467.4,170.5" fill="#d6c499" stroke="#d6c499" stroke-width="0.5"/><polygon points="472.1,169.1 470.7,149.2 490.4,140.5 496.1,148.4 478.6,168.4" fill="#609e5a" stroke="#609e5a" stroke-width="0.5"/><polygon points="496.1,148.4 504.4,152.0 506.9,162.1 495.6,176.3 478.6,168.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="506.9,162.1 504.4,152.0 518.4,142.3 535.9,151.6 531.7,162.3 516.1,167.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="547.6,182.9 536.4,174.5 531.7,162.3 535.9,151.6 543.6,148.3 555.6,166.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,152.6 576.0,163.9 555.6,166.8 544.7,150.1 553.6,146.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,191.1 0.0,167.6 13.7,165.3 18.5,169.2 21.6,184.5 16.4,193.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.6,184.5 18.5,169.2 36.9,164.6 42.6,184.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="42.2,183.2 36.9,164.6 42.1,156.8 64.3,174.9" fill="#548b4f" stroke="#548b4f" stroke-width="0.5"/><polygon points="63.9,174.8 68.4,169.0 98.2,166.2 84.5,192.6 68.2,184.9" fill="#a8a169" stroke="#a8a169" stroke-width="0.5"/><polygon points="88.1,200.6 84.5,192.6 96.8,169.0 102.4,169.2 112.3,189.0 96.2,202.8 92.8,203.2" fill="#898456" stroke="#898456" stroke-width="0.5"/><polygon points="112.3,189.0 102.4,169.2 108.2,165.1 129.2,166.1 128.1,185.3 117.5,190.2" fill="#96905e" stroke="#96905e" stroke-width="0.5"/><polygon points="128.1,185.3 129.3,165.5 146.9,168.5 151.5,181.7 139.2,191.1" fill="#706961" stroke="#706961" stroke-width="0.5"/><polygon points="151.5,181.7 146.9,168.5 155.0,158.9 174.7,166.6 165.5,186.3" fill="#5c5751" stroke="#5c5751" stroke-width="0.5"/><polygon points="165.5,186.3 174.7,166.6 192.2,169.4 193.3,192.0 175.5,193.9 166.7,188.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="193.4,193.5 192.0,165.3 211.8,166.3 217.0,173.8 217.0,183.9 212.7,191.5 205.7,194.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="217.0,183.9 217.0,173.8 238.5,170.7 238.5,188.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="238.5,188.5 238.5,170.7 244.8,162.6 258.7,170.3 257.8,188.8 241.8,193.9" fill="#546f46" stroke="#546f46" stroke-width="0.5"/><polygon points="257.8,188.8 258.7,170.3 271.2,166.4 285.2,178.6 285.8,181.8 282.9,189.3 269.2,196.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="285.8,181.8 285.2,178.6 297.1,164.4 318.2,167.2 311.1,185.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="313.0,192.1 311.1,185.8 317.9,167.9 335.2,174.6 339.7,188.1 334.2,198.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="339.7,188.1 335.2,174.6 345.8,164.8 356.3,168.3 361.8,186.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="361.8,186.2 356.3,168.3 370.5,156.4 371.7,156.5 378.4,166.5 373.8,187.0 365.7,188.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="374.2,185.5 378.4,166.5 396.1,166.5 402.3,177.9 401.6,182.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="401.1,186.1 402.3,177.9 422.0,167.0 424.6,168.6 427.9,188.1 425.3,190.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="427.9,188.1 424.6,168.6 439.4,166.3 447.6,186.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="446.0,182.7 439.4,166.3 446.4,157.1 467.4,170.5 461.0,178.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="482.5,199.5 472.4,169.1 478.6,168.4 495.6,176.3 497.0,181.0 486.8,199.8" fill="#558c50" stroke="#558c50" stroke-width="0.5"/><polygon points="497.0,181.0 495.6,176.3 506.9,162.1 516.1,167.4 518.0,188.7" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="517.7,185.1 516.1,167.4 531.7,162.3 536.4,174.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="536.4,174.5 548.6,183.7 547.8,185.6 528.3,196.6 516.3,187.6 515.9,186.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,163.9 576.0,187.4 546.6,184.8 555.6,166.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,220.3 0.0,191.1 16.4,193.1 19.5,200.6 6.5,219.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="19.5,200.6 16.4,193.1 21.6,184.5 41.4,184.5 45.0,202.5 32.0,206.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="45.0,202.5 41.2,183.5 64.0,175.0 68.2,184.9 57.1,202.4 46.0,203.0" fill="#4c7d47" stroke="#4c7d47" stroke-width="0.5"/><polygon points="57.1,202.4 68.2,184.9 84.5,192.6 88.1,200.6 69.0,213.2" fill="#467342" stroke="#467342" stroke-width="0.5"/><polygon points="96.2,202.8 112.3,189.0 117.5,190.2 122.8,208.6 112.8,213.6" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="122.8,208.6 117.5,190.2 128.1,185.3 139.2,191.1 140.3,199.4 127.5,210.0" fill="#6f6b45" stroke="#6f6b45" stroke-width="0.5"/><polygon points="140.3,199.4 139.2,191.1 151.5,181.7 165.5,186.3 166.7,188.8 154.6,207.7 152.4,208.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="154.6,207.7 166.7,188.8 175.5,193.9 175.5,218.8 172.3,219.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="175.5,218.8 175.5,193.9 195.6,191.8 191.2,213.7 178.5,220.1" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="211.3,216.9 205.7,194.7 212.7,191.5 229.5,205.8 220.1,218.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="212.7,191.5 217.0,183.9 238.5,188.5 241.8,193.9 238.7,203.3 229.5,205.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="238.7,203.3 241.8,193.9 257.8,188.8 269.2,196.7 266.9,214.1 247.4,214.1" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="267.4,210.6 269.2,196.7 282.9,189.3 294.5,204.4 288.8,217.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="282.9,189.3 285.8,181.8 311.1,185.8 313.0,192.1 306.5,202.4 294.5,204.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="314.6,217.1 306.5,202.4 313.0,192.1 341.2,200.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="331.5,203.8 339.7,188.1 361.8,186.2 365.7,188.5 359.0,211.2 358.4,211.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="359.0,211.2 365.7,188.5 372.5,187.2 384.6,203.7 380.1,219.5 377.3,220.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="384.6,203.7 371.4,185.8 404.2,182.3 400.6,198.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="400.6,198.9 403.3,186.5 425.2,190.9 425.2,213.9 420.0,214.4 407.7,210.0" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="425.2,212.4 425.2,190.9 427.9,188.1 443.1,187.0 449.1,202.6 444.0,211.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="449.1,202.6 441.9,183.8 461.0,178.6 465.4,199.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="465.4,199.7 461.0,178.6 467.4,170.5 472.3,168.9 482.5,199.5 472.4,203.2" fill="#fff9c2" stroke="#fff9c2" stroke-width="0.5"/><polygon points="485.4,202.5 497.0,181.0 516.0,188.0 505.2,204.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="516.3,187.6 528.3,196.6 529.6,211.5 510.2,211.5 505.2,204.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="529.6,211.5 528.3,196.6 547.8,185.6 552.7,211.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,187.4 576.0,209.9 552.7,211.5 547.8,185.6 548.1,184.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="6.5,219.3 19.5,200.6 32.0,206.9 28.2,227.7 25.8,229.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="28.2,227.7 32.0,206.9 45.0,202.5 46.0,203.0 49.0,229.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="48.9,229.2 46.0,203.0 57.1,202.4 69.0,213.2 68.3,227.6" fill="#b6a782" stroke="#b6a782" stroke-width="0.5"/><polygon points="68.4,227.1 69.0,213.2 88.1,200.6 92.8,203.2 92.0,229.8" fill="#4e8149" stroke="#4e8149" stroke-width="0.5"/><polygon points="92.0,229.1 92.8,203.2 96.2,202.8 112.8,213.6 110.2,231.8" fill="#365832" stroke="#365832" stroke-width="0.5"/><polygon points="110.6,229.5 112.8,213.6 122.8,208.6 127.5,210.0 134.6,224.2 131.0,229.5" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="134.6,224.2 127.5,210.0 140.3,199.4 152.4,208.3 145.1,222.8" fill="#6f6b46" stroke="#6f6b46" stroke-width="0.5"/><polygon points="156.9,234.6 145.1,222.8 152.4,208.2 154.6,207.7 172.3,219.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="183.5,232.6 178.5,220.1 191.2,213.8 204.2,220.2 199.9,237.6" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="191.2,213.8 195.3,193.6 205.7,194.7 211.3,216.9 204.3,220.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="220.1,218.5 229.5,205.8 238.7,203.3 247.4,214.1 240.5,232.5 224.1,226.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="240.5,232.5 247.4,214.1 263.9,214.1 266.3,232.9 247.7,239.2 243.1,237.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="270.4,235.7 266.3,232.9 263.3,209.3 293.5,219.3 290.2,225.8" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="286.3,223.7 294.5,204.4 306.5,202.4 314.6,217.1 312.9,225.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="312.4,228.5 314.6,217.1 336.0,204.1 336.0,226.3 330.7,230.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="336.0,226.3 336.0,205.1 358.4,211.5 350.5,228.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="354.3,236.5 350.5,228.8 358.4,211.5 359.0,211.2 377.3,220.7 371.2,237.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="380.1,219.5 384.6,203.7 400.6,198.9 407.7,210.0 391.9,223.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="402.0,239.7 391.9,223.5 407.7,210.0 420.0,214.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="428.5,231.6 422.9,212.5 444.0,211.0 452.3,223.7 445.7,237.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="452.3,223.7 444.0,211.0 449.1,202.6 465.4,199.7 472.4,203.2 468.4,222.9" fill="#fffbc4" stroke="#fffbc4" stroke-width="0.5"/><polygon points="468.4,222.9 472.4,203.2 482.5,199.5 490.5,200.2 490.5,229.5 474.3,229.5" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="490.5,228.1 490.5,203.1 505.2,204.8 510.2,211.5 506.5,226.1" fill="#375a33" stroke="#375a33" stroke-width="0.5"/><polygon points="506.5,226.1 510.2,211.5 529.6,211.5 527.8,232.3 514.0,232.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="527.8,232.3 529.6,211.5 552.6,211.5 550.2,232.9 540.3,236.5 530.2,234.5" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,209.9 576.0,236.5 553.5,234.9 550.2,232.9 552.7,211.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,246.8 0.0,220.3 6.5,219.3 25.8,229.4 22.0,248.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="21.9,248.9 25.8,229.4 28.2,227.7 48.7,229.4 46.7,251.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="46.7,251.0 48.7,229.3 67.8,227.7 68.8,245.9 49.8,254.4" fill="#c7b78e" stroke="#c7b78e" stroke-width="0.5"/><polygon points="68.8,245.9 67.8,227.1 91.1,229.7 87.7,251.5 78.2,253.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="87.7,251.5 91.2,229.0 108.4,231.5 112.1,250.1 93.7,255.1" fill="#59754a" stroke="#59754a" stroke-width="0.5"/><polygon points="111.8,248.4 108.0,229.5 131.0,229.5 134.2,249.4" fill="#6f935d" stroke="#6f935d" stroke-width="0.5"/><polygon points="134.0,248.4 131.0,229.5 134.6,224.2 145.1,222.8 156.9,234.6 157.4,246.3" fill="#9f9964" stroke="#9f9964" stroke-width="0.5"/><polygon points="157.4,247.0 156.9,234.6 172.3,219.2 175.5,218.8 178.5,220.1 183.5,232.6 173.4,248.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="180.4,256.0 173.4,248.5 183.5,232.6 202.5,238.4 196.1,253.4" fill="#7c784e" stroke="#7c784e" stroke-width="0.5"/><polygon points="199.3,240.2 204.2,220.3 211.3,216.9 220.1,218.5 224.1,226.8 214.2,242.0" fill="#6098b8" stroke="#6098b8" stroke-width="0.5"/><polygon points="214.2,242.0 224.1,226.8 240.5,232.5 243.1,237.9 234.0,250.3 220.5,250.1" fill="#3a6036" stroke="#3a6036" stroke-width="0.5"/><polygon points="247.7,239.2 266.3,232.9 270.4,235.7 274.0,247.8 259.2,258.7" fill="#467241" stroke="#467241" stroke-width="0.5"/><polygon points="274.0,247.8 270.4,235.7 290.2,225.8 293.5,246.1 283.3,252.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="293.5,246.1 290.2,225.8 291.1,224.1 315.3,226.2 309.6,249.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="309.9,248.5 314.7,228.8 330.7,230.9 336.2,249.9 331.7,253.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="336.2,249.9 330.7,230.9 336.0,226.3 350.5,228.8 354.3,236.5 346.0,249.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="346.0,249.9 354.3,236.5 371.2,237.7 375.3,246.2 371.4,254.0 355.1,260.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="375.3,246.2 371.2,237.7 377.3,220.7 380.1,219.5 391.9,223.5 402.0,239.7 402.7,245.3 397.0,248.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="402.7,245.3 402.0,239.7 420.0,214.4 423.3,214.1 428.5,231.6 417.2,246.7 412.0,249.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="417.2,246.7 428.5,231.6 445.7,237.7 450.0,253.3" fill="#fee9b5" stroke="#fee9b5" stroke-width="0.5"/><polygon points="448.4,247.5 445.7,237.7 452.3,223.7 468.4,222.9 474.3,229.5 467.7,247.5" fill="#65a65f" stroke="#65a65f" stroke-width="0.5"/><polygon points="467.7,247.5 474.3,229.5 489.0,229.5 493.7,247.3 487.1,254.2 473.0,254.2" fill="#63a45d" stroke="#63a45d" stroke-width="0.5"/><polygon points="493.7,247.3 488.7,228.3 506.5,226.1 514.0,232.8 506.6,249.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="511.3,255.8 506.6,249.4 514.0,232.8 527.8,232.3 530.2,234.5 523.6,257.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="544.1,264.1 540.3,236.5 550.2,232.9 553.5,234.9 555.9,253.7 549.9,262.2" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,236.5 576.0,248.6 555.9,253.7 553.5,234.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,272.6 0.0,246.8 22.5,248.3 22.5,270.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="22.5,272.2 22.5,249.0 46.7,251.0 49.8,254.4 50.8,262.8 46.1,272.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="50.8,262.8 49.8,254.4 68.8,245.9 78.2,253.8 72.7,267.7" fill="#ac9e7b" stroke="#ac9e7b" stroke-width="0.5"/><polygon points="72.7,267.7 78.2,253.8 87.7,251.5 93.7,255.1 96.1,272.4 76.0,277.4" fill="#658655" stroke="#658655" stroke-width="0.5"/><polygon points="96.1,272.4 93.7,255.1 110.2,250.6 115.0,272.2 102.6,276.9" fill="#416b3d" stroke="#416b3d" stroke-width="0.5"/><polygon points="115.0,272.2 109.7,248.4 133.1,249.4 132.7,264.5 120.9,273.8" fill="#4f824a" stroke="#4f824a" stroke-width="0.5"/><polygon points="132.7,264.5 133.2,248.5 158.3,246.2 155.6,272.4 151.4,275.2" fill="#bfb877" stroke="#bfb877" stroke-width="0.5"/><polygon points="155.6,272.4 158.2,247.1 173.4,248.5 180.4,256.0 178.2,277.3" fill="#a39d66" stroke="#a39d66" stroke-width="0.5"/><polygon points="178.8,271.1 180.4,256.0 196.1,253.4 204.5,266.7 194.2,276.2" fill="#948e5c" stroke="#948e5c" stroke-width="0.5"/><polygon points="204.5,266.7 196.1,253.4 201.7,240.5 214.2,242.0 220.5,250.1 213.2,267.7" fill="#3b6238" stroke="#3b6238" stroke-width="0.5"/><polygon points="213.2,267.7 220.5,250.1 234.0,250.3 239.5,265.6 220.9,276.0" fill="#457140" stroke="#457140" stroke-width="0.5"/><polygon points="239.5,265.6 234.0,250.3 243.1,237.9 247.7,239.2 259.2,258.7 257.8,264.0 246.5,268.4" fill="#457241" stroke="#457241" stroke-width="0.5"/><polygon points="257.8,264.0 259.2,258.7 274.0,247.8 283.3,252.3 285.2,269.6 269.2,274.1" fill="#4d7f48" stroke="#4d7f48" stroke-width="0.5"/><polygon points="285.2,269.5 283.3,252.3 293.5,246.1 308.7,249.4 307.0,265.0 288.4,271.6" fill="#4d7e48" stroke="#4d7e48" stroke-width="0.5"/><polygon points="307.0,265.0 308.8,248.3 331.7,253.6 329.6,272.7 315.9,274.3" fill="#477442" stroke="#477442" stroke-width="0.5"/><polygon points="329.8,271.0 331.7,253.6 336.2,249.9 346.0,249.9 355.1,260.2 353.8,271.9 350.1,274.3" fill="#5b9555" stroke="#5b9555" stroke-width="0.5"/><polygon points="353.8,271.9 355.1,260.2 371.4,254.0 379.8,273.0 366.9,279.1" fill="#599353" stroke="#599353" stroke-width="0.5"/><polygon points="379.8,273.0 371.4,254.0 375.3,246.2 397.0,248.4 388.7,275.0" fill="#578e51" stroke="#578e51" stroke-width="0.5"/><polygon points="388.7,275.0 397.0,248.4 402.7,245.3 412.0,249.4 416.1,261.7 406.8,282.4 402.7,283.5 393.8,280.9" fill="#5a9555" stroke="#5a9555" stroke-width="0.5"/><polygon points="416.1,261.7 412.0,249.4 417.2,246.7 445.5,252.4 444.5,260.2 435.8,268.5" fill="#5b9655" stroke="#5b9655" stroke-width="0.5"/><polygon points="444.5,260.2 446.1,247.5 467.7,247.5 473.0,254.2 468.4,271.8 463.8,275.1" fill="#63a35d" stroke="#63a35d" stroke-width="0.5"/><polygon points="468.4,271.8 473.0,254.2 487.1,254.2 496.1,278.7" fill="#b4ad70" stroke="#b4ad70" stroke-width="0.5"/><polygon points="493.9,272.7 487.1,254.2 493.7,247.3 506.6,249.4 511.3,255.8 502.0,271.6" fill="#375a34" stroke="#375a34" stroke-width="0.5"/><polygon points="516.8,283.0 502.0,271.6 511.3,255.8 523.6,257.8 529.1,263.7" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="523.6,257.8 530.2,234.5 540.3,236.5 544.3,265.7 529.1,263.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,248.6 576.0,271.7 549.9,262.2 555.9,253.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,288.0 0.0,272.6 23.8,270.6 23.0,294.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="23.0,293.3 23.8,272.2 46.1,272.2 51.0,284.8 40.5,296.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="51.0,284.8 46.1,272.2 50.9,262.8 72.7,267.7 74.5,272.9 55.4,286.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="55.4,286.0 78.5,270.1 79.8,289.0 66.7,297.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="79.8,289.0 79.0,276.7 96.1,272.4 102.6,276.9 100.7,293.4 94.5,298.3" fill="#3a5f36" stroke="#3a5f36" stroke-width="0.5"/><polygon points="100.7,293.4 102.6,276.9 115.0,272.2 120.9,273.8 125.7,285.6 117.9,298.1" fill="#395e36" stroke="#395e36" stroke-width="0.5"/><polygon points="125.7,285.6 120.9,273.8 132.7,264.5 151.4,275.2 147.8,286.1 142.0,289.4" fill="#426d3e" stroke="#426d3e" stroke-width="0.5"/><polygon points="147.8,286.1 151.4,275.2 155.6,272.4 172.4,276.0 175.7,297.2 173.8,300.1 166.1,302.1 163.1,301.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="175.7,297.2 171.2,268.6 194.2,276.2 196.4,291.8" fill="#736e48" stroke="#736e48" stroke-width="0.5"/><polygon points="196.4,291.8 194.2,276.2 204.5,266.7 213.2,267.7 220.9,276.0 221.2,282.1 201.2,294.8" fill="#918c5b" stroke="#918c5b" stroke-width="0.5"/><polygon points="221.2,282.1 220.9,276.0 239.5,265.6 246.5,268.4 246.5,292.5 230.2,292.5" fill="#a09a64" stroke="#a09a64" stroke-width="0.5"/><polygon points="246.5,291.3 246.5,268.4 257.8,264.0 269.2,274.1 265.6,291.9" fill="#52874d" stroke="#52874d" stroke-width="0.5"/><polygon points="266.0,289.8 269.2,274.1 285.2,269.6 288.4,271.6 292.6,287.4 284.2,294.4" fill="#a09a64" stroke="#a09a64" stroke-width="0.5"/><polygon points="292.6,287.4 288.4,271.6 307.0,265.0 315.9,274.3 309.0,289.3 304.1,291.4" fill="#4f814a" stroke="#4f814a" stroke-width="0.5"/><polygon points="309.0,289.3 315.9,274.3 327.7,273.0 333.8,295.4 328.1,300.4" fill="#5b9656" stroke="#5b9656" stroke-width="0.5"/><polygon points="333.8,295.4 327.0,270.6 350.1,274.3 345.2,294.5" fill="#558d50" stroke="#558d50" stroke-width="0.5"/><polygon points="345.2,294.5 350.1,274.3 353.8,271.9 366.9,279.1 366.3,297.4 357.8,303.4" fill="#619f5b" stroke="#619f5b" stroke-width="0.5"/><polygon points="366.3,297.4 366.9,279.1 379.8,273.0 388.7,275.0 393.8,280.9 379.7,299.3" fill="#579052" stroke="#579052" stroke-width="0.5"/><polygon points="425.2,305.3 406.6,282.4 438.8,282.4" fill="#c4bd7b" stroke="#c4bd7b" stroke-width="0.5"/><polygon points="406.8,282.4 416.1,261.7 435.8,268.5 435.3,282.4" fill="#5f9c59" stroke="#5f9c59" stroke-width="0.5"/><polygon points="435.3,284.7 435.8,268.5 444.5,260.2 463.8,275.1 462.1,281.2 446.2,288.5" fill="#cdc580" stroke="#cdc580" stroke-width="0.5"/><polygon points="462.1,281.2 463.8,275.1 468.4,271.8 489.8,277.1 489.4,290.0 470.5,294.7" fill="#bbb475" stroke="#bbb475" stroke-width="0.5"/><polygon points="489.3,291.1 490.0,273.3 502.0,271.6 516.8,283.0 518.0,289.4 510.8,294.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="518.0,289.4 516.8,283.0 529.1,263.7 542.6,265.5 545.0,279.8 526.5,293.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="530.2,300.8 526.5,293.6 545.0,279.8 553.6,287.1 550.8,303.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,271.7 576.0,282.6 553.6,287.1 545.0,279.8 542.5,264.7 549.9,262.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="0.0,310.9 0.0,288.0 21.6,294.5 15.7,311.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="16.0,310.9 22.0,293.1 40.5,296.6 46.1,313.4 44.8,315.8 34.1,320.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="46.1,313.4 40.5,296.6 51.0,284.8 55.4,286.0 66.7,297.6 66.3,308.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="66.2,309.5 66.7,297.6 79.8,289.0 94.5,298.3 93.8,302.1 82.4,312.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="93.8,302.1 94.5,298.3 100.7,293.4 117.9,298.1 122.8,310.5 114.1,321.4 107.7,320.6" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="122.8,310.5 117.9,298.1 125.7,285.6 142.0,289.4 137.7,306.5 129.8,310.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="137.7,306.5 142.0,289.4 147.7,286.1 163.1,301.5 148.3,311.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="151.5,328.9 148.3,311.4 163.1,301.5 166.1,302.1 162.1,331.7 159.6,332.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="173.8,300.1 175.7,297.2 196.4,291.8 201.2,294.8 205.7,309.7 192.6,318.0 183.7,315.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="205.7,309.7 201.2,294.8 221.2,282.1 230.2,292.5 223.1,308.8 211.5,312.2" fill="#757049" stroke="#757049" stroke-width="0.5"/><polygon points="223.1,308.8 230.2,292.5 244.9,292.5 247.6,320.9 240.4,322.5" fill="#a29c65" stroke="#a29c65" stroke-width="0.5"/><polygon points="247.3,317.8 244.8,291.2 263.5,291.9 266.2,310.7" fill="#beb777" stroke="#beb777" stroke-width="0.5"/><polygon points="266.2,310.7 263.1,289.1 284.2,294.4 284.2,310.6 273.6,314.9" fill="#b3ad70" stroke="#b3ad70" stroke-width="0.5"/><polygon points="284.2,310.6 284.2,294.4 292.6,287.4 304.1,291.4 303.1,313.2 302.7,313.6 295.1,315.7" fill="#beb777" stroke="#beb777" stroke-width="0.5"/><polygon points="303.1,313.2 304.1,291.4 309.0,289.3 328.1,300.4 326.6,307.9" fill="#bcb576" stroke="#bcb576" stroke-width="0.5"/><polygon points="326.6,307.9 328.1,300.4 333.8,295.4 345.2,294.5 357.8,303.4 357.1,311.1 353.8,316.5 332.7,321.6" fill="#bfb878" stroke="#bfb878" stroke-width="0.5"/><polygon points="357.1,311.1 357.8,303.4 366.3,297.4 379.7,299.3 389.7,315.5 382.7,323.0" fill="#b3ac70" stroke="#b3ac70" stroke-width="0.5"/><polygon points="389.8,315.8 379.7,299.3 393.8,280.9 402.7,283.5 401.2,307.6" fill="#b9b273" stroke="#b9b273" stroke-width="0.5"/><polygon points="401.2,307.6 402.7,283.5 406.7,282.4 425.2,305.3 425.2,307.9 419.6,311.7" fill="#c2bb79" stroke="#c2bb79" stroke-width="0.5"/><polygon points="425.2,307.9 425.2,305.3 437.1,285.3 446.2,288.5 451.0,307.6 438.5,314.5" fill="#77734b" stroke="#77734b" stroke-width="0.5"/><polygon points="451.0,307.6 446.2,288.5 462.1,281.2 470.5,294.7 467.7,305.6 462.0,310.3" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="467.7,305.6 470.5,294.7 490.5,289.7 490.5,313.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="490.5,310.5 490.5,291.3 510.8,294.5 506.8,310.5" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="506.8,310.5 510.8,294.5 518.0,289.4 526.5,293.6 530.2,300.8 527.2,315.8 512.2,317.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="532.6,321.9 527.2,315.8 530.2,300.8 550.8,303.0 555.3,310.5 551.2,317.2" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="576.0,282.6 576.0,310.5 555.3,310.5 550.8,303.0 553.6,287.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,339.9 0.0,310.9 14.4,311.8 11.8,337.0 5.7,340.4" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="11.8,337.0 14.6,310.1 34.1,320.5 29.0,338.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="44.8,315.8 46.1,313.4 67.5,308.3 67.5,334.8 62.1,340.2 56.4,337.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="67.5,334.8 67.5,309.7 82.4,312.2 87.9,330.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="87.9,330.5 82.4,312.2 93.8,302.1 107.7,320.6 89.7,331.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="115.0,323.4 114.1,321.4 122.8,310.5 129.7,310.5 141.0,330.2 133.5,335.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="129.8,310.5 137.7,306.5 148.3,311.4 151.5,328.9 141.0,330.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="162.1,331.7 166.1,302.1 173.8,300.1 183.7,315.8 170.1,331.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="170.1,331.4 183.7,315.8 192.6,318.0 195.0,334.5 182.9,340.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="195.0,334.5 192.6,318.0 205.7,309.7 211.5,312.2 215.7,338.1 206.2,339.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="214.9,333.0 211.5,312.2 223.1,308.8 240.4,322.5 231.7,333.3" fill="#7a764c" stroke="#7a764c" stroke-width="0.5"/><polygon points="243.1,319.4 266.2,310.7 273.6,314.9 272.3,332.6 258.7,336.9" fill="#948f5d" stroke="#948f5d" stroke-width="0.5"/><polygon points="272.3,332.6 273.6,314.9 284.2,310.6 295.1,315.7 290.1,336.0 283.5,339.3" fill="#a39d66" stroke="#a39d66" stroke-width="0.5"/><polygon points="290.1,336.0 295.1,315.7 302.7,313.6 313.2,329.8 305.8,340.6" fill="#b8b173" stroke="#b8b173" stroke-width="0.5"/><polygon points="313.2,329.8 302.7,313.6 303.1,313.2 326.6,307.9 332.7,321.6 330.1,328.4" fill="#c1ba79" stroke="#c1ba79" stroke-width="0.5"/><polygon points="333.0,336.3 330.1,328.4 332.7,321.6 353.8,316.5 359.1,334.9 346.4,343.3" fill="#726d47" stroke="#726d47" stroke-width="0.5"/><polygon points="359.1,334.9 353.8,316.5 357.1,311.1 382.7,323.0 381.7,327.2 368.7,338.2" fill="#858053" stroke="#858053" stroke-width="0.5"/><polygon points="396.1,345.2 381.7,327.2 382.7,323.0 390.0,315.1 409.1,331.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="409.1,331.5 390.3,315.4 401.2,307.6 419.6,311.7 414.7,330.8" fill="#7d784e" stroke="#7d784e" stroke-width="0.5"/><polygon points="414.7,330.8 419.6,311.7 425.2,307.9 438.5,314.5 439.9,327.8 426.1,340.4" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="439.9,327.8 438.5,314.5 451.0,307.6 462.0,310.3 464.9,328.3 460.2,335.8 458.2,336.2" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="464.9,328.3 462.0,310.3 467.7,305.6 488.1,312.9 486.9,326.9" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="486.6,330.8 488.3,310.5 506.8,310.5 512.2,317.6 507.0,330.8" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="507.0,330.8 512.2,317.6 527.2,315.8 532.6,321.9 532.2,331.3 512.6,338.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="532.2,331.3 532.6,321.9 551.2,317.2 556.5,338.1 538.3,339.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,310.5 576.0,338.0 556.6,338.6 551.2,317.2 555.3,310.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="14.8,364.8 5.7,340.4 11.8,337.0 29.0,338.7 32.7,343.4 33.0,360.5 24.6,367.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="32.7,343.4 29.0,338.7 34.1,320.5 44.8,315.8 56.4,337.5" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="33.0,360.5 32.7,343.4 56.4,337.5 62.1,340.2 63.4,346.9 47.3,363.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="63.4,346.9 62.1,340.2 67.5,334.8 87.9,330.5 89.7,331.4 96.2,350.7 89.8,359.1 78.5,360.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="96.2,350.7 89.7,331.4 107.7,320.6 114.1,321.4 115.0,323.4 110.9,348.9" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="110.9,348.9 115.0,323.4 133.5,335.8 129.5,355.9 126.4,356.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="129.5,355.9 133.5,335.8 141.0,330.2 151.5,328.9 159.6,332.9 158.2,342.6 136.8,358.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="158.2,342.6 159.6,332.9 162.1,331.7 170.1,331.4 182.9,340.6 182.4,360.0 174.7,364.4 170.6,363.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="182.4,360.0 182.9,340.6 195.0,334.5 206.2,339.9 195.2,361.9" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="202.4,368.3 195.2,361.9 206.2,339.9 209.2,339.3 223.4,359.8 219.0,365.1" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="223.4,359.8 204.7,332.9 231.7,333.3 237.0,355.9" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="237.5,358.5 231.7,333.3 240.4,322.5 245.0,321.4 258.7,336.9 253.7,354.2" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="253.7,354.2 258.7,336.9 272.3,332.6 283.5,339.3 282.0,359.1 267.5,363.5" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="282.0,359.1 283.5,339.3 290.1,336.0 305.8,340.6 310.6,353.8 302.0,361.8 289.7,363.7" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="310.6,353.8 305.8,340.6 313.2,329.8 330.1,328.4 333.0,336.3 321.0,355.1" fill="#9ea1a4" stroke="#9ea1a4" stroke-width="0.5"/><polygon points="321.0,355.1 333.0,336.3 346.4,343.3 348.8,364.6 330.4,365.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="348.7,364.0 346.4,343.3 359.1,334.9 368.7,338.2 373.6,356.5" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="373.6,356.5 368.7,338.2 381.7,327.2 396.1,345.2 395.1,356.9 379.5,359.8" fill="#6a6642" stroke="#6a6642" stroke-width="0.5"/><polygon points="395.1,356.9 396.1,345.2 409.1,331.5 414.7,330.8 426.1,340.4 426.3,342.7 415.0,359.3 400.7,360.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="426.3,342.7 426.1,340.4 439.9,327.8 458.2,336.2 443.7,354.3" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="445.8,363.7 443.7,354.3 458.2,336.2 460.2,335.8 472.9,352.3 463.2,368.6" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="472.9,352.3 460.2,335.8 464.9,328.3 490.9,326.6 486.0,351.0" fill="#345631" stroke="#345631" stroke-width="0.5"/><polygon points="486.0,351.0 490.0,330.8 507.0,330.8 512.6,338.7 512.6,346.9 498.4,361.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="512.6,346.9 512.6,338.7 532.2,331.3 538.3,339.8 532.3,355.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="534.5,361.9 532.3,355.8 538.3,339.8 557.3,338.0 551.9,367.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,338.0 576.0,365.9 552.4,365.0 557.2,338.6" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="0.0,371.2 0.0,339.9 5.7,340.4 14.8,364.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="61.4,396.0 28.4,396.0 24.6,367.1 33.0,360.5 47.3,363.9 61.4,388.3" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="61.4,388.3 47.3,363.9 63.4,346.9 78.5,360.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="108.4,396.0 61.4,396.0 61.4,388.3 78.5,360.1 89.8,359.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="107.5,394.4 89.8,359.1 96.2,350.7 110.9,348.9 126.4,356.7" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="145.5,396.0 106.7,396.0 126.4,356.7 129.5,355.9 136.8,358.6 147.2,370.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="147.2,370.9 136.8,358.6 158.2,342.6 170.6,363.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="176.8,396.0 145.5,396.0 147.2,370.9 170.6,363.1 174.7,364.4" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="198.9,396.0 176.8,396.0 174.7,364.4 182.4,360.0 195.2,361.9 202.4,368.3" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="228.8,396.0 198.9,396.0 202.4,368.3 219.0,365.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="243.6,396.0 228.8,396.0 219.0,365.1 223.4,359.8 241.2,354.7" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="262.6,396.0 243.6,396.0 241.4,357.5 253.7,354.2 267.5,363.5" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="289.2,396.0 262.6,396.0 267.5,363.5 282.0,359.1 289.7,363.7" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="319.1,396.0 289.2,396.0 289.7,363.7 302.0,361.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="317.5,392.7 302.0,361.8 310.6,353.8 321.0,355.1 330.4,365.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="357.6,396.0 315.9,396.0 330.4,365.8 348.4,364.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="373.5,396.0 357.6,396.0 348.2,364.2 373.6,356.5 379.5,359.8" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="401.5,396.0 373.5,396.0 379.5,359.8 395.1,356.9 400.7,360.8" fill="#8f8366" stroke="#8f8366" stroke-width="0.5"/><polygon points="429.2,396.0 401.5,396.0 400.7,360.8 415.0,359.3 431.6,377.0" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="431.6,377.0 415.0,359.3 426.3,342.7 443.7,354.3 445.8,363.7" fill="#7c8177" stroke="#7c8177" stroke-width="0.5"/><polygon points="475.4,396.0 429.2,396.0 431.6,377.0 445.8,363.7 463.2,368.6" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="475.3,395.8 463.2,368.6 472.9,352.3 486.0,351.0 498.4,361.1 498.4,361.1" fill="#3d7ea6" stroke="#3d7ea6" stroke-width="0.5"/><polygon points="519.4,396.0 475.2,396.0 498.4,361.1 518.8,377.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="518.8,377.9 498.4,361.1 498.4,361.1 512.6,346.9 532.3,355.8 534.5,361.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="550.2,396.0 519.4,396.0 518.8,377.9 534.5,361.9 549.2,366.8" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="576.0,365.9 576.0,396.0 550.2,396.0 549.2,364.9" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/><polygon points="28.4,396.0 0.0,396.0 0.0,371.2 14.8,364.8 24.6,367.1" fill="#1f4e6b" stroke="#1f4e6b" stroke-width="0.5"/></g><path d="M164.2,37.2 L165.7,23.8 M165.7,23.8 L175.5,20.0 M175.5,20.0 L186.2,23.4 M186.2,23.4 L195.8,20.2 M195.8,20.2 L202.7,23.3 M202.7,23.3 L222.9,11.9 M222.9,11.9 L230.3,41.3 M246.6,33.5 L249.3,24.1 M249.3,24.1 L275.1,21.4 M275.0,22.5 L283.5,18.5 M283.5,18.5 L294.7,22.4 M294.7,22.4 L300.4,39.3 M342.7,22.3 L355.5,24.0 M355.5,24.0 L355.5,49.9 M334.7,33.0 L342.7,22.3 M90.6,57.9 L91.7,48.5 M91.7,48.5 L110.6,43.8 M110.6,43.8 L120.0,51.3 M120.0,51.3 L135.1,29.1 M135.1,29.1 L144.1,41.9 M144.1,41.9 L154.3,44.6 M154.3,44.6 L164.2,37.2 M228.3,39.3 L246.6,33.5 M300.4,39.3 L310.7,42.0 M310.7,42.0 L319.9,30.9 M319.9,30.9 L334.7,33.0 M363.3,51.3 L377.1,34.1 M377.1,34.1 L393.4,43.5 M393.4,43.5 L391.7,51.7 M391.7,51.7 L393.5,56.0 M95.8,77.7 L92.3,58.2 M355.5,49.9 L363.3,51.3 M393.5,56.0 L404.7,65.1 M404.7,65.1 L418.5,63.2 M418.5,63.2 L418.5,85.5 M60.2,100.7 L52.9,85.0 M52.9,85.0 L67.5,73.4 M67.5,73.4 L79.6,84.2 M79.6,84.2 L91.1,84.1 M91.1,84.1 L95.8,77.7 M420.5,87.6 L438.3,86.3 M438.3,86.3 L442.1,89.1 M442.1,89.1 L444.2,99.2 M46.0,114.5 L60.2,100.7 M53.0,124.2 L46.0,114.5 M330.8,127.3 L318.7,131.2 M335.5,130.0 L330.8,127.3 M375.8,127.6 L353.3,131.7 M378.8,129.6 L375.8,127.6 M425.0,129.2 L405.1,130.2 M446.9,101.9 L463.6,104.7 M463.6,104.7 L468.4,111.6 M472.0,113.4 L483.8,109.7 M483.8,109.7 L498.4,123.6 M498.4,123.6 L490.1,136.3 M40.3,149.6 L53.0,124.2 M291.5,145.3 L290.5,147.0 M290.5,147.0 L275.0,152.1 M300.1,142.8 L291.5,145.3 M338.2,148.7 L335.5,130.0 M359.1,125.3 L357.3,145.3 M357.3,145.3 L344.0,152.0 M344.0,152.0 L338.2,148.7 M381.9,145.1 L378.8,129.6 M405.1,130.2 L400.9,150.1 M400.9,150.1 L381.9,145.1 M428.0,143.9 L425.0,129.2 M445.7,150.4 L428.0,143.9 M468.4,111.6 L472.0,113.4 M490.1,136.3 L490.4,140.5 M42.1,156.8 L42.4,149.5 M275.0,152.1 L271.2,166.4 M271.2,166.4 L258.7,170.3 M318.7,131.2 L322.3,160.3 M322.3,160.3 L300.1,142.8 M446.4,157.1 L445.7,150.4 M467.4,170.5 L446.4,157.1 M490.4,140.5 L496.1,148.4 M496.1,148.4 L504.4,152.0 M504.4,152.0 L506.9,162.1 M42.2,183.2 L36.9,164.6 M36.9,164.6 L42.1,156.8 M258.7,170.3 L257.8,188.8 M506.9,162.1 L516.1,167.4 M516.1,167.4 L518.0,188.7 M45.0,202.5 L41.2,183.5 M46.0,203.0 L45.0,202.5 M257.8,188.8 L269.2,196.7 M269.2,196.7 L266.9,214.1 M266.9,214.1 L247.4,214.1 M465.4,199.7 L461.0,178.6 M461.0,178.6 L467.4,170.5 M516.3,187.6 L528.3,196.6 M528.3,196.6 L529.6,211.5 M48.9,229.2 L46.0,203.0 M247.4,214.1 L240.5,232.5 M452.3,223.7 L444.0,211.0 M444.0,211.0 L449.1,202.6 M449.1,202.6 L465.4,199.7 M529.6,211.5 L527.8,232.3 M46.7,251.0 L48.7,229.3 M49.8,254.4 L46.7,251.0 M240.5,232.5 L243.1,237.9 M247.7,239.2 L266.3,232.9 M266.3,232.9 L270.4,235.7 M270.4,235.7 L274.0,247.8 M417.2,246.7 L428.5,231.6 M428.5,231.6 L445.7,237.7 M445.7,237.7 L452.3,223.7 M527.8,232.3 L530.2,234.5 M530.2,234.5 L523.6,257.8 M50.8,262.8 L49.8,254.4 M72.7,267.7 L50.8,262.8 M76.0,277.4 L72.7,267.7 M243.1,237.9 L247.7,239.2 M274.0,247.8 L283.3,252.3 M283.3,252.3 L293.5,246.1 M293.5,246.1 L308.7,249.4 M308.8,248.3 L331.7,253.6 M331.7,253.6 L336.2,249.9 M336.2,249.9 L346.0,249.9 M346.0,249.9 L355.1,260.2 M355.1,260.2 L371.4,254.0 M371.4,254.0 L375.3,246.2 M375.3,246.2 L397.0,248.4 M397.0,248.4 L402.7,245.3 M402.7,245.3 L412.0,249.4 M412.0,249.4 L417.2,246.7 M523.6,257.8 L529.1,263.7 M79.8,289.0 L79.0,276.7 M94.5,298.3 L79.8,289.0 M529.1,263.7 L542.6,265.5 M542.6,265.5 L545.0,279.8 M545.0,279.8 L526.5,293.6 M93.8,302.1 L94.5,298.3 M114.1,321.4 L107.7,320.6 M107.7,320.6 L93.8,302.1 M159.6,332.9 L151.5,328.9 M526.5,293.6 L530.2,300.8 M530.2,300.8 L527.2,315.8 M527.2,315.8 L512.2,317.6 M115.0,323.4 L114.1,321.4 M141.0,330.2 L133.5,335.8 M133.5,335.8 L115.0,323.4 M151.5,328.9 L141.0,330.2 M512.2,317.6 L507.0,330.8 M507.0,330.8 L486.6,330.8 M158.2,342.6 L159.6,332.9 M182.4,360.0 L174.7,364.4 M174.7,364.4 L170.6,363.1 M170.6,363.1 L158.2,342.6 M195.2,361.9 L182.4,360.0 M202.4,368.3 L195.2,361.9 M223.4,359.8 L219.0,365.1 M219.0,365.1 L202.4,368.3 M237.0,355.9 L223.4,359.8 M348.8,364.6 L330.4,365.8 M415.0,359.3 L400.7,360.8 M472.9,352.3 L463.2,368.6 M463.2,368.6 L445.8,363.7 M490.9,326.6 L486.0,351.0 M486.0,351.0 L472.9,352.3 M243.6,396.0 L241.4,357.5 M330.4,365.8 L317.5,392.7 M357.6,396.0 L348.2,364.2 M400.7,360.8 L401.5,396.0 M431.6,377.0 L415.0,359.3 M445.8,363.7 L431.6,377.0" fill="none" stroke="#283640" stroke-width="2.0" stroke-linecap="round"/><g opacity="0.9"><path d="M99.0,243.0 L85.5,265.5" fill="none" stroke="#4a82af" stroke-width="1.4" stroke-linecap="round" stroke-linejoin="round"/><path d="M121.5,238.5 L99.0,243.0" fill="none" stroke="#4a82af" stroke-width="1.2" stroke-linecap="round" stroke-linejoin="round"/><path d="M227.2,164.2 L247.5,180.0" fill="none" stroke="#4a82af" stroke-width="1.0" stroke-linecap="round" stroke-linejoin="round"/><path d="M205.9,151.9 L227.2,164.2" fill="none" stroke="#4a82af" stroke-width="0.9" stroke-linecap="round" stroke-linejoin="round"/></g></svg>
|
|
@@ -72,6 +72,29 @@ def render_age(land_age: float, seed: int) -> str:
|
|
|
72
72
|
return RegionalSVGRenderer(scale=MAP_SCALE).render(t)
|
|
73
73
|
|
|
74
74
|
|
|
75
|
+
# A coarse 8×8 "painted" land/elevation mask (0 = sea … 1 = high) — the kind of
|
|
76
|
+
# hint a host or LLM hands mapwright to art-direct the continent's macro shape.
|
|
77
|
+
_HINT_MASK = [
|
|
78
|
+
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
|
79
|
+
[0.0, 0.2, 0.5, 0.6, 0.5, 0.2, 0.0, 0.0],
|
|
80
|
+
[0.0, 0.5, 0.9, 0.7, 0.4, 0.3, 0.2, 0.0],
|
|
81
|
+
[0.0, 0.6, 0.8, 0.3, 0.0, 0.0, 0.3, 0.0],
|
|
82
|
+
[0.0, 0.5, 0.6, 0.2, 0.0, 0.0, 0.4, 0.0],
|
|
83
|
+
[0.0, 0.3, 0.7, 0.6, 0.5, 0.6, 0.7, 0.0],
|
|
84
|
+
[0.0, 0.0, 0.3, 0.6, 0.8, 0.6, 0.3, 0.0],
|
|
85
|
+
[0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0],
|
|
86
|
+
]
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def render_hint(seed: int = 11) -> str:
|
|
90
|
+
"""A continent whose macro shape is art-directed by an `elevation_hint`
|
|
91
|
+
(a coarse painted mask); mapwright fills in coasts, erosion, rivers, climate."""
|
|
92
|
+
cfg = WorldMapConfig(sea_level=0.42, edge_falloff=0.3, mountain_density=0.6)
|
|
93
|
+
t = RegionalTerrainGenerator(SeededRNG(seed)).generate(
|
|
94
|
+
MAP_W, MAP_H, config=cfg, elevation_hint=_HINT_MASK)
|
|
95
|
+
return RegionalSVGRenderer(scale=MAP_SCALE).render(t)
|
|
96
|
+
|
|
97
|
+
|
|
75
98
|
def render_template(template: str, sea_level: float, seed: int) -> str:
|
|
76
99
|
cfg = WorldMapConfig(sea_level=sea_level)
|
|
77
100
|
t = RegionalTerrainGenerator(SeededRNG(seed)).generate(MAP_W, MAP_H, config=cfg, template=template)
|
|
@@ -195,6 +218,7 @@ def main() -> None:
|
|
|
195
218
|
emit("template-atoll", render_template("atoll", 0.55, seed=8))
|
|
196
219
|
emit("age-young", render_age(0.0, seed=103))
|
|
197
220
|
emit("age-old", render_age(1.0, seed=103))
|
|
221
|
+
emit("hint", render_hint(seed=11))
|
|
198
222
|
emit("theme-parchment", render_themed("parchment"))
|
|
199
223
|
emit("theme-neon", render_themed("neon"))
|
|
200
224
|
emit("theme-dune", render_themed("dune"))
|
|
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "mapwright"
|
|
7
|
-
version = "0.
|
|
7
|
+
version = "0.19.0"
|
|
8
8
|
description = "Domain-neutral procedural fantasy map & world generation: Voronoi terrain, hydraulic erosion, biomes, rivers, Markov place-names, and shaded-relief SVG."
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
requires-python = ">=3.10"
|
|
@@ -40,6 +40,7 @@ import math
|
|
|
40
40
|
from collections import deque
|
|
41
41
|
from dataclasses import asdict, dataclass, field
|
|
42
42
|
from enum import IntEnum
|
|
43
|
+
from typing import Callable, Sequence, Union
|
|
43
44
|
|
|
44
45
|
import numpy as np
|
|
45
46
|
|
|
@@ -47,6 +48,12 @@ from . import _geometry, _serde
|
|
|
47
48
|
from .config import WorldMapConfig
|
|
48
49
|
from .rng import SeededRNG
|
|
49
50
|
|
|
51
|
+
# A caller-supplied macro shape for the land: either a coarse 2D grid of
|
|
52
|
+
# elevations (rows = north→south, cols = west→east; any numeric range — only the
|
|
53
|
+
# relative ordering matters) bilinearly sampled across the map, or a callable
|
|
54
|
+
# ``f(x_norm, y_norm) -> elevation`` taking normalised coords in [0, 1].
|
|
55
|
+
ElevationHint = Union[Sequence[Sequence[float]], np.ndarray, Callable[[float, float], float]]
|
|
56
|
+
|
|
50
57
|
|
|
51
58
|
class Biome(IntEnum):
|
|
52
59
|
"""Coarse biome classes. Mapping to a host app's tile vocabulary is the
|
|
@@ -237,6 +244,7 @@ class RegionalTerrainGenerator:
|
|
|
237
244
|
cell_area: float = 6.0,
|
|
238
245
|
relax_iterations: int = 2,
|
|
239
246
|
template: str = "",
|
|
247
|
+
elevation_hint: ElevationHint | None = None,
|
|
240
248
|
) -> TerrainResult:
|
|
241
249
|
"""Run the full pipeline and return terrain for a ``width×height`` grid.
|
|
242
250
|
|
|
@@ -249,6 +257,16 @@ class RegionalTerrainGenerator:
|
|
|
249
257
|
``"volcano"``) selects a composed-op heightmap *archetype* instead of the
|
|
250
258
|
default tectonic-plate auto-generation; ``config`` still drives sea level,
|
|
251
259
|
climate, rivers, etc. on top of it.
|
|
260
|
+
|
|
261
|
+
``elevation_hint`` lets a host (or an LLM) **art-direct the macro shape** —
|
|
262
|
+
where land, sea and high ground sit — while mapwright fills in organic
|
|
263
|
+
coastlines, erosion, rivers and climate. Pass a coarse 2D grid of
|
|
264
|
+
elevations (e.g. a 16×16 nested list; rows north→south, cols west→east) or
|
|
265
|
+
a callable ``f(x_norm, y_norm) -> elevation`` over normalised [0, 1] coords.
|
|
266
|
+
Only the *relative* ordering of the values matters; ``sea_level`` still sets
|
|
267
|
+
how much floods (the lowest ``sea_level`` fraction of the hinted surface
|
|
268
|
+
becomes water). It takes precedence over ``template``. Set
|
|
269
|
+
``edge_falloff=0`` in the config to let the hint place land at the borders.
|
|
252
270
|
"""
|
|
253
271
|
cfg = config or WorldMapConfig()
|
|
254
272
|
sea_level = cfg.sea_level
|
|
@@ -259,7 +277,8 @@ class RegionalTerrainGenerator:
|
|
|
259
277
|
cell_of, seeds = _geometry.voronoi_grid(width, height, seeds, relax_iterations)
|
|
260
278
|
cells = self._build_cells(seeds, cell_of)
|
|
261
279
|
|
|
262
|
-
self._init_heightmap(cells, width, height, cfg, template=template
|
|
280
|
+
self._init_heightmap(cells, width, height, cfg, template=template,
|
|
281
|
+
elevation_hint=elevation_hint)
|
|
263
282
|
for cell in cells:
|
|
264
283
|
cell.is_water = cell.height < sea_level
|
|
265
284
|
|
|
@@ -336,9 +355,36 @@ class RegionalTerrainGenerator:
|
|
|
336
355
|
res *= 2
|
|
337
356
|
return total / norm
|
|
338
357
|
|
|
358
|
+
def _sample_hint(self, hint: ElevationHint, centroids: np.ndarray,
|
|
359
|
+
width: int, height: int) -> np.ndarray:
|
|
360
|
+
"""Sample a caller's elevation hint at each cell centroid → an array of
|
|
361
|
+
per-cell elevations. ``hint`` is a callable over normalised [0,1] coords,
|
|
362
|
+
or a 2D grid (rows north→south, cols west→east) bilinearly interpolated."""
|
|
363
|
+
xn = np.clip(centroids[:, 0] / max(1, width), 0.0, 1.0)
|
|
364
|
+
yn = np.clip(centroids[:, 1] / max(1, height), 0.0, 1.0)
|
|
365
|
+
if callable(hint):
|
|
366
|
+
sampled = np.array([float(hint(float(x), float(y))) for x, y in zip(xn, yn)])
|
|
367
|
+
else:
|
|
368
|
+
grid = np.asarray(hint, dtype=float)
|
|
369
|
+
if grid.ndim != 2 or grid.size == 0:
|
|
370
|
+
raise ValueError("elevation_hint grid must be a non-empty 2D array")
|
|
371
|
+
gh, gw = grid.shape
|
|
372
|
+
u, v = xn * (gw - 1), yn * (gh - 1) # fractional grid coords
|
|
373
|
+
x0, y0 = np.floor(u).astype(int), np.floor(v).astype(int)
|
|
374
|
+
x1, y1 = np.minimum(x0 + 1, gw - 1), np.minimum(y0 + 1, gh - 1)
|
|
375
|
+
fx, fy = u - x0, v - y0
|
|
376
|
+
top = grid[y0, x0] * (1 - fx) + grid[y0, x1] * fx
|
|
377
|
+
bot = grid[y1, x0] * (1 - fx) + grid[y1, x1] * fx
|
|
378
|
+
sampled = top * (1 - fy) + bot * fy
|
|
379
|
+
# A non-finite hint (NaN/inf from a buggy callable or grid) would silently
|
|
380
|
+
# poison every height; fail loudly instead.
|
|
381
|
+
if not np.all(np.isfinite(sampled)):
|
|
382
|
+
raise ValueError("elevation_hint produced non-finite values (NaN/inf)")
|
|
383
|
+
return sampled
|
|
384
|
+
|
|
339
385
|
def _init_heightmap(
|
|
340
386
|
self, cells: list[TerrainCell], width: int, height: int, cfg: WorldMapConfig,
|
|
341
|
-
template: str = "",
|
|
387
|
+
template: str = "", elevation_hint: ElevationHint | None = None,
|
|
342
388
|
) -> None:
|
|
343
389
|
cx, cy = width / 2, height / 2
|
|
344
390
|
diag = math.hypot(width, height)
|
|
@@ -346,6 +392,20 @@ class RegionalTerrainGenerator:
|
|
|
346
392
|
d_true = np.sqrt((centroids[:, 0] - cx) ** 2 + (centroids[:, 1] - cy) ** 2) / (diag / 2)
|
|
347
393
|
n_cells = len(cells)
|
|
348
394
|
|
|
395
|
+
# Hint mode (caller art-directs the macro shape) — highest precedence. The
|
|
396
|
+
# hint sets *where* land/high ground sit; mapwright still adds organic
|
|
397
|
+
# coastline detail (fbm) and runs the full erosion/hydrology/climate
|
|
398
|
+
# pipeline. Normalised to [0,1] so any input range works; sea level + the
|
|
399
|
+
# land_age gamma in _finalize_heights then do their usual job.
|
|
400
|
+
if elevation_hint is not None:
|
|
401
|
+
h = self._sample_hint(elevation_hint, centroids, width, height)
|
|
402
|
+
hmin, hmax = float(h.min()), float(h.max())
|
|
403
|
+
h = (h - hmin) / max(1e-9, hmax - hmin)
|
|
404
|
+
coast = (self._fbm(centroids, width, height, octaves=5, base_res=3) - 0.5) * 2.0
|
|
405
|
+
raw = (h - 0.5) * 2.0 + 0.25 * coast
|
|
406
|
+
self._finalize_heights(cells, raw, d_true, cfg)
|
|
407
|
+
return
|
|
408
|
+
|
|
349
409
|
# Template mode (Azgaar-style composed ops) — an alternative to the default
|
|
350
410
|
# tectonic auto-generation, for controllable continent archetypes.
|
|
351
411
|
if template in TERRAIN_TEMPLATES:
|
|
@@ -201,6 +201,70 @@ class TestTemplates:
|
|
|
201
201
|
assert a == b
|
|
202
202
|
|
|
203
203
|
|
|
204
|
+
class TestElevationHint:
|
|
205
|
+
def test_none_hint_is_byte_identical_to_default(self):
|
|
206
|
+
a = [c.height for c in _gen(7, 40, 28).cells]
|
|
207
|
+
b = [c.height for c in _gen(7, 40, 28, elevation_hint=None).cells]
|
|
208
|
+
assert a == b
|
|
209
|
+
|
|
210
|
+
def test_grid_hint_places_land_where_painted(self):
|
|
211
|
+
# West low, east high → land concentrates in the east half.
|
|
212
|
+
grid = [[0.1, 0.1, 0.9, 0.9] for _ in range(4)]
|
|
213
|
+
cfg = WorldMapConfig(sea_level=0.5, edge_falloff=0.0)
|
|
214
|
+
land = [c for c in _gen(7, 40, 28, config=cfg, elevation_hint=grid).cells
|
|
215
|
+
if not c.is_water]
|
|
216
|
+
west = sum(1 for c in land if c.cx < 20)
|
|
217
|
+
east = sum(1 for c in land if c.cx >= 20)
|
|
218
|
+
assert east > 3 * max(1, west)
|
|
219
|
+
|
|
220
|
+
def test_callable_hint_places_land_in_a_central_disk(self):
|
|
221
|
+
def disk(x, y):
|
|
222
|
+
return 1.0 - ((x - 0.5) ** 2 + (y - 0.5) ** 2) ** 0.5
|
|
223
|
+
cfg = WorldMapConfig(sea_level=0.45)
|
|
224
|
+
land = [c for c in _gen(7, 40, 28, config=cfg, elevation_hint=disk).cells
|
|
225
|
+
if not c.is_water]
|
|
226
|
+
mx = sum(c.cx for c in land) / len(land)
|
|
227
|
+
my = sum(c.cy for c in land) / len(land)
|
|
228
|
+
assert 15 < mx < 25 and 9 < my < 19 # ~map centre (20, 14)
|
|
229
|
+
|
|
230
|
+
def test_hint_is_deterministic(self):
|
|
231
|
+
grid = [[0.2, 0.8], [0.8, 0.2]]
|
|
232
|
+
a = [c.height for c in _gen(7, 36, 24, elevation_hint=grid).cells]
|
|
233
|
+
b = [c.height for c in _gen(7, 36, 24, elevation_hint=grid).cells]
|
|
234
|
+
assert a == b
|
|
235
|
+
|
|
236
|
+
def test_hint_still_forms_rivers_and_water(self):
|
|
237
|
+
grid = [[0.0, 0.3, 0.0], [0.3, 1.0, 0.3], [0.0, 0.3, 0.0]]
|
|
238
|
+
t = _gen(7, 70, 50, config=WorldMapConfig(sea_level=0.45), elevation_hint=grid)
|
|
239
|
+
assert any(c.is_water for c in t.cells)
|
|
240
|
+
assert any(not c.is_water for c in t.cells)
|
|
241
|
+
assert t.rivers # erosion/hydrology still runs on the hinted surface
|
|
242
|
+
|
|
243
|
+
def test_hint_takes_precedence_over_template(self):
|
|
244
|
+
grid = [[0.9, 0.1], [0.9, 0.1]]
|
|
245
|
+
cfg = WorldMapConfig(edge_falloff=0.0)
|
|
246
|
+
with_hint = [c.is_water for c in
|
|
247
|
+
_gen(7, 40, 28, config=cfg, template="atoll", elevation_hint=grid).cells]
|
|
248
|
+
just_template = [c.is_water for c in
|
|
249
|
+
_gen(7, 40, 28, config=cfg, template="atoll").cells]
|
|
250
|
+
assert with_hint != just_template
|
|
251
|
+
|
|
252
|
+
def test_invalid_hint_raises(self):
|
|
253
|
+
import pytest
|
|
254
|
+
for bad in ([1, 2, 3], [], [[]], "nope"):
|
|
255
|
+
with pytest.raises(ValueError):
|
|
256
|
+
_gen(1, 24, 18, elevation_hint=bad)
|
|
257
|
+
|
|
258
|
+
def test_non_finite_hint_raises(self):
|
|
259
|
+
import math
|
|
260
|
+
|
|
261
|
+
import pytest
|
|
262
|
+
with pytest.raises(ValueError):
|
|
263
|
+
_gen(1, 24, 18, elevation_hint=lambda x, y: float("nan"))
|
|
264
|
+
with pytest.raises(ValueError):
|
|
265
|
+
_gen(1, 24, 18, elevation_hint=[[0.0, math.inf], [0.0, 0.0]])
|
|
266
|
+
|
|
267
|
+
|
|
204
268
|
class TestParameters:
|
|
205
269
|
def test_higher_sea_level_means_more_water(self):
|
|
206
270
|
from mapwright.config import WorldMapConfig
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|