unifi-network-maps 1.4.15__py3-none-any.whl → 1.5.0__py3-none-any.whl

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.
Files changed (74) hide show
  1. unifi_network_maps/__init__.py +1 -1
  2. unifi_network_maps/adapters/unifi.py +80 -96
  3. unifi_network_maps/assets/icons/modern/ap.svg +9 -0
  4. unifi_network_maps/assets/icons/modern/camera.svg +9 -0
  5. unifi_network_maps/assets/icons/modern/client.svg +9 -0
  6. unifi_network_maps/assets/icons/modern/game_console.svg +10 -0
  7. unifi_network_maps/assets/icons/modern/gateway.svg +17 -0
  8. unifi_network_maps/assets/icons/modern/iot.svg +9 -0
  9. unifi_network_maps/assets/icons/modern/nas.svg +9 -0
  10. unifi_network_maps/assets/icons/modern/other.svg +10 -0
  11. unifi_network_maps/assets/icons/modern/phone.svg +10 -0
  12. unifi_network_maps/assets/icons/modern/printer.svg +9 -0
  13. unifi_network_maps/assets/icons/modern/speaker.svg +10 -0
  14. unifi_network_maps/assets/icons/modern/switch.svg +10 -0
  15. unifi_network_maps/assets/icons/modern/tv.svg +10 -0
  16. unifi_network_maps/assets/icons/modern-flat/ap.svg +5 -0
  17. unifi_network_maps/assets/icons/modern-flat/camera.svg +5 -0
  18. unifi_network_maps/assets/icons/modern-flat/client.svg +5 -0
  19. unifi_network_maps/assets/icons/modern-flat/game_console.svg +6 -0
  20. unifi_network_maps/assets/icons/modern-flat/gateway.svg +13 -0
  21. unifi_network_maps/assets/icons/modern-flat/iot.svg +5 -0
  22. unifi_network_maps/assets/icons/modern-flat/nas.svg +5 -0
  23. unifi_network_maps/assets/icons/modern-flat/other.svg +6 -0
  24. unifi_network_maps/assets/icons/modern-flat/phone.svg +6 -0
  25. unifi_network_maps/assets/icons/modern-flat/printer.svg +5 -0
  26. unifi_network_maps/assets/icons/modern-flat/speaker.svg +6 -0
  27. unifi_network_maps/assets/icons/modern-flat/switch.svg +6 -0
  28. unifi_network_maps/assets/icons/modern-flat/tv.svg +6 -0
  29. unifi_network_maps/assets/themes/dark.yaml +53 -10
  30. unifi_network_maps/assets/themes/default.yaml +34 -0
  31. unifi_network_maps/assets/themes/minimal-dark.yaml +98 -0
  32. unifi_network_maps/assets/themes/minimal.yaml +92 -0
  33. unifi_network_maps/assets/themes/unifi-dark.yaml +97 -0
  34. unifi_network_maps/assets/themes/unifi.yaml +92 -0
  35. unifi_network_maps/cli/args.py +54 -0
  36. unifi_network_maps/cli/main.py +18 -7
  37. unifi_network_maps/cli/render.py +79 -27
  38. unifi_network_maps/cli/runtime.py +29 -15
  39. unifi_network_maps/io/debug.py +2 -1
  40. unifi_network_maps/io/export.py +19 -13
  41. unifi_network_maps/io/mock_data.py +5 -3
  42. unifi_network_maps/io/paths.py +5 -3
  43. unifi_network_maps/model/classify.py +199 -0
  44. unifi_network_maps/model/clients.py +271 -0
  45. unifi_network_maps/model/connection.py +37 -0
  46. unifi_network_maps/model/diff.py +544 -0
  47. unifi_network_maps/model/edges.py +558 -0
  48. unifi_network_maps/model/helpers.py +64 -0
  49. unifi_network_maps/model/lldp.py +20 -25
  50. unifi_network_maps/model/mock.py +110 -23
  51. unifi_network_maps/model/snapshot.py +294 -0
  52. unifi_network_maps/model/topology.py +143 -951
  53. unifi_network_maps/model/topology_coerce.py +339 -0
  54. unifi_network_maps/model/vlans.py +32 -46
  55. unifi_network_maps/model/wan.py +132 -0
  56. unifi_network_maps/render/device_ports_md.py +39 -97
  57. unifi_network_maps/render/device_summary.py +53 -0
  58. unifi_network_maps/render/lldp_md.py +29 -219
  59. unifi_network_maps/render/markdown_tables.py +8 -0
  60. unifi_network_maps/render/mermaid.py +11 -2
  61. unifi_network_maps/render/mkdocs.py +2 -1
  62. unifi_network_maps/render/svg.py +566 -908
  63. unifi_network_maps/render/svg_icons.py +231 -0
  64. unifi_network_maps/render/svg_isometric.py +1196 -0
  65. unifi_network_maps/render/svg_labels.py +184 -0
  66. unifi_network_maps/render/svg_theme.py +166 -32
  67. unifi_network_maps/render/theme.py +86 -1
  68. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/METADATA +107 -31
  69. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/RECORD +73 -31
  70. unifi_network_maps/assets/icons/isometric/printer.svg +0 -122
  71. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/WHEEL +0 -0
  72. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/entry_points.txt +0 -0
  73. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/licenses/LICENSE +0 -0
  74. {unifi_network_maps-1.4.15.dist-info → unifi_network_maps-1.5.0.dist-info}/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: unifi-network-maps
3
- Version: 1.4.15
3
+ Version: 1.5.0
4
4
  Summary: Dynamic UniFi -> network maps in mermaid or svg
5
5
  Author: Merlijn
6
6
  License-Expression: MIT
@@ -26,13 +26,17 @@ Requires-Dist: python-dotenv==1.2.1
26
26
  Requires-Dist: PyYAML==6.0.3
27
27
  Requires-Dist: Jinja2==3.1.6
28
28
  Provides-Extra: dev
29
+ Requires-Dist: cairosvg==2.8.2; extra == "dev"
29
30
  Requires-Dist: Faker==40.1.2; extra == "dev"
30
31
  Requires-Dist: behave==1.3.3; extra == "dev"
32
+ Requires-Dist: Pillow==12.1.0; extra == "dev"
31
33
  Requires-Dist: pre-commit==4.5.1; extra == "dev"
32
34
  Requires-Dist: pytest==9.0.2; extra == "dev"
33
35
  Requires-Dist: pytest-cov==7.0.0; extra == "dev"
34
36
  Requires-Dist: pyright==1.1.408; extra == "dev"
35
- Requires-Dist: ruff==0.14.14; extra == "dev"
37
+ Requires-Dist: radon==6.0.1; extra == "dev"
38
+ Requires-Dist: ruff==0.15.0; extra == "dev"
39
+ Requires-Dist: xenon==0.9.3; extra == "dev"
36
40
  Dynamic: license-file
37
41
 
38
42
  # unifi-network-maps
@@ -158,6 +162,54 @@ unifi-network-maps --format json --output ./payload.json
158
162
  The live Home Assistant integration (Config Flow + coordinator + custom card) lives in a separate repo:
159
163
  - https://github.com/merlijntishauser/unifi-network-maps-ha
160
164
 
165
+ ## Programmatic API
166
+
167
+ Beyond the CLI, you can use the library programmatically for topology comparison and change detection.
168
+
169
+ ### Topology Diff API
170
+
171
+ Compare two topology snapshots to detect network changes:
172
+
173
+ ```python
174
+ from unifi_network_maps.model.topology import Topology
175
+
176
+ # Create or load topologies
177
+ old_topology = Topology.from_dict(json.load(open("old_snapshot.json")))
178
+ new_topology = Topology(devices=devices, clients=clients, edges=edges)
179
+
180
+ # Compare and get structured change events
181
+ diff = old_topology.diff(new_topology)
182
+
183
+ for event in diff.events:
184
+ print(f"{event.event_type}: {event.description}")
185
+ # Example: "node_added: Device 'switch-2' appeared on network"
186
+ # Example: "node_changed: Client 'laptop' changed VLAN from 10 to 20"
187
+
188
+ # Serialize for persistence or MQTT
189
+ json_str = diff.to_json()
190
+ ```
191
+
192
+ Event types:
193
+ - `node_added` / `node_removed` / `node_changed` - Device or client changes
194
+ - `edge_added` / `edge_removed` / `edge_changed` - Connection changes
195
+
196
+ Each event includes:
197
+ - `event_type`, `entity_type` (device/client), `identifier` (MAC)
198
+ - `name`, `description` (human-readable)
199
+ - `details` (full snapshot or change dict)
200
+
201
+ Serialize topology snapshots for storage:
202
+
203
+ ```python
204
+ # Save snapshot
205
+ snapshot = topology.to_dict()
206
+ json.dump(snapshot, open("topology.json", "w"))
207
+
208
+ # Load snapshot
209
+ data = json.load(open("topology.json"))
210
+ topology = Topology.from_dict(data)
211
+ ```
212
+
161
213
  ## Examples (mock data)
162
214
 
163
215
  These examples are generated from `examples/mock_data.json` (safe, anonymized fixture).
@@ -178,6 +230,13 @@ unifi-network-maps --mock-data examples/mock_data.json --include-ports --inclu
178
230
 
179
231
  ![Isometric network example](examples/output/network_ports_clients_iso.svg)
180
232
 
233
+ ### Themes & Icon Sets
234
+
235
+ Built-in themes (`--theme`) and icon sets (`--icon-set`) can be combined freely.
236
+ Regenerate this overview with `make theme-matrix`.
237
+
238
+ ![Theme × icon-set matrix](examples/themes/theme_matrix.png)
239
+
181
240
  Mermaid example with ports:
182
241
 
183
242
  ```mermaid
@@ -204,9 +263,6 @@ graph TB
204
263
  See `examples/mkdocs/` for a ready-to-use setup that renders Mermaid diagrams
205
264
  with Material for MkDocs, including a sample `unifi-network` page and legend.
206
265
 
207
- The built-in themes live at `src/unifi_network_maps/assets/themes/default.yaml` and
208
- `src/unifi_network_maps/assets/themes/dark.yaml`.
209
-
210
266
 
211
267
  ## Options
212
268
 
@@ -220,44 +276,63 @@ Source:
220
276
  Mock:
221
277
  - `--generate-mock`: write mock data JSON and exit.
222
278
  - `--mock-seed`: seed for deterministic mock generation.
223
- - `--mock-switches`: number of switches to generate.
224
- - `--mock-aps`: number of access points to generate.
225
- - `--mock-wired-clients`: number of wired clients to generate.
226
- - `--mock-wireless-clients`: number of wireless clients to generate.
279
+ - `--mock-switches`: number of switches to generate (default 1).
280
+ - `--mock-aps`: number of access points to generate (default 2).
281
+ - `--mock-wired-clients`: number of wired clients to generate (default 2).
282
+ - `--mock-wireless-clients`: number of wireless clients to generate (default 2).
227
283
 
228
284
  Functional:
229
285
  - `--include-ports`: show port labels (Mermaid shows both ends; SVG shows compact labels).
230
- - `--include-clients`: add active wired clients as leaf nodes.
286
+ - `--include-clients`: add active clients as leaf nodes.
231
287
  - `--client-scope wired|wireless|all`: which client types to include (default wired).
232
- - `--only-unifi`: only include neighbors that are UniFi devices; when clients are included, filters to UniFi-managed clients (by explicit UniFi flags or vendor/OUI).
288
+ - `--collapse-clients`: group clients by uplink device into cluster nodes with count badges.
289
+ - `--only-unifi`: only include neighbors that are UniFi devices; when clients are included, filters to UniFi-managed clients.
233
290
  - `--no-cache`: disable UniFi API cache reads and writes.
234
291
 
235
292
  Mermaid:
236
- - `--direction LR|TB`: diagram direction for Mermaid (default TB).
237
- - `--group-by-type`: group nodes by gateway/switch/AP in Mermaid subgraphs.
238
- - `--legend-scale`: scale legend font/link sizes for Mermaid outputs (default 1.0).
293
+ - `--direction LR|TB`: diagram direction (default TB).
294
+ - `--group-by-type`: group nodes by gateway/switch/AP in subgraphs.
295
+ - `--legend-scale`: scale legend font/link sizes (default 1.0).
239
296
  - `--legend-style auto|compact|diagram`: legend rendering mode (auto uses compact for mkdocs).
240
- - `--legend-only`: render just the legend as a separate Mermaid graph (Mermaid only).
297
+ - `--legend-only`: render just the legend as a separate Mermaid graph.
241
298
 
242
299
  SVG:
243
300
  - `--svg-width/--svg-height`: override SVG output dimensions.
244
- - `--theme-file`: load a YAML theme for Mermaid + SVG colors (see `examples/theme.yaml` and `examples/theme-dark.yaml`).
301
+ - `--theme`: built-in theme (`unifi`, `unifi-dark`, `minimal`, `classic`, `classic-dark`).
302
+ - `--theme-file`: custom theme YAML (takes priority over `--theme`; see `examples/theme.yaml`).
303
+ - `--icon-set isometric|modern`: icon set to use (default: determined by theme, or `isometric`).
304
+ - `--svg-layout-mode physical|grouped`: layout mode for SVG output (default physical).
305
+ - `--wan-label/--wan-speed`: WAN1 ISP name and provisioned speed.
306
+ - `--wan2-label/--wan2-speed`: WAN2 ISP name and provisioned speed.
307
+ - `--max-vlan-colors`: limit VLAN colors shown on edges (default: no limit).
308
+ - `--include-vlan-legend`: add VLAN color legend to SVG output.
245
309
 
246
310
  Output:
247
311
  - `--format mermaid|svg|svg-iso|lldp-md|mkdocs|json`: output format (default mermaid).
248
312
  - `--stdout`: write output to stdout.
249
- - `--markdown`: wrap Mermaid output in a code fence.
250
- - `--mkdocs-sidebar-legend`: write assets to place the compact legend in the MkDocs right sidebar.
313
+ - `--output`: write output to file.
314
+ - `--markdown`: wrap Mermaid output in a code fence for notes tools like Obsidian.
315
+ - `--mkdocs-sidebar-legend`: write sidebar legend assets next to the output file.
251
316
  - `--mkdocs-dual-theme`: render light/dark Mermaid blocks for Material theme switching.
252
- - `--mkdocs-timestamp-zone`: timezone for mkdocs timestamp (`Europe/Amsterdam` default; use `off` to disable).
317
+ - `--mkdocs-timestamp-zone`: timezone for mkdocs timestamp (default `Europe/Amsterdam`; use `off` to disable).
253
318
 
254
319
  Debug:
255
320
  - `--debug-dump`: dump gateway + sample devices to stderr for debugging.
256
321
  - `--debug-sample N`: number of non-gateway devices in debug dump (default 2).
257
322
 
258
- ## Theme file
323
+ ## Themes
324
+
325
+ Five built-in themes are available via `--theme`:
259
326
 
260
- Example theme YAML (override only the values you want):
327
+ | Theme | Style | Default icon set |
328
+ |-------|-------|-----------------|
329
+ | `unifi` | Clean light theme based on the [ui.com](https://ui.com) color palette | modern |
330
+ | `unifi-dark` | Dark variant using official Ubiquiti dark surface colors | modern |
331
+ | `minimal` | Neutral grey tones, understated | isometric |
332
+ | `classic` | Warm default palette with distinct device colors | isometric |
333
+ | `classic-dark` | Dark variant of classic | modern |
334
+
335
+ For custom colors, create a theme YAML and pass it with `--theme-file`. Override only the values you need:
261
336
 
262
337
  ```yaml
263
338
  mermaid:
@@ -267,28 +342,29 @@ mermaid:
267
342
  stroke: "#d98300"
268
343
  poe_link: "#1e88e5"
269
344
  svg:
345
+ icon_set: modern
346
+ grid_color: "#c0c8d0"
347
+ background: "#f9fafa"
270
348
  links:
271
349
  standard:
272
- from: "#2ecc71"
273
- to: "#1b8f4a"
274
- poe:
275
- from: "#1e88e5"
276
- to: "#0d47a1"
350
+ from: "#006fff"
351
+ to: "#0560d4"
277
352
  nodes:
278
353
  switch:
279
- from: "#d6ecff"
280
- to: "#b6dcff"
354
+ from: "#4dd88a"
355
+ to: "#38cc65"
281
356
  ```
282
357
 
358
+ See `examples/theme.yaml` and `examples/theme-dark.yaml` for full examples.
359
+
283
360
  ## Notes
284
361
 
285
362
  - Default output is top-to-bottom (TB) and rendered as a hop-based tree from the gateway(s).
286
363
  - Nodes are color-coded by type (gateway/switch/AP/client) with a sensible default palette.
287
- - PoE links are highlighted in blue and annotated with a power icon when detected from `port_table`.
364
+ - PoE links are annotated with a power icon when detected from `port_table`.
288
365
  - Wireless client links render as dashed lines to indicate the last-known upstream.
289
- - SVG output uses vendored device glyphs from `src/unifi_network_maps/assets/icons`.
290
- - Isometric SVG output uses MIT-licensed icons from `markmanx/isopacks`.
291
366
  - SVG port labels render inside child nodes for readability.
367
+ - Icon licenses and attribution are documented in [LICENSES.md](LICENSES.md).
292
368
 
293
369
 
294
370
  ## AI Disclosure
@@ -1,8 +1,8 @@
1
- unifi_network_maps/__init__.py,sha256=hbkjjRMZQ6Z1DxtYr5zQQkJBgg7BX1jvecmMzfI1XL8,23
1
+ unifi_network_maps/__init__.py,sha256=X9pTeGHIYZtDOmfb9pnn2DEqWZMAyaPlqdFwEhsuSvk,22
2
2
  unifi_network_maps/__main__.py,sha256=XsOjaqslAVgyVlOTokjVddZ2iT8apZXpJ_OB-9WEEe4,179
3
3
  unifi_network_maps/adapters/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
4
4
  unifi_network_maps/adapters/config.py,sha256=gnvgAj9wPmYGGQfhcZSHRkcVGojODUYIINU_ztTcuUc,1671
5
- unifi_network_maps/adapters/unifi.py,sha256=1a7NBLszpBhLnepp9WhQ5cF-HRToIG0foOA-H5xUiDI,19328
5
+ unifi_network_maps/adapters/unifi.py,sha256=R5R-blCqruM-FS5BNXdQvDzNfTtHtnEL8i_aRmvrVDg,19073
6
6
  unifi_network_maps/assets/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
7
7
  unifi_network_maps/assets/icons/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
8
8
  unifi_network_maps/assets/icons/access-point.svg,sha256=RJOgO2s9Ino5lWRrh4V7q8Jdwffros5bQq3UeDuQYF4,742
@@ -34,7 +34,6 @@ unifi_network_maps/assets/icons/isometric/office.svg,sha256=0Uo-uH931RLW3VXgL8fz
34
34
  unifi_network_maps/assets/icons/isometric/package-module.svg,sha256=nlC_IX-toVU9d2I6DSJ4mI9nrlvi_-KBkxCVWG0HvWQ,2036
35
35
  unifi_network_maps/assets/icons/isometric/paymentcard.svg,sha256=qvzkYH8dEmyWEbHKg8xo-CbwNHSskQuV5FVbYz2Lalk,6026
36
36
  unifi_network_maps/assets/icons/isometric/plane.svg,sha256=sZbJKpD22pMV0DBeMbtBDAXEx8J4V9DvXUKOrnif788,13712
37
- unifi_network_maps/assets/icons/isometric/printer.svg,sha256=qMM-SawojVCp_NLMDuXWOxWHJHuHjl8JjYojU6ZnHoc,10348
38
37
  unifi_network_maps/assets/icons/isometric/pyramid.svg,sha256=UeGfxq7XqKGLCxg-h8iS8E-HnDievrI4rngRM2O5KZg,2000
39
38
  unifi_network_maps/assets/icons/isometric/queue.svg,sha256=MiFWbzikrEejXu_NDQEyRVa9a37xvykWV0V92NxVk4I,2595
40
39
  unifi_network_maps/assets/icons/isometric/router.svg,sha256=Ah_nQpBsL0Me3tFK4yMZIvykC9rmqEuMxMfDTzpHG50,3192
@@ -48,40 +47,83 @@ unifi_network_maps/assets/icons/isometric/truck-2.svg,sha256=I7MFGbXW2fmr9WdD29N
48
47
  unifi_network_maps/assets/icons/isometric/truck.svg,sha256=BrpBr9Qf8hplQIrBpfhN2USxUlPvGCKahlV5e-G13r0,7195
49
48
  unifi_network_maps/assets/icons/isometric/user.svg,sha256=bYpr0t8rETJ1M7RDTWaNkK-nfF3kq9eMxmxYCthNmE0,23026
50
49
  unifi_network_maps/assets/icons/isometric/vm.svg,sha256=in6x9cdS6JgQVJl0KAbA79rap4X140dfIBCuxmgQI7s,3694
51
- unifi_network_maps/assets/themes/dark.yaml,sha256=6n4_H6MZbA6DKLdF2eaNcCXYLKNJjVjNN9gmwZX97sA,932
52
- unifi_network_maps/assets/themes/default.yaml,sha256=F2Jj18NmdaJ_zyERvGAn8NEWBwapjtozrtZUxayd5AU,849
50
+ unifi_network_maps/assets/icons/modern/ap.svg,sha256=DXSioH4DKbESAaXfulVBJ4rCW2F08yISq3ks_QG8T4g,1864
51
+ unifi_network_maps/assets/icons/modern/camera.svg,sha256=2xTOJ9aQZjeTTu35gaqYAGeKcHZa8ucSuY8l3cTZh1E,536
52
+ unifi_network_maps/assets/icons/modern/client.svg,sha256=7gx_ic2RZ1khikABrbFpFyqTgA-wUcmP5Yy5KN1NLkY,1049
53
+ unifi_network_maps/assets/icons/modern/game_console.svg,sha256=RqLZR3i86-EeHxOtoTWHJ0fi8vabQwmgWMYhiGB_UjY,1179
54
+ unifi_network_maps/assets/icons/modern/gateway.svg,sha256=FyMSbEF94sd5QrFc0SEUzmHbPtNvhh3m7BGfBHU-O2g,2549
55
+ unifi_network_maps/assets/icons/modern/iot.svg,sha256=Rk9TPeH2A5MHQNxjtfkhodS3KgNP_WQUQxozVvrc_x0,624
56
+ unifi_network_maps/assets/icons/modern/nas.svg,sha256=Shtk13dex90tvQl9FihOBZw8-kQQr5c8Q_49XqEQ3es,704
57
+ unifi_network_maps/assets/icons/modern/other.svg,sha256=3xN6npx1n-WMWI9aTTEI0aD41uRDz-E_i8dGXBbchfg,1073
58
+ unifi_network_maps/assets/icons/modern/phone.svg,sha256=FY9K8LneCwcIq_48v0Ib-xJBVZsil5wCe9FWTdAu0Ns,844
59
+ unifi_network_maps/assets/icons/modern/printer.svg,sha256=oU9vIcYrkPqFvTeucA17Z9P_DSH5Z06bxwC_79_QAQw,1194
60
+ unifi_network_maps/assets/icons/modern/speaker.svg,sha256=DndlR494zJBLV_IHl4f50uw2PgKll2xHUu-8Km7Z86M,832
61
+ unifi_network_maps/assets/icons/modern/switch.svg,sha256=3xN6npx1n-WMWI9aTTEI0aD41uRDz-E_i8dGXBbchfg,1073
62
+ unifi_network_maps/assets/icons/modern/tv.svg,sha256=sbk65ecMUSZfUjabJ6N2vrmcUBdrSqXbJRyGi1ZSbvM,748
63
+ unifi_network_maps/assets/icons/modern-flat/ap.svg,sha256=AqnJPFfx7ZW2oT1NxXiVYK_8MqMmfPxD0zai1pN6KQs,623
64
+ unifi_network_maps/assets/icons/modern-flat/camera.svg,sha256=MGuvZ69wl2EOWYehiOeYZ3EudfseQsppBSqrgknWs_0,380
65
+ unifi_network_maps/assets/icons/modern-flat/client.svg,sha256=wsqPHONH2zGXGMEMCeGWPRIdfGitvivk11CHccD-xdg,545
66
+ unifi_network_maps/assets/icons/modern-flat/game_console.svg,sha256=um_ttY10CQc8wCqyIiNfMsrF8abxuN_7J8YFsA1uQAM,1037
67
+ unifi_network_maps/assets/icons/modern-flat/gateway.svg,sha256=1HcmNAA1qFoyKovHBPH-C0-wu2bI1JvzuNBbA8wVons,2240
68
+ unifi_network_maps/assets/icons/modern-flat/iot.svg,sha256=LgQ_nvimSjjzi47rsi-QpO9LQi16XUUZO1NykpVoXlM,504
69
+ unifi_network_maps/assets/icons/modern-flat/nas.svg,sha256=hO-h4AuXRzRJuCLErM-WbhnUVWHtXCY9keTBbzCVeVA,547
70
+ unifi_network_maps/assets/icons/modern-flat/other.svg,sha256=6X9QXN20vN9WgdfMFAQO573R06RwVtaaujJc81bOZHM,525
71
+ unifi_network_maps/assets/icons/modern-flat/phone.svg,sha256=jVL-EK98Skf3GnKnHXgMXCsIDLIZ4HRyDABeQeO3GFE,668
72
+ unifi_network_maps/assets/icons/modern-flat/printer.svg,sha256=NN9VrbWZFh2xw6CbVjM_CgvUrmyuFPHG-NAcoB8cakQ,1037
73
+ unifi_network_maps/assets/icons/modern-flat/speaker.svg,sha256=S7ZP52pXkjxWBea9b3trcoSRtUus7wJin4mSv-FrKGA,656
74
+ unifi_network_maps/assets/icons/modern-flat/switch.svg,sha256=qIKxevcxdS1staZZwemnX290mLpv4vjBKx8IXR8oYPk,684
75
+ unifi_network_maps/assets/icons/modern-flat/tv.svg,sha256=IGV1hpHuK6GtnLCJdC0CHFNN6pjZmTxPbNNx5-V-6pA,572
76
+ unifi_network_maps/assets/themes/dark.yaml,sha256=XfVPnDBstNQL-uW8Ev-oRXH3q7Wd_JLzlzCaXwBvVLc,1969
77
+ unifi_network_maps/assets/themes/default.yaml,sha256=_HkWfetPwUVLh_21ZdYgLSy2HogW0sR0gZxppW8sWF4,1688
78
+ unifi_network_maps/assets/themes/minimal-dark.yaml,sha256=k2MXmy_AOmTBASqFfgpBpMDVinCIQpXyouQnQH3BnhU,1905
79
+ unifi_network_maps/assets/themes/minimal.yaml,sha256=3rSdlnpj0uFl7H90lQYbYXo2vRKGPL6SiDbQxChDwVI,1732
80
+ unifi_network_maps/assets/themes/unifi-dark.yaml,sha256=AlbyfQx5b36v2Wtv5fEVWYibmH5imwuZm2qK5ptvkMA,1852
81
+ unifi_network_maps/assets/themes/unifi.yaml,sha256=yZDibrPgG8uadhB888yDr5m1M2axIgJ9yfgTCJnSdnQ,1722
53
82
  unifi_network_maps/cli/__init__.py,sha256=cds9GvFNZmYAR22Ab3TSzfriSAW--kf9jvC5U-21AoA,70
54
83
  unifi_network_maps/cli/__main__.py,sha256=nK_jh78VW3h3DRvSpjzpcf64zkCqniP2k82xUR9Hw2I,147
55
- unifi_network_maps/cli/args.py,sha256=ro3x8Yn77j7gcmJIyLDmpVsmYiYrXrzkF2LZ6QUQmHA,5560
56
- unifi_network_maps/cli/main.py,sha256=W-iScP6x4zGRTrc3v_3bTgxkeyOCOBiRfqIjJqRiq3o,7088
57
- unifi_network_maps/cli/render.py,sha256=wuvsC-In-ApbaQxBn8-UofB7jCiqUnjluGXRCRZpg5A,7535
58
- unifi_network_maps/cli/runtime.py,sha256=cMtIShERup2z2_uCcEGcaJFJptvdI0L3FDWqKFwSevY,4830
84
+ unifi_network_maps/cli/args.py,sha256=vkCQlRDzlsDWKZSQ5F5ucV3J8_hh9mEzAAQ8zZrtx5s,7281
85
+ unifi_network_maps/cli/main.py,sha256=EpWVf_huYnD6wT-w9ckETAKgNzh9Q1nBdRjSzbxyXFQ,7476
86
+ unifi_network_maps/cli/render.py,sha256=PzUqmA6wb2U7guVpH9yKq9hwksC_eUedVhObwOwOYN4,9907
87
+ unifi_network_maps/cli/runtime.py,sha256=N8BREwwoXA_qxOBDCwrIqggSdOZh3b3cP73v0YMPj1A,6029
59
88
  unifi_network_maps/io/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
60
- unifi_network_maps/io/debug.py,sha256=eUVs6GLfs6VqI6ma8ra7NLhC3q4ek2K8OSRLnpQDF9s,1745
61
- unifi_network_maps/io/export.py,sha256=1_RcXpPqoerCt7WsiheV4dwKgY2fFJlpjUGRs-EkHE4,1013
89
+ unifi_network_maps/io/debug.py,sha256=78Z-RcONvh4VpAoFsN3jG_LfyZiiNKJe1ht1G5Ln3Us,1770
90
+ unifi_network_maps/io/export.py,sha256=tV0epeWLI2YC7Ko0bfMhTDoty5W65lYiXSC7LyZ_9ds,1235
62
91
  unifi_network_maps/io/mkdocs_assets.py,sha256=pszCivIql3maaLw7KFcAioQaVcyLltXgg-fPXPBvvEk,716
63
- unifi_network_maps/io/mock_data.py,sha256=D5OT0iYipuGKT-gHGx6yNGujOcOsxjmQDCfSzxmJzkI,1446
92
+ unifi_network_maps/io/mock_data.py,sha256=lX-XMjERFqle0tlCPLXcRXzBjm-Bss5Kqz3W4lMNlFY,1570
64
93
  unifi_network_maps/io/mock_generate.py,sha256=xiJz_qtNW7iVj7dezLNyVXAHtCHAi8U5CSXK5mrJE4U,233
65
- unifi_network_maps/io/paths.py,sha256=AgrF16EkFc63NNDNRzSnxwv1nIjq24zqNgKL7Y6VOVE,5930
94
+ unifi_network_maps/io/paths.py,sha256=Set88rDOscAyG__2B3WZutVBLLNBFfISX9jSbw0ekTg,6033
66
95
  unifi_network_maps/model/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
96
+ unifi_network_maps/model/classify.py,sha256=AthkPngSpWr_OliI3-iaTyungc_DdU93_QPc_K4Qvv8,7263
97
+ unifi_network_maps/model/clients.py,sha256=bugJ3ZA-hvAiZA31QYgCiixLOwJGpXyZOh-wIMg_LTY,9024
98
+ unifi_network_maps/model/connection.py,sha256=zeYzvixs-5_hnOeOuCgAD83nfY8e4HuH1XteLExWCck,920
99
+ unifi_network_maps/model/diff.py,sha256=vvRi-XtHbTnrZpWRODi56E4CajUhW3iqODOCu2s7lbY,19158
100
+ unifi_network_maps/model/edges.py,sha256=poXYE8uBsDOVP54b7piHCLWC_6HD0k4BTMQ9TJVOc5s,17423
101
+ unifi_network_maps/model/helpers.py,sha256=QhEq3ONzdOXINDVi9cS-5n85ftvyLd7c0cFuL69PYe8,1839
67
102
  unifi_network_maps/model/labels.py,sha256=m_k8mbzWtOSDOjjHhLUqwIw93pg98HAtGtHkiERXmek,1135
68
- unifi_network_maps/model/lldp.py,sha256=SrPW5XC2lfJgaGeVx-KnSFNltyok7gIWWQNg1SkOaj4,3300
69
- unifi_network_maps/model/mock.py,sha256=kkzt7BWt5Q8dZ2wgfgK3HLmVdHHmOjAgS_snJsWawAo,9172
103
+ unifi_network_maps/model/lldp.py,sha256=Ib8uZpeWocGBxcXglSdWdcN-jqsjMB0I1D-XRoQjkvY,2990
104
+ unifi_network_maps/model/mock.py,sha256=s8RE88M4OOzi0lgUdxvwdhtKb08rdgI96h66NLMu8lw,12998
70
105
  unifi_network_maps/model/ports.py,sha256=o3NBlXcC5VV5iPWJsO4Ll1mRKJZC0f8zTHdlkkE34GU,609
71
- unifi_network_maps/model/topology.py,sha256=bkKSy1WlZMMkzya3bTbpYLrseXpwjhOPPoGOf4FHInM,32114
72
- unifi_network_maps/model/vlans.py,sha256=EeRKvIuUs0FgEzrqbo2xi8Xlm5n5V_Z6b7jpXLiNUaY,3788
106
+ unifi_network_maps/model/snapshot.py,sha256=P3Nb98KpIWoqz6FH3QMMEdR9wdLgbNhBLiMrlgA_TQA,8961
107
+ unifi_network_maps/model/topology.py,sha256=F8W3v488QokXW_6_GMrbQK8jyWwSowJ_EB6lB2X2JbY,5688
108
+ unifi_network_maps/model/topology_coerce.py,sha256=NRB5XpuFjuuzccNVvZtAVJy920LIJa7zhXpOtLuyYao,12020
109
+ unifi_network_maps/model/vlans.py,sha256=SKcEXFWSpoHYVT-5vf-nfEPxXCL-UWOtSGDzK-zYqwA,3734
110
+ unifi_network_maps/model/wan.py,sha256=22xkGXJPuC1fHor_iMEIOlH-ERHpaxeCmK9dIXGEKQI,4112
73
111
  unifi_network_maps/render/__init__.py,sha256=nzx1KsiYalL_YuXKE6acW8Dj5flmMg0-i4gyYO0gV54,22
74
- unifi_network_maps/render/device_ports_md.py,sha256=PLbP4_EDwLNkUACVJB_uM0ywaQTbEc6OWMv4QBcoJbU,16425
112
+ unifi_network_maps/render/device_ports_md.py,sha256=2SvSEqOWVqtsB7Fege9F4ZUtLYUym7haJx1jR2CUi-A,14221
113
+ unifi_network_maps/render/device_summary.py,sha256=InXpsk0Cl87PaFK3Oq_1rqTmt13PcLfDsRtxuvPgO7s,1902
75
114
  unifi_network_maps/render/legend.py,sha256=TmZsxgCVOM2CZImI9zgRVyzrcg01HZFDj9F715d4CGo,772
76
- unifi_network_maps/render/lldp_md.py,sha256=oHPAYAfyCPJCuAJM4NJ4RIqgf52ihh555oNAlMB0DFg,14873
77
- unifi_network_maps/render/markdown_tables.py,sha256=VvM0fSnSmpeeDPcD5pXaL_j_PTF0STrMCaqnr2BVHn4,547
78
- unifi_network_maps/render/mermaid.py,sha256=xsC57Xg-nKhmlVATzEbwLkMM2BOeDYlBjZuxBIPhHeI,8324
115
+ unifi_network_maps/render/lldp_md.py,sha256=5AnIXyCr6O7kTD-yKtxbVo3mqrZG9yYYpUBFj4ZU0aY,8503
116
+ unifi_network_maps/render/markdown_tables.py,sha256=Tl6PkMLRi2OWvID1ok5HK22APpJHCq_DpgF1oA69gAU,840
117
+ unifi_network_maps/render/mermaid.py,sha256=Qe7drmFAVUB4yH4GTdkOWCSemhfAElyUrb9uFiv_Lbs,8677
79
118
  unifi_network_maps/render/mermaid_theme.py,sha256=7nqLlvhaUA4z0YOs0ByEx_yHWcQD_hJJjhDtRcbSpg4,1781
80
- unifi_network_maps/render/mkdocs.py,sha256=EOST9_eP1ZoZQax-p-2fjlelrl3AKEJ9Gn-KXW8TI-o,5389
81
- unifi_network_maps/render/svg.py,sha256=Zd6TFaBhqa92O2Z7G_k3LnRXIbuaOAj-dYu2qzEwWvI,41171
82
- unifi_network_maps/render/svg_theme.py,sha256=Si1ArM3v_-wAvHZyLFPiOZ0ohQRd6ezIckwC3_b-WIw,2684
119
+ unifi_network_maps/render/mkdocs.py,sha256=VD0OHD2FHOgHoBiKECFPEw_bimUE9ybu2kzfF-n4j_I,5416
120
+ unifi_network_maps/render/svg.py,sha256=nEQEB7H-vc3FDLZ5exgSlmQCfjCA5WEqKb3NzSx3y_c,31611
121
+ unifi_network_maps/render/svg_icons.py,sha256=14jeLDIXNZTjBmei_Befm6NdHVx9qcvqcToh6C7qsnQ,7693
122
+ unifi_network_maps/render/svg_isometric.py,sha256=2tyFEfQBrWchb9S-BRmv-qtCAtBePVQ-fAjdm8K_ACI,39956
123
+ unifi_network_maps/render/svg_labels.py,sha256=p9iy8D51NMZJ2gwEHuiyLq2JAkf6J_zlUNBKfXuHACQ,6095
124
+ unifi_network_maps/render/svg_theme.py,sha256=YueqxAneLL8FL2JVk00-rGn3Sx8A1kYcSkF0UwTDbUw,7665
83
125
  unifi_network_maps/render/templating.py,sha256=VJbXzZFBPjL8LFFPcLf_EU5Eu53GN9_vpten2Mf9A-k,576
84
- unifi_network_maps/render/theme.py,sha256=LI-2dWaR0cRapvYBqeudGCT3tnT8B-nt-5h0yxkU8vU,4379
126
+ unifi_network_maps/render/theme.py,sha256=X66FBJaddv39Y5I18qfx8S7Whbzf3Xw72s8yvGEr1ns,8300
85
127
  unifi_network_maps/render/templates/device_port_block.md.j2,sha256=ZfyE_lEHz6ZyYRxAYhAhwpxlLczn_U9eTkRLUrwU5Io,50
86
128
  unifi_network_maps/render/templates/legend_compact.html.j2,sha256=DaY2m6N6Yd7qNKLuB5Bc395MHfrKOU9myAZvgcJrhpE,738
87
129
  unifi_network_maps/render/templates/lldp_device_section.md.j2,sha256=ewX-SBrL5Hn1kuwDKo4fqqetj9tTpR7LQavSn6No_yY,206
@@ -93,9 +135,9 @@ unifi_network_maps/render/templates/mkdocs_html_block.html.j2,sha256=5l5-BbNujOc
93
135
  unifi_network_maps/render/templates/mkdocs_legend.css.j2,sha256=tkTI-RagBSgdjUygVenlTsQFenU09ePbXOfDt_Q7YRM,612
94
136
  unifi_network_maps/render/templates/mkdocs_legend.js.j2,sha256=qMYyCKsJ84uXf1wGgzbc7Bc49RU4oyuaGK9KrgQDQEI,685
95
137
  unifi_network_maps/render/templates/mkdocs_mermaid_block.md.j2,sha256=9IncllWQpoI8BN3A7b2zOQ5cksj97ddsjHJ-aBhpw7o,66
96
- unifi_network_maps-1.4.15.dist-info/licenses/LICENSE,sha256=mYo1siIIfIwyfdOuK2-Zt0ij2xBTii2hnpeTu79nD80,1074
97
- unifi_network_maps-1.4.15.dist-info/METADATA,sha256=Mc5M1u-ACVLVZm6xX-Giv4KhP7r7wZ5V1jfvBoKriYY,10079
98
- unifi_network_maps-1.4.15.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
99
- unifi_network_maps-1.4.15.dist-info/entry_points.txt,sha256=cdJ7jsBgNgHxSflYUOqgz5BbvuM0Nnh-x8_Hbyh_LFg,67
100
- unifi_network_maps-1.4.15.dist-info/top_level.txt,sha256=G0rUX1PNfVCn1u-KtB6QjFQHopCOVLnPMczvPOoraHg,19
101
- unifi_network_maps-1.4.15.dist-info/RECORD,,
138
+ unifi_network_maps-1.5.0.dist-info/licenses/LICENSE,sha256=mYo1siIIfIwyfdOuK2-Zt0ij2xBTii2hnpeTu79nD80,1074
139
+ unifi_network_maps-1.5.0.dist-info/METADATA,sha256=KKzcN2hTcdVcVorizJbEKdbwN_dfAJrd5MxugPwLbqw,12881
140
+ unifi_network_maps-1.5.0.dist-info/WHEEL,sha256=wUyA8OaulRlbfwMtmQsvNngGrxQHAvkKcvRmdizlJi0,92
141
+ unifi_network_maps-1.5.0.dist-info/entry_points.txt,sha256=cdJ7jsBgNgHxSflYUOqgz5BbvuM0Nnh-x8_Hbyh_LFg,67
142
+ unifi_network_maps-1.5.0.dist-info/top_level.txt,sha256=G0rUX1PNfVCn1u-KtB6QjFQHopCOVLnPMczvPOoraHg,19
143
+ unifi_network_maps-1.5.0.dist-info/RECORD,,
@@ -1,122 +0,0 @@
1
- <?xml version="1.0" encoding="utf-8"?>
2
- <!-- Generator: Adobe Illustrator 25.3.1, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
3
- <svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
4
- width="168.39999px" height="154.8px" viewBox="0 0 168.39999 154.8" enable-background="new 0 0 168.39999 154.8"
5
- xml:space="preserve">
6
- <g id="Layer_1_1_">
7
- <g id="Layer_3">
8
- </g>
9
- <g id="Layer_6">
10
- </g>
11
- <path fill="#D2D3D5" d="M144.5,84c-0.2,2.2-1.39999,4.3-3.5,5.5l-29.2,17.6c-5.8,3.5-13,3.5-18.8,0L27.8,68c-2.3-1.4-3.4-3.6-3.6-6
12
- v-0.1v34.6c-0.1,2.6,1,5.2,3.6,6.7l65.09999,39.09999c5.8,3.5,13,3.5,18.8,0l29.2-17.6c2.60001-1.5,3.8-4.3,3.5-6.9V84H144.5z"/>
13
- <path fill="#5D6366" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="M58.2,37L27.8,55.3c-4.8,2.9-4.8,9.8,0,12.7
14
- l65.09999,39.1c5.8,3.5,13,3.5,18.8,0l29.2-17.6c4.8-2.9,4.8-9.8,0-12.7L74.6,37C69.6,33.9,63.3,34,58.2,37z"/>
15
- <path fill="#E9E9EA" stroke="#000000" stroke-width="0.25" stroke-miterlimit="10" d="M83.7,42.5L71.2,50c-4.6,2.8-4.6,9.5,0,12.3
16
- L101,80.2c5.7,3.4,12.8,3.4,18.5,0L133,72L83.7,42.5z"/>
17
- <g>
18
- <rect x="125.3864" y="62.39583" fill="#717677" width="0" height="10.10001"/>
19
- <path fill="#717677" d="M101,80.2L94.1,76L62.8,89l8.7,5.2l31.5-13C102.3,80.9,101.6,80.5,101,80.2z"/>
20
- </g>
21
- <path fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="M58.2,37L27.8,55.3c-4.8,2.9-4.8,9.8,0,12.7
22
- l65.09999,39.1c5.8,3.5,13,3.5,18.8,0l29.2-17.6c4.8-2.9,4.8-9.8,0-12.7L74.6,37C69.6,33.9,63.3,34,58.2,37z"/>
23
- <path fill="#1E2226" stroke="#000000" stroke-miterlimit="10" d="M36.7,108.7L86,138.3v-17.1c0-3.9-2-7.5-5.4-9.5L41.1,88
24
- c-1.9-1.2-4.4,0.2-4.4,2.5C36.7,90.5,36.7,108.7,36.7,108.7z"/>
25
- <path fill="#343A3D" d="M133.10001,72.1l13-26.4c0.5-2.9-0.8-5.7-3.3-7.2l-40.9-24.6c-2.1-1.3-4.9,0-5.3,2.4l-13,26.1
26
- L133.10001,72.1z"/>
27
- <g>
28
- <path fill="#878788" d="M20.9,116.8L20.9,116.8v0.1C20.9,116.9,20.9,116.9,20.9,116.8z"/>
29
- <path fill="#878788" d="M86,133.10001l-13.4,8.10001c-5.7,3.39999-12.8,3.39999-18.5,0l-29.8-17.9c-2.2-1.3-3.4-3.6-3.5-5.9v5l0,0
30
- c0,2.4,1.2,4.7,3.5,6.10001l29.8,17.89999c2.8,1.7,6,2.5,9.1,2.60001l0,0l0,0c3.2,0,6.5-0.8,9.4-2.60001L86,138.3l0,0l0,0
31
- V133.10001z"/>
32
- </g>
33
- <path fill="#5F6568" stroke="#000000" stroke-miterlimit="10" d="M80.7,111.7L52,94.5l-15.2,9.1h-0.1l-12.5,7.6
34
- c-4.6,2.8-4.6,9.5,0,12.3L54,141.39999c5.7,3.39999,12.8,3.39999,18.5,0l9.1-5.5l0,0l4.3-2.5v-12C86,117.3,84,113.7,80.7,111.7z"/>
35
- <path fill="#E9E9EA" d="M86,121.2c0-3.9-2-7.5-5.4-9.5L58.4,98.4l-31.8,19.1l35.6,21.39999L86,124.6V121.2z"/>
36
- <g>
37
- <path fill="#000000" d="M108.6,11l33.9,20.4l-2.60001,5.3l2.89999,1.8c2.5,1.5,3.8,4.4,3.3,7.2l-13,26.4l-3.7-2.2l3.7,2.2l0,0l7.8,4.7
38
- c2.39999,1.4,3.5,3.8,3.60001,6.2l0,0l0,0l0,0v-0.1v0.1v0.1v4.7c0,0.2,0,0.5,0,0.7v29.2c0.2,2.6-1,5.4-3.5,6.9l-29.2,17.6
39
- c-2.9,1.7-6.1,2.60001-9.4,2.60001s-6.5-0.89999-9.4-2.60001l-6.9-4.10001v0.10001l0,0l0,0l-13.4,8.10001
40
- c-2.9,1.7-6.1,2.60001-9.3,2.60001h-0.1l0,0l0,0c-3.2,0-6.3-0.89999-9.1-2.60001l-29.8-17.89999c-2.3-1.4-3.5-3.8-3.5-6.1l0,0v-5
41
- c0-0.2,0-0.4,0-0.6v-0.1l0,0c0,0,0,0,0,0.1c0,0,0,0,0-0.1l0,0c0.1-2.2,1.3-4.4,3.4-5.7l8.3-5l-4.8-2.9c-2.5-1.5-3.7-4.2-3.6-6.7
42
- V66.8c0-0.1,0-0.2,0-0.4c0,0,0-3.8,0-4.6v-0.1l0,0c0-2.5,1.2-4.9,3.6-6.4L58.2,37c2.5-1.5,5.4-2.3,8.2-2.3c2.8,0,5.7,0.8,8.2,2.3
43
- l9,5.4l13-26.1c0.3-1.8,1.9-2.9,3.5-2.9c0.6,0,1.2,0.2,1.8,0.5l4.1,2.4L108.6,11 M25.8,66.1C25.8,66.1,25.7,66.1,25.8,66.1
44
- C25.7,66.1,25.7,66.1,25.8,66.1C25.7,66.1,25.8,66.1,25.8,66.1 M26.5,67l0.1,0.1C26.6,67,26.6,67,26.5,67
45
- c-0.1-0.1-0.2-0.1-0.2-0.2l0,0C26.4,66.8,26.5,66.9,26.5,67 M27.8,68c-0.3-0.2-0.6-0.4-0.8-0.6l0,0C27.3,67.6,27.5,67.8,27.8,68
46
- M144.5,83.3v0.1v0.1c0,0.1,0,0.1,0,0.2v0.5v-0.7C144.5,83.5,144.5,83.4,144.5,83.3 M144.3,84.7L144.3,84.7
47
- C144.3,84.6,144.3,84.6,144.3,84.7C144.39999,84.6,144.39999,84.6,144.3,84.7C144.3,84.6,144.3,84.7,144.3,84.7 M144.10001,85.5
48
- L144.10001,85.5c0-0.1,0-0.1,0-0.1l0,0V85.5 M143.8,86.4L143.8,86.4L143.8,86.4c0,0,0-0.1,0.10001-0.1v-0.1l0,0
49
- C143.8,86.2,143.8,86.3,143.8,86.4 M143.3,87.2L143.3,87.2L143.3,87.2c0-0.1,0.10001-0.1,0.10001-0.2c0,0,0-0.1,0.10001-0.1
50
- C143.39999,87,143.39999,87.1,143.3,87.2 M142.7,88L142.7,88L142.7,88c0.10001-0.1,0.10001-0.2,0.2-0.2c0,0,0-0.1,0.10001-0.1
51
- C142.89999,87.7,142.8,87.9,142.7,88 M142,88.7L142,88.7L142,88.7c0.10001-0.1,0.2-0.2,0.39999-0.3c0,0,0,0,0.10001-0.1
52
- C142.3,88.4,142.10001,88.6,142,88.7 M140.89999,89.5L140.89999,89.5L140.89999,89.5L140.89999,89.5L140.89999,89.5
53
- c0.3-0.2,0.5-0.3,0.8-0.5l0,0C141.5,89.1,141.2,89.3,140.89999,89.5 M21.1,119.2L21.1,119.2L21.1,119.2 M21.4,120
54
- C21.4,120,21.4,120.1,21.4,120C21.4,120.1,21.4,120,21.4,120L21.4,120L21.4,120 M21.8,120.8C21.8,120.9,21.8,120.9,21.8,120.8
55
- C21.8,120.9,21.8,120.9,21.8,120.8L21.8,120.8L21.8,120.8 M22.3,121.6l0.1,0.1C22.4,121.7,22.4,121.7,22.3,121.6l-0.1-0.1
56
- C22.3,121.5,22.3,121.6,22.3,121.6 M23,122.3c0.1,0.1,0.1,0.1,0.2,0.2C23.1,122.5,23.1,122.4,23,122.3s-0.1-0.1-0.2-0.2
57
- C22.9,122.2,22.9,122.3,23,122.3 M24.2,123.3l0.1,0.1C24.3,123.3,24.2,123.3,24.2,123.3c-0.2-0.1-0.4-0.3-0.7-0.5
58
- C23.7,123,23.9,123.1,24.2,123.3 M24.2,61.6v0.1l0,0C24.2,61.8,24.2,61.7,24.2,61.6L24.2,61.6 M107.8,8.2l-1,1.9l-1.7,3.4
59
- l-2.2-1.3c-0.9-0.5-1.9-0.8-2.8-0.8c-2.6,0-4.8,1.8-5.4,4.2l-11.9,24l-7.1-4.3c-2.8-1.7-6-2.6-9.2-2.6c-3.3,0-6.5,0.9-9.2,2.6
60
- L26.8,53.6c-2.3,1.4-3.8,3.5-4.3,6h-0.2v2c0,0,0,0,0,0.1v0.1v4.6c0,0.1,0,0.3,0,0.4v29.6c-0.2,3.5,1.6,6.7,4.5,8.5l1.9,1.2
61
- l-5.5,3.3c-2.4,1.4-3.9,3.7-4.3,6.4l-0.1,0.1v0.9v0.1c0,0.2,0,0.4,0,0.6v4.9c0,3.2,1.7,6.2,4.4,7.8l29.8,18
62
- c2.9,1.7,6.2,2.7,9.6,2.8l0.5,0.3l0.6-0.3c3.5-0.10001,6.9-1,10-2.89999L86.2,140.5l5.7,3.39999
63
- c3.1,1.89999,6.7,2.89999,10.4,2.89999s7.3-1,10.4-2.89999l29.2-17.6c3-1.8,4.8-5.2,4.5-8.7V88.7c0-0.2,0-0.5,0-0.7v-4.7v-0.2
64
- v-0.1l0,0c-0.10001-3.3-1.8-6.2-4.5-7.9l-6.3-3.8l12.2-24.7l0.10001-0.3L148,46c0.7-3.7-1-7.4-4.2-9.3l-1.39999-0.8l1.8-3.6
65
- l0.8-1.7l-1.60001-1L109.6,9.3L107.8,8.2L107.8,8.2z"/>
66
- </g>
67
- <path opacity="0.4" fill="#5D6366" enable-background="new " d="M80.7,111.7L58.4,98.4l-16.2,9.7l35.7,21.4l8.1-4.9v-3.4
68
- C86,117.3,84,113.7,80.7,111.7z"/>
69
- <path fill="none" stroke="#000000" stroke-miterlimit="10" d="M86,121.2c0-3.9-2-7.5-5.4-9.5L58.4,98.4l-31.8,19.1l35.6,21.39999
70
- L86,124.6V121.2z"/>
71
- <g>
72
- <path fill="#A8A8A8" d="M142.89999,87.7c0,0,0.10001-0.1,0.10001-0.2C143,87.6,143,87.7,142.89999,87.7z"/>
73
- <path fill="#A8A8A8" d="M141.7,89c0.10001,0,0.10001-0.1,0.2-0.2C141.8,88.9,141.7,88.9,141.7,89z"/>
74
- <path fill="#A8A8A8" d="M144.3,84.7C144.3,84.6,144.3,84.6,144.3,84.7C144.3,84.6,144.3,84.6,144.3,84.7z"/>
75
- <path fill="#A8A8A8" d="M143.39999,87c0,0,0-0.1,0.10001-0.1L143.39999,87z"/>
76
- <path fill="#A8A8A8" d="M144.10001,85.5C144.10001,85.4,144.10001,85.4,144.10001,85.5
77
- C144.10001,85.4,144.10001,85.4,144.10001,85.5z"/>
78
- <path fill="#A8A8A8" d="M143.8,86.3C143.8,86.2,143.8,86.2,143.8,86.3C143.8,86.2,143.8,86.2,143.8,86.3z"/>
79
- <path fill="#A8A8A8" d="M142.5,88.2c-0.10001,0.1-0.10001,0.1-0.2,0.2C142.39999,88.3,142.5,88.3,142.5,88.2z"/>
80
- <path fill="#A8A8A8" d="M100.4,109.6c0.5,0.1,1,0.1,1.5,0.1C101.3,109.6,100.9,109.6,100.4,109.6z"/>
81
- <path fill="#A8A8A8" d="M106.1,109.2c-1.4,0.3-2.9,0.4-4.3,0.4C103.3,109.7,104.7,109.6,106.1,109.2z"/>
82
- <path fill="#A8A8A8" d="M110.5,107.7c0.4-0.2,0.8-0.4,1.2-0.7C111.3,107.3,110.9,107.5,110.5,107.7z"/>
83
- <path fill="#A8A8A8" d="M144.5,88.6c0,0.2,0,0.4-0.10001,0.6l0,0l0,0c-0.3,2-1.5,3.9-3.5,5.1l-29.2,17.6
84
- c-3.5,2.1-7.4,2.9-11.3,2.5v30.39999c3.9,0.39999,7.8-0.39999,11.3-2.5l29.2-17.6c2.60001-1.5,3.8-4.3,3.5-6.9V88.6H144.5z"/>
85
- <path fill="#A8A8A8" d="M109.2,108.3c0.3-0.1,0.6-0.3,0.9-0.4C109.8,108.1,109.5,108.2,109.2,108.3z"/>
86
- <path fill="#A8A8A8" d="M107.8,108.8c0.3-0.1,0.6-0.2,1-0.3C108.4,108.6,108.1,108.7,107.8,108.8z"/>
87
- <path fill="#A8A8A8" d="M106.3,109.2c0.4-0.1,0.8-0.2,1.2-0.3C107.1,109,106.7,109.1,106.3,109.2z"/>
88
- </g>
89
- <g>
90
- <path fill="#868687" d="M144.5,83.1V83V83.1L144.5,83.1z"/>
91
- <path fill="#868687" d="M144.5,83.5v0.9v-0.5c-0.2,2.2-1.39999,4.4-3.5,5.7l-29.2,17.6c-5.8,3.5-13,3.5-18.8,0L27.8,68
92
- c-2.4-1.4-3.6-3.9-3.6-6.3l0,0v4.8c0,0.1,0,0.3,0,0.4c0.1,2.4,1.3,4.7,3.6,6L92.89999,112c5.8,3.5,13,3.5,18.8,0l29.2-17.6
93
- c2-1.2,3.10001-3.1,3.5-5.1l0,0l0,0C144.5,88.9,144.5,88.4,144.5,88v-4.7C144.5,83.3,144.5,83.4,144.5,83.5z"/>
94
- </g>
95
- <g>
96
- <rect x="102.08109" y="38.11023" fill="#717677" width="0" height="30.70004"/>
97
- <path fill="#717677" d="M71.2,62.3c-2.9-1.8-4-5.1-3.2-8L30.7,69.7l26.4,15.8l31.3-13L71.2,62.3z"/>
98
- </g>
99
- <g>
100
- <path fill="#3B4044" d="M100,114.2v-4.9"/>
101
- <path fill="#3B4044" d="M111.6,111.8l29.2-17.6c2-1.2,3.10001-3.1,3.5-5.1l0,0l0,0c0.10001-0.4,0.10001-0.9,0.10001-1.3v-4.7
102
- c0,0.1,0,0.2,0,0.2v0.9v-0.5c-0.2,2.2-1.39999,4.4-3.5,5.7l-29.2,17.6c-3.6,2.1-7.7,3-11.7,2.5v4.9
103
- C104,114.7,108.1,113.9,111.6,111.8z"/>
104
- </g>
105
- <g>
106
- <path fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="M144.5,83.1V83V83.1L144.5,83.1z"/>
107
- <path fill="none" stroke="#000000" stroke-width="2" stroke-miterlimit="10" d="M144.5,83.5v0.9v-0.5
108
- c-0.2,2.2-1.39999,4.4-3.5,5.7l-29.2,17.6c-5.8,3.5-13,3.5-18.8,0L27.8,68c-2.4-1.4-3.6-3.9-3.6-6.3l0,0v4.8c0,0.1,0,0.3,0,0.4
109
- c0.1,2.4,1.3,4.7,3.6,6L92.89999,112c5.8,3.5,13,3.5,18.8,0l29.2-17.6c2-1.2,3.10001-3.1,3.5-5.1l0,0l0,0
110
- C144.5,88.9,144.5,88.4,144.5,88v-4.7C144.5,83.3,144.5,83.4,144.5,83.5z"/>
111
- </g>
112
- <ellipse fill="#C9C9C9" stroke="#000000" stroke-miterlimit="10" cx="54.5" cy="50.7" rx="5.3" ry="3.8"/>
113
- <ellipse fill="#51AD44" stroke="#000000" stroke-miterlimit="10" cx="45.3" cy="56.5" rx="3.4" ry="2.5"/>
114
- <ellipse fill="#FC9603" stroke="#000000" stroke-miterlimit="10" cx="37.6" cy="61.4" rx="3.4" ry="2.5"/>
115
- <path fill="#343A3D" stroke="#000000" stroke-miterlimit="10" d="M83.7,42.5L71.2,50c-4.6,2.8-4.6,9.5,0,12.3L101,80.2
116
- c5.7,3.4,12.8,3.4,18.5,0L133,72L83.7,42.5z"/>
117
- <polygon fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" points="121.1,74.5 142.5,31.4 108.6,11 87.3,54.1 "/>
118
- <path opacity="0.3" enable-background="new " d="M165.7,115.6l-21.2-13.5v15.8c0.2,2.6-1,5.4-3.5,6.9l-29.2,17.60001
119
- c-3,1.8-6.4,2.7-9.7,2.60001l-1.5,2.10001l29.3-2.2l36.09999-20.3C169.3,122.5,169.2,117.5,165.7,115.6z"/>
120
- <polygon opacity="0.4" fill="#5D6366" enable-background="new " points="89.7,49.3 87.3,54.1 121.1,74.5 123.5,69.6 "/>
121
- </g>
122
- </svg>