tor-commits
Threads by month
- ----- 2025 -----
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
October 2017
- 17 participants
- 2005 discussions
[onionoo/release] Fix the "running" field in bridge details documents.
by karsten@torproject.org 10 Oct '17
by karsten@torproject.org 10 Oct '17
10 Oct '17
commit 68819a084f60eb2e0453f21ac6986a15e2217d5b
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Tue Sep 19 12:06:33 2017 +0200
Fix the "running" field in bridge details documents.
When we set this field in the update process, we only looked whether
the bridge is contained in the last known bridge network status. We
also need to check whether it has the "Running" flag assigned there.
This is different from relays, because the consensus only lists relays
with the "Running" flag since a couple of years, whereas the bridge
network status lists all known bridges.
Fixes #23467. Spotted by nusenu.
---
CHANGELOG.md | 5 +++++
.../org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java | 3 ++-
2 files changed, 7 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index f817060..b9a171d 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,10 @@
# Changes in version 4.?-?.?.? - 2017-??-??
+ * Medium changes
+ - Only set the "running" field in a bridge's details document to
+ true if the bridge is both contained in the last known bridge
+ network status and has the "Running" flag assigned there.
+
* Minor changes
- Remove placeholder page on index.html.
diff --git a/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java b/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java
index 9fcff35..ff14d75 100644
--- a/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java
+++ b/src/main/java/org/torproject/onionoo/updater/NodeDetailsStatusUpdater.java
@@ -863,7 +863,8 @@ public class NodeDetailsStatusUpdater implements DescriptorListener,
}
detailsStatus.setRelay(nodeStatus.isRelay());
- detailsStatus.setRunning(nodeStatus.getLastSeenMillis()
+ detailsStatus.setRunning(nodeStatus.getRelayFlags().contains("Running")
+ && nodeStatus.getLastSeenMillis()
== (nodeStatus.isRelay() ? this.relaysLastValidAfterMillis
: this.bridgesLastPublishedMillis));
detailsStatus.setNickname(nodeStatus.getNickname());
1
0
commit e7cce2689b73d12972f06bf0ddbf044c361f3790
Author: iwakeh <iwakeh(a)torproject.org>
Date: Tue Sep 19 10:06:34 2017 +0000
Add overview for javadoc.
---
src/main/resources/overview.html | 13 +++++++++++++
1 file changed, 13 insertions(+)
diff --git a/src/main/resources/overview.html b/src/main/resources/overview.html
new file mode 100644
index 0000000..669b9d1
--- /dev/null
+++ b/src/main/resources/overview.html
@@ -0,0 +1,13 @@
+<html>
+ <body>
+ <p>Onionoo is a web-based protocol to learn about currently running Tor
+ relays and bridges.</p>
+ <p>This is not a public API. Unexpected changes may occur anytime.</p>
+ <p>Contact and further information:
+ <ul>
+ <li><a href="https://metrics.torproject.org/onionoo.html">Onionoo's Protocol Description</a></li>
+ <li><a href="https://trac.torproject.org/projects/tor/query?status=!closed&component=Met…">Tor Metrics Onionoo Bug Tracker</a></li>
+ <li><a href="https://lists.torproject.org/cgi-bin/mailman/listinfo/metrics-team">Metrics Team Mailing List</a></li>
+ </ul>
+ </body>
+</html>
1
0
10 Oct '17
commit 0f28ea28f53542b13beedd3d8255c0dfeccd7aec
Author: iwakeh <iwakeh(a)torproject.org>
Date: Tue Sep 19 10:06:35 2017 +0000
Add build revision field to documents.
Implements task-23778.
---
CHANGELOG.md | 2 ++
build.xml | 2 +-
.../torproject/onionoo/server/ResponseBuilder.java | 24 ++++++++++++++++++++++
3 files changed, 27 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b9a171d..b7b379c 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,8 @@
- Only set the "running" field in a bridge's details document to
true if the bridge is both contained in the last known bridge
network status and has the "Running" flag assigned there.
+ - Add build_revision to documents, if available.
+ - Update to metrics-lib 2.1.1.
* Minor changes
- Remove placeholder page on index.html.
diff --git a/build.xml b/build.xml
index c8a4173..72f3ecc 100644
--- a/build.xml
+++ b/build.xml
@@ -11,7 +11,7 @@
<property name="onionoo.protocol.version" value="4.1"/>
<property name="release.version"
value="${onionoo.protocol.version}-1.5.0-dev"/>
- <property name="metricslibversion" value="2.1.0"/>
+ <property name="metricslibversion" value="2.1.1"/>
<property name="jetty.version" value="-9.2.21.v20170120" />
<property name="warfile"
value="onionoo-${release.version}.war"/>
diff --git a/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java b/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
index efa02c3..6b6b8ee 100644
--- a/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
+++ b/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
@@ -18,16 +18,37 @@ import com.google.gson.GsonBuilder;
import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.InputStream;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
+import java.util.Properties;
public class ResponseBuilder {
+ private static final Logger logger =
+ LoggerFactory.getLogger(ResponseBuilder.class);
+
private DocumentStore documentStore;
+ private String buildRevision;
+ /** Initialize document store and the build revision. */
public ResponseBuilder() {
this.documentStore = DocumentStoreFactory.getDocumentStore();
+ Properties buildProperties = new Properties();
+ try (InputStream is = getClass().getClassLoader()
+ .getResourceAsStream("onionoo.buildrevision.properties")) {
+ buildProperties.load(is);
+ buildRevision = buildProperties.getProperty("onionoo.build.revision",
+ null);
+ } catch (Exception ex) {
+ // We create documents anyway: only log a warning.
+ logger.warn("No build revision available.", ex);
+ buildRevision = null;
+ }
}
private String resourceType;
@@ -112,6 +133,9 @@ public class ResponseBuilder {
this.write(pw, "\"next_major_version_scheduled\":\"%s\",\n",
NEXT_MAJOR_VERSION_SCHEDULED);
}
+ if (null != buildRevision) {
+ this.write(pw, "\"build_revision\":\"%s\",\n", buildRevision);
+ }
this.write(pw, "\"relays_published\":\"%s\",\n",
this.relaysPublishedString);
if (this.relaysSkipped > 0) {
1
0
commit bce585f4a5dfe0fa795e67efd02b37c95925b613
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Oct 9 17:05:57 2017 +0200
Prepare for 4.2-1.6.0 release.
---
CHANGELOG.md | 2 +-
build.xml | 4 ++--
src/build | 2 +-
src/main/java/org/torproject/onionoo/server/ResponseBuilder.java | 2 +-
4 files changed, 5 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index b7b379c..b2aff31 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,4 +1,4 @@
-# Changes in version 4.?-?.?.? - 2017-??-??
+# Changes in version 4.2-1.6.0 - 2017-10-09
* Medium changes
- Only set the "running" field in a bridge's details document to
diff --git a/build.xml b/build.xml
index 72f3ecc..ee3c0da 100644
--- a/build.xml
+++ b/build.xml
@@ -8,9 +8,9 @@
<property name="javadoc-title" value="Onionoo API Documentation"/>
<property name="implementation-title" value="Onionoo" />
- <property name="onionoo.protocol.version" value="4.1"/>
+ <property name="onionoo.protocol.version" value="4.2"/>
<property name="release.version"
- value="${onionoo.protocol.version}-1.5.0-dev"/>
+ value="${onionoo.protocol.version}-1.6.0"/>
<property name="metricslibversion" value="2.1.1"/>
<property name="jetty.version" value="-9.2.21.v20170120" />
<property name="warfile"
diff --git a/src/build b/src/build
index a64b94a..4b34756 160000
--- a/src/build
+++ b/src/build
@@ -1 +1 @@
-Subproject commit a64b94a635e5396266d5c5b5cf88850b9f4b6a24
+Subproject commit 4b34756ddd71ccaf0fc30e5f5bf0a813a297d4a3
diff --git a/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java b/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
index 6b6b8ee..c0b2772 100644
--- a/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
+++ b/src/main/java/org/torproject/onionoo/server/ResponseBuilder.java
@@ -123,7 +123,7 @@ public class ResponseBuilder {
return this.charsWritten;
}
- private static final String PROTOCOL_VERSION = "4.1";
+ private static final String PROTOCOL_VERSION = "4.2";
private static final String NEXT_MAJOR_VERSION_SCHEDULED = null;
1
0
10 Oct '17
commit e0c5774529fb2597e80690b5cc625e54a2eeb245
Author: iwakeh <iwakeh(a)torproject.org>
Date: Fri Jul 28 07:53:28 2017 +0000
Avoid compiler warnings in test classes.
---
.../descriptor/index/DescriptorIndexCollectorTest.java | 12 ++++++------
1 file changed, 6 insertions(+), 6 deletions(-)
diff --git a/src/test/java/org/torproject/descriptor/index/DescriptorIndexCollectorTest.java b/src/test/java/org/torproject/descriptor/index/DescriptorIndexCollectorTest.java
index d7f602f..15ca5b5 100644
--- a/src/test/java/org/torproject/descriptor/index/DescriptorIndexCollectorTest.java
+++ b/src/test/java/org/torproject/descriptor/index/DescriptorIndexCollectorTest.java
@@ -43,7 +43,7 @@ public class DescriptorIndexCollectorTest {
makeStructure(remoteDirectory, "2");
File indexFile = newIndexFile("testindex.json",
- remoteDirectory.toURL().toString());
+ remoteDirectory.toURI().toURL().toString());
// verify precondition for test.
checkContains(true,
@@ -54,7 +54,7 @@ public class DescriptorIndexCollectorTest {
"a/b/y2","a/b/x2");
DescriptorCollector dc = new DescriptorIndexCollector();
- dc.collectDescriptors(indexFile.toURL().toString(),
+ dc.collectDescriptors(indexFile.toURI().toURL().toString(),
new String[]{"a/b", "a"}, 1451606400_000L, localFolder, false);
// verify that files in 'a/b' were fetched
@@ -146,7 +146,7 @@ public class DescriptorIndexCollectorTest {
makeStructure(remoteDirectory, "2");
File indexFile = newIndexFile("testindexDelete.json",
- remoteDirectory.toURL().toString());
+ remoteDirectory.toURI().toURL().toString());
// verify precondition for test.
checkContains(true,
@@ -157,7 +157,7 @@ public class DescriptorIndexCollectorTest {
"a/b/y2","a/b/x2");
new DescriptorIndexCollector()
- .collectDescriptors(indexFile.toURL().toString(),
+ .collectDescriptors(indexFile.toURI().toURL().toString(),
new String[]{"a/b/", "a/b/c"}, 1451606400_000L, localFolder, true);
// verify file addition, including that the non-synced dir is not touched.
@@ -187,7 +187,7 @@ public class DescriptorIndexCollectorTest {
makeStructure(remoteDirectory, "2");
File indexFile = newIndexFile("testindexDelete.json",
- remoteDirectory.toURL().toString());
+ remoteDirectory.toURI().toURL().toString());
// verify precondition for test.
checkContains(true,
@@ -198,7 +198,7 @@ public class DescriptorIndexCollectorTest {
"a/b/y2","a/b/x2");
new DescriptorIndexCollector()
- .collectDescriptors(indexFile.toURL().toString(),
+ .collectDescriptors(indexFile.toURI().toURL().toString(),
new String[]{"/a/b", "/a/b/c/"}, 1451606400_000L,
localFolder, true);
1
0
[metrics-lib/release] Avoid non-ASCII characters in expected messages.
by karsten@torproject.org 10 Oct '17
by karsten@torproject.org 10 Oct '17
10 Oct '17
commit 8678345af9922ca4431b084d75419961dac562fa
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Jul 3 15:35:39 2017 +0200
Avoid non-ASCII characters in expected messages.
This currently breaks Jenkins build, which is not exactly our fault
but Jenkin's. But this is test code, so it's easier to just adapt.
---
.../torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java | 5 +++--
.../org/torproject/descriptor/impl/ServerDescriptorImplTest.java | 7 ++++---
2 files changed, 7 insertions(+), 5 deletions(-)
diff --git a/src/test/java/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java b/src/test/java/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
index 9633f2b..5a3f0f2 100644
--- a/src/test/java/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
+++ b/src/test/java/org/torproject/descriptor/impl/ExtraInfoDescriptorImplTest.java
@@ -1879,8 +1879,9 @@ public class ExtraInfoDescriptorImplTest {
public void testBridgeIpsNonAsciiKeyword()
throws DescriptorParseException {
this.thrown.expect(DescriptorParseException.class);
- this.thrown.expectMessage("Unrecognized character in keyword "
- + "'�bridge-ips' in line '�bridge-ips'.");
+ this.thrown.expectMessage(Matchers.allOf(
+ Matchers.containsString("Unrecognized character in keyword "),
+ Matchers.containsString("bridge-ips'")));
DescriptorBuilder.createWithNonAsciiLineBytes(new byte[] {
0x14, (byte) 0xfe, 0x18, // non-ascii chars
0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x2d, // "bridge-"
diff --git a/src/test/java/org/torproject/descriptor/impl/ServerDescriptorImplTest.java b/src/test/java/org/torproject/descriptor/impl/ServerDescriptorImplTest.java
index 534cb0e..e814b4c 100644
--- a/src/test/java/org/torproject/descriptor/impl/ServerDescriptorImplTest.java
+++ b/src/test/java/org/torproject/descriptor/impl/ServerDescriptorImplTest.java
@@ -14,6 +14,7 @@ import org.torproject.descriptor.BridgeServerDescriptor;
import org.torproject.descriptor.DescriptorParseException;
import org.torproject.descriptor.ServerDescriptor;
+import org.hamcrest.Matchers;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
@@ -1549,9 +1550,9 @@ public class ServerDescriptorImplTest {
public void testAllowSingleHopExitsNonAsciiKeyword()
throws DescriptorParseException {
this.thrown.expect(DescriptorParseException.class);
- this.thrown.expectMessage("Unrecognized character in keyword "
- + "'�allow-single-hop-exits' in line "
- + "'�allow-single-hop-exits'.");
+ this.thrown.expectMessage(Matchers.allOf(
+ Matchers.containsString("Unrecognized character in keyword "),
+ Matchers.containsString("allow-single-hop-exits'")));
DescriptorBuilder.createWithNonAsciiLineBytes(new byte[] {
0x14, (byte) 0xfe, 0x18, // non-ascii chars
0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x2d, // "allow-"
1
0
commit e38ed79dafb5d12870b0a90af6661a6875ce4835
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Wed Jun 28 19:56:11 2017 +0200
Bump version to 2.0.0-dev.
Also include missing change log entry that was supposed to go into
2.0.0.
---
CHANGELOG.md | 3 +++
build.xml | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index a0eb4ec..c6543f2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -4,6 +4,9 @@
- Always use UTF-8 as charset rather than using the platform's
default charset.
- Remove all code that was deprecated in 1.x versions.
+ - Remove previously non-deprecated but internally unused
+ parseDescriptors(byte[], String)) method that returned a List and
+ threw DescriptorParseException.
* Minor changes
- Replace custom ImplementationNotAccessibleException thrown by
diff --git a/build.xml b/build.xml
index 8355298..eaaa5ae 100644
--- a/build.xml
+++ b/build.xml
@@ -6,7 +6,7 @@
<project default="usage" name="metrics-lib" basedir=".">
- <property name="release.version" value="2.0.0" />
+ <property name="release.version" value="2.0.0-dev" />
<property name="javadoc-title" value="Tor Metrics Library API Documentation"/>
<property name="javadoc-excludes" value="**/impl/** **/index/**" />
<property name="implementation-title" value="Tor Metrics Library" />
1
0
[metrics-lib/release] Add tests for Descriptor methods. Implements task-22912.
by karsten@torproject.org 10 Oct '17
by karsten@torproject.org 10 Oct '17
10 Oct '17
commit 925b4a1f80fbe028d6a5bf711d798c0b5ba8e636
Author: iwakeh <iwakeh(a)torproject.org>
Date: Fri Jul 14 09:19:46 2017 +0000
Add tests for Descriptor methods. Implements task-22912.
The different tests have separate methods for clarity when tests fail.
This is more important than the additional overhead of repeated
iteration over the test-descriptors, which are kept small.
---
.../org/torproject/descriptor/DescriptorTest.java | 164 ++++++++++++++++
.../bridge/2017-07-17-17-09-00-extra-infos | 130 +++++++++++++
.../bridge/2017-07-17-17-09-00-server-descriptors | 206 ++++++++++++++++++++
...170645-1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1 | 216 +++++++++++++++++++++
src/test/resources/other/2017-07-17-17-02-00 | 178 +++++++++++++++++
.../resources/other/op-nl-5242880-2017-07-17.tpf | 8 +
.../resources/relay/2017-07-17-17-00-00-consensus | 148 ++++++++++++++
.../relay/2017-07-17-17-00-00-consensus-microdesc | 136 +++++++++++++
...4C5B2E-6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601 | 117 +++++++++++
.../relay/2017-07-17-17-20-00-extra-infos | 136 +++++++++++++
src/test/resources/relay/2017-07-17-17-20-00-micro | 129 ++++++++++++
.../relay/2017-07-17-17-20-00-server-descriptors | 164 ++++++++++++++++
12 files changed, 1732 insertions(+)
diff --git a/src/test/java/org/torproject/descriptor/DescriptorTest.java b/src/test/java/org/torproject/descriptor/DescriptorTest.java
new file mode 100644
index 0000000..9a07cdf
--- /dev/null
+++ b/src/test/java/org/torproject/descriptor/DescriptorTest.java
@@ -0,0 +1,164 @@
+/* Copyright 2017 The Tor Project
+ * See LICENSE for licensing information */
+
+package org.torproject.descriptor;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+import java.io.BufferedReader;
+import java.io.File;
+import java.io.InputStreamReader;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.Iterator;
+
+(a)RunWith(Parameterized.class)
+public class DescriptorTest {
+
+ /** Different descriptor files. */
+ @Parameters
+ public static Collection<Object[]> pathFilename() {
+ return Arrays.asList(
+ new Object[][] {
+ {"other/2017-07-17-17-02-00", // test-filename in src/test/resources
+ ExitList.class, // descriptor type, i.e., the most specific interface
+ new String[] {"@type tordnsel 1.0"}, // all annotations
+ Integer.valueOf(1)}, // expected descriptor count in descriptor file
+
+ {"other/op-nl-5242880-2017-07-17.tpf",
+ TorperfResult.class,
+ new String[] {"@type torperf 1.1"},
+ Integer.valueOf(4)},
+
+ {"relay/2017-07-17-17-00-00-consensus",
+ RelayNetworkStatusConsensus.class,
+ new String[] {"@type network-status-consensus-3 1.0"},
+ Integer.valueOf(1)},
+
+ {"relay/2017-07-17-17-00-00-consensus-microdesc",
+ RelayNetworkStatusConsensus.class,
+ new String[] {"@type network-status-microdesc-consensus-3 1.0"},
+ Integer.valueOf(1)},
+
+ {"relay/2017-07-17-17-00-00-vote-0232AF901C31A04EE9848595AF9BB"
+ + "7620D4C5B2E-6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601",
+ RelayNetworkStatusVote.class,
+ new String[] {"@type network-status-vote-3 1.0"},
+ Integer.valueOf(1)},
+
+ {"relay/2017-07-17-17-20-00-extra-infos",
+ RelayExtraInfoDescriptor.class,
+ new String[] {"@type extra-info 1.0"},
+ Integer.valueOf(6)},
+
+ {"relay/2017-07-17-17-20-00-micro",
+ Microdescriptor.class,
+ new String[] {"@type microdescriptor 1.0"},
+ Integer.valueOf(14)},
+
+ {"relay/2017-07-17-17-20-00-server-descriptors",
+ RelayServerDescriptor.class,
+ new String[] {"@type server-descriptor 1.0"},
+ Integer.valueOf(4)},
+
+ {"bridge/20170717-170645-1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1",
+ BridgeNetworkStatus.class,
+ new String[] {"@type bridge-network-status 1.2"},
+ Integer.valueOf(1)},
+
+ {"bridge/2017-07-17-17-09-00-extra-infos",
+ BridgeExtraInfoDescriptor.class,
+ new String[] {"@type bridge-extra-info 1.3"},
+ Integer.valueOf(6)},
+
+ {"bridge/2017-07-17-17-09-00-server-descriptors",
+ BridgeServerDescriptor.class,
+ new String[] {"@type bridge-server-descriptor 1.2"},
+ Integer.valueOf(13)}
+ });
+ }
+
+ private int expDescCount;
+ private int annoCount;
+ private String[] annos;
+ private String filename;
+ private File fileForName;
+ private Class descClass;
+ private Iterator<Descriptor> descs;
+
+ /** This constructor receives the above defined data for each run. */
+ public DescriptorTest(String fn, Class clazz, String[] annos,
+ int expDescCount) throws Exception {
+ this.filename = fn;
+ this.fileForName = new File(fn);
+ this.expDescCount = expDescCount;
+ this.annos = annos;
+ this.annoCount = annos.length;
+ this.descClass = clazz;
+ this.descs = DescriptorSourceFactory.createDescriptorParser()
+ .parseDescriptors(bytesFromResource(), fileForName, filename)
+ .iterator();
+ }
+
+ @Test
+ public void testCounts() throws Exception {
+ int descCount = 0;
+ while (descs.hasNext()) {
+ Descriptor desc = descs.next();
+ descCount++;
+ assertEquals(filename + ": Invalid annotation count.",
+ annoCount, desc.getAnnotations().size());
+ }
+ assertEquals("Content of " + filename + ".", expDescCount, descCount);
+ }
+
+ @Test
+ public void testNewline() throws Exception {
+ while (descs.hasNext()) {
+ Descriptor desc = descs.next();
+ byte[] raw = desc.getRawDescriptorBytes();
+ assertEquals(filename + ": Newline missing.", '\n', raw[raw.length - 1]);
+ }
+ }
+
+ @Test
+ public void testTypes() throws Exception {
+ while (descs.hasNext()) {
+ Descriptor desc = descs.next();
+ assertTrue(filename + ": Expected " + descClass.getName()
+ + ", but received: "
+ + Arrays.toString(desc.getClass().getInterfaces()),
+ Arrays.asList(desc.getClass().getInterfaces()).contains(descClass));
+ }
+ }
+
+ @Test
+ public void testAnnotations() throws Exception {
+ while (descs.hasNext()) {
+ Descriptor desc = descs.next();
+ for (String anno : annos) {
+ assertTrue(filename + ": Annotation '" + anno + "' missing in "
+ + Arrays.toString(annos), desc.getAnnotations().contains(anno));
+ }
+ }
+ }
+
+ private byte[] bytesFromResource() throws Exception {
+ StringBuilder sb = new StringBuilder();
+ BufferedReader br = new BufferedReader(new InputStreamReader(getClass()
+ .getClassLoader().getResourceAsStream(filename)));
+ String line = br.readLine();
+ while (null != line) {
+ sb.append(line).append('\n');
+ line = br.readLine();
+ }
+ return sb.toString().getBytes();
+ }
+
+}
diff --git a/src/test/resources/bridge/2017-07-17-17-09-00-extra-infos b/src/test/resources/bridge/2017-07-17-17-09-00-extra-infos
new file mode 100644
index 0000000..97bbea7
--- /dev/null
+++ b/src/test/resources/bridge/2017-07-17-17-09-00-extra-infos
@@ -0,0 +1,130 @@
+@type bridge-extra-info 1.3
+extra-info GreenBelt 2D79397FBBF3B020132F8C14CAB167A4D0D020F8
+master-key-ed25519 JVSrRlvB8UUP1XWS1K7QgI2wAFNm/i3tWuAMucoyK0M
+published 2017-07-17 14:16:22
+write-history 2017-07-17 13:48:29 (14400 s) 105549514752,108332138496,109085942784,87797943296,114002153472,114446906368
+read-history 2017-07-17 13:48:29 (14400 s) 103141830656,106632499200,107311380480,86068060160,111722652672,111907606528
+dirreq-write-history 2017-07-17 13:48:29 (14400 s) 2419212288,1711367168,1792053248,1741422592,2294780928,2548772864
+dirreq-read-history 2017-07-17 13:48:29 (14400 s) 111327232,101064704,67574784,67384320,103692288,114972672
+geoip-db-digest 1317BB3525E85E01FB34A89E04CE549AC23D07BD
+geoip6-db-digest 865048C69BEC02B37268BFBAD66D9729B21CFCF5
+dirreq-stats-end 2017-07-16 18:08:47 (86400 s)
+dirreq-v3-ips ru=1128,us=1128,ua=936,tr=632,de=280,gb=280,ir=192,eg=184,by=176,in=168,jp=128,br=112,fr=112,au=104,ca=104,sa=88,nl=80,es=72,id=64,it=64,mx=64,bd=56,ae=48,cn=48,ph=48,ar=40,at=32,ch=32,dz=32,fi=32,hk=32,my=32,pl=32,se=32,sg=32,za=32,??=24,co=24,hu=24,ie=24,il=24,kr=24,ma=24,pk=24,ro=24,ve=24,be=16,bg=16,cl=16,cz=16,jo=16,kz=16,ng=16,no=16,nz=16,om=16,pe=16,pt=16,qa=16,th=16,tw=16,uz=16,vn=16,af=8,al=8,ao=8,az=8,ba=8,bh=8,bj=8,bo=8,bs=8,cd=8,ci=8,ck=8,cm=8,cr=8,cu=8,cy=8,dk=8,ec=8,ee=8,et=8,fj=8,ga=8,gh=8,gp=8,gr=8,gt=8,hn=8,hr=8,ht=8,iq=8,is=8,ke=8,kg=8,kh=8,kn=8,kw=8,ky=8,lb=8,lk=8,lt=8,lu=8,lv=8,ly=8,md=8,mg=8,mk=8,ml=8,mn=8,mt=8,mv=8,na=8,np=8,pg=8,pr=8,ps=8,py=8,re=8,rs=8,rw=8,sc=8,sd=8,si=8,sk=8,sv=8,sy=8,td=8,tj=8,tm=8,tn=8,tt=8,ug=8,uy=8,ye=8,zw=8
+dirreq-v3-reqs us=2008,ru=1744,ua=1480,tr=896,gb=480,de=448,eg=256,in=256,by=240,ir=240,jp=232,au=176,br=176,ca=168,fr=168,sa=144,mx=128,es=120,nl=120,id=88,ph=88,bd=80,it=80,ae=72,cn=72,ar=64,sg=64,za=64,ch=56,dz=56,my=56,ve=56,fi=48,kr=48,pl=48,se=48,??=40,hk=40,il=40,ma=40,at=32,be=32,bg=32,co=32,hu=32,nz=32,ro=32,th=32,cl=24,cz=24,ie=24,ke=24,kz=24,lu=24,ng=24,om=24,pk=24,rs=24,tw=24,vn=24,al=16,bo=16,ci=16,cr=16,gh=16,hn=16,is=16,jo=16,no=16,np=16,pe=16,pt=16,qa=16,sk=16,tm=16,uy=16,uz=16,ye=16,af=8,ao=8,az=8,ba=8,bh=8,bj=8,bs=8,cd=8,ck=8,cm=8,cu=8,cy=8,dk=8,ec=8,ee=8,et=8,fj=8,ga=8,gp=8,gr=8,gt=8,hr=8,ht=8,iq=8,kg=8,kh=8,kn=8,kw=8,ky=8,lb=8,lk=8,lt=8,lv=8,ly=8,md=8,mg=8,mk=8,ml=8,mn=8,mt=8,mv=8,na=8,pg=8,pr=8,ps=8,py=8,re=8,rw=8,sc=8,sd=8,si=8,sv=8,sy=8,td=8,tj=8,tn=8,tt=8,ug=8,zw=8
+dirreq-v3-resp ok=11456,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=11568,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=8848,timeout=2584,running=20,min=2138,d1=57861,d2=114568,q1=139291,d3=165778,d4=213175,md=253672,d6=294514,d7=343736,q3=373096,d8=409437,d9=559533,max=4798984
+transport obfs4
+bridge-stats-end 2017-07-16 18:08:59 (86400 s)
+bridge-ips ru=6544,ua=5080,us=4792,tr=3632,gb=1488,de=1480,ir=1232,in=1104,by=1024,eg=992,fr=656,jp=560,br=472,ca=464,nl=424,au=416,sa=416,it=400,id=304,es=288,mx=280,ae=272,dz=224,bd=216,cn=200,pl=192,ph=160,se=160,my=152,ro=144,at=136,fi=136,kr=136,ar=128,ch=128,cz=128,sg=128,??=120,za=120,hk=112,pk=112,be=96,co=96,pt=96,kz=88,ve=88,hu=80,ie=80,il=80,ma=80,ye=80,cl=72,ng=72,no=72,th=72,bg=64,dk=64,jo=64,uz=64,gr=56,nz=56,om=56,qa=56,vn=56,tw=48,et=40,ke=40,lu=40,ly=40,pe=40,rs=40,tn=40,az=32,ec=32,gh=32,kw=32,sk=32,al=24,ba=24,bo=24,cr=24,ee=24,is=24,lb=24,lk=24,lt=24,lv=24,md=24,mn=24,np=24,ps=24,sd=24,si=24,tm=24,uy=24,af=16,bh=16,ci=16,do=16,ge=16,iq=16,kg=16,pr=16,re=16,sy=16,tj=16,tz=16,am=8,ao=8,as=8,aw=8,bb=8,bj=8,bm=8,bn=8,bs=8,bw=8,cd=8,cg=8,ck=8,cm=8,cu=8,cy=8,dj=8,er=8,fj=8,ga=8,gf=8,gn=8,gp=8,gt=8,gu=8,gy=8,hn=8,hr=8,ht=8,jm=8,kh=8,kn=8,ky=8,la=8,lr=8,ls=8,me=8,mg=8,mh=8,mk=8,ml=8,mm=8,mo=8,mq=8,mr=8,mt=8,mu=8,mv=8,mz=8,na=8,ne=8,ni=8,pa=8,pf=8,pg=8,py=8,rw=8,sc=8,sn=8
,so=8,sr=8,ss=8,sv=8,td=8,tg=8,tt=8,ug=8,vc=8,vi=8,vu=8,zm=8,zw=8
+bridge-ip-versions v4=37808,v6=0
+bridge-ip-transports <OR>=8,obfs4=37808
+router-digest-sha256 NB4cM2alvoNeaOX4cYheUln/8XIDacLKjDGIlhNGZSg
+router-digest 628E6990DC129C3AC99CF592EAF2A028F244AD1F
+@type bridge-extra-info 1.3
+extra-info vvput 2AA50DFC2446BDFB26204C23EDB1ED21736C6450
+published 2017-07-17 14:18:20
+write-history 2017-07-17 13:12:38 (14400 s) 478208,567296,497664,568320,449536,525312
+read-history 2017-07-17 13:12:38 (14400 s) 5647360,6864896,4580352,5794816,5284864,5654528
+dirreq-write-history 2017-07-17 04:46:41 (14400 s) 0,0,0,0,8192,7168
+dirreq-read-history 2017-07-17 04:46:41 (14400 s) 0,0,0,0,0,0
+geoip-db-digest C1EB5237F2FBAF63381D8551157F13D12EFCCA25
+geoip6-db-digest 1F99B6B0EC78E9DB34D61AE7E0FC261D558E8E5D
+dirreq-stats-end 2017-07-17 00:46:45 (86400 s)
+dirreq-v3-ips
+dirreq-v3-reqs
+dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=0,timeout=0,running=0
+transport obfs3
+bridge-stats-end 2017-07-17 00:48:31 (86400 s)
+bridge-ips us=8
+bridge-ip-versions v4=8,v6=0
+bridge-ip-transports <OR>=8
+router-digest 99EE538101C1FAD637283271044C619E69F33927
+@type bridge-extra-info 1.3
+extra-info Unnamed 68442E1B246A3DE363E5EFA52FE2EFCD12188E91
+master-key-ed25519 ORrTGU5HLUWpuxsNWqZYgmoUHOMdc34by/CxB/pgZYs
+published 2017-07-17 14:18:38
+write-history 2017-07-17 10:28:11 (14400 s) 316416,3081216,561152,1152000,1223680,431104
+read-history 2017-07-17 10:28:11 (14400 s) 3095552,9388032,5097472,7372800,8696832,4204544
+dirreq-write-history 2017-07-16 14:48:52 (14400 s) 489472,1843200,0,691200,978944,0
+dirreq-read-history 2017-07-16 14:48:52 (14400 s) 0,86016,0,0,100352,0
+geoip-db-digest AFD609025B66305AD9FA8E0B15AF4F2BC82271F1
+geoip6-db-digest A69FD14ACE46EE695F589ACE0EB7B915285B51B4
+router-digest-sha256 T/w7NQSKelIGeBMxHvaqN1yciV014UPlxiqIzh6xW4Q
+router-digest 6C297C0FED6A298BFF7955E6B7AE4062F315A264
+@type bridge-extra-info 1.3
+extra-info surgednonmilitan 67FE03ECF1A963643B4B5545829B02B5D80E4F06
+master-key-ed25519 v60t0gbplH0EH7x6B/LADtPaVsMySHjfMum6KM5f66M
+published 2017-07-17 14:19:31
+write-history 2017-07-17 14:18:10 (14400 s) 5555200,1520640,1858560,2085888,3042304,2745344
+read-history 2017-07-17 14:18:10 (14400 s) 10706944,6148096,6189056,6151168,6643712,6276096
+dirreq-write-history 2017-07-17 12:01:04 (14400 s) 3991552,864256,656384,765952,43008,2001920
+dirreq-read-history 2017-07-17 12:01:04 (14400 s) 381952,104448,6144,27648,4096,136192
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-17 00:01:05 (86400 s)
+dirreq-v3-ips de=8,gr=8,kz=8,ru=8,ua=8
+dirreq-v3-reqs de=8,gr=8,kz=8,ru=8,ua=8
+dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=32,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=4,timeout=4,running=0
+transport obfs4
+bridge-stats-end 2017-07-17 00:01:13 (86400 s)
+bridge-ips by=8,de=8,gr=8,hk=8,ir=8,kr=8,kz=8,ru=8,ua=8,us=8
+bridge-ip-versions v4=24,v6=0
+bridge-ip-transports <OR>=16,obfs4=8
+router-digest-sha256 FhnLcLbuaWoxgTfWYHAYS30TivXLDXS8KzQS9GgQDF4
+router-digest 361209255A0CC41D4A3D5C8E57CE9B9DC8719E76
+@type bridge-extra-info 1.3
+extra-info Unnamed 2E4E258AA85A98ACFA9B138FCF07BB24F0D614A2
+master-key-ed25519 ExFcpgeUE1pYkJucC+8W5U6vudH385v4etFfBnfS7Ss
+published 2017-07-17 14:19:34
+write-history 2017-07-17 11:35:03 (14400 s) 151798784,115852288,661504,11895808,100169728,210285568
+read-history 2017-07-17 11:35:03 (14400 s) 153724928,117967872,4093952,15422464,102296576,212571136
+dirreq-write-history 2017-07-17 11:35:03 (14400 s) 2617344,3309568,13312,1969152,2119680,3956736
+dirreq-read-history 2017-07-17 11:35:03 (14400 s) 19456,37888,0,17408,50176,58368
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-17 07:29:07 (86400 s)
+dirreq-v3-ips ca=8,ir=8,kz=8
+dirreq-v3-reqs ca=8,ir=8,kz=8
+dirreq-v3-resp ok=24,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=8,timeout=12,running=0
+hidserv-stats-end 2017-07-17 07:29:07 (86400 s)
+hidserv-rend-relayed-cells -419 delta_f=2048 epsilon=0.30 bin_size=1024
+hidserv-dir-onions-seen -21 delta_f=8 epsilon=0.30 bin_size=8
+transport scramblesuit
+transport obfs3
+transport obfs4
+bridge-stats-end 2017-07-17 07:29:17 (86400 s)
+bridge-ips ca=8,cl=8,ir=8,kz=8,ru=8,tr=8
+bridge-ip-versions v4=16,v6=0
+bridge-ip-transports <OR>=8,obfs3=8,obfs4=8,scramblesuit=8
+router-digest-sha256 Uqm0Ajxniq2cEpnpyFtcIXUNsXndstJEcrwgk/UzEms
+router-digest 1AB27BBC91C9C23553E03189C3828FD627551F8D
+@type bridge-extra-info 1.3
+extra-info Dallaslitai 3D4782C05C60D7D0189FDD57B3A37DB4DCD14834
+master-key-ed25519 f7SX8VP4n+oys+1P1HldxOvIVbwxp7z4FYlK+kVFvRw
+published 2017-07-17 15:19:17
+write-history 2017-07-17 14:04:30 (14400 s) 9009152,6066176,15356928,1211392,5023744,12357632
+read-history 2017-07-17 14:04:30 (14400 s) 13033472,10901504,19917824,6920192,8665088,18658304
+dirreq-write-history 2017-07-17 12:00:50 (14400 s) 1353728,624640,648192,5120,0,2026496
+dirreq-read-history 2017-07-17 12:00:50 (14400 s) 18432,0,4096,4096,0,30720
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-17 00:00:50 (86400 s)
+dirreq-v3-ips bo=8,gb=8,se=8,us=8
+dirreq-v3-reqs bo=8,gb=8,se=8,us=8
+dirreq-v3-resp ok=8,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=8,timeout=4,running=0
+transport obfs4
+bridge-stats-end 2017-07-17 00:01:00 (86400 s)
+bridge-ips bo=8,gb=8,se=8,us=8
+bridge-ip-versions v4=8,v6=0
+bridge-ip-transports <OR>=8,obfs4=8
+router-digest-sha256 TWliWLwkFCviVpBZrkmM8Xzs3eKgXgjp6GfLvl+khSs
+router-digest 7E7474F0350F5490ABD5A8189FFFE2D3698ED78A
diff --git a/src/test/resources/bridge/2017-07-17-17-09-00-server-descriptors b/src/test/resources/bridge/2017-07-17-17-09-00-server-descriptors
new file mode 100644
index 0000000..6845283
--- /dev/null
+++ b/src/test/resources/bridge/2017-07-17-17-09-00-server-descriptors
@@ -0,0 +1,206 @@
+@type bridge-server-descriptor 1.2
+router Unnamed 10.214.7.84 63922 0 0
+master-key-ed25519 wLWm/QNsQc5NDaziWGkCwJjUZHxAbxgsflQQdjNaeU8
+platform Tor 0.2.9.5-alpha on Linux
+proto 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
+published 2017-07-17 14:19:17
+fingerprint 5435 E6A9 7AB7 EEBB FC2D 58EF 6278 3134 D8C1 CE0D
+uptime 6165120
+bandwidth 1073741824 1073741824 56431
+extra-info-digest C93171F04F54A325DF42C11CED66CCB964EF37D5 MZqGs84v/c2lu6ZNZ9sQB8ttghioxGe36EBmHH3XR3A
+hidden-service-dir
+contact somebody
+ntor-onion-key 2ybekAaXbyYC0gXQRwctg9PZ8zkwl2d2TmpWrHcnVyI=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 IhUHXgdVRmyq0KcoXK2zIrs007Lsno8YX6NBuzNS/yk
+router-digest 394DABEED04CC22A3641FF21EDC2B6D4530AC48A
+@type bridge-server-descriptor 1.2
+router Unnamed 10.173.7.222 50855 0 0
+master-key-ed25519 dHZH8B+jD0HKmYvtJtY1SxnRrFYkUGYXr31buY/77/M
+platform Tor 0.2.9.9 on Linux
+proto 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
+published 2017-07-17 14:23:19
+fingerprint 27BA CCF4 A1DA B47A 65DE E83B DCBB 802F 3F1E CC56
+uptime 13819693
+bandwidth 102400 204800 125181
+extra-info-digest E04C24EBD00E7F5CADD235D0380FF9BDA11E09C6 IYdlq9+XSGBmY9vsXphd5BkYG+a9dJ6BzfdNttkO8r0
+hidden-service-dir
+ntor-onion-key zKwAUCseMtCJSTcqKLDxF4AXjO9cQXrtb8SxQmU+6V0=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 tUYJ0nqU5O/9joRdAsxEF0WjLYXNA5gbJqST47dQR+k
+router-digest 567854B649467FAD6D242FAAE1FE1B55F8BABFD5
+@type bridge-server-descriptor 1.2
+router vvput 10.2.225.7 61718 0 0
+platform Tor 0.2.5.12 on Linux
+protocols Link 1 2 Circuit 1
+published 2017-07-17 14:18:20
+fingerprint 2AA5 0DFC 2446 BDFB 2620 4C23 EDB1 ED21 736C 6450
+uptime 1690189
+bandwidth 102400 204800 10604
+extra-info-digest 99EE538101C1FAD637283271044C619E69F33927
+hidden-service-dir
+contact somebody
+ntor-onion-key MM8eovY4NIYPnj/+yQ/4H7A4SCDTFXOZ8+uhVFG7LV8=
+reject *:*
+router-digest 7582169F4C4094D788248A520C38C3197ACB5AFD
+@type bridge-server-descriptor 1.2
+router Unnamed 10.141.200.206 59729 0 0
+master-key-ed25519 FEAa0+N+l/0cfxuyP099ZS/1w3KJ46VaWLKyscU275I
+platform Tor 0.3.0.9 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2017-07-17 15:18:44
+fingerprint E0DE 3BB7 195A 5756 9DF1 8D05 E90E A8F6 5268 A1A5
+uptime 1218611
+bandwidth 1073741824 1073741824 433403
+extra-info-digest 9345483248DB56263B0CB1937FD46BFB8CEAD0AB UY6Ecjk6zy91OZ5zfRUtP+DoG+DeJYcI7y+tNBtWkGQ
+hidden-service-dir
+ntor-onion-key CjwW4c7Kiae+xhm3yeqeCnp3oM6kZexvK1tENh9cdXk=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 +Jtn5rZxh376uOD9HD+ROlGi4wGIJYBmZ94KH3ux4R0
+router-digest B9E1393AD468A80B66219FDE3820B0843CFB7896
+@type bridge-server-descriptor 1.2
+router labionasalquotat 10.223.117.137 60614 0 0
+master-key-ed25519 O3sakRYUUIpEZA0r+Tuh6uXnloJuu2kGrU0c3U3Vi2o
+platform Tor 0.2.8.11 on Linux
+protocols Link 1 2 Circuit 1
+published 2017-07-17 15:18:47
+fingerprint 66E2 C927 A387 6D1A 9E5E 0409 2E6C 4268 82BD 45CA
+uptime 1523656
+bandwidth 1073741824 1073741824 489107
+extra-info-digest C9817F6E48872AED46FFFF7201DF0654A1405B9E SaARUXVrZRjhEBeyr2VwwwXd+f77wkRzappN1z3NJpc
+hidden-service-dir
+ntor-onion-key /rnFCLsexH+1PBcUqnGTOb8gHUl9deA5UwNhRKaOCVU=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 hf+K0N5hfKZBhcdl+RyA3l/7zb+ON4TncULJ3QMW0VE
+router-digest 1450A5A9AB8EAD5D69887CFA799EA2EDDC44F719
+@type bridge-server-descriptor 1.2
+router embrazureStreete 10.19.147.51 52583 0 0
+master-key-ed25519 FuZxqdnD/jgBfDMwiVIbY1SXJyhtynwwrrY1izXUT0I
+platform Tor 0.2.9.11 on Linux
+proto 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
+published 2017-07-17 15:18:52
+fingerprint C26A EB76 7A1F C754 22C4 10B1 3D65 8102 2611 08A3
+uptime 1523858
+bandwidth 1073741824 1073741824 56969
+extra-info-digest 7D006BE517852D43B3C23AB5816D817A829A8556 76UauAfB3rhhYjSS69zXq/W25Qql/V7hCY3y79dvLDE
+hidden-service-dir
+ntor-onion-key 5cxoIw4KATglAaO7bq4uquzBoNsuwmpeg4SsWZ6hEHQ=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 UZPJNJ7rb4fmi5TTaV66lFOIcI7mm3xWWjF1196hN4A
+router-digest BC910B1EE87B3EA158C552FCFF341F0353BBE6DF
+@type bridge-server-descriptor 1.2
+router StabTheBeast 10.141.90.219 61086 0 0
+platform Tor 0.2.5.12 on Linux
+protocols Link 1 2 Circuit 1
+published 2017-07-17 15:19:03
+fingerprint 819F 5E1E BDC5 5D55 43FC 47CC E5A5 EE1C 3445 328E
+uptime 11207286
+bandwidth 51200 102400 55546
+extra-info-digest 318739B651B7877FDDED17320E71423729094A56
+hidden-service-dir
+ntor-onion-key cKxSw4lynCyBs4ebs8sYFhpBJ1NI8/u+726ALcF7G2k=
+reject *:*
+router-digest 9D5F856A1559887AA06A1E75431D4A97FE5AF740
+@type bridge-server-descriptor 1.2
+router zumbooruckhonori 10.151.105.23 56942 0 0
+master-key-ed25519 04T6yloWrsZzkflSITR/LVT1sS/wgcl67dcDAodABfs
+platform Tor 0.2.9.11 on Linux
+proto 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
+published 2017-07-17 15:19:06
+fingerprint 47FC 0EC8 E954 CE57 22EB 8C98 C160 164C 49B9 C44C
+uptime 1437494
+bandwidth 1073741824 1073741824 428587
+extra-info-digest AA617995E8936056368306558BA2B7A0D45CBE50 4X3cjdjsW3iiYC9O9aY01QqVYNmHWvi+wdeB3fzGcpE
+hidden-service-dir
+ntor-onion-key m0a+ANZLdekEQ8achmxjG3BeNZo5hqJ8pjH/K9PiyBA=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 cfIvFcbdbtR87HgbRmWfmRnn3xMoP4N+4p2gC+yokGI
+router-digest 73B6117AC4CF56CA39D0B1725E41F357224C6386
+@type bridge-server-descriptor 1.2
+router Dallaslitai 10.90.13.82 60498 0 0
+master-key-ed25519 f7SX8VP4n+oys+1P1HldxOvIVbwxp7z4FYlK+kVFvRw
+platform Tor 0.2.9.11 on Linux
+proto 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
+published 2017-07-17 15:19:17
+fingerprint 3D47 82C0 5C60 D7D0 189F DD57 B3A3 7DB4 DCD1 4834
+uptime 1522275
+bandwidth 1073741824 1073741824 161213
+extra-info-digest 7E7474F0350F5490ABD5A8189FFFE2D3698ED78A TWliWLwkFCviVpBZrkmM8Xzs3eKgXgjp6GfLvl+khSs
+hidden-service-dir
+ntor-onion-key g3lMaB77v+OOPRaMZ5U7n6quaMAV/DJ4aq4isW9Ufxk=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 YR+is/xTBxt74b6ipMEx8DpW5D0VPiH7UwIapVz2v7w
+router-digest F66E4306BBAAFC6207D40F147EFFA18CC9DCC941
+@type bridge-server-descriptor 1.2
+router default 10.28.101.103 56333 0 0
+or-address [fd9f:2e19:3bcf::e2:ad7c]:56333
+master-key-ed25519 0jsj6BCIYe7RH442qcGy6rW4cd3DG0mwHJRwDHWfQOA
+platform Tor 0.3.0.9 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2017-07-17 15:19:13
+fingerprint 04AF 15D4 9715 7A68 1D07 861A 384B 84F1 2CD4 710E
+uptime 1278252
+bandwidth 512000 716800 573733
+extra-info-digest EF4EF5CF77507AE66B2592E78D2C105824B3B906 5/FiB4hadVIO+TInyJGJc+pZMFnx6bCxOJWLoNXL7QM
+hidden-service-dir
+ntor-onion-key 62OZlr5l1SPXPmqWAS45T3bKuU4uxyKaYYSPiQPPMis=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 fh4ECi75FWmq9k21LM/SzC9g3ScxXJtyxI2CdW3oNMA
+router-digest 249286501104CBDDE4A78E469ED16CDBA1A1F5FF
+@type bridge-server-descriptor 1.2
+router retroactivitiesu 10.236.253.124 59990 0 0
+master-key-ed25519 wltPG3NCAAtHuNKbP3p1oDhoWZbSAEu/XUP3E1hONiM
+platform Tor 0.2.9.11 on Linux
+proto 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
+published 2017-07-17 15:19:13
+fingerprint 87EB B1FA 5FC4 0BED 35D0 0020 E250 5EBE 4648 033E
+uptime 1412261
+bandwidth 1073741824 1073741824 7823
+extra-info-digest DC13C130880A5A78B70185B84DE82081A19B79ED sWiuxK6qJahAm/WEV+/Ibs7mllufi+hk0kOJEyQyxCI
+hidden-service-dir
+ntor-onion-key o1plYeCh/ShOaq24g7bCny407FP6G9kuTiDx9lb1qgA=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 rYfYI/wNg2ht2N/xGBr7+EtE6u196vheQLXP0DvSfPc
+router-digest EECC37EAA79AD11C8C1889BC71789D7ABB37E592
+@type bridge-server-descriptor 1.2
+router Unnamed 10.58.102.162 65136 0 0
+master-key-ed25519 f8Ey4lWrG2vHj57T2oVXtBZ6sHaZWJFa6w3RUrAoDRE
+platform Tor 0.3.0.7 on Linux
+proto Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2017-07-17 15:19:14
+fingerprint D5F0 8EC9 E12E EADA DAC4 E0DE 6C57 B96E 11B2 65B7
+uptime 4774907
+bandwidth 1073741824 1073741824 867280
+extra-info-digest A0652B61E20A1AF92E8CB9622EE78DC5592028AD jos5KloKLVWXBzZHefJ4ZdbkSgTDJonnw2usFs267Ic
+hidden-service-dir
+contact somebody
+ntor-onion-key YrRlhf0ZAk6BzxJU1PY0V05Vt5+3qhsAH2ez/yfyj24=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 asrYJlmBn2x5JkiiKGUjY4+KMxA8IuLhzrMwt1F3iM0
+router-digest E2DDBD65EB9BBE14E461D13C9D5C1192245A735B
+@type bridge-server-descriptor 1.2
+router adjuvantvarious 10.235.98.118 54385 0 0
+master-key-ed25519 5bxet6FKxUXTfkcCl4YCFFrGKojAHc8aG3dg7Qje8S8
+platform Tor 0.2.9.11 on Linux
+proto 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
+published 2017-07-17 15:19:15
+fingerprint 76B0 98AF 4E22 3CFC F393 35E4 4602 08FB 17EF 92C5
+uptime 1523715
+bandwidth 1073741824 1073741824 319897
+extra-info-digest BAC5BC5E0E4B167D093FEA65D42E3395715AF2C3 QJAB1qx3bhI/oGMquE3U1zaUuuzz7bBTneM7qhkgjdM
+hidden-service-dir
+ntor-onion-key 95UBL5WZoFY3bo2kH7aWan+hOX41FWZxECOjzBUyrT0=
+reject *:*
+tunnelled-dir-server
+router-digest-sha256 +cebf7eM5MDGyRfSnupGZvWoRiGU542Uu+ZUKYNlvKI
+router-digest 05E3691247D581FDAFF73FF36A34A364AA2FFE7B
diff --git a/src/test/resources/bridge/20170717-170645-1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1 b/src/test/resources/bridge/20170717-170645-1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1
new file mode 100644
index 0000000..94b7f57
--- /dev/null
+++ b/src/test/resources/bridge/20170717-170645-1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1
@@ -0,0 +1,216 @@
+@type bridge-network-status 1.2
+published 2017-07-17 17:06:45
+flag-thresholds stable-uptime=1530324 stable-mtbf=6168885 fast-speed=55000 guard-wfu=46.159% guard-tk=691200 guard-bw-inc-exits=387000 guard-bw-exc-exits=387000 enough-mtbf=1 ignoring-advertised-bws=0
+fingerprint 1D8F3A91C37C5D1C4C19B1AD1D0CFBE8BF72D8E1
+r Unnamed ABsbA6yZEBiZ81impcs0zNxRyXo CyMVlader0Uyv5Pg4BHbAT74Upw 2017-07-17 15:36:07 10.158.32.104 58520 0
+s Running Stable V2Dir Valid
+w Bandwidth=11
+p reject 1-65535
+r Unnamed ACzV/+Qobny0/Tk7Jodk8cP+ME4 ddllk5vvUxzimbTAiPnN2FgcKes 2017-07-17 16:57:43 10.151.15.156 55425 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=57
+p reject 1-65535
+r Unnamed ADXqKmHijTlfCArKIkRTlJDnCVA T5j0VrDmrH4KSQxY+6pPjyyinJY 2017-07-17 16:29:03 10.228.254.115 60472 0
+s Fast Running Stable V2Dir Valid
+w Bandwidth=67
+p reject 1-65535
+r superpowerMcClel ADcEo9p09hjP3jnnRwWj8U3yj08 WMENhkbcZ+lUSEduo+9YESQQG9g 2017-07-17 14:21:40 10.86.246.29 60854 0
+s Running Stable V2Dir Valid
+w Bandwidth=8
+p reject 1-65535
+r Franciscanmalevo AEYSWTY51Ye6m5b/bNJS5YL/h8A akxy4oFolIcneluh0BsSHP8x5BA 2017-07-17 16:29:33 10.176.122.233 56193 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=60
+p reject 1-65535
+r boomierknuckleba AF9gYMFlwb/2CMtkmv5R8rxAtTU nca6APmy1Cx174sTwifWhctXszM 2017-07-17 15:06:14 10.70.103.61 57318 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=1037
+p reject 1-65535
+r Unnamed AHHm39VxDbRtU/hYO23qmxfpyzI JvQtMwtmMKNacsTD+C7YnJkHOSI 2017-07-17 03:19:26 10.225.194.70 53101 0
+s V2Dir Valid
+w Bandwidth=54
+p reject 1-65535
+r Unnamed +kAojf9FYTuLBnLf0ZkzcXuM40w z7wiPDBrkgnPcA5/OMlCTiT+MOw 2017-07-17 17:03:48 10.251.177.99 59597 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=662
+p reject 1-65535
+r arthropathiesadr +k91NisjMTI0OoVLNNEZeaIdT5c K5qQ7eM7neXT1uUq4h3eUkeYWNI 2017-07-16 22:28:04 10.127.11.187 57316 0
+s Fast Stable V2Dir Valid
+w Bandwidth=137
+p reject 1-65535
+r Unnamed +lcbndJRkwY29dxR5+oE3CyQI60 JDZXpRZ30/31pavh1c4gdDQG/ys 2017-07-17 16:16:06 10.138.151.31 53706 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=183
+p reject 1-65535
+r amphetaminecinep +nuwYTiyHx8+PVQydHxT2Akwcu0 HjQQ27Spm2L3OI8D9LxPbp3G774 2017-07-17 15:06:28 10.182.103.174 52233 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=57
+p reject 1-65535
+r shovelingkopjes +xYy/IiRAE+vnsKxpBWYjbcvmgI S8qeZw2VjTijqejdq6QXvI3gQeQ 2017-07-17 16:33:03 10.115.134.144 52579 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=360
+p reject 1-65535
+r hawkeybushwhacke +yXJIp/C7J9WPgrpPx+SFqBdFq8 9IfYejp114+zagOAagQ0zsaR6uY 2017-07-17 14:48:27 10.101.94.186 64039 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=316
+p reject 1-65535
+r Unnamed +0k7evdgC2LM8zwVL7+tvRdbmDQ 9wQmt6jyLzncRB/2vrbfoRSPN+4 2017-07-17 15:00:08 10.74.190.95 62552 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=56
+p reject 1-65535
+r Air7jyl +2oWb9ZaKSmcrAfX4xhxm/LollQ nezGZw3QbeYIdMwLbz8dp2xO+Ag 2017-07-17 14:55:17 10.31.40.208 51052 0
+s Running Stable V2Dir Valid
+w Bandwidth=9
+p reject 1-65535
+r unrazedcommanded +4waD3LXF0onldT6V1uqvIWFQac ADnBJ/hircq5prcAJBrdyk/4oqQ 2017-07-17 15:42:27 10.63.109.63 52668 0
+s Running Stable V2Dir Valid
+w Bandwidth=8
+p reject 1-65535
+r Unnamed /MmbQ8ixObuLBPiBiyeXvvYlYQ0 53utvuuwHOM2wOR1/Egovplc7Pk 2017-07-17 16:48:45 10.121.209.188 50199 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=416
+p reject 1-65535
+r shriningunproduc /WjeOPRKPyoXpRzd/EDeDrABqvE beA5q600a4aJ01PCWeQAG5ggdjc 2017-07-17 15:27:43 10.210.27.178 58560 0
+s Running Stable V2Dir Valid
+w Bandwidth=9
+p reject 1-65535
+r greegreesfourche /W8yOLAqhwY488MQExY5u+xmEPU DLTHkCAIPo1kzDHNquGZFMUim+U 2017-07-17 15:43:30 10.74.195.222 55523 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=71
+p reject 1-65535
+r submanagersaceta /W+Iy0hxx0Mr9N7W2aFRoo8aDvc 8gwnmbCiqxqL7u7b2eViU05V8lc 2017-07-17 14:20:43 10.17.232.137 59561 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=134
+p reject 1-65535
+r nonintimidatingP /XP/zHfCVO2b2X/vLAefRXXR7lE iyM4qwvyHBT7vBZnr4lO/d+u5Mg 2017-07-17 16:03:16 10.151.207.67 58673 0
+s Running Stable V2Dir Valid
+w Bandwidth=7
+p reject 1-65535
+r Unnamed /XoBUnOwSS8ZLGpRyXQun4OTJ9Q 2vL6z2UpX/LK+vKrNYN9i0rEeIY 2017-07-17 15:59:24 10.56.117.44 58641 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=1663
+p reject 1-65535
+r Unnamed /ZvY1pg+h3dQ2HQuyHUgIDE2TIg +TiYLQtCqwoJlOH8Cs1bvoT1aXE 2017-07-17 14:04:57 10.127.8.248 51042 0
+s Fast Stable V2Dir Valid
+w Bandwidth=58
+p reject 1-65535
+r adobesYamoussouk /a9cTZcWYDQabdsjiFyzpAmG/J8 ccKrVEf6LDZy7f/qNz4tchWmfj4 2017-07-17 15:14:24 10.194.212.136 65257 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=111
+p reject 1-65535
+r Unnamed /biv9385WVxTAEKIbZCOP0djXJU OEJj1J2SjHJO0LQTu/AIhgzVmCE 2017-07-17 16:58:50 10.48.201.112 51351 0
+s Fast Running Stable Valid
+w Bandwidth=222
+p reject 1-65535
+r pinkMolluscoidea /bpyb9z3BMXfphOOudetf1cR4h4 hACt4yPZCUfBSVnBI2uUI1DXv/Y 2017-07-17 16:28:21 10.56.241.237 59735 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=64
+p reject 1-65535
+r nudzhesnurses /cTnObI/aLPJ5Hz7tMlda36shyQ aOUbb2aRzcqy1zKknPj3Hpy0VF8 2017-07-17 14:20:17 10.197.112.218 55802 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=910
+p reject 1-65535
+r ectomeresantinom /eB2bLdExloO9w8d7PhyOKKj5UA UXMLmjmnDiz2WCJRb/GDafv99b4 2017-07-17 14:33:21 10.3.44.12 51292 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=530
+p reject 1-65535
+r cinerarybluejean /eKBhUZipJ8vtsWbcfEcY8Ae3og wtsp18H3KODuI0zm4XfhzxWzQgs 2017-07-17 15:44:26 10.36.19.199 56546 0
+s Running Stable V2Dir Valid
+w Bandwidth=54
+p reject 1-65535
+r jacksnipescompel /ezau9TjX4HpqWxHQ2kUihSRf4I Qitzn/DbpKDvkNy3p094R41Qnqk 2017-07-17 15:44:16 10.125.226.79 50059 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=176
+p reject 1-65535
+r Unnamed /fg2tRqzK++I3UkMioMuhr3naEk I4E5JA3qeapmYZkAeSTQLfs8J1s 2017-07-17 15:02:59 10.239.90.75 53745 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=697
+p reject 1-65535
+r olderMagus /hlOx5caWWCbQEcqX8MqqvsQSGg 2Hjq0iNl0chTzCRYH8EpcHmLy+o 2017-07-17 16:23:07 10.126.229.95 65145 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=67
+p reject 1-65535
+r reemployedsmithe /jflp0xlhdpIMx4QpAmbEcPqg+Q iyc0QdcN9DBReZ9RWFb34YVqszQ 2017-07-17 16:21:58 10.143.233.101 51516 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=1077
+p reject 1-65535
+r outliersFloris /kRzVTV4QZvPKS2HenyVRgXwm6Y 8waSR1DiAy5MBzU/ud1rZiejah4 2017-07-17 16:48:32 10.109.220.71 64531 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=107
+p reject 1-65535
+r obfuscated /kUNmycjdgjmfOsRy5+5SkJILv8 xwf3o4+fqLXS0s47d0pP1KOU5pU 2017-07-17 14:37:19 10.76.104.77 64592 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=59
+p reject 1-65535
+r rasedsupernatant /oOXVDiS7hudD6Y8RzMylO5OMWc h8y4RIgFmW+/dsvNyHC/MMNLS7Q 2017-07-17 16:22:22 10.179.100.48 53248 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=734
+p reject 1-65535
+r suspicionspresci /peWJlz21gipWJe9lSyZpH1/sm8 HV/GG45cU9m+MwuxLKdI83+qaSM 2017-07-17 14:27:52 10.1.39.32 62702 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=60
+p reject 1-65535
+r soggiestgoldbric /psUJ+LLpyUzDUIaaFgIFDVSLA0 XDD9v2ldQjm5dkZw3DCI7ae2xE4 2017-07-17 17:03:37 10.246.254.96 60296 0
+s Running Stable V2Dir Valid
+w Bandwidth=9
+p reject 1-65535
+r orak1 /qbW9Iso8FWoP/1IKaW7bjDrVgE Mb9lzHQPPVsHKImYxdqDSAJri+I 2017-07-17 14:41:53 10.249.185.227 54358 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=469
+p reject 1-65535
+r Unnamed /rrmefX+kZsKmbGVysWH2zn5fxo 9S3pjUOCoKvYzk5oHgyom+T9PNE 2017-07-17 17:02:48 10.103.250.150 61659 0
+s Running Stable V2Dir Valid
+w Bandwidth=7
+p reject 1-65535
+r hatak2 /sOIskZPioSvAst2OxB/cSdQs6k 0HpDHhVviDHJxaBbhUgbyI+KSrA 2017-07-17 15:32:33 10.95.193.128 51290 0
+s Running Stable V2Dir Valid
+w Bandwidth=8
+p reject 1-65535
+r ndnop3 /sj7OA2rqdPIB5C2NORUC/XQnMo IbGg6+HzLnIA50Ixgk/XedHa8IQ 2017-07-17 15:21:46 10.3.187.208 57011 0
+s Fast V2Dir Valid
+w Bandwidth=10000
+p reject 1-65535
+r womanismssmirked /ttQciYFaUjO7GCA+P47qbHeB6g on74OFaEd6/vAG1pMPdacU9T14c 2017-07-17 15:17:40 10.104.184.233 65473 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=117
+p reject 1-65535
+r 0x000806 /ueuYKHQL7S17tZbk4Mf8tZ5kNs 4nUnoLBOx+6fktj5jFes6VF1vDY 2017-07-17 14:25:26 10.212.47.179 57986 0
+s Fast Running Stable Valid
+w Bandwidth=55
+p reject 1-65535
+r gadg3ts01 /uqtdtPuTJyXcG9a3YIxNtrF5R8 OlMKhaTZ5xFbg9wIy7mb/yypg84 2017-07-17 15:06:13 10.130.186.8 52390 0
+s Fast Running Stable V2Dir Valid
+w Bandwidth=153
+p reject 1-65535
+r wwa /vaERk55vVeE4Oo+lsy06fKG1bk PoBspURmH5ykMi/ilKW8odeZPqw 2017-07-16 21:17:55 10.247.250.35 58542 0
+s Stable Valid
+w Bandwidth=0
+p reject 1-65535
+r upheappostbus /xjBUGXhaGwB95VZcfjQAbGJ6T0 Xg7U7Aj9ndp68xbLVht7k3bYoYk 2017-07-17 15:33:52 10.224.164.30 52215 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=486
+p reject 1-65535
+r Unnamed /zBQzMzusm8cXl5WHyANFPFm5EQ BuMdGQ8nhvkuhnhCRVPEqgbZKvs 2017-07-17 16:26:04 10.19.59.68 60568 0
+s Fast Running Stable V2Dir Valid
+w Bandwidth=372
+p reject 1-65535
+r Unnamed /zx8J4i9BJD53FmX0lTa6lnToDY 1B1zuDhpSYQMC70iJGjL1gu/wNI 2017-07-17 15:09:51 10.110.58.246 52647 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=119
+p reject 1-65535
+r scroddledmetagen /2i5q0a3ndcWe305Wfyg6BMIv58 LaVtMm8A/76H16thbegUpnG5mtg 2017-07-17 16:41:38 10.15.158.240 57887 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=983
+p reject 1-65535
+r latinizedwhitefl /76DxKdbp2qR4LI96R9X3KTJxXI uR9E4Q/RvgCjAIOmlNkiwHQcgfk 2017-07-17 14:30:24 10.159.24.142 50975 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=525
+p reject 1-65535
+r theresamay /9YGA70SlPBf0lyficl9TFrJ4ZE +oLsaNaYcQbG5CmZa/3iLqoGwII 2017-07-17 15:26:58 10.104.227.148 53612 0
+s Fast HSDir Running Stable V2Dir Valid
+w Bandwidth=327
+p reject 1-65535
+r LetFreedomRing /9gX+qo28YX0NHT3TERuqNlew48 gvrGkWbaNZnakH1JOg0aF3GxriA 2017-07-17 16:37:23 10.52.212.130 60622 0
+s Fast Running V2Dir Valid
+w Bandwidth=468
+p reject 1-65535
diff --git a/src/test/resources/other/2017-07-17-17-02-00 b/src/test/resources/other/2017-07-17-17-02-00
new file mode 100644
index 0000000..cecbdec
--- /dev/null
+++ b/src/test/resources/other/2017-07-17-17-02-00
@@ -0,0 +1,178 @@
+@type tordnsel 1.0
+Downloaded 2017-07-17 17:02:00
+ExitNode 0011BD2485AD45D984EC4159C88FC066E5E3300E
+Published 2017-07-17 13:20:49
+LastStatus 2017-07-17 14:03:15
+ExitAddress 162.247.72.201 2017-07-17 14:11:38
+ExitNode F115B8EFF7BAF0A70B75248519DDDE4A926BF9CE
+Published 2017-07-17 01:46:52
+LastStatus 2017-07-17 06:03:16
+ExitAddress 103.56.207.84 2017-07-17 02:15:19
+ExitNode F13B97699EF7328A6289E5C2540560903CBC79A8
+Published 2017-07-17 10:49:41
+LastStatus 2017-07-17 11:03:14
+ExitAddress 104.218.63.73 2017-07-17 11:08:07
+ExitNode F149D45F474CBCF00DF8E4EBAE55474BD0FED2E6
+Published 2017-07-17 12:01:43
+LastStatus 2017-07-17 13:03:27
+ExitAddress 194.218.3.79 2017-07-17 13:12:12
+ExitNode F1B0F054CCA4F20A270C3BF744DCEC8A0C870C73
+Published 2017-07-17 12:19:12
+LastStatus 2017-07-17 13:03:27
+ExitAddress 65.181.123.254 2017-07-17 13:12:22
+ExitNode F1C1E92D674995B06871909C7B42E80E7A0FC7FC
+Published 2017-07-16 21:30:13
+LastStatus 2017-07-17 16:02:16
+ExitAddress 176.38.163.77 2017-07-16 22:12:44
+ExitNode F1F52A976AD14E9F8712B55050D171E9C8064202
+Published 2017-07-17 08:15:40
+LastStatus 2017-07-17 10:03:15
+ExitAddress 78.156.250.2 2017-07-17 10:10:06
+ExitNode F2560A6B20BAD283FF9CEB3109052324AA12C459
+Published 2017-07-16 21:41:57
+LastStatus 2017-07-17 16:02:16
+ExitAddress 5.77.47.142 2017-07-16 22:06:00
+ExitNode F2A1E001CCB966537AABEA2DFDF6ADAEA2C0A648
+Published 2017-07-17 06:59:04
+LastStatus 2017-07-17 08:03:14
+ExitAddress 139.59.250.10 2017-07-17 08:14:21
+ExitNode F392C1DF9E6BC6CCB15D151BFDF45CED28BE7109
+Published 2017-07-17 01:58:15
+LastStatus 2017-07-17 03:02:14
+ExitAddress 91.250.241.241 2017-07-17 03:05:14
+ExitNode F397982800B33A52B36A84AC8A777FD371E4FF84
+Published 2017-07-17 11:09:11
+LastStatus 2017-07-17 12:02:45
+ExitAddress 82.221.112.122 2017-07-17 12:11:59
+ExitNode F4E0DD37E79F3BD982180FFDC6A2CC1A3C8FF1D4
+Published 2017-07-17 14:24:59
+LastStatus 2017-07-17 15:02:15
+ExitAddress 193.150.121.66 2017-07-17 15:08:51
+ExitNode F5510F0FDBE2DBFDDEF7A9C7B1D8B2631650E97F
+Published 2017-07-17 01:41:03
+LastStatus 2017-07-17 02:03:15
+ExitAddress 147.135.210.101 2017-07-17 02:15:27
+ExitNode F62F67415625E6B53F135EEED209837A5A730FDB
+Published 2017-07-17 09:16:20
+LastStatus 2017-07-17 16:02:16
+ExitAddress 84.3.0.53 2017-07-17 10:10:14
+ExitNode F657ACB301CBAB4283F9CEC6D82ABE2FA62A398A
+Published 2017-07-17 08:12:29
+LastStatus 2017-07-17 09:03:35
+ExitAddress 77.247.181.165 2017-07-17 09:13:46
+ExitNode F65E0196C94DFFF48AFBF2F5F9E3E19AAE583FD0
+Published 2017-07-17 10:56:09
+LastStatus 2017-07-17 12:02:45
+ExitAddress 94.242.246.23 2017-07-17 12:12:08
+ExitNode F68269132718B9AA33B7C0792389C1A66F3D946B
+Published 2017-07-17 00:47:36
+LastStatus 2017-07-17 01:03:24
+ExitAddress 163.172.156.159 2017-07-17 01:09:26
+ExitNode F69D584B6F1A728E4243513616FE7E9545EE5B31
+Published 2017-07-17 14:17:41
+LastStatus 2017-07-17 15:02:15
+ExitAddress 139.162.144.133 2017-07-17 15:09:00
+ExitNode F6A358DD367B3282D6EF5824C9D45E1A19C7E815
+Published 2017-07-17 01:06:18
+LastStatus 2017-07-17 02:03:15
+ExitAddress 192.160.102.168 2017-07-17 02:15:37
+ExitNode F6E158BEBEA5D990F0470B4D6076B6372E66F2C9
+Published 2017-07-17 06:56:33
+LastStatus 2017-07-17 08:03:14
+ExitAddress 146.0.74.13 2017-07-17 08:14:30
+ExitNode F6EC98C05DD7573F89B8E7C8946AD97A3DD41516
+Published 2017-07-17 09:05:38
+LastStatus 2017-07-17 10:03:15
+ExitAddress 37.218.240.110 2017-07-17 10:11:27
+ExitNode F7447E99EB5CBD4D5EB913EE0E35AC642B5C1EF3
+Published 2017-07-17 09:55:42
+LastStatus 2017-07-17 11:03:14
+ExitAddress 199.249.223.81 2017-07-17 11:11:05
+ExitNode F929BA46C7A23B1D668B1F99A2846A21D1377AE5
+Published 2017-07-16 22:30:09
+LastStatus 2017-07-16 23:03:21
+ExitAddress 89.248.166.157 2017-07-16 23:09:49
+ExitNode F92B3CB9BBE0CB22409843FB1AE4DBCD5EFAC835
+Published 2017-07-17 09:17:23
+LastStatus 2017-07-17 10:03:15
+ExitAddress 185.104.120.4 2017-07-17 10:07:25
+ExitNode F9440BAF2941F593404D244A43D8136F0CA6777A
+Published 2017-07-17 06:14:09
+LastStatus 2017-07-17 07:03:16
+ExitAddress 130.226.169.137 2017-07-17 07:09:50
+ExitNode FA7CF34BCB4D51C7B914022EBBC2EA3A890A3D4F
+Published 2017-07-17 01:17:58
+LastStatus 2017-07-17 02:03:15
+ExitAddress 173.230.140.242 2017-07-17 02:15:47
+ExitNode FAD823A2AA7400D4A8107D7CD83050EEBB7A51FE
+Published 2017-07-17 09:54:16
+LastStatus 2017-07-17 11:03:14
+ExitAddress 195.228.45.176 2017-07-17 11:11:12
+ExitNode FB9F7BC9C9313A6E6816B922031EB77C707328D0
+Published 2017-07-17 09:27:33
+LastStatus 2017-07-17 10:03:15
+ExitAddress 73.65.60.217 2017-07-17 10:14:10
+ExitNode FBBB88FE31B18EA932B787F8BACC7DFBEDDD09D8
+Published 2017-07-17 00:01:42
+LastStatus 2017-07-17 01:03:24
+ExitAddress 163.172.136.101 2017-07-17 01:12:19
+ExitNode FC64CD763F8C1A319BFBBF62551684F4E1E42332
+Published 2017-07-17 04:01:30
+LastStatus 2017-07-17 05:03:16
+ExitAddress 149.202.98.161 2017-07-17 05:12:40
+ExitNode FCB454EAB56713C641C7A8F2E45B85E7921B9760
+Published 2017-07-16 22:23:42
+LastStatus 2017-07-16 23:03:21
+ExitAddress 89.236.34.117 2017-07-16 23:09:58
+ExitNode FCBAF979D8515E90344DC177A7B47746E8AA64A6
+Published 2017-07-17 07:50:34
+LastStatus 2017-07-17 09:03:35
+ExitAddress 104.206.237.22 2017-07-17 09:13:49
+ExitNode FCD58A1BDE2093630E454D3A1E221084D5EBCFEE
+Published 2017-07-17 12:18:39
+LastStatus 2017-07-17 15:02:15
+ExitAddress 103.27.124.82 2017-07-17 13:06:13
+ExitNode FD87D6EBBE5383B5EB339D1CB4500302CF0C1BEE
+Published 2017-07-17 09:09:44
+LastStatus 2017-07-17 10:03:15
+ExitAddress 185.10.68.119 2017-07-17 10:07:33
+ExitNode FD9EBD912154ED33DAF870FE0F3F343E59EF5BF5
+Published 2017-07-17 05:29:36
+LastStatus 2017-07-17 06:03:16
+ExitAddress 91.235.129.28 2017-07-17 06:06:45
+ExitNode FDA70EC93DB01E3CB418CB6943B0C68464B18B4C
+Published 2017-07-17 10:22:31
+LastStatus 2017-07-17 11:03:14
+ExitAddress 51.15.56.11 2017-07-17 11:14:58
+ExitNode FDB4FC238F13E7FEC99D025DB8B89A636EFC1EBC
+Published 2017-07-16 23:28:01
+LastStatus 2017-07-17 00:02:24
+ExitAddress 144.217.161.119 2017-07-17 00:09:47
+ExitNode FE29C99CF1415BB9B50A9CBBA81E53C81DF34421
+Published 2017-07-17 14:45:16
+LastStatus 2017-07-17 15:02:15
+ExitAddress 176.9.140.145 2017-07-17 15:09:09
+ExitNode FE3587D12AACD55486E7024A5EC8CE0994643BA0
+Published 2017-07-17 11:29:43
+LastStatus 2017-07-17 12:02:45
+ExitAddress 193.70.56.25 2017-07-17 12:08:47
+ExitNode FE3CB742E73674F1BC2382723209ECEE44AD4AEC
+Published 2017-07-17 07:16:59
+LastStatus 2017-07-17 08:03:14
+ExitAddress 77.250.227.12 2017-07-17 08:06:44
+ExitNode FE67A1BA4EF1D13A617AEFB416CB9E44331B223A
+Published 2017-07-17 11:29:04
+LastStatus 2017-07-17 12:02:45
+ExitAddress 178.32.53.94 2017-07-17 12:08:55
+ExitNode FF3A6898F1348224E6ABA8B8E98F15770E5DD362
+Published 2017-07-17 12:10:21
+LastStatus 2017-07-17 13:03:27
+ExitAddress 96.43.142.139 2017-07-17 13:08:19
+ExitNode FFB94702D023B6F824D8B3BC68F33EA02AFA70D8
+Published 2017-07-17 09:08:19
+LastStatus 2017-07-17 10:03:15
+ExitAddress 51.15.39.2 2017-07-17 10:07:42
+ExitNode FFCF1FD04F46C429712AC7A04BB442CAD46B255B
+Published 2017-07-17 04:57:12
+LastStatus 2017-07-17 06:03:16
+ExitAddress 209.249.180.198 2017-07-17 06:06:56
diff --git a/src/test/resources/other/op-nl-5242880-2017-07-17.tpf b/src/test/resources/other/op-nl-5242880-2017-07-17.tpf
new file mode 100644
index 0000000..2fd3637
--- /dev/null
+++ b/src/test/resources/other/op-nl-5242880-2017-07-17.tpf
@@ -0,0 +1,8 @@
+@type torperf 1.1
+BUILDTIMES=0.0700001716614,0.130000114441,0.22000002861 CIRC_ID=24288 CONNECT=1500330235.24 DATACOMPLETE=1500330249.38 DATAPERC0=1500330236.87 DATAPERC10=1500330238.21 DATAPERC100=1500330249.38 DATAPERC20=1500330239.39 DATAPERC30=1500330240.61 DATAPERC40=1500330241.91 DATAPERC50=1500330243.03 DATAPERC60=1500330244.30 DATAPERC70=1500330245.55 DATAPERC80=1500330246.78 DATAPERC90=1500330248.02 DATAREQUEST=1500330236.48 DATARESPONSE=1500330236.87 DIDTIMEOUT=0 ENDPOINTLOCAL=localhost:127.0.0.1:44134 ENDPOINTPROXY=localhost:127.0.0.1:48833 ENDPOINTREMOTE=v735flgeypua6lrf.onion:0.0.0.0:80 FILESIZE=5242880 HOSTNAMELOCAL=op-nl HOSTNAMEREMOTE=op-nl LAUNCH=1500329937.85 NEGOTIATE=1500330235.24 PATH=$C8C65A613A771CAD3600B52B3552318B0946AD5D,$AD3B9A4A2E76708C3077047D9C3559A1BCC63528,$A2DB293FFC5A76A718863BF1AEDBC8DFB1CB1097 QUANTILE=0.8 READBYTES=5242950 REQUEST=1500330235.24 RESPONSE=1500330236.48 SOCKET=1500330235.23 SOURCE=op-nl SOURCEADDRESS=37.218.247.40 START=1500330235.23 TIMEOUT=1500 USE
D_AT=1500330249.5 USED_BY=48052 WRITEBYTES=55
+@type torperf 1.1
+BUILDTIMES=0.170000076294,0.22000002861,0.740000009537 CIRC_ID=24267 CONNECT=1500328135.23 DATACOMPLETE=1500328192.65 DATAPERC0=1500328136.98 DATAPERC10=1500328140.98 DATAPERC100=1500328192.65 DATAPERC20=1500328144.04 DATAPERC30=1500328150.88 DATAPERC40=1500328157.71 DATAPERC50=1500328161.13 DATAPERC60=1500328165.29 DATAPERC70=1500328170.55 DATAPERC80=1500328178.30 DATAPERC90=1500328188.01 DATAREQUEST=1500328135.90 DATARESPONSE=1500328136.98 DIDTIMEOUT=0 ENDPOINTLOCAL=localhost:127.0.0.1:44016 ENDPOINTPROXY=localhost:127.0.0.1:48833 ENDPOINTREMOTE=37.218.247.40:37.218.247.40:80 FILESIZE=5242880 HOSTNAMELOCAL=op-nl HOSTNAMEREMOTE=op-nl LAUNCH=1500327894.85 NEGOTIATE=1500328135.23 PATH=$1D3F937E2053E58C18E18D43FA5153E2A9F4DC77,$51E1CF613FD6F9F11FE24743C91D6F9981807D82,$9D6AE1BD4FDF39721CE908966E79E16F9BFCCF2F QUANTILE=0.8 READBYTES=5242950 REQUEST=1500328135.24 RESPONSE=1500328135.90 SOCKET=1500328135.23 SOURCE=op-nl SOURCEADDRESS=37.218.247.40 START=1500328135.23 TIMEOUT=1500 USED_AT
=1500328192.66 USED_BY=48008 WRITEBYTES=55
+@type torperf 1.1
+BUILDTIMES=0.0600001811981,0.0800001621246,0.200000047684 CIRC_ID=23770 CONNECT=1500270535.13 DATACOMPLETE=1500270545.04 DATAPERC0=1500270535.69 DATAPERC10=1500270536.93 DATAPERC100=1500270545.04 DATAPERC20=1500270537.49 DATAPERC30=1500270538.15 DATAPERC40=1500270538.87 DATAPERC50=1500270540.55 DATAPERC60=1500270541.43 DATAPERC70=1500270542.22 DATAPERC80=1500270542.85 DATAPERC90=1500270543.78 DATAREQUEST=1500270535.44 DATARESPONSE=1500270535.65 DIDTIMEOUT=0 ENDPOINTLOCAL=localhost:127.0.0.1:41842 ENDPOINTPROXY=localhost:127.0.0.1:48833 ENDPOINTREMOTE=37.218.247.40:37.218.247.40:80 FILESIZE=5242880 HOSTNAMELOCAL=op-nl HOSTNAMEREMOTE=op-nl LAUNCH=1500268494.85 NEGOTIATE=1500270535.14 PATH=$46F9D4794916F9DD33D8FD89B1670787589BF3B8,$B05BB43B0096AA7B9ABCA529FD6BAD08AD8E420F,$B6718125C43ECA2E5011B3C681BB6638617A9686 QUANTILE=0.8 READBYTES=5242950 REQUEST=1500270535.14 RESPONSE=1500270535.44 SOCKET=1500270535.13 SOURCE=op-nl SOURCEADDRESS=37.218.247.40 START=1500270535.13 TIMEOUT=1500 USED
_AT=1500270545.04 USED_BY=47079 WRITEBYTES=55
+@type torperf 1.1
+BUILDTIMES=0.69000005722,0.980000019073,1.32000017166 CIRC_ID=24137 CONNECT=1500313135.20 DATACOMPLETE=1500313187.02 DATAPERC0=1500313138.93 DATAPERC10=1500313145.04 DATAPERC100=1500313187.02 DATAPERC20=1500313149.70 DATAPERC30=1500313152.08 DATAPERC40=1500313154.88 DATAPERC50=1500313159.13 DATAPERC60=1500313164.07 DATAPERC70=1500313168.69 DATAPERC80=1500313173.73 DATAPERC90=1500313179.65 DATAREQUEST=1500313138.52 DATARESPONSE=1500313138.93 DIDTIMEOUT=0 ENDPOINTLOCAL=localhost:127.0.0.1:43432 ENDPOINTPROXY=localhost:127.0.0.1:48833 ENDPOINTREMOTE=v735flgeypua6lrf.onion:0.0.0.0:80 FILESIZE=5242880 HOSTNAMELOCAL=op-nl HOSTNAMEREMOTE=op-nl LAUNCH=1500312130.85 NEGOTIATE=1500313135.20 PATH=$98D10461F6EDF13780D20D7E402E67F40C5ADBD9,$3E50CBCA98A20F637BC4551FD4F132D062DB9A51,$FDAC8BA3ABFCC107D1B1EAC953F195BEEBA7FF54 QUANTILE=0.8 READBYTES=5242950 REQUEST=1500313135.21 RESPONSE=1500313138.52 SOCKET=1500313135.20 SOURCE=op-nl SOURCEADDRESS=37.218.247.40 START=1500313135.20 TIMEOUT=1500 USED_
AT=1500313187.13 USED_BY=47762 WRITEBYTES=55
diff --git a/src/test/resources/relay/2017-07-17-17-00-00-consensus b/src/test/resources/relay/2017-07-17-17-00-00-consensus
new file mode 100644
index 0000000..985a4a7
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-00-00-consensus
@@ -0,0 +1,148 @@
+@type network-status-consensus-3 1.0
+network-status-version 3
+vote-status consensus
+consensus-method 26
+valid-after 2017-07-17 17:00:00
+fresh-until 2017-07-17 18:00:00
+valid-until 2017-07-17 20:00:00
+voting-delay 300 300
+client-versions 0.2.4.27,0.2.4.28,0.2.4.29,0.2.5.12,0.2.5.13,0.2.5.14,0.2.6.11,0.2.6.12,0.2.7.6,0.2.7.7,0.2.7.8,0.2.8.9,0.2.8.10,0.2.8.11,0.2.8.12,0.2.8.13,0.2.8.14,0.2.9.9,0.2.9.10,0.2.9.11,0.3.0.2-alpha,0.3.0.3-alpha,0.3.0.4-rc,0.3.0.5-rc,0.3.0.6,0.3.0.7,0.3.0.8,0.3.0.9,0.3.1.1-alpha,0.3.1.2-alpha,0.3.1.3-alpha,0.3.1.4-alpha
+server-versions 0.2.4.27,0.2.4.28,0.2.4.29,0.2.5.12,0.2.5.13,0.2.5.14,0.2.6.11,0.2.6.12,0.2.7.6,0.2.7.7,0.2.7.8,0.2.8.9,0.2.8.10,0.2.8.11,0.2.8.12,0.2.8.13,0.2.8.14,0.2.9.9,0.2.9.10,0.2.9.11,0.3.0.7,0.3.0.8,0.3.0.9,0.3.1.2-alpha,0.3.1.3-alpha,0.3.1.4-alpha
+known-flags Authority BadExit Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2
+params CircuitPriorityHalflifeMsec=30000 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 pb_disablepct=0 usecreatefast=0
+shared-rand-previous-value 7 3mrGAK8IVzYs6VgBx1U2wZ0oIF5nYkvqQgoW53ej7Qc=
+shared-rand-current-value 8 dtkrG/tHYPJ0MkSajToD5++nX0nyfnPUTF2dBydL1j0=
+dir-source dannenberg 0232AF901C31A04EE9848595AF9BB7620D4C5B2E dannenberg.torauth.de 193.23.244.244 80 443
+contact Andreas Lehner
+vote-digest 6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601
+dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443
+contact Peter Palfrader
+vote-digest 6C4446DF8A01AE204551FE1544188DA2F0A540CC
+dir-source longclaw 23D15D965BC35114467363C165C4F724B64B4F66 199.254.238.53 199.254.238.53 80 443
+contact Riseup Networks <collective at riseup dot net> - 1nNzekuHGGzBYRzyjfjFEfeisNvxkn4RT
+vote-digest 8C4B18B91AEEE74C9688C1F3300D61D1DD2E1636
+dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80
+contact 4096R/1E8BF34923291265 Linus Nordberg <linus(a)nordberg.se>
+vote-digest 7E6F19A044C67AEA317847B196E4631705D7F9FD
+dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101
+contact 1024D/28988BF5 arma mit edu
+vote-digest 886FFD31F967E311A86F4DBE62E53FF83DB72823
+dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443
+contact 1024R/8D56913D Alex de Joode <adejoode(a)sabotage.org>
+vote-digest 9A8AC7E30D574A0C86F3C92DDD556634B291E33F
+dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 131.188.40.189 131.188.40.189 80 443
+contact 4096R/261C5FBE77285F88FB0C343266C8C2D7C5AA446D Sebastian Hahn <tor(a)sebastianhahn.net> - 12NbRAjAG5U3LLWETSF7fSTcdaz32Mu5CN
+vote-digest 726F46827A08509F5776DD607A494E625CDC2A9D
+dir-source Faravahar EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 154.35.175.225 154.35.175.225 80 443
+contact 0x0B47D56D Sina Rabbani (inf0) <sina redteam net>
+vote-digest 8D7FD8D17E57A14CD654C28C65C1B2ECA4F3D66D
+r Sepiidae /4IeeAQ+whWfyCMWt1SWFTxf9Hs B57tNvqnFFUSEBMKTbsgm1vFZ3g 2017-07-17 09:37:18 71.238.214.21 9001 0
+s Fast Running Valid
+v Tor 0.2.5.14
+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=655
+p reject 1-65535
+r MehlTor1 /4fknvMweLBKXeJqrhcN34uuE58 RhnuSGNdWK5ivlsD7G8v7GDfOqE 2017-07-17 14:29:15 188.68.36.209 59001 59030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.2.5.14
+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=2280
+p reject 1-65535
+r weiner //DRJmufk5GRKETm0fz2ctgvuOA Jw2aiu8SvtV5v3nY4c1YEQxNeUM 2017-07-17 14:17:32 50.7.178.98 443 80
+s Fast Running Stable V2Dir Valid
+v Tor 0.2.9.11
+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=19400
+p reject 1-65535
+r enam1ak //ShIPvHp4qbk7U1/RzFvsrum+U ANY9f5unsgGFiZWM7XbikDWfAYw 2017-07-17 04:53:18 37.120.169.95 9001 9030
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.10
+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=1570
+p reject 1-65535
+r ddetor2 //eMRLpua291JQlbvhTvfL64l0Q 384z05/v404kBt6Aeqph6fbCHFw 2017-07-17 11:54:02 85.10.196.9 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.11
+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=2960
+p reject 1-65535
+directory-footer
+bandwidth-weights Wbd=0 Wbe=0 Wbg=4085 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 Wem=10000 Wgb=10000 Wgd=0 Wgg=5915 Wgm=5915 Wmb=10000 Wmd=0 Wme=0 Wmg=4085 Wmm=10000
+directory-signature 0232AF901C31A04EE9848595AF9BB7620D4C5B2E 70A6DDEB6B42FD0714B8F91F3F6B366CECF4E8B9
+-----BEGIN SIGNATURE-----
+ZWGlQRmto7j8mEdSXm4vjSHW+u+TceKFxdDZC8HG/p6yosDLEqMj+9Cq968VeE+x
+06LIuvUCtUpijIZoDX4HhHcx+Y7buBxvczkf4GNZxIGsYVQofEiWh5H1wbdc5Jpj
+w281Jn9k6uFv5BSGwydyLpokZyEHnsUXpKaaOFXSz9frQctzzSnyJvo+NRaxDVRH
+MkobSer8g5hTrY+jAqiMDt9HnCI7uB3Mc21DLcB/dGIngOZx+fkQPdEg0TZWfmoQ
+vTtf0U4hSfHkGmi90gH8q99Cw5oU6ia+kRTOtpQe7Qk9bAtJbG+3XGIayl5sDtBD
+ms5UdJTokgLqg2Fqy2fcow==
+-----END SIGNATURE-----
+directory-signature 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 8738EBDF44CD72B25FE20F8901290E0573950A56
+-----BEGIN SIGNATURE-----
+ab1jVkNRVopFhUiBESZQi0nUban17Z3VLL9AvFtIuSMWkRweIgD5XQv4r6RwcO+b
+zh1a0e6Kt8LxYQhGlaDLsANSWDVrQolA07PYxJ7jrsoSY4lR2YtYj5CuU99Htp7R
+/ggiKRdM8gtEgZgJEluD0u0Y9levnCrxYOP2tiQ5PDuQnCRrW/wbmCgHFyed/G96
+YScMIusiF6+PIFFJC6T2m6HvEDBQKeP4eypPJG289XCxWMQYp2C0v4JJkjnEK0B2
+E9E2Cyw33kVNuvMq68ss+tXdXKyzsIhhZBJYruSZEOHQCfZ5OVLijp3BQIDCYOdB
+wWBCEc4Y2LVlKvjzyo9ekS+PBGAHP8HVbPUNtt986ru/x8V3j0VHcKfH90DAit6s
+me6emNDWg1id/mvV8Oo56hi0ikdgJnIfFpK1HFsKf35cTSMpia9oaoZf+qi2Usn+
++zE7gc4orWmxlpl0IPKKEcEeHzBcAS7WYkpi0kJAELAvELK7doAJAWZfXYOfZtwZ
+-----END SIGNATURE-----
+directory-signature 23D15D965BC35114467363C165C4F724B64B4F66 9439CFDCFD0FCF41E6501BCD2C0151E68C30B77F
+-----BEGIN SIGNATURE-----
+VFOkG6qGvJSV1NBXof86wH00LRyqi7UxpgDJ7btzsOjBroBTOI67M/4uCKRaF/zc
++iPpou+MBle63u9hyHpiTNYihRXC9v4kbNvYdey8VIukOprg4x1m8jkTXXnw+qBI
+CMYB+n6pdHTiMf/kfB6zQGXsW60Fe3oZCFLIPT7JwEHUVqh53hMZlFRrzs97kzn7
+U5haOaJut6hlESJV+G1WIxoUjRv272Mimo9UshfL8d4/ui3+HS/X67cfJ+WOnsIT
+03bCA/WeoLrRXVROnmF87HgYJWKiXFat48DliRaCo8oovBM1w0NU3U98jQcUDiT5
+XtcrMzxhyCPKiGrDKkPaYQ==
+-----END SIGNATURE-----
+directory-signature 49015F787433103580E3B66A1707A00E60F2D15B EFB790BA79E84FE5ED90B4C1E6022904B0E9C478
+-----BEGIN SIGNATURE-----
+oxZ45ALQsJhHIjD4OVkLlG/DAUM1DaMT802eskToC6ZZC6E+pZnJbDHHQ5tpjNWG
++14iPp8giBXvIArX4hvCEn3dmT4KSad0gX7NW6kK1MzVjhbAvhVutRD6JRZMjzf1
+ol/TC9hRa6qskj6XP5Bb4bwELOT6P22iEkX+JlKcS7/sa9oBWsWiQ0lCgo35L2Jy
+K58u5yQh5akx+oytc8hCJL+xqD6VT/7O36b+g7DgfL0v4FimgbLMitGeLEPW049b
+PZQV6uoxpwWq4nplcl+d/a8l5e9bc1DEazI4zhJUeYk5xaP7pbr6hi09BR/p4HM4
+nqfo5CI6whl1TBwAozZv1w==
+-----END SIGNATURE-----
+directory-signature D586D18309DED4CD6D57C18FDB97EFA96D330566 45735762F32794C2286FEA914EE0322F04E0F36B
+-----BEGIN SIGNATURE-----
+ecolOdKH/tDDnHWhHJ680vlp8QGg98dPNqTGk+lSF1FZbjEPV9uPSRlVyKio1I0c
+QVqRBU8cZRRz0e7z5RthsCVOgvWw9uDELJUea6oqWLWZZZCHU3B05uAVlYr1tonn
+BndFD3em5mf+NF83zkfzbWMpfE06VG4tcWTepvxUALugvpQur1+ct+V2LbTi2c+8
+rQ4gCVIbi64fEn7vc9mda1AL3mjs/yTfXjLIUGWaurPJpgBEy8bBdq6to09Qe1jE
+tnNBT8c5VaQpKvZsL4p2E+oMhPX/bC3Ywk5iewaw9Ua0X/QbU2yj8cfSWQqCNz//
+79b2ui2LwMe4SF2GUQUcXw==
+-----END SIGNATURE-----
+directory-signature E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 109A865D7DBE58367C120353CBE9947EE263695A
+-----BEGIN SIGNATURE-----
+Z7XcB9BSgZJucItUgcWzvPUz5xETXS/t5p3jqvIynWC83+PnoXzomfmbNTqmu0wI
+x5DaA0owYepeIcD1MXkMZjkLt7RHk3mviPfufQjEWJ5QH8y+5OPGjPO74IITDKwl
+SUmMgPlJfrqNAna5KURp905asROT7/HuEPkF7Cg9K6mcbKcqv2ZA87t/3SnC2zBX
++YApjfpmlzsEBIhca5tFxfbWxRGfG/I2lQaYRjx0/843X6vmcJxFqvOpwCBz5UPz
+29wK+nWQymNhEZTJ+vbt3+wGptwDbGjQT9WpINsXtNS2B3/QtubXqKXHl1HF1loQ
+dYL+hXa7qtXEUKQGE7gPLA==
+-----END SIGNATURE-----
+directory-signature ED03BB616EB2F60BEC80151114BB25CEF515B226 28EB6C6635F1DB90BB60AF8B43F1676E892BB30B
+-----BEGIN SIGNATURE-----
+Yfby/Oyz6x9v7eFHp7vVgpXgw6cgYr3Q1eDwes/eXPN4F5cEj6NsmVRN7suf9ocu
+/BT8S2oEI8OHhCkDKbbMrHXM6Cd5LaGHNbWS3uKz+aW1CS3BIxTq7vs/M4V5pVJj
+mHwVYmZyTb1q3qcMzW8bGNF4z/gVsURMnWXbp97lawBrBaaP7UTVojsDV1vnyK3f
+QeXH4nIXyUIOoZBZZoids131kf0gKajKZl7YlVV+eLnZodmziCnGvfGbl0Q7I/jX
+qgaLhqkEOL3MFAtgA+2Ika6UtcKls1hghFZ4+EUJQDd76eGYdVlT0z5uTYsfcEAx
+HuHqFOf/TlRSHu5YrlMNmw==
+-----END SIGNATURE-----
+directory-signature EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 E861D5367EE5A469892D3FE6B2A25218FBA133FC
+-----BEGIN SIGNATURE-----
+Zq0gDVMMzDhkLBiPKjbVenJauLZJpSSO0KlKfsTuLveQ5OAZG32vz/QoaeJG95m5
+ACYymVeQJo5GCaL2WhNuaMMl60Gafq3Igt4kgmVKYPI8UY1+mAfQ8ztZpaL/eCGl
+L4QbGBbQ6Y66UEvKEmLM3WYUlIXze/fWqEFIynfdIVRkFoG8co9cWx7MI6Zw52DP
++jqwFf99HZV00cclpQAleWILUsgk6aNe7xLgeQGc2/YZVzo936BdmWycRhdI7N5p
+DN1hst/9yHpmPXl8+KEqkBAGvDQFFSXo5WI7DdHjNgBQkHJWcKwEY0gojqjbszd2
+lwcNoxZB9L4iPzKIDPgDbw==
+-----END SIGNATURE-----
diff --git a/src/test/resources/relay/2017-07-17-17-00-00-consensus-microdesc b/src/test/resources/relay/2017-07-17-17-00-00-consensus-microdesc
new file mode 100644
index 0000000..bcad173
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-00-00-consensus-microdesc
@@ -0,0 +1,136 @@
+@type network-status-microdesc-consensus-3 1.0
+network-status-version 3 microdesc
+vote-status consensus
+consensus-method 26
+valid-after 2017-07-17 17:00:00
+fresh-until 2017-07-17 18:00:00
+valid-until 2017-07-17 20:00:00
+voting-delay 300 300
+client-versions 0.2.4.27,0.2.4.28,0.2.4.29,0.2.5.12,0.2.5.13,0.2.5.14,0.2.6.11,0.2.6.12,0.2.7.6,0.2.7.7,0.2.7.8,0.2.8.9,0.2.8.10,0.2.8.11,0.2.8.12,0.2.8.13,0.2.8.14,0.2.9.9,0.2.9.10,0.2.9.11,0.3.0.2-alpha,0.3.0.3-alpha,0.3.0.4-rc,0.3.0.5-rc,0.3.0.6,0.3.0.7,0.3.0.8,0.3.0.9,0.3.1.1-alpha,0.3.1.2-alpha,0.3.1.3-alpha,0.3.1.4-alpha
+server-versions 0.2.4.27,0.2.4.28,0.2.4.29,0.2.5.12,0.2.5.13,0.2.5.14,0.2.6.11,0.2.6.12,0.2.7.6,0.2.7.7,0.2.7.8,0.2.8.9,0.2.8.10,0.2.8.11,0.2.8.12,0.2.8.13,0.2.8.14,0.2.9.9,0.2.9.10,0.2.9.11,0.3.0.7,0.3.0.8,0.3.0.9,0.3.1.2-alpha,0.3.1.3-alpha,0.3.1.4-alpha
+known-flags Authority BadExit Exit Fast Guard HSDir NoEdConsensus Running Stable V2Dir Valid
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+recommended-relay-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2
+params CircuitPriorityHalflifeMsec=30000 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 UseOptimisticData=1 bwauthpid=1 cbttestfreq=10 pb_disablepct=0 usecreatefast=0
+shared-rand-previous-value 7 3mrGAK8IVzYs6VgBx1U2wZ0oIF5nYkvqQgoW53ej7Qc=
+shared-rand-current-value 8 dtkrG/tHYPJ0MkSajToD5++nX0nyfnPUTF2dBydL1j0=
+dir-source dannenberg 0232AF901C31A04EE9848595AF9BB7620D4C5B2E dannenberg.torauth.de 193.23.244.244 80 443
+contact Andreas Lehner
+vote-digest 6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601
+dir-source tor26 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 86.59.21.38 86.59.21.38 80 443
+contact Peter Palfrader
+vote-digest 6C4446DF8A01AE204551FE1544188DA2F0A540CC
+dir-source longclaw 23D15D965BC35114467363C165C4F724B64B4F66 199.254.238.53 199.254.238.53 80 443
+contact Riseup Networks <collective at riseup dot net> - 1nNzekuHGGzBYRzyjfjFEfeisNvxkn4RT
+vote-digest 8C4B18B91AEEE74C9688C1F3300D61D1DD2E1636
+dir-source maatuska 49015F787433103580E3B66A1707A00E60F2D15B 171.25.193.9 171.25.193.9 443 80
+contact 4096R/1E8BF34923291265 Linus Nordberg <linus(a)nordberg.se>
+vote-digest 7E6F19A044C67AEA317847B196E4631705D7F9FD
+dir-source moria1 D586D18309DED4CD6D57C18FDB97EFA96D330566 128.31.0.34 128.31.0.34 9131 9101
+contact 1024D/28988BF5 arma mit edu
+vote-digest 886FFD31F967E311A86F4DBE62E53FF83DB72823
+dir-source dizum E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 194.109.206.212 194.109.206.212 80 443
+contact 1024R/8D56913D Alex de Joode <adejoode(a)sabotage.org>
+vote-digest 9A8AC7E30D574A0C86F3C92DDD556634B291E33F
+dir-source gabelmoo ED03BB616EB2F60BEC80151114BB25CEF515B226 131.188.40.189 131.188.40.189 80 443
+contact 4096R/261C5FBE77285F88FB0C343266C8C2D7C5AA446D Sebastian Hahn <tor(a)sebastianhahn.net> - 12NbRAjAG5U3LLWETSF7fSTcdaz32Mu5CN
+vote-digest 726F46827A08509F5776DD607A494E625CDC2A9D
+dir-source Faravahar EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 154.35.175.225 154.35.175.225 80 443
+contact 0x0B47D56D Sina Rabbani (inf0) <sina redteam net>
+vote-digest 8D7FD8D17E57A14CD654C28C65C1B2ECA4F3D66D
+r Lule /6cr1oO8L8+Yg1bmvsHkkPMT+wc 2017-07-17 04:46:03 193.11.164.243 9001 9030
+m WIxgGRG09pIU9ZJQc6mFkXy9TDBfvfhno7bkQllYSRc
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.10
+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=19000
+r proximus /88f0E9GxClxKsegS7RCytRrJVs 2017-07-17 04:57:12 209.249.180.198 9001 80
+m nthTTDbf6CKOuwq8zcYmOvr5SMvXxXizr/x60XMsVSk
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.2.5.12
+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=20400
+r ddetor2 //eMRLpua291JQlbvhTvfL64l0Q 2017-07-17 11:54:02 85.10.196.9 9001 9030
+m qyBO43PwQA2abtOfZwMJc7l/bYKyY06fBa/Ht1tXk3k
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.11
+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=2960
+directory-footer
+bandwidth-weights Wbd=0 Wbe=0 Wbg=4085 Wbm=10000 Wdb=10000 Web=10000 Wed=10000 Wee=10000 Weg=10000 Wem=10000 Wgb=10000 Wgd=0 Wgg=5915 Wgm=5915 Wmb=10000 Wmd=0 Wme=0 Wmg=4085 Wmm=10000
+directory-signature sha256 0232AF901C31A04EE9848595AF9BB7620D4C5B2E 70A6DDEB6B42FD0714B8F91F3F6B366CECF4E8B9
+-----BEGIN SIGNATURE-----
+E+42VVN3aXf8AkTuTwjsAsF9eKVWxWxcP6v/q8malxl12zuCpqlPbKAIhmdhP6NT
+ce17a4s4AjvNZVhzuQ+brLnp+JBkVbpSWkTDt87pqz6anAKdoZYHhHQhWr9KXI6X
+SnOjOlgdd4jPJyjLTtYyBPB6hntrJwVqTis617a1cA9OvcrmbL6T9q8AYkcUr7Z6
+2HTLaX5PVOQfmuaNclc+A6M8vexApbM0cnHGumF/SOPA4HS5soTUVoSnLLzw+8sD
+WJSJHmOiHy2eRME1LT5rHM6+rHW+r8qYaMSpsllRP9gkNXW9jkLqMWx4PaaZNT8g
+GjCB1BvZ/2ehihCis9dR5w==
+-----END SIGNATURE-----
+directory-signature sha256 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 8738EBDF44CD72B25FE20F8901290E0573950A56
+-----BEGIN SIGNATURE-----
+dlMZ/ATcepb6KlnZ1DSWbzp1K2itnu3LW721Nfop+Rg0GTFjyYEaqfWJEe9+iCej
+YQifus3QPuKKVjgowwReYT4H+wdSpT2lPVeK3W1/586IYuF5VrRt/snvGaV6xlOR
+uOjNi9fkCvqcsjrOyciFTnKglMZRBhYko1n7s5NglPsv3B/+ebtRc/kBXAV/37bQ
+nghGrzK0JtCGcE6b+mzRqaGfZa2sMzUiSkQAijNYzFWh5zm94gKJ6qg8zMypAdpc
+4/ub/bML4+BeWcuOnmPIBgWY5Oag7N7r03afRhihxTY3HUF3DA7nZiJNExq6Ewa5
+2U0jPKAlJynEmRU4FCciL9cpDDplq7ajys3tKalkrAU9BHtf7PeNOC9zQ7VSd0F5
+CiRjsoSyYSssjtkAq7SL/bcsNEeyIcoCY1tAOH9X32Cc3hGVL3XDcgUFwiEEpK84
+yHJ/rtj9H3oAZCKJp3M4U0DgGdVi7MO3+0Hxuq6YMVMqB3iDxWpKSSugW3bh9eDo
+-----END SIGNATURE-----
+directory-signature sha256 23D15D965BC35114467363C165C4F724B64B4F66 9439CFDCFD0FCF41E6501BCD2C0151E68C30B77F
+-----BEGIN SIGNATURE-----
+V7V3531ZIszedtrYCVg7K6pMcwHMweepIdrKNr+r69EUKECjqWSB2d/v/VM8L3RJ
+O1em7FNFHJTSKJ0BKWeqYO98vlFutgHsJLQaD/O5vOjZCG+u6iz6xm9h0FYmQvM8
+cIFWScfB7Y6nzYKt+MTVf0ZRSNvOrajZauCbzZLjP9auqHgyh47QNKIHmGLMuRtE
+UWssAuhzds3AA0KfwMXWwGRjrvHmNny8WmpZ2gWIaWEAICeHvbvi30i93LS1gW2P
+XRztg0cewPEBZkfS4Nts1lz0FbQ41KVtRzH+tYksdIZjo/cVA041AJ0iR5pbvPgF
+dUpEAISUP80p+HpHowlCMw==
+-----END SIGNATURE-----
+directory-signature sha256 49015F787433103580E3B66A1707A00E60F2D15B EFB790BA79E84FE5ED90B4C1E6022904B0E9C478
+-----BEGIN SIGNATURE-----
+Vgbl4DKgcG5acJCkQo675VrCSv4B145NXloX6NomVeXZkXFUpj10zwGdFgGSKZxI
+VAMT1Ar1mvl39hPHi5IyqEmP6O6XbqMxtaYZPaxOzs7PkWxyQqtz2yvazAp3IV1F
+OqKZome8xSe8lb0GLGMsYt+DYpvTE0fKbtE8suXAhJOBYglwZz0ha2Iv8al15Nbi
+IeL8XIg9ow3gcDD/fXjZu9aWURFwJU+Ifqa5NDJngr4fcAS6aheYL+Eh1u5Sk6Uj
+sF6UPfJa3TspHcG9mZE95/fPBuae8oDms2W+3Vc/0Mga4m8gaB6/otTKlz7icIPo
+brX8a1UikptrytfQo84xYg==
+-----END SIGNATURE-----
+directory-signature sha256 D586D18309DED4CD6D57C18FDB97EFA96D330566 45735762F32794C2286FEA914EE0322F04E0F36B
+-----BEGIN SIGNATURE-----
+BXY+0N59OdwUXQuccVU4uBrt1BPOq6xR2AhMOocw7c8ap3Fc2ra+C2WZDSvgZkcU
+sl3DOGICY97DwThhqiWNIRx49xhVrZ0JPddUtY4mfGQ71wulOLTafYQoZs5YJMd+
+deVvLUClYUMZ4fEVBDRGthPrn2/nk9qD6pXdv76ScJ159D0KA/OnBRYp/nxsjy34
+0V2qysTxvMDqblYY3M5R8wvY6FJDJVqnFC5U8zk5U4voi/+4D/dQscJxc8Gws+AN
+GYlSybALMAm4U1ADjF6Od+wjmwJHfyZzG+Lz9qsuw89GPNTq/OyU7adTYk02v2Tc
+llJ+naUHtQTQVBlAhAgz3A==
+-----END SIGNATURE-----
+directory-signature sha256 E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 109A865D7DBE58367C120353CBE9947EE263695A
+-----BEGIN SIGNATURE-----
+Jo8NP5vWnHWh0JnepK/qbFmqMo37EKbtLrecGHcaD0k042WNNek+z32c3JC5aXhJ
+b30pwRs2o7oMNtKOGeIDH3A83LMZVwQOb4VgxtHcY0UKt9w5emMLFJrmeQq9x36E
++3QEdx1kdW90IIJKIUWTjd9Deemp1quFUa/WkcJqBssXk1B1jzaSC6ztexc/G7SQ
+++s3CJmnb4rVr84Zvr4obldkgdCfOgUVT7hnQIWpJ9puCA1PzYMqlK/I/05LqoZg
+Vv2C8GJtsmAvv8H5kDhguCAYpUSWPIBwtAcCSbBOROs+0BhhJGBFNd3tHadQd1yX
+7MsYsEEBdL3Nvmm8QnU0XA==
+-----END SIGNATURE-----
+directory-signature sha256 ED03BB616EB2F60BEC80151114BB25CEF515B226 28EB6C6635F1DB90BB60AF8B43F1676E892BB30B
+-----BEGIN SIGNATURE-----
+ZESvQ3gpMO5uIPQKZm1Cm9QX+sLQebguI2ILs+iBYUWanKbPGOpGLrFNxwakIpT7
+2h3l6RDLvD/e1YGDf96QsP5nROs61TNtOiHcePRiNuFzAajNOmE9Vlpnhx/jpSdo
+4VID0Yht2G1dWS4WyRnS08BNrbLE1NA1+yUOe53eAUHoa5Qicn/37VB0KuYU8N3s
+BRv/MGC+s9cdbe4aAtA9CS84S/qmRjEbx2p+FTuK+zXfHsQ1vzQYErjmOVFThU3W
+ug+TPDfFOMX7d591VAnxkG7KAMbf/BrUMDO5Jn/K6DxHqavSO9cBMVh/q0mg/FnF
+U15V/bixpJumPxanGxYzOw==
+-----END SIGNATURE-----
+directory-signature sha256 EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 E861D5367EE5A469892D3FE6B2A25218FBA133FC
+-----BEGIN SIGNATURE-----
+WWmWdy+umgx2WpQ3FJm+rJ+y/lPicWiUFB7NOKEQATKxxShb5KzEk89cj0pL564P
+F7I7D+UjovKKFqz1j7UGnU3cziiRK4aa78aoRLxfwz7cH3UbL1mBeKsUjdnzjSBV
+v3d3Ypis8r2YVhFggWJVlFrVCXA4h5IrKN+GzF1Ur4zEzfTvqxT5A6hpX3bUhsjT
+85uDOQ4hKEdxpc3opJ1+ktjwkKtCvIFwywdARwn5F/dUbV9YcH2/GKC+n96Fsjt2
+gA1tBcXI4XfknlX/paywdgpIWn+MmgJiLHJyURluVQKnyso79pYs74PSREM9tNVt
+nVQls773btvv5MbZ3rJPIw==
+-----END SIGNATURE-----
diff --git a/src/test/resources/relay/2017-07-17-17-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601 b/src/test/resources/relay/2017-07-17-17-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601
new file mode 100644
index 0000000..b6487a4
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-00-00-vote-0232AF901C31A04EE9848595AF9BB7620D4C5B2E-6C2F5B0D52DFB3E4CA3DDEEAD690CC563CAF0601
@@ -0,0 +1,117 @@
+@type network-status-vote-3 1.0
+network-status-version 3
+vote-status vote
+consensus-methods 13 14 15 16 17 18 19 20 22 23 24 25 26
+published 2017-07-17 16:50:01
+valid-after 2017-07-17 17:00:00
+fresh-until 2017-07-17 18:00:00
+valid-until 2017-07-17 20: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 LinkAuth=1 Microdesc=1-2 Relay=2
+recommended-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+required-relay-protocols Cons=1 Desc=1 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=3-4 LinkAuth=1 Microdesc=1 Relay=1-2
+required-client-protocols Cons=1-2 Desc=1-2 DirCache=1 HSDir=1 HSIntro=3 HSRend=1 Link=4 LinkAuth=1 Microdesc=1-2 Relay=2
+known-flags Authority Exit Fast Guard HSDir Running Stable V2Dir Valid
+flag-thresholds stable-uptime=1313834 stable-mtbf=3072635 fast-speed=102000 guard-wfu=98.000% guard-tk=691200 guard-bw-inc-exits=5242000 guard-bw-exc-exits=4920000 enough-mtbf=1 ignoring-advertised-bws=0
+params CircuitPriorityHalflifeMsec=30000 NumDirectoryGuards=3 NumEntryGuards=1 NumNTorsPerTAP=100 Support022HiddenServices=0 UseNTorHandshake=1 bwauthpid=1 cbttestfreq=10 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 AAAAAFlr/gChGbYkZ1h7b27S3uvY0Q6zh7uLuSfNTePEQctWmCOhLg== AAAAAFlr/gAtxVkRrRwDU6FquobpTqjQoo9/SCNrxAOe1g7fI5IVGA==
+shared-rand-commit 1 sha3-256 14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 AAAAAFlr/gDbLjbt4yccuXLZ6gTnazcuwHNWUKnO8ZFgACwxX1/mAA== AAAAAFlr/gD3UFtNslC8Ij/kdTx7eDH22S4OlB8ijAqBDJa+HptFAw==
+shared-rand-commit 1 sha3-256 23D15D965BC35114467363C165C4F724B64B4F66 AAAAAFlr/gDeqaWwjwyxI+KtUfJZetN0yasczzexEbGhfVzsIr4P7w== AAAAAFlr/gAZ97dJs96HrFRKUyg95oNu+AVdr+07U1O3G6k0lpSofQ==
+shared-rand-commit 1 sha3-256 49015F787433103580E3B66A1707A00E60F2D15B AAAAAFlr/gC1nMCRVdHQ6hOmtPLWePzc+HreH+hwEXo/pVdy0K9a3Q== AAAAAFlr/gAITlFyXr7rLzgXqaJH26XJH3jjQQybq0GjVprvBzHnsA==
+shared-rand-commit 1 sha3-256 D586D18309DED4CD6D57C18FDB97EFA96D330566 AAAAAFlr/gAom343Uyk2qfTHibRHpMcudvqGPe+z/sNj/+zF7UTWgQ== AAAAAFlr/gBHlVzfTrYByI1PYReVeOQKQETnKmuvFkibxbbpBJYLfA==
+shared-rand-commit 1 sha3-256 E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 AAAAAFlr/gCRVXLJA11rPc5HjkgFwpjewOkmVn9PDi0XAN4q3QFj0Q== AAAAAFlr/gA61cfsdAAerlH3smAbtpqfYzw505tAR75LygbMJUfWuw==
+shared-rand-commit 1 sha3-256 ED03BB616EB2F60BEC80151114BB25CEF515B226 AAAAAFlr/gCyaAt+124KmwM8ZHteBkUcL5ucka0rA4S42QghCA4Nqw== AAAAAFlr/gAISYtExUBrGEhyFOtcSrTsk4nvR2JY/EJFOt3d0n2lVg==
+shared-rand-commit 1 sha3-256 EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 AAAAAFlr/gBNub0/fcAeM4rj7AiSYDIbpZL6JTLMoHl/lXv/il0g1g== AAAAAFlr/gDJXAppSCex4OhhQwu6iUHn379aaA4BXD3RhKc5u+1lcw==
+shared-rand-previous-value 7 3mrGAK8IVzYs6VgBx1U2wZ0oIF5nYkvqQgoW53ej7Qc=
+shared-rand-current-value 8 dtkrG/tHYPJ0MkSajToD5++nX0nyfnPUTF2dBydL1j0=
+dir-key-certificate-version 3
+fingerprint 0232AF901C31A04EE9848595AF9BB7620D4C5B2E
+dir-key-published 2017-04-23 12:40:27
+dir-key-expires 2017-10-23 12:40:27
+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-----
+MIIBCgKCAQEA1uydBiwWAR3mIx6OJlmsMBlKzcEwh31LZCRnZTgNeqNKE6wMRRBV
+8Y2cB6DlOD5+F+A+lAx4WKNp4i0QKB6aLtT8p+2WAeUonRmW+1ge6pGEaLGGNKV/
+zdfBdRJD81mi49FwBIIGDhjq/W3fLr+WWzbGtlEV4IYJ9m/LI/aK+QSIK/fVU+3z
+lXW4vxGsUnvABQR8MfSTQx4gIkSozJZp32aZdkztO/zXP2MgNjQHDUAD389LdOBT
+8wYxS3OYHZLFCug4lRFuuup79QriICXFoGdTZYqhHQxSNE2qeRo5WdPycUUume7S
+wMHjRqEqGLHio041JSHtyx5hwcJCPkb4fwIDAQAB
+-----END RSA PUBLIC KEY-----
+dir-key-crosscert
+-----BEGIN ID SIGNATURE-----
+jopp5B1j5OkYcrhCAPghmjFO347H/ehpDyrunBDKEP1q3XrDjgxPfUobnx9oGqXd
+YqJswj4YZCsCXQP3ctiyZxAEk6LpSoxg5y8KfUiWsKrJ+g4FFxivKZMgpS5HHta0
+eqApJNL+KWb5MAAcY25uBawPnVNUOmO+uJW6gsRlqA9x7YI5mbyP8Tzc3falOopU
+HlFJEM+L3qU3VGvEzp8tCA1FJL7V41JDFK37BTTp5FpIiDTGcuYr4qQ2qQyidtyV
++HC2Q6ZK52YAz1wEhxVpT+AHh1Cfk+JAjm7pfi5K0oXiBtZju/rgZV64CWkGPSDh
+rP6jr5i1mXqeaIYHdsX6+w==
+-----END ID SIGNATURE-----
+dir-key-certification
+-----BEGIN SIGNATURE-----
+EERHuxDPlAHgmbHSVRXv2lC4IGyZPAmhVuOU7eP53j8q9h1slZze+wFtdL8faVl4
+uJ2kzs6PkGa3yoNR+V9+RdxlW8gu5a6cP52QL5Zc5qpNZjugJD6Lm0ZwAaUaRx79
+WCsSyn2og/BfZpZc3nwyOeGIhcZyseKiwBKWNhm9lYIVrx0vdptq4iYmK9hAjR/P
+jg7KAllFQkVMJJBSX3Gt+DxmVYUZoCo8Cgwh39GdWMmKpGy5Js8zYJmio7o9i+a4
+eM0R0cRd156UfOliIPl+HHbZY8NA1BMxXoMubwVuUlx2BLovA3vJGVdLcnkQmE/W
+3g+tDGmjXV0mmSqVkPPsBiw+q1K6OEgrYLh4dCrRMgCoPHJSm+ZJTdWS+XdXXPjC
+4kePVs+e3BpHneZ7pIzrVFa3QTJ3o3jIlOhtVLqbW+QtPl2Cl666OMq1r0Dblcfq
+bhFrIbHVUnuFGK8rfhr2dm4JWEGV+/RDyO9vodPpGZIwAeWcw+SgtevcbnJwlpZZ
+-----END SIGNATURE-----
+r seele AAoQ1DAR6kkoo19hBAX5K0QztNw 89/EhDENc3W5LMElWhcwooFmeTE 2017-07-17 09:12:29 67.161.31.147 9001 0
+s Fast HSDir Running Stable V2Dir Valid
+v Tor 0.3.0.9
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=102
+p reject 1-65535
+id ed25519 ZtzhbIWHJpGQG+5N7hbRTtenyzq2RNJrx0QegtoY+bY
+m 13,14,15 sha256=w7JSR0fjghM7HwiVPECY3pDpiQVxPnfmbl451iEjQYQ
+m 16,17 sha256=ta1NiKe5KqFSZcJ79Nr0g6losY97LjmuHE516NCje0Q
+m 18,19,20 sha256=V7fWdMpw9Dl1sw0Dwyxa7aUFU3NgucvQzBeQq41clzk
+m 22,23,24,25,26 sha256=W897f0RpvqciCp5X0XnKw1ZC0fmQyy7GVSHd9Yu/hwg
+r CalyxInstitute14 ABG9JIWtRdmE7EFZyI/AZuXjMA4 EyrUikEaOcH2Rz2yuy6HcbgrwCI 2017-07-17 13:20:49 162.247.72.201 443 80
+s Exit Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.3.0.7
+pr Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+w Bandwidth=8569
+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 13,14,15 sha256=MwWr2NclwojM4OEs1U+GBMxaOoGMYmiJcd+foqzseik
+m 16,17 sha256=aliFzpFQtjPGnQrdnKqr2bDkvNhvaL5+VqP0ywkByT0
+m 18,19,20 sha256=wvT8rxEfzsWKWBWBmjmEB6ZlzYuQSKwd9/nS6NmDEWM
+m 22,23,24,25,26 sha256=Z8y1ONiEP5hNifdpWe4+0AuIdGity3foKGivWT3ZpHc
+r ddetor2 //eMRLpua291JQlbvhTvfL64l0Q 384z05/v404kBt6Aeqph6fbCHFw 2017-07-17 11:54:02 85.10.196.9 9001 9030
+s Fast Guard HSDir Running Stable V2Dir Valid
+v Tor 0.2.9.11
+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=2097
+p reject 1-65535
+id ed25519 XohaNIuMxAqZBnXhbmN902YCJmizkMJHW8V1Diea22M
+m 13,14,15 sha256=OAvv2+7WtcHSdrWZovkazwtpillhqyxgIxEyvLsMP0E
+m 16,17 sha256=vD82Fl293dSk5LbmqKN37WVsxmpdfCOarjXAxRMMkVM
+m 18,19,20 sha256=6ppiPoyMXvzA919ntHFX2DA6egl9R3noX4XQyO0HlvI
+m 22,23,24,25,26 sha256=qyBO43PwQA2abtOfZwMJc7l/bYKyY06fBa/Ht1tXk3k
+directory-footer
+directory-signature 0232AF901C31A04EE9848595AF9BB7620D4C5B2E 70A6DDEB6B42FD0714B8F91F3F6B366CECF4E8B9
+-----BEGIN SIGNATURE-----
+uEOYsZCASHC58vnTSqs1P5gcPHZELASeiTJpZsfQoqQR4Crpc3f23PEGUtmf4yKK
+B+hRjYtargMoCl/idk2GvP1KZhW3TbWMUskmpoiCVCL4zPjlZ9/Oz40Eaqg2oCHw
+aIY4eEovAXouUpN+B8QsIMBI8fduF+dKPrPmE/NAC+PIReaWoGaDF4fASy3Ql5s0
+u0P1wUBMwnd4UGiq0oZ0soezr0JFuSvw61UaWFUmF10bJdJ3LziiaTqTzKEbWmBH
+hUf9t5xWhB5lYcJu/eDky33Pkaw+XP7tj8Qn59xgqqEUzA1kqembDv+gR2k3gB52
+BzdikWT9LKvBGkFwWGhmiQ==
+-----END SIGNATURE-----
diff --git a/src/test/resources/relay/2017-07-17-17-20-00-extra-infos b/src/test/resources/relay/2017-07-17-17-20-00-extra-infos
new file mode 100644
index 0000000..13505b9
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-20-00-extra-infos
@@ -0,0 +1,136 @@
+@type extra-info 1.0
+extra-info Laika A9EB7F7DAB0EB59BE2AF0C1677BAD40C4BCA1936
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABl17AS1Z6F5JxyZHugRB9Quk91/b2GrbjFLxkH9p+nQ5bNRXAQAgBABhsDhE
+ogXvtmAmmPPVx92oXZxrIKHI+rixmZ0nRwwq1PAAoRpvp+WM10B/cAbDFLMvu7M8
+y0rqqBCksRQqFJ1vH7HFDpGuA2k/8+wrueZkFndK+HpcgGnshDsiVAI6pAc=
+-----END ED25519 CERT-----
+published 2017-07-17 16:13:19
+write-history 2017-07-17 16:13:02 (14400 s) 56013945856,48180008960,34854537216,44604565504,54208654336,54400697344
+read-history 2017-07-17 16:13:02 (14400 s) 54903072768,47198806016,33978647552,43582711808,53135066112,53240268800
+dirreq-write-history 2017-07-17 16:13:02 (14400 s) 1172504576,1006363648,891491328,1083877376,1147446272,1253465088
+dirreq-read-history 2017-07-17 16:13:02 (14400 s) 67716096,51940352,50447360,63797248,67868672,74561536
+hidserv-stats-end 2017-07-17 13:50:38 (86400 s)
+hidserv-rend-relayed-cells 8320428 delta_f=2048 epsilon=0.30 bin_size=1024
+hidserv-dir-onions-seen 318 delta_f=8 epsilon=0.30 bin_size=8
+router-sig-ed25519 TKVC5EhGw3D9rk7ZuHPjX0pWolsQ0O5EB1oYknx+ot4EkWb6yVJzKN1aBMkKZGho9XUfWCavui2Q4L+TTnTABw
+router-signature
+-----BEGIN SIGNATURE-----
+CP4KeWysQ/msdjPHE7n9ds3cB8/WPwuK6hkT+WkAgX7mBb+JiDPjjg8Sp2UcVDUD
+jEZKo07L/yEKf9Rz34tsfXeODdarr/zhebhTpd6ihNb3gWZoG+F3J8Ti2U6KqgVi
+naZ4hzuy+lfaBHZU/yBKDvzB4vQ1LSM2KZG2jkSQukk=
+-----END SIGNATURE-----
+@type extra-info 1.0
+extra-info Noonesland 6D7C6F497419BBF024820AEF6791D20B49A4A0B9
+published 2017-07-17 16:05:51
+write-history 2017-07-17 15:56:41 (14400 s) 3002789888,2579445760,1814833152,2429364224,2660307968,2653971456
+read-history 2017-07-17 15:56:41 (14400 s) 2976329728,2549826560,1800614912,2405142528,2634059776,2627343360
+dirreq-write-history 2017-07-17 15:56:41 (14400 s) 26686464,31054848,18189312,24768512,25589760,27505664
+dirreq-read-history 2017-07-17 15:56:41 (14400 s) 2804736,3631104,3555328,3543040,3760128,4137984
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-17 06:37:12 (86400 s)
+dirreq-v3-ips de=16,es=16,fr=16,us=16,??=8,ae=8,ar=8,at=8,au=8,be=8,bg=8,br=8,ch=8,co=8,gb=8,gp=8,hk=8,hu=8,ie=8,it=8,jp=8,ke=8,md=8,mx=8,nl=8,nz=8,pl=8,pt=8,ru=8,se=8,sg=8,th=8,ua=8,za=8
+dirreq-v3-reqs de=16,es=16,fr=16,ua=16,us=16,??=8,ae=8,ar=8,at=8,au=8,be=8,bg=8,br=8,ch=8,co=8,gb=8,gp=8,hk=8,hu=8,ie=8,it=8,jp=8,ke=8,md=8,mx=8,nl=8,nz=8,pl=8,pt=8,ru=8,se=8,sg=8,th=8,za=8
+dirreq-v3-resp ok=128,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=40,busy=0
+dirreq-v3-direct-dl complete=4,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=120,timeout=4,running=0,min=1908,d1=211976,d2=299596,q1=358827,d3=399662,d4=587886,md=628103,d6=702643,d7=821638,q3=861864,d8=889466,d9=1006029,max=1121540
+router-signature
+-----BEGIN SIGNATURE-----
+riGVSQkTetR29LmfuH81UcQPwE555T+3aCbu0m+g8t2CkkJGM0m18oARq4SLZSQh
+fJUX6q2uLXDJNCkmuhmIKPWxj34dCAkmN33zupxB3FiFepJwMZ31hKv6Y74YKhXL
+lKUSOo4OJ5Dmd9/vN73ozN2tSjCnmXwqMbFLRSklQr4=
+-----END SIGNATURE-----
+@type extra-info 1.0
+extra-info Unnamed 22625930D86B38661C522356BAC6AAA37A16E4CA
+published 2017-07-17 16:37:21
+write-history 2017-07-17 14:19:17 (14400 s) 5563392,9600000,8963072,4339712,7075840,9171968
+read-history 2017-07-17 14:19:17 (14400 s) 7273472,11308032,11141120,6022144,8183808,10304512
+router-signature
+-----BEGIN SIGNATURE-----
+id07WFKUts2/mWRUEVdb35gwXNqyJXiOV8Tf/yyGnnPyYrysNjPTpdsH6eklp5+b
+Uzvsjod3qrPJFSLs8i9CSmpJkYLIe5TOMNpv8aeDzi0EcsoBvGe9pVcx6b7bvze6
+OltWRZPtypGAa6iw+zJ36rD8tQRR7ktODKlvfJBXp9I=
+-----END SIGNATURE-----
+@type extra-info 1.0
+extra-info bubbleoseven B2F7655C0CEC7099D693AE9C86FBFD58E98CD63F
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABl4FAb2TA8ulVDyppPs1wfIYUoBeD3oSQ8nWVStsSlOIJoHjAQAgBADsvMTU
+trHjF/5XZLn92ceLCU9k8RZRLg4Q53Lx3PYqycRu0ap30pNH38n8Pxw8RJL3ICUW
+e8Lik6Ni6QpBUCVYUhlKMDkQndh+Z+w9pxolYREHwgfZGmzi4oI87IyRSwg=
+-----END ED25519 CERT-----
+published 2017-07-17 15:53:19
+write-history 2017-07-17 15:50:14 (14400 s) 6873174016,5213486080,5725477888,5168033792,6365374464,5071943680
+read-history 2017-07-17 15:50:14 (14400 s) 6864226304,5210245120,5721249792,5167883264,6358496256,5075549184
+dirreq-write-history 2017-07-17 15:50:14 (14400 s) 5188608,2868224,2313216,1309696,2476032,1790976
+dirreq-read-history 2017-07-17 15:50:14 (14400 s) 6853632,5117952,2380800,1858560,1713152,1687552
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-16 16:31:45 (86400 s)
+dirreq-v3-ips us=16,ca=8,de=8,ie=8,nl=8,sg=8
+dirreq-v3-reqs us=16,ca=8,de=8,ie=8,nl=8,sg=8
+dirreq-v3-resp ok=16,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=8,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=16,timeout=0,running=0,min=288853,d1=288853,d2=422559,q1=611492,d3=611492,d4=881509,md=886601,d6=891548,d7=1005240,q3=1012168,d8=1012168,d9=1191181,max=8400671
+hidserv-stats-end 2017-07-16 16:31:45 (86400 s)
+hidserv-rend-relayed-cells 1592734 delta_f=2048 epsilon=0.30 bin_size=1024
+hidserv-dir-onions-seen 215 delta_f=8 epsilon=0.30 bin_size=8
+router-sig-ed25519 neyLHAhXF6+wO8z1IdVqzmI2SawP/JviODYuKzo/dT2IYz6VfgsfZFRpNxClRg7EYZpT0GtpNMuFcSHC5F0wDQ
+router-signature
+-----BEGIN SIGNATURE-----
+DhvWqu6mWlTEnRUoC+UjnOrxFJhcpmdBEjeBREu2N9kxfYX+Tji5ZOfnxy7kfh9J
+gp/YENrhBdeRsh4v/lRkh5SEa3Z7mCjgZg9gigNIC0SbmQBwiu3dshwYUkkRtmAn
+wbuGe23P13nPttXcTzSx1+NYQsXybpi5W1Y8A76JSIA=
+-----END SIGNATURE-----
+@type extra-info 1.0
+extra-info Unnamed 5F852FEAD9A61711C5DBA94679380EAF9E58F194
+published 2017-07-17 16:38:59
+write-history 2017-07-17 13:25:26 (14400 s) 142027055104,143395660800,122423040000,88385615872,113916124160,59078951936
+read-history 2017-07-17 13:25:26 (14400 s) 140099932160,141490467840,120992486400,87137323008,112422714368,58193235968
+geoip-db-digest B2E5105287668771E34A66F90B34982D419727EF
+geoip6-db-digest 8DA8AC3C8158CBFDF7DB53BBF73338246872371A
+dirreq-stats-end 2017-07-16 21:25:27 (86400 s)
+dirreq-v3-ips
+dirreq-v3-reqs
+dirreq-v3-resp ok=0,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=0,busy=0
+dirreq-v3-direct-dl complete=0,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=0,timeout=0,running=0
+router-signature
+-----BEGIN SIGNATURE-----
+OamJqLTTcywjD2JCx0tNmGR86MZ3TTSirXNMdmBXcUwSKsdYPEPO1YCnmY85x2Ee
+nDU8m+NhfHvBJscmTsEtHK7XwFLkfWNhq1sCdiIvwq7rRIbW8kkjVKrY9CJJjrj4
+/ic3OaM2MBISn1TKoxVwoAXSGHE1Dajs6THcgSlvHRE=
+-----END SIGNATURE-----
+@type extra-info 1.0
+extra-info Unnamed 954B221CFDC3F56A15FE3C29F85D5FE34BB144B2
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABl22ATuq1t6M+oqrb5yEYmkmYz72Tcjq+vsYUQG4cYScASZJAQAgBAC3P9dc
+dHKbFhvf3YqG3z789GcbnOaP+hE6pVrpebT1J2uF8bAVDn3TKxYamIAqwwY2e5o1
+3znUrf7uDJTYnPuZK1wF67Z4w6K6V04dLBUoeMvke52qYie6XZajFct5nAM=
+-----END ED25519 CERT-----
+published 2017-07-17 16:25:39
+write-history 2017-07-17 14:23:27 (14400 s) 9820580864,10414418944,6695391232,7226501120,5122193408,5213615104
+read-history 2017-07-17 14:23:27 (14400 s) 9720658944,10322909184,6638159872,7151337472,5075135488,5172275200
+dirreq-write-history 2017-07-17 14:23:27 (14400 s) 83148800,77387776,55478272,73586688,45719552,41606144
+dirreq-read-history 2017-07-17 14:23:27 (14400 s) 4964352,4588544,5505024,7198720,4013056,3792896
+geoip-db-digest C1EB5237F2FBAF63381D8551157F13D12EFCCA25
+geoip6-db-digest 1F99B6B0EC78E9DB34D61AE7E0FC261D558E8E5D
+dirreq-stats-end 2017-07-17 12:50:46 (86400 s)
+dirreq-v3-ips us=64,de=48,fr=40,br=24,es=24,jp=24,ar=16,gb=16,it=16,nl=16,pl=16,ru=16,??=8,ae=8,at=8,au=8,be=8,bg=8,by=8,ca=8,ch=8,cl=8,co=8,cz=8,ec=8,fi=8,gr=8,hr=8,hu=8,id=8,ie=8,il=8,in=8,ir=8,jm=8,kh=8,lv=8,md=8,mx=8,my=8,no=8,pr=8,pt=8,ro=8,se=8,sk=8,sn=8,sv=8,th=8,tw=8,ua=8,ve=8,vn=8,za=8
+dirreq-v3-reqs us=80,de=48,fr=40,br=24,es=24,jp=24,ru=24,ar=16,gb=16,it=16,nl=16,pl=16,ua=16,??=8,ae=8,at=8,au=8,be=8,bg=8,by=8,ca=8,ch=8,cl=8,co=8,cz=8,ec=8,fi=8,gr=8,hr=8,hu=8,id=8,ie=8,il=8,in=8,ir=8,jm=8,kh=8,lv=8,md=8,mx=8,my=8,no=8,pr=8,pt=8,ro=8,se=8,sk=8,sn=8,sv=8,th=8,tw=8,ve=8,vn=8,za=8
+dirreq-v3-resp ok=408,not-enough-sigs=0,unavailable=0,not-found=0,not-modified=120,busy=8
+dirreq-v3-direct-dl complete=8,timeout=0,running=0
+dirreq-v3-tunneled-dl complete=400,timeout=4,running=0,min=5783,d1=116441,d2=198720,q1=238237,d3=291953,d4=429610,md=525516,d6=623696,d7=703178,q3=749916,d8=798955,d9=1068573,max=6581957
+hidserv-stats-end 2017-07-17 12:50:46 (86400 s)
+hidserv-rend-relayed-cells 2627757 delta_f=2048 epsilon=0.30 bin_size=1024
+hidserv-dir-onions-seen 185 delta_f=8 epsilon=0.30 bin_size=8
+router-sig-ed25519 zlLifbD2VF/NXf14aNfOOOt/+0HeL1NFJi9TH7UNoJs6bQO6jatfPPYR3BrtK8M/l9jprb9FXV1vd+mDrXrABQ
+router-signature
+-----BEGIN SIGNATURE-----
+bi4HS09ksMFj8E0+rIiujIHRfVAWiyNS/M7XDJLgoBI5tb1Z0QemVpJJpGgW3cwu
+T4PKsST1xQkU5OvqE+CMQhsJmb69dnDrLXwgwE4/MVn6ZhKUCDiVFLQp4CpqHlT2
+GdZ12FF8npbPElhDKqkULmiqfnND5WRmamTf+jGTJKc=
+-----END SIGNATURE-----
diff --git a/src/test/resources/relay/2017-07-17-17-20-00-micro b/src/test/resources/relay/2017-07-17-17-20-00-micro
new file mode 100644
index 0000000..be72d38
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-20-00-micro
@@ -0,0 +1,129 @@
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMoc6oKsgN7/2tW4qU5xiGhN7anQ8RpKuwndBTiPsXUFWTYiar30b0DL
+jiKz+WqusZUKT/fIz6ETnqr4N2Y5NUc3GsAMOyYgKc1urAiwp8y6tDDjkb3PuGN+
+0xOfAzux4hXkpN31OiLco2SShkpNG2yRotG1Bc0voVn7Ze+DuUDhAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key TNQpEp4ZLF3UitmQk8lHKVF0LBIiqxRXovZF2dIxg2s=
+id rsa1024 QqIYKeAXfHdaKZhrhE4SKiXuPJU
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBALq1jLuS3wCwJ2Ou68X8I34E+/fB5Y7BKj3OpowjA8wzQWsB6BV6v6m3
+J/iQcwU0Yw6NJDjtZbGVcWtFCs2gZ1uCmOHWUsUVBy+PVvbfmz5kdS2e/0j6cq3c
+zyaKUBSsIC3SoyYM8/Kg9gi3sJTIbZdhkoiWNiCEuDYKTIqwv4c5AgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key Ho7mMeY7DbRkV4CCsoOt0l/33y68T5ak00W+x4KWFH8=
+id ed25519 6FEPaO0qQ+XC/VWJOg17RGHUZxwjYZ7FEApvyezZzVg
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANZhlVNLrDFBWVeLkFsICD+cKUoPIGkX/OUNPOOuYas9t4VSQIRwX19N
+fCzyFzqmZjO4HkAxoRQBoWDTGpqlv70lQMZ4p0Ba0zSwUDY+jIJPLFZ+xC0SDUK1
+H2QKEhTHAk0xpfV3fZT2zVq+FXIOj1Fl7uKSHYiLfBdvaV8M/dYZAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key UEdcg7JNWwbZoJ6F96lujhbffylrw3J4KhXQEgmCwkg=
+id ed25519 xcCdNV8zly2rCTRAWXSMFBKuH5JyE+VFX9C3k1vBsNk
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANcttcnXyjylqj+FkH8hGIa2djz5WH8hZe4HzaBKtUrJ5FZ/WtTohlw7
+cqcXGfvmskluI7nw4atxEE3NrvMBM6pMILnNcPNS5/IKh/EBl1G6kFxkhc6dZdjo
+Vucw15WIApyE8Llrr/rEbxCDD/Dk2Z5hK8eVx7il4CNqO7afe7FxAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key UI+ypmQg2AvHOLs72asnX05GWbYBvwlpqv6J/zIMFQk=
+id ed25519 psTnPTMsgXEvQZUD4mRvXu6AyHjAS/VGQ5WrrFmtcdk
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAL7qMhjP8xtt0S3bLe3c1yaaDJSObbt6fhii64tot5HwB4H7kcNAwea2
+pVo2pIcx8IoYTVTlZMtcpfHHrclnc0fOQHxZ3T3Xx/qF3gELxthtdyOPxQlDFMWN
+vYTpJkH3VfwJmdB+Oidz5NRitIAQvtHTYa5oZ4iuRmH2l9kXwHKtAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key Y/UpIQo6HjiUJubLOgjXeMW4Sydq7XWaRlMErsMd8Vs=
+family $BAD5FCA2B070CA2F20BFD7C69570B192126D7390
+id ed25519 fDlUMulqfTdY9Ju7lAiWT8nUy/LJmXRpGjMEbjzN0WQ
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAOaJRUkrr6nzk8cOLPUdNabltmcJT6b3Zq3oomGPQnL0hiFd+7+VNqc3
+dipIjufsXGHSlt7LAmitXC/AoINC7F5TYSNvCuwg5j7byirh2XGuQsBQbraQDSSK
+YrMwTUdzIRnWv/eBKii6N/65WvIKu16AiW0Vc691rlopd/r6ZtdDAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key 5P/aqDP5zuCnQElxCOTu6Y66Lg/wF4nke/TiMLjM7Xo=
+id rsa1024 oGOUlhA+TwxyHkzTG9Isye+UxM4
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMSUoNhC7NPGfQkVbDwX32k54Ff6dAZNxJF+IVrknRSmqb17XQMKFUHn
+FVuCr1U0d17u0JB5oCNQ5eg0g4uFh+tDVvmv6aAzIQphLBuVid9uJ07wOZbSDG5o
+dYfVPhljujBTV5gYC/DuKC0dkOFQBcycK+gsy3RtvSOTlkZi5IBZAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key N6T2M4O/A7ct60BpfnN+gcRKUQm7O2D2yMRNgQC6wDs=
+id ed25519 1wqUKVWv3kpLMcTKMxUWR8kzlZ/YkDTaZwaM/lCZVc4
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAP567tZXA8lMnrheTb9XPnQgT6M4fK3qa1n46Ydscr/1AaWG/q1Jz/qb
++qM/bTH43iuySpa9zuSaMP5yKCBwh9sqhugVFYQsYg5/OnUCp8m2TEkh4X2LdS9V
+6mORJht50m1YAIkQvfILAUZGlSrdrAw7UA/yJ2XrJ5XVmxtxm8zzAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key BkfplMYTQyEAVHr/4cQvgEOgf0eAAu8BLroA2E5z72o=
+id rsa1024 YbJHqAFbv8XkdAUWyBm2BB3Mnzs
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKyZeWy5XcNGWg8hKBfEXVnfrLy01vpW++4J3/qgjCCdjnkKfyENwCDK
+81V4RCyhVjb6BbtX9FeOQJSE21Z8bqVN2cIuQ+EZzouEaVvQx+03Z2ZKxcoa7ytr
+cjiPshQzj3tcQVIbT90IGZyILz5mHouSYZVsglDoRv+L9HvkLIqhAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key yZPjAwRb4bAbeE1sBgIJejBPF9OFZ2Jme7Yh+yoKjjY=
+id rsa1024 dRIUVigDIP1+/qC14aWvKHuzXek
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAOqh6vSUhg0fAsWEZEdEYyXgmJ/0NPXn/93PS03bfy8e9+j9uggM/nkC
+KKYU0SN+o95rYrJsiyn7rU7UK+U8TlTKkYcIdgKwKDmLKlsyy0SQhmbr61/ljo2r
+9s/AHNVBjIW6xDgqgMq+EmmRkeSlC+cVZ7aZoFj1d2x4XXd/RiXjAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key jFEQCTH0LZ5J83/Nt21YrZAFrYf0SnxlzLDQOCQ2vDs=
+id ed25519 WXOC0MIWLWMyp1cM1nvv8DkA+t9UlVyxwQ0xBPSO3uI
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANxOIlT0OOz1pRkm6FyGlLZObm6AUbJl4sE8dQmM/Vk/Qa/0ffpSHZ1c
+5InTj4GgpDndUxX5v1v5wHas3LMdd/1rrWQ4l2IjRKKTbjdOD/xdF7OpJQY0ii5x
+sVkPjf0rC0U3nWqskMe4dK6NIR8pnPXHai48thlNUqSYL4435jUlAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key eXELaCB+m2Udx7ukbb1Mk7qtUcpboSvTsstIsf1s1Rw=
+id ed25519 xACMXWM/7ceiiIcyh/Lej3La5hBISbS6kunFT+RSrsY
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAOAgBper+YA8P1lhq6DBpGlDNXdHU5sY9yCnGWRtA+Ze83FXCd9bs+xs
+cnsKLOWl5fZVwTnWzdBdUzg9nppZOwTUXNiaxY8e3yVJJKpWD2ysPz1NHyHUmE3C
+5ipHnSLct6ArUZTvs5VsFEwjSSxSiJFYjNBQCp+sSPQPC0ppy7ejAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key 3vXkL4iXF2ERandBO0zoCWAbpG7jWwUyHiKaxijpCgM=
+a [2001:470:1f09:11bc::2]:9001
+p accept 1080,1194,1723,3128,5190,5222,6667,8080,8888
+id rsa1024 XpnKX0WodX+sp2KCeKCPjWwYkeI
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAOOCw4peHoggV5IP3qjI59HXgf4rjaGrEzl5Gh9owBCfOmPdBwy48div
+NamtTRCNiZP68ZSZAu6IKrhRcqqXKp+dGJhnR3nUsDR1vbRnv+HVZ0g/7XsbMjxn
+qsGX7dmmsHxYGIKUOLrNCT48sc9Nfq+QSJ8BIdERWdWkgj64GAN5AgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key RPigYmyfbZyjC0q3hlu5PY1V+rkG45BKbBhyQPEMems=
+id ed25519 mvpSsJ7wZNjv/0CLW7y/zmwK60ocN+1lPrs8+mG8lGo
+@type microdescriptor 1.0
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANwQESBFu1DKhCofzhjGFOw6qqoDzA3FZC4CQd68y4sMlqCXA0cCo3Ee
+NGRzxnul2pLh1VzSEpf9FUqYCwjhVQJUsJTt5uSWTtE3Wb2HxaVmdnmSB9DZe1nu
++T1Tw0HHWfVmXD77x2aGv+SUazD+psoTj7RSZSKE8Rz0ikAH/gRDAgMBAAE=
+-----END RSA PUBLIC KEY-----
+ntor-onion-key y6+XCSfGd70wjvuM469q7v4XaqMpJWqDLYL//iludyM=
+id ed25519 6fjgqQlNAZV9UN66txciYXAN8s23cFCfAli35raz738
diff --git a/src/test/resources/relay/2017-07-17-17-20-00-server-descriptors b/src/test/resources/relay/2017-07-17-17-20-00-server-descriptors
new file mode 100644
index 0000000..cec2c7a
--- /dev/null
+++ b/src/test/resources/relay/2017-07-17-17-20-00-server-descriptors
@@ -0,0 +1,164 @@
+@type server-descriptor 1.0
+router WinterNight0 5.196.20.85 9001 0 9030
+platform Tor 0.2.5.12 on Linux
+protocols Link 1 2 Circuit 1
+published 2017-07-17 16:48:00
+fingerprint 08AC EB59 484A EC8F 77A9 4EF8 F733 8830 9531 B7DB
+uptime 4233607
+bandwidth 1073741824 1073741824 6156209
+extra-info-digest 2285BE7F0F03B9924B8BA464EA2E42803E1DA3C7
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANB1HLLYd4gOzQKr7Zmoj+91Ym7hlxAesPIXf1MQleNLJGxkK9gOgsxv
+eapGaQARzQB1U1xwEOg7Vb6an/rHnoLeemnMuKq4bw0M0z3l5svGQ0oPA1/Z76Y6
+c12dzuiS66F8M8IQhEyLSVrYSeoYHXQ4FDqYEJXMr/PoRZ2hL8VJAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANhjXPP64jq1zsl+Tw4CjDZKKrHN4tLFtfq5j5aFIry/YVo1fUQoUyfO
+p+wwudefa0kDAuaMG3thsCUchOMqYsFTpUylk5vci/5sWR42/IYPkTePTPIhSHrc
+UiX7PW7m/uACSA5c0urdh7F8z5sMC9nrvbj82tFLUC5OtNAGYw9DAgMBAAE=
+-----END RSA PUBLIC KEY-----
+hidden-service-dir
+contact office(a)wn.systems
+ntor-onion-key qLDGvY9hSGaMPzd4bN3XIyj3UHbE8hnBfr54qXiKuC0=
+reject *:*
+router-signature
+-----BEGIN SIGNATURE-----
+bIygE3rToTYHYEdDxzK2pK+lthr9PG2Xt4FVquUJBIfIlyJdrtUAHu9LB7V2shqS
+K1wHKXAMRv8b/9QFRspR+a7u7SRMhXJCbzkoheK/FhbeTWys9qKZ+bk+cvHHsV3N
+l//7bOGU+bNIiNYk+QmKYklvdqySwmDBxEGcx79MsFY=
+-----END SIGNATURE-----
+@type server-descriptor 1.0
+router tortomofterelay 78.94.92.170 9001 0 9030
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABlxWAdNEwfMdWYkX7liDtfaS2pKgx3KFfgJFG37xBDk35ZnlAQAgBAANdPxb
+qzakrpqdpiMOf07H8+kCxINaPGgab4KY+YlZ8+VNPc0qCvw/rLBjXOJHnJt0x2K8
+zY+82oAvRRTLb9lwImHnUr0KkZhzFH0tYkgJhXhgaPl0z35vzHVlSiz2Egw=
+-----END ED25519 CERT-----
+master-key-ed25519 DXT8W6s2pK6anaYjDn9Ox/PpAsSDWjxoGm+CmPmJWfM
+platform Tor 0.2.9.9 on Linux
+proto 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
+published 2017-07-17 16:47:16
+fingerprint 5E68 AAB7 880A EC84 DC00 CA45 BDCD 0704 F6B7 D02D
+uptime 9624998
+bandwidth 687104 936960 814769
+extra-info-digest 8EFF2CEF4195DE38F84B0F6AAF036C58320DDE8A a7r3zB9NgV4hFSm4T7N0OvzClFGgibyvAW6R7R32fYs
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAO+Igi11dIu8L+BJxzHPUsfj6b1AtzEOtCnuzysfqHB6USBuRXA9DtLQ
+P/Kj2iy9xw2inhJJVMdkJnO4WeByf09vsRrH3AclIp0+fMK28HOHbg3m7Sl5hOAd
+5pfLS8OtM/u723XfhH+flRfNFGM0Xd+quq1Tj4UbrPNtNNZiSDYLAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBANQXy0wHLSfBYU0OBOidoZDHByiy9Atn0BFBdisTWKXcsLcTuqNgjQVs
+N2ztEoeSYpfHz1ASrxgbJeOB8cGNV6PyYKwOya1oB1O/TxepgThC6kKhWNEU/Ern
+bz3XJCf9AK1xe8FsFLE7lvOyWm9Nblv1Oe9Xta+X3OFNcjZgFdkbAgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+RjdJteoXEP2+xU8gm51l0InCcj8h0AxfQn+4bFI5Xl+3/8sWur1O+V33XXZvGEKK
+YHosdV1tr4aAzBbgZzh71IapNdZQlMlFCdX3upD5VtRzCHp722TSEB4F2/kviqNx
+t5LYM2+ohQfCU3YH++1KoJxvB9OzRnK71sFtiDQs6as=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABlyZAQ10/FurNqSump2mIw5/Tsfz6QLEg1o8aBpvgpj5iVnzAMfqLVN3YgrY
+F45w3bjYTMtXHeCU2piVJGO7ejwfQOq07PwopGTFVtEZ4Ith2oHfSWkD7egMXszN
+yXdAXSIbEwo=
+-----END ED25519 CERT-----
+hidden-service-dir
+contact Mr Dred dred007(a)gmx.de - 1A24s3evSHPPmLe8CELQeCM5YAZewWdoK7
+ntor-onion-key ENteD2rL1WreWsPNAf2aTj24JHjpBOY+kBgca+JDz14=
+reject *:*
+tunnelled-dir-server
+router-sig-ed25519 Y4u8ppUCvVICuy6lBB2R2RjO6dRk4x7RwIeQ3DQnY4wPP/trTYTzUaJokjZuXjr3u/QSZLOxE7F0ihoWUdsJDA
+router-signature
+-----BEGIN SIGNATURE-----
+fPT7T0rmgMCvlGvjgJrYY872m74/5wb1PXF3AOT17X4ULX+vL2R6uyxP3PmXb//r
+VjcAyOogKAZ078Z0O1/V+pU7lPrYOAF3Q8HQHl9oUQjefTTdrpH3f5oTD4OW7UjY
+DG43AvVHz+mqIWwN5pag2iI7ebGOJoLONclocmcwBYo=
+-----END SIGNATURE-----
+@type server-descriptor 1.0
+router Ajorcel 82.64.7.146 9001 0 0
+platform Tor 0.2.5.14 on Linux
+protocols Link 1 2 Circuit 1
+published 2017-07-17 16:15:53
+fingerprint 4F95 B731 3679 ECC0 00F3 8F87 0CF0 CF39 C738 6C50
+uptime 194673
+bandwidth 102400 153600 114450
+extra-info-digest 5CA81CB315354340C3279238781A2D1F20AD3BFA
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAKhMroWpwpECvTQLVbVlQ+PD8DRat3MjiXFRoj8LjKuYB5oETdsgIIyL
+ZWt5X9pSLSpRrgciBpycekVvTaJX25iqMfDXhWpqxiVTvkm5miAexm36mHWkIhnV
+KjLy3AyR+ub9amqBCEd+ONW2tXCyNHDXM/OEWA+PdIoF2CvwPCUzAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMtEDZS+YXd2zfqySDSztsEYgLGP0bwYVDSLPJ/iBxJhv3v7aujQUIXb
+PXiF2yS5pynzEyl1zT3nft0dNqVRPnqllu/D1KuZK1XCFHyqvoJydv/z97/F2PW3
+IR0i7/mb8XFl+5+UQuWzzX5YxPR5OK+kYFTL1ic17ebOQGnwjWAFAgMBAAE=
+-----END RSA PUBLIC KEY-----
+hidden-service-dir
+contact Ajorcel <ajorcel @T gm@il dot com>
+ntor-onion-key 44zTULInZpY5jsKunHa1/JCFhEelSbXR/dWOCG4bSCI=
+reject *:*
+router-signature
+-----BEGIN SIGNATURE-----
+CELh+nplCkUem/IKI5zrn8IFH70P/l+4T2cBeQcZ/CIQjMIMEVFrgcSS0FS0oEnb
+0W+GiauWKjXDejMwgk2RirKPkJx0V8YIMZP4RhT5EBsWBA4ewlobxu/FeJVf1MM9
+W0p1kAh28GHzXgiSXskMRCpU1hRUlrFVx079VdoYcbs=
+-----END SIGNATURE-----
+@type server-descriptor 1.0
+router CookieNode 88.130.65.242 9001 0 0
+identity-ed25519
+-----BEGIN ED25519 CERT-----
+AQQABl3+Ac3rPCm2ofgYBTt+6OzGsZr6TLJ5ZwkfDbMr4S9BvoBfAQAgBACN2fCJ
+6vMDdt+RxD9E9/dDVGkFtfoorwfjvY4oJ8QP2f7we3rhK++bLMlm4Tw9eoMBOsGA
+0GidhsSVTxvm8i6A/esbevEEpe6gO9MrUZ8Bbly08SDi51w9WhUXV/aqaQc=
+-----END ED25519 CERT-----
+master-key-ed25519 jdnwierzA3bfkcQ/RPf3Q1RpBbX6KK8H472OKCfED9k
+platform Tor 0.3.0.7 on FreeBSD
+proto Cons=1-2 Desc=1-2 DirCache=1 HSDir=1-2 HSIntro=3-4 HSRend=1-2 Link=1-4 LinkAuth=1,3 Microdesc=1-2 Relay=1-2
+published 2017-07-17 16:23:04
+fingerprint 2309 3500 5C74 9BBD 303B 01F0 EB83 A549 1A0C 886E
+uptime 3
+bandwidth 512000 819200 182272
+extra-info-digest E770D10CD99665944492085018918606AD396DDE C9GNRY10+sX/cw53DMFfF20YTPE9r4PVsEsHMd1T804
+onion-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAPBtE3aMl9qrxevIfs2XHA4TsnSAlThdUXPPjpwjfBR5PRlgvezlFDxI
+RkvukxLCRHWiFj6a7u1mHXA8yhOfiiur95wEG19si+9sDc1VXozuhPizHIsvOjen
+9vBkxP+Ot4gMh3/v6tyCmvGr/6krD7fSC/CDG1orp+V+mSh4mxTVAgMBAAE=
+-----END RSA PUBLIC KEY-----
+signing-key
+-----BEGIN RSA PUBLIC KEY-----
+MIGJAoGBAMqMgoxUmr2sXDiQ9c69f+iGg25XusuuAefQL1Xn98xYCbH0oVTOHOTH
+G1qtLM+79RSx/Y/85FnW0mZx1jf8VAaXycEZrtkenMqzW7bwEKUnJRD4OncXYEso
+5jZioqR7o4YLWYA2AHUSfsnFCC/Lai0Kg8y6x33pjLAyyIEGhUb1AgMBAAE=
+-----END RSA PUBLIC KEY-----
+onion-key-crosscert
+-----BEGIN CROSSCERT-----
+OzhZ2AnsXKIGruMLYFuo1NiKN8dtbOXFC0VlS8B2MfSAVHcRgFWApD4eEOKZPcHj
+NnEB2doSGumsQNz9ZpEccSmke5fVATje64O/REBk5rD6hOKUYF32gugoWkssS1l4
+7gzQPb9EOn++yip7ESvk3ai1pE00xPGAvZOrY7LlQOU=
+-----END CROSSCERT-----
+ntor-onion-key-crosscert 1
+-----BEGIN ED25519 CERT-----
+AQoABlyZAY3Z8Inq8wN235HEP0T390NUaQW1+iivB+O9jignxA/ZAIRIokh+zaFo
+ya8BkB7DM6Rulr5wZvOngOjmps6dxdmhqXgpVP/1F27o3T9DOiNIEa8qmUxvmZkJ
+elMU0MBhIww=
+-----END ED25519 CERT-----
+hidden-service-dir
+ntor-onion-key X612yJmMR2BUPGy2Y1BV2dOOVxSvvlR+uZMmsWzQbn0=
+reject *:*
+router-sig-ed25519 h9P8ZE7IMYyghKf2r56qSKywnA2QUqn/LzD3HXI8oBDh/QVwq/sngXbi4rQoIE3tMuPNe6yho2t9vTZQw04FCA
+router-signature
+-----BEGIN SIGNATURE-----
+Q843+DZd/R9nf7O64HdSkNJBitrA38JGDIw3hVi/YK5TgE1lmokvkl3kq6xCY8zq
+wsy7dRY8/cEkpq63uVxikVbmYYQZlVKrEXViq46ejBbktGQj0IWKRpRH5GTlPhhS
+hhOfx95EfIDcQSH81qGi9h1AgItV4trMeB152r0o+Dw=
+-----END SIGNATURE-----
1
0
[metrics-lib/release] Move FileType and add PLAIN FileType for no compression.
by karsten@torproject.org 10 Oct '17
by karsten@torproject.org 10 Oct '17
10 Oct '17
commit 4ee320caeace98776e7bd51f054df7641b7c3eb1
Author: iwakeh <iwakeh(a)torproject.org>
Date: Fri Jul 28 07:53:30 2017 +0000
Move FileType and add PLAIN FileType for no compression.
---
.../org/torproject/descriptor/index/IndexNode.java | 2 ++
.../descriptor/{index => internal}/FileType.java | 24 ++++++++++++++++++++--
2 files changed, 24 insertions(+), 2 deletions(-)
diff --git a/src/main/java/org/torproject/descriptor/index/IndexNode.java b/src/main/java/org/torproject/descriptor/index/IndexNode.java
index c7a79a0..516bbdf 100644
--- a/src/main/java/org/torproject/descriptor/index/IndexNode.java
+++ b/src/main/java/org/torproject/descriptor/index/IndexNode.java
@@ -3,6 +3,8 @@
package org.torproject.descriptor.index;
+import org.torproject.descriptor.internal.FileType;
+
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.annotations.Expose;
diff --git a/src/main/java/org/torproject/descriptor/index/FileType.java b/src/main/java/org/torproject/descriptor/internal/FileType.java
similarity index 69%
rename from src/main/java/org/torproject/descriptor/index/FileType.java
rename to src/main/java/org/torproject/descriptor/internal/FileType.java
index 9bb7e5f..47bbd28 100644
--- a/src/main/java/org/torproject/descriptor/index/FileType.java
+++ b/src/main/java/org/torproject/descriptor/internal/FileType.java
@@ -1,7 +1,7 @@
/* Copyright 2016--2017 The Tor Project
* See LICENSE for licensing information */
-package org.torproject.descriptor.index;
+package org.torproject.descriptor.internal;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorInputStream;
import org.apache.commons.compress.compressors.bzip2.BZip2CompressorOutputStream;
@@ -16,14 +16,20 @@ import java.io.InputStream;
import java.io.OutputStream;
/**
- * A file type enum provides all compression functionality.
+ * These enums provide compression functionality.
+ *
+ * <p>{@link #findType} determines the compression type by the given extension.
+ * Compression can also be zero-compression, which is currently provided by
+ * the PLAIN and JSON enums.</p>
*
* @since 1.4.0
*/
public enum FileType {
+
BZ2(BZip2CompressorInputStream.class, BZip2CompressorOutputStream.class),
GZ(GzipCompressorInputStream.class, GzipCompressorOutputStream.class),
JSON(BufferedInputStream.class, BufferedOutputStream.class),
+ PLAIN(BufferedInputStream.class, BufferedOutputStream.class),
XZ(XZCompressorInputStream.class, XZCompressorOutputStream.class);
private final Class<? extends InputStream> inClass;
@@ -34,6 +40,20 @@ public enum FileType {
this.outClass = out;
}
+ /**
+ * Returns <code>valueOf</code> or the default enum {@link #PLAIN}, i.e.,
+ * this method doesn't throw any exceptions and allways returns a valid enum.
+ */
+ public static FileType findType(String ext) {
+ FileType res = null;
+ try {
+ res = FileType.valueOf(ext.toUpperCase());
+ return res;
+ } catch (IllegalArgumentException | NullPointerException re) {
+ return PLAIN;
+ }
+ }
+
/** Return the appropriate input stream. */
public InputStream inputStream(InputStream is) throws Exception {
return this.inClass.getConstructor(new Class[]{InputStream.class})
1
0
10 Oct '17
commit 0da6953cdd3811a737508afe160c7efd41465747
Author: Karsten Loesing <karsten.loesing(a)gmx.net>
Date: Mon Jul 3 11:17:41 2017 +0200
Update to Debian stretch libraries.
---
CHANGELOG.md | 8 ++++++++
build.xml | 8 ++++----
src/build | 2 +-
3 files changed, 13 insertions(+), 5 deletions(-)
diff --git a/CHANGELOG.md b/CHANGELOG.md
index c6543f2..1b27d12 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,11 @@
+# Changes in version 2.?.? - 2017-??-??
+
+ * Major changes
+ - Update dependencies to versions available in Debian stretch:
+ Apache Commons Compress 1.13, Apache Commons Lang 3.5, Google
+ Gson 2.4, JUnit 4.12, Logback 1.1.9, SLF4J 1.7.22, and XZ 1.6.
+
+
# Changes in version 2.0.0 - 2017-06-28
* Major changes
diff --git a/build.xml b/build.xml
index eaaa5ae..0eba3ff 100644
--- a/build.xml
+++ b/build.xml
@@ -14,10 +14,10 @@
<property name="jarpatternprop" value="empty" />
<patternset id="runtime" >
- <include name="commons-compress-1.9.jar"/>
- <include name="gson-2.2.4.jar"/>
- <include name="slf4j-api-1.7.7.jar" />
- <include name="xz-1.5.jar"/>
+ <include name="commons-compress-1.13.jar"/>
+ <include name="gson-2.4.jar"/>
+ <include name="slf4j-api-1.7.22.jar" />
+ <include name="xz-1.6.jar"/>
</patternset>
<target name="coverage-check">
diff --git a/src/build b/src/build
index e130139..b491c84 160000
--- a/src/build
+++ b/src/build
@@ -1 +1 @@
-Subproject commit e130139e1a551bcf3e6437a85799590600f4b096
+Subproject commit b491c845ab81027d2f29fe541f8303ff151d3d0b
1
0