[tor-commits] [sbws/master] Add UML diagrams to doc

pastly at torproject.org pastly at torproject.org
Wed Jul 11 15:05:40 UTC 2018


commit 93bb4575f558dbba7e98d8260f5a25c204eba1aa
Author: juga0 <juga at riseup.net>
Date:   Thu Jul 5 19:35:47 2018 +0000

    Add UML diagrams to doc
---
 docs/source/diagrams.rst             |  16 ++
 docs/source/images/classes_sbws.svg  | 379 +++++++++++++++++++++++++++++++++++
 docs/source/images/packages_sbws.svg | 318 +++++++++++++++++++++++++++++
 docs/source/index.rst                |   1 +
 4 files changed, 714 insertions(+)

diff --git a/docs/source/diagrams.rst b/docs/source/diagrams.rst
new file mode 100644
index 0000000..92652c5
--- /dev/null
+++ b/docs/source/diagrams.rst
@@ -0,0 +1,16 @@
+Diagrams
+=========
+
+UML Class Diagram
+--------------------
+
+.. image:: ./images/classes_sbws.*
+
+`classes_sbws.svg <./_images/classes_sbws.svg>`_
+
+Packages diagram
+-----------------
+
+.. image:: ./images/packages_sbws.*
+
+`packages_sbws.svg <./_images/packages_sbws.svg>`_
\ No newline at end of file
diff --git a/docs/source/images/classes_sbws.svg b/docs/source/images/classes_sbws.svg
new file mode 100644
index 0000000..81aee3c
--- /dev/null
+++ b/docs/source/images/classes_sbws.svg
@@ -0,0 +1,379 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.38.0 (20140413.2041)
+ -->
+<!-- Title: classes_sbws Pages: 1 -->
+<svg width="2582pt" height="846pt"
+ viewBox="0.00 0.00 2582.00 846.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 842)">
+<title>classes_sbws</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-842 2578,-842 2578,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node"><title>0</title>
+<polygon fill="none" stroke="black" points="0,-362.5 0,-551.5 173,-551.5 173,-362.5 0,-362.5"/>
+<text text-anchor="middle" x="86.5" y="-536.3" font-family="Times,serif" font-size="14.00">CircuitBuilder</text>
+<polyline fill="none" stroke="black" points="0,-528.5 173,-528.5 "/>
+<text text-anchor="start" x="8" y="-513.3" font-family="Times,serif" font-size="14.00">built_circuits : set</text>
+<text text-anchor="start" x="8" y="-498.3" font-family="Times,serif" font-size="14.00">circuit_timeout</text>
+<text text-anchor="start" x="8" y="-483.3" font-family="Times,serif" font-size="14.00">close_circuits_on_exit : bool</text>
+<text text-anchor="start" x="8" y="-468.3" font-family="Times,serif" font-size="14.00">controller</text>
+<text text-anchor="start" x="8" y="-453.3" font-family="Times,serif" font-size="14.00">relay_list</text>
+<text text-anchor="start" x="8" y="-438.3" font-family="Times,serif" font-size="14.00">relays</text>
+<text text-anchor="start" x="8" y="-423.3" font-family="Times,serif" font-size="14.00">rng : SystemRandom</text>
+<polyline fill="none" stroke="black" points="0,-415.5 173,-415.5 "/>
+<text text-anchor="start" x="8" y="-400.3" font-family="Times,serif" font-size="14.00">build_circuit()</text>
+<text text-anchor="start" x="8" y="-385.3" font-family="Times,serif" font-size="14.00">close_circuit()</text>
+<text text-anchor="start" x="8" y="-370.3" font-family="Times,serif" font-size="14.00">get_circuit_path()</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node"><title>1</title>
+<polygon fill="none" stroke="black" points="165.5,-98 165.5,-227 259.5,-227 259.5,-98 165.5,-98"/>
+<text text-anchor="middle" x="212.5" y="-211.8" font-family="Times,serif" font-size="14.00">Destination</text>
+<polyline fill="none" stroke="black" points="165.5,-204 259.5,-204 "/>
+<text text-anchor="start" x="173.5" y="-188.8" font-family="Times,serif" font-size="14.00">hostname</text>
+<text text-anchor="start" x="173.5" y="-173.8" font-family="Times,serif" font-size="14.00">port</text>
+<text text-anchor="start" x="173.5" y="-158.8" font-family="Times,serif" font-size="14.00">url</text>
+<text text-anchor="start" x="173.5" y="-143.8" font-family="Times,serif" font-size="14.00">verify</text>
+<polyline fill="none" stroke="black" points="165.5,-136 259.5,-136 "/>
+<text text-anchor="start" x="173.5" y="-120.8" font-family="Times,serif" font-size="14.00">from_config()</text>
+<text text-anchor="start" x="173.5" y="-105.8" font-family="Times,serif" font-size="14.00">is_usable()</text>
+</g>
+<!-- 2 -->
+<g id="node3" class="node"><title>2</title>
+<polygon fill="none" stroke="black" points="277.5,-120 277.5,-205 377.5,-205 377.5,-120 277.5,-120"/>
+<text text-anchor="middle" x="327.5" y="-189.8" font-family="Times,serif" font-size="14.00">DestinationList</text>
+<polyline fill="none" stroke="black" points="277.5,-182 377.5,-182 "/>
+<polyline fill="none" stroke="black" points="277.5,-158 377.5,-158 "/>
+<text text-anchor="start" x="285.5" y="-142.8" font-family="Times,serif" font-size="14.00">from_config()</text>
+<text text-anchor="start" x="285.5" y="-127.8" font-family="Times,serif" font-size="14.00">next()</text>
+</g>
+<!-- 3 -->
+<g id="node4" class="node"><title>3</title>
+<polygon fill="none" stroke="black" points="395.5,-127.5 395.5,-197.5 491.5,-197.5 491.5,-127.5 395.5,-127.5"/>
+<text text-anchor="middle" x="443.5" y="-182.3" font-family="Times,serif" font-size="14.00">DirectoryLock</text>
+<polyline fill="none" stroke="black" points="395.5,-174.5 491.5,-174.5 "/>
+<polyline fill="none" stroke="black" points="395.5,-150.5 491.5,-150.5 "/>
+<text text-anchor="middle" x="443.5" y="-135.3" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 21 -->
+<g id="node22" class="node"><title>21</title>
+<polygon fill="none" stroke="black" points="463,-422 463,-492 522,-492 522,-422 463,-422"/>
+<text text-anchor="middle" x="492.5" y="-476.8" font-family="Times,serif" font-size="14.00">_FLock</text>
+<polyline fill="none" stroke="black" points="463,-469 522,-469 "/>
+<polyline fill="none" stroke="black" points="463,-445 522,-445 "/>
+<text text-anchor="middle" x="492.5" y="-429.8" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 3->21 -->
+<g id="edge1" class="edge"><title>3->21</title>
+<path fill="none" stroke="black" d="M449.217,-197.626C458.1,-250.653 475.217,-352.828 485.054,-411.552"/>
+<polygon fill="none" stroke="black" points="481.64,-412.355 486.744,-421.639 488.543,-411.198 481.64,-412.355"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node"><title>4</title>
+<polygon fill="none" stroke="black" points="510,-127.5 510,-197.5 575,-197.5 575,-127.5 510,-127.5"/>
+<text text-anchor="middle" x="542.5" y="-182.3" font-family="Times,serif" font-size="14.00">FileLock</text>
+<polyline fill="none" stroke="black" points="510,-174.5 575,-174.5 "/>
+<polyline fill="none" stroke="black" points="510,-150.5 575,-150.5 "/>
+<text text-anchor="middle" x="542.5" y="-135.3" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 4->21 -->
+<g id="edge2" class="edge"><title>4->21</title>
+<path fill="none" stroke="black" d="M536.667,-197.626C527.602,-250.653 510.136,-352.828 500.098,-411.552"/>
+<polygon fill="none" stroke="black" points="496.609,-411.193 498.374,-421.639 503.509,-412.372 496.609,-411.193"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node"><title>5</title>
+<polygon fill="none" stroke="black" points="25.5,-127.5 25.5,-197.5 147.5,-197.5 147.5,-127.5 25.5,-127.5"/>
+<text text-anchor="middle" x="86.5" y="-182.3" font-family="Times,serif" font-size="14.00">GapsCircuitBuilder</text>
+<polyline fill="none" stroke="black" points="25.5,-174.5 147.5,-174.5 "/>
+<polyline fill="none" stroke="black" points="25.5,-150.5 147.5,-150.5 "/>
+<text text-anchor="start" x="33.5" y="-135.3" font-family="Times,serif" font-size="14.00">build_circuit()</text>
+</g>
+<!-- 5->0 -->
+<g id="edge3" class="edge"><title>5->0</title>
+<path fill="none" stroke="black" d="M86.5,-197.626C86.5,-235.434 86.5,-298.228 86.5,-352.442"/>
+<polygon fill="none" stroke="black" points="83.0001,-352.457 86.5,-362.457 90.0001,-352.457 83.0001,-352.457"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node"><title>6</title>
+<polygon fill="none" stroke="black" points="593.5,-128 593.5,-197 727.5,-197 727.5,-128 593.5,-128"/>
+<text text-anchor="middle" x="660.5" y="-181.8" font-family="Times,serif" font-size="14.00" fill="red">PathLengthException</text>
+<polyline fill="none" stroke="black" points="593.5,-174 727.5,-174 "/>
+<text text-anchor="start" x="601.5" y="-158.8" font-family="Times,serif" font-size="14.00" fill="red">errors : NoneType</text>
+<polyline fill="none" stroke="black" points="593.5,-151 727.5,-151 "/>
+<text text-anchor="middle" x="660.5" y="-135.8" font-family="Times,serif" font-size="14.00" fill="red"> </text>
+</g>
+<!-- 7 -->
+<g id="node8" class="node"><title>7</title>
+<polygon fill="none" stroke="black" points="718,-392.5 718,-521.5 909,-521.5 909,-392.5 718,-392.5"/>
+<text text-anchor="middle" x="813.5" y="-506.3" font-family="Times,serif" font-size="14.00">Relay</text>
+<polyline fill="none" stroke="black" points="718,-498.5 909,-498.5 "/>
+<text text-anchor="start" x="726" y="-483.3" font-family="Times,serif" font-size="14.00">address</text>
+<text text-anchor="start" x="726" y="-468.3" font-family="Times,serif" font-size="14.00">average_bandwidth : NoneType</text>
+<text text-anchor="start" x="726" y="-453.3" font-family="Times,serif" font-size="14.00">fingerprint</text>
+<text text-anchor="start" x="726" y="-438.3" font-family="Times,serif" font-size="14.00">master_key_ed25519</text>
+<text text-anchor="start" x="726" y="-423.3" font-family="Times,serif" font-size="14.00">nickname</text>
+<polyline fill="none" stroke="black" points="718,-415.5 909,-415.5 "/>
+<text text-anchor="middle" x="813.5" y="-400.3" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 11 -->
+<g id="node12" class="node"><title>11</title>
+<polygon fill="none" stroke="black" points="930.5,-603.5 930.5,-837.5 1086.5,-837.5 1086.5,-603.5 930.5,-603.5"/>
+<text text-anchor="middle" x="1008.5" y="-822.3" font-family="Times,serif" font-size="14.00">Result</text>
+<polyline fill="none" stroke="black" points="930.5,-814.5 1086.5,-814.5 "/>
+<text text-anchor="start" x="938.5" y="-799.3" font-family="Times,serif" font-size="14.00">address</text>
+<text text-anchor="start" x="938.5" y="-784.3" font-family="Times,serif" font-size="14.00">circ</text>
+<text text-anchor="start" x="938.5" y="-769.3" font-family="Times,serif" font-size="14.00">dest_url</text>
+<text text-anchor="start" x="938.5" y="-754.3" font-family="Times,serif" font-size="14.00">fingerprint</text>
+<text text-anchor="start" x="938.5" y="-739.3" font-family="Times,serif" font-size="14.00">master_key_ed25519</text>
+<text text-anchor="start" x="938.5" y="-724.3" font-family="Times,serif" font-size="14.00">nickname</text>
+<text text-anchor="start" x="938.5" y="-709.3" font-family="Times,serif" font-size="14.00">relay_average_bandwidth</text>
+<text text-anchor="start" x="938.5" y="-694.3" font-family="Times,serif" font-size="14.00">scanner</text>
+<text text-anchor="start" x="938.5" y="-679.3" font-family="Times,serif" font-size="14.00">time</text>
+<text text-anchor="start" x="938.5" y="-664.3" font-family="Times,serif" font-size="14.00">type</text>
+<text text-anchor="start" x="938.5" y="-649.3" font-family="Times,serif" font-size="14.00">version</text>
+<polyline fill="none" stroke="black" points="930.5,-641.5 1086.5,-641.5 "/>
+<text text-anchor="start" x="938.5" y="-626.3" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="938.5" y="-611.3" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 7->11 -->
+<g id="edge10" class="edge"><title>7->11</title>
+<path fill="none" stroke="black" d="M860.953,-521.636C879.691,-546.764 901.812,-576.429 923.146,-605.038"/>
+<polygon fill="black" stroke="black" points="923.171,-605.071 929.964,-607.49 930.344,-614.691 923.551,-612.272 923.171,-605.071"/>
+<text text-anchor="middle" x="922.5" y="-573.8" font-family="Times,serif" font-size="14.00" fill="green">_relay</text>
+</g>
+<!-- 8 -->
+<g id="node9" class="node"><title>8</title>
+<polygon fill="none" stroke="black" points="1245,-75.5 1245,-249.5 1378,-249.5 1378,-75.5 1245,-75.5"/>
+<text text-anchor="middle" x="1311.5" y="-234.3" font-family="Times,serif" font-size="14.00">Relay</text>
+<polyline fill="none" stroke="black" points="1245,-226.5 1378,-226.5 "/>
+<text text-anchor="start" x="1253" y="-211.3" font-family="Times,serif" font-size="14.00">address</text>
+<text text-anchor="start" x="1253" y="-196.3" font-family="Times,serif" font-size="14.00">average_bandwidth</text>
+<text text-anchor="start" x="1253" y="-181.3" font-family="Times,serif" font-size="14.00">bandwidth</text>
+<text text-anchor="start" x="1253" y="-166.3" font-family="Times,serif" font-size="14.00">exit_policy</text>
+<text text-anchor="start" x="1253" y="-151.3" font-family="Times,serif" font-size="14.00">fingerprint</text>
+<text text-anchor="start" x="1253" y="-136.3" font-family="Times,serif" font-size="14.00">flags</text>
+<text text-anchor="start" x="1253" y="-121.3" font-family="Times,serif" font-size="14.00">master_key_ed25519</text>
+<text text-anchor="start" x="1253" y="-106.3" font-family="Times,serif" font-size="14.00">nickname</text>
+<polyline fill="none" stroke="black" points="1245,-98.5 1378,-98.5 "/>
+<text text-anchor="start" x="1253" y="-83.3" font-family="Times,serif" font-size="14.00">can_exit_to()</text>
+</g>
+<!-- 9 -->
+<g id="node10" class="node"><title>9</title>
+<polygon fill="none" stroke="black" points="1396.5,-68 1396.5,-257 1572.5,-257 1572.5,-68 1396.5,-68"/>
+<text text-anchor="middle" x="1484.5" y="-241.8" font-family="Times,serif" font-size="14.00">RelayList</text>
+<polyline fill="none" stroke="black" points="1396.5,-234 1572.5,-234 "/>
+<text text-anchor="start" x="1404.5" y="-218.8" font-family="Times,serif" font-size="14.00">REFRESH_INTERVAL : int</text>
+<text text-anchor="start" x="1404.5" y="-203.8" font-family="Times,serif" font-size="14.00">authorities</text>
+<text text-anchor="start" x="1404.5" y="-188.8" font-family="Times,serif" font-size="14.00">bad_exits</text>
+<text text-anchor="start" x="1404.5" y="-173.8" font-family="Times,serif" font-size="14.00">exits</text>
+<text text-anchor="start" x="1404.5" y="-158.8" font-family="Times,serif" font-size="14.00">fast</text>
+<text text-anchor="start" x="1404.5" y="-143.8" font-family="Times,serif" font-size="14.00">guards</text>
+<text text-anchor="start" x="1404.5" y="-128.8" font-family="Times,serif" font-size="14.00">non_exits</text>
+<text text-anchor="start" x="1404.5" y="-113.8" font-family="Times,serif" font-size="14.00">relays</text>
+<text text-anchor="start" x="1404.5" y="-98.8" font-family="Times,serif" font-size="14.00">rng : SystemRandom</text>
+<polyline fill="none" stroke="black" points="1396.5,-91 1572.5,-91 "/>
+<text text-anchor="start" x="1404.5" y="-75.8" font-family="Times,serif" font-size="14.00">random_relay()</text>
+</g>
+<!-- 10 -->
+<g id="node11" class="node"><title>10</title>
+<polygon fill="none" stroke="black" points="1590.5,-90.5 1590.5,-234.5 1716.5,-234.5 1716.5,-90.5 1590.5,-90.5"/>
+<text text-anchor="middle" x="1653.5" y="-219.3" font-family="Times,serif" font-size="14.00">RelayPrioritizer</text>
+<polyline fill="none" stroke="black" points="1590.5,-211.5 1716.5,-211.5 "/>
+<text text-anchor="start" x="1598.5" y="-196.3" font-family="Times,serif" font-size="14.00">fraction_to_return</text>
+<text text-anchor="start" x="1598.5" y="-181.3" font-family="Times,serif" font-size="14.00">fresh_seconds</text>
+<text text-anchor="start" x="1598.5" y="-166.3" font-family="Times,serif" font-size="14.00">measure_authorities</text>
+<text text-anchor="start" x="1598.5" y="-151.3" font-family="Times,serif" font-size="14.00">min_to_return</text>
+<text text-anchor="start" x="1598.5" y="-136.3" font-family="Times,serif" font-size="14.00">relay_list</text>
+<text text-anchor="start" x="1598.5" y="-121.3" font-family="Times,serif" font-size="14.00">result_dump</text>
+<polyline fill="none" stroke="black" points="1590.5,-113.5 1716.5,-113.5 "/>
+<text text-anchor="start" x="1598.5" y="-98.3" font-family="Times,serif" font-size="14.00">best_priority()</text>
+</g>
+<!-- 12 -->
+<g id="node13" class="node"><title>12</title>
+<polygon fill="none" stroke="black" points="1734.5,-53 1734.5,-272 1902.5,-272 1902.5,-53 1734.5,-53"/>
+<text text-anchor="middle" x="1818.5" y="-256.8" font-family="Times,serif" font-size="14.00">ResultDump</text>
+<polyline fill="none" stroke="black" points="1734.5,-249 1902.5,-249 "/>
+<text text-anchor="start" x="1742.5" y="-233.8" font-family="Times,serif" font-size="14.00">conf</text>
+<text text-anchor="start" x="1742.5" y="-218.8" font-family="Times,serif" font-size="14.00">data : dict</text>
+<text text-anchor="start" x="1742.5" y="-203.8" font-family="Times,serif" font-size="14.00">data_lock : RLock, _RLock</text>
+<text text-anchor="start" x="1742.5" y="-188.8" font-family="Times,serif" font-size="14.00">datadir</text>
+<text text-anchor="start" x="1742.5" y="-173.8" font-family="Times,serif" font-size="14.00">end_event</text>
+<text text-anchor="start" x="1742.5" y="-158.8" font-family="Times,serif" font-size="14.00">fresh_days</text>
+<text text-anchor="start" x="1742.5" y="-143.8" font-family="Times,serif" font-size="14.00">queue : Queue</text>
+<text text-anchor="start" x="1742.5" y="-128.8" font-family="Times,serif" font-size="14.00">thread : Thread</text>
+<polyline fill="none" stroke="black" points="1734.5,-121 1902.5,-121 "/>
+<text text-anchor="start" x="1742.5" y="-105.8" font-family="Times,serif" font-size="14.00">enter()</text>
+<text text-anchor="start" x="1742.5" y="-90.8" font-family="Times,serif" font-size="14.00">handle_result()</text>
+<text text-anchor="start" x="1742.5" y="-75.8" font-family="Times,serif" font-size="14.00">results_for_relay()</text>
+<text text-anchor="start" x="1742.5" y="-60.8" font-family="Times,serif" font-size="14.00">store_result()</text>
+</g>
+<!-- 13 -->
+<g id="node14" class="node"><title>13</title>
+<polygon fill="none" stroke="black" points="927,-400 927,-514 1090,-514 1090,-400 927,-400"/>
+<text text-anchor="middle" x="1008.5" y="-498.8" font-family="Times,serif" font-size="14.00">ResultError</text>
+<polyline fill="none" stroke="black" points="927,-491 1090,-491 "/>
+<text text-anchor="start" x="935" y="-475.8" font-family="Times,serif" font-size="14.00">freshness_reduction_factor</text>
+<text text-anchor="start" x="935" y="-460.8" font-family="Times,serif" font-size="14.00">msg</text>
+<text text-anchor="start" x="935" y="-445.8" font-family="Times,serif" font-size="14.00">type</text>
+<polyline fill="none" stroke="black" points="927,-438 1090,-438 "/>
+<text text-anchor="start" x="935" y="-422.8" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="935" y="-407.8" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 13->11 -->
+<g id="edge4" class="edge"><title>13->11</title>
+<path fill="none" stroke="black" d="M1008.5,-514.098C1008.5,-537.355 1008.5,-565.35 1008.5,-593.085"/>
+<polygon fill="none" stroke="black" points="1005,-593.282 1008.5,-603.282 1012,-593.282 1005,-593.282"/>
+</g>
+<!-- 14 -->
+<g id="node15" class="node"><title>14</title>
+<polygon fill="none" stroke="black" points="746,-113 746,-212 909,-212 909,-113 746,-113"/>
+<text text-anchor="middle" x="827.5" y="-196.8" font-family="Times,serif" font-size="14.00">ResultErrorAuth</text>
+<polyline fill="none" stroke="black" points="746,-189 909,-189 "/>
+<text text-anchor="start" x="754" y="-173.8" font-family="Times,serif" font-size="14.00">freshness_reduction_factor</text>
+<text text-anchor="start" x="754" y="-158.8" font-family="Times,serif" font-size="14.00">type</text>
+<polyline fill="none" stroke="black" points="746,-151 909,-151 "/>
+<text text-anchor="start" x="754" y="-135.8" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="754" y="-120.8" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 14->13 -->
+<g id="edge5" class="edge"><title>14->13</title>
+<path fill="none" stroke="black" d="M853.056,-212.275C870.438,-244.698 894.394,-287.963 917.5,-325 931.281,-347.09 947.213,-370.624 961.859,-391.561"/>
+<polygon fill="none" stroke="black" points="959.002,-393.583 967.615,-399.753 964.729,-389.558 959.002,-393.583"/>
+</g>
+<!-- 15 -->
+<g id="node16" class="node"><title>15</title>
+<polygon fill="none" stroke="black" points="927,-113 927,-212 1090,-212 1090,-113 927,-113"/>
+<text text-anchor="middle" x="1008.5" y="-196.8" font-family="Times,serif" font-size="14.00">ResultErrorCircuit</text>
+<polyline fill="none" stroke="black" points="927,-189 1090,-189 "/>
+<text text-anchor="start" x="935" y="-173.8" font-family="Times,serif" font-size="14.00">freshness_reduction_factor</text>
+<text text-anchor="start" x="935" y="-158.8" font-family="Times,serif" font-size="14.00">type</text>
+<polyline fill="none" stroke="black" points="927,-151 1090,-151 "/>
+<text text-anchor="start" x="935" y="-135.8" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="935" y="-120.8" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 15->13 -->
+<g id="edge6" class="edge"><title>15->13</title>
+<path fill="none" stroke="black" d="M1008.5,-212.129C1008.5,-260.66 1008.5,-335.584 1008.5,-389.579"/>
+<polygon fill="none" stroke="black" points="1005,-389.745 1008.5,-399.745 1012,-389.745 1005,-389.745"/>
+</g>
+<!-- 16 -->
+<g id="node17" class="node"><title>16</title>
+<polygon fill="none" stroke="black" points="1108,-120.5 1108,-204.5 1227,-204.5 1227,-120.5 1108,-120.5"/>
+<text text-anchor="middle" x="1167.5" y="-189.3" font-family="Times,serif" font-size="14.00">ResultErrorStream</text>
+<polyline fill="none" stroke="black" points="1108,-181.5 1227,-181.5 "/>
+<text text-anchor="start" x="1116" y="-166.3" font-family="Times,serif" font-size="14.00">type</text>
+<polyline fill="none" stroke="black" points="1108,-158.5 1227,-158.5 "/>
+<text text-anchor="start" x="1116" y="-143.3" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="1116" y="-128.3" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 16->13 -->
+<g id="edge7" class="edge"><title>16->13</title>
+<path fill="none" stroke="black" d="M1152.5,-204.705C1139.78,-237.984 1120.17,-285.595 1098.5,-325 1086.17,-347.418 1070.96,-370.783 1056.58,-391.467"/>
+<polygon fill="none" stroke="black" points="1053.58,-389.658 1050.7,-399.854 1059.31,-393.68 1053.58,-389.658"/>
+</g>
+<!-- 17 -->
+<g id="node18" class="node"><title>17</title>
+<polygon fill="none" stroke="black" points="1108.5,-400 1108.5,-514 1202.5,-514 1202.5,-400 1108.5,-400"/>
+<text text-anchor="middle" x="1155.5" y="-498.8" font-family="Times,serif" font-size="14.00">ResultSuccess</text>
+<polyline fill="none" stroke="black" points="1108.5,-491 1202.5,-491 "/>
+<text text-anchor="start" x="1116.5" y="-475.8" font-family="Times,serif" font-size="14.00">downloads</text>
+<text text-anchor="start" x="1116.5" y="-460.8" font-family="Times,serif" font-size="14.00">rtts</text>
+<text text-anchor="start" x="1116.5" y="-445.8" font-family="Times,serif" font-size="14.00">type</text>
+<polyline fill="none" stroke="black" points="1108.5,-438 1202.5,-438 "/>
+<text text-anchor="start" x="1116.5" y="-422.8" font-family="Times,serif" font-size="14.00">from_dict()</text>
+<text text-anchor="start" x="1116.5" y="-407.8" font-family="Times,serif" font-size="14.00">to_dict()</text>
+</g>
+<!-- 17->11 -->
+<g id="edge8" class="edge"><title>17->11</title>
+<path fill="none" stroke="black" d="M1123.96,-514.098C1110.66,-537.763 1094.6,-566.334 1078.74,-594.545"/>
+<polygon fill="none" stroke="black" points="1075.68,-592.85 1073.83,-603.282 1081.78,-596.28 1075.68,-592.85"/>
+</g>
+<!-- 18 -->
+<g id="node19" class="node"><title>18</title>
+<polygon fill="none" stroke="black" points="1921,-90.5 1921,-234.5 2040,-234.5 2040,-90.5 1921,-90.5"/>
+<text text-anchor="middle" x="1980.5" y="-219.3" font-family="Times,serif" font-size="14.00">V3BWFile</text>
+<polyline fill="none" stroke="black" points="1921,-211.5 2040,-211.5 "/>
+<text text-anchor="start" x="1929" y="-196.3" font-family="Times,serif" font-size="14.00">avg_bw</text>
+<text text-anchor="start" x="1929" y="-181.3" font-family="Times,serif" font-size="14.00">bw_lines</text>
+<text text-anchor="start" x="1929" y="-166.3" font-family="Times,serif" font-size="14.00">header</text>
+<text text-anchor="start" x="1929" y="-151.3" font-family="Times,serif" font-size="14.00">num_lines</text>
+<text text-anchor="start" x="1929" y="-136.3" font-family="Times,serif" font-size="14.00">total_bw</text>
+<polyline fill="none" stroke="black" points="1921,-128.5 2040,-128.5 "/>
+<text text-anchor="start" x="1929" y="-113.3" font-family="Times,serif" font-size="14.00">from_arg_results()</text>
+<text text-anchor="start" x="1929" y="-98.3" font-family="Times,serif" font-size="14.00">write()</text>
+</g>
+<!-- 19 -->
+<g id="node20" class="node"><title>19</title>
+<polygon fill="none" stroke="black" points="2058.5,-0.5 2058.5,-324.5 2262.5,-324.5 2262.5,-0.5 2058.5,-0.5"/>
+<text text-anchor="middle" x="2160.5" y="-309.3" font-family="Times,serif" font-size="14.00">V3BWHeader</text>
+<polyline fill="none" stroke="black" points="2058.5,-301.5 2262.5,-301.5 "/>
+<text text-anchor="start" x="2066.5" y="-286.3" font-family="Times,serif" font-size="14.00">file_created</text>
+<text text-anchor="start" x="2066.5" y="-271.3" font-family="Times,serif" font-size="14.00">keyvalue_tuple_ls</text>
+<text text-anchor="start" x="2066.5" y="-256.3" font-family="Times,serif" font-size="14.00">keyvalue_unordered_tuple_ls</text>
+<text text-anchor="start" x="2066.5" y="-241.3" font-family="Times,serif" font-size="14.00">keyvalue_v110str_ls</text>
+<text text-anchor="start" x="2066.5" y="-226.3" font-family="Times,serif" font-size="14.00">keyvalue_v200_ls</text>
+<text text-anchor="start" x="2066.5" y="-211.3" font-family="Times,serif" font-size="14.00">latest_bandwidth</text>
+<text text-anchor="start" x="2066.5" y="-196.3" font-family="Times,serif" font-size="14.00">num_lines</text>
+<text text-anchor="start" x="2066.5" y="-181.3" font-family="Times,serif" font-size="14.00">software</text>
+<text text-anchor="start" x="2066.5" y="-166.3" font-family="Times,serif" font-size="14.00">software_version</text>
+<text text-anchor="start" x="2066.5" y="-151.3" font-family="Times,serif" font-size="14.00">strv110</text>
+<text text-anchor="start" x="2066.5" y="-136.3" font-family="Times,serif" font-size="14.00">strv200</text>
+<text text-anchor="start" x="2066.5" y="-121.3" font-family="Times,serif" font-size="14.00">timestamp</text>
+<text text-anchor="start" x="2066.5" y="-106.3" font-family="Times,serif" font-size="14.00">version</text>
+<polyline fill="none" stroke="black" points="2058.5,-98.5 2262.5,-98.5 "/>
+<text text-anchor="start" x="2066.5" y="-83.3" font-family="Times,serif" font-size="14.00">earliest_bandwidth_from_results()</text>
+<text text-anchor="start" x="2066.5" y="-68.3" font-family="Times,serif" font-size="14.00">from_lines_v110()</text>
+<text text-anchor="start" x="2066.5" y="-53.3" font-family="Times,serif" font-size="14.00">from_results()</text>
+<text text-anchor="start" x="2066.5" y="-38.3" font-family="Times,serif" font-size="14.00">from_text_v110()</text>
+<text text-anchor="start" x="2066.5" y="-23.3" font-family="Times,serif" font-size="14.00">generator_started_from_file()</text>
+<text text-anchor="start" x="2066.5" y="-8.3" font-family="Times,serif" font-size="14.00">latest_bandwidth_from_results()</text>
+</g>
+<!-- 20 -->
+<g id="node21" class="node"><title>20</title>
+<polygon fill="none" stroke="black" points="2280,-53 2280,-272 2447,-272 2447,-53 2280,-53"/>
+<text text-anchor="middle" x="2363.5" y="-256.8" font-family="Times,serif" font-size="14.00">V3BWLine</text>
+<polyline fill="none" stroke="black" points="2280,-249 2447,-249 "/>
+<text text-anchor="start" x="2288" y="-233.8" font-family="Times,serif" font-size="14.00">bw</text>
+<text text-anchor="start" x="2288" y="-218.8" font-family="Times,serif" font-size="14.00">bw_keyvalue_tuple_ls</text>
+<text text-anchor="start" x="2288" y="-203.8" font-family="Times,serif" font-size="14.00">bw_keyvalue_v110str_ls</text>
+<text text-anchor="start" x="2288" y="-188.8" font-family="Times,serif" font-size="14.00">bw_strv110</text>
+<text text-anchor="start" x="2288" y="-173.8" font-family="Times,serif" font-size="14.00">node_id</text>
+<polyline fill="none" stroke="black" points="2280,-166 2447,-166 "/>
+<text text-anchor="start" x="2288" y="-150.8" font-family="Times,serif" font-size="14.00">bw_from_results()</text>
+<text text-anchor="start" x="2288" y="-135.8" font-family="Times,serif" font-size="14.00">from_bw_line_v110()</text>
+<text text-anchor="start" x="2288" y="-120.8" font-family="Times,serif" font-size="14.00">from_data()</text>
+<text text-anchor="start" x="2288" y="-105.8" font-family="Times,serif" font-size="14.00">from_results()</text>
+<text text-anchor="start" x="2288" y="-90.8" font-family="Times,serif" font-size="14.00">last_time_from_results()</text>
+<text text-anchor="start" x="2288" y="-75.8" font-family="Times,serif" font-size="14.00">result_types_from_results()</text>
+<text text-anchor="start" x="2288" y="-60.8" font-family="Times,serif" font-size="14.00">rtt_from_results()</text>
+</g>
+<!-- 22 -->
+<g id="node23" class="node"><title>22</title>
+<polygon fill="none" stroke="black" points="2465,-98 2465,-227 2574,-227 2574,-98 2465,-98"/>
+<text text-anchor="middle" x="2519.5" y="-211.8" font-family="Times,serif" font-size="14.00">_ResultType</text>
+<polyline fill="none" stroke="black" points="2465,-204 2574,-204 "/>
+<text text-anchor="start" x="2473" y="-188.8" font-family="Times,serif" font-size="14.00">Error : str</text>
+<text text-anchor="start" x="2473" y="-173.8" font-family="Times,serif" font-size="14.00">ErrorAuth : str</text>
+<text text-anchor="start" x="2473" y="-158.8" font-family="Times,serif" font-size="14.00">ErrorCircuit : str</text>
+<text text-anchor="start" x="2473" y="-143.8" font-family="Times,serif" font-size="14.00">ErrorStream : str</text>
+<text text-anchor="start" x="2473" y="-128.8" font-family="Times,serif" font-size="14.00">Success : str</text>
+<polyline fill="none" stroke="black" points="2465,-121 2574,-121 "/>
+<text text-anchor="middle" x="2519.5" y="-105.8" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 23 -->
+<g id="node24" class="node"><title>23</title>
+<polygon fill="none" stroke="black" points="2483.5,-422 2483.5,-492 2555.5,-492 2555.5,-422 2483.5,-422"/>
+<text text-anchor="middle" x="2519.5" y="-476.8" font-family="Times,serif" font-size="14.00">_StrEnum</text>
+<polyline fill="none" stroke="black" points="2483.5,-469 2555.5,-469 "/>
+<polyline fill="none" stroke="black" points="2483.5,-445 2555.5,-445 "/>
+<text text-anchor="middle" x="2519.5" y="-429.8" font-family="Times,serif" font-size="14.00"> </text>
+</g>
+<!-- 22->23 -->
+<g id="edge9" class="edge"><title>22->23</title>
+<path fill="none" stroke="black" d="M2519.5,-227.329C2519.5,-283.08 2519.5,-362.557 2519.5,-411.628"/>
+<polygon fill="none" stroke="black" points="2516,-411.917 2519.5,-421.917 2523,-411.917 2516,-411.917"/>
+</g>
+</g>
+</svg>
diff --git a/docs/source/images/packages_sbws.svg b/docs/source/images/packages_sbws.svg
new file mode 100644
index 0000000..526f4c8
--- /dev/null
+++ b/docs/source/images/packages_sbws.svg
@@ -0,0 +1,318 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN"
+ "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
+<!-- Generated by graphviz version 2.38.0 (20140413.2041)
+ -->
+<!-- Title: packages_sbws Pages: 1 -->
+<svg width="1263pt" height="404pt"
+ viewBox="0.00 0.00 1263.00 404.00" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+<g id="graph0" class="graph" transform="scale(1 1) rotate(0) translate(4 400)">
+<title>packages_sbws</title>
+<polygon fill="white" stroke="none" points="-4,4 -4,-400 1259,-400 1259,4 -4,4"/>
+<!-- 0 -->
+<g id="node1" class="node"><title>0</title>
+<polygon fill="none" stroke="black" points="931,-252 877,-252 877,-216 931,-216 931,-252"/>
+<text text-anchor="middle" x="904" y="-230.3" font-family="Times,serif" font-size="14.00">sbws</text>
+</g>
+<!-- 1 -->
+<g id="node2" class="node"><title>1</title>
+<polygon fill="none" stroke="black" points="827.5,-36 756.5,-36 756.5,-0 827.5,-0 827.5,-36"/>
+<text text-anchor="middle" x="792" y="-14.3" font-family="Times,serif" font-size="14.00">sbws.core</text>
+</g>
+<!-- 2 -->
+<g id="node3" class="node"><title>2</title>
+<polygon fill="none" stroke="black" points="1065,-252 949,-252 949,-216 1065,-216 1065,-252"/>
+<text text-anchor="middle" x="1007" y="-230.3" font-family="Times,serif" font-size="14.00">sbws.core.cleanup</text>
+</g>
+<!-- 7 -->
+<g id="node8" class="node"><title>7</title>
+<polygon fill="none" stroke="black" points="617,-396 531,-396 531,-360 617,-360 617,-396"/>
+<text text-anchor="middle" x="574" y="-374.3" font-family="Times,serif" font-size="14.00">sbws.globals</text>
+</g>
+<!-- 2->7 -->
+<g id="edge1" class="edge"><title>2->7</title>
+<path fill="none" stroke="black" d="M993.59,-252.311C975.153,-275.63 942.398,-315.234 926,-324 875.33,-351.088 712.565,-366.787 627.274,-373.351"/>
+<polygon fill="black" stroke="black" points="617.269,-374.106 626.902,-368.866 622.255,-373.729 627.241,-373.353 627.241,-373.353 627.241,-373.353 622.255,-373.729 627.58,-377.84 617.269,-374.106 617.269,-374.106"/>
+</g>
+<!-- 18 -->
+<g id="node19" class="node"><title>18</title>
+<polygon fill="none" stroke="black" points="917,-324 807,-324 807,-288 917,-288 917,-324"/>
+<text text-anchor="middle" x="862" y="-302.3" font-family="Times,serif" font-size="14.00">sbws.util.filelock</text>
+</g>
+<!-- 2->18 -->
+<g id="edge2" class="edge"><title>2->18</title>
+<path fill="none" stroke="black" d="M971.529,-252.124C951.883,-261.608 927.278,-273.487 906.368,-283.581"/>
+<polygon fill="black" stroke="black" points="897.356,-287.932 904.405,-279.532 901.859,-285.758 906.361,-283.584 906.361,-283.584 906.361,-283.584 901.859,-285.758 908.318,-287.637 897.356,-287.932 897.356,-287.932"/>
+</g>
+<!-- 3 -->
+<g id="node4" class="node"><title>3</title>
+<polygon fill="none" stroke="black" points="738,-36 618,-36 618,-0 738,-0 738,-36"/>
+<text text-anchor="middle" x="678" y="-14.3" font-family="Times,serif" font-size="14.00">sbws.core.generate</text>
+</g>
+<!-- 3->7 -->
+<g id="edge3" class="edge"><title>3->7</title>
+<path fill="none" stroke="black" d="M617.707,-23.3661C577.412,-29.0683 525.329,-42.1364 489,-72 454.76,-100.147 444,-116.676 444,-161 444,-161 444,-161 444,-235 444,-288.377 494.589,-330.418 532.651,-354.495"/>
+<polygon fill="black" stroke="black" points="541.531,-359.935 530.653,-358.548 537.267,-357.323 533.004,-354.711 533.004,-354.711 533.004,-354.711 537.267,-357.323 535.355,-350.874 541.531,-359.935 541.531,-359.935"/>
+</g>
+<!-- 13 -->
+<g id="node14" class="node"><title>13</title>
+<polygon fill="none" stroke="black" points="637.5,-180 510.5,-180 510.5,-144 637.5,-144 637.5,-180"/>
+<text text-anchor="middle" x="574" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.lib.resultdump</text>
+</g>
+<!-- 3->13 -->
+<g id="edge4" class="edge"><title>3->13</title>
+<path fill="none" stroke="black" d="M665.455,-36.1285C647.34,-60.8628 613.727,-106.758 592.685,-135.488"/>
+<polygon fill="black" stroke="black" points="586.589,-143.811 588.868,-133.084 589.544,-139.777 592.498,-135.743 592.498,-135.743 592.498,-135.743 589.544,-139.777 596.129,-138.402 586.589,-143.811 586.589,-143.811"/>
+</g>
+<!-- 14 -->
+<g id="node15" class="node"><title>14</title>
+<polygon fill="none" stroke="black" points="857.5,-108 744.5,-108 744.5,-72 857.5,-72 857.5,-108"/>
+<text text-anchor="middle" x="801" y="-86.3" font-family="Times,serif" font-size="14.00">sbws.lib.v3bwfile</text>
+</g>
+<!-- 3->14 -->
+<g id="edge5" class="edge"><title>3->14</title>
+<path fill="none" stroke="black" d="M708.089,-36.1239C724.32,-45.3612 744.542,-56.8692 761.971,-66.7884"/>
+<polygon fill="black" stroke="black" points="770.795,-71.8102 759.878,-70.775 766.45,-69.3371 762.104,-66.864 762.104,-66.864 762.104,-66.864 766.45,-69.3371 764.33,-62.953 770.795,-71.8102 770.795,-71.8102"/>
+</g>
+<!-- 22 -->
+<g id="node23" class="node"><title>22</title>
+<polygon fill="none" stroke="black" points="782.5,-180 655.5,-180 655.5,-144 782.5,-144 782.5,-180"/>
+<text text-anchor="middle" x="719" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.util.timestamp</text>
+</g>
+<!-- 3->22 -->
+<g id="edge6" class="edge"><title>3->22</title>
+<path fill="none" stroke="black" d="M682.946,-36.1285C689.964,-60.4364 702.883,-105.181 711.2,-133.987"/>
+<polygon fill="black" stroke="black" points="714.037,-143.811 706.939,-135.452 712.65,-139.007 711.263,-134.203 711.263,-134.203 711.263,-134.203 712.65,-139.007 715.586,-132.955 714.037,-143.811 714.037,-143.811"/>
+</g>
+<!-- 4 -->
+<g id="node5" class="node"><title>4</title>
+<polygon fill="none" stroke="black" points="1175,-252 1083,-252 1083,-216 1175,-216 1175,-252"/>
+<text text-anchor="middle" x="1129" y="-230.3" font-family="Times,serif" font-size="14.00">sbws.core.init</text>
+</g>
+<!-- 4->7 -->
+<g id="edge7" class="edge"><title>4->7</title>
+<path fill="none" stroke="black" d="M1082.72,-250.468C1057.9,-259.696 1027.32,-272.612 1002,-288 980.702,-300.947 981.79,-313.907 959,-324 900.712,-349.814 718.7,-366.397 627.378,-373.311"/>
+<polygon fill="black" stroke="black" points="617.236,-374.068 626.873,-368.836 622.222,-373.696 627.208,-373.324 627.208,-373.324 627.208,-373.324 622.222,-373.696 627.543,-377.811 617.236,-374.068 617.236,-374.068"/>
+</g>
+<!-- 17 -->
+<g id="node18" class="node"><title>17</title>
+<polygon fill="none" stroke="black" points="1255,-324 1151,-324 1151,-288 1255,-288 1255,-324"/>
+<text text-anchor="middle" x="1203" y="-302.3" font-family="Times,serif" font-size="14.00">sbws.util.config</text>
+</g>
+<!-- 4->17 -->
+<g id="edge8" class="edge"><title>4->17</title>
+<path fill="none" stroke="black" d="M1147.29,-252.303C1156.43,-260.95 1167.64,-271.551 1177.6,-280.973"/>
+<polygon fill="black" stroke="black" points="1184.92,-287.896 1174.56,-284.293 1181.29,-284.46 1177.65,-281.024 1177.65,-281.024 1177.65,-281.024 1181.29,-284.46 1180.75,-277.755 1184.92,-287.896 1184.92,-287.896"/>
+</g>
+<!-- 23 -->
+<g id="node24" class="node"><title>23</title>
+<polygon fill="none" stroke="black" points="1133,-324 1011,-324 1011,-288 1133,-288 1133,-324"/>
+<text text-anchor="middle" x="1072" y="-302.3" font-family="Times,serif" font-size="14.00">sbws.util.userquery</text>
+</g>
+<!-- 4->23 -->
+<g id="edge9" class="edge"><title>4->23</title>
+<path fill="none" stroke="black" d="M1114.91,-252.303C1108.08,-260.695 1099.74,-270.93 1092.24,-280.139"/>
+<polygon fill="black" stroke="black" points="1085.93,-287.896 1088.75,-277.3 1089.08,-284.018 1092.24,-280.141 1092.24,-280.141 1092.24,-280.141 1089.08,-284.018 1095.73,-282.983 1085.93,-287.896 1085.93,-287.896"/>
+</g>
+<!-- 5 -->
+<g id="node6" class="node"><title>5</title>
+<polygon fill="none" stroke="black" points="116,-180 7.10543e-15,-180 7.10543e-15,-144 116,-144 116,-180"/>
+<text text-anchor="middle" x="58" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.core.scanner</text>
+</g>
+<!-- 5->7 -->
+<g id="edge10" class="edge"><title>5->7</title>
+<path fill="none" stroke="black" d="M54.6795,-180.339C51.9918,-199.546 50.6854,-230.621 65,-252 104.369,-310.797 139.534,-302.66 207,-324 315.082,-358.187 448.118,-370.419 520.64,-374.725"/>
+<polygon fill="black" stroke="black" points="530.891,-375.304 520.653,-379.232 525.899,-375.022 520.907,-374.74 520.907,-374.74 520.907,-374.74 525.899,-375.022 521.161,-370.247 530.891,-375.304 530.891,-375.304"/>
+</g>
+<!-- 20 -->
+<g id="node21" class="node"><title>20</title>
+<polygon fill="none" stroke="black" points="211.5,-252 98.5,-252 98.5,-216 211.5,-216 211.5,-252"/>
+<text text-anchor="middle" x="155" y="-230.3" font-family="Times,serif" font-size="14.00">sbws.util.requests</text>
+</g>
+<!-- 5->20 -->
+<g id="edge11" class="edge"><title>5->20</title>
+<path fill="none" stroke="black" d="M81.9775,-180.303C94.3113,-189.204 109.516,-200.177 122.853,-209.801"/>
+<polygon fill="black" stroke="black" points="131.298,-215.896 120.556,-213.693 127.244,-212.97 123.189,-210.044 123.189,-210.044 123.189,-210.044 127.244,-212.97 125.823,-206.395 131.298,-215.896 131.298,-215.896"/>
+</g>
+<!-- 21 -->
+<g id="node22" class="node"><title>21</title>
+<polygon fill="none" stroke="black" points="311.5,-324 216.5,-324 216.5,-288 311.5,-288 311.5,-324"/>
+<text text-anchor="middle" x="264" y="-302.3" font-family="Times,serif" font-size="14.00">sbws.util.stem</text>
+</g>
+<!-- 5->21 -->
+<g id="edge12" class="edge"><title>5->21</title>
+<path fill="none" stroke="black" d="M59.3951,-180.216C61.9301,-200.199 69.0498,-232.853 89,-252 120.298,-282.038 168.047,-295.109 205.766,-300.768"/>
+<polygon fill="black" stroke="black" points="216.117,-302.176 205.601,-305.287 211.162,-301.502 206.208,-300.828 206.208,-300.828 206.208,-300.828 211.162,-301.502 206.814,-296.369 216.117,-302.176 216.117,-302.176"/>
+</g>
+<!-- 6 -->
+<g id="node7" class="node"><title>6</title>
+<polygon fill="none" stroke="black" points="596,-108 498,-108 498,-72 596,-72 596,-108"/>
+<text text-anchor="middle" x="547" y="-86.3" font-family="Times,serif" font-size="14.00">sbws.core.stats</text>
+</g>
+<!-- 6->7 -->
+<g id="edge13" class="edge"><title>6->7</title>
+<path fill="none" stroke="black" d="M526.177,-108.385C516.542,-117.802 506.115,-130.303 501,-144 495.403,-158.989 498.176,-164.251 501,-180 512.435,-243.771 543.147,-313.889 560.879,-350.845"/>
+<polygon fill="black" stroke="black" points="565.299,-359.929 556.877,-352.906 563.111,-355.433 560.924,-350.937 560.924,-350.937 560.924,-350.937 563.111,-355.433 564.97,-348.968 565.299,-359.929 565.299,-359.929"/>
+</g>
+<!-- 6->13 -->
+<g id="edge14" class="edge"><title>6->13</title>
+<path fill="none" stroke="black" d="M553.674,-108.303C556.715,-116.187 560.383,-125.696 563.761,-134.454"/>
+<polygon fill="black" stroke="black" points="567.403,-143.896 559.605,-136.185 565.603,-139.231 563.804,-134.566 563.804,-134.566 563.804,-134.566 565.603,-139.231 568.002,-132.946 567.403,-143.896 567.403,-143.896"/>
+</g>
+<!-- 8 -->
+<g id="node9" class="node"><title>8</title>
+<polygon fill="none" stroke="black" points="908,-36 846,-36 846,-0 908,-0 908,-36"/>
+<text text-anchor="middle" x="877" y="-14.3" font-family="Times,serif" font-size="14.00">sbws.lib</text>
+</g>
+<!-- 9 -->
+<g id="node10" class="node"><title>9</title>
+<polygon fill="none" stroke="black" points="416,-180 278,-180 278,-144 416,-144 416,-180"/>
+<text text-anchor="middle" x="347" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.lib.circuitbuilder</text>
+</g>
+<!-- 11 -->
+<g id="node12" class="node"><title>11</title>
+<polygon fill="none" stroke="black" points="415.5,-252 306.5,-252 306.5,-216 415.5,-216 415.5,-252"/>
+<text text-anchor="middle" x="361" y="-230.3" font-family="Times,serif" font-size="14.00">sbws.lib.relaylist</text>
+</g>
+<!-- 9->11 -->
+<g id="edge15" class="edge"><title>9->11</title>
+<path fill="none" stroke="black" d="M350.461,-180.303C352.003,-188.017 353.858,-197.288 355.578,-205.888"/>
+<polygon fill="black" stroke="black" points="357.579,-215.896 351.205,-206.972 356.599,-210.993 355.618,-206.09 355.618,-206.09 355.618,-206.09 356.599,-210.993 360.031,-205.207 357.579,-215.896 357.579,-215.896"/>
+</g>
+<!-- 9->21 -->
+<g id="edge16" class="edge"><title>9->21</title>
+<path fill="none" stroke="black" d="M327.428,-180.113C317.264,-189.823 305.275,-202.674 297,-216 285.027,-235.283 276.385,-259.579 270.955,-277.913"/>
+<polygon fill="black" stroke="black" points="268.199,-287.674 266.586,-276.828 269.558,-282.862 270.916,-278.051 270.916,-278.051 270.916,-278.051 269.558,-282.862 275.247,-279.273 268.199,-287.674 268.199,-287.674"/>
+</g>
+<!-- 10 -->
+<g id="node11" class="node"><title>10</title>
+<polygon fill="none" stroke="black" points="259.5,-180 134.5,-180 134.5,-144 259.5,-144 259.5,-180"/>
+<text text-anchor="middle" x="197" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.lib.destination</text>
+</g>
+<!-- 10->20 -->
+<g id="edge17" class="edge"><title>10->20</title>
+<path fill="none" stroke="black" d="M186.618,-180.303C181.735,-188.441 175.813,-198.311 170.421,-207.299"/>
+<polygon fill="black" stroke="black" points="165.263,-215.896 166.549,-205.005 167.835,-211.608 170.408,-207.321 170.408,-207.321 170.408,-207.321 167.835,-211.608 174.266,-209.636 165.263,-215.896 165.263,-215.896"/>
+</g>
+<!-- 10->21 -->
+<g id="edge18" class="edge"><title>10->21</title>
+<path fill="none" stroke="black" d="M205.082,-180.129C216.652,-204.65 238.034,-249.968 251.61,-278.741"/>
+<polygon fill="black" stroke="black" points="255.89,-287.811 247.553,-280.687 253.756,-283.289 251.622,-278.767 251.622,-278.767 251.622,-278.767 253.756,-283.289 255.692,-276.847 255.89,-287.811 255.89,-287.811"/>
+</g>
+<!-- 11->7 -->
+<g id="edge19" class="edge"><title>11->7</title>
+<path fill="none" stroke="black" d="M370.254,-252.087C381.809,-271.946 403.34,-304.481 430,-324 457.014,-343.779 492.211,-356.912 521.045,-365.157"/>
+<polygon fill="black" stroke="black" points="530.955,-367.872 520.121,-369.569 526.133,-366.551 521.311,-365.229 521.311,-365.229 521.311,-365.229 526.133,-366.551 522.5,-360.889 530.955,-367.872 530.955,-367.872"/>
+</g>
+<!-- 11->21 -->
+<g id="edge20" class="edge"><title>11->21</title>
+<path fill="none" stroke="black" d="M337.022,-252.303C324.689,-261.204 309.484,-272.177 296.147,-281.801"/>
+<polygon fill="black" stroke="black" points="287.702,-287.896 293.177,-278.395 291.756,-284.97 295.811,-282.044 295.811,-282.044 295.811,-282.044 291.756,-284.97 298.444,-285.693 287.702,-287.896 287.702,-287.896"/>
+</g>
+<!-- 12 -->
+<g id="node13" class="node"><title>12</title>
+<polygon fill="none" stroke="black" points="1072,-36 926,-36 926,-0 1072,-0 1072,-36"/>
+<text text-anchor="middle" x="999" y="-14.3" font-family="Times,serif" font-size="14.00">sbws.lib.relayprioritizer</text>
+</g>
+<!-- 13->7 -->
+<g id="edge21" class="edge"><title>13->7</title>
+<path fill="none" stroke="black" d="M574,-180.151C574,-217.168 574,-304.819 574,-349.614"/>
+<polygon fill="black" stroke="black" points="574,-359.768 569.5,-349.768 574,-354.768 574,-349.768 574,-349.768 574,-349.768 574,-354.768 578.5,-349.768 574,-359.768 574,-359.768"/>
+</g>
+<!-- 13->11 -->
+<g id="edge22" class="edge"><title>13->11</title>
+<path fill="none" stroke="black" d="M522.167,-180.034C492.147,-189.9 454.177,-202.378 422.633,-212.745"/>
+<polygon fill="black" stroke="black" points="413.066,-215.889 421.161,-208.492 417.816,-214.328 422.566,-212.767 422.566,-212.767 422.566,-212.767 417.816,-214.328 423.971,-217.042 413.066,-215.889 413.066,-215.889"/>
+</g>
+<!-- 13->18 -->
+<g id="edge23" class="edge"><title>13->18</title>
+<path fill="none" stroke="black" d="M608.74,-180.129C661.175,-205.982 760.501,-254.955 817.948,-283.28"/>
+<polygon fill="black" stroke="black" points="827.137,-287.811 816.178,-287.425 822.653,-285.6 818.168,-283.388 818.168,-283.388 818.168,-283.388 822.653,-285.6 820.158,-279.352 827.137,-287.811 827.137,-287.811"/>
+</g>
+<!-- 14->0 -->
+<g id="edge24" class="edge"><title>14->0</title>
+<path fill="none" stroke="black" d="M825.611,-108.037C838.008,-117.539 852.578,-130.222 863,-144 877.288,-162.889 888.161,-187.555 895.108,-206.128"/>
+<polygon fill="black" stroke="black" points="898.56,-215.744 890.946,-207.852 896.871,-211.038 895.181,-206.332 895.181,-206.332 895.181,-206.332 896.871,-211.038 899.417,-204.811 898.56,-215.744 898.56,-215.744"/>
+</g>
+<!-- 14->7 -->
+<g id="edge25" class="edge"><title>14->7</title>
+<path fill="none" stroke="black" d="M802.536,-108.084C803.46,-126.789 802.682,-157.159 791,-180 750.345,-259.487 663.477,-322.56 612.845,-354.377"/>
+<polygon fill="black" stroke="black" points="604.134,-359.767 610.27,-350.678 608.386,-357.136 612.638,-354.505 612.638,-354.505 612.638,-354.505 608.386,-357.136 615.006,-358.332 604.134,-359.767 604.134,-359.767"/>
+</g>
+<!-- 14->13 -->
+<g id="edge26" class="edge"><title>14->13</title>
+<path fill="none" stroke="black" d="M745.76,-108.034C713.629,-117.943 672.952,-130.486 639.25,-140.879"/>
+<polygon fill="black" stroke="black" points="629.488,-143.889 637.718,-136.642 634.266,-142.416 639.044,-140.942 639.044,-140.942 639.044,-140.942 634.266,-142.416 640.37,-145.243 629.488,-143.889 629.488,-143.889"/>
+</g>
+<!-- 14->18 -->
+<g id="edge27" class="edge"><title>14->18</title>
+<path fill="none" stroke="black" d="M809.899,-108.313C814.865,-118.5 820.865,-131.75 825,-144 840.493,-189.898 851.649,-245.317 857.446,-277.713"/>
+<polygon fill="black" stroke="black" points="859.205,-287.769 853.049,-278.694 858.344,-282.844 857.482,-277.919 857.482,-277.919 857.482,-277.919 858.344,-282.844 861.915,-277.144 859.205,-287.769 859.205,-287.769"/>
+</g>
+<!-- 14->22 -->
+<g id="edge28" class="edge"><title>14->22</title>
+<path fill="none" stroke="black" d="M780.73,-108.303C770.502,-117.035 757.939,-127.76 746.822,-137.25"/>
+<polygon fill="black" stroke="black" points="739.037,-143.896 743.72,-133.98 742.839,-140.649 746.642,-137.403 746.642,-137.403 746.642,-137.403 742.839,-140.649 749.564,-140.826 739.037,-143.896 739.037,-143.896"/>
+</g>
+<!-- 15 -->
+<g id="node16" class="node"><title>15</title>
+<polygon fill="none" stroke="black" points="1142,-108 1068,-108 1068,-72 1142,-72 1142,-108"/>
+<text text-anchor="middle" x="1105" y="-86.3" font-family="Times,serif" font-size="14.00">sbws.sbws</text>
+</g>
+<!-- 15->17 -->
+<g id="edge29" class="edge"><title>15->17</title>
+<path fill="none" stroke="black" d="M1118.63,-108.128C1136.35,-131.26 1167.05,-174.396 1184,-216 1192.09,-235.843 1196.94,-259.64 1199.71,-277.632"/>
+<polygon fill="black" stroke="black" points="1201.15,-287.739 1195.29,-278.472 1200.44,-282.789 1199.74,-277.839 1199.74,-277.839 1199.74,-277.839 1200.44,-282.789 1204.2,-277.206 1201.15,-287.739 1201.15,-287.739"/>
+</g>
+<!-- 19 -->
+<g id="node20" class="node"><title>19</title>
+<polygon fill="none" stroke="black" points="1058,-180 956,-180 956,-144 1058,-144 1058,-180"/>
+<text text-anchor="middle" x="1007" y="-158.3" font-family="Times,serif" font-size="14.00">sbws.util.parser</text>
+</g>
+<!-- 15->19 -->
+<g id="edge30" class="edge"><title>15->19</title>
+<path fill="none" stroke="black" d="M1081.03,-108.124C1068.45,-117.107 1052.87,-128.237 1039.25,-137.966"/>
+<polygon fill="black" stroke="black" points="1031.07,-143.81 1036.59,-134.336 1035.13,-140.904 1039.2,-137.998 1039.2,-137.998 1039.2,-137.998 1035.13,-140.904 1041.82,-141.66 1031.07,-143.81 1031.07,-143.81"/>
+</g>
+<!-- 16 -->
+<g id="node17" class="node"><title>16</title>
+<polygon fill="none" stroke="black" points="1155.5,-36 1090.5,-36 1090.5,-0 1155.5,-0 1155.5,-36"/>
+<text text-anchor="middle" x="1123" y="-14.3" font-family="Times,serif" font-size="14.00">sbws.util</text>
+</g>
+<!-- 17->7 -->
+<g id="edge31" class="edge"><title>17->7</title>
+<path fill="none" stroke="black" d="M1150.9,-322.18C1147.9,-322.848 1144.92,-323.462 1142,-324 954.806,-358.531 728.533,-371.086 627.374,-375.199"/>
+<polygon fill="black" stroke="black" points="617.111,-375.605 626.926,-370.714 622.108,-375.407 627.104,-375.21 627.104,-375.21 627.104,-375.21 622.108,-375.407 627.281,-379.706 617.111,-375.605 617.111,-375.605"/>
+</g>
+<!-- 18->7 -->
+<g id="edge32" class="edge"><title>18->7</title>
+<path fill="none" stroke="black" d="M806.643,-320.66C802.029,-321.792 797.435,-322.917 793,-324 736.415,-337.818 671.564,-353.492 627.207,-364.188"/>
+<polygon fill="black" stroke="black" points="617.228,-366.594 625.895,-359.876 622.089,-365.422 626.95,-364.25 626.95,-364.25 626.95,-364.25 622.089,-365.422 628.004,-368.625 617.228,-366.594 617.228,-366.594"/>
+</g>
+<!-- 19->0 -->
+<g id="edge33" class="edge"><title>19->0</title>
+<path fill="none" stroke="black" d="M981.803,-180.124C968.586,-189.107 952.208,-200.237 937.893,-209.966"/>
+<polygon fill="black" stroke="black" points="929.293,-215.81 935.035,-206.467 933.429,-213 937.564,-210.189 937.564,-210.189 937.564,-210.189 933.429,-213 940.094,-213.911 929.293,-215.81 929.293,-215.81"/>
+</g>
+<!-- 19->2 -->
+<g id="edge34" class="edge"><title>19->2</title>
+<path fill="none" stroke="black" d="M1007,-180.303C1007,-188.017 1007,-197.288 1007,-205.888"/>
+<polygon fill="black" stroke="black" points="1007,-215.896 1002.5,-205.896 1007,-210.896 1007,-205.896 1007,-205.896 1007,-205.896 1007,-210.896 1011.5,-205.896 1007,-215.896 1007,-215.896"/>
+</g>
+<!-- 20->21 -->
+<g id="edge35" class="edge"><title>20->21</title>
+<path fill="none" stroke="black" d="M181.664,-252.124C195.784,-261.192 213.311,-272.448 228.561,-282.241"/>
+<polygon fill="black" stroke="black" points="237.233,-287.81 226.387,-286.193 233.026,-285.108 228.819,-282.407 228.819,-282.407 228.819,-282.407 233.026,-285.108 231.25,-278.62 237.233,-287.81 237.233,-287.81"/>
+</g>
+<!-- 21->7 -->
+<g id="edge36" class="edge"><title>21->7</title>
+<path fill="none" stroke="black" d="M311.758,-317.784C368.272,-330.545 462.093,-351.731 520.859,-365"/>
+<polygon fill="black" stroke="black" points="530.692,-367.221 519.946,-369.408 525.815,-366.119 520.938,-365.018 520.938,-365.018 520.938,-365.018 525.815,-366.119 521.929,-360.629 530.692,-367.221 530.692,-367.221"/>
+</g>
+<!-- 21->21 -->
+<g id="edge37" class="edge"><title>21->21</title>
+<path fill="none" stroke="black" d="M311.69,-292.899C322.013,-294.18 329.5,-298.547 329.5,-306 329.5,-310.775 326.428,-314.283 321.505,-316.524"/>
+<polygon fill="black" stroke="black" points="311.69,-319.101 320.22,-312.209 316.526,-317.831 321.362,-316.562 321.362,-316.562 321.362,-316.562 316.526,-317.831 322.505,-320.914 311.69,-319.101 311.69,-319.101"/>
+</g>
+</g>
+</svg>
diff --git a/docs/source/index.rst b/docs/source/index.rst
index ec605db..43eb373 100644
--- a/docs/source/index.rst
+++ b/docs/source/index.rst
@@ -24,6 +24,7 @@ Contents
    LICENSE
    faq
    glossary
+   diagrams
    sbws
 
 Proposals





More information about the tor-commits mailing list