diff --git a/Cargo.lock b/Cargo.lock
index 9d5960f..fe470f8 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -595,16 +595,6 @@ dependencies = [
"crossbeam-utils",
]
-[[package]]
-name = "crossbeam-skiplist"
-version = "0.1.3"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "df29de440c58ca2cc6e587ec3d22347551a32435fbde9d2bff64e78a9ffa151b"
-dependencies = [
- "crossbeam-epoch",
- "crossbeam-utils",
-]
-
[[package]]
name = "crossbeam-utils"
version = "0.8.22"
@@ -2111,7 +2101,6 @@ dependencies = [
"chrono",
"ciborium",
"clap",
- "crossbeam-skiplist",
"dashmap",
"either",
"futures",
@@ -2119,6 +2108,7 @@ dependencies = [
"humantime",
"insta",
"itertools 0.15.0",
+ "libsqlite3-sys",
"moka",
"moro-local",
"object_store",
@@ -3233,7 +3223,6 @@ dependencies = [
"log",
"memchr",
"percent-encoding",
- "rustls",
"serde",
"serde_json",
"sha2 0.10.9",
@@ -3243,7 +3232,6 @@ dependencies = [
"tokio-stream",
"tracing",
"url",
- "webpki-roots",
]
[[package]]
@@ -4360,12 +4348,10 @@ checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e"
name = "workspace-hack"
version = "0.1.0"
dependencies = [
- "aws-lc-rs",
"base64",
"bitflags",
"cc",
"chrono",
- "crossbeam-epoch",
"crossbeam-utils",
"either",
"event-listener",
diff --git a/Cargo.toml b/Cargo.toml
index 68ec307..44ce405 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -35,6 +35,7 @@ http = { version = "1.4.0" }
humantime = { version = "2.1.0" }
insta = { version = "1.47.2" }
itertools = { version = "0.15.0" }
+libsqlite3-sys = { version = "0.30.1" }
moka = { version = "0.12.15", features = ["sync"] }
moro-local = { version = "0.4.0" }
object_store = { version = "0.14.0", features = ["gcp", "http"] }
diff --git a/libs/opsqueue_python/tests/test_roundtrip.py b/libs/opsqueue_python/tests/test_roundtrip.py
index 23d9a14..2e887ac 100644
--- a/libs/opsqueue_python/tests/test_roundtrip.py
+++ b/libs/opsqueue_python/tests/test_roundtrip.py
@@ -667,3 +667,32 @@ def test_lookup_too_many_submission_ids_by_strategic_metadata() -> None:
)
assert exc.type is TooManyMatchingSubmissionsError
assert exc.value.max_submissions == max_
+
+
+def test_prefer_distinct_strategy_fairness(opsqueue: OpsqueueProcess) -> None:
+ """Test the PreferDistinct strategy fairly interleaves chunks from different
+ submissions based on their strategic metadata.
+
+ """
+ url = "file:///tmp/opsqueue/test_prefer_distinct_fairness"
+ producer_client = ProducerClient(f"localhost:{opsqueue.port}", url)
+ consumer_client = ConsumerClient(f"localhost:{opsqueue.port}", url)
+ company_ids = [1, 2, 3]
+ chunks_per_company = 4
+ company_id_per_submission = {}
+ for company_id in company_ids:
+ sub_id = producer_client.insert_submission(
+ [company_id] * chunks_per_company,
+ chunk_size=1,
+ strategic_metadata={"company_id": company_id},
+ )
+ company_id_per_submission[sub_id] = company_id
+ strategy = strategy_from_description(("PreferDistinct", "company_id", "Oldest"))
+ reserved_company_order = []
+ # Fetch 1 chunk at a time. Because we don't complete chunks, opsqueue's
+ # metastate tracks them as reserved, increasing the busy count for that
+ # company.
+ for _ in range(len(company_ids) * chunks_per_company):
+ [chunk] = consumer_client.reserve_chunks(strategy=strategy)
+ reserved_company_order.append(company_id_per_submission[chunk.submission_id])
+ assert reserved_company_order == [1, 2, 3] * chunks_per_company
diff --git a/opsqueue/Cargo.toml b/opsqueue/Cargo.toml
index 82d562a..75daf32 100644
--- a/opsqueue/Cargo.toml
+++ b/opsqueue/Cargo.toml
@@ -29,6 +29,7 @@ ux.workspace = true
anyhow.workspace = true
# Database:
sqlx = { workspace = true, optional = true }
+libsqlite3-sys = { workspace = true, optional = true }
# Serialization:
serde.workspace = true
serde_json.workspace = true
@@ -69,7 +70,6 @@ clap.workspace = true
humantime.workspace = true
dashmap.workspace = true
-crossbeam-skiplist.workspace = true
sqlformat.workspace = true
workspace-hack.workspace = true
@@ -90,6 +90,7 @@ required-features = ["server-logic"]
# Dependencies only in use by the server-logic:
server-logic = [
"dep:sqlx",
+ "dep:libsqlite3-sys",
"dep:opentelemetry-otlp",
"dep:opentelemetry-semantic-conventions",
"dep:moka",
diff --git a/opsqueue/benches/chunks_select_bench.svg b/opsqueue/benches/chunks_select_bench.svg
index 1df4bd6..fdcebee 100644
--- a/opsqueue/benches/chunks_select_bench.svg
+++ b/opsqueue/benches/chunks_select_bench.svg
@@ -39,84 +39,84 @@ z
-
-
-
+
+
-
-
-
+
+
@@ -124,16 +124,16 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
-
+
@@ -210,11 +210,11 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -264,11 +264,11 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -305,11 +305,11 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -352,11 +352,11 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -404,16 +404,16 @@ z
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
-
+
@@ -421,11 +421,11 @@ L 0 2
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -433,11 +433,11 @@ L 52.720915 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -445,11 +445,11 @@ L 57.915728 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -457,11 +457,11 @@ L 93.13386 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -469,11 +469,11 @@ L 111.016873 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -481,11 +481,11 @@ L 123.705072 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -493,11 +493,11 @@ L 133.546804 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -505,11 +505,11 @@ L 141.588085 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -517,11 +517,11 @@ L 148.386891 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -529,11 +529,11 @@ L 154.276285 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -541,11 +541,11 @@ L 159.471098 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -553,11 +553,11 @@ L 194.689229 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -565,11 +565,11 @@ L 212.572242 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -577,11 +577,11 @@ L 225.260442 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -589,11 +589,11 @@ L 235.102174 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -601,11 +601,11 @@ L 243.143455 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -613,11 +613,11 @@ L 249.942261 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -625,11 +625,11 @@ L 255.831654 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -637,11 +637,11 @@ L 261.026468 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -649,11 +649,11 @@ L 296.244599 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -661,11 +661,11 @@ L 314.127612 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -673,11 +673,11 @@ L 326.815811 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -685,11 +685,11 @@ L 336.657543 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -697,11 +697,11 @@ L 344.698824 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -709,11 +709,11 @@ L 351.49763 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -721,11 +721,11 @@ L 357.387024 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -733,11 +733,11 @@ L 362.581837 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -745,11 +745,11 @@ L 397.799968 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -757,11 +757,11 @@ L 415.682981 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -769,11 +769,11 @@ L 428.371181 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -781,11 +781,11 @@ L 438.212913 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -793,11 +793,11 @@ L 446.254194 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -805,11 +805,11 @@ L 453.053 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -817,11 +817,11 @@ L 458.942393 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -829,11 +829,11 @@ L 464.137207 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -841,11 +841,11 @@ L 499.355338 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -853,11 +853,11 @@ L 517.238351 48.482812
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -1251,23 +1251,23 @@ z
-
+
-
-
+
-
+
@@ -1276,18 +1276,18 @@ L -3.5 0
-
+
-
+
-
+
@@ -1296,18 +1296,18 @@ L 532.078437 270.441087
-
+
-
+
-
+
@@ -1316,18 +1316,18 @@ L 532.078437 214.951518
-
+
-
+
-
+
@@ -1336,18 +1336,18 @@ L 532.078437 159.46195
-
+
-
+
-
+
@@ -1358,11 +1358,11 @@ L 532.078437 103.972381
+" clip-path="url(#p9766e11a9e)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
@@ -1388,558 +1388,486 @@ z
-
+
-
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -2218,25 +2146,25 @@ z
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -2516,13 +2444,13 @@ Q 319.634844 82.684219 321.434844 82.684219
z
" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
-
+
-
+
@@ -2657,13 +2585,13 @@ z
-
+
-
+
@@ -2720,96 +2648,96 @@ z
-
-
-
+
+
-
-
-
+
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -2822,14 +2750,14 @@ L 598.962647 48.482812
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -2842,14 +2770,14 @@ L 700.518017 48.482812
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -2862,14 +2790,14 @@ L 802.073386 48.482812
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -2882,14 +2810,14 @@ L 903.628756 48.482812
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -2902,458 +2830,458 @@ L 1005.184125 48.482812
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -3391,115 +3319,115 @@ L 1066.32655 48.482812
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
+
+
+" clip-path="url(#pba62c91b52)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -3511,543 +3439,507 @@ L 1068.478437 48.482812
-
-
-
+
+
+
-
+
-
+
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -4109,74 +4001,74 @@ L 1068.478437 51.064955
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -4242,13 +4134,13 @@ Q 856.034844 82.684219 857.834844 82.684219
z
" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
-
+
-
+
@@ -4294,13 +4186,13 @@ L 877.634844 60.271406
-
+
-
+
@@ -4327,128 +4219,128 @@ z
-
-
-
+
+
-
-
-
+
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -4461,14 +4353,14 @@ L 1141.75686 48.482812
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -4481,14 +4373,14 @@ L 1241.929174 48.482812
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -4501,14 +4393,14 @@ L 1342.101487 48.482812
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -4521,14 +4413,14 @@ L 1442.273801 48.482812
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -4541,470 +4433,470 @@ L 1542.446114 48.482812
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
-
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -5042,115 +4934,115 @@ L 1602.755856 48.482812
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
-
+
+
+
-
+
-
+
-
+
-
-
+
+
+" clip-path="url(#p05342ab53a)" style="fill: none; stroke-dasharray: 0.8,1.32; stroke-dashoffset: 0; stroke: #b0b0b0; stroke-opacity: 0.5; stroke-width: 0.8"/>
-
+
-
+
@@ -5162,567 +5054,507 @@ L 1604.878437 48.482812
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
@@ -5784,106 +5616,106 @@ L 1604.878437 50.987189
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
@@ -5934,13 +5766,13 @@ Q 1392.434844 82.684219 1394.234844 82.684219
z
" style="fill: #ffffff; opacity: 0.8; stroke: #cccccc; stroke-linejoin: miter"/>
-
+
-
+
@@ -5986,13 +5818,13 @@ L 1414.034844 60.271406
-
+
-
+
@@ -6084,13 +5916,13 @@ z
-
+
-
+
-
+