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.
Files changed (40) hide show
  1. checksums.yaml +4 -4
  2. data/.gitattributes +2 -0
  3. data/.rubocop_todo.yml +21 -0
  4. data/.vscode/launch.json +1 -1
  5. data/Gemfile +1 -1
  6. data/README.md +36 -4
  7. data/Rakefile +2 -0
  8. data/TODO.md +10 -2
  9. data/bin/console +2 -0
  10. data/cpp_dependency_graph.gemspec +7 -6
  11. data/docs/README.md +12 -0
  12. data/examples/leveldb_cyclic_deps.svg +1 -0
  13. data/examples/rethinkdb_cyclic_deps.svg +1 -0
  14. data/exe/cpp_dependency_graph +14 -8
  15. data/lib/cpp_dependency_graph.rb +33 -15
  16. data/lib/cpp_dependency_graph/bidirectional_hash.rb +14 -13
  17. data/lib/cpp_dependency_graph/circle_packing_visualiser.rb +20 -0
  18. data/lib/cpp_dependency_graph/component_dependency_graph.rb +56 -0
  19. data/lib/cpp_dependency_graph/config.rb +8 -0
  20. data/lib/cpp_dependency_graph/cycle_detector.rb +8 -10
  21. data/lib/cpp_dependency_graph/cyclic_link.rb +12 -15
  22. data/lib/cpp_dependency_graph/dir_tree.rb +41 -0
  23. data/lib/cpp_dependency_graph/file_dependency_graph.rb +56 -0
  24. data/lib/cpp_dependency_graph/graph_to_dot_visualiser.rb +38 -0
  25. data/lib/cpp_dependency_graph/graph_to_graphml_visualiser.rb +8 -0
  26. data/lib/cpp_dependency_graph/graph_to_html_visualiser.rb +25 -0
  27. data/lib/cpp_dependency_graph/include_dependency_graph.rb +21 -6
  28. data/lib/cpp_dependency_graph/include_to_component_resolver.rb +58 -0
  29. data/lib/cpp_dependency_graph/link.rb +42 -0
  30. data/lib/cpp_dependency_graph/project.rb +12 -30
  31. data/lib/cpp_dependency_graph/source_component.rb +8 -7
  32. data/lib/cpp_dependency_graph/source_file.rb +4 -3
  33. data/lib/cpp_dependency_graph/tsortable_hash.rb +1 -0
  34. data/lib/cpp_dependency_graph/version.rb +1 -1
  35. data/views/circle_packing.html.template +105 -0
  36. metadata +51 -25
  37. data/lib/cpp_dependency_graph/component_link.rb +0 -37
  38. data/lib/cpp_dependency_graph/dependency_graph.rb +0 -49
  39. data/lib/cpp_dependency_graph/graph_to_html_converter.rb +0 -7
  40. 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: 7a18d32a9e2c0577def09a6698f9bb67804f981a5ec0320cb38357f847b92ac7
4
- data.tar.gz: 6573a7087e4e3119db162ad532cd18602cb2fafca5ae00e5d806134edffc9016
3
+ metadata.gz: feac9cd85c6b1df61ad89cb9b292d4fd927c2256a1b9cb42a816065b87c3012f
4
+ data.tar.gz: c055532215dd55a1e04e5e27a679aa805797f714f5b697e23317729802b8740f
5
5
  SHA512:
6
- metadata.gz: a3f8fc5ba2c535832df85b7857d4e62b9b24c522dff5f47085f10b4c4839ab9f89f000ea9798ac8e9c4e6dd596098a1f2fa6dbf13471e3462019fc0a7b0197bb
7
- data.tar.gz: 60a92bf02b6ed53d3ee740355f0efe8d8acfae33f05c521da2d38b4c04951b6f74d0323172025dd080c6c7c770c95db712fc351869ae768a012919717355e75a
6
+ metadata.gz: 381fef815402ed98ab960277a0ed0bfb06a52c89c8029696453940306e309356aab7867b6c20e8af7189e647203a3dc0e4721249ccf200acae8d7abecc56dc44
7
+ data.tar.gz: 3354743837ae6ac501d7b5809c330fa2a9e3e0f9a1686f2409e8ac6f10bfba0de1abd7ef26a640b1986c79c3ddabb24fb251e38a11cf17650b178fa245348dfe
@@ -0,0 +1,2 @@
1
+ # Set the default behavior, in case people don't have core.autocrlf set.
2
+ * text=auto
@@ -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'
@@ -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": ["generate_graph", "--root_dir", "../protobuf/src", "--output_file", "deps.dot"]
27
+ "args": ["visualise_components", "-r", "../TileDB"]
28
28
  },
29
29
  {
30
30
  "name": "Listen for rdebug-ide",
data/Gemfile CHANGED
@@ -2,6 +2,6 @@
2
2
 
3
3
  source 'https://rubygems.org'
4
4
 
5
- git_source(:github) { |repo_name| 'https://github.com/shreyasbharath/cpp_dependency_graph' }
5
+ git_source(:github) { |_| 'https://github.com/shreyasbharath/cpp_dependency_graph' }
6
6
 
7
7
  gemspec
data/README.md CHANGED
@@ -1,12 +1,17 @@
1
1
  # Cpp Dependency Graph
2
2
 
3
- <!-- [![Gem Version] -->
3
+ [![Join the chat at https://gitter.im/cpp_dependency_graph/Lobby](https://badges.gitter.im/cpp_dependency_graph/Lobby.svg)](https://gitter.im/cpp_dependency_graph/Lobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
4
4
 
5
- [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Build Status](https://travis-ci.org/shreyasbharath/cpp_dependency_graph.svg?branch=master)](https://travis-ci.org/shreyasbharath/cpp_dependency_graph) [![Maintainability](https://api.codeclimate.com/v1/badges/2a07b587ca6fc8b1b3db/maintainability)](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/maintainability) [![Codacy](https://api.codacy.com/project/badge/Grade/9439dbb7fde44b5380401acba5325e62)](https://www.codacy.com/app/shreyasbharath/cpp_dependency_graph?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=shreyasbharath/cpp_dependency_graph&amp;utm_campaign=Badge_Grade) [![Test Coverage](https://api.codeclimate.com/v1/badges/2a07b587ca6fc8b1b3db/test_coverage)](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/test_coverage) [![Release](https://img.shields.io/github/release/shreyasbharath/cpp_dependency_graph.svg?maxAge=3600)](https://github.com/shreyasbharath/cpp_dependency_graph/releases)
5
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
6
+ [![Build Status](https://travis-ci.org/shreyasbharath/cpp_dependency_graph.svg?branch=master)](https://travis-ci.org/shreyasbharath/cpp_dependency_graph)
7
+ [![Maintainability](https://api.codeclimate.com/v1/badges/2a07b587ca6fc8b1b3db/maintainability)](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/maintainability)
8
+ [![Codacy](https://api.codacy.com/project/badge/Grade/9439dbb7fde44b5380401acba5325e62)](https://www.codacy.com/app/shreyasbharath/cpp_dependency_graph?utm_source=github.com&amp;utm_medium=referral&amp;utm_content=shreyasbharath/cpp_dependency_graph&amp;utm_campaign=Badge_Grade)
9
+ [![Test Coverage](https://api.codeclimate.com/v1/badges/2a07b587ca6fc8b1b3db/test_coverage)](https://codeclimate.com/github/shreyasbharath/cpp_dependency_graph/test_coverage)
10
+ [![Gem Version](https://badge.fury.io/rb/cpp_dependency_graph.svg)](https://badge.fury.io/rb/cpp_dependency_graph)
6
11
 
7
- Generates useful component dependency visualisations (in `dot` or `d3.js`) to study the architecture of C/C++ projects.
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++ codebases do not?
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
  ![Queue include graph d3](examples/rethinkdb_queue_include_d3.svg)
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
+ ![rethinkdb](examples/rethinkdb_cyclic_deps.svg)
101
+
102
+ ![leveldb](examples/leveldb_cyclic_deps.svg)
103
+
72
104
  ## Development
73
105
 
74
106
  `bundle exec cpp_dependency_graph visualise -r <dir>`
data/Rakefile CHANGED
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'bundler/gem_tasks'
2
4
  require 'rspec/core/rake_task'
3
5
  require 'rubocop/rake_task'
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
- - [ ] Add interactive `html` or `svg` examples into README, is this possible?
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
- - [ ] Manual scanning does not work when #includes are #ifdefed out for example
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?
@@ -1,5 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
+ # frozen_string_literal: true
4
+
3
5
  require 'bundler/setup'
4
6
  require 'cpp_dependency_graph'
5
7
 
@@ -1,6 +1,6 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- lib = File.expand_path('../lib', __FILE__)
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@users.noreply.github.com>']
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 = %x[git ls-files -z].split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) } -
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.54'
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
@@ -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_ &ndash; 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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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(&quot;#default&quot;);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>
@@ -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 (args['--version'])
58
+ if args['--version']
57
59
  puts VERSION
58
60
  Kernel.exit(0)
59
61
  end
60
62
 
61
- unless File.directory?(args['--root_dir'])
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
- generate_component_include_graph(project_dir, args['--component'], args['--output_format'], args['--output_file'])
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
- # TODO: Output components
83
+ generate_enclosure_diagram(project_dir, args['--output_file'])
78
84
  elsif args['visualise_cyclic_deps']
79
- output_cyclic_dependencies(project_dir)
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
@@ -1,48 +1,66 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative 'cpp_dependency_graph/project'
4
- require_relative 'cpp_dependency_graph/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/graph_visualiser'
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 = DependencyGraph.new(project)
14
- deps = graph.all_component_links
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 = DependencyGraph.new(project)
21
- deps = graph.component_links(component)
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.include_links(component_name)
31
+ deps = graph.links(component_name)
29
32
  generate_visualisation(deps, format, output_file)
30
33
  end
31
34
 
32
- def output_cyclic_dependencies(project_dir)
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 = DependencyGraph.new(project)
35
- deps = graph.all_component_links
36
- cyclic_deps = deps.values.flatten.select { |dep| dep.cyclic? }
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
- GraphVisualiser.new.generate_dot_file(deps, file)
59
+ GraphToDotVisualiser.new.generate(deps, file)
44
60
  when 'html'
45
- GraphVisualiser.new.generate_html_file(deps, file)
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(k, v)
10
- @forward[k].push(v)
11
- @reverse[v].push(k)
12
- v
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(k)
16
- fetch_from(@forward, k)
16
+ def fetch(key)
17
+ fetch_from(@forward, key)
17
18
  end
18
19
 
19
- def rfetch(v)
20
- fetch_from(@reverse, v)
20
+ def rfetch(value)
21
+ fetch_from(@reverse, value)
21
22
  end
22
23
 
23
24
  protected
24
25
 
25
- def fetch_from(h, k)
26
- return nil if(!h.has_key?(k))
27
- v = h[k]
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