Browse Source

Merge remote-tracking branch 'teor/fallback-code-2018-01'

Nick Mathewson 7 years ago
parent
commit
143da73165

+ 3 - 0
changes/bug20942

@@ -0,0 +1,3 @@
+  o Minor features (fallback directory mirrors):
+    - Reject any fallback directory mirror that serves an expired consensus.
+      Implements ticket 20942, patch by "minik".

+ 4 - 0
changes/bug24708

@@ -0,0 +1,4 @@
+  o Minor bugfixes (fallback directory mirrors):
+    - Make updateFallbackDirs.py search harder for python.
+      (Some OSs don't put it in /usr/bin.)
+      Fixes bug 24708; bugfix on 0.2.8.1-alpha.

+ 3 - 0
changes/ticket22321

@@ -0,0 +1,3 @@
+  o Minor features (fallbacks):
+    - Update the fallback whitelist and blacklist based on opt-ins and relay
+      changes. Closes tickets 22321, 24678, 22527, 24135, and 24695.

+ 5 - 0
changes/ticket22759

@@ -0,0 +1,5 @@
+  o Minor features (fallback directory mirrors):
+    - Add an extrainfo cache flag for each fallback in a C comment.
+      This allows stem to use fallbacks to fetch extra-info documents,
+      rather than using authorities.
+      Implements ticket 22759.

+ 5 - 0
changes/ticket24600

@@ -0,0 +1,5 @@
+  o Minor features (fallback directory mirrors):
+    - Add a nickname to each fallback in a C comment. This makes it easier for
+      operators to find their relays, and allows stem to use nicknames to
+      identify fallbacks.
+      Implements ticket 24600.

+ 5 - 0
changes/ticket24679

@@ -0,0 +1,5 @@
+  o Minor features (fallback directory mirrors):
+    - Remove the "weight=10" line from fallback directory mirror entries.
+      Ticket 24681 will maintain the current fallback weights by changing
+      Tor's default fallback weight to 10.
+      Implements ticket 24679.

+ 6 - 0
changes/ticket24706

@@ -0,0 +1,6 @@
+  o Minor features (fallback directory mirrors):
+    - Add the generateFallbackDirLine.py script for automatically generating
+      fallback directory mirror lines from relay fingerprints. No more typos!
+      Add the lookupFallbackDirContact.py script for automatically looking up
+      operator contact info from relay fingerprints.
+      Implements ticket 24706, patch by teor and atagar.

+ 5 - 0
changes/ticket24725

@@ -0,0 +1,5 @@
+  o Minor features (fallback directory mirrors):
+    - Add a type and version header to the fallback directory mirror file.
+      Also add a delimiter to the end of each fallback entry.
+      This helps external parsers like stem and Relay Search.
+      Implements ticket 24725.

+ 4 - 0
changes/ticket24726

@@ -0,0 +1,4 @@
+  o Minor features (fallback directory mirrors):
+    - Remove commas and equals signs from external string inputs to the
+      fallback list. This avoids format confusion attacks.
+      Implements ticket 24726.

+ 6 - 0
changes/ticket24785

@@ -0,0 +1,6 @@
+  o Minor features (fallbacks):
+    - Avoid selecting fallbacks that change their IP addresses too often.
+      Select more fallbacks by ignoring the Guard flag, and allowing lower
+      cutoffs for the Running and V2Dir flags. Also allow a lower bandwidth,
+      and a higher number of fallbacks per operator (5% of the list).
+      Implements ticket 24785.

+ 3 - 0
changes/ticket24791

@@ -0,0 +1,3 @@
+  o Code simplification and refactoring (fallbacks):
+    - Stop logging excessive information about fallback netblocks.
+      Implements ticket 24791.

+ 6 - 48
scripts/maint/fallback.blacklist

@@ -3,6 +3,8 @@
 # Format:
 # Format:
 # [ IPv4[:DirPort] ] [ orport=<ORPort> ] [ id=<ID> ] ...
 # [ IPv4[:DirPort] ] [ orport=<ORPort> ] [ id=<ID> ] ...
 #   [ ipv6=<IPv6>[:<IPv6 ORPort>] ]
 #   [ ipv6=<IPv6>[:<IPv6 ORPort>] ]
+# or use:
+# scripts/maint/generateFallbackDirLine.py fingerprint ...
 #
 #
 # If a sufficiently specific group of attributes matches, the directory mirror
 # If a sufficiently specific group of attributes matches, the directory mirror
 # will be excluded: (each group is listed on its own line)
 # will be excluded: (each group is listed on its own line)
@@ -35,14 +37,6 @@
 62.210.207.124:9030 orport=9001 id=58938B1A5C4029B4415D38A4F36B7724273F4755 ipv6=[2001:bc8:31eb:100::1]:9001
 62.210.207.124:9030 orport=9001 id=58938B1A5C4029B4415D38A4F36B7724273F4755 ipv6=[2001:bc8:31eb:100::1]:9001
 62.210.207.124:9130 orport=9101 id=338D0AB6DBAB7B529B9C91B2FD770658000693C4 ipv6=[2001:bc8:31eb:100::1]:9101
 62.210.207.124:9130 orport=9101 id=338D0AB6DBAB7B529B9C91B2FD770658000693C4 ipv6=[2001:bc8:31eb:100::1]:9101
 
 
-# these fallback candidates fail the consensus download test in a way that
-# causes stem to hang (and not respond to ^C, at least on OS X)
-# (Is something sending weird responses to DirPort traffic?)
-#217.23.14.190:1194
-#151.80.164.147:80
-#148.251.255.92:80
-#78.142.19.59:80
-
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 216.17.99.183:80 orport=443 id=D52CD431CEF28E01B11F545A84347EE45524BCA7
 216.17.99.183:80 orport=443 id=D52CD431CEF28E01B11F545A84347EE45524BCA7
 216.17.99.183:8080 orport=9001 id=EE21F83AB6F76E3B3FFCBA5C2496F789CB84E7C6
 216.17.99.183:8080 orport=9001 id=EE21F83AB6F76E3B3FFCBA5C2496F789CB84E7C6
@@ -74,9 +68,6 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.21.216.140:9030 orport=9001 id=921DA852C95141F8964B359F774B35502E489869
 185.21.216.140:9030 orport=9001 id=921DA852C95141F8964B359F774B35502E489869
 
 
-# Email sent directly to teor, verified using relay contact info
-62.210.82.44:143 orport=21 id=1C90D3AEADFF3BCD079810632C8B85637924A58E ipv6=[2001:bc8:3d7c::]:21
-
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 46.101.220.161:80 orport=443 id=7DDFE5B2C306B19A79832FBE581EAA245BAE90C6 ipv6=[2a03:b0c0:3:d0::8b:3001]:443
 46.101.220.161:80 orport=443 id=7DDFE5B2C306B19A79832FBE581EAA245BAE90C6 ipv6=[2a03:b0c0:3:d0::8b:3001]:443
 
 
@@ -200,45 +191,12 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 88.190.208.4:30555 orport=30556 id=030A6EB24725C05D8E0FCE21923CBA5223E75E0E
 88.190.208.4:30555 orport=30556 id=030A6EB24725C05D8E0FCE21923CBA5223E75E0E
 
 
-# Fallback was on 0.2.8.2-alpha list, but changed fingerprint before 0.2.8.5
-46.101.102.71:80 orport=443 id=9504CB22EEB25D344DE63CB7A6F2C46F895C3686 ipv6=[2a03:b0c0:3:d0::2ed:7001]:9050
-# Also blacklist anything with the new fingerprint
-id=9C8A123081EFBE022EF795630F447839DDFDDDEC
-
-# Fallbacks were on 0.2.8.2-alpha list, but downloads were slow before 0.2.8.5
-185.96.88.29:80 orport=443 id=86C281AD135058238D7A337D546C902BE8505DDE
-178.62.36.64:9030 orport=9001 id=B87C84E38DAECFFFFDE98E5AEE5786AFDC748F2C
-
-# Fallback was on 0.2.8.2-alpha list, but changed address before 0.2.8.5
-84.219.173.60:9030 orport=443 id=855BC2DABE24C861CD887DB9B2E950424B49FC34
-# Also blacklist anything with the new address
-84.216.235.55:9030 orport=443
-
-# Fallbacks were on 0.2.8.2-alpha list, but disappeared before 0.2.8.5
-81.7.17.171:80 orport=443 id=CFECDDCA990E3EF7B7EC958B22441386B6B8D820 ipv6=[2a02:180:1:1::517:11ab]:443
-51.254.215.121:80 orport=443 id=262B66AD25C79588AD1FC8ED0E966395B47E5C1D
-185.100.85.138:80 orport=46356 id=5C4DF16A0029CC4F67D3E127356E68F219269859
-
 # Fallback was on 0.2.8.2-alpha list, but opted-out before 0.2.8.6
 # Fallback was on 0.2.8.2-alpha list, but opted-out before 0.2.8.6
 37.187.1.149:9030 orport=9001 id=08DC0F3C6E3D9C527C1FC8745D35DD1B0DE1875D ipv6=[2001:41d0:a:195::1]:9001
 37.187.1.149:9030 orport=9001 id=08DC0F3C6E3D9C527C1FC8745D35DD1B0DE1875D ipv6=[2001:41d0:a:195::1]:9001
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 195.154.15.227:9030 orport=9001 id=6C3E3AB2F5F03CD71B637D433BAD924A1ECC5796
 195.154.15.227:9030 orport=9001 id=6C3E3AB2F5F03CD71B637D433BAD924A1ECC5796
 
 
-# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9
-195.154.8.111:80 orport=443 id=FCB6695F8F2DC240E974510A4B3A0F2B12AB5B64
-# Same operator, not on 0.2.8.6 list, also changed IPv4
-51.255.235.246:80 orport=443 id=9B99C72B02AF8E3E5BE3596964F9CACD0090D132
-
-# Fallback was on 0.2.8.6 list, but changed IPv4 before 0.2.9
-5.175.233.86:80 orport=443 id=5525D0429BFE5DC4F1B0E9DE47A4CFA169661E33
-
-# Fallbacks were on 0.2.8.6 list, but went down before 0.2.9
-194.150.168.79:11112 orport=11111 id=29F1020B94BE25E6BE1AD13E93CE19D2131B487C
-94.126.23.174:9030 orport=9001 id=6FC6F08270D565BE89B7C819DD8E2D487397C073
-195.191.233.221:80 orport=443 id=DE134FC8E5CC4EC8A5DE66934E70AC9D70267197
-176.31.180.157:143 orport=22 id=E781F4EC69671B3F1864AE2753E0890351506329 ipv6=[2001:41d0:8:eb9d::1]:22
-
 # Fallback was on 0.2.8.6 list, but opted-out before 0.2.9
 # Fallback was on 0.2.8.6 list, but opted-out before 0.2.9
 144.76.73.140:9030 orport=9001 id=6A640018EABF3DA9BAD9321AA37C2C87BBE1F907
 144.76.73.140:9030 orport=9001 id=6A640018EABF3DA9BAD9321AA37C2C87BBE1F907
 
 
@@ -256,9 +214,6 @@ id=9C8A123081EFBE022EF795630F447839DDFDDDEC
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 104.243.35.196:9030 orport=9001 id=FA3415659444AE006E7E9E5375E82F29700CFDFD
 104.243.35.196:9030 orport=9001 id=FA3415659444AE006E7E9E5375E82F29700CFDFD
 
 
-# Relay changed IPv4 address, operator uncontactable
-138.201.130.32:9030 orport=9001 id=52AEA31188331F421B2EDB494DB65CD181E5B257
-
 # Emails sent directly to teor, verified using relay contact info
 # Emails sent directly to teor, verified using relay contact info
 217.12.199.208:80 orport=443 id=DF3AED4322B1824BF5539AE54B2D1B38E080FF05 ipv6=[2a02:27a8:0:2::7e]:443
 217.12.199.208:80 orport=443 id=DF3AED4322B1824BF5539AE54B2D1B38E080FF05 ipv6=[2a02:27a8:0:2::7e]:443
 
 
@@ -269,6 +224,9 @@ id=9C8A123081EFBE022EF795630F447839DDFDDDEC
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 5.35.251.247:9030 orport=9001 id=9B1F5187DFBA89DC24B37EA7BF896C12B43A27AE
 5.35.251.247:9030 orport=9001 id=9B1F5187DFBA89DC24B37EA7BF896C12B43A27AE
 
 
-#https://lists.torproject.org/pipermail/tor-relays/2017-May/012281.html
+#https://lists.torproject.org/pipermail/tor-relays/2017-May/012281.html
 62.210.124.124:9030 orport=9001 id=86E78DD3720C78DA8673182EF96C54B162CD660C ipv6=[2001:bc8:3f23:100::1]:9001
 62.210.124.124:9030 orport=9001 id=86E78DD3720C78DA8673182EF96C54B162CD660C ipv6=[2001:bc8:3f23:100::1]:9001
 62.210.124.124:9130 orport=9101 id=2EBD117806EE43C3CC885A8F1E4DC60F207E7D3E ipv6=[2001:bc8:3f23:100::1]:9101
 62.210.124.124:9130 orport=9101 id=2EBD117806EE43C3CC885A8F1E4DC60F207E7D3E ipv6=[2001:bc8:3f23:100::1]:9101
+
+# Email sent directly to teor
+212.51.156.193:995 orport=110 id=32E7AAF1F602814D699BEF6761AD03E387758D49 ipv6=[2a02:168:4a01::49]:110

+ 245 - 78
scripts/maint/fallback.whitelist

@@ -2,6 +2,8 @@
 #
 #
 # Format:
 # Format:
 # IPv4:DirPort orport=<ORPort> id=<ID> [ ipv6=<IPv6>:<IPv6 ORPort> ]
 # IPv4:DirPort orport=<ORPort> id=<ID> [ ipv6=<IPv6>:<IPv6 ORPort> ]
+# or use:
+# scripts/maint/generateFallbackDirLine.py fingerprint ...
 #
 #
 # All attributes must match for the directory mirror to be included.
 # All attributes must match for the directory mirror to be included.
 # If the fallback has an ipv6 key, the whitelist line must also have
 # If the fallback has an ipv6 key, the whitelist line must also have
@@ -28,8 +30,9 @@
 # <IPv4>:<DirPort> orport=<ORPort> id=<ID> [ ipv6=<IPv6>:<IPv6 ORPort> ]
 # <IPv4>:<DirPort> orport=<ORPort> id=<ID> [ ipv6=<IPv6>:<IPv6 ORPort> ]
 
 
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008362.html
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008362.html
-78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE
-131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8
+# https://trac.torproject.org/projects/tor/ticket/22321#comment:22
+78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE ipv6=[2a01:4f8:120:4023::110]:80 # fluxe3
+131.188.40.188:1443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8 ipv6=[2001:638:a000:4140::ffff:188]:80 # fluxe4
 
 
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008366.html
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008366.html
 5.39.88.19:9030 orport=9001 id=7CB8C31432A796731EA7B6BF4025548DFEB25E0C ipv6=[2001:41d0:8:9a13::1]:9050
 5.39.88.19:9030 orport=9001 id=7CB8C31432A796731EA7B6BF4025548DFEB25E0C ipv6=[2001:41d0:8:9a13::1]:9050
@@ -52,17 +55,21 @@
 
 
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008379.html
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008379.html
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-91.121.84.137:4951 orport=4051 id=6DE61A6F72C1E5418A66BFED80DFB63E4C77668F ipv6=[2001:41d0:1:8989::1]:4051
-91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334 ipv6=[2001:41d0:1:8989::1]:4052
+91.121.84.137:4951 orport=4051 id=6DE61A6F72C1E5418A66BFED80DFB63E4C77668F
+91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334
 
 
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008381.html
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008381.html
-# Sent additional email to teor with more relays
-178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422
-178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377
-178.254.20.134:9030 orport=9001 id=2CE96A8A1DA032664C90F574AFFBECE18A6E8DFC
-178.254.44.135:80 orport=443 id=AE6A8C18E7499B586CD36246AC4BCAFFBBF93AB2
-178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE
-178.254.13.126:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5
+# Sent additional emails to teor with updated relays
+81.7.11.96:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422 # Doedel22
+# 9F5068310818ED7C70B0BC4087AB55CB12CB4377 not found in current consensus
+178.254.19.101:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE # Freebird31
+178.254.19.101:9030 orport=9001 id=0C475BA4D3AA3C289B716F95954CAD616E50C4E5 # Freebird32
+81.7.14.253:9001 orport=443 id=1AE039EE0B11DB79E4B4B29CBA9F752864A0259E # Ichotolot60
+81.7.11.186:1080 orport=443 id=B86137AE9681701901C6720E55C16805B46BD8E3 # BeastieJoy60
+85.25.213.211:465 orport=80 id=CE47F0356D86CF0A1A2008D97623216D560FB0A8 # BeastieJoy61
+85.25.159.65:995 orport=80 id=52BFADA8BEAA01BA46C8F767F83C18E2FE50C1B9 # BeastieJoy63
+81.7.3.67:993 orport=443 id=A2E6BB5C391CD46B38C55B4329C35304540771F1 # BeastieJoy62
+81.7.14.31:9001 orport=443 id=7600680249A22080ECC6173FBBF64D6FCF330A61 # Ichotolot62
 
 
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008382.html
 # https://lists.torproject.org/pipermail/tor-relays/2015-December/008382.html
 51.255.33.237:9091 orport=9001 id=A360C21FA87FFA2046D92C17086A6B47E5C68109
 51.255.33.237:9091 orport=9001 id=A360C21FA87FFA2046D92C17086A6B47E5C68109
@@ -97,12 +104,9 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A ipv6=[2001:67c:289c:3::77]:443
 171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A ipv6=[2001:67c:289c:3::77]:443
 171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE ipv6=[2001:67c:289c:3::78]:443
 171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE ipv6=[2001:67c:289c:3::78]:443
-171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576
 171.25.193.20:80 orport=443 id=DD8BD7307017407FCC36F8D04A688F74A0774C02 ipv6=[2001:67c:289c::20]:443
 171.25.193.20:80 orport=443 id=DD8BD7307017407FCC36F8D04A688F74A0774C02 ipv6=[2001:67c:289c::20]:443
-# OK, but same machine as 79861CF8522FC637EF046F7688F5289E49D94576
-#171.25.193.132:80 orport=443 id=01C67E0CA8F97111E652C7564CB3204361FFFAB8
-# OK, but same machine as DD8BD7307017407FCC36F8D04A688F74A0774C02
-#171.25.193.25:80 orport=443 id=185663B7C12777F052B2C2D23D7A239D8DA88A0F ipv6=[2001:67c:289c::25]:443
+# same machine as DD8BD7307017407FCC36F8D04A688F74A0774C02
+171.25.193.25:80 orport=443 id=185663B7C12777F052B2C2D23D7A239D8DA88A0F ipv6=[2001:67c:289c::25]:443
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68 ipv6=[2001:bc8:4400:2100::f03]:9001
 212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68 ipv6=[2001:bc8:4400:2100::f03]:9001
@@ -110,8 +114,12 @@
 46.28.109.231:9030 orport=9001 id=F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610 ipv6=[2a02:2b88:2:1::4205:1]:9001
 46.28.109.231:9030 orport=9001 id=F70B7C5CD72D74C7F9F2DC84FA9D20D51BA13610 ipv6=[2a02:2b88:2:1::4205:1]:9001
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE
-185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216
+85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE # TykRelay01
+185.96.88.29:80 orport=443 id=86C281AD135058238D7A337D546C902BE8505DDE # TykRelay051
+# This fallback opted-in in previous releases, then changed its details,
+# and so we blacklisted it. Now we want to whitelist changes.
+# Assume details update is permanent
+185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216 # TykRelay06
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.11.180.67:80 orport=9001 id=794D8EA8343A4E820320265D05D4FA83AB6D1778
 185.11.180.67:80 orport=9001 id=794D8EA8343A4E820320265D05D4FA83AB6D1778
@@ -151,9 +159,10 @@
 109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281
 109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281
 109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9
 109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9
 62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF
 62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF
-77.247.181.162:80 orport=443 id=7BB160A8F54BD74F3DA5F2CE701E8772B841859D
-77.247.181.164:80 orport=443 id=10E13E340651D0EF66B4DEBF610B3C0981168107
-77.247.181.166:80 orport=443 id=06E123865C590189B3181114F23F0F13A7BC0E69
+# Assume details update is permanent
+77.247.181.166:80 orport=443 id=77131D7E2EC1CA9B8D737502256DA9103599CE51 # CriticalMass
+77.247.181.164:80 orport=443 id=204DFD2A2C6A0DC1FA0EACB495218E0B661704FD # HaveHeart
+77.247.181.162:80 orport=443 id=7BFB908A3AA5B491DA4CA72CCBEE0E1F2A939B55 # sofia
 
 
 # https://twitter.com/biotimylated/status/718994247500718080
 # https://twitter.com/biotimylated/status/718994247500718080
 212.47.252.149:9030 orport=9001 id=2CAC39BAA996791CEFAADC9D4754D65AF5EB77C0
 212.47.252.149:9030 orport=9001 id=2CAC39BAA996791CEFAADC9D4754D65AF5EB77C0
@@ -205,20 +214,19 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 89.187.142.208:80 orport=443 id=64186650FFE4469EBBE52B644AE543864D32F43C
 89.187.142.208:80 orport=443 id=64186650FFE4469EBBE52B644AE543864D32F43C
 
 
-# Email sent directly to teor, verified using relay contact info
-212.51.134.123:9030 orport=9001 id=50586E25BE067FD1F739998550EDDCB1A14CA5B2 ipv6=[2a02:168:6e00:0:3a60:77ff:fe9c:8bd1]:9001
+# Email sent directly to teor
+# Assume details update is permanent
+212.51.134.123:9030 orport=9001 id=50586E25BE067FD1F739998550EDDCB1A14CA5B2 # Jans
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 46.101.143.173:80 orport=443 id=F960DF50F0FD4075AC9B505C1D4FFC8384C490FB
 46.101.143.173:80 orport=443 id=F960DF50F0FD4075AC9B505C1D4FFC8384C490FB
 
 
-# Email sent directly to teor, verified using relay contact info
-217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B
-
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524
 193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-197.231.221.211:9030 orport=9001 id=BC630CBBB518BE7E9F4E09712AB0269E9DC7D626
+# Assume details update is permanent
+197.231.221.211:9030 orport=443 id=BC630CBBB518BE7E9F4E09712AB0269E9DC7D626 # IPredator
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.61.138.18:8080 orport=4443 id=2541759BEC04D37811C2209A88E863320271EC9C
 185.61.138.18:8080 orport=4443 id=2541759BEC04D37811C2209A88E863320271EC9C
@@ -229,7 +237,7 @@
 193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E
 193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510
+138.201.250.33:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 37.221.162.226:9030 orport=9001 id=D64366987CB39F61AD21DBCF8142FA0577B92811
 37.221.162.226:9030 orport=9001 id=D64366987CB39F61AD21DBCF8142FA0577B92811
@@ -247,7 +255,7 @@
 134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE
 134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7
+173.212.254.192:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1 ipv6=[2a03:b0c0:1:d0::174:1]:9050
 178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1 ipv6=[2a03:b0c0:1:d0::174:1]:9050
@@ -298,14 +306,15 @@
 46.148.18.74:8080 orport=443 id=6CACF0B5F03C779672F3C5C295F37C8D234CA3F7
 46.148.18.74:8080 orport=443 id=6CACF0B5F03C779672F3C5C295F37C8D234CA3F7
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-37.187.102.108:9090 orport=5550 id=F4263275CF54A6836EE7BD527B1328836A6F06E1
-212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C
+37.187.102.108:80 orport=443 id=F4263275CF54A6836EE7BD527B1328836A6F06E1 ipv6=[2001:41d0:a:266c::1]:443 # EvilMoe
+212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C # EvilMoe
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 212.129.38.254:9030 orport=9001 id=FDF845FC159C0020E2BDDA120C30C5C5038F74B4
 212.129.38.254:9030 orport=9001 id=FDF845FC159C0020E2BDDA120C30C5C5038F74B4
 
 
-# Email sent directly to teor, verified using relay contact info
-37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2
+# Email sent directly to teor
+37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2 # thanatosCZ
+5.189.169.190:8030 orport=8080 id=8D79F73DCD91FC4F5017422FAC70074D6DB8DD81 # thanatosDE
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05 ipv6=[2001:41d0:a:74a::1]:443
 37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05 ipv6=[2001:41d0:a:74a::1]:443
@@ -368,14 +377,6 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7
 91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7
 
 
-# Email sent directly to teor, verified using relay contact info
-212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB
-# Ok, but on the same machine as 2A4C448784F5A83AFE6C78DA357D5E31F7989DEB
-#212.47.240.10:81 orport=993 id=72527E3242CB15AADE28374AE0D35833FC083F60
-163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE ipv6=[2001:bc8:4400:2100::2:1009]:443
-# Ok, but on the same machine as AD253B49E303C6AB1E048B014392AC569E8A7DAE
-#163.172.131.88:81 orport=993 id=D5F3FB17504744FB7ECEF46F4B1D155258A6D942 ipv6=[2001:bc8:4400:2100::2:1009]:993
-
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8
 46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8
 178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794
 178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794
@@ -404,8 +405,8 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 5.199.142.236:9030 orport=9001 id=F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265
 5.199.142.236:9030 orport=9001 id=F4C0EDAA0BF0F7EC138746F8FEF1CE26C7860265
 
 
-# Email sent directly to teor, verified using relay contact info
-188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7 ipv6=[2a03:b0c0:2:d0::5:f001]:9001
+# Email sent directly to teor
+188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7 ipv6=[2a03:b0c0:2:d0::26c0:1]:9001 # dropsy
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 46.8.249.10:80 orport=443 id=31670150090A7C3513CB7914B9610E786391A95D
 46.8.249.10:80 orport=443 id=31670150090A7C3513CB7914B9610E786391A95D
@@ -476,9 +477,6 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 95.130.11.147:9030 orport=443 id=6B697F3FF04C26123466A5C0E5D1F8D91925967A
 95.130.11.147:9030 orport=443 id=6B697F3FF04C26123466A5C0E5D1F8D91925967A
 
 
-# Email sent directly to teor, verified using relay contact info
-176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C
-
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5 ipv6=[2a03:b0c0:2:d0::158:3001]:9001
 128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5 ipv6=[2a03:b0c0:2:d0::158:3001]:9001
 
 
@@ -497,8 +495,8 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088
 185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088
 
 
-# Email sent directly to teor, verified using relay contact info
-149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76
+# Email sent directly to teor
+149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76 ipv6=[2607:5300:201:3000::17d3]:9002 # PiotrTorpotkinOne
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243 ipv6=[2001:15e8:201:1::d10a]:80
 81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243 ipv6=[2001:15e8:201:1::d10a]:80
@@ -536,8 +534,8 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109 ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001
 212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109 ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001
 
 
-# Email sent directly to teor, verified using relay contact info
-176.158.132.12:9030 orport=9001 id=DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686
+# Email sent directly to teor
+176.158.236.102:9030 orport=9001 id=DC163DDEF4B6F0C6BC226F9F6656A5A30C5C5686 # Underworld
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F
 91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F
@@ -545,8 +543,8 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621 ipv6=[2001:981:47c1:1::6]:443
 80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621 ipv6=[2001:981:47c1:1::6]:443
 
 
-# Email sent directly to teor, verified using relay contact info
-163.172.138.22:80 orport=443 id=8664DC892540F3C789DB37008236C096C871734D ipv6=[2001:bc8:4400:2100::1:3]:443
+# Email sent directly to teor
+163.172.138.22:80 orport=443 id=16102E458460349EE45C0901DAA6C30094A9BBEA ipv6=[2001:bc8:4400:2100::1:3]:443 # mkultra
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94
 97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94
@@ -580,7 +578,8 @@
 167.114.113.48:9030 orport=403 id=2EC0C66EA700C44670444280AABAB1EC78B722A0
 167.114.113.48:9030 orport=403 id=2EC0C66EA700C44670444280AABAB1EC78B722A0
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-79.120.16.42:9030 orport=9001 id=BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6
+# Assume details update is permanent
+213.141.138.174:9030 orport=9001 id=BD552C165E2ED2887D3F1CCE9CFF155DDA2D86E6 # Schakalium
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90 ipv6=[2a02:ec0:209:10::4]:443
 95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90 ipv6=[2a02:ec0:209:10::4]:443
@@ -609,10 +608,13 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798
 31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798
 
 
-# Email sent directly to teor, verified using relay contact info
-96.47.231.214:9030 orport=8080 id=F843CB5729575D76FF1FFBB2179BDCF52C0C6387
-192.99.246.48:9030 orport=9001 id=CD6B149BED1BB254EF6DFF9D75DDB11E7F8A38A4 ipv6=[2607:5300:100:200::de3]:9002
-192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F ipv6=[2605:e200:d00c:c01d::1111]:9002
+# Email sent directly to teor
+192.160.102.169:80 orport=9001 id=C0192FF43E777250084175F4E59AC1BA2290CE38 ipv6=[2620:132:300c:c01d::9]:9002 # manipogo
+192.160.102.166:80 orport=9001 id=547DA56F6B88B6C596B3E3086803CDA4F0EF8F21 ipv6=[2620:132:300c:c01d::6]:9002 # chaucer
+192.160.102.170:80 orport=9001 id=557ACEC850F54EEE65839F83CACE2B0825BE811E ipv6=[2620:132:300c:c01d::a]:9002 # ogopogo
+192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F ipv6=[2620:132:300c:c01d::4]:9002 # snowfall
+192.160.102.165:80 orport=9001 id=C90CA3B7FE01A146B8268D56977DC4A2C024B9EA ipv6=[2620:132:300c:c01d::5]:9002 # cowcat
+192.160.102.168:80 orport=9001 id=F6A358DD367B3282D6EF5824C9D45E1A19C7E815 ipv6=[2620:132:300c:c01d::8]:9002 # prawksi
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664
 136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664
@@ -623,8 +625,8 @@
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024
 192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024
-# OK, but same machine as ED2338CAC2711B3E331392E1ED2831219B794024
-#192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7
+# same machine as ED2338CAC2711B3E331392E1ED2831219B794024
+192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7
 
 
 # https://twitter.com/kosjoli/status/719507270904758272
 # https://twitter.com/kosjoli/status/719507270904758272
 85.10.202.87:9030 orport=9001 id=971AFB23C168DCD8EDA17473C1C452B359DE3A5A
 85.10.202.87:9030 orport=9001 id=971AFB23C168DCD8EDA17473C1C452B359DE3A5A
@@ -680,7 +682,8 @@
 213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2 ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337
 213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2 ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-188.40.128.246:9030 orport=9001 id=AD19490C7DBB26D3A68EFC824F67E69B0A96E601
+# Assume details update is permanent
+188.40.128.246:9030 orport=9001 id=AD19490C7DBB26D3A68EFC824F67E69B0A96E601 ipv6=[2a01:4f8:221:1ac1:dead:beef:7005:9001]:9001 # sputnik
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 88.198.253.13:9030 orport=9001 id=DF924196D69AAE3C00C115A9CCDF7BB62A175310 ipv6=[2a01:4f8:11a:b1f::2]:9001
 88.198.253.13:9030 orport=9001 id=DF924196D69AAE3C00C115A9CCDF7BB62A175310 ipv6=[2a01:4f8:11a:b1f::2]:9001
@@ -698,19 +701,44 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA
 107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA
 
 
-# Email sent directly to teor, verified using relay contact info
-192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC
-
-# Email sent directly to teor, verified using relay contact info
-163.172.35.249:80 orport=443 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A
-163.172.35.247:80 orport=443 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4
+# Email sent directly to teor
+193.70.112.165:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC # ParkBenchInd001
+
+# Email sent directly to teor
+185.220.101.6:10006 orport=20006 id=C08DE49658E5B3CFC6F2A952B453C4B608C9A16A # niftyvolcanorabbit
+185.220.101.13:10013 orport=20013 id=71AB4726D830FAE776D74AEF790CF04D8E0151B4 # niftycottontail
+185.220.101.5:10005 orport=20005 id=1084200B44021D308EA4253F256794671B1D099A # niftyhedgehog
+185.220.101.9:10009 orport=20009 id=14877C6384A9E793F422C8D1DDA447CACA4F7C4B # niftywoodmouse
+185.220.101.8:10008 orport=20008 id=24E91955D969AEA1D80413C64FE106FAE7FD2EA9 # niftymouse
+185.220.101.1:10001 orport=20001 id=28F4F392F8F19E3FBDE09616D9DB8143A1E2DDD3 # niftycottonmouse
+185.220.101.21:10021 orport=20021 id=348B89013EDDD99E4755951D1EC284D9FED71226 # niftysquirrel
+185.220.101.10:10010 orport=20010 id=4031460683AE9E0512D3620C2758D98758AC6C93 # niftyeuropeanrabbit
+185.220.101.34:10034 orport=20034 id=47C42E2094EE482E7C9B586B10BABFB67557030B # niftyquokka
+185.220.101.18:10018 orport=20018 id=5D5006E4992F2F97DF4F8B926C3688870EB52BD8 # niftyplagiodontia
+185.220.101.28:10028 orport=20028 id=609E598FB6A00BCF7872906B602B705B64541C50 # niftychipmunk
+185.220.101.20:10020 orport=20020 id=619349D82424C601CAEB94161A4CF778993DAEE7 # niftytucotuco
+185.220.101.17:10017 orport=20017 id=644DECC5A1879C0FE23DE927DD7049F58BBDF349 # niftyhutia
+185.220.101.0:10000 orport=20000 id=6E94866ED8CA098BACDFD36D4E8E2B459B8A734E # niftybeaver
+185.220.101.30:10030 orport=20030 id=71CFDEB4D9E00CCC3E31EC4E8A29E109BBC1FB36 # niftypedetidae
+185.220.101.29:10029 orport=20029 id=7DC52AE6667A30536BA2383CD102CFC24F20AD71 # niftyllipika
+185.220.101.41:10041 orport=20041 id=7E281CD2C315C4F7A84BC7C8721C3BC974DDBFA3 # niftyporcupine
+185.220.101.25:10025 orport=20025 id=8EE0534532EA31AA5172B1892F53B2F25C76EB02 # niftyjerboa
+185.220.101.33:10033 orport=20033 id=906DCB390F2BA987AE258D745E60BAAABAD31DE8 # niftyquokka
+185.220.101.26:10026 orport=20026 id=92A6085EABAADD928B6F8E871540A1A41CBC08BA # niftypedetes
+185.220.101.40:10040 orport=20040 id=9A857254F379194D1CD76F4A79A20D2051BEDA3F # niftynutria
+185.220.101.42:10042 orport=20042 id=9B816A5B3EB20B8E4E9B9D1FBA299BD3F40F0320 # niftypygmyjerboa
+185.220.101.2:10002 orport=20002 id=B740BCECC4A9569232CDD45C0E1330BA0D030D33 # niftybunny
+185.220.101.32:10032 orport=20032 id=B771AA877687F88E6F1CA5354756DF6C8A7B6B24 # niftypika
+185.220.101.12:10012 orport=20012 id=BC82F2190DE2E97DE65F49B4A95572374BDC0789 # niftycapybara
+185.220.101.22:10022 orport=20022 id=CA37CD46799449D83B6B98B8C22C649906307888 # niftyjackrabbit
+185.220.101.4:10004 orport=20004 id=CDA2EA326E2272C57ACB26773D7252C211795B78 # niftygerbil
+185.220.101.14:10014 orport=20014 id=E7EBA5D8A4E09684D11A1DF24F75362817333768 # niftyhare
+185.220.101.16:10016 orport=20016 id=EC1997D51892E4607C68E800549A1E7E4694005A # niftyguineapig
+185.220.101.24:10024 orport=20024 id=FDA70EC93DB01E3CB418CB6943B0C68464B18B4C # niftyrat
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2
 64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2
 
 
-# Email sent directly to teor, verified using relay contact info
-212.51.156.193:995 orport=110 id=32E7AAF1F602814D699BEF6761AD03E387758D49 ipv6=[2a02:168:4a01::49]:110
-
 # Emails sent directly to teor, verified using relay contact info
 # Emails sent directly to teor, verified using relay contact info
 51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF
 51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF
 
 
@@ -767,17 +795,17 @@
 178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB ipv6=[2001:41d0:2:a683::251]:443
 178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB ipv6=[2001:41d0:2:a683::251]:443
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-#31.185.104.19:80 orport=443 id=9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D
-# OK, but on same machine as 9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D
+31.185.104.19:80 orport=443 id=9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D
+# same machine as 9EAD5B2D3DBD96DBC80DCE423B0C345E920A758D
 31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D
 31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D
-#31.185.104.21:80 orport=443 id=C2AAB088555850FC434E68943F551072042B85F1
-#31.185.104.22:80 orport=443 id=5BA3A52760A0EABF7E7C3ED3048A77328FF0F148
+31.185.104.21:80 orport=443 id=C2AAB088555850FC434E68943F551072042B85F1
+31.185.104.22:80 orport=443 id=5BA3A52760A0EABF7E7C3ED3048A77328FF0F148
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.34.60.114:80 orport=443 id=7F7A695DF6F2B8640A70B6ADD01105BC2EBC5135
 185.34.60.114:80 orport=443 id=7F7A695DF6F2B8640A70B6ADD01105BC2EBC5135
 
 
-# Email sent directly to teor, verified using relay contact info
-94.142.242.84:80 orport=443 id=AA0D167E03E298F9A8CD50F448B81FBD7FA80D56 ipv6=[2a02:898:24:84::1]:443
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013939.html
+94.142.242.84:80 orport=443 id=AA0D167E03E298F9A8CD50F448B81FBD7FA80D56 ipv6=[2a02:898:24:84::1]:443 # rejozenger
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F ipv6=[2a06:d380:0:3700::62]:9001
 185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F ipv6=[2a06:d380:0:3700::62]:9001
@@ -818,12 +846,151 @@
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812
 85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812
 
 
-# Email sent directly to teor, verified using relay contact info
-72.52.75.27:9030 orport=9001 id=1220F0F20E80D348244C5F3B6D126DAA0A446DFD
+# email sent directly to teor
+72.52.75.27:9030 orport=9001 id=8567AD0A6369ED08527A8A8533A5162AC00F7678 # piecoopdotnet
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
 5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11
 5.9.146.203:80 orport=443 id=1F45542A24A61BF9408F1C05E0DCE4E29F2CBA11
 5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797
 5.9.159.14:9030 orport=9001 id=0F100F60C7A63BED90216052324D29B08CFCF797
 
 
 # Email sent directly to teor, verified using relay contact info
 # Email sent directly to teor, verified using relay contact info
-5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2
+# Assume details update is permanent
+5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2 ipv6=[2a01:4f8:190:30e1::2]:9001 # zwiubel
+
+# https://trac.torproject.org/projects/tor/ticket/22527#comment:1
+199.184.246.250:80 orport=443 id=1F6ABD086F40B890A33C93CC4606EE68B31C9556 ipv6=[2620:124:1009:1::171]:443
+
+# https://trac.torproject.org/projects/tor/ticket/24695
+163.172.53.84:143 orport=21 id=1C90D3AEADFF3BCD079810632C8B85637924A58E ipv6=[2001:bc8:24f8::]:21 # Multivac
+
+# Email sent directly to teor
+54.36.237.163:80 orport=443 id=DB2682153AC0CCAECD2BD1E9EBE99C6815807A1E # GermanCraft2
+
+# Email sent directly to teor
+62.138.7.171:9030 orport=9001 id=9844B981A80B3E4B50897098E2D65167E6AEF127 # 0x3d004
+62.138.7.171:8030 orport=8001 id=9285B22F7953D7874604EEE2B470609AD81C74E9 # 0x3d005
+91.121.23.100:9030 orport=9001 id=3711E80B5B04494C971FB0459D4209AB7F2EA799 # 0x3d002
+91.121.23.100:8030 orport=8001 id=CFBBA0D858F02E40B1432A65F6D13C9BDFE7A46B # 0x3d001
+51.15.13.245:9030 orport=9001 id=CED527EAC230E7B56E5B363F839671829C3BA01B # 0x3d006
+51.15.13.245:8030 orport=8001 id=8EBB8D1CF48FE2AB95C451DA8F10DB6235F40F8A # 0x3d007
+
+# Email sent directly to teor
+104.192.5.248:9030 orport=9001 id=BF735F669481EE1CCC348F0731551C933D1E2278 # Freeway11
+
+# Email sent directly to teor
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013961.html
+178.17.174.14:9030 orport=9001 id=B06F093A3D4DFAD3E923F4F28A74901BD4F74EB1 # TorExitMoldova
+178.17.170.156:9030 orport=9001 id=41C59606AFE1D1AA6EC6EF6719690B856F0B6587 # TorExitMoldova2
+
+# Email sent directly to teor
+163.172.221.44:59030 orport=59001 id=164604F5C86FC8CC9C0288BD9C02311958427597 # altego
+
+# Email sent directly to teor
+46.38.237.221:9030 orport=9001 id=D30E9D4D639068611D6D96861C95C2099140B805 # mine
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013911.html
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013912.html
+199.249.223.62:80 orport=443 id=0077BCBA7244DB3E6A5ED2746E86170066684887 # Quintex13
+199.249.224.45:80 orport=443 id=041646640AB306EA74B001966E86169B04CC88D2 # QuintexAirVPN26
+199.249.223.67:80 orport=443 id=155D6F57425F16C0624D77777641E4EB1B47C6F0 # Quintex18
+199.249.223.45:80 orport=443 id=1AE949967F82BBE7534A3D6BA77A7EBE1CED4369 # Quintex36
+199.249.223.63:80 orport=443 id=1DB25DF59DAA01B5BE3D3CEB8AFED115940EBE8B # Quintex14
+199.249.224.63:80 orport=443 id=1E5136DDC52FAE1219208F0A6BADB0BA62587EE6 # Quintex43
+199.249.224.46:80 orport=443 id=2ED4D25766973713EB8C56A290BF07E06B85BF12 # QuintexAirVPN27
+199.249.223.42:80 orport=443 id=3687FEC7E73F61AC66F7AE251E7DEE6BBD8C0252 # Quintex33
+199.249.223.49:80 orport=443 id=36D68478366CB8627866757EBCE7FB3C17FC1CB8 # Quintex40
+199.249.224.49:80 orport=443 id=3CA0D15567024D2E0B557DC0CF3E962B37999A79 # QuintexAirVPN30
+199.249.223.61:80 orport=443 id=40E7D6CE5085E4CDDA31D51A29D1457EB53F12AD # Quintex12
+199.249.223.76:80 orport=443 id=43209F6D50C657A56FE79AF01CA69F9EF19BD338 # QuintexAirVPN5
+199.249.224.41:80 orport=443 id=54A4820B46E65509BF3E2B892E66930A41759DE9 # QuintexAirVPN22
+199.249.223.73:80 orport=443 id=5649CB2158DA94FB747415F26628BEC07FA57616 # QuintexAirVPN8
+199.249.223.74:80 orport=443 id=5F4CD12099AF20FAF9ADFDCEC65316A376D0201C # QuintexAirVPN7
+199.249.223.75:80 orport=443 id=60D3667F56AEC5C69CF7E8F557DB21DDF6C36060 # QuintexAirVPN6
+199.249.223.46:80 orport=443 id=66E19E8C4773086F669A1E06A3F8C23B6C079129 # Quintex37
+199.249.224.65:80 orport=443 id=764BF8A03868F84C8F323C1A676AA254B80DC3BF # Quintex45
+199.249.223.48:80 orport=443 id=7A3DD280EA4CD4DD16EF8C67B93D9BDE184D1A81 # Quintex39
+199.249.224.68:80 orport=443 id=7E6E9A6FDDB8DC7C92F0CFCC3CBE76C29F061799 # Quintex48
+199.249.223.69:80 orport=443 id=7FA8E7E44F1392A4E40FFC3B69DB3B00091B7FD3 # Quintex20
+199.249.223.44:80 orport=443 id=8B80169BEF71450FC4069A190853523B7AEA45E1 # Quintex35
+199.249.224.60:80 orport=443 id=9314BD9503B9014261A65C221D77E57389DBCCC1 # Quintex50
+199.249.224.40:80 orport=443 id=9C1E7D92115D431385B8CAEA6A7C15FB89CE236B # QuintexAirVPN21
+199.249.223.65:80 orport=443 id=9D21F034C3BFF4E7737D08CF775DC1745706801F # Quintex16
+199.249.224.67:80 orport=443 id=9E2D7C6981269404AA1970B53891701A20424EF8 # Quintex47
+199.249.223.64:80 orport=443 id=9F2856F6D2B89AD4EF6D5723FAB167DB5A53519A # Quintex15
+199.249.224.48:80 orport=443 id=A0DB820FEC87C0405F7BF05DEE5E4ADED2BB9904 # QuintexAirVPN29
+199.249.224.64:80 orport=443 id=A4A393FEF48640961AACE92D041934B55348CEF9 # Quintex44
+199.249.223.72:80 orport=443 id=B028707969D8ED84E6DEA597A884F78AAD471971 # QuintexAirVPN9
+199.249.223.40:80 orport=443 id=B0CD9F9B5B60651ADC5919C0F1EAA87DBA1D9249 # Quintex31
+199.249.224.61:80 orport=443 id=B2197C23A4FF5D1C49EE45BA7688BA8BCCD89A0B # Quintex41
+199.249.223.71:80 orport=443 id=B6320E44A230302C7BF9319E67597A9B87882241 # QuintexAirVPN10
+199.249.223.60:80 orport=443 id=B7047FBDE9C53C39011CA84E5CB2A8E3543066D0 # Quintex11
+199.249.224.66:80 orport=443 id=C78AFFEEE320EA0F860961763E613FD2FAC855F5 # Quintex46
+199.249.224.44:80 orport=443 id=CB7C0D841FE376EF43F7845FF201B0290C0A239E # QuintexAirVPN25
+199.249.223.47:80 orport=443 id=CC14C97F1D23EE97766828FC8ED8582E21E11665 # Quintex38
+199.249.223.77:80 orport=443 id=CC4A3AE960E3617F49BF9887B79186C14CBA6813 # QuintexAirVPN4
+199.249.223.41:80 orport=443 id=D25210CE07C49F2A4F2BC7A506EB0F5EA7F5E2C2 # Quintex32
+199.249.223.79:80 orport=443 id=D33292FEDE24DD40F2385283E55C87F85C0943B6 # QuintexAirVPN2
+199.249.224.47:80 orport=443 id=D6FF2697CEA5C0C7DA84797C2E71163814FC2466 # QuintexAirVPN28
+199.249.223.68:80 orport=443 id=DF20497E487A979995D851A5BCEC313DF7E5BC51 # Quintex19
+199.249.223.43:80 orport=443 id=E480D577F58E782A5BC4FA6F49A6650E9389302F # Quintex34
+199.249.224.69:80 orport=443 id=EABC2DD0D47B5DB11F2D37EB3C60C2A4D91C10F2 # Quintex49
+199.249.223.78:80 orport=443 id=EC15DB62D9101481F364DE52EB8313C838BDDC29 # QuintexAirVPN3
+199.249.224.42:80 orport=443 id=F21DE9C7DE31601D9716781E17E24380887883D1 # QuintexAirVPN23
+199.249.223.81:80 orport=443 id=F7447E99EB5CBD4D5EB913EE0E35AC642B5C1EF3 # QuintexAirVPN1
+199.249.224.43:80 orport=443 id=FDD700C791CC6BB0AC1C2099A82CBC367AD4B764 # QuintexAirVPN24
+199.249.224.62:80 orport=443 id=FE00A3A835680E67FBBC895A724E2657BB253E97 # Quintex42
+199.249.223.66:80 orport=443 id=C5A53BCC174EF8FD0DCB223E4AA929FA557DEDB2 # Quintex17
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013914.html
+5.196.23.64:9030 orport=9001 id=775B0FAFDE71AADC23FFC8782B7BEB1D5A92733E # Aerodynamik01
+217.182.75.181:9030 orport=9001 id=EFEACD781604EB80FBC025EDEDEA2D523AEAAA2F # Aerodynamik02
+193.70.43.76:9030 orport=9001 id=484A10BA2B8D48A5F0216674C8DD50EF27BC32F3 # Aerodynamik03
+149.56.141.138:9030 orport=9001 id=1938EBACBB1A7BFA888D9623C90061130E63BB3F # Aerodynamik04
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013917.html
+104.200.20.46:80 orport=9001 id=78E2BE744A53631B4AAB781468E94C52AB73968B # bynumlawtor
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013929.html
+139.99.130.178:80 orport=443 id=867B95CACD64653FEEC4D2CEFC5C49B4620307A7 # coffswifi2
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013946.html
+172.98.193.43:80 orport=443 id=5E56738E7F97AA81DEEF59AF28494293DFBFCCDF # Backplane
+
+# Email sent directly to teor
+62.210.254.132:80 orport=443 id=8456DFA94161CDD99E480C2A2992C366C6564410 # turingmachine
+
+# Email sent directly to teor
+80.127.117.180:80 orport=443 id=328E54981C6DDD7D89B89E418724A4A7881E3192 ipv6=[2001:985:e77:10::4]:443 # sjc01
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/013960.html
+51.15.205.214:9030 orport=9001 id=8B6556601612F1E2AFCE2A12FFFAF8482A76DD1F ipv6=[2001:bc8:4400:2500::5:b07]:9001 # titania1
+51.15.205.214:9031 orport=9002 id=5E363D72488276160D062DDD2DFA25CFEBAF5EA9 ipv6=[2001:bc8:4400:2500::5:b07]:9002 # titania2
+
+# Email sent directly to teor
+185.129.249.124:9030 orport=9001 id=1FA8F638298645BE58AC905276680889CB795A94 # treadstone
+
+# https://lists.torproject.org/pipermail/tor-relays/2017-December/014000.html
+24.117.231.229:34175 orport=45117 id=CE24412AD69444954B4015E293AE53DDDAFEA3D6 # Anosognosia
+
+# https://lists.torproject.org/pipermail/tor-relays/2018-January/014012.html
+128.31.0.13:80 orport=443 id=A53C46F5B157DD83366D45A8E99A244934A14C46 # csailmitexit
+
+# Email sent directly to teor
+82.247.103.117:110 orport=995 id=C9B3C1661A9577BA24C1C2C6123918921A495509 # Casper01
+109.238.2.79:110 orport=995 id=7520892E3DD133D0B0464D01A158B54B8E2A8B75 # Casper02
+51.15.179.153:110 orport=995 id=BB60F5BA113A0B8B44B7B37DE3567FE561E92F78 # Casper04
+
+# Email sent directly to teor
+80.127.107.179:80 orport=443 id=BC6B2E2F62ACC5EDECBABE64DA1E48F84DD98B78 ipv6=[2001:981:4a22:c::6]:443 # TVISION02
+
+# https://lists.torproject.org/pipermail/tor-relays/2018-January/014020.html
+37.120.174.249:80 orport=443 id=11DF0017A43AF1F08825CD5D973297F81AB00FF3 ipv6=[2a03:4000:6:724c:df98:15f9:b34d:443]:443 # gGDHjdcC6zAlM8k08lX
+
+# These fallbacks opted-in in previous releases, then changed their details,
+# and so we blacklisted them. Now we want to whitelist changes.
+# Assume details update is permanent
+85.230.184.93:9030 orport=443 id=855BC2DABE24C861CD887DB9B2E950424B49FC34 # Logforme
+176.31.180.157:143 orport=22 id=E781F4EC69671B3F1864AE2753E0890351506329 ipv6=[2001:41d0:8:eb9d::1]:22 # armbrust
+
+# https://lists.torproject.org/pipermail/tor-relays/2018-January/014024.html
+82.161.212.209:9030 orport=9001 id=4E8CE6F5651E7342C1E7E5ED031E82078134FB0D ipv6=[2001:980:d7ed:1:ff:b0ff:fe00:d0b]:9001 # ymkeo

+ 38 - 0
scripts/maint/generateFallbackDirLine.py

@@ -0,0 +1,38 @@
+#!/usr/bin/env python
+
+# Generate a fallback directory whitelist/blacklist line for every fingerprint
+# passed as an argument.
+#
+# Usage:
+# generateFallbackDirLine.py fingerprint ...
+
+import sys
+import urllib2
+
+import stem.descriptor.remote
+import stem.util.tor_tools
+
+if len(sys.argv) <= 1:
+  print('Usage: %s fingerprint ...' % sys.argv[0])
+  sys.exit(1)
+
+for fingerprint in sys.argv[1:]:
+  if not stem.util.tor_tools.is_valid_fingerprint(fingerprint):
+    print("'%s' isn't a valid relay fingerprint" % fingerprint)
+    sys.exit(1)
+
+  try:
+    desc = stem.descriptor.remote.get_server_descriptors(fingerprint).run()[0]
+  except urllib2.HTTPError as exc:
+    if exc.code == 404:
+      print('# %s not found in recent descriptors' % fingerprint)
+      continue
+    else:
+      raise
+
+  if not desc.dir_port:
+    print("# %s needs a DirPort" % fingerprint)
+  else:
+    ipv6_addresses = [(address, port) for address, port, is_ipv6 in desc.or_addresses if is_ipv6]
+    ipv6_field = ' ipv6=[%s]:%s' % ipv6_addresses[0] if ipv6_addresses else ''
+    print('%s:%s orport=%s id=%s%s # %s' % (desc.address, desc.dir_port, desc.or_port, fingerprint, ipv6_field, desc.nickname))

+ 28 - 0
scripts/maint/lookupFallbackDirContact.py

@@ -0,0 +1,28 @@
+#!/usr/bin/env python
+
+# Lookup fallback directory contact lines for every fingerprint passed as an
+# argument.
+#
+# Usage:
+# lookupFallbackDirContact.py fingerprint ...
+
+import sys
+
+import stem.descriptor.remote as remote
+
+if len(sys.argv) <= 1:
+  print "Usage: {} fingerprint ...".format(sys.argv[0])
+  sys.exit(-1)
+
+# we need descriptors, because the consensus does not have contact infos
+descriptor_list = remote.get_server_descriptors(fingerprints=sys.argv[1:]).run()
+
+descriptor_list_fingerprints = []
+for d in descriptor_list:
+  assert d.fingerprint in sys.argv[1:]
+  descriptor_list_fingerprints.append(d.fingerprint)
+  print "{} {}".format(d.fingerprint, d.contact)
+
+for fingerprint in sys.argv[1:]:
+  if fingerprint not in descriptor_list_fingerprints:
+    print "{} not found in current descriptors".format(fingerprint)

+ 171 - 54
scripts/maint/updateFallbackDirs.py

@@ -1,4 +1,4 @@
-#!/usr/bin/python
+#!/usr/bin/env python
 
 
 # Usage:
 # Usage:
 #
 #
@@ -14,14 +14,12 @@
 # If this is not possible, please disable:
 # If this is not possible, please disable:
 # PERFORM_IPV4_DIRPORT_CHECKS and PERFORM_IPV6_DIRPORT_CHECKS
 # PERFORM_IPV4_DIRPORT_CHECKS and PERFORM_IPV6_DIRPORT_CHECKS
 #
 #
-# Needs dateutil (and potentially other python packages)
-# Needs stem available in your PYTHONPATH, or just ln -s ../stem/stem .
+# Needs dateutil, stem, and potentially other python packages.
 # Optionally uses ipaddress (python 3 builtin) or py2-ipaddress (package)
 # Optionally uses ipaddress (python 3 builtin) or py2-ipaddress (package)
-# for netblock analysis, in PYTHONPATH, or just
-# ln -s ../py2-ipaddress-3.4.1/ipaddress.py .
+# for netblock analysis.
 #
 #
 # Then read the logs to make sure the fallbacks aren't dominated by a single
 # Then read the logs to make sure the fallbacks aren't dominated by a single
-# netblock or port
+# netblock or port.
 
 
 # Script by weasel, April 2015
 # Script by weasel, April 2015
 # Portions by gsathya & karsten, 2013
 # Portions by gsathya & karsten, 2013
@@ -47,7 +45,7 @@ import copy
 import re
 import re
 
 
 from stem.descriptor import DocumentHandler
 from stem.descriptor import DocumentHandler
-from stem.descriptor.remote import get_consensus
+from stem.descriptor.remote import get_consensus, get_server_descriptors, MAX_FINGERPRINTS
 
 
 import logging
 import logging
 logging.root.name = ''
 logging.root.name = ''
@@ -68,6 +66,17 @@ except ImportError:
 
 
 ## Top-Level Configuration
 ## Top-Level Configuration
 
 
+# We use semantic versioning: https://semver.org
+# In particular:
+# * major changes include removing a mandatory field, or anything else that
+#   would break an appropriately tolerant parser,
+# * minor changes include adding a field,
+# * patch changes include changing header comments or other unstructured
+#   content
+FALLBACK_FORMAT_VERSION = '2.0.0'
+SECTION_SEPARATOR_BASE = '====='
+SECTION_SEPARATOR_COMMENT = '/* ' + SECTION_SEPARATOR_BASE + ' */'
+
 # Output all candidate fallbacks, or only output selected fallbacks?
 # Output all candidate fallbacks, or only output selected fallbacks?
 OUTPUT_CANDIDATES = False
 OUTPUT_CANDIDATES = False
 
 
@@ -98,11 +107,12 @@ DOWNLOAD_MICRODESC_CONSENSUS = True
 # reject consensuses that are older than REASONABLY_LIVE_TIME.
 # reject consensuses that are older than REASONABLY_LIVE_TIME.
 # For the consensus expiry check to be accurate, the machine running this
 # For the consensus expiry check to be accurate, the machine running this
 # script needs an accurate clock.
 # script needs an accurate clock.
-# We use 24 hours to compensate for #20909, where relays on 0.2.9.5-alpha and
-# 0.3.0.0-alpha-dev and later deliver stale consensuses, but typically recover
-# after ~12 hours.
-# We should make this lower when #20909 is fixed, see #20942.
-CONSENSUS_EXPIRY_TOLERANCE = 24*60*60
+#
+# Relays on 0.3.0 and later return a 404 when they are about to serve an
+# expired consensus. This makes them fail the download check.
+# We use a tolerance of 0, so that 0.2.x series relays also fail the download
+# check if they serve an expired consensus.
+CONSENSUS_EXPIRY_TOLERANCE = 0 
 
 
 # Output fallback name, flags, bandwidth, and ContactInfo in a C comment?
 # Output fallback name, flags, bandwidth, and ContactInfo in a C comment?
 OUTPUT_COMMENTS = True if OUTPUT_CANDIDATES else False
 OUTPUT_COMMENTS = True if OUTPUT_CANDIDATES else False
@@ -160,25 +170,30 @@ MAX_LIST_FILE_SIZE = 1024 * 1024
 
 
 # Require fallbacks to have the same address and port for a set amount of time
 # Require fallbacks to have the same address and port for a set amount of time
 # We used to have this at 1 week, but that caused many fallback failures, which
 # We used to have this at 1 week, but that caused many fallback failures, which
-# meant that we had to rebuild the list more often.
+# meant that we had to rebuild the list more often. We want fallbacks to be
+# stable for 2 years, so we set it to a few months.
 #
 #
 # There was a bug in Tor 0.2.8.1-alpha and earlier where a relay temporarily
 # There was a bug in Tor 0.2.8.1-alpha and earlier where a relay temporarily
 # submits a 0 DirPort when restarted.
 # submits a 0 DirPort when restarted.
 # This causes OnionOO to (correctly) reset its stability timer.
 # This causes OnionOO to (correctly) reset its stability timer.
-# Affected relays should upgrade to Tor 0.2.8.7 or later, which has a fix
+# Affected relays should upgrade to Tor 0.2.9 or later, which has a fix
 # for this issue.
 # for this issue.
-ADDRESS_AND_PORT_STABLE_DAYS = 30
+#
+# If a relay changes address or port, that's it, it's not useful any more,
+# because clients can't find it
+ADDRESS_AND_PORT_STABLE_DAYS = 90
 # We ignore relays that have been down for more than this period
 # We ignore relays that have been down for more than this period
 MAX_DOWNTIME_DAYS = 0 if MUST_BE_RUNNING_NOW else 7
 MAX_DOWNTIME_DAYS = 0 if MUST_BE_RUNNING_NOW else 7
-# What time-weighted-fraction of these flags must FallbackDirs
-# Equal or Exceed?
-CUTOFF_RUNNING = .90
-CUTOFF_V2DIR = .90
-# Tolerate lower guard flag averages, as guard flags are removed for some time
-# after a relay restarts
-CUTOFF_GUARD = .80
-# What time-weighted-fraction of these flags must FallbackDirs
-# Equal or Fall Under?
+# FallbackDirs must have a time-weighted-fraction that is greater than or
+# equal to:
+# Mirrors that are down half the time are still useful half the time
+CUTOFF_RUNNING = .50
+CUTOFF_V2DIR = .50
+# Guard flags are removed for some time after a relay restarts, so we ignore
+# the guard flag.
+CUTOFF_GUARD = .00
+# FallbackDirs must have a time-weighted-fraction that is less than or equal
+# to:
 # .00 means no bad exits
 # .00 means no bad exits
 PERMITTED_BADEXIT = .00
 PERMITTED_BADEXIT = .00
 
 
@@ -201,13 +216,19 @@ MAX_FALLBACK_COUNT = None if OUTPUT_CANDIDATES else 200
 MIN_FALLBACK_COUNT = 0 if OUTPUT_CANDIDATES else MAX_FALLBACK_COUNT*0.5
 MIN_FALLBACK_COUNT = 0 if OUTPUT_CANDIDATES else MAX_FALLBACK_COUNT*0.5
 
 
 # The maximum number of fallbacks on the same address, contact, or family
 # The maximum number of fallbacks on the same address, contact, or family
-# With 200 fallbacks, this means each operator can see 1% of client bootstraps
-# (The directory authorities used to see ~12% of client bootstraps each.)
+#
+# With 150 fallbacks, this means each operator sees 5% of client bootstraps.
+# For comparison:
+#  - We try to limit guard and exit operators to 5% of the network
+#  - The directory authorities used to see 11% of client bootstraps each
+#
+# We also don't want too much of the list to go down if a single operator
+# has to move all their relays.
 MAX_FALLBACKS_PER_IP = 1
 MAX_FALLBACKS_PER_IP = 1
 MAX_FALLBACKS_PER_IPV4 = MAX_FALLBACKS_PER_IP
 MAX_FALLBACKS_PER_IPV4 = MAX_FALLBACKS_PER_IP
 MAX_FALLBACKS_PER_IPV6 = MAX_FALLBACKS_PER_IP
 MAX_FALLBACKS_PER_IPV6 = MAX_FALLBACKS_PER_IP
-MAX_FALLBACKS_PER_CONTACT = 3
-MAX_FALLBACKS_PER_FAMILY = 3
+MAX_FALLBACKS_PER_CONTACT = 7
+MAX_FALLBACKS_PER_FAMILY = 7
 
 
 ## Fallback Bandwidth Requirements
 ## Fallback Bandwidth Requirements
 
 
@@ -219,11 +240,11 @@ EXIT_BANDWIDTH_FRACTION = 1.0
 
 
 # If a single fallback's bandwidth is too low, it's pointless adding it
 # If a single fallback's bandwidth is too low, it's pointless adding it
 # We expect fallbacks to handle an extra 10 kilobytes per second of traffic
 # We expect fallbacks to handle an extra 10 kilobytes per second of traffic
-# Make sure they can support a hundred times the expected extra load
-# (Use 102.4 to make it come out nicely in MByte/s)
+# Make sure they can support fifty times the expected extra load
+#
 # We convert this to a consensus weight before applying the filter,
 # We convert this to a consensus weight before applying the filter,
 # because all the bandwidth amounts are specified by the relay
 # because all the bandwidth amounts are specified by the relay
-MIN_BANDWIDTH = 102.4 * 10.0 * 1024.0
+MIN_BANDWIDTH = 50.0 * 10.0 * 1024.0
 
 
 # Clients will time out after 30 seconds trying to download a consensus
 # Clients will time out after 30 seconds trying to download a consensus
 # So allow fallback directories half that to deliver a consensus
 # So allow fallback directories half that to deliver a consensus
@@ -235,21 +256,6 @@ CONSENSUS_DOWNLOAD_SPEED_MAX = 15.0
 # This avoids delisting a relay due to transient network conditions
 # This avoids delisting a relay due to transient network conditions
 CONSENSUS_DOWNLOAD_RETRY = True
 CONSENSUS_DOWNLOAD_RETRY = True
 
 
-## Fallback Weights for Client Selection
-
-# All fallback weights are equal, and set to the value below
-# Authorities are weighted 1.0 by default
-# Clients use these weights to select fallbacks and authorities at random
-# If there are 100 fallbacks and 9 authorities:
-#  - each fallback is chosen with probability 10.0/(10.0*100 + 1.0*9) ~= 0.99%
-#  - each authority is chosen with probability 1.0/(10.0*100 + 1.0*9) ~= 0.09%
-# A client choosing a bootstrap directory server will choose a fallback for
-# 10.0/(10.0*100 + 1.0*9) * 100 = 99.1% of attempts, and an authority for
-# 1.0/(10.0*100 + 1.0*9) * 9 = 0.9% of attempts.
-# (This disregards the bootstrap schedules, where clients start by choosing
-# from fallbacks & authoritites, then later choose from only authorities.)
-FALLBACK_OUTPUT_WEIGHT = 10.0
-
 ## Parsing Functions
 ## Parsing Functions
 
 
 def parse_ts(t):
 def parse_ts(t):
@@ -289,6 +295,10 @@ def cleanse_c_multiline_comment(raw_string):
   bad_char_list = '*/'
   bad_char_list = '*/'
   # Prevent a malicious string from using C nulls
   # Prevent a malicious string from using C nulls
   bad_char_list += '\0'
   bad_char_list += '\0'
+  # Avoid confusing parsers by making sure there is only one comma per fallback
+  bad_char_list += ','
+  # Avoid confusing parsers by making sure there is only one equals per field
+  bad_char_list += '='
   # Be safer by removing bad characters entirely
   # Be safer by removing bad characters entirely
   cleansed_string = remove_bad_chars(cleansed_string, bad_char_list)
   cleansed_string = remove_bad_chars(cleansed_string, bad_char_list)
   # Some compilers may further process the content of comments
   # Some compilers may further process the content of comments
@@ -309,6 +319,10 @@ def cleanse_c_string(raw_string):
   bad_char_list += '\\'
   bad_char_list += '\\'
   # Prevent a malicious string from using C nulls
   # Prevent a malicious string from using C nulls
   bad_char_list += '\0'
   bad_char_list += '\0'
+  # Avoid confusing parsers by making sure there is only one comma per fallback
+  bad_char_list += ','
+  # Avoid confusing parsers by making sure there is only one equals per field
+  bad_char_list += '='
   # Be safer by removing bad characters entirely
   # Be safer by removing bad characters entirely
   cleansed_string = remove_bad_chars(cleansed_string, bad_char_list)
   cleansed_string = remove_bad_chars(cleansed_string, bad_char_list)
   # Some compilers may further process the content of strings
   # Some compilers may further process the content of strings
@@ -570,6 +584,7 @@ class Candidate(object):
     if not self.has_ipv6():
     if not self.has_ipv6():
       logging.debug("Failed to get an ipv6 address for %s."%(self._fpr,))
       logging.debug("Failed to get an ipv6 address for %s."%(self._fpr,))
     self._compute_version()
     self._compute_version()
+    self._extra_info_cache = None
 
 
   def _stable_sort_or_addresses(self):
   def _stable_sort_or_addresses(self):
     # replace self._data['or_addresses'] with a stable ordering,
     # replace self._data['or_addresses'] with a stable ordering,
@@ -1335,8 +1350,14 @@ class Candidate(object):
   # comment-out the returned string
   # comment-out the returned string
   def fallbackdir_info(self, dl_speed_ok):
   def fallbackdir_info(self, dl_speed_ok):
     # "address:dirport orport=port id=fingerprint"
     # "address:dirport orport=port id=fingerprint"
+    # (insert additional madatory fields here)
     # "[ipv6=addr:orport]"
     # "[ipv6=addr:orport]"
-    # "weight=FALLBACK_OUTPUT_WEIGHT",
+    # (insert additional optional fields here)
+    # /* nickname=name */
+    # /* extrainfo={0,1} */
+    # (insert additional comment fields here)
+    # /* ===== */
+    # ,
     #
     #
     # Do we want a C string, or a commented-out string?
     # Do we want a C string, or a commented-out string?
     c_string = dl_speed_ok
     c_string = dl_speed_ok
@@ -1357,10 +1378,34 @@ class Candidate(object):
             self.orport,
             self.orport,
             cleanse_c_string(self._fpr))
             cleanse_c_string(self._fpr))
     s += '\n'
     s += '\n'
+    # (insert additional madatory fields here)
     if self.has_ipv6():
     if self.has_ipv6():
       s += '" ipv6=%s:%d"'%(cleanse_c_string(self.ipv6addr), self.ipv6orport)
       s += '" ipv6=%s:%d"'%(cleanse_c_string(self.ipv6addr), self.ipv6orport)
       s += '\n'
       s += '\n'
-    s += '" weight=%d",'%(FALLBACK_OUTPUT_WEIGHT)
+    # (insert additional optional fields here)
+    if not comment_string:
+      s += '/* '
+    s += 'nickname=%s'%(cleanse_c_string(self._data['nickname']))
+    if not comment_string:
+      s += ' */'
+    s += '\n'
+    # if we know that the fallback is an extrainfo cache, flag it
+    # and if we don't know, assume it is not
+    if not comment_string:
+      s += '/* '
+    s += 'extrainfo=%d'%(1 if self._extra_info_cache else 0)
+    if not comment_string:
+      s += ' */'
+    s += '\n'
+    # (insert additional comment fields here)
+    # The terminator and comma must be the last line in each fallback entry
+    if not comment_string:
+      s += '/* '
+    s += SECTION_SEPARATOR_BASE
+    if not comment_string:
+      s += ' */'
+    s += '\n'
+    s += ','
     if comment_string:
     if comment_string:
       s += '\n'
       s += '\n'
       s += '*/'
       s += '*/'
@@ -1745,6 +1790,53 @@ class CandidateList(dict):
     self.fallbacks = family_limit_fallbacks
     self.fallbacks = family_limit_fallbacks
     return original_count - len(self.fallbacks)
     return original_count - len(self.fallbacks)
 
 
+  # try once to get the descriptors for fingerprint_list using stem
+  # returns an empty list on exception
+  @staticmethod
+  def get_fallback_descriptors_once(fingerprint_list):
+    desc_list = get_server_descriptors(fingerprints=fingerprint_list).run(suppress=True)
+    return desc_list
+
+  # try up to max_retries times to get the descriptors for fingerprint_list
+  # using stem. Stops retrying when all descriptors have been retrieved.
+  # returns a list containing the descriptors that were retrieved
+  @staticmethod
+  def get_fallback_descriptors(fingerprint_list, max_retries=5):
+    # we can't use stem's retries=, because we want to support more than 96
+    # descriptors
+    #
+    # add an attempt for every MAX_FINGERPRINTS (or part thereof) in the list
+    max_retries += (len(fingerprint_list) + MAX_FINGERPRINTS - 1) / MAX_FINGERPRINTS
+    remaining_list = fingerprint_list
+    desc_list = []
+    for _ in xrange(max_retries):
+      if len(remaining_list) == 0:
+        break
+      new_desc_list = CandidateList.get_fallback_descriptors_once(remaining_list[0:MAX_FINGERPRINTS])
+      for d in new_desc_list:
+        try:
+          remaining_list.remove(d.fingerprint)
+        except ValueError:
+          # warn and ignore if a directory mirror returned a bad descriptor
+          logging.warning("Directory mirror returned unwanted descriptor %s, ignoring",
+                          d.fingerprint)
+          continue
+        desc_list.append(d)
+    return desc_list
+
+  # find the fallbacks that cache extra-info documents
+  # Onionoo doesn't know this, so we have to use stem
+  def mark_extra_info_caches(self):
+    fingerprint_list = [ f._fpr for f in self.fallbacks ]
+    logging.info("Downloading fallback descriptors to find extra-info caches")
+    desc_list = CandidateList.get_fallback_descriptors(fingerprint_list)
+    for d in desc_list:
+      self[d.fingerprint]._extra_info_cache = d.extra_info_cache
+    missing_descriptor_list = [ f._fpr for f in self.fallbacks
+                                if f._extra_info_cache is None ]
+    for f in missing_descriptor_list:
+      logging.warning("No descriptor for {}. Assuming extrainfo=0.".format(f))
+
   # try a download check on each fallback candidate in order
   # try a download check on each fallback candidate in order
   # stop after max_count successful downloads
   # stop after max_count successful downloads
   # but don't remove any candidates from the array
   # but don't remove any candidates from the array
@@ -1904,7 +1996,7 @@ class CandidateList(dict):
    # this doesn't actually tell us anything useful
    # this doesn't actually tell us anything useful
    #self.describe_fallback_ipv4_netblock_mask(8)
    #self.describe_fallback_ipv4_netblock_mask(8)
    self.describe_fallback_ipv4_netblock_mask(16)
    self.describe_fallback_ipv4_netblock_mask(16)
-   self.describe_fallback_ipv4_netblock_mask(24)
+   #self.describe_fallback_ipv4_netblock_mask(24)
 
 
   # log a message about the proportion of fallbacks in each IPv6 /12 (RIR),
   # log a message about the proportion of fallbacks in each IPv6 /12 (RIR),
   # /23 (smaller RIR blocks), /32 (LIR), /48 (Customer), and /64 (Host)
   # /23 (smaller RIR blocks), /32 (LIR), /48 (Customer), and /64 (Host)
@@ -1914,7 +2006,7 @@ class CandidateList(dict):
     #self.describe_fallback_ipv6_netblock_mask(12)
     #self.describe_fallback_ipv6_netblock_mask(12)
     #self.describe_fallback_ipv6_netblock_mask(23)
     #self.describe_fallback_ipv6_netblock_mask(23)
     self.describe_fallback_ipv6_netblock_mask(32)
     self.describe_fallback_ipv6_netblock_mask(32)
-    self.describe_fallback_ipv6_netblock_mask(48)
+    #self.describe_fallback_ipv6_netblock_mask(48)
     self.describe_fallback_ipv6_netblock_mask(64)
     self.describe_fallback_ipv6_netblock_mask(64)
 
 
   # log a message about the proportion of fallbacks in each IPv4 and IPv6
   # log a message about the proportion of fallbacks in each IPv4 and IPv6
@@ -1992,6 +2084,18 @@ class CandidateList(dict):
                     CandidateList.describe_percentage(dir_count,
                     CandidateList.describe_percentage(dir_count,
                                                       fallback_count)))
                                                       fallback_count)))
 
 
+  # return a list of fallbacks which cache extra-info documents
+  def fallbacks_with_extra_info_cache(self):
+    return filter(lambda x: x._extra_info_cache, self.fallbacks)
+
+  # log a message about the proportion of fallbacks that cache extra-info docs
+  def describe_fallback_extra_info_caches(self):
+    extra_info_falback_count = len(self.fallbacks_with_extra_info_cache())
+    fallback_count = len(self.fallbacks)
+    logging.warning('%s of fallbacks cache extra-info documents'%(
+                    CandidateList.describe_percentage(extra_info_falback_count,
+                                                      fallback_count)))
+
   # return a list of fallbacks which have the Exit flag
   # return a list of fallbacks which have the Exit flag
   def fallbacks_with_exit(self):
   def fallbacks_with_exit(self):
     return filter(lambda x: x.is_exit(), self.fallbacks)
     return filter(lambda x: x.is_exit(), self.fallbacks)
@@ -2019,10 +2123,6 @@ class CandidateList(dict):
   def summarise_fallbacks(self, eligible_count, operator_count, failed_count,
   def summarise_fallbacks(self, eligible_count, operator_count, failed_count,
                           guard_count, target_count):
                           guard_count, target_count):
     s = ''
     s = ''
-    s += '/* To comment-out entries in this file, use C comments, and add *'
-    s += ' to the start of each line. (stem finds fallback entries using "'
-    s += ' at the start of a line.) */'
-    s += '\n'
     # Report:
     # Report:
     #  whether we checked consensus download times
     #  whether we checked consensus download times
     #  the number of fallback directories (and limits/exclusions, if relevant)
     #  the number of fallback directories (and limits/exclusions, if relevant)
@@ -2123,6 +2223,16 @@ def list_fallbacks(whitelist, blacklist):
   """ Fetches required onionoo documents and evaluates the
   """ Fetches required onionoo documents and evaluates the
       fallback directory criteria for each of the relays """
       fallback directory criteria for each of the relays """
 
 
+  print "/* type=fallback */"
+  print ("/* version={} */"
+         .format(cleanse_c_multiline_comment(FALLBACK_FORMAT_VERSION)))
+  now = datetime.datetime.utcnow()
+  timestamp = now.strftime('%Y%m%d%H%M%S')
+  print ("/* timestamp={} */"
+         .format(cleanse_c_multiline_comment(timestamp)))
+  # end the header with a separator, to make it easier for parsers
+  print SECTION_SEPARATOR_COMMENT
+
   logging.warning('Downloading and parsing Onionoo data. ' +
   logging.warning('Downloading and parsing Onionoo data. ' +
                   'This may take some time.')
                   'This may take some time.')
   # find relays that could be fallbacks
   # find relays that could be fallbacks
@@ -2188,6 +2298,9 @@ def list_fallbacks(whitelist, blacklist):
                     'This may take some time.')
                     'This may take some time.')
   failed_count = candidates.perform_download_consensus_checks(max_count)
   failed_count = candidates.perform_download_consensus_checks(max_count)
 
 
+  # work out which fallbacks cache extra-infos
+  candidates.mark_extra_info_caches()
+
   # analyse and log interesting diversity metrics
   # analyse and log interesting diversity metrics
   # like netblock, ports, exit, IPv4-only
   # like netblock, ports, exit, IPv4-only
   # (we can't easily analyse AS, and it's hard to accurately analyse country)
   # (we can't easily analyse AS, and it's hard to accurately analyse country)
@@ -2196,6 +2309,7 @@ def list_fallbacks(whitelist, blacklist):
   if HAVE_IPADDRESS:
   if HAVE_IPADDRESS:
     candidates.describe_fallback_netblocks()
     candidates.describe_fallback_netblocks()
   candidates.describe_fallback_ports()
   candidates.describe_fallback_ports()
+  candidates.describe_fallback_extra_info_caches()
   candidates.describe_fallback_exit_flag()
   candidates.describe_fallback_exit_flag()
 
 
   # output C comments summarising the fallback selection process
   # output C comments summarising the fallback selection process
@@ -2210,6 +2324,9 @@ def list_fallbacks(whitelist, blacklist):
   for s in fetch_source_list():
   for s in fetch_source_list():
     print describe_fetch_source(s)
     print describe_fetch_source(s)
 
 
+  # start the list with a separator, to make it easy for parsers
+  print SECTION_SEPARATOR_COMMENT
+
   # sort the list differently depending on why we've created it:
   # sort the list differently depending on why we've created it:
   # if we're outputting the final fallback list, sort by fingerprint
   # if we're outputting the final fallback list, sort by fingerprint
   # this makes diffs much more stable
   # this makes diffs much more stable

+ 609 - 152
src/or/fallback_dirs.inc

@@ -1,5 +1,8 @@
+/* type=fallback */
+/* version=2.0.0 */
+/* timestamp=20170526090242 */
+/* ===== */
 /* Whitelist & blacklist excluded 1326 of 1513 candidates. */
 /* Whitelist & blacklist excluded 1326 of 1513 candidates. */
-/* To comment-out entries in this file, use C comments, and add * to the start of each line. (stem finds fallback entries using " at the start of a line.) */
 /* Checked IPv4 DirPorts served a consensus within 15.0s. */
 /* Checked IPv4 DirPorts served a consensus within 15.0s. */
 /*
 /*
 Final Count: 151 (Eligible 187, Target 392 (1963 * 0.20), Max 200)
 Final Count: 151 (Eligible 187, Target 392 (1963 * 0.20), Max 200)
@@ -14,357 +17,811 @@ URL: https:onionoo.torproject.orgdetails?fields=fingerprint%2Cnickname%2Ccontact
 Onionoo Source: uptime Date: 2017-05-16 07:00:00 Version: 4.0
 Onionoo Source: uptime Date: 2017-05-16 07:00:00 Version: 4.0
 URL: https:onionoo.torproject.orguptime?first_seen_days=30-&flag=V2Dir&type=relay&last_seen_days=-0
 URL: https:onionoo.torproject.orguptime?first_seen_days=30-&flag=V2Dir&type=relay&last_seen_days=-0
 */
 */
+/* ===== */
 "176.10.104.240:80 orport=443 id=0111BA9B604669E636FFD5B503F382A4B7AD6E80"
 "176.10.104.240:80 orport=443 id=0111BA9B604669E636FFD5B503F382A4B7AD6E80"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524"
 "193.171.202.146:9030 orport=9001 id=01A9258A46E97FF8B2CAC7910577862C14F2C524"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.100.85.61:80 orport=443 id=025B66CEBC070FCB0519D206CF0CF4965C20C96E"
 "185.100.85.61:80 orport=443 id=025B66CEBC070FCB0519D206CF0CF4965C20C96E"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088"
 "185.97.32.18:9030 orport=9001 id=04250C3835019B26AA6764E85D836088BE441088"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB"
 "5.9.110.236:9030 orport=9001 id=0756B7CD4DFC8182BE23143FAC0642F515182CEB"
 " ipv6=[2a01:4f8:162:51e2::2]:9001"
 " ipv6=[2a01:4f8:162:51e2::2]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281"
 "109.163.234.8:80 orport=443 id=0818DAE0E2DDF795AEDEAC60B15E71901084F281"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.149.155:80 orport=443 id=0B85617241252517E8ECF2CFC7F4C1A32DCD153F"
 "163.172.149.155:80 orport=443 id=0B85617241252517E8ECF2CFC7F4C1A32DCD153F"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.39.92.199:80 orport=443 id=0BEA4A88D069753218EAAAD6D22EA87B9A1319D6"
 "5.39.92.199:80 orport=443 id=0BEA4A88D069753218EAAAD6D22EA87B9A1319D6"
 " ipv6=[2001:41d0:8:b1c7::1]:443"
 " ipv6=[2001:41d0:8:b1c7::1]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.197.82:80 orport=443 id=0D3EBA17E1C78F1E9900BABDB23861D46FCAF163"
 "178.62.197.82:80 orport=443 id=0D3EBA17E1C78F1E9900BABDB23861D46FCAF163"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.100.86.100:80 orport=443 id=0E8C0C8315B66DB5F703804B3889A1DD66C67CE0"
 "185.100.86.100:80 orport=443 id=0E8C0C8315B66DB5F703804B3889A1DD66C67CE0"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "95.85.8.226:80 orport=443 id=1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423"
 "95.85.8.226:80 orport=443 id=1211AC1BBB8A1AF7CBA86BCE8689AA3146B86423"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.11.114.43:9030 orport=9001 id=12AD30E5D25AA67F519780E2111E611A455FDC89"
 "193.11.114.43:9030 orport=9001 id=12AD30E5D25AA67F519780E2111E611A455FDC89"
 " ipv6=[2001:6b0:30:1000::99]:9050"
 " ipv6=[2001:6b0:30:1000::99]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2"
 "37.157.195.87:8030 orport=443 id=12FD624EE73CEF37137C90D38B2406A66F68FAA2"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.16.208.59:80 orport=443 id=136F9299A5009A4E0E96494E723BDB556FB0A26B"
 "178.16.208.59:80 orport=443 id=136F9299A5009A4E0E96494E723BDB556FB0A26B"
 " ipv6=[2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6]:443"
 " ipv6=[2a00:1c20:4089:1234:bff6:e1bb:1ce3:8dc6]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "144.76.14.145:110 orport=143 id=14419131033443AE6E21DA82B0D307F7CAE42BDB"
 "144.76.14.145:110 orport=143 id=14419131033443AE6E21DA82B0D307F7CAE42BDB"
 " ipv6=[2a01:4f8:190:9490::dead]:443"
 " ipv6=[2a01:4f8:190:9490::dead]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794"
 "178.62.60.37:80 orport=443 id=175921396C7C426309AB03775A9930B6F611F794"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "204.11.50.131:9030 orport=9001 id=185F2A57B0C4620582602761097D17DB81654F70"
 "204.11.50.131:9030 orport=9001 id=185F2A57B0C4620582602761097D17DB81654F70"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.9.158.75:80 orport=443 id=1AF72E8906E6C49481A791A6F8F84F8DFEBBB2BA"
 "5.9.158.75:80 orport=443 id=1AF72E8906E6C49481A791A6F8F84F8DFEBBB2BA"
 " ipv6=[2a01:4f8:190:514a::2]:443"
 " ipv6=[2a01:4f8:190:514a::2]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8"
 "46.101.151.222:80 orport=443 id=1DBAED235E3957DE1ABD25B4206BE71406FB61F8"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7"
 "91.219.237.229:80 orport=443 id=1ECD73B936CB6E6B3CD647CC204F108D9DF2C9F7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68"
 "212.47.229.2:9030 orport=9001 id=20462CBA5DA4C2D963567D17D0B7249718114A68"
 " ipv6=[2001:bc8:4400:2100::f03]:9001"
 " ipv6=[2001:bc8:4400:2100::f03]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "144.76.163.93:9030 orport=9001 id=22F08CF09764C4E8982640D77F71ED72FF26A9AC"
 "144.76.163.93:9030 orport=9001 id=22F08CF09764C4E8982640D77F71ED72FF26A9AC"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.176.167:80 orport=443 id=230A8B2A8BA861210D9B4BA97745AEC217A94207"
 "163.172.176.167:80 orport=443 id=230A8B2A8BA861210D9B4BA97745AEC217A94207"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.200.98.5:80 orport=443 id=231C2B9C8C31C295C472D031E06964834B745996"
 "37.200.98.5:80 orport=443 id=231C2B9C8C31C295C472D031E06964834B745996"
 " ipv6=[2a00:1158:3::11a]:993"
 " ipv6=[2a00:1158:3::11a]:993"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB"
 "212.47.240.10:82 orport=443 id=2A4C448784F5A83AFE6C78DA357D5E31F7989DEB"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510"
 "144.76.26.175:9012 orport=9011 id=2BA2C8E96B2590E1072AECE2BDB5C48921BF8510"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94"
 "97.74.237.196:9030 orport=9001 id=2F0F32AB1E5B943CA7D062C03F18960C86E70D94"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA"
 "107.170.101.39:9030 orport=443 id=30973217E70AF00EBE51797FF6D9AA720A902EAA"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2"
 "64.113.32.29:9030 orport=9001 id=30C19B81981F450C402306E2E7CFB6C3F79CB6B2"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.83.154.33:8080 orport=8443 id=322C6E3A973BC10FC36DE3037AD27BC89F14723B"
 "212.83.154.33:8080 orport=8443 id=322C6E3A973BC10FC36DE3037AD27BC89F14723B"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "109.105.109.162:52860 orport=60784 id=32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F"
 "109.105.109.162:52860 orport=60784 id=32EE911D968BE3E016ECA572BB1ED0A9EE43FC2F"
 " ipv6=[2001:948:7:2::163]:5001"
 " ipv6=[2001:948:7:2::163]:5001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.13.165:9030 orport=9001 id=33DA0CAB7C27812EFF2E22C9705630A54D101FEB"
 "163.172.13.165:9030 orport=9001 id=33DA0CAB7C27812EFF2E22C9705630A54D101FEB"
 " ipv6=[2001:bc8:38cb:201::8]:9001"
 " ipv6=[2001:bc8:38cb:201::8]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B"
 "217.79.190.25:9030 orport=9090 id=361D33C96D0F161275EE67E2C91EE10B276E778B"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.187.22.87:9030 orport=9001 id=36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400"
 "37.187.22.87:9030 orport=9001 id=36B9E7AC1E36B62A9D6F330ABEB6012BA7F0D400"
 " ipv6=[2001:41d0:a:1657::1]:9001"
 " ipv6=[2001:41d0:a:1657::1]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "62.210.92.11:9130 orport=9101 id=387B065A38E4DAA16D9D41C2964ECBC4B31D30FF"
 "62.210.92.11:9130 orport=9101 id=387B065A38E4DAA16D9D41C2964ECBC4B31D30FF"
 " ipv6=[2001:bc8:338c::1]:9101"
 " ipv6=[2001:bc8:338c::1]:9101"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "198.50.191.95:80 orport=443 id=39F096961ED2576975C866D450373A9913AFDC92"
 "198.50.191.95:80 orport=443 id=39F096961ED2576975C866D450373A9913AFDC92"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "164.132.77.175:9030 orport=9001 id=3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B"
 "164.132.77.175:9030 orport=9001 id=3B33F6FCA645AD4E91428A3AF7DC736AD9FB727B"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.47.230.49:9030 orport=9001 id=3D6D0771E54056AEFC28BB1DE816951F11826E97"
 "212.47.230.49:9030 orport=9001 id=3D6D0771E54056AEFC28BB1DE816951F11826E97"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "176.10.107.180:9030 orport=9001 id=3D7E274A87D9A89AF064C13D1EE4CA1F184F2600"
 "176.10.107.180:9030 orport=9001 id=3D7E274A87D9A89AF064C13D1EE4CA1F184F2600"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "217.79.179.177:9030 orport=9001 id=3E53D3979DB07EFD736661C934A1DED14127B684"
 "217.79.179.177:9030 orport=9001 id=3E53D3979DB07EFD736661C934A1DED14127B684"
 " ipv6=[2001:4ba0:fff9:131:6c4f::90d3]:9001"
 " ipv6=[2001:4ba0:fff9:131:6c4f::90d3]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.86.96:9030 orport=9001 id=439D0447772CB107B886F7782DBC201FA26B92D1"
 "178.62.86.96:9030 orport=9001 id=439D0447772CB107B886F7782DBC201FA26B92D1"
 " ipv6=[2a03:b0c0:1:d0::3cf:7001]:9050"
 " ipv6=[2a03:b0c0:1:d0::3cf:7001]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.157.213:8080 orport=443 id=4623A9EC53BFD83155929E56D6F7B55B5E718C24"
 "163.172.157.213:8080 orport=443 id=4623A9EC53BFD83155929E56D6F7B55B5E718C24"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798"
 "31.31.78.49:80 orport=443 id=46791D156C9B6C255C2665D4D8393EC7DBAA7798"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "69.162.139.9:9030 orport=9001 id=4791FC0692EAB60DF2BCCAFF940B95B74E7654F6"
 "69.162.139.9:9030 orport=9001 id=4791FC0692EAB60DF2BCCAFF940B95B74E7654F6"
 " ipv6=[2607:f128:40:1212::45a2:8b09]:9001"
 " ipv6=[2607:f128:40:1212::45a2:8b09]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "51.254.246.203:9030 orport=9001 id=47B596B81C9E6277B98623A84B7629798A16E8D5"
 "51.254.246.203:9030 orport=9001 id=47B596B81C9E6277B98623A84B7629798A16E8D5"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.187.102.186:9030 orport=9001 id=489D94333DF66D57FFE34D9D59CC2D97E2CB0053"
 "37.187.102.186:9030 orport=9001 id=489D94333DF66D57FFE34D9D59CC2D97E2CB0053"
 " ipv6=[2001:41d0:a:26ba::1]:9001"
 " ipv6=[2001:41d0:a:26ba::1]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "188.165.194.195:9030 orport=9001 id=49E7AD01BB96F6FE3AB8C3B15BD2470B150354DF"
 "188.165.194.195:9030 orport=9001 id=49E7AD01BB96F6FE3AB8C3B15BD2470B150354DF"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF"
 "62.102.148.67:80 orport=443 id=4A0C3E177AF684581EF780981AEAF51A98A6B5CF"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF"
 "51.254.101.242:9002 orport=9001 id=4CC9CC9195EC38645B699A33307058624F660CCF"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "81.7.16.182:80 orport=443 id=51E1CF613FD6F9F11FE24743C91D6F9981807D82"
 "81.7.16.182:80 orport=443 id=51E1CF613FD6F9F11FE24743C91D6F9981807D82"
 " ipv6=[2a02:180:1:1::517:10b6]:993"
 " ipv6=[2a02:180:1:1::517:10b6]:993"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "94.23.204.175:9030 orport=9001 id=5665A3904C89E22E971305EE8C1997BCA4123C69"
 "94.23.204.175:9030 orport=9001 id=5665A3904C89E22E971305EE8C1997BCA4123C69"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "95.130.12.119:80 orport=443 id=587E0A9552E4274B251F29B5B2673D38442EE4BF"
 "95.130.12.119:80 orport=443 id=587E0A9552E4274B251F29B5B2673D38442EE4BF"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.21.100.50:9030 orport=9001 id=58ED9C9C35E433EE58764D62892B4FFD518A3CD0"
 "185.21.100.50:9030 orport=9001 id=58ED9C9C35E433EE58764D62892B4FFD518A3CD0"
 " ipv6=[2a00:1158:2:cd00:0:74:6f:72]:443"
 " ipv6=[2a00:1158:2:cd00:0:74:6f:72]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "78.142.142.246:80 orport=443 id=5A5E03355C1908EBF424CAF1F3ED70782C0D2F74"
 "78.142.142.246:80 orport=443 id=5A5E03355C1908EBF424CAF1F3ED70782C0D2F74"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "120.29.217.46:80 orport=443 id=5E853C94AB1F655E9C908924370A0A6707508C62"
 "120.29.217.46:80 orport=443 id=5E853C94AB1F655E9C908924370A0A6707508C62"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "109.163.234.5:80 orport=443 id=5EB8D862E70981B8690DEDEF546789E26AB2BD24"
 "109.163.234.5:80 orport=443 id=5EB8D862E70981B8690DEDEF546789E26AB2BD24"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90"
 "95.128.43.164:80 orport=443 id=616081EC829593AF4232550DE6FFAA1D75B37A90"
 " ipv6=[2a02:ec0:209:10::4]:443"
 " ipv6=[2a02:ec0:209:10::4]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.139.104:8080 orport=443 id=68F175CCABE727AA2D2309BCD8789499CEE36ED7"
 "163.172.139.104:8080 orport=443 id=68F175CCABE727AA2D2309BCD8789499CEE36ED7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "85.214.62.48:80 orport=443 id=6A7551EEE18F78A9813096E82BF84F740D32B911"
 "85.214.62.48:80 orport=443 id=6A7551EEE18F78A9813096E82BF84F740D32B911"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621"
 "80.127.137.19:80 orport=443 id=6EF897645B79B6CB35E853B32506375014DE3621"
 " ipv6=[2001:981:47c1:1::6]:443"
 " ipv6=[2001:981:47c1:1::6]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "95.183.48.12:80 orport=443 id=7187CED1A3871F837D0E60AC98F374AC541CB0DA"
 "95.183.48.12:80 orport=443 id=7187CED1A3871F837D0E60AC98F374AC541CB0DA"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812"
 "85.214.151.72:9030 orport=9001 id=722D365140C8C52DBB3C9FF6986E3CEFFE2BA812"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE"
 "85.235.250.88:80 orport=443 id=72B2B12A3F60408BDBC98C6DF53988D3A0B3F0EE"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C"
 "176.31.191.26:80 orport=443 id=7350AB9ED7568F22745198359373C04AC783C37C"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "134.119.36.135:80 orport=443 id=763C9556602BD6207771A7A3D958091D44C43228"
 "134.119.36.135:80 orport=443 id=763C9556602BD6207771A7A3D958091D44C43228"
 " ipv6=[2a00:1158:3::2a8]:993"
 " ipv6=[2a00:1158:3::2a8]:993"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7"
 "188.166.133.133:9030 orport=9001 id=774555642FDC1E1D4FDF2E0C31B7CA9501C5C9C7"
 " ipv6=[2a03:b0c0:2:d0::5:f001]:9001"
 " ipv6=[2a03:b0c0:2:d0::5:f001]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "81.30.158.213:9030 orport=9001 id=789EA6C9AE9ADDD8760903171CFA9AC5741B0C70"
 "81.30.158.213:9030 orport=9001 id=789EA6C9AE9ADDD8760903171CFA9AC5741B0C70"
 " ipv6=[2001:4ba0:cafe:e84::1]:9001"
 " ipv6=[2001:4ba0:cafe:e84::1]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576"
 "171.25.193.131:80 orport=443 id=79861CF8522FC637EF046F7688F5289E49D94576"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "82.223.21.74:9030 orport=9001 id=7A32C9519D80CA458FC8B034A28F5F6815649A98"
 "82.223.21.74:9030 orport=9001 id=7A32C9519D80CA458FC8B034A28F5F6815649A98"
 " ipv6=[2001:470:53e0::cafe]:9050"
 " ipv6=[2001:470:53e0::cafe]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "51.254.136.195:80 orport=443 id=7BB70F8585DFC27E75D692970C0EEB0F22983A63"
 "51.254.136.195:80 orport=443 id=7BB70F8585DFC27E75D692970C0EEB0F22983A63"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.11.114.45:9031 orport=9002 id=80AAF8D5956A43C197104CEF2550CD42D165C6FB"
 "193.11.114.45:9031 orport=9002 id=80AAF8D5956A43C197104CEF2550CD42D165C6FB"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F"
 "192.160.102.164:80 orport=9001 id=823AA81E277F366505545522CEDC2F529CE4DC3F"
 " ipv6=[2605:e200:d00c:c01d::1111]:9002"
 " ipv6=[2605:e200:d00c:c01d::1111]:9002"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7"
 "192.87.28.82:9030 orport=9001 id=844AE9CAD04325E955E2BE1521563B79FE7094B7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "188.166.23.127:80 orport=443 id=8672E8A01B4D3FA4C0BBE21C740D4506302EA487"
 "188.166.23.127:80 orport=443 id=8672E8A01B4D3FA4C0BBE21C740D4506302EA487"
 " ipv6=[2a03:b0c0:2:d0::27b:7001]:9050"
 " ipv6=[2a03:b0c0:2:d0::27b:7001]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "93.180.156.84:9030 orport=9001 id=8844D87E9B038BE3270938F05AF797E1D3C74C0F"
 "93.180.156.84:9030 orport=9001 id=8844D87E9B038BE3270938F05AF797E1D3C74C0F"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C"
 "212.47.241.21:80 orport=443 id=892F941915F6A0C6E0958E52E0A9685C190CF45C"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.194.53:9030 orport=9001 id=8C00FA7369A7A308F6A137600F0FA07990D9D451"
 "163.172.194.53:9030 orport=9001 id=8C00FA7369A7A308F6A137600F0FA07990D9D451"
 " ipv6=[2001:bc8:225f:142:6c69:7461:7669:73]:9001"
 " ipv6=[2001:bc8:225f:142:6c69:7461:7669:73]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422"
 "178.254.44.135:9030 orport=9001 id=8FA37B93397015B2BC5A525C908485260BE9F422"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "151.80.42.103:9030 orport=9001 id=9007C1D8E4F03D506A4A011B907A9E8D04E3C605"
 "151.80.42.103:9030 orport=9001 id=9007C1D8E4F03D506A4A011B907A9E8D04E3C605"
 " ipv6=[2001:41d0:e:f67::114]:9001"
 " ipv6=[2001:41d0:e:f67::114]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "173.255.245.116:9030 orport=9001 id=91E4015E1F82DAF0121D62267E54A1F661AB6DC7"
 "173.255.245.116:9030 orport=9001 id=91E4015E1F82DAF0121D62267E54A1F661AB6DC7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "51.255.41.65:9030 orport=9001 id=9231DF741915AA1630031A93026D88726877E93A"
 "51.255.41.65:9030 orport=9001 id=9231DF741915AA1630031A93026D88726877E93A"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A"
 "178.16.208.57:80 orport=443 id=92CFD9565B24646CAC2D172D3DB503D69E777B8A"
 " ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443"
 " ipv6=[2a00:1c20:4089:1234:7825:2c5d:1ecd:c66f]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "91.219.237.244:80 orport=443 id=92ECC9E0E2AF81BB954719B189AC362E254AD4A5"
 "91.219.237.244:80 orport=443 id=92ECC9E0E2AF81BB954719B189AC362E254AD4A5"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "204.8.156.142:80 orport=443 id=94C4B7B8C50C86A92B6A20107539EE2678CF9A28"
 "204.8.156.142:80 orport=443 id=94C4B7B8C50C86A92B6A20107539EE2678CF9A28"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.223.200:80 orport=443 id=998BF3ED7F70E33D1C307247B9626D9E7573C438"
 "163.172.223.200:80 orport=443 id=998BF3ED7F70E33D1C307247B9626D9E7573C438"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7"
 "81.7.10.93:31336 orport=31337 id=99E246DB480B313A3012BC3363093CC26CD209C7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F"
 "91.229.20.27:9030 orport=9001 id=9A0D54D3A6D2E0767596BF1515E6162A75B3293F"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "66.111.2.20:9030 orport=9001 id=9A68B85A02318F4E7E87F2828039FBD5D75B0142"
 "66.111.2.20:9030 orport=9001 id=9A68B85A02318F4E7E87F2828039FBD5D75B0142"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883"
 "185.100.86.128:9030 orport=9001 id=9B31F1F1C1554F9FFB3455911F82E818EF7C7883"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.9.151.241:9030 orport=4223 id=9BF04559224F0F1C3C953D641F1744AF0192543A"
 "5.9.151.241:9030 orport=4223 id=9BF04559224F0F1C3C953D641F1744AF0192543A"
 " ipv6=[2a01:4f8:190:34f0::2]:4223"
 " ipv6=[2a01:4f8:190:34f0::2]:4223"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "86.105.212.130:9030 orport=443 id=9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022"
 "86.105.212.130:9030 orport=443 id=9C900A7F6F5DD034CFFD192DAEC9CCAA813DB022"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377"
 "178.254.20.134:80 orport=443 id=9F5068310818ED7C70B0BC4087AB55CB12CB4377"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.28.110.244:80 orport=443 id=9F7D6E6420183C2B76D3CE99624EBC98A21A967E"
 "46.28.110.244:80 orport=443 id=9F7D6E6420183C2B76D3CE99624EBC98A21A967E"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334"
 "91.121.84.137:4952 orport=4052 id=9FBEB75E8BC142565F12CBBE078D63310236A334"
 " ipv6=[2001:41d0:1:8989::1]:4052"
 " ipv6=[2001:41d0:1:8989::1]:4052"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1"
 "178.62.22.36:80 orport=443 id=A0766C0D3A667A3232C7D569DE94A28F9922FCB1"
 " ipv6=[2a03:b0c0:1:d0::174:1]:9050"
 " ipv6=[2a03:b0c0:1:d0::174:1]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A"
 "171.25.193.77:80 orport=443 id=A10C4F666D27364036B562823E5830BC448E046A"
 " ipv6=[2001:67c:289c:3::77]:443"
 " ipv6=[2001:67c:289c:3::77]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE"
 "171.25.193.78:80 orport=443 id=A478E421F83194C114F41E94F95999672AED51FE"
 " ipv6=[2001:67c:289c:3::78]:443"
 " ipv6=[2001:67c:289c:3::78]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.149.122:80 orport=443 id=A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2"
 "163.172.149.122:80 orport=443 id=A9406A006D6E7B5DA30F2C6D4E42A338B5E340B2"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.34.63.137:9030 orport=443 id=ABCB4965F1FEE193602B50A365425105C889D3F8"
 "192.34.63.137:9030 orport=443 id=ABCB4965F1FEE193602B50A365425105C889D3F8"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9"
 "109.163.234.9:80 orport=443 id=ABF7FBF389C9A747938B639B20E80620B460B2A9"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "86.59.119.88:80 orport=443 id=ACD889D86E02EDDAB1AFD81F598C0936238DC6D0"
 "86.59.119.88:80 orport=443 id=ACD889D86E02EDDAB1AFD81F598C0936238DC6D0"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F"
 "185.129.62.62:9030 orport=9001 id=ACDD9E85A05B127BA010466C13C8C47212E8A38F"
 " ipv6=[2a06:d380:0:3700::62]:9001"
 " ipv6=[2a06:d380:0:3700::62]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE"
 "163.172.131.88:80 orport=443 id=AD253B49E303C6AB1E048B014392AC569E8A7DAE"
 " ipv6=[2001:bc8:4400:2100::2:1009]:443"
 " ipv6=[2001:bc8:4400:2100::2:1009]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D"
 "31.185.104.20:80 orport=443 id=ADB2C26629643DBB9F8FE0096E7D16F9414B4F8D"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05"
 "37.187.7.74:80 orport=443 id=AEA43CB1E47BE5F8051711B2BF01683DB1568E05"
 " ipv6=[2001:41d0:a:74a::1]:443"
 " ipv6=[2001:41d0:a:74a::1]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.28.205.170:80 orport=443 id=AF322D83A4D2048B22F7F1AF5F38AFF4D09D0B76"
 "46.28.205.170:80 orport=443 id=AF322D83A4D2048B22F7F1AF5F38AFF4D09D0B76"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2"
 "5.9.147.226:9030 orport=9001 id=B0553175AADB0501E5A61FC61CEA3970BE130FF2"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.129.62.232:80 orport=443 id=B143D439B72D239A419F8DCE07B8A8EB1B486FA7"
 "212.129.62.232:80 orport=443 id=B143D439B72D239A419F8DCE07B8A8EB1B486FA7"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "198.199.64.217:80 orport=443 id=B1D81825CFD7209BD1B4520B040EF5653C204A23"
 "198.199.64.217:80 orport=443 id=B1D81825CFD7209BD1B4520B040EF5653C204A23"
 " ipv6=[2604:a880:400:d0::1a9:b001]:9050"
 " ipv6=[2604:a880:400:d0::1a9:b001]:9050"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664"
 "136.243.214.137:80 orport=443 id=B291D30517D23299AD7CEE3E60DFE60D0E3A4664"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A"
 "178.16.208.60:80 orport=443 id=B44FBE5366AD98B46D829754FA4AC599BAE41A6A"
 " ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443"
 " ipv6=[2a00:1c20:4089:1234:67bc:79f3:61c0:6e49]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "93.115.97.242:9030 orport=9001 id=B5212DB685A2A0FCFBAE425738E478D12361710D"
 "93.115.97.242:9030 orport=9001 id=B5212DB685A2A0FCFBAE425738E478D12361710D"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243"
 "81.2.209.10:443 orport=80 id=B6904ADD4C0D10CDA7179E051962350A69A63243"
 " ipv6=[2001:15e8:201:1::d10a]:80"
 " ipv6=[2001:15e8:201:1::d10a]:80"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E"
 "193.11.114.46:9032 orport=9003 id=B83DC1558F0D34353BB992EF93AFEAFDB226A73E"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "85.248.227.164:444 orport=9002 id=B84F248233FEA90CAD439F292556A3139F6E1B82"
 "85.248.227.164:444 orport=9002 id=B84F248233FEA90CAD439F292556A3139F6E1B82"
 " ipv6=[2a00:1298:8011:212::164]:9004"
 " ipv6=[2a00:1298:8011:212::164]:9004"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "89.163.247.43:9030 orport=9001 id=BC7ACFAC04854C77167C7D66B7E471314ED8C410"
 "89.163.247.43:9030 orport=9001 id=BC7ACFAC04854C77167C7D66B7E471314ED8C410"
 " ipv6=[2001:4ba0:fff7:25::5]:9001"
 " ipv6=[2001:4ba0:fff7:25::5]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "198.96.155.3:8080 orport=5001 id=BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E"
 "198.96.155.3:8080 orport=5001 id=BCEDF6C193AA687AE471B8A22EBF6BC57C2D285E"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5"
 "128.199.55.207:9030 orport=9001 id=BCEF908195805E03E92CCFE669C48738E556B9C5"
 " ipv6=[2a03:b0c0:2:d0::158:3001]:9001"
 " ipv6=[2a03:b0c0:2:d0::158:3001]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.35.202.221:9030 orport=9001 id=C13B91384CDD52A871E3ECECE4EF74A7AC7DCB08"
 "185.35.202.221:9030 orport=9001 id=C13B91384CDD52A871E3ECECE4EF74A7AC7DCB08"
 " ipv6=[2a02:ed06::221]:9001"
 " ipv6=[2a02:ed06::221]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2"
 "213.239.217.18:1338 orport=1337 id=C37BC191AC389179674578C3E6944E925FE186C2"
 " ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337"
 " ipv6=[2a01:4f8:a0:746a:101:1:1:1]:1337"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "188.138.112.60:1433 orport=1521 id=C414F28FD2BEC1553024299B31D4E726BEB8E788"
 "188.138.112.60:1433 orport=1521 id=C414F28FD2BEC1553024299B31D4E726BEB8E788"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "85.248.227.163:443 orport=9001 id=C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9"
 "85.248.227.163:443 orport=9001 id=C793AB88565DDD3C9E4C6F15CCB9D8C7EF964CE9"
 " ipv6=[2a00:1298:8011:212::163]:9003"
 " ipv6=[2a00:1298:8011:212::163]:9003"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.199.226:80 orport=443 id=CBEFF7BA4A4062045133C053F2D70524D8BBE5BE"
 "178.62.199.226:80 orport=443 id=CBEFF7BA4A4062045133C053F2D70524D8BBE5BE"
 " ipv6=[2a03:b0c0:2:d0::b7:5001]:443"
 " ipv6=[2a03:b0c0:2:d0::b7:5001]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE"
 "134.119.3.164:9030 orport=9001 id=D1B8AAA98C65F3DF7D8BB3AF881CAEB84A33D8EE"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "31.171.155.108:9030 orport=9001 id=D3E5EDDBE5159388704D6785BE51930AAFACEC6F"
 "31.171.155.108:9030 orport=9001 id=D3E5EDDBE5159388704D6785BE51930AAFACEC6F"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "37.187.115.157:9030 orport=9001 id=D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A"
 "37.187.115.157:9030 orport=9001 id=D5039E1EBFD96D9A3F9846BF99EC9F75EDDE902A"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "166.82.21.200:9030 orport=9029 id=D5C33F3E203728EDF8361EA868B2939CCC43FAFB"
 "166.82.21.200:9030 orport=9029 id=D5C33F3E203728EDF8361EA868B2939CCC43FAFB"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.14.185.240:9030 orport=443 id=D62FB817B0288085FAC38A6DC8B36DCD85B70260"
 "185.14.185.240:9030 orport=443 id=D62FB817B0288085FAC38A6DC8B36DCD85B70260"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.101.169.151:9030 orport=9001 id=D760C5B436E42F93D77EF2D969157EEA14F9B39C"
 "46.101.169.151:9030 orport=9001 id=D760C5B436E42F93D77EF2D969157EEA14F9B39C"
 " ipv6=[2a03:b0c0:3:d0::74f:a001]:9001"
 " ipv6=[2a03:b0c0:3:d0::74f:a001]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.4.111.124:9030 orport=9001 id=D9065F9E57899B3D272AA212317AF61A9B14D204"
 "46.4.111.124:9030 orport=9001 id=D9065F9E57899B3D272AA212317AF61A9B14D204"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.35.52.53:9030 orport=9001 id=DAA39FC00B196B353C2A271459C305C429AF09E4"
 "193.35.52.53:9030 orport=9001 id=DAA39FC00B196B353C2A271459C305C429AF09E4"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB"
 "178.33.183.251:80 orport=443 id=DD823AFB415380A802DCAEB9461AE637604107FB"
 " ipv6=[2001:41d0:2:a683::251]:443"
 " ipv6=[2001:41d0:2:a683::251]:443"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.62.173.203:9030 orport=9001 id=DD85503F2D1F52EF9EAD621E942298F46CD2FC10"
 "178.62.173.203:9030 orport=9001 id=DD85503F2D1F52EF9EAD621E942298F46CD2FC10"
 " ipv6=[2a03:b0c0:0:1010::a4:b001]:9001"
 " ipv6=[2a03:b0c0:0:1010::a4:b001]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "5.34.183.205:80 orport=443 id=DDD7871C1B7FA32CB55061E08869A236E61BDDF8"
 "5.34.183.205:80 orport=443 id=DDD7871C1B7FA32CB55061E08869A236E61BDDF8"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "78.24.75.53:9030 orport=9001 id=DEB73705B2929AE9BE87091607388939332EF123"
 "78.24.75.53:9030 orport=9001 id=DEB73705B2929AE9BE87091607388939332EF123"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "92.222.38.67:80 orport=443 id=DED6892FF89DBD737BA689698A171B2392EB3E82"
 "92.222.38.67:80 orport=443 id=DED6892FF89DBD737BA689698A171B2392EB3E82"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "166.70.207.2:9030 orport=9001 id=E3DB2E354B883B59E8DC56B3E7A353DDFD457812"
 "166.70.207.2:9030 orport=9001 id=E3DB2E354B883B59E8DC56B3E7A353DDFD457812"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.252.26.2:45212 orport=49991 id=E589316576A399C511A9781A73DA4545640B479D"
 "46.252.26.2:45212 orport=49991 id=E589316576A399C511A9781A73DA4545640B479D"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "167.114.35.28:9030 orport=9001 id=E65D300F11E1DB12C534B0146BDAB6972F1A8A48"
 "167.114.35.28:9030 orport=9001 id=E65D300F11E1DB12C534B0146BDAB6972F1A8A48"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8"
 "131.188.40.188:443 orport=80 id=EBE718E1A49EE229071702964F8DB1F318075FF8"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024"
 "192.87.28.28:9030 orport=9001 id=ED2338CAC2711B3E331392E1ED2831219B794024"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC"
 "192.99.212.139:80 orport=443 id=F10BDE279AE71515DDCCCC61DC19AC8765F8A3CC"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109"
 "212.238.208.48:9030 orport=9001 id=F406219CDD339026D160E53FCA0EF6857C70F109"
 " ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001"
 " ipv6=[2001:984:a8fb:1:ba27:ebff:feac:c109]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "46.28.207.141:80 orport=443 id=F69BED36177ED727706512BA6A97755025EEA0FB"
 "46.28.207.141:80 orport=443 id=F69BED36177ED727706512BA6A97755025EEA0FB"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE"
 "78.47.18.110:443 orport=80 id=F8D27B163B9247B232A2EEE68DD8B698695C28DE"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE"
 "178.254.13.126:80 orport=443 id=F9246DEF2B653807236DA134F2AEAB103D58ABFE"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216"
 "185.96.180.29:80 orport=443 id=F93D8F37E35C390BCAD9F9069E13085B745EC216"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "86.59.119.83:80 orport=443 id=FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B"
 "86.59.119.83:80 orport=443 id=FC9AC8EA0160D88BCCFDE066940D7DD9FA45495B"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "192.187.124.98:9030 orport=9001 id=FD1871854BFC06D7B02F10742073069F0528B5CC"
 "192.187.124.98:9030 orport=9001 id=FD1871854BFC06D7B02F10742073069F0528B5CC"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76"
 "149.56.45.200:9030 orport=9001 id=FE296180018833AF03A8EACD5894A614623D3F76"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,
 "193.11.164.243:9030 orport=9001 id=FFA72BD683BC2FCF988356E6BEC1E490F313FB07"
 "193.11.164.243:9030 orport=9001 id=FFA72BD683BC2FCF988356E6BEC1E490F313FB07"
 " ipv6=[2001:6b0:7:125::243]:9001"
 " ipv6=[2001:6b0:7:125::243]:9001"
-" weight=10",
+/* nickname= */
+/* extrainfo=0 */
+/* ===== */
+,