tor-commits
Threads by month
- ----- 2025 -----
- 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
October 2018
- 17 participants
- 2350 discussions

[translation/donatepages-messagespot] Update translations for donatepages-messagespot
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit d3daf763c0118b8080c19a06a0f62a39b533d3e5
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 15:45:20 2018 +0000
Update translations for donatepages-messagespot
---
locale/el/LC_MESSAGES/messages.po | 25 ++++++++++++++++++++++++-
1 file changed, 24 insertions(+), 1 deletion(-)
diff --git a/locale/el/LC_MESSAGES/messages.po b/locale/el/LC_MESSAGES/messages.po
index 5007c5c23..80be18eb8 100644
--- a/locale/el/LC_MESSAGES/messages.po
+++ b/locale/el/LC_MESSAGES/messages.po
@@ -49,6 +49,9 @@ msgid ""
"The Tor Project has very little influence over how third-party service "
"providers, such as PayPal, may collect and use your information."
msgstr ""
+"Το Tor Project έχει πολύ μικρή επιρροή στον τρόπο με τον οποίο οι πάροχοι "
+"υπηρεσιών, όπως το PayPal, μπορούν να συλλέγουν και να χρησιμοποιούν τις "
+"πληροφορίες σας."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:69
msgid ""
@@ -56,6 +59,10 @@ msgid ""
"links\" target=\"_blank\" href=\"https://www.paypal.com/webapps/mpp/ua"
"/privacy-full\">policies</a>, especially if you have privacy concerns."
msgstr ""
+"Σας συνιστούμε να εξοικειωθείτε με τις <a class=\"hyperlinks links\" "
+"target=\"_blank\" href=\"https://www.paypal.com/webapps/mpp/ua/privacy-"
+"full\">πολιτικές</a> τους, ειδικά αν έχετε ανησυχίες σχετικά με την "
+"προστασία της ιδιωτικότητας."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:74
msgid ""
@@ -63,6 +70,10 @@ msgid ""
" learn your name, the amount you donated, your email address, phone number "
"and/or mailing address, as well as any other information you provide."
msgstr ""
+"Όταν δωρίζετε στο Tor Project, ανάλογα με τον μηχανισμό που χρησιμοποιείτε, "
+"μπορεί να μάθουμε το όνομα σας, το ποσό που δωρίσατε, τη διεύθυνση email "
+"σας, τον αριθμό τηλεφώνου ή / και τη διεύθυνση αλληλογραφίας σας, καθώς και "
+"κάθε άλλη πληροφορία που παρέχετε."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:76
msgid ""
@@ -77,6 +88,9 @@ msgid ""
"The Tor Project will never have access to your financial data, such as your "
"credit card information.We aim to be careful with your information."
msgstr ""
+"Το Tor Project δεν θα έχει ποτέ πρόσβαση στα οικονομικά σας στοιχεία, όπως "
+"τα στοιχεία της πιστωτικής σας κάρτας. Στόχος μας είναι να είμαστε "
+"προσεκτικοί με τις πληροφορίες σας."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:83
msgid ""
@@ -98,6 +112,10 @@ msgid ""
"target=\"_blank\" href=\"https://www.irs.gov/pub/irs-"
"pdf/f990ezb.pdf\">Schedule B of the Form 990</a>."
msgstr ""
+"Αν δωρίσετε περισσότερα από 5.000 δολάρια και γνωρίζουμε το όνομα και τη "
+"διεύθυνσή σας, οφείλουμε να το γνωστοποιήσουμε στο IRS στο <a "
+"class=\"hyperlinks links\" target=\"_blank\" href=\"https://www.irs.gov/pub"
+"/irs-pdf/f990ezb.pdf\">Πρόγραμμα Β του Εντύπου 990</a>."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:89
msgid ""
@@ -108,7 +126,7 @@ msgstr ""
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:91
msgid ""
"We will never publicly identify you as a donor without your permission."
-msgstr ""
+msgstr "Δεν θα σας αναφέρουμε ποτέ δημοσίως ως δωρητή χωρίς την άδεια σας."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:96
msgid "We do not publish, sell, trade, or rent any information about you."
@@ -130,12 +148,17 @@ msgid ""
"who need it to do their work, for example by thanking you or mailing you a "
"t-shirt."
msgstr ""
+"Η πρόσβαση σε αυτές τις πληροφορίες περιορίζεται μέσα στο Tor Project σε "
+"άτομα που τη χρειάζονται για να κάνουν τη δουλειά τους, για παράδειγμα, "
+"ευχαριστώντας σας ή στέλνοντας σας μια κοντομάνικη μπλούζα."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:105
msgid ""
"<span class=\"bold\">The Tor Project very much appreciates all its donors. "
"Thank you for supporting Tor</span>."
msgstr ""
+"<span class=\"bold\">Το Tor Project εκτιμά πάρα πολύ όλους τους δωρητές του."
+" Σας ευχαριστούμε που υποστηρίζετε το Tor</span>."
#: tmp/cache_locale/fa/fadd8d2107638a3de94449a9eddfca4e8f010bb26f3f6a71e2d875cb910cc5f1.php:114
#: tmp/cache_locale/0e/0e65c68f2900f432bc062864e7bafc989d6286e272f5e98882a99f52ea4c5c89.php:655
1
0

[translation/support-portal] Update translations for support-portal
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit ac17a1df4d0a27f671fb1ba434db5969cc105e6e
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 15:18:59 2018 +0000
Update translations for support-portal
---
contents+ru.po | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/contents+ru.po b/contents+ru.po
index 062116b1c..56e99b26a 100644
--- a/contents+ru.po
+++ b/contents+ru.po
@@ -2221,6 +2221,8 @@ msgid ""
"See <mark><a href=\"#operators-6\">How do I run a bridge</a></mark> for "
"instructions."
msgstr ""
+"См. <mark><a href=\"#operators-6\">\"Как я могу запустить мост\"</a></mark> "
+"для получения инструкций."
#: http//localhost/tbb/tbb-10/
#: (content/tbb/tbb-10/contents+en.lrquestion.description)
@@ -2467,6 +2469,15 @@ msgid ""
"href=\"https://www.facebook.com/notes/protect-the-graph/making-connections-"
"to-facebook-more-secure/1526085754298237/\">Facebook</a></mark>."
msgstr ""
+".onion сайты также используются для обмена чатами без обмена метаданными и "
+"файлами, более безопасного взаимодействия между журналистами и их "
+"источниками, таких как <mark><a "
+"href=\"https://securedrop.org/\">SecureDrop</a></mark> или <mark><a "
+"href=\"https://onionshare.org/\">OnionShare</a></mark>, более безопасных "
+"обновлений ПО и более безопасных способов доступа к популярным сайтам, таким"
+" как <mark><a href=\"https://www.facebook.com/notes/protect-the-graph"
+"/making-connections-to-facebook-more-"
+"secure/1526085754298237/\">Facebook</a></mark>."
#: http//localhost/onionservices/onionservices-1/
#: (content/onionservices/onionservices-1/contents+en.lrquestion.description)
1
0

[translation/tor-browser-manual] Update translations for tor-browser-manual
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit 0705cbf136887cc988ef0292302c64872ed763ef
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 15:17:26 2018 +0000
Update translations for tor-browser-manual
---
cs/cs.po | 17 +++++++++++++++++
1 file changed, 17 insertions(+)
diff --git a/cs/cs.po b/cs/cs.po
index b56073a06..b0c0e707d 100644
--- a/cs/cs.po
+++ b/cs/cs.po
@@ -486,6 +486,9 @@ msgid ""
"Settings window. This offers you the option to connect directly to the Tor "
"network, or to configure Tor Browser for your connection."
msgstr ""
+"Při prvním spuštění aplikace Tor Browser se zobrazí okno Nastavení sítě Tor."
+" To vám nabízí možnost připojit se přímo k síti Tor nebo konfigurovat Tor "
+"Browser pro vaše připojení."
#: first-time.page:19
msgid "Connect"
@@ -814,6 +817,13 @@ msgid ""
"connections. Tor Browser will warn you that all activity and downloads will "
"be stopped, so take this into account before clicking “New Identity”."
msgstr ""
+"Tato volba je užitečná, pokud chcete zabránit tomu, aby následná aktivita "
+"prohlížeče byla spojena s tím, co jste dělali předtím. Jeho volba ukončí "
+"všechny otevřené karty a okna, vymaže všechny soukromé informace, jako jsou "
+"soubory cookie a historie prohlížení, a použije nové okruhy Tor pro všechna "
+"připojení. Tor Browser vás bude upozorňovat, že veškerá činnost a stahování "
+"budou zastaveny, takže je třeba vzít v úvahu před klepnutím na tlačítko "
+"\"Nová identita\"."
#: managing-identities.page:123
msgid "New Tor Circuit for this Site"
@@ -1170,6 +1180,13 @@ msgid ""
"disabled by default on all sites; most video and audio formats are disabled;"
" and some fonts and icons may not display correctly."
msgstr ""
+"Na této úrovni se multimediální a zvukové média HTML5 stávají \"click-to-"
+"play\" přes NoScript; všechny optimalizace výkonu JavaScript jsou zakázány; "
+"některé matematické rovnice se nemusí zobrazovat správně; některé funkce "
+"vykreslování písma jsou zakázány; některé typy obrázků jsou zakázány; "
+"Javascript je ve výchozím nastavení zakázán na všech stránkách; většina "
+"video a audio formátů je vypnuto; a některé písma a ikony se nemusí zobrazit"
+" správně."
#: security-slider.page:53
msgid "Safer"
1
0

[translation/support-portal] Update translations for support-portal
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit b29f0fbe14ffe60f2e3b5b24d94efd88fc554e82
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:48:58 2018 +0000
Update translations for support-portal
---
contents+ru.po | 32 ++++++++++++++++++++++++++++++++
1 file changed, 32 insertions(+)
diff --git a/contents+ru.po b/contents+ru.po
index 61395d53f..062116b1c 100644
--- a/contents+ru.po
+++ b/contents+ru.po
@@ -965,6 +965,9 @@ msgid ""
"href=\"https://trac.torproject.org/projects/tor/wiki/doc/ReducedExitPolicy\">Reduced"
" exit policy</a></mark>."
msgstr ""
+"Подумайте, хотите ли вы переключиться на политику <mark><a "
+"href=\"https://trac.torproject.org/projects/tor/wiki/doc/ReducedExitPolicy\">«Пониженный"
+" выход».</a></mark>"
#: http//localhost/faq/faq-1/
#: (content/faq/faq-1/contents+en.lrquestion.seo_slug)
@@ -1017,6 +1020,8 @@ msgid ""
"Both options are located in the Menu, but you can also access the New "
"Circuit option inside the site information menu, in the URL bar."
msgstr ""
+"Оба параметра расположены в Меню, но вы также можете получить доступ к опции"
+" Новый цикл в меню информации о сайте в URL строке."
#: http//localhost/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
@@ -1384,6 +1389,9 @@ msgid ""
"href=\"https://trac.torproject.org/projects/tor/wiki/doc/TorExitGuidelines\">Exit"
" relay guidelines</a></mark>"
msgstr ""
+"* Просмотрите наши <mark><a "
+"href=\"https://trac.torproject.org/projects/tor/wiki/doc/TorExitGuidelines\">рекомендации"
+" по выходу из ретрансляции</a></mark>"
#: http//localhost/operators/operators-4/
#: (content/operators/operators-4/contents+en.lrquestion.description)
@@ -1397,6 +1405,8 @@ msgid ""
"Using Tor in another browser can leave you vulnerable without the privacy "
"protections of Tor Browser."
msgstr ""
+"Использование Tor в другом браузере может оставить вас уязвимыми без защиты "
+"конфиденциальности от Tor Browser."
#: http//localhost/tbb/tbb-17/
#: (content/tbb/tbb-17/contents+en.lrquestion.seo_slug)
@@ -1581,6 +1591,8 @@ msgid ""
"The rest of your circuit changes with every new website you visit, and all "
"together these relays provide the full privacy protections of Tor."
msgstr ""
+"Часть вашего цикла меняется с каждым новым открытием веб-сайта, который вы "
+"посещаете, ретрансляторы обеспечивают полную защиту конфиденциальности."
#: http//localhost/tbb/tbb-2/
#: (content/tbb/tbb-2/contents+en.lrquestion.seo_slug)
@@ -1681,6 +1693,8 @@ msgid ""
"The best success we've had in getting sites to unblock Tor users is getting "
"users to contact the site administrators directly."
msgstr ""
+"Наилучший успех, который мы получили в создании сайтов для разблокирования "
+"Tor, - это прямой контакт пользователей с администрацией сайта."
#: http//localhost/tbb/tbb-40/
#: (content/tbb/tbb-40/contents+en.lrquestion.title)
@@ -1754,6 +1768,8 @@ msgid ""
"If you are unable to connect to an onion service, please see <a "
"href=\"#onionservices-3\">I cannot reach X.onion!</a>"
msgstr ""
+"Если вы не можете подключиться к сайту .onion , см. раздел <a "
+"href=\"#onionservices-3\">Я не могу связаться с X.onion!</a>"
#: http//localhost/tbb/tbb-33/
#: (content/tbb/tbb-33/contents+en.lrquestion.description)
@@ -1775,6 +1791,8 @@ msgid ""
"* After your relay connects to the network, it will try to determine whether"
" the ports you configured are reachable from the outside."
msgstr ""
+"* После того, как ваш ретранслятор подключится к сети, он попытается "
+"определить, доступны ли настроенные вами порты для сети."
#: http//localhost/tbb/tbb-37/
#: (content/tbb/tbb-37/contents+en.lrquestion.description)
@@ -1823,6 +1841,8 @@ msgid ""
"Unfortunately, there is no supported way to make Tor Browser your default "
"browser."
msgstr ""
+"К сожалению, в настоящее время нет возможности установить Tor Browser как "
+"браузер по умолчанию."
#: http//localhost/misc/misc-5/
#: (content/misc/misc-5/contents+en.lrquestion.description)
@@ -1848,6 +1868,9 @@ msgid ""
"information such as cookies and browsing history, and use new Tor circuits "
"for all connections."
msgstr ""
+"Выбор этого закроет все ваши вкладки и окна, очистят все конфиденциальные "
+"данные, такие как файлы cookie и историю просмотров, и будет использоваться "
+"новый цикл для всех подключений."
#: http//localhost/tbb/tbb-29/
#: (content/tbb/tbb-29/contents+en.lrquestion.description)
@@ -1865,6 +1888,9 @@ msgid ""
"It is a fast and stable relay that remains the first one in your circuit for"
" 2-3 months in order to protect against a known anonymity-breaking attack."
msgstr ""
+"Это быстрый и стабильный ретранслятор, который останется первым в вашем "
+"цикле в течение 2-3 месяцев, чтобы защитить от известной атаки на "
+"анонимность."
#: http//localhost/tbb/tbb-42/
#: (content/tbb/tbb-42/contents+en.lrquestion.seo_slug)
@@ -1916,6 +1942,8 @@ msgid ""
"If you’re having trouble connecting, please select the option to \"copy Tor "
"log to clipboard.\""
msgstr ""
+"Если у вас возникли проблемы с подключением, выберите вариант «Скопировать "
+"журнал Tor в буфер обмена»."
#: http//localhost/tbb/tbb-23/
#: (content/tbb/tbb-23/contents+en.lrquestion.description)
@@ -2009,6 +2037,8 @@ msgid ""
"Is there a way to change the IP address that Tor Browser assigns me for a "
"particular site?"
msgstr ""
+"Есть ли способ изменить IP-адрес, который Tor Browser назначает мне для "
+"определенного сайта?"
#: http//localhost/connecting/connecting-2/
#: (content/connecting/connecting-2/contents+en.lrquestion.description)
@@ -2082,6 +2112,8 @@ msgid ""
"Selecting it will cause the currently-active tab or window to be reloaded "
"over a new Tor circuit."
msgstr ""
+"При выборе этого параметра активная вкладка или окно будет перезагружена по "
+"новому циклу Tor."
#: http//localhost/misc/misc-1/
#: (content/misc/misc-1/contents+en.lrquestion.description)
1
0

16 Oct '18
commit 285be4447deb0bd35e28dd9aab74567c1c6541b8
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Wed Oct 10 15:48:12 2018 +0200
Add graph with total cw across bwauths.
Implements #25459.
---
CHANGELOG.md | 7 +
build.xml | 11 +
src/main/R/rserver/graphs.R | 32 +++
.../metrics/stats/collectdescs/Main.java | 1 +
.../metrics/stats/totalcw/Configuration.java | 18 ++
.../torproject/metrics/stats/totalcw/Database.java | 184 ++++++++++++++++
.../org/torproject/metrics/stats/totalcw/Main.java | 79 +++++++
.../metrics/stats/totalcw/OutputLine.java | 41 ++++
.../torproject/metrics/stats/totalcw/Parser.java | 62 ++++++
.../totalcw/TotalcwRelayNetworkStatusVote.java | 50 +++++
.../torproject/metrics/stats/totalcw/Writer.java | 36 +++
src/main/resources/web.xml | 4 +
src/main/resources/web/json/categories.json | 1 +
src/main/resources/web/json/metrics.json | 11 +
.../resources/web/jsps/reproducible-metrics.jsp | 36 ++-
src/main/resources/web/jsps/stats.jsp | 20 ++
src/main/sql/totalcw/init-totalcw.sql | 74 +++++++
.../totalcw/TotalcwRelayNetworkStatusVoteTest.java | 126 +++++++++++
...E-55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part | 239 ++++++++++++++++++++
...1-049AB3179B12DACC391F06A10C2A8904E4339D33.part | 239 ++++++++++++++++++++
...6-2669AD153408F88E416CE6206D1A75EC3324A2F4.part | 241 +++++++++++++++++++++
...7-38C6A19F78948B689345EE41D7119D76246C4D3E.part | 239 ++++++++++++++++++++
22 files changed, 1747 insertions(+), 4 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 7890d2d..f604ff9 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,10 @@
+# Changes in version 1.3.0 - 2018-??-??
+
+ * Medium changes
+ - Start downloading and processing votes.
+ - Add Apache Commons Math 3.6.1 as dependency.
+
+
# Changes in version 1.2.0 - 2018-08-25
* Medium changes
diff --git a/build.xml b/build.xml
index e5a9794..3614d78 100644
--- a/build.xml
+++ b/build.xml
@@ -45,6 +45,7 @@
<patternset id="common" >
<include name="commons-codec-1.10.jar"/>
<include name="commons-lang3-3.5.jar"/>
+ <include name="commons-math3-3.6.1.jar"/>
<include name="jackson-annotations-2.8.6.jar"/>
<include name="jackson-core-2.8.6.jar"/>
<include name="jackson-databind-2.8.6.jar"/>
@@ -319,6 +320,7 @@
<antcall target="clients" />
<antcall target="ipv6servers" />
<antcall target="webstats" />
+ <antcall target="totalcw" />
<antcall target="make-data-available" />
</target>
@@ -470,6 +472,14 @@
</antcall>
</target>
+ <target name="totalcw" >
+ <property name="module.name" value="totalcw" />
+ <antcall target="run-java" >
+ <param name="module.main"
+ value="org.torproject.metrics.stats.totalcw.Main" />
+ </antcall>
+ </target>
+
<!--
The run-rserver target documents a working option of
configuring an R server for running metrics-web.
@@ -506,6 +516,7 @@
includes="clients*.csv userstats-combined.csv" />
<fileset dir="${modulebase}/ipv6servers/stats" includes="ipv6servers.csv" />
<fileset dir="${modulebase}/webstats/stats" includes="webstats.csv" />
+ <fileset dir="${modulebase}/totalcw/stats" includes="totalcw.csv" />
</copy>
<copy todir="${rdatadir}" >
<fileset dir="${modulebase}/clients/RData" includes="*.RData" />
diff --git a/src/main/R/rserver/graphs.R b/src/main/R/rserver/graphs.R
index 66a1414..12915fa 100644
--- a/src/main/R/rserver/graphs.R
+++ b/src/main/R/rserver/graphs.R
@@ -1572,3 +1572,35 @@ write_advbw_ipv6 <- function(start_p = NULL, end_p = NULL, path_p) {
write.csv(path_p, quote = FALSE, row.names = FALSE, na = "")
}
+prepare_totalcw <- function(start_p, end_p) {
+ read.csv(paste(stats_dir, "totalcw.csv", sep = ""),
+ colClasses = c("valid_after_date" = "Date")) %>%
+ filter(if (!is.null(start_p))
+ valid_after_date >= as.Date(start_p) else TRUE) %>%
+ filter(if (!is.null(end_p))
+ valid_after_date <= as.Date(end_p) else TRUE)
+}
+
+plot_totalcw <- function(start_p, end_p, path_p) {
+ prepare_totalcw(start_p, end_p) %>%
+ complete(valid_after_date = full_seq(valid_after_date, period = 1),
+ nesting(nickname)) %>%
+ ggplot(aes(x = valid_after_date, y = measured_sum_avg,
+ colour = nickname)) +
+ geom_line(na.rm = TRUE) +
+ scale_x_date(name = "", breaks = custom_breaks,
+ labels = custom_labels, minor_breaks = custom_minor_breaks) +
+ scale_y_continuous(name = "", labels = formatter, limits = c(0, NA)) +
+ scale_colour_hue(name = "") +
+ ggtitle("Total consensus weights across bandwidth authorities") +
+ labs(caption = copyright_notice)
+ ggsave(filename = path_p, width = 8, height = 5, dpi = 150)
+}
+
+write_totalcw <- function(start_p = NULL, end_p = NULL, path_p) {
+ prepare_totalcw(start_p, end_p) %>%
+ rename(date = valid_after_date, totalcw = measured_sum_avg) %>%
+ arrange(date, nickname) %>%
+ write.csv(path_p, quote = FALSE, row.names = FALSE, na = "")
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java b/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
index 4c64425..a9620f5 100644
--- a/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
+++ b/src/main/java/org/torproject/metrics/stats/collectdescs/Main.java
@@ -24,6 +24,7 @@ public class Main {
"/recent/relay-descriptors/consensuses/",
"/recent/relay-descriptors/extra-infos/",
"/recent/relay-descriptors/server-descriptors/",
+ "/recent/relay-descriptors/votes/",
"/recent/torperf/",
"/recent/webstats/"
}, 0L, new File("../../shared/in"), true);
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java b/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java
new file mode 100644
index 0000000..a424f84
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Configuration.java
@@ -0,0 +1,18 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+/** Configuration options parsed from Java properties with reasonable hard-coded
+ * defaults. */
+class Configuration {
+ static String descriptors = System.getProperty("totalcw.descriptors",
+ "../../shared/in/");
+ static String database = System.getProperty("totalcw.database",
+ "jdbc:postgresql:totalcw");
+ static String history = System.getProperty("totalcw.history",
+ "status/read-descriptors");
+ static String output = System.getProperty("totalcw.output",
+ "stats/totalcw.csv");
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Database.java b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
new file mode 100644
index 0000000..be4cad3
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Database.java
@@ -0,0 +1,184 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import java.sql.Connection;
+import java.sql.DriverManager;
+import java.sql.PreparedStatement;
+import java.sql.ResultSet;
+import java.sql.SQLException;
+import java.sql.Statement;
+import java.sql.Timestamp;
+import java.time.ZoneId;
+import java.time.ZonedDateTime;
+import java.util.ArrayList;
+import java.util.Calendar;
+import java.util.List;
+import java.util.Locale;
+import java.util.TimeZone;
+
+/** Database wrapper to connect to the database, insert data, run the stored
+ * procedure for aggregating data, and query aggregated data as output. */
+class Database implements AutoCloseable {
+
+ /** Database connection string. */
+ private String jdbcString;
+
+ /** Connection object for all interactions with the database. */
+ private Connection connection;
+
+ /** Prepared statement for finding out whether a given authority is already
+ * contained in the authority table. */
+ private PreparedStatement psAuthoritySelect;
+
+ /** Prepared statement for inserting an authority into the authority table. */
+ private PreparedStatement psAuthorityInsert;
+
+ /** Prepared statement for checking whether a vote has been inserted into the
+ * vote table before. */
+ private PreparedStatement psVoteSelect;
+
+ /** Prepared statement for inserting a vote into the vote table. */
+ private PreparedStatement psVoteInsert;
+
+ /** Create a new Database instance and prepare for inserting or querying
+ * data. */
+ Database(String jdbcString) throws SQLException {
+ this.jdbcString = jdbcString;
+ this.connect();
+ this.prepareStatements();
+ }
+
+ private void connect() throws SQLException {
+ this.connection = DriverManager.getConnection(this.jdbcString);
+ this.connection.setAutoCommit(false);
+ }
+
+ private void prepareStatements() throws SQLException {
+ this.psAuthoritySelect = this.connection.prepareStatement(
+ "SELECT authority_id FROM authority "
+ + "WHERE nickname = ? AND identity_hex = ?");
+ this.psAuthorityInsert = this.connection.prepareStatement(
+ "INSERT INTO authority (nickname, identity_hex) VALUES (?, ?)",
+ Statement.RETURN_GENERATED_KEYS);
+ this.psVoteSelect = this.connection.prepareStatement(
+ "SELECT EXISTS (SELECT 1 FROM vote "
+ + "WHERE valid_after = ? AND authority_id = ?)");
+ this.psVoteInsert = this.connection.prepareStatement(
+ "INSERT INTO vote (valid_after, authority_id, measured_count, "
+ + "measured_sum, measured_mean, measured_min, measured_q1, "
+ + "measured_median, measured_q3, measured_max) "
+ + "VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)",
+ Statement.RETURN_GENERATED_KEYS);
+ }
+
+ /** Insert a parsed vote into the vote table. */
+ void insertVote(TotalcwRelayNetworkStatusVote vote) throws SQLException {
+ if (null == vote) {
+ /* Nothing to insert. */
+ return;
+ }
+ int authorityId = -1;
+ this.psAuthoritySelect.clearParameters();
+ this.psAuthoritySelect.setString(1, vote.nickname);
+ this.psAuthoritySelect.setString(2, vote.identityHex);
+ try (ResultSet rs = this.psAuthoritySelect.executeQuery()) {
+ if (rs.next()) {
+ authorityId = rs.getInt(1);
+ }
+ }
+ if (authorityId < 0) {
+ this.psAuthorityInsert.clearParameters();
+ this.psAuthorityInsert.setString(1, vote.nickname);
+ this.psAuthorityInsert.setString(2, vote.identityHex);
+ this.psAuthorityInsert.execute();
+ try (ResultSet rs = this.psAuthorityInsert.getGeneratedKeys()) {
+ if (rs.next()) {
+ authorityId = rs.getInt(1);
+ }
+ }
+ if (authorityId < 0) {
+ throw new SQLException("Could not retrieve auto-generated key for new "
+ + "authority entry.");
+ }
+ }
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
+ Locale.US);
+ this.psVoteSelect.clearParameters();
+ this.psVoteSelect.setTimestamp(1,
+ Timestamp.from(ZonedDateTime.of(vote.validAfter,
+ ZoneId.of("UTC")).toInstant()), calendar);
+ this.psVoteSelect.setInt(2, authorityId);
+ try (ResultSet rs = this.psVoteSelect.executeQuery()) {
+ if (rs.next()) {
+ if (rs.getBoolean(1)) {
+ /* Vote is already contained. */
+ return;
+ }
+ }
+ }
+ int voteId = -1;
+ this.psVoteInsert.clearParameters();
+ this.psVoteInsert.setTimestamp(1,
+ Timestamp.from(ZonedDateTime.of(vote.validAfter,
+ ZoneId.of("UTC")).toInstant()), calendar);
+ this.psVoteInsert.setInt(2, authorityId);
+ this.psVoteInsert.setLong(3, vote.measuredCount);
+ this.psVoteInsert.setLong(4, vote.measuredSum);
+ this.psVoteInsert.setLong(5, vote.measuredMean);
+ this.psVoteInsert.setLong(6, vote.measuredMin);
+ this.psVoteInsert.setLong(7, vote.measuredQ1);
+ this.psVoteInsert.setLong(8, vote.measuredMedian);
+ this.psVoteInsert.setLong(9, vote.measuredQ3);
+ this.psVoteInsert.setLong(10, vote.measuredMax);
+ this.psVoteInsert.execute();
+ try (ResultSet rs = this.psVoteInsert.getGeneratedKeys()) {
+ if (rs.next()) {
+ voteId = rs.getInt(1);
+ }
+ }
+ if (voteId < 0) {
+ throw new SQLException("Could not retrieve auto-generated key for new "
+ + "vote entry.");
+ }
+ }
+
+ /** Roll back any changes made in this execution. */
+ void rollback() throws SQLException {
+ this.connection.rollback();
+ }
+
+ /** Commit all changes made in this execution. */
+ void commit() throws SQLException {
+ this.connection.commit();
+ }
+
+ /** Query the totalcw view to obtain aggregated statistics. */
+ Iterable<OutputLine> queryTotalcw() throws SQLException {
+ List<OutputLine> statistics = new ArrayList<>();
+ Statement st = this.connection.createStatement();
+ Calendar calendar = Calendar.getInstance(TimeZone.getTimeZone("UTC"),
+ Locale.US);
+ String queryString = "SELECT " + OutputLine.columnHeadersDelimitedBy(", ")
+ + " FROM totalcw";
+ try (ResultSet rs = st.executeQuery(queryString)) {
+ while (rs.next()) {
+ OutputLine outputLine = new OutputLine();
+ outputLine.validAfterDate = rs.getDate(
+ OutputLine.Column.VALID_AFTER_DATE.name(), calendar).toLocalDate();
+ outputLine.nickname = rs.getString(OutputLine.Column.NICKNAME.name());
+ outputLine.measuredSumAvg = rs.getLong(
+ OutputLine.Column.MEASURED_SUM_AVG.name());
+ statistics.add(outputLine);
+ }
+ }
+ return statistics;
+ }
+
+ /** Release database connection. */
+ public void close() throws SQLException {
+ this.connection.close();
+ }
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Main.java b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
new file mode 100644
index 0000000..7c77160
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Main.java
@@ -0,0 +1,79 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorReader;
+import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.RelayNetworkStatusVote;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.File;
+import java.nio.file.Paths;
+import java.sql.SQLException;
+import java.util.Arrays;
+
+/** Main class of the totalcw module that imports bandwidth measurement
+ * statistics from votes into a database and exports aggregate statistics to a
+ * CSV file. */
+public class Main {
+
+ private static Logger log = LoggerFactory.getLogger(Main.class);
+
+ private static String[][] paths = {
+ {"recent", "relay-descriptors", "votes"},
+ {"archive", "relay-descriptors", "votes"}};
+
+ /** Run the module. */
+ public static void main(String[] args) throws Exception {
+
+ log.info("Starting totalcw module.");
+
+ log.info("Reading votes and inserting relevant parts into the database.");
+ DescriptorReader reader = DescriptorSourceFactory.createDescriptorReader();
+ File historyFile = new File(Configuration.history);
+ reader.setHistoryFile(historyFile);
+ Parser parser = new Parser();
+ try (Database database = new Database(Configuration.database)) {
+ try {
+ for (Descriptor descriptor : reader.readDescriptors(
+ Arrays.stream(paths).map((String[] path)
+ -> Paths.get(Configuration.descriptors, path).toFile())
+ .toArray(File[]::new))) {
+ if (descriptor instanceof RelayNetworkStatusVote) {
+ database.insertVote(parser.parseRelayNetworkStatusVote(
+ (RelayNetworkStatusVote) descriptor));
+ } else {
+ log.debug("Skipping unknown descriptor of type {}.",
+ descriptor.getClass());
+ }
+ }
+
+ log.info("Committing all updated parts in the database.");
+ database.commit();
+ } catch (SQLException sqle) {
+ log.error("Cannot recover from SQL exception while inserting data. "
+ + "Rolling back and exiting.", sqle);
+ database.rollback();
+ return;
+ }
+ reader.saveHistoryFile(historyFile);
+
+ log.info("Querying aggregated statistics from the database.");
+ Iterable<OutputLine> output = database.queryTotalcw();
+ log.info("Writing aggregated statistics to {}.", Configuration.output);
+ if (null != output) {
+ new Writer().write(Paths.get(Configuration.output), output);
+ }
+
+ log.info("Terminating totalcw module.");
+ } catch (SQLException sqle) {
+ log.error("Cannot recover from SQL exception while querying. Not writing "
+ + "output file.", sqle);
+ }
+ }
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
new file mode 100644
index 0000000..450dbac
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/OutputLine.java
@@ -0,0 +1,41 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import java.time.LocalDate;
+import java.util.Arrays;
+import java.util.stream.Collectors;
+
+/** Data object holding all parts of an output line. */
+class OutputLine {
+
+ /** Column names used in the database and in the first line of the output
+ * file. */
+ enum Column {
+ VALID_AFTER_DATE, NICKNAME, MEASURED_SUM_AVG
+ }
+
+ /** Column headers joined together with the given delimiter. */
+ static String columnHeadersDelimitedBy(String delimiter) {
+ return Arrays.stream(Column.values()).map(c -> c.toString().toLowerCase())
+ .collect(Collectors.joining(delimiter));
+ }
+
+ /** Date. */
+ LocalDate validAfterDate;
+
+ /** Server type, which can be "relay" or "bridge". */
+ String nickname;
+
+ /** Mean value of total measured bandwidths of all relays over the day. */
+ Long measuredSumAvg;
+
+ /** Format all fields in a single output line for inclusion in a CSV
+ * file. */
+ @Override
+ public String toString() {
+ return String.format("%s,%s,%d", validAfterDate, nickname, measuredSumAvg);
+ }
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
new file mode 100644
index 0000000..155b6b0
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Parser.java
@@ -0,0 +1,62 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import org.apache.commons.math3.stat.descriptive.rank.Percentile;
+import org.torproject.descriptor.NetworkStatusEntry;
+import org.torproject.descriptor.RelayNetworkStatusVote;
+
+import java.time.Instant;
+import java.time.ZoneId;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/** Parser that extracts bandwidth measurement statistics from votes and creates
+ * data objects for them. */
+class Parser {
+
+ /** Parse and return a vote, but return <code>null</code> if the vote did not
+ * contain any bandwidth measurements. */
+ TotalcwRelayNetworkStatusVote parseRelayNetworkStatusVote(
+ RelayNetworkStatusVote vote) {
+ List<Long> measuredBandwidths = new ArrayList<>();
+ for (NetworkStatusEntry entry : vote.getStatusEntries().values()) {
+ if (entry.getMeasured() >= 0L) {
+ measuredBandwidths.add(entry.getMeasured());
+ }
+ }
+ if (measuredBandwidths.isEmpty()) {
+ /* Return null, because we wouldn't want to add this vote to the database
+ * anyway. */
+ return null;
+ }
+ TotalcwRelayNetworkStatusVote parsedVote
+ = new TotalcwRelayNetworkStatusVote();
+ parsedVote.validAfter = Instant.ofEpochMilli(vote.getValidAfterMillis())
+ .atZone(ZoneId.of("UTC")).toLocalDateTime();
+ parsedVote.identityHex = vote.getIdentity();
+ parsedVote.nickname = vote.getNickname();
+ Collections.sort(measuredBandwidths);
+ long totalValue = 0L;
+ double[] values = new double[measuredBandwidths.size()];
+ for (int i = 0; i < measuredBandwidths.size(); i++) {
+ values[i] = (double) measuredBandwidths.get(i);
+ totalValue += measuredBandwidths.get(i);
+ }
+ parsedVote.measuredCount = values.length;
+ parsedVote.measuredSum = totalValue;
+ parsedVote.measuredMean = totalValue / values.length;
+ parsedVote.measuredMin = (long) Math.floor(values[0]);
+ parsedVote.measuredMax = (long) Math.floor(values[values.length - 1]);
+ Percentile percentile = new Percentile().withEstimationType(
+ Percentile.EstimationType.R_7);
+ percentile.setData(values);
+ parsedVote.measuredQ1 = (long) Math.floor(percentile.evaluate(25.0));
+ parsedVote.measuredMedian = (long) Math.floor(percentile.evaluate(50.0));
+ parsedVote.measuredQ3 = (long) Math.floor(percentile.evaluate(75.0));
+ return parsedVote;
+ }
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
new file mode 100644
index 0000000..c139cdc
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVote.java
@@ -0,0 +1,50 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import java.time.LocalDateTime;
+
+/** Data object holding all relevant parts parsed from a vote. */
+class TotalcwRelayNetworkStatusVote {
+
+ /** Valid-after time of the vote. */
+ LocalDateTime validAfter;
+
+ /** The 1 to 19 character long alphanumeric nickname assigned to the authority
+ * by its operator. */
+ String nickname;
+
+ /** Uppercase hex fingerprint of the authority's (v3 authority) identity
+ * key. */
+ String identityHex;
+
+ /** Count of status entries containing bandwidth measurements. */
+ long measuredCount;
+
+ /** Sum of bandwidth measurements of all contained status entries. */
+ long measuredSum;
+
+ /** Mean value of bandwidth measurements of all contained status entries. */
+ long measuredMean;
+
+ /** Minimum value of bandwidth measurements of all contained status
+ * entries. */
+ long measuredMin;
+
+ /** First quartile value of bandwidth measurements of all contained status
+ * entries. */
+ long measuredQ1;
+
+ /** Median value of bandwidth measurements of all contained status entries. */
+ long measuredMedian;
+
+ /** Third quartile value of bandwidth measurements of all contained status
+ * entries. */
+ long measuredQ3;
+
+ /** Maximum value of bandwidth measurements of all contained status
+ * entries. */
+ long measuredMax;
+}
+
diff --git a/src/main/java/org/torproject/metrics/stats/totalcw/Writer.java b/src/main/java/org/torproject/metrics/stats/totalcw/Writer.java
new file mode 100644
index 0000000..6688eae
--- /dev/null
+++ b/src/main/java/org/torproject/metrics/stats/totalcw/Writer.java
@@ -0,0 +1,36 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.charset.StandardCharsets;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+
+/** Writer that takes output line objects and writes them to a file, preceded
+ * by a column header line. */
+class Writer {
+
+ /** Write output lines to the given file. */
+ void write(Path filePath, Iterable<OutputLine> outputLines)
+ throws IOException {
+ File parentFile = filePath.toFile().getParentFile();
+ if (null != parentFile && !parentFile.exists()) {
+ if (!parentFile.mkdirs()) {
+ throw new IOException("Unable to create parent directory of output "
+ + "file. Not writing this file.");
+ }
+ }
+ List<String> formattedOutputLines = new ArrayList<>();
+ formattedOutputLines.add(OutputLine.columnHeadersDelimitedBy(","));
+ for (OutputLine line : outputLines) {
+ formattedOutputLines.add(line.toString());
+ }
+ Files.write(filePath, formattedOutputLines, StandardCharsets.UTF_8);
+ }
+}
+
diff --git a/src/main/resources/web.xml b/src/main/resources/web.xml
index 0c79916..6ff82ad 100644
--- a/src/main/resources/web.xml
+++ b/src/main/resources/web.xml
@@ -55,6 +55,7 @@
<url-pattern>/relays-ipv6.html</url-pattern>
<url-pattern>/bridges-ipv6.html</url-pattern>
<url-pattern>/advbw-ipv6.html</url-pattern>
+ <url-pattern>/totalcw.html</url-pattern>
</servlet-mapping>
<servlet>
@@ -193,6 +194,9 @@
<url-pattern>/advbw-ipv6.png</url-pattern>
<url-pattern>/advbw-ipv6.pdf</url-pattern>
<url-pattern>/advbw-ipv6.csv</url-pattern>
+ <url-pattern>/totalcw.png</url-pattern>
+ <url-pattern>/totalcw.pdf</url-pattern>
+ <url-pattern>/totalcw.csv</url-pattern>
</servlet-mapping>
<servlet>
diff --git a/src/main/resources/web/json/categories.json b/src/main/resources/web/json/categories.json
index af05085..73d2f01 100644
--- a/src/main/resources/web/json/categories.json
+++ b/src/main/resources/web/json/categories.json
@@ -30,6 +30,7 @@
"platforms",
"relays-ipv6",
"bridges-ipv6",
+ "totalcw",
"uptimes",
"networkchurn",
"bubbles"
diff --git a/src/main/resources/web/json/metrics.json b/src/main/resources/web/json/metrics.json
index ab5d98d..ed74959 100644
--- a/src/main/resources/web/json/metrics.json
+++ b/src/main/resources/web/json/metrics.json
@@ -427,5 +427,16 @@
"start",
"end"
]
+ },
+ {
+ "id": "totalcw",
+ "title": "Total consensus weights across bandwidth authorities",
+ "type": "Graph",
+ "description": "<p>This graph shows total consensus weights across bandwidth authorities. This graph may be useful for comparing bandwidth authority implementations by comparing their total bandwidth weights.</p>",
+ "function": "totalcw",
+ "parameters": [
+ "start",
+ "end"
+ ]
}
]
diff --git a/src/main/resources/web/jsps/reproducible-metrics.jsp b/src/main/resources/web/jsps/reproducible-metrics.jsp
index c590142..4bed5cc 100644
--- a/src/main/resources/web/jsps/reproducible-metrics.jsp
+++ b/src/main/resources/web/jsps/reproducible-metrics.jsp
@@ -242,11 +242,9 @@ We therefore refer to Step 4 of the <a href="#relay-users">Relay users</a> descr
<h2><i class="fa fa-server fa-fw" aria-hidden="true"></i>
Servers <a href="#servers" name="servers" class="anchor">#</a></h2>
-<p>The following description applies to the following graphs and table:</p>
-
<p>Statistics on the number of servers—<a href="/glossary.html#relay">relays</a> and <a href="/glossary.html#bridge">bridges</a>—were among the first to appear on Tor Metrics.
-These statistics have one thing in common: they use the number of running servers as their metric.
-Possible alternatives would be to use <a href="/glossary.html#consensus-weight">consensus weight</a> fractions or guard/middle/exit probabilities as metrics, but we're not doing that yet.
+Most of these statistics have one thing in common: they use the number of running servers as their metric.
+Possible alternatives are to use <a href="/glossary.html#consensus-weight">consensus weight</a> totals/fractions or guard/middle/exit probabilities as metrics, but we only recently started doing that.
In the following, we describe how exactly we count servers.</p>
<h3 id="running-relays" class="hover">Running relays
@@ -394,6 +392,36 @@ However, a small number of missing server descriptors per status is acceptable a
For the <a href="/bridges-ipv6.html">Bridges by IP version</a> graph we further skip days for which fewer than 12 statuses are known.
The goal is to avoid over-representing a few statuses during periods when the bridge directory authority had trouble producing a status for at least half of the day.</p>
+<h3 id="consensus-weight" class="hover">Consensus weight
+<a href="#consensus-weight" class="anchor">#</a>
+</h3>
+
+<p>The following statistic uses measured bandwidth, also known as <a href="/glossary.html#consensus-weight">consensus weight</a>, as metric for relay statistics, rather than absolute relay counts.</p>
+
+<p>The following description applies to the following graph:</p>
+
+<ul>
+<li>Total consensus weights across bandwidth authorities <a href="/totalcw.html" class="btn btn-primary btn-xs"><i class="fa fa-chevron-right" aria-hidden="true"></i> graph</a></li>
+</ul>
+
+<h4>Step 1: Parse votes.</h4>
+
+<p>Obtain votes from <a href="/collector.html#type-network-status-vote-3">CollecTor</a>.
+Refer to the <a href="https://gitweb.torproject.org/torspec.git/tree/dir-spec.txt">Tor directory protocol, version 3</a> for details on the descriptor format.</p>
+
+<p>Parse and memorize the <code>"valid-after"</code> time from the vote header. We use this UTC timestamp to aggregate by the UTC date.</p>
+
+<p>Also parse the <code>"nickname"</code> and <code>"identity"</code> fields from the <code>"dir-source"</code> line. We use the identity to aggregate by authority and the nickname for display purposes.</p>
+
+<p>Parse the (optional) <code>"w"</code> lines of all status entries and compute the total of all measured bandwidth values denoted by the <code>"Measured="</code> keyword. If an entry does not contain such a value, skip the entry. If a vote does not contain a single measured bandwidth value, skip the vote.</code>
+
+<h4>Step 2: Compute daily averages</h4>
+
+<p>Go through all previously processed votes by valid-after UTC date and authority.
+If an authority published less than 12 votes on a given UTC date, skip this date and authority.
+Also skip the last date of the results, because those averages may still change throughout the day.
+For all remaining combinations of date and authority, compute the arithmetic mean of total measured bandwidth, rounded down to the next-smaller integer number.</p>
+
</div>
<div class="container">
diff --git a/src/main/resources/web/jsps/stats.jsp b/src/main/resources/web/jsps/stats.jsp
index bb038e4..c6da19f 100644
--- a/src/main/resources/web/jsps/stats.jsp
+++ b/src/main/resources/web/jsps/stats.jsp
@@ -304,6 +304,26 @@ Servers <a href="#servers" name="servers" class="anchor">#</a></h2>
<li><b>total:</b> Average number of bridges.</li>
</ul>
+<h3>Total consensus weights across bandwidth authorities
+<a href="/totalcw.html" class="btn btn-primary btn-xs"><i class="fa fa-chevron-right" aria-hidden="true"></i> graph</a>
+<a href="/totalcw.csv" class="btn btn-primary btn-xs"><i class="fa fa-chevron-right" aria-hidden="true"></i> data</a>
+<a href="#totalcw" name="totalcw" class="anchor">#</a></h3>
+
+<h4>Parameters</h4>
+
+<ul>
+<li><b>start:</b> First UTC date (YYYY-MM-DD) to include in the file.</li>
+<li><b>end:</b> Last UTC date (YYYY-MM-DD) to include in the file.</li>
+</ul>
+
+<h4>Columns</h4>
+
+<ul>
+<li><b>date:</b> UTC date (YYYY-MM-DD) when bridges have been listed as running.</li>
+<li><b>nickname:</b> Bandwidth authority nickname.</li>
+<li><b>totalcw:</b> Total consensus weight of all relays measured by the bandwidth authority.</li>
+</ul>
+
</div>
<div class="container">
diff --git a/src/main/sql/totalcw/init-totalcw.sql b/src/main/sql/totalcw/init-totalcw.sql
new file mode 100644
index 0000000..bbb6cac
--- /dev/null
+++ b/src/main/sql/totalcw/init-totalcw.sql
@@ -0,0 +1,74 @@
+-- Copyright 2018 The Tor Project
+-- See LICENSE for licensing information
+
+-- Table of v3 authorities that stores nicknames and identity fingerprints and
+-- assigns much shorter numeric identifiers for internal-only use.
+CREATE TABLE authority (
+
+ -- The auto-incremented numeric identifier for an authority.
+ authority_id SERIAL PRIMARY KEY,
+
+ -- The 1 to 19 character long alphanumeric nickname assigned to the authority by
+ -- its operator.
+ nickname CHARACTER VARYING(19) NOT NULL,
+
+ -- Uppercase hex fingerprint of the authority's (v3 authority) identity key.
+ identity_hex CHARACTER(40) NOT NULL,
+
+ UNIQUE (nickname, identity_hex)
+);
+
+-- Table of all votes with statistics on contained bandwidth measurements. Only
+-- contains votes containing bandwidth measurements.
+CREATE TABLE vote (
+
+ -- The auto-incremented numeric identifier for a vote.
+ vote_id SERIAL PRIMARY KEY,
+
+ -- Timestamp at which the consensus is supposed to become valid.
+ valid_after TIMESTAMP WITHOUT TIME ZONE NOT NULL,
+
+ -- Numeric identifier uniquely identifying the authority generating this vote.
+ authority_id INTEGER REFERENCES authority (authority_id),
+
+ -- Count of status entries containing bandwidth measurements.
+ measured_count BIGINT NOT NULL,
+
+ -- Sum of bandwidth measurements of all contained status entries.
+ measured_sum BIGINT NOT NULL,
+
+ -- Mean value of bandwidth measurements of all contained status entries.
+ measured_mean BIGINT NOT NULL,
+
+ -- Minimum value of bandwidth measurements of all contained status entries.
+ measured_min BIGINT NOT NULL,
+
+ -- First quartile value of bandwidth measurements of all contained status
+ -- entries.
+ measured_q1 BIGINT NOT NULL,
+
+ -- Median value of bandwidth measurements of all contained status entries.
+ measured_median BIGINT NOT NULL,
+
+ -- Third quartile value of bandwidth measurements of all contained status
+ -- entries.
+ measured_q3 BIGINT NOT NULL,
+
+ -- Maximum value of bandwidth measurements of all contained status entries.
+ measured_max BIGINT NOT NULL,
+
+ UNIQUE (valid_after, authority_id)
+);
+
+-- View on aggregated total consensus weight statistics in a format that is
+-- compatible for writing to an output CSV file. Votes are only included in the
+-- output if at least 12 votes are known for a given authority and day.
+CREATE OR REPLACE VIEW totalcw AS
+SELECT DATE(valid_after) AS valid_after_date, nickname,
+ FLOOR(AVG(measured_sum)) AS measured_sum_avg
+FROM vote NATURAL JOIN authority
+GROUP BY DATE(valid_after), nickname
+HAVING COUNT(vote_id) >= 12
+ AND DATE(valid_after) < (SELECT MAX(DATE(valid_after)) FROM vote)
+ORDER BY DATE(valid_after), nickname;
+
diff --git a/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
new file mode 100644
index 0000000..085a976
--- /dev/null
+++ b/src/test/java/org/torproject/metrics/stats/totalcw/TotalcwRelayNetworkStatusVoteTest.java
@@ -0,0 +1,126 @@
+/* Copyright 2018 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.metrics.stats.totalcw;
+
+import static junit.framework.TestCase.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import org.torproject.descriptor.Descriptor;
+import org.torproject.descriptor.DescriptorSourceFactory;
+import org.torproject.descriptor.RelayNetworkStatusVote;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.time.LocalDateTime;
+import java.time.ZonedDateTime;
+import java.util.Arrays;
+import java.util.Collection;
+
+(a)RunWith(Parameterized.class)
+public class TotalcwRelayNetworkStatusVoteTest {
+
+ @Parameters
+ public static Collection<Object[]> data() {
+ return Arrays.asList(new Object[][] {
+ { "2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-"
+ + "55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part",
+ ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
+ "dannenberg", "0232AF901C31A04EE9848595AF9BB7620D4C5B2E",
+ 0L, 0L, 0L, 0L, 0L, 0L, 0L, 0L },
+ { "2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-"
+ + "049AB3179B12DACC391F06A10C2A8904E4339D33.part",
+ ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
+ "bastet", "27102BC123E7AF1D4741AE047E160C91ADC76B21",
+ 20L, 138803L, 6940L, 5L, 76L, 2490L, 9732L, 34800L },
+ { "2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-"
+ + "2669AD153408F88E416CE6206D1A75EC3324A2F4.part",
+ ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
+ "gabelmoo", "ED03BB616EB2F60BEC80151114BB25CEF515B226",
+ 19, 133441L, 7023L, 2L, 153L, 3920L, 11030L, 31600L },
+ { "2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-"
+ + "38C6A19F78948B689345EE41D7119D76246C4D3E.part",
+ ZonedDateTime.parse("2018-10-15T00:00:00Z").toLocalDateTime(),
+ "Faravahar", "EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97",
+ 20, 158534L, 7926L, 6L, 109L, 3215L, 9582L, 40700L }
+ });
+ }
+
+ @Parameter
+ public String fileName;
+
+ @Parameter(1)
+ public LocalDateTime expectedValidAfter;
+
+ @Parameter(2)
+ public String expectedNickname;
+
+ @Parameter(3)
+ public String expectedIdentityHex;
+
+ @Parameter(4)
+ public long expectedMeasuredCount;
+
+ @Parameter(5)
+ public long expectedMeasuredSum;
+
+ @Parameter(6)
+ public long expectedMeasuredMean;
+
+ @Parameter(7)
+ public long expectedMeasuredMin;
+
+ @Parameter(8)
+ public long expectedMeasuredQ1;
+
+ @Parameter(9)
+ public long expectedMeasuredMedian;
+
+ @Parameter(10)
+ public long expectedMeasuredQ3;
+
+ @Parameter(11)
+ public long expectedMeasuredMax;
+
+ @Test
+ public void testParseVote() throws Exception {
+ InputStream is = getClass().getClassLoader().getResourceAsStream(
+ "totalcw/" + this.fileName);
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = new BufferedReader(new InputStreamReader(is));
+ String line = br.readLine();
+ while (null != line) {
+ sb.append(line).append('\n');
+ line = br.readLine();
+ }
+ for (Descriptor descriptor
+ : DescriptorSourceFactory.createDescriptorParser().parseDescriptors(
+ sb.toString().getBytes(), new File(this.fileName), this.fileName)) {
+ TotalcwRelayNetworkStatusVote parsedVote = new Parser()
+ .parseRelayNetworkStatusVote((RelayNetworkStatusVote) descriptor);
+ if (0L == expectedMeasuredCount) {
+ assertNull(parsedVote);
+ } else {
+ assertEquals(this.expectedValidAfter, parsedVote.validAfter);
+ assertEquals(this.expectedNickname, parsedVote.nickname);
+ assertEquals(this.expectedIdentityHex, parsedVote.identityHex);
+ assertEquals(this.expectedMeasuredCount, parsedVote.measuredCount);
+ assertEquals(this.expectedMeasuredSum, parsedVote.measuredSum);
+ assertEquals(this.expectedMeasuredMean, parsedVote.measuredMean);
+ assertEquals(this.expectedMeasuredMin, parsedVote.measuredMin);
+ assertEquals(this.expectedMeasuredQ1, parsedVote.measuredQ1);
+ assertEquals(this.expectedMeasuredMedian, parsedVote.measuredMedian);
+ assertEquals(this.expectedMeasuredQ3, parsedVote.measuredQ3);
+ assertEquals(this.expectedMeasuredMax, parsedVote.measuredMax);
+ }
+ }
+ }
+}
diff --git a/src/test/resources/totalcw/2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part
new file mode 100644
index 0000000..827fcfd
--- /dev/null
+++ b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-55A38ED50848BE1F13C6A35C3CA637B0D962C2EF.part
@@ -0,0 +1,239 @@
+@type network-status-vote-3 1.0
+network-status-version 3
+vote-status vote
+consensus-methods 25 26 27 28
+published 2018-10-14 23:50:00
+valid-after 2018-10-15 00:00:00
+fresh-until 2018-10-15 01:00:00
+valid-until 2018-10-15 03:00:00
+voting-delay 300 300
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-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
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+known-flags Authority Exit Fast Guard HSDir Running Stable V2Dir Valid
+flag-thresholds stable-uptime=1216200 stable-mtbf=3386731 fast-speed=102000 guard-wfu=98.000% guard-tk=691200 guard-bw-inc-exits=7752000 guard-bw-exc-exits=6436000 enough-mtbf=1 ignoring-advertised-bws=0
+params CircuitPriorityHalflifeMsec=30000 DoSCircuitCreationEnabled=1 DoSConnectionEnabled=1 DoSConnectionMaxConcurrentCount=50 DoSRefuseSingleHopClientRendezvous=1 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 hs_service_max_rdv_failures=1 hsdir_spread_store=4 pb_disablepct=0 usecreatefast=0
+dir-source dannenberg 0232AF901C31A04EE9848595AF9BB7620D4C5B2E dannenberg.torauth.de 193.23.244.244 80 443
+contact Andreas Lehner
+shared-rand-participate
+shared-rand-commit 1 sha3-256 0232AF901C31A04EE9848595AF9BB7620D4C5B2E AAAAAFvD2IC9EM7ZZhuBysL9TCuY3vE/XuQsscEXKDtk9ATYpyGJSA==
+shared-rand-previous-value 9 Vd2znClwwth89jp91diG/Bs1AH+0ExSgRFmyVOMJwwE=
+shared-rand-current-value 9 oiXRUZGkT26O9aQmu/A52utoBF3gp27h0TvJ4gkDHkw=
+dir-key-certificate-version 3
+fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
+dir-key-published 2018-06-05 08:39:04
+dir-key-expires 2018-12-05 08:39:04
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAu9O0Pueesn0+29BlxZs60mBqehjdQtgSnKOm9QZxbQ0xrMQgbFnR
+hWbKD8erenyeFk2SF6AJkbyzgYC89hyPW+8GBDmg5bE8fRKjgV/nI3tY2m4rkY3u
+zSmYIdwqHUUc98Xzt9PaQ8IJAlDBY4XLKrWmJMxSyhBlVEept7+9Tj23qowW44Mz
+xPJZ1aFkB1FpkD6qmoCzVZbhXy3cGt1nDwdJK7KqlaXziz9pFiw8PzTVU2xFgJNy
++nEcT72DBtk3G5K2Riu/aXY/D541Cioj9KMV4Nv4g8aBKx58Xq2tq1pFkc1Bqj1y
+2MomVR3iskFzlqC8yKWGVe4OP2IaOhtcQJYp5GR9q+dWnr53WWNVxNu3sA9iMal3
+PJUk5pIYrsmArGew5gmlCe+Al46nPINxc7ouztmStAV+2F6SpZlKOcstnT+KJ52O
+1xnOSaj/WnzG2o4KZ9UrFQoUNOLQJcelPcC+vrinMk9BQPcB072l9NjpUBC9brsW
+qTCMStn1jfDDAgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEAy5TDIInDMMHEMdDoEgpmqGJDZ2EwtLjOeUxQD7TEy4uYd5XcsJP0
+cjkJDm1FAWU02AJFMtoT+Pg7Ge4+30jRytySp+mibQLs6s8O2xLV7mwH8if9oHZ5
+xl8aPcx7mOG6J9Ak3k610bMDkEDrxmNqg0pl+krtpWrxuh6GcA5bbfPqf0ZPyUaE
+MKKcFp/XxhLjvCOnryrQbeDYZySy2GkIx28A+u15prQnKm+6KskMC6SQIbo5QcBq
+R0bumjdl7OcuTvQsP5h/7jHovFHhA/j/5b2osbHWbG9kqn3fN50anJBNaGHnYbFQ
+gFSLZHfm8vSb5HnfzmsaDxYO/4xtfEi85wIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+a0fX/ln8gMXpNGpC9ZXujMZep616AKu5DuECcKoqtAeoUeIIaAMdvMS/5RWUKDl7
+L8LeTjkUdhUpbodOtaRS+IGy9dXjSMOGUOgyLlvUSZ29jIAcTa5xBcBNgpUPkC6Y
+AbdTmNjvaq+oAkWooPnER58/iivSRrBbh8G9Cqe22AKlQUTRH87L/b5tpKDaxg3W
+89CmcsUulUVNt+Sj++kS2PqXMIySRwCv3xXQ/OLAsKJZvqByBBIY7y7TLkewiHcq
+8KdpxmvFdE/bjPnErzd3Dcdv6FW+QIgt+3XEqamXD06lTw6xUsKlX2IP+3Cei00r
+mQnm434h3FaGocvXuijjXw==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+OyofWQWvPhRHhaMck1a8msuFf3AmZfLWBc/GOp8sxOvRU08pk+4hvjGGE8OpBqyF
+Lps5387U6bfqlppCvC/qvManCuViyEYqCpn1iiClq+VmcgfL9GgvjsAc8V0G6INy
+I8N19D3r/Htg44HNdW9yNgAeyv7PHzbQ9P6RyxXLawjFu4Mlho+a1IABeeFjE2f/
+PC6bDA5ix5K11AcVWAJKuTRAhQ0zOyLqnwD5UvjmqvO9jQrtK3kgrqvQ6ZJEakc9
+wDOB7+1I14gee2rvSD8rpyrPi3ystat1I4Tt2WlUGz9GX32Q7Mngq4muMVAY6bPS
+6ujDrCgTKP+bF0+WhlVO9v71NMpi+uNEwnd4FO2Tt06XM2GKbEzty5yjMPhy9b12
+GR9BaI2wMnwQ7m0Y/57Nh1w90u+GbjgBYgRVEldk7WDB5wxjBVxcfKFDzU18kLcf
+t94cSxk6CFPAPAr/LhCop7fU+4fkH0bveFm3dj0z8t6KMf5fMQvWVu5VFyUetSlV
+-----END SIGNATURE-----
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw xlbC5aW8ovDVh2t6VcKF/phheSg 2018-10-14 21:41:22 67.174.243.193 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.3.4.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=60
+p reject 1-65535
+id ed25519 ZtzhbIWHJpGQG+5N7hbRTtenyzq2RNJrx0QegtoY+bY
+m 25,26,27,28 sha256=4l7u4Oy1sCG/08MtsHimtWtaC1ydC/GOtCqRD/5ewgs
+r PutoElQueLee293884 AAwffNL+oHO5EdyUoWAOwvEX3ws Ay3cnaaHjnolSRe3ZjKcGlY17Q8 2018-10-14 08:06:47 174.127.217.73 55554 0
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.3.9
+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=4950
+p reject 1-65535
+id ed25519 /58lPWzxxQfwoxed8I9l+D3+hTdOQ6RpgVgM9FCxil4
+m 25,26,27,28 sha256=0/b37HV9enGTzbwrxxg/0R5PfwRtRosXgtU5+vi/gBk
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 +8xNQyAVPkKgtLH0AISVZFNuAq0 2018-10-14 11:10:20 162.247.74.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544,554,563,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8087-8088,8332-8333,8443,8888,9418,9999-10000,11371,12350,19294,19638,23456,33033,64738
+id ed25519 /AcSvVFxaIBxaB5I/7mwdVbMdP6JjDsEPVLU6Hj22a0
+m 25,26,27,28 sha256=7nBT4mYr4H5Jj71Qq7Nan7R7KqWPTRG89Oq1/5m4c1M
+r Neldoreth ABUk3UA9cp8I9+XXeBPvEnVs+o0 nms8ZM18C/K5XzLmgO5fHchjhFc 2018-10-14 19:09:56 185.13.39.197 443 80
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.4.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=5242
+p reject 1-65535
+id ed25519 eZ49J/mRCMtMbD2GDZsjZm/gqqG9z5S6M5GykZmd2ro
+m 25,26,27,28 sha256=IxCWEdRM6Hqk1fiYx+DK9ufUPI49SE6Z4C8onbsBVXo
+r UbuntuCore246 ACenhGJF+i26Aj46wfqAaI8dc7s EmwRg8iMnKJc8GEusZxhsVf9PJI 2018-10-14 23:13:35 212.199.61.38 43511 0
+s Fast V2Dir Valid
+v Tor 0.3.3.10
+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=121
+p reject 1-65535
+id ed25519 crWebog3RcKMV49zyu6pF5A/MxQM89x2cKNRK1wbTjM
+m 25,26,27,28 sha256=98nmfhxVBZqk7VUfyXQWpJmLAfWloZtMXu5H9FVt+p8
+r rotor25 ADQsDhVdRULlU5F4iy13nxRXjes m/3hkTP+ETmoYWZ3JrniJAeRHho 2018-10-14 17:19:08 188.24.22.193 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.4.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=3987
+p reject 1-65535
+id ed25519 8ybCWdul+E3HdzEb1YR3Fbp6EIwnGGPsUhsSh7FUnfs
+m 25,26,27,28 sha256=ZeMCL1T4SogPYK0iyuzYZoyFx+mp9/Ng8vGmE8wI9rU
+r torbogen AEHgFQsKMHUGwoY+/J8rfjpSOzY DXa3G+iPbGQo4AK2iazVY6R4eKs 2018-10-14 20:19:33 178.142.72.49 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.3.9
+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=1275
+p reject 1-65535
+id ed25519 NzIv9KWavK4f+6426ctrr9UnsFl/Yt8ixEAP6OO/kVo
+m 25,26,27,28 sha256=lFXLHMP6Map0qD298F+eeybL4pqtXDRG7a7r4R7knlw
+r nicolass67atoll AES/YhfxWxj3ZvK1O85bPg4BV+k iK+QhopNtEipMSL+EeI6b/DitVc 2018-10-14 15:48:15 163.172.10.89 9001 0
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.16
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=1048
+p reject 1-65535
+id ed25519 ++ezzEs6r+0m0YDwFAjwpIIbNKtzMbKB13osAAoGQ/c
+m 25,26,27,28 sha256=kGlToMt+rD0tL3N+5Plqj8Nav1FVQMiSYpz0adtzs0I
+r zzzzzzzzzzzzzzzzzzz AEVz/pNLpV0H2ucjF3k69OQbdbY 1FUGYNQtQo1MgV4jRP2XJapWemI 2018-10-14 23:43:10 77.12.174.141 9002 9031
+s Fast Running V2Dir Valid
+v Tor 0.3.2.10
+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=565
+p reject 1-65535
+id ed25519 QnM3RTCh53wbKiC6N6IsCQHs3pj9J547xUNtrk5FnYE
+m 25,26,27,28 sha256=+1jqHQZNEebT5DFJHZIPE35at9TzFCB5hzqDWAxrXGk
+r helga AFnZKULbO4TlLrTYfp97GVz00AU ngp++P8hEV+Pj/j9OvvDCyuDqKA 2018-10-14 17:09:42 88.99.216.194 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=409
+p reject 1-65535
+id ed25519 M1nVVuHebCChHayS1hsajAkzpe4c8bEFKP499V3yBG4
+m 25,26,27,28 sha256=//iWXvWzIkvqFqwTf367uZJ2UoNwcrCrLcOs7DY5xvE
+r Torpi AHJ/OiwdDxcxqRJnxBFQecFrILQ bLi/i6JuuPmoWm1aGd73dy2tYlA 2018-10-14 15:51:48 110.146.4.151 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.4.29
+pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2
+w Bandwidth=92
+p reject 1-65535
+id ed25519 none
+m 25,26,27,28 sha256=TiQfeDGlZq6VrCEKFDCA0uvS6hiv8CVMdkLyRxuRZpU
+r VeespRU2 AHTsqCvVi4uxkJycTyN/2XebI/w r3AsIyXKvSFzC+5eDuiUgPTmG9g 2018-10-14 09:25:26 185.22.172.237 443 80
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000
+p reject 1-65535
+id ed25519 obR35oXyInFbtgitDsbasslq2SNFSTZeI1+2bJfK6HE
+m 25,26,27,28 sha256=+tNKyFkcOSA/CufXMtSfprtve7qkoDx4yjGG/XdH6Ec
+r Quintex13 AHe8unJE2z5qXtJ0boYXAGZoSIc GwoBS5ddT7ktxwqHjHYNc2u53xU 2018-10-14 07:38:44 199.249.223.62 443 80
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.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=9426
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8082,8087-8088,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 cHUct3VAkb+T4KQQQg9fLuH5feoGyjxang+Jihs0E80
+m 25,26,27,28 sha256=/JQIKi/L0aSZ8uMKc0DsHBeH2OmsvAj9GbXq8i8QQcE
+r UbuntuCore246 AH4Yastcf3fGnzddzt9ZT/1r9pk 9kJql4jbylNMYXhvn4OasP55fck 2018-10-14 11:03:40 77.146.180.194 40523 0
+s Fast V2Dir Valid
+v Tor 0.3.3.10
+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=382
+p reject 1-65535
+id ed25519 rSPYL+kdnVmyJ9/Ni96SNABxuvE4DDLwO9l9tqeicoA
+m 25,26,27,28 sha256=hGcbcAmK7x/tNRe7iBBqNlj6sZByhmhTSwWw/wYZo3s
+r torrelay04 AH/ZCOnPz1nmT7pCt1cdLPQBvF0 n5XUymNehFnO8hTftwd4NIozrjQ 2018-10-14 18:52:54 159.69.153.73 9000 0
+a [2a01:4f8:1c1c:5cec::1]:9000
+s Fast Running Stable Valid
+v Tor 0.3.4.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=8030
+p reject 1-65535
+id ed25519 OJfT1k1R4UB3eNZ7+Mx9MCh9a5RBXqCcqtDfqQw4UvA
+m 25,26,27 sha256=R60ONtNwXwpVOajWfWlH4yQ7a6rBYwgLJ87p5wH55fk
+m 28 sha256=8oP/xai6UYcjJY5gx9fgrLTYY66vgdAr4y2F+R7tqUQ
+r bigamy AH/cDMglli4ShKYaaMk4pmr75XA dMrr7wRTfKoVfCRHLuR0IZFSWsI 2018-10-14 13:28:57 185.24.218.171 9001 8080
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 fTOvB48qkzbEyLpBemkuyBv9UieAUeM8RNfCypusrs0
+m 25,26,27,28 sha256=GpLj/6GejSGtvDxUAUrZgarLCVjbcZVDduWCqvShOBk
+r zech1989 AI57cMO0p1ILW+q4Bnq83I5j8f0 boK7UYxCaZy4lpe8irfYPFsX6SY 2018-10-14 21:18:08 185.243.53.99 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9726
+p reject 1-65535
+id ed25519 wPhoSjgH8xrZ/K2wKhYKd2IR6iQ2/pO4V9rIObVIZ30
+m 25,26,27,28 sha256=hx94DElvCTLaJLuCbKr5rShGxcpKpz8f5eZdYhXwfEQ
+r paris AJf70aisEQPfmPHoXdUsUPAdOtY 9x4Jiv45IDG4EDSSXfOd+Ss9qtc 2018-10-14 22:06:20 178.19.111.147 9001 8000
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 s49ps0kX/BuncEzm6dG6ZmLs7DCanj/WcXlPVt0D7Tw
+m 25,26,27,28 sha256=L9vWM3tYYI2RLlnofu1m9nMTckLVSKMXftVTDUwidhw
+r jactr AJhR35M3VLAN3odvzkCIzhtJQME RLckbaDnNUH4qGCkOmDo20UwE28 2018-10-14 23:26:36 84.40.112.70 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.15
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=131
+p reject 1-65535
+id ed25519 +Jc2Ppp+/hmdtaE8T2uxkZIhOD5/kCEfz8gyDCMiDpg
+m 25,26,27,28 sha256=tD+2RMOICoOQRFeZH6D4Kx8mRN4JzhfrtcQs8q78hPA
+r IsThisAGoodIdea AJ2M8WzPcSMatc5VyCoDRG2j+Us Gce3qKSpkK8w2D+9k75V7vNdWzI 2018-10-14 16:51:45 220.233.27.93 9001 0
+s Running Valid
+v Tor 0.3.3.9
+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=80
+p reject 1-65535
+id ed25519 peXjh3W6mWzg9iZALqNEDyP3ONQO7Vp9uSzqSszVHOA
+m 25,26,27,28 sha256=1jmLpMLTUMJr2IoHyDpGCrc/ZuBakhVUWivZ7NKwAz4
+directory-footer
+directory-signature 0232AF901C31A04EE9848595AF9BB7620D4C5B2E CD1FD971855430880D3C31E0331C5C55800C2F79
+-----BEGIN SIGNATURE-----
+CS6wJMEd74jA1bBTBt0CFPZXivvrvB9c8jf80z2TgHPo9WgUByCMx1+Gp5dHEKqy
+r3C2fgqF+1v8cMDy6vGGEkHTGWiyYt1Ge0mztr/tUcR7+sqqZychdUcVA9+abJ8P
+iI5whpWDieH+njn1BvphBVo2Hpzd/wCIqDanwaz6xHPxToINdGnA830SHGbs1b8H
+lLXWHuUjVSbkjHgN3NLd8nPjw1uOVIZBsWJa2dT6SCDkQCgbj5+g73kyk+OKJw4r
+ue8POxm8SOQT4BHTUfQH4Cgrje33nDJibTSymBOPAYkF6tIZsK7ujWEhnXbyciTQ
+dYM8WH+IZ9Iu31hyg277bQ==
+-----END SIGNATURE-----
diff --git a/src/test/resources/totalcw/2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-049AB3179B12DACC391F06A10C2A8904E4339D33.part b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-049AB3179B12DACC391F06A10C2A8904E4339D33.part
new file mode 100644
index 0000000..c73c6f5
--- /dev/null
+++ b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-27102BC123E7AF1D4741AE047E160C91ADC76B21-049AB3179B12DACC391F06A10C2A8904E4339D33.part
@@ -0,0 +1,239 @@
+@type network-status-vote-3 1.0
+network-status-version 3
+vote-status vote
+consensus-methods 25 26 27 28
+published 2018-10-14 23:50:00
+valid-after 2018-10-15 00:00:00
+fresh-until 2018-10-15 01:00:00
+valid-until 2018-10-15 03:00:00
+voting-delay 300 300
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-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
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+known-flags Authority Exit Fast Guard HSDir Running Stable V2Dir Valid
+flag-thresholds stable-uptime=1219572 stable-mtbf=3460952 fast-speed=90000 guard-wfu=98.000% guard-tk=691200 guard-bw-inc-exits=10400000 guard-bw-exc-exits=8880000 enough-mtbf=1 ignoring-advertised-bws=1
+params CircuitPriorityHalflifeMsec=30000 DoSCircuitCreationEnabled=1 DoSConnectionEnabled=1 DoSConnectionMaxConcurrentCount=50 DoSRefuseSingleHopClientRendezvous=1 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 hs_service_max_rdv_failures=1 hsdir_spread_store=4 pb_disablepct=0 usecreatefast=0
+dir-source bastet 27102BC123E7AF1D4741AE047E160C91ADC76B21 204.13.164.118 204.13.164.118 80 443
+contact stefani <nocat at readthefinemanual dot net>
+shared-rand-participate
+shared-rand-commit 1 sha3-256 27102BC123E7AF1D4741AE047E160C91ADC76B21 AAAAAFvD2IDJPppI/HhEtjCnUnd+nCJlpUZYS1f6jHZvFxFgnFtQXQ==
+shared-rand-previous-value 9 Vd2znClwwth89jp91diG/Bs1AH+0ExSgRFmyVOMJwwE=
+shared-rand-current-value 9 oiXRUZGkT26O9aQmu/A52utoBF3gp27h0TvJ4gkDHkw=
+dir-key-certificate-version 3
+fingerprint 27102BC123E7AF1D4741AE047E160C91ADC76B21
+dir-key-published 2018-10-10 00:02:19
+dir-key-expires 2019-10-10 00:02:19
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAuxgnMVH4vwBjMeGvrEODOYcjbCS4N+Wt0SZ6XA5I08HyMf5AbaaF
+MDscJBRIUOp7DyLmUwK+jp+QI8pUjjKsB8S0ctb/J3Im2T6CXnP2KgEfVmpNVQmV
+XdMm8cRZl1uIZDDBAXizSQ51f9A17TJh7pF/5khYp/SAzl6aO5ETn7ry0ITiJnNa
+6cY+400F7ZBA8NuXnCHVGfmpFFsiJKFrS1Kve629eeaNEd3mynRviBXJy5a4NEGf
+y42Ev8on6SxEnF9OG0NMJ081/+mP+j8Dsl3+Uehzr9B42MQQfDo4RdYGrt9XolBm
+L4eay1ieZEsFeDy0TMfiGGbr90wo1fgGLHIRSfTNLhhPJ/f9cTZPe98rhSgGWiAd
+RvK5SljoIOR4qdS9/aiZkj1P+etvh1rIQUcG4/xCOBnouEBK+DDHZFqyMtpMPtV0
+Bxi20DVaMJcyhdfjVqcRSyuR8tlOnTid6QwBj6kgIIfMaC+4Ht6yO/SYquCWlaZl
+y7Pu7li8WyW9AgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEAp/+6CgR/ptxWIt6uLCLt0t4e+yCq9i7MOcmcZlWHzIsP+sJxsPJO
+jqg5MycQsWt4wMUGCWj5ag+cozTGClfZ7dSxEzee5DoLa65RFK9ymFAnhUNs97sx
+F5CionrnUdjMO4MShALJgr7tXZ7I2/mwAG8foszEcl+dWhcaQio3WaT5rK/hLpiT
+URgYmieXaZWm1kLraI5DWnRY7GdFyWdBJKboStYpoJuYexUL7lbG7u7wqEG25N4+
+yFt8fiS7yjdlCf0WJRZlwmTLz87nn4Sqb/nYeqXKmT88LBs9D1csd8KgwOgyTkfb
+e7v+dTZSkqZYd0QXsqqxynZVKk63vWSXHwIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+BNgMpEDYtEohkX1c0imNg4ATBxwPFeO01t1mgEQqyRZkihcfFi6Eb9stAqXto7Xs
+03QxovdfUP3kQvsidBBpt2WHBpW8CpARhwK8LvIPzu3q7SkLcW0d82qY29cRadfx
+yX2jBJVV4faH41IY5rt/EN6BAATFSnJ+IORFAX8A/75ZQ2H9EIOhdufkmA4zMGUx
+qKzU/L5LDyfTwWUJmsDYb492d1luws3EBkD5cDFyo5ab1rV7NwJw0al1m0pUF4Dm
+GSNtWlY1Lr/IUnPBksxY98TCkapgHKyq2FsnPJeSiTAHDIo1gpl2oJ0Lg5y2SBxZ
+FMmLq/Wt9rqbS216qVxX7w==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+VEmK8S0LdEXDEGuF4QxLNQBtkQYEAParbBNLDT83XsLhXUfHja1MmkWJUemMpO0n
+R5eOVuHEegIbZzaIztYhgc0+4PKovx7q79rmPADwPACQxdB9dbzGhfgnxV1gfvQC
+CM6gfkruUDUqLoAtjeM++CMd8LgIOZBKmq4T4cQSUH2Mx7r+HYt/h2oqpWLGVufv
+wlE388tksfTdK9gVVht0MFBSTYjB5XEVLfF0LdxuOkHaiFJTUgJdGSecl8rtRSbq
+npy+Ex8Mjzsm//6asIdl2pWqkkmYNyqNeLxUl1r9xn1EOg8ZEWZ/L9L5EHkZvH1j
+YUS3ucYipsaT5QYOCmniLjLtQ6rkDABwn8F5co0RdIIrlIYjKMPGNUmwWz9rcYnC
+6L1DBttnMeLFC8zrn6OD3nI7Q7vrxj73Yl+gZhx2PIriHO01supq3+NGk743lHQu
+jF33Pili9eZU0J4bJzE/LLeVcEnlZPV3CRRvPuG/PTl/O2OCCyI2pM1IHVmp06SQ
+-----END SIGNATURE-----
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw xlbC5aW8ovDVh2t6VcKF/phheSg 2018-10-14 21:41:22 67.174.243.193 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.3.4.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=60 Measured=23
+p reject 1-65535
+id ed25519 ZtzhbIWHJpGQG+5N7hbRTtenyzq2RNJrx0QegtoY+bY
+m 25,26,27,28 sha256=4l7u4Oy1sCG/08MtsHimtWtaC1ydC/GOtCqRD/5ewgs
+r PutoElQueLee293884 AAwffNL+oHO5EdyUoWAOwvEX3ws Ay3cnaaHjnolSRe3ZjKcGlY17Q8 2018-10-14 08:06:47 174.127.217.73 55554 0
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.3.9
+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=4950 Measured=5620
+p reject 1-65535
+id ed25519 /58lPWzxxQfwoxed8I9l+D3+hTdOQ6RpgVgM9FCxil4
+m 25,26,27,28 sha256=0/b37HV9enGTzbwrxxg/0R5PfwRtRosXgtU5+vi/gBk
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 +8xNQyAVPkKgtLH0AISVZFNuAq0 2018-10-14 11:10:20 162.247.74.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=25900
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544,554,563,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8087-8088,8332-8333,8443,8888,9418,9999-10000,11371,12350,19294,19638,23456,33033,64738
+id ed25519 /AcSvVFxaIBxaB5I/7mwdVbMdP6JjDsEPVLU6Hj22a0
+m 25,26,27,28 sha256=7nBT4mYr4H5Jj71Qq7Nan7R7KqWPTRG89Oq1/5m4c1M
+r Neldoreth ABUk3UA9cp8I9+XXeBPvEnVs+o0 nms8ZM18C/K5XzLmgO5fHchjhFc 2018-10-14 19:09:56 185.13.39.197 443 80
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.4.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=5242 Measured=10400
+p reject 1-65535
+id ed25519 eZ49J/mRCMtMbD2GDZsjZm/gqqG9z5S6M5GykZmd2ro
+m 25,26,27,28 sha256=IxCWEdRM6Hqk1fiYx+DK9ufUPI49SE6Z4C8onbsBVXo
+r UbuntuCore246 ACenhGJF+i26Aj46wfqAaI8dc7s EmwRg8iMnKJc8GEusZxhsVf9PJI 2018-10-14 23:13:35 212.199.61.38 43511 0
+s V2Dir Valid
+v Tor 0.3.3.10
+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=121 Measured=80
+p reject 1-65535
+id ed25519 crWebog3RcKMV49zyu6pF5A/MxQM89x2cKNRK1wbTjM
+m 25,26,27,28 sha256=98nmfhxVBZqk7VUfyXQWpJmLAfWloZtMXu5H9FVt+p8
+r rotor25 ADQsDhVdRULlU5F4iy13nxRXjes m/3hkTP+ETmoYWZ3JrniJAeRHho 2018-10-14 17:19:08 188.24.22.193 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.4.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=3987 Measured=3910
+p reject 1-65535
+id ed25519 8ybCWdul+E3HdzEb1YR3Fbp6EIwnGGPsUhsSh7FUnfs
+m 25,26,27,28 sha256=ZeMCL1T4SogPYK0iyuzYZoyFx+mp9/Ng8vGmE8wI9rU
+r torbogen AEHgFQsKMHUGwoY+/J8rfjpSOzY DXa3G+iPbGQo4AK2iazVY6R4eKs 2018-10-14 20:19:33 178.142.72.49 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.3.9
+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=1275 Measured=1070
+p reject 1-65535
+id ed25519 NzIv9KWavK4f+6426ctrr9UnsFl/Yt8ixEAP6OO/kVo
+m 25,26,27,28 sha256=lFXLHMP6Map0qD298F+eeybL4pqtXDRG7a7r4R7knlw
+r nicolass67atoll AES/YhfxWxj3ZvK1O85bPg4BV+k iK+QhopNtEipMSL+EeI6b/DitVc 2018-10-14 15:48:15 163.172.10.89 9001 0
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.16
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=1048 Measured=320
+p reject 1-65535
+id ed25519 ++ezzEs6r+0m0YDwFAjwpIIbNKtzMbKB13osAAoGQ/c
+m 25,26,27,28 sha256=kGlToMt+rD0tL3N+5Plqj8Nav1FVQMiSYpz0adtzs0I
+r zzzzzzzzzzzzzzzzzzz AEVz/pNLpV0H2ucjF3k69OQbdbY 1FUGYNQtQo1MgV4jRP2XJapWemI 2018-10-14 23:43:10 77.12.174.141 9002 9031
+s Fast Running V2Dir Valid
+v Tor 0.3.2.10
+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=565 Measured=163
+p reject 1-65535
+id ed25519 QnM3RTCh53wbKiC6N6IsCQHs3pj9J547xUNtrk5FnYE
+m 25,26,27,28 sha256=+1jqHQZNEebT5DFJHZIPE35at9TzFCB5hzqDWAxrXGk
+r helga AFnZKULbO4TlLrTYfp97GVz00AU ngp++P8hEV+Pj/j9OvvDCyuDqKA 2018-10-14 17:09:42 88.99.216.194 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=409 Measured=245
+p reject 1-65535
+id ed25519 M1nVVuHebCChHayS1hsajAkzpe4c8bEFKP499V3yBG4
+m 25,26,27,28 sha256=//iWXvWzIkvqFqwTf367uZJ2UoNwcrCrLcOs7DY5xvE
+r Torpi AHJ/OiwdDxcxqRJnxBFQecFrILQ bLi/i6JuuPmoWm1aGd73dy2tYlA 2018-10-14 15:51:48 110.146.4.151 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.4.29
+pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2
+w Bandwidth=92 Measured=18
+p reject 1-65535
+id ed25519 none
+m 25,26,27,28 sha256=TiQfeDGlZq6VrCEKFDCA0uvS6hiv8CVMdkLyRxuRZpU
+r VeespRU2 AHTsqCvVi4uxkJycTyN/2XebI/w r3AsIyXKvSFzC+5eDuiUgPTmG9g 2018-10-14 09:25:26 185.22.172.237 443 80
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=20500
+p reject 1-65535
+id ed25519 obR35oXyInFbtgitDsbasslq2SNFSTZeI1+2bJfK6HE
+m 25,26,27,28 sha256=+tNKyFkcOSA/CufXMtSfprtve7qkoDx4yjGG/XdH6Ec
+r Quintex13 AHe8unJE2z5qXtJ0boYXAGZoSIc GwoBS5ddT7ktxwqHjHYNc2u53xU 2018-10-14 07:38:44 199.249.223.62 443 80
+s Exit Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9426 Measured=7570
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8082,8087-8088,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 cHUct3VAkb+T4KQQQg9fLuH5feoGyjxang+Jihs0E80
+m 25,26,27,28 sha256=/JQIKi/L0aSZ8uMKc0DsHBeH2OmsvAj9GbXq8i8QQcE
+r UbuntuCore246 AH4Yastcf3fGnzddzt9ZT/1r9pk 9kJql4jbylNMYXhvn4OasP55fck 2018-10-14 11:03:40 77.146.180.194 40523 0
+s V2Dir Valid
+v Tor 0.3.3.10
+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=382 Measured=23
+p reject 1-65535
+id ed25519 rSPYL+kdnVmyJ9/Ni96SNABxuvE4DDLwO9l9tqeicoA
+m 25,26,27,28 sha256=hGcbcAmK7x/tNRe7iBBqNlj6sZByhmhTSwWw/wYZo3s
+r torrelay04 AH/ZCOnPz1nmT7pCt1cdLPQBvF0 n5XUymNehFnO8hTftwd4NIozrjQ 2018-10-14 18:52:54 159.69.153.73 9000 0
+a [2a01:4f8:1c1c:5cec::1]:9000
+s Fast Running Stable Valid
+v Tor 0.3.4.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=8030 Measured=7880
+p reject 1-65535
+id ed25519 OJfT1k1R4UB3eNZ7+Mx9MCh9a5RBXqCcqtDfqQw4UvA
+m 25,26,27 sha256=R60ONtNwXwpVOajWfWlH4yQ7a6rBYwgLJ87p5wH55fk
+m 28 sha256=8oP/xai6UYcjJY5gx9fgrLTYY66vgdAr4y2F+R7tqUQ
+r bigamy AH/cDMglli4ShKYaaMk4pmr75XA dMrr7wRTfKoVfCRHLuR0IZFSWsI 2018-10-14 13:28:57 185.24.218.171 9001 8080
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=9510
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 fTOvB48qkzbEyLpBemkuyBv9UieAUeM8RNfCypusrs0
+m 25,26,27,28 sha256=GpLj/6GejSGtvDxUAUrZgarLCVjbcZVDduWCqvShOBk
+r zech1989 AI57cMO0p1ILW+q4Bnq83I5j8f0 boK7UYxCaZy4lpe8irfYPFsX6SY 2018-10-14 21:18:08 185.243.53.99 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9726 Measured=10700
+p reject 1-65535
+id ed25519 wPhoSjgH8xrZ/K2wKhYKd2IR6iQ2/pO4V9rIObVIZ30
+m 25,26,27,28 sha256=hx94DElvCTLaJLuCbKr5rShGxcpKpz8f5eZdYhXwfEQ
+r paris AJf70aisEQPfmPHoXdUsUPAdOtY 9x4Jiv45IDG4EDSSXfOd+Ss9qtc 2018-10-14 22:06:20 178.19.111.147 9001 8000
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=34800
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 s49ps0kX/BuncEzm6dG6ZmLs7DCanj/WcXlPVt0D7Tw
+m 25,26,27,28 sha256=L9vWM3tYYI2RLlnofu1m9nMTckLVSKMXftVTDUwidhw
+r jactr AJhR35M3VLAN3odvzkCIzhtJQME RLckbaDnNUH4qGCkOmDo20UwE28 2018-10-14 23:26:36 84.40.112.70 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.9.15
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=131 Measured=66
+p reject 1-65535
+id ed25519 +Jc2Ppp+/hmdtaE8T2uxkZIhOD5/kCEfz8gyDCMiDpg
+m 25,26,27,28 sha256=tD+2RMOICoOQRFeZH6D4Kx8mRN4JzhfrtcQs8q78hPA
+r IsThisAGoodIdea AJ2M8WzPcSMatc5VyCoDRG2j+Us Gce3qKSpkK8w2D+9k75V7vNdWzI 2018-10-14 16:51:45 220.233.27.93 9001 0
+s Running Valid
+v Tor 0.3.3.9
+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=80 Measured=5
+p reject 1-65535
+id ed25519 peXjh3W6mWzg9iZALqNEDyP3ONQO7Vp9uSzqSszVHOA
+m 25,26,27,28 sha256=1jmLpMLTUMJr2IoHyDpGCrc/ZuBakhVUWivZ7NKwAz4
+directory-footer
+directory-signature 27102BC123E7AF1D4741AE047E160C91ADC76B21 6FF3CD454038B7FDD7862B2DD778E4F702C31419
+-----BEGIN SIGNATURE-----
+ICRgDdm/BcGDGUaofpzbAwYibBsX9o88sIZ8Wec0w+LD8RBQT0G6/9S+joAJECZv
+WkJk+IqLhcipWAsTdts3ckCgPfP8x8DNmfdk0RhXf4otaYPs3wn5LD6hXnoXh+OU
+QJ7DQbM+Hw5+K3F5gd8s2AW3GgL1g6REBC3kfZwijI8ovG8SIbr7+npVTGHRwm11
+F0IiEGRMnhedDRAdhhEVnVgyRWjfJEdFe8VzUzFAF7yjCNgVzVE++e+g2afrMXaJ
+GYiWsJcKsgwbEUcFI6nvyPnbBGm8bTBnhhZFf60Ao5b0gNXpdGQVwAAHTwncLMCZ
+/faPhIKZreAjmt5vtvPsXg==
+-----END SIGNATURE-----
diff --git a/src/test/resources/totalcw/2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-2669AD153408F88E416CE6206D1A75EC3324A2F4.part b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-2669AD153408F88E416CE6206D1A75EC3324A2F4.part
new file mode 100644
index 0000000..13c618f
--- /dev/null
+++ b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-ED03BB616EB2F60BEC80151114BB25CEF515B226-2669AD153408F88E416CE6206D1A75EC3324A2F4.part
@@ -0,0 +1,241 @@
+@type network-status-vote-3 1.0
+network-status-version 3
+vote-status vote
+consensus-methods 25 26 27 28
+published 2018-10-14 23:50:00
+valid-after 2018-10-15 00:00:00
+fresh-until 2018-10-15 01:00:00
+valid-until 2018-10-15 03:00:00
+voting-delay 300 300
+client-versions 0.2.9.14,0.2.9.15,0.2.9.16,0.2.9.17,0.3.2.6-alpha,0.3.2.7-rc,0.3.2.8-rc,0.3.2.9,0.3.2.10,0.3.2.11,0.3.2.12,0.3.3.1-alpha,0.3.3.2-alpha,0.3.3.3-alpha,0.3.3.4-alpha,0.3.3.5-rc,0.3.3.6,0.3.3.7,0.3.3.8,0.3.3.9,0.3.3.10,0.3.4.1-alpha,0.3.4.2-alpha,0.3.4.3-alpha,0.3.4.4-rc,0.3.4.5-rc,0.3.4.6-rc,0.3.4.7-rc,0.3.4.8,0.3.5.1-alpha,0.3.5.2-alpha,0.3.5.3-alpha
+server-versions 0.2.9.14,0.2.9.15,0.2.9.16,0.2.9.17,0.3.2.10,0.3.2.11,0.3.2.12,0.3.3.2-alpha,0.3.3.3-alpha,0.3.3.4-alpha,0.3.3.5-rc,0.3.3.6,0.3.3.7,0.3.3.8,0.3.3.9,0.3.3.10,0.3.4.1-alpha,0.3.4.2-alpha,0.3.4.3-alpha,0.3.4.4-rc,0.3.4.5-rc,0.3.4.6-rc,0.3.4.7-rc,0.3.4.8,0.3.5.1-alpha,0.3.5.2-alpha,0.3.5.3-alpha
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-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
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+known-flags Authority BadExit Exit Fast Guard HSDir Running Stable V2Dir Valid
+flag-thresholds stable-uptime=1260391 stable-mtbf=3650978 fast-speed=53000 guard-wfu=98.000% guard-tk=691200 guard-bw-inc-exits=11000000 guard-bw-exc-exits=9050000 enough-mtbf=1 ignoring-advertised-bws=1
+params CircuitPriorityHalflifeMsec=30000 DoSCircuitCreationEnabled=1 DoSConnectionEnabled=1 DoSConnectionMaxConcurrentCount=50 DoSRefuseSingleHopClientRendezvous=1 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 hs_service_max_rdv_failures=1 hsdir_spread_store=4 pb_disablepct=0 usecreatefast=0
+dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 131.188.40.189 131.188.40.189 80 443
+contact 4096R/261C5FBE77285F88FB0C343266C8C2D7C5AA446D Sebastian Hahn <tor(a)sebastianhahn.net> - 12NbRAjAG5U3LLWETSF7fSTcdaz32Mu5CN
+shared-rand-participate
+shared-rand-commit 1 sha3-256 ED03BB616EB2F60BEC80151114BB25CEF515B226 AAAAAFvD2ID7sH6uVUd8dxs2u8VPr+JTJ14S6SLVjh69b5m7hTQEJA==
+shared-rand-previous-value 9 Vd2znClwwth89jp91diG/Bs1AH+0ExSgRFmyVOMJwwE=
+shared-rand-current-value 9 oiXRUZGkT26O9aQmu/A52utoBF3gp27h0TvJ4gkDHkw=
+dir-key-certificate-version 3
+fingerprint ED03BB616EB2F60BEC80151114BB25CEF515B226
+dir-key-published 2018-08-19 12:38:04
+dir-key-expires 2019-08-19 12:38:04
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEA1d6uTRiqdMp4BHBYIHKR6NB599Z1Bqw4TbOVkM2N1aSA4V/L/hKI
+nl6m/2LL/UAS+E3NCFX0dhw2+D7r7BTJyfGwz0H2MR6Py5/rCMAnPl20wCjXk2qY
+ACQa0rJvIqXobwGnDlvxn4ezsj0IEY/FEb61zHnnPHf6d3uyFR1QT06qEOQyYzML
+76f/Lud8MUt+8KzsdnadAPL8okNvcS/nqa2bWbbGhC8S8rtDpPg5BhX2ikXa88RM
+QdrrackdppB2ttHlq9+iH3c8Wyp7bvdH8uhv410W7RnIE4P+KIxt3L0gqkxCjjyh
+mn9ONcdgNOKe31q2cdW5LOPSIK+I5/VTjYjICza7Euyg03drpoBMGLuuJZY6FXEV
+auIBncWe+So8FMxqU/fwo5xm6x085U1MwXUmi4XDYpr/kau6ytPnzzw9J++4W9iC
+em5Jp0vaxrDnPdphqT0FWsBAwsZFL7nZRnmUlTgGsXUa0oSM9/MErDwzELh/NwG4
+DNyyzRG8iP61AgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEAxtiD0MuGDfRBqibc06jZXSPoF5s0ToVSrVfNO75dYvfM9zabW+1q
+EP18KUFxeShMqd2mmj685XbGnGX49I5gjzezjaIMcszpiPHQNmr9McnX97yR62YJ
+XKy0i6lvKXLUb5y8V5HmdqKQ8HyCqsRcYFTFrHNCWC+oIhRrqpeQ5kSIdWiO2HCt
+rzx9mAgGLRNFTy+EsxAFzuHaJVV5U7g/G4RMYXMP514aSpJVNgd2kdkXWsSIQ4HX
+a/vRNECuBQyJ1YpHySqqpdOogJxFot8oW/WkmFTGh/amJjMrTUNGgDMD5mpwMCRV
+ifA4hQzvJljkmfGMwgU8kYraMLDHvKzu4wIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+ruE2woKIct6glnXsJOjnj0thwiv2KYTr/vVMcX5I4OBgzNj9jQPuXe84fUvFNsyQ
+DVf0p6xrjnSmDjdsEpmZUtN16So9m/Zw7Xmn7v7Ktq8TS4jguA1xfhvPxlk7KTz4
+Fxkg3si4qWs00PZxiLERBK3bqMSChPOrzO9AZTjCAngeMIc8+TkXX8EowfqJDO92
+uGCtZReWfFMPObr0Ki4UDOzlTsx4zriRvMNjNqKC43tj2l0jj8RpSDmsWG0QeS+A
+983kODQiVx5URr0O4eev1l0+pI+i8o2+05ZRci32cqvtlonKEtREbgUXzlMHU/ps
+V3kONRvhP+0ABHL/JCVTzg==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+MYFZL03QkjZKPN8uckION+Yzb3icKjxnzUqtgmTeBaxrjLCsxAXhKFgzgDZkDzun
+REk+fSc9yG2YpxxUgE/l2ya36gr695q0EyJjnbQoNNgBX8YbeN0WaJER/jQtd5tY
+3hEPnSqz33jUGf/BmBqO+ZHOrSKY7CLhMrSxY+NgjcdGWwI0eDrnAklGfgG6xVFe
+YcXjj9aPB4+CtGJ0pgGM9SCZxETtCyBsJNYuYzowA/tz7VnymD8o3/CnW7bAlkGa
+6YsMibhAKxKl/lBcBDcRz8HPVdj4txME9d5YAmejIDIIRscEQ56LqDBrwvHJ6Gkl
+KQJXUwEiMAjM/wVLxd7zvgHOrR/hipCPe9vnVpYaSO446Z5d85p39BXR2x+vDfiT
+nOsiF+J+Sk13KTt+45gp26lMzY5E03BxKXY3izs7zEl6BZHM+95dC211C6xlojuP
+c8WkUcJuyb0xFS3nUy+dhLBzdW8nKlu/7Hn7uzugUUN4AWX/34+2qTqhNy0d2+Et
+-----END SIGNATURE-----
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw xlbC5aW8ovDVh2t6VcKF/phheSg 2018-10-14 21:41:22 67.174.243.193 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.3.4.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=60 Measured=4
+p reject 1-65535
+id ed25519 ZtzhbIWHJpGQG+5N7hbRTtenyzq2RNJrx0QegtoY+bY
+m 25,26,27,28 sha256=4l7u4Oy1sCG/08MtsHimtWtaC1ydC/GOtCqRD/5ewgs
+r PutoElQueLee293884 AAwffNL+oHO5EdyUoWAOwvEX3ws Ay3cnaaHjnolSRe3ZjKcGlY17Q8 2018-10-14 08:06:47 174.127.217.73 55554 0
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.3.9
+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=4950 Measured=4380
+p reject 1-65535
+id ed25519 /58lPWzxxQfwoxed8I9l+D3+hTdOQ6RpgVgM9FCxil4
+m 25,26,27,28 sha256=0/b37HV9enGTzbwrxxg/0R5PfwRtRosXgtU5+vi/gBk
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 +8xNQyAVPkKgtLH0AISVZFNuAq0 2018-10-14 11:10:20 162.247.74.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=14400
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544,554,563,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8087-8088,8332-8333,8443,8888,9418,9999-10000,11371,12350,19294,19638,23456,33033,64738
+id ed25519 /AcSvVFxaIBxaB5I/7mwdVbMdP6JjDsEPVLU6Hj22a0
+m 25,26,27,28 sha256=7nBT4mYr4H5Jj71Qq7Nan7R7KqWPTRG89Oq1/5m4c1M
+r Neldoreth ABUk3UA9cp8I9+XXeBPvEnVs+o0 nms8ZM18C/K5XzLmgO5fHchjhFc 2018-10-14 19:09:56 185.13.39.197 443 80
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.4.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=5242 Measured=13600
+p reject 1-65535
+id ed25519 eZ49J/mRCMtMbD2GDZsjZm/gqqG9z5S6M5GykZmd2ro
+m 25,26,27,28 sha256=IxCWEdRM6Hqk1fiYx+DK9ufUPI49SE6Z4C8onbsBVXo
+r UbuntuCore246 ACenhGJF+i26Aj46wfqAaI8dc7s EmwRg8iMnKJc8GEusZxhsVf9PJI 2018-10-14 23:13:35 212.199.61.38 43511 0
+s Fast V2Dir Valid
+v Tor 0.3.3.10
+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=121 Measured=71
+p reject 1-65535
+id ed25519 crWebog3RcKMV49zyu6pF5A/MxQM89x2cKNRK1wbTjM
+m 25,26,27,28 sha256=98nmfhxVBZqk7VUfyXQWpJmLAfWloZtMXu5H9FVt+p8
+r rotor25 ADQsDhVdRULlU5F4iy13nxRXjes m/3hkTP+ETmoYWZ3JrniJAeRHho 2018-10-14 17:19:08 188.24.22.193 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.4.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=3987 Measured=6730
+p reject 1-65535
+id ed25519 8ybCWdul+E3HdzEb1YR3Fbp6EIwnGGPsUhsSh7FUnfs
+m 25,26,27,28 sha256=ZeMCL1T4SogPYK0iyuzYZoyFx+mp9/Ng8vGmE8wI9rU
+r torbogen AEHgFQsKMHUGwoY+/J8rfjpSOzY DXa3G+iPbGQo4AK2iazVY6R4eKs 2018-10-14 20:19:33 178.142.72.49 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.3.9
+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=1275 Measured=1030
+p reject 1-65535
+id ed25519 NzIv9KWavK4f+6426ctrr9UnsFl/Yt8ixEAP6OO/kVo
+m 25,26,27,28 sha256=lFXLHMP6Map0qD298F+eeybL4pqtXDRG7a7r4R7knlw
+r nicolass67atoll AES/YhfxWxj3ZvK1O85bPg4BV+k iK+QhopNtEipMSL+EeI6b/DitVc 2018-10-14 15:48:15 163.172.10.89 9001 0
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.16
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=1048 Measured=1180
+p reject 1-65535
+id ed25519 ++ezzEs6r+0m0YDwFAjwpIIbNKtzMbKB13osAAoGQ/c
+m 25,26,27,28 sha256=kGlToMt+rD0tL3N+5Plqj8Nav1FVQMiSYpz0adtzs0I
+r zzzzzzzzzzzzzzzzzzz AEVz/pNLpV0H2ucjF3k69OQbdbY 1FUGYNQtQo1MgV4jRP2XJapWemI 2018-10-14 23:43:10 77.12.174.141 9002 9031
+s Fast Running V2Dir Valid
+v Tor 0.3.2.10
+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=565 Measured=235
+p reject 1-65535
+id ed25519 QnM3RTCh53wbKiC6N6IsCQHs3pj9J547xUNtrk5FnYE
+m 25,26,27,28 sha256=+1jqHQZNEebT5DFJHZIPE35at9TzFCB5hzqDWAxrXGk
+r helga AFnZKULbO4TlLrTYfp97GVz00AU ngp++P8hEV+Pj/j9OvvDCyuDqKA 2018-10-14 17:09:42 88.99.216.194 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=409 Measured=328
+p reject 1-65535
+id ed25519 M1nVVuHebCChHayS1hsajAkzpe4c8bEFKP499V3yBG4
+m 25,26,27,28 sha256=//iWXvWzIkvqFqwTf367uZJ2UoNwcrCrLcOs7DY5xvE
+r Torpi AHJ/OiwdDxcxqRJnxBFQecFrILQ bLi/i6JuuPmoWm1aGd73dy2tYlA 2018-10-14 15:51:48 110.146.4.151 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.4.29
+pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2
+w Bandwidth=92 Measured=14
+p reject 1-65535
+id ed25519 none
+m 25,26,27,28 sha256=TiQfeDGlZq6VrCEKFDCA0uvS6hiv8CVMdkLyRxuRZpU
+r VeespRU2 AHTsqCvVi4uxkJycTyN/2XebI/w r3AsIyXKvSFzC+5eDuiUgPTmG9g 2018-10-14 09:25:26 185.22.172.237 443 80
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=21300
+p reject 1-65535
+id ed25519 obR35oXyInFbtgitDsbasslq2SNFSTZeI1+2bJfK6HE
+m 25,26,27,28 sha256=+tNKyFkcOSA/CufXMtSfprtve7qkoDx4yjGG/XdH6Ec
+r Quintex13 AHe8unJE2z5qXtJ0boYXAGZoSIc GwoBS5ddT7ktxwqHjHYNc2u53xU 2018-10-14 07:38:44 199.249.223.62 443 80
+s Exit Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9426 Measured=4550
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8082,8087-8088,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 cHUct3VAkb+T4KQQQg9fLuH5feoGyjxang+Jihs0E80
+m 25,26,27,28 sha256=/JQIKi/L0aSZ8uMKc0DsHBeH2OmsvAj9GbXq8i8QQcE
+r UbuntuCore246 AH4Yastcf3fGnzddzt9ZT/1r9pk 9kJql4jbylNMYXhvn4OasP55fck 2018-10-14 11:03:40 77.146.180.194 40523 0
+s V2Dir Valid
+v Tor 0.3.3.10
+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=382
+p reject 1-65535
+id ed25519 rSPYL+kdnVmyJ9/Ni96SNABxuvE4DDLwO9l9tqeicoA
+m 25,26,27,28 sha256=hGcbcAmK7x/tNRe7iBBqNlj6sZByhmhTSwWw/wYZo3s
+r torrelay04 AH/ZCOnPz1nmT7pCt1cdLPQBvF0 n5XUymNehFnO8hTftwd4NIozrjQ 2018-10-14 18:52:54 159.69.153.73 9000 0
+a [2a01:4f8:1c1c:5cec::1]:9000
+s Fast Running Stable Valid
+v Tor 0.3.4.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=8030 Measured=8460
+p reject 1-65535
+id ed25519 OJfT1k1R4UB3eNZ7+Mx9MCh9a5RBXqCcqtDfqQw4UvA
+m 25,26,27 sha256=R60ONtNwXwpVOajWfWlH4yQ7a6rBYwgLJ87p5wH55fk
+m 28 sha256=8oP/xai6UYcjJY5gx9fgrLTYY66vgdAr4y2F+R7tqUQ
+r bigamy AH/cDMglli4ShKYaaMk4pmr75XA dMrr7wRTfKoVfCRHLuR0IZFSWsI 2018-10-14 13:28:57 185.24.218.171 9001 8080
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=21600
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 fTOvB48qkzbEyLpBemkuyBv9UieAUeM8RNfCypusrs0
+m 25,26,27,28 sha256=GpLj/6GejSGtvDxUAUrZgarLCVjbcZVDduWCqvShOBk
+r zech1989 AI57cMO0p1ILW+q4Bnq83I5j8f0 boK7UYxCaZy4lpe8irfYPFsX6SY 2018-10-14 21:18:08 185.243.53.99 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9726 Measured=3920
+p reject 1-65535
+id ed25519 wPhoSjgH8xrZ/K2wKhYKd2IR6iQ2/pO4V9rIObVIZ30
+m 25,26,27,28 sha256=hx94DElvCTLaJLuCbKr5rShGxcpKpz8f5eZdYhXwfEQ
+r paris AJf70aisEQPfmPHoXdUsUPAdOtY 9x4Jiv45IDG4EDSSXfOd+Ss9qtc 2018-10-14 22:06:20 178.19.111.147 9001 8000
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=31600
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 s49ps0kX/BuncEzm6dG6ZmLs7DCanj/WcXlPVt0D7Tw
+m 25,26,27,28 sha256=L9vWM3tYYI2RLlnofu1m9nMTckLVSKMXftVTDUwidhw
+r jactr AJhR35M3VLAN3odvzkCIzhtJQME RLckbaDnNUH4qGCkOmDo20UwE28 2018-10-14 23:26:36 84.40.112.70 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.9.15
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=131 Measured=37
+p reject 1-65535
+id ed25519 +Jc2Ppp+/hmdtaE8T2uxkZIhOD5/kCEfz8gyDCMiDpg
+m 25,26,27,28 sha256=tD+2RMOICoOQRFeZH6D4Kx8mRN4JzhfrtcQs8q78hPA
+r IsThisAGoodIdea AJ2M8WzPcSMatc5VyCoDRG2j+Us Gce3qKSpkK8w2D+9k75V7vNdWzI 2018-10-14 16:51:45 220.233.27.93 9001 0
+s Running Valid
+v Tor 0.3.3.9
+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=80 Measured=2
+p reject 1-65535
+id ed25519 peXjh3W6mWzg9iZALqNEDyP3ONQO7Vp9uSzqSszVHOA
+m 25,26,27,28 sha256=1jmLpMLTUMJr2IoHyDpGCrc/ZuBakhVUWivZ7NKwAz4
+directory-footer
+directory-signature ED03BB616EB2F60BEC80151114BB25CEF515B226 E1249D5F87EAD43CD4A48DF9CFCFE810BEEE5287
+-----BEGIN SIGNATURE-----
+sj0ppS2fGOktEGRBXEQJ7KjG+rjBUWNlTUGa9XDbUEbrSDGsKC7ik2r/k0nTCmYI
+FFDmaOhIgpEoz8548RkA0ZdKt8SQQHGHQ82zeDQ8IxLP2bsZj+Jmn/NHN3KwUnpc
+tc+/olUskXOVpKZaoZDXXTzOSypOhV6MHJFQ6AjkGj6BO6VnTVfmdDNf/McEPQvw
+4y6KF3NDjgXoea7sDy6IswuZK+Neia0GPTQVOIit1F06ka2cvOk2gOVEIXqHyGQi
+erJUZfMCbKUIX3IFlhuOgnx9x0Wp/U+Jx8JO+i7NxIyUhR56EY1Go6+mxxRR2wTB
+p1+T39J1+80MEXuRaguLCg==
+-----END SIGNATURE-----
diff --git a/src/test/resources/totalcw/2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-38C6A19F78948B689345EE41D7119D76246C4D3E.part b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-38C6A19F78948B689345EE41D7119D76246C4D3E.part
new file mode 100644
index 0000000..c7ffb53
--- /dev/null
+++ b/src/test/resources/totalcw/2018-10-15-00-00-00-vote-EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97-38C6A19F78948B689345EE41D7119D76246C4D3E.part
@@ -0,0 +1,239 @@
+@type network-status-vote-3 1.0
+network-status-version 3
+vote-status vote
+consensus-methods 25 26 27 28
+published 2018-10-14 23:50:00
+valid-after 2018-10-15 00:00:00
+fresh-until 2018-10-15 01:00:00
+valid-until 2018-10-15 03:00:00
+voting-delay 300 300
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+recommended-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
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 Microdesc=1-2 Relay=2
+known-flags Authority BadExit Exit Fast Guard HSDir Running Stable V2Dir Valid
+flag-thresholds stable-uptime=1224875 stable-mtbf=2831347 fast-speed=96000 guard-wfu=98.000% guard-tk=691200 guard-bw-inc-exits=9950000 guard-bw-exc-exits=8290000 enough-mtbf=1 ignoring-advertised-bws=1
+params CircuitPriorityHalflifeMsec=30000 DoSCircuitCreationEnabled=1 DoSConnectionEnabled=1 DoSConnectionMaxConcurrentCount=50 DoSRefuseSingleHopClientRendezvous=1 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 hs_service_max_rdv_failures=1 hsdir_spread_store=4 pb_disablepct=0 usecreatefast=0
+dir-source Faravahar EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 154.35.175.225 154.35.175.225 80 443
+contact 0x0B47D56D Sina Rabbani (inf0) <sina redteam net>
+shared-rand-participate
+shared-rand-commit 1 sha3-256 EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 AAAAAFvD2IDD8w9Bf35KfCrPuE49LIm5bKHISapdb3PoYLGv5ZOo6w==
+shared-rand-previous-value 9 Vd2znClwwth89jp91diG/Bs1AH+0ExSgRFmyVOMJwwE=
+shared-rand-current-value 9 oiXRUZGkT26O9aQmu/A52utoBF3gp27h0TvJ4gkDHkw=
+dir-key-certificate-version 3
+fingerprint EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97
+dir-key-published 2018-06-30 16:50:42
+dir-key-expires 2019-06-30 16:50:42
+dir-identity-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBigKCAYEAwBmqdD+G0q3smN5OBFHCcK5pQH5G1GIpFJ1JxCVEp92tTK4ZHnot
+9RzMfag6zQFqwLaJ+yEb1DOjTdTMfcUTsj5f3GUqPB+U7shSMAvvAAM+Bx/4m1AU
+u6sk4XmPB1bCBfcRl4zhnY6XFIbj0ktuBDblcxHz3lDgHFpBoci9sF59mM14MZ09
+EdwgeckcU5oeq6ApuSlUVaOT8xsKV/yeK4SKaFfDclwPAJuitQ5CpqctP7ExmlrY
+sboTDtz7/Xa6OccaGDEUf7TRlipvUX6rvlmvHm3qjdixVfExpa8E5QG79GZTL82p
+1zBd3iqc6QEnRDTiW9cMUeQt4EvrwOUVVYPWo3hp1C/iiNzWraDays2xuhaSB0gj
+fPatu2CFW5XB2vd9IvIiWeklSFqnF8DL38jDL7DbFiETJreGsDMR03yHWVd0MbPz
+OrvAxG4tJn+JtnwhzlbRjnfk53jOTbiM0vMV8h/ztapCiJeT/6i7nVQ1xL2boeYw
+5RDUlwZaQiaXAgMBAAE=
+-----END RSA PUBLIC KEY-----
+dir-signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIIBCgKCAQEA5KK/zS8zPPinA7QGbcPEPH90hoagF9EmvvgYjQ8m2L2g15/3WrdQ
+J8Ue0n0JaOb2crZEJ+d1IwbvX9mFpFx4xNsGA3CPg1/RAHwvmB7HctGOO39Y+I4h
+KLyV4AWVPXb7uvWr8Stec9sW6QLwkz2bhW61DvBlCapBzQPPqm2R+dNCUXE6ATQv
+se8jzggu1YHKk5GSLrXUvuWKbZFBb5WKaZjRXAXt3I9jSS61SG6rxJmM7uujfrkF
+UOmb5T83oWCU1zgjyz5bs0j39A7K+FxQPlMUYUe8eyo0dNu6bwSwnm0C6JGmEZXn
+ee+KeQd6Kai8++uOiPWxfqIpSD8XkF0PkwIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+gVMfY1HWevSFyr5COCTcd3Y7MdSF1WnaSNUQ1YjGrM1TC4leTRAuJ1ds1uQ/jt4w
+0vbM+1X0PRuOeb7o3+Cdn2DAgjeZE5R2BCk/qowXwxHpGwCjsjkCAhHWoiXtNprj
+hUveHhMgESRK5e7l/bXC/EIFnwvmw1caQZdfwMsxzJMU8is3XJGZIEtHgAvk5AzV
+SUL+CamS/S22FdHKzvsxtLM54lWu2IQZh3QYKQnST3kdDg2fVO8eDSn5iROS58oU
+FRB8duf4knv2PGPaCB9SVfM4XouXePZZkC73VEvqnjQSxjYK3yP/msL/bbqwIgu9
+6DE1Rfqw3bfT3/yObotAYg==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+ZfZ6bRHneOwthgn3/yKeLTixlaj/xVBEtFGrB5sISPAOS3XddBPMR1w2eGMZ5Dlm
+DT6Gd+C4jTOt3KjMo0NiJVpWJBNqb9sBUR0Qkc23urjgvWvy8e9AmaIKFuTrtNCX
+4qHFs3ZDElNwyIQEhLsLTtbKd1/EO0rDUlhKOT1U4rJAc+Vc51FqlFPHON8d34GK
+Qsmj+njIsMV06K1XO9TF4ERtbglzFAw+QjrzEsUSa3EIzmeYAxekiWI/KfG38WuL
+zW+11z0aJbGRtbfQbTbOuq02R3VlpkyxKDwOn0lOCXdUUpN2BK5+noAxyZeESjuN
++1rzNl5QdHgOddQA8rwUeeLYpCublWiDpm231K4q/CrT0+PJTjApfyGY5OK9HSUB
+pF/wudq+aeGT94w6A27YAQufzRYZssJZx/XOD+ptY22ddJMF8d5vvL4ZqAkd6HI6
+V55pW4NgCu6pAliAarFo3y0SUXQaiDSOzJiB9Sm6NyPpVvmVywfUvD7380u6YHf/
+-----END SIGNATURE-----
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw xlbC5aW8ovDVh2t6VcKF/phheSg 2018-10-14 21:41:22 67.174.243.193 9001 0
+s Running Stable V2Dir Valid
+v Tor 0.3.4.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=60 Measured=15
+p reject 1-65535
+id ed25519 ZtzhbIWHJpGQG+5N7hbRTtenyzq2RNJrx0QegtoY+bY
+m 25,26,27,28 sha256=4l7u4Oy1sCG/08MtsHimtWtaC1ydC/GOtCqRD/5ewgs
+r PutoElQueLee293884 AAwffNL+oHO5EdyUoWAOwvEX3ws Ay3cnaaHjnolSRe3ZjKcGlY17Q8 2018-10-14 08:06:47 174.127.217.73 55554 0
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.3.9
+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=4950 Measured=5550
+p reject 1-65535
+id ed25519 /58lPWzxxQfwoxed8I9l+D3+hTdOQ6RpgVgM9FCxil4
+m 25,26,27,28 sha256=0/b37HV9enGTzbwrxxg/0R5PfwRtRosXgtU5+vi/gBk
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 +8xNQyAVPkKgtLH0AISVZFNuAq0 2018-10-14 11:10:20 162.247.74.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=12900
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464,531,543-544,554,563,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8087-8088,8332-8333,8443,8888,9418,9999-10000,11371,12350,19294,19638,23456,33033,64738
+id ed25519 /AcSvVFxaIBxaB5I/7mwdVbMdP6JjDsEPVLU6Hj22a0
+m 25,26,27,28 sha256=7nBT4mYr4H5Jj71Qq7Nan7R7KqWPTRG89Oq1/5m4c1M
+r Neldoreth ABUk3UA9cp8I9+XXeBPvEnVs+o0 nms8ZM18C/K5XzLmgO5fHchjhFc 2018-10-14 19:09:56 185.13.39.197 443 80
+s Fast Guard Running Stable V2Dir Valid
+v Tor 0.3.4.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=5242 Measured=8480
+p reject 1-65535
+id ed25519 eZ49J/mRCMtMbD2GDZsjZm/gqqG9z5S6M5GykZmd2ro
+m 25,26,27,28 sha256=IxCWEdRM6Hqk1fiYx+DK9ufUPI49SE6Z4C8onbsBVXo
+r UbuntuCore246 ACenhGJF+i26Aj46wfqAaI8dc7s EmwRg8iMnKJc8GEusZxhsVf9PJI 2018-10-14 23:13:35 212.199.61.38 43511 0
+s Fast V2Dir Valid
+v Tor 0.3.3.10
+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=121 Measured=120
+p reject 1-65535
+id ed25519 crWebog3RcKMV49zyu6pF5A/MxQM89x2cKNRK1wbTjM
+m 25,26,27,28 sha256=98nmfhxVBZqk7VUfyXQWpJmLAfWloZtMXu5H9FVt+p8
+r rotor25 ADQsDhVdRULlU5F4iy13nxRXjes m/3hkTP+ETmoYWZ3JrniJAeRHho 2018-10-14 17:19:08 188.24.22.193 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.4.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=3987 Measured=5580
+p reject 1-65535
+id ed25519 8ybCWdul+E3HdzEb1YR3Fbp6EIwnGGPsUhsSh7FUnfs
+m 25,26,27,28 sha256=ZeMCL1T4SogPYK0iyuzYZoyFx+mp9/Ng8vGmE8wI9rU
+r torbogen AEHgFQsKMHUGwoY+/J8rfjpSOzY DXa3G+iPbGQo4AK2iazVY6R4eKs 2018-10-14 20:19:33 178.142.72.49 9001 9030
+s Fast Running V2Dir Valid
+v Tor 0.3.3.9
+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=1275 Measured=1430
+p reject 1-65535
+id ed25519 NzIv9KWavK4f+6426ctrr9UnsFl/Yt8ixEAP6OO/kVo
+m 25,26,27,28 sha256=lFXLHMP6Map0qD298F+eeybL4pqtXDRG7a7r4R7knlw
+r nicolass67atoll AES/YhfxWxj3ZvK1O85bPg4BV+k iK+QhopNtEipMSL+EeI6b/DitVc 2018-10-14 15:48:15 163.172.10.89 9001 0
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.16
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=1048 Measured=773
+p reject 1-65535
+id ed25519 ++ezzEs6r+0m0YDwFAjwpIIbNKtzMbKB13osAAoGQ/c
+m 25,26,27,28 sha256=kGlToMt+rD0tL3N+5Plqj8Nav1FVQMiSYpz0adtzs0I
+r zzzzzzzzzzzzzzzzzzz AEVz/pNLpV0H2ucjF3k69OQbdbY 1FUGYNQtQo1MgV4jRP2XJapWemI 2018-10-14 23:43:10 77.12.174.141 9002 9031
+s Fast Running V2Dir Valid
+v Tor 0.3.2.10
+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=565 Measured=189
+p reject 1-65535
+id ed25519 QnM3RTCh53wbKiC6N6IsCQHs3pj9J547xUNtrk5FnYE
+m 25,26,27,28 sha256=+1jqHQZNEebT5DFJHZIPE35at9TzFCB5hzqDWAxrXGk
+r helga AFnZKULbO4TlLrTYfp97GVz00AU ngp++P8hEV+Pj/j9OvvDCyuDqKA 2018-10-14 17:09:42 88.99.216.194 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=409 Measured=254
+p reject 1-65535
+id ed25519 M1nVVuHebCChHayS1hsajAkzpe4c8bEFKP499V3yBG4
+m 25,26,27,28 sha256=//iWXvWzIkvqFqwTf367uZJ2UoNwcrCrLcOs7DY5xvE
+r Torpi AHJ/OiwdDxcxqRJnxBFQecFrILQ bLi/i6JuuPmoWm1aGd73dy2tYlA 2018-10-14 15:51:48 110.146.4.151 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.4.29
+pr Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=1-4 LinkAuth=1 Microdesc=1 Relay=1-2
+w Bandwidth=92 Measured=31
+p reject 1-65535
+id ed25519 none
+m 25,26,27,28 sha256=TiQfeDGlZq6VrCEKFDCA0uvS6hiv8CVMdkLyRxuRZpU
+r VeespRU2 AHTsqCvVi4uxkJycTyN/2XebI/w r3AsIyXKvSFzC+5eDuiUgPTmG9g 2018-10-14 09:25:26 185.22.172.237 443 80
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.3.7
+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=10000 Measured=26700
+p reject 1-65535
+id ed25519 obR35oXyInFbtgitDsbasslq2SNFSTZeI1+2bJfK6HE
+m 25,26,27,28 sha256=+tNKyFkcOSA/CufXMtSfprtve7qkoDx4yjGG/XdH6Ec
+r Quintex13 AHe8unJE2z5qXtJ0boYXAGZoSIc GwoBS5ddT7ktxwqHjHYNc2u53xU 2018-10-14 07:38:44 199.249.223.62 443 80
+s Exit Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9426 Measured=5000
+p accept 20-23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,873,902-904,981,989-995,1194,1220,1293,1500,1533,1677,1723,1755,1863,2082-2083,2086-2087,2095-2096,2102-2104,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000,8008,8074,8080,8082,8087-8088,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 cHUct3VAkb+T4KQQQg9fLuH5feoGyjxang+Jihs0E80
+m 25,26,27,28 sha256=/JQIKi/L0aSZ8uMKc0DsHBeH2OmsvAj9GbXq8i8QQcE
+r UbuntuCore246 AH4Yastcf3fGnzddzt9ZT/1r9pk 9kJql4jbylNMYXhvn4OasP55fck 2018-10-14 11:03:40 77.146.180.194 40523 0
+s V2Dir Valid
+v Tor 0.3.3.10
+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=382 Measured=19
+p reject 1-65535
+id ed25519 rSPYL+kdnVmyJ9/Ni96SNABxuvE4DDLwO9l9tqeicoA
+m 25,26,27,28 sha256=hGcbcAmK7x/tNRe7iBBqNlj6sZByhmhTSwWw/wYZo3s
+r torrelay04 AH/ZCOnPz1nmT7pCt1cdLPQBvF0 n5XUymNehFnO8hTftwd4NIozrjQ 2018-10-14 18:52:54 159.69.153.73 9000 0
+a [2a01:4f8:1c1c:5cec::1]:9000
+s Fast Running Stable Valid
+v Tor 0.3.4.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=8030 Measured=9010
+p reject 1-65535
+id ed25519 OJfT1k1R4UB3eNZ7+Mx9MCh9a5RBXqCcqtDfqQw4UvA
+m 25,26,27 sha256=R60ONtNwXwpVOajWfWlH4yQ7a6rBYwgLJ87p5wH55fk
+m 28 sha256=8oP/xai6UYcjJY5gx9fgrLTYY66vgdAr4y2F+R7tqUQ
+r bigamy AH/cDMglli4ShKYaaMk4pmr75XA dMrr7wRTfKoVfCRHLuR0IZFSWsI 2018-10-14 13:28:57 185.24.218.171 9001 8080
+s Exit Fast Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=30400
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 fTOvB48qkzbEyLpBemkuyBv9UieAUeM8RNfCypusrs0
+m 25,26,27,28 sha256=GpLj/6GejSGtvDxUAUrZgarLCVjbcZVDduWCqvShOBk
+r zech1989 AI57cMO0p1ILW+q4Bnq83I5j8f0 boK7UYxCaZy4lpe8irfYPFsX6SY 2018-10-14 21:18:08 185.243.53.99 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=9726 Measured=11300
+p reject 1-65535
+id ed25519 wPhoSjgH8xrZ/K2wKhYKd2IR6iQ2/pO4V9rIObVIZ30
+m 25,26,27,28 sha256=hx94DElvCTLaJLuCbKr5rShGxcpKpz8f5eZdYhXwfEQ
+r paris AJf70aisEQPfmPHoXdUsUPAdOtY 9x4Jiv45IDG4EDSSXfOd+Ss9qtc 2018-10-14 22:06:20 178.19.111.147 9001 8000
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.4.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=10000 Measured=40700
+p accept 20-21,23,43,53,79-81,88,110,143,194,220,389,443,464-465,531,543-544,554,563,587,636,706,749,853,873,902-904,981,989-995,1220,1293,1500,1533,1677,1723,1755,1863,2082-2087,2095-2096,2102-2104,2374-2382,3128,3389,3690,4321,4643,5050,5190,5222-5223,5228,5900,6660-6669,6679,6697,8000-8100,8232-8233,8332-8333,8443,8888,9418,9999-10000,11371,19294,19638,50002,64738
+id ed25519 s49ps0kX/BuncEzm6dG6ZmLs7DCanj/WcXlPVt0D7Tw
+m 25,26,27,28 sha256=L9vWM3tYYI2RLlnofu1m9nMTckLVSKMXftVTDUwidhw
+r jactr AJhR35M3VLAN3odvzkCIzhtJQME RLckbaDnNUH4qGCkOmDo20UwE28 2018-10-14 23:26:36 84.40.112.70 9001 9030
+s Running Stable V2Dir Valid
+v Tor 0.2.9.15
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1-2 Link=1-4 LinkAuth=1 Microdesc=1-2 Relay=1-2
+w Bandwidth=131 Measured=77
+p reject 1-65535
+id ed25519 +Jc2Ppp+/hmdtaE8T2uxkZIhOD5/kCEfz8gyDCMiDpg
+m 25,26,27,28 sha256=tD+2RMOICoOQRFeZH6D4Kx8mRN4JzhfrtcQs8q78hPA
+r IsThisAGoodIdea AJ2M8WzPcSMatc5VyCoDRG2j+Us Gce3qKSpkK8w2D+9k75V7vNdWzI 2018-10-14 16:51:45 220.233.27.93 9001 0
+s Running Valid
+v Tor 0.3.3.9
+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=80 Measured=6
+p reject 1-65535
+id ed25519 peXjh3W6mWzg9iZALqNEDyP3ONQO7Vp9uSzqSszVHOA
+m 25,26,27,28 sha256=1jmLpMLTUMJr2IoHyDpGCrc/ZuBakhVUWivZ7NKwAz4
+directory-footer
+directory-signature EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 517095062288D1B5C7BD6517A677C586D996818B
+-----BEGIN SIGNATURE-----
+RdWrXeRxh4lZB1oTsOTy+AcYFruKg6Xzfl/D/srqmSfihcLoBIwWXePe2aLDycTj
+fcLPRt3HUnHzII61reqsVKzDXGAybMdYpPE9kygA60INsyAYFAdigMEDwY0C2qIZ
+MMJrSyORovHh4YOQHoesZPDgCUuYkuAjheKwwxdJ4O6mcYJyusm9OWVy8Iej4lKW
+ySFXC6sQt3L81MVAE24eBA1eTmUUf3fWpK/UbD0GjHYD8J+qgxm8hDwrYwVUQKmU
+u3RuRcuPYfC0tPgKLNB8sHP2o292q026M8RbcE0GnvPBQS6r2uIDfBfQLETwg0do
+h7HVCq11GZIdYe4eCZu8rQ==
+-----END SIGNATURE-----
1
0

[translation/support-portal] Update translations for support-portal
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit 8d5dd5f2100ab9c24c085448e320847371b09d9d
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:18:59 2018 +0000
Update translations for support-portal
---
contents+ru.po | 5 ++++-
1 file changed, 4 insertions(+), 1 deletion(-)
diff --git a/contents+ru.po b/contents+ru.po
index 387d53d76..61395d53f 100644
--- a/contents+ru.po
+++ b/contents+ru.po
@@ -2,13 +2,14 @@
# Sergey Smirnov <cj75300(a)gmail.com>, 2018
# erinm, 2018
# 45Green Anonymous <45tanaa(a)gmail.com>, 2018
+# Legenden Rifk <rekytcsgo(a)gmail.com>, 2018
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-08 18:14+CET\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
-"Last-Translator: 45Green Anonymous <45tanaa(a)gmail.com>, 2018\n"
+"Last-Translator: Legenden Rifk <rekytcsgo(a)gmail.com>, 2018\n"
"Language-Team: Russian (https://www.transifex.com/otf/teams/1519/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -908,6 +909,8 @@ msgid ""
"If you see lines like this in your Tor log, it means that Tor failed to "
"complete a TLS handshake with the directory authorities."
msgstr ""
+"Если вы видите такие строки в вашем журнале Tor, это означает, что Tor не "
+"смог выполнить соединение с TLS с полномочиями каталога."
#: http//localhost/tbb/tbb-19/
#: (content/tbb/tbb-19/contents+en.lrquestion.description)
1
0

[translation/torbutton-browseronboardingproperties] Update translations for torbutton-browseronboardingproperties
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit c1235eab1c8dff093ef7176d478715bf6dac860e
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:18:19 2018 +0000
Update translations for torbutton-browseronboardingproperties
---
ru/browserOnboarding.properties | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/ru/browserOnboarding.properties b/ru/browserOnboarding.properties
index 0d4c6c4cf..aea784518 100644
--- a/ru/browserOnboarding.properties
+++ b/ru/browserOnboarding.properties
@@ -27,7 +27,7 @@ onboarding.tour-tor-security.title=Choose your experience.
onboarding.tour-tor-security.description=Мы также предоставляем вам дополнительные настройки для повышения безопасности вашего браузера. Наши Параметры Безопасности позволяют блокировать элементы, которые могут быть использованы для атаки вашего компьютера. Нажмите ниже, чтобы посмотреть, что делают разные функции.
onboarding.tour-tor-security.button=Настройки Просмотра
-onboarding.tour-tor-expect-differences=Experience Tips
+onboarding.tour-tor-expect-differences=Рекомендации
onboarding.tour-tor-expect-differences.title=Ждите небольших различий.
onboarding.tour-tor-expect-differences.description=Со всеми функциями безопасности и конфиденциальности, предоставляемыми Tor, ваш просмотр интернета может быть немного другим. Скорость может быть немного медленнее, и в зависимости от уровня безопасности некоторые элементы могут не работать или не загружаться. Вас также могут попросить доказать, что вы человек, а не робот.
onboarding.tour-tor-expect-differences.button=Посмотреть FAQ
@@ -44,7 +44,7 @@ onboarding.tor-circuit-display.one-of-three=1 из 3
onboarding.tor-circuit-display.two-of-three=2 из 3
onboarding.tor-circuit-display.three-of-three=3 из 3
-onboarding.tor-circuit-display.intro.title=How do circuits work?
+onboarding.tor-circuit-display.intro.title=Как работает цикл?
onboarding.tor-circuit-display.intro.msg=Цикл состоит из случайно назначенных ретрансляторов, которые являются компьютерами по всему миру, сконфигурированными для пересылки трафика Tor. Цикл делает ваш браузер безопасным и позволяет подключаться к .onion сайтам.
onboarding.tor-circuit-display.diagram.title=Просмотр Цепочки
1
0

[translation/tails-misc_completed] Update translations for tails-misc_completed
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit 60b607b9e4260e9b79578d7b8b9a3d3e34c7610b
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:16:08 2018 +0000
Update translations for tails-misc_completed
---
ru.po | 502 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-------
1 file changed, 454 insertions(+), 48 deletions(-)
diff --git a/ru.po b/ru.po
index 8beca5b92..a233661b2 100644
--- a/ru.po
+++ b/ru.po
@@ -4,6 +4,7 @@
#
# Translators:
# Adriano <morros(a)ro.ru>, 2014
+# Alexey Ostroukhov <horovodoved(a)live.com>, 2018
# Andrew, 2015
# Andrey, 2017
# Антон Толмачев <a.tolmachev(a)richart-consalt.ru>, 2016
@@ -13,10 +14,12 @@
# joshua ridney, 2015
# jujjer <jujjer(a)gmail.com>, 2013
# Julia Liberman <gangsta_b(a)rambler.ru>, 2015
+# Legenden Rifk <rekytcsgo(a)gmail.com>, 2018
# mendov, 2013
# Misha Dyachuk <Wikia(a)scryptmail.com>, 2016
# Oul Gocke <beandonlybe(a)yandex.ru>, 2013-2014
# Sergey Briskin, 2015
+# Sergey Lapshov <sfinx641(a)gmail.com>, 2018
# tetyana muirhead, 2015
# Timofey Lisunov <solokot(a)gmail.com>, 2017
# Valid Olov, 2013
@@ -26,11 +29,11 @@
# Руслан <nasretdinov.r.r(a)ya.ru>, 2014
msgid ""
msgstr ""
-"Project-Id-Version: The Tor Project\n"
+"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2018-03-12 19:03+0100\n"
-"PO-Revision-Date: 2018-07-20 15:53+0000\n"
-"Last-Translator: mayp <mayor.popeye(a)gmail.com>\n"
+"POT-Creation-Date: 2018-10-15 14:47+0200\n"
+"PO-Revision-Date: 2018-10-16 13:51+0000\n"
+"Last-Translator: Legenden Rifk <rekytcsgo(a)gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/otf/torproject/language/ru/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -46,7 +49,7 @@ msgstr "Tor готов"
msgid "You can now access the Internet."
msgstr "Теперь у вас есть доступ к Интернету."
-#: config/chroot_local-includes/etc/whisperback/config.py:65
+#: config/chroot_local-includes/etc/whisperback/config.py:69
#, python-format
msgid ""
"<h1>Help us fix your bug!</h1>\n"
@@ -63,6 +66,30 @@ msgid ""
"</p>\n"
msgstr "<h1>Помогите нам исправить вашу ошибку!</h1>\n<p>Прочитайте<a href=\"%s\">наши инструкции о том, как сообщать об ошибках</a>.</p>\n<p><strong>Не сообщайте больше личной информации, чем это необходимо!</strong></p>\n<h2>По поводу предоставления нам адреса электронной почты</h2>\n<p>\nПредоставление нам адреса электронной почты позволяет нам связаться с вами для уточнения проблемы. Это необходимо в подавляющем большинстве случаев, когда мы получаем сообщения об ошибках, поскольку большинство сообщений без контактной информации бесполезны. С другой стороны, это также
дает возможность средствам перехвата и сбора информации информации, например, вашему поставщику услуг электронной почты или интернет-провайдеру, установить, что вы используете Tails.\n</p>\n"
+#: config/chroot_local-includes/usr/share/tails/additional-software/configuration-window.ui:51
+msgid ""
+"You can install additional software automatically from your persistent "
+"storage when starting Tails."
+msgstr "Вы можете установить дополнительное программное обеспечение автоматически из своего постоянного хранилища при запуске Tails."
+
+#: config/chroot_local-includes/usr/share/tails/additional-software/configuration-window.ui:77
+msgid ""
+"The following software is installed automatically from your persistent "
+"storage when starting Tails."
+msgstr "Следующее программное обеспечение автоматически устанавливается из вашего постоянного хранилища при запуске Tails."
+
+#: config/chroot_local-includes/usr/share/tails/additional-software/configuration-window.ui:132
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:172
+msgid ""
+"To add more, install some software using <a "
+"href=\"synaptic.desktop\">Synaptic Package Manager</a> or <a "
+"href=\"org.gnome.Terminal.desktop\">APT on the command line</a>."
+msgstr "Чтобы добавить больше, установите программное обеспечение с помощью <a href=\"synaptic.desktop\">диспетчера пакетов Synaptic</a> или <a href=\"org.gnome.Terminal.desktop\">APT в командной строке</a>."
+
+#: config/chroot_local-includes/usr/share/tails/additional-software/configuration-window.ui:151
+msgid "_Create persistent storage"
+msgstr "Создать постоянное хранилище"
+
#: config/chroot_local-includes/usr/local/bin/electrum:57
msgid "Persistence is disabled for Electrum"
msgstr "Режим постоянного хранилища отключен для Electrum"
@@ -79,15 +106,31 @@ msgid "Do you want to start Electrum anyway?"
msgstr "Вы хотите запустить Electrum в любом случае?"
#: config/chroot_local-includes/usr/local/bin/electrum:63
+#: config/chroot_local-includes/usr/local/bin/liferea:33
#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:41
msgid "_Launch"
msgstr "_Launch"
#: config/chroot_local-includes/usr/local/bin/electrum:64
+#: config/chroot_local-includes/usr/local/bin/liferea:32
#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:42
msgid "_Exit"
msgstr "_Exit"
+#: config/chroot_local-includes/usr/local/bin/liferea:18
+msgid "Liferea is deprecated"
+msgstr "Liferea устарела"
+
+#: config/chroot_local-includes/usr/local/bin/liferea:19
+msgid "Do you wish to start Liferea anyway?"
+msgstr "Вы все равно хотите запустить Liferea?"
+
+#: config/chroot_local-includes/usr/local/bin/liferea:21
+msgid ""
+"Due to security concerns the Liferea feed reader will be removed from Tails "
+"by the end of 2018. Please migrate your feeds to Thunderbird."
+msgstr "Из-за проблем безопасности устройство чтения Liferea будет удалено из Tails к концу 2018 года. Проведите миграцию ваших каналов в Thunderbird."
+
#: config/chroot_local-includes/usr/share/gnome-shell/extensions/status-menu-helper@tails.boum.org/extension.js:75
msgid "Restart"
msgstr "Перезапуск"
@@ -125,50 +168,213 @@ msgstr "Информация о сборке:\n%s"
msgid "not available"
msgstr "не найдено"
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:170
-msgid "Your additional software installation failed"
-msgstr "Сбой установки дополнительного программного обеспечения"
+#. Translators: Don't translate {details}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:144
+#, python-brace-format
+msgid ""
+"{details} Please check your list of additional software or read the system "
+"log to understand the problem."
+msgstr "{details} Пожалуйста, просмотрите список дополнительных программ или прочитайте системный журнал, чтобы понять проблему."
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:171
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:149
+msgid ""
+"Please check your list of additional software or read the system log to "
+"understand the problem."
+msgstr "Пожалуйста, просмотрите список дополнительных программ или прочитайте системный журнал, чтобы понять проблему."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:153
+msgid "Show Log"
+msgstr "Показать журнал"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:153
+msgid "Configure"
+msgstr "Настроить"
+
+#. Translators: Don't translate {beginning} or {last}, they are placeholders
+#. and will be replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:218
+#, python-brace-format
+msgid "{beginning} and {last}"
+msgstr "{beginning} и {last}"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:219
+msgid ", "
+msgstr ", "
+
+#. Translators: Don't translate {packages}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:284
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:313
+#, python-brace-format
+msgid "Add {packages} to your additional software?"
+msgstr "Добавить {packages} в ваше дополнительное программное обеспечение?"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:286
+msgid ""
+"To install it automatically from your persistent storage when starting "
+"Tails."
+msgstr "Чтобы автоматически установить его из постоянного хранилища при запуске Tails."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:288
+msgid "Install Every Time"
+msgstr "установить Every Time"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:289
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:319
+msgid "Install Only Once"
+msgstr "установить Only Once"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:295
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:324
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:362
+msgid "The configuration of your additional software failed."
+msgstr "Не удалось выполнить конфигурацию вашего дополнительного программного обеспечения."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:315
msgid ""
-"The installation failed. Please check your additional software "
-"configuration, or read the system log to understand better the problem."
-msgstr "Сбой установки. Проверьте конфигурацию дополнительного программного обеспечения или прочитайте системный журнал, чтобы лучше понять проблему."
+"To install it automatically when starting Tails, you can create a persistent"
+" storage and activate the <b>Additional Software</b> feature."
+msgstr "Чтобы установить его автоматически при запуске Tails, вы можете создать постоянное хранилище и активировать <b>функцию дополнительного программного обеспечения</b>."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:318
+msgid "Create Persistent Storage"
+msgstr "Создание постоянного хранилища"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:326
+msgid "Creating your persistent storage failed."
+msgstr "Не удалось создать постоянное хранилище."
+
+#. Translators: Don't translate {packages}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:334
+#, python-brace-format
+msgid "You could install {packages} automatically when starting Tails"
+msgstr "Вы можете установить {packages} автоматически при запуске Tails"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:337
+msgid ""
+"To do so, you need to run Tails from a USB stick installed using <i>Tails "
+"Installer</i>."
+msgstr "Для этого вам нужно запустить Tails с USB-накопителя, установленного с помощью <i>Tails Installer</i>."
+
+#. Translators: Don't translate {packages}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:351
+#, python-brace-format
+msgid "Remove {packages} from your additional software?"
+msgstr "Удалить {packages} из вашего дополнительного программного обеспечения?"
+
+#. Translators: Don't translate {packages}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:354
+#, python-brace-format
+msgid "This will stop installing {packages} automatically."
+msgstr "Это автоматически прекратит установку {packages}."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:356
+msgid "Remove"
+msgstr "Убрать"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:357
+#: config/chroot_local-includes/usr/local/bin/tails-screen-locker:118
+#: config/chroot_local-includes/usr/local/bin/tor-browser:46
+msgid "Cancel"
+msgstr "Отмена"
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:531
+msgid "Installing your additional software from persistent storage..."
+msgstr "Установка дополнительного программного обеспечения из постоянного хранилища ..."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:533
+msgid "This can take several minutes."
+msgstr "Это может занять несколько минут."
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:177
-msgid "Your additional software are installed"
-msgstr "Установлено дополнительное программное обеспечение"
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:545
+msgid "The installation of your additional software failed"
+msgstr "Не удалось установить дополнительное программное обеспечение"
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:178
-msgid "Your additional software are ready to use."
-msgstr "Ваше дополнительное программное обеспечение готово к использованию."
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:560
+msgid "Additional software installed successfully"
+msgstr "Дополнительное программное обеспечение установлено успешно"
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:194
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:204
-msgid "Your additional software upgrade failed"
-msgstr "Сбой обновления дополнительного программного обеспечения"
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:580
+msgid "The check for upgrades of your additional software failed"
+msgstr "Ошибка проверки обновлений вашего дополнительного программного обеспечения"
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:195
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:582
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:590
+msgid ""
+"Please check your network connection, restart Tails, or read the system log "
+"to understand the problem."
+msgstr "Пожалуйста, проверьте сетевое подключение, перезапустите Tails или прочитайте системный журнал, чтобы понять проблему."
+
+#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:589
+msgid "The upgrade of your additional software failed"
+msgstr "Не удалось обновить дополнительное программное обеспечение"
+
+#: config/chroot_local-includes/usr/local/lib/tails-additional-software-notify:37
+msgid "Documentation"
+msgstr "Документация"
+
+#. Translators: Don't translate {package}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:96
+#, python-brace-format
+msgid ""
+"Remove {package} from your additional software? This will stop installing "
+"the package automatically."
+msgstr "Удалить {package} из вашего дополнительного программного обеспечения? Это автоматически прекратит установку пакета."
+
+#. Translators: Don't translate {pkg}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:107
+#, python-brace-format
+msgid "Failed to remove {pkg}"
+msgstr "Не удалось удалить {pkg}"
+
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:124
+msgid "Failed to read additional software configuration"
+msgstr "Не удалось прочитать дополнительную конфигурацию программного обеспечения"
+
+#. Translators: Don't translate {package}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:154
+#, python-brace-format
+msgid "Stop installing {package} automatically"
+msgstr "Прекратить установку {packege} автоматически"
+
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:179
msgid ""
-"The check for upgrades failed. This might be due to a network problem. "
-"Please check your network connection, try to restart Tails, or read the "
-"system log to understand better the problem."
-msgstr "Проверка обновлений не удалась. Это может быть вызвано неполадками в сети. Проверьте сетевое подключение, попробуйте перезапустить Tails или прочитайте системный журнал, чтобы лучше понять проблему."
+"To do so, install some software using <a href=\"synaptic.desktop\">Synaptic "
+"Package Manager</a> or <a href=\"org.gnome.Terminal.desktop\">APT on the "
+"command line</a>."
+msgstr "Для этого, установите программное обеспечение при помощи <a href=\"synaptic.desktop\">Synaptic Package Manager</a> или <a href=\"org.gnome.Terminal.desktop\">APT в командной строке</a>."
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:201
-msgid "Your additional software are up to date"
-msgstr "Ваше дополнительное программное обеспечение обновлено"
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:188
+msgid ""
+"To do so, unlock your persistent storage when starting Tails and install "
+"some software using <a href=\"synaptic.desktop\">Synaptic Package "
+"Manager</a> or <a href=\"org.gnome.Terminal.desktop\">APT on the command "
+"line</a>."
+msgstr "Для этого разблокируйте ваше постоянное хранилище при запуске Tails и установите программное обеспечение при помощи <a href=\"synaptic.desktop\">Synaptic Package Manager</a> или <a href=\"org.gnome.Terminal.desktop\">APT в командной строке</a>."
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:202
-msgid "The upgrade was successful."
-msgstr "Обновление прошло успешно."
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:198
+msgid ""
+"To do so, create a persistent storage and install some software using <a "
+"href=\"synaptic.desktop\">Synaptic Package Manager</a> or <a "
+"href=\"org.gnome.Terminal.desktop\">APT on the command line</a>."
+msgstr "Для этого создайте постоянное хранилище при запуске Tails и установите программное обеспечение при помощи Synaptic Package Manager или APT в командной строке."
-#: config/chroot_local-includes/usr/local/sbin/tails-additional-software:205
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:206
msgid ""
-"The upgrade failed. This might be due to a network problem. Please check "
-"your network connection, try to restart Tails, or read the system log to "
-"understand better the problem."
-msgstr "Обновление было прервано. Возможно, причина на стороне сетевого соединения. Пожалуйста, убедитесь в наличии подключения к сети и попробуйте перезапустить Tails."
+"To do so, install Tails on a USB stick using <a href=\"tails-"
+"installer.desktop\">Tails Installer</a> and create a persistent storage."
+msgstr "Для этого установите Tails на USB-диск при помощи <a href=\"tails-installer.desktop\">Tails Installer</a>и создайте постоянное хранилище."
+
+#: config/chroot_local-includes/usr/local/bin/tails-additional-software-config:253
+msgid "[package not available]"
+msgstr "[package not available]"
#: config/chroot_local-includes/usr/local/lib/tails-htp-notify-user:52
msgid "Synchronizing the system's clock"
@@ -219,11 +425,6 @@ msgstr "MAC-адрес сетевой карты ${nic_name} (${nic}) подме
msgid "Lock Screen"
msgstr "Экран блокировки"
-#: config/chroot_local-includes/usr/local/bin/tails-screen-locker:118
-#: config/chroot_local-includes/usr/local/bin/tor-browser:46
-msgid "Cancel"
-msgstr "Отмена"
-
#: config/chroot_local-includes/usr/local/bin/tails-screen-locker:124
msgid "Screen Locker"
msgstr "Экранный блокировщик"
@@ -301,6 +502,14 @@ msgstr "Tor не готов. Все равно запустить Tor Browser?"
msgid "Start Tor Browser"
msgstr "Запустить Tor Browser"
+#: config/chroot_local-includes/usr/share/gnome-shell/extensions/torstatus@tails.boum.org/extension.js:40
+msgid "Tor"
+msgstr "Tor"
+
+#: config/chroot_local-includes/usr/share/gnome-shell/extensions/torstatus@tails.boum.org/extension.js:55
+msgid "Open Onion Circuits"
+msgstr "Открытые схемы луковицы"
+
#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:38
msgid "Do you really want to launch the Unsafe Browser?"
msgstr "Вы действительно хотите запустить небезопасный браузер?"
@@ -339,30 +548,165 @@ msgstr "Невозможно перезапустить Tor."
msgid "Unsafe Browser"
msgstr "Небезопасный браузер"
-#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:92
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:91
msgid ""
"Another Unsafe Browser is currently running, or being cleaned up. Please "
"retry in a while."
msgstr "В данный момент либо работает другой небезопасный браузер, либо не завершена процедура его выгрузки. Пожалуйста, повторите попытку спустя некоторое время."
-#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:100
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:99
msgid "Failed to setup chroot."
msgstr "Не удалось установить chroot."
-#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:105
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:104
msgid "Failed to configure browser."
msgstr "Не удалось настроить браузер"
-#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:111
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:110
msgid ""
"No DNS server was obtained through DHCP or manually configured in "
"NetworkManager."
msgstr "DNS сервер либо не был получен через DHCP, либо не был установлен вручную через NetworkManager."
-#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:117
+#: config/chroot_local-includes/usr/local/sbin/unsafe-browser:121
msgid "Failed to run browser."
msgstr "Не удалось запустить браузер."
+#. Translators: Don't translate {volume_label} or {volume_size},
+#. they are placeholders and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:58
+#, python-brace-format
+msgid "{volume_label} ({volume_size})"
+msgstr "{volume_label} ({volume_size})"
+
+#. Translators: Don't translate {partition_name} or {partition_size},
+#. they are placeholders and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:63
+#, python-brace-format
+msgid "{partition_name} ({partition_size})"
+msgstr "{partition_name} ({partition_size})"
+
+#. Translators: Don't translate {volume_size}, it's a placeholder
+#. and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:68
+#, python-brace-format
+msgid "{volume_size} Volume"
+msgstr "{volume_size} Раздел"
+
+#. Translators: Don't translate {volume_name}, it's a placeholder and
+#. will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:107
+#, python-brace-format
+msgid "{volume_name} (Read-Only)"
+msgstr "{volume_name} (Только для чтения)"
+
+#. Translators: Don't translate {partition_name} and {container_path}, they
+#. are placeholders and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:115
+#, python-brace-format
+msgid "{partition_name} in {container_path}"
+msgstr "{partition_name} in {container_path}"
+
+#. Translators: Don't translate {volume_name} and {path_to_file_container},
+#. they are placeholders and will be replaced. You should only have to
+#. translate
+#. this string if it makes sense to reverse the order of the placeholders.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:122
+#, python-brace-format
+msgid "{volume_name} – {path_to_file_container}"
+msgstr "{volume_name} – {path_to_file_container}"
+
+#. Translators: Don't translate {partition_name} and {drive_name}, they
+#. are placeholders and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:128
+#, python-brace-format
+msgid "{partition_name} on {drive_name}"
+msgstr "{partition_name} on {drive_name}"
+
+#. Translators: Don't translate {volume_name} and {drive_name},
+#. they are placeholders and will be replaced. You should only have to
+#. translate
+#. this string if it makes sense to reverse the order of the placeholders.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:135
+#, python-brace-format
+msgid "{volume_name} – {drive_name}"
+msgstr "{volume_name} – {drive_name}"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:222
+msgid "Wrong passphrase or parameters"
+msgstr "Неверная фраза или параметры"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:224
+msgid "Error unlocking volume"
+msgstr "Ошибка разблокировки тома"
+
+#. Translators: Don't translate {volume_name} or {error_message},
+#. they are placeholder and will be replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:228
+#, python-brace-format
+msgid ""
+"Couldn't unlock volume {volume_name}:\n"
+"{error_message}"
+msgstr "Не удалось разблокировать том {volume_name}:\n{error_message}"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_list.py:83
+msgid "No file containers added"
+msgstr "Контейнеры файлов не добавлены"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_list.py:98
+msgid "No VeraCrypt devices detected"
+msgstr "Не обнаружены устройства VeraCrypt"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:114
+msgid "Container already added"
+msgstr "Контейнер уже добавлен"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:115
+#, python-format
+msgid "The file container %s should already be listed."
+msgstr "Контейнер файлов %s должен быть указан."
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:131
+msgid "Container opened read-only"
+msgstr "Контейнер открыт только для чтения"
+
+#. Translators: Don't translate {path}, it's a placeholder and will be
+#. replaced.
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:133
+#, python-brace-format
+msgid ""
+"The file container {path} could not be opened with write access. It was opened read-only instead. You will not be able to modify the content of the container.\n"
+"{error_message}"
+msgstr "Контейнер с файлом {path} не может быть открыт с доступом для записи. Вместо этого он был открыт только для чтения. Вы не сможете изменить содержимое контейнера.\n{error_message}"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:138
+msgid "Error opening file"
+msgstr "Ошибка открытия файла"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:160
+msgid "Not a VeraCrypt container"
+msgstr "Не VeraCrypt контейнер"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:161
+#, python-format
+msgid "The file %s does not seem to be a VeraCrypt container."
+msgstr "Файл %s, не является контейнером VeraCrypt."
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:163
+msgid "Failed to add container"
+msgstr "Ошибка в добавлении контейнера"
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:164
+#, python-format
+msgid ""
+"Could not add file container %s: Timeout while waiting for loop setup.Please"
+" try using the <i>Disks</i> application instead."
+msgstr "Не удалось добавить контейнер файлов%s: Тайм-аут при ожидании установки цикла. Попробуйте вместо этого использовать приложение <i>«Диски»</i>."
+
+#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:209
+msgid "Choose File Container"
+msgstr "Выберите Контейнер Файлов"
+
#: ../config/chroot_local-includes/etc/skel/Desktop/Report_an_error.desktop.in.h:1
msgid "Report an error"
msgstr "Сообщить об ошибке"
@@ -396,6 +740,24 @@ msgstr "Работа в интернете без соблюдения анон
msgid "Unsafe Web Browser"
msgstr "Небезопасный браузер"
+#: ../config/chroot_local-includes/usr/share/applications/unlock-veracrypt-volumes.desktop.in.h:1
+msgid "Unlock VeraCrypt Volumes"
+msgstr "Разблокировать тома VeraCrypt"
+
+#: ../config/chroot_local-includes/usr/share/applications/unlock-veracrypt-volumes.desktop.in.h:2
+msgid "Mount VeraCrypt encrypted file containers and devices"
+msgstr "Зашифрованные контейнеры файлов и устройства Mount VeraCrypt"
+
+#: ../config/chroot_local-includes/usr/share/applications/org.boum.tails.additional-software-config.desktop.in.h:1
+msgid "Additional Software"
+msgstr "Дополнительное програмное обеспечение"
+
+#: ../config/chroot_local-includes/usr/share/applications/org.boum.tails.additional-software-config.desktop.in.h:2
+msgid ""
+"Configure the additional software installed from your persistent storage "
+"when starting Tails"
+msgstr "Настроить дополнительное программное обеспечение из вашего постоянного хранилище при запуске Tails."
+
#: ../config/chroot_local-includes/usr/share/desktop-directories/Tails.directory.in.h:2
msgid "Tails specific tools"
msgstr "Специальные инструменты Tails"
@@ -403,3 +765,47 @@ msgstr "Специальные инструменты Tails"
#: ../config/chroot_local-includes/usr/share/polkit-1/actions/org.boum.tails.root-terminal.policy.in.h:1
msgid "To start a Root Terminal, you need to authenticate."
msgstr "Чтобы запустить root-терминал, необходимо пройти аутентификацию."
+
+#: ../config/chroot_local-includes/usr/share/polkit-1/actions/org.boum.tails.additional-software.policy.in.h:1
+msgid "Remove an additional software package"
+msgstr "Удалить дополнительные программные пакеты"
+
+#: ../config/chroot_local-includes/usr/share/polkit-1/actions/org.boum.tails.additional-software.policy.in.h:2
+msgid ""
+"Authentication is required to remove a package from your additional software"
+" ($(command_line))"
+msgstr "Для удаления пакета из вашего дополнительного ПО требуется аутентификация ($ (command_line))"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:61
+msgid "File Containers"
+msgstr "Контейнеры файлов"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:80
+msgid "_Add"
+msgstr "_Add"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:86
+msgid "Add a file container"
+msgstr "Добавить контейнер файлов"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:103
+msgid "Partitions and Drives"
+msgstr "Разделы и Диски"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:121
+msgid ""
+"This application is not affiliated with or endorsed by the VeraCrypt project"
+" or IDRIX."
+msgstr "Это приложение не связано / не одобрено проектом VeraCrypt или IDRIX."
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/volume.ui.in:38
+msgid "Lock this volume"
+msgstr "Заблокировать этот том"
+
+#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/volume.ui.in:61
+msgid "Detach this volume"
+msgstr "Отвязать этот том"
+
+#: ../config/chroot_local-includes/usr/local/share/mime/packages/unlock-veracrypt-volumes.xml.in.h:1
+msgid "TrueCrypt/VeraCrypt container"
+msgstr "Контейнер TrueCrypt/VeraCrypt"
1
0

[translation/tails-misc] Update translations for tails-misc
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit 8ef4a87982fadffc56c7d2d0d4990539bd4c44c5
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:16:03 2018 +0000
Update translations for tails-misc
---
ru.po | 22 +++++++++++-----------
1 file changed, 11 insertions(+), 11 deletions(-)
diff --git a/ru.po b/ru.po
index 10599e6fc..a233661b2 100644
--- a/ru.po
+++ b/ru.po
@@ -32,7 +32,7 @@ msgstr ""
"Project-Id-Version: Tor Project\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2018-10-15 14:47+0200\n"
-"PO-Revision-Date: 2018-10-16 13:45+0000\n"
+"PO-Revision-Date: 2018-10-16 13:51+0000\n"
"Last-Translator: Legenden Rifk <rekytcsgo(a)gmail.com>\n"
"Language-Team: Russian (http://www.transifex.com/otf/torproject/language/ru/)\n"
"MIME-Version: 1.0\n"
@@ -605,7 +605,7 @@ msgstr "{volume_name} (Только для чтения)"
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:115
#, python-brace-format
msgid "{partition_name} in {container_path}"
-msgstr ""
+msgstr "{partition_name} in {container_path}"
#. Translators: Don't translate {volume_name} and {path_to_file_container},
#. they are placeholders and will be replaced. You should only have to
@@ -614,14 +614,14 @@ msgstr ""
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:122
#, python-brace-format
msgid "{volume_name} – {path_to_file_container}"
-msgstr ""
+msgstr "{volume_name} – {path_to_file_container}"
#. Translators: Don't translate {partition_name} and {drive_name}, they
#. are placeholders and will be replaced.
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:128
#, python-brace-format
msgid "{partition_name} on {drive_name}"
-msgstr ""
+msgstr "{partition_name} on {drive_name}"
#. Translators: Don't translate {volume_name} and {drive_name},
#. they are placeholders and will be replaced. You should only have to
@@ -630,7 +630,7 @@ msgstr ""
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:135
#, python-brace-format
msgid "{volume_name} – {drive_name}"
-msgstr ""
+msgstr "{volume_name} – {drive_name}"
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume.py:222
msgid "Wrong passphrase or parameters"
@@ -664,7 +664,7 @@ msgstr "Контейнер уже добавлен"
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:115
#, python-format
msgid "The file container %s should already be listed."
-msgstr ""
+msgstr "Контейнер файлов %s должен быть указан."
#: config/chroot_local-includes/usr/local/lib/python3/dist-packages/unlock_veracrypt_volumes/volume_manager.py:131
msgid "Container opened read-only"
@@ -790,22 +790,22 @@ msgstr "Добавить контейнер файлов"
#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:103
msgid "Partitions and Drives"
-msgstr ""
+msgstr "Разделы и Диски"
#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/main.ui.in:121
msgid ""
"This application is not affiliated with or endorsed by the VeraCrypt project"
" or IDRIX."
-msgstr ""
+msgstr "Это приложение не связано / не одобрено проектом VeraCrypt или IDRIX."
#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/volume.ui.in:38
msgid "Lock this volume"
-msgstr ""
+msgstr "Заблокировать этот том"
#: ../config/chroot_local-includes/usr/share/unlock-veracrypt-volumes/ui/volume.ui.in:61
msgid "Detach this volume"
-msgstr ""
+msgstr "Отвязать этот том"
#: ../config/chroot_local-includes/usr/local/share/mime/packages/unlock-veracrypt-volumes.xml.in.h:1
msgid "TrueCrypt/VeraCrypt container"
-msgstr ""
+msgstr "Контейнер TrueCrypt/VeraCrypt"
1
0

[translation/abouttor-homepage] Update translations for abouttor-homepage
by translation@torproject.org 16 Oct '18
by translation@torproject.org 16 Oct '18
16 Oct '18
commit 710a6584a1a670bc88a1a69fcdc12db9806f62cf
Author: Translation commit bot <translation(a)torproject.org>
Date: Tue Oct 16 14:15:04 2018 +0000
Update translations for abouttor-homepage
---
ru/aboutTor.dtd | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/ru/aboutTor.dtd b/ru/aboutTor.dtd
index 5ac3656fa..30da9663a 100644
--- a/ru/aboutTor.dtd
+++ b/ru/aboutTor.dtd
@@ -6,8 +6,8 @@
<!ENTITY aboutTor.title "О проекте Tor">
-<!ENTITY aboutTor.ready.label "Работайте. Приватно.">
-<!ENTITY aboutTor.ready2.label "Самый приватный браузер в мире.">
+<!ENTITY aboutTor.ready.label "Исследуйте. Приватно.">
+<!ENTITY aboutTor.ready2.label "Вы готовы к самому приватному просмотру веб-страниц в мире.">
<!ENTITY aboutTor.failure.label "Что-то пошло не так!">
<!ENTITY aboutTor.failure2.label "Tor не работает в этом браузере.">
@@ -29,14 +29,14 @@
<!ENTITY aboutTor.donationBanner.line1 "Tor: Сила в цифрах">
-<!ENTITY aboutTor.donationBanner.line2a "Anonymity loves company.">
-<!ENTITY aboutTor.donationBanner.line2b "Advance universal human rights.">
+<!ENTITY aboutTor.donationBanner.line2a "Анонимность уважает компании.">
+<!ENTITY aboutTor.donationBanner.line2b "Продвижение всеобщих прав человека.">
<!ENTITY aboutTor.donationBanner.line2c "Встаньте на свободу.">
<!ENTITY aboutTor.donationBanner.line2d "Обеспечиваем конфиденциальность миллионам людей.">
-<!ENTITY aboutTor.donationBanner.line2e "Keep Tor strong.">
+<!ENTITY aboutTor.donationBanner.line2e "Сохраните Tor сильным.">
<!ENTITY aboutTor.donationBanner.line2f "Нам нужна твоя поддержка!">
-<!ENTITY aboutTor.donationBanner.line3 "Give today, and Mozilla will match your donation.">
+<!ENTITY aboutTor.donationBanner.line3 "Пожертвуйте сегодня и Mozilla удвоит Ваше пожертвование.">
<!ENTITY aboutTor.donationBanner.buttonA "Пожертвовать">
<!ENTITY aboutTor.donationBanner.buttonB "Count Me In">
1
0