cpp_dependency_graph 0.1.1 → 0.1.2
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.
- checksums.yaml +4 -4
- data/.gitattributes +2 -0
- data/.rubocop_todo.yml +21 -0
- data/.vscode/launch.json +1 -1
- data/Gemfile +1 -1
- data/README.md +36 -4
- data/Rakefile +2 -0
- data/TODO.md +10 -2
- data/bin/console +2 -0
- data/cpp_dependency_graph.gemspec +7 -6
- data/docs/README.md +12 -0
- data/examples/leveldb_cyclic_deps.svg +1 -0
- data/examples/rethinkdb_cyclic_deps.svg +1 -0
- data/exe/cpp_dependency_graph +14 -8
- data/lib/cpp_dependency_graph.rb +33 -15
- data/lib/cpp_dependency_graph/bidirectional_hash.rb +14 -13
- data/lib/cpp_dependency_graph/circle_packing_visualiser.rb +20 -0
- data/lib/cpp_dependency_graph/component_dependency_graph.rb +56 -0
- data/lib/cpp_dependency_graph/config.rb +8 -0
- data/lib/cpp_dependency_graph/cycle_detector.rb +8 -10
- data/lib/cpp_dependency_graph/cyclic_link.rb +12 -15
- data/lib/cpp_dependency_graph/dir_tree.rb +41 -0
- data/lib/cpp_dependency_graph/file_dependency_graph.rb +56 -0
- data/lib/cpp_dependency_graph/graph_to_dot_visualiser.rb +38 -0
- data/lib/cpp_dependency_graph/graph_to_graphml_visualiser.rb +8 -0
- data/lib/cpp_dependency_graph/graph_to_html_visualiser.rb +25 -0
- data/lib/cpp_dependency_graph/include_dependency_graph.rb +21 -6
- data/lib/cpp_dependency_graph/include_to_component_resolver.rb +58 -0
- data/lib/cpp_dependency_graph/link.rb +42 -0
- data/lib/cpp_dependency_graph/project.rb +12 -30
- data/lib/cpp_dependency_graph/source_component.rb +8 -7
- data/lib/cpp_dependency_graph/source_file.rb +4 -3
- data/lib/cpp_dependency_graph/tsortable_hash.rb +1 -0
- data/lib/cpp_dependency_graph/version.rb +1 -1
- data/views/circle_packing.html.template +105 -0
- metadata +51 -25
- data/lib/cpp_dependency_graph/component_link.rb +0 -37
- data/lib/cpp_dependency_graph/dependency_graph.rb +0 -49
- data/lib/cpp_dependency_graph/graph_to_html_converter.rb +0 -7
- data/lib/cpp_dependency_graph/graph_visualiser.rb +0 -59
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: feac9cd85c6b1df61ad89cb9b292d4fd927c2256a1b9cb42a816065b87c3012f
|
4
|
+
data.tar.gz: c055532215dd55a1e04e5e27a679aa805797f714f5b697e23317729802b8740f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 381fef815402ed98ab960277a0ed0bfb06a52c89c8029696453940306e309356aab7867b6c20e8af7189e647203a3dc0e4721249ccf200acae8d7abecc56dc44
|
7
|
+
data.tar.gz: 3354743837ae6ac501d7b5809c330fa2a9e3e0f9a1686f2409e8ac6f10bfba0de1abd7ef26a640b1986c79c3ddabb24fb251e38a11cf17650b178fa245348dfe
|
data/.gitattributes
ADDED
data/.rubocop_todo.yml
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
# This configuration was generated by
|
2
|
+
# `rubocop --auto-gen-config`
|
3
|
+
# on 2018-04-08 15:14:25 +1200 using RuboCop version 0.54.0.
|
4
|
+
# The point is for the user to remove these configuration records
|
5
|
+
# one by one as the offenses are removed from the code base.
|
6
|
+
# Note that changes in the inspected code, or installation of new
|
7
|
+
# versions of RuboCop, may require this file to be generated again.
|
8
|
+
|
9
|
+
# Offense count: 1
|
10
|
+
Metrics/AbcSize:
|
11
|
+
Max: 19
|
12
|
+
|
13
|
+
# Offense count: 2
|
14
|
+
# Configuration parameters: CountComments, ExcludedMethods.
|
15
|
+
Metrics/BlockLength:
|
16
|
+
Max: 32
|
17
|
+
|
18
|
+
# Offense count: 1
|
19
|
+
Style/MixinUsage:
|
20
|
+
Exclude:
|
21
|
+
- 'exe/cpp_dependency_graph'
|
data/.vscode/launch.json
CHANGED
@@ -24,7 +24,7 @@
|
|
24
24
|
"pathToBundler": "C:/tools/ruby25/bin/bundle.bat",
|
25
25
|
"pathToRDebugIDE": "C:/tools/ruby25/bin/rdebug-ide.bat",
|
26
26
|
"showDebuggerOutput": true,
|
27
|
-
"args": ["
|
27
|
+
"args": ["visualise_components", "-r", "../TileDB"]
|
28
28
|
},
|
29
29
|
{
|
30
30
|
"name": "Listen for rdebug-ide",
|
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,12 +1,17 @@
|
|
1
1
|
# Cpp Dependency Graph
|
2
2
|
|
3
|
-
|
3
|
+
[](https://gitter.im/cpp_dependency_graph/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
4
4
|
|
5
|
-
[](https://opensource.org/licenses/MIT)
|
5
|
+
[](https://opensource.org/licenses/MIT)
|
6
|
+
[](https://travis-ci.org/shreyasbharath/cpp_dependency_graph)
|
7
|
+
[](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/maintainability)
|
8
|
+
[](https://www.codacy.com/app/shreyasbharath/cpp_dependency_graph?utm_source=github.com&utm_medium=referral&utm_content=shreyasbharath/cpp_dependency_graph&utm_campaign=Badge_Grade)
|
9
|
+
[](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/test_coverage)
|
10
|
+
[](https://badge.fury.io/rb/cpp_dependency_graph)
|
6
11
|
|
7
|
-
Generates useful component dependency visualisations (
|
12
|
+
Generates useful component dependency visualisations (`dot` or `d3.js`) to study the architecture of C/C++ projects.
|
8
13
|
|
9
|
-
Why do all the other languages have awesome tools to analyse codebases but C/C++
|
14
|
+
Why do all the other languages have awesome tools to analyse codebases but C/C++ does not?
|
10
15
|
|
11
16
|
It's time to change that.
|
12
17
|
|
@@ -14,6 +19,7 @@ This tool aims to -
|
|
14
19
|
|
15
20
|
- provide multiple views into the architecture of a codebase
|
16
21
|
- generate views at multiple levels of the architecture
|
22
|
+
- make the resulting views genuinely useful, rich, dynamic and interactive (static views are boring)
|
17
23
|
|
18
24
|
## Inspiration
|
19
25
|
|
@@ -23,12 +29,26 @@ The pretty `d3` visualisations are directly copied from `objc-dependency-visuali
|
|
23
29
|
|
24
30
|
A huge shout out to the people behind these projects.
|
25
31
|
|
32
|
+
## Comparison With Other Tools
|
33
|
+
|
34
|
+
### cpp-dependencies
|
35
|
+
|
36
|
+
### cinclude2dot
|
37
|
+
|
38
|
+
### dep-matrix
|
39
|
+
|
40
|
+
|
41
|
+
|
26
42
|
## Usage
|
27
43
|
|
28
44
|
### Installation
|
29
45
|
|
30
46
|
`gem install cpp_dependency_graph`
|
31
47
|
|
48
|
+
### Help
|
49
|
+
|
50
|
+
`cpp_dependency_graph -h`
|
51
|
+
|
32
52
|
### Overall component dependency graph
|
33
53
|
|
34
54
|
To generate the overall component depenency graph for a project, use it like so -
|
@@ -69,6 +89,18 @@ Here's a component include dependency visualisation generated for the `queue` co
|
|
69
89
|
|
70
90
|

|
71
91
|
|
92
|
+
### Cyclic dependencies only graph
|
93
|
+
|
94
|
+
This will highlight cyclic dependencies between components within a project. This is especially useful for targeted refactoring activities to reduce coupling between components.
|
95
|
+
|
96
|
+
`cpp_dependency_graph visualise_cyclic_deps -r spec\test\example_project\`
|
97
|
+
|
98
|
+
Here's the cyclic dependencies only visualisation generated for [rethinkdb](https://github.com/rethinkdb/rethinkdb) and [leveldb](https://github.com/google/leveldb)
|
99
|
+
|
100
|
+

|
101
|
+
|
102
|
+

|
103
|
+
|
72
104
|
## Development
|
73
105
|
|
74
106
|
`bundle exec cpp_dependency_graph visualise -r <dir>`
|
data/Rakefile
CHANGED
data/TODO.md
CHANGED
@@ -3,17 +3,23 @@
|
|
3
3
|
- [ ] Documentation
|
4
4
|
- [ ] Screencast of how to use tool on projects
|
5
5
|
- [ ] Create a github.io homepage
|
6
|
+
- [ ] Add interactive `html` or `svg` examples to homepage
|
6
7
|
- [ ] Add a [CONTRIBUTING.md](https://github.com/nayafia/contributing-template/blob/master/CONTRIBUTING-template.md)
|
7
|
-
- [ ]
|
8
|
+
- [ ] Ruby gem docs
|
9
|
+
- [ ] Add example visualisations for "good" vs "bad" architectures
|
8
10
|
- [ ] Progress messages
|
9
11
|
- [ ] Progress bar?
|
10
12
|
- [x] Allow user to specify a single component and the tool should print only that component
|
11
13
|
- [x] Print out dependency graphs for all components by default if no single component is specified
|
12
14
|
- [ ] Use a compiler to get the includes for a file rather than manually scanning the contents
|
13
|
-
- [ ]
|
15
|
+
- [ ] Command to generate overall file/class dependency graph if a project doesn't have many components
|
16
|
+
- [ ] Command to generate individual file/class dependency graph
|
17
|
+
- [ ] Manual scanning does not work when #includes are #ifdef'ed out for example
|
14
18
|
- [ ] <system> include vs "project" include (how will this work for third party sources that are not part of the codebase?)
|
15
19
|
- [ ] Work with any type of include relative includes ('blah.h') vs absolute includes ('/path/blah.h') vs relative with path includes ('blah/blah.h')
|
20
|
+
- [ ] Look at https://github.com/Sarcasm/compdb to see if it can generate dependencies
|
16
21
|
- [ ] Parallelise dependency scanning as much as possible to get the best possible performance
|
22
|
+
- [ ] Use a threadpool? Look at reference implementations
|
17
23
|
- [ ] Open up the graph automatically after generating an individual graph
|
18
24
|
- [ ] Work with any sort of project structure
|
19
25
|
- [ ] Header only projects
|
@@ -30,6 +36,8 @@
|
|
30
36
|
- [ ] Visualisation
|
31
37
|
- [ ] Highlight strongly coupled components (i.e. have lots of outgoing/incoming dependencies). How to visualise strongly coupled components?
|
32
38
|
- [ ] Interface vs implementation coupling (interface is worse!). Highlighting interface vs implementation coupling between components on graph?
|
39
|
+
- [ ] Hierarchy diagram for components with no cycles? (https://bl.ocks.org/mbostock/4339184)
|
40
|
+
- [ ] Pack diagram for just visualising components (https://bl.ocks.org/mbostock/ca5b03a33affa4160321)
|
33
41
|
- [ ] Look at using subgraphs of the dot/svg language to cluster component dependencies in the graph
|
34
42
|
- [ ] Create a d3 donut graph with relative sizes of components in project? This'll probably show which components need to be further split up (something like this https://blog.kathyreid.id.au/2016/12/29/linux-australia-expense-breakdown-a-data-visualisation-in-d3-js/)
|
35
43
|
- [ ] Node size - base it on how many source files (or lines of code) or how many connections going in/out of node?
|
data/bin/console
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
lib = File.expand_path('
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
4
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
5
5
|
|
6
6
|
require 'cpp_dependency_graph/version'
|
@@ -9,7 +9,7 @@ Gem::Specification.new do |s|
|
|
9
9
|
s.name = 'cpp_dependency_graph'
|
10
10
|
s.version = CppDependencyGraph::VERSION
|
11
11
|
s.authors = ['Shreyas Balakrishna']
|
12
|
-
s.email = ['shreyasbharath@
|
12
|
+
s.email = ['shreyasbharath@gmail.com']
|
13
13
|
s.summary = <<-SUMMARY
|
14
14
|
CppDependencyGraph is a program that generates dependency visualisations (dot, d3.js) to study the architecture of C/C++ projects
|
15
15
|
SUMMARY
|
@@ -19,7 +19,7 @@ Gem::Specification.new do |s|
|
|
19
19
|
s.homepage = 'https://github.com/shreyasbharath/cpp_dependency_graph'
|
20
20
|
s.licenses = ['MIT']
|
21
21
|
|
22
|
-
s.files =
|
22
|
+
s.files = `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } -
|
23
23
|
%w[.rubocop.yml .travis.yml appveyor.yml]
|
24
24
|
s.bindir = 'exe'
|
25
25
|
s.executables = s.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -34,11 +34,12 @@ Gem::Specification.new do |s|
|
|
34
34
|
s.add_runtime_dependency 'parallel', '~> 1.12'
|
35
35
|
|
36
36
|
s.add_development_dependency 'bundler', '~> 1.16'
|
37
|
-
s.add_development_dependency 'coveralls', '~> 0.8'
|
38
37
|
s.add_development_dependency 'debase', '~> 0.2'
|
39
38
|
s.add_development_dependency 'rake', '~> 12.3'
|
40
39
|
s.add_development_dependency 'rspec', '~> 3.7'
|
41
|
-
s.add_development_dependency 'rubocop', '~> 0.
|
42
|
-
s.add_development_dependency 'ruby-prof', '~> 0.17'
|
40
|
+
s.add_development_dependency 'rubocop', '~> 0.55'
|
43
41
|
s.add_development_dependency 'ruby-debug-ide', '~> 0.6'
|
42
|
+
s.add_development_dependency 'ruby-prof', '~> 0.17'
|
43
|
+
s.add_development_dependency 'simplecov', '~> 0.16'
|
44
|
+
s.add_development_dependency 'simplecov-console', '~> 0.4'
|
44
45
|
end
|
data/docs/README.md
ADDED
@@ -0,0 +1,12 @@
|
|
1
|
+
---
|
2
|
+
layout: home
|
3
|
+
title: "Github Pages for Non-Developers: Build Web Portfolios From Scratch"
|
4
|
+
---
|
5
|
+
|
6
|
+
<section class="sec">
|
7
|
+
This is a very narrowly focused tutorial about web development aimed at novices who have absolutely no web dev experience, nor have used [Github](https://github.com) or [Git](http://git-scm.com/), or even the command line.
|
8
|
+
|
9
|
+
The end product is a web portfolio, built (mostly) from scratch, that is easy to edit and easy to publish _anywhere_ – Github merely provides an easy starting point.
|
10
|
+
|
11
|
+
(_This tutorial is in progress. [Feel free to fork it on Github](http://github.com/dannguyen/github-for-portfolios)_)
|
12
|
+
</section>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="1536" height="686" style="perspective-origin:768px 343px;transform-origin:768px 343px;" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><rect width="1536" height="686" style="overflow-x:visible;overflow-y:visible;pointer-events:all;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform-origin:0px 0px;fill:none;"/><g transform="translate(-767.9999999999995,-337.9999999999999) scale(1.9999999999999996)" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform:matrix(2, 0, 0, 2, -768, -338);transform-origin:0px 0px;"><defs style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><marker id="default" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);d:path('M 0 -5 L 10 0 L 0 5');"/></marker><marker id="dependency" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);d:path('M 0 -5 L 10 0 L 0 5');"/></marker><marker id="dependants" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);d:path('M 0 -5 L 10 0 L 0 5');"/></marker></defs><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><path class="link" marker-end="url(#default)" d="M772.181500230866,242.2880601767661L691.0013375095142,243.16767372388438" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 772.182 242.288 L 691.001 243.168');"/><path class="link" marker-end="url(#default)" d="M638.872526794038,351.26554522616397L665.8573138155941,262.0439461661948" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 638.872 351.266 L 665.857 262.044');"/><path class="link" marker-end="url(#default)" d="M650.1540519564589,379.612330761244L731.4477569345714,426.1109895794229" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 650.154 379.612 L 731.448 426.111');"/><path class="link" marker-end="url(#default)" d="M821.3397561915612,361.6295432167713L762.050311785604,421.89239011317284" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 821.34 361.63 L 762.05 421.892');"/><path class="link" marker-end="url(#default)" d="M665.8573138155941,262.0439461661948L638.872526794038,351.26554522616397" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 665.857 262.044 L 638.872 351.266');"/><path class="link" marker-end="url(#default)" d="M691.0013375095142,243.16767372388438L772.181500230866,242.2880601767661" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 691.001 243.168 L 772.182 242.288');"/><path class="link" marker-end="url(#default)" d="M762.050311785604,421.89239011317284L821.3397561915612,361.6295432167713" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 762.05 421.892 L 821.34 361.63');"/><path class="link" marker-end="url(#default)" d="M731.4477569345714,426.1109895794229L650.1540519564589,379.612330761244" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 731.448 426.111 L 650.154 379.612');"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 790.18, 242.093);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(790.1804436852453,242.09303575250334)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 671.503, 243.379);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(671.5024821006034,243.37895018350235)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 633.227, 369.931);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(633.2273585090287,369.9305412088564)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 748.374, 435.793);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(748.3744503820017,435.79277913181045)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 833.964, 348.798);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(833.9636282564248,348.79841489187504)"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><text visibility="visible" transform="translate(790.1804436852453,242.09303575250334)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.025px 0px;transform:matrix(1, 0, 0, 1, 790.18, 242.093);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">db</text><text visibility="visible" transform="translate(671.5024821006034,243.37895018350235)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.025px 0px;transform:matrix(1, 0, 0, 1, 671.503, 243.379);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">table</text><text visibility="visible" transform="translate(633.2273585090287,369.9305412088564)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0125px 0px;transform:matrix(1, 0, 0, 1, 633.227, 369.931);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">leveldb</text><text visibility="visible" transform="translate(748.3744503820017,435.79277913181045)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0px 0px;transform:matrix(1, 0, 0, 1, 748.374, 435.793);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">util</text><text visibility="visible" transform="translate(833.9636282564248,348.79841489187504)" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.1625px 0px;transform:matrix(1, 0, 0, 1, 833.964, 348.798);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">port</text></g></g></svg>
|
@@ -0,0 +1 @@
|
|
1
|
+
<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg width="1536" height="734" style="perspective-origin:768px 367px;transform-origin:768px 367px;" version="1.1" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg"><rect width="1536" height="734" style="overflow-x:visible;overflow-y:visible;pointer-events:all;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform-origin:0px 0px;fill:none;"/><g transform="translate(58.81057660231863,69.41063733904684) scale(0.8408964152537145)" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform:matrix(0.840896, 0, 0, 0.840896, 58.8106, 69.4106);transform-origin:0px 0px;"><defs style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><marker id="default" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 153, 153);stroke:rgb(153, 153, 153);d:path('M 0 -5 L 10 0 L 0 5');"/></marker><marker id="dependency" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(153, 0, 0);stroke:rgb(153, 0, 0);d:path('M 0 -5 L 10 0 L 0 5');"/></marker><marker id="dependants" orient="auto" class="marker" viewBox="0 -5 10 10" refX="10" refY="0" markerWidth="10" markerHeight="10" style="pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);"><path d="M0,-5L10,0L0,5" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:rgb(0, 153, 0);stroke:rgb(0, 153, 0);d:path('M 0 -5 L 10 0 L 0 5');"/></marker></defs><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><path class="link" marker-end="url(#default)" d="M619.4692512323113,492.784050821615L615.170267375619,496.8722947107597" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 619.469 492.784 L 615.17 496.872');"/><path class="link" marker-end="url(#default)" d="M618.9923550240818,492.27383355604354L492.6188147476263,608.3689248149054" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 618.992 492.274 L 492.619 608.369');"/><path class="link" marker-end="url(#default)" d="M611.7515500809808,481.1955831226758L491.06097411784,534.3385834752964" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 611.752 481.196 L 491.061 534.339');"/><path class="link" marker-end="url(#default)" d="M627.7922429749298,430.2596612508609L570.0731960476776,335.2333347398651" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 627.792 430.26 L 570.073 335.233');"/><path class="link" marker-end="url(#default)" d="M667.0502953621125,428.71093270416145L727.5445998357076,308.7248983034901" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 667.05 428.711 L 727.545 308.725');"/><path class="link" marker-end="url(#default)" d="M608.4764960645156,461.2880337911976L531.1632703311466,454.41439103741493" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 608.477 461.288 L 531.163 454.414');"/><path class="link" marker-end="url(#default)" d="M614.5585225803536,443.27411144279625L527.7404666330278,388.53462006412923" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 614.559 443.274 L 527.74 388.535');"/><path class="link" marker-end="url(#default)" d="M627.8269208337267,430.23862166348675L533.3640783070696,274.36716732756054" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 627.827 430.239 L 533.364 274.367');"/><path class="link" marker-end="url(#default)" d="M609.4413682331635,455.3993641455929L423.99038402235885,410.77342485465834" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 609.441 455.399 L 423.99 410.773');"/><path class="link" marker-end="url(#default)" d="M669.3071156670555,499.8091153643982L763.8853020840004,661.0626672307216" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 669.307 499.809 L 763.885 661.063');"/><path class="link" marker-end="url(#default)" d="M680.9848918315117,440.26766941844573L790.1523045999644,356.75874586870225" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 680.985 440.268 L 790.152 356.759');"/><path class="link" marker-end="url(#default)" d="M688.6982809068647,457.8202800154495L868.9331455471099,425.9395112180857" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 688.698 457.82 L 868.933 425.94');"/><path class="link" marker-end="url(#default)" d="M680.0613140769316,439.10511324024753L861.9278838553495,289.1045723133321" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 680.061 439.105 L 861.928 289.105');"/><path class="link" marker-end="url(#default)" d="M651.1782937020431,505.30572473828005L660.74090027971,669.0670029504024" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 651.178 505.306 L 660.741 669.067');"/><path class="link" marker-end="url(#default)" d="M687.0160357860301,478.33239654478416L803.4026777593846,519.3366635740837" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 687.016 478.332 L 803.403 519.337');"/><path class="link" marker-end="url(#default)" d="M629.4283725674695,500.43182668216514L563.2471050346965,621.8007545035571" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 629.428 500.432 L 563.247 621.801');"/><path class="link" marker-end="url(#default)" d="M491.06097411784,534.3385834752964L611.7515500809808,481.1955831226758" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 491.061 534.339 L 611.752 481.196');"/><path class="link" marker-end="url(#default)" d="M473.35827798940346,519.7451747328805L500.5350318221531,399.80389915226897" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 473.358 519.745 L 500.535 399.804');"/><path class="link" marker-end="url(#default)" d="M469.2786274091127,570.0672791657464L471.0885785640032,599.6853558587328" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 469.279 570.067 L 471.089 599.685');"/><path class="link" marker-end="url(#default)" d="M476.7400907346525,520.7621653090171L492.6975784773183,478.5492950138664" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 476.74 520.762 L 492.698 478.549');"/><path class="link" marker-end="url(#default)" d="M483.6664350718438,564.5161234962766L531.7841178986785,624.5798078345149" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 483.666 564.516 L 531.784 624.58');"/><path class="link" marker-end="url(#default)" d="M492.65184121223683,539.2468505719548L564.1031405857784,523.8611512320966" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 492.652 539.247 L 564.103 523.861');"/><path class="link" marker-end="url(#default)" d="M522.0377638032354,639.5831572773027L498.849894202392,633.4934150656815" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 522.038 639.583 L 498.85 633.493');"/><path class="link" marker-end="url(#default)" d="M563.2471050346965,621.8007545035571L629.4283725674695,500.43182668216514" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 563.247 621.801 L 629.428 500.432');"/><path class="link" marker-end="url(#default)" d="M531.7841178986785,624.5798078345149L483.6664350718438,564.5161234962766" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 531.784 624.58 L 483.666 564.516');"/><path class="link" marker-end="url(#default)" d="M542.9459391433547,619.1108927138638L509.4322966291407,479.6021288088185" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 542.946 619.111 L 509.432 479.602');"/><path class="link" marker-end="url(#default)" d="M558.7536163020607,619.8314716483359L583.7986796543286,545.9575817351293" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 558.754 619.831 L 583.799 545.958');"/><path class="link" marker-end="url(#default)" d="M576.3188879628775,656.747773819495L643.5983412376296,681.742871086105" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 576.319 656.748 L 643.598 681.743');"/><path class="link" marker-end="url(#default)" d="M552.2054092914702,675.2034426597943L565.2304559195259,817.2494401831658" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 552.205 675.203 L 565.23 817.249');"/><path class="link" marker-end="url(#default)" d="M541.114246256536,674.0289636159891L500.61480308188794,803.8298015304351" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 541.114 674.029 L 500.615 803.83');"/><path class="link" marker-end="url(#default)" d="M500.61480308188794,803.8298015304351L541.114246256536,674.0289636159891" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 500.615 803.83 L 541.114 674.029');"/><path class="link" marker-end="url(#default)" d="M565.2304559195259,817.2494401831658L552.2054092914702,675.2034426597943" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 565.23 817.249 L 552.205 675.203');"/><path class="link" marker-end="url(#default)" d="M471.0885785640032,599.6853558587328L469.2786274091127,570.0672791657464" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 471.089 599.685 L 469.279 570.067');"/><path class="link" marker-end="url(#default)" d="M492.6188147476263,608.3689248149054L618.9923550240818,492.27383355604354" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 492.619 608.369 L 618.992 492.274');"/><path class="link" marker-end="url(#default)" d="M498.849894202392,633.4934150656815L522.0377638032354,639.5831572773027" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 498.85 633.493 L 522.038 639.583');"/><path class="link" marker-end="url(#default)" d="M477.3098519120872,600.0254034576972L497.94672731144715,479.97850736298165" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 477.31 600.025 L 497.947 479.979');"/><path class="link" marker-end="url(#default)" d="M456.0934342810481,647.8963787010845L377.8965670838694,747.7980390690966" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 456.093 647.896 L 377.897 747.798');"/><path class="link" marker-end="url(#default)" d="M448.7757488024258,639.0822454754838L332.69063154281275,699.3888960398979" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 448.776 639.082 L 332.691 699.389');"/><path class="link" marker-end="url(#default)" d="M499.1803884232806,621.1884165878108L680.8014827839315,583.7812562293537" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 499.18 621.188 L 680.801 583.781');"/><path class="link" marker-end="url(#default)" d="M377.8965670838694,747.7980390690966L456.0934342810481,647.8963787010845" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 377.897 747.798 L 456.093 647.896');"/><path class="link" marker-end="url(#default)" d="M332.69063154281275,699.3888960398979L448.7757488024258,639.0822454754838" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 332.691 699.389 L 448.776 639.082');"/><path class="link" marker-end="url(#default)" d="M763.8853020840004,661.0626672307216L669.3071156670555,499.8091153643982" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 763.885 661.063 L 669.307 499.809');"/><path class="link" marker-end="url(#default)" d="M729.639631912873,124.51960307539386L704.8031374341645,154.60558090656943" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 729.64 124.52 L 704.803 154.606');"/><path class="link" marker-end="url(#default)" d="M748.9996219146623,127.70263539016497L809.8650020680302,287.36927177064496" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 749 127.703 L 809.865 287.369');"/><path class="link" marker-end="url(#default)" d="M622.8654481066733,738.9256053390834L597.3849050962548,547.2842552958504" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 622.865 738.926 L 597.385 547.284');"/><path class="link" marker-end="url(#default)" d="M987.4574281014302,488.1170904926541L857.9970705912353,360.9516992730952" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 987.457 488.117 L 857.997 360.952');"/><path class="link" marker-end="url(#default)" d="M895.3541026344435,135.56679159326222L863.3706803590102,116.19778239432341" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 895.354 135.567 L 863.371 116.198');"/><path class="link" marker-end="url(#default)" d="M945.7113847537091,193.8731607678087L975.1791905733353,263.8680183540861" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 945.711 193.873 L 975.179 263.868');"/><path class="link" marker-end="url(#default)" d="M954.6407514621665,124.40709114524965L1058.2003532201322,-10.64875577040556" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 954.641 124.407 L 1058.2 -10.6488');"/><path class="link" marker-end="url(#default)" d="M890.9198246757954,167.18780171836738L879.5684218116853,170.27905968458566" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 890.92 167.188 L 879.568 170.279');"/><path class="link" marker-end="url(#default)" d="M960.1873263318549,183.5421380912026L972.5852219214314,194.62813600538087" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 960.187 183.542 L 972.585 194.628');"/><path class="link" marker-end="url(#default)" d="M896.6121934426341,179.47482286663413L756.2209801426259,275.89586077528776" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 896.612 179.475 L 756.221 275.896');"/><path class="link" marker-end="url(#default)" d="M923.7004958378586,196.55380769154047L891.1665966628783,403.28007544634596" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 923.701 196.554 L 891.167 403.28');"/><path class="link" marker-end="url(#default)" d="M961.6077166821331,181.86414451902866L1032.0880298899,238.31340590857718" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 961.608 181.864 L 1032.09 238.313');"/><path class="link" marker-end="url(#default)" d="M969.6421050380764,148.26996005952023L1053.687236008813,130.7249163260444" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 969.642 148.27 L 1053.69 130.725');"/><path class="link" marker-end="url(#default)" d="M909.1036490941799,191.24100324326662L849.1085550114158,290.8679556319107" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 909.104 191.241 L 849.109 290.868');"/><path class="link" marker-end="url(#default)" d="M964.0359882670384,134.6012701738891L1108.6015005016013,41.40048691504444" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 964.036 134.601 L 1108.6 41.4005');"/><path class="link" marker-end="url(#default)" d="M901.1047277373924,128.16487791798883L787.6913264100814,16.75614429413912" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 901.105 128.165 L 787.691 16.7561');"/><path class="link" marker-end="url(#default)" d="M889.8299273506817,161.73039741783313L720.7850367550856,183.54836760816127" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 889.83 161.73 L 720.785 183.548');"/><path class="link" marker-end="url(#default)" d="M914.4404798457314,193.93943056183141L891.3946870661262,249.33546823674385" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 914.44 193.939 L 891.395 249.335');"/><path class="link" marker-end="url(#default)" d="M907.7357346814385,122.71285132366341L836.9855558234507,15.183344742412423" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 907.736 122.713 L 836.986 15.1833');"/><path class="link" marker-end="url(#default)" d="M951.3676869609499,190.94874025134618L1029.4257198893652,316.6050980188367" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 951.368 190.949 L 1029.43 316.605');"/><path class="link" marker-end="url(#default)" d="M756.2209801426259,275.89586077528776L896.6121934426341,179.47482286663413" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 756.221 275.896 L 896.612 179.475');"/><path class="link" marker-end="url(#default)" d="M758.0971958204982,298.0755337914633L785.0475970544039,310.5345943571898" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 758.097 298.076 L 785.048 310.535');"/><path class="link" marker-end="url(#default)" d="M725.8266192061552,269.50573326714084L699.8499856450951,227.5650453538258" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 725.827 269.506 L 699.85 227.565');"/><path class="link" marker-end="url(#default)" d="M727.5445998357076,308.7248983034901L667.0502953621125,428.71093270416145" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 727.545 308.725 L 667.05 428.711');"/><path class="link" marker-end="url(#default)" d="M594.3192874210292,-11.900231536944922L659.2013901572432,147.62442521587258" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 594.319 -11.9002 L 659.201 147.624');"/><path class="link" marker-end="url(#default)" d="M971.2093287720428,222.92565979090836L862.1908512525048,302.8181319568953" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 971.209 222.926 L 862.191 302.818');"/><path class="link" marker-end="url(#default)" d="M972.5852219214314,194.62813600538087L960.1873263318549,183.5421380912026" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 972.585 194.628 L 960.187 183.542');"/><path class="link" marker-end="url(#default)" d="M971.1112412130514,196.4609694942482L862.238025617465,117.90873138691566" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 971.111 196.461 L 862.238 117.909');"/><path class="link" marker-end="url(#default)" d="M969.9537465392497,221.01596364107849L903.5912082360709,259.97056691721275" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 969.954 221.016 L 903.591 259.971');"/><path class="link" marker-end="url(#default)" d="M1055.1774202783977,229.71541697235847L1070.4317332481953,147.0845754047622" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1055.18 229.715 L 1070.43 147.085');"/><path class="link" marker-end="url(#default)" d="M1032.0880298899,238.31340590857718L961.6077166821331,181.86414451902866" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1032.09 238.313 L 961.608 181.864');"/><path class="link" marker-end="url(#default)" d="M1028.0864114197445,261.00840201931567L868.5203110855783,314.9956245179002" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1028.09 261.008 L 868.52 314.996');"/><path class="link" marker-end="url(#default)" d="M1026.97923394701,256.0727828638501L906.931285009094,269.9509190846572" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1026.98 256.073 L 906.931 269.951');"/><path class="link" marker-end="url(#default)" d="M1029.2905206015287,263.92143791667604L1006.0214909478625,275.3828695808339" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1029.29 263.921 L 1006.02 275.383');"/><path class="link" marker-end="url(#default)" d="M891.1665966628783,403.28007544634596L923.7004958378586,196.55380769154047" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 891.167 403.28 L 923.701 196.554');"/><path class="link" marker-end="url(#default)" d="M868.9331455471099,425.9395112180857L688.6982809068647,457.8202800154495" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 868.933 425.94 L 688.698 457.82');"/><path class="link" marker-end="url(#default)" d="M861.9278838553495,289.1045723133321L680.0613140769316,439.10511324024753" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 861.928 289.105 L 680.061 439.105');"/><path class="link" marker-end="url(#default)" d="M903.5912082360709,259.97056691721275L969.9537465392497,221.01596364107849" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 903.591 259.971 L 969.954 221.016');"/><path class="link" marker-end="url(#default)" d="M891.3946870661262,249.33546823674385L914.4404798457314,193.93943056183141" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 891.395 249.335 L 914.44 193.939');"/><path class="link" marker-end="url(#default)" d="M906.8955378452213,276.10198404624407L960.6839904697954,282.95461177180476" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 906.896 276.102 L 960.684 282.955');"/><path class="link" marker-end="url(#default)" d="M906.931285009094,269.9509190846572L1026.97923394701,256.0727828638501" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 906.931 269.951 L 1026.98 256.073');"/><path class="link" marker-end="url(#default)" d="M857.9794614793061,263.2709870004342L717.8385160399184,206.26448472960482" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 857.979 263.271 L 717.839 206.264');"/><path class="link" marker-end="url(#default)" d="M1129.3600131279386,889.7876601616584L1155.2529018094074,869.8656428489738" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1129.36 889.788 L 1155.25 869.866');"/><path class="link" marker-end="url(#default)" d="M1155.2529018094074,869.8656428489738L1129.3600131279386,889.7876601616584" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1155.25 869.866 L 1129.36 889.788');"/><path class="link" marker-end="url(#default)" d="M975.1791905733353,263.8680183540861L945.7113847537091,193.8731607678087" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 975.179 263.868 L 945.711 193.873');"/><path class="link" marker-end="url(#default)" d="M966.1290063444104,270.5339963285206L874.4746418207089,193.39886124187575" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 966.129 270.534 L 874.475 193.399');"/><path class="link" marker-end="url(#default)" d="M961.3437685799008,292.32643034786867L869.296101660144,317.5325711247258" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 961.344 292.326 L 869.296 317.533');"/><path class="link" marker-end="url(#default)" d="M1006.0214909478625,275.3828695808339L1029.2905206015287,263.92143791667604" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1006.02 275.383 L 1029.29 263.921');"/><path class="link" marker-end="url(#default)" d="M960.6839904697954,282.95461177180476L906.8955378452213,276.10198404624407" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 960.684 282.955 L 906.896 276.102');"/><path class="link" marker-end="url(#default)" d="M1058.2003532201322,-10.64875577040556L954.6407514621665,124.40709114524965" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1058.2 -10.6488 L 954.641 124.407');"/><path class="link" marker-end="url(#default)" d="M850.4183049579939,151.88782673702312L846.1047595885846,128.08000086859457" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 850.418 151.888 L 846.105 128.08');"/><path class="link" marker-end="url(#default)" d="M879.8128216269902,171.2515522562373L1053.7806983616738,131.1505033238242" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 879.813 171.252 L 1053.78 131.15');"/><path class="link" marker-end="url(#default)" d="M879.5684218116853,170.27905968458566L890.9198246757954,167.18780171836738" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 879.568 170.279 L 890.92 167.188');"/><path class="link" marker-end="url(#default)" d="M850.1875892443056,202.02790417291732L834.3237022848544,285.21432204277687" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 850.188 202.028 L 834.324 285.214');"/><path class="link" marker-end="url(#default)" d="M874.4746418207089,193.39886124187575L966.1290063444104,270.5339963285206" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 874.475 193.399 L 966.129 270.534');"/><path class="link" marker-end="url(#default)" d="M829.5248296086053,178.73342568055395L721.0486311216248,186.21307521258572" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 829.525 178.733 L 721.049 186.213');"/><path class="link" marker-end="url(#default)" d="M549.4000389236301,2.8219556652861453L650.858876563557,152.09170342562803" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 549.4 2.82196 L 650.859 152.092');"/><path class="link" marker-end="url(#default)" d="M877.5108094718935,-107.85830613927195L845.8448612257878,77.85132333029101" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 877.511 -107.858 L 845.845 77.8513');"/><path class="link" marker-end="url(#default)" d="M836.9855558234507,15.183344742412423L907.7357346814385,122.71285132366341" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 836.986 15.1833 L 907.736 122.713');"/><path class="link" marker-end="url(#default)" d="M814.1949187810842,14.20685732045973L704.0145318275687,153.96936557976306" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 814.195 14.2069 L 704.015 153.969');"/><path class="link" marker-end="url(#default)" d="M494.8707726023278,60.823985426160384L639.4412657259518,163.28770359578684" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 494.871 60.824 L 639.441 163.288');"/><path class="link" marker-end="url(#default)" d="M846.1047595885846,128.08000086859457L850.4183049579939,151.88782673702312" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 846.105 128.08 L 850.418 151.888');"/><path class="link" marker-end="url(#default)" d="M863.3706803590102,116.19778239432341L895.3541026344435,135.56679159326222" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 863.371 116.198 L 895.354 135.567');"/><path class="link" marker-end="url(#default)" d="M845.8448612257878,77.85132333029101L877.5108094718935,-107.85830613927195" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 845.845 77.8513 L 877.511 -107.858');"/><path class="link" marker-end="url(#default)" d="M818.9519923249641,114.78637582144691L716.0493051564681,168.48880640422112" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 818.952 114.786 L 716.049 168.489');"/><path class="link" marker-end="url(#default)" d="M862.238025617465,117.90873138691566L971.1112412130514,196.4609694942482" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 862.238 117.909 L 971.111 196.461');"/><path class="link" marker-end="url(#default)" d="M839.7987232942586,128.42770885453314L828.9997210251196,284.52501580960717" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 839.799 128.428 L 829 284.525');"/><path class="link" marker-end="url(#default)" d="M531.1632703311466,454.41439103741493L608.4764960645156,461.2880337911976" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 531.163 454.414 L 608.477 461.288');"/><path class="link" marker-end="url(#default)" d="M474.28098144021004,451.31867220562043L305.50151064183814,447.9314994943752" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 474.281 451.319 L 305.502 447.931');"/><path class="link" marker-end="url(#default)" d="M492.6975784773183,478.5492950138664L476.7400907346525,520.7621653090171" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 492.698 478.549 L 476.74 520.762');"/><path class="link" marker-end="url(#default)" d="M525.8575977366511,468.6074189862367L569.1337015145269,499.949220852574" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 525.858 468.607 L 569.134 499.949');"/><path class="link" marker-end="url(#default)" d="M509.4322966291407,479.6021288088185L542.9459391433547,619.1108927138638" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 509.432 479.602 L 542.946 619.111');"/><path class="link" marker-end="url(#default)" d="M497.94672731144715,479.97850736298165L477.3098519120872,600.0254034576972" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 497.947 479.979 L 477.31 600.025');"/><path class="link" marker-end="url(#default)" d="M518.479034941685,428.1073057072707L651.3597652550619,226.86099741958245" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 518.479 428.107 L 651.36 226.861');"/><path class="link" marker-end="url(#default)" d="M504.03126698759866,423.41820354692805L505.04626763790804,400.40953840998174" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 504.031 423.418 L 505.046 400.41');"/><path class="link" marker-end="url(#default)" d="M305.50151064183814,447.9314994943752L474.28098144021004,451.31867220562043" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 305.502 447.931 L 474.281 451.319');"/><path class="link" marker-end="url(#default)" d="M577.7731418747873,491.9562373380855L519.4791856869278,396.68558180188415" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 577.773 491.956 L 519.479 396.686');"/><path class="link" marker-end="url(#default)" d="M615.170267375619,496.8722947107597L619.4692512323113,492.784050821615" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 615.17 496.872 L 619.469 492.784');"/><path class="link" marker-end="url(#default)" d="M569.1337015145269,499.949220852574L525.8575977366511,468.6074189862367" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 569.134 499.949 L 525.858 468.607');"/><path class="link" marker-end="url(#default)" d="M619.4449588390809,532.4881718039996L683.1599244670621,569.0854151881233" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 619.445 532.488 L 683.16 569.085');"/><path class="link" marker-end="url(#default)" d="M564.1031405857784,523.8611512320966L492.65184121223683,539.2468505719548" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 564.103 523.861 L 492.652 539.247');"/><path class="link" marker-end="url(#default)" d="M616.75101622823,498.6734197792691L790.9138389341786,357.7265311942093" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 616.751 498.673 L 790.914 357.727');"/><path class="link" marker-end="url(#default)" d="M583.7986796543286,545.9575817351293L558.7536163020607,619.8314716483359" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 583.799 545.958 L 558.754 619.831');"/><path class="link" marker-end="url(#default)" d="M597.3849050962548,547.2842552958504L622.8654481066733,738.9256053390834" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 597.385 547.284 L 622.865 738.926');"/><path class="link" marker-end="url(#default)" d="M588.2924790601566,487.9892986456582L562.2463945038498,338.1703137152797" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 588.292 487.989 L 562.246 338.17');"/><path class="link" marker-end="url(#default)" d="M519.4791856869278,396.68558180188415L577.7731418747873,491.9562373380855" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 519.479 396.686 L 577.773 491.956');"/><path class="link" marker-end="url(#default)" d="M527.7404666330278,388.53462006412923L614.5585225803536,443.27411144279625" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 527.74 388.535 L 614.559 443.274');"/><path class="link" marker-end="url(#default)" d="M523.3915960725021,356.12821661391513L645.7643098660097,222.49579578521707" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 523.392 356.128 L 645.764 222.496');"/><path class="link" marker-end="url(#default)" d="M505.04626763790804,400.40953840998174L504.03126698759866,423.41820354692805" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 505.046 400.41 L 504.031 423.418');"/><path class="link" marker-end="url(#default)" d="M500.5350318221531,399.80389915226897L473.35827798940346,519.7451747328805" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 500.535 399.804 L 473.358 519.745');"/><path class="link" marker-end="url(#default)" d="M481.80839569203465,382.46813457675194L423.66108718624275,400.4501187620291" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 481.808 382.468 L 423.661 400.45');"/><path class="link" marker-end="url(#default)" d="M660.74090027971,669.0670029504024L651.1782937020431,505.30572473828005" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 660.741 669.067 L 651.178 505.306');"/><path class="link" marker-end="url(#default)" d="M643.5983412376296,681.742871086105L576.3188879628775,656.747773819495" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 643.598 681.743 L 576.319 656.748');"/><path class="link" marker-end="url(#default)" d="M803.4026777593846,519.3366635740837L687.0160357860301,478.33239654478416" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 803.403 519.337 L 687.016 478.332');"/><path class="link" marker-end="url(#default)" d="M822.2015537103227,506.32059107033734L824.9549236253185,374.40791554931116" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 822.202 506.321 L 824.955 374.408');"/><path class="link" marker-end="url(#default)" d="M957.8113209818297,520.2227753905394L851.4850275556122,366.43256002669204" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 957.811 520.223 L 851.485 366.433');"/><path class="link" marker-end="url(#default)" d="M683.1599244670621,569.0854151881233L619.4449588390809,532.4881718039996" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 683.16 569.085 L 619.445 532.488');"/><path class="link" marker-end="url(#default)" d="M710.7287943426193,560.7458018367748L805.8389038387096,369.70162665475567" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 710.729 560.746 L 805.839 369.702');"/><path class="link" marker-end="url(#default)" d="M680.8014827839315,583.7812562293537L499.1803884232806,621.1884165878108" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 680.801 583.781 L 499.18 621.188');"/><path class="link" marker-end="url(#default)" d="M1020.3027250718742,456.7707382247447L863.5363569830172,354.0764284548258" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1020.3 456.771 L 863.536 354.076');"/><path class="link" marker-end="url(#default)" d="M1347.879383290417,639.0579650453519L1362.8804083619664,609.658173805196" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1347.88 639.058 L 1362.88 609.658');"/><path class="link" marker-end="url(#default)" d="M1362.8804083619664,609.658173805196L1347.879383290417,639.0579650453519" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1362.88 609.658 L 1347.88 639.058');"/><path class="link" marker-end="url(#default)" d="M809.8650020680302,287.36927177064496L748.9996219146623,127.70263539016497" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 809.865 287.369 L 749 127.703');"/><path class="link" marker-end="url(#default)" d="M793.035164293575,298.6720221878592L709.0140496583789,220.05425753339733" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 793.035 298.672 L 709.014 220.054');"/><path class="link" marker-end="url(#default)" d="M790.1523045999644,356.75874586870225L680.9848918315117,440.26766941844573" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 790.152 356.759 L 680.985 440.268');"/><path class="link" marker-end="url(#default)" d="M785.0475970544039,310.5345943571898L758.0971958204982,298.0755337914633" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 785.048 310.535 L 758.097 298.076');"/><path class="link" marker-end="url(#default)" d="M790.9138389341786,357.7265311942093L616.75101622823,498.6734197792691" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 790.914 357.727 L 616.751 498.673');"/><path class="link" marker-end="url(#default)" d="M805.8389038387096,369.70162665475567L710.7287943426193,560.7458018367748" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 805.839 369.702 L 710.729 560.746');"/><path class="link" marker-end="url(#default)" d="M818.3721690550703,285.05081032615465L783.4823953585294,79.25604119313985" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 818.372 285.051 L 783.482 79.256');"/><path class="link" marker-end="url(#default)" d="M824.9549236253185,374.40791554931116L822.2015537103227,506.32059107033734" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 824.955 374.408 L 822.202 506.321');"/><path class="link" marker-end="url(#default)" d="M857.9970705912353,360.9516992730952L987.4574281014302,488.1170904926541" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 857.997 360.952 L 987.457 488.117');"/><path class="link" marker-end="url(#default)" d="M869.296101660144,317.5325711247258L961.3437685799008,292.32643034786867" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 869.296 317.533 L 961.344 292.326');"/><path class="link" marker-end="url(#default)" d="M834.3237022848544,285.21432204277687L850.1875892443056,202.02790417291732" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 834.324 285.214 L 850.188 202.028');"/><path class="link" marker-end="url(#default)" d="M862.1908512525048,302.8181319568953L971.2093287720428,222.92565979090836" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 862.191 302.818 L 971.209 222.926');"/><path class="link" marker-end="url(#default)" d="M868.5203110855783,314.9956245179002L1028.0864114197445,261.00840201931567" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 868.52 314.996 L 1028.09 261.008');"/><path class="link" marker-end="url(#default)" d="M849.1085550114158,290.8679556319107L909.1036490941799,191.24100324326662" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 849.109 290.868 L 909.104 191.241');"/><path class="link" marker-end="url(#default)" d="M802.9875589576474,290.6840673795726L690.5727093212041,100.59608351411005" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 802.988 290.684 L 690.573 100.596');"/><path class="link" marker-end="url(#default)" d="M851.4850275556122,366.43256002669204L957.8113209818297,520.2227753905394" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 851.485 366.433 L 957.811 520.223');"/><path class="link" marker-end="url(#default)" d="M863.5363569830172,354.0764284548258L1020.3027250718742,456.7707382247447" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 863.536 354.076 L 1020.3 456.771');"/><path class="link" marker-end="url(#default)" d="M828.9997210251196,284.52501580960717L839.7987232942586,128.42770885453314" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 829 284.525 L 839.799 128.428');"/><path class="link" marker-end="url(#default)" d="M870.8870645549401,330.20713153901323L1020.2184270317373,332.827193928186" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 870.887 330.207 L 1020.22 332.827');"/><path class="link" marker-end="url(#default)" d="M1070.4317332481953,147.0845754047622L1055.1774202783977,229.71541697235847" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1070.43 147.085 L 1055.18 229.715');"/><path class="link" marker-end="url(#default)" d="M1053.687236008813,130.7249163260444L969.6421050380764,148.26996005952023" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1053.69 130.725 L 969.642 148.27');"/><path class="link" marker-end="url(#default)" d="M1053.7806983616738,131.1505033238242L879.8128216269902,171.2515522562373" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1053.78 131.15 L 879.813 171.252');"/><path class="link" marker-end="url(#default)" d="M690.5727093212041,100.59608351411005L802.9875589576474,290.6840673795726" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 690.573 100.596 L 802.988 290.684');"/><path class="link" marker-end="url(#default)" d="M679.8171602305049,103.29385512330789L678.0692922212662,144.34929053710715" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 679.817 103.294 L 678.069 144.349');"/><path class="link" marker-end="url(#default)" d="M783.4823953585294,79.25604119313985L818.3721690550703,285.05081032615465" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 783.482 79.256 L 818.372 285.051');"/><path class="link" marker-end="url(#default)" d="M142.81939857217893,-14.569548499998525L160.28876592256117,-43.500399956128234" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 142.819 -14.5695 L 160.289 -43.5004');"/><path class="link" marker-end="url(#default)" d="M160.28876592256117,-43.500399956128234L142.81939857217893,-14.569548499998525" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 160.289 -43.5004 L 142.819 -14.5695');"/><path class="link" marker-end="url(#default)" d="M1020.2184270317373,332.827193928186L870.8870645549401,330.20713153901323" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1020.22 332.827 L 870.887 330.207');"/><path class="link" marker-end="url(#default)" d="M1029.4257198893652,316.6050980188367L951.3676869609499,190.94874025134618" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1029.43 316.605 L 951.368 190.949');"/><path class="link" marker-end="url(#default)" d="M533.3640783070696,274.36716732756054L627.8269208337267,430.23862166348675" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 533.364 274.367 L 627.827 430.239');"/><path class="link" marker-end="url(#default)" d="M541.0583678940437,249.72934618579217L635.0764442392111,207.68065778531331" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 541.058 249.729 L 635.076 207.681');"/><path class="link" marker-end="url(#default)" d="M423.66108718624275,400.4501187620291L481.80839569203465,382.46813457675194" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 423.661 400.45 L 481.808 382.468');"/><path class="link" marker-end="url(#default)" d="M423.99038402235885,410.77342485465834L609.4413682331635,455.3993641455929" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 423.99 410.773 L 609.441 455.399');"/><path class="link" marker-end="url(#default)" d="M787.6913264100814,16.75614429413912L901.1047277373924,128.16487791798883" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 787.691 16.7561 L 901.105 128.165');"/><path class="link" marker-end="url(#default)" d="M764.7262002842916,20.361618122685034L697.0494134497764,149.45341617487145" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 764.726 20.3616 L 697.049 149.453');"/><path class="link" marker-end="url(#default)" d="M1108.6015005016013,41.40048691504444L964.0359882670384,134.6012701738891" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 1108.6 41.4005 L 964.036 134.601');"/><path class="link" marker-end="url(#default)" d="M538.9837016015194,44.728025964165994L645.1828669922282,156.66330391229823" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 538.984 44.728 L 645.183 156.663');"/><path class="link" marker-end="url(#default)" d="M562.2463945038498,338.1703137152797L588.2924790601566,487.9892986456582" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 562.246 338.17 L 588.292 487.989');"/><path class="link" marker-end="url(#default)" d="M573.7109567828686,299.52261663651035L645.5184447076275,222.26896098416955" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 573.711 299.523 L 645.518 222.269');"/><path class="link" marker-end="url(#default)" d="M570.0731960476776,335.2333347398651L627.7922429749298,430.2596612508609" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 570.073 335.233 L 627.792 430.26');"/><path class="link" marker-end="url(#default)" d="M549.171379927653,295.4791768146002L496.5224170883957,178.29813895609857" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 549.171 295.479 L 496.522 178.298');"/><path class="link" marker-end="url(#default)" d="M496.5224170883957,178.29813895609857L549.171379927653,295.4791768146002" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 496.522 178.298 L 549.171 295.479');"/><path class="link" marker-end="url(#default)" d="M507.80501436471855,163.46930418487273L631.6760879505398,182.48167697485596" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 507.805 163.469 L 631.676 182.482');"/><path class="link" marker-end="url(#default)" d="M704.8031374341645,154.60558090656943L729.639631912873,124.51960307539386" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 704.803 154.606 L 729.64 124.52');"/><path class="link" marker-end="url(#default)" d="M639.4412657259518,163.28770359578684L494.8707726023278,60.823985426160384" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 639.441 163.288 L 494.871 60.824');"/><path class="link" marker-end="url(#default)" d="M720.7850367550856,183.54836760816127L889.8299273506817,161.73039741783313" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 720.785 183.548 L 889.83 161.73');"/><path class="link" marker-end="url(#default)" d="M704.0145318275687,153.96936557976306L814.1949187810842,14.20685732045973" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 704.015 153.969 L 814.195 14.2069');"/><path class="link" marker-end="url(#default)" d="M709.0140496583789,220.05425753339733L793.035164293575,298.6720221878592" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 709.014 220.054 L 793.035 298.672');"/><path class="link" marker-end="url(#default)" d="M645.5184447076275,222.26896098416955L573.7109567828686,299.52261663651035" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 645.518 222.269 L 573.711 299.523');"/><path class="link" marker-end="url(#default)" d="M645.1828669922282,156.66330391229823L538.9837016015194,44.728025964165994" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 645.183 156.663 L 538.984 44.728');"/><path class="link" marker-end="url(#default)" d="M650.858876563557,152.09170342562803L549.4000389236301,2.8219556652861453" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 650.859 152.092 L 549.4 2.82196');"/><path class="link" marker-end="url(#default)" d="M651.3597652550619,226.86099741958245L518.479034941685,428.1073057072707" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 651.36 226.861 L 518.479 428.107');"/><path class="link" marker-end="url(#default)" d="M717.8385160399184,206.26448472960482L857.9794614793061,263.2709870004342" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 717.839 206.264 L 857.979 263.271');"/><path class="link" marker-end="url(#default)" d="M699.8499856450951,227.5650453538258L725.8266192061552,269.50573326714084" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 699.85 227.565 L 725.827 269.506');"/><path class="link" marker-end="url(#default)" d="M645.7643098660097,222.49579578521707L523.3915960725021,356.12821661391513" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 645.764 222.496 L 523.392 356.128');"/><path class="link" marker-end="url(#default)" d="M716.0493051564681,168.48880640422112L818.9519923249641,114.78637582144691" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 716.049 168.489 L 818.952 114.786');"/><path class="link" marker-end="url(#default)" d="M721.0486311216248,186.21307521258572L829.5248296086053,178.73342568055395" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 721.049 186.213 L 829.525 178.733');"/><path class="link" marker-end="url(#default)" d="M631.6760879505398,182.48167697485596L507.80501436471855,163.46930418487273" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 631.676 182.482 L 507.805 163.469');"/><path class="link" marker-end="url(#default)" d="M635.0764442392111,207.68065778531331L541.0583678940437,249.72934618579217" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 635.076 207.681 L 541.058 249.729');"/><path class="link" marker-end="url(#default)" d="M659.2013901572432,147.62442521587258L594.3192874210292,-11.900231536944922" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 659.201 147.624 L 594.319 -11.9002');"/><path class="link" marker-end="url(#default)" d="M678.0692922212662,144.34929053710715L679.8171602305049,103.29385512330789" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 678.069 144.349 L 679.817 103.294');"/><path class="link" marker-end="url(#default)" d="M697.0494134497764,149.45341617487145L764.7262002842916,20.361618122685034" style="overflow-x:visible;overflow-y:visible;pointer-events:none;perspective-origin:0px 0px;transform-origin:0px 0px;fill:none;marker-end:url("#default");stroke:rgb(153, 153, 153);stroke-opacity:0.6;stroke-width:1.5px;d:path('M 697.049 149.453 L 764.726 20.3616');"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><circle class="node" r="40.5" source="17" dest="16" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 648.817, 464.875);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:40.5px;" transform="translate(648.8173756060027,464.8745973023083)"/><circle class="node" r="30" source="10" dest="9" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 593.431, 517.546);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:30px;" transform="translate(593.4309159876994,517.5459639843202)"/><circle class="node" r="27" source="8" dest="7" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 472.735, 626.635);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:27px;" transform="translate(472.7354676930124,626.6350823173956)"/><circle class="node" r="25.5" source="7" dest="6" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 467.723, 544.615);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:25.5px;" transform="translate(467.723232120604,544.6147597325648)"/><circle class="node" r="22.5" source="5" dest="4" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 558.393, 316.003);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:22.5px;" transform="translate(558.3925668081927,316.0028147112832)"/><circle class="node" r="22.5" source="5" dest="4" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 737.674, 288.634);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:22.5px;" transform="translate(737.673999700213,288.63397352674184)"/><circle class="node" r="28.5" source="9" dest="8" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 502.775, 451.891);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:28.5px;" transform="translate(502.7752439871372,451.8905130110778)"/><circle class="node" r="25.5" source="7" dest="6" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 506.17, 374.934);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:25.5px;" transform="translate(506.17007769095255,374.9343141525846)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 523.258, 257.691);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(523.2575630463441,257.69058646442426)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 405.032, 406.211);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(405.0315656576585,406.2112755569806)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 772.992, 676.589);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(772.991853222246,676.5891197027615)"/><circle class="node" r="45" source="20" dest="19" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 825.894, 329.418);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:45px;" transform="translate(825.8939892949744,329.4177148866327)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 888.135, 422.543);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(888.1350629141916,422.5429880799685)"/><circle class="node" r="25.5" source="7" dest="6" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 881.6, 272.879);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:25.5px;" transform="translate(881.5999932629715,272.8793416075901)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 661.878, 688.534);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(661.877638622248,688.5338420862406)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 821.795, 525.816);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(821.7946252534718,525.8163446908313)"/><circle class="node" r="28.5" source="9" dest="8" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 549.603, 646.823);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:28.5px;" transform="translate(549.6029917853583,646.8225085116045)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 566.874, 835.174);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(566.8740880286491,835.1742406978119)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 495.253, 821.013);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(495.25349011631596,821.0128258068886)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 366.802, 761.972);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(366.8018781425598,761.9722366582225)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 316.718, 707.687);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(316.71748561575504,707.6870048119566)"/><circle class="node" r="21" source="4" dest="3" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 701.37, 579.545);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:21px;" transform="translate(701.369754463029,579.5449606618989)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 742.054, 109.482);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(742.0537274496531,109.48164337323693)"/><circle class="node" r="45" source="20" dest="19" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 676.155, 189.309);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:45px;" transform="translate(676.1552246569795,189.30856483462387)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 625.238, 756.769);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(625.2378415718065,756.7685801260014)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1000.3, 500.731);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1000.2986606199346,500.7306842472391)"/><circle class="node" r="40.5" source="17" dest="16" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 929.997, 156.546);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:40.5px;" transform="translate(929.9967582389771,156.5462199140168)"/><circle class="node" r="25.5" source="7" dest="6" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 841.559, 102.989);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:25.5px;" transform="translate(841.5586379413409,102.98851271088535)"/><circle class="node" r="24" source="6" dest="5" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 984.492, 285.988);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:24px;" transform="translate(984.4915618413246,285.987687008185)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1069.15, -24.9328);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1069.1532390971054,-24.932813000968736)"/><circle class="node" r="25.5" source="7" dest="6" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 854.964, 176.979);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:25.5px;" transform="translate(854.9644266052376,176.97931489473234)"/><circle class="node" r="22.5" source="5" dest="4" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 989.358, 209.626);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:22.5px;" transform="translate(989.357759750808,209.62586832603964)"/><circle class="node" r="24" source="6" dest="5" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1050.82, 253.317);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:24px;" transform="translate(1050.8204497080667,253.31662048932495)"/><circle class="node" r="21" source="4" dest="3" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1074.24, 126.434);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:21px;" transform="translate(1074.2440824972348,126.43352232741654)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1123.73, 31.6472);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1123.7300471807396,31.647175919432126)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 773.78, 3.09105);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(773.7803487611702,3.0910537034589893)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 826.267, -1.1068);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(826.2672852216729,-1.106795689979954)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1039.72, 333.169);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(1039.7154263110558,333.16927447755086)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 587.538, -28.5739);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(587.5377536211347,-28.57388738444544)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1115.09, 900.764);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1115.0939558045884,900.7639805126179)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1169.52, 858.889);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1169.5189591327576,858.8893224980144)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 539.282, -12.0648);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(539.2814996862611,-12.064788898312186)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 880.536, -125.602);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(880.5363788491502,-125.60220452557382)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 480.185, 50.4156);transform-origin:0px 0px;fill:rgb(148, 103, 189);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(480.1851890299167,50.41564093062557)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 287.505, 447.57);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(287.50513429641046,447.5703368804021)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 968.048, 535.029);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(968.0477362860848,535.0287134465631)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1035.36, 466.634);transform-origin:0px 0px;fill:rgb(227, 119, 194);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1035.3596721470913,466.63422365202194)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1339.7, 655.091);transform-origin:0px 0px;fill:rgb(127, 127, 127);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1339.6984274865301,655.09142886746)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 1371.06, 593.625);transform-origin:0px 0px;fill:rgb(188, 189, 34);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(1371.0613641658533,593.624709983088)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 780.474, 61.5093);transform-origin:0px 0px;fill:rgb(214, 39, 40);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(780.4736672625678,61.50927936894863)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 680.647, 83.8115);transform-origin:0px 0px;fill:rgb(23, 190, 207);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(680.6465895083625,83.81150292771733)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 133.515, 0.839215);transform-origin:0px 0px;fill:rgb(31, 119, 180);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(133.5150977149026,0.839214771506656)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 169.593, -58.9092);transform-origin:0px 0px;fill:rgb(255, 127, 14);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(169.5930667798375,-58.909163227633414)"/><circle class="node" r="18" source="2" dest="1" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 526.595, 31.6699);transform-origin:0px 0px;fill:rgb(140, 86, 75);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:18px;" transform="translate(526.5947585356189,31.669921595235742)"/><circle class="node" r="19.5" source="3" dest="2" style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;-webkit-tap-highlight-color:rgba(0, 0, 0, 0);transform:matrix(1, 0, 0, 1, 488.531, 160.511);transform-origin:0px 0px;fill:rgb(44, 160, 44);stroke:rgb(0, 0, 0);stroke-width:0.5px;r:19.5px;" transform="translate(488.530721791928,160.51098611230663)"/></g><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"/><g style="overflow-x:visible;overflow-y:visible;perspective-origin:0px 0px;transform-origin:0px 0px;"><text visibility="visible" transform="translate(648.8173756060027,464.8745973023083)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 648.817, 464.875);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">src</text><text visibility="visible" transform="translate(593.4309159876994,517.5459639843202)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.275px 0px;transform:matrix(1, 0, 0, 1, 593.431, 517.546);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">containers</text><text visibility="visible" transform="translate(472.7354676930124,626.6350823173956)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 472.735, 626.635);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">runtime</text><text visibility="visible" transform="translate(467.723232120604,544.6147597325648)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 467.723, 544.615);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">arch</text><text visibility="visible" transform="translate(558.3925668081927,316.0028147112832)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 558.393, 316.003);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">log</text><text visibility="visible" transform="translate(737.673999700213,288.63397352674184)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 737.674, 288.634);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">auth</text><text visibility="visible" transform="translate(502.7752439871372,451.8905130110778)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 502.775, 451.891);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">concurrency</text><text visibility="visible" transform="translate(506.17007769095255,374.9343141525846)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 506.17, 374.934);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">archive</text><text visibility="visible" transform="translate(523.2575630463441,257.69058646442426)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 523.258, 257.691);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">region</text><text visibility="visible" transform="translate(405.0315656576585,406.2112755569806)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 405.032, 406.211);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rpc</text><text visibility="visible" transform="translate(772.991853222246,676.5891197027615)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 772.992, 676.589);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">windows_stub</text><text visibility="visible" transform="translate(825.8939892949744,329.4177148866327)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.25px 0px;transform:matrix(1, 0, 0, 1, 825.894, 329.418);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rdb_protocol</text><text visibility="visible" transform="translate(888.1350629141916,422.5429880799685)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 888.135, 422.543);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">logs</text><text visibility="visible" transform="translate(881.5999932629715,272.8793416075901)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 881.6, 272.879);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">main</text><text visibility="visible" transform="translate(661.877638622248,688.5338420862406)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 661.878, 688.534);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">crypto</text><text visibility="visible" transform="translate(821.7946252534718,525.8163446908313)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.275px 0px;transform:matrix(1, 0, 0, 1, 821.795, 525.816);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">extproc</text><text visibility="visible" transform="translate(549.6029917853583,646.8225085116045)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.05px 0px;transform:matrix(1, 0, 0, 1, 549.603, 646.823);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">io</text><text visibility="visible" transform="translate(566.8740880286491,835.1742406978119)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2px 0px;transform:matrix(1, 0, 0, 1, 566.874, 835.174);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">timer</text><text visibility="visible" transform="translate(495.25349011631596,821.0128258068886)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 495.253, 821.013);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">disk</text><text visibility="visible" transform="translate(366.8018781425598,761.9722366582225)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 366.802, 761.972);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">event_queue</text><text visibility="visible" transform="translate(316.71748561575504,707.6870048119566)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.4125px 0px;transform:matrix(1, 0, 0, 1, 316.718, 707.687);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">system_event</text><text visibility="visible" transform="translate(701.369754463029,579.5449606618989)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 701.37, 579.545);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">perfmon</text><text visibility="visible" transform="translate(742.0537274496531,109.48164337323693)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 742.054, 109.482);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">btree</text><text visibility="visible" transform="translate(676.1552246569795,189.30856483462387)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.4125px 0px;transform:matrix(1, 0, 0, 1, 676.155, 189.309);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">unittest</text><text visibility="visible" transform="translate(625.2378415718065,756.7685801260014)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.05px 0px;transform:matrix(1, 0, 0, 1, 625.238, 756.769);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">buffer_cache</text><text visibility="visible" transform="translate(1000.2986606199346,500.7306842472391)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.25px 0px;transform:matrix(1, 0, 0, 1, 1000.3, 500.731);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">client_protocol</text><text visibility="visible" transform="translate(929.9967582389771,156.5462199140168)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 929.997, 156.546);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">administration</text><text visibility="visible" transform="translate(841.5586379413409,102.98851271088535)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.1875px 0px;transform:matrix(1, 0, 0, 1, 841.559, 102.989);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">table_manager</text><text visibility="visible" transform="translate(984.4915618413246,285.987687008185)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 984.492, 285.988);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">servers</text><text visibility="visible" transform="translate(1069.1532390971054,-24.932813000968736)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 1069.15, -24.9328);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">stats</text><text visibility="visible" transform="translate(854.9644266052376,176.97931489473234)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.0875px 0px;transform:matrix(1, 0, 0, 1, 854.964, 176.979);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">tables</text><text visibility="visible" transform="translate(989.357759750808,209.62586832603964)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 989.358, 209.626);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">issues</text><text visibility="visible" transform="translate(1050.8204497080667,253.31662048932495)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.0875px 0px;transform:matrix(1, 0, 0, 1, 1050.82, 253.317);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">jobs</text><text visibility="visible" transform="translate(1074.2440824972348,126.43352232741654)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 1074.24, 126.434);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">artificial_table</text><text visibility="visible" transform="translate(1123.7300471807396,31.647175919432126)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 1123.73, 31.6472);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">semilattice</text><text visibility="visible" transform="translate(773.7803487611702,3.0910537034589893)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 773.78, 3.09105);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">connectivity</text><text visibility="visible" transform="translate(826.2672852216729,-1.106795689979954)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 826.267, -1.1068);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">query_routing</text><text visibility="visible" transform="translate(1039.7154263110558,333.16927447755086)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:-0.0875px 0px;transform:matrix(1, 0, 0, 1, 1039.72, 333.169);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">terms</text><text visibility="visible" transform="translate(587.5377536211347,-28.57388738444544)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.4375px 0px;transform:matrix(1, 0, 0, 1, 587.538, -28.5739);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">http</text><text visibility="visible" transform="translate(1115.0939558045884,900.7639805126179)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.4125px 0px;transform:matrix(1, 0, 0, 1, 1115.09, 900.764);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">persist</text><text visibility="visible" transform="translate(1169.5189591327576,858.8893224980144)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 1169.52, 858.889);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">migrate</text><text visibility="visible" transform="translate(539.2814996862611,-12.064788898312186)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 539.282, -12.0648);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">generic</text><text visibility="visible" transform="translate(880.5363788491502,-125.60220452557382)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.2875px 0px;transform:matrix(1, 0, 0, 1, 880.536, -125.602);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">immediate_consistency</text><text visibility="visible" transform="translate(480.1851890299167,50.41564093062557)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0375px 0px;transform:matrix(1, 0, 0, 1, 480.185, 50.4156);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">table_contract</text><text visibility="visible" transform="translate(287.50513429641046,447.5703368804021)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 287.505, 447.57);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">queue</text><text visibility="visible" transform="translate(968.0477362860848,535.0287134465631)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 968.048, 535.029);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">parsing</text><text visibility="visible" transform="translate(1035.3596721470913,466.63422365202194)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.4125px 0px;transform:matrix(1, 0, 0, 1, 1035.36, 466.634);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">pprint</text><text visibility="visible" transform="translate(1339.6984274865301,655.09142886746)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 1339.7, 655.091);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">rapidjson</text><text visibility="visible" transform="translate(1371.0613641658533,593.624709983088)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.25px 0px;transform:matrix(1, 0, 0, 1, 1371.06, 593.625);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">internal</text><text visibility="visible" transform="translate(780.4736672625678,61.50927936894863)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 780.474, 61.5093);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">geo</text><text visibility="visible" transform="translate(680.6465895083625,83.81150292771733)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0875px 0px;transform:matrix(1, 0, 0, 1, 680.647, 83.8115);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">datum_stream</text><text visibility="visible" transform="translate(133.5150977149026,0.839214771506656)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 133.515, 0.839215);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">base</text><text visibility="visible" transform="translate(169.5930667798375,-58.909163227633414)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 169.593, -58.9092);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">endian</text><text visibility="visible" transform="translate(526.5947585356189,31.669921595235742)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.5625px 0px;transform:matrix(1, 0, 0, 1, 526.595, 31.6699);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">serializer</text><text visibility="visible" transform="translate(488.530721791928,160.51098611230663)" class="" style="cursor:default;display:block;font-family:sans-serif;font-size:10px;overflow-x:visible;overflow-y:visible;pointer-events:none;white-space:nowrap;perspective-origin:0.0625px 0px;transform:matrix(1, 0, 0, 1, 488.531, 160.511);transform-origin:0px 0px;user-select:none;stroke:rgb(0, 0, 0);stroke-width:0.5px;text-anchor:middle;">lba</text></g></g></svg>
|
data/exe/cpp_dependency_graph
CHANGED
@@ -1,5 +1,7 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
|
+
# frozen_string_literal: true
|
4
|
+
|
3
5
|
#--
|
4
6
|
# Copyright (c) 2018 Shreyas Balakrishna
|
5
7
|
|
@@ -36,7 +38,7 @@ doc = <<DOCOPT
|
|
36
38
|
|
37
39
|
Usage:
|
38
40
|
cpp_dependency_graph visualise --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
|
39
|
-
cpp_dependency_graph visualise_includes --root_dir <argument> --component <component> [--output_file <file>] [--output_format <format>]
|
41
|
+
cpp_dependency_graph visualise_includes --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
|
40
42
|
cpp_dependency_graph visualise_components --root_dir <argument> [--output_file <file>] [--output_format <format>]
|
41
43
|
cpp_dependency_graph visualise_cyclic_deps --root_dir <argument> [--component <component>] [--output_file <file>] [--output_format <format>]
|
42
44
|
cpp_dependency_graph -h | --help | -v | --version
|
@@ -53,18 +55,18 @@ DOCOPT
|
|
53
55
|
begin
|
54
56
|
args = Docopt.docopt(doc)
|
55
57
|
|
56
|
-
if
|
58
|
+
if args['--version']
|
57
59
|
puts VERSION
|
58
60
|
Kernel.exit(0)
|
59
61
|
end
|
60
62
|
|
61
|
-
|
63
|
+
project_dir = args['--root_dir'].tr('\\', '/')
|
64
|
+
|
65
|
+
unless File.directory?(project_dir)
|
62
66
|
puts('Not a valid project source directory')
|
63
67
|
Kernel.exit(1)
|
64
68
|
end
|
65
69
|
|
66
|
-
project_dir = args['--root_dir'].gsub(/\\/,'/')
|
67
|
-
|
68
70
|
if args['visualise']
|
69
71
|
if args['--component']
|
70
72
|
generate_component_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
|
@@ -72,11 +74,15 @@ begin
|
|
72
74
|
generate_project_graph(project_dir, args['--output_format'], args['--output_file'])
|
73
75
|
end
|
74
76
|
elsif args['visualise_includes']
|
75
|
-
|
77
|
+
if args['--component']
|
78
|
+
generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
|
79
|
+
else
|
80
|
+
generate_project_include_graph(project_dir, args['--output_format'], args['--output_file'])
|
81
|
+
end
|
76
82
|
elsif args['visualise_components']
|
77
|
-
|
83
|
+
generate_enclosure_diagram(project_dir, args['--output_file'])
|
78
84
|
elsif args['visualise_cyclic_deps']
|
79
|
-
|
85
|
+
generate_cyclic_dependencies(project_dir, args['--output_format'], args['--output_file'])
|
80
86
|
end
|
81
87
|
rescue Docopt::Exit => e
|
82
88
|
puts e.message
|
data/lib/cpp_dependency_graph.rb
CHANGED
@@ -1,48 +1,66 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
-
require_relative 'cpp_dependency_graph/
|
4
|
-
require_relative 'cpp_dependency_graph/
|
3
|
+
require_relative 'cpp_dependency_graph/circle_packing_visualiser'
|
4
|
+
require_relative 'cpp_dependency_graph/component_dependency_graph'
|
5
|
+
require_relative 'cpp_dependency_graph/dir_tree'
|
6
|
+
require_relative 'cpp_dependency_graph/graph_to_dot_visualiser'
|
7
|
+
require_relative 'cpp_dependency_graph/graph_to_html_visualiser'
|
5
8
|
require_relative 'cpp_dependency_graph/include_dependency_graph'
|
6
|
-
require_relative 'cpp_dependency_graph/
|
9
|
+
require_relative 'cpp_dependency_graph/project'
|
7
10
|
require_relative 'cpp_dependency_graph/version'
|
8
11
|
|
9
12
|
# Generates dependency graphs of a project in various output forms
|
10
13
|
module CppDependencyGraph
|
11
14
|
def generate_project_graph(project_dir, format, output_file)
|
12
15
|
project = Project.new(project_dir)
|
13
|
-
graph =
|
14
|
-
deps = graph.
|
16
|
+
graph = ComponentDependencyGraph.new(project)
|
17
|
+
deps = graph.all_links
|
15
18
|
generate_visualisation(deps, format, output_file)
|
16
19
|
end
|
17
20
|
|
18
21
|
def generate_component_graph(project_dir, component, format, output_file)
|
19
22
|
project = Project.new(project_dir)
|
20
|
-
graph =
|
21
|
-
deps = graph.
|
23
|
+
graph = ComponentDependencyGraph.new(project)
|
24
|
+
deps = graph.links(component)
|
22
25
|
generate_visualisation(deps, format, output_file)
|
23
26
|
end
|
24
27
|
|
25
28
|
def generate_component_include_graph(project_dir, component_name, format, output_file)
|
26
29
|
project = Project.new(project_dir)
|
27
30
|
graph = IncludeDependencyGraph.new(project)
|
28
|
-
deps = graph.
|
31
|
+
deps = graph.links(component_name)
|
29
32
|
generate_visualisation(deps, format, output_file)
|
30
33
|
end
|
31
34
|
|
32
|
-
def
|
35
|
+
def generate_project_include_graph(project_dir, format, output_file)
|
36
|
+
project = Project.new(project_dir)
|
37
|
+
graph = IncludeDependencyGraph.new(project)
|
38
|
+
deps = graph.all_links
|
39
|
+
generate_visualisation(deps, format, output_file)
|
40
|
+
end
|
41
|
+
|
42
|
+
def generate_enclosure_diagram(project_dir, output_file)
|
43
|
+
dir_tree = DirTree.new(project_dir)
|
44
|
+
tree = dir_tree.tree
|
45
|
+
puts tree
|
46
|
+
CirclePackingVisualiser.new.generate(tree, output_file)
|
47
|
+
end
|
48
|
+
|
49
|
+
def generate_cyclic_dependencies(project_dir, format, file)
|
33
50
|
project = Project.new(project_dir)
|
34
|
-
graph =
|
35
|
-
deps = graph.
|
36
|
-
|
37
|
-
puts JSON.pretty_generate(cyclic_deps)
|
51
|
+
graph = ComponentDependencyGraph.new(project)
|
52
|
+
deps = graph.all_cyclic_links
|
53
|
+
generate_visualisation(deps, format, file)
|
38
54
|
end
|
39
55
|
|
40
56
|
def generate_visualisation(deps, format, file)
|
41
57
|
case format
|
42
58
|
when 'dot'
|
43
|
-
|
59
|
+
GraphToDotVisualiser.new.generate(deps, file)
|
44
60
|
when 'html'
|
45
|
-
|
61
|
+
GraphToHtmlVisualiser.new.generate(deps, file)
|
62
|
+
when 'json'
|
63
|
+
File.write(file, JSON.pretty_generate(deps))
|
46
64
|
end
|
47
65
|
end
|
48
66
|
end
|
@@ -1,30 +1,31 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
|
+
# Hash that allows lookup by key and value
|
3
4
|
class BidirectionalHash
|
4
5
|
def initialize
|
5
|
-
@forward = Hash.new { |h, k| h[k] = [
|
6
|
-
@reverse = Hash.new { |h, k| h[k] = [
|
6
|
+
@forward = Hash.new { |h, k| h[k] = [] }
|
7
|
+
@reverse = Hash.new { |h, k| h[k] = [] }
|
7
8
|
end
|
8
9
|
|
9
|
-
def insert(
|
10
|
-
@forward[
|
11
|
-
@reverse[
|
12
|
-
|
10
|
+
def insert(key, value)
|
11
|
+
@forward[key].push(value)
|
12
|
+
@reverse[value].push(key)
|
13
|
+
value
|
13
14
|
end
|
14
15
|
|
15
|
-
def fetch(
|
16
|
-
fetch_from(@forward,
|
16
|
+
def fetch(key)
|
17
|
+
fetch_from(@forward, key)
|
17
18
|
end
|
18
19
|
|
19
|
-
def rfetch(
|
20
|
-
fetch_from(@reverse,
|
20
|
+
def rfetch(value)
|
21
|
+
fetch_from(@reverse, value)
|
21
22
|
end
|
22
23
|
|
23
24
|
protected
|
24
25
|
|
25
|
-
def fetch_from(
|
26
|
-
return nil
|
27
|
-
v =
|
26
|
+
def fetch_from(hash, key)
|
27
|
+
return nil unless hash.key?(key)
|
28
|
+
v = hash[key]
|
28
29
|
v.length == 1 ? v.first : v.dup
|
29
30
|
end
|
30
31
|
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
# Outputs a `d3 circle packing layout` equipped HTML representation of a hierarchical tree
|
6
|
+
class CirclePackingVisualiser
|
7
|
+
def generate(tree, file)
|
8
|
+
json_tree = JSON.pretty_generate(tree)
|
9
|
+
template_file = resolve_file_path('views/circle_packing.html.template')
|
10
|
+
template = File.read(template_file)
|
11
|
+
contents = format(template, tree: json_tree)
|
12
|
+
File.write(file, contents)
|
13
|
+
end
|
14
|
+
|
15
|
+
private
|
16
|
+
|
17
|
+
def resolve_file_path(path)
|
18
|
+
File.expand_path("../../../#{path}", __FILE__)
|
19
|
+
end
|
20
|
+
end
|