tor-commits
Threads by month
- ----- 2025 -----
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2019
- 20 participants
- 3265 discussions

27 Mar '19
commit 959ed45a49c2c40b679e672ea223fba7601fbace
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Mar 27 12:50:30 2019 +0000
Update translations for tpo-web
---
contents+es.po | 41 +++++++++++++++++++++++++++++++----------
1 file changed, 31 insertions(+), 10 deletions(-)
diff --git a/contents+es.po b/contents+es.po
index 29596fefb..6e2e01fe7 100644
--- a/contents+es.po
+++ b/contents+es.po
@@ -2831,28 +2831,33 @@ msgid ""
"If you are in a country where Tor is blocked, you can configure Tor to "
"connect to a bridge during the setup process."
msgstr ""
+"Si estás en un país donde Tor está bloqueado, puedes configurarlo para "
+"conectarse con un puente durante el proceso de inicialización."
#: templates/download.html:10
msgid "Select \"Tor is censored in my country.\""
-msgstr ""
+msgstr "Selecciona \"Tor está censurado en mi país.\""
#: templates/download.html:13
msgid ""
"If Tor is not censored, one of the most common reasons Tor won’t connect is "
"an incorrect system clock. Please make sure it’s set correctly."
msgstr ""
+"Si Tor no está censurado, una de las razones más comunes por la cual no "
+"conecte es un reloj de sistema incorrecto. Por favor asegúrate que está "
+"ajustado correctamente."
#: templates/download.html:14
msgid "Support Portal"
-msgstr ""
+msgstr "Portal de Asistencia"
#: templates/download.html:14
msgid "Read other FAQ’s at our Support Portal"
-msgstr ""
+msgstr "Leer otras PMF en nuestro Portal de Asistencia"
#: templates/download.html:19 templates/download.html:21
msgid "Stay safe"
-msgstr ""
+msgstr "Permanece seguro"
#: templates/download.html:23
msgid "Please do not torrent over Tor."
@@ -2863,12 +2868,16 @@ msgid ""
"Tor Browser will block browser plugins such as Flash, RealPlayer, Quicktime,"
" and others: they can be manipulated into revealing your IP address."
msgstr ""
+"Tor Browser bloqueará complementos de navegador tales como Flash, "
+"RealPlayer, Quicktime, y otros: pueden ser manipulados para revelar tu "
+"dirección IP."
#: templates/download.html:27
msgid ""
"We do not recommend installing additional add-ons or plugins into Tor "
"Browser"
msgstr ""
+"No recomendamos instalar adiciones o complementos adicionales en Tor Browser"
#: templates/download.html:28
msgid ""
@@ -2876,6 +2885,9 @@ msgid ""
"already comes with HTTPS Everywhere, NoScript, and other patches to protect "
"your privacy and security."
msgstr ""
+"Los complementos o adiciones pueden evitar Tor o comprometer tu privacidad. "
+"Tor Browser ya viene con HTTPS Everywhere, NoScript, y otros parches para "
+"proteger tu privacidad y seguridad."
#: templates/download.html:40
#, python-format
@@ -2896,6 +2908,8 @@ msgid ""
"Download Tor Browser to experience real private browsing without tracking, "
"surveillance, or censorship."
msgstr ""
+"Descarga Tor Browser para experimentar navegación privada real sin rastreo, "
+"vigilancia o censura."
#: templates/footer.html:22
msgid "Our mission:"
@@ -2936,19 +2950,19 @@ msgstr ""
#: templates/hero-download.html:2
msgid "Defend yourself."
-msgstr ""
+msgstr "Defiéndete."
#: templates/hero-download.html:38
msgid "Download in another language"
-msgstr ""
+msgstr "Descargar en otro lenguaje."
#: templates/hero-download.html:39
msgid "Advanced Install Options"
-msgstr ""
+msgstr "Opciones avanzadas de instalación"
#: templates/hero-download.html:42
msgid "Read the latest release announcements"
-msgstr ""
+msgstr "Leer los anuncios del último lanzamiento."
#: templates/hero-home.html:2
msgid "Browse Privately."
@@ -2967,7 +2981,7 @@ msgstr ""
#: templates/home.html:7 templates/home.html:11
msgid "BLOCK TRACKERS"
-msgstr ""
+msgstr "BLOQUEAR RASTREADORES"
#: templates/home.html:12
msgid ""
@@ -2975,10 +2989,14 @@ msgid ""
"can’t follow you. Any cookies automatically clear when you’re done browsing."
" So will your browsing history."
msgstr ""
+"Tor Browser aísla cada sitio web que visitas de manera que rastreadores de "
+"terceros y publicidades no pueden seguirte. Cualquier cookie es "
+"automáticamente borrado cuando terminas la navegación. Como así también tu "
+"historial de navegación."
#: templates/home.html:24 templates/home.html:28
msgid "DEFEND AGAINST SURVEILLANCE"
-msgstr ""
+msgstr "DEFENDERSE EN CONTRA DE LA VIGILANCIA"
#: templates/home.html:29
msgid ""
@@ -2986,6 +3004,9 @@ msgid ""
"websites you visit. All anyone monitoring your browsing habits can see is "
"that you’re using Tor."
msgstr ""
+"Tor Browser previene que alguien mirando tu conexión conozca qué sitios web "
+"visitas. Todo lo que aquel monitoreando tus hábitos de navegación puede ver "
+"es que estás usando Tor."
#: templates/home.html:41 templates/home.html:45
msgid "RESIST FINGERPRINTING"
1
0

[translation/torbutton-browseronboardingproperties_completed] Update translations for torbutton-browseronboardingproperties_completed
by translation@torproject.org 27 Mar '19
by translation@torproject.org 27 Mar '19
27 Mar '19
commit 6d1cfd7d9f1238e34cf7770fc6b8ebc991f5ce38
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Mar 27 12:49:33 2019 +0000
Update translations for torbutton-browseronboardingproperties_completed
---
fr/browserOnboarding.properties | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/fr/browserOnboarding.properties b/fr/browserOnboarding.properties
index b3f897a04..dc3a99133 100644
--- a/fr/browserOnboarding.properties
+++ b/fr/browserOnboarding.properties
@@ -1,41 +1,45 @@
-# Copyright (c) 2018, The Tor Project, Inc.
+# Copyright (c) 2019, The Tor Project, Inc.
# See LICENSE for licensing information.
# vim: set sw=2 sts=2 ts=8 et:
onboarding.tour-tor-welcome=Bienvenue
onboarding.tour-tor-welcome.title=Vous êtes prêts.
onboarding.tour-tor-welcome.description=Le navigateur Tor Browser offre le plus haut niveau de confidentialité et de sécurité quand vous parcourez le Web. Vous êtes maintenant protégé contre le suivi à la trace, la surveillance et la censure. Cette introduction rapide vous montrera comment faire.
-onboarding.tour-tor-welcome.button=Commencer maintenant
+onboarding.tour-tor-welcome.next-button=Aller vers Confidentialité
onboarding.tour-tor-privacy=Confidentialité
onboarding.tour-tor-privacy.title=Repoussez les traqueurs et les fouineurs.
onboarding.tour-tor-privacy.description=Le navigateur Tor Browser isole les témoins et supprime l’historique de votre navigateur en fin de session. Ces modifications garantissent que confidentialité et sécurité sont protégées dans le navigateur. Cliquez sur « Réseau Tor » pour savoir comment nous vous protégeons au niveau du réseau.
-onboarding.tour-tor-privacy.button=Se rendre sur le Réseau Tor
+onboarding.tour-tor-privacy.button=Aller vers Réseau Tor
onboarding.tour-tor-network=Réseau Tor
onboarding.tour-tor-network.title=Naviguez sur un réseau décentralisé.
onboarding.tour-tor-network.description=Le navigateur Tor Browser vous connecte au réseau Tor exploité par des milliers de bénévoles dans le monde entier. Contrairement à un RPV, il n’y a pas de point de défaillance unique ou d’entité centralisée auxquels vous devez faire confiance pour profiter d’Internet en toute confidentialité.
-onboarding.tour-tor-network.button=Se rendre sur l’Affichage des circuits
+onboarding.tour-tor-network.button=Aller vers Affichage des circuits
onboarding.tour-tor-circuit-display=Affichage des circuits
onboarding.tour-tor-circuit-display.title=Visualisez votre chemin.
onboarding.tour-tor-circuit-display.description=Pour chaque domaine que vous visitez, votre trafic est relayé et chiffré dans un circuit passant par trois relais Tor disséminés de par le monde. Aucun site Web ne sait d’où vous vous connectez. Vous pouvez demander un nouveau circuit en cliquant sur « Nouveau circuit Tor pour ce site » dans votre Affichage des circuits.
onboarding.tour-tor-circuit-display.button=Visualiser mon chemin
+onboarding.tour-tor-circuit-display.next-button=Aller vers Sécurité
onboarding.tour-tor-security=Sécurité
onboarding.tour-tor-security.title=Choisissez votre expérience.
onboarding.tour-tor-security.description=Nous vous offrons aussi des paramètres supplémentaires pour augmenter la sécurité de votre navigateur. Nos paramètres de sécurité vous permettent de bloquer des éléments qui pourraient être utilisés pour attaquer votre ordinateur. Cliquez ci-dessous pour voir ce que les différentes options vous proposent.
onboarding.tour-tor-security-level.button=Voir votre niveau de sécurité
+onboarding.tour-tor-security-level.next-button=Aller vers Conseils sur l’expérience
onboarding.tour-tor-expect-differences=Conseils sur l’expérience
onboarding.tour-tor-expect-differences.title=Attendez-vous à des différences.
onboarding.tour-tor-expect-differences.description=Avec toutes les fonctions de sécurité et de confidentialité offertes par Tor, votre expérience de navigation sur Internet pourrait être un peu différente. Les choses pourraient être un peu plus lentes et selon votre niveau de sécurité, certains éléments pourraient ne pas fonctionner ou ne pas se charger. On pourrait aussi vous demander de prouver que vous êtes un humain et non un robot.
onboarding.tour-tor-expect-differences.button=Consulter les FAQ
+onboarding.tour-tor-expect-differences.next-button=Aller vers Services Onion
onboarding.tour-tor-onion-services=Les services onion
onboarding.tour-tor-onion-services.title=Soyez plus que protégé.
onboarding.tour-tor-onion-services.description=Les services onion sont des sites se terminant par .onion qui offrent des protections accrues aux diffuseurs et aux visiteurs, dont des mesures de protection contre la censure. Les services onion permettent à tous de proposer anonymement du contenu et des services. Cliquez ci-dessous pour visiter le site onion de DuckDuckGo.
onboarding.tour-tor-onion-services.button=Visiter un Onion
+onboarding.tour-tor-onion-services.next-button=Terminé
# Circuit Display onboarding.
onboarding.tor-circuit-display.next=Suivant
1
0

[translation/torbutton-browseronboardingproperties] Update translations for torbutton-browseronboardingproperties
by translation@torproject.org 27 Mar '19
by translation@torproject.org 27 Mar '19
27 Mar '19
commit be65ea895af37d2052016a4e17845f947f9c7a92
Author: Translation commit bot <translation(a)torproject.org>
Date: Wed Mar 27 12:49:27 2019 +0000
Update translations for torbutton-browseronboardingproperties
---
fr/browserOnboarding.properties | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/fr/browserOnboarding.properties b/fr/browserOnboarding.properties
index 69828110e..dc3a99133 100644
--- a/fr/browserOnboarding.properties
+++ b/fr/browserOnboarding.properties
@@ -5,35 +5,35 @@
onboarding.tour-tor-welcome=Bienvenue
onboarding.tour-tor-welcome.title=Vous êtes prêts.
onboarding.tour-tor-welcome.description=Le navigateur Tor Browser offre le plus haut niveau de confidentialité et de sécurité quand vous parcourez le Web. Vous êtes maintenant protégé contre le suivi à la trace, la surveillance et la censure. Cette introduction rapide vous montrera comment faire.
-onboarding.tour-tor-welcome.next-button=Go to Privacy
+onboarding.tour-tor-welcome.next-button=Aller vers Confidentialité
onboarding.tour-tor-privacy=Confidentialité
onboarding.tour-tor-privacy.title=Repoussez les traqueurs et les fouineurs.
onboarding.tour-tor-privacy.description=Le navigateur Tor Browser isole les témoins et supprime l’historique de votre navigateur en fin de session. Ces modifications garantissent que confidentialité et sécurité sont protégées dans le navigateur. Cliquez sur « Réseau Tor » pour savoir comment nous vous protégeons au niveau du réseau.
-onboarding.tour-tor-privacy.button=Se rendre sur le Réseau Tor
+onboarding.tour-tor-privacy.button=Aller vers Réseau Tor
onboarding.tour-tor-network=Réseau Tor
onboarding.tour-tor-network.title=Naviguez sur un réseau décentralisé.
onboarding.tour-tor-network.description=Le navigateur Tor Browser vous connecte au réseau Tor exploité par des milliers de bénévoles dans le monde entier. Contrairement à un RPV, il n’y a pas de point de défaillance unique ou d’entité centralisée auxquels vous devez faire confiance pour profiter d’Internet en toute confidentialité.
-onboarding.tour-tor-network.button=Se rendre sur l’Affichage des circuits
+onboarding.tour-tor-network.button=Aller vers Affichage des circuits
onboarding.tour-tor-circuit-display=Affichage des circuits
onboarding.tour-tor-circuit-display.title=Visualisez votre chemin.
onboarding.tour-tor-circuit-display.description=Pour chaque domaine que vous visitez, votre trafic est relayé et chiffré dans un circuit passant par trois relais Tor disséminés de par le monde. Aucun site Web ne sait d’où vous vous connectez. Vous pouvez demander un nouveau circuit en cliquant sur « Nouveau circuit Tor pour ce site » dans votre Affichage des circuits.
onboarding.tour-tor-circuit-display.button=Visualiser mon chemin
-onboarding.tour-tor-circuit-display.next-button=Go to Security
+onboarding.tour-tor-circuit-display.next-button=Aller vers Sécurité
onboarding.tour-tor-security=Sécurité
onboarding.tour-tor-security.title=Choisissez votre expérience.
onboarding.tour-tor-security.description=Nous vous offrons aussi des paramètres supplémentaires pour augmenter la sécurité de votre navigateur. Nos paramètres de sécurité vous permettent de bloquer des éléments qui pourraient être utilisés pour attaquer votre ordinateur. Cliquez ci-dessous pour voir ce que les différentes options vous proposent.
onboarding.tour-tor-security-level.button=Voir votre niveau de sécurité
-onboarding.tour-tor-security-level.next-button=Go to Experience Tips
+onboarding.tour-tor-security-level.next-button=Aller vers Conseils sur l’expérience
onboarding.tour-tor-expect-differences=Conseils sur l’expérience
onboarding.tour-tor-expect-differences.title=Attendez-vous à des différences.
onboarding.tour-tor-expect-differences.description=Avec toutes les fonctions de sécurité et de confidentialité offertes par Tor, votre expérience de navigation sur Internet pourrait être un peu différente. Les choses pourraient être un peu plus lentes et selon votre niveau de sécurité, certains éléments pourraient ne pas fonctionner ou ne pas se charger. On pourrait aussi vous demander de prouver que vous êtes un humain et non un robot.
onboarding.tour-tor-expect-differences.button=Consulter les FAQ
-onboarding.tour-tor-expect-differences.next-button=Go to Onion Services
+onboarding.tour-tor-expect-differences.next-button=Aller vers Services Onion
onboarding.tour-tor-onion-services=Les services onion
onboarding.tour-tor-onion-services.title=Soyez plus que protégé.
1
0

[sbws/master] fix: v3bwfile: Add method to set under_min_report KeyValue
by juga@torproject.org 27 Mar '19
by juga@torproject.org 27 Mar '19
27 Mar '19
commit ab41332191f75fa4f050e072a2b37254267a8f3d
Author: juga0 <juga(a)riseup.net>
Date: Fri Mar 22 16:56:01 2019 +0000
fix: v3bwfile: Add method to set under_min_report KeyValue
in the Bandwidth Lines.
When the minimum percent of relays it's not reached, still report
the relays but set KeyValues accordingly so that Tor doesn't vote
on their bandwidth.
Part of #29853.
---
sbws/lib/v3bwfile.py | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index e698388..d126ad6 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -978,6 +978,17 @@ class V3BWFile(object):
return cls(header, bw_lines)
@staticmethod
+ def set_under_min_report(bw_lines):
+ """
+ Mondify the Bandwidth Lines adding the KeyValue `under_min_report`,
+ `vote`.
+ """
+ log.debug("Setting `under_min_report` to %s lines.", len(bw_lines))
+ for l in bw_lines:
+ l.under_min_report = 1
+ l.vote = 0
+
+ @staticmethod
def bw_kb(bw_lines, reverse=False):
bw_lines_scaled = copy.deepcopy(bw_lines)
for l in bw_lines_scaled:
1
0

27 Mar '19
commit d2752c009f1405c997a1fa63e026b3648427b16c
Author: juga0 <juga(a)riseup.net>
Date: Fri Mar 22 17:03:07 2019 +0000
fix: v3bwfile: Change from_results to set
under_min_report KeyValue when the minimum percent is not reached.
Also change list by int the methods that calculate the progress.
Part of #29853.
---
sbws/lib/v3bwfile.py | 44 +++++++++++++++++++++++++++++++-------------
1 file changed, 31 insertions(+), 13 deletions(-)
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index d126ad6..a4ce748 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -930,12 +930,17 @@ class V3BWFile(object):
header.add_relays_excluded_counters(exclusion_dict)
if not bw_lines_raw:
+ # It could be possible to scale the lines that were successful
+ # even if excluded, but is not done here.
log.info("After applying restrictions to the raw results, "
"there is not any. Scaling can not be applied.")
+ # Update the header and log the progress.
cls.update_progress(
- cls, bw_lines_raw, header, number_consensus_relays, state)
- # Create the bandwidth file with the excluded lines that does not
- # have ``bw`` attribute
+ cls, 0, header, number_consensus_relays, state)
+ # Set the lines that would be excluded anyway (`vote=0`) with
+ # `under_min_report=1`
+ cls.set_under_min_report(bw_lines_excluded)
+ # Create the bandwidth file with the lines that would be excluded.
return cls(header, bw_lines_excluded)
if scaling_method == SBWS_SCALING:
bw_lines = cls.bw_sbws_scale(bw_lines_raw, scale_constant)
@@ -945,8 +950,14 @@ class V3BWFile(object):
bw_lines = cls.bw_torflow_scale(bw_lines_raw, torflow_obs,
torflow_cap, round_digs)
# log.debug(bw_lines[-1])
- cls.update_progress(
- cls, bw_lines, header, number_consensus_relays, state)
+ # Update the header and log the progress.
+ min_perc = cls.update_progress(
+ cls, len(bw_lines), header, number_consensus_relays, state
+ )
+ # If after scaling the number of lines is less than the percentage
+ # of lines to report, set them with `under_min_report`.
+ if not min_perc:
+ cls.set_under_min_report(bw_lines)
else:
bw_lines = cls.bw_kb(bw_lines_raw)
# log.debug(bw_lines[-1])
@@ -1275,7 +1286,7 @@ class V3BWFile(object):
return num
@staticmethod
- def measured_progress_stats(bw_lines, number_consensus_relays,
+ def measured_progress_stats(num_bw_lines, number_consensus_relays,
min_perc_reached_before):
""" Statistics about measurements progress,
to be included in the header.
@@ -1293,14 +1304,14 @@ class V3BWFile(object):
# It will not be updated to the last consensus, but the list of
# measured relays is not either.
assert isinstance(number_consensus_relays, int)
- assert isinstance(bw_lines, list)
+ assert isinstance(num_bw_lines, int)
statsd = {}
- statsd['number_eligible_relays'] = len(bw_lines)
+ statsd['number_eligible_relays'] = num_bw_lines
statsd['number_consensus_relays'] = number_consensus_relays
statsd['minimum_number_eligible_relays'] = round(
statsd['number_consensus_relays'] * MIN_REPORT / 100)
statsd['percent_eligible_relays'] = round(
- len(bw_lines) * 100 / statsd['number_consensus_relays'])
+ num_bw_lines * 100 / statsd['number_consensus_relays'])
statsd['minimum_percent_eligible_relays'] = MIN_REPORT
if statsd['number_eligible_relays'] < \
statsd['minimum_number_eligible_relays']:
@@ -1356,20 +1367,27 @@ class V3BWFile(object):
['sum_bw', 'mean_bw', 'median_bw', 'num',
'max_bw', 'min_bw']]
- def update_progress(self, bw_lines, header, number_consensus_relays,
+ def update_progress(self, num_bw_lines, header, number_consensus_relays,
state):
+ """
+ Returns True if the minimim percent of Bandwidth Lines was reached
+ and False otherwise.
+ Update the header with the progress.
+ """
min_perc_reached_before = state.get('min_perc_reached')
if number_consensus_relays is not None:
statsd, success = self.measured_progress_stats(
- bw_lines, number_consensus_relays, min_perc_reached_before)
+ num_bw_lines, number_consensus_relays, min_perc_reached_before)
# add statistics about progress always
header.add_stats(**statsd)
if not success:
- bw_lines = []
+ # From sbws 1.1.0 the lines are reported (#29853) even if they
+ # are less than the minimum percent.
state['min_perc_reached'] = None
+ return False
else:
state['min_perc_reached'] = now_isodt_str()
- return bw_lines
+ return True
def bw_line_for_node_id(self, node_id):
"""Returns the bandwidth line for a given node fingerprint.
1
0
commit 8e43dda654c249610ab3f2cc8008e6de0884c5b7
Author: juga0 <juga(a)riseup.net>
Date: Mon Mar 25 13:26:39 2019 +0000
chg: tests: Add testnet generated files
and run generate as part of the integration tests.
This allows to later check that the testnet genearted files
contain the expected Keys and Values with an script in #29727.
---
tests/data/.sbws/datadir/2019-03-25.txt | 15 +
tests/data/.sbws/state.dat | 9 +
tests/data/.sbws/tor/cached-consensus | 144 ++++++
tests/data/.sbws/tor/cached-descriptors | 801 +++++++++++++++++++++++++++++
tests/data/.sbws/v3bw/20190325_130909.v3bw | 40 ++
tox.ini | 1 +
6 files changed, 1010 insertions(+)
diff --git a/tests/data/.sbws/datadir/2019-03-25.txt b/tests/data/.sbws/datadir/2019-03-25.txt
new file mode 100644
index 0000000..bb19b52
--- /dev/null
+++ b/tests/data/.sbws/datadir/2019-03-25.txt
@@ -0,0 +1,15 @@
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 6 [relay7 (E894C659) -> exit2 (C0606B41)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553518998.6577215, "relay_in_recent_consensus_count": 1, "fingerprint": "C0606B414423F9A2BBA2679B440056E3B07FEC85", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.12", "nickname": "exit2", "version": 4, "type": "error-stream", "master_key_ed25519": "iriD8sIKS25WGc6mLesQ2okT1Tcn81AuqnEbItJeuvY", "circ": ["E894C65997F8EC96558B554176EEEA39C6A43EF6", "C0606B414423F9A2BBA2679B440056E3B07FEC85"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 5 [relay1 (2ABFBACE) -> exit1 (270A861A)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519008.7184815, "relay_in_recent_consensus_count": 1, "fingerprint": "2ABFBACE61167A1019A56CB35B2E3362B97D8570", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.4", "nickname": "relay1", "version": 4, "type": "error-stream", "master_key_ed25519": "zOZX+yyD7EN1W/Y2wgjuvObpFOOWK+LZIWlKW0AOcIE", "circ": ["2ABFBACE61167A1019A56CB35B2E3362B97D8570", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 7 [relay5 (32B7178F) -> exit1 (270A861A)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519018.8218904, "relay_in_recent_consensus_count": 1, "fingerprint": "32B7178F7201F76411A99D3552F340D3597D5629", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.8", "nickname": "relay5", "version": 4, "type": "error-stream", "master_key_ed25519": "5O+uCpFoBzsey33+Zzlgyy18/McmV1mpPJZ+DrZMKRc", "circ": ["32B7178F7201F76411A99D3552F340D3597D5629", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_attempt_count": 1}
+{"relay_recent_priority_list_count": 1, "consensus_bandwidth_is_unmeasured": false, "time": 1553519021.7934368, "relay_in_recent_consensus_count": 1, "fingerprint": "117A456C911114076BEB4E757AC48B16CC0CCC5F", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "consensus_bandwidth": 0, "relay_average_bandwidth": 1048576, "rtts": [], "address": "127.10.0.14", "nickname": "relay1mbyteMAB", "downloads": [{"amount": 33851243, "duration": 6.1733644008636475}, {"amount": 33851243, "duration": 6.220228672027588}, {"amount": 33851243, "duration": 5.932555913925171}, {"amount": 33851243, "duration": 6.066358804702759}, {"amount": 33851243, "duration": 6.243254899978638}], "version": 4, "type": "success", "relay_observed_bandwidth": 0, "relay_burst_bandwidth": 1073741824, "master_key_ed25519": "2fXiF4T993i+vVwZZEQ4fYee+N8OThzCGeacvnVaNbo", "circ": ["117A456C911114076BEB4E757AC48B16CC0CCC5F", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measuremen
t_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 10 [auth3 (35E3B8BB) -> exit1 (270A861A)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519031.9330049, "relay_in_recent_consensus_count": 1, "fingerprint": "35E3B8BB71C81355649AEC5862ECB7ED7EFDBC5C", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.3", "nickname": "auth3", "version": 4, "type": "error-stream", "master_key_ed25519": "r29RWlFMIdU5GUvKsWGdhQIKjIpUzqgw0yNx/7IpPFM", "circ": ["35E3B8BB71C81355649AEC5862ECB7ED7EFDBC5C", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 11 [relay4 (4D664E24) -> exit2 (C0606B41)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519042.0144875, "relay_in_recent_consensus_count": 1, "fingerprint": "4D664E247E530CA5CD5176B8C1A6DABC9531F0B0", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.7", "nickname": "relay4", "version": 4, "type": "error-stream", "master_key_ed25519": "NQspfAK/xkywFHV5LsQ5lLi2BmTKx2Imu4jacJ0d9os", "circ": ["4D664E247E530CA5CD5176B8C1A6DABC9531F0B0", "C0606B414423F9A2BBA2679B440056E3B07FEC85"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 13 [auth1 (AA45C130) -> exit3 (FC264325)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519052.0695426, "relay_in_recent_consensus_count": 1, "fingerprint": "AA45C13025C037F056E734169891878ED0880231", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.1", "nickname": "auth1", "version": 4, "type": "error-stream", "master_key_ed25519": "wLglSEw9/DHfpNrlrqjVRSnGLVWfnm0vYxkryH4aT6Q", "circ": ["AA45C13025C037F056E734169891878ED0880231", "FC264325EA99D597FF94DA88379DABB64304DD9D"], "relay_recent_measurement_attempt_count": 1}
+{"relay_recent_priority_list_count": 1, "consensus_bandwidth_is_unmeasured": false, "time": 1553519052.2012622, "relay_in_recent_consensus_count": 1, "fingerprint": "693F73187624BE760AAD2A12C5ED89DB1DE044F5", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "consensus_bandwidth": 0, "relay_average_bandwidth": 1073741824, "rtts": [], "address": "127.10.0.6", "nickname": "relay3", "downloads": [{"amount": 31324083, "duration": 5.3419859409332275}, {"amount": 31324083, "duration": 5.510152101516724}, {"amount": 31324083, "duration": 5.591760635375977}, {"amount": 31324083, "duration": 5.645946979522705}, {"amount": 31324083, "duration": 5.567358016967773}], "version": 4, "type": "success", "relay_observed_bandwidth": 0, "relay_burst_bandwidth": 1073741824, "master_key_ed25519": "/PrTbpen3BrKNgiNRhAa93JQtnrT3LJX3Ka1+jvbWj4", "circ": ["693F73187624BE760AAD2A12C5ED89DB1DE044F5", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_atte
mpt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 16 [auth2 (E7B3C9A0) -> exit2 (C0606B41)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519062.3665206, "relay_in_recent_consensus_count": 1, "fingerprint": "E7B3C9A0040D628DAC88B0251AE6334D28E8F531", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.2", "nickname": "auth2", "version": 4, "type": "error-stream", "master_key_ed25519": "uPz8ZZNm2Gcra7BauJP5PH+7uANRraYpCj7NFtp1KdM", "circ": ["E7B3C9A0040D628DAC88B0251AE6334D28E8F531", "C0606B414423F9A2BBA2679B440056E3B07FEC85"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 17 [relay1mbyteRBR (934E06F3) -> exit1 (270A861A)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519072.496785, "relay_in_recent_consensus_count": 1, "fingerprint": "934E06F38A391CB71DF83ECDE05DFF5CDE3AC49D", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.15", "nickname": "relay1mbyteRBR", "version": 4, "type": "error-stream", "master_key_ed25519": "eR0HnYlzpOEGwxuFjZkGJZ6pu2eV1i6fd9lhF4UOMno", "circ": ["934E06F38A391CB71DF83ECDE05DFF5CDE3AC49D", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 20 [relay1mbyteRBR (934E06F3) -> exit3 (FC264325)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519082.5644238, "relay_in_recent_consensus_count": 1, "fingerprint": "FC264325EA99D597FF94DA88379DABB64304DD9D", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.13", "nickname": "exit3", "version": 4, "type": "error-stream", "master_key_ed25519": "Wiv9uOemlcFzRY1gZfBOpbQ+aJn6NG0Z/IArZFCdSdk", "circ": ["934E06F38A391CB71DF83ECDE05DFF5CDE3AC49D", "FC264325EA99D597FF94DA88379DABB64304DD9D"], "relay_recent_measurement_attempt_count": 1}
+{"relay_recent_priority_list_count": 1, "consensus_bandwidth_is_unmeasured": false, "time": 1553519086.9947243, "relay_in_recent_consensus_count": 1, "fingerprint": "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "consensus_bandwidth": 0, "relay_average_bandwidth": 1073741824, "rtts": [], "address": "127.10.0.11", "nickname": "exit1", "downloads": [{"amount": 35501959, "duration": 6.359417676925659}, {"amount": 35501959, "duration": 6.289767503738403}, {"amount": 35501959, "duration": 6.6014111042022705}, {"amount": 35501959, "duration": 6.559557914733887}, {"amount": 35501959, "duration": 6.426588773727417}], "version": 4, "type": "success", "relay_observed_bandwidth": 0, "relay_burst_bandwidth": 1073741824, "master_key_ed25519": "C506YEdasDDQqidu4G2VLMFOwaqMX28BYkuxr1+wI9o", "circ": ["E7B3C9A0040D628DAC88B0251AE6334D28E8F531", "270A861ABED22EC2B625198BCCD7B2B9DBFFC93C"], "relay_recent_measurement_atte
mpt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 23 [relay2 (8E687E91) -> exit2 (C0606B41)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519097.167445, "relay_in_recent_consensus_count": 1, "fingerprint": "8E687E91DCAB967F6E4EE8E46E66F6AD05C7C625", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.5", "nickname": "relay2", "version": 4, "type": "error-stream", "master_key_ed25519": "Pymu1Z1eZRWgkE42xzDCYFLVKNtY743GKZzt6Im0OUw", "circ": ["8E687E91DCAB967F6E4EE8E46E66F6AD05C7C625", "C0606B414423F9A2BBA2679B440056E3B07FEC85"], "relay_recent_measurement_attempt_count": 1}
+{"msg": "Could not connect to http://127.0.0.1:28888/sbws.bin over circ 24 [relay6 (C7C50946) -> exit2 (C0606B41)]: SOCKSHTTPConnectionPool(host='127.0.0.1', port=28888): Read timed out. (read timeout=10.0)", "relay_recent_priority_list_count": 1, "time": 1553519107.2006955, "relay_in_recent_consensus_count": 1, "fingerprint": "C7C5094677013F5BC124183C71A482D0156CDCFE", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "address": "127.10.0.9", "nickname": "relay6", "version": 4, "type": "error-stream", "master_key_ed25519": "gnREYdkUN0uYI3zF8oB+Wwm4MhM6ETPX1hEyt2m2a+Y", "circ": ["C7C5094677013F5BC124183C71A482D0156CDCFE", "C0606B414423F9A2BBA2679B440056E3B07FEC85"], "relay_recent_measurement_attempt_count": 1}
+{"relay_recent_priority_list_count": 1, "consensus_bandwidth_is_unmeasured": false, "time": 1553519122.8653083, "relay_in_recent_consensus_count": 1, "fingerprint": "E894C65997F8EC96558B554176EEEA39C6A43EF6", "dest_url": "http://127.0.0.1:28888/sbws.bin", "scanner": "IDidntEditTheSBWSConfig", "consensus_bandwidth": 0, "relay_average_bandwidth": 1073741824, "rtts": [], "address": "127.10.0.10", "nickname": "relay7", "downloads": [{"amount": 35737381, "duration": 6.648009777069092}, {"amount": 35737381, "duration": 6.613178253173828}, {"amount": 35737381, "duration": 6.452952861785889}, {"amount": 35737381, "duration": 7.050682067871094}, {"amount": 35737381, "duration": 6.482200622558594}], "version": 4, "type": "success", "relay_observed_bandwidth": 0, "relay_burst_bandwidth": 1073741824, "master_key_ed25519": "cj7V+PYPJvSANsvBOjZSiCvXuGHXFrpSnPqC46I6DgU", "circ": ["E894C65997F8EC96558B554176EEEA39C6A43EF6", "FC264325EA99D597FF94DA88379DABB64304DD9D"], "relay_recent_measurement_atte
mpt_count": 1}
diff --git a/tests/data/.sbws/state.dat b/tests/data/.sbws/state.dat
new file mode 100644
index 0000000..38acf6c
--- /dev/null
+++ b/tests/data/.sbws/state.dat
@@ -0,0 +1,9 @@
+{
+ "uuid": "806218a0-3ce5-4778-b839-d6faf6798405",
+ "scanner_started": "2019-03-25T13:03:06",
+ "recent_consensus_count": 1,
+ "recent_priority_list_count": 1,
+ "recent_measurement_attempt_count": 15,
+ "min_perc_reached": null,
+ "recent_priority_relay_count": 15
+}
\ No newline at end of file
diff --git a/tests/data/.sbws/tor/cached-consensus b/tests/data/.sbws/tor/cached-consensus
new file mode 100644
index 0000000..32f12ed
--- /dev/null
+++ b/tests/data/.sbws/tor/cached-consensus
@@ -0,0 +1,144 @@
+network-status-version 3
+vote-status consensus
+consensus-method 28
+valid-after 2019-03-25 13:08:50
+fresh-until 2019-03-25 13:09:00
+valid-until 2019-03-25 13:09:20
+voting-delay 2 2
+client-versions
+server-versions
+known-flags Authority Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 Microdesc=1 Relay=1-2
+shared-rand-previous-value 0 zxJao+gBmFMSezvz/VXkEWEQJD5b/z+7AXNCGoLFVW0=
+shared-rand-current-value 3 zOVHVZs8fQfIcs1HSjWa8nwr4kls3aj+LNhJcE4vUPw=
+dir-source auth2 4EE103A081F400E6622F5461D51782B876BB5C24 127.10.0.2 127.10.0.2 2003 2002
+contact pastly(a)torproject.org
+vote-digest 9147EE32EA7B7FEE195EFFF8DD61BCBC044ACD1D
+dir-source auth3 8B85069C7FC0593801E6491A34100264FCE28980 127.10.0.3 127.10.0.3 2003 2002
+contact pastly(a)torproject.org
+vote-digest 21747518E052E648242156E67793D2B75A8462EF
+dir-source auth1 D7DBC517EFD2BA1A5012CF1BD0BB38F17C8160BD 127.10.0.1 127.10.0.1 2003 2002
+contact pastly(a)torproject.org
+vote-digest 9735B1C401CEED00AA4FAF84348F0E2DB88002A5
+r relay1mbyteMAB EXpFbJERFAdr6051esSLFswMzF8 g041Vrpm/01ukZ5oAW+KAcudmTI 2019-03-25 13:02:42 127.10.0.14 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r exit1 JwqGGr7SLsK2JRmLzNeyudv/yTw t7/OM287ZDaeItUVISJ9PisVHi0 2019-03-25 13:02:42 127.10.0.11 2002 2003
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p accept 1-65535
+r relay1 Kr+6zmEWehAZpWyzWy4zYrl9hXA baev0r8l0sbx5foNr6L7jMQBz7c 2019-03-25 13:02:42 127.10.0.4 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay5 MrcXj3IB92QRqZ01UvNA01l9Vik 17SIRm6SJrDZDwBnb8FPqzqXD5E 2019-03-25 13:02:42 127.10.0.8 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r auth3 NeO4u3HIE1VkmuxYYuy37X79vFw DWMUpmsayhRW35zrevN7h1AFd2U 2019-03-25 13:02:56 127.10.0.3 2002 2003
+s Authority Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay4 TWZOJH5TDKXNUXa4wabavJUx8LA xVCoP9aGJrtbCj39wMNsTTzufek 2019-03-25 13:02:42 127.10.0.7 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay3 aT9zGHYkvnYKrSoSxe2J2x3gRPU PRQtdZg7vi0s5AuBP2hvVwa+Hg4 2019-03-25 13:02:42 127.10.0.6 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay2 jmh+kdyrln9uTujkbmb2rQXHxiU ZyXj9jg668CPFfNGzP3M6R7W5eA 2019-03-25 13:02:43 127.10.0.5 2002 2003
+s Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay1mbyteRBR k04G84o5HLcd+D7N4F3/XN46xJ0 AvNHG0R8ux15D/4pfDRafr96avM 2019-03-25 13:02:42 127.10.0.15 2002 2003
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r auth1 qkXBMCXAN/BW5zQWmJGHjtCIAjE aB5bSTH8rgroGvljDElcFN6Eauo 2019-03-25 13:02:47 127.10.0.1 2002 2003
+s Authority Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r exit2 wGBrQUQj+aK7omebRABW47B/7IU dI5io9KalNyLFOFjvEoUbWvDB2U 2019-03-25 13:02:43 127.10.0.12 2002 2003
+s Exit Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p accept 1-65535
+r relay6 x8UJRncBP1vBJBg8caSC0BVs3P4 X8bEx5uGoC+0zI/P1k+H8md7e/g 2019-03-25 13:02:43 127.10.0.9 2002 2003
+s Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r auth2 57PJoAQNYo2siLAlGuYzTSjo9TE KDl2076V5kyGxbuYGsROm2LZKAA 2019-03-25 13:02:56 127.10.0.2 2002 2003
+s Authority Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r relay7 6JTGWZf47JZVi1VBdu7qOcakPvY f4N5R25SZPF8qjpCYOQluKK1hjw 2019-03-25 13:02:43 127.10.0.10 2002 2003
+s Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p reject 1-65535
+r exit3 /CZDJeqZ1Zf/lNqIN52rtkME3Z0 BgiTPSUaddDaGl1hWS9Vw6/jJTg 2019-03-25 13:02:43 127.10.0.13 2002 2003
+s Exit Fast Running V2Dir Valid
+v Tor 0.3.5.8
+pr Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=0 Unmeasured=1
+p accept 1-65535
+directory-footer
+bandwidth-weights Wbd=3333 Wbe=0 Wbg=0 Wbm=10000 Wdb=10000 Web=10000 Wed=3333 Wee=10000 Weg=3333 Wem=10000 Wgb=10000 Wgd=3333 Wgg=10000 Wgm=10000 Wmb=10000 Wmd=3333 Wme=0 Wmg=0 Wmm=10000
+directory-signature 4EE103A081F400E6622F5461D51782B876BB5C24 9734950A2091BD2A6892A6AA0B53BEF3D85E2D2E
+-----BEGIN SIGNATURE-----
+VQZNfgZ81EmCqJUTTNf9JyphsOX4JaMtMSuHQx0Kr25jtznLZ3IGYssptgDWeD9F
+mCt3xHKQd1mtF9cxPtRKMhAb6Tn9qL3vI55lzYinxJ2/RQ0aCpJyeMaeVhd0Rgq6
+zz/tV9iCLBltksk3jZy7tl/Yo7NbIOV97oQNSRXHRtYtRr37ADvW/hC8jegtDEfc
+Nw3u/NMJnWTaO/2L4Mxh3/xBQP+Yhy0OQC6korX1HT4SnC9xVEl8xjV2/ShdObBx
+m4FLHd4qqoCXLfVHEMcAb/x2BO/GWdrREiSKX0//UpnTLzOFdz3+Al2m8+qDzSrO
+7D9qaS8IohSEoIvVPqa+CA==
+-----END SIGNATURE-----
+directory-signature 8B85069C7FC0593801E6491A34100264FCE28980 EA74AA3BF805F776E2BBC0C81BFDE45E74D3281E
+-----BEGIN SIGNATURE-----
+ZoSZOhNf6dqDe2OAIXTD8WV+BX7hHX3XfX9uCAC0LTwlr4bNRXHvV15I1NIK6x05
+Ptzz3Hgs9xaBqwa/VtcTyapxXy5uGNwAWCVbIrXL6LCbILRI5qh6vKy+CTXtY5Pt
+lmitMjstIMXTQ79WmGiIQsPlWM4w5zeD+T6g5E0RYdKylY1U3wDBXBc4jokrCG64
+mcY4FYQgn1S6VrAJZLAvQ2H8l6P7QqSmVQk9T4EDkwNsbYsm1oIwkTVw0d+pEZLb
+nZ/n525HDWDcWjeAhsicn9ptMMxBjpRqjxUnKZPPsQ95pWJ9a7T7/U+upuIuq7V/
+1cmRHWdBJwGHp0JISuzAJA==
+-----END SIGNATURE-----
+directory-signature D7DBC517EFD2BA1A5012CF1BD0BB38F17C8160BD 8E164C0799EA8FF145C8631FED8A4F512A3022CA
+-----BEGIN SIGNATURE-----
+Okb5iAC6le5ERMTOMxt8EqLNlLGJP7E5a/YdIJcjB6i33EXskIp5UQX69OQmEia8
+B6coFmof0UTJjR/KpacgG91+aE7mN6HNFogfWC8XIz+XFGlvgL14mQsvhv3aIXXx
+NCpGh1FSn3G/M2MyPVSaJhtCWfGBXrIzk3twkPsztWl4jOnSG+Tjsvp2PMnZXoXH
+gYhJjVDG625Y6oKbwVwRlCzidQrzFkX9CGrcp4o8UopOAm0V0W088LT8IcPLgvTH
+E/zY+w75r4jQXbBFUlfy2EAZ1wbP7CSBW3DVA6LZdIcO7domb+5P3aeZLYtmGulO
+4FLyzRArnIAdNEFKsE6pGg==
+-----END SIGNATURE-----
diff --git a/tests/data/.sbws/tor/cached-descriptors b/tests/data/.sbws/tor/cached-descriptors
new file mode 100644
index 0000000..b4c5296
--- /dev/null
+++ b/tests/data/.sbws/tor/cached-descriptors
@@ -0,0 +1,801 @@
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay1mbyteMAB 127.10.0.14 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+Aa/Y0Yi6yNl60hk0I5qHvifFw45lSzGfpgRREeh2DvkBAQAgBADZ9eIX
+hP33eL69XBlkRDh9h5743w5OHMIZ5py+dVo1uvL3+Kdk/F2KvUFu1v3PvCM4L6/n
+idxlpRjpBjYPJAp+O9gReRtgyuE5EvtC12kBhhJ0AfcHCoa0rb3qcDUj3wc=
+-----END ED25519 CERT-----
+master-key-ed25519 2fXiF4T993i+vVwZZEQ4fYee+N8OThzCGeacvnVaNbo
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 117A 456C 9111 1407 6BEB 4E75 7AC4 8B16 CC0C CC5F
+uptime 0
+bandwidth 1048576 1073741824 0
+extra-info-digest 3897F8831FC843D3B8E4E43E4C0024B3F666F85F bevCKiyzObGPKWTDY6m2Sr9YeDhczrQIkCa498wRw3E
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMGz6rMK5e4683h111qtOeHX40ikSl5JaqlKZTRXt790KAnTdNIZa5Rj
+6sQU6fM6t+9jLSjDv55La8Ka8MuYtKnzOEnFrEY6K0afWJi1SCH1Usda7W9r91a9
+OqSZXc7GBKYp0Aa5YR9du4vnv+4ZHFY5DG0dxKTJJsUJNuoldjMTAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBALsJJ+zGdXFKBhOUv0i1C+MSfB6EZRW7zOvxNndPoNX5Ql50UI8taF+o
+m+jei6vOyRes9hRZK3tTiT98LTXXf635Ad7iWZGW/F+owLRbEe5dtcjZ+AVflgHJ
+gf0aYSdIO6qnGOmZhz8smnY1UcH/DwrBo6RgIl0UuMbM8oJyAuPxAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+QjhUPn1WHyw96LbKUOsm+hEic1TAlVaLJUG4ndyB4ujgP09nGJTdEwfPh0IoF7ny
+YEuda1H3Yw8wVgikG1HuuiaN8nxZ8lssmf0m3nUTpj0NLLuyAt2eBRzbgR4gSDCD
+iqibDcOeqCcZowIZuGDWgUikwwRRs4qAbtHJi1dRScQ=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAdn14heE/fd4vr1cGWREOH2HnvjfDk4cwhnmnL51WjW6AEykFQ4Z4jQX
+tt09tfuUha/Dzy1uIBXMktoxG2LSU5phbqtenL88MXnTtpY4rfUIKOeeMJmuRfDo
+B7QgFEfFPgk=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key Hp/2KQ+kf94FGoGcUgDz6Q/Gco139fH85cZIdCANm1g=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 6so7MC5nK8zRyKkTz+jK7/rMpeFYqB1mqx5gTDzB/ZzOYgu16kmswQoh6cqauZKRHq3UC9AbxF2K5jzLOq1iDA
+router-signature
+-----BEGIN SIGNATURE-----
+KP7kGUcKj2kw6ekJAvO1Jfu8wYMZ5QNvTE6i9zfHXzcoigN22jqtDUP3jVSNLEuK
+Zwch0sJzqOo2TdnQCZQCltYPsuoSxIsIc4agxt4tgpaaU76my99pqt0TelDwN/NS
+M3TdoNJ6B9lDFx2H3qWanza4Skf3tGl5exP1oeruqAo=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router exit1 127.10.0.11 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+ARpWo9ciBJUdH0NBQXH9JGEHonhYfVnaLeQTDn3tbiBTAQAgBAALnTpg
+R1qwMNCqJ27gbZUswU7BqoxfbwFiS7GvX7Aj2iaMxh1+uUhHF2XkADgGJDU1UkaL
+DSo/NkJcHfI0hHPO9qQjTX+KDjvtcOQtjV8oGqTrRtLUXIrF0tKX2uvo5QU=
+-----END ED25519 CERT-----
+master-key-ed25519 C506YEdasDDQqidu4G2VLMFOwaqMX28BYkuxr1+wI9o
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 270A 861A BED2 2EC2 B625 198B CCD7 B2B9 DBFF C93C
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest A5EF3135DA7348307A1FBCF271633BCA06AFB0DC abwjhxW5ju88ygG2gbLGkwFMjG/IIz6aUjQ5WwMXAjk
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMdgbZ7/Ndt7chWPH+QnlypWZzinXWi2clQx2YYDaE/46LtBsQnYQwc7
+2YsqxbJfjZ6Q8KNct5gXg0btAYSEpuz3LOd4ghLfu65wwaB/C/lAtfkoNYnm08s6
+1mYiObiQmyh2Pr44W/3lSbf5A1sKgFMwAvhR+FdLK9I/w1jTehsFAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANSGu2AP7o3IGfskS8+xYc2MY0vN6gD9bBqHqP4EydZkPJTwsMTJ/+Oa
++ZlrTvgwc1dHdlJVuVOrcl5Znzsl1X7YD66LC1U+Lqo5AAAMS/EMGIJOfN6ZaoLC
+5HUG514p2p2QCtkzDnfnbGjqbWndclBLJZ17aphEUERf8QQawQQZAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+AUIaLmZKXcZjRuMLX5KJPEF4EG96xrsCQtULieoEdiLjkBNC4CnKGJnIlsaOERAd
+jSoi/8nZjhRQYsp4Z/gMErCJ3WaGjjX5y5Z6E/cVnTVjPC4mRyMZQU/fcD8y00Q6
+eNbUPCa/tfRSouM/+jcgZZxgSZ9C2PevTge+QKAYTVU=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAQudOmBHWrAw0KonbuBtlSzBTsGqjF9vAWJLsa9fsCPaAONZ4YLoA8yJ
+kzVqgAiUqniq6wUlxWBEtPJ+akORIzAfUCl7s4UdY5ECrvpoMgQt+BZ5wRQVmykT
+toh9oCMo/wo=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key Igr87rZTZlJ/4Bh5BjMIDGGm6L9nUb4J/hEx/XXi6As=
+accept *:*
+ipv6-policy accept 1-65535
+tunnelled-dir-server
+router-sig-ed25519 WKMIF5ydWjZZVuEAYBs5CyTah1233FawIY1KJ+w/RP8gbhajtDRTJpRilf/yrbj8/4gAo4ZmeZdyiyN9SP5MCA
+router-signature
+-----BEGIN SIGNATURE-----
+KzcynGMe7yy9rOF09rR0t2aE6fojq7vZKZVMWA2v/Og21VJVf/rlsQhwt+9Cllrw
++Cre6YUzk2YS2NjvpxlYlUWGksc9ke/ea3HPNn2L4Pk7a2RQv7HMh0Rw805Q9sPS
+yS4IjVEe1w56fyVvybAbg6zysIEgEkby6lpnMUFu8t4=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay1 127.10.0.4 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AUdvarNdcPYBUrJ+XwmWCVdo8TfQkStNbaMNbAnKaifzAQAgBADM5lf7
+LIPsQ3Vb9jbCCO685ukU45Yr4tkhaUpbQA5wgS3lUlaulCBgUCsDRqh50SFGOXuO
+UbGztWQoyh4iMGnk1BC2+Pktd05nJ1iIImJnZcXJdw7AdRy20Ss3r6KVbw8=
+-----END ED25519 CERT-----
+master-key-ed25519 zOZX+yyD7EN1W/Y2wgjuvObpFOOWK+LZIWlKW0AOcIE
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 2ABF BACE 6116 7A10 19A5 6CB3 5B2E 3362 B97D 8570
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 57B4758F9C604544B96A4CECEA68E5EBA7C87422 2FP0z0+tFKxfqY2S0kKsXfOYC4UPJWrbR26kKwqvWU8
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAL6Xpwh8wFU8Csi+UxLBX/2LhlyyMJt6A7Ky9Dhv15d6fDCW4TTOCSqn
+hHI+MBnBwYg/Mt25bPKAVlXByG6kX1jOaD7rsPJWzas0dtrv90AsLnb6n2uf5eL+
+B7WDENCvxuK5wT59xxF/BZfbidAYA5OqoXm26PT2iEf8oY1qO+8rAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANLeAAwtzRB/YgKJTx7yNxk5GToSu/msrwnQemgbBl3sOw9i/o4zUbwx
+W7AdDzCIXPae2Tqfn1i4fbrbF4xiAuavSgG+mnZWtKC9EeHJ5wZHY6D3TfXliU/b
+GRv2QVVNtXrf3lpsiX4sY3wXe7t6B5C1tTAHlOdc31dyb6uTh7hXAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+CupOCoyfUGO/AeJCHswUCZxoCSVF6N4/0C96hYGSqQ28QroVyOxQkJp+QZPF3elI
+P8eCMrcAfVSUooJz5iEr0El6f/H5GuLdZAjlaO5rKhB3AjAnpPCQ/Yi/gwg1U7xQ
+vBvxjNBk6QURDRzX2hsNLSePNKN6XjUFOti0iXA6e8Q=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAczmV/ssg+xDdVv2NsII7rzm6RTjlivi2SFpSltADnCBAFlMZ9QScnhP
+dKPa1BvVay9sgW2/pOcjJkHnSoQk7hnIoOZuTdoAo8j1/ocgzRUWkaR7nLKgLMej
+Q4ukfBrMiQo=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key nh2DK/VFifF3DvFuj3mJvLVse4WHeUuIiKV7/LV3Zxs=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 B+ltsC1tr7elhZUucfjq8OZN7YPmaXp2jbEzo7kUjJHlp9+DpBkj+MEFzgY5h7DuJu+Fq9rQZ84z3drqiVsoAw
+router-signature
+-----BEGIN SIGNATURE-----
+W1jzQwy+kbrpRff/Momd5g395pRPRwNb/grI3tvZd65Uli4XuRxMBKlk2CGReD7E
+iOxMKLTXzlLyGY0HIfH2dF+Pj+o5o5122A6sqJ8Ecaucd7jviWGonIDJk5X6MXGR
+qnu1M166D9TPZptXcCn+lkIKC93tj7+8e2oHaBlo1gs=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay5 127.10.0.8 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AZ+3pRqD8aheZv9V49udOeZEUnsz+ulAjdCeqqwmuorzAQAgBADk764K
+kWgHOx7Lff5nOWDLLXz8xyZXWak8ln4OtkwpFzPoyrK91kk93vROLrGw2jdcp+29
+Q8YXzv0nlo82KUVeuGemrcbO5255DuTF7TlGRga6AD1bp2Ke8MZghhQeEgg=
+-----END ED25519 CERT-----
+master-key-ed25519 5O+uCpFoBzsey33+Zzlgyy18/McmV1mpPJZ+DrZMKRc
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 32B7 178F 7201 F764 11A9 9D35 52F3 40D3 597D 5629
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest F5666EB8059B058875106492FB91F0C01C8508A4 v8AtF/T7gBCE2Vf/5Ajxmvj+J1QbZhr722X9JleKYCA
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAPFjYNupsxb/YjwZE7hT0XO38U7hehNpXvhnIN+kj9UAmuCXiWuHaUOW
+32gz8xH1anfG2x3H/04DSXB87uq6A1MH3WNSQ2ag6E3uw0IzUf+KyTD6RrQocj7A
+tIUnB5z0YiKjHwryw4vPCWulgfGu5dHrnnVtrJVbw6w3Ao6D2AX9AgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMaxtjKfv720Orx01vvtsfOs1kiVXJv3vfWoOE+DVTLM05dVDiR93vfV
+MBYTFeGNglrGDYbMIho6vljrSliK4eIFzlvwIXHynjqWVWoxJWQt1FUt4PBdwR5j
+sYBSgVmoMI+Ub/LwsjO6vp9YdKvCCkF3eyV/wXlzCYLYe2TSex23AgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+NGloVnbLb6OjFEaFHrkluTn9VyCyMBQ9fWWACFXpmm+oKPP07tpGNiKkQEvRmx93
+oqtAVUaaoaYkbsvRUC9LKFd5gJBUun6G8pqw4v5xo+wWfvvtmMOftRIOE8vVvo9X
+I1nIRW6q7ggvBJN6cBHGc4PP4M9BUtxSEVdZ7jx50bM=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAeTvrgqRaAc7Hst9/mc5YMstfPzHJldZqTyWfg62TCkXAFDrGpftsYWY
+t+eB5kXOo7TyzEjJvsRIMApdxsj+nwzsw6aX2CzTa5IjPuaVP1zU+7vIqhkQv2IR
+DEXbdTxzzQc=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key hU3fUFYXJMCSmKBbTiI7BCPGqueAeHunamShaC11yDM=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 D29QAzMvpnfcSkMA72F4bYUhxxvnQMRshqKcKu3wV1jTUaiaeQ39hzeLba+helKd5TDn4IDbJPqwqH45t/Y8Bw
+router-signature
+-----BEGIN SIGNATURE-----
+Xhcuib9Bo9Sp6X550TPD7kEfjKAlcNWRigI3qdEZFWsjerHfswyab5QT0XjsAEvR
+Rx1Re7zLd8M5k6wdLFkG2COzHCffKYA76YvTfSb0vGgz2CslZISk2qzaV7i7TyuU
+8BS3QM9N+sVFc0A3C4OHRp6jGgd/USq4/teSP51ZEqU=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay4 127.10.0.7 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AQbp6+KbYm5Nd0p/P+gqlVlM//nq2t0MRHT2Zgigwm4wAQAgBAA1Cyl8
+Ar/GTLAUdXkuxDmUuLYGZMrHYia7iNpwnR32i1emTuV6fxWk0os6Iip50xuFrfIw
+vChQnBLH6RD16Y9ZpFwT4V4qS+zFXEiZYipyG5+tjxPmguJDmLylD+w/QAY=
+-----END ED25519 CERT-----
+master-key-ed25519 NQspfAK/xkywFHV5LsQ5lLi2BmTKx2Imu4jacJ0d9os
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 4D66 4E24 7E53 0CA5 CD51 76B8 C1A6 DABC 9531 F0B0
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest FC704D38B23093307F4C1686BDA90BE15A37C1DE ZimUgBYAYoy/3JKn4Kb4gKJCg4SE2DS19DI2Sop8WFw
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANz9jsTlSwTP63thEv2vY5ZW5O9mBzfeZ8tsqwZGj2ipsEPZdlvV/Acw
+jpxNEPOVSJCOkC922JkS8haQrbujRTa2PEzIuAHnNBKCBN6gr8DnTTfGbBKPGmBH
+mTTEBV/EOS48XvgNpN0rhW4df6lDDGgs+M2YZFm72Axft2lgkZoJAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMQBopTlw49Rl/RWTddTFB/slDb27ojRTj+kc/awpOXmrYGTHaikF0Rn
+QcDpXjehkQALqCzAL5wCSrdhhSRSW3gSzXJaxnNgQJg+xdssQk4vipHAoLQhGOmc
+9KFr4r1VfcNn2b5Xpfl2U0D67WT2SwEVnMUR8OGoZdytb9Vh11MTAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+UKyXSdk5Qs2l/MFlp18Xqfj02wGpNKUh5It+468y/j9um4d5RBeg2OAFG3WpI2AM
+Tm9x5lPKNFpyEUAb4lOIT/4+C1Kmz1RttL0vm7H3MoWMczL/nJ9MLNS+Jv/vf5X8
+bW2E+iEApYRy7bzNARhA8ZHgSSwGcpZT4XFQzCtjjWo=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOATULKXwCv8ZMsBR1eS7EOZS4tgZkysdiJruI2nCdHfaLAHgjQYmrwhh9
+MPGp2PIhbWta7vnTX+O1lSBSlwgCXJZL43AWaIMmM6Qm0MipP1N+avOwouQxwzz5
+yp287gZ5tQM=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key /6rXtx9cROFk4upSD80aHux8k+RyfSNZPWDFjL3b/yM=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 hIZ8kTxQ360lGMEe88TExMIOOJ0kR8IkYbo/Xg9IMfMcTZr4xzccc7+ZBSS4gC61SlfbK3VXeMVH1bnwrNhhBg
+router-signature
+-----BEGIN SIGNATURE-----
+rv6R0N54uDuoWItGSP1v6r1SwqPJlKVMZncWZzkrAJQVm9E3wsekwiRPZsG4H0R8
+9u3vKYwHwagbM9JoXpqTzswt04YoUJ7H2Yo6WpCivjOvDtzJNAuNPMMj+5VkImQZ
+LGOtwgqkMMZ7EnKxLS6CG8d38DCMF3wvpPpb5BkfJXA=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay3 127.10.0.6 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+ASMK9D+D72vsrNpuJTpb2797Y6aNNvCQuarCSq/vXZZLAQAgBAD8+tNu
+l6fcGso2CI1GEBr3clC2etPcslfcprX6O9taPgghYJ2uwfYh4egjnIh9ugCB09H4
+rPsHJP5JUeFS+HQYV8OIL7Wud7TcfiLB3C883h+guSl9srRkF0qSMVwCCwY=
+-----END ED25519 CERT-----
+master-key-ed25519 /PrTbpen3BrKNgiNRhAa93JQtnrT3LJX3Ka1+jvbWj4
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 693F 7318 7624 BE76 0AAD 2A12 C5ED 89DB 1DE0 44F5
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest ACD8BFDD1A40EEFA60DC94B58829DDA3553523B9 bKkTYFrrxZKAglDuRAnexLMXnsoVUzhv2SvjeM8jNVY
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMOehJbGzrHB+Mq81PbDkI61eoj63pkTmztbloj8zh0nxyNaPaXdqMLS
+BdPk4J6ygdezuB2xG0dP05pjN/7w0M0rugelc4kKfeak6WHSKKEIUgLC41f8sGvz
+0eN7Q2iAwgmNvv7nYVDMxayT8+kqJ1JM0tMDJUQbq7SvUACInPu3AgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANobRE2EiEqD96o6u9C9hulIZMuQQYIn3jiy724UDoOn572Cf6UpoyYH
+QAQmDit5MbGiATY63SHwq/fdH3JkHgnjhOjKSmD8OPOJKXQXAjjt9POjlpQKTCxI
+wf6qT6EaxtBpjKYSal53iMfA1rWIt2E+W2enamoNwOqiVBsRDF5xAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+Qhs/BTOtTZdUhexY6azcniVxL/Fapzu4pXvgJAmSP2jfWMtgI0BRdpgSmjgjmzi/
+F5Wf5kPX4j4iY48ysvDfbJTGeXpOw9jgLFIRE4IkyDgRxreozDqVNlt1p8ur6Mpz
+43xs7lTex7twdO4aCSR508wvG7NQ65VNGNdboEw9YHQ=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAfz6026Xp9wayjYIjUYQGvdyULZ609yyV9ymtfo721o+AJYvtRtZhndO
+wrksjFTzLxh6U6fGutIl2yPwDTnAUZBKXN/5q8EhZx2yD33OJKcwGrMNyUKpS0+Q
+0qpila2p2AM=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key vF34QJkBD8So4nk8g0I8E8J5QSexrIHcIKLmKIntV0E=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 UeEUD6dEvpu8uR8tTzyY8I8DvbVOtYsT2M3cdLxPK6Vy2AmvftYZm//SMDtOEG1UOJR7bEydzz+wwFHCbNb6CQ
+router-signature
+-----BEGIN SIGNATURE-----
+yAglv8mngM/rd9/iTglvEcA2G4pn9IbtvW3DrUVCuNyUAkCZbArlfJ01gctgytQD
+6zhOHjBkT3xmqxWiqJEOV7wMUXELDLeLSXrdVRP1pAriWQLdHBq0mggLtO1AIzkr
+H9pGJ1yw56ivBN/WMCT+goQl/HkSqqt/ygr8mvQbMBA=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay1mbyteRBR 127.10.0.15 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AXbVIoFf+9SrkWrHFdCukwtqfAqM8enm1zKWIQ4HwshgAQAgBAB5HQed
+iXOk4QbDG4WNmQYlnqm7Z5XWLp932WEXhQ4yeqx+ayKTyDvsUc8rOO+iNw1jAmeS
+jZGFSrtG85MtUrno4WctkerE1CmddAor/k6agL1s1QfSCUHhFzBVbp7xsAU=
+-----END ED25519 CERT-----
+master-key-ed25519 eR0HnYlzpOEGwxuFjZkGJZ6pu2eV1i6fd9lhF4UOMno
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:42
+fingerprint 934E 06F3 8A39 1CB7 1DF8 3ECD E05D FF5C DE3A C49D
+uptime 0
+bandwidth 1048576 1048576 0
+extra-info-digest B787F30DBD0E2635D768FE7AC1D4757CDBE229A7 w1f/fSCVwsuHXqvy5rSAUa6wrFK43pa4UYq0C0E/Ucs
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKZP4AIDlANE+rL/U7+H90QNtA8atk7s0AODro2/dKhCD18lwz9ZN2oK
+BkQquin9glLaq/7cNMxxrtx4DIANlSfIeHobisFIh4eOmf/c5a+s1i5yHtTBab5k
+/YQf3jrm4QEwhTnEUptXcNPBdhv5yQXtpin+RHthSc4V24Taz3k/AgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKTcXIi/sknfciXc8macS7WHmT7sucXv0HDWKyMmWfXNG0owMW3T03MC
+IzSAZozA6GoiCL38yVJQUgR9aL/pIV+J1sO1ZvmW0RhllAnnkVMSUi0s/I/PsMml
+TpNMYH+Nt4a3ecxBzEBRYmQF8DfU39rOLf0P7a18pp6IhbFz0hR7AgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+F296Dg3YlyAjT2sN8U5T/252PCoQ2MyExrEN7ykXd8YMtq3rgRT7H82CCWP/jKER
+LniC1EClldKcLyAy9aXvEbmLuZKjcvesmrs5HuHfwrrTzaMa24dcQEO6/bNen6S/
+CdrL9YwymyQBgVkeNGd2SzSIJJW9busL3XTBv9x/OF8=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAXkdB52Jc6ThBsMbhY2ZBiWeqbtnldYun3fZYReFDjJ6AAnISzCIv2D5
+F4tRzcS5imY50grXbTi6DklFu2eF2ebXRsWnz7GavTqYAJ8kEenYVTjJ3fCARTyg
+fGrb5VGmSAg=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key Lo1mKXhJlVeVSLjTVBTIHsptAXgoDyD2Sp1bTQWe5QY=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 89utupSelbpTVdRjzVm8DhzSCPIA1wDsIwN5BxChIDNYa9Yvs4B01eJfaajG3RXwy+I9vgv31c0O6PQllf/oAg
+router-signature
+-----BEGIN SIGNATURE-----
+G0bwgmcInwG16VrWATXocO5u2fXzZvOz/nZ1p6nCRAFdJAiDFxck61YknapmozeA
+6vKBgSuSun2pvq8Cr/gssLEb/NY7SD+VExvGiQfO/m582Ry/int9yuJplQ3mDriY
+LdAI7N2qRWirnFg52m0qVhhe0+IJmoDiS4OnT5FKC4c=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router auth3 127.10.0.3 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AdeKc4xq8+u8Ztz0hORT8U5t1GpKHjtzYs6sFzcPcL7HAQAgBACvb1Fa
+UUwh1TkZS8qxYZ2FAgqMilTOqDDTI3H/sik8U2fr/oCLUctr3rH2hR5ztHZpG/Dm
+GMC/lMLp4uz0n3I3wGtEkrOFAT+TecOD96GvJmQhllUzAymEDbjRmq/byAY=
+-----END ED25519 CERT-----
+master-key-ed25519 r29RWlFMIdU5GUvKsWGdhQIKjIpUzqgw0yNx/7IpPFM
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint 35E3 B8BB 71C8 1355 649A EC58 62EC B7ED 7EFD BC5C
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 5D024D072C8D3DBF305742ACCE4BF859E736CA6F DxHNlVn+EK17ECpg+hEEFhqoPFEzaMSotw2DaalT+Jc
+caches-extra-info
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBALcC2Pd8WPW7ChRrwu2bFItceyhO449nnP8nG2TVcyi29jogkcbE9HFQ
+850W96EGTr4yG+E9FmB6U3xGZR0TnQd/776jztHBKjQOSN5ACfXTLGH2c7gy9jKK
+MOyx5BYNLsAZrGKtY5qwynI1i7cvGy2+i1IqfOepacjiNgTgkfrvAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAJ3y+s5tmFd+bDUZtKF3GLY4KRgf80L0JqkjWs2NXOtWSoToQL0c2xCZ
+2BEPs0WV4W6Qmh/jGclybfcPVO48NXUIgcqcaG0hUjG/5SU9DRpWIbCoA0rR2oq9
+ZXZU6teEozTDVKsSqQM6uavN4cL1FCN4H9wH6vDwD1GB4WQuM5m/AgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+M8T3n0Pl9v4I8hYuJXkBryvl0sn9T+2qrBGAiAREsJ2kqJIuDU0RzZC58nRtUKcp
+dktpPRmJ2Ua6IVSgcRJ28zp06fHhVfIIGACySfG9nFy79ABrcuZpsvRTncFzxdfU
+e0d7G5IdoV6VZddPKcQ766L8NTC5Xg6kLy6oBjc0Vec=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAa9vUVpRTCHVORlLyrFhnYUCCoyKVM6oMNMjcf+yKTxTAGnSSqJ2FQkH
+WfaMp+jIfk2XQVqURWvbhg/M+RRBMGqlH1RZZ6MYM7z6yl29NhlTQ4h0jFQ/BTP7
+Q91AMglu7Ag=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key ovVOuUzu7wTFq9kFWe/z8l/yzF+xseCHSU+rmUCuERs=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 fY2oZ8T/OBHINeby7LURqa1yGGedK8+mucRKeQTWGdCtpM3k7dz9iYAL6l2ng6J6bAkhFp4Efl4aPLRotNFZAA
+router-signature
+-----BEGIN SIGNATURE-----
+ERERsQ0S2ii7E04SoIWx8PuPBq5Q6/nZwUX54Aor0up0p6V9zhgWj/IoY8r3eCcX
+sO+U8TpJSI3bjhO+Ggi75Tm5udULIwMgR7HBTzImZflMmBuQy1rETZbFFFV9J1J3
+RAB/Rmh+QjnEOITKRiq8RwW+X0m3SMsKP6A4rqWx9nU=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay2 127.10.0.5 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AcEGD5KhGrUHV9K/8pw8altHi1QWEHwDaVVg67odDegNAQAgBAA/Ka7V
+nV5lFaCQTjbHMMJgUtUo21jvjcYpnO3oibQ5TMPtPCjZjP6WoujGtH/zqv/DwIsw
+VPP/PzdAUYUTkH71islhURRiO8l2FCeiIMM1/gjv7mhPAftydv3+3QcJDwQ=
+-----END ED25519 CERT-----
+master-key-ed25519 Pymu1Z1eZRWgkE42xzDCYFLVKNtY743GKZzt6Im0OUw
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint 8E68 7E91 DCAB 967F 6E4E E8E4 6E66 F6AD 05C7 C625
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 410D967EF4F55C1B381BC899C5C31D4819C96060 +bUjSUbJ7OYipMc/gv4VoYrLdZSvLX0IdjKxAgT8/rc
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAPqBPW2d3hJ6L4M29OUbL6gf0JAycoI29ObZ5s+M3cWA61rxtMOe/D44
+8N/LNltPLHfT19FpuDUaCu1I2rvjywHYmi01FernJmkBKsSr3SBrIa0+Kdi6fLKl
+vsvNR6dcfvm2nKlt1OsmLj6+S+fyw/Vtswb+UQ+UQ4T9SNEVZc2xAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAPFSB2vre2FfMsMDJwu9TgvLgIA4f2vXcOVNpYfeCAcUaQEPzkqQViWF
+ae6rb1qrpT5iTgDmbD0qZbR6QTakQAJSy9wddNLkQOoSQNdzWXpBfSXr1Exh+R9X
+ArLpYvGvtjRE82pySnA/x76DaaCxiz5tiZSOy9whWxX0CMwI1T1xAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+iejOHEfqMq9/kRmWh19omSRGiIfedHl9PGFSfhHbT+UVBgZYOGjllfgFLCHucYgi
+F8fKSiMKEmXvnCekUFtU8MKQfKCzKp40s0XLzWHQjzXbKo4GkKqt9kkVRf1dN+CD
+SlZyDpMOVwt97XhB6AwToXFMZjCpIuqWGY7DI3S/k38=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAT8prtWdXmUVoJBONscwwmBS1SjbWO+Nximc7eiJtDlMANyhlZJYzq0N
+hEEppB5MwzmQeA0yZieql4XPfJLXnBXoeBIzZ0VX3NsPlWsYJr7i8pQiF06hk8h+
+fLvtq/+/tws=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key 4TDufNyl8LWyZjQpMRN6ChtjnXN0s09I6LmawoauEGo=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 GymcEBnuPpcBg3XoQ5ReZlXbFEld1Vp3s0ddS3BYJB8znhyC+BTg6OetikFCpQ1PGsPYmKQ8HgvU8MoHPTPpBQ
+router-signature
+-----BEGIN SIGNATURE-----
+0roFdqEN6C8pFbY5AbgXOnpC0ggaAlA+F48Xr0Abxk7/fGb/+GLmh+kKmwy3LnRX
+cRrW7IpR9FksObAj11I6IPhy7Chk1wE5w5HKBB5ZkQz0KS/2QMJX4hmiTmXu+1Hu
+QfUUxv/yWo+PVYM5De7KLCcCnD1O/WKSauc2tSi1GmM=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router exit2 127.10.0.12 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AW9hylFVCrg6uWnIM0X/thbHuetg7bcFIexCSiHgyMnRAQAgBACKuIPy
+wgpLblYZzqYt6xDaiRPVNyfzUC6qcRsi0l669ldsSvNNiPzYD+OjNlr/pVd5wwJH
+R9geai2pX3cEgbXYoxPJCw0rPFFbSq6wpnZ3SHFZjlemHOy2/bFF1WzJIAc=
+-----END ED25519 CERT-----
+master-key-ed25519 iriD8sIKS25WGc6mLesQ2okT1Tcn81AuqnEbItJeuvY
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint C060 6B41 4423 F9A2 BBA2 679B 4400 56E3 B07F EC85
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest AAB87CAAE4DFACCF6E4DECE556B3BF9B581F48FA lxPAa0nClDkbrZR6Z7xZZBGMYvuVlFIGZ7ylvczfJVA
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANEZuLyNdoR1cAqBLreTHuqU8mlbUZUvYcdUn/EgGuwM8n5JMpUTfWKy
+TjxyD8WFxb3WbIlVr64+DkLJGcDa6kTPmQJ/xbso/KJ9Xt9pV6UFg7+sqDN1SpdG
+NwwLWwXdGk0uBEVsH0kQygsQaoX5PUlUfK+wdpeEIaSiy9G2b1rNAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAM9JJH74Bdw30YrwnrmJpCY88QlWnz3m2wYPacL0gLbJ7kzBEGtbryCu
+XsmrSUraEE0/j1X4mkaf3/O+i7Fn8ELSJc885if1R83zRrQEiVvovmH0Ln5hInXw
+nixOTg2X+PYKbk1gMe3rthDTZoFa1ruETaGwviiTK0Km7hvxaNEjAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+dVNrF8tEf4KOKRyG45NI3/bfXN3CKxKzI6TuykMDqcFUMQ5NKVuH/tX1zlZg0tT4
+nqb4hSvzOB5L1KSphqaYPDn3g23UZA9Zy1yHXsdCCKHyQpfV4qLgUCTGi8Kj8GNd
+Vrrx+U6i0kRz5EF4IFWEwQqGeH1XFpajrb6Vq2Q7sNc=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAYq4g/LCCktuVhnOpi3rENqJE9U3J/NQLqpxGyLSXrr2AJX9Bitugr9l
+OlRCkAfAWNnVR3leruTXqri14FZ7e4prcBKO6DsmvjI5G9X7bsQX2eHfdaC0GaH7
+rt67qvW8qAs=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key 5V8GcgFQLqkuZ9OHSeTPSuV+/rnQRH78QJa/pczgmj4=
+accept *:*
+ipv6-policy accept 1-65535
+tunnelled-dir-server
+router-sig-ed25519 OJbfPsESbossJIuL1+x0HktEVwicxDSi0Bp3oWrRbj7QigpvYSBjkWExVSg+Lv3UxHE4WcSJ/yWFQbLBmOInBw
+router-signature
+-----BEGIN SIGNATURE-----
+f5s8DmIi6Qk48ZVm49HGh/ceSlzYOCy3dWjUqOFCJ3W81zLlscdozXJRseRlLHzu
+HsgB3OSPFoAEI0cHKdBd7vEMFkJAc2OqL36p03oK3la3vfDJc1VlUwMX4VqEToBD
+ZTPC01OMBrbTAqyYd4v6w5SRCY0XUS1hkBFTP8IdbDU=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay6 127.10.0.9 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+Ac0trpnQdBwDqtM//X1f9IadJQ/qXHi+kcdE0+KYqClUAQAgBACCdERh
+2RQ3S5gjfMXygH5bCbgyEzoRM9fWETK3abZr5uPVroZvXDuIGSEgc9Ecx8rDALPt
+YE2h7AdthCV0LJjVB3OWVZm2vi8/5wKU+s48pAFEOGl3UVBvzYcl5LJ6qAg=
+-----END ED25519 CERT-----
+master-key-ed25519 gnREYdkUN0uYI3zF8oB+Wwm4MhM6ETPX1hEyt2m2a+Y
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint C7C5 0946 7701 3F5B C124 183C 71A4 82D0 156C DCFE
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 8F934E45BE27725AE81FA5EB4C0FA13BC4DC65ED T/kgrjXUbGa7ggVgc55NNGOJr18SIa+OiaGu5eLTOao
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANYuda9CTBRG2fcsGAvrc48LZlDiROkyq1HFweDHPfusU+bB5RdpWKmS
+3a/ZgMqVstg7aBoRh7F6C1rehsM7mDz7DoNNnYPNlJw/KHgtsDc7jxVLfVP8w38J
+hhC0Gkgm8pm5XrVMll/8RvfgqQiy+eDI9a+8iWP8v7ZLm95OHjnJAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMzhYKspx3To9ffg7o1JwUChSG8vDfq8TiS8M9xuNoJS2Dh/9gy7E2pF
+iJHIXoKucrxBDT4EgtJjd++V5rKr6gwg46nT/qJdk3YMm7JRPnN/BGBrF+dEQCef
+hveU5XlE4T054CPlBKV/vzoPPqvVtKvlqcM7WWanvOWslpFf+6j1AgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+GFDVgbL2NE2mYuMMudwLK6F2ag59XonrN2XYPoIY6WSkfd5FaySPx9EUqSYkZToD
+zzpBpyaiVDJtHbuOiy0yXJcMpBNbzLAieVqz6P5liJw7J1fQk5g3dUYvkV3peCtC
+Efu3kk3Ggq60zmgc52KVjZzfzuCw1gYEyQBau9FHIvs=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAYJ0RGHZFDdLmCN8xfKAflsJuDITOhEz19YRMrdptmvmAAFG1hSEBkjx
+cXNXjuoTKzArYbZ+NfT9fnRukH5K2D48jRCJLdttvUAsH5yI4iAMT+48gA9jO8Hw
++Mj6TyV3bQg=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key F7zm1LuRkkxsSyEk/8XPHJQPzqutX3Mx8KqbcOIgqQg=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 uo6+Xl9m7qPNST/dDj+JQwISGo5v3BY1MveJ24SLrYpDrkJpNziIgH2pwYLwSild3a6dUi5M5wNA2q69DNY/DQ
+router-signature
+-----BEGIN SIGNATURE-----
+r3AzYLlVX5FU22BMJeER8hg8h7JTkLdDOE3iyz6RuhqQoo7fJjd4tY9bBVVtZRg3
+4qHU1F8xnepdxa/rwbCtf6fS1DMddVX4h6+GBhJRfMWi4z6CfgM0LmSmJj/Ecg5x
+ehuXeyw82lRB4SzRnWi7Kty+A3edLLuSJqCblYSJzkk=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router auth2 127.10.0.2 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AXC+MrRl/H84Oi1ehh8oZLIoil2MFWfK1WZl/jhHFlTWAQAgBAC4/Pxl
+k2bYZytrsFq4k/k8f7u4A1GtpikKPs0W2nUp00ggHkWwP49QuWpTcRkNcF/oxxWD
+NQjooXTK1/kPSX8STuS0v650Re/vqbktE43LagJrfrgdWlzZAkRJsuhWrgU=
+-----END ED25519 CERT-----
+master-key-ed25519 uPz8ZZNm2Gcra7BauJP5PH+7uANRraYpCj7NFtp1KdM
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint E7B3 C9A0 040D 628D AC88 B025 1AE6 334D 28E8 F531
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 0225E581F430F793E888435C4A2D8ED110702C0D mEo7kO0Au3OC6BtODL5yoQC+g3FUNHuOFAUlB/sfXp0
+caches-extra-info
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAL8QRs6ivxV/dQAIlymYN2+tKKX+GixsPXFFDSVFuq4KG448hPoh9irf
+/qudysiq9AYXyc4whhkrrVZJP3tW+Cc9g8hXDCVxRFr9I7v48cU2F3iIOXfmWpO9
+CbXO69foc43AUkmrE+JBSw8ebYrRpBwwqUCiPMPakVkO7j7z4NO/AgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMWmFjVZOuY1EaBGMYc/gDANRhD7FjzlKwopwLuQnCyCJWmk8mpJL0UJ
+LZgk0xyz+7XgiE0ohG0/xUsj+u6uT2HZCdttvivgVJ/QMGYNbxCHNqD5RS5pXb0R
+YH9Ojok7hzGbqHOnPP4GXcAmxk34u7OCaTpl8DLt0DaOu8CaXyzVAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+FeOqXPRqQO4MqMyx+oUfzT2qniBpjZJU7Akja36sUNLXDULaDJBJJCka6FaiBnF8
+6Z0p/H62LqTQjYc18ljrNpamOpDqgnbYxLBVpp9pMjsZDReFcgOYkRheUGOF97DR
++HipH/9qbXWNJ4r+Ik5FsYIv4FiZpBzAomIwjHrsxYc=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAbj8/GWTZthnK2uwWriT+Tx/u7gDUa2mKQo+zRbadSnTAH9eekLCPGN4
+Uu6ur1jxUWktzls69geX4pi5eD89NDN+w7nq2X++PISYPvq1ga8OhP/+RHv3ayGt
+El2zEwIRpwA=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key UDhxVljTycByYSSw2T7eWRImIMuA0to9UVVS6tbxgVk=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 v9loEs8EQQoPt/Z24dZNhElHr295OwToLr9QafOeF4VilYWu3BoFDEjKZb8c2czzksap4Cg654I63tAMP2eABg
+router-signature
+-----BEGIN SIGNATURE-----
+SoH/ynyOtly+rBImK/FMvNz5mQxcr1supDl42CGE5KalzNm6/MVH1ugv2MyMQGNi
+iuvQjj5VC66YXyV1NMGxnUhG8pfmy0edcbXJhbUJf+oUlnamo60mMjgjG1E72gd7
+hjskluXyOMXH/MPjEWhZcL0D1BZUyn1spd3mKInS7po=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router relay7 127.10.0.10 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+Af2e2I1NEwFCS8g7XY9yRL4rm0WLQOo5eg539lVGU0fHAQAgBAByPtX4
+9g8m9IA2y8E6NlKIK9e4YdcWulKc+oLjojoOBea6wnAermK+oGlkoYfMKMaoyQQQ
+J1fNJURDuNkFL5oUEKbXkYUvRzXq929cE6ssMeIlRUHTvqaNLiipU9tdCAk=
+-----END ED25519 CERT-----
+master-key-ed25519 cj7V+PYPJvSANsvBOjZSiCvXuGHXFrpSnPqC46I6DgU
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint E894 C659 97F8 EC96 558B 5541 76EE EA39 C6A4 3EF6
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest A08B4A5D125CA8728F387290E268DF80E806E5C0 gYdEf22bQ3qaSfFqTURkW1j4a6oHp+FwAKPlY5fSgiU
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAN63UnkXXtULS72ZXlfzGRN1B5N3KRD+/dnG36BxA6AX0YXCClLsdSen
+oFIYSNlnO321hlHSK3Za907iDEtctZvaOqjrMrRFf1ukf1QXoCbAd9DPwIEkVG5b
+DoCjbu5lallmbH/TvkWoBe0RuhfCmABIkVbjcdVCAe6CAcYVHWDFAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBALzD6GgnLtjktO0gpd63iTuIUsAeLH2H/RT5CtQnGktYAnaq4Rtqe0r/
+vIW779dRm0rvRtKmoJY7O9W+NWPNoIrSGYBueTwa3wKKfA4n4pDVbq2rYPyP0dR/
+pQdG3qWqBO3doD0s5mTwAU2KGltXL2kjlXo9fR9HWmFJVcesuxeXAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+dCDzUKjcFw3CeqsQeI2RCTgYFwHSviMwHoWGrgt8X9Bh6KwRUFYyEwBCXAh4zwQY
+yi03xAZIw2dqGdasjGje7Y47vRzthLEpn/6q1j8mViqb2ZVCkDj98+4S/VlVgExP
+TfnrEqkyMYLki3Ftsx7ABJaUsFm32w1ehvFSll7rYzg=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAXI+1fj2Dyb0gDbLwTo2Uogr17hh1xa6Upz6guOiOg4FAK0rb4grCOPL
+2vi79NNnCX/2Ghy8b4a7zb3JOThGwHgzkipNBy6OF0RH+8/91DTX8w0XH8c2me4G
+smdIGrR/CQA=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key SrHWVe4cmcXboSRu2Fmt+d60nFKlVvgGUIjWG0SmwEM=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 XmUZL4s09pbx8cbyfthK7OEPHMR6lHDveC7JyfZteqWnVkKudgwgqd4Tb2GgqwqQPMacqUiD0XAGZn5zxZ9nDA
+router-signature
+-----BEGIN SIGNATURE-----
+hOYeA7iOxGoiCwpU/1Hdf0xdgO31Mb9YFShO6aXk/R8QxclKJ06snXIecMFZ2XHg
+pe/lM4N7dbEZ28qg7rzXKm6fPSpPHUnV3GHgHC8wWHq3f2rklAhkwD3p3Mlq3Es8
+6f+I3PBJo1U2UhbH9uc12L54Qie0IGLfiBAzzuvI23E=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router exit3 127.10.0.13 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AbXlWS6tXpTxSO/KCdz28Lz6U0jgfQFo1QNfVMQ/DnXuAQAgBABaK/24
+56aVwXNFjWBl8E6ltD5omfo0bRn8gCtkUJ1J2YyZasb3ryGGwwLFiEflqtK6Bf3V
+sYuCxBQb16TxZLfWeiwKFu4pfuDHUFasup/B3urtF9cJZCF/UM8NNp4Bdgs=
+-----END ED25519 CERT-----
+master-key-ed25519 Wiv9uOemlcFzRY1gZfBOpbQ+aJn6NG0Z/IArZFCdSdk
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:43
+fingerprint FC26 4325 EA99 D597 FF94 DA88 379D ABB6 4304 DD9D
+uptime 0
+bandwidth 1073741824 1073741824 0
+extra-info-digest 86D5B2698E3D584ED19D105E8EB97AA49D292DDF qf2hb8m/AaKT4ndwcktnJ0dK2R7TNSsCJetcda3yY+c
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBALtzPgl+kve3sBBYNp0e/bnGw0G31AJUws2lM92LgUzF3hkgZpypmeMd
+U0Rvz281F4rn0y59qLhedYyD7+kEwCHA21Byfd29WpuKX6r+LFHZ+FaZHiICaztV
++5uoeEyyDEZr6jSjrTwyGatX54csEmUwLw6Ia5HMcBdGZi3QnLsJAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKyRIonwgQGbe6FeJ9fzLqtqTS8rne1P8IBT0Wu4yMGB39pNL6b3btNi
+eAVPJZdgveajvEPkKzwamyh73faKr8oA+n78cJvvU4cXA3n+GC0b9h+mP9zG2Uh3
+hX7coSeevqik7oHePsk3BMkl5GamB5DJ9LpSeHS8v4/JxKBw8KzLAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+XEMZfBCCmvqeI+j0qr6iKQ4imw94JsVbOylGogA6J1LHbkxbWG1GNKgoY7izA0af
+kirZ6GyfDoizPnbq1pxIRen7IlC8sVjFHr1zwZuDOji6KeoNIkJhbjR1uQDGvYJV
+zSEwdaAiKcTn2o+E7w4P+4Ow5GbJxuF58bLcN0HEW6o=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 0
+-----BEGIN ED25519 CERT-----
+AQoABphOAVor/bjnppXBc0WNYGXwTqW0PmiZ+jRtGfyAK2RQnUnZANZO8CJQHdFA
+CofZl/tAT2SqZlCc8tXP4flJnTOGBWUkpGqAls3EUzh/XjYXq3NTxGa0GFnLMFkt
+DQDaLWNZSAI=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key wGtHyhAKHplfro/I48dUQFE4z1+PQMIOcb+ayebBnjo=
+accept *:*
+ipv6-policy accept 1-65535
+tunnelled-dir-server
+router-sig-ed25519 uOt1IE1eWnJOemIjb9/1CJYBouz5AOikiAOu5aD2SzhddXnrGSRK5A31kAMGQlWrnatLZW+Kp3Topg3T0opGDg
+router-signature
+-----BEGIN SIGNATURE-----
+LWOXcZ74kP67C7AOGAwpk9khWpfPrnCo3ilhxYKuMJPytwWNyZ/L7GM96ITeoHL0
+8bflNXwPCaUEOub92PwCE1+JOYYWJBxGzpiUmdLhVAnRvv6enzynZz3pDxUCKcCX
+awyzyVe8WISV5uOcCwD/YsktCxHr+8Shwx68G73Qrjs=
+-----END SIGNATURE-----
+@downloaded-at 2019-03-25 13:03:07
+@source "127.10.0.8"
+router auth1 127.10.0.1 2002 0 2003
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABph+AY41rR2Kk/cLvfjTAzH5dEEae7qehhEdvrbO55gIatkVAQAgBADAuCVI
+TD38Md+k2uWuqNVFKcYtVZ+ebS9jGSvIfhpPpE1Fcj2eWCNWJFOu7O1tvq9OVSe+
+l6BaqQv3Ex83s9B99TeJQ4t9mUW2r4F/2ExBeSDVKEbkLcI8L84O4iXktw8=
+-----END ED25519 CERT-----
+master-key-ed25519 wLglSEw9/DHfpNrlrqjVRSnGLVWfnm0vYxkryH4aT6Q
+platform Tor 0.3.5.8 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1-2 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2019-03-25 13:02:47
+fingerprint AA45 C130 25C0 37F0 56E7 3416 9891 878E D088 0231
+uptime 5
+bandwidth 1073741824 1073741824 0
+extra-info-digest 377774BD8BF88A7A5576D43E5287CBBDE7735EF1 jm5TVka0dIzTfQGqnEp1AUZiKEHkpN7fqMBTcK240CI
+caches-extra-info
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAM82kmbl7IWKNfwbEfi2lfZgqFPFVPBl7MjufSMOlDnOad0tXbbMcHY5
+jVQVL7ku2PM8SbbDvWZprbPqY9LbWoM/H3QTPgYATd+RQ+eoIuaABBTE10bsx4VC
+2WjsztC4xNStZlhuBBVMYNaf8ctHGKTSSCl12PjZUIjnXoBqPp43AgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKnUlZwRSWLcmzgq0nGkHMkKGHwkH7R5jWKNQpdW8pLEWGEz+gIZrc5Q
+OcFrFA1I/G+9rYjVTjbL1ZfgfWmz304xlhcqsNkTkCZZ0BdKBss4pvSiL0LASHNF
+1ykYWj9ZTMhQHWlenqnaauxQY70gUpteltHs3eI+BpQznzqt51GxAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+BlWMFdfFy+GUoe4jwNSYOgqFnqyeedhLeOygmEVC2StyJ5CZzK+aq4NFeDrU7r0p
+Q5qLSqBfE9FwhRgoj9mbMgLtFtPW9i5f48tEvB10N20Cf6SZSFPW5ugWu5iwJ1/F
+lHIcyVRmdII0ZF0n7IhDxmtXn/Y2TILJR4tYZXJczNQ=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABphOAcC4JUhMPfwx36Ta5a6o1UUpxi1Vn55tL2MZK8h+Gk+kAN2aZIbLS+nq
+Dik75FTz3g4Q5UqX5RiPfYSxG+yVF4jYl0Tsgzrcm9QHHELG2VGM1IcDKBgzgZTs
+6zLGsJUdewE=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact pastly(a)torproject.org
+ntor-onion-key 6Bn3JO/LbYmTcgQcMD/GJgW/A7ogap06F3eZ2d85X1Y=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 DBSxvpozeD0u7y+lMI6VFIz8/+kMfgZweQWOUf3zcQm47641RjIIYYY9XCEkqBHkI0sAs0cpU7WRDfz6GevNCw
+router-signature
+-----BEGIN SIGNATURE-----
+IlZxel5EYCHlsafVySxPmDtcjL9cf5JSQYK5IPh8OKRkYcXkaJUyANevbgM1IXo4
+4vCYj9dFJhRKjGEL6U8zckaqeb8NEzPRzI2wxyvNt/IYAPr0GyBk+cYo9KaoAmx5
+75387atFNVisLbSmSWnN3ZbjYPBNLaM+AYHcuitlINc=
+-----END SIGNATURE-----
diff --git a/tests/data/.sbws/v3bw/20190325_130909.v3bw b/tests/data/.sbws/v3bw/20190325_130909.v3bw
new file mode 100644
index 0000000..7ce06ea
--- /dev/null
+++ b/tests/data/.sbws/v3bw/20190325_130909.v3bw
@@ -0,0 +1,40 @@
+1553519123
+version=1.2.0
+destinations_countries=ZZ
+earliest_bandwidth=2019-03-25T13:03:19
+file_created=2019-03-25T13:09:09
+generator_started=2019-03-25T13:03:06
+latest_bandwidth=2019-03-25T13:05:23
+minimum_number_eligible_relays=9
+minimum_percent_eligible_relays=60
+number_consensus_relays=15
+number_eligible_relays=0
+percent_eligible_relays=0
+recent_consensus_count=1
+recent_measurement_attempt_count=15
+recent_measurement_failure_count=0
+recent_measurements_excluded_error_count=11
+recent_measurements_excluded_few_count=4
+recent_measurements_excluded_near_count=0
+recent_measurements_excluded_old_count=0
+recent_priority_list_count=1
+recent_priority_relay_count=15
+scanner_country=ZZ
+software=sbws
+software_version=1.1.0-dev0
+=====
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=0 master_key_ed25519=cj7V+PYPJvSANsvBOjZSiCvXuGHXFrpSnPqC46I6DgU nick=relay7 node_id=$E894C65997F8EC96558B554176EEEA39C6A43EF6 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_few_count=1 relay_recent_priority_list_count=1 success=1 time=2019-03-25T13:05:23 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=Wiv9uOemlcFzRY1gZfBOpbQ+aJn6NG0Z/IArZFCdSdk nick=exit3 node_id=$FC264325EA99D597FF94DA88379DABB64304DD9D relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:43 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=0 master_key_ed25519=2fXiF4T993i+vVwZZEQ4fYee+N8OThzCGeacvnVaNbo nick=relay1mbyteMAB node_id=$117A456C911114076BEB4E757AC48B16CC0CCC5F relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_few_count=1 relay_recent_priority_list_count=1 success=1 time=2019-03-25T13:03:42 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=NQspfAK/xkywFHV5LsQ5lLi2BmTKx2Imu4jacJ0d9os nick=relay4 node_id=$4D664E247E530CA5CD5176B8C1A6DABC9531F0B0 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:02 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=5O+uCpFoBzsey33+Zzlgyy18/McmV1mpPJZ+DrZMKRc nick=relay5 node_id=$32B7178F7201F76411A99D3552F340D3597D5629 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:03:39 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=uPz8ZZNm2Gcra7BauJP5PH+7uANRraYpCj7NFtp1KdM nick=auth2 node_id=$E7B3C9A0040D628DAC88B0251AE6334D28E8F531 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:22 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=r29RWlFMIdU5GUvKsWGdhQIKjIpUzqgw0yNx/7IpPFM nick=auth3 node_id=$35E3B8BB71C81355649AEC5862ECB7ED7EFDBC5C relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:03:52 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=0 master_key_ed25519=/PrTbpen3BrKNgiNRhAa93JQtnrT3LJX3Ka1+jvbWj4 nick=relay3 node_id=$693F73187624BE760AAD2A12C5ED89DB1DE044F5 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_few_count=1 relay_recent_priority_list_count=1 success=1 time=2019-03-25T13:04:12 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=0 master_key_ed25519=C506YEdasDDQqidu4G2VLMFOwaqMX28BYkuxr1+wI9o nick=exit1 node_id=$270A861ABED22EC2B625198BCCD7B2B9DBFFC93C relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_few_count=1 relay_recent_priority_list_count=1 success=1 time=2019-03-25T13:04:47 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=gnREYdkUN0uYI3zF8oB+Wwm4MhM6ETPX1hEyt2m2a+Y nick=relay6 node_id=$C7C5094677013F5BC124183C71A482D0156CDCFE relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:05:07 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=eR0HnYlzpOEGwxuFjZkGJZ6pu2eV1i6fd9lhF4UOMno nick=relay1mbyteRBR node_id=$934E06F38A391CB71DF83ECDE05DFF5CDE3AC49D relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:32 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=iriD8sIKS25WGc6mLesQ2okT1Tcn81AuqnEbItJeuvY nick=exit2 node_id=$C0606B414423F9A2BBA2679B440056E3B07FEC85 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:03:19 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=wLglSEw9/DHfpNrlrqjVRSnGLVWfnm0vYxkryH4aT6Q nick=auth1 node_id=$AA45C13025C037F056E734169891878ED0880231 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:12 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=Pymu1Z1eZRWgkE42xzDCYFLVKNtY743GKZzt6Im0OUw nick=relay2 node_id=$8E687E91DCAB967F6E4EE8E46E66F6AD05C7C625 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:04:57 under_min_report=1 unmeasured=1 vote=0
+bw=1 error_circ=0 error_destination=0 error_misc=0 error_second_relay=0 error_stream=1 master_key_ed25519=zOZX+yyD7EN1W/Y2wgjuvObpFOOWK+LZIWlKW0AOcIE nick=relay1 node_id=$2ABFBACE61167A1019A56CB35B2E3362B97D8570 relay_in_recent_consensus_count=1 relay_recent_measurement_attempt_count=1 relay_recent_measurements_excluded_error_count=1 relay_recent_priority_list_count=1 success=0 time=2019-03-25T13:03:29 under_min_report=1 unmeasured=1 vote=0
diff --git a/tox.ini b/tox.ini
index 4136036..6eaf894 100644
--- a/tox.ini
+++ b/tox.ini
@@ -56,6 +56,7 @@ commands =
mkdir -p /tmp/.sbws
; This add around 3min more to the tests
sbws -c {toxinidir}/tests/integration/sbws_testnet.ini scanner
+ sbws -c {toxinidir}/tests/integration/sbws_testnet.ini generate
coverage run -a --rcfile={toxinidir}/.coveragerc --source=sbws -m pytest -s {toxinidir}/tests/integration -vv
sbws -c {toxinidir}/tests/integration/sbws_testnet.ini cleanup
bash {envtmpdir}/net/stop.sh
1
0

27 Mar '19
commit 702ceedc33f93ee0c2371e2bb477b1b025383410
Author: juga0 <juga(a)riseup.net>
Date: Fri Mar 22 16:52:42 2019 +0000
fix: v3bwfile: Add under_min_report KeyValue
in the Bandwidth Lines.
Part of #29853.
---
sbws/lib/v3bwfile.py | 7 ++++++-
1 file changed, 6 insertions(+), 1 deletion(-)
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index 34e988c..e698388 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -130,6 +130,10 @@ BW_KEYVALUES_FILE = BW_KEYVALUES_BASIC + \
# Maybe these keys should not be included for the relays
# in which vote=1 and unmeasured=0.
'vote', 'unmeasured',
+ # When there not enough eligible relays (not excluded)
+ # under_min_report is 1, `vote` is 0.
+ # Added in #29853.
+ 'under_min_report',
# Added in #292951
'error_second_relay', 'error_destination']
BW_KEYVALUES_EXTRA_BWS = ['bw_median', 'bw_mean', 'desc_bw_avg', 'desc_bw_bur',
@@ -180,7 +184,8 @@ BW_KEYVALUES_EXTRA = BW_KEYVALUES_FILE + BW_KEYVALUES_EXTRA_BWS \
# NOTE: tech-debt: assign boolean type to vote and unmeasured,
# when the attributes are defined with a type, as stem does.
BW_KEYVALUES_INT = ['bw', 'rtt', 'success', 'error_stream',
- 'error_circ', 'error_misc', 'vote', 'unmeasured'] \
+ 'error_circ', 'error_misc', 'vote', 'unmeasured',
+ 'under_min_report'] \
+ BW_KEYVALUES_EXTRA_BWS \
+ BANDWIDTH_LINE_KEY_VALUES_MONITOR
BW_KEYVALUES = BW_KEYVALUES_BASIC + BW_KEYVALUES_EXTRA
1
0

[sbws/master] fix: tests: Change torflow_scale to continue scaling
by juga@torproject.org 27 Mar '19
by juga@torproject.org 27 Mar '19
27 Mar '19
commit 7a9a9e0829defa1ff2f4b5cb55e10da5aba1ddc3
Author: juga0 <juga(a)riseup.net>
Date: Fri Mar 22 20:17:45 2019 +0000
fix: tests: Change torflow_scale to continue scaling
even if the minimum percent was not reach.
Closes: #29853.
---
tests/unit/conftest.py | 3 ++-
tests/unit/lib/test_v3bwfile.py | 45 ++++++++++++++++++++++++++++++++---------
2 files changed, 38 insertions(+), 10 deletions(-)
diff --git a/tests/unit/conftest.py b/tests/unit/conftest.py
index fa1143d..295e777 100644
--- a/tests/unit/conftest.py
+++ b/tests/unit/conftest.py
@@ -179,10 +179,11 @@ def args(sbwshome_empty, parser, test_config_path):
@pytest.fixture(scope='function')
-def conf(sbwshome_empty):
+def conf(sbwshome_empty, tmpdir):
"""Default configuration with sbws home in the tmp test dir."""
conf = _get_default_config()
conf['paths']['sbws_home'] = sbwshome_empty
+ conf['paths']['state_fpath'] = str(tmpdir.join('.sbws', 'state.dat'))
return conf
diff --git a/tests/unit/lib/test_v3bwfile.py b/tests/unit/lib/test_v3bwfile.py
index be823a3..7065cfa 100644
--- a/tests/unit/lib/test_v3bwfile.py
+++ b/tests/unit/lib/test_v3bwfile.py
@@ -4,6 +4,7 @@ import json
import logging
import math
import os.path
+from unittest import mock
from sbws import __version__ as version
from sbws.globals import (SPEC_VERSION, SBWS_SCALING, TORFLOW_SCALING,
@@ -264,6 +265,10 @@ def test_from_results_read(datadir, tmpdir, conf, args):
# Scale BWLines using torflow method, since it's the default and BWLines
# bandwidth is the raw bandwidth.
expected_bwls = V3BWFile.bw_torflow_scale(raw_bwls)
+ # Since the scaled lines will be less than the 60% relays in the network,
+ # set under_min_report.
+ expected_bwls[0].under_min_report = '1'
+ expected_bwls[0].vote = '0'
expected_f = V3BWFile(expected_header, expected_bwls)
# This way is going to convert bw to KB
v3bwfile = V3BWFile.from_results(results)
@@ -296,20 +301,42 @@ def test_sbws_scale(datadir):
assert v3bwfile.bw_lines[0].bw == 8
-def test_torflow_scale(datadir):
+def num_consensus_relays(fpath):
+ return 1
+
+
+# To do not have to create a consensus-cache file and set the path,
+# mock the result since it only returns the number of relays.
+(a)mock.patch.object(V3BWFile, 'read_number_consensus_relays')
+def test_torflow_scale(mock_consensus, datadir, tmpdir, conf):
+ mock_consensus.return_value = 1
+ # state_fpath = str(tmpdir.join('.sbws', 'state.dat'))
+ state_fpath = conf['paths']['state_fpath']
results = load_result_file(str(datadir.join("results.txt")))
- v3bwfile = V3BWFile.from_results(results, scaling_method=TORFLOW_SCALING,
+ # Since v1.1.0, it'll write bw=1 if the minimum percent of measured relays
+ # wasn't reached. Therefore mock the consensus number.
+ # Because the consensus number is mocked, it'll try to read the sate path.
+ # Obtain it from conf, so that the root directory exists.
+ v3bwfile = V3BWFile.from_results(results, '', '',
+ state_fpath,
+ scaling_method=TORFLOW_SCALING,
round_digs=TORFLOW_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 123
- v3bwfile = V3BWFile.from_results(results, scaling_method=TORFLOW_SCALING,
+ v3bwfile = V3BWFile.from_results(results, '', '',
+ state_fpath,
+ scaling_method=TORFLOW_SCALING,
torflow_cap=0.0001,
round_digs=TORFLOW_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 123
- v3bwfile = V3BWFile.from_results(results, scaling_method=TORFLOW_SCALING,
+ v3bwfile = V3BWFile.from_results(results, '', '',
+ state_fpath,
+ scaling_method=TORFLOW_SCALING,
torflow_cap=1,
round_digs=TORFLOW_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 123
- v3bwfile = V3BWFile.from_results(results, scaling_method=TORFLOW_SCALING,
+ v3bwfile = V3BWFile.from_results(results, '', '',
+ state_fpath,
+ scaling_method=TORFLOW_SCALING,
torflow_cap=1,
round_digs=PROP276_ROUND_DIG)
assert v3bwfile.bw_lines[0].bw == 120
@@ -390,12 +417,12 @@ def test_measured_progress_stats(datadir):
bw_lines = V3BWFile.bw_torflow_scale(bw_lines_raw)
assert len(bw_lines) == 3
statsd, success = V3BWFile.measured_progress_stats(
- bw_lines, number_consensus_relays, min_perc_reached_before)
+ len(bw_lines), number_consensus_relays, min_perc_reached_before)
assert success
assert statsd == statsd_exp
number_consensus_relays = 6
statsd, success = V3BWFile.measured_progress_stats(
- bw_lines, number_consensus_relays, min_perc_reached_before)
+ len(bw_lines), number_consensus_relays, min_perc_reached_before)
assert not success
statsd_exp = {'percent_eligible_relays': 50,
'minimum_percent_eligible_relays': 60,
@@ -417,7 +444,7 @@ def test_update_progress(datadir, tmpdir):
if line is not None:
bw_lines_raw.append(line)
bwfile = V3BWFile(header, [])
- bwfile.update_progress(bw_lines_raw, header, number_consensus_relays,
+ bwfile.update_progress(len(bw_lines_raw), header, number_consensus_relays,
state)
assert header.percent_eligible_relays == '50'
assert state.get('min_perc_reached') is None
@@ -425,7 +452,7 @@ def test_update_progress(datadir, tmpdir):
# relays
number_consensus_relays = 3
header = V3BWHeader(str(now_unixts()))
- bwfile.update_progress(bw_lines_raw, header, number_consensus_relays,
+ bwfile.update_progress(len(bw_lines_raw), header, number_consensus_relays,
state)
assert state.get('min_perc_reached') == now_isodt_str()
assert header.minimum_number_eligible_relays == '2'
1
0
commit 9b054bad2aba8ac1a32ab059a9725f875d799677
Author: juga0 <juga(a)riseup.net>
Date: Wed Mar 27 06:15:29 2019 +0000
fix: tests: Replace str by int
when setting vote and unmeasured Keys.
It doesn't matter here because there're not operations with the
Keys and they're always converted to string in the bandwidth file,
but it less confusing as integer.
---
sbws/lib/v3bwfile.py | 4 ++--
tests/unit/lib/test_v3bwfile.py | 14 +++++++-------
2 files changed, 9 insertions(+), 9 deletions(-)
diff --git a/sbws/lib/v3bwfile.py b/sbws/lib/v3bwfile.py
index a4ce748..89c66eb 100644
--- a/sbws/lib/v3bwfile.py
+++ b/sbws/lib/v3bwfile.py
@@ -626,8 +626,8 @@ class V3BWLine(object):
# reason.
# This could be done in a better way as part of a refactor #28684.
- kwargs['vote'] = '0'
- kwargs['unmeasured'] = '1'
+ kwargs['vote'] = 0
+ kwargs['unmeasured'] = 1
exclusion_reason = None
diff --git a/tests/unit/lib/test_v3bwfile.py b/tests/unit/lib/test_v3bwfile.py
index b84a6f4..720cd4b 100644
--- a/tests/unit/lib/test_v3bwfile.py
+++ b/tests/unit/lib/test_v3bwfile.py
@@ -267,8 +267,8 @@ def test_from_results_read(datadir, tmpdir, conf, args):
expected_bwls = V3BWFile.bw_torflow_scale(raw_bwls)
# Since the scaled lines will be less than the 60% relays in the network,
# set under_min_report.
- expected_bwls[0].under_min_report = '1'
- expected_bwls[0].vote = '0'
+ expected_bwls[0].under_min_report = 1
+ expected_bwls[0].vote = 0
expected_f = V3BWFile(expected_header, expected_bwls)
# This way is going to convert bw to KB
v3bwfile = V3BWFile.from_results(results)
@@ -369,8 +369,8 @@ def test_results_away_each_other(datadir):
bwl, reason = V3BWLine.from_results(values, secs_away=secs_away, min_num=2)
assert bwl.relay_recent_measurements_excluded_near_count == 2
assert reason == 'recent_measurements_excluded_near_count'
- assert bwl.vote == '0'
- assert bwl.unmeasured == '1'
+ assert bwl.vote == 0
+ assert bwl.unmeasured == 1
success_results = [r for r in values if isinstance(r, ResultSuccess)]
assert len(success_results) >= min_num
@@ -391,8 +391,8 @@ def test_results_away_each_other(datadir):
bwl, reason = V3BWLine.from_results(values, min_num=2)
assert bwl.relay_recent_measurements_excluded_few_count == 1
assert reason == 'recent_measurements_excluded_few_count'
- assert bwl.vote == '0'
- assert bwl.unmeasured == '1'
+ assert bwl.vote == 0
+ assert bwl.unmeasured == 1
success_results = [r for r in values if isinstance(r, ResultSuccess)]
assert len(success_results) < min_num
@@ -498,7 +498,7 @@ def test_set_under_min_report(mock_consensus, conf, datadir):
bwl = v3bwfile.bw_lines[0]
assert bwl.vote == 0
assert bwl.under_min_report == 1
- assert bwl.unmeasured == '1'
+ assert bwl.unmeasured == 1
assert bwl.bw == 1
# The number of relays after scaling is than the 60% in the network,
1
0
commit 73c0b68eb4afdf74ed5eff30e57d8a80cdbaa84d
Author: juga0 <juga(a)riseup.net>
Date: Wed Mar 27 06:08:48 2019 +0000
fix: tests: Add set_under_min_report
to test that the `under_min_report` KeyValue is added when the
number of eligible relays is less than the 60% of relays in the
consensus.
---
tests/unit/lib/test_v3bwfile.py | 35 +++++++++++++++++++++++++++++++++++
1 file changed, 35 insertions(+)
diff --git a/tests/unit/lib/test_v3bwfile.py b/tests/unit/lib/test_v3bwfile.py
index 7065cfa..b84a6f4 100644
--- a/tests/unit/lib/test_v3bwfile.py
+++ b/tests/unit/lib/test_v3bwfile.py
@@ -474,3 +474,38 @@ def test_time_measure_half_network(caplog):
assert header.time_to_report_half_network == '70200' # 19.5h
expected_log = "Estimated time to measure the network: 39 hours." # 19.5*2
assert caplog.records[-1].getMessage() == expected_log
+
+
+(a)mock.patch.object(V3BWFile, 'read_number_consensus_relays')
+def test_set_under_min_report(mock_consensus, conf, datadir):
+ # The number of relays (1) is the same as the ones in the consensus,
+ # therefore there is no any relay excluded and under_min_report is not set.
+ mock_consensus.return_value = 1
+ state_fpath = conf['paths']['state_fpath']
+ results = load_result_file(str(datadir.join("results.txt")))
+ v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
+ bwl = v3bwfile.bw_lines[0]
+ assert not hasattr(bwl, "vote")
+ assert not hasattr(bwl, "under_min_report")
+ assert bwl.bw != 1
+
+ # The number of relays is the same as the ones in the consensus,
+ # but after filtering there's no any, under_min_report is set to 1
+ # and unmeasured was also set to 1.
+ # After filtering the relay is excluded because there's only 1 success
+ # result and it should have at least 2 (min_num)
+ v3bwfile = V3BWFile.from_results(results, '', '', state_fpath, min_num=2)
+ bwl = v3bwfile.bw_lines[0]
+ assert bwl.vote == 0
+ assert bwl.under_min_report == 1
+ assert bwl.unmeasured == '1'
+ assert bwl.bw == 1
+
+ # The number of relays after scaling is than the 60% in the network,
+ # therefore the relays are excluded and under_min_report is set to 1.
+ mock_consensus.return_value = 3
+ v3bwfile = V3BWFile.from_results(results, '', '', state_fpath)
+ bwl = v3bwfile.bw_lines[0]
+ assert bwl.vote == 0
+ assert bwl.under_min_report == 1
+ assert bwl.bw != 1
1
0