aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/common/address.c271
-rw-r--r--src/common/address.h60
-rw-r--r--src/common/aes.c2
-rw-r--r--src/common/aes.h2
-rw-r--r--src/common/backtrace.c2
-rw-r--r--src/common/backtrace.h2
-rw-r--r--src/common/compat.c420
-rw-r--r--src/common/compat.h71
-rw-r--r--src/common/compat_libevent.c22
-rw-r--r--src/common/compat_libevent.h10
-rw-r--r--src/common/compat_pthreads.c287
-rw-r--r--src/common/compat_threads.c302
-rw-r--r--src/common/compat_threads.h115
-rw-r--r--src/common/compat_winthreads.c196
-rw-r--r--src/common/container.c2
-rw-r--r--src/common/container.h2
-rw-r--r--src/common/crypto.c12
-rw-r--r--src/common/crypto.h4
-rw-r--r--src/common/crypto_curve25519.c2
-rw-r--r--src/common/crypto_curve25519.h2
-rw-r--r--src/common/crypto_ed25519.c2
-rw-r--r--src/common/crypto_ed25519.h2
-rw-r--r--src/common/crypto_format.c2
-rw-r--r--src/common/crypto_s2k.c2
-rw-r--r--src/common/crypto_s2k.h2
-rw-r--r--src/common/di_ops.c2
-rw-r--r--src/common/di_ops.h2
-rw-r--r--src/common/include.am15
-rw-r--r--src/common/log.c4
-rw-r--r--src/common/memarea.c2
-rw-r--r--src/common/memarea.h2
-rw-r--r--src/common/mempool.c2
-rw-r--r--src/common/mempool.h2
-rw-r--r--src/common/procmon.c2
-rw-r--r--src/common/procmon.h2
-rw-r--r--src/common/sandbox.c35
-rw-r--r--src/common/sandbox.h4
-rw-r--r--src/common/testsupport.h6
-rw-r--r--src/common/torgzip.c52
-rw-r--r--src/common/torgzip.h14
-rw-r--r--src/common/torint.h6
-rw-r--r--src/common/torlog.h6
-rw-r--r--src/common/tortls.c24
-rw-r--r--src/common/tortls.h2
-rw-r--r--src/common/util.c131
-rw-r--r--src/common/util.h10
-rw-r--r--src/common/util_process.c2
-rw-r--r--src/common/util_process.h2
-rw-r--r--src/common/workqueue.c490
-rw-r--r--src/common/workqueue.h48
-rw-r--r--src/config/geoip19540
-rw-r--r--src/config/geoip66592
-rw-r--r--src/ext/ht.h2
-rw-r--r--src/ext/tinytest_demo.c16
-rw-r--r--src/ext/trunnel/trunnel-impl.h2
-rw-r--r--src/ext/trunnel/trunnel.c2
-rw-r--r--src/ext/trunnel/trunnel.h2
-rw-r--r--src/or/Makefile.nmake1
-rw-r--r--src/or/addressmap.c88
-rw-r--r--src/or/addressmap.h9
-rw-r--r--src/or/buffers.c10
-rw-r--r--src/or/buffers.h4
-rw-r--r--src/or/channel.c610
-rw-r--r--src/or/channel.h124
-rw-r--r--src/or/channeltls.c160
-rw-r--r--src/or/channeltls.h4
-rw-r--r--src/or/circpathbias.c6
-rw-r--r--src/or/circpathbias.h2
-rw-r--r--src/or/circuitbuild.c47
-rw-r--r--src/or/circuitbuild.h5
-rw-r--r--src/or/circuitlist.c73
-rw-r--r--src/or/circuitlist.h5
-rw-r--r--src/or/circuitmux.c58
-rw-r--r--src/or/circuitmux.h14
-rw-r--r--src/or/circuitmux_ewma.c60
-rw-r--r--src/or/circuitmux_ewma.h2
-rw-r--r--src/or/circuitstats.c2
-rw-r--r--src/or/circuitstats.h2
-rw-r--r--src/or/circuituse.c114
-rw-r--r--src/or/circuituse.h2
-rw-r--r--src/or/command.c13
-rw-r--r--src/or/command.h2
-rw-r--r--src/or/config.c500
-rw-r--r--src/or/config.h4
-rw-r--r--src/or/confparse.c2
-rw-r--r--src/or/confparse.h2
-rw-r--r--src/or/connection.c434
-rw-r--r--src/or/connection.h9
-rw-r--r--src/or/connection_edge.c508
-rw-r--r--src/or/connection_edge.h26
-rw-r--r--src/or/connection_or.c81
-rw-r--r--src/or/connection_or.h10
-rw-r--r--src/or/control.c150
-rw-r--r--src/or/control.h9
-rw-r--r--src/or/cpuworker.c753
-rw-r--r--src/or/cpuworker.h12
-rw-r--r--src/or/directory.c193
-rw-r--r--src/or/directory.h14
-rw-r--r--src/or/dirserv.c53
-rw-r--r--src/or/dirserv.h2
-rw-r--r--src/or/dirvote.c12
-rw-r--r--src/or/dirvote.h34
-rw-r--r--src/or/dns.c8
-rw-r--r--src/or/dns.h2
-rw-r--r--src/or/dnsserv.c22
-rw-r--r--src/or/dnsserv.h2
-rw-r--r--src/or/entrynodes.c17
-rw-r--r--src/or/entrynodes.h2
-rw-r--r--src/or/eventdns_tor.h2
-rw-r--r--src/or/ext_orport.c2
-rw-r--r--src/or/ext_orport.h2
-rw-r--r--src/or/fp_pair.c2
-rw-r--r--src/or/fp_pair.h2
-rw-r--r--src/or/geoip.c2
-rw-r--r--src/or/geoip.h2
-rw-r--r--src/or/hibernate.c2
-rw-r--r--src/or/hibernate.h2
-rw-r--r--src/or/include.am9
-rw-r--r--src/or/main.c129
-rw-r--r--src/or/main.h6
-rw-r--r--src/or/microdesc.c2
-rw-r--r--src/or/microdesc.h2
-rw-r--r--src/or/networkstatus.c15
-rw-r--r--src/or/networkstatus.h2
-rw-r--r--src/or/nodelist.c235
-rw-r--r--src/or/nodelist.h32
-rw-r--r--src/or/ntmain.c2
-rw-r--r--src/or/ntmain.h2
-rw-r--r--src/or/onion.c21
-rw-r--r--src/or/onion.h6
-rw-r--r--src/or/onion_fast.c2
-rw-r--r--src/or/onion_fast.h2
-rw-r--r--src/or/onion_ntor.c2
-rw-r--r--src/or/onion_ntor.h2
-rw-r--r--src/or/onion_tap.c2
-rw-r--r--src/or/onion_tap.h2
-rw-r--r--src/or/or.h294
-rw-r--r--src/or/policies.c38
-rw-r--r--src/or/policies.h2
-rw-r--r--src/or/reasons.c4
-rw-r--r--src/or/reasons.h2
-rw-r--r--src/or/relay.c69
-rw-r--r--src/or/relay.h7
-rw-r--r--src/or/rendclient.c48
-rw-r--r--src/or/rendclient.h2
-rw-r--r--src/or/rendcommon.c150
-rw-r--r--src/or/rendcommon.h6
-rw-r--r--src/or/rendmid.c9
-rw-r--r--src/or/rendmid.h2
-rw-r--r--src/or/rendservice.c438
-rw-r--r--src/or/rendservice.h8
-rw-r--r--src/or/rephist.c222
-rw-r--r--src/or/rephist.h9
-rw-r--r--src/or/replaycache.c2
-rw-r--r--src/or/replaycache.h2
-rw-r--r--src/or/router.c70
-rw-r--r--src/or/router.h4
-rw-r--r--src/or/routerlist.c570
-rw-r--r--src/or/routerlist.h10
-rw-r--r--src/or/routerparse.c82
-rw-r--r--src/or/routerparse.h5
-rw-r--r--src/or/routerset.c2
-rw-r--r--src/or/routerset.h2
-rw-r--r--src/or/scheduler.c711
-rw-r--r--src/or/scheduler.h50
-rw-r--r--src/or/statefile.c5
-rw-r--r--src/or/statefile.h2
-rw-r--r--src/or/status.c2
-rw-r--r--src/or/status.h2
-rw-r--r--src/or/tor_main.c2
-rw-r--r--src/or/transports.c6
-rw-r--r--src/or/transports.h4
-rw-r--r--src/test/Makefile.nmake7
-rw-r--r--src/test/bench.c2
-rwxr-xr-xsrc/test/bt_test.py2
-rw-r--r--src/test/ed25519_exts_ref.py2
-rw-r--r--src/test/fakechans.h26
-rw-r--r--src/test/include.am71
-rwxr-xr-xsrc/test/ntor_ref.py2
-rw-r--r--src/test/test-child.c2
-rwxr-xr-xsrc/test/test-network.sh2
-rw-r--r--src/test/test.c515
-rw-r--r--src/test/test.h6
-rw-r--r--src/test/test_addr.c471
-rw-r--r--src/test/test_address.c470
-rw-r--r--src/test/test_bt_cl.c2
-rw-r--r--src/test/test_buffers.c344
-rw-r--r--src/test/test_cell_formats.c777
-rw-r--r--src/test/test_cell_queue.c60
-rw-r--r--src/test/test_channel.c1703
-rw-r--r--src/test/test_channeltls.c333
-rw-r--r--src/test/test_checkdir.c79
-rw-r--r--src/test/test_circuitlist.c130
-rw-r--r--src/test/test_circuitmux.c17
-rwxr-xr-xsrc/test/test_cmdline_args.py6
-rw-r--r--src/test/test_config.c648
-rw-r--r--src/test/test_containers.c393
-rw-r--r--src/test/test_controller_events.c54
-rw-r--r--src/test/test_crypto.c868
-rw-r--r--src/test/test_crypto_slow.c409
-rw-r--r--src/test/test_data.c2
-rw-r--r--src/test/test_dir.c798
-rw-r--r--src/test/test_entryconn.c769
-rw-r--r--src/test/test_entrynodes.c110
-rw-r--r--src/test/test_extorport.c189
-rw-r--r--src/test/test_hs.c20
-rw-r--r--src/test/test_introduce.c4
-rw-r--r--src/test/test_logging.c32
-rw-r--r--src/test/test_microdesc.c167
-rw-r--r--src/test/test_nodelist.c8
-rw-r--r--src/test/test_ntor_cl.c2
-rw-r--r--src/test/test_oom.c82
-rw-r--r--src/test/test_options.c8
-rw-r--r--src/test/test_policy.c42
-rw-r--r--src/test/test_pt.c72
-rw-r--r--src/test/test_relay.c134
-rw-r--r--src/test/test_relaycell.c68
-rw-r--r--src/test/test_replay.c54
-rw-r--r--src/test/test_routerkeys.c18
-rw-r--r--src/test/test_routerlist.c103
-rw-r--r--src/test/test_routerset.c276
-rw-r--r--src/test/test_scheduler.c763
-rw-r--r--src/test/test_slow.c29
-rw-r--r--src/test/test_socks.c306
-rw-r--r--src/test/test_status.c245
-rw-r--r--src/test/test_threads.c316
-rw-r--r--src/test/test_util.c2752
-rw-r--r--src/test/test_util_slow.c389
-rw-r--r--src/test/test_workqueue.c409
-rw-r--r--src/test/testing_common.c298
-rwxr-xr-xsrc/test/zero_length_keys.sh115
-rw-r--r--src/tools/tor-checkkey.c2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper-natpmp.c2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper-natpmp.h2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper-upnp.c2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper-upnp.h2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper.c2
-rw-r--r--src/tools/tor-fw-helper/tor-fw-helper.h2
-rw-r--r--src/tools/tor-gencert.c2
-rw-r--r--src/tools/tor-resolve.c29
-rw-r--r--src/win32/orconfig.h2
241 files changed, 36710 insertions, 15751 deletions
diff --git a/src/common/address.c b/src/common/address.c
index de5d3a6ff7..3b4be1d601 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -8,24 +8,26 @@
* \brief Functions to use and manipulate the tor_addr_t structure.
**/
-#include "orconfig.h"
-#include "compat.h"
-#include "util.h"
-#include "address.h"
-#include "torlog.h"
-#include "container.h"
-#include "sandbox.h"
+#define ADDRESS_PRIVATE
#ifdef _WIN32
-#include <process.h>
-#include <windows.h>
-#include <winsock2.h>
/* For access to structs needed by GetAdaptersAddresses */
#undef _WIN32_WINNT
#define _WIN32_WINNT 0x0501
+#include <process.h>
+#include <winsock2.h>
+#include <windows.h>
#include <iphlpapi.h>
#endif
+#include "orconfig.h"
+#include "compat.h"
+#include "util.h"
+#include "address.h"
+#include "torlog.h"
+#include "container.h"
+#include "sandbox.h"
+
#ifdef HAVE_SYS_TIME_H
#include <sys/time.h>
#endif
@@ -89,13 +91,14 @@ tor_addr_to_sockaddr(const tor_addr_t *a,
struct sockaddr *sa_out,
socklen_t len)
{
+ memset(sa_out, 0, len);
+
sa_family_t family = tor_addr_family(a);
if (family == AF_INET) {
struct sockaddr_in *sin;
if (len < (int)sizeof(struct sockaddr_in))
return 0;
sin = (struct sockaddr_in *)sa_out;
- memset(sin, 0, sizeof(struct sockaddr_in));
#ifdef HAVE_STRUCT_SOCKADDR_IN_SIN_LEN
sin->sin_len = sizeof(struct sockaddr_in);
#endif
@@ -108,7 +111,6 @@ tor_addr_to_sockaddr(const tor_addr_t *a,
if (len < (int)sizeof(struct sockaddr_in6))
return 0;
sin6 = (struct sockaddr_in6 *)sa_out;
- memset(sin6, 0, sizeof(struct sockaddr_in6));
#ifdef HAVE_STRUCT_SOCKADDR_IN6_SIN6_LEN
sin6->sin6_len = sizeof(struct sockaddr_in6);
#endif
@@ -121,14 +123,26 @@ tor_addr_to_sockaddr(const tor_addr_t *a,
}
}
+/** Set address <b>a</b> to zero. This address belongs to
+ * the AF_UNIX family. */
+static void
+tor_addr_make_af_unix(tor_addr_t *a)
+{
+ memset(a, 0, sizeof(*a));
+ a->family = AF_UNIX;
+}
+
/** Set the tor_addr_t in <b>a</b> to contain the socket address contained in
- * <b>sa</b>. */
+ * <b>sa</b>. Return 0 on success and -1 on failure. */
int
tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
uint16_t *port_out)
{
tor_assert(a);
tor_assert(sa);
+
+ memset(a, 0, sizeof(*a));
+
if (sa->sa_family == AF_INET) {
struct sockaddr_in *sin = (struct sockaddr_in *) sa;
tor_addr_from_ipv4n(a, sin->sin_addr.s_addr);
@@ -139,6 +153,9 @@ tor_addr_from_sockaddr(tor_addr_t *a, const struct sockaddr *sa,
tor_addr_from_in6(a, &sin6->sin6_addr);
if (port_out)
*port_out = ntohs(sin6->sin6_port);
+ } else if (sa->sa_family == AF_UNIX) {
+ tor_addr_make_af_unix(a);
+ return 0;
} else {
tor_addr_make_unspec(a);
return -1;
@@ -418,6 +435,10 @@ tor_addr_to_str(char *dest, const tor_addr_t *addr, size_t len, int decorate)
ptr = dest;
}
break;
+ case AF_UNIX:
+ tor_snprintf(dest, len, "AF_UNIX");
+ ptr = dest;
+ break;
default:
return NULL;
}
@@ -723,6 +744,11 @@ tor_addr_parse_mask_ports(const char *s,
/* XXXX_IP6 is this really what we want? */
bits = 96 + bits%32; /* map v4-mapped masks onto 96-128 bits */
}
+ if (any_flag) {
+ log_warn(LD_GENERAL,
+ "Found bit prefix with wildcard address; rejecting");
+ goto err;
+ }
} else { /* pick an appropriate mask, as none was given */
if (any_flag)
bits = 0; /* This is okay whether it's V6 or V4 (FIX V4-mapped V6!) */
@@ -808,6 +834,8 @@ tor_addr_is_null(const tor_addr_t *addr)
}
case AF_INET:
return (tor_addr_to_ipv4n(addr) == 0);
+ case AF_UNIX:
+ return 1;
case AF_UNSPEC:
return 1;
default:
@@ -1018,7 +1046,6 @@ tor_addr_compare_masked(const tor_addr_t *addr1, const tor_addr_t *addr2,
} else {
a2 = tor_addr_to_ipv4h(addr2);
}
- if (mbits <= 0) return 0;
if (mbits > 32) mbits = 32;
a1 >>= (32-mbits);
a2 >>= (32-mbits);
@@ -1114,7 +1141,8 @@ fmt_addr32(uint32_t addr)
int
tor_addr_parse(tor_addr_t *addr, const char *src)
{
- char *tmp = NULL; /* Holds substring if we got a dotted quad. */
+ /* Holds substring of IPv6 address after removing square brackets */
+ char *tmp = NULL;
int result;
struct in_addr in_tmp;
struct in6_addr in6_tmp;
@@ -1199,26 +1227,17 @@ typedef ULONG (WINAPI *GetAdaptersAddresses_fn_t)(
ULONG, ULONG, PVOID, PIP_ADAPTER_ADDRESSES, PULONG);
#endif
-/** Try to ask our network interfaces what addresses they are bound to.
- * Return a new smartlist of tor_addr_t on success, and NULL on failure.
- * (An empty smartlist indicates that we successfully learned that we have no
- * addresses.) Log failure messages at <b>severity</b>. */
-static smartlist_t *
-get_interface_addresses_raw(int severity)
+#ifdef HAVE_IFADDRS_TO_SMARTLIST
+/*
+ * Convert a linked list consisting of <b>ifaddrs</b> structures
+ * into smartlist of <b>tor_addr_t</b> structures.
+ */
+STATIC smartlist_t *
+ifaddrs_to_smartlist(const struct ifaddrs *ifa)
{
-#if defined(HAVE_GETIFADDRS)
- /* Most free Unixy systems provide getifaddrs, which gives us a linked list
- * of struct ifaddrs. */
- struct ifaddrs *ifa = NULL;
+ smartlist_t *result = smartlist_new();
const struct ifaddrs *i;
- smartlist_t *result;
- if (getifaddrs(&ifa) < 0) {
- log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s",
- strerror(errno));
- return NULL;
- }
- result = smartlist_new();
for (i = ifa; i; i = i->ifa_next) {
tor_addr_t tmp;
if ((i->ifa_flags & (IFF_UP | IFF_RUNNING)) != (IFF_UP | IFF_RUNNING))
@@ -1233,9 +1252,72 @@ get_interface_addresses_raw(int severity)
smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
}
+ return result;
+}
+
+/** Use getiffaddrs() function to get list of current machine
+ * network interface addresses. Represent the result by smartlist of
+ * <b>tor_addr_t</b> structures.
+ */
+STATIC smartlist_t *
+get_interface_addresses_ifaddrs(int severity)
+{
+
+ /* Most free Unixy systems provide getifaddrs, which gives us a linked list
+ * of struct ifaddrs. */
+ struct ifaddrs *ifa = NULL;
+ smartlist_t *result;
+ if (getifaddrs(&ifa) < 0) {
+ log_fn(severity, LD_NET, "Unable to call getifaddrs(): %s",
+ strerror(errno));
+ return NULL;
+ }
+
+ result = ifaddrs_to_smartlist(ifa);
+
freeifaddrs(ifa);
+
+ return result;
+}
+#endif
+
+#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
+
+/** Convert a Windows-specific <b>addresses</b> linked list into smartlist
+ * of <b>tor_addr_t</b> structures.
+ */
+
+STATIC smartlist_t *
+ip_adapter_addresses_to_smartlist(const IP_ADAPTER_ADDRESSES *addresses)
+{
+ smartlist_t *result = smartlist_new();
+ const IP_ADAPTER_ADDRESSES *address;
+
+ for (address = addresses; address; address = address->Next) {
+ const IP_ADAPTER_UNICAST_ADDRESS *a;
+ for (a = address->FirstUnicastAddress; a; a = a->Next) {
+ /* Yes, it's a linked list inside a linked list */
+ const struct sockaddr *sa = a->Address.lpSockaddr;
+ tor_addr_t tmp;
+ if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
+ continue;
+ if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
+ continue;
+ smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
+ }
+ }
+
return result;
-#elif defined(_WIN32)
+}
+
+/** Windows only: use GetAdaptersInfo() function to retrieve network interface
+ * addresses of current machine and return them to caller as smartlist of
+ * <b>tor_addr_t</b> structures.
+ */
+STATIC smartlist_t *
+get_interface_addresses_win32(int severity)
+{
+
/* Windows XP began to provide GetAdaptersAddresses. Windows 2000 had a
"GetAdaptersInfo", but that's deprecated; let's just try
GetAdaptersAddresses and fall back to connect+getsockname.
@@ -1244,7 +1326,7 @@ get_interface_addresses_raw(int severity)
smartlist_t *result = NULL;
GetAdaptersAddresses_fn_t fn;
ULONG size, res;
- IP_ADAPTER_ADDRESSES *addresses = NULL, *address;
+ IP_ADAPTER_ADDRESSES *addresses = NULL;
(void) severity;
@@ -1279,63 +1361,106 @@ get_interface_addresses_raw(int severity)
goto done;
}
- result = smartlist_new();
- for (address = addresses; address; address = address->Next) {
- IP_ADAPTER_UNICAST_ADDRESS *a;
- for (a = address->FirstUnicastAddress; a; a = a->Next) {
- /* Yes, it's a linked list inside a linked list */
- struct sockaddr *sa = a->Address.lpSockaddr;
- tor_addr_t tmp;
- if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
- continue;
- if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
- continue;
- smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
- }
- }
+ result = ip_adapter_addresses_to_smartlist(addresses);
done:
if (lib)
FreeLibrary(lib);
tor_free(addresses);
return result;
-#elif defined(SIOCGIFCONF) && defined(HAVE_IOCTL)
+}
+
+#endif
+
+#ifdef HAVE_IFCONF_TO_SMARTLIST
+
+/* This is defined on Mac OS X */
+#ifndef _SIZEOF_ADDR_IFREQ
+#define _SIZEOF_ADDR_IFREQ sizeof
+#endif
+
+/** Convert <b>*ifr</b>, an ifreq structure array of size <b>buflen</b>
+ * into smartlist of <b>tor_addr_t</b> structures.
+ */
+STATIC smartlist_t *
+ifreq_to_smartlist(const struct ifreq *ifr, size_t buflen)
+{
+ smartlist_t *result = smartlist_new();
+
+ struct ifreq *r = (struct ifreq *)ifr;
+
+ while ((char *)r < (char *)ifr+buflen) {
+ const struct sockaddr *sa = &r->ifr_addr;
+ tor_addr_t tmp;
+ int valid_sa_family = (sa->sa_family == AF_INET ||
+ sa->sa_family == AF_INET6);
+
+ int conversion_success = (tor_addr_from_sockaddr(&tmp, sa, NULL) == 0);
+
+ if (valid_sa_family && conversion_success)
+ smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
+
+ r = (struct ifreq *)((char *)r + _SIZEOF_ADDR_IFREQ(*r));
+ }
+
+ return result;
+}
+
+/** Use ioctl(.,SIOCGIFCONF,.) to get a list of current machine
+ * network interface addresses. Represent the result by smartlist of
+ * <b>tor_addr_t</b> structures.
+ */
+STATIC smartlist_t *
+get_interface_addresses_ioctl(int severity)
+{
/* Some older unixy systems make us use ioctl(SIOCGIFCONF) */
struct ifconf ifc;
- int fd, i, sz, n;
+ int fd, sz;
+ void *databuf = NULL;
smartlist_t *result = NULL;
+
/* This interface, AFAICT, only supports AF_INET addresses */
fd = socket(AF_INET, SOCK_DGRAM, 0);
if (fd < 0) {
tor_log(severity, LD_NET, "socket failed: %s", strerror(errno));
goto done;
}
+
/* Guess how much space we need. */
- ifc.ifc_len = sz = 15*1024;
- ifc.ifc_ifcu.ifcu_req = tor_malloc(sz);
+ ifc.ifc_len = sz = 4096;
+ databuf = tor_malloc_zero(sz);
+ ifc.ifc_buf = databuf;
+
if (ioctl(fd, SIOCGIFCONF, &ifc) < 0) {
tor_log(severity, LD_NET, "ioctl failed: %s", strerror(errno));
close(fd);
goto done;
}
- close(fd);
- result = smartlist_new();
- if (ifc.ifc_len < sz)
- sz = ifc.ifc_len;
- n = sz / sizeof(struct ifreq);
- for (i = 0; i < n ; ++i) {
- struct ifreq *r = &ifc.ifc_ifcu.ifcu_req[i];
- struct sockaddr *sa = &r->ifr_addr;
- tor_addr_t tmp;
- if (sa->sa_family != AF_INET && sa->sa_family != AF_INET6)
- continue; /* should be impossible */
- if (tor_addr_from_sockaddr(&tmp, sa, NULL) < 0)
- continue;
- smartlist_add(result, tor_memdup(&tmp, sizeof(tmp)));
- }
+
+ result = ifreq_to_smartlist(databuf, ifc.ifc_len);
+
done:
- tor_free(ifc.ifc_ifcu.ifcu_req);
+ close(fd);
+ tor_free(databuf);
return result;
+}
+#endif
+
+/** Try to ask our network interfaces what addresses they are bound to.
+ * Return a new smartlist of tor_addr_t on success, and NULL on failure.
+ * (An empty smartlist indicates that we successfully learned that we have no
+ * addresses.) Log failure messages at <b>severity</b>. */
+STATIC smartlist_t *
+get_interface_addresses_raw(int severity)
+{
+#if defined(HAVE_IFADDRS_TO_SMARTLIST)
+ return get_interface_addresses_ifaddrs(severity);
+#endif
+#if defined(HAVE_IP_ADAPTER_TO_SMARTLIST)
+ return get_interface_addresses_win32(severity);
+#endif
+#if defined(HAVE_IFCONF_TO_SMARTLIST)
+ return get_interface_addresses_ioctl(severity);
#else
(void) severity;
return NULL;
@@ -1363,8 +1488,8 @@ tor_addr_is_multicast(const tor_addr_t *a)
* connects to the Internet. This address should only be used in checking
* whether our address has changed. Return 0 on success, -1 on failure.
*/
-int
-get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr)
+MOCK_IMPL(int,
+get_interface_address6,(int severity, sa_family_t family, tor_addr_t *addr))
{
/* XXX really, this function should yield a smartlist of addresses. */
smartlist_t *addrs;
@@ -1693,8 +1818,8 @@ tor_dup_ip(uint32_t addr)
* checking whether our address has changed. Return 0 on success, -1 on
* failure.
*/
-int
-get_interface_address(int severity, uint32_t *addr)
+MOCK_IMPL(int,
+get_interface_address,(int severity, uint32_t *addr))
{
tor_addr_t local_addr;
int r;
diff --git a/src/common/address.h b/src/common/address.h
index e8bab223a7..8c6ee5abbb 100644
--- a/src/common/address.h
+++ b/src/common/address.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -11,10 +11,41 @@
#ifndef TOR_ADDRESS_H
#define TOR_ADDRESS_H
+//#include <sys/sockio.h>
#include "orconfig.h"
#include "torint.h"
#include "compat.h"
+#ifdef ADDRESS_PRIVATE
+
+#if defined(HAVE_SYS_IOCTL_H)
+#include <sys/ioctl.h>
+#endif
+
+#ifdef HAVE_GETIFADDRS
+#define HAVE_IFADDRS_TO_SMARTLIST
+#endif
+
+#ifdef _WIN32
+#define HAVE_IP_ADAPTER_TO_SMARTLIST
+#endif
+
+#if defined(SIOCGIFCONF) && defined(HAVE_IOCTL)
+#define HAVE_IFCONF_TO_SMARTLIST
+#endif
+
+#if defined(HAVE_NET_IF_H)
+#include <net/if.h> // for struct ifconf
+#endif
+
+#if defined(HAVE_IFADDRS_TO_SMARTLIST)
+#include <ifaddrs.h>
+#endif
+
+// TODO win32 specific includes
+#include "container.h"
+#endif // ADDRESS_PRIVATE
+
/** The number of bits from an address to consider while doing a masked
* comparison. */
typedef uint8_t maskbits_t;
@@ -159,7 +190,8 @@ char *tor_dup_addr(const tor_addr_t *addr) ATTR_MALLOC;
const char *fmt_addr_impl(const tor_addr_t *addr, int decorate);
const char *fmt_addrport(const tor_addr_t *addr, uint16_t port);
const char * fmt_addr32(uint32_t addr);
-int get_interface_address6(int severity, sa_family_t family, tor_addr_t *addr);
+MOCK_DECL(int,get_interface_address6,(int severity, sa_family_t family,
+tor_addr_t *addr));
/** Flag to specify how to do a comparison between addresses. In an "exact"
* comparison, addresses are equivalent only if they are in the same family
@@ -236,9 +268,31 @@ int addr_mask_get_bits(uint32_t mask);
#define INET_NTOA_BUF_LEN 16
int tor_inet_ntoa(const struct in_addr *in, char *buf, size_t buf_len);
char *tor_dup_ip(uint32_t addr) ATTR_MALLOC;
-int get_interface_address(int severity, uint32_t *addr);
+MOCK_DECL(int,get_interface_address,(int severity, uint32_t *addr));
tor_addr_port_t *tor_addr_port_new(const tor_addr_t *addr, uint16_t port);
+#ifdef ADDRESS_PRIVATE
+STATIC smartlist_t *get_interface_addresses_raw(int severity);
+
+#ifdef HAVE_IFADDRS_TO_SMARTLIST
+STATIC smartlist_t *ifaddrs_to_smartlist(const struct ifaddrs *ifa);
+STATIC smartlist_t *get_interface_addresses_ifaddrs(int severity);
+#endif
+
+#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
+STATIC smartlist_t *ip_adapter_addresses_to_smartlist(
+ const IP_ADAPTER_ADDRESSES *addresses);
+STATIC smartlist_t *get_interface_addresses_win32(int severity);
+#endif
+
+#ifdef HAVE_IFCONF_TO_SMARTLIST
+STATIC smartlist_t *ifreq_to_smartlist(const struct ifreq *ifr,
+ size_t buflen);
+STATIC smartlist_t *get_interface_addresses_ioctl(int severity);
+#endif
+
+#endif // ADDRESS_PRIVATE
+
#endif
diff --git a/src/common/aes.c b/src/common/aes.c
index 877dce625c..7651f1d93a 100644
--- a/src/common/aes.c
+++ b/src/common/aes.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/aes.h b/src/common/aes.h
index f014e3a424..df2f3aa65d 100644
--- a/src/common/aes.h
+++ b/src/common/aes.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Implements a minimal interface to counter-mode AES. */
diff --git a/src/common/backtrace.c b/src/common/backtrace.c
index e6fb8938ac..1033c7e5de 100644
--- a/src/common/backtrace.c
+++ b/src/common/backtrace.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define __USE_GNU
diff --git a/src/common/backtrace.h b/src/common/backtrace.h
index 4938745b3d..a9151d7956 100644
--- a/src/common/backtrace.h
+++ b/src/common/backtrace.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_BACKTRACE_H
diff --git a/src/common/compat.c b/src/common/compat.c
index 8574bd04c9..5575316b2b 100644
--- a/src/common/compat.c
+++ b/src/common/compat.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -27,7 +27,6 @@
#include "compat.h"
#ifdef _WIN32
-#include <process.h>
#include <windows.h>
#include <sys/locking.h>
#endif
@@ -823,6 +822,7 @@ replace_file(const char *from, const char *to)
case FN_NOENT:
break;
case FN_FILE:
+ case FN_EMPTY:
if (unlink(to)) return -1;
break;
case FN_ERROR:
@@ -2197,9 +2197,20 @@ get_environment(void)
#endif
}
-/** Set *addr to the IP address (in dotted-quad notation) stored in c.
- * Return 1 on success, 0 if c is badly formatted. (Like inet_aton(c,addr),
- * but works on Windows and Solaris.)
+/** Get name of current host and write it to <b>name</b> array, whose
+ * length is specified by <b>namelen</b> argument. Return 0 upon
+ * successfull completion; otherwise return return -1. (Currently,
+ * this function is merely a mockable wrapper for POSIX gethostname().)
+ */
+MOCK_IMPL(int,
+tor_gethostname,(char *name, size_t namelen))
+{
+ return gethostname(name,namelen);
+}
+
+/** Set *addr to the IP address (in dotted-quad notation) stored in *str.
+ * Return 1 on success, 0 if *str is badly formatted.
+ * (Like inet_aton(str,addr), but works on Windows and Solaris.)
*/
int
tor_inet_aton(const char *str, struct in_addr* addr)
@@ -2419,8 +2430,9 @@ tor_inet_pton(int af, const char *src, void *dst)
* (This function exists because standard windows gethostbyname
* doesn't treat raw IP addresses properly.)
*/
-int
-tor_lookup_hostname(const char *name, uint32_t *addr)
+
+MOCK_IMPL(int,
+tor_lookup_hostname,(const char *name, uint32_t *addr))
{
tor_addr_t myaddr;
int ret;
@@ -2531,109 +2543,6 @@ get_uname(void)
* Process control
*/
-#if defined(USE_PTHREADS)
-/** Wraps a void (*)(void*) function and its argument so we can
- * invoke them in a way pthreads would expect.
- */
-typedef struct tor_pthread_data_t {
- void (*func)(void *);
- void *data;
-} tor_pthread_data_t;
-/** Given a tor_pthread_data_t <b>_data</b>, call _data-&gt;func(d-&gt;data)
- * and free _data. Used to make sure we can call functions the way pthread
- * expects. */
-static void *
-tor_pthread_helper_fn(void *_data)
-{
- tor_pthread_data_t *data = _data;
- void (*func)(void*);
- void *arg;
- /* mask signals to worker threads to avoid SIGPIPE, etc */
- sigset_t sigs;
- /* We're in a subthread; don't handle any signals here. */
- sigfillset(&sigs);
- pthread_sigmask(SIG_SETMASK, &sigs, NULL);
-
- func = data->func;
- arg = data->data;
- tor_free(_data);
- func(arg);
- return NULL;
-}
-/**
- * A pthread attribute to make threads start detached.
- */
-static pthread_attr_t attr_detached;
-/** True iff we've called tor_threads_init() */
-static int threads_initialized = 0;
-#endif
-
-/** Minimalist interface to run a void function in the background. On
- * Unix calls fork, on win32 calls beginthread. Returns -1 on failure.
- * func should not return, but rather should call spawn_exit.
- *
- * NOTE: if <b>data</b> is used, it should not be allocated on the stack,
- * since in a multithreaded environment, there is no way to be sure that
- * the caller's stack will still be around when the called function is
- * running.
- */
-int
-spawn_func(void (*func)(void *), void *data)
-{
-#if defined(USE_WIN32_THREADS)
- int rv;
- rv = (int)_beginthread(func, 0, data);
- if (rv == (int)-1)
- return -1;
- return 0;
-#elif defined(USE_PTHREADS)
- pthread_t thread;
- tor_pthread_data_t *d;
- if (PREDICT_UNLIKELY(!threads_initialized))
- tor_threads_init();
- d = tor_malloc(sizeof(tor_pthread_data_t));
- d->data = data;
- d->func = func;
- if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d))
- return -1;
- return 0;
-#else
- pid_t pid;
- pid = fork();
- if (pid<0)
- return -1;
- if (pid==0) {
- /* Child */
- func(data);
- tor_assert(0); /* Should never reach here. */
- return 0; /* suppress "control-reaches-end-of-non-void" warning. */
- } else {
- /* Parent */
- return 0;
- }
-#endif
-}
-
-/** End the current thread/process.
- */
-void
-spawn_exit(void)
-{
-#if defined(USE_WIN32_THREADS)
- _endthread();
- //we should never get here. my compiler thinks that _endthread returns, this
- //is an attempt to fool it.
- tor_assert(0);
- _exit(0);
-#elif defined(USE_PTHREADS)
- pthread_exit(NULL);
-#else
- /* http://www.erlenstar.demon.co.uk/unix/faq_2.html says we should
- * call _exit, not exit, from child processes. */
- _exit(0);
-#endif
-}
-
/** Implementation logic for compute_num_cpus(). */
static int
compute_num_cpus_impl(void)
@@ -2922,280 +2831,6 @@ tor_gmtime_r(const time_t *timep, struct tm *result)
}
#endif
-#if defined(USE_WIN32_THREADS)
-void
-tor_mutex_init(tor_mutex_t *m)
-{
- InitializeCriticalSection(&m->mutex);
-}
-void
-tor_mutex_uninit(tor_mutex_t *m)
-{
- DeleteCriticalSection(&m->mutex);
-}
-void
-tor_mutex_acquire(tor_mutex_t *m)
-{
- tor_assert(m);
- EnterCriticalSection(&m->mutex);
-}
-void
-tor_mutex_release(tor_mutex_t *m)
-{
- LeaveCriticalSection(&m->mutex);
-}
-unsigned long
-tor_get_thread_id(void)
-{
- return (unsigned long)GetCurrentThreadId();
-}
-#elif defined(USE_PTHREADS)
-/** A mutex attribute that we're going to use to tell pthreads that we want
- * "reentrant" mutexes (i.e., once we can re-lock if we're already holding
- * them.) */
-static pthread_mutexattr_t attr_reentrant;
-/** Initialize <b>mutex</b> so it can be locked. Every mutex must be set
- * up with tor_mutex_init() or tor_mutex_new(); not both. */
-void
-tor_mutex_init(tor_mutex_t *mutex)
-{
- int err;
- if (PREDICT_UNLIKELY(!threads_initialized))
- tor_threads_init();
- err = pthread_mutex_init(&mutex->mutex, &attr_reentrant);
- if (PREDICT_UNLIKELY(err)) {
- log_err(LD_GENERAL, "Error %d creating a mutex.", err);
- tor_fragile_assert();
- }
-}
-/** Wait until <b>m</b> is free, then acquire it. */
-void
-tor_mutex_acquire(tor_mutex_t *m)
-{
- int err;
- tor_assert(m);
- err = pthread_mutex_lock(&m->mutex);
- if (PREDICT_UNLIKELY(err)) {
- log_err(LD_GENERAL, "Error %d locking a mutex.", err);
- tor_fragile_assert();
- }
-}
-/** Release the lock <b>m</b> so another thread can have it. */
-void
-tor_mutex_release(tor_mutex_t *m)
-{
- int err;
- tor_assert(m);
- err = pthread_mutex_unlock(&m->mutex);
- if (PREDICT_UNLIKELY(err)) {
- log_err(LD_GENERAL, "Error %d unlocking a mutex.", err);
- tor_fragile_assert();
- }
-}
-/** Clean up the mutex <b>m</b> so that it no longer uses any system
- * resources. Does not free <b>m</b>. This function must only be called on
- * mutexes from tor_mutex_init(). */
-void
-tor_mutex_uninit(tor_mutex_t *m)
-{
- int err;
- tor_assert(m);
- err = pthread_mutex_destroy(&m->mutex);
- if (PREDICT_UNLIKELY(err)) {
- log_err(LD_GENERAL, "Error %d destroying a mutex.", err);
- tor_fragile_assert();
- }
-}
-/** Return an integer representing this thread. */
-unsigned long
-tor_get_thread_id(void)
-{
- union {
- pthread_t thr;
- unsigned long id;
- } r;
- r.thr = pthread_self();
- return r.id;
-}
-#endif
-
-/** Return a newly allocated, ready-for-use mutex. */
-tor_mutex_t *
-tor_mutex_new(void)
-{
- tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t));
- tor_mutex_init(m);
- return m;
-}
-/** Release all storage and system resources held by <b>m</b>. */
-void
-tor_mutex_free(tor_mutex_t *m)
-{
- if (!m)
- return;
- tor_mutex_uninit(m);
- tor_free(m);
-}
-
-/* Conditions. */
-#ifdef USE_PTHREADS
-#if 0
-/** Cross-platform condition implementation. */
-struct tor_cond_t {
- pthread_cond_t cond;
-};
-/** Return a newly allocated condition, with nobody waiting on it. */
-tor_cond_t *
-tor_cond_new(void)
-{
- tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t));
- if (pthread_cond_init(&cond->cond, NULL)) {
- tor_free(cond);
- return NULL;
- }
- return cond;
-}
-/** Release all resources held by <b>cond</b>. */
-void
-tor_cond_free(tor_cond_t *cond)
-{
- if (!cond)
- return;
- if (pthread_cond_destroy(&cond->cond)) {
- log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno));
- return;
- }
- tor_free(cond);
-}
-/** Wait until one of the tor_cond_signal functions is called on <b>cond</b>.
- * All waiters on the condition must wait holding the same <b>mutex</b>.
- * Returns 0 on success, negative on failure. */
-int
-tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex)
-{
- return pthread_cond_wait(&cond->cond, &mutex->mutex) ? -1 : 0;
-}
-/** Wake up one of the waiters on <b>cond</b>. */
-void
-tor_cond_signal_one(tor_cond_t *cond)
-{
- pthread_cond_signal(&cond->cond);
-}
-/** Wake up all of the waiters on <b>cond</b>. */
-void
-tor_cond_signal_all(tor_cond_t *cond)
-{
- pthread_cond_broadcast(&cond->cond);
-}
-#endif
-/** Set up common structures for use by threading. */
-void
-tor_threads_init(void)
-{
- if (!threads_initialized) {
- pthread_mutexattr_init(&attr_reentrant);
- pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE);
- tor_assert(0==pthread_attr_init(&attr_detached));
- tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1));
- threads_initialized = 1;
- set_main_thread();
- }
-}
-#elif defined(USE_WIN32_THREADS)
-#if 0
-static DWORD cond_event_tls_index;
-struct tor_cond_t {
- CRITICAL_SECTION mutex;
- smartlist_t *events;
-};
-tor_cond_t *
-tor_cond_new(void)
-{
- tor_cond_t *cond = tor_malloc_zero(sizeof(tor_cond_t));
- InitializeCriticalSection(&cond->mutex);
- cond->events = smartlist_new();
- return cond;
-}
-void
-tor_cond_free(tor_cond_t *cond)
-{
- if (!cond)
- return;
- DeleteCriticalSection(&cond->mutex);
- /* XXXX notify? */
- smartlist_free(cond->events);
- tor_free(cond);
-}
-int
-tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex)
-{
- HANDLE event;
- int r;
- tor_assert(cond);
- tor_assert(mutex);
- event = TlsGetValue(cond_event_tls_index);
- if (!event) {
- event = CreateEvent(0, FALSE, FALSE, NULL);
- TlsSetValue(cond_event_tls_index, event);
- }
- EnterCriticalSection(&cond->mutex);
-
- tor_assert(WaitForSingleObject(event, 0) == WAIT_TIMEOUT);
- tor_assert(!smartlist_contains(cond->events, event));
- smartlist_add(cond->events, event);
-
- LeaveCriticalSection(&cond->mutex);
-
- tor_mutex_release(mutex);
- r = WaitForSingleObject(event, INFINITE);
- tor_mutex_acquire(mutex);
-
- switch (r) {
- case WAIT_OBJECT_0: /* we got the mutex normally. */
- break;
- case WAIT_ABANDONED: /* holding thread exited. */
- case WAIT_TIMEOUT: /* Should never happen. */
- tor_assert(0);
- break;
- case WAIT_FAILED:
- log_warn(LD_GENERAL, "Failed to acquire mutex: %d",(int) GetLastError());
- }
- return 0;
-}
-void
-tor_cond_signal_one(tor_cond_t *cond)
-{
- HANDLE event;
- tor_assert(cond);
-
- EnterCriticalSection(&cond->mutex);
-
- if ((event = smartlist_pop_last(cond->events)))
- SetEvent(event);
-
- LeaveCriticalSection(&cond->mutex);
-}
-void
-tor_cond_signal_all(tor_cond_t *cond)
-{
- tor_assert(cond);
-
- EnterCriticalSection(&cond->mutex);
- SMARTLIST_FOREACH(cond->events, HANDLE, event, SetEvent(event));
- smartlist_clear(cond->events);
- LeaveCriticalSection(&cond->mutex);
-}
-#endif
-void
-tor_threads_init(void)
-{
-#if 0
- cond_event_tls_index = TlsAlloc();
-#endif
- set_main_thread();
-}
-#endif
-
#if defined(HAVE_MLOCKALL) && HAVE_DECL_MLOCKALL && defined(RLIMIT_MEMLOCK)
/** Attempt to raise the current and max rlimit to infinity for our process.
* This only needs to be done once and can probably only be done when we have
@@ -3279,23 +2914,6 @@ tor_mlockall(void)
#endif
}
-/** Identity of the "main" thread */
-static unsigned long main_thread_id = -1;
-
-/** Start considering the current thread to be the 'main thread'. This has
- * no effect on anything besides in_main_thread(). */
-void
-set_main_thread(void)
-{
- main_thread_id = tor_get_thread_id();
-}
-/** Return true iff called from the main thread. */
-int
-in_main_thread(void)
-{
- return main_thread_id == tor_get_thread_id();
-}
-
/**
* On Windows, WSAEWOULDBLOCK is not always correct: when you see it,
* you need to ask the socket for its actual errno. Also, you need to
diff --git a/src/common/compat.h b/src/common/compat.h
index f2eef5b6e7..23f8614196 100644
--- a/src/common/compat.h
+++ b/src/common/compat.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_H
@@ -36,9 +36,6 @@
#ifdef HAVE_STRING_H
#include <string.h>
#endif
-#if defined(HAVE_PTHREAD_H) && !defined(_WIN32)
-#include <pthread.h>
-#endif
#include <stdarg.h>
#ifdef HAVE_SYS_RESOURCE_H
#include <sys/resource.h>
@@ -203,6 +200,15 @@ extern INLINE double U64_TO_DBL(uint64_t x) {
#define STMT_END } while (0)
#endif
+/* Some tools (like coccinelle) don't like to see operators as macro
+ * arguments. */
+#define OP_LT <
+#define OP_GT >
+#define OP_GE >=
+#define OP_LE <=
+#define OP_EQ ==
+#define OP_NE !=
+
/* ===== String compatibility */
#ifdef _WIN32
/* Windows names string functions differently from most other platforms. */
@@ -523,10 +529,11 @@ struct sockaddr_in6 {
};
#endif
+MOCK_DECL(int,tor_gethostname,(char *name, size_t namelen));
int tor_inet_aton(const char *cp, struct in_addr *addr) ATTR_NONNULL((1,2));
const char *tor_inet_ntop(int af, const void *src, char *dst, size_t len);
int tor_inet_pton(int af, const char *src, void *dst);
-int tor_lookup_hostname(const char *name, uint32_t *addr) ATTR_NONNULL((1,2));
+MOCK_DECL(int,tor_lookup_hostname,(const char *name, uint32_t *addr));
int set_socket_nonblocking(tor_socket_t socket);
int tor_socketpair(int family, int type, int protocol, tor_socket_t fd[2]);
int network_init(void);
@@ -632,61 +639,10 @@ char **get_environment(void);
int get_total_system_memory(size_t *mem_out);
-int spawn_func(void (*func)(void *), void *data);
-void spawn_exit(void) ATTR_NORETURN;
-
-#if defined(_WIN32)
-#define USE_WIN32_THREADS
-#elif defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_CREATE)
-#define USE_PTHREADS
-#else
-#error "No threading system was found"
-#endif
-
int compute_num_cpus(void);
-/* Because we use threads instead of processes on most platforms (Windows,
- * Linux, etc), we need locking for them. On platforms with poor thread
- * support or broken gethostbyname_r, these functions are no-ops. */
-
-/** A generic lock structure for multithreaded builds. */
-typedef struct tor_mutex_t {
-#if defined(USE_WIN32_THREADS)
- /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */
- CRITICAL_SECTION mutex;
-#elif defined(USE_PTHREADS)
- /** Pthreads-only: with pthreads, we implement locks with
- * pthread_mutex_t. */
- pthread_mutex_t mutex;
-#else
- /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */
- int _unused;
-#endif
-} tor_mutex_t;
-
int tor_mlockall(void);
-tor_mutex_t *tor_mutex_new(void);
-void tor_mutex_init(tor_mutex_t *m);
-void tor_mutex_acquire(tor_mutex_t *m);
-void tor_mutex_release(tor_mutex_t *m);
-void tor_mutex_free(tor_mutex_t *m);
-void tor_mutex_uninit(tor_mutex_t *m);
-unsigned long tor_get_thread_id(void);
-void tor_threads_init(void);
-
-void set_main_thread(void);
-int in_main_thread(void);
-
-#if 0
-typedef struct tor_cond_t tor_cond_t;
-tor_cond_t *tor_cond_new(void);
-void tor_cond_free(tor_cond_t *cond);
-int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex);
-void tor_cond_signal_one(tor_cond_t *cond);
-void tor_cond_signal_all(tor_cond_t *cond);
-#endif
-
/** Macros for MIN/MAX. Never use these when the arguments could have
* side-effects.
* {With GCC extensions we could probably define a safer MIN/MAX. But
@@ -732,5 +688,8 @@ STATIC int tor_ersatz_socketpair(int family, int type, int protocol,
#endif
#endif
+/* This needs some of the declarations above so we include it here. */
+#include "compat_threads.h"
+
#endif
diff --git a/src/common/compat_libevent.c b/src/common/compat_libevent.c
index 33672f07d8..15308dd4cb 100644
--- a/src/common/compat_libevent.c
+++ b/src/common/compat_libevent.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2014, The Tor Project, Inc. */
+/* Copyright (c) 2009-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -146,13 +146,25 @@ tor_evsignal_new(struct event_base * base, int sig,
{
return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg);
}
-/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */
+/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems,
+ * except tolerate tor_event_free(NULL). */
void
tor_event_free(struct event *ev)
{
+ if (ev == NULL)
+ return;
event_del(ev);
tor_free(ev);
}
+#else
+/* Wrapper for event_free() that tolerates tor_event_free(NULL) */
+void
+tor_event_free(struct event *ev)
+{
+ if (ev == NULL)
+ return;
+ event_free(ev);
+}
#endif
/** Global event base for use by the main thread. */
@@ -283,8 +295,8 @@ tor_libevent_initialize(tor_libevent_cfg *torcfg)
}
/** Return the current Libevent event base that we're set up to use. */
-struct event_base *
-tor_libevent_get_base(void)
+MOCK_IMPL(struct event_base *,
+tor_libevent_get_base, (void))
{
return the_event_base;
}
@@ -717,7 +729,7 @@ tor_gettimeofday_cached_monotonic(struct timeval *tv)
struct timeval last_tv = { 0, 0 };
tor_gettimeofday_cached(tv);
- if (timercmp(tv, &last_tv, <)) {
+ if (timercmp(tv, &last_tv, OP_LT)) {
memcpy(tv, &last_tv, sizeof(struct timeval));
} else {
memcpy(&last_tv, tv, sizeof(struct timeval));
diff --git a/src/common/compat_libevent.h b/src/common/compat_libevent.h
index c5c78b822d..6bbfae0056 100644
--- a/src/common/compat_libevent.h
+++ b/src/common/compat_libevent.h
@@ -1,10 +1,11 @@
-/* Copyright (c) 2009-2014, The Tor Project, Inc. */
+/* Copyright (c) 2009-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_COMPAT_LIBEVENT_H
#define TOR_COMPAT_LIBEVENT_H
#include "orconfig.h"
+#include "testsupport.h"
struct event;
struct event_base;
@@ -28,11 +29,9 @@ void suppress_libevent_log_msg(const char *msg);
#define tor_event_new event_new
#define tor_evtimer_new evtimer_new
#define tor_evsignal_new evsignal_new
-#define tor_event_free event_free
#define tor_evdns_add_server_port(sock, tcp, cb, data) \
evdns_add_server_port_with_base(tor_libevent_get_base(), \
(sock),(tcp),(cb),(data));
-
#else
struct event *tor_event_new(struct event_base * base, evutil_socket_t sock,
short what, void (*cb)(evutil_socket_t, short, void *), void *arg);
@@ -40,10 +39,11 @@ struct event *tor_evtimer_new(struct event_base * base,
void (*cb)(evutil_socket_t, short, void *), void *arg);
struct event *tor_evsignal_new(struct event_base * base, int sig,
void (*cb)(evutil_socket_t, short, void *), void *arg);
-void tor_event_free(struct event *ev);
#define tor_evdns_add_server_port evdns_add_server_port
#endif
+void tor_event_free(struct event *ev);
+
typedef struct periodic_timer_t periodic_timer_t;
periodic_timer_t *periodic_timer_new(struct event_base *base,
@@ -72,7 +72,7 @@ typedef struct tor_libevent_cfg {
} tor_libevent_cfg;
void tor_libevent_initialize(tor_libevent_cfg *cfg);
-struct event_base *tor_libevent_get_base(void);
+MOCK_DECL(struct event_base *, tor_libevent_get_base, (void));
const char *tor_libevent_get_method(void);
void tor_check_libevent_version(const char *m, int server,
const char **badness_out);
diff --git a/src/common/compat_pthreads.c b/src/common/compat_pthreads.c
new file mode 100644
index 0000000000..f4a6cad154
--- /dev/null
+++ b/src/common/compat_pthreads.c
@@ -0,0 +1,287 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define _GNU_SOURCE
+
+#include "orconfig.h"
+#include <pthread.h>
+#include <signal.h>
+#include <time.h>
+
+#include "compat.h"
+#include "torlog.h"
+#include "util.h"
+
+/** Wraps a void (*)(void*) function and its argument so we can
+ * invoke them in a way pthreads would expect.
+ */
+typedef struct tor_pthread_data_t {
+ void (*func)(void *);
+ void *data;
+} tor_pthread_data_t;
+/** Given a tor_pthread_data_t <b>_data</b>, call _data-&gt;func(d-&gt;data)
+ * and free _data. Used to make sure we can call functions the way pthread
+ * expects. */
+static void *
+tor_pthread_helper_fn(void *_data)
+{
+ tor_pthread_data_t *data = _data;
+ void (*func)(void*);
+ void *arg;
+ /* mask signals to worker threads to avoid SIGPIPE, etc */
+ sigset_t sigs;
+ /* We're in a subthread; don't handle any signals here. */
+ sigfillset(&sigs);
+ pthread_sigmask(SIG_SETMASK, &sigs, NULL);
+
+ func = data->func;
+ arg = data->data;
+ tor_free(_data);
+ func(arg);
+ return NULL;
+}
+/**
+ * A pthread attribute to make threads start detached.
+ */
+static pthread_attr_t attr_detached;
+/** True iff we've called tor_threads_init() */
+static int threads_initialized = 0;
+
+/** Minimalist interface to run a void function in the background. On
+ * Unix calls fork, on win32 calls beginthread. Returns -1 on failure.
+ * func should not return, but rather should call spawn_exit.
+ *
+ * NOTE: if <b>data</b> is used, it should not be allocated on the stack,
+ * since in a multithreaded environment, there is no way to be sure that
+ * the caller's stack will still be around when the called function is
+ * running.
+ */
+int
+spawn_func(void (*func)(void *), void *data)
+{
+ pthread_t thread;
+ tor_pthread_data_t *d;
+ if (PREDICT_UNLIKELY(!threads_initialized))
+ tor_threads_init();
+ d = tor_malloc(sizeof(tor_pthread_data_t));
+ d->data = data;
+ d->func = func;
+ if (pthread_create(&thread,&attr_detached,tor_pthread_helper_fn,d))
+ return -1;
+ return 0;
+}
+
+/** End the current thread/process.
+ */
+void
+spawn_exit(void)
+{
+ pthread_exit(NULL);
+}
+
+/** A mutex attribute that we're going to use to tell pthreads that we want
+ * "recursive" mutexes (i.e., once we can re-lock if we're already holding
+ * them.) */
+static pthread_mutexattr_t attr_recursive;
+
+/** Initialize <b>mutex</b> so it can be locked. Every mutex must be set
+ * up with tor_mutex_init() or tor_mutex_new(); not both. */
+void
+tor_mutex_init(tor_mutex_t *mutex)
+{
+ int err;
+ if (PREDICT_UNLIKELY(!threads_initialized))
+ tor_threads_init();
+ err = pthread_mutex_init(&mutex->mutex, &attr_recursive);
+ if (PREDICT_UNLIKELY(err)) {
+ log_err(LD_GENERAL, "Error %d creating a mutex.", err);
+ tor_fragile_assert();
+ }
+}
+
+/** As tor_mutex_init, but initialize a mutex suitable that may be
+ * non-recursive, if the OS supports that. */
+void
+tor_mutex_init_nonrecursive(tor_mutex_t *mutex)
+{
+ int err;
+ if (PREDICT_UNLIKELY(!threads_initialized))
+ tor_threads_init();
+ err = pthread_mutex_init(&mutex->mutex, NULL);
+ if (PREDICT_UNLIKELY(err)) {
+ log_err(LD_GENERAL, "Error %d creating a mutex.", err);
+ tor_fragile_assert();
+ }
+}
+
+/** Wait until <b>m</b> is free, then acquire it. */
+void
+tor_mutex_acquire(tor_mutex_t *m)
+{
+ int err;
+ tor_assert(m);
+ err = pthread_mutex_lock(&m->mutex);
+ if (PREDICT_UNLIKELY(err)) {
+ log_err(LD_GENERAL, "Error %d locking a mutex.", err);
+ tor_fragile_assert();
+ }
+}
+/** Release the lock <b>m</b> so another thread can have it. */
+void
+tor_mutex_release(tor_mutex_t *m)
+{
+ int err;
+ tor_assert(m);
+ err = pthread_mutex_unlock(&m->mutex);
+ if (PREDICT_UNLIKELY(err)) {
+ log_err(LD_GENERAL, "Error %d unlocking a mutex.", err);
+ tor_fragile_assert();
+ }
+}
+/** Clean up the mutex <b>m</b> so that it no longer uses any system
+ * resources. Does not free <b>m</b>. This function must only be called on
+ * mutexes from tor_mutex_init(). */
+void
+tor_mutex_uninit(tor_mutex_t *m)
+{
+ int err;
+ tor_assert(m);
+ err = pthread_mutex_destroy(&m->mutex);
+ if (PREDICT_UNLIKELY(err)) {
+ log_err(LD_GENERAL, "Error %d destroying a mutex.", err);
+ tor_fragile_assert();
+ }
+}
+/** Return an integer representing this thread. */
+unsigned long
+tor_get_thread_id(void)
+{
+ union {
+ pthread_t thr;
+ unsigned long id;
+ } r;
+ r.thr = pthread_self();
+ return r.id;
+}
+
+/* Conditions. */
+
+/** Initialize an already-allocated condition variable. */
+int
+tor_cond_init(tor_cond_t *cond)
+{
+ pthread_condattr_t condattr;
+
+ memset(cond, 0, sizeof(tor_cond_t));
+ /* Default condition attribute. Might be used if clock monotonic is
+ * available else this won't affect anything. */
+ if (pthread_condattr_init(&condattr)) {
+ return -1;
+ }
+
+#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
+ /* Use monotonic time so when we timedwait() on it, any clock adjustment
+ * won't affect the timeout value. */
+ if (pthread_condattr_setclock(&condattr, CLOCK_MONOTONIC)) {
+ return -1;
+ }
+#endif
+ if (pthread_cond_init(&cond->cond, &condattr)) {
+ return -1;
+ }
+ return 0;
+}
+
+/** Release all resources held by <b>cond</b>, but do not free <b>cond</b>
+ * itself. */
+void
+tor_cond_uninit(tor_cond_t *cond)
+{
+ if (pthread_cond_destroy(&cond->cond)) {
+ log_warn(LD_GENERAL,"Error freeing condition: %s", strerror(errno));
+ return;
+ }
+}
+/** Wait until one of the tor_cond_signal functions is called on <b>cond</b>.
+ * (If <b>tv</b> is set, and that amount of time passes with no signal to
+ * <b>cond</b>, return anyway. All waiters on the condition must wait holding
+ * the same <b>mutex</b>. All signallers should hold that mutex. The mutex
+ * needs to have been allocated with tor_mutex_init_for_cond().
+ *
+ * Returns 0 on success, -1 on failure, 1 on timeout. */
+int
+tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex, const struct timeval *tv)
+{
+ int r;
+ if (tv == NULL) {
+ while (1) {
+ r = pthread_cond_wait(&cond->cond, &mutex->mutex);
+ if (r == EINTR) {
+ /* EINTR should be impossible according to POSIX, but POSIX, like the
+ * Pirate's Code, is apparently treated "more like what you'd call
+ * guidelines than actual rules." */
+ continue;
+ }
+ return r ? -1 : 0;
+ }
+ } else {
+ struct timeval tvnow, tvsum;
+ struct timespec ts;
+ while (1) {
+#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_MONOTONIC)
+ if (clock_gettime(CLOCK_MONOTONIC, &ts) < 0) {
+ return -1;
+ }
+ tvnow.tv_sec = ts.tv_sec;
+ tvnow.tv_usec = ts.tv_nsec / 1000;
+ timeradd(tv, &tvnow, &tvsum);
+#else
+ if (gettimeofday(&tvnow, NULL) < 0)
+ return -1;
+ timeradd(tv, &tvnow, &tvsum);
+#endif /* HAVE_CLOCK_GETTIME, CLOCK_MONOTONIC */
+
+ ts.tv_sec = tvsum.tv_sec;
+ ts.tv_nsec = tvsum.tv_usec * 1000;
+
+ r = pthread_cond_timedwait(&cond->cond, &mutex->mutex, &ts);
+ if (r == 0)
+ return 0;
+ else if (r == ETIMEDOUT)
+ return 1;
+ else if (r == EINTR)
+ continue;
+ else
+ return -1;
+ }
+ }
+}
+/** Wake up one of the waiters on <b>cond</b>. */
+void
+tor_cond_signal_one(tor_cond_t *cond)
+{
+ pthread_cond_signal(&cond->cond);
+}
+/** Wake up all of the waiters on <b>cond</b>. */
+void
+tor_cond_signal_all(tor_cond_t *cond)
+{
+ pthread_cond_broadcast(&cond->cond);
+}
+
+/** Set up common structures for use by threading. */
+void
+tor_threads_init(void)
+{
+ if (!threads_initialized) {
+ pthread_mutexattr_init(&attr_recursive);
+ pthread_mutexattr_settype(&attr_recursive, PTHREAD_MUTEX_RECURSIVE);
+ tor_assert(0==pthread_attr_init(&attr_detached));
+ tor_assert(0==pthread_attr_setdetachstate(&attr_detached, 1));
+ threads_initialized = 1;
+ set_main_thread();
+ }
+}
+
diff --git a/src/common/compat_threads.c b/src/common/compat_threads.c
new file mode 100644
index 0000000000..d2d929e430
--- /dev/null
+++ b/src/common/compat_threads.c
@@ -0,0 +1,302 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define _GNU_SOURCE
+
+#include "orconfig.h"
+#include <stdlib.h>
+#include "compat.h"
+#include "compat_threads.h"
+
+#include "util.h"
+#include "torlog.h"
+
+#ifdef HAVE_SYS_EVENTFD_H
+#include <sys/eventfd.h>
+#endif
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+#ifdef HAVE_UNISTD_H
+#include <unistd.h>
+#endif
+
+/** Return a newly allocated, ready-for-use mutex. */
+tor_mutex_t *
+tor_mutex_new(void)
+{
+ tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t));
+ tor_mutex_init(m);
+ return m;
+}
+/** Return a newly allocated, ready-for-use mutex. This one might be
+ * non-recursive, if that's faster. */
+tor_mutex_t *
+tor_mutex_new_nonrecursive(void)
+{
+ tor_mutex_t *m = tor_malloc_zero(sizeof(tor_mutex_t));
+ tor_mutex_init_nonrecursive(m);
+ return m;
+}
+/** Release all storage and system resources held by <b>m</b>. */
+void
+tor_mutex_free(tor_mutex_t *m)
+{
+ if (!m)
+ return;
+ tor_mutex_uninit(m);
+ tor_free(m);
+}
+
+/** Allocate and return a new condition variable. */
+tor_cond_t *
+tor_cond_new(void)
+{
+ tor_cond_t *cond = tor_malloc(sizeof(tor_cond_t));
+ if (tor_cond_init(cond)<0)
+ tor_free(cond);
+ return cond;
+}
+
+/** Free all storage held in <b>c</b>. */
+void
+tor_cond_free(tor_cond_t *c)
+{
+ if (!c)
+ return;
+ tor_cond_uninit(c);
+ tor_free(c);
+}
+
+/** Identity of the "main" thread */
+static unsigned long main_thread_id = -1;
+
+/** Start considering the current thread to be the 'main thread'. This has
+ * no effect on anything besides in_main_thread(). */
+void
+set_main_thread(void)
+{
+ main_thread_id = tor_get_thread_id();
+}
+/** Return true iff called from the main thread. */
+int
+in_main_thread(void)
+{
+ return main_thread_id == tor_get_thread_id();
+}
+
+#if defined(HAVE_EVENTFD) || defined(HAVE_PIPE)
+/* non-interruptable versions */
+static int
+write_ni(int fd, const void *buf, size_t n)
+{
+ int r;
+ again:
+ r = (int) write(fd, buf, n);
+ if (r < 0 && errno == EINTR)
+ goto again;
+ return r;
+}
+static int
+read_ni(int fd, void *buf, size_t n)
+{
+ int r;
+ again:
+ r = (int) read(fd, buf, n);
+ if (r < 0 && errno == EINTR)
+ goto again;
+ return r;
+}
+#endif
+
+/* non-interruptable versions */
+static int
+send_ni(int fd, const void *buf, size_t n, int flags)
+{
+ int r;
+ again:
+ r = (int) send(fd, buf, n, flags);
+ if (r < 0 && errno == EINTR)
+ goto again;
+ return r;
+}
+
+static int
+recv_ni(int fd, void *buf, size_t n, int flags)
+{
+ int r;
+ again:
+ r = (int) recv(fd, buf, n, flags);
+ if (r < 0 && errno == EINTR)
+ goto again;
+ return r;
+}
+
+#ifdef HAVE_EVENTFD
+static int
+eventfd_alert(int fd)
+{
+ uint64_t u = 1;
+ int r = write_ni(fd, (void*)&u, sizeof(u));
+ if (r < 0 && errno != EAGAIN)
+ return -1;
+ return 0;
+}
+
+static int
+eventfd_drain(int fd)
+{
+ uint64_t u = 0;
+ int r = read_ni(fd, (void*)&u, sizeof(u));
+ if (r < 0 && errno != EAGAIN)
+ return -1;
+ return 0;
+}
+#endif
+
+#ifdef HAVE_PIPE
+static int
+pipe_alert(int fd)
+{
+ ssize_t r = write_ni(fd, "x", 1);
+ if (r < 0 && errno != EAGAIN)
+ return -1;
+ return 0;
+}
+
+static int
+pipe_drain(int fd)
+{
+ char buf[32];
+ ssize_t r;
+ while ((r = read_ni(fd, buf, sizeof(buf))) >= 0)
+ ;
+ if (r == 0 || errno != EAGAIN)
+ return -1;
+ return 0;
+}
+#endif
+
+static int
+sock_alert(tor_socket_t fd)
+{
+ ssize_t r = send_ni(fd, "x", 1, 0);
+ if (r < 0 && !ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
+ return -1;
+ return 0;
+}
+
+static int
+sock_drain(tor_socket_t fd)
+{
+ char buf[32];
+ ssize_t r;
+ while ((r = recv_ni(fd, buf, sizeof(buf), 0)) >= 0)
+ ;
+ if (r == 0 || !ERRNO_IS_EAGAIN(tor_socket_errno(fd)))
+ return -1;
+ return 0;
+}
+
+/** Allocate a new set of alert sockets, and set the appropriate function
+ * pointers, in <b>socks_out</b>. */
+int
+alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags)
+{
+ tor_socket_t socks[2] = { TOR_INVALID_SOCKET, TOR_INVALID_SOCKET };
+
+#ifdef HAVE_EVENTFD
+ /* First, we try the Linux eventfd() syscall. This gives a 64-bit counter
+ * associated with a single file descriptor. */
+#if defined(EFD_CLOEXEC) && defined(EFD_NONBLOCK)
+ if (!(flags & ASOCKS_NOEVENTFD2))
+ socks[0] = eventfd(0, EFD_CLOEXEC|EFD_NONBLOCK);
+#endif
+ if (socks[0] < 0 && !(flags & ASOCKS_NOEVENTFD)) {
+ socks[0] = eventfd(0,0);
+ if (socks[0] >= 0) {
+ if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 ||
+ set_socket_nonblocking(socks[0]) < 0) {
+ close(socks[0]);
+ return -1;
+ }
+ }
+ }
+ if (socks[0] >= 0) {
+ socks_out->read_fd = socks_out->write_fd = socks[0];
+ socks_out->alert_fn = eventfd_alert;
+ socks_out->drain_fn = eventfd_drain;
+ return 0;
+ }
+#endif
+
+#ifdef HAVE_PIPE2
+ /* Now we're going to try pipes. First type the pipe2() syscall, if we
+ * have it, so we can save some calls... */
+ if (!(flags & ASOCKS_NOPIPE2) &&
+ pipe2(socks, O_NONBLOCK|O_CLOEXEC) == 0) {
+ socks_out->read_fd = socks[0];
+ socks_out->write_fd = socks[1];
+ socks_out->alert_fn = pipe_alert;
+ socks_out->drain_fn = pipe_drain;
+ return 0;
+ }
+#endif
+
+#ifdef HAVE_PIPE
+ /* Now try the regular pipe() syscall. Pipes have a bit lower overhead than
+ * socketpairs, fwict. */
+ if (!(flags & ASOCKS_NOPIPE) &&
+ pipe(socks) == 0) {
+ if (fcntl(socks[0], F_SETFD, FD_CLOEXEC) < 0 ||
+ fcntl(socks[1], F_SETFD, FD_CLOEXEC) < 0 ||
+ set_socket_nonblocking(socks[0]) < 0 ||
+ set_socket_nonblocking(socks[1]) < 0) {
+ close(socks[0]);
+ close(socks[1]);
+ return -1;
+ }
+ socks_out->read_fd = socks[0];
+ socks_out->write_fd = socks[1];
+ socks_out->alert_fn = pipe_alert;
+ socks_out->drain_fn = pipe_drain;
+ return 0;
+ }
+#endif
+
+ /* If nothing else worked, fall back on socketpair(). */
+ if (!(flags & ASOCKS_NOSOCKETPAIR) &&
+ tor_socketpair(AF_UNIX, SOCK_STREAM, 0, socks) == 0) {
+ if (set_socket_nonblocking(socks[0]) < 0 ||
+ set_socket_nonblocking(socks[1])) {
+ tor_close_socket(socks[0]);
+ tor_close_socket(socks[1]);
+ return -1;
+ }
+ socks_out->read_fd = socks[0];
+ socks_out->write_fd = socks[1];
+ socks_out->alert_fn = sock_alert;
+ socks_out->drain_fn = sock_drain;
+ return 0;
+ }
+ return -1;
+}
+
+/** Close the sockets in <b>socks</b>. */
+void
+alert_sockets_close(alert_sockets_t *socks)
+{
+ if (socks->alert_fn == sock_alert) {
+ /* they are sockets. */
+ tor_close_socket(socks->read_fd);
+ tor_close_socket(socks->write_fd);
+ } else {
+ close(socks->read_fd);
+ if (socks->write_fd != socks->read_fd)
+ close(socks->write_fd);
+ }
+ socks->read_fd = socks->write_fd = -1;
+}
+
diff --git a/src/common/compat_threads.h b/src/common/compat_threads.h
new file mode 100644
index 0000000000..acf3083f37
--- /dev/null
+++ b/src/common/compat_threads.h
@@ -0,0 +1,115 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_COMPAT_THREADS_H
+#define TOR_COMPAT_THREADS_H
+
+#include "orconfig.h"
+#include "torint.h"
+#include "testsupport.h"
+
+#if defined(HAVE_PTHREAD_H) && !defined(_WIN32)
+#include <pthread.h>
+#endif
+
+#if defined(_WIN32)
+#define USE_WIN32_THREADS
+#elif defined(HAVE_PTHREAD_H) && defined(HAVE_PTHREAD_CREATE)
+#define USE_PTHREADS
+#else
+#error "No threading system was found"
+#endif
+
+int spawn_func(void (*func)(void *), void *data);
+void spawn_exit(void) ATTR_NORETURN;
+
+/* Because we use threads instead of processes on most platforms (Windows,
+ * Linux, etc), we need locking for them. On platforms with poor thread
+ * support or broken gethostbyname_r, these functions are no-ops. */
+
+/** A generic lock structure for multithreaded builds. */
+typedef struct tor_mutex_t {
+#if defined(USE_WIN32_THREADS)
+ /** Windows-only: on windows, we implement locks with CRITICAL_SECTIONS. */
+ CRITICAL_SECTION mutex;
+#elif defined(USE_PTHREADS)
+ /** Pthreads-only: with pthreads, we implement locks with
+ * pthread_mutex_t. */
+ pthread_mutex_t mutex;
+#else
+ /** No-threads only: Dummy variable so that tor_mutex_t takes up space. */
+ int _unused;
+#endif
+} tor_mutex_t;
+
+tor_mutex_t *tor_mutex_new(void);
+tor_mutex_t *tor_mutex_new_nonrecursive(void);
+void tor_mutex_init(tor_mutex_t *m);
+void tor_mutex_init_nonrecursive(tor_mutex_t *m);
+void tor_mutex_acquire(tor_mutex_t *m);
+void tor_mutex_release(tor_mutex_t *m);
+void tor_mutex_free(tor_mutex_t *m);
+void tor_mutex_uninit(tor_mutex_t *m);
+unsigned long tor_get_thread_id(void);
+void tor_threads_init(void);
+
+/** Conditions need nonrecursive mutexes with pthreads. */
+#define tor_mutex_init_for_cond(m) tor_mutex_init_nonrecursive(m)
+
+void set_main_thread(void);
+int in_main_thread(void);
+
+typedef struct tor_cond_t {
+#ifdef USE_PTHREADS
+ pthread_cond_t cond;
+#elif defined(USE_WIN32_THREADS)
+ HANDLE event;
+
+ CRITICAL_SECTION lock;
+ int n_waiting;
+ int n_to_wake;
+ int generation;
+#else
+#error no known condition implementation.
+#endif
+} tor_cond_t;
+
+tor_cond_t *tor_cond_new(void);
+void tor_cond_free(tor_cond_t *cond);
+int tor_cond_init(tor_cond_t *cond);
+void tor_cond_uninit(tor_cond_t *cond);
+int tor_cond_wait(tor_cond_t *cond, tor_mutex_t *mutex,
+ const struct timeval *tv);
+void tor_cond_signal_one(tor_cond_t *cond);
+void tor_cond_signal_all(tor_cond_t *cond);
+
+/** Helper type used to manage waking up the main thread while it's in
+ * the libevent main loop. Used by the work queue code. */
+typedef struct alert_sockets_s {
+ /* XXXX This structure needs a better name. */
+ /** Socket that the main thread should listen for EV_READ events on.
+ * Note that this socket may be a regular fd on a non-Windows platform.
+ */
+ tor_socket_t read_fd;
+ /** Socket to use when alerting the main thread. */
+ tor_socket_t write_fd;
+ /** Function to alert the main thread */
+ int (*alert_fn)(tor_socket_t write_fd);
+ /** Function to make the main thread no longer alerted. */
+ int (*drain_fn)(tor_socket_t read_fd);
+} alert_sockets_t;
+
+/* Flags to disable one or more alert_sockets backends. */
+#define ASOCKS_NOEVENTFD2 (1u<<0)
+#define ASOCKS_NOEVENTFD (1u<<1)
+#define ASOCKS_NOPIPE2 (1u<<2)
+#define ASOCKS_NOPIPE (1u<<3)
+#define ASOCKS_NOSOCKETPAIR (1u<<4)
+
+int alert_sockets_create(alert_sockets_t *socks_out, uint32_t flags);
+void alert_sockets_close(alert_sockets_t *socks);
+
+#endif
+
diff --git a/src/common/compat_winthreads.c b/src/common/compat_winthreads.c
new file mode 100644
index 0000000000..71b994c4e4
--- /dev/null
+++ b/src/common/compat_winthreads.c
@@ -0,0 +1,196 @@
+/* Copyright (c) 2003-2004, Roger Dingledine
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "compat.h"
+#include <windows.h>
+#include <process.h>
+#include "util.h"
+#include "container.h"
+#include "torlog.h"
+#include <process.h>
+
+/* This value is more or less total cargo-cult */
+#define SPIN_COUNT 2000
+
+/** Minimalist interface to run a void function in the background. On
+ * Unix calls fork, on win32 calls beginthread. Returns -1 on failure.
+ * func should not return, but rather should call spawn_exit.
+ *
+ * NOTE: if <b>data</b> is used, it should not be allocated on the stack,
+ * since in a multithreaded environment, there is no way to be sure that
+ * the caller's stack will still be around when the called function is
+ * running.
+ */
+int
+spawn_func(void (*func)(void *), void *data)
+{
+ int rv;
+ rv = (int)_beginthread(func, 0, data);
+ if (rv == (int)-1)
+ return -1;
+ return 0;
+}
+
+/** End the current thread/process.
+ */
+void
+spawn_exit(void)
+{
+ _endthread();
+ //we should never get here. my compiler thinks that _endthread returns, this
+ //is an attempt to fool it.
+ tor_assert(0);
+ _exit(0);
+}
+
+void
+tor_mutex_init(tor_mutex_t *m)
+{
+ InitializeCriticalSection(&m->mutex);
+}
+void
+tor_mutex_init_nonrecursive(tor_mutex_t *m)
+{
+ InitializeCriticalSection(&m->mutex);
+}
+
+void
+tor_mutex_uninit(tor_mutex_t *m)
+{
+ DeleteCriticalSection(&m->mutex);
+}
+void
+tor_mutex_acquire(tor_mutex_t *m)
+{
+ tor_assert(m);
+ EnterCriticalSection(&m->mutex);
+}
+void
+tor_mutex_release(tor_mutex_t *m)
+{
+ LeaveCriticalSection(&m->mutex);
+}
+unsigned long
+tor_get_thread_id(void)
+{
+ return (unsigned long)GetCurrentThreadId();
+}
+
+int
+tor_cond_init(tor_cond_t *cond)
+{
+ memset(cond, 0, sizeof(tor_cond_t));
+ if (InitializeCriticalSectionAndSpinCount(&cond->lock, SPIN_COUNT)==0) {
+ return -1;
+ }
+ if ((cond->event = CreateEvent(NULL,TRUE,FALSE,NULL)) == NULL) {
+ DeleteCriticalSection(&cond->lock);
+ return -1;
+ }
+ cond->n_waiting = cond->n_to_wake = cond->generation = 0;
+ return 0;
+}
+void
+tor_cond_uninit(tor_cond_t *cond)
+{
+ DeleteCriticalSection(&cond->lock);
+ CloseHandle(cond->event);
+}
+
+static void
+tor_cond_signal_impl(tor_cond_t *cond, int broadcast)
+{
+ EnterCriticalSection(&cond->lock);
+ if (broadcast)
+ cond->n_to_wake = cond->n_waiting;
+ else
+ ++cond->n_to_wake;
+ cond->generation++;
+ SetEvent(cond->event);
+ LeaveCriticalSection(&cond->lock);
+}
+void
+tor_cond_signal_one(tor_cond_t *cond)
+{
+ tor_cond_signal_impl(cond, 0);
+}
+void
+tor_cond_signal_all(tor_cond_t *cond)
+{
+ tor_cond_signal_impl(cond, 1);
+}
+
+int
+tor_cond_wait(tor_cond_t *cond, tor_mutex_t *lock_, const struct timeval *tv)
+{
+ CRITICAL_SECTION *lock = &lock_->mutex;
+ int generation_at_start;
+ int waiting = 1;
+ int result = -1;
+ DWORD ms = INFINITE, ms_orig = INFINITE, startTime, endTime;
+ if (tv)
+ ms_orig = ms = tv->tv_sec*1000 + (tv->tv_usec+999)/1000;
+
+ EnterCriticalSection(&cond->lock);
+ ++cond->n_waiting;
+ generation_at_start = cond->generation;
+ LeaveCriticalSection(&cond->lock);
+
+ LeaveCriticalSection(lock);
+
+ startTime = GetTickCount();
+ do {
+ DWORD res;
+ res = WaitForSingleObject(cond->event, ms);
+ EnterCriticalSection(&cond->lock);
+ if (cond->n_to_wake &&
+ cond->generation != generation_at_start) {
+ --cond->n_to_wake;
+ --cond->n_waiting;
+ result = 0;
+ waiting = 0;
+ goto out;
+ } else if (res != WAIT_OBJECT_0) {
+ result = (res==WAIT_TIMEOUT) ? 1 : -1;
+ --cond->n_waiting;
+ waiting = 0;
+ goto out;
+ } else if (ms != INFINITE) {
+ endTime = GetTickCount();
+ if (startTime + ms_orig <= endTime) {
+ result = 1; /* Timeout */
+ --cond->n_waiting;
+ waiting = 0;
+ goto out;
+ } else {
+ ms = startTime + ms_orig - endTime;
+ }
+ }
+ /* If we make it here, we are still waiting. */
+ if (cond->n_to_wake == 0) {
+ /* There is nobody else who should wake up; reset
+ * the event. */
+ ResetEvent(cond->event);
+ }
+ out:
+ LeaveCriticalSection(&cond->lock);
+ } while (waiting);
+
+ EnterCriticalSection(lock);
+
+ EnterCriticalSection(&cond->lock);
+ if (!cond->n_waiting)
+ ResetEvent(cond->event);
+ LeaveCriticalSection(&cond->lock);
+
+ return result;
+}
+
+void
+tor_threads_init(void)
+{
+ set_main_thread();
+}
+
diff --git a/src/common/container.c b/src/common/container.c
index ab4e22de52..37e28004ae 100644
--- a/src/common/container.c
+++ b/src/common/container.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/container.h b/src/common/container.h
index d3d20af5b2..377cdf5dba 100644
--- a/src/common/container.h
+++ b/src/common/container.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CONTAINER_H
diff --git a/src/common/crypto.c b/src/common/crypto.c
index 90a16fab1a..370c04a315 100644
--- a/src/common/crypto.c
+++ b/src/common/crypto.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1012,7 +1012,7 @@ crypto_pk_public_checksig(crypto_pk_t *env, char *to,
env->key, RSA_PKCS1_PADDING);
if (r<0) {
- crypto_log_errors(LOG_WARN, "checking RSA signature");
+ crypto_log_errors(LOG_INFO, "checking RSA signature");
return -1;
}
return r;
@@ -1293,7 +1293,7 @@ crypto_pk_asn1_decode(const char *str, size_t len)
* Return 0 on success, -1 on failure.
*/
int
-crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out)
+crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out)
{
unsigned char *buf = NULL;
int len;
@@ -2752,6 +2752,8 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
if (destlen > SIZE_T_CEILING)
return -1;
+ memset(dest, 0, destlen);
+
EVP_DecodeInit(&ctx);
EVP_DecodeUpdate(&ctx, (unsigned char*)dest, &len,
(unsigned char*)src, srclen);
@@ -2773,6 +2775,8 @@ base64_decode(char *dest, size_t destlen, const char *src, size_t srclen)
if (destlen > SIZE_T_CEILING)
return -1;
+ memset(dest, 0, destlen);
+
/* Iterate over all the bytes in src. Each one will add 0 or 6 bits to the
* value we're decoding. Accumulate bits in <b>n</b>, and whenever we have
* 24 bits, batch them into 3 bytes and flush those bytes to dest.
@@ -2952,6 +2956,8 @@ base32_decode(char *dest, size_t destlen, const char *src, size_t srclen)
tor_assert((nbits/8) <= destlen); /* We need enough space. */
tor_assert(destlen < SIZE_T_CEILING);
+ memset(dest, 0, destlen);
+
/* Convert base32 encoded chars to the 5-bit values that they represent. */
tmp = tor_malloc_zero(srclen);
for (j = 0; j < srclen; ++j) {
diff --git a/src/common/crypto.h b/src/common/crypto.h
index d496521849..d305bc17a0 100644
--- a/src/common/crypto.h
+++ b/src/common/crypto.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -180,7 +180,7 @@ int crypto_pk_private_hybrid_decrypt(crypto_pk_t *env, char *to,
int crypto_pk_asn1_encode(crypto_pk_t *pk, char *dest, size_t dest_len);
crypto_pk_t *crypto_pk_asn1_decode(const char *str, size_t len);
-int crypto_pk_get_digest(crypto_pk_t *pk, char *digest_out);
+int crypto_pk_get_digest(const crypto_pk_t *pk, char *digest_out);
int crypto_pk_get_all_digests(crypto_pk_t *pk, digests_t *digests_out);
int crypto_pk_get_fingerprint(crypto_pk_t *pk, char *fp_out,int add_space);
int crypto_pk_get_hashed_fingerprint(crypto_pk_t *pk, char *fp_out);
diff --git a/src/common/crypto_curve25519.c b/src/common/crypto_curve25519.c
index c04b715abd..5bb14b0d95 100644
--- a/src/common/crypto_curve25519.c
+++ b/src/common/crypto_curve25519.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Wrapper code for a curve25519 implementation. */
diff --git a/src/common/crypto_curve25519.h b/src/common/crypto_curve25519.h
index e8f885227e..48e8a6d962 100644
--- a/src/common/crypto_curve25519.h
+++ b/src/common/crypto_curve25519.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_CURVE25519_H
diff --git a/src/common/crypto_ed25519.c b/src/common/crypto_ed25519.c
index 340fb4956f..f2e6945ac8 100644
--- a/src/common/crypto_ed25519.c
+++ b/src/common/crypto_ed25519.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Wrapper code for an ed25519 implementation. */
diff --git a/src/common/crypto_ed25519.h b/src/common/crypto_ed25519.h
index 8c3663e0dd..7efa74bff5 100644
--- a/src/common/crypto_ed25519.h
+++ b/src/common/crypto_ed25519.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_ED25519_H
diff --git a/src/common/crypto_format.c b/src/common/crypto_format.c
index 63dd391914..00e0e9ea85 100644
--- a/src/common/crypto_format.c
+++ b/src/common/crypto_format.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Formatting and parsing code for crypto-related data structures. */
diff --git a/src/common/crypto_s2k.c b/src/common/crypto_s2k.c
index 6d9ee497ab..99f3b2ebbc 100644
--- a/src/common/crypto_s2k.c
+++ b/src/common/crypto_s2k.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CRYPTO_S2K_PRIVATE
diff --git a/src/common/crypto_s2k.h b/src/common/crypto_s2k.h
index a33dc96e46..66df24c3c4 100644
--- a/src/common/crypto_s2k.h
+++ b/src/common/crypto_s2k.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CRYPTO_S2K_H_INCLUDED
diff --git a/src/common/di_ops.c b/src/common/di_ops.c
index 0dcd6924e7..c9d1350880 100644
--- a/src/common/di_ops.c
+++ b/src/common/di_ops.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/di_ops.h b/src/common/di_ops.h
index 935f93fc1a..bbb1caa00c 100644
--- a/src/common/di_ops.h
+++ b/src/common/di_ops.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/include.am b/src/common/include.am
index 6441596199..14838ab555 100644
--- a/src/common/include.am
+++ b/src/common/include.am
@@ -54,10 +54,18 @@ endif
LIBDONNA += $(LIBED25519_REF10)
+if THREADS_PTHREADS
+threads_impl_source=src/common/compat_pthreads.c
+endif
+if THREADS_WIN32
+threads_impl_source=src/common/compat_winthreads.c
+endif
+
LIBOR_A_SOURCES = \
src/common/address.c \
src/common/backtrace.c \
src/common/compat.c \
+ src/common/compat_threads.c \
src/common/container.c \
src/common/di_ops.c \
src/common/log.c \
@@ -66,10 +74,12 @@ LIBOR_A_SOURCES = \
src/common/util_codedigest.c \
src/common/util_process.c \
src/common/sandbox.c \
+ src/common/workqueue.c \
src/ext/csiphash.c \
src/ext/trunnel/trunnel.c \
$(libor_extra_source) \
- $(libor_mempool_source)
+ $(libor_mempool_source) \
+ $(threads_impl_source)
LIBOR_CRYPTO_A_SOURCES = \
src/common/aes.c \
@@ -102,7 +112,6 @@ src_common_libor_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
src_common_libor_crypto_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
src_common_libor_event_testing_a_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
-
COMMONHEADERS = \
src/common/address.h \
src/common/backtrace.h \
@@ -110,6 +119,7 @@ COMMONHEADERS = \
src/common/ciphers.inc \
src/common/compat.h \
src/common/compat_libevent.h \
+ src/common/compat_threads.h \
src/common/container.h \
src/common/crypto.h \
src/common/crypto_curve25519.h \
@@ -128,6 +138,7 @@ COMMONHEADERS = \
src/common/tortls.h \
src/common/util.h \
src/common/util_process.h \
+ src/common/workqueue.h \
$(libor_mempool_header)
noinst_HEADERS+= $(COMMONHEADERS)
diff --git a/src/common/log.c b/src/common/log.c
index ad0da7da6b..2e7c711413 100644
--- a/src/common/log.c
+++ b/src/common/log.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -451,7 +451,7 @@ MOCK_IMPL(STATIC void,
logv,(int severity, log_domain_mask_t domain, const char *funcname,
const char *suffix, const char *format, va_list ap))
{
- char buf[10024];
+ char buf[10240];
size_t msg_len = 0;
int formatted = 0;
logfile_t *lf;
diff --git a/src/common/memarea.c b/src/common/memarea.c
index 40c09bd0e6..6841ba54e7 100644
--- a/src/common/memarea.c
+++ b/src/common/memarea.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2014, The Tor Project, Inc. */
+/* Copyright (c) 2008-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/** \file memarea.c
diff --git a/src/common/memarea.h b/src/common/memarea.h
index fb261d11fa..d14f3a2bae 100644
--- a/src/common/memarea.h
+++ b/src/common/memarea.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2014, The Tor Project, Inc. */
+/* Copyright (c) 2008-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Tor dependencies */
diff --git a/src/common/mempool.c b/src/common/mempool.c
index 695a110d3d..55a34070d7 100644
--- a/src/common/mempool.c
+++ b/src/common/mempool.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#if 1
/* Tor dependencies */
diff --git a/src/common/mempool.h b/src/common/mempool.h
index 1e7a3121de..5cbeb8f482 100644
--- a/src/common/mempool.h
+++ b/src/common/mempool.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/procmon.c b/src/common/procmon.c
index ee27e97f79..2d0f021724 100644
--- a/src/common/procmon.c
+++ b/src/common/procmon.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/procmon.h b/src/common/procmon.h
index 6c487648bb..ccee6bfac6 100644
--- a/src/common/procmon.h
+++ b/src/common/procmon.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/sandbox.c b/src/common/sandbox.c
index ece56df81f..450b04a6f7 100644
--- a/src/common/sandbox.c
+++ b/src/common/sandbox.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -58,6 +58,16 @@
#include <time.h>
#include <poll.h>
+#ifdef HAVE_LINUX_NETFILTER_IPV4_H
+#include <linux/netfilter_ipv4.h>
+#endif
+#ifdef HAVE_LINUX_IF_H
+#include <linux/if.h>
+#endif
+#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H
+#include <linux/netfilter_ipv6/ip6_tables.h>
+#endif
+
#if defined(HAVE_EXECINFO_H) && defined(HAVE_BACKTRACE) && \
defined(HAVE_BACKTRACE_SYMBOLS_FD) && defined(HAVE_SIGACTION)
#define USE_BACKTRACE
@@ -634,6 +644,22 @@ sb_getsockopt(scmp_filter_ctx ctx, sandbox_cfg_t *filter)
if (rc)
return rc;
+#ifdef HAVE_LINUX_NETFILTER_IPV4_H
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_IP),
+ SCMP_CMP(2, SCMP_CMP_EQ, SO_ORIGINAL_DST));
+ if (rc)
+ return rc;
+#endif
+
+#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H
+ rc = seccomp_rule_add_2(ctx, SCMP_ACT_ALLOW, SCMP_SYS(getsockopt),
+ SCMP_CMP(1, SCMP_CMP_EQ, SOL_IPV6),
+ SCMP_CMP(2, SCMP_CMP_EQ, IP6T_SO_ORIGINAL_DST));
+ if (rc)
+ return rc;
+#endif
+
return 0;
}
@@ -1309,6 +1335,13 @@ sandbox_disable_getaddrinfo_cache(void)
sandbox_getaddrinfo_cache_disabled = 1;
}
+void
+sandbox_freeaddrinfo(struct addrinfo *ai)
+{
+ if (sandbox_getaddrinfo_cache_disabled)
+ freeaddrinfo(ai);
+}
+
int
sandbox_getaddrinfo(const char *name, const char *servname,
const struct addrinfo *hints,
diff --git a/src/common/sandbox.h b/src/common/sandbox.h
index ad001865a7..36d25d6516 100644
--- a/src/common/sandbox.h
+++ b/src/common/sandbox.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -115,7 +115,7 @@ struct addrinfo;
int sandbox_getaddrinfo(const char *name, const char *servname,
const struct addrinfo *hints,
struct addrinfo **res);
-#define sandbox_freeaddrinfo(addrinfo) ((void)0)
+void sandbox_freeaddrinfo(struct addrinfo *addrinfo);
void sandbox_free_getaddrinfo_cache(void);
#else
#define sandbox_getaddrinfo(name, servname, hints, res) \
diff --git a/src/common/testsupport.h b/src/common/testsupport.h
index 2610086700..db7700aeb0 100644
--- a/src/common/testsupport.h
+++ b/src/common/testsupport.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TESTSUPPORT_H
@@ -20,8 +20,8 @@
*
* and implement it as:
*
- * MOCK_IMPL(void
- * writebuf,(size_t n, char *buf)
+ * MOCK_IMPL(void,
+ * writebuf,(size_t n, char *buf))
* {
* ...
* }
diff --git a/src/common/torgzip.c b/src/common/torgzip.c
index 4480e4b747..4f23407e23 100644
--- a/src/common/torgzip.c
+++ b/src/common/torgzip.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -92,10 +92,27 @@ tor_zlib_get_header_version_str(void)
/** Return the 'bits' value to tell zlib to use <b>method</b>.*/
static INLINE int
-method_bits(compress_method_t method)
+method_bits(compress_method_t method, zlib_compression_level_t level)
{
/* Bits+16 means "use gzip" in zlib >= 1.2 */
- return method == GZIP_METHOD ? 15+16 : 15;
+ const int flag = method == GZIP_METHOD ? 16 : 0;
+ switch (level) {
+ default:
+ case HIGH_COMPRESSION: return flag + 15;
+ case MEDIUM_COMPRESSION: return flag + 13;
+ case LOW_COMPRESSION: return flag + 11;
+ }
+}
+
+static INLINE int
+get_memlevel(zlib_compression_level_t level)
+{
+ switch (level) {
+ default:
+ case HIGH_COMPRESSION: return 8;
+ case MEDIUM_COMPRESSION: return 7;
+ case LOW_COMPRESSION: return 6;
+ }
}
/** @{ */
@@ -162,8 +179,9 @@ tor_gzip_compress(char **out, size_t *out_len,
stream->avail_in = (unsigned int)in_len;
if (deflateInit2(stream, Z_BEST_COMPRESSION, Z_DEFLATED,
- method_bits(method),
- 8, Z_DEFAULT_STRATEGY) != Z_OK) {
+ method_bits(method, HIGH_COMPRESSION),
+ get_memlevel(HIGH_COMPRESSION),
+ Z_DEFAULT_STRATEGY) != Z_OK) {
log_warn(LD_GENERAL, "Error from deflateInit2: %s",
stream->msg?stream->msg:"<no message>");
goto err;
@@ -289,7 +307,7 @@ tor_gzip_uncompress(char **out, size_t *out_len,
stream->avail_in = (unsigned int)in_len;
if (inflateInit2(stream,
- method_bits(method)) != Z_OK) {
+ method_bits(method, HIGH_COMPRESSION)) != Z_OK) {
log_warn(LD_GENERAL, "Error from inflateInit2: %s",
stream->msg?stream->msg:"<no message>");
goto err;
@@ -315,7 +333,8 @@ tor_gzip_uncompress(char **out, size_t *out_len,
log_warn(LD_BUG, "Error freeing gzip structures");
goto err;
}
- if (inflateInit2(stream, method_bits(method)) != Z_OK) {
+ if (inflateInit2(stream,
+ method_bits(method,HIGH_COMPRESSION)) != Z_OK) {
log_warn(LD_GENERAL, "Error from second inflateInit2: %s",
stream->msg?stream->msg:"<no message>");
goto err;
@@ -426,10 +445,11 @@ struct tor_zlib_state_t {
* <b>compress</b>, it's for compression; otherwise it's for
* decompression. */
tor_zlib_state_t *
-tor_zlib_new(int compress, compress_method_t method)
+tor_zlib_new(int compress, compress_method_t method,
+ zlib_compression_level_t compression_level)
{
tor_zlib_state_t *out;
- int bits;
+ int bits, memlevel;
if (method == GZIP_METHOD && !is_gzip_supported()) {
/* Old zlib version don't support gzip in inflateInit2 */
@@ -437,21 +457,29 @@ tor_zlib_new(int compress, compress_method_t method)
return NULL;
}
+ if (! compress) {
+ /* use this setting for decompression, since we might have the
+ * max number of window bits */
+ compression_level = HIGH_COMPRESSION;
+ }
+
out = tor_malloc_zero(sizeof(tor_zlib_state_t));
out->stream.zalloc = Z_NULL;
out->stream.zfree = Z_NULL;
out->stream.opaque = NULL;
out->compress = compress;
- bits = method_bits(method);
+ bits = method_bits(method, compression_level);
+ memlevel = get_memlevel(compression_level);
if (compress) {
if (deflateInit2(&out->stream, Z_BEST_COMPRESSION, Z_DEFLATED,
- bits, 8, Z_DEFAULT_STRATEGY) != Z_OK)
+ bits, memlevel,
+ Z_DEFAULT_STRATEGY) != Z_OK)
goto err;
} else {
if (inflateInit2(&out->stream, bits) != Z_OK)
goto err;
}
- out->allocation = tor_zlib_state_size_precalc(!compress, bits, 8);
+ out->allocation = tor_zlib_state_size_precalc(!compress, bits, memlevel);
total_zlib_allocation += out->allocation;
diff --git a/src/common/torgzip.h b/src/common/torgzip.h
index 1378d55b76..0fc2deb6c4 100644
--- a/src/common/torgzip.h
+++ b/src/common/torgzip.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -19,6 +19,15 @@ typedef enum {
NO_METHOD=0, GZIP_METHOD=1, ZLIB_METHOD=2, UNKNOWN_METHOD=3
} compress_method_t;
+/**
+ * Enumeration to define tradeoffs between memory usage and compression level.
+ * HIGH_COMPRESSION saves the most bandwidth; LOW_COMPRESSION saves the most
+ * memory.
+ **/
+typedef enum {
+ HIGH_COMPRESSION, MEDIUM_COMPRESSION, LOW_COMPRESSION
+} zlib_compression_level_t;
+
int
tor_gzip_compress(char **out, size_t *out_len,
const char *in, size_t in_len,
@@ -47,7 +56,8 @@ typedef enum {
} tor_zlib_output_t;
/** Internal state for an incremental zlib compression/decompression. */
typedef struct tor_zlib_state_t tor_zlib_state_t;
-tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method);
+tor_zlib_state_t *tor_zlib_new(int compress, compress_method_t method,
+ zlib_compression_level_t level);
tor_zlib_output_t tor_zlib_process(tor_zlib_state_t *state,
char **out, size_t *out_len,
diff --git a/src/common/torint.h b/src/common/torint.h
index d0b0ac14a0..6171700898 100644
--- a/src/common/torint.h
+++ b/src/common/torint.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -191,6 +191,10 @@ typedef unsigned __int64 uint64_t;
#endif
#endif
+#ifndef INT64_MIN
+#define INT64_MIN ((- INT64_MAX) - 1)
+#endif
+
#ifndef SIZE_MAX
#if SIZEOF_SIZE_T == 8
#define SIZE_MAX UINT64_MAX
diff --git a/src/common/torlog.h b/src/common/torlog.h
index fa7266c199..8923a9e213 100644
--- a/src/common/torlog.h
+++ b/src/common/torlog.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001, Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -97,8 +97,10 @@
#define LD_HEARTBEAT (1u<<20)
/** Abstract channel_t code */
#define LD_CHANNEL (1u<<21)
+/** Scheduler */
+#define LD_SCHED (1u<<22)
/** Number of logging domains in the code. */
-#define N_LOGGING_DOMAINS 22
+#define N_LOGGING_DOMAINS 23
/** This log message is not safe to send to a callback-based logger
* immediately. Used as a flag, not a log domain. */
diff --git a/src/common/tortls.c b/src/common/tortls.c
index cca2d420b6..ca629135a6 100644
--- a/src/common/tortls.c
+++ b/src/common/tortls.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -29,6 +29,20 @@
#include <ws2tcpip.h>
#endif
#endif
+
+#ifdef __GNUC__
+#define GCC_VERSION (__GNUC__ * 100 + __GNUC_MINOR__)
+#endif
+
+#if __GNUC__ && GCC_VERSION >= 402
+#if GCC_VERSION >= 406
+#pragma GCC diagnostic push
+#endif
+/* Some versions of OpenSSL declare SSL_get_selected_srtp_profile twice in
+ * srtp.h. Suppress the GCC warning so we can build with -Wredundant-decl. */
+#pragma GCC diagnostic ignored "-Wredundant-decls"
+#endif
+
#include <openssl/ssl.h>
#include <openssl/ssl3.h>
#include <openssl/err.h>
@@ -37,6 +51,14 @@
#include <openssl/bio.h>
#include <openssl/opensslv.h>
+#if __GNUC__ && GCC_VERSION >= 402
+#if GCC_VERSION >= 406
+#pragma GCC diagnostic pop
+#else
+#pragma GCC diagnostic warning "-Wredundant-decls"
+#endif
+#endif
+
#ifdef USE_BUFFEREVENTS
#include <event2/bufferevent_ssl.h>
#include <event2/buffer.h>
diff --git a/src/common/tortls.h b/src/common/tortls.h
index 235d801202..f8c6d5913b 100644
--- a/src/common/tortls.h
+++ b/src/common/tortls.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TORTLS_H
diff --git a/src/common/util.c b/src/common/util.c
index 50097dac93..442d57a2cf 100644
--- a/src/common/util.c
+++ b/src/common/util.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -513,6 +513,61 @@ round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor)
return number;
}
+/** Return the lowest x in [INT64_MIN, INT64_MAX] such that x is at least
+ * <b>number</b>, and x modulo <b>divisor</b> == 0. */
+int64_t
+round_int64_to_next_multiple_of(int64_t number, int64_t divisor)
+{
+ tor_assert(divisor > 0);
+ if (number >= 0 && INT64_MAX - divisor + 1 >= number)
+ number += divisor - 1;
+ number -= number % divisor;
+ return number;
+}
+
+/** Transform a random value <b>p</b> from the uniform distribution in
+ * [0.0, 1.0[ into a Laplace distributed value with location parameter
+ * <b>mu</b> and scale parameter <b>b</b>. Truncate the final result
+ * to be an integer in [INT64_MIN, INT64_MAX]. */
+int64_t
+sample_laplace_distribution(double mu, double b, double p)
+{
+ double result;
+
+ tor_assert(p >= 0.0 && p < 1.0);
+ /* This is the "inverse cumulative distribution function" from:
+ * http://en.wikipedia.org/wiki/Laplace_distribution */
+ result = mu - b * (p > 0.5 ? 1.0 : -1.0)
+ * tor_mathlog(1.0 - 2.0 * fabs(p - 0.5));
+
+ if (result >= INT64_MAX)
+ return INT64_MAX;
+ else if (result <= INT64_MIN)
+ return INT64_MIN;
+ else
+ return (int64_t) result;
+}
+
+/** Add random noise between INT64_MIN and INT64_MAX coming from a
+ * Laplace distribution with mu = 0 and b = <b>delta_f</b>/<b>epsilon</b>
+ * to <b>signal</b> based on the provided <b>random</b> value in
+ * [0.0, 1.0[. */
+int64_t
+add_laplace_noise(int64_t signal, double random, double delta_f,
+ double epsilon)
+{
+ int64_t noise = sample_laplace_distribution(
+ 0.0, /* just add noise, no further signal */
+ delta_f / epsilon, random);
+
+ if (noise > 0 && INT64_MAX - noise < signal)
+ return INT64_MAX;
+ else if (noise < 0 && INT64_MIN - noise > signal)
+ return INT64_MIN;
+ else
+ return signal + noise;
+}
+
/** Return the number of bits set in <b>v</b>. */
int
n_bits_set_u8(uint8_t v)
@@ -1223,6 +1278,9 @@ base16_decode(char *dest, size_t destlen, const char *src, size_t srclen)
return -1;
if (destlen < srclen/2 || destlen > SIZE_T_CEILING)
return -1;
+
+ memset(dest, 0, destlen);
+
end = src+srclen;
while (src<end) {
v1 = hex_decode_digit_(*src);
@@ -1323,6 +1381,20 @@ esc_for_log(const char *s)
return result;
}
+/** Similar to esc_for_log. Allocate and return a new string representing
+ * the first n characters in <b>chars</b>, surround by quotes and using
+ * standard C escapes. If a NUL character is encountered in <b>chars</b>,
+ * the resulting string will be terminated there.
+ */
+char *
+esc_for_log_len(const char *chars, size_t n)
+{
+ char *string = tor_strndup(chars, n);
+ char *string_escaped = esc_for_log(string);
+ tor_free(string);
+ return string_escaped;
+}
+
/** Allocate and return a new string representing the contents of <b>s</b>,
* surrounded by quotes and using standard C escapes.
*
@@ -1656,15 +1728,18 @@ format_iso_time_nospace_usec(char *buf, const struct timeval *tv)
/** Given an ISO-formatted UTC time value (after the epoch) in <b>cp</b>,
* parse it and store its value in *<b>t</b>. Return 0 on success, -1 on
- * failure. Ignore extraneous stuff in <b>cp</b> separated by whitespace from
- * the end of the time string. */
+ * failure. Ignore extraneous stuff in <b>cp</b> after the end of the time
+ * string, unless <b>strict</b> is set. */
int
-parse_iso_time(const char *cp, time_t *t)
+parse_iso_time_(const char *cp, time_t *t, int strict)
{
struct tm st_tm;
unsigned int year=0, month=0, day=0, hour=0, minute=0, second=0;
- if (tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u", &year, &month,
- &day, &hour, &minute, &second) < 6) {
+ int n_fields;
+ char extra_char;
+ n_fields = tor_sscanf(cp, "%u-%2u-%2u %2u:%2u:%2u%c", &year, &month,
+ &day, &hour, &minute, &second, &extra_char);
+ if (strict ? (n_fields != 6) : (n_fields < 6)) {
char *esc = esc_for_log(cp);
log_warn(LD_GENERAL, "ISO time %s was unparseable", esc);
tor_free(esc);
@@ -1693,6 +1768,16 @@ parse_iso_time(const char *cp, time_t *t)
return tor_timegm(&st_tm, t);
}
+/** Given an ISO-formatted UTC time value (after the epoch) in <b>cp</b>,
+ * parse it and store its value in *<b>t</b>. Return 0 on success, -1 on
+ * failure. Reject the string if any characters are present after the time.
+ */
+int
+parse_iso_time(const char *cp, time_t *t)
+{
+ return parse_iso_time_(cp, t, 1);
+}
+
/** Given a <b>date</b> in one of the three formats allowed by HTTP (ugh),
* parse it into <b>tm</b>. Return 0 on success, negative on failure. */
int
@@ -1957,15 +2042,24 @@ clean_name_for_stat(char *name)
#endif
}
-/** Return FN_ERROR if filename can't be read, FN_NOENT if it doesn't
- * exist, FN_FILE if it is a regular file, or FN_DIR if it's a
- * directory. On FN_ERROR, sets errno. */
+/** Return:
+ * FN_ERROR if filename can't be read, is NULL, or is zero-length,
+ * FN_NOENT if it doesn't exist,
+ * FN_FILE if it is a non-empty regular file, or a FIFO on unix-like systems,
+ * FN_EMPTY for zero-byte regular files,
+ * FN_DIR if it's a directory, and
+ * FN_ERROR for any other file type.
+ * On FN_ERROR and FN_NOENT, sets errno. (errno is not set when FN_ERROR
+ * is returned due to an unhandled file type.) */
file_status_t
file_status(const char *fname)
{
struct stat st;
char *f;
int r;
+ if (!fname || strlen(fname) == 0) {
+ return FN_ERROR;
+ }
f = tor_strdup(fname);
clean_name_for_stat(f);
log_debug(LD_FS, "stat()ing %s", f);
@@ -1977,16 +2071,23 @@ file_status(const char *fname)
}
return FN_ERROR;
}
- if (st.st_mode & S_IFDIR)
+ if (st.st_mode & S_IFDIR) {
return FN_DIR;
- else if (st.st_mode & S_IFREG)
- return FN_FILE;
+ } else if (st.st_mode & S_IFREG) {
+ if (st.st_size > 0) {
+ return FN_FILE;
+ } else if (st.st_size == 0) {
+ return FN_EMPTY;
+ } else {
+ return FN_ERROR;
+ }
#ifndef _WIN32
- else if (st.st_mode & S_IFIFO)
+ } else if (st.st_mode & S_IFIFO) {
return FN_FILE;
#endif
- else
+ } else {
return FN_ERROR;
+ }
}
/** Check whether <b>dirname</b> exists and is private. If yes return 0. If
@@ -2905,7 +3006,7 @@ expand_filename(const char *filename)
tor_free(username);
rest = slash ? (slash+1) : "";
#else
- log_warn(LD_CONFIG, "Couldn't expend homedir on system without pwd.h");
+ log_warn(LD_CONFIG, "Couldn't expand homedir on system without pwd.h");
return tor_strdup(filename);
#endif
}
diff --git a/src/common/util.h b/src/common/util.h
index 921dd79da0..175a078c6b 100644
--- a/src/common/util.h
+++ b/src/common/util.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -172,6 +172,10 @@ uint64_t round_to_power_of_2(uint64_t u64);
unsigned round_to_next_multiple_of(unsigned number, unsigned divisor);
uint32_t round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor);
uint64_t round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor);
+int64_t round_int64_to_next_multiple_of(int64_t number, int64_t divisor);
+int64_t sample_laplace_distribution(double mu, double b, double p);
+int64_t add_laplace_noise(int64_t signal, double random, double delta_f,
+ double epsilon);
int n_bits_set_u8(uint8_t v);
/* Compute the CEIL of <b>a</b> divided by <b>b</b>, for nonnegative <b>a</b>
@@ -235,6 +239,7 @@ int tor_mem_is_zero(const char *mem, size_t len);
int tor_digest_is_zero(const char *digest);
int tor_digest256_is_zero(const char *digest);
char *esc_for_log(const char *string) ATTR_MALLOC;
+char *esc_for_log_len(const char *chars, size_t n) ATTR_MALLOC;
const char *escaped(const char *string);
char *tor_escape_str_for_pt_args(const char *string,
@@ -270,6 +275,7 @@ void format_local_iso_time(char *buf, time_t t);
void format_iso_time(char *buf, time_t t);
void format_iso_time_nospace(char *buf, time_t t);
void format_iso_time_nospace_usec(char *buf, const struct timeval *tv);
+int parse_iso_time_(const char *cp, time_t *t, int strict);
int parse_iso_time(const char *buf, time_t *t);
int parse_http_time(const char *buf, struct tm *tm);
int format_time_interval(char *out, size_t out_len, long interval);
@@ -337,7 +343,7 @@ enum stream_status get_string_from_pipe(FILE *stream, char *buf, size_t count);
/** Return values from file_status(); see that function's documentation
* for details. */
-typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR } file_status_t;
+typedef enum { FN_ERROR, FN_NOENT, FN_FILE, FN_DIR, FN_EMPTY } file_status_t;
file_status_t file_status(const char *filename);
/** Possible behaviors for check_private_dir() on encountering a nonexistent
diff --git a/src/common/util_process.c b/src/common/util_process.c
index 1924c19509..849a5c0b63 100644
--- a/src/common/util_process.c
+++ b/src/common/util_process.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/util_process.h b/src/common/util_process.h
index e7c55ed33d..c55cd8c5fa 100644
--- a/src/common/util_process.h
+++ b/src/common/util_process.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/common/workqueue.c b/src/common/workqueue.c
new file mode 100644
index 0000000000..5da29d5ab9
--- /dev/null
+++ b/src/common/workqueue.c
@@ -0,0 +1,490 @@
+/* copyright (c) 2013-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#include "compat.h"
+#include "compat_threads.h"
+#include "util.h"
+#include "workqueue.h"
+#include "tor_queue.h"
+#include "torlog.h"
+
+struct threadpool_s {
+ /** An array of pointers to workerthread_t: one for each running worker
+ * thread. */
+ struct workerthread_s **threads;
+
+ /** Condition variable that we wait on when we have no work, and which
+ * gets signaled when our queue becomes nonempty. */
+ tor_cond_t condition;
+ /** Queue of pending work that we have to do. */
+ TOR_TAILQ_HEAD(, workqueue_entry_s) work;
+
+ /** The current 'update generation' of the threadpool. Any thread that is
+ * at an earlier generation needs to run the update function. */
+ unsigned generation;
+
+ /** Function that should be run for updates on each thread. */
+ int (*update_fn)(void *, void *);
+ /** Function to free update arguments if they can't be run. */
+ void (*free_update_arg_fn)(void *);
+ /** Array of n_threads update arguments. */
+ void **update_args;
+
+ /** Number of elements in threads. */
+ int n_threads;
+ /** Mutex to protect all the above fields. */
+ tor_mutex_t lock;
+
+ /** A reply queue to use when constructing new threads. */
+ replyqueue_t *reply_queue;
+
+ /** Functions used to allocate and free thread state. */
+ void *(*new_thread_state_fn)(void*);
+ void (*free_thread_state_fn)(void*);
+ void *new_thread_state_arg;
+};
+
+struct workqueue_entry_s {
+ /** The next workqueue_entry_t that's pending on the same thread or
+ * reply queue. */
+ TOR_TAILQ_ENTRY(workqueue_entry_s) next_work;
+ /** The threadpool to which this workqueue_entry_t was assigned. This field
+ * is set when the workqueue_entry_t is created, and won't be cleared until
+ * after it's handled in the main thread. */
+ struct threadpool_s *on_pool;
+ /** True iff this entry is waiting for a worker to start processing it. */
+ uint8_t pending;
+ /** Function to run in the worker thread. */
+ int (*fn)(void *state, void *arg);
+ /** Function to run while processing the reply queue. */
+ void (*reply_fn)(void *arg);
+ /** Argument for the above functions. */
+ void *arg;
+};
+
+struct replyqueue_s {
+ /** Mutex to protect the answers field */
+ tor_mutex_t lock;
+ /** Doubly-linked list of answers that the reply queue needs to handle. */
+ TOR_TAILQ_HEAD(, workqueue_entry_s) answers;
+
+ /** Mechanism to wake up the main thread when it is receiving answers. */
+ alert_sockets_t alert;
+};
+
+/** A worker thread represents a single thread in a thread pool. To avoid
+ * contention, each gets its own queue. This breaks the guarantee that that
+ * queued work will get executed strictly in order. */
+typedef struct workerthread_s {
+ /** Which thread it this? In range 0..in_pool->n_threads-1 */
+ int index;
+ /** The pool this thread is a part of. */
+ struct threadpool_s *in_pool;
+ /** User-supplied state field that we pass to the worker functions of each
+ * work item. */
+ void *state;
+ /** Reply queue to which we pass our results. */
+ replyqueue_t *reply_queue;
+ /** The current update generation of this thread */
+ unsigned generation;
+} workerthread_t;
+
+static void queue_reply(replyqueue_t *queue, workqueue_entry_t *work);
+
+/** Allocate and return a new workqueue_entry_t, set up to run the function
+ * <b>fn</b> in the worker thread, and <b>reply_fn</b> in the main
+ * thread. See threadpool_queue_work() for full documentation. */
+static workqueue_entry_t *
+workqueue_entry_new(int (*fn)(void*, void*),
+ void (*reply_fn)(void*),
+ void *arg)
+{
+ workqueue_entry_t *ent = tor_malloc_zero(sizeof(workqueue_entry_t));
+ ent->fn = fn;
+ ent->reply_fn = reply_fn;
+ ent->arg = arg;
+ return ent;
+}
+
+/**
+ * Release all storage held in <b>ent</b>. Call only when <b>ent</b> is not on
+ * any queue.
+ */
+static void
+workqueue_entry_free(workqueue_entry_t *ent)
+{
+ if (!ent)
+ return;
+ memset(ent, 0xf0, sizeof(*ent));
+ tor_free(ent);
+}
+
+/**
+ * Cancel a workqueue_entry_t that has been returned from
+ * threadpool_queue_work.
+ *
+ * You must not call this function on any work whose reply function has been
+ * executed in the main thread; that will cause undefined behavior (probably,
+ * a crash).
+ *
+ * If the work is cancelled, this function return the argument passed to the
+ * work function. It is the caller's responsibility to free this storage.
+ *
+ * This function will have no effect if the worker thread has already executed
+ * or begun to execute the work item. In that case, it will return NULL.
+ */
+void *
+workqueue_entry_cancel(workqueue_entry_t *ent)
+{
+ int cancelled = 0;
+ void *result = NULL;
+ tor_mutex_acquire(&ent->on_pool->lock);
+ if (ent->pending) {
+ TOR_TAILQ_REMOVE(&ent->on_pool->work, ent, next_work);
+ cancelled = 1;
+ result = ent->arg;
+ }
+ tor_mutex_release(&ent->on_pool->lock);
+
+ if (cancelled) {
+ workqueue_entry_free(ent);
+ }
+ return result;
+}
+
+/**DOCDOC
+
+ must hold lock */
+static int
+worker_thread_has_work(workerthread_t *thread)
+{
+ return !TOR_TAILQ_EMPTY(&thread->in_pool->work) ||
+ thread->generation != thread->in_pool->generation;
+}
+
+/**
+ * Main function for the worker thread.
+ */
+static void
+worker_thread_main(void *thread_)
+{
+ workerthread_t *thread = thread_;
+ threadpool_t *pool = thread->in_pool;
+ workqueue_entry_t *work;
+ int result;
+
+ tor_mutex_acquire(&pool->lock);
+ while (1) {
+ /* lock must be held at this point. */
+ while (worker_thread_has_work(thread)) {
+ /* lock must be held at this point. */
+ if (thread->in_pool->generation != thread->generation) {
+ void *arg = thread->in_pool->update_args[thread->index];
+ thread->in_pool->update_args[thread->index] = NULL;
+ int (*update_fn)(void*,void*) = thread->in_pool->update_fn;
+ thread->generation = thread->in_pool->generation;
+ tor_mutex_release(&pool->lock);
+
+ int r = update_fn(thread->state, arg);
+
+ if (r < 0) {
+ return;
+ }
+
+ tor_mutex_acquire(&pool->lock);
+ continue;
+ }
+ work = TOR_TAILQ_FIRST(&pool->work);
+ TOR_TAILQ_REMOVE(&pool->work, work, next_work);
+ work->pending = 0;
+ tor_mutex_release(&pool->lock);
+
+ /* We run the work function without holding the thread lock. This
+ * is the main thread's first opportunity to give us more work. */
+ result = work->fn(thread->state, work->arg);
+
+ /* Queue the reply for the main thread. */
+ queue_reply(thread->reply_queue, work);
+
+ /* We may need to exit the thread. */
+ if (result >= WQ_RPL_ERROR) {
+ return;
+ }
+ tor_mutex_acquire(&pool->lock);
+ }
+ /* At this point the lock is held, and there is no work in this thread's
+ * queue. */
+
+ /* TODO: support an idle-function */
+
+ /* Okay. Now, wait till somebody has work for us. */
+ if (tor_cond_wait(&pool->condition, &pool->lock, NULL) < 0) {
+ log_warn(LD_GENERAL, "Fail tor_cond_wait.");
+ }
+ }
+}
+
+/** Put a reply on the reply queue. The reply must not currently be on
+ * any thread's work queue. */
+static void
+queue_reply(replyqueue_t *queue, workqueue_entry_t *work)
+{
+ int was_empty;
+ tor_mutex_acquire(&queue->lock);
+ was_empty = TOR_TAILQ_EMPTY(&queue->answers);
+ TOR_TAILQ_INSERT_TAIL(&queue->answers, work, next_work);
+ tor_mutex_release(&queue->lock);
+
+ if (was_empty) {
+ if (queue->alert.alert_fn(queue->alert.write_fd) < 0) {
+ /* XXXX complain! */
+ }
+ }
+}
+
+/** Allocate and start a new worker thread to use state object <b>state</b>,
+ * and send responses to <b>replyqueue</b>. */
+static workerthread_t *
+workerthread_new(void *state, threadpool_t *pool, replyqueue_t *replyqueue)
+{
+ workerthread_t *thr = tor_malloc_zero(sizeof(workerthread_t));
+ thr->state = state;
+ thr->reply_queue = replyqueue;
+ thr->in_pool = pool;
+
+ if (spawn_func(worker_thread_main, thr) < 0) {
+ log_err(LD_GENERAL, "Can't launch worker thread.");
+ return NULL;
+ }
+
+ return thr;
+}
+
+/**
+ * Queue an item of work for a thread in a thread pool. The function
+ * <b>fn</b> will be run in a worker thread, and will receive as arguments the
+ * thread's state object, and the provided object <b>arg</b>. It must return
+ * one of WQ_RPL_REPLY, WQ_RPL_ERROR, or WQ_RPL_SHUTDOWN.
+ *
+ * Regardless of its return value, the function <b>reply_fn</b> will later be
+ * run in the main thread when it invokes replyqueue_process(), and will
+ * receive as its argument the same <b>arg</b> object. It's the reply
+ * function's responsibility to free the work object.
+ *
+ * On success, return a workqueue_entry_t object that can be passed to
+ * workqueue_entry_cancel(). On failure, return NULL.
+ *
+ * Note that because each thread has its own work queue, work items may not
+ * be executed strictly in order.
+ */
+workqueue_entry_t *
+threadpool_queue_work(threadpool_t *pool,
+ int (*fn)(void *, void *),
+ void (*reply_fn)(void *),
+ void *arg)
+{
+ workqueue_entry_t *ent = workqueue_entry_new(fn, reply_fn, arg);
+ ent->on_pool = pool;
+ ent->pending = 1;
+
+ tor_mutex_acquire(&pool->lock);
+
+ TOR_TAILQ_INSERT_TAIL(&pool->work, ent, next_work);
+
+ tor_mutex_release(&pool->lock);
+
+ tor_cond_signal_one(&pool->condition);
+
+ return ent;
+}
+
+/**
+ * Queue a copy of a work item for every thread in a pool. This can be used,
+ * for example, to tell the threads to update some parameter in their states.
+ *
+ * Arguments are as for <b>threadpool_queue_work</b>, except that the
+ * <b>arg</b> value is passed to <b>dup_fn</b> once per each thread to
+ * make a copy of it.
+ *
+ * UPDATE FUNCTIONS MUST BE IDEMPOTENT. We do not guarantee that every update
+ * will be run. If a new update is scheduled before the old update finishes
+ * running, then the new will replace the old in any threads that haven't run
+ * it yet.
+ *
+ * Return 0 on success, -1 on failure.
+ */
+int
+threadpool_queue_update(threadpool_t *pool,
+ void *(*dup_fn)(void *),
+ int (*fn)(void *, void *),
+ void (*free_fn)(void *),
+ void *arg)
+{
+ int i, n_threads;
+ void (*old_args_free_fn)(void *arg);
+ void **old_args;
+ void **new_args;
+
+ tor_mutex_acquire(&pool->lock);
+ n_threads = pool->n_threads;
+ old_args = pool->update_args;
+ old_args_free_fn = pool->free_update_arg_fn;
+
+ new_args = tor_calloc(n_threads, sizeof(void*));
+ for (i = 0; i < n_threads; ++i) {
+ if (dup_fn)
+ new_args[i] = dup_fn(arg);
+ else
+ new_args[i] = arg;
+ }
+
+ pool->update_args = new_args;
+ pool->free_update_arg_fn = free_fn;
+ pool->update_fn = fn;
+ ++pool->generation;
+
+ tor_mutex_release(&pool->lock);
+
+ tor_cond_signal_all(&pool->condition);
+
+ if (old_args) {
+ for (i = 0; i < n_threads; ++i) {
+ if (old_args[i] && old_args_free_fn)
+ old_args_free_fn(old_args[i]);
+ }
+ tor_free(old_args);
+ }
+
+ return 0;
+}
+
+/** Launch threads until we have <b>n</b>. */
+static int
+threadpool_start_threads(threadpool_t *pool, int n)
+{
+ tor_mutex_acquire(&pool->lock);
+
+ if (pool->n_threads < n)
+ pool->threads = tor_realloc(pool->threads, sizeof(workerthread_t*)*n);
+
+ while (pool->n_threads < n) {
+ void *state = pool->new_thread_state_fn(pool->new_thread_state_arg);
+ workerthread_t *thr = workerthread_new(state, pool, pool->reply_queue);
+ thr->index = pool->n_threads;
+
+ if (!thr) {
+ tor_mutex_release(&pool->lock);
+ return -1;
+ }
+ pool->threads[pool->n_threads++] = thr;
+ }
+ tor_mutex_release(&pool->lock);
+
+ return 0;
+}
+
+/**
+ * Construct a new thread pool with <b>n</b> worker threads, configured to
+ * send their output to <b>replyqueue</b>. The threads' states will be
+ * constructed with the <b>new_thread_state_fn</b> call, receiving <b>arg</b>
+ * as its argument. When the threads close, they will call
+ * <b>free_thread_state_fn</b> on their states.
+ */
+threadpool_t *
+threadpool_new(int n_threads,
+ replyqueue_t *replyqueue,
+ void *(*new_thread_state_fn)(void*),
+ void (*free_thread_state_fn)(void*),
+ void *arg)
+{
+ threadpool_t *pool;
+ pool = tor_malloc_zero(sizeof(threadpool_t));
+ tor_mutex_init_nonrecursive(&pool->lock);
+ tor_cond_init(&pool->condition);
+ TOR_TAILQ_INIT(&pool->work);
+
+ pool->new_thread_state_fn = new_thread_state_fn;
+ pool->new_thread_state_arg = arg;
+ pool->free_thread_state_fn = free_thread_state_fn;
+ pool->reply_queue = replyqueue;
+
+ if (threadpool_start_threads(pool, n_threads) < 0) {
+ tor_mutex_uninit(&pool->lock);
+ tor_free(pool);
+ return NULL;
+ }
+
+ return pool;
+}
+
+/** Return the reply queue associated with a given thread pool. */
+replyqueue_t *
+threadpool_get_replyqueue(threadpool_t *tp)
+{
+ return tp->reply_queue;
+}
+
+/** Allocate a new reply queue. Reply queues are used to pass results from
+ * worker threads to the main thread. Since the main thread is running an
+ * IO-centric event loop, it needs to get woken up with means other than a
+ * condition variable. */
+replyqueue_t *
+replyqueue_new(uint32_t alertsocks_flags)
+{
+ replyqueue_t *rq;
+
+ rq = tor_malloc_zero(sizeof(replyqueue_t));
+ if (alert_sockets_create(&rq->alert, alertsocks_flags) < 0) {
+ tor_free(rq);
+ return NULL;
+ }
+
+ tor_mutex_init(&rq->lock);
+ TOR_TAILQ_INIT(&rq->answers);
+
+ return rq;
+}
+
+/**
+ * Return the "read socket" for a given reply queue. The main thread should
+ * listen for read events on this socket, and call replyqueue_process() every
+ * time it triggers.
+ */
+tor_socket_t
+replyqueue_get_socket(replyqueue_t *rq)
+{
+ return rq->alert.read_fd;
+}
+
+/**
+ * Process all pending replies on a reply queue. The main thread should call
+ * this function every time the socket returned by replyqueue_get_socket() is
+ * readable.
+ */
+void
+replyqueue_process(replyqueue_t *queue)
+{
+ if (queue->alert.drain_fn(queue->alert.read_fd) < 0) {
+ static ratelim_t warn_limit = RATELIM_INIT(7200);
+ log_fn_ratelim(&warn_limit, LOG_WARN, LD_GENERAL,
+ "Failure from drain_fd");
+ }
+
+ tor_mutex_acquire(&queue->lock);
+ while (!TOR_TAILQ_EMPTY(&queue->answers)) {
+ /* lock must be held at this point.*/
+ workqueue_entry_t *work = TOR_TAILQ_FIRST(&queue->answers);
+ TOR_TAILQ_REMOVE(&queue->answers, work, next_work);
+ tor_mutex_release(&queue->lock);
+ work->on_pool = NULL;
+
+ work->reply_fn(work->arg);
+ workqueue_entry_free(work);
+
+ tor_mutex_acquire(&queue->lock);
+ }
+
+ tor_mutex_release(&queue->lock);
+}
+
diff --git a/src/common/workqueue.h b/src/common/workqueue.h
new file mode 100644
index 0000000000..92e82b8a48
--- /dev/null
+++ b/src/common/workqueue.h
@@ -0,0 +1,48 @@
+/* Copyright (c) 2013, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef TOR_WORKQUEUE_H
+#define TOR_WORKQUEUE_H
+
+#include "compat.h"
+
+/** A replyqueue is used to tell the main thread about the outcome of
+ * work that we queued for the the workers. */
+typedef struct replyqueue_s replyqueue_t;
+/** A thread-pool manages starting threads and passing work to them. */
+typedef struct threadpool_s threadpool_t;
+/** A workqueue entry represents a request that has been passed to a thread
+ * pool. */
+typedef struct workqueue_entry_s workqueue_entry_t;
+
+/** Possible return value from a work function: indicates success. */
+#define WQ_RPL_REPLY 0
+/** Possible return value from a work function: indicates fatal error */
+#define WQ_RPL_ERROR 1
+/** Possible return value from a work function: indicates thread is shutting
+ * down. */
+#define WQ_RPL_SHUTDOWN 2
+
+workqueue_entry_t *threadpool_queue_work(threadpool_t *pool,
+ int (*fn)(void *, void *),
+ void (*reply_fn)(void *),
+ void *arg);
+int threadpool_queue_update(threadpool_t *pool,
+ void *(*dup_fn)(void *),
+ int (*fn)(void *, void *),
+ void (*free_fn)(void *),
+ void *arg);
+void *workqueue_entry_cancel(workqueue_entry_t *pending_work);
+threadpool_t *threadpool_new(int n_threads,
+ replyqueue_t *replyqueue,
+ void *(*new_thread_state_fn)(void*),
+ void (*free_thread_state_fn)(void*),
+ void *arg);
+replyqueue_t *threadpool_get_replyqueue(threadpool_t *tp);
+
+replyqueue_t *replyqueue_new(uint32_t alertsocks_flags);
+tor_socket_t replyqueue_get_socket(replyqueue_t *rq);
+void replyqueue_process(replyqueue_t *queue);
+
+#endif
+
diff --git a/src/config/geoip b/src/config/geoip
index 28cb59ecb7..2359d05010 100644
--- a/src/config/geoip
+++ b/src/config/geoip
@@ -1,4 +1,4 @@
-# Last updated based on August 7 2014 Maxmind GeoLite2 Country
+# Last updated based on January 7 2015 Maxmind GeoLite2 Country
# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
# gunzip GeoLite2-Country.mmdb.gz
# python mmdb-convert.py GeoLite2-Country.mmdb
@@ -16,7 +16,7 @@
16859136,16875519,JP
16875520,16908287,TH
16908288,16909055,CN
-16909056,16909311,AU
+16909056,16909311,US
16909312,16941055,CN
16941056,16973823,TH
16973824,17039359,CN
@@ -39,7 +39,8 @@
18219008,18350079,IN
18350080,18874367,CN
18874368,18907135,MY
-18907136,18939903,HK
+18907136,18923519,SG
+18923520,18939903,HK
18939904,19005439,JP
19005440,19136511,TW
19136512,19202047,HK
@@ -71,7 +72,7 @@
29949952,30015487,KR
30015488,30408703,CN
30408704,33554431,KR
-33554432,33554432,DE
+33554432,33554432,RU
33554433,34603007,FR
34604544,34605055,DE
34612224,34612735,IL
@@ -131,9 +132,7 @@
36700160,36962303,AE
36962304,37224447,IL
37486592,37748735,RU
-37748736,38258687,SE
-38258688,38258943,DK
-38258944,38273023,SE
+37748736,38273023,SE
38273024,38797311,KZ
38797312,39059455,PT
39059456,39321599,GR
@@ -166,9 +165,9 @@
57083941,57083941,BE
57083942,68305407,US
68305408,68305919,MX
-68305920,69094399,US
-69094400,69094655,AU
-69094656,71020543,US
+68305920,68973055,US
+68973056,68973311,CA
+68973312,71020543,US
71020544,71020799,CA
71020800,71571339,US
71571340,71571340,DE
@@ -207,7 +206,9 @@
83961856,83963903,CY
83963904,83965951,RU
83965952,83967999,CZ
-83968000,83976191,DE
+83968000,83972863,DE
+83972864,83973119,GB
+83973120,83976191,DE
83976192,83978239,CH
83978240,83980287,IQ
83980288,83982335,CH
@@ -223,9 +224,7 @@
84049920,84082687,RO
84082688,84148223,RU
84148224,84410367,DE
-84410368,84418559,RU
-84418560,84420607,GB
-84420608,84434943,RU
+84410368,84434943,RU
84434944,84443135,IT
84443136,84451327,LB
84451328,84457471,RU
@@ -237,101 +236,8 @@
84545536,84549631,GB
84549632,84551679,GE
84551680,84557823,DE
-84557824,84557824,NL
-84557825,84557825,US
-84557826,84558063,NL
-84558064,84558071,US
-84558072,84558879,NL
-84558880,84558887,US
-84558888,84560635,NL
-84560636,84560639,US
-84560640,84561063,NL
-84561064,84561071,US
-84561072,84561215,NL
-84561216,84561247,US
-84561248,84561351,NL
-84561352,84561359,MY
-84561360,84561639,NL
-84561640,84561647,ES
-84561648,84561655,AF
-84561656,84561727,NL
-84561728,84561791,US
-84561792,84562383,NL
-84562384,84562391,US
-84562392,84562511,NL
-84562512,84562527,US
-84562528,84563647,NL
-84563648,84563655,US
-84563656,84563691,NL
-84563692,84563695,GB
-84563696,84563703,NL
-84563704,84563711,US
-84563712,84564411,NL
-84564412,84564415,US
-84564416,84564498,NL
-84564499,84564499,GB
-84564500,84564863,NL
-84564864,84564871,TR
-84564872,84565247,NL
-84565248,84565311,US
-84565312,84565655,NL
-84565656,84565663,US
-84565664,84566303,NL
-84566304,84566319,US
-84566320,84566383,NL
-84566384,84566415,US
-84566416,84566420,NL
-84566421,84566421,US
-84566422,84566495,NL
-84566496,84566527,US
-84566528,84566567,NL
-84566568,84566583,US
-84566584,84566591,NL
-84566592,84566687,US
-84566688,84566719,NL
-84566720,84566743,US
-84566744,84567039,NL
-84567040,84567055,US
-84567056,84567071,NL
-84567072,84567103,US
-84567104,84567119,NL
-84567120,84567135,US
-84567136,84567199,NL
-84567200,84567231,US
-84567232,84567375,NL
-84567376,84567391,US
-84567392,84567535,NL
-84567536,84567551,US
-84567552,84567599,NL
-84567600,84567615,US
-84567616,84567647,NL
-84567648,84567679,US
-84567680,84567903,NL
-84567904,84567919,US
-84567920,84567999,NL
-84568000,84568015,US
-84568016,84568223,NL
-84568224,84568239,US
-84568240,84568255,GB
-84568256,84568287,NL
-84568288,84568303,US
-84568304,84568351,NL
-84568352,84568399,US
-84568400,84568591,NL
-84568592,84568607,GB
-84568608,84568847,NL
-84568848,84568863,US
-84568864,84568927,NL
-84568928,84568943,GB
-84568944,84568991,NL
-84568992,84569023,GB
-84569024,84569119,NL
-84569120,84569135,US
-84569136,84569183,NL
-84569184,84569199,US
-84569200,84570127,NL
-84570128,84570143,US
-84570144,84574207,NL
+84557824,84566015,NL
+84566016,84574207,GB
84574208,84576255,FR
84576256,84582399,GB
84582400,84590591,DE
@@ -370,6 +276,7 @@
85387264,85389311,SE
85389312,85391359,DE
85391360,85393407,NL
+85395456,85395711,TR
85395968,85396223,BE
85396480,85397503,ES
85398528,85398783,SA
@@ -434,7 +341,9 @@
86442496,86442499,ES
86442500,86442507,FR
86442508,86442511,ES
-86442512,86442687,FR
+86442512,86442591,FR
+86442592,86442599,IT
+86442600,86442687,FR
86442688,86442691,ES
86442692,86442699,FR
86442700,86442700,ES
@@ -497,7 +406,9 @@
86446720,86446727,NL
86446728,86446983,FR
86446984,86446991,IT
-86446992,86447095,FR
+86446992,86447071,FR
+86447072,86447087,DE
+86447088,86447095,FR
86447096,86447103,ES
86447104,86447255,FR
86447256,86447263,PL
@@ -510,7 +421,9 @@
86448808,86448851,FR
86448852,86448855,IT
86448856,86448859,PT
-86448860,86449363,FR
+86448860,86449311,FR
+86449312,86449343,ES
+86449344,86449363,FR
86449364,86449367,DE
86449368,86449499,FR
86449500,86449503,ES
@@ -543,7 +456,9 @@
86454616,86454619,ES
86454620,86454823,FR
86454824,86454831,ES
-86454832,86455623,FR
+86454832,86455591,FR
+86455592,86455595,NL
+86455596,86455623,FR
86455624,86455624,DE
86455625,86456195,FR
86456196,86456211,DE
@@ -567,9 +482,13 @@
86457800,86457803,ES
86457804,86466839,FR
86466840,86466847,NL
-86466848,86467320,FR
+86466848,86466943,FR
+86466944,86466959,DE
+86466960,86467320,FR
86467321,86467321,FI
-86467322,86467999,FR
+86467322,86467551,FR
+86467552,86467583,PT
+86467584,86467999,FR
86468000,86468003,PL
86468004,86468055,FR
86468056,86468056,DE
@@ -599,7 +518,9 @@
86474476,86474479,DE
86474480,86474527,FR
86474528,86474531,DE
-86474532,86474751,FR
+86474532,86474743,FR
+86474744,86474747,LT
+86474748,86474751,FR
86474752,86482943,HR
86482944,86484991,RU
86484992,86487039,NL
@@ -613,12 +534,11 @@
86503424,86505471,DE
86505472,86507519,GB
86507520,86573055,ES
-86573056,86638591,RO
+86573056,86638591,SA
86638592,86671359,RU
-86671360,86671615,JE
-86671616,86671871,GB
-86671872,86672895,JE
-86672896,86673407,GB
+86671360,86672895,JE
+86672896,86673151,GB
+86673152,86673407,JE
86673408,86675455,DE
86675456,86677503,IT
86677504,86687743,FR
@@ -708,7 +628,9 @@
87601152,87621631,DE
87621632,87623679,LB
87623680,87625727,KG
-87625728,87627775,NL
+87625728,87626880,NL
+87626881,87626881,GB
+87626882,87627775,NL
87627776,87629823,ES
87629824,87631871,IR
87631872,87633919,DE
@@ -717,23 +639,15 @@
87638016,87640063,UA
87640064,87642111,RS
87642112,87646207,GB
-87646208,87646463,FR
-87646464,87646719,RE
-87646720,87646975,YT
-87646976,87647231,FR
-87647232,87647743,RE
-87647744,87648511,FR
-87648512,87649535,RE
-87649536,87649791,FR
-87649792,87650815,RE
-87650816,87651583,FR
-87651584,87651839,RE
-87651840,87653119,FR
-87653120,87653375,RE
-87653376,87653631,FR
-87653632,87653887,RE
-87653888,87654143,FR
-87654144,87654399,RE
+87646208,87647999,FR
+87648000,87648255,RE
+87648256,87651839,FR
+87651840,87652095,RE
+87652096,87652351,FR
+87652352,87652863,RE
+87652864,87653375,FR
+87653376,87653887,RE
+87653888,87654399,FR
87654400,87670783,PL
87670784,87672831,DE
87672832,87674879,CH
@@ -797,9 +711,7 @@
88940544,88948735,GB
88948736,88965119,IT
88965120,88997887,AM
-88997888,89028607,DE
-89028608,89031167,US
-89031168,89063423,DE
+88997888,89063423,IR
89063424,89079807,GB
89079808,89096191,NL
89096192,89128959,RU
@@ -843,12 +755,15 @@
90544128,90546175,RU
90546176,90548223,DE
90548224,90550271,GB
-90550272,90570751,RU
+90550272,90554367,EE
+90554368,90570751,RU
90570752,90578943,IT
90578944,90583039,IR
90583040,90587135,CZ
90587136,90589183,PL
-90589184,90591231,FR
+90589184,90589439,FR
+90589440,90589695,RE
+90589696,90591231,FR
90591232,90595327,GB
90595328,90603519,PS
90603520,90605567,ES
@@ -857,7 +772,7 @@
90609664,90611711,RU
90611712,90613759,DE
90613760,90615807,GB
-90615808,90617855,SI
+90615808,90617855,BA
90617856,90619903,GB
90619904,90636287,IL
90636288,90701823,DK
@@ -878,7 +793,8 @@
90734592,90736639,SY
90736640,90738687,NL
90738688,90740735,DE
-90740736,90742783,NL
+90740736,90742527,NL
+90742528,90742783,RO
90742784,90750975,BG
90750976,90753023,FR
90753024,90755071,RU
@@ -891,11 +807,13 @@
90764800,90765311,IL
90765312,90767359,PL
90767360,90832895,UA
-90832896,90963967,RO
+90832896,90898431,IR
+90898432,90963967,AE
90963968,91226111,SA
91226112,92274687,IR
92274688,92536831,RU
-92536832,92602367,NL
+92536832,92585983,NL
+92585984,92602367,SA
92602368,92604415,BA
92604416,92606463,PL
92606464,92608511,GB
@@ -933,7 +851,9 @@
92734516,92734519,IT
92734520,92734735,FR
92734736,92734739,DE
-92734740,92735615,FR
+92734740,92735103,FR
+92735104,92735119,GB
+92735120,92735615,FR
92735616,92735616,DE
92735617,92735619,FR
92735620,92735623,ES
@@ -945,11 +865,17 @@
92736000,92736255,GB
92736256,92736479,FR
92736480,92736480,DE
-92736481,92738663,FR
+92736481,92736571,FR
+92736572,92736575,NL
+92736576,92737751,FR
+92737752,92737759,NL
+92737760,92738271,FR
+92738272,92738303,NL
+92738304,92738663,FR
92738664,92738679,ES
-92738680,92738719,FR
-92738720,92738727,GB
-92738728,92740447,FR
+92738680,92739199,FR
+92739200,92739215,DE
+92739216,92740447,FR
92740448,92740455,IT
92740456,92741203,FR
92741204,92741207,IT
@@ -961,14 +887,18 @@
92742416,92742419,IT
92742420,92742487,FR
92742488,92742491,IT
-92742492,92742691,FR
+92742492,92742639,FR
+92742640,92742643,ES
+92742644,92742691,FR
92742692,92742695,IT
92742696,92742815,FR
92742816,92742819,ES
-92742820,92743243,FR
+92742820,92743047,FR
+92743048,92743055,NL
+92743056,92743243,FR
92743244,92743247,IT
-92743248,92743303,FR
-92743304,92743307,IT
+92743248,92743295,FR
+92743296,92743307,IT
92743308,92743311,FR
92743312,92743315,IT
92743316,92743355,FR
@@ -985,7 +915,10 @@
92744284,92744291,NL
92744292,92744555,FR
92744556,92744559,IT
-92744560,92747711,FR
+92744560,92744575,NL
+92744576,92746415,FR
+92746416,92746431,ES
+92746432,92747711,FR
92747712,92747775,GB
92747776,92748773,FR
92748774,92748774,PT
@@ -995,21 +928,49 @@
92749748,92749751,ES
92749752,92751711,FR
92751712,92751712,DE
-92751713,92753547,FR
+92751713,92753079,FR
+92753080,92753087,ES
+92753088,92753547,FR
92753548,92753551,IT
92753552,92754579,FR
92754580,92754583,ES
92754584,92757311,FR
92757312,92757375,ES
-92757376,92762127,FR
+92757376,92761215,FR
+92761216,92761343,DE
+92761344,92762127,FR
92762128,92762135,ES
-92762136,92782687,FR
+92762136,92762383,FR
+92762384,92762391,ES
+92762392,92764223,FR
+92764224,92764287,ES
+92764288,92782687,FR
92782688,92782719,ES
-92782720,92783543,FR
+92782720,92783291,FR
+92783292,92783295,DE
+92783296,92783543,FR
92783544,92783547,ES
-92783548,92786827,FR
+92783548,92784159,FR
+92784160,92784191,IT
+92784192,92784255,FR
+92784256,92784263,NL
+92784264,92785363,FR
+92785364,92785367,PT
+92785368,92786827,FR
92786828,92786831,IT
-92786832,92795123,FR
+92786832,92789499,FR
+92789500,92789503,IT
+92789504,92790271,FR
+92790272,92790275,DE
+92790276,92792107,FR
+92792108,92792111,IT
+92792112,92792119,FR
+92792120,92792127,NL
+92792128,92792415,FR
+92792416,92792431,ES
+92792432,92793055,FR
+92793056,92793087,ES
+92793088,92795123,FR
92795124,92795127,IT
92795128,92798975,FR
92798976,93323263,RU
@@ -1032,7 +993,9 @@
93419520,93421567,IT
93421568,93425663,DE
93425664,93426687,GI
-93426688,93427711,DE
+93426688,93427085,DE
+93427086,93427086,GI
+93427087,93427711,DE
93427712,93429759,NO
93429760,93431807,RU
93431808,93433855,ES
@@ -1056,9 +1019,7 @@
93693952,93695999,IE
93696000,93700095,FR
93700096,93702143,PL
-93702144,93705983,RU
-93705984,93706239,UA
-93706240,93708287,RU
+93702144,93708287,RU
93708288,93712383,DE
93712384,93714431,HU
93714432,93716479,NL
@@ -1068,10 +1029,10 @@
93765632,93774847,SE
93774848,93776127,NO
93776128,93782015,SE
-93782016,93833983,GB
-93833984,93834239,NL
-93834240,93835263,GB
-93835264,93835519,NL
+93782016,93835263,GB
+93835264,93835407,NL
+93835408,93835415,GB
+93835416,93835519,NL
93835520,93836287,GB
93836288,93836799,NL
93836800,93842351,GB
@@ -1088,9 +1049,7 @@
93906944,93908991,BA
93908992,93911039,IT
93911040,93913087,AE
-93913088,93914319,NL
-93914320,93914323,AZ
-93914324,93914357,NL
+93913088,93914357,NL
93914358,93914358,GB
93914359,93914710,NL
93914711,93914711,GB
@@ -1109,7 +1068,9 @@
93916528,93916543,US
93916544,93916591,NL
93916592,93916599,US
-93916600,93916971,NL
+93916600,93916791,NL
+93916792,93916799,CA
+93916800,93916971,NL
93916972,93916975,US
93916976,93918103,NL
93918104,93918111,US
@@ -1122,8 +1083,8 @@
93918600,93918655,NL
93918656,93918687,US
93918688,93919263,NL
-93919264,93919279,US
-93919280,93919391,NL
+93919264,93919287,US
+93919288,93919391,NL
93919392,93919395,US
93919396,93919951,NL
93919952,93919959,US
@@ -1131,31 +1092,23 @@
93920060,93920063,US
93920064,93920163,NL
93920164,93920167,US
-93920168,93920223,NL
-93920224,93920231,US
-93920232,93920575,NL
+93920168,93920575,NL
93920576,93920639,US
-93920640,93920855,NL
-93920856,93920863,US
-93920864,93920967,NL
-93920968,93920975,US
-93920976,93921055,NL
+93920640,93921055,NL
93921056,93921059,US
-93921060,93921063,NL
-93921064,93921071,GB
-93921072,93923551,NL
-93923552,93923559,US
-93923560,93923567,NL
+93921060,93923095,NL
+93923096,93923103,US
+93923104,93923567,NL
93923568,93923575,US
93923576,93923855,NL
93923856,93923863,US
93923864,93924407,NL
93924408,93924415,JP
-93924416,93924591,NL
-93924592,93924599,US
-93924600,93925807,NL
+93924416,93925807,NL
93925808,93925815,KE
-93925816,93927143,NL
+93925816,93926143,NL
+93926144,93926151,BO
+93926152,93927143,NL
93927144,93927151,JP
93927152,93927231,NL
93927232,93927247,CL
@@ -1177,7 +1130,11 @@
93974528,93976575,CH
93976576,93978623,GB
93978624,94011391,ES
-94011392,94175231,RO
+94011392,94027775,RO
+94027776,94035967,IT
+94035968,94044159,RO
+94044160,94109695,SY
+94109696,94175231,SA
94175232,94178303,SE
94178304,94178559,NO
94178560,94179071,SE
@@ -1192,7 +1149,9 @@
94184960,94185471,IT
94185472,94186495,LU
94186496,94187263,DE
-94187264,94188287,AT
+94187264,94187519,AT
+94187520,94187775,SE
+94187776,94188287,AT
94188288,94189311,SE
94189312,94189567,LI
94189568,94191615,SE
@@ -1234,7 +1193,7 @@
94369792,94371839,TR
94371840,94502911,IR
94502912,94568447,OM
-94568448,94633983,RO
+94568448,94633983,SA
94633984,94896127,RU
94896128,95158271,IT
95158272,95166463,RU
@@ -1264,22 +1223,35 @@
95388928,95389183,AU
95389184,95389695,DE
95389696,95390207,GB
-95390208,95393151,DE
+95390208,95393023,DE
+95393024,95393151,GB
95393152,95393279,RS
-95393280,95393407,DE
+95393280,95393407,GB
95393408,95393535,AE
95393536,95393663,DE
95393664,95393791,QA
95393792,95394047,GB
95394048,95395327,AU
-95395328,95395839,GB
+95395328,95395455,GB
+95395456,95395583,DE
+95395584,95395839,GB
95395840,95398399,DE
95398400,95398655,GB
-95398656,95400447,DE
+95398656,95399679,DE
+95399680,95399807,US
+95399808,95399935,DE
+95399936,95400063,CA
+95400064,95400191,DE
+95400192,95400319,US
+95400320,95400447,DE
95400448,95400703,GB
-95400704,95401471,DE
+95400704,95400831,US
+95400832,95400959,DE
+95400960,95401087,US
+95401088,95401471,DE
95401472,95401727,GB
-95401728,95401903,DE
+95401728,95401855,US
+95401856,95401903,DE
95401904,95401911,AT
95401912,95401983,DE
95401984,95402111,GB
@@ -1290,15 +1262,22 @@
95402696,95402703,HR
95402704,95402719,DE
95402720,95402751,US
-95402752,95403183,DE
+95402752,95403007,DE
+95403008,95403135,US
+95403136,95403183,DE
95403184,95403191,BE
-95403192,95403519,DE
+95403192,95403263,DE
+95403264,95403391,US
+95403392,95403519,DE
95403520,95403775,GB
95403776,95404799,DE
95404800,95405055,GB
-95405056,95405567,DE
+95405056,95405311,DE
+95405312,95405439,US
+95405440,95405567,DE
95405568,95405823,GB
-95405824,95406335,DE
+95405824,95405951,US
+95405952,95406335,DE
95406336,95407359,GB
95407360,95407871,US
95407872,95408639,DE
@@ -1308,8 +1287,8 @@
95409920,95410175,DE
95410176,95410431,AU
95410432,95410447,CH
-95410448,95410687,DE
-95410688,95410943,GB
+95410448,95410559,DE
+95410560,95410943,GB
95410944,95411199,DE
95411200,95411215,NL
95411216,95420415,DE
@@ -1348,27 +1327,137 @@
96153600,96155647,PL
96155648,96157695,CH
96157696,96165887,RU
-96165888,96166143,GP
-96166144,96167167,FR
-96167168,96167423,GP
-96167424,96167679,FR
-96167680,96167935,GP
-96167936,96168191,MQ
-96168192,96169471,FR
-96169472,96169727,MQ
-96169728,96170751,FR
-96170752,96171263,GF
-96171264,96173055,FR
+96165888,96168703,GP
+96168704,96168959,MQ
+96168960,96171775,GP
+96171776,96172031,GF
+96172032,96173055,GP
96173056,96173311,MQ
-96173312,96174079,FR
+96173312,96174079,GP
96174080,96206847,HU
96206848,96305151,RU
96305152,96321535,DE
96321536,96337919,RU
96337920,96403455,IR
96403456,96468991,AZ
-96468992,96731135,RO
-96731136,96796671,DE
+96468992,96731135,AE
+96731136,96739479,FR
+96739480,96739483,DE
+96739484,96739583,FR
+96739584,96739587,PT
+96739588,96740111,FR
+96740112,96740127,IT
+96740128,96740223,FR
+96740224,96740351,IT
+96740352,96741039,FR
+96741040,96741043,PT
+96741044,96742407,FR
+96742408,96742415,NL
+96742416,96742427,FR
+96742428,96742431,NL
+96742432,96742679,FR
+96742680,96742687,DE
+96742688,96744607,FR
+96744608,96744611,IT
+96744612,96744831,FR
+96744832,96744839,GB
+96744840,96746879,FR
+96746880,96747007,IT
+96747008,96747103,FR
+96747104,96747135,DE
+96747136,96747291,FR
+96747292,96747295,PT
+96747296,96747343,FR
+96747344,96747359,DE
+96747360,96747407,FR
+96747408,96747423,DE
+96747424,96756427,FR
+96756428,96756431,ES
+96756432,96756447,DE
+96756448,96756743,FR
+96756744,96756751,NL
+96756752,96757639,FR
+96757640,96757643,CH
+96757644,96757883,FR
+96757884,96757887,ES
+96757888,96759767,FR
+96759768,96759775,IT
+96759776,96760403,FR
+96760404,96760407,IT
+96760408,96761855,FR
+96761856,96761871,BE
+96761872,96762863,FR
+96762864,96762879,NL
+96762880,96762943,FR
+96762944,96763007,ES
+96763008,96763163,FR
+96763164,96763167,PT
+96763168,96763199,DE
+96763200,96763551,FR
+96763552,96763555,GB
+96763556,96764375,FR
+96764376,96764383,IT
+96764384,96764559,FR
+96764560,96764575,NL
+96764576,96766943,FR
+96766944,96766975,BE
+96766976,96767031,FR
+96767032,96767035,GB
+96767036,96767823,FR
+96767824,96767839,BE
+96767840,96768151,FR
+96768152,96768155,FI
+96768156,96769279,FR
+96769280,96769295,ES
+96769296,96770651,FR
+96770652,96770655,PL
+96770656,96772215,FR
+96772216,96772223,PT
+96772224,96772407,FR
+96772408,96772408,GB
+96772409,96773119,FR
+96773120,96773375,ES
+96773376,96775599,FR
+96775600,96775615,DE
+96775616,96776319,FR
+96776320,96776323,ES
+96776324,96777023,FR
+96777024,96777087,ES
+96777088,96778171,FR
+96778172,96778175,PT
+96778176,96778247,FR
+96778248,96778255,IT
+96778256,96778867,FR
+96778868,96778871,BE
+96778872,96778991,FR
+96778992,96779007,DE
+96779008,96779167,FR
+96779168,96779199,PT
+96779200,96779247,FR
+96779248,96779255,CZ
+96779256,96779839,FR
+96779840,96779903,NL
+96779904,96783299,FR
+96783300,96783303,ES
+96783304,96783311,BE
+96783312,96783327,DE
+96783328,96783519,FR
+96783520,96783551,ES
+96783552,96783887,FR
+96783888,96783903,DE
+96783904,96785135,FR
+96785136,96785151,NL
+96785152,96785407,FR
+96785408,96785423,NL
+96785424,96786431,FR
+96786432,96786495,GB
+96786496,96792751,FR
+96792752,96792767,DE
+96792768,96793583,FR
+96793584,96793599,DE
+96793600,96794471,FR
+96794472,96794479,ES
+96794480,96796671,FR
96796672,96862207,AZ
96862208,96894975,GB
96894976,96897023,CZ
@@ -1417,7 +1506,9 @@
98734080,98736127,CH
98736128,98738175,RU
98738176,98740223,NO
-98740224,98741503,DE
+98740224,98740479,DE
+98740480,98740735,US
+98740736,98741503,DE
98741504,98741759,US
98741760,98742271,DE
98742272,98744319,GB
@@ -1427,11 +1518,13 @@
98893824,98959359,TR
98959360,99024895,DE
99024896,99025167,GB
-99025168,99025407,IT
+99025168,99025279,DE
+99025280,99025407,US
99025408,99025663,NL
99025664,99025919,DE
99025920,99025935,FI
-99025936,99026175,SE
+99025936,99026047,DE
+99026048,99026175,US
99026176,99026943,DE
99026944,99027199,GB
99027200,99027215,HR
@@ -1439,23 +1532,31 @@
99027456,99027711,PL
99027712,99027967,DE
99027968,99027983,ES
-99027984,99028223,DE
+99027984,99028095,DE
+99028096,99028223,US
99028224,99028239,GB
-99028240,99028735,DE
+99028240,99028351,DE
+99028352,99028479,US
+99028480,99028735,DE
99028736,99028751,SE
-99028752,99028991,EG
-99028992,99029247,GB
-99029248,99029503,DE
+99028752,99028863,DE
+99028864,99028991,US
+99028992,99029503,GB
99029504,99029519,IE
-99029520,99029759,TR
-99029760,99031295,DE
+99029520,99030783,DE
+99030784,99031039,US
+99031040,99031295,DE
99031296,99031551,GB
-99031552,99031807,DE
+99031552,99031679,DE
+99031680,99031807,US
99031808,99031823,GB
-99031824,99032063,FR
+99031824,99031935,DE
+99031936,99032063,US
99032064,99043839,DE
99043840,99043847,AT
-99043848,99044351,DE
+99043848,99044095,DE
+99044096,99044223,US
+99044224,99044351,DE
99044352,99044359,BE
99044360,99044607,DE
99044608,99044615,HR
@@ -1500,12 +1601,12 @@
100560896,100560959,GB
100560960,100561023,RO
100561024,100561151,GB
-100561152,100564991,RO
+100561152,100561599,RO
+100561600,100561663,US
+100561664,100564991,RO
100564992,100569087,SE
100569088,100569343,FR
-100569344,100569599,SE
-100569600,100569855,FR
-100569856,100573183,SE
+100569344,100573183,SE
100573184,100575231,GB
100575232,100577279,DK
100577280,100579327,RU
@@ -1519,45 +1620,58 @@
100634624,100636671,ES
100636672,100638719,NL
100638720,100646911,UA
-100646912,100663295,RU
-100663296,134874866,US
+100646912,100647679,RU
+100647680,100647711,TR
+100647712,100663295,RU
+100663296,100663296,CN
+100663297,134738943,US
+134738944,134739199,CA
+134739200,134874866,US
134874867,134874867,DO
134874868,135192575,US
135192576,135200767,MX
-135200768,135432191,US
+135200768,135430143,US
+135430144,135430399,CA
+135430400,135432191,US
135432192,135434239,CA
-135434240,135603199,US
+135434240,135441407,US
+135441408,135441663,CA
+135441664,135556607,US
+135556608,135556863,CA
+135556864,135603199,US
135603200,135604223,CA
-135604224,135607039,US
+135604224,135604479,US
+135604480,135604735,CA
+135604736,135607039,US
135607040,135607295,CA
135607296,135776255,US
135776256,135776511,GU
-135776512,135790591,US
-135790592,135790847,CA
-135790848,135791103,US
+135776512,135791103,US
135791104,135791615,CA
-135791616,135792639,US
-135792640,135794687,CA
-135794688,136237055,US
+135791616,135792383,US
+135792384,135794687,CA
+135794688,135926527,US
+135926528,135926783,VI
+135926784,135945727,US
+135945728,135945983,CA
+135945984,136175615,US
+136175616,136175871,CA
+136175872,136237055,US
136237056,136239103,CA
136239104,136404991,US
136404992,136407039,CA
136407040,136413183,US
-136413184,136415231,CA
-136415232,136415665,US
+136413184,136415665,CA
136415666,136415666,FR
-136415667,136689919,US
-136689920,136690175,CA
-136690176,139954241,US
+136415667,136415743,CA
+136415744,139954241,US
139954242,139954242,ES
139954243,152305663,US
152305664,152338431,GB
152338432,167772159,US
184549376,201897983,US
201897984,201898239,PR
-201898240,202182143,US
-202182144,202182399,GB
-202182400,202385407,US
+201898240,202385407,US
202385408,202385919,PR
202385920,202706431,US
202706432,202706943,PR
@@ -1565,9 +1679,11 @@
202935552,202935807,PR
202935808,203272959,US
203272960,203273215,GB
-203273216,203659007,US
-203659008,203659263,VI
-203659264,204047871,US
+203273216,203658975,US
+203658976,203658991,VI
+203658992,204047359,US
+204047360,204047615,VI
+204047616,204047871,US
204047872,204047999,PR
204048000,204048031,US
204048032,204048047,PR
@@ -1577,17 +1693,13 @@
211126784,211126911,PR
211126912,211263999,US
211264000,211264255,SA
-211264256,211597311,US
-211597312,211597567,VI
-211597568,211597719,US
+211264256,211597719,US
211597720,211597727,VI
211597728,212787199,US
212787200,212788223,PR
212788224,212788479,US
212788480,212788735,VI
-212788736,212788863,US
-212788864,212788991,PR
-212788992,212791831,US
+212788736,212791831,US
212791832,212791839,VI
212791840,212791935,US
212791936,212792063,VI
@@ -1595,25 +1707,36 @@
212793088,212793343,PR
212793344,212794575,US
212794576,212794583,VI
-212794584,214698239,US
+212794584,213799167,US
+213799168,213799423,CA
+213799424,214617343,US
+214617344,214617599,CA
+214617600,214698239,US
214698240,214698255,VI
214698256,214698303,US
214698304,214698311,VI
-214698312,214699519,US
-214699520,214699647,PR
-214699648,214699775,VI
-214699776,214778367,US
-214778368,214778623,PR
-214778624,217709055,US
-217709056,217709311,PR
-217709312,219512063,US
+214698312,214779135,US
+214779136,214779391,PR
+214779392,219249919,US
+219249920,219250175,GB
+219250176,219512063,US
219512064,219512319,GB
219512320,234881023,US
234881024,234883071,CN
234883072,234884095,JP
234884096,234885119,CN
234885120,234889215,VN
-234889216,234913791,KR
+234889216,234893311,JP
+234893312,234895359,KR
+234895360,234895615,TW
+234895616,234895871,MY
+234895872,234896127,TH
+234896128,234896383,MN
+234896384,234896639,IN
+234896640,234896895,AE
+234896896,234897151,PH
+234897152,234897407,TW
+234897408,234913791,KR
234913792,234946559,HK
234946560,234947583,CN
234947584,234950655,JP
@@ -1652,7 +1775,9 @@
243400704,243531775,CN
243531776,243662847,JP
243662848,243793919,CN
-243793920,243859455,HK
+243793920,243858687,HK
+243858688,243858943,GB
+243858944,243859455,HK
243859456,243916799,AU
243916800,243924991,JP
243924992,243990527,KR
@@ -1704,7 +1829,9 @@
265023488,265027583,GB
265027584,265060351,US
265060352,265093119,FR
-265093120,266062079,US
+265093120,265533695,US
+265533696,265533951,JP
+265533952,266062079,US
266062080,266062335,IN
266062336,266070271,US
266070272,266070527,AU
@@ -1834,7 +1961,9 @@
344260608,344260863,GB
344260864,344262655,US
344262656,344262911,GB
-344262912,344588543,US
+344262912,344270847,US
+344270848,344270911,GB
+344270912,344588543,US
344588544,344589055,GB
344589056,344592895,US
344592896,344592945,GB
@@ -1880,7 +2009,8 @@
386842624,386846719,NL
386846720,386862079,US
386862080,386862335,JP
-386862336,386875391,US
+386862336,386862591,KR
+386862592,386875391,US
386875392,386879487,NL
386879488,386887679,US
386887680,386891775,NL
@@ -2054,7 +2184,9 @@
391897088,391905279,CA
391905280,391938047,US
391938048,391946239,CA
-391946240,392429567,US
+391946240,392390538,US
+392390539,392390539,HK
+392390540,392429567,US
392429568,392433663,NL
392433664,392441855,US
392441856,392445951,IE
@@ -2075,6 +2207,8 @@
392765440,392765695,GB
392765696,394264575,US
394264576,394264831,CA
+394270720,394271231,NL
+394296320,394296831,NL
398458880,398635007,US
398635008,398643199,NL
398643200,398647295,US
@@ -2109,7 +2243,9 @@
399458304,399466495,NL
399466496,399601663,US
399601664,399618047,NL
-399618048,399630335,US
+399618048,399619839,US
+399619840,399620095,AU
+399620096,399630335,US
399630336,399638527,NL
399638528,399818751,US
399818752,399831039,NL
@@ -2160,7 +2296,19 @@
401130496,401130751,DE
401130752,401137151,US
401137152,401137663,GB
-401137664,401145855,US
+401137664,401142783,US
+401142784,401143039,PE
+401143040,401143295,BZ
+401143296,401143551,NG
+401143552,401143807,IM
+401143808,401144063,SA
+401144064,401144319,VE
+401144320,401144575,BS
+401144576,401144831,MA
+401144832,401145087,OM
+401145088,401145343,CO
+401145344,401145599,SC
+401145600,401145855,YE
401145856,401211391,CA
401211392,401293311,US
401293312,401297407,CA
@@ -2175,7 +2323,15 @@
401547264,401555455,CA
401555456,402096639,US
402096640,402096895,FR
-402096896,402105087,US
+402096896,402097151,US
+402097152,402097407,AR
+402097408,402097663,KE
+402097664,402097919,SY
+402097920,402098175,MX
+402098176,402098431,BN
+402098432,402098687,BH
+402098688,402098943,AW
+402098944,402105087,US
402105088,402105343,GB
402105344,402107391,US
402107392,402107647,IT
@@ -2203,7 +2359,9 @@
402374656,402399231,US
402399232,402403327,CA
402403328,402415615,US
-402415616,402417663,CA
+402415616,402416639,CA
+402416640,402416895,US
+402416896,402417663,CA
402417664,402550015,US
402550016,402550271,CA
402550272,402550783,GB
@@ -2234,9 +2392,9 @@
406061056,406110207,US
406110208,406142975,CA
406142976,406147071,US
-406147072,406151167,CA
+406147072,406159359,CA
406159360,406175743,US
-406183936,406208511,CA
+406175744,406216703,CA
406216704,406241279,US
406241280,406257663,PR
406257664,406274047,US
@@ -2247,10 +2405,8 @@
406323200,406388735,US
406388736,406454271,CA
406454272,406683647,US
-406683648,406683775,CA
-406683776,406683903,US
-406683904,406684159,CA
-406684160,406838783,US
+406683648,406684031,CA
+406684032,406838783,US
406838784,406839295,CA
406839296,406847487,US
406847488,407408639,CA
@@ -2269,6 +2425,7 @@
409272320,409337855,US
409337856,409354239,CA
409354240,409509887,US
+409509888,409518079,CA
409518080,409550847,US
409550848,409567231,CA
409567232,409731071,US
@@ -2278,6 +2435,8 @@
410189824,410648575,US
410648576,410714111,CA
410714112,411156479,US
+411156480,411160575,CA
+411160576,411164671,US
411164672,411168767,CA
411168768,411303935,US
411303936,411369471,NL
@@ -2288,7 +2447,9 @@
411639808,411664383,CA
411664384,411680767,US
411680768,411688959,CA
-411688960,411697151,PR
+411688960,411691519,PR
+411691520,411692031,US
+411692032,411697151,PR
411697152,411746303,CA
411746304,411762687,PR
411762688,411770879,CA
@@ -2301,8 +2462,9 @@
411983872,411988991,US
411988992,411989247,GB
411989248,412057599,US
+412057600,412065791,CA
412073984,412221439,US
-412221440,412237823,CA
+412221440,412254207,CA
412254208,412483583,US
412483584,412549119,CA
412549120,412614655,US
@@ -2318,7 +2480,9 @@
412958720,413007871,CA
413007872,413908991,US
413908992,413925375,PR
-413925376,415760383,US
+413925376,414502655,US
+414502656,414502783,CA
+414502784,415760383,US
415760384,416022527,CA
416022528,416059391,US
416059392,416088063,CA
@@ -2334,7 +2498,9 @@
416743424,416776191,CA
416776192,417202175,US
417202176,417267711,CA
-417267712,417366015,US
+417267712,417335807,US
+417335808,417335935,VI
+417335936,417366015,US
417366016,417398783,CA
417398784,417431551,US
417431552,417529855,CA
@@ -2346,9 +2512,7 @@
417796096,417800191,US
417800192,417808383,BS
417808384,417816575,CA
-417820672,417832191,US
-417832192,417832447,VI
-417832448,417857535,US
+417820672,417857535,US
417857536,417923071,AR
417923072,418062335,US
418062336,418070527,CA
@@ -2541,7 +2705,8 @@
460983296,460984319,HK
460984320,460988415,PG
460988416,460994559,JP
-460994560,460995583,MY
+460994560,460995327,MY
+460995328,460995583,SG
460996608,461008895,JP
461008896,461012991,AU
461012992,461045759,KR
@@ -2554,9 +2719,9 @@
461056000,461058047,AU
461058048,461062143,HK
461062144,461078527,IN
-461078528,461078783,FJ
-461078784,461079039,AU
-461079040,461094911,FJ
+461078528,461088767,FJ
+461088768,461089023,AU
+461089024,461094911,FJ
461094912,461096959,HK
461096960,461099007,TW
461099008,461100031,JP
@@ -2628,7 +2793,7 @@
469729280,469762047,IN
469762048,520093695,US
520093696,520257535,PL
-520257536,520290303,RO
+520257536,520290303,IR
520290304,520292351,TR
520292352,520294399,NL
520294400,520296447,RU
@@ -2662,26 +2827,34 @@
520491648,520491775,IS
520491776,520492031,IE
520492032,520493055,GB
-520493056,520494079,IT
+520493056,520493311,BE
+520493312,520493823,IT
+520493824,520494079,FI
520494080,520494335,FR
-520494336,520494591,IT
+520494336,520494591,CZ
520494592,520494847,CH
520494848,520495103,DK
-520495104,520495871,IT
+520495104,520495359,SE
+520495360,520495615,BE
+520495616,520495871,SE
520495872,520496383,DE
-520496384,520496895,IT
+520496384,520496639,TR
+520496640,520496767,CZ
+520496768,520496895,TR
520496896,520497151,ES
520497152,520497407,FR
-520497408,520497919,IT
+520497408,520497919,CH
520497920,520498175,FR
520498176,520498431,CH
520498432,520498687,SE
-520498688,520498943,IT
-520498944,520499199,FR
-520499200,520500223,IT
+520498688,520499711,FR
+520499712,520500223,DK
520500224,520500479,LU
520500480,520500735,DE
-520500736,520501759,IT
+520500736,520500991,LT
+520500992,520501247,AT
+520501248,520501503,LU
+520501504,520501759,NO
520501760,520502271,GB
520502272,520502783,IT
520502784,520503295,GB
@@ -2733,18 +2906,20 @@
520949760,520951807,RU
520951808,520953855,IE
520953856,520962047,RU
-520962048,520978431,IE
+520962048,520963407,IE
+520963408,520963408,US
+520963409,520978431,IE
520978432,520980479,RU
520980480,520982527,IT
520982528,520984575,RU
-520984576,520986623,GB
+520984576,520986623,NG
520986624,520988671,PS
520988672,520990719,DE
520990720,520992767,RU
520994816,521011199,BG
-521011200,521020415,RO
-521020416,521021439,MD
-521021440,521057279,RO
+521011200,521039871,RO
+521039872,521043967,IR
+521043968,521057279,RO
521057280,521058303,MD
521058304,521076735,RO
521076736,521078783,ES
@@ -2783,7 +2958,9 @@
521601024,521666559,RU
521666560,521668607,GB
521668608,521670655,CH
-521670656,521672703,HU
+521670656,521670911,HU
+521670912,521671935,DE
+521671936,521672703,HU
521672704,521674751,RU
521674752,521676799,GB
521676800,521678847,ES
@@ -2808,7 +2985,8 @@
521711616,521713663,SK
521713664,521715711,HU
521715712,521717759,LV
-521717760,521719807,IR
+521717760,521718783,IQ
+521718784,521719807,IR
521719808,521721855,UA
521721856,521723903,GB
521723904,521725951,SA
@@ -2849,13 +3027,7 @@
521953280,521961471,RU
521961472,521969663,CZ
521969664,521977855,UA
-521977856,521986303,RU
-521986304,521986559,UA
-521986560,521989631,RU
-521989632,521989887,UA
-521989888,521991679,RU
-521991680,521991935,UA
-521991936,521994239,RU
+521977856,521994239,RU
521994240,522002431,KG
522002432,522010623,IR
522010624,522018815,AE
@@ -2885,8 +3057,9 @@
522719232,522721279,UA
522721280,522741759,RU
522741760,522743807,UA
-522743808,522747903,RU
-522747904,522764287,UA
+522743808,522763263,RU
+522763264,522763519,UA
+522763520,522764287,RU
522780672,522782719,RU
522782720,522784767,UA
522784768,522786815,BG
@@ -3061,11 +3234,23 @@
529596416,529661951,TR
529661952,529727487,GE
529727488,529793023,HR
-529793024,529793337,CZ
-529793338,529793338,RU
-529793339,529793535,CZ
-529793536,529794303,RU
-529794304,529818623,CZ
+529793024,529793279,CZ
+529793280,529794303,RU
+529794304,529794559,CZ
+529794560,529796095,RU
+529796096,529797119,UA
+529797120,529798143,RU
+529798144,529798399,CZ
+529798400,529798655,RU
+529798656,529798911,KZ
+529798912,529799167,UA
+529799168,529799423,RU
+529799424,529799679,UA
+529799680,529800191,RU
+529800192,529800703,UA
+529800704,529801215,CZ
+529801216,529817599,RU
+529817600,529818623,CZ
529818624,529826303,RU
529826304,529826815,CZ
529826816,529827839,RU
@@ -3160,8 +3345,8 @@
531372544,531372799,DE
531372800,531380223,CH
531380224,531390463,DE
-531390464,531394559,CH
-531394560,531398655,DE
+531390464,531392511,CH
+531392512,531398655,DE
531398656,531400703,RU
531400704,531402751,UA
531402752,531404799,LU
@@ -3171,7 +3356,9 @@
531415040,531423231,RU
531423232,531425279,NO
531425280,531427327,FR
-531427328,531427703,GB
+531427328,531427559,GB
+531427560,531427567,IT
+531427568,531427703,GB
531427704,531427711,IT
531427712,531428263,GB
531428264,531428271,IT
@@ -3195,14 +3382,16 @@
531429600,531429607,IT
531429608,531430319,GB
531430320,531430327,IT
-531430328,531430823,GB
+531430328,531430791,GB
+531430792,531430799,IT
+531430800,531430823,GB
531430824,531430831,IT
531430832,531430847,GB
531430848,531430855,IT
-531430856,531430927,GB
-531430928,531430935,IT
-531430936,531431423,GB
-531431424,531496959,RO
+531430856,531430903,GB
+531430904,531430911,IT
+531430912,531431423,GB
+531431424,531496959,RU
531496960,531628031,PL
531628032,531660799,TR
531660800,531693567,BA
@@ -3231,7 +3420,9 @@
532209664,532210687,DE
532210688,532211711,RU
532211712,532212223,LU
-532212224,532213759,RU
+532212224,532212479,RU
+532212480,532212735,NL
+532212736,532213759,RU
532213760,532214015,GB
532214016,532221951,RU
532221952,532223999,IT
@@ -3243,7 +3434,9 @@
532246528,532250623,BA
532250624,532283391,GB
532283392,532291583,TR
-532291584,532293631,IE
+532291584,532292351,IE
+532292352,532292607,GB
+532292608,532293631,IE
532293632,532295679,IT
532295680,532297727,KG
532297728,532303871,RU
@@ -3269,22 +3462,23 @@
532347904,532348671,GB
532348672,532348927,NL
532348928,532365311,IE
-532365312,532365567,LU
-532365568,532365823,NL
+532365312,532365823,NL
532365824,532366079,DE
532366080,532366207,NL
532366208,532366239,AR
532366240,532366271,PA
-532366272,532371455,DE
-532371456,532373503,NL
+532366272,532367359,DE
+532367360,532368383,US
+532368384,532368639,NL
+532368640,532369919,DE
+532369920,532373503,NL
532373504,532375551,RU
532375552,532377599,IT
532377600,532381695,DE
532381696,532414463,NL
532414464,532676607,IT
532676608,532692991,GE
-532692992,532700927,CZ
-532700928,532701183,SK
+532692992,532701183,CZ
532701184,532703231,GB
532703232,532705279,RU
532705280,532709375,NL
@@ -3324,9 +3518,7 @@
532805632,532807679,SE
532807680,533200895,IT
533200896,533233663,TR
-533233664,533236991,IE
-533236992,533237247,GB
-533237248,533250047,IE
+533233664,533250047,IE
533250048,533254143,RU
533254144,533256191,NL
533256192,533262335,RU
@@ -3336,7 +3528,9 @@
533331968,533397503,UA
533397504,533463039,KW
533463040,533479423,RU
-533479424,533481471,DE
+533479424,533479519,DE
+533479520,533479551,FI
+533479552,533481471,DE
533481472,533483519,NO
533483520,533485567,FR
533485568,533487615,LU
@@ -3385,9 +3579,7 @@
533895168,533897215,TR
533897216,533899263,DE
533899264,533901311,RU
-533901312,533904383,IL
-533904384,533904639,FR
-533904640,533905407,IL
+533901312,533905407,IL
533905408,533913599,RU
533913600,533915647,ES
533915648,533919743,GB
@@ -3401,8 +3593,10 @@
533970944,533987327,SE
533987328,534118399,DE
534118400,534151167,KW
-534151168,534183935,DE
-534183936,534249471,RO
+534151168,534163455,DE
+534163456,534167551,ES
+534167552,534183935,DE
+534183936,534249471,AE
534249472,534253567,GB
534253568,534257663,FR
534257664,534259711,SE
@@ -3430,7 +3624,6 @@
534372352,534374399,KW
534374400,534376447,FR
534376448,534378495,IE
-534378496,534380543,FR
534380544,534511615,AE
534511616,534512639,BZ
534512640,534512895,NL
@@ -3439,10 +3632,13 @@
534513216,534513279,VG
534513280,534513407,NL
534513408,534513663,SE
-534513664,534515455,US
-534515456,534515711,DE
+534513664,534514687,US
+534514688,534515455,DE
+534515456,534515711,SE
534515712,534515967,GB
-534515968,534517759,US
+534515968,534516735,US
+534516736,534516991,GB
+534516992,534517759,US
534517760,534518783,NL
534518784,534519039,DE
534519040,534519167,NL
@@ -3466,12 +3662,17 @@
534523136,534523391,NL
534523392,534523903,DE
534523904,534530047,US
-534530048,534544383,DE
+534530048,534538239,ES
+534538240,534540287,US
+534540288,534542335,NL
+534542336,534544383,DE
534544384,534546431,RO
534546432,534548479,DE
534548480,534550527,PL
534550528,534560767,RU
-534560768,534609919,GB
+534560768,534573823,GB
+534573824,534574079,NL
+534574080,534609919,GB
534609920,534642687,ES
534642688,534645759,CZ
534645760,534646271,PL
@@ -3533,12 +3734,18 @@
540737758,540737758,BR
540737759,540803071,BZ
540803072,540811263,US
-540811264,540814335,SG
+540811264,540814085,SG
+540814086,540814086,TH
+540814087,540814327,SG
+540814328,540814328,IN
+540814329,540814335,SG
540814336,540814591,US
540814592,540819455,SG
540819456,540820959,US
540820960,540820975,CA
-540820976,540826383,US
+540820976,540825347,US
+540825348,540825348,CA
+540825349,540826383,US
540826384,540826399,CA
540826400,543690751,US
543690752,543691007,AR
@@ -3640,15 +3847,15 @@
543881728,543883263,GB
543883264,544436771,US
544436772,544436775,CA
-544436776,586972927,US
+544436776,545858303,US
+545858304,545858559,PR
+545858560,586972927,US
586972928,586973183,CA
586973184,586977023,US
586977024,586977279,AU
586977280,587006719,US
587006720,587006975,GB
-587006976,587039487,US
-587039488,587039743,NO
-587039744,603979775,US
+587006976,603979775,US
603979776,603980799,CN
603980800,603981823,NP
603981824,604110847,CN
@@ -3723,8 +3930,7 @@
621330432,621346815,PL
621346816,621355007,RU
621355008,621357055,UA
-621357056,621360895,RU
-621360896,621361151,DE
+621357056,621361151,RU
621361152,621363199,GB
621363200,621381631,RU
621381632,621383679,FR
@@ -3749,7 +3955,9 @@
621445120,621805567,ES
621805568,621813759,NL
621813760,621821951,SA
-621821952,621823999,DE
+621821952,621823567,DE
+621823568,621823583,US
+621823584,621823999,DE
621824000,621826047,FR
621826048,621828095,RU
621830144,621838335,FI
@@ -3771,17 +3979,14 @@
621939712,621940479,RU
621940480,621942527,GB
621942528,621969407,RU
-621971456,621971711,IM
-621971712,621971967,GB
-621971968,621972223,IM
-621972224,621972479,GB
-621972480,621972991,IM
-621972992,621973503,GB
+621971456,621972991,IM
+621972992,621973247,GB
+621973248,621973503,IM
621973504,621975551,IE
621975552,621977599,RU
621977600,621981695,FR
621981696,621983743,US
-621983744,621985791,RS
+621983744,621985791,GB
621985792,621987839,US
621987840,621989887,DK
621989888,621992959,SE
@@ -3812,7 +4017,7 @@
622415872,622417919,MK
622417920,622419967,IM
622419968,622428159,UA
-622428160,622460927,RO
+622428160,622460927,GB
622460928,622477311,AZ
622477312,622479359,AL
622479360,622481407,GB
@@ -3830,18 +4035,12 @@
622510080,622512127,PL
622512128,622514175,DE
622514176,622518271,NO
-622518272,622519295,NL
-622519296,622520319,FR
+622518272,622518527,GB
+622518528,622520319,NL
622520320,622522367,RU
622522368,622524415,FR
622524416,622526463,ES
-622526464,622553087,DE
-622553088,622555135,US
-622555136,622559743,DE
-622559744,622561791,AT
-622561792,622582271,DE
-622582272,622583295,AT
-622583296,622591999,DE
+622526464,622591999,IR
622592000,622624767,OM
622624768,622626815,NO
622626816,622630911,DK
@@ -3856,7 +4055,7 @@
622868480,622870527,FR
622870528,622874623,AZ
622874624,622878719,IT
-622878720,622880767,FR
+622878720,622878975,FR
622880768,622882815,IT
622882816,622886911,IR
622886912,622919679,GR
@@ -3896,7 +4095,7 @@
623077856,623077857,WS
623077858,623077861,NZ
623077862,623083519,CH
-623083520,623116287,RO
+623083520,623116287,ES
623116288,623378431,KW
623378432,623509503,OM
623509504,623640575,RO
@@ -3922,9 +4121,9 @@
623794176,623796223,ES
623796224,623798271,GB
623798272,623800319,GE
-623800320,623801087,SE
-623801088,623801599,US
-623801600,623801855,SE
+623800320,623800831,SE
+623800832,623801087,NL
+623801088,623801855,US
623801856,623802367,NL
623802368,623802879,SE
623802880,623804148,NL
@@ -3932,7 +4131,6 @@
623804160,623804415,NL
623804416,623806463,RU
623806464,623808511,NL
-623808512,623810559,RU
623810560,623812607,ES
623812608,623820799,SE
623820800,623821823,NL
@@ -3959,7 +4157,7 @@
624029696,624033791,SE
624033792,624164863,DE
624164864,624427007,UA
-624427008,624492543,RO
+624427008,624492543,SA
624492544,624558079,UA
624558080,624562175,SK
624562176,624564223,TR
@@ -3977,35 +4175,31 @@
624575400,624575403,US
624575404,624575679,NL
624575680,624575743,US
-624575744,624575871,NL
-624575872,624575879,US
-624575880,624576031,NL
-624576032,624576039,US
-624576040,624576127,NL
+624575744,624575759,NL
+624575760,624575767,BE
+624575768,624576111,NL
+624576112,624576119,US
+624576120,624576127,NL
624576128,624576131,US
624576132,624576471,NL
624576472,624576479,US
-624576480,624576887,NL
+624576480,624576487,NL
+624576488,624576495,CA
+624576496,624576887,NL
624576888,624576895,GB
-624576896,624577135,NL
-624577136,624577139,GB
-624577140,624577151,NL
+624576896,624577151,NL
624577152,624577215,GB
624577216,624577307,NL
624577308,624577311,US
624577312,624577483,NL
624577484,624577487,US
-624577488,624577863,NL
-624577864,624577871,DK
-624577872,624578415,NL
-624578416,624578423,US
-624578424,624578719,NL
-624578720,624578723,GB
-624578724,624578887,NL
+624577488,624578887,NL
624578888,624578895,US
624578896,624578951,NL
624578952,624578955,US
-624578956,624579075,NL
+624578956,624579039,NL
+624579040,624579047,US
+624579048,624579075,NL
624579076,624579079,US
624579080,624579423,NL
624579424,624579455,US
@@ -4023,9 +4217,7 @@
624581072,624581087,US
624581088,624581135,NL
624581136,624581139,US
-624581140,624581199,NL
-624581200,624581207,GB
-624581208,624581599,NL
+624581140,624581599,NL
624581600,624581631,US
624581632,624582123,NL
624582124,624582127,US
@@ -4035,7 +4227,11 @@
624582288,624582295,US
624582296,624582399,NL
624582400,624582403,US
-624582404,624584111,NL
+624582404,624582759,NL
+624582760,624582767,GB
+624582768,624583239,NL
+624583240,624583247,GB
+624583248,624584111,NL
624584112,624584119,US
624584120,624584159,NL
624584160,624584175,US
@@ -4043,13 +4239,17 @@
624584384,624584391,US
624584392,624584415,NL
624584416,624584423,US
-624584424,624586279,NL
+624584424,624586183,NL
+624586184,624586191,US
+624586192,624586279,NL
624586280,624586287,US
-624586288,624587583,NL
+624586288,624586479,NL
+624586480,624586487,DE
+624586488,624587111,NL
+624587112,624587119,US
+624587120,624587583,NL
624587584,624587599,US
-624587600,624587871,NL
-624587872,624587903,US
-624587904,624588383,NL
+624587600,624588383,NL
624588384,624588391,US
624588392,624588399,GB
624588400,624588927,NL
@@ -4058,14 +4258,16 @@
624589160,624589167,IT
624589168,624589199,NL
624589200,624589215,KE
-624589216,624589223,NL
-624589224,624589231,US
-624589232,624589719,NL
+624589216,624589719,NL
624589720,624589727,US
-624589728,624589967,NL
+624589728,624589783,NL
+624589784,624589791,US
+624589792,624589967,NL
624589968,624589975,US
624589976,624590847,NL
-624590848,624640527,FR
+624590848,624625848,FR
+624625849,624625849,CA
+624625850,624640527,FR
624640528,624640543,GB
624640544,624640759,FR
624640760,624640767,NL
@@ -4075,7 +4277,9 @@
624643020,624643023,IT
624643024,624645147,FR
624645148,624645151,IT
-624645152,624646343,FR
+624645152,624646239,FR
+624646240,624646255,DE
+624646256,624646343,FR
624646344,624646347,NL
624646348,624646583,FR
624646584,624646591,NL
@@ -4083,7 +4287,13 @@
624647172,624647183,ES
624647184,624648139,FR
624648140,624648143,ES
-624648144,624657711,FR
+624648144,624653311,FR
+624653312,624653823,GB
+624653824,624656975,FR
+624656976,624656979,PT
+624656980,624657607,FR
+624657608,624657615,BE
+624657616,624657711,FR
624657712,624657715,ES
624657716,624657883,FR
624657884,624657887,ES
@@ -4091,9 +4301,13 @@
624658324,624658327,IE
624658328,624658479,FR
624658480,624658483,DE
-624658484,624659031,FR
+624658484,624658495,FR
+624658496,624658527,IT
+624658528,624659031,FR
624659032,624659039,IT
-624659040,624660827,FR
+624659040,624659071,FR
+624659072,624659135,ES
+624659136,624660827,FR
624660828,624660831,ES
624660832,624661247,FR
624661248,624661251,ES
@@ -4117,13 +4331,19 @@
624665952,624665955,NL
624665956,624667471,FR
624667472,624667475,IT
-624667476,624668063,FR
+624667476,624667599,FR
+624667600,624667603,IT
+624667604,624668063,FR
624668064,624668079,BE
624668080,624668639,FR
624668640,624668643,NL
-624668644,624669795,FR
+624668644,624669011,FR
+624669012,624669015,DE
+624669016,624669795,FR
624669796,624669799,ES
-624669800,624671455,FR
+624669800,624670915,FR
+624670916,624670919,ES
+624670920,624671455,FR
624671456,624671471,ES
624671472,624672547,FR
624672548,624672551,ES
@@ -4167,19 +4387,27 @@
624679680,624679687,NL
624679688,624679843,FR
624679844,624679847,ES
-624679848,624680931,FR
+624679848,624680839,FR
+624680840,624680847,NL
+624680848,624680931,FR
624680932,624680935,NL
624680936,624681351,FR
624681352,624681359,NL
624681360,624681807,FR
624681808,624681823,BE
-624681824,624683775,FR
+624681824,624682495,FR
+624682496,624682527,ES
+624682528,624683295,FR
+624683296,624683311,DE
+624683312,624683775,FR
624683776,624683779,DE
624683780,624683783,FR
624683784,624683787,DE
624683788,624683975,FR
624683976,624683983,GB
-624683984,624684183,FR
+624683984,624684043,FR
+624684044,624684047,PT
+624684048,624684183,FR
624684184,624684191,IT
624684192,624684199,FR
624684200,624684203,IT
@@ -4187,7 +4415,9 @@
624684208,624684211,ES
624684212,624684799,FR
624684800,624684803,DE
-624684804,624685711,FR
+624684804,624685535,FR
+624685536,624685539,PT
+624685540,624685711,FR
624685712,624685715,ES
624685716,624685799,FR
624685800,624685803,ES
@@ -4244,7 +4474,7 @@
624738304,624740351,NL
624740352,624742399,DE
624742400,624746495,RU
-624746496,624754687,RO
+624746496,624754687,BG
624754688,624787455,AZ
624787456,624791551,DE
624791552,624795647,ES
@@ -4252,7 +4482,7 @@
624799744,624801791,RU
624801792,624803839,AT
624803840,624812031,DE
-624812032,624813055,BO
+624812032,624813055,US
624813056,624814079,IL
624814080,624816127,GB
624816128,624818175,FR
@@ -4271,7 +4501,8 @@
625506304,625508351,PL
625508352,625512447,AZ
625512448,625514495,DE
-625514496,625515263,GB
+625514496,625514751,GG
+625514752,625515263,GB
625515264,625516031,GG
625516032,625516543,GB
625516544,625518591,BE
@@ -4284,9 +4515,7 @@
625524480,625524735,SE
625524736,625541119,FR
625541120,625606655,UA
-625606656,625621667,NL
-625621668,625621671,DE
-625621672,625672191,NL
+625606656,625672191,NL
625672192,625674239,RU
625674240,625676287,TR
625676288,625680383,MD
@@ -4331,8 +4560,9 @@
625860608,625868799,CZ
625868800,625999871,RU
625999872,627048447,DE
-627048448,627113983,DK
-627113984,627145727,RO
+627048448,627130367,DK
+627130368,627142655,FR
+627142656,627145727,RO
627145728,627146751,ES
627146752,627179519,NL
627179520,627212287,IR
@@ -4344,6 +4574,7 @@
627230720,627232767,IR
627232768,627236863,PL
627236864,627238911,IQ
+627240804,627240804,US
627240960,627245055,RU
627245056,627277823,KZ
627277824,627294207,SA
@@ -4371,8 +4602,7 @@
628246528,628248575,MT
628248576,628250623,FI
628250624,628252671,NL
-628252672,628259071,DE
-628259072,628260863,SC
+628252672,628260863,DE
628260864,628277247,AZ
628277248,628293631,IR
628293632,628359167,UA
@@ -4391,7 +4621,6 @@
628801536,628803583,GB
628803584,628805631,FR
628805632,628807679,GB
-628807680,628809727,AE
628809728,628813823,TR
628813824,628815871,DK
628815872,628817919,GB
@@ -4429,8 +4658,7 @@
629196800,629198847,AZ
629198848,629202943,DK
629202944,629207039,RO
-629207040,629211135,IR
-629211136,629276671,RO
+629207040,629276671,IR
629276672,629293055,PL
629293056,629309439,TR
629309440,629313535,DE
@@ -4460,9 +4688,7 @@
629866496,629874687,NL
629874688,629879807,RU
629879808,629880063,DE
-629880064,629880831,RU
-629880832,629881855,EE
-629881856,629882879,DE
+629880064,629882879,RU
629882880,629883135,GB
629883136,629883391,AU
629883904,629884159,AU
@@ -4483,7 +4709,9 @@
629985280,629987327,TR
629987328,629989375,SE
629989376,629991423,FR
-629991424,629993471,NL
+629991424,629991935,US
+629991936,629992447,NL
+629992448,629993471,US
629993472,629997567,JO
629997568,630063103,SA
630063104,630128639,IL
@@ -4545,21 +4773,36 @@
630806528,630808575,ES
630808576,630810623,NL
630810624,630816767,CH
-630816768,630833151,RO
+630816768,630818303,RO
+630818304,630818559,SG
+630818560,630829055,RO
+630829056,630833151,IR
630833152,630849535,NL
630849536,630980607,TR
630980608,630981631,MD
-630981632,630982655,RO
+630981632,630982143,RO
+630982144,630982399,SG
+630982400,630982655,RO
630982656,630984703,MD
-630984704,630998271,RO
+630984704,630988799,IR
+630988800,630992895,RO
+630992896,630996991,IR
+630996992,630998271,RO
630998272,630998783,MD
630998784,631001087,RO
631001088,631005183,MD
-631005184,631006207,RO
+631005184,631006207,IT
631006208,631007231,MD
631007232,631017471,RO
631017472,631018495,MD
-631018496,631039999,RO
+631018496,631019519,IT
+631019520,631021567,IR
+631021568,631023615,RO
+631023616,631024639,IT
+631024640,631029759,RO
+631029760,631033855,SE
+631033856,631034879,IT
+631034880,631039999,RO
631040000,631043071,MD
631043072,631044095,RO
631044096,631045119,MD
@@ -4592,7 +4835,9 @@
632946688,632963071,AT
632963072,632979455,AM
632979456,633012223,IT
-633012224,633063679,FR
+633012224,633059983,FR
+633059984,633059987,GB
+633059988,633063679,FR
633063680,633063935,PL
633063936,633064191,FR
633064192,633064447,GB
@@ -4655,9 +4900,7 @@
634124288,634126335,CH
634126336,634191871,RU
634191872,634193919,TR
-634193920,634194687,SK
-634194688,634194815,CZ
-634194816,634195967,SK
+634193920,634195967,CZ
634195968,634198015,RU
634198016,634200063,BA
634200064,634202111,IS
@@ -4713,15 +4956,11 @@
635195392,635197439,RU
635197440,635199591,GB
635199592,635199599,IT
-635199600,635199647,GB
-635199648,635199655,IT
-635199656,635199775,GB
+635199600,635199775,GB
635199776,635199783,IT
635199784,635200167,GB
635200168,635200175,IT
-635200176,635200199,GB
-635200200,635200207,IT
-635200208,635200263,GB
+635200176,635200263,GB
635200264,635200271,IT
635200272,635200335,GB
635200336,635200343,IT
@@ -4737,15 +4976,13 @@
635200960,635200967,IT
635200968,635200991,GB
635200992,635200999,IT
-635201000,635201023,GB
-635201024,635201031,IT
-635201032,635201087,GB
+635201000,635201087,GB
635201088,635201095,IT
635201096,635201159,GB
635201160,635201167,IT
-635201168,635201255,GB
-635201256,635201263,IT
-635201264,635201455,GB
+635201168,635201407,GB
+635201408,635201415,IT
+635201416,635201455,GB
635201456,635201463,IT
635201464,635203583,GB
635203584,635207679,JO
@@ -4760,7 +4997,9 @@
635281408,635283455,RO
635283456,635283967,DE
635283968,635284223,RO
-635284224,635284479,DE
+635284224,635284418,DE
+635284419,635284419,RO
+635284420,635284479,DE
635284480,635284991,RO
635284992,635285503,US
635285504,635287551,ME
@@ -4773,7 +5012,7 @@
635299840,635301887,ES
635301888,635305983,CZ
635305984,635437055,NL
-635437056,635502591,RO
+635437056,635502591,SA
635502592,635568127,PL
635568128,635699199,IT
635699200,635715583,PL
@@ -4793,9 +5032,7 @@
635856896,635858943,TR
635858944,635860991,RU
635860992,635863039,BE
-635863040,635889663,RU
-635889664,635891711,NG
-635891712,635895807,RU
+635863040,635895807,RU
635895808,635961343,KW
635961344,635994111,GE
635994112,636026879,RU
@@ -4825,7 +5062,11 @@
636176384,636178431,TR
636178432,636180479,NL
636180480,636182527,FR
-636182528,636186623,CZ
+636182528,636185087,CZ
+636185088,636185343,SE
+636185344,636186111,US
+636186112,636186367,FR
+636186368,636186623,ES
636186624,636188671,NL
636188672,636190719,GB
636190720,636223487,RU
@@ -4843,8 +5084,7 @@
636966656,636966911,IT
636966912,636967167,DE
636967168,636967935,FR
-636967936,636968191,IT
-636968192,636968447,ES
+636967936,636968447,DE
636968448,636968703,BE
636968704,636968959,DE
636968960,636974079,TR
@@ -4898,15 +5138,11 @@
637337088,637337599,RU
637337600,637403135,NO
637403136,637534207,IR
-637534208,641736959,US
-641736960,641737215,CA
-641737216,641737471,US
-641737472,641737727,CA
-641737728,641761535,US
+637534208,641761535,US
641761536,641761791,CA
641761792,641763071,US
-641763072,641763583,CA
-641763584,641765375,US
+641763072,641763327,CA
+641763328,641765375,US
641765376,641765887,CA
641765888,641766399,US
641766400,641767423,CA
@@ -4915,92 +5151,104 @@
641768960,641769727,US
641769728,641769983,CA
641769984,641771519,US
-641771520,641771775,CA
-641771776,641773055,US
+641771520,641772287,CA
+641772288,641773055,US
641773056,641773311,CA
-641773312,642093055,US
-642093056,642094591,CA
-642094592,642388479,US
+641773312,641828351,US
+641828352,641828607,MX
+641828608,641829057,US
+641829058,641829058,MX
+641829059,642089215,US
+642089216,642089471,CA
+642089472,642093055,US
+642093056,642093311,CA
+642093312,642093567,US
+642093568,642094079,CA
+642094080,642094335,US
+642094336,642094591,CA
+642094592,642387967,US
+642387968,642388223,CA
+642388224,642388479,US
642388480,642388735,CA
642388736,642793471,US
642793472,642793983,CA
-642793984,642925055,US
-642925056,642925311,MX
-642925312,642926335,US
+642793984,642926335,US
642926336,642926591,MX
642926592,643219519,US
643219520,643219523,CA
643219524,643219526,US
643219527,643219527,CA
-643219528,643240447,US
-643240448,643240703,CA
-643240704,643242495,US
-643242496,643242751,CA
-643242752,643295231,US
+643219528,643295231,US
643295232,643295487,PR
643295488,643295743,US
-643295744,643296127,PR
-643296128,643296767,US
+643295744,643296383,PR
+643296384,643296767,US
643296768,643297023,PR
643297024,643302911,US
643302912,643303167,CA
643303168,643317759,US
643317760,643318015,CA
-643318016,643346431,US
-643346432,643346687,CA
-643346688,643351551,US
-643351552,643351807,GB
-643351808,644055039,US
-644055040,644055807,CA
-644055808,644056063,US
+643318016,643318271,US
+643318272,643318527,CA
+643318528,643318847,US
+643318848,643318911,CA
+643318912,643346431,US
+643346432,643346943,CA
+643346944,644055039,US
+644055040,644055295,CA
+644055296,644056063,US
644056064,644056319,CA
644056320,644056575,US
644056576,644056831,CA
-644056832,644057087,US
-644057088,644057599,CA
-644057600,644058111,US
-644058112,644058879,CA
-644058880,644059391,US
-644059392,644059647,CA
-644059648,644060927,US
-644060928,644061183,CA
-644061184,644063231,US
-644063232,644063743,CA
-644063744,644064511,US
+644056832,644057343,US
+644057344,644057599,CA
+644057600,644058367,US
+644058368,644058879,CA
+644058880,644060671,US
+644060672,644060927,CA
+644060928,644060989,US
+644060990,644060990,CA
+644060991,644061439,US
+644061440,644061631,CA
+644061632,644061663,US
+644061664,644061695,CA
+644061696,644063231,US
+644063232,644063487,CA
+644063488,644064511,US
644064512,644064767,CA
644064768,644065055,US
644065056,644065279,CA
-644065280,644067071,US
-644067072,644067327,CA
-644067328,644069631,US
-644069632,644070143,CA
-644070144,644084479,US
-644084480,644084735,GU
-644084736,644248831,US
-644248832,644249087,CA
-644249088,644323391,US
+644065280,644067327,US
+644067328,644067583,CA
+644067584,644069631,US
+644069632,644069887,CA
+644069888,644070143,US
+644070144,644070399,CA
+644070400,644082687,US
+644082688,644082943,PR
+644082944,644268543,US
+644268544,644268569,CA
+644268570,644268570,US
+644268571,644268613,CA
+644268614,644268614,US
+644268615,644268799,CA
+644268800,644323391,US
644323392,644323407,CA
-644323408,644323583,US
-644323584,644323839,CA
-644323840,644389631,US
-644389632,644390911,CA
-644390912,644403199,US
+644323408,644389887,US
+644389888,644390399,CA
+644390400,644403199,US
644403200,644403455,CA
-644403456,644408063,US
-644408064,644408319,CA
-644408320,644414207,US
+644403456,644414207,US
644414208,644414463,CA
644414464,644422911,US
644422912,644423423,JP
644423424,644569087,US
644569088,644569343,PR
644569344,644570111,US
-644570112,644570175,PR
-644570176,644570623,US
-644570624,644571135,PR
-644571136,644582143,US
-644582144,644582399,CA
-644582400,644628735,US
+644570112,644570367,PR
+644570368,644570879,US
+644570880,644571135,PR
+644571136,644628735,US
644628736,644628991,CA
644628992,644634367,US
644634368,644634623,CA
@@ -5008,71 +5256,47 @@
644718848,644719103,CA
644719104,644760575,US
644760576,644760831,CA
-644760832,644761343,US
-644761344,644761599,CA
-644761600,644762879,US
-644762880,644763135,CA
-644763136,644765439,US
+644760832,644761439,US
+644761440,644761455,CA
+644761456,644763903,US
+644763904,644764159,CA
+644764160,644765439,US
644765440,644765695,CA
-644765696,644767878,US
-644767879,644767879,CA
-644767880,644767999,US
-644768000,644768255,CA
-644768256,644833535,US
-644833536,644833791,CA
-644833792,644834047,US
-644834048,644834303,CA
-644834304,644834815,US
+644765696,644767743,US
+644767744,644768767,CA
+644768768,644834815,US
644834816,644835327,CA
644835328,644836351,US
644836352,644836607,CA
644836608,644838655,US
-644838656,644840447,CA
-644840448,644840703,US
-644840704,644841215,CA
-644841216,644897791,US
-644897792,644898047,CA
-644898048,644898815,US
+644838656,644840959,CA
+644840960,644898815,US
644898816,644899071,CA
644899072,644899839,US
644899840,644900095,CA
644900096,644901631,US
644901632,644901887,CA
-644901888,644982271,US
-644982272,644982527,CA
-644982528,644986111,US
-644986112,644986367,CA
-644986368,644987135,US
-644987136,644987391,CA
-644987392,645185535,US
+644901888,644981759,US
+644981760,644982015,CA
+644982016,645185535,US
645185536,645185791,CA
-645185792,645188095,US
-645188096,645188351,CA
-645188352,645221631,US
+645185792,645187071,US
+645187072,645187583,CA
+645187584,645221631,US
645221632,645222399,CA
-645222400,645223423,US
-645223424,645223679,CA
-645223680,645225471,US
+645222400,645225471,US
645225472,645225727,CA
645225728,645227519,US
645227520,645228287,CA
-645228288,645229311,US
-645229312,645229567,CA
-645229568,645482495,US
-645482496,645482751,CA
-645482752,645525759,US
-645525760,645526271,CA
-645526272,645526783,US
+645228288,645482511,US
+645482512,645482519,CA
+645482520,645526783,US
645526784,645527039,CA
-645527040,645527551,US
-645527552,645527807,CA
-645527808,645528063,US
-645528064,645529343,CA
-645529344,645540351,US
+645527040,645527807,US
+645527808,645528319,CA
+645528320,645540351,US
645540352,645540607,CA
-645540608,645547007,US
-645547008,645547263,CA
-645547264,645576703,US
+645540608,645576703,US
645576704,645576997,CA
645576998,645576998,US
645576999,645577215,CA
@@ -5083,16 +5307,18 @@
645645056,645646591,US
645646592,645646847,MX
645646848,645704447,US
-645704448,645704703,MX
-645704704,645705215,US
+645704448,645704959,MX
+645704960,645705215,US
645705216,645705471,MX
645705472,645737983,US
645737984,645738239,PR
645738240,645873663,US
-645873664,645874175,CA
-645874176,645875711,US
-645875712,645876735,CA
-645876736,645989450,US
+645873664,645874431,CA
+645874432,645875967,US
+645875968,645876735,CA
+645876736,645984255,US
+645984256,645988351,CA
+645988352,645989450,US
645989451,645989451,CA
645989452,654311423,US
654311424,654311679,CN
@@ -5105,7 +5331,9 @@
655360000,656408575,KR
656408576,658505727,PK
658505728,660602879,CN
-660602880,661651455,HK
+660602880,661487615,HK
+661487616,661520383,SG
+661520384,661651455,JP
661651456,662700031,KR
662700032,666894335,CN
666894336,671088639,ID
@@ -5136,7 +5364,9 @@
692207616,692240383,ZA
692240384,692256767,GH
692256768,692260863,SD
-692260864,692261887,UG
+692260864,692260865,UG
+692260866,692260866,SD
+692260867,692261887,UG
692261888,692273151,SD
692273152,692289535,EG
692289536,692305919,NG
@@ -5147,10 +5377,14 @@
692518912,692551679,ZA
692551680,692584447,NG
692584448,692600831,AO
-692600832,692609023,EG
+692600832,692608255,EG
+692608256,692608767,AO
+692608768,692609023,EG
692609024,692617215,ZM
692617216,692625407,ZA
-692625408,692641791,KE
+692625408,692626687,KE
+692626688,692626943,AO
+692626944,692641791,KE
692641792,692649983,GA
692649984,692658175,NG
692658176,692666367,ZA
@@ -5233,7 +5467,7 @@
692946944,692948991,EG
692948992,692951039,ZM
692951040,692953087,ZA
-692953088,692955135,RW
+692953088,692954111,RW
692955136,692957183,NG
692957184,692959231,DZ
692959232,692961279,GN
@@ -5382,7 +5616,9 @@
693567488,693575679,MW
693575680,693583871,KE
693583872,693592063,NG
-693592064,693600255,MU
+693592064,693594367,MU
+693594368,693594623,KE
+693594624,693600255,MU
693600256,693608447,MA
693608448,693616639,BW
693616640,693633023,ZA
@@ -5465,8 +5701,8 @@
700340224,700341247,GH
700341248,700342271,MW
700342272,700350463,NA
-700350464,700351231,MU
-700351232,700352511,UG
+700350464,700351487,MU
+700351488,700352511,UG
700352512,700358655,MU
700358656,700366847,MZ
700366848,700375039,UG
@@ -5515,9 +5751,7 @@
700776448,700841983,RW
700841984,700846079,MU
700846080,700850175,NA
-700850176,700851455,MU
-700851456,700851711,ZA
-700851712,700854271,MU
+700850176,700854271,MU
700854272,700855295,NA
700855296,700866559,MU
700866560,700866815,NG
@@ -5561,9 +5795,7 @@
701308928,701317119,AO
701317120,701325311,CM
701325312,701333503,EG
-701333504,701338111,NA
-701338112,701338367,ZM
-701338368,701341695,NA
+701333504,701341695,NA
701341696,701349887,NG
701349888,701358079,MA
701358080,701366271,SL
@@ -5599,9 +5831,7 @@
701495296,701496319,NG
701496320,701497343,GH
701497344,701513727,ZA
-701513728,701523711,LY
-701523712,701523967,CA
-701523968,701530111,LY
+701513728,701530111,LY
701530112,701546495,SN
701546496,701562879,ZA
701562880,701579263,KE
@@ -5625,7 +5855,9 @@
701890560,701923327,SN
701923328,701956095,MA
701956096,701992959,KE
-701992960,701997055,SZ
+701992960,701994495,SZ
+701994496,701994751,ZA
+701994752,701997055,SZ
701997056,702001151,GH
702001152,702005247,ZM
702005248,702009343,KE
@@ -5635,7 +5867,9 @@
702017536,702018559,EG
702018560,702019583,NG
702019584,702020607,RW
-702020608,702021631,CD
+702020608,702021119,CD
+702021120,702021375,ZA
+702021376,702021631,CD
702021632,702029823,ZM
702029824,702038015,BJ
702038016,702046207,ZM
@@ -5804,134 +6038,23 @@
702542848,702543871,ZA
702543872,702544895,BJ
702544896,702545919,ZA
-702545920,702721791,TN
-702721792,702722047,GP
-702722048,702729215,TN
-702729216,702729471,GP
-702729472,703070207,TN
+702545920,703070207,TN
703070208,703594495,EG
-703594496,703595775,SD
-703595776,703596031,ZA
-703596032,703600383,SD
-703600384,703600639,ZA
-703600640,703601151,SD
-703601152,703601407,ZA
-703601408,703603455,SD
-703603456,703603711,ZA
-703603712,703604991,SD
-703604992,703605247,ZA
-703605248,703609087,SD
-703609088,703609343,ZA
-703609344,703613695,SD
-703613696,703613951,ZA
-703613952,703618559,SD
-703618560,703619071,ZA
-703619072,703619839,SD
-703619840,703620095,ZA
-703620096,703621887,SD
-703621888,703622143,ZA
-703622144,703622655,SD
-703622656,703622911,ZA
-703622912,703625215,SD
-703625216,703625471,ZA
-703625472,703627263,SD
-703627264,703627519,ZA
-703627520,703631871,SD
-703631872,703632127,ZA
-703632128,703633151,SD
-703633152,703633407,ZA
-703633408,703638271,SD
-703638272,703638527,ZA
-703638528,703639551,SD
-703639552,703639807,ZA
-703639808,703642367,SD
-703642368,703642623,ZA
-703642624,703643903,SD
-703643904,703644415,ZA
-703644416,703645439,SD
-703645440,703645695,ZA
-703645696,703646719,SD
-703646720,703647231,ZA
-703647232,703648767,SD
-703648768,703649023,ZA
-703649024,703649279,SD
-703649280,703650047,ZA
-703650048,703650815,SD
-703650816,703651071,ZA
-703651072,703665663,SD
-703665664,703665919,ZA
-703665920,703678463,SD
-703678464,703678719,ZA
-703678720,703682559,SD
-703682560,703682815,ZA
-703682816,703685119,SD
-703685120,703685631,ZA
-703685632,703685887,SD
-703685888,703686143,ZA
-703686144,703688447,SD
-703688448,703688703,ZA
-703688704,703689215,SD
-703689216,703689471,ZA
-703689472,703689727,SD
-703689728,703689983,ZA
-703689984,703690239,SD
-703690240,703690751,ZA
-703690752,703696127,SD
-703696128,703696383,ZA
-703696384,703696895,SD
-703696896,703697151,ZA
-703697152,703699199,SD
-703699200,703699455,ZA
-703699456,703702527,SD
-703702528,703703039,ZA
-703703040,703705599,SD
-703705600,703705855,ZA
-703705856,703706111,SD
-703706112,703706367,ZA
-703706368,703709695,SD
-703709696,703709951,ZA
-703709952,703710719,SD
-703710720,703710975,ZA
-703710976,703711487,SD
-703711488,703711743,ZA
-703711744,703713791,SD
-703713792,703714047,ZA
-703714048,703714303,SD
-703714304,703714559,ZA
-703714560,703724031,SD
-703724032,703724287,ZA
-703724288,703724543,SD
-703724544,703724799,ZA
-703724800,703725567,SD
-703725568,703725589,ZA
-703725590,703725590,KE
-703725591,703726591,ZA
-703726592,703727615,KE
-703727616,703728383,TZ
-703728384,703728639,ZA
+703594496,703725567,SD
+703725568,703727615,KE
+703727616,703728639,TZ
703728640,703733759,LY
-703733760,703734527,CM
-703734528,703734783,ZA
-703734784,703735807,CM
+703733760,703735807,CI
703735808,703737855,ZA
703737856,703746047,NG
703746048,703747071,ZA
703747072,703748095,CD
-703748096,703748351,ZA
-703748352,703749119,GN
+703748096,703749119,GN
703749120,703750143,NG
-703750144,703750655,ZA
-703750656,703750911,MG
-703750912,703751167,ZA
-703751168,703751679,MG
-703751680,703751935,ZA
-703751936,703752447,MG
-703752448,703752703,ZA
-703752704,703753215,MG
-703753216,703753471,ZA
-703753472,703754239,MG
+703750144,703754239,MG
703754240,703755263,GH
-703755264,703755899,ZA
+703755264,703755519,YT
+703755520,703755899,ZA
703755900,703755900,YT
703755901,703757311,ZA
703757312,703758335,RE
@@ -5939,125 +6062,8 @@
703759360,703760383,ZA
703760384,703761407,GH
703761408,703791103,ZA
-703791104,703791359,CD
-703791360,703791871,ZA
-703791872,703792895,CD
-703792896,703793151,ZA
-703793152,703794175,CD
-703794176,703794687,ZA
-703794688,703795199,CD
-703795200,703795455,ZA
-703795456,703798527,CD
-703798528,703799039,ZA
-703799040,703799807,CD
-703799808,703800063,ZA
-703800064,703800575,CD
-703800576,703800831,ZA
-703800832,703801855,CD
-703801856,703802111,ZA
-703802112,703804159,CD
-703804160,703804415,ZA
-703804416,703806719,CD
-703806720,703806975,ZA
-703806976,703809023,CD
-703809024,703809279,ZA
-703809280,703810559,CD
-703810560,703810815,ZA
-703810816,703811839,CD
-703811840,703812351,ZA
-703812352,703813119,CD
-703813120,703813375,ZA
-703813376,703817471,CD
-703817472,703817727,ZA
-703817728,703817983,CD
-703817984,703818239,ZA
-703818240,703822335,CD
-703822336,703822591,ZA
-703822592,703825407,CD
-703825408,703825663,ZA
-703825664,703827967,CD
-703827968,703828223,ZA
-703828224,703831295,CD
-703831296,703831551,ZA
-703831552,703832319,CD
-703832320,703832575,ZA
-703832576,703838207,CD
-703838208,703838463,ZA
-703838464,703838719,CD
-703838720,703838975,ZA
-703838976,703839743,CD
-703839744,703839999,ZA
-703840000,703841279,CD
-703841280,703841535,ZA
-703841536,703842559,CD
-703842560,703842815,ZA
-703842816,703845375,CD
-703845376,703845631,ZA
-703845632,703846911,CD
-703846912,703847167,ZA
-703847168,703847423,CD
-703847424,703847679,ZA
-703847680,703849215,CD
-703849216,703849471,ZA
-703849472,703856639,CD
-703856640,703856895,ZA
-703856896,703857919,CM
-703857920,703858431,ZA
-703858432,703858943,CM
-703858944,703859199,ZA
-703859200,703864063,CM
-703864064,703864319,ZA
-703864320,703864575,CM
-703864576,703865855,ZA
-703865856,703866623,CM
-703866624,703867135,ZA
-703867136,703867391,CM
-703867392,703867647,ZA
-703867648,703869439,CM
-703869440,703869951,ZA
-703869952,703870975,CM
-703870976,703871487,ZA
-703871488,703871743,CM
-703871744,703871999,ZA
-703872000,703876607,CM
-703876608,703876863,ZA
-703876864,703884287,CM
-703884288,703884799,ZA
-703884800,703885055,CM
-703885056,703885311,ZA
-703885312,703886079,CM
-703886080,703886335,ZA
-703886336,703888639,CM
-703888640,703888895,ZA
-703888896,703889151,CM
-703889152,703889407,ZA
-703889408,703889663,CM
-703889664,703890175,ZA
-703890176,703891455,CM
-703891456,703892223,ZA
-703892224,703897343,CM
-703897344,703897599,ZA
-703897600,703901183,CM
-703901184,703901695,ZA
-703901696,703902975,CM
-703902976,703903231,ZA
-703903232,703903487,CM
-703903488,703903743,ZA
-703903744,703905535,CM
-703905536,703905791,ZA
-703905792,703912447,CM
-703912448,703912703,ZA
-703912704,703912959,CM
-703912960,703913215,ZA
-703913216,703913727,CM
-703913728,703913983,ZA
-703913984,703914239,CM
-703914240,703914495,ZA
-703914496,703914751,CM
-703914752,703915519,ZA
-703915520,703919359,CM
-703919360,703919615,ZA
-703919616,703922175,CM
+703791104,703856639,CD
+703856640,703922175,CM
703922176,704118783,ZA
704118784,704380927,MA
704380928,704643071,LY
@@ -6102,7 +6108,9 @@
711166464,711166591,HK
711166592,711169311,JP
711169312,711169327,IN
-711169328,711196671,JP
+711169328,711173119,JP
+711173120,711173375,SG
+711173376,711196671,JP
711196672,711458815,CN
711458816,711983103,IN
711983104,712507391,VN
@@ -6126,38 +6134,723 @@
717881344,720437247,CN
720437248,720502783,AU
720502784,721420287,CN
-721420288,737479679,JP
+721420288,736100351,JP
+736100352,736101375,IN
+736101376,736102399,HK
+736102400,736103423,IN
+736103424,736104447,CN
+736104448,736105471,ID
+736105472,736106495,TW
+736106496,736107519,CN
+736107520,736108543,HK
+736108544,736109567,JP
+736109568,736110591,LA
+736110592,736111615,MM
+736111616,736112639,CN
+736112640,736113663,HK
+736113664,736115711,CN
+736115712,736116735,AU
+736116736,736119807,CN
+736119808,736120831,AU
+736120832,736121855,CN
+736121856,736122879,MM
+736122880,736123903,MY
+736123904,736124927,HK
+736124928,736125951,IN
+736125952,736126975,CN
+736126976,736127999,KR
+736128000,736131071,BD
+736131072,736132095,NZ
+736132096,736133119,LK
+736133120,736136191,IN
+736136192,736138239,CN
+736138240,736139263,HK
+736139264,736140287,SG
+736140288,736141311,IN
+736141312,736142335,CN
+736142336,736143359,IN
+736143360,736144383,ID
+736144384,736145407,IN
+736145408,736146431,CN
+736146432,736147455,IN
+736147456,736148479,CN
+736148480,736149503,NZ
+736149504,736150527,NC
+736150528,736151551,HK
+736151552,736156671,CN
+736156672,736157695,IN
+736157696,736158719,CN
+736158720,736160767,HK
+736160768,736161791,PK
+736161792,736162815,CN
+736162816,736163839,HK
+736163840,736164351,TW
+736164352,736164863,NZ
+736164864,736166911,IN
+736166912,736167935,SG
+736167936,736168959,HK
+736168960,736169983,AU
+736169984,736173055,IN
+736173056,736174079,HK
+736174080,736175103,AU
+736175104,736176127,MY
+736176128,736177151,BN
+736177152,736178175,HK
+736178176,736179199,AU
+736179200,736180223,IN
+736180224,736181247,HK
+736181248,736182271,AU
+736182272,736183295,ID
+736183296,736185343,IN
+736185344,736186367,CN
+736186368,736187391,IN
+736187392,736188415,CN
+736188416,736189439,JP
+736189440,736190463,IN
+736190464,736191487,PK
+736191488,736193535,HK
+736193536,736194559,MY
+736194560,736195583,AU
+736195584,736196607,IN
+736196608,736198655,CN
+736198656,736199679,AU
+736199680,736200703,HK
+736200704,736201727,BN
+736201728,736202751,CN
+736202752,736203775,AU
+736203776,736204799,BD
+736204800,736205823,SG
+736205824,736206847,JP
+736206848,736209919,IN
+736209920,736210943,CN
+736210944,736211967,AU
+736211968,736214015,CN
+736214016,736216063,IN
+736216064,736217087,HK
+736217088,736218111,NZ
+736218112,736219135,BD
+736219136,736220159,CN
+736220160,736221183,IN
+736221184,736229375,CN
+736229376,736230399,IN
+736230400,736231423,CN
+736231424,736231935,AU
+736232448,736233471,HK
+736233472,736234495,NZ
+736234496,736235519,KH
+736235520,736237567,HK
+736237568,736239615,IN
+736239616,736263167,CN
+736263168,736264191,HK
+736264192,736286719,CN
+736286720,736287743,NZ
+736287744,736288767,MV
+736288768,736289791,MY
+736289792,736290815,HK
+736290816,736291839,TW
+736291840,736300031,CN
+736300032,736301055,HK
+736301056,736303103,IN
+736303104,736304127,TW
+736304128,736324607,CN
+736324608,736325631,AU
+736325632,736326655,HK
+736326656,736328703,KR
+736328704,736329727,AU
+736329728,736331775,IN
+736331776,736334847,CN
+736334848,736335871,ID
+736335872,736344063,CN
+736344064,736345087,IN
+736345088,736354303,CN
+736354304,736355327,IN
+736355328,736356351,SG
+736356352,736357375,CN
+736357376,736358399,HK
+736358400,736359423,SG
+736359424,736360447,IN
+736360448,736380927,CN
+736380928,736381951,IN
+736381952,736382975,CN
+736382976,736383999,TH
+736384000,736385023,LA
+736385024,736386047,HK
+736386048,736388095,IN
+736388096,736389119,CN
+736389120,736390143,JP
+736390144,736391167,LK
+736391168,736392191,IN
+736392192,736394239,CN
+736394240,736395263,HK
+736395264,736396287,MN
+736396288,736398335,CN
+736398336,736400383,IN
+736400384,736402431,CN
+736402432,736403455,PK
+736403456,736404479,KR
+736404480,736408575,IN
+736624640,736886783,JP
+736886784,737096703,CN
+737148928,737149951,CN
+737149952,737151999,IN
+737152000,737154047,HK
+737154048,737155071,MY
+737155072,737156095,TW
+737156096,737157119,HK
+737157120,737158143,NZ
+737158144,737159167,HK
+737159168,737160191,AU
+737160192,737161215,TW
+737161216,737162239,CN
+737162240,737163263,BD
+737163264,737165311,CN
+737165312,737166335,IN
+737166336,737169407,CN
+737169408,737170431,ID
+737170432,737171455,CN
+737171456,737172479,GU
+737172480,737173503,HK
+737173504,737174527,AU
+737174528,737175551,BD
+737175552,737177599,TW
+737177600,737178623,IN
+737178624,737179647,HK
+737179648,737180671,AU
+737180672,737184767,CN
+737184768,737185791,VU
+737185792,737186815,AU
+737186816,737187839,ID
+737187840,737188863,TW
+737188864,737206271,CN
+737206272,737208319,ID
+737208320,737209343,AU
+737209344,737220607,CN
+737220608,737222655,IN
+737222656,737223679,TW
+737223680,737225727,IN
+737225728,737226751,HK
+737226752,737227775,CN
+737227776,737228799,AU
+737228800,737229823,TH
+737229824,737232895,IN
+737232896,737233919,HK
+737233920,737239039,CN
+737239040,737240063,MY
+737240064,737241087,HK
+737241088,737243135,KR
+737243136,737244159,CN
+737244160,737249279,IN
+737249280,737250303,BT
+737250304,737253375,IN
+737253376,737255423,HK
+737255424,737256447,TW
+737256448,737257471,WS
+737257472,737262591,CN
+737262592,737263615,AU
+737263616,737264639,IN
+737264640,737265663,CN
+737265664,737266687,AU
+737266688,737267711,HK
+737267712,737276927,CN
+737276928,737277951,IN
+737277952,737279999,CN
+737280000,737281023,HK
+737281024,737282047,SG
+737282048,737289215,CN
+737289216,737290239,IN
+737290240,737291263,AU
+737291264,737297407,CN
+737297408,737298431,AU
+737298432,737305599,CN
+737305600,737306623,PK
+737306624,737307647,IN
+737307648,737308671,HK
+737308672,737309695,KR
+737309696,737312767,IN
+737312768,737313791,HK
+737313792,737315839,JP
+737315840,737316863,HK
+737316864,737324031,CN
+737324032,737325055,HK
+737325056,737326079,PK
+737326080,737327103,CN
+737327104,737328127,SG
+737328128,737331199,CN
+737331200,737332223,HK
+737332224,737333247,CN
+737333248,737335295,IN
+737335296,737337343,CN
+737337344,737339391,IN
+737339392,737341439,HK
+737341440,737342463,MN
+737342464,737344511,IN
+737344512,737345535,CN
+737345536,737346559,AU
+737346560,737350655,CN
+737350656,737350911,AU
+737350912,737351679,NZ
+737351680,737352703,CN
+737352704,737354751,HK
+737354752,737355775,IN
+737355776,737359871,HK
+737359872,737361919,NZ
+737361920,737364991,HK
+737364992,737368063,IN
+737368064,737369087,CN
+737369088,737370111,HK
+737370112,737371135,NP
+737371136,737375231,HK
+737375232,737376255,AU
+737376256,737377279,HK
+737377280,737378303,PH
+737378304,737379327,CN
+737380352,737381375,CN
+737381376,737382399,ID
+737382400,737384447,CN
+737384448,737385471,ID
+737385472,737386495,CN
+737386496,737387519,MN
+737387520,737388543,HK
+737388544,737389567,CN
+737389568,737390591,IN
+737390592,737391615,HK
+737391616,737392639,CN
+737392640,737393663,ID
+737393664,737394687,CN
+737394688,737395711,HK
+737395712,737396735,NZ
+737396736,737397759,AU
+737397760,737398783,BD
+737398784,737399807,HK
+737399808,737400831,IN
+737400832,737401855,KR
+737401856,737403903,HK
+737403904,737405951,CN
+737405952,737406975,AU
+737406976,737407999,HK
+737408000,737409023,CN
+737409024,737410047,HK
+737410048,737411071,TW
+737411072,737476607,JP
+737476608,737478655,IN
+737478656,737479679,PK
737479680,737480703,IN
-737480704,737490943,JP
+737480704,737481727,SG
+737481728,737482751,IN
+737482752,737484799,AU
+737484800,737485823,KH
+737485824,737487871,AU
+737487872,737488895,MM
+737488896,737489151,AU
+737489152,737489919,HK
+737489920,737490943,NZ
737490944,737491967,FJ
-737491968,737511423,JP
+737491968,737492447,SG
+737492448,737492479,MY
+737492480,737492735,SG
+737492736,737492991,HK
+737492992,737497087,AU
+737497088,737498111,NZ
+737498112,737499135,NP
+737499136,737500159,IN
+737500160,737501183,NP
+737501184,737502207,SG
+737502208,737503231,IN
+737503232,737505279,SG
+737505280,737506303,AU
+737506304,737507327,BD
+737507328,737508351,AU
+737508352,737509375,MY
+737509376,737510399,PK
+737510400,737511423,AU
737511424,737512447,IN
-737512448,737514495,JP
+737512448,737513471,BD
+737513472,737514495,TH
737514496,737515519,IN
-737515520,737516543,JP
+737515520,737516543,AU
737516544,737517567,IN
-737517568,737526783,JP
+737517568,737517823,AU
+737517824,737518079,NZ
+737518080,737520639,AU
+737520640,737521663,NZ
+737521664,737522687,AU
+737522688,737525759,ID
+737525760,737526783,BD
737526784,737527295,US
-737527296,737529855,JP
+737527296,737527551,SG
+737527552,737527807,ID
+737527808,737528831,KH
+737528832,737529855,PK
737529856,737530879,IN
-737530880,737941503,JP
+737530880,737531903,NC
+737531904,737532927,KH
+737532928,737533951,PK
+737533952,737534975,AU
+737534976,737535999,SG
+737536000,737537023,BD
+737537024,737538047,NP
+737538048,737539071,NZ
+737539072,737540095,BD
+737540096,737541119,ID
+737541120,737542143,SG
+737542144,737574911,CN
+737607680,737608703,HK
+737608704,737610751,CN
+737610752,737611775,ID
+737611776,737612799,PH
+737612800,737613823,ID
+737613824,737614847,MO
+737614848,737615871,IN
+737615872,737617919,ID
+737617920,737618943,IN
+737618944,737620991,CN
+737620992,737622015,IN
+737622016,737623039,TH
+737623040,737624063,GU
+737624064,737625087,AU
+737625088,737626111,CN
+737626112,737627135,JP
+737627136,737628159,CN
+737628160,737629183,AU
+737629184,737634303,CN
+737634304,737635327,KR
+737635328,737637375,CN
+737637376,737638399,AU
+737638400,737639423,PK
+737639424,737640447,NZ
+737640448,737641471,AU
+737641472,737642495,HK
+737642496,737645567,IN
+737645568,737647615,CN
+737647616,737649663,IN
+737649664,737650687,HK
+737650688,737651711,JP
+737651712,737652735,NZ
+737652736,737656831,CN
+737656832,737657855,KR
+737657856,737675263,CN
+737675264,737676287,HK
+737676288,737677311,PK
+737677312,737678335,TW
+737678336,737679359,CN
+737679360,737680383,ID
+737680384,737681407,CN
+737681408,737683455,IN
+737683456,737685503,JP
+737685504,737686527,CN
+737686528,737687551,AU
+737687552,737688575,CN
+737688576,737690623,HK
+737690624,737692671,IN
+737692672,737712127,CN
+737712128,737713151,IN
+737713152,737714175,FM
+737714176,737715199,JP
+737715200,737718271,HK
+737718272,737727487,CN
+737727488,737728511,AU
+737728512,737729535,JP
+737729536,737730559,IN
+737730560,737731583,HK
+737731584,737733631,CN
+737733632,737735679,IN
+737735680,737736703,CN
+737736704,737737727,HK
+737737728,737738751,IN
+737738752,737741823,CN
+737741824,737742847,SG
+737742848,737744895,HK
+737744896,737745919,CN
+737745920,737746943,HK
+737746944,737747967,TH
+737747968,737748991,SG
+737748992,737750015,AF
+737750016,737751039,JP
+737751040,737753087,IN
+737753088,737757183,TH
+737757184,737758207,NZ
+737758208,737760255,HK
+737760256,737761279,IN
+737761280,737762303,HK
+737762304,737763327,AU
+737763328,737765375,HK
+737765376,737768447,TH
+737768448,737769471,AU
+737769472,737770495,CN
+737770496,737771519,HK
+737771520,737771647,KR
+737771648,737771775,JP
+737771776,737771903,KR
+737771904,737772159,JP
+737772160,737772287,KR
+737772288,737772415,JP
+737772416,737772543,KR
+737772544,737774591,CN
+737774592,737775615,ID
+737775616,737782783,CN
+737782784,737783807,HK
+737783808,737784831,PF
+737784832,737787903,IN
+737787904,737788927,CN
+737788928,737790975,NZ
+737790976,737791999,HK
+737792000,737793023,ID
+737793024,737794047,SG
+737794048,737795071,IN
+737795072,737796095,HK
+737796096,737799167,IN
+737799168,737800191,CN
+737800192,737802239,JP
+737802240,737803263,SG
+737803264,737804287,HK
+737804288,737805311,SG
+737805312,737806335,CN
+737806336,737807359,HK
+737807360,737810431,CN
+737810432,737811455,AU
+737811456,737814527,CN
+737814528,737815551,IN
+737815552,737816575,TW
+737816576,737817599,HK
+737817600,737818623,AU
+737818624,737821695,HK
+737821696,737822719,AU
+737822720,737823743,CN
+737823744,737824767,IN
+737824768,737825791,BD
+737825792,737826815,PK
+737826816,737827839,JP
+737827840,737828863,AU
+737828864,737835007,CN
+737835008,737836031,IN
+737836032,737837055,MN
+737837056,737838079,CN
+737838080,737839103,IN
+737839104,737840127,AF
+737840128,737841151,AU
+737841152,737843199,CN
+737843200,737844223,KR
+737844224,737845247,IN
+737845248,737846271,CN
+737846272,737847295,IN
+737847296,737850367,CN
+737850368,737851391,IN
+737851392,737853439,HK
+737853440,737854463,SG
+737854464,737855487,JP
+737855488,737856511,CN
+737856512,737857535,AU
+737857536,737858559,IN
+737858560,737861631,CN
+737861632,737862655,PH
+737862656,737863679,JP
+737863680,737864703,AU
+737864704,737865727,CN
+737865728,737866751,LK
+737866752,737867775,CN
+737867776,737868799,AU
+737868800,737870847,IN
+737870848,737874431,CN
+737874432,737874943,IN
+737874944,737876991,HK
+737876992,737878015,KR
+737878016,737879039,HK
+737879040,737880063,CN
+737880064,737881087,AU
+737881088,737882111,HK
+737882112,737883135,JP
+737883136,737884159,AU
+737884160,737886207,TW
+737886208,737887231,SG
+737887232,737888255,KR
+737888256,737889279,IN
+737889280,737890303,HK
+737890304,737894399,IN
+737894400,737895423,ID
+737895424,737896447,IN
+737896448,737897471,HK
+737897472,737898495,AU
+737898496,737899519,MY
+737899520,737900543,CN
+737900544,737901567,KR
+737901568,737902591,IN
+737902592,737903615,BN
+737903616,737904639,HK
+737904640,737905663,MY
+737905664,737906687,HK
+737906688,737908735,IN
+737908736,737909759,AU
+737909760,737910783,MY
+737910784,737911807,HK
+737911808,737912831,AU
+737912832,737915903,IN
+737915904,737916927,TW
+737916928,737917951,JP
+737917952,737918975,IN
+737918976,737919999,CN
+737920000,737921023,HK
+737921024,737922047,AU
+737922048,737923071,KR
+737923072,737924095,MY
+737924096,737927167,IN
+737927168,737929215,HK
+737929216,737931263,CN
+737931264,737932287,AU
+737932288,737933311,CN
+737933312,737934335,HK
+737934336,737935359,TH
+737935360,737936383,AU
+737936384,737937407,IN
+737937408,737938431,ID
+737938432,737939455,LK
+737939456,737940479,KH
+737940480,737941503,AU
737941504,737944575,IN
-737944576,737950719,JP
+737944576,737945599,MY
+737945600,737946623,HK
+737946624,737947647,MY
+737947648,737948671,CN
+737948672,737949695,HK
+737949696,737950719,CN
737950720,737951743,IN
-737951744,737958911,JP
-737958912,737959935,IN
-737959936,737965055,JP
+737951744,737953791,NZ
+737953792,737954815,ID
+737954816,737955839,AU
+737955840,737956863,IN
+737956864,737957887,HK
+737957888,737959935,IN
+737959936,737960959,AU
+737960960,737961983,IN
+737961984,737963007,ID
+737963008,737965055,AU
737965056,737966079,IN
-737966080,737967103,JP
-737967104,737967359,AU
-737967360,737991679,JP
+737966080,737967103,TH
+737967104,737969151,AU
+737969152,737970175,HK
+737970176,737971199,ID
+737971200,737972223,IN
+737972224,737973247,ID
+737973248,737974271,HK
+737974272,737975295,IN
+737975296,737976319,ID
+737976320,737981439,HK
+737981440,737982463,IN
+737982464,737983487,ID
+737983488,737986559,IN
+737986560,737987583,HK
+737987584,737988607,IN
+737988608,737989631,HK
+737989632,737991679,MY
737991680,737992191,IN
-737992192,737999320,JP
-737999321,737999321,IN
-737999322,738197503,JP
+737992192,737992703,ID
+737992704,737993727,CN
+737993728,737994751,HK
+737994752,737995775,MY
+737995776,737996799,ID
+737996800,737997823,IN
+737997824,737998847,LA
+737998848,737999871,IN
+737999872,738000895,AU
+738000896,738066431,JP
+738066432,738069503,CN
+738069504,738070527,PK
+738070528,738071551,TW
+738071552,738072575,NZ
+738072576,738073599,CN
+738073600,738075647,IN
+738075648,738076671,CN
+738076672,738077695,IN
+738077696,738078719,CN
+738078720,738079743,IN
+738079744,738080767,CN
+738080768,738081791,TL
+738081792,738082815,WS
+738082816,738083839,CN
+738083840,738084863,ID
+738084864,738085887,CN
+738085888,738086911,MY
+738086912,738087935,ID
+738087936,738091007,CN
+738091008,738092031,BD
+738092032,738094079,CN
+738094080,738095103,IN
+738095104,738097151,CN
+738097152,738098175,MY
+738098176,738099199,ID
+738099200,738100223,CN
+738100224,738101247,TH
+738101248,738107391,CN
+738107392,738108415,IN
+738108416,738109439,HK
+738109440,738111487,CN
+738111488,738112511,IN
+738112512,738118655,CN
+738118656,738119679,IN
+738119680,738120703,CN
+738120704,738121727,IN
+738121728,738122751,HK
+738122752,738128895,CN
+738128896,738129919,KR
+738129920,738135039,CN
+738135040,738136063,TW
+738136064,738137087,CN
+738137088,738138111,BD
+738138112,738139135,NZ
+738139136,738140159,SG
+738140160,738141183,AU
+738141184,738142207,HK
+738142208,738143231,JP
+738143232,738144255,AU
+738144256,738145279,CN
+738145280,738146303,HK
+738146304,738147327,IN
+738147328,738152447,CN
+738152448,738153471,HK
+738153472,738154495,CN
+738154496,738156543,TW
+738156544,738157567,CN
+738157568,738158591,SG
+738158592,738159615,HK
+738159616,738160639,CN
+738160640,738161663,KH
+738161664,738163711,HK
+738163712,738164735,SG
+738164736,738165759,AU
+738165760,738166783,IN
+738166784,738167807,AU
+738167808,738168831,IN
+738168832,738169855,CN
+738169856,738170879,TO
+738170880,738171903,SG
+738171904,738172927,HK
+738172928,738173951,NZ
+738173952,738174975,IN
+738174976,738175999,CN
+738176000,738177023,MY
+738177024,738178047,CN
+738178048,738179071,TW
+738179072,738180095,CN
+738180096,738181119,HK
+738181120,738182143,CN
+738182144,738183167,ID
+738183168,738187263,CN
+738187264,738188287,PH
+738188288,738189311,IN
+738189312,738192383,CN
+738192384,738193407,NC
+738193408,738194431,TH
+738194432,738195455,CN
+738195456,738197503,KR
738197504,746717183,US
746717184,746782719,DE
-746782720,755105791,US
+746782720,747175935,US
+747175936,747241471,NL
+747241472,757071871,US
+758972416,758976511,CA
+758976512,758980607,US
+758984704,758988799,CA
+758988800,759021567,US
+759103488,759136255,US
759169024,759171071,ID
759171072,759174143,IN
759174144,759175167,MO
@@ -6177,7 +6870,9 @@
759188480,759189503,TH
759189504,759190527,PH
759190528,759193599,IN
-759193600,759195647,ID
+759193600,759193855,ID
+759193856,759194111,SG
+759194112,759195647,ID
759195648,759196671,IN
759196672,759197695,HK
759197696,759198207,CN
@@ -6210,7 +6905,8 @@
759235584,759236607,NZ
759236608,759237631,IN
759237632,759238655,AU
-765460480,767557631,UY
+761266176,761790463,EG
+767557632,768606207,SC
771751936,771817471,RU
771817472,771948543,TR
771948544,772014079,RU
@@ -6232,7 +6928,9 @@
772538368,772603903,GR
772603904,772669439,CZ
772669440,772734975,CH
-772734976,772800511,NO
+772734976,772753663,NO
+772753664,772753919,RU
+772753920,772800511,NO
772800512,772802559,GB
772802560,772804607,RU
772804608,772806655,GL
@@ -6262,9 +6960,7 @@
772848192,772848223,US
772848224,772848871,NL
772848872,772848879,US
-772848880,772849231,NL
-772849232,772849247,MY
-772849248,772849255,NL
+772848880,772849255,NL
772849256,772849263,US
772849264,772849271,NL
772849272,772849279,US
@@ -6303,16 +6999,11 @@
772917248,772919295,RU
772919296,772923391,GB
772923392,772925439,AT
-772925440,772926463,GB
-772926464,772926719,ZW
-772926720,772927231,GB
-772927232,772927487,ZW
+772925440,772927487,GB
772927488,772929535,UA
772929536,772931583,RU
772931584,772933631,UA
-772933632,772933887,GB
-772933888,772934143,IE
-772934144,772935679,GB
+772933632,772935679,GB
772935680,772937727,PS
772937728,772939775,IT
772939776,772941823,BE
@@ -6368,8 +7059,8 @@
773050368,773052415,IE
773052416,773054463,NL
773054464,773055231,AL
-773055232,773055359,XK
-773055360,773055871,AL
+773055232,773055487,XK
+773055488,773055871,AL
773055872,773055999,RS
773056000,773056255,XK
773056256,773056511,AL
@@ -6400,9 +7091,7 @@
773140480,773144575,CY
773144576,773148671,RU
773148672,773152767,IR
-773152768,773153791,SE
-773153792,773154815,US
-773154816,773156863,SE
+773152768,773156863,SE
773156864,773165055,FR
773165056,773166463,NL
773166464,773166591,PL
@@ -6410,7 +7099,9 @@
773167200,773167207,NL
773167208,773167359,US
773167360,773167615,NL
-773167616,773168127,US
+773167616,773167655,US
+773167656,773167663,NL
+773167664,773168127,US
773168128,773168415,NL
773168416,773168639,US
773168640,773168895,NL
@@ -6494,8 +7185,7 @@
773646336,773648383,TR
773648384,773650431,PL
773650432,773652479,GB
-773652480,773652735,TR
-773652736,773653503,SK
+773652480,773653503,SK
773653504,773654527,TR
773654528,773656575,RU
773656576,773658623,PL
@@ -6580,13 +7270,11 @@
773828608,773830655,HU
773830656,773832703,NO
773832704,773834751,FR
-773834752,773835007,GB
-773835008,773835263,IM
-773835264,773835519,GB
+773834752,773835519,GB
773835520,773835775,IM
773835776,773836031,GB
-773836032,773836287,IM
-773836288,773836799,GB
+773836032,773836543,IM
+773836544,773836799,GB
773836800,773838847,FR
773838848,773840895,DE
773840896,773842943,GB
@@ -6606,7 +7294,11 @@
773906432,773922815,GB
773922816,773931007,UA
773931008,773934591,DE
-773934592,773939199,FR
+773934592,773935352,FR
+773935353,773935353,US
+773935354,773938231,FR
+773938232,773938239,GB
+773938240,773939199,FR
773939200,773947391,CZ
773947392,773955583,GB
773955584,773963775,FR
@@ -6636,13 +7328,7 @@
774078464,774086655,BA
774086656,774094847,BG
774094848,774103039,HU
-774103040,774104831,RU
-774104832,774105087,UA
-774105088,774105343,RU
-774105344,774105599,UA
-774105600,774109695,RU
-774109696,774109951,UA
-774109952,774119423,RU
+774103040,774119423,RU
774119424,774127615,CZ
774127616,774135807,LT
774135808,774143999,IR
@@ -6752,7 +7438,8 @@
774161569,774161578,LC
774161579,774161588,VE
774161589,774161598,TC
-774161599,774161628,US
+774161599,774161618,US
+774161619,774161628,VA
774161629,774161638,PA
774161639,774161648,RU
774161649,774161658,HK
@@ -6845,9 +7532,7 @@
774162563,774162572,MQ
774162573,774162582,YT
774162583,774162592,NC
-774162593,774162593,NG
-774162594,774162601,CA
-774162602,774162602,NG
+774162593,774162602,CA
774162603,774162622,US
774162623,774162627,MX
774162628,774162637,GB
@@ -6868,7 +7553,8 @@
774162704,774162738,US
774162739,774162743,VA
774162744,774162778,US
-774162779,774162787,CA
+774162779,774162784,CA
+774162785,774162787,UA
774162788,774162788,VA
774162789,774162798,CA
774162799,774162803,BN
@@ -7052,40 +7738,54 @@
778043392,778108927,UA
778108928,778174463,RO
778174464,778239999,UA
-778240000,778244095,AL
-778244096,778244351,RS
+778240000,778242815,AL
+778242816,778243071,XK
+778243072,778243327,RS
+778243328,778244095,AL
+778244096,778244351,XK
778244352,778245119,AL
-778245120,778245375,RS
-778245376,778247679,AL
-778247680,778247935,XK
-778247936,778248191,RS
-778248192,778249727,AL
+778245120,778245375,XK
+778245376,778249727,AL
778249728,778249983,RS
778249984,778304305,AL
778304306,778304306,SI
778304307,778305535,AL
778305536,778371071,IR
-778371072,778436607,RU
-778436608,778476031,RO
+778371072,778403839,GB
+778403840,778436607,DE
+778436608,778469375,RO
+778469376,778473471,IR
+778473472,778476031,RO
778476032,778476287,MD
-778476288,778493951,RO
+778476288,778485759,RO
+778485760,778493951,GB
778493952,778495999,NL
-778496000,778498047,RO
-778498048,778500095,NL
-778500096,778502143,RO
+778496000,778497791,RO
+778497792,778500095,NL
+778500096,778500863,RO
+778500864,778501119,SG
+778501120,778502143,RO
778502144,778567679,GR
778567680,778633215,TR
-778633216,778666259,FR
+778633216,778640127,FR
+778640128,778640383,GB
+778640384,778666259,FR
778666260,778666263,ES
778666264,778666479,FR
778666480,778666495,DE
778666496,778666879,FR
778666880,778666943,GB
-778666944,778667391,FR
+778666944,778667327,FR
+778667328,778667331,DE
+778667332,778667391,FR
778667392,778667395,IT
-778667396,778668863,FR
+778667396,778668623,FR
+778668624,778668627,NL
+778668628,778668863,FR
778668864,778668895,DE
-778668896,778670975,FR
+778668896,778669935,FR
+778669936,778669951,ES
+778669952,778670975,FR
778670976,778670976,DE
778670977,778671201,FR
778671202,778671202,ES
@@ -7095,7 +7795,9 @@
778673208,778673211,ES
778673212,778673383,FR
778673384,778673387,IT
-778673388,778673883,FR
+778673388,778673751,FR
+778673752,778673759,DE
+778673760,778673883,FR
778673884,778673887,ES
778673888,778675763,FR
778675764,778675767,PL
@@ -7108,10 +7810,11 @@
778677076,778677471,FR
778677472,778677475,DE
778677476,778677503,FR
-778677504,778677507,GB
-778677508,778677519,FR
-778677520,778677523,ES
-778677524,778679212,FR
+778677504,778677505,GB
+778677506,778677506,ES
+778677507,778677507,GB
+778677508,778677759,ES
+778677760,778679212,FR
778679213,778679214,FI
778679215,778679491,FR
778679492,778679495,ES
@@ -7127,15 +7830,21 @@
778681520,778681523,ES
778681524,778681823,FR
778681824,778681827,IT
-778681828,778691619,FR
+778681828,778682103,FR
+778682104,778682111,DE
+778682112,778691619,FR
778691620,778691623,IT
778691624,778691711,FR
778691712,778691727,GB
778691728,778692499,FR
778692500,778692503,ES
-778692504,778692535,FR
+778692504,778692519,FR
+778692520,778692527,NL
+778692528,778692535,FR
778692536,778692539,IT
-778692540,778692743,FR
+778692540,778692619,FR
+778692620,778692623,ES
+778692624,778692743,FR
778692744,778692747,ES
778692748,778693095,FR
778693096,778693099,ES
@@ -7147,7 +7856,11 @@
778695472,778695475,ES
778695476,778695487,FR
778695488,778695503,BE
-778695504,778696495,FR
+778695504,778695839,FR
+778695840,778695871,DE
+778695872,778696439,FR
+778696440,778696447,IT
+778696448,778696495,FR
778696496,778696499,ES
778696500,778696991,FR
778696992,778696995,ES
@@ -7298,8 +8011,12 @@
782667776,782671871,NL
782671872,782672871,LT
782672872,782672879,IL
-782672880,782675967,LT
-782675968,782680063,NL
+782672880,782672927,LT
+782672928,782672959,US
+782672960,782675967,LT
+782675968,782676735,NL
+782676736,782676991,DE
+782676992,782680063,NL
782680064,782696447,RU
782696448,782712831,DE
782712832,782729215,RU
@@ -7424,7 +8141,9 @@
783775744,783777791,AL
783777792,783779839,RU
783779840,783781887,DK
-783781888,783783935,NL
+783781888,783782655,NL
+783782656,783782911,RU
+783782912,783783935,NL
783783936,783785983,DE
783785984,783788031,RU
783788032,783790079,NO
@@ -7445,7 +8164,15 @@
784039936,784072703,PL
784072704,784105471,RU
784105472,784138239,HR
-784138240,784169215,DE
+784138240,784155495,DE
+784155496,784155503,AT
+784155504,784155511,GB
+784155512,784155519,CZ
+784155520,784155623,DE
+784155624,784155631,AT
+784155632,784155639,GB
+784155640,784155640,CZ
+784155641,784169215,DE
784169216,784169231,AL
784169232,784169247,BG
784169248,784169263,CZ
@@ -7456,13 +8183,11 @@
784169472,784171007,DE
784171008,784203775,PT
784203776,784236543,GR
-784236544,784269311,RO
+784236544,784269311,GB
784269312,784302079,BY
784302080,784334847,RU
784334848,784465919,FR
-784465920,784524287,SE
-784524288,784524543,PL
-784524544,784596991,SE
+784465920,784596991,SE
784596992,784728063,TR
784728064,784793599,GR
784793600,784859135,CY
@@ -7592,25 +8317,25 @@
786915328,786917375,SK
786917376,786919423,RO
786919424,786919431,IT
-786919432,786919639,GB
+786919432,786919535,GB
+786919536,786919543,IT
+786919544,786919639,GB
786919640,786919647,IT
786919648,786919799,GB
786919800,786919807,IT
786919808,786919879,GB
786919880,786919887,IT
-786919888,786919967,GB
-786919968,786919975,IT
-786919976,786920191,GB
+786919888,786920191,GB
786920192,786920199,IT
786920200,786920343,GB
786920344,786920351,IT
-786920352,786920631,GB
-786920632,786920639,IT
-786920640,786920839,GB
+786920352,786920839,GB
786920840,786920847,IT
786920848,786920855,GB
786920856,786920863,IT
-786920864,786921303,GB
+786920864,786921287,GB
+786921288,786921295,IT
+786921296,786921303,GB
786921304,786921311,IT
786921312,786921455,GB
786921456,786921463,IT
@@ -7654,16 +8379,20 @@
787038976,787039231,FR
787039232,787039247,AR
787039248,787039263,PE
-787039264,787054591,GB
+787039264,787039279,VE
+787039280,787054591,GB
787054592,787070975,IT
787070976,787087359,RU
787087360,787095551,TR
787095680,787095711,CH
787096576,787097855,CH
+787098112,787098623,CH
787099392,787100671,CH
787101696,787102719,CH
787103744,787111935,HR
-787111936,787120127,CZ
+787111936,787116287,CZ
+787116288,787116543,US
+787116544,787120127,CZ
787120128,787128319,ES
787128320,787136511,CZ
787136512,787152895,IT
@@ -7713,28 +8442,15 @@
787333120,787349503,DE
787349504,787365887,BG
787365888,787382271,PL
-787382272,787387647,GP
-787387648,787388671,MQ
-787388672,787388927,GP
-787388928,787390207,MQ
-787390208,787390463,GP
-787390464,787391231,FR
-787391232,787391487,MQ
-787391488,787391743,FR
-787391744,787392255,MQ
-787392256,787392511,FR
-787392512,787392767,GP
-787392768,787393791,FR
-787393792,787394303,GP
-787394304,787394559,FR
+787382272,787383039,GP
+787383040,787383295,MF
+787383296,787389951,GP
+787389952,787390207,MQ
+787390208,787394559,GP
787394560,787394815,GF
-787394816,787395071,FR
-787395072,787395327,GF
-787395328,787395583,FR
-787395584,787396095,GF
-787396096,787396351,FR
-787396352,787396607,GF
-787396608,787398399,FR
+787394816,787396095,GP
+787396096,787396351,GF
+787396352,787398399,GP
787398400,787398655,MQ
787398656,787415039,PL
787415040,787431423,BA
@@ -7761,11 +8477,28 @@
787703808,787705855,AT
787705856,787707903,RO
787707904,787709951,DE
-787709952,787718143,NL
-787718144,787724287,RU
-787724288,787726335,UA
-787726336,787742719,RU
-787742720,787759103,NL
+787709952,787711487,IE
+787711488,787711999,GB
+787712000,787712255,MT
+787712256,787712511,MA
+787712512,787712767,DE
+787712768,787713023,IT
+787713024,787713279,LV
+787713280,787713535,SE
+787713536,787713791,BG
+787713792,787714047,GR
+787714048,787714303,IM
+787714304,787714559,SY
+787714560,787714815,LB
+787714816,787715071,QA
+787715072,787715327,OM
+787715328,787715583,YE
+787715584,787715839,BH
+787715840,787718143,NL
+787718144,787742719,RU
+787742720,787750911,NL
+787750912,787755007,GB
+787755008,787759103,NL
787759104,787767295,PS
787767296,787775487,NL
787775488,787808255,DE
@@ -7786,7 +8519,9 @@
787869696,787873791,GB
787873792,787881745,SE
787881746,787881747,FR
-787881748,787891247,SE
+787881748,787883391,SE
+787883392,787883519,GB
+787883520,787891247,SE
787891248,787891251,ES
787891252,787906559,SE
787906560,787939327,GR
@@ -7802,9 +8537,9 @@
788070400,788078591,RU
788078592,788086783,NL
788086784,788094975,BG
-788094976,788100095,IR
-788100096,788101119,BG
-788101120,788103167,IR
+788094976,788095231,IR
+788095232,788095487,DE
+788095488,788103167,IR
788103168,788111359,HU
788111360,788119551,LT
788119552,788127743,GB
@@ -7908,12 +8643,9 @@
788502528,788504575,IE
788504576,788506623,FR
788506624,788508671,CH
-788508672,788508927,AT
-788508928,788509183,FR
-788509184,788509439,AT
-788509440,788509951,FR
-788509952,788510463,AT
-788510464,788510719,FR
+788508672,788509439,AT
+788509440,788510207,FR
+788510208,788510719,AT
788510720,788512767,ES
788512768,788514815,FI
788514816,788516863,FR
@@ -7927,9 +8659,9 @@
789577728,790102015,US
790102016,792002559,CA
792002560,792068095,US
-792068096,792096767,CA
-792096768,792097279,US
-792097280,792330239,CA
+792068096,792095999,CA
+792096000,792096255,US
+792096256,792330239,CA
792330240,792723455,ES
792723456,793247743,DE
793247744,793313279,NZ
@@ -8015,9 +8747,10 @@
831519744,831520767,IN
831520768,832045055,PH
832045056,832307199,CN
-832307200,832308223,MN
+832307456,832307711,MN
832308224,832311295,JP
-832311296,832315391,AU
+832311296,832312319,AU
+832313344,832315391,AU
832315392,832319487,KH
832319488,832320511,NU
832320512,832321535,VN
@@ -8067,8 +8800,8 @@
838467584,838729727,JP
838729728,838795263,KR
838795264,838860799,AU
-838860800,838995455,US
-838995456,838995967,CA
+838860800,838995711,US
+838995712,838995967,CA
838995968,838996991,US
838996992,838997247,CA
838997248,839016191,US
@@ -8089,9 +8822,16 @@
839104256,839104511,CA
839104512,839112191,US
839112192,839112703,CA
-839112704,839352319,US
-839352320,839356415,NL
-839356416,839357439,US
+839112704,839348223,US
+839348224,839348479,DE
+839348480,839348735,AT
+839348736,839348991,GB
+839348992,839349247,AT
+839349248,839350271,DE
+839350272,839351807,US
+839351808,839352063,DE
+839352064,839352319,US
+839352320,839357439,NL
839357440,839358463,FR
839358464,839359487,GB
839359488,839360511,DE
@@ -8110,7 +8850,9 @@
840838509,840838509,UA
840838510,840838510,US
840838511,840838512,UA
-840838513,840898047,US
+840838513,840865791,US
+840865792,840866047,CA
+840866048,840898047,US
840898048,840898559,CA
840898560,840909055,US
840909056,840909311,CA
@@ -8118,32 +8860,53 @@
840953856,840954367,JP
840954368,840956927,US
840956928,840957951,JP
-840957952,843055103,US
+840957952,842019071,US
+842019072,842019199,AS
+842019200,843055103,US
843055104,843644927,CA
843644928,844890111,US
844890112,844988415,CA
-844988416,845283327,US
+844988416,845089407,US
+845089408,845089535,PR
+845089536,845283327,US
845283328,845545471,CA
845545472,846442495,US
846442496,846446591,CA
-846446592,846537351,US
-846537352,846537352,CA
-846537353,846561279,US
+846446592,846561279,US
846561280,846594047,CA
846594048,846626815,US
846626816,846627071,CN
-846627072,855638015,US
+846627072,850506751,US
+850506752,850507007,CA
+850507008,855638015,US
855638016,872415231,GB
872415232,889192447,US
889192448,905969663,DE
-905969664,910688255,US
+905969664,910163967,US
+910163968,910197237,JP
+910197238,910197238,US
+910197239,910295039,JP
+910295040,910360575,AU
+910360576,910688255,US
910688256,911147007,IE
911147008,911212543,AU
911212544,911998975,US
911998976,912031743,JP
-912031744,912195583,US
+912031744,912064511,US
+912064512,912130047,DE
+912130048,912195583,BR
912195584,912261119,JP
-912261120,917635071,US
+912261120,915800063,US
+915800064,915865599,JP
+915865600,915898367,US
+915898368,915931135,SG
+915931136,916062207,US
+916062208,916193279,IE
+916193280,916979711,US
+916979712,917045247,JP
+917045248,917110783,SG
+917110784,917241855,IE
+917241856,917635071,US
917635072,917700607,JP
917700608,917766143,SG
917766144,918683647,US
@@ -8172,30 +8935,36 @@
922205776,922205776,DE
922205777,922222591,IE
922222592,922419199,JP
-922419200,922484735,SG
+922419200,922427633,SG
+922427634,922427634,US
+922427635,922427703,SG
+922427704,922427704,US
+922427705,922484735,SG
922484736,922615807,AU
922615808,922746879,SG
922746880,956301311,US
-956301312,959447039,FR
+956301312,959447039,BE
959447040,959512575,US
-959512576,960626687,FR
+959512576,960626687,BE
960626688,960641023,GB
-960641024,960641279,FR
+960641024,960641279,BE
960641280,960643330,GB
-960643331,960643331,FR
+960643331,960643331,BE
960643332,960644351,GB
-960644352,960644863,FR
+960644352,960644863,BE
960644864,960646399,GB
-960646400,960646911,FR
+960646400,960646911,BE
960646912,960654335,GB
-960654336,960654591,FR
+960654336,960654374,BE
+960654375,960654375,GB
+960654376,960654591,BE
960654592,960659455,GB
960659456,960662015,DE
-960662016,960662271,FR
+960662016,960662271,BE
960662272,960662783,DE
960662784,960663039,FR
960663040,960671487,DE
-960671488,960671743,FR
+960671488,960671743,BE
960671744,960676607,DE
960676608,960676863,PL
960676864,960692223,DE
@@ -8204,18 +8973,12 @@
960726784,960727039,ZA
960727040,960727295,US
960727296,960728319,NL
-960728320,960728575,FR
+960728320,960728575,BE
960728576,960729343,NL
960729344,960729599,ZA
-960729600,960729855,FR
+960729600,960729855,BE
960729856,960733183,NL
-960733184,960733439,BE
-960733440,960733695,FR
-960733696,960733951,BE
-960733952,960734463,FR
-960734464,960737535,BE
-960737536,960737791,FR
-960737792,960741375,BE
+960733184,960741375,BE
960741376,960749567,NL
960749568,960757759,LU
960757760,960888831,US
@@ -8234,36 +8997,38 @@
960970752,960974847,TV
960974848,960978943,VU
960978944,960983039,NC
-960983040,961019903,FR
+960983040,961019903,BE
961019904,961021439,HK
-961021440,961021695,FR
+961021440,961021695,BE
961021696,961021951,HK
-961021952,961022079,FR
+961021952,961022079,BE
961022080,961022095,SG
-961022096,961022207,FR
+961022096,961022207,BE
961022208,961022719,HK
-961022720,961022975,FR
+961022720,961022975,BE
961022976,961025535,HK
-961025536,961025791,FR
+961025536,961025791,BE
961025792,961036799,HK
-961036800,961037055,FR
+961036800,961037055,BE
961037056,961052671,HK
961052672,961085439,JP
961085440,961087231,SG
-961087232,961087487,FR
+961087232,961087487,BE
961087488,961089023,SG
-961089024,961089535,FR
+961089024,961089535,BE
961089536,961090047,SG
-961090048,961090303,FR
+961090048,961090303,BE
961090304,961091839,SG
-961091840,961092095,FR
+961091840,961092095,BE
961092096,961092351,IN
-961092352,961092607,FR
+961092352,961092607,BE
961092608,961093887,SG
-961093888,961094143,FR
+961093888,961094143,BE
961094144,961118207,SG
961118208,961119487,MY
-961119488,961119743,FR
+961119488,961119508,BE
+961119509,961119509,MY
+961119510,961119743,BE
961119744,961126399,MY
961126400,961134591,TW
961134592,961142783,KR
@@ -8277,7 +9042,7 @@
961224704,961228799,EC
961228800,961232895,BO
961232896,961236991,PY
-961236992,961241087,FR
+961236992,961241087,BE
961241088,961245183,GF
961245184,961247231,GY
961247232,961249279,SR
@@ -8288,7 +9053,7 @@
961265664,961269759,SV
961269760,961273855,PA
961273856,961277951,CR
-961277952,961282047,FR
+961277952,961282047,BE
961282048,961314815,MX
961314816,961380351,US
961380352,961413119,CA
@@ -8316,36 +9081,36 @@
961716224,961720319,CF
961720320,961724415,TD
961724416,961740799,ZA
-961740800,961806335,FR
+961740800,961806335,BE
961806336,961810431,MR
-961810432,961826815,FR
+961810432,961826815,BE
961826816,961830911,NE
-961830912,961892351,FR
+961830912,961892351,BE
961892352,961896447,ZW
961896448,961900543,NG
-961900544,961937407,FR
+961900544,961937407,BE
961937408,961945599,IS
961945600,961950463,FI
-961950464,961950719,FR
+961950464,961950719,BE
961950720,961953791,FI
961953792,961961983,DK
961961984,961970175,NO
-961970176,962002943,FR
+961970176,962002943,BE
962002944,962035711,RU
962035712,962039807,EE
962039808,962043903,LV
962043904,962047999,LT
-962048000,962076671,FR
+962048000,962076671,BE
962076672,962080767,BH
-962080768,962084863,FR
+962080768,962084863,BE
962084864,962088959,GE
-962088960,962097151,FR
+962088960,962097151,BE
962097152,962101247,IL
-962101248,962134015,FR
+962101248,962134015,BE
962134016,962138111,AE
-962138112,962203647,FR
+962138112,962203647,BE
962203648,962207999,AT
-962208000,962208255,FR
+962208000,962208255,BE
962208256,962211839,AT
962211840,962215935,BG
962215936,962217983,HR
@@ -8353,53 +9118,55 @@
962220032,962224127,CZ
962224128,962228223,GR
962228224,962232319,HU
-962232320,962244607,FR
+962232320,962244607,BE
962244608,962248703,RO
-962248704,962252799,FR
+962248704,962252799,BE
962252800,962256895,SK
962256896,962260991,SI
962260992,962265087,TR
-962265088,962281471,FR
+962265088,962281471,BE
962281472,962285567,DO
-962285568,962359295,FR
+962285568,962359295,BE
962359296,962363391,IN
-962363392,962392063,FR
+962363392,962392063,BE
962392064,962396159,PK
-962396160,962408447,FR
+962396160,962408447,BE
962408448,962412543,TH
962412544,962416639,UZ
-962416640,962461695,FR
+962416640,962461695,BE
962461696,962469887,IE
962469888,962527231,TR
-962527232,962592767,FR
+962527232,962592767,BE
962592768,962594815,IN
-962594816,962596863,FR
+962594816,962596863,BE
962596864,962598911,SG
-962598912,962600959,FR
+962598912,962600959,BE
962600960,962609151,HK
962609152,962613247,JP
-962613248,962617343,FR
+962613248,962617343,BE
962617344,962621439,AU
-962621440,962674687,FR
+962621440,962674687,BE
962674688,962676735,BR
-962676736,962680831,FR
+962676736,962680831,BE
962680832,962689023,US
-962689024,962723839,FR
+962689024,962723839,BE
962723840,962732031,GB
962732032,962740223,DE
962740224,962744319,SE
-962744320,962748415,FR
+962744320,962748415,BE
962748416,962752511,BH
962752512,962756607,ZA
-962756608,968818687,FR
+962756608,968818687,BE
968818688,968819711,DE
-968819712,968851455,FR
+968819712,968851455,BE
968851456,968852479,US
-968852480,972744447,FR
+968852480,972743935,BE
+972743936,972744191,GB
+972744192,972744447,BE
972744448,972744703,IN
-972744704,972747263,FR
+972744704,972747263,BE
972747264,972747519,US
-972747520,973078527,FR
+972747520,973078527,BE
973078528,973209599,JP
973209600,973275135,IN
973275136,973471743,JP
@@ -8433,7 +9200,7 @@
978321408,978452479,JP
978452480,978485247,CN
978485248,978501631,TH
-978501632,978518015,SG
+978501632,978518015,HK
978518016,978583551,CN
978599936,978640895,AU
978640896,978644991,NZ
@@ -8447,9 +9214,7 @@
979369984,979410943,AU
979410944,979419135,HK
979419136,979435519,AU
-979435520,979436799,TH
-979436800,979437055,OM
-979437056,979468287,TH
+979435520,979468287,TH
979468288,979501055,BD
979501056,979566591,JP
979566592,979599359,TW
@@ -8530,11 +9295,7 @@
999817216,999821311,BD
999839744,999845887,BD
999849984,999866367,KR
-999866368,999873919,HK
-999873920,999873941,VN
-999873942,999873943,HK
-999873944,999874047,VN
-999874048,999882751,HK
+999866368,999882751,HK
999948288,1000013823,AU
1000013824,1000079359,CN
1000079360,1000341503,JP
@@ -8551,7 +9312,9 @@
1002373120,1002405887,CN
1002405888,1002422271,JP
1002422272,1002434559,AU
-1002434560,1008730111,CN
+1002434560,1002438399,CN
+1002438400,1002438655,HK
+1002438656,1008730111,CN
1008730112,1009778687,JP
1009778688,1010237439,MY
1010237440,1010302975,CN
@@ -8581,11 +9344,11 @@
1023238144,1023246335,ID
1023246336,1023279103,CN
1023279104,1023311871,IN
-1023311872,1023315711,US
-1023315712,1023315967,AU
-1023315968,1023316991,US
+1023311872,1023316991,US
1023316992,1023317247,AU
-1023317248,1023328255,US
+1023317248,1023317759,US
+1023317760,1023318015,IN
+1023318016,1023328255,US
1023328256,1023344639,JP
1023344640,1023410175,CN
1023410176,1023672319,IN
@@ -8608,7 +9371,9 @@
1023901696,1023934463,TH
1023934464,1023942719,AU
1023942720,1023942751,MY
-1023942752,1023950847,AU
+1023942752,1023946879,AU
+1023946880,1023946911,SG
+1023946912,1023950847,AU
1023950848,1023954943,ID
1023954944,1023959039,JP
1023959040,1023967231,AU
@@ -8633,15 +9398,13 @@
1024361168,1024361183,HK
1024361184,1024362911,JP
1024362912,1024362943,SG
-1024362944,1024363263,JP
-1024363264,1024363519,SG
-1024363520,1024363775,JP
-1024363776,1024364031,AU
+1024362944,1024363519,JP
+1024363520,1024364031,AU
1024364032,1024364063,JP
1024364064,1024364079,AU
-1024364080,1024365727,JP
-1024365728,1024365759,SG
-1024365760,1024368639,JP
+1024364080,1024365567,JP
+1024365568,1024365823,SG
+1024365824,1024368639,JP
1024368640,1024369407,MY
1024369408,1024371199,JP
1024371200,1024371455,PH
@@ -8717,12 +9480,10 @@
1029636096,1029668863,AU
1029668864,1029701631,IN
1029701632,1030674431,KR
-1030674432,1030676223,JP
-1030676224,1030750207,KR
+1030674432,1030676479,JP
+1030676480,1030750207,KR
1030750208,1031798783,JP
-1031798784,1032668159,CN
-1032668160,1032668415,HK
-1032668416,1035993087,CN
+1031798784,1035993087,CN
1035993088,1037565951,JP
1037565952,1038614527,TW
1038614528,1039007743,CN
@@ -8756,6 +9517,7 @@
1040449536,1040457727,FR
1040457728,1040465919,ME
1040467072,1040467087,FR
+1040473344,1040473599,DE
1040474112,1040482303,CZ
1040482304,1040515071,BE
1040515072,1040547839,GB
@@ -8787,119 +9549,19 @@
1041268736,1041301503,NO
1041301504,1041310975,IE
1041310976,1041311231,GB
-1041311232,1041367039,IE
+1041311232,1041335295,IE
+1041335296,1041335551,GB
+1041335552,1041338879,IE
+1041338880,1041339135,GB
+1041339136,1041367039,IE
1041367040,1041498111,IT
1041498112,1041563647,SE
1041563648,1041596415,PL
1041596416,1041629183,NL
1041629184,1041694719,ES
-1041694720,1041700959,GB
-1041700960,1041700975,FR
-1041700976,1041701783,GB
-1041701784,1041701791,FR
-1041701792,1041701823,GB
-1041701824,1041701831,FR
-1041701832,1041703479,GB
-1041703480,1041703487,FR
-1041703488,1041703631,GB
-1041703632,1041703639,FR
-1041703640,1041704415,GB
-1041704416,1041704423,FR
-1041704424,1041706551,GB
-1041706552,1041706559,FR
-1041706560,1041706751,GB
-1041706752,1041707263,FR
-1041707264,1041708543,GB
-1041708544,1041708799,FR
-1041708800,1041709823,GB
-1041709824,1041710079,FR
-1041710080,1041710423,GB
-1041710424,1041710431,FR
-1041710432,1041710671,GB
-1041710672,1041710687,FR
-1041710688,1041711551,GB
-1041711552,1041711559,FR
-1041711560,1041711943,GB
-1041711944,1041711951,FR
-1041711952,1041712631,GB
-1041712632,1041712639,FR
-1041712640,1041715071,GB
-1041715072,1041715079,FR
-1041715080,1041715567,GB
-1041715568,1041715583,FR
-1041715584,1041716039,GB
-1041716040,1041716047,FR
-1041716048,1041716223,GB
-1041716224,1041716231,FR
-1041716232,1041716455,GB
-1041716456,1041716463,FR
-1041716464,1041718015,GB
-1041718016,1041718271,FR
-1041718272,1041719223,GB
-1041719224,1041719224,FR
-1041719225,1041719227,GB
-1041719228,1041719228,FR
-1041719229,1041719407,GB
-1041719408,1041719423,FR
-1041719424,1041720575,GB
-1041720576,1041720831,FR
-1041720832,1041721599,GB
-1041721600,1041721727,FR
-1041721728,1041721759,GB
-1041721760,1041721775,FR
-1041721776,1041722951,GB
-1041722952,1041722959,FR
-1041722960,1041723263,GB
-1041723264,1041723279,FR
-1041723280,1041723775,GB
-1041723776,1041723839,FR
-1041723840,1041729559,GB
-1041729560,1041729561,FR
-1041729562,1041729564,GB
-1041729565,1041729566,FR
-1041729567,1041729935,GB
-1041729936,1041729951,FR
-1041729952,1041731071,GB
-1041731072,1041731327,FR
-1041731328,1041732031,GB
-1041732032,1041732047,FR
-1041732048,1041736381,GB
-1041736382,1041736382,FR
-1041736383,1041736675,GB
-1041736676,1041736676,FR
-1041736677,1041737583,GB
-1041737584,1041737591,FR
-1041737592,1041737839,GB
-1041737840,1041737855,FR
-1041737856,1041739031,GB
-1041739032,1041739039,FR
-1041739040,1041740279,GB
-1041740280,1041740287,FR
-1041740288,1041742415,GB
-1041742416,1041742423,FR
-1041742424,1041743103,GB
-1041743104,1041743111,FR
-1041743112,1041743247,GB
-1041743248,1041743255,FR
-1041743256,1041745783,GB
-1041745784,1041745791,FR
-1041745792,1041746903,GB
-1041746904,1041746919,FR
-1041746920,1041749639,GB
-1041749640,1041749643,FR
-1041749644,1041749659,GB
-1041749660,1041749663,FR
-1041749664,1041751679,GB
-1041751680,1041751687,FR
-1041751688,1041753231,GB
-1041753232,1041753239,FR
-1041753240,1041756839,GB
-1041756840,1041756855,FR
-1041756856,1041757615,GB
-1041757616,1041757623,FR
-1041757624,1041758175,GB
-1041758176,1041758183,FR
-1041758184,1041760255,GB
+1041694720,1041748991,FR
+1041748992,1041749247,GB
+1041749248,1041760255,FR
1041760256,1041768447,DE
1041768448,1041776639,NO
1041776640,1041784831,CZ
@@ -8941,9 +9603,7 @@
1042875136,1042875391,FR
1042875392,1042879999,NL
1042880000,1042880255,GB
-1042880256,1042889983,NL
-1042889984,1042890239,GB
-1042890240,1042939903,NL
+1042880256,1042939903,NL
1042939904,1043070975,ES
1043070976,1043079167,CZ
1043079168,1043087359,DE
@@ -8952,19 +9612,17 @@
1043103744,1043120127,DK
1043120128,1043136511,FI
1043136512,1043202047,NL
-1043202048,1043249919,AT
-1043249920,1043250175,HU
-1043250176,1043257087,AT
-1043257088,1043257343,DE
-1043257344,1043281151,AT
-1043281152,1043281407,DE
-1043281408,1043333119,AT
+1043202048,1043242495,AT
+1043242496,1043242751,DE
+1043242752,1043333119,AT
1043333120,1043341311,CH
1043341312,1043349503,IT
1043349504,1043357695,DE
1043357696,1043365887,CH
1043365888,1043398655,PT
-1043398656,1043470127,GB
+1043398656,1043465839,GB
+1043465840,1043465847,NL
+1043465848,1043470127,GB
1043470128,1043470223,NL
1043470224,1043475871,GB
1043475872,1043475887,DE
@@ -8987,16 +9645,16 @@
1043595264,1043661567,DE
1043661568,1043661823,GB
1043661824,1043857407,DE
-1043857408,1043892735,GB
-1043892736,1043892991,CD
-1043892992,1043897343,GB
+1043857408,1043897343,GB
1043897344,1043897855,KE
1043897856,1043919442,GB
1043919443,1043919443,SS
1043919444,1043921919,GB
1043921920,1043922943,IL
1043922944,1043988479,ES
-1043988480,1044118295,NL
+1043988480,1044020223,NL
+1044020224,1044020479,BE
+1044020480,1044118295,NL
1044118296,1044118303,BE
1044118304,1044118423,NL
1044118424,1044118431,BE
@@ -9010,6 +9668,7 @@
1044201472,1044217855,FI
1044217856,1044226047,DK
1044226048,1044234239,OM
+1044234240,1044250623,RE
1044283392,1044316159,FR
1044316160,1044332543,NO
1044332544,1044348927,RU
@@ -9084,9 +9743,13 @@
1044936116,1044936119,BE
1044936120,1044936487,GB
1044936488,1044936495,BE
-1044936496,1044937247,GB
+1044936496,1044936735,GB
+1044936736,1044936743,BE
+1044936744,1044937247,GB
1044937248,1044937255,BE
-1044937256,1044946943,GB
+1044937256,1044938503,GB
+1044938504,1044938511,LU
+1044938512,1044946943,GB
1044946944,1044955135,UA
1044955136,1044963327,NL
1044963328,1044971519,FI
@@ -9102,10 +9765,8 @@
1045154630,1045154630,SG
1045154631,1045158306,DE
1045158307,1045158307,SG
-1045158308,1045159711,DE
-1045159712,1045159712,EG
-1045159713,1045163508,DE
-1045163509,1045163511,SG
+1045158308,1045163509,DE
+1045163510,1045163511,SG
1045163512,1045168127,DE
1045168128,1045233663,RU
1045233664,1045241855,GB
@@ -9173,7 +9834,9 @@
1046320128,1046321151,GB
1046321152,1046323199,NL
1046323200,1046331391,ES
-1046347776,1046413311,IT
+1046347776,1046360319,IT
+1046360320,1046360575,SM
+1046360576,1046413311,IT
1046413312,1046446079,SE
1046446080,1046478879,DE
1046478880,1046479839,GB
@@ -9194,9 +9857,9 @@
1046487290,1046487290,DE
1046487291,1046487551,GB
1046487552,1046487807,DE
-1046487808,1046488319,GB
-1046488320,1046488575,DE
-1046488576,1046489087,GB
+1046487808,1046488063,GB
+1046488064,1046488319,DE
+1046488320,1046489087,GB
1046489088,1046489119,DE
1046489120,1046489311,GB
1046489312,1046489327,ES
@@ -9250,12 +9913,22 @@
1046503096,1046503103,DE
1046503104,1046504447,GB
1046504448,1046508543,DE
-1046508544,1046511615,GB
-1046511616,1046515711,DE
+1046508544,1046511815,GB
+1046511816,1046511823,DE
+1046511824,1046512583,GB
+1046512584,1046512599,DE
+1046512600,1046514687,GB
+1046514688,1046515711,DE
1046515712,1046518783,GB
1046518784,1046519807,DE
-1046519808,1046525183,GB
-1046525184,1046525695,DE
+1046519808,1046524215,GB
+1046524216,1046524223,DE
+1046524224,1046524615,GB
+1046524616,1046524623,DE
+1046524624,1046525351,GB
+1046525352,1046525359,DE
+1046525360,1046525439,GB
+1046525440,1046525695,DE
1046525696,1046529023,GB
1046529024,1046530047,DE
1046530048,1046530973,GB
@@ -9270,12 +9943,8 @@
1046535440,1046535447,DE
1046535448,1046537023,GB
1046537024,1046537039,DE
-1046537040,1046538751,GB
-1046538752,1046539007,DE
-1046539008,1046543209,GB
-1046543210,1046543210,DE
-1046543211,1046543343,GB
-1046543344,1046543359,DE
+1046537040,1046543103,GB
+1046543104,1046543359,DE
1046543360,1046544383,GB
1046544384,1046560767,IT
1046560768,1046585343,ES
@@ -9322,9 +9991,11 @@
1047314432,1047322623,SE
1047322624,1047330815,IT
1047330816,1047339007,RU
-1047339008,1047346175,SE
-1047346176,1047346431,FI
-1047346432,1047347199,SE
+1047339008,1047340863,SE
+1047340864,1047340927,NO
+1047340928,1047342879,SE
+1047342880,1047342887,FI
+1047342888,1047347199,SE
1047347200,1047363583,DE
1047363584,1047371775,CZ
1047371776,1047373559,RU
@@ -9349,9 +10020,7 @@
1047658496,1047724031,EG
1047728128,1047732223,SE
1047787520,1047787775,ES
-1047789568,1047805439,AT
-1047805440,1047805695,DE
-1047805696,1047822335,AT
+1047789568,1047822335,AT
1047822336,1047838719,DE
1047838720,1047846911,DK
1047846912,1047855103,SE
@@ -9373,7 +10042,6 @@
1048193024,1048195071,RO
1048195072,1048197119,RU
1048197120,1048201215,UA
-1048201216,1048203263,PL
1048203264,1048205311,DE
1048205312,1048209407,RU
1048209408,1048211455,UA
@@ -9396,7 +10064,10 @@
1048576000,1048584191,DE
1048584192,1048592383,IL
1048592384,1048600575,IT
-1048600576,1048603391,UA
+1048600576,1048602111,UA
+1048602112,1048602623,PL
+1048602624,1048603135,RU
+1048603136,1048603391,UA
1048603392,1048603647,LV
1048603648,1048608767,UA
1048608768,1048616959,GB
@@ -9424,7 +10095,9 @@
1049006080,1049006335,DE
1049008128,1049009151,DE
1049016320,1049018367,DE
-1049018624,1049022463,DE
+1049018624,1049021439,DE
+1049021440,1049021695,GB
+1049021696,1049022463,DE
1049026816,1049029375,DE
1049030656,1049031679,DE
1049031744,1049031871,DE
@@ -9546,19 +10219,19 @@
1051922432,1051924479,CH
1051924480,1051948031,AT
1051948032,1051949055,CH
-1051949056,1051949823,AT
-1051949824,1051950079,NL
-1051950080,1051983871,AT
+1051949056,1051983871,AT
1051990016,1051991039,DE
1052001280,1052002303,DE
1052003584,1052003839,DE
1052011264,1052012031,DE
-1052017536,1052017663,DE
+1052017536,1052017567,DE
1052019712,1052019967,GB
1052045312,1052046079,DE
1052049408,1052057599,PL
1052057600,1052065791,RU
-1052065792,1052081151,SE
+1052065792,1052076031,SE
+1052076032,1052077055,NL
+1052077056,1052081151,SE
1052081152,1052082175,NL
1052082176,1052090367,DE
1052090368,1052098559,PL
@@ -9589,7 +10262,7 @@
1052170240,1052172287,SE
1052172288,1052174335,PL
1052174336,1052176383,CZ
-1052176384,1052178431,NL
+1052176384,1052178431,GB
1052178432,1052180479,DK
1052180480,1052213247,RU
1052213248,1052246015,FI
@@ -9631,7 +10304,9 @@
1052488704,1052489727,GB
1052494336,1052494591,NL
1052498432,1052498463,RO
-1052508160,1052704767,GB
+1052508160,1052593663,GB
+1052593664,1052593919,US
+1052593920,1052704767,GB
1052704768,1052712959,NL
1052712960,1052770303,GB
1052770304,1052778495,CH
@@ -9657,19 +10332,24 @@
1053138944,1053147135,FI
1053147136,1053163519,SK
1053163520,1053294591,DK
-1053295616,1053296639,AT
-1053307904,1053308159,GB
+1053294616,1053294623,AT
+1053294656,1053294679,AT
+1053295104,1053296639,AT
+1053297152,1053297663,IT
+1053301056,1053301071,FR
+1053312872,1053312887,DK
+1053312912,1053312927,DK
1053313280,1053313535,GB
-1053316688,1053316695,GB
+1053318912,1053318943,FI
1053320224,1053320239,DE
-1053327616,1053327871,ZA
-1053329440,1053329471,ES
+1053325824,1053326335,DE
+1053326504,1053326527,BE
+1053326544,1053326551,BE
1053332992,1053334015,BE
1053335552,1053336575,ZA
1053339904,1053340159,AT
-1053340928,1053341183,GB
-1053345280,1053345375,PK
1053349376,1053349631,NL
+1053349952,1053349967,IE
1053353408,1053353423,GB
1053353984,1053354239,IL
1053354912,1053355007,IL
@@ -9696,9 +10376,7 @@
1053663232,1053671423,RU
1053671424,1053687807,LV
1053687808,1053753343,DE
-1053753344,1053788687,NL
-1053788688,1053788695,DE
-1053788696,1053818879,NL
+1053753344,1053818879,NL
1053818880,1053819391,DE
1053819424,1053819439,DE
1053819520,1053819563,DE
@@ -9725,6 +10403,7 @@
1053837568,1053837823,GB
1053837824,1053838335,FK
1053838336,1053838591,DE
+1053839360,1053840383,DE
1053840400,1053840415,DE
1053840448,1053840511,DE
1053843200,1053843231,DK
@@ -9791,13 +10470,13 @@
1053927160,1053927167,FI
1053927168,1053933567,SE
1053933568,1053949951,CZ
-1053949952,1054015487,FR
+1053949952,1053968188,FR
+1053968189,1053968189,PT
+1053968190,1054015487,FR
1054015488,1054089215,IT
1054089216,1054097407,GE
1054097408,1054105599,NL
-1054105600,1054107135,FR
-1054107136,1054107391,GB
-1054107392,1054113791,FR
+1054105600,1054113791,FR
1054113792,1054121983,NL
1054121984,1054130175,AT
1054130176,1054138367,LT
@@ -9814,10 +10493,7 @@
1054186241,1054186495,GB
1054186496,1054187264,DE
1054187265,1054187519,GB
-1054187520,1054192639,FR
-1054192640,1054192895,BG
-1054192896,1054195455,FR
-1054195456,1054195711,BG
+1054187520,1054195711,FR
1054195712,1054212095,BE
1054212096,1054277631,DE
1054277632,1054343167,KW
@@ -9825,7 +10501,9 @@
1054351360,1054359551,UA
1054359552,1054367743,RO
1054367744,1054375935,FI
-1054375936,1054384127,GB
+1054375936,1054381567,GB
+1054381568,1054381823,US
+1054381824,1054384127,GB
1054384128,1054400511,DE
1054400512,1054408703,GB
1054408704,1054416895,FR
@@ -9929,8 +10607,7 @@
1056473088,1056505855,FI
1056505856,1056514047,PT
1056514048,1056522239,IT
-1056522240,1056523007,DE
-1056523008,1056538623,AT
+1056522240,1056538623,AT
1056538624,1056546815,RU
1056546816,1056555007,NO
1056555008,1056571391,GB
@@ -9951,9 +10628,7 @@
1061853696,1061854207,GB
1061854208,1061939711,US
1061939712,1061940223,JM
-1061940224,1061987839,US
-1061987840,1061988095,CA
-1061988096,1062069247,US
+1061940224,1062069247,US
1062069248,1062070271,PR
1062070272,1062219519,US
1062219520,1062219775,IN
@@ -9967,11 +10642,19 @@
1062530048,1062531071,EC
1062531072,1062545919,US
1062545920,1062546431,BM
-1062546432,1062597375,US
+1062546432,1062587135,US
+1062587136,1062587391,CA
+1062587392,1062597375,US
1062597376,1062597631,PR
1062597632,1062871551,US
1062871552,1062872063,PR
-1062872064,1063057432,US
+1062872064,1063053567,US
+1063053568,1063053647,CA
+1063053648,1063053663,US
+1063053664,1063053743,CA
+1063053744,1063053759,US
+1063053760,1063053823,CA
+1063053824,1063057432,US
1063057433,1063057433,CA
1063057434,1063305727,US
1063305728,1063305983,CA
@@ -10003,7 +10686,9 @@
1064221952,1064222207,MX
1064222208,1064445183,US
1064445184,1064445439,PK
-1064445440,1065519871,US
+1064445440,1065372927,US
+1065372928,1065373183,PR
+1065373184,1065519871,US
1065519872,1065520127,GB
1065520128,1065525791,US
1065525792,1065525807,IN
@@ -10022,12 +10707,12 @@
1065873408,1065877503,PR
1065877504,1065906175,US
1065906176,1065908223,KY
-1065908224,1066311679,US
+1065908224,1066254975,US
+1066254976,1066255103,GB
+1066255104,1066311679,US
1066311680,1066315775,CA
1066315776,1066352639,US
-1066352640,1066354943,JM
-1066354944,1066355199,BB
-1066355200,1066355711,JM
+1066352640,1066355711,JM
1066355712,1066355967,BB
1066355968,1066369023,JM
1066369024,1067238143,US
@@ -10064,7 +10749,9 @@
1068123136,1068123391,BB
1068123392,1068175871,US
1068175872,1068176383,YE
-1068176384,1068199935,US
+1068176384,1068179455,US
+1068179456,1068179711,PR
+1068179712,1068199935,US
1068199936,1068204031,CA
1068204032,1068230655,US
1068230656,1068230911,CO
@@ -10091,7 +10778,9 @@
1070729472,1070729727,CA
1070729728,1071100927,US
1071100928,1071101951,PR
-1071101952,1071134719,US
+1071101952,1071106559,US
+1071106560,1071106815,NL
+1071106816,1071134719,US
1071134720,1071136767,HK
1071136768,1071141887,US
1071141888,1071142911,HK
@@ -10116,7 +10805,9 @@
1071255296,1071255525,LB
1071255526,1071255526,DE
1071255527,1071255551,LB
-1071255552,1071256319,US
+1071255552,1071255839,US
+1071255840,1071255847,TW
+1071255848,1071256319,US
1071256320,1071256575,HK
1071256576,1071258879,US
1071258880,1071259135,HK
@@ -10291,7 +10982,9 @@
1072941056,1072942079,CA
1072942080,1072943103,US
1072943104,1072945151,CA
-1072945152,1073022975,US
+1072945152,1072953599,US
+1072953600,1072953607,IE
+1072953608,1073022975,US
1073022976,1073025791,HN
1073025792,1073026047,NI
1073026048,1073026303,US
@@ -10301,8 +10994,8 @@
1073028352,1073028607,US
1073028608,1073029119,GD
1073029120,1073031423,US
-1073031424,1073031679,CW
-1073031680,1073034239,US
+1073031424,1073031935,CW
+1073031936,1073034239,US
1073034240,1073034495,BB
1073034496,1073035263,US
1073035264,1073036032,GD
@@ -10469,13 +11162,16 @@
1075494912,1075558143,US
1075558144,1075558911,VI
1075558912,1075576831,US
-1075576832,1075577087,GB
-1075577088,1075579391,NO
+1075576832,1075576895,NO
+1075576896,1075576896,SE
+1075576897,1075579391,NO
1075579392,1075579903,GB
1075579904,1075585023,NO
1075585024,1075609599,US
1075609600,1075613695,TT
-1075613696,1075769343,US
+1075613696,1075717887,US
+1075717888,1075718143,CA
+1075718144,1075769343,US
1075769344,1075773439,CA
1075773440,1075855359,US
1075855360,1075871743,DO
@@ -10488,17 +11184,15 @@
1075975168,1075975679,CA
1075975680,1075976191,US
1075976192,1075976447,CA
-1075976448,1075976959,US
-1075976960,1075977215,CA
-1075977216,1075977983,US
-1075977984,1075978239,CA
-1075978240,1075982335,US
+1075976448,1075977055,US
+1075977056,1075977071,CA
+1075977072,1075982335,US
1075982336,1075982591,CA
1075982592,1075982847,US
1075982848,1075983103,CA
1075983104,1075983359,US
-1075983360,1075984383,CA
-1075984384,1075985919,US
+1075983360,1075984127,CA
+1075984128,1075985919,US
1075985920,1075986687,CA
1075986688,1075986943,US
1075986944,1075987199,CA
@@ -10507,10 +11201,8 @@
1075988224,1075988319,US
1075988320,1075988351,CA
1075988352,1075988479,US
-1075988480,1075988991,CA
-1075988992,1075989231,US
-1075989232,1075989239,CA
-1075989240,1075989503,US
+1075988480,1075989247,CA
+1075989248,1075989503,US
1075989504,1075989759,CA
1075989760,1075990015,US
1075990016,1075990527,CA
@@ -10522,7 +11214,9 @@
1075995648,1075996671,CA
1075996672,1075997183,US
1075997184,1075997439,CA
-1075997440,1075998207,US
+1075997440,1075998119,US
+1075998120,1075998127,CA
+1075998128,1075998207,US
1075998208,1075998271,CA
1075998272,1075998463,US
1075998464,1075999231,CA
@@ -10552,7 +11246,9 @@
1076009728,1076009983,CA
1076009984,1076026623,US
1076026624,1076026879,CA
-1076026880,1076028159,US
+1076026880,1076027019,US
+1076027020,1076027023,CA
+1076027024,1076028159,US
1076028160,1076028415,CA
1076028416,1076028927,US
1076028928,1076029183,BZ
@@ -10677,7 +11373,9 @@
1078284864,1078284991,CA
1078284992,1078285151,US
1078285152,1078285167,CA
-1078285168,1078285311,US
+1078285168,1078285255,US
+1078285256,1078285259,CA
+1078285260,1078285311,US
1078285312,1078285567,CA
1078285568,1078286351,US
1078286352,1078286367,CA
@@ -10792,8 +11490,8 @@
1079403264,1079403519,US
1079403520,1079403775,CA
1079403776,1079405567,US
-1079405568,1079406079,CA
-1079406080,1079408895,US
+1079405568,1079406111,CA
+1079406112,1079408895,US
1079408896,1079409407,PK
1079409408,1079409919,US
1079409920,1079410175,CA
@@ -10840,17 +11538,15 @@
1080024576,1080033279,US
1080033280,1080164351,KY
1080164352,1080295423,CA
-1080295424,1080496639,US
-1080496640,1080496895,ES
-1080496896,1080498431,US
+1080295424,1080498431,US
1080498432,1080498664,GB
1080498665,1080498665,US
1080498666,1080498687,GB
-1080498688,1080513535,US
+1080498688,1080512511,US
+1080512512,1080512767,GB
+1080512768,1080513535,US
1080513536,1080513791,GB
-1080513792,1080550399,US
-1080550400,1080550655,IN
-1080550656,1080552447,US
+1080513792,1080552447,US
1080552448,1080552703,IN
1080552704,1080569343,US
1080569344,1080569599,JP
@@ -10860,7 +11556,9 @@
1080589568,1080589823,CN
1080589824,1080610559,US
1080610560,1080610815,AU
-1080610816,1080621055,US
+1080610816,1080613631,US
+1080613632,1080613887,AU
+1080613888,1080621055,US
1080621056,1080621567,AU
1080621568,1080622079,US
1080622080,1080622335,AU
@@ -10892,8 +11590,7 @@
1081037312,1081037567,CA
1081037568,1081038335,US
1081038336,1081040895,CA
-1081040896,1081057535,US
-1081061376,1081122559,US
+1081040896,1081122559,US
1081122560,1081122815,VI
1081122816,1081212927,US
1081212928,1081278463,CA
@@ -10908,8 +11605,8 @@
1081379840,1081385215,US
1081385216,1081385471,PA
1081385472,1081387519,US
-1081387520,1081388031,PA
-1081388032,1081391103,US
+1081387520,1081387775,PA
+1081387776,1081391103,US
1081391104,1081393151,PA
1081393152,1081393407,US
1081393408,1081393663,CL
@@ -10948,7 +11645,9 @@
1081573376,1081589759,US
1081589760,1081593855,BB
1081593856,1081597951,CA
-1081597952,1082139409,US
+1081597952,1081639423,US
+1081639424,1081639679,DE
+1081639680,1082139409,US
1082139410,1082139410,ZA
1082139411,1082314751,US
1082314752,1082318847,CA
@@ -10960,7 +11659,8 @@
1082786592,1082786623,HK
1082786624,1082790143,US
1082790144,1082790399,IN
-1082790400,1082791167,US
+1082790400,1082790911,US
+1082790912,1082791167,AU
1082791168,1082791423,IN
1082791424,1082819839,US
1082819840,1082820351,IN
@@ -10982,7 +11682,9 @@
1083738112,1083740159,PR
1083740160,1084067583,US
1084067584,1084067839,CA
-1084067840,1085439999,US
+1084067840,1084153599,US
+1084153600,1084153855,NL
+1084153856,1085439999,US
1085440000,1085448191,CA
1085448192,1085456383,US
1085456384,1085457919,PR
@@ -11015,31 +11717,33 @@
1086955520,1086971903,CA
1086971904,1087016959,US
1087016960,1087021055,CA
-1087021056,1087395327,US
-1087395328,1087395455,GB
-1087395456,1087399167,US
+1087021056,1087399167,US
1087399168,1087399423,GB
1087399424,1087405407,US
1087405408,1087405423,MX
1087405424,1087413895,US
1087413896,1087413903,DE
-1087413904,1087419135,US
+1087413904,1087414271,US
+1087414272,1087414527,GB
+1087414528,1087419135,US
1087419136,1087419391,GB
1087419392,1087419903,US
1087419904,1087420159,CA
-1087420160,1087432447,US
-1087432448,1087432607,FR
-1087432608,1087432639,US
-1087432640,1087432703,FR
-1087432704,1087436159,US
+1087420160,1087432599,US
+1087432600,1087432607,FR
+1087432608,1087436031,US
+1087436032,1087436159,NL
1087436160,1087436167,CH
-1087436168,1087440895,US
+1087436168,1087436287,NL
+1087436288,1087440895,US
1087440896,1087442943,PR
1087442944,1087443551,US
1087443552,1087443583,DE
1087443584,1087444223,US
1087444224,1087444479,GB
-1087444480,1087464945,US
+1087444480,1087460863,US
+1087460864,1087461119,CA
+1087461120,1087464945,US
1087464946,1087464949,GB
1087464950,1087466489,US
1087466490,1087466493,GB
@@ -11047,13 +11751,29 @@
1087467292,1087467295,BR
1087467296,1087496703,US
1087496704,1087496959,CA
-1087496960,1087508161,US
+1087496960,1087501567,US
+1087501568,1087501695,HK
+1087501696,1087508161,US
1087508162,1087508162,JP
-1087508163,1087593983,US
+1087508163,1087510271,US
+1087510272,1087510463,CA
+1087510464,1087510495,US
+1087510496,1087510527,CA
+1087510528,1087514623,US
+1087514624,1087515391,BB
+1087515392,1087515647,US
+1087515648,1087516159,BB
+1087516160,1087516415,US
+1087516416,1087516671,BB
+1087516672,1087580927,US
+1087580928,1087581183,BR
+1087581184,1087593983,US
1087593984,1087594239,MX
1087594240,1087608319,US
1087608320,1087608575,GB
-1087608576,1087643723,US
+1087608576,1087626111,US
+1087626112,1087626239,VI
+1087626240,1087643723,US
1087643724,1087643727,FR
1087643728,1087654143,US
1087654144,1087654399,VE
@@ -11061,13 +11781,9 @@
1087678624,1087678655,GB
1087678656,1087686655,US
1087686656,1087686911,PR
-1087686912,1087689215,US
-1087689216,1087689471,AR
-1087689472,1087695319,US
+1087686912,1087695319,US
1087695320,1087695323,GB
-1087695324,1087708685,US
-1087708686,1087708686,AU
-1087708687,1087714335,US
+1087695324,1087714335,US
1087714336,1087714367,NL
1087714368,1087715327,US
1087715328,1087717375,PA
@@ -11080,38 +11796,38 @@
1087735648,1087746079,US
1087746080,1087746083,HK
1087746084,1087758335,US
-1087758336,1087761919,PR
-1087761920,1087762431,US
-1087762432,1087766527,PR
+1087758336,1087762175,PR
+1087762176,1087762431,US
+1087762432,1087763967,PR
+1087763968,1087764223,US
+1087764224,1087766527,PR
1087766528,1087798943,US
1087798944,1087798975,CA
-1087798976,1087799413,US
-1087799414,1087799414,DE
-1087799415,1087799787,US
+1087798976,1087799295,US
+1087799296,1087799372,DE
+1087799373,1087799374,US
+1087799375,1087799551,DE
+1087799552,1087799787,US
1087799788,1087799791,CH
1087799792,1087825663,US
1087825664,1087825919,SA
-1087825920,1087836415,US
-1087836416,1087836671,FR
-1087836672,1087837359,US
-1087837360,1087837367,BR
-1087837368,1087839231,US
-1087839232,1087839487,GB
-1087839488,1087862783,US
+1087825920,1087837183,US
+1087837184,1087837439,BR
+1087837440,1087839231,US
+1087839232,1087839359,GB
+1087839360,1087862783,US
1087862784,1087864831,PA
1087864832,1087873023,US
1087873024,1087873279,CA
1087873280,1087883263,US
1087883264,1087883519,AR
-1087883520,1087884001,US
-1087884002,1087884002,GB
-1087884003,1087950111,US
+1087883520,1087950111,US
1087950112,1087950119,PR
1087950120,1088012767,US
1088012768,1088012775,PR
-1088012776,1088398591,US
-1088398592,1088398719,CA
-1088398720,1088684031,US
+1088012776,1088319103,US
+1088319104,1088319231,CA
+1088319232,1088684031,US
1088684032,1088946175,CA
1088946176,1089053183,US
1089053184,1089053439,BR
@@ -11165,9 +11881,9 @@
1089526784,1089527039,VE
1089527040,1089579519,US
1089579520,1089580031,VE
-1089580032,1089598975,US
-1089598976,1089599231,HK
-1089599232,1089881599,US
+1089580032,1089824767,US
+1089824768,1089825023,VI
+1089825024,1089881599,US
1089881600,1089882111,GB
1089882112,1089882623,US
1089882624,1089883135,GB
@@ -11195,8 +11911,8 @@
1091803392,1091807231,US
1091807232,1091807487,CA
1091807488,1091807999,US
-1091808000,1091808511,CA
-1091808512,1091812351,US
+1091808000,1091808255,CA
+1091808256,1091812351,US
1091812352,1091812607,CN
1091812608,1091960831,US
1091960832,1092026367,CA
@@ -11216,8 +11932,8 @@
1093074944,1093091327,CA
1093091328,1093107967,US
1093107968,1093108479,CA
-1093108480,1093108735,US
-1093108736,1093109247,CA
+1093108480,1093108991,US
+1093108992,1093109247,CA
1093109248,1093109503,US
1093109504,1093109759,CA
1093109760,1093109871,US
@@ -11261,9 +11977,7 @@
1093122816,1093123839,CA
1093123840,1093123951,US
1093123952,1093123967,CA
-1093123968,1093124607,US
-1093124608,1093124863,CA
-1093124864,1093126143,US
+1093123968,1093126143,US
1093126144,1093126399,CA
1093126400,1093126911,US
1093126912,1093127167,CA
@@ -11320,7 +12034,6 @@
1094670800,1095450623,US
1095450624,1095467007,BS
1095467008,1095483391,US
-1095484416,1095484671,US
1095491584,1095627775,US
1095627776,1095628287,CA
1095628288,1096278015,US
@@ -11350,14 +12063,10 @@
1097837199,1097896191,US
1097896192,1097897215,VI
1097897216,1097947135,US
-1097947136,1097947735,VI
-1097947736,1097947743,US
-1097947744,1097949183,VI
+1097947136,1097949183,VI
1097949184,1097951231,US
1097951232,1097953279,VI
-1097953280,1098507263,US
-1098507264,1098507519,CA
-1098507520,1101121535,US
+1097953280,1101121535,US
1101121536,1101121791,EC
1101121792,1101182975,US
1101182976,1101183487,YE
@@ -11387,8 +12096,8 @@
1101475840,1101479935,CO
1101479936,1101484031,US
1101484032,1101488127,CO
-1101488128,1101521407,US
-1101521408,1101521919,AS
+1101488128,1101521663,US
+1101521664,1101521919,AS
1101521920,1101542399,US
1101542400,1101542911,CO
1101542912,1101574655,US
@@ -11405,8 +12114,8 @@
1101681408,1101681663,NL
1101681664,1101750783,US
1101750784,1101751295,BM
-1101751296,1101767935,US
-1101767936,1101768191,CW
+1101751296,1101767679,US
+1101767680,1101768191,CW
1101768192,1101797375,US
1101797376,1101798399,BB
1101798400,1101803519,US
@@ -11472,9 +12181,7 @@
1104842752,1104844799,PR
1104844800,1104924415,US
1104924416,1104924671,IN
-1104924672,1105034495,US
-1105034496,1105034751,IT
-1105034752,1105099519,US
+1104924672,1105099519,US
1105099520,1105099775,EC
1105099776,1106381199,US
1106381200,1106381207,UM
@@ -11602,24 +12309,22 @@
1110573056,1110587391,PR
1110587392,1110587903,US
1110587904,1110588159,PR
-1110588160,1110588671,US
-1110588672,1110589183,PR
-1110589184,1110589439,US
+1110588160,1110588415,US
+1110588416,1110588671,PR
+1110588672,1110589439,US
1110589440,1110590207,PR
1110590208,1110590463,US
-1110590464,1110591231,PR
-1110591232,1110591487,US
-1110591488,1110592255,PR
+1110590464,1110590975,PR
+1110590976,1110591743,US
+1110591744,1110592255,PR
1110592256,1110592511,US
1110592512,1110593023,PR
-1110593024,1110593279,US
-1110593280,1110593535,PR
-1110593536,1110593791,US
+1110593024,1110593791,US
1110593792,1110594047,PR
1110594048,1110594303,US
1110594304,1110594815,PR
-1110594816,1110595583,US
-1110595584,1110598655,PR
+1110594816,1110595776,US
+1110595777,1110598655,PR
1110598656,1110598911,US
1110598912,1110638591,PR
1110638592,1110654463,US
@@ -11634,7 +12339,9 @@
1110853632,1110854655,GB
1110854656,1110855679,US
1110855680,1110856703,CN
-1110856704,1110857727,IN
+1110856704,1110857215,IN
+1110857216,1110857471,DE
+1110857472,1110857727,IN
1110857728,1110858751,SG
1110858752,1110859007,US
1110859008,1110859263,AU
@@ -11644,7 +12351,7 @@
1110867456,1110867967,JM
1110867968,1110887423,US
1110887424,1110887679,IE
-1110887680,1110925311,US
+1110887680,1110929407,US
1110929408,1110933503,BM
1110933504,1111195647,US
1111195648,1111212031,CA
@@ -11677,7 +12384,9 @@
1113603328,1113603583,GT
1113603584,1113603839,US
1113603840,1113604095,CA
-1113604096,1113657343,US
+1113604096,1113643202,US
+1113643203,1113643237,CH
+1113643238,1113657343,US
1113657344,1113661439,CA
1113661440,1113669631,US
1113669632,1113677823,CA
@@ -11705,9 +12414,13 @@
1114511872,1114512127,CA
1114512128,1114513407,US
1114513408,1114513471,SA
-1114513472,1114513535,US
-1114513536,1114515455,SA
-1114515456,1114517503,US
+1114513472,1114513551,US
+1114513552,1114513663,SA
+1114513664,1114514175,US
+1114514176,1114515455,SA
+1114515456,1114515463,US
+1114515464,1114515471,CA
+1114515472,1114517503,US
1114517504,1114518015,CA
1114518016,1114520063,US
1114520064,1114520319,PH
@@ -11763,8 +12476,8 @@
1116016128,1116021247,US
1116021248,1116021503,CI
1116021504,1116024063,US
-1116024064,1116024127,PG
-1116024128,1116027135,US
+1116024064,1116024319,PG
+1116024320,1116027135,US
1116027136,1116027903,DE
1116027904,1116168191,US
1116168192,1116176383,CA
@@ -11788,9 +12501,13 @@
1117420032,1117420415,CA
1117420416,1117420447,US
1117420448,1117421567,CA
-1117421568,1117460223,US
+1117421568,1117458911,US
+1117458912,1117458943,GB
+1117458944,1117460223,US
1117460224,1117460287,GB
-1117460288,1117683711,US
+1117460288,1117480191,US
+1117480192,1117480255,CA
+1117480256,1117683711,US
1117683712,1117691903,CA
1117691904,1117724671,US
1117724672,1117728767,CA
@@ -11872,7 +12589,9 @@
1118975488,1118975743,KE
1118975744,1118975999,US
1118976000,1118976255,GB
-1118976256,1118980607,US
+1118976256,1118980095,US
+1118980096,1118980351,GF
+1118980352,1118980607,US
1118980608,1118980863,TZ
1118980864,1118983423,US
1118983424,1118983679,NI
@@ -11931,9 +12650,7 @@
1119558144,1119558655,PR
1119558656,1119568383,US
1119568384,1119568639,GB
-1119568640,1119570175,US
-1119570176,1119570303,GB
-1119570304,1119571967,US
+1119568640,1119571967,US
1119571968,1119576063,CA
1119576064,1119580159,US
1119580160,1119584255,CA
@@ -11962,18 +12679,24 @@
1120312064,1120312319,PH
1120312320,1120312575,US
1120312576,1120312831,PH
-1120312832,1120346111,US
+1120312832,1120315391,US
+1120315392,1120317439,SG
+1120317440,1120346111,US
1120346112,1120350207,CA
1120350208,1120370687,US
1120370688,1120371199,CA
-1120371200,1120372223,US
+1120371200,1120371567,US
+1120371568,1120371583,CA
+1120371584,1120372223,US
1120372224,1120372479,CA
1120372480,1120372991,US
1120372992,1120373247,CA
1120373248,1120373503,US
1120373504,1120374015,CA
-1120374016,1120374527,US
-1120374528,1120375039,CA
+1120374016,1120374519,US
+1120374520,1120374523,CA
+1120374524,1120374783,US
+1120374784,1120375039,CA
1120375040,1120375551,US
1120375552,1120376063,CA
1120376064,1120376303,US
@@ -12059,8 +12782,12 @@
1120743680,1120744447,US
1120744448,1120744703,KN
1120744704,1120788479,US
-1120793856,1120794111,US
-1120796672,1120854015,US
+1120793088,1120793343,US
+1120796672,1120826367,US
+1120826368,1120826370,CA
+1120826371,1120826371,US
+1120826372,1120826623,CA
+1120826624,1120854015,US
1120854016,1120862207,CA
1120862208,1120875007,US
1120875008,1120875263,AS
@@ -12086,7 +12813,9 @@
1121254144,1121255423,CA
1121255424,1121714998,US
1121714999,1121714999,KW
-1121715000,1121878015,US
+1121715000,1121763327,US
+1121763328,1121767423,CA
+1121767424,1121878015,US
1121878016,1121910783,CA
1121910784,1122074623,US
1122074624,1122087935,CA
@@ -12109,11 +12838,9 @@
1122451456,1122455551,CO
1122455552,1122476031,US
1122476032,1122480127,PR
-1122480128,1122494975,US
-1122494976,1122495231,PR
-1122495232,1122497791,US
-1122497792,1122498047,PR
-1122498048,1122533375,US
+1122480128,1122497327,US
+1122497328,1122497343,BR
+1122497344,1122533375,US
1122533376,1122535423,GB
1122535424,1122538495,KR
1122538496,1122635775,US
@@ -12132,17 +12859,13 @@
1123589632,1123589887,DE
1123589888,1123590143,US
1123590144,1123598335,VI
-1123598336,1123606527,CA
-1123606528,1123635199,US
+1123598336,1123635199,US
1123635200,1123635455,AU
-1123635456,1123635639,GB
+1123635456,1123635639,US
1123635640,1123635640,RU
-1123635641,1123635670,GB
+1123635641,1123635670,US
1123635671,1123635671,RU
-1123635672,1123635711,GB
-1123635712,1123638527,US
-1123638528,1123638783,FR
-1123638784,1123651583,US
+1123635672,1123651583,US
1123651584,1123651839,JM
1123651840,1123652095,BB
1123652096,1123652863,JM
@@ -12164,7 +12887,9 @@
1123801088,1123801343,RU
1123801344,1123848191,US
1123848192,1123852287,CA
-1123852288,1123950591,US
+1123852288,1123929599,US
+1123929600,1123929855,CA
+1123929856,1123950591,US
1123950592,1123958783,CA
1123958784,1125064703,US
1125064704,1125065215,GB
@@ -12201,9 +12926,7 @@
1125481728,1125489151,US
1125489152,1125490687,CA
1125490688,1125498879,US
-1125498880,1125501439,CA
-1125501440,1125501695,US
-1125501696,1125508095,CA
+1125498880,1125508095,CA
1125508096,1125508351,PA
1125508352,1125514239,CA
1125514240,1125514495,CY
@@ -12235,13 +12958,17 @@
1128529920,1128641023,CA
1128641024,1128641535,US
1128641536,1128792063,CA
-1128792064,1130537215,US
+1128792064,1128817407,US
+1128817408,1128817663,NL
+1128817664,1130537215,US
1130537216,1130537471,GU
1130537472,1130537727,US
1130537728,1130537983,GU
1130537984,1130538751,US
1130538752,1130539007,GU
-1130539008,1133461247,US
+1130539008,1133226239,US
+1133226240,1133226495,AS
+1133226496,1133461247,US
1133461248,1133461503,CA
1133461504,1133785439,US
1133785440,1133785471,GB
@@ -12252,8 +12979,10 @@
1134448640,1134546943,US
1134546944,1134551039,CA
1134551040,1136523263,US
-1136523264,1136523775,CA
-1136523776,1136721919,US
+1136523264,1136523391,CA
+1136523392,1136523519,US
+1136523520,1136523647,CA
+1136523648,1136721919,US
1136721920,1136787455,CA
1136787456,1137195519,US
1137195520,1137195775,JP
@@ -12286,8 +13015,12 @@
1137524736,1137541119,CA
1137541120,1137623039,US
1137623040,1137639423,PR
-1137639424,1137704959,US
-1137704960,1137712383,CA
+1137639424,1137680959,US
+1137680960,1137680975,UA
+1137680976,1137704959,US
+1137704960,1137706239,CA
+1137706240,1137706495,US
+1137706496,1137712383,CA
1137712384,1137712639,US
1137712640,1137713151,CA
1137713152,1137758207,US
@@ -12303,9 +13036,7 @@
1137893376,1137917951,US
1137917952,1137922047,CA
1137922048,1137926143,US
-1137926144,1137926655,CA
-1137926656,1137926911,AW
-1137926912,1137929727,CA
+1137926144,1137929727,CA
1137929728,1137929983,IE
1137929984,1137934335,CA
1137934336,1137950719,US
@@ -12318,7 +13049,9 @@
1137975296,1137983487,US
1137983488,1137991679,CA
1137991680,1138049023,US
-1138049024,1138061311,CA
+1138049024,1138053631,CA
+1138053632,1138053887,US
+1138053888,1138061311,CA
1138061312,1138069503,US
1138069504,1138073599,JM
1138073600,1138163711,US
@@ -12336,12 +13069,10 @@
1138196480,1138204671,CA
1138204672,1138212863,US
1138212864,1138216959,CA
-1138216960,1138372863,US
-1138372864,1138373119,AS
-1138373120,1138373887,US
-1138373888,1138374655,AS
-1138374656,1138374911,US
-1138374912,1138375679,AS
+1138216960,1138374143,US
+1138374144,1138374399,AS
+1138374400,1138375167,US
+1138375168,1138375679,AS
1138375680,1138419711,US
1138419712,1138419967,DE
1138419968,1138499583,US
@@ -12366,7 +13097,9 @@
1138774016,1138778111,CA
1138778112,1138780671,US
1138780672,1138780679,CA
-1138780680,1138786303,US
+1138780680,1138781183,US
+1138781184,1138781439,CA
+1138781440,1138786303,US
1138786304,1138819071,PR
1138819072,1138851839,CA
1138851840,1138917375,US
@@ -12379,25 +13112,23 @@
1139167232,1139167743,US
1139167744,1139168767,PR
1139168768,1139169279,US
-1139169280,1139170303,PR
-1139170304,1139171071,US
+1139169280,1139170175,PR
+1139170176,1139170815,US
+1139170816,1139170943,PR
+1139170944,1139171071,US
1139171072,1139171327,PR
-1139171328,1139175679,US
-1139175680,1139175807,PR
-1139175808,1139179519,US
+1139171328,1139179519,US
1139179520,1139195903,CA
1139195904,1139216383,US
1139216384,1139220479,CA
1139220480,1139265535,US
1139265536,1139269631,CA
-1139269632,1144796671,US
-1144796672,1144796799,CA
-1144796800,1144796927,US
-1144796928,1144797055,CA
-1144797056,1145141247,US
-1145142784,1145158143,US
-1145158144,1145158655,CA
-1145158656,1145188351,US
+1139269632,1143726207,US
+1143726208,1143726335,CA
+1143726336,1144796671,US
+1144796672,1144796927,CA
+1144796928,1145141247,US
+1145142784,1145188351,US
1145188352,1145192447,CA
1145192448,1145242111,US
1145242112,1145242367,NO
@@ -12424,9 +13155,7 @@
1145430016,1145475071,US
1145475072,1145479167,CA
1145479168,1145503743,US
-1145503744,1145506815,CA
-1145506816,1145507071,US
-1145507072,1145520127,CA
+1145503744,1145520127,CA
1145520128,1145552895,US
1145552896,1145556991,CA
1145556992,1150043135,US
@@ -12461,23 +13190,25 @@
1151946240,1151946751,GB
1151946752,1152073727,US
1152073728,1152077823,CA
-1152077824,1152083455,US
-1152083456,1152083711,MO
-1152083712,1152116479,US
+1152077824,1152116479,US
1152116480,1152116735,CA
1152116736,1152117759,US
1152117760,1152117952,IL
1152117953,1152117953,CA
1152117954,1152118015,IL
-1152118016,1152121855,US
-1152121856,1152122111,ID
-1152122112,1152581631,US
+1152118016,1152120319,US
+1152120320,1152120575,CA
+1152120576,1152581631,US
1152581632,1152614399,CA
1152614400,1152778239,US
1152778240,1152843775,CA
1152843776,1156071423,US
1156071424,1156079615,CA
-1156079616,1156263935,US
+1156079616,1156243455,US
+1156243456,1156245503,CA
+1156245504,1156249599,US
+1156249600,1156250623,CA
+1156250624,1156263935,US
1156263936,1156265983,CA
1156265984,1156296703,US
1156296704,1156300799,CA
@@ -12489,7 +13220,13 @@
1157912704,1157912831,CA
1157912832,1157913215,US
1157913216,1157913279,CA
-1157913280,1157931007,US
+1157913280,1157914194,US
+1157914195,1157914202,IN
+1157914203,1157914234,US
+1157914235,1157914242,IN
+1157914243,1157914258,US
+1157914259,1157914266,IN
+1157914267,1157931007,US
1157931008,1157935103,BS
1157935104,1157943295,US
1157943296,1157947391,CA
@@ -12511,17 +13248,14 @@
1158340608,1158344703,CA
1158344704,1158348799,US
1158348800,1158381567,CA
-1158381568,1158414591,US
-1158416336,1158416351,US
-1158416896,1158417151,US
-1158420480,1158439167,US
-1158439296,1158439423,US
-1158439680,1158439935,US
+1158381568,1158438911,US
1158441216,1158441471,US
1158443008,1158724607,US
1158724608,1158724863,NL
1158724864,1158774783,US
-1158774784,1158791167,CA
+1158774784,1158784703,CA
+1158784704,1158784767,US
+1158784768,1158791167,CA
1158791168,1158794239,BM
1158794240,1158794495,US
1158794496,1158799359,BM
@@ -12532,7 +13266,11 @@
1159213056,1159217151,CA
1159217152,1159249919,US
1159249920,1159254015,PR
-1159254016,1159269119,US
+1159254016,1159262475,US
+1159262476,1159262479,SA
+1159262480,1159262487,US
+1159262488,1159262491,SA
+1159262492,1159269119,US
1159269120,1159269375,AR
1159269376,1159274495,US
1159274496,1159274751,GB
@@ -12546,7 +13284,11 @@
1159348224,1159356415,CA
1159356416,1159421951,US
1159421952,1159430143,CA
-1159430144,1159512575,US
+1159430144,1159480063,US
+1159480064,1159480319,CA
+1159480320,1159483903,US
+1159483904,1159484415,CA
+1159484416,1159512575,US
1159512576,1159512831,CA
1159512832,1159513599,US
1159513600,1159514879,CA
@@ -12566,7 +13308,9 @@
1159519744,1159520255,CA
1159520256,1159521535,US
1159521536,1159521791,CA
-1159521792,1159522815,US
+1159521792,1159522223,US
+1159522224,1159522239,CA
+1159522240,1159522815,US
1159522816,1159523071,CA
1159523072,1159523583,US
1159523584,1159524351,CA
@@ -12574,20 +13318,22 @@
1159525376,1159526399,CA
1159526400,1159527935,US
1159527936,1159528191,CA
-1159528192,1159694591,US
+1159528192,1159668479,US
+1159668480,1159668735,CA
+1159668736,1159694591,US
1159694592,1159694847,CA
1159694848,1159700479,US
1159700480,1159725055,CA
1159725056,1160011775,US
1160011776,1160019967,CA
-1160019968,1160202239,US
-1160202240,1160202495,CA
-1160202496,1160364031,US
+1160019968,1160364031,US
1160364032,1160368127,CA
1160368128,1160373247,US
1160373248,1160373503,AE
1160373504,1160392703,US
-1160392704,1160396799,CA
+1160392704,1160393215,CA
+1160393216,1160393727,US
+1160393728,1160396799,CA
1160396800,1160405759,US
1160405760,1160406015,DO
1160406016,1160406319,US
@@ -12615,9 +13361,7 @@
1160610816,1160665599,US
1160665600,1160665855,CH
1160665856,1160667135,US
-1160667136,1160667903,CA
-1160667904,1160668159,US
-1160668160,1160675327,CA
+1160667136,1160675327,CA
1160675328,1160678399,US
1160678400,1160678655,MX
1160678656,1160683519,US
@@ -12669,23 +13413,19 @@
1161428224,1161428991,KN
1161428992,1161429247,US
1161429248,1161429503,CA
-1161429504,1161429759,US
-1161429760,1161431039,CA
+1161429504,1161429951,US
+1161429952,1161430015,CA
+1161430016,1161430783,US
+1161430784,1161431039,CA
1161431040,1161433087,US
1161433088,1161437183,CA
1161437184,1161453567,US
1161453568,1161457663,CA
1161457664,1161576447,US
-1161576448,1161578111,CA
-1161578112,1161578239,US
-1161578240,1161580543,CA
-1161580544,1161586687,US
-1161586688,1161586943,PA
-1161586944,1161617407,US
+1161576448,1161580543,CA
+1161580544,1161617407,US
1161617408,1161625599,CA
-1161625600,1161627703,US
-1161627704,1161627711,DE
-1161627712,1161631623,US
+1161625600,1161631623,US
1161631624,1161631631,KW
1161631632,1161649407,US
1161649408,1161649663,AR
@@ -12698,7 +13438,11 @@
1161830426,1161830426,UA
1161830427,1161830596,US
1161830597,1161830597,UA
-1161830598,1161831384,US
+1161830598,1161831090,US
+1161831091,1161831091,DE
+1161831092,1161831305,US
+1161831306,1161831306,DE
+1161831307,1161831384,US
1161831385,1161831385,UA
1161831386,1161832483,US
1161832484,1161832484,UA
@@ -12706,7 +13450,9 @@
1161835226,1161835226,UA
1161835227,1161835230,US
1161835231,1161835231,PH
-1161835232,1161837567,US
+1161835232,1161835338,US
+1161835339,1161835339,DE
+1161835340,1161837567,US
1161837568,1161837823,JP
1161837824,1161885695,US
1161885696,1161886207,JP
@@ -12795,9 +13541,7 @@
1163472896,1163479295,US
1163479296,1163479551,CA
1163479552,1163526143,US
-1163526144,1163526399,CA
-1163526400,1163526655,US
-1163526656,1163526911,CA
+1163526144,1163526911,CA
1163526912,1163527167,US
1163527168,1163527679,CA
1163527680,1163527935,US
@@ -12821,8 +13565,8 @@
1163540480,1163540735,US
1163540736,1163541503,CA
1163541504,1163542015,US
-1163542016,1163542783,CA
-1163542784,1163543295,US
+1163542016,1163542527,CA
+1163542528,1163543295,US
1163543296,1163543551,CA
1163543552,1163544063,US
1163544064,1163544319,CA
@@ -12889,7 +13633,9 @@
1163580928,1163581183,CA
1163581184,1163581695,US
1163581696,1163581951,CA
-1163581952,1163582031,US
+1163581952,1163582003,US
+1163582004,1163582007,CA
+1163582008,1163582031,US
1163582032,1163582039,CA
1163582040,1163582079,US
1163582080,1163582111,CA
@@ -12921,8 +13667,14 @@
1168393664,1168393983,CA
1168393984,1168394143,US
1168394144,1168394151,CA
-1168394152,1168394239,US
-1168394240,1168394495,CA
+1168394152,1168394279,US
+1168394280,1168394303,CA
+1168394304,1168394399,US
+1168394400,1168394407,CA
+1168394408,1168394431,US
+1168394432,1168394447,CA
+1168394448,1168394479,US
+1168394480,1168394495,CA
1168394496,1168394575,US
1168394576,1168394591,CA
1168394592,1168394719,US
@@ -12944,7 +13696,8 @@
1168687104,1168697599,US
1168697600,1168697855,GB
1168697856,1168698111,NL
-1168698112,1168727551,US
+1168698112,1168698367,GB
+1168698368,1168727551,US
1168727552,1168727807,ES
1168727808,1168859135,US
1168859136,1168863231,CA
@@ -12997,7 +13750,8 @@
1169203200,1169211391,CA
1169211392,1170190335,US
1170190336,1170190847,GB
-1170190848,1170227199,US
+1170190848,1170191103,JP
+1170191104,1170227199,US
1170227200,1170231295,NL
1170231296,1170461183,US
1170461184,1170461695,CO
@@ -13017,7 +13771,11 @@
1170522112,1175728639,US
1175728640,1175728895,CA
1175728896,1175977983,US
-1175977984,1176502271,CA
+1175977984,1176068167,CA
+1176068168,1176068175,US
+1176068176,1176068191,CA
+1176068192,1176068207,US
+1176068208,1176502271,CA
1176502272,1176616959,US
1176616960,1176620031,CA
1176620032,1176620447,US
@@ -13039,7 +13797,9 @@
1176702976,1176707071,CA
1176707072,1176731647,US
1176731648,1176735743,PR
-1176735744,1176738303,US
+1176735744,1176736767,US
+1176736768,1176737023,NG
+1176737024,1176738303,US
1176738304,1176739071,CO
1176739072,1176739583,US
1176739584,1176739839,CO
@@ -13086,13 +13846,13 @@
1177075456,1177164863,US
1177164864,1177164895,CA
1177164896,1177165055,US
-1177165056,1177165311,CA
+1177165056,1177165061,CA
+1177165062,1177165062,US
+1177165063,1177165311,CA
1177165312,1177354239,US
-1177354240,1177357311,PR
-1177357312,1177357567,US
-1177357568,1177405695,PR
-1177405696,1177405951,US
-1177405952,1177419775,PR
+1177354240,1177356799,PR
+1177356800,1177357055,US
+1177357056,1177419775,PR
1177419776,1177505401,US
1177505402,1177505402,BB
1177505403,1177550847,US
@@ -13115,9 +13875,9 @@
1192468480,1192476671,CA
1192476672,1192488959,US
1192488960,1192493055,CA
-1192493056,1207932159,US
-1207932160,1207932415,CA
-1207932416,1207975935,US
+1192493056,1207032703,US
+1207032704,1207032831,CA
+1207032832,1207975935,US
1207975936,1207980031,CA
1207980032,1208008703,US
1208008704,1208016895,CA
@@ -13216,15 +13976,15 @@
1209867520,1209917439,US
1209917440,1209925631,CA
1209925632,1210253311,US
-1210253312,1210258431,CA
-1210258432,1210258687,US
-1210258688,1210261503,CA
+1210253312,1210261503,CA
1210261504,1210420223,US
1210420224,1210420479,IT
1210420480,1210421503,US
1210421504,1210421551,CA
1210421552,1210449919,US
-1210449920,1210580991,CA
+1210449920,1210554367,CA
+1210554368,1210554623,US
+1210554624,1210580991,CA
1210580992,1210847231,US
1210851328,1210925055,US
1210925056,1210941439,CA
@@ -13296,9 +14056,11 @@
1224473600,1224474623,US
1224474624,1224475647,GT
1224475648,1224476671,US
-1224476672,1224476927,CW
-1224476928,1224477183,US
-1224477184,1224478719,CW
+1224476672,1224476927,SX
+1224476928,1224477439,US
+1224477440,1224477695,SX
+1224477696,1224477951,US
+1224477952,1224478719,SX
1224478720,1224480767,US
1224480768,1224484863,JM
1224484864,1224493055,GT
@@ -13341,7 +14103,9 @@
1246923520,1246923775,AU
1246923776,1246937087,US
1246937088,1246945279,CA
-1246945280,1247119439,US
+1246945280,1247060479,US
+1247060480,1247060735,CA
+1247060736,1247119439,US
1247119440,1247119447,KW
1247119448,1247119967,US
1247119968,1247119975,KW
@@ -13350,7 +14114,9 @@
1247123712,1247123967,US
1247123968,1247124223,LU
1247124224,1247490047,US
-1247494144,1248864255,US
+1247494144,1247556640,US
+1247556641,1247556641,CA
+1247556642,1248864255,US
1248864256,1248866303,CA
1248866304,1248879615,US
1248880640,1248885759,US
@@ -13409,7 +14175,9 @@
1249139712,1249140735,MF
1249140736,1249142015,US
1249142016,1249142271,GB
-1249142272,1249163263,US
+1249142272,1249146879,US
+1249146880,1249147903,CA
+1249147904,1249163263,US
1249163264,1249165311,CA
1249165312,1249165823,US
1249165824,1249166335,CA
@@ -13437,7 +14205,9 @@
1249256448,1249257471,CA
1249257472,1249260543,US
1249260544,1249261567,CA
-1249261568,1249272831,US
+1249261568,1249267711,US
+1249267712,1249268735,AF
+1249268736,1249272831,US
1249272832,1249273855,CA
1249273856,1249281023,US
1249282048,1249310719,US
@@ -13459,7 +14229,6 @@
1249397760,1249409023,US
1249409024,1249410047,CA
1249410048,1249432575,US
-1249433088,1249433343,US
1249433600,1249434623,US
1249434624,1249435647,CA
1249435648,1249449983,US
@@ -13496,7 +14265,8 @@
1249592320,1249593343,CA
1249593344,1249598463,US
1249598464,1249599487,CA
-1249599488,1249637887,US
+1249599488,1249609983,US
+1249611776,1249637887,US
1249637888,1249638143,CA
1249638144,1249710143,US
1249710144,1249710207,CN
@@ -13505,19 +14275,23 @@
1249710592,1249710847,DE
1249710848,1249715711,US
1249715712,1249715967,DE
-1249715968,1249716735,US
+1249715968,1249716479,US
+1249716480,1249716735,TW
1249716736,1249716991,DE
-1249716992,1249720319,US
-1249720320,1249720511,AU
+1249716992,1249718015,US
+1249718016,1249718271,BE
+1249718272,1249720319,US
+1249720320,1249720351,AU
+1249720352,1249720367,JP
+1249720368,1249720383,SG
+1249720384,1249720511,AU
1249720512,1249720527,IN
1249720528,1249720575,AU
1249720576,1249720591,FR
1249720592,1249720599,GB
1249720600,1249720607,IT
1249720608,1249720831,GB
-1249720832,1249721119,US
-1249721120,1249721135,CA
-1249721136,1249721343,US
+1249720832,1249721343,US
1249721344,1249721351,AT
1249721352,1249721359,BE
1249721360,1249721367,CH
@@ -13539,7 +14313,8 @@
1249721512,1249721519,TR
1249721520,1249721527,ZA
1249721528,1249721535,DK
-1249721536,1249721543,US
+1249721536,1249721539,PL
+1249721540,1249721543,US
1249721544,1249721551,GB
1249721552,1249721599,US
1249721600,1249721607,AT
@@ -13568,9 +14343,16 @@
1249721792,1249721799,KE
1249721800,1249721807,TR
1249721808,1249721815,ZA
-1249721816,1249722111,US
+1249721816,1249721833,US
+1249721834,1249721835,GB
+1249721836,1249722111,US
1249722112,1249722367,IN
-1249722368,1249725439,US
+1249722368,1249724671,US
+1249724672,1249724694,BE
+1249724695,1249724695,US
+1249724696,1249724927,BE
+1249724928,1249725183,FI
+1249725184,1249725439,US
1249725440,1249725695,NL
1249725696,1249725951,US
1249725952,1249726207,NL
@@ -13578,9 +14360,15 @@
1249728000,1249728255,HU
1249728256,1249744895,US
1249744896,1249745151,TW
-1249745152,1249754390,US
+1249745152,1249752319,US
+1249752320,1249752575,BE
+1249752576,1249754111,US
+1249754112,1249754367,IE
+1249754368,1249754390,US
1249754391,1249754391,DE
-1249754392,1249796095,US
+1249754392,1249754623,US
+1249754624,1249754879,SG
+1249754880,1249796095,US
1249796096,1249804287,CA
1249804288,1249851903,US
1249851904,1249852159,FR
@@ -13597,7 +14385,9 @@
1254704640,1254978751,US
1254978752,1254978767,LB
1254978768,1254989823,US
-1254989824,1254998015,CA
+1254989824,1254990335,CA
+1254990336,1254990591,US
+1254990592,1254998015,CA
1254998016,1255002111,US
1255002112,1255006207,CA
1255006208,1255011583,US
@@ -13622,7 +14412,9 @@
1255514112,1255522303,CA
1255522304,1255571455,US
1255571456,1255579647,CA
-1255579648,1255669759,US
+1255579648,1255588351,US
+1255588352,1255588607,NL
+1255588608,1255669759,US
1255669760,1255735295,CA
1255735296,1255770367,US
1255770368,1255770623,CA
@@ -13643,8 +14435,8 @@
1262783744,1262783871,US
1262783872,1262783999,CA
1262784000,1262784127,US
-1262784128,1262784255,CA
-1262784256,1263271423,US
+1262784128,1262784511,CA
+1262784512,1263271423,US
1263271424,1263271679,CA
1263271680,1264717823,US
1264717824,1264718079,CA
@@ -13658,11 +14450,17 @@
1264763648,1264766975,CA
1264766976,1264990975,US
1264990976,1264991231,NL
-1264991232,1266147327,US
+1264991232,1264991311,US
+1264991312,1264991319,JP
+1264991320,1266147327,US
1266147328,1266155519,CA
1266155520,1267934968,US
1267934969,1267934969,CA
-1267934970,1268252671,US
+1267934970,1268152737,US
+1268152738,1268152738,CA
+1268152739,1268200732,US
+1268200733,1268200733,VI
+1268200734,1268252671,US
1268252672,1268776959,CA
1268776960,1275600895,US
1275600896,1275604991,BM
@@ -13692,8 +14490,8 @@
1279262720,1279787007,CA
1279787008,1279848447,US
1279848448,1279851519,PR
-1279851520,1279852031,VI
-1279852032,1279852543,PR
+1279851520,1279851775,VI
+1279851776,1279852543,PR
1279852544,1279950847,US
1279950848,1279951103,CA
1279951104,1279951231,US
@@ -13702,7 +14500,9 @@
1279952384,1279952895,CA
1279952896,1279953151,US
1279953152,1279953663,CA
-1279953664,1279959551,US
+1279953664,1279953759,US
+1279953760,1279953791,CA
+1279953792,1279959551,US
1279959552,1279959807,CA
1279959808,1279960479,US
1279960480,1279960511,CA
@@ -13757,9 +14557,12 @@
1280097280,1280097791,LC
1280097792,1280098303,AG
1280098304,1280102399,PR
-1280102400,1280131071,US
+1280102400,1280126975,US
+1280126976,1280131071,JP
1280131072,1280139263,CA
-1280139264,1291845631,US
+1280139264,1285866305,US
+1285866306,1285866306,GB
+1285866307,1291845631,US
1291845632,1292894207,DE
1292894208,1293156351,NO
1293156352,1293549567,DE
@@ -13811,7 +14614,9 @@
1296236672,1296236799,US
1296236800,1296237439,FR
1296237440,1296237567,IT
-1296237568,1296238591,FR
+1296237568,1296237823,FR
+1296237824,1296237824,GB
+1296237825,1296238591,FR
1296238592,1296239103,NL
1296239104,1296239231,FR
1296239232,1296239359,NL
@@ -13833,7 +14638,9 @@
1296247296,1296248959,FR
1296248960,1296249023,DE
1296249024,1296249087,GB
-1296249088,1296250367,FR
+1296249088,1296249279,FR
+1296249280,1296249343,DE
+1296249344,1296250367,FR
1296250368,1296250399,CZ
1296250400,1296250431,DE
1296250432,1296250463,PL
@@ -13868,7 +14675,8 @@
1296256848,1296258303,FR
1296258304,1296259071,NL
1296259072,1296259839,FR
-1296259840,1296260351,NL
+1296259840,1296260095,NL
+1296260096,1296260351,US
1296260352,1296261119,FR
1296261120,1296262143,DE
1296262144,1296262399,FR
@@ -13889,13 +14697,11 @@
1296367616,1296400383,GR
1296400384,1296433151,BH
1296433152,1296465919,BG
-1296465920,1296470015,LT
-1296470016,1296473087,NO
-1296473088,1296475135,LT
-1296475136,1296476159,US
-1296476160,1296479743,LT
+1296465920,1296474111,FR
+1296474112,1296476159,US
+1296476160,1296479743,FR
1296479744,1296482303,NO
-1296482304,1296498687,LT
+1296482304,1296498687,FR
1296498688,1296531455,BG
1296531456,1296564223,MT
1296564224,1296566271,GB
@@ -13952,7 +14758,9 @@
1296677640,1296677647,NG
1296677648,1296677727,JE
1296677728,1296677735,NG
-1296677736,1296678903,JE
+1296677736,1296678791,JE
+1296678792,1296678799,NG
+1296678800,1296678903,JE
1296678904,1296678911,NG
1296678912,1296680959,SA
1296680960,1296683007,ES
@@ -14038,9 +14846,17 @@
1297072128,1297088511,PL
1297088512,1297121279,AT
1297121280,1297154047,SE
-1297154048,1297178623,RO
+1297154048,1297173503,RO
+1297173504,1297173759,IR
+1297173760,1297173775,IQ
+1297173776,1297175551,IR
+1297175552,1297178623,RO
1297178624,1297178879,NL
-1297178880,1297215487,RO
+1297178880,1297182719,RO
+1297182720,1297184767,ES
+1297184768,1297203199,RO
+1297203200,1297211391,IR
+1297211392,1297215487,RO
1297215488,1297217535,NL
1297217536,1297219583,RO
1297219584,1297285119,RU
@@ -14161,7 +14977,7 @@
1298137088,1298661375,GB
1298661376,1298677759,FR
1298677760,1298694143,IR
-1298694144,1298710527,RO
+1298694144,1298710527,BG
1298710528,1298726911,CZ
1298726912,1298743295,RS
1298743296,1298759679,FI
@@ -14199,22 +15015,21 @@
1299120128,1299136511,SI
1299136512,1299169279,HU
1299169280,1299174399,FR
-1299174400,1299176447,GB
-1299176448,1299177471,FR
-1299177472,1299179519,DE
-1299179520,1299185663,FR
+1299174400,1299178495,GB
+1299178496,1299185663,FR
1299185664,1299447807,PL
1299447808,1299709951,AT
1299709952,1299972095,UA
1299972096,1300234239,IL
1300234240,1302331391,FR
-1302331392,1303379967,NL
+1302331392,1303359999,NL
+1303360000,1303360255,DE
+1303360256,1303379967,NL
1303379968,1304428543,DE
1304428544,1305477119,FR
1305477120,1305739263,ES
1305739264,1306001407,DK
-1306001408,1306132479,RU
-1306132480,1306198015,SE
+1306001408,1306198015,SE
1306198016,1306206207,LV
1306206208,1306214399,HR
1306214400,1306222591,LT
@@ -14342,10 +15157,8 @@
1307623424,1307627519,FR
1307627520,1307631615,SE
1307631616,1307635711,IT
-1307635712,1307636991,EE
-1307636992,1307637247,LV
-1307637248,1307637503,EE
-1307637504,1307637759,LV
+1307635712,1307636735,EE
+1307636736,1307637759,LV
1307637760,1307639807,LT
1307639808,1307643903,IT
1307643904,1307652095,RU
@@ -14374,9 +15187,9 @@
1307742208,1307746303,HU
1307746304,1307750399,UA
1307750400,1307754495,IT
-1307754496,1307757289,GB
-1307757290,1307757293,FR
-1307757294,1307758591,GB
+1307754496,1307757055,GB
+1307757056,1307757311,FR
+1307757312,1307758591,GB
1307758592,1307762687,SM
1307762688,1307766783,PL
1307766784,1307770879,GB
@@ -14389,6 +15202,7 @@
1307807744,1307811839,SE
1307811840,1307815935,NL
1307816192,1307816447,GB
+1307817286,1307817286,DE
1307817984,1307818048,GB
1307818049,1307818049,BE
1307818050,1307818239,GB
@@ -14423,7 +15237,7 @@
1307926528,1307930623,KZ
1307930624,1307934719,RU
1307934720,1307938815,FR
-1307938816,1307942911,US
+1307938816,1307942911,TR
1307942912,1307947007,RU
1307947008,1307951103,CH
1307951104,1307959295,RU
@@ -14469,7 +15283,11 @@
1308360704,1308622847,PL
1308622848,1308884991,HR
1308884992,1309147135,IT
-1309147136,1309409279,PL
+1309147136,1309154303,PL
+1309154304,1309154815,DE
+1309154816,1309203967,PL
+1309203968,1309204479,DE
+1309204480,1309409279,PL
1309409280,1309671423,IT
1309671424,1309933567,IE
1309933568,1310195711,BE
@@ -14521,19 +15339,7 @@
1310588928,1310605311,RU
1310605312,1310621695,PL
1310621696,1310638079,RS
-1310638080,1310639615,RU
-1310639616,1310639871,UA
-1310639872,1310640639,RU
-1310640640,1310641407,UA
-1310641408,1310642175,RU
-1310642176,1310642431,UA
-1310642432,1310643711,RU
-1310643712,1310644223,UA
-1310644224,1310648063,RU
-1310648064,1310648319,UA
-1310648320,1310650623,RU
-1310650624,1310650879,UA
-1310650880,1310656511,RU
+1310638080,1310656511,RU
1310656512,1310657535,GB
1310657536,1310658559,SE
1310658560,1310660607,RU
@@ -14583,9 +15389,7 @@
1311250432,1311252479,RU
1311252480,1311253447,GB
1311253448,1311253455,IT
-1311253456,1311254447,GB
-1311254448,1311254455,IT
-1311254456,1311254527,GB
+1311253456,1311254527,GB
1311254528,1311256575,SE
1311256576,1311258623,FR
1311258624,1311262719,GB
@@ -14611,11 +15415,13 @@
1311301632,1311303679,TR
1311303680,1311307775,GB
1311307776,1311309823,IS
-1311309824,1311310591,GB
-1311310592,1311310847,GG
+1311309824,1311310335,GB
+1311310336,1311310847,GG
1311310848,1311310857,GB
1311310858,1311310858,GG
-1311310859,1311311871,GB
+1311310859,1311311103,GB
+1311311104,1311311359,GG
+1311311360,1311311871,GB
1311311872,1311315967,CZ
1311315968,1311318015,PL
1311318016,1311320063,RU
@@ -14646,9 +15452,11 @@
1311506432,1311637503,CZ
1311637504,1312292863,DE
1312292864,1312817151,LT
-1312817152,1313183103,SE
-1313183104,1313183231,DK
-1313183232,1313865727,SE
+1312817152,1313144959,SE
+1313144960,1313145087,DK
+1313145088,1313391615,SE
+1313391616,1313391871,DK
+1313391872,1313865727,SE
1313865728,1313931263,CZ
1313931264,1313996799,RU
1313996800,1314062335,SE
@@ -14664,7 +15472,8 @@
1314652160,1314717695,HU
1314717696,1314783231,SA
1314783232,1314848767,DE
-1314848768,1315045375,RO
+1314848768,1314914303,SA
+1314914304,1315045375,RO
1315045376,1315176447,SK
1315176448,1315307519,QA
1315307520,1315438591,CZ
@@ -14682,10 +15491,9 @@
1315741696,1315745791,LB
1315745792,1315749887,CZ
1315749888,1315753983,RU
-1315758080,1315758847,RE
-1315758848,1315760639,FR
-1315760640,1315760895,RE
-1315760896,1315761407,FR
+1315758080,1315760383,FR
+1315760384,1315761151,RE
+1315761152,1315761407,FR
1315761408,1315761663,RE
1315761664,1315761919,FR
1315761920,1315762175,RE
@@ -14723,7 +15531,7 @@
1315893248,1315897343,RU
1315897344,1315901439,IR
1315901440,1315905535,UA
-1315905536,1315909631,SI
+1315905536,1315909631,BA
1315909632,1315913727,AZ
1315913728,1315917823,DE
1315917824,1315921919,RU
@@ -14771,7 +15579,9 @@
1317636096,1317637119,IE
1317637120,1317642239,GB
1317642240,1317642495,IE
-1317642496,1317646551,GB
+1317642496,1317643316,GB
+1317643317,1317643317,IE
+1317643318,1317646551,GB
1317646552,1317646559,IE
1317646560,1317647015,GB
1317647016,1317647023,IE
@@ -14790,7 +15600,9 @@
1317765120,1317781503,GE
1317781504,1317814271,RU
1317814272,1317830655,DE
-1317830656,1317847039,NL
+1317830656,1317831167,NL
+1317831168,1317831423,RU
+1317831424,1317847039,NL
1317847040,1317863423,RU
1317863424,1317879807,GB
1317879808,1317896191,SK
@@ -14819,10 +15631,7 @@
1318682624,1318690815,RU
1318690816,1318699007,DK
1318699008,1318707199,IE
-1318707200,1318707455,FR
-1318707456,1318713023,GB
-1318713024,1318713087,FR
-1318713088,1318715391,GB
+1318707200,1318715391,FR
1318715392,1318723583,BG
1318723584,1318731775,IR
1318731776,1318739967,PL
@@ -14845,7 +15654,9 @@
1318871040,1318879231,DK
1318879232,1318887423,CZ
1318887424,1318895615,PL
-1318895616,1318903807,DK
+1318895616,1318900735,DK
+1318900736,1318900991,SE
+1318900992,1318903807,DK
1318903808,1318911999,RU
1318912000,1318920191,MK
1318920192,1318928383,IR
@@ -14900,8 +15711,7 @@
1331836928,1331838975,FR
1331838976,1331841023,ES
1331841024,1331843071,CZ
-1331843072,1331844863,GB
-1331844864,1331845119,FR
+1331843072,1331845119,GB
1331845120,1331847167,RU
1331847168,1331849215,FR
1331849216,1331851263,BG
@@ -14913,7 +15723,6 @@
1331861504,1331863551,CZ
1331863552,1331865599,GB
1331865600,1331869695,NL
-1331869696,1331871743,SA
1331871744,1331873791,DK
1331873792,1331877887,RU
1331877888,1331879935,ES
@@ -14942,12 +15751,17 @@
1331931136,1331933183,SE
1331933184,1331935231,TR
1331935232,1331937279,NL
-1331937280,1331939327,GB
+1331937280,1331938063,NG
+1331938064,1331938079,GB
+1331938080,1331938431,NG
+1331938432,1331938559,GB
+1331938560,1331939071,NG
+1331939072,1331939327,GB
1331939328,1331941375,BE
1331941376,1331943423,ES
1331943424,1331945471,RU
1331945472,1331947519,SE
-1331947520,1331949567,CH
+1331947520,1331949567,DE
1331949568,1331951615,RU
1331951616,1331953663,GE
1331953664,1332019199,BG
@@ -15037,15 +15851,28 @@
1334479360,1334479871,SE
1334479872,1334480639,DK
1334480640,1334484991,SE
-1334484992,1334487039,DK
+1334484992,1334485503,DK
+1334485504,1334485759,SE
+1334485760,1334486015,DK
+1334486016,1334486527,SE
+1334486528,1334487039,DK
1334487040,1334487295,SE
-1334487296,1334489087,DK
+1334487296,1334487551,DK
+1334487552,1334487807,SE
+1334487808,1334489087,DK
1334489088,1334501631,SE
-1334501632,1334508031,DK
-1334508032,1334508415,SE
-1334508416,1334509055,DK
-1334509056,1334509311,SE
-1334509312,1334509567,DK
+1334501632,1334501887,DK
+1334501888,1334502143,SE
+1334502144,1334502911,DK
+1334502912,1334503423,SE
+1334503424,1334505855,DK
+1334505856,1334506239,SE
+1334506240,1334507007,DK
+1334507008,1334507519,SE
+1334507520,1334508031,DK
+1334508032,1334508543,SE
+1334508544,1334508799,DK
+1334508800,1334509567,SE
1334509568,1334542335,PL
1334542336,1334575103,RU
1334575104,1334579199,UA
@@ -15059,7 +15886,9 @@
1334611968,1334616063,ME
1334616064,1334620159,MD
1334620160,1334624255,DE
-1334624256,1334628351,GB
+1334624256,1334625791,GB
+1334625792,1334626047,AU
+1334626048,1334628351,GB
1334628352,1334632447,IE
1334632448,1334636543,KZ
1334636544,1334640639,RU
@@ -15078,8 +15907,8 @@
1334681856,1334682111,GB
1334682112,1334682367,IE
1334682368,1334682623,FR
-1334682624,1334683135,DE
-1334683136,1334683391,GB
+1334682624,1334683135,GB
+1334683136,1334683391,CZ
1334683392,1334683647,CH
1334683648,1334683903,GB
1334683904,1334684031,DE
@@ -15108,7 +15937,9 @@
1334724352,1334724863,US
1334724864,1334725631,NL
1334725632,1334725887,SE
-1334725888,1334726143,NL
+1334725888,1334725900,NL
+1334725901,1334725901,SE
+1334725902,1334726143,NL
1334726144,1334726399,LU
1334726400,1334726655,SE
1334726656,1334734847,RU
@@ -15179,14 +16010,14 @@
1336619008,1336621055,AL
1336621056,1336623103,DE
1336623104,1336625151,BE
-1336625152,1336626286,GB
+1336625152,1336625407,IE
+1336625408,1336626286,GB
1336626287,1336626287,IE
1336626288,1336627199,GB
1336627200,1336629247,NO
1336629248,1336631295,DE
1336631296,1336633343,IS
-1336633344,1336634879,ES
-1336634880,1336635391,PT
+1336633344,1336635391,PT
1336635392,1336637439,RU
1336637440,1336639487,UA
1336639488,1336643583,HU
@@ -15227,111 +16058,78 @@
1336934400,1337241562,IL
1337241563,1337241563,RO
1337241564,1337458687,IL
-1337458688,1337982975,PL
+1337458688,1337516031,PL
+1337516032,1337516287,DE
+1337516288,1337631231,PL
+1337631232,1337631487,DE
+1337631488,1337982975,PL
1337982976,1342177279,DE
1342177280,1342628207,GB
1342628208,1342628223,IE
1342628224,1342701567,GB
-1342701568,1342704127,MQ
-1342704128,1342704383,FR
-1342704384,1342704895,MQ
-1342704896,1342705151,FR
-1342705152,1342705919,MQ
-1342705920,1342706175,FR
-1342706176,1342707711,MQ
-1342707712,1342707967,FR
-1342707968,1342708223,MQ
-1342708224,1342708479,FR
-1342708480,1342708735,MQ
-1342708736,1342708991,FR
-1342708992,1342711807,MQ
-1342711808,1342712063,FR
-1342712064,1342716159,MQ
-1342716160,1342716415,FR
-1342716416,1342716927,MQ
-1342716928,1342717183,FR
-1342717184,1342717951,MQ
-1342717952,1342718207,GP
-1342718208,1342718463,FR
-1342718464,1342719231,GP
-1342719232,1342719487,FR
-1342719488,1342720255,GP
-1342720256,1342720511,FR
-1342720512,1342720767,GP
-1342720768,1342721023,FR
-1342721024,1342722303,GP
-1342722304,1342722559,FR
-1342722560,1342723071,GP
-1342723072,1342723327,FR
-1342723328,1342724095,GP
-1342724096,1342724351,FR
-1342724352,1342725375,GP
-1342725376,1342725631,FR
-1342725632,1342727423,GP
-1342727424,1342727679,FR
-1342727680,1342729215,GP
-1342729216,1342729471,FR
-1342729472,1342729727,GP
-1342729728,1342729983,FR
-1342729984,1342733823,GP
-1342733824,1342734079,FR
-1342734080,1342734335,GP
-1342734336,1342734847,RE
-1342734848,1342735103,FR
-1342735104,1342736639,RE
-1342736640,1342736895,FR
-1342736896,1342738175,RE
-1342738176,1342738687,FR
-1342738688,1342739199,RE
-1342739200,1342739455,FR
-1342739456,1342741503,RE
-1342741504,1342742015,FR
-1342742016,1342742271,RE
-1342742272,1342742783,FR
-1342742784,1342743039,RE
-1342743040,1342743295,FR
-1342743296,1342743807,RE
-1342743808,1342744063,FR
-1342744064,1342749695,RE
-1342749696,1342750207,FR
-1342750208,1342753023,RE
-1342753024,1342753279,FR
-1342753280,1342756351,RE
-1342756352,1342757119,FR
-1342757120,1342757887,RE
-1342757888,1342758399,FR
-1342758400,1342759167,RE
-1342759168,1342759423,FR
-1342759424,1342760447,RE
-1342760448,1342760703,FR
-1342760704,1342763519,RE
-1342763520,1342763775,FR
-1342763776,1342764031,RE
-1342764032,1342764287,FR
-1342764288,1342766079,RE
-1342766080,1342766847,FR
-1342766848,1342767103,RE
-1342767104,1342988287,FR
+1342701568,1342750719,RE
+1342750720,1342751999,FR
+1342752000,1342752255,RE
+1342752256,1342753023,FR
+1342753024,1342753279,YT
+1342753280,1342754047,FR
+1342754048,1342754303,RE
+1342754304,1342755583,FR
+1342755584,1342756095,RE
+1342756096,1342759679,FR
+1342759680,1342759935,RE
+1342759936,1342760703,FR
+1342760704,1342760959,RE
+1342760960,1342763007,FR
+1342763008,1342763263,YT
+1342763264,1342765055,FR
+1342765056,1342765311,RE
+1342765312,1342988287,FR
1342988288,1342989055,US
-1342989056,1342996479,FR
-1342996480,1343000575,GF
-1343000576,1343001087,FR
-1343001088,1343001855,GF
-1343001856,1343002111,FR
-1343002112,1343005695,GF
-1343005696,1343005951,FR
-1343005952,1343012863,GF
+1342989056,1342996991,FR
+1342996992,1342997247,GF
+1342997248,1342997759,FR
+1342997760,1342999551,GF
+1342999552,1343000575,FR
+1343000576,1343001087,GF
+1343001088,1343001599,FR
+1343001600,1343002367,GF
+1343002368,1343002879,FR
+1343002880,1343003135,GF
+1343003136,1343003391,FR
+1343003392,1343004159,GF
+1343004160,1343004671,FR
+1343004672,1343004927,GF
+1343004928,1343005439,FR
+1343005440,1343007231,GF
+1343007232,1343007487,FR
+1343007488,1343007999,GF
+1343008000,1343008255,FR
+1343008256,1343008511,GF
+1343008512,1343008767,FR
+1343008768,1343009023,GF
+1343009024,1343010047,FR
+1343010048,1343010303,GF
+1343010304,1343010815,FR
+1343010816,1343011071,GF
+1343011072,1343011583,FR
+1343011584,1343012095,GF
+1343012096,1343012607,FR
+1343012608,1343012863,GF
1343012864,1343017983,FR
1343017984,1343018495,RE
1343018496,1343025151,FR
1343025152,1343025663,RE
-1343025664,1343220479,FR
+1343025664,1343218687,FR
+1343218688,1343219711,DE
+1343219712,1343220479,FR
1343220480,1343220671,DE
1343220672,1343220735,FR
1343220736,1343220863,GB
1343220864,1343221055,FR
1343221056,1343221119,GB
-1343221120,1343221759,FR
+1343221120,1343221247,DE
+1343221248,1343221759,FR
1343221760,1343222271,GB
1343222272,1343223679,FR
1343223680,1343223687,LB
@@ -15398,6 +16196,7 @@
1346589696,1346592767,US
1346592768,1346596863,ES
1346596864,1346600959,IT
+1346600960,1346605055,MU
1346605056,1346609151,CH
1346609152,1346617343,FR
1346617344,1346621439,SE
@@ -15425,12 +16224,7 @@
1346740224,1346744319,FI
1346744320,1346748415,RU
1346748416,1346752511,DE
-1346752512,1346753023,RE
-1346753024,1346753791,FR
-1346753792,1346754303,RE
-1346754304,1346754559,FR
-1346754560,1346755071,RE
-1346755072,1346755583,FR
+1346752512,1346755583,FR
1346755584,1346756095,RE
1346756096,1346756607,FR
1346756608,1346760703,SE
@@ -15726,31 +16520,27 @@
1347295217,1347295223,US
1347295224,1347295224,AO
1347295225,1347295232,NG
-1347295233,1347295744,SE
-1347295745,1347295745,US
-1347295746,1347295748,SE
-1347295749,1347295752,US
+1347295233,1347295743,SE
+1347295744,1347295752,US
1347295753,1347295755,BW
-1347295756,1347295759,SE
+1347295756,1347295759,US
1347295760,1347295775,BW
1347295776,1347295776,IQ
1347295777,1347295784,HU
1347295785,1347295791,LB
-1347295792,1347295816,SE
+1347295792,1347295816,US
1347295817,1347295824,OM
1347295825,1347295832,GH
1347295833,1347295840,FR
1347295841,1347295848,NG
1347295849,1347295852,LS
-1347295853,1347295856,SE
+1347295853,1347295856,US
1347295857,1347295864,NG
-1347295865,1347295928,SE
+1347295865,1347295928,US
1347295929,1347295936,NG
1347295937,1347295976,US
1347295977,1347295984,LS
-1347295985,1347295992,US
-1347295993,1347295999,SE
-1347296000,1347296007,US
+1347295985,1347296007,US
1347296008,1347296008,SE
1347296009,1347296032,US
1347296033,1347296040,SE
@@ -15782,9 +16572,7 @@
1347305472,1347309567,AL
1347309568,1347313663,DE
1347313664,1347321855,RU
-1347325952,1347327743,CZ
-1347327744,1347327999,SK
-1347328000,1347330047,CZ
+1347325952,1347330047,CZ
1347330048,1347338239,DE
1347338240,1347342335,RU
1347342336,1347346431,SE
@@ -15888,8 +16676,7 @@
1347755160,1347755175,GR
1347755176,1347756031,CY
1347756032,1347760127,NL
-1347760128,1347762175,CZ
-1347762176,1347764223,HU
+1347760128,1347764223,HU
1347764224,1347772415,GB
1347772416,1347776511,MT
1347776512,1347780607,SE
@@ -15910,8 +16697,10 @@
1347837952,1347846143,RO
1347846144,1347850239,NO
1347850240,1347854335,IT
-1347854336,1347854847,DE
+1347854336,1347854591,DE
+1347854600,1347854607,DE
1347857408,1347858431,DE
+1347858752,1347858815,DE
1347862090,1347862090,DE
1347862272,1347862527,DE
1347862528,1347866623,CH
@@ -16056,53 +16845,31 @@
1348861952,1348993023,ES
1348993024,1349124095,IT
1349124096,1349255167,GR
-1349255168,1349400575,AT
-1349400576,1349401087,DE
-1349401088,1349451775,AT
+1349255168,1349451775,AT
1349451776,1349517311,IE
1349517312,1349763071,NL
1349763072,1349771263,RU
1349771264,1349779455,NL
1349779456,1349910527,IT
1349910528,1350041599,FR
-1350041600,1350067575,AT
-1350067576,1350067579,CH
-1350067580,1350110335,AT
-1350110336,1350110463,DE
-1350110464,1350140927,AT
-1350140928,1350141055,CH
-1350141056,1350166015,AT
-1350166016,1350166271,SK
-1350166272,1350188543,AT
-1350188544,1350188799,DE
-1350188800,1350195231,AT
-1350195232,1350195235,DE
-1350195236,1350215679,AT
+1350041600,1350215679,AT
1350215680,1350215935,IQ
1350215936,1350216959,AT
1350216960,1350217215,IQ
1350217216,1350217471,AT
1350217472,1350217727,IQ
-1350217728,1350230015,AT
-1350230016,1350230271,DE
-1350230272,1350251007,AT
-1350251008,1350251263,HU
-1350251264,1350259447,AT
-1350259448,1350259451,CZ
-1350259452,1350290223,AT
-1350290224,1350290227,CH
-1350290228,1350303743,AT
+1350217728,1350303743,AT
1350303744,1350434815,FR
1350434816,1350565887,NL
1350565888,1352299775,DE
1352299776,1352300031,US
1352300032,1352412159,DE
1352412160,1352412415,FR
-1352412416,1352412799,DE
-1352412800,1352412863,GB
-1352412864,1352417279,DE
+1352412416,1352417279,DE
1352417280,1352418303,SK
-1352418304,1352663039,DE
+1352418304,1352488959,DE
+1352488960,1352491007,FR
+1352491008,1352663039,DE
1352663040,1353187327,DK
1353187328,1353262295,GB
1353262296,1353262303,US
@@ -16112,11 +16879,11 @@
1353275248,1353275255,ES
1353275256,1353277439,GB
1353277440,1353279487,CH
-1353279488,1353287959,GB
+1353279488,1353279583,GB
+1353279584,1353279591,IT
+1353279592,1353287959,GB
1353287960,1353287967,IE
-1353287968,1353288191,GB
-1353288192,1353288447,IE
-1353288448,1353298687,GB
+1353287968,1353298687,GB
1353298688,1353299455,SE
1353299456,1353300079,GB
1353300080,1353300095,SE
@@ -16126,9 +16893,7 @@
1353308160,1353309183,FR
1353309184,1353312447,GB
1353312448,1353312479,CH
-1353312480,1353313535,GB
-1353313536,1353313791,IE
-1353313792,1353315327,GB
+1353312480,1353315327,GB
1353315328,1353316351,ES
1353316352,1353318399,GB
1353318400,1353383935,SE
@@ -16161,9 +16926,7 @@
1356070912,1356201983,NO
1356201984,1356333055,FR
1356333056,1356464127,SE
-1356464128,1356539775,CH
-1356539776,1356539903,DE
-1356539904,1356595199,CH
+1356464128,1356595199,CH
1356595200,1356857343,FI
1356857344,1356922879,ES
1356922880,1356988415,GB
@@ -16173,45 +16936,56 @@
1357185024,1357250559,GB
1357250560,1357316095,IL
1357317120,1357317375,GB
+1357318400,1357318655,FR
1357321024,1357321087,KE
1357321984,1357322239,GB
1357322240,1357322255,DE
1357322496,1357322751,DE
+1357322752,1357323007,GB
+1357323008,1357323015,CG
1357323520,1357323775,GB
1357323776,1357323779,FI
1357324288,1357325311,GB
1357326336,1357326337,ES
1357327360,1357327615,FR
-1357328384,1357328639,GB
+1357328384,1357328671,GB
+1357328896,1357329159,NL
1357329408,1357329415,BE
+1357330944,1357331199,GB
1357335808,1357336063,IT
+1357337600,1357337615,NL
1357340672,1357341695,GB
1357342976,1357343231,GB
1357343488,1357343503,GB
-1357344260,1357344263,FR
+1357344260,1357344271,FR
1357344512,1357344767,FR
1357346816,1357346835,FR
1357346848,1357346863,FR
1357347336,1357347375,FR
1357347456,1357347583,FR
-1357347616,1357347647,FR
+1357347616,1357347655,FR
1357347840,1357348095,PL
1357348384,1357348415,ES
+1357348480,1357348607,ES
1357351168,1357351423,PL
1357359872,1357360383,GB
1357361152,1357363199,GB
1357363200,1357364223,QA
1357364224,1357365247,ES
-1357366784,1357366959,FR
+1357366784,1357366959,GB
1357366960,1357366967,BE
-1357366968,1357366975,FR
-1357366976,1357367039,GB
+1357366968,1357367039,GB
+1357368352,1357368383,NL
1357368576,1357368831,NL
+1357371392,1357371647,GB
1357372160,1357372927,GB
1357373468,1357373471,GB
1357373480,1357373483,GB
1357373488,1357373519,GB
-1357373952,1357374463,GB
+1357373520,1357373535,FI
+1357373952,1357374975,GB
+1357377536,1357377671,FR
+1357377792,1357378047,FR
1357381632,1357414399,NO
1357414400,1357447167,LV
1357447168,1357479935,IE
@@ -16232,7 +17006,9 @@
1357877248,1357877311,DE
1357877376,1357877439,DE
1357879936,1357880063,GB
+1357883392,1357883647,FR
1357883648,1357883903,SE
+1357885200,1357885215,AT
1357885952,1357886207,SE
1357889024,1357889279,GB
1357889280,1357889535,SE
@@ -16241,14 +17017,12 @@
1357891840,1357892095,GB
1357892608,1357892735,NL
1357892864,1357893119,NL
+1357896192,1357896447,DE
1357898752,1357898879,DE
1357899584,1357899615,NL
1357899648,1357899775,GB
1357900416,1357900543,SE
-1357902336,1357902365,GB
1357902366,1357902366,NO
-1357902367,1357902591,GB
-1357902592,1357902847,RU
1357902848,1357903359,GB
1357904896,1357905407,GB
1357905920,1357910015,LT
@@ -16281,21 +17055,15 @@
1357984528,1357984551,IT
1357984552,1357984591,GB
1357984592,1357984599,IT
-1357984600,1357984671,GB
-1357984672,1357984679,IT
-1357984680,1357984831,GB
+1357984600,1357984831,GB
1357984832,1357984839,IT
1357984840,1357984911,GB
1357984912,1357984919,IT
1357984920,1357985015,GB
1357985016,1357985023,IT
-1357985024,1357985575,GB
-1357985576,1357985583,IT
-1357985584,1357985791,GB
+1357985024,1357985791,GB
1357985792,1357987839,DE
-1357987840,1357989631,GB
-1357989632,1357989887,FR
-1357989888,1357991935,GB
+1357987840,1357991935,GB
1357991936,1357996031,NO
1357996032,1358000127,CH
1358000128,1358004223,LI
@@ -16329,22 +17097,16 @@
1358147584,1358151679,GB
1358151680,1358155775,DE
1358155776,1358159871,CH
-1358163968,1358164223,FR
-1358164224,1358164479,MQ
-1358164480,1358164991,FR
-1358164992,1358165503,MQ
-1358165504,1358166015,FR
-1358166016,1358166783,MQ
-1358166784,1358167551,FR
-1358167552,1358167807,MQ
-1358167808,1358168063,FR
+1358163968,1358165503,FR
+1358165504,1358165759,MQ
+1358165760,1358166015,FR
+1358166016,1358166527,MQ
+1358166528,1358168063,FR
1358168064,1358172159,GB
1358172160,1358176255,CY
1358176256,1358180351,RU
1358180352,1358184447,ES
-1358184448,1358186607,SE
-1358186608,1358186623,NO
-1358186624,1358187775,SE
+1358184448,1358187775,SE
1358187776,1358187839,NO
1358187840,1358192639,SE
1358192640,1358196735,HU
@@ -16427,9 +17189,7 @@
1358553088,1358557183,UA
1358557184,1358557951,GB
1358557952,1358558207,IE
-1358558208,1358560255,GB
-1358560256,1358560511,IE
-1358560512,1358561279,GB
+1358558208,1358561279,GB
1358561280,1358569471,CZ
1358569472,1358573567,NG
1358573568,1358577663,LV
@@ -16453,7 +17213,9 @@
1358668160,1358668167,PT
1358668168,1358668447,GB
1358668448,1358668455,PT
-1358668456,1358670943,GB
+1358668456,1358668623,GB
+1358668624,1358668631,PT
+1358668632,1358670943,GB
1358670944,1358670951,FR
1358670952,1358670975,GB
1358670976,1358670991,PT
@@ -16517,13 +17279,10 @@
1358861568,1358861823,DE
1358861824,1358862335,FR
1358862336,1358862847,US
-1358862848,1358862898,GB
-1358862899,1358862899,NO
-1358862900,1358863359,GB
+1358862848,1358863103,DK
+1358863104,1358863359,GB
1358863360,1358863615,US
-1358863616,1358863903,GB
-1358863904,1358863919,SA
-1358863920,1358864383,GB
+1358863616,1358864383,GB
1358864384,1358872575,CH
1358872576,1358876671,IT
1358876672,1358880767,LV
@@ -16586,7 +17345,9 @@
1359413248,1359429631,DE
1359429632,1359446015,LT
1359446016,1359462399,DK
-1359462400,1359467775,DE
+1359462400,1359467007,DE
+1359467008,1359467263,US
+1359467264,1359467775,DE
1359467776,1359468031,US
1359468032,1359470591,DE
1359470592,1359478783,CH
@@ -16633,7 +17394,13 @@
1360113664,1360117759,HU
1360117760,1360121855,FI
1360121856,1360125951,DE
-1360125952,1360130047,SI
+1360125952,1360127487,SI
+1360127488,1360127999,RS
+1360128000,1360128511,MK
+1360128512,1360128767,ME
+1360128768,1360129023,SI
+1360129024,1360129535,BA
+1360129536,1360130047,SI
1360130048,1360134143,IE
1360134144,1360138239,NL
1360138240,1360142335,CH
@@ -16831,9 +17598,7 @@
1361018880,1361022975,AT
1361022976,1361027071,IT
1361027072,1361035263,IR
-1361035264,1361035627,NL
1361035628,1361035631,DZ
-1361035632,1361039359,NL
1361039360,1361041407,IE
1361041408,1361042431,NL
1361042432,1361043455,PL
@@ -16875,9 +17640,7 @@
1363410944,1363673087,NL
1363673088,1363935231,IT
1363935232,1364197375,GB
-1364197376,1364212991,FR
-1364212992,1364213247,GF
-1364213248,1364262911,FR
+1364197376,1364262911,FR
1364262912,1364328447,IT
1364328448,1364459519,BE
1364459520,1364525055,PT
@@ -16950,7 +17713,9 @@
1364963328,1364967423,RU
1364967424,1364971519,GB
1364971520,1364975615,CZ
-1364975616,1364979711,BJ
+1364975616,1364979199,BJ
+1364979200,1364979455,NG
+1364979456,1364979711,BJ
1364979712,1364983039,GB
1364983040,1364983295,CH
1364983296,1364983807,GB
@@ -16975,7 +17740,8 @@
1365044800,1365044927,FR
1365044928,1365044935,GR
1365044936,1365044943,LU
-1365044944,1365045247,FR
+1365044944,1365044991,FR
+1365044992,1365045247,LU
1365045248,1365047295,AT
1365047296,1365049343,SK
1365049344,1365057535,FR
@@ -17016,13 +17782,11 @@
1365218192,1365218199,US
1365218200,1365219167,NL
1365219168,1365219168,GB
-1365219169,1365219391,NL
-1365219392,1365219407,MY
-1365219408,1365219703,NL
-1365219704,1365219711,US
-1365219712,1365220231,NL
+1365219169,1365220231,NL
1365220232,1365220239,IE
-1365220240,1365221239,NL
+1365220240,1365220503,NL
+1365220504,1365220507,IE
+1365220508,1365221239,NL
1365221240,1365221247,US
1365221248,1365221375,NL
1365221376,1365225471,GE
@@ -17034,7 +17798,11 @@
1365245952,1366294527,GB
1366294528,1366405831,IT
1366405832,1366405835,SI
-1366405836,1367343103,IT
+1366405836,1366465791,IT
+1366465792,1366465873,NL
+1366465874,1366465874,IT
+1366465875,1366466047,NL
+1366466048,1367343103,IT
1367343104,1369440255,GB
1369440256,1369473023,DE
1369473024,1369505791,HU
@@ -17061,7 +17829,8 @@
1369571328,1369585663,RU
1369585664,1369591807,UA
1369591808,1369595903,SK
-1369595904,1369604095,UA
+1369595904,1369603839,RU
+1369603840,1369604095,UA
1369604096,1369620479,MD
1369620480,1369624575,CZ
1369624576,1369626623,PL
@@ -17211,6 +17980,7 @@
1372698880,1372699391,DE
1372699904,1372700159,DE
1372702720,1372703231,DE
+1372703616,1372703743,DE
1372704768,1372713983,DE
1372715008,1372717055,DE
1372717056,1372749823,PL
@@ -17226,95 +17996,121 @@
1373437952,1373503487,CH
1373503488,1373569023,RU
1373569024,1373634559,AT
-1373634560,1374683135,SE
+1373634560,1373854975,SE
+1373854976,1373855180,RU
+1373855181,1373855181,SE
+1373855182,1373855220,RU
+1373855221,1373855221,SE
+1373855222,1373855231,RU
+1373855232,1374683135,SE
1374683136,1375207423,BE
-1375207424,1375207935,FR
-1375207936,1375208447,MQ
-1375208448,1375208703,GP
-1375208704,1375210239,MQ
-1375210240,1375210495,GP
-1375210496,1375211519,MQ
-1375211520,1375211775,GP
-1375211776,1375212031,FR
-1375212032,1375212799,GP
-1375212800,1375213055,FR
-1375213056,1375215615,GP
-1375215616,1375215871,GF
-1375215872,1375216383,FR
-1375216384,1375218175,GF
-1375218176,1375218687,FR
-1375218688,1375219455,GF
-1375219456,1375219711,FR
-1375219712,1375221247,GF
-1375221248,1375221503,FR
-1375221504,1375221759,GF
-1375221760,1375222783,FR
-1375222784,1375223807,GF
-1375223808,1375227135,MQ
-1375227136,1375227647,FR
-1375227648,1375230463,MQ
-1375230464,1375230719,FR
-1375230720,1375233023,MQ
-1375233024,1375233279,FR
-1375233280,1375233791,MQ
-1375233792,1375235071,FR
-1375235072,1375235583,MQ
-1375235584,1375236095,FR
-1375236096,1375236351,MQ
-1375236352,1375236863,FR
-1375236864,1375237631,MQ
-1375237632,1375237887,FR
-1375237888,1375239679,MQ
-1375239680,1375239935,FR
-1375239936,1375240191,MQ
-1375240192,1375240447,FR
-1375240448,1375240959,GP
-1375240960,1375241215,FR
-1375241216,1375241983,GP
-1375241984,1375242239,FR
+1375207424,1375207679,MQ
+1375207680,1375208703,FR
+1375208704,1375209215,MQ
+1375209216,1375209471,FR
+1375209472,1375209983,MQ
+1375209984,1375210751,FR
+1375210752,1375211519,MQ
+1375211520,1375211775,FR
+1375211776,1375213311,GP
+1375213312,1375213567,FR
+1375213568,1375215103,GP
+1375215104,1375215359,FR
+1375215360,1375215615,GP
+1375215616,1375215871,FR
+1375215872,1375216127,GF
+1375216128,1375217663,FR
+1375217664,1375218175,GF
+1375218176,1375218431,FR
+1375218432,1375219711,GF
+1375219712,1375219967,FR
+1375219968,1375220479,GF
+1375220480,1375220735,FR
+1375220736,1375220991,GF
+1375220992,1375221247,FR
+1375221248,1375221503,GF
+1375221504,1375223039,FR
+1375223040,1375223551,GF
+1375223552,1375224831,FR
+1375224832,1375225087,MQ
+1375225088,1375225599,FR
+1375225600,1375225855,MQ
+1375225856,1375226111,FR
+1375226112,1375227903,MQ
+1375227904,1375228671,FR
+1375228672,1375228927,MQ
+1375228928,1375229439,FR
+1375229440,1375230719,MQ
+1375230720,1375231231,FR
+1375231232,1375231487,MQ
+1375231488,1375231999,FR
+1375232000,1375232255,MQ
+1375232256,1375233023,FR
+1375233024,1375233279,MQ
+1375233280,1375233791,FR
+1375233792,1375234303,MQ
+1375234304,1375236351,FR
+1375236352,1375236863,MQ
+1375236864,1375237631,FR
+1375237632,1375237887,MQ
+1375237888,1375239679,FR
+1375239680,1375239935,MQ
+1375239936,1375240191,FR
+1375240192,1375240959,GP
+1375240960,1375242239,FR
1375242240,1375242495,MF
-1375242496,1375242751,GP
-1375242752,1375243263,FR
-1375243264,1375245311,GP
-1375245312,1375246079,FR
-1375246080,1375246335,GP
-1375246336,1375246591,FR
-1375246592,1375247359,GP
-1375247360,1375247615,FR
-1375247616,1375249919,GP
-1375249920,1375250175,FR
-1375250176,1375250431,GP
-1375250432,1375251455,FR
-1375251456,1375252223,GP
-1375252224,1375253247,FR
-1375253248,1375253759,GP
-1375253760,1375254527,FR
-1375254528,1375256063,GP
-1375256064,1375256319,FR
-1375256320,1375256575,GP
+1375242496,1375243263,GP
+1375243264,1375243519,FR
+1375243520,1375243775,GP
+1375243776,1375244031,FR
+1375244032,1375244287,GP
+1375244288,1375244799,FR
+1375244800,1375246591,GP
+1375246592,1375246847,FR
+1375246848,1375247615,GP
+1375247616,1375247871,FR
+1375247872,1375248383,GP
+1375248384,1375248639,FR
+1375248640,1375248895,GP
+1375248896,1375249919,FR
+1375249920,1375250175,GP
+1375250176,1375251967,FR
+1375251968,1375252479,GP
+1375252480,1375252991,FR
+1375252992,1375254015,GP
+1375254016,1375254527,FR
+1375254528,1375255039,GP
+1375255040,1375255295,FR
+1375255296,1375255551,GP
+1375255552,1375256063,FR
+1375256064,1375256575,GP
1375256576,1375257087,RE
-1375257088,1375257343,FR
-1375257344,1375257855,RE
-1375257856,1375258111,FR
-1375258112,1375258879,RE
-1375258880,1375261183,FR
-1375261184,1375261695,RE
-1375261696,1375262207,FR
-1375262208,1375265535,RE
-1375265536,1375266047,FR
-1375266048,1375266303,RE
-1375266304,1375268095,FR
+1375257088,1375257855,FR
+1375257856,1375258111,RE
+1375258112,1375259135,FR
+1375259136,1375259647,RE
+1375259648,1375260671,FR
+1375260672,1375260927,RE
+1375260928,1375261951,FR
+1375261952,1375262463,RE
+1375262464,1375262719,FR
+1375262720,1375263231,RE
+1375263232,1375264511,FR
+1375264512,1375265279,RE
+1375265280,1375265535,FR
+1375265536,1375266047,RE
+1375266048,1375266559,FR
+1375266560,1375267839,RE
+1375267840,1375268095,FR
1375268096,1375268351,RE
-1375268352,1375268863,FR
-1375268864,1375269119,RE
-1375269120,1375269631,FR
-1375269632,1375270143,RE
-1375270144,1375270655,FR
-1375270656,1375271423,RE
-1375271424,1375271679,FR
-1375271680,1375271935,RE
-1375271936,1375272191,FR
-1375272192,1375272959,RE
+1375268352,1375269119,FR
+1375269120,1375269631,RE
+1375269632,1375270143,FR
+1375270144,1375270399,RE
+1375270400,1375271167,FR
+1375271168,1375272191,RE
+1375272192,1375272703,FR
+1375272704,1375272959,RE
1375272960,1375731711,FR
1375731712,1378877439,GB
1378877440,1379926015,IT
@@ -17340,11 +18136,11 @@
1382187008,1382203391,ES
1382203392,1382205439,GB
1382213632,1382219775,GB
-1382219776,1382222847,SE
+1382219776,1382222807,SE
+1382222808,1382222815,FI
+1382222816,1382222847,SE
1382222848,1382223103,FI
-1382223104,1382226943,SE
-1382226944,1382227199,NO
-1382227200,1382252543,SE
+1382223104,1382252543,SE
1382252544,1382268927,CZ
1382268928,1382285311,IR
1382285312,1382301695,CZ
@@ -17361,7 +18157,9 @@
1382465536,1382481919,PS
1382481920,1382498303,AT
1382498304,1382514687,BG
-1382514688,1382531071,DK
+1382514688,1382518783,DK
+1382518784,1382522879,DE
+1382522880,1382531071,DK
1382531072,1382547455,FI
1382547456,1382809599,IT
1382809600,1383071743,GB
@@ -17396,8 +18194,12 @@
1383243776,1383251967,YE
1383251968,1383260159,CZ
1383260160,1383268351,RU
-1383268352,1383273983,IR
-1383273984,1383275775,KW
+1383268352,1383272191,IR
+1383272192,1383272447,NL
+1383272448,1383273983,IR
+1383273984,1383274248,KW
+1383274249,1383274249,IR
+1383274250,1383275775,KW
1383275776,1383276543,IR
1383276544,1383284735,KZ
1383284736,1383292927,PL
@@ -17554,11 +18356,7 @@
1385496576,1385504767,SI
1385504768,1385512959,IT
1385512960,1385521151,DE
-1385521152,1385523711,AT
-1385523712,1385523967,HU
-1385523968,1385524479,AT
-1385524480,1385524735,HU
-1385524736,1385529343,AT
+1385521152,1385529343,AT
1385529344,1385537535,RU
1385537536,1385545727,DE
1385545728,1385553919,RU
@@ -17637,6 +18435,7 @@
1388587520,1388587775,GB
1388588288,1388588543,GB
1388588800,1388589823,GB
+1388590080,1388590335,GB
1388591104,1388591359,AU
1388593152,1388601343,RU
1388601344,1388609535,SE
@@ -17647,13 +18446,13 @@
1388642304,1388650495,FI
1388650496,1388658687,PL
1388658688,1388666879,GB
-1388666880,1388667135,FR
-1388667136,1388667391,RE
-1388667392,1388668671,FR
-1388668672,1388668927,RE
-1388668928,1388669183,FR
-1388669184,1388669439,RE
-1388669440,1388675071,FR
+1388666880,1388671097,FR
+1388671098,1388671098,RE
+1388671099,1388671763,FR
+1388671764,1388671764,RE
+1388671765,1388672244,FR
+1388672245,1388672245,RE
+1388672246,1388675071,FR
1388677632,1388677887,NL
1388678144,1388679167,DE
1388681216,1388683263,DE
@@ -17696,11 +18495,13 @@
1388744760,1388744767,IE
1388744768,1388744831,GB
1388744832,1388744847,IE
-1388744848,1388745971,GB
+1388744848,1388744959,GB
+1388744960,1388745215,IE
+1388745216,1388745971,GB
1388745972,1388745975,IE
1388745976,1388746495,GB
-1388746496,1388746751,IE
-1388746752,1388746911,GB
+1388746496,1388746559,IE
+1388746560,1388746911,GB
1388746912,1388746927,IE
1388746928,1388748799,GB
1388748800,1388756991,RU
@@ -17763,7 +18564,9 @@
1389477888,1389494271,BY
1389494272,1389510655,DE
1389510656,1389527039,NL
-1389527040,1389543423,PL
+1389527040,1389528551,RO
+1389528552,1389528552,PL
+1389528553,1389543423,RO
1389543424,1389576191,DE
1389576192,1389592575,GB
1389592576,1389598719,GE
@@ -17780,14 +18583,15 @@
1389707264,1389723647,IT
1389723648,1389756415,ES
1389756416,1389772799,SE
-1389772800,1389783039,SI
+1389772800,1389778431,SI
+1389778432,1389780991,RS
+1389780992,1389783039,HR
1389783040,1389785087,BA
1389785088,1389787135,MK
-1389787136,1389789183,SI
+1389787136,1389788671,SI
+1389788672,1389789183,RS
1389789184,1389805567,PL
-1389805568,1389805823,DE
-1389805824,1389806079,US
-1389806080,1389806591,DE
+1389805568,1389806591,DE
1389806592,1389806847,SA
1389806848,1389821951,DE
1389821952,1389838335,NL
@@ -17796,9 +18600,7 @@
1389871104,1389887487,FI
1389887488,1389953023,FR
1389953024,1390018559,NL
-1390018560,1390074879,AT
-1390074880,1390075135,HU
-1390075136,1390084095,AT
+1390018560,1390084095,AT
1390084096,1390149631,GB
1390149632,1390215167,CH
1390215168,1390280703,IS
@@ -17827,11 +18629,7 @@
1397071872,1397096447,RU
1397096448,1397227519,IE
1397227520,1397489663,DK
-1397489664,1397582847,CH
-1397582848,1397583103,DE
-1397583104,1397583615,CH
-1397583616,1397583871,DE
-1397583872,1397751807,CH
+1397489664,1397751807,CH
1397751808,1398276095,NL
1398276096,1398800383,DK
1398800384,1398833151,KW
@@ -17875,6 +18673,7 @@
1400713216,1400718335,DE
1400719360,1400721407,DE
1400723456,1400727551,DE
+1400727808,1400727935,DE
1400729600,1400730623,DE
1400731648,1400733695,DE
1400897536,1400963071,NL
@@ -17947,7 +18746,9 @@
1401546752,1401548799,IT
1401548800,1401550847,FR
1401550848,1401551103,GB
-1401551104,1401552639,JE
+1401551104,1401551359,JE
+1401551360,1401551615,GB
+1401551616,1401552639,JE
1401552640,1401552895,GB
1401552896,1401554943,NL
1401554944,1401556991,IE
@@ -17962,7 +18763,11 @@
1401634816,1401651199,HR
1401651200,1401667583,RU
1401667584,1401683967,IT
-1401683968,1401749503,SE
+1401683968,1401708287,SE
+1401708288,1401708543,DE
+1401708544,1401712895,SE
+1401712896,1401713151,DE
+1401713152,1401749503,SE
1401749504,1401765887,DE
1401765888,1401782271,IE
1401782272,1401815039,FR
@@ -18018,6 +18823,7 @@
1401935872,1401937919,FI
1401937920,1401939967,GB
1401939968,1401942015,UA
+1401942784,1401943039,GB
1401944064,1401946111,BG
1401946112,1401962495,FR
1401962496,1401978879,PL
@@ -18161,21 +18967,16 @@
1404215296,1404219391,LV
1404219392,1404220415,SE
1404220416,1404221439,EE
-1404221440,1404222463,RU
-1404222464,1404225535,SE
-1404225536,1404227071,RU
-1404227072,1404227583,SE
+1404221440,1404227583,SE
1404227584,1404231679,LV
1404231680,1404232191,SE
1404232192,1404232703,NO
1404232704,1404234751,SE
1404234752,1404239871,HR
-1404239872,1404256255,SE
-1404256256,1404305407,RU
+1404239872,1404305407,SE
1404305408,1404313599,EE
1404313600,1404321791,HR
-1404321792,1404338175,RU
-1404338176,1404340223,SE
+1404321792,1404340223,SE
1404340224,1404342271,HR
1404342272,1404379135,SE
1404379136,1404383231,AT
@@ -18183,30 +18984,11 @@
1404385280,1404386047,LT
1404386048,1404387327,SE
1404387328,1404420095,LT
-1404420096,1404436479,RU
-1404436480,1404444671,SE
-1404444672,1404445951,NO
-1404445952,1404446207,SE
-1404446208,1404446719,NO
-1404446720,1404446975,SE
-1404446976,1404447999,NO
-1404448000,1404448255,SE
-1404448256,1404452863,NO
+1404420096,1404444671,SE
+1404444672,1404452863,NO
1404452864,1404510207,SE
-1404510208,1404510975,HR
-1404510976,1404511231,SE
-1404511232,1404512255,HR
-1404512256,1404512767,SE
-1404512768,1404513023,HR
-1404513024,1404514303,SE
-1404514304,1404514559,HR
-1404514560,1404514815,SE
-1404514816,1404515071,HR
-1404515072,1404515327,SE
-1404515328,1404515839,HR
-1404515840,1404516095,SE
-1404516096,1404518143,HR
-1404518144,1404522495,SE
+1404510208,1404518399,HR
+1404518400,1404522495,SE
1404522496,1404526591,LV
1404526592,1404538879,SE
1404538880,1404542975,LV
@@ -18215,94 +18997,32 @@
1404563456,1404567551,SE
1404567552,1404583935,HR
1404583936,1404600319,NO
-1404600320,1404678143,SE
+1404600320,1404633087,SE
+1404633088,1404633599,HR
+1404633600,1404633855,SE
+1404633856,1404635647,HR
+1404635648,1404635903,SE
+1404635904,1404637439,HR
+1404637440,1404637695,SE
+1404637696,1404638207,HR
+1404638208,1404638463,SE
+1404638464,1404641279,HR
+1404641280,1404678143,SE
1404678144,1404680191,HR
1404680192,1404731391,SE
-1404731392,1404732159,HR
-1404732160,1404732671,SE
-1404732672,1404733951,HR
-1404733952,1404734207,SE
-1404734208,1404736511,HR
-1404736512,1404736767,SE
-1404736768,1404740095,HR
-1404740096,1404740351,SE
-1404740352,1404740863,HR
-1404740864,1404741119,SE
-1404741120,1404742911,HR
-1404742912,1404743679,SE
-1404743680,1404744959,HR
-1404744960,1404745215,SE
-1404745216,1404745983,HR
-1404745984,1404746495,SE
-1404746496,1404748031,HR
-1404748032,1404748287,SE
-1404748288,1404748799,HR
-1404748800,1404749311,SE
-1404749312,1404749567,HR
-1404749568,1404750079,SE
-1404750080,1404752639,HR
-1404752640,1404752895,SE
-1404752896,1404754943,HR
-1404754944,1404755199,SE
-1404755200,1404755967,HR
-1404755968,1404756223,SE
-1404756224,1404756479,HR
-1404756480,1404756735,SE
-1404756736,1404757247,HR
-1404757248,1404757503,SE
-1404757504,1404759551,HR
-1404759552,1404759807,SE
-1404759808,1404760063,HR
-1404760064,1404760319,SE
-1404760320,1404760831,HR
-1404760832,1404761087,SE
-1404761088,1404762111,HR
-1404762112,1404762367,SE
-1404762368,1404762623,HR
-1404762624,1404763135,SE
-1404763136,1404763647,HR
-1404763648,1404763903,SE
-1404763904,1404764159,HR
+1404731392,1404764159,HR
1404764160,1404780543,NL
1404780544,1404788735,SE
-1404788736,1404790527,NL
-1404790528,1404790783,SE
-1404790784,1404791039,NL
-1404791040,1404791295,SE
-1404791296,1404791807,NL
-1404791808,1404792063,SE
-1404792064,1404792575,NL
-1404792576,1404792831,SE
-1404792832,1404793599,NL
-1404793600,1404793855,SE
-1404793856,1404795135,NL
-1404795136,1404795391,SE
-1404795392,1404795647,NL
-1404795648,1404795903,SE
-1404795904,1404796927,NL
+1404788736,1404796927,NL
1404796928,1404801023,EE
-1404801024,1404803071,SE
-1404803072,1404803327,LV
-1404803328,1404803583,SE
+1404801024,1404803583,SE
1404803584,1404804095,LV
1404804096,1404805119,SE
1404805120,1404813311,AT
1404813312,1404815871,EE
1404815872,1404816383,LT
-1404816384,1404821503,NL
-1404821504,1404821759,SE
-1404821760,1404822271,NL
-1404822272,1404822527,SE
-1404822528,1404822783,NL
-1404822784,1404823039,SE
-1404823040,1404825087,NL
-1404825088,1404825343,SE
-1404825344,1404826367,NL
-1404826368,1404826623,SE
-1404826624,1404827135,NL
-1404827136,1404827903,SE
-1404827904,1404829695,NL
-1404829696,1404870655,RU
+1404816384,1404829695,NL
+1404829696,1404870655,SE
1404870656,1404872703,LT
1404872704,1404874751,SE
1404874752,1404875775,LV
@@ -18310,21 +19030,44 @@
1404887040,1404927999,NL
1404928000,1404944383,SE
1404944384,1404960767,LT
-1404960768,1405009919,SE
-1405009920,1405010687,LT
-1405010688,1405010943,SE
-1405010944,1405011199,LT
-1405011200,1405011711,SE
-1405011712,1405013759,LT
-1405013760,1405014015,SE
-1405014016,1405020159,LT
-1405020160,1405020415,SE
-1405020416,1405020927,LT
-1405020928,1405021183,SE
-1405021184,1405021439,LT
-1405021440,1405021951,SE
-1405021952,1405022207,LT
-1405022208,1405026303,SE
+1404960768,1404977151,SE
+1404977152,1404977919,LT
+1404977920,1404978175,SE
+1404978176,1404980223,LT
+1404980224,1404980479,SE
+1404980480,1404981247,LT
+1404981248,1404981503,SE
+1404981504,1404983551,LT
+1404983552,1404983807,SE
+1404983808,1404985087,LT
+1404985088,1404985343,SE
+1404985344,1404986623,LT
+1404986624,1404986879,SE
+1404986880,1404987135,LT
+1404987136,1404987311,SE
+1404987312,1404987312,LT
+1404987313,1404987647,SE
+1404987648,1404988415,LT
+1404988416,1404988469,SE
+1404988470,1404988470,LT
+1404988471,1404988671,SE
+1404988672,1404989695,LT
+1404989696,1404989951,SE
+1404989952,1404990463,LT
+1404990464,1404990719,SE
+1404990720,1404990975,LT
+1404990976,1404991231,SE
+1404991232,1404992511,LT
+1404992512,1404992767,SE
+1404992768,1404993535,LT
+1404993536,1405009919,SE
+1405009920,1405022207,LT
+1405022208,1405022463,SE
+1405022464,1405022975,LT
+1405022976,1405023231,SE
+1405023232,1405025023,LT
+1405025024,1405025279,SE
+1405025280,1405026303,LT
1405026304,1405042687,NO
1405042688,1405048831,SE
1405048832,1405050879,HR
@@ -18333,21 +19076,133 @@
1405063168,1405067263,NO
1405067264,1405083647,EE
1405083648,1405091839,SE
-1405091840,1405815295,FR
-1405815296,1405815551,MQ
-1405815552,1405820927,FR
-1405820928,1405821183,MQ
-1405821184,1405822719,FR
-1405822720,1405822975,MQ
-1405822976,1405834751,FR
-1405834752,1405835007,MQ
-1405835008,1405850879,FR
-1405850880,1405851135,MQ
-1405851136,1405858815,FR
+1405091840,1405813759,FR
+1405813760,1405814015,MQ
+1405814016,1405815807,FR
+1405815808,1405816063,MQ
+1405816064,1405816319,FR
+1405816320,1405816575,MQ
+1405816576,1405816831,FR
+1405816832,1405817087,MQ
+1405817088,1405817343,FR
+1405817344,1405817599,MQ
+1405817600,1405818111,FR
+1405818112,1405818367,MQ
+1405818368,1405818623,FR
+1405818624,1405818879,MQ
+1405818880,1405819135,FR
+1405819136,1405819391,MQ
+1405819392,1405819903,FR
+1405819904,1405820159,MQ
+1405820160,1405820671,FR
+1405820672,1405820927,MQ
+1405820928,1405821439,FR
+1405821440,1405821695,MQ
+1405821696,1405822207,FR
+1405822208,1405822719,MQ
+1405822720,1405823231,FR
+1405823232,1405823743,MQ
+1405823744,1405824255,FR
+1405824256,1405824511,MQ
+1405824512,1405824767,FR
+1405824768,1405825279,MQ
+1405825280,1405825535,FR
+1405825536,1405826303,MQ
+1405826304,1405826559,FR
+1405826560,1405826815,MQ
+1405826816,1405827071,FR
+1405827072,1405827583,MQ
+1405827584,1405827839,FR
+1405827840,1405828095,MQ
+1405828096,1405828607,FR
+1405828608,1405829119,MQ
+1405829120,1405829375,FR
+1405829376,1405829631,MQ
+1405829632,1405830143,FR
+1405830144,1405830399,MQ
+1405830400,1405830655,FR
+1405830656,1405831167,MQ
+1405831168,1405831423,FR
+1405831424,1405831679,MQ
+1405831680,1405833727,FR
+1405833728,1405833983,MQ
+1405833984,1405834495,FR
+1405834496,1405835263,MQ
+1405835264,1405835775,FR
+1405835776,1405836031,MQ
+1405836032,1405836543,FR
+1405836544,1405837055,MQ
+1405837056,1405837311,FR
+1405837312,1405837567,MQ
+1405837568,1405838079,FR
+1405838080,1405838591,MQ
+1405838592,1405839103,FR
+1405839104,1405839359,MQ
+1405839360,1405839615,FR
+1405839616,1405839871,MQ
+1405839872,1405840127,FR
+1405840128,1405840639,MQ
+1405840640,1405845503,FR
+1405845504,1405845759,MQ
+1405845760,1405846015,FR
+1405846016,1405846527,MQ
+1405846528,1405846783,FR
+1405846784,1405847039,MQ
+1405847040,1405847551,FR
+1405847552,1405847807,MQ
+1405847808,1405848063,FR
+1405848064,1405848319,MQ
+1405848320,1405848575,FR
+1405848576,1405848831,MQ
+1405848832,1405849087,FR
+1405849088,1405849599,MQ
+1405849600,1405849855,FR
+1405849856,1405850111,MQ
+1405850112,1405850623,FR
+1405850624,1405850879,MQ
+1405850880,1405851135,FR
+1405851136,1405851903,MQ
+1405851904,1405852159,FR
+1405852160,1405853439,MQ
+1405853440,1405854463,FR
+1405854464,1405854975,MQ
+1405854976,1405856255,FR
+1405856256,1405856511,MQ
+1405856512,1405857791,FR
+1405857792,1405858559,MQ
+1405858560,1405858815,FR
1405858816,1405859071,MQ
-1405859072,1405871103,FR
-1405871104,1405871359,MQ
-1405871360,1406140415,FR
+1405859072,1405859327,FR
+1405859328,1405860351,MQ
+1405860352,1405860607,FR
+1405860608,1405861119,MQ
+1405861120,1405861375,FR
+1405861376,1405861631,MQ
+1405861632,1405862143,FR
+1405862144,1405862399,MQ
+1405862400,1405862911,FR
+1405862912,1405863423,MQ
+1405863424,1405864447,FR
+1405864448,1405864703,MQ
+1405864704,1405864959,FR
+1405864960,1405865983,MQ
+1405865984,1405866239,FR
+1405866240,1405866495,MQ
+1405866496,1405867519,FR
+1405867520,1405867775,MQ
+1405867776,1405868287,FR
+1405868288,1405868799,MQ
+1405868800,1405870335,FR
+1405870336,1405870591,MQ
+1405870592,1405871359,FR
+1405871360,1405871615,MQ
+1405871616,1405871871,FR
+1405871872,1405872127,MQ
+1405872128,1405872383,FR
+1405872384,1405872895,MQ
+1405872896,1405873663,FR
+1405873664,1405873919,MQ
+1405873920,1406140415,FR
1406140416,1406205951,CZ
1406205952,1406271487,SE
1406271488,1406337023,IE
@@ -18369,35 +19224,23 @@
1406730240,1406746623,RU
1406746624,1406754815,BE
1406754816,1406763007,GB
-1406763008,1406763263,BE
-1406763264,1406764799,LU
-1406764800,1406765055,BE
-1406765056,1406765311,LU
-1406765312,1406765823,BE
-1406765824,1406766335,LU
-1406766336,1406767103,BE
-1406767104,1406767615,LU
-1406767616,1406767871,BE
-1406767872,1406768127,LU
-1406768128,1406768383,BE
-1406768384,1406769407,LU
-1406769408,1406769663,BE
-1406769664,1406770431,LU
-1406770432,1406770687,BE
-1406770688,1406770943,LU
-1406770944,1406771199,BE
+1406763008,1406771199,LU
1406771200,1406779391,GB
1406779392,1406787583,RU
-1406787584,1406791167,ES
-1406791168,1406791295,GB
+1406787584,1406791159,ES
+1406791160,1406791295,GB
1406791296,1406793843,ES
1406793844,1406793847,GB
1406793848,1406794751,ES
1406794752,1406795775,NL
1406795776,1406796543,GB
1406796544,1406796799,IM
-1406796800,1406803455,GB
-1406803456,1406803967,IM
+1406796800,1406802175,GB
+1406802176,1406802431,IM
+1406802432,1406803199,GB
+1406803200,1406803455,IM
+1406803456,1406803711,GB
+1406803712,1406803967,IM
1406803968,1406812159,DE
1406812160,1406820351,SE
1406820352,1406828543,PL
@@ -18452,9 +19295,7 @@
1407320064,1407451135,SE
1407451136,1407483903,BG
1407483904,1407516671,CH
-1407516672,1407522719,GB
-1407522720,1407522727,CD
-1407522728,1407526231,GB
+1407516672,1407526231,GB
1407526232,1407526239,CD
1407526240,1407529178,GB
1407529179,1407529180,NG
@@ -18572,9 +19413,7 @@
1410514944,1410523135,GB
1410523136,1410531327,PT
1410531328,1410539519,DE
-1410539520,1410540671,GB
-1410540672,1410540799,US
-1410540800,1410547711,GB
+1410539520,1410547711,GB
1410547712,1410555903,CZ
1410555904,1410564095,GB
1410564096,1410572287,SE
@@ -18600,9 +19439,9 @@
1410711552,1410719743,BG
1410719744,1410727935,RU
1410727936,1410736127,BG
-1410736128,1410738687,RS
-1410738688,1410738943,XK
-1410738944,1410744319,RS
+1410736128,1410739967,RS
+1410739968,1410740479,XK
+1410740480,1410744319,RS
1410744320,1410752511,FR
1410752512,1410760703,NL
1410760704,1410768895,RU
@@ -18617,15 +19456,7 @@
1410834432,1410842623,PL
1410842624,1410850815,PT
1410850816,1410859007,DE
-1410859008,1410972159,NL
-1410972160,1410972415,DE
-1410972416,1410972671,NL
-1410972672,1410972927,DE
-1410972928,1410973439,NL
-1410973440,1410973695,DE
-1410973696,1410975487,NL
-1410975488,1410975743,DE
-1410975744,1411383295,NL
+1410859008,1411383295,NL
1411383296,1411448831,LT
1411448832,1411449727,IT
1411449728,1411449791,DE
@@ -18672,8 +19503,11 @@
1411899392,1411901439,ES
1411901440,1411903487,IE
1411903488,1411907583,RU
+1411907584,1411911679,GB
1411911680,1411915775,US
+1411915776,1411919871,GB
1411919872,1411921919,DE
+1411922432,1411923967,GB
1411923968,1411940351,BG
1411940352,1411973119,PL
1411973120,1411999743,SI
@@ -18729,11 +19563,9 @@
1412939776,1412956159,CH
1412956160,1413480447,DE
1413480448,1414004735,IN
-1414004736,1414036607,CH
-1414036608,1414036991,DE
-1414036992,1414039551,CH
-1414039552,1414040575,DE
-1414040576,1414069218,CH
+1414004736,1414039551,CH
+1414039552,1414040191,DE
+1414040192,1414069218,CH
1414069219,1414069219,AT
1414069220,1414094847,CH
1414094848,1414095615,DE
@@ -18747,9 +19579,7 @@
1415577600,1416101887,FR
1416101888,1416364031,NL
1416364032,1416626175,IL
-1416626176,1416876287,AT
-1416876288,1416876543,CH
-1416876544,1416941567,AT
+1416626176,1416941567,AT
1416941568,1416943615,CH
1416943616,1416944639,AT
1416944640,1416945663,CZ
@@ -18758,61 +19588,7 @@
1417019392,1417150463,DE
1417150464,1417674751,ES
1417674752,1421869055,DE
-1421869056,1421886975,BE
-1421886976,1421887743,NL
-1421887744,1421888511,BE
-1421888512,1421888767,NL
-1421888768,1421889279,BE
-1421889280,1421889791,NL
-1421889792,1421890047,BE
-1421890048,1421890303,NL
-1421890304,1421893119,BE
-1421893120,1421893631,NL
-1421893632,1421894143,BE
-1421894144,1421894399,NL
-1421894400,1421894783,BE
-1421894784,1421894911,NL
-1421894912,1421896063,BE
-1421896064,1421896703,NL
-1421896704,1421896831,BE
-1421896832,1421896959,NL
-1421896960,1421897727,BE
-1421897728,1421898239,NL
-1421898240,1421899263,BE
-1421899264,1421899519,NL
-1421899520,1421900543,BE
-1421900544,1421900799,NL
-1421900800,1421959679,BE
-1421959680,1421959807,NL
-1421959808,1421959935,BE
-1421959936,1421960191,NL
-1421960192,1422022143,BE
-1422022144,1422022399,NL
-1422022400,1422082559,BE
-1422082560,1422083071,NL
-1422083072,1422084223,BE
-1422084224,1422084351,NL
-1422084352,1422085119,BE
-1422085120,1422085375,NL
-1422085376,1422085887,BE
-1422085888,1422086143,NL
-1422086144,1422087679,BE
-1422087680,1422088191,NL
-1422088192,1422088447,BE
-1422088448,1422088703,NL
-1422088704,1422088959,BE
-1422088960,1422089215,NL
-1422089216,1422089471,BE
-1422089472,1422089727,NL
-1422089728,1422095743,BE
-1422095744,1422095871,NL
-1422095872,1422128639,BE
-1422128640,1422129151,NL
-1422129152,1422132479,BE
-1422132480,1422132735,NL
-1422132736,1422289663,BE
-1422289664,1422289791,NL
-1422289792,1422393343,BE
+1421869056,1422393343,BE
1422393344,1422413567,DE
1422413568,1422413695,AT
1422413696,1422413727,US
@@ -18838,10 +19614,10 @@
1422786560,1422852095,HU
1422857088,1422857151,FR
1422910208,1422910463,NL
+1422911232,1422911487,NL
1422916608,1422916863,GB
1422917120,1422917343,GB
1422917344,1422917375,NL
-1422917376,1422917631,GB
1422917632,1423441919,NO
1423441920,1423704063,SE
1423704064,1423966207,IT
@@ -18858,23 +19634,39 @@
1424503716,1424523263,ES
1424523264,1424556031,RO
1424556032,1424588799,EG
-1424588800,1424592639,GB
-1424592640,1424592895,FR
-1424592896,1424595711,GB
-1424595712,1424595967,IT
-1424595968,1424597069,GB
+1424588800,1424595726,GB
+1424595727,1424595727,IT
+1424595728,1424595743,GB
+1424595744,1424595751,IT
+1424595752,1424597069,GB
1424597070,1424597070,CZ
-1424597071,1424600575,GB
-1424600576,1424600831,FR
-1424600832,1424602879,GB
-1424602880,1424603135,US
-1424603136,1424604975,GB
-1424604976,1424604983,NL
-1424604984,1424607743,GB
+1424597071,1424601887,GB
+1424601888,1424601903,NL
+1424601904,1424603023,GB
+1424603024,1424603039,US
+1424603040,1424604975,GB
+1424604976,1424604991,NL
+1424604992,1424607743,GB
1424607744,1424607775,DE
-1424607776,1424617215,GB
+1424607776,1424608083,GB
+1424608084,1424608087,FR
+1424608088,1424609247,GB
+1424609248,1424609255,DE
+1424609256,1424610643,GB
+1424610644,1424610644,PL
+1424610645,1424610992,GB
+1424610993,1424610993,FR
+1424610994,1424611002,GB
+1424611003,1424611003,FR
+1424611004,1424611005,GB
+1424611006,1424611006,FR
+1424611007,1424611295,GB
+1424611296,1424611311,BE
+1424611312,1424617215,GB
1424617216,1424617231,IT
-1424617232,1424621567,GB
+1424617232,1424619855,GB
+1424619856,1424619863,BE
+1424619864,1424621567,GB
1424621568,1424625663,PL
1424625664,1424629759,GB
1424629760,1424633855,PL
@@ -18963,17 +19755,12 @@
1425485312,1425489407,RO
1425489408,1425489663,NL
1425489664,1425506303,RO
-1425506304,1425518847,NO
-1425518848,1425518975,RU
-1425518976,1425522687,NO
+1425506304,1425522687,NO
1425522688,1425539071,IT
1425539072,1425801215,FI
-1425801216,1425813759,BG
-1425813760,1425814015,MK
-1425814016,1425814271,BG
-1425814272,1425814527,MK
+1425801216,1425813503,BG
+1425813504,1425814527,MK
1425814528,1425817599,BG
-1425820160,1425820415,DE
1425833984,1425850367,RU
1425850368,1425866751,GB
1425866752,1425883135,CH
@@ -18984,7 +19771,10 @@
1425948672,1425965055,DE
1425965056,1425970175,IT
1425970176,1425970431,FR
-1425970432,1425980415,IT
+1425970432,1425974271,IT
+1425974272,1425974783,GB
+1425974784,1425977343,IT
+1425977344,1425980415,FR
1425980416,1425980671,IQ
1425980672,1425981439,IT
1425981440,1425997823,RU
@@ -18992,21 +19782,13 @@
1426014208,1426030591,DK
1426030592,1426046975,BH
1426046976,1426063359,SI
-1426063360,1426094335,CH
-1426094336,1426094591,DE
-1426094592,1426112511,CH
-1426112512,1426112767,DE
-1426112768,1426118271,CH
-1426118272,1426118399,DE
-1426118400,1426168575,CH
-1426168576,1426168831,DE
-1426168832,1426175999,CH
-1426176000,1426176255,DE
-1426176256,1426587647,CH
+1426063360,1426587647,CH
1426587648,1426604031,SE
1426604032,1426620415,DE
1426636800,1426653183,GB
-1426653184,1426669567,RO
+1426653184,1426660657,RO
+1426660658,1426660658,US
+1426660659,1426669567,RO
1426669568,1426685951,IR
1426685952,1426702335,TJ
1426702336,1426718719,LV
@@ -19026,9 +19808,7 @@
1426915328,1426931711,AT
1426931712,1426948095,CZ
1426948096,1426964479,DE
-1426964480,1426967287,GB
-1426967288,1426967295,ES
-1426967296,1426980863,GB
+1426964480,1426980863,GB
1426980864,1426997247,BG
1426997248,1427013631,PL
1427013632,1427030015,FR
@@ -19068,7 +19848,9 @@
1427722028,1427722030,SG
1427722031,1427722031,DE
1427722032,1427722033,SG
-1427722034,1427728088,DE
+1427722034,1427722093,DE
+1427722094,1427722094,EE
+1427722095,1427728088,DE
1427728089,1427728100,SG
1427728101,1427728599,DE
1427728600,1427728600,SK
@@ -19082,7 +19864,9 @@
1427832832,1427865599,BE
1427865600,1427898367,DK
1427898368,1427914751,RU
-1427914752,1427931135,BE
+1427914752,1427930965,BE
+1427930966,1427930966,LU
+1427930967,1427931135,BE
1427931136,1427947519,PL
1427947520,1427963903,RU
1427963904,1427980287,TR
@@ -19142,7 +19926,9 @@
1431953408,1431961599,DK
1431961600,1431969791,CH
1431969792,1431977983,GB
-1431977984,1431986175,NL
+1431977984,1431980719,NL
+1431980720,1431980727,SA
+1431980728,1431986175,NL
1431986176,1431994367,RU
1431994368,1432002559,AT
1432002560,1432010751,HU
@@ -19219,12 +20005,8 @@
1433615028,1433615028,GB
1433615029,1433615359,DE
1433615360,1433615615,FR
-1433615616,1433615871,GB
-1433615872,1433616127,CH
-1433616128,1433616383,GB
-1433616384,1433621759,AE
-1433621760,1433622015,IN
-1433622016,1433624575,AE
+1433615616,1433616383,GB
+1433616384,1433624575,AE
1433624576,1433632767,LV
1433632768,1433640959,GI
1433640960,1433649151,RU
@@ -19266,9 +20048,9 @@
1433860096,1433862143,DE
1433862144,1433864191,CH
1433864192,1433866239,HU
-1433866240,1433867519,NL
-1433867520,1433867775,GB
-1433867776,1433868287,NL
+1433866240,1433867521,NL
+1433867522,1433867522,GB
+1433867523,1433868287,NL
1433868288,1433870335,GB
1433870336,1433872383,TR
1433872384,1433874431,IT
@@ -19290,8 +20072,7 @@
1433907200,1433909247,IT
1433909248,1433911295,BE
1433911296,1433913343,ES
-1433913344,1433915391,NL
-1433915392,1433917439,DE
+1433913344,1433917439,DE
1433917440,1433919487,BE
1433919488,1433921535,GB
1433921536,1433923583,CH
@@ -19310,9 +20091,7 @@
1434615808,1434648575,IL
1434648576,1434681343,FI
1434681344,1434714111,DE
-1434714112,1434717951,AZ
-1434717952,1434718207,GB
-1434718208,1434746879,AZ
+1434714112,1434746879,AZ
1434746880,1434779647,CZ
1434779648,1434812415,GB
1434812416,1434845183,IR
@@ -19354,9 +20133,7 @@
1436464384,1436464639,AT
1436464640,1436465151,DE
1436465152,1436467199,RU
-1436467200,1436468223,DE
-1436468224,1436468479,AT
-1436468480,1436469247,DE
+1436467200,1436469247,DE
1436469248,1436471295,NL
1436471296,1436473343,BE
1436473344,1436475391,RO
@@ -19391,7 +20168,23 @@
1436542976,1436545023,NL
1436545024,1436547071,DE
1436547072,1436549119,GB
-1436549120,1436680191,CZ
+1436549120,1436549887,CZ
+1436549888,1436552447,SK
+1436552448,1436552703,CZ
+1436552704,1436553727,SK
+1436553728,1436553983,CZ
+1436553984,1436554751,SK
+1436554752,1436555007,CZ
+1436555008,1436557055,SK
+1436557056,1436557311,CZ
+1436557312,1436559359,SK
+1436559360,1436559615,CZ
+1436559616,1436560127,SK
+1436560128,1436560383,CZ
+1436560384,1436564479,SK
+1436564480,1436564735,CZ
+1436564736,1436614655,SK
+1436614656,1436680191,CZ
1436680192,1436811263,SK
1436811264,1437073407,NO
1437073408,1437335551,FR
@@ -19453,15 +20246,15 @@
1439055872,1439072255,RU
1439072256,1439088639,UA
1439088640,1439105023,PL
-1439105024,1439121407,AT
+1439105024,1439106559,AT
+1439106560,1439106815,DE
+1439106816,1439121407,AT
1439121408,1439154175,DE
1439154176,1439156106,GB
1439156107,1439156108,LB
1439156109,1439170559,GB
1439170560,1439236095,NO
-1439236096,1439261439,BE
-1439261440,1439261695,FR
-1439261696,1439301631,BE
+1439236096,1439301631,BE
1439301632,1439305727,RU
1439305728,1439309823,DK
1439309824,1439318015,PL
@@ -19475,9 +20268,14 @@
1439358976,1439367167,RU
1439367168,1439373311,NL
1439373312,1439373567,SE
-1439373568,1439399935,NL
+1439373568,1439383551,NL
+1439383552,1439399935,FR
1439399936,1439432703,DK
-1439432704,1439477759,RO
+1439432704,1439441919,RO
+1439441920,1439442943,ES
+1439442944,1439460607,RO
+1439460608,1439460863,MD
+1439460864,1439477759,RO
1439477760,1439479807,MD
1439479808,1439498239,RO
1439498240,1439513599,DE
@@ -19511,7 +20309,7 @@
1439561728,1439562239,GB
1439562240,1439562751,IE
1439562752,1439563007,DE
-1439563008,1439563263,IT
+1439563008,1439563263,GB
1439563264,1439563775,DE
1439563776,1439629311,LT
1439629312,1439694847,CZ
@@ -19529,11 +20327,11 @@
1440514048,1440546815,DE
1440546816,1440579583,NO
1440579584,1440645119,PL
-1440645120,1440669695,RS
+1440645120,1440653311,GB
+1440653312,1440669695,RS
1440669696,1440671743,NL
1440671744,1440672767,EE
-1440672768,1440673791,RS
-1440673792,1440710655,NL
+1440672768,1440710655,NL
1440710656,1440743423,UA
1440743424,1441267711,SE
1441267712,1441275903,DE
@@ -19558,9 +20356,9 @@
1441439744,1441447935,LV
1441447936,1441456127,BE
1441456128,1441464319,NL
-1441464320,1441468927,SE
-1441468928,1441469183,DK
-1441469184,1441472511,SE
+1441464320,1441470463,SE
+1441470464,1441470719,DK
+1441470720,1441472511,SE
1441472512,1441480703,RU
1441480704,1441488895,TR
1441488896,1441497087,GB
@@ -19570,9 +20368,7 @@
1441529856,1441538047,RU
1441538048,1441546239,DE
1441546240,1441554431,DK
-1441554432,1441554687,GB
-1441554688,1441554943,NL
-1441554944,1441556991,GB
+1441554432,1441556991,GB
1441556992,1441557503,SE
1441557504,1441564671,GB
1441564672,1441566719,IQ
@@ -19620,9 +20416,7 @@
1442709504,1442775039,LV
1442775040,1442779135,PL
1442779136,1442783231,DE
-1442783232,1442786559,NO
-1442786560,1442786815,LV
-1442786816,1442787327,NO
+1442783232,1442787327,NO
1442787328,1442791423,LT
1442791424,1442795519,LV
1442799616,1442803711,LT
@@ -19637,11 +20431,7 @@
1442832384,1442836479,GB
1442836480,1442840575,PL
1442840576,1444937727,GB
-1444937728,1444985599,AT
-1444985600,1444985855,DE
-1444985856,1445061631,AT
-1445061632,1445061887,DE
-1445061888,1445068799,AT
+1444937728,1445068799,AT
1445068800,1445199871,RO
1445199872,1445330943,QA
1445330944,1445396479,LT
@@ -19653,14 +20443,13 @@
1446182912,1446248447,SA
1446248448,1446313983,DK
1446313984,1446445055,GB
-1446445056,1446510591,RO
+1446445056,1446510591,IR
1446510592,1446543359,DE
1446543360,1446576127,AT
1446576128,1446608895,IR
1446608896,1446641663,BY
1446641664,1446674431,SI
-1446674432,1446707135,DK
-1446707136,1446707199,NO
+1446674432,1446707199,DK
1446707200,1446739967,AT
1446739968,1446772735,HU
1446772736,1446805503,SA
@@ -19683,29 +20472,49 @@
1449459712,1449525247,HU
1449525248,1449590783,RU
1449590784,1449656319,DE
-1449656320,1449706495,RO
+1449656320,1449664511,RO
+1449664512,1449668607,IR
+1449668608,1449670743,SE
+1449670744,1449670744,RO
+1449670745,1449672703,SE
+1449672704,1449695231,RO
+1449695232,1449697279,SE
+1449697280,1449706495,RO
1449706496,1449707519,MD
-1449707520,1449736191,RO
+1449707520,1449709567,SE
+1449709568,1449715711,RO
+1449715712,1449717759,IR
+1449717760,1449734143,RO
+1449734144,1449736191,IT
1449736192,1449738239,MD
1449738240,1449742335,RO
1449742336,1449744383,MD
-1449744384,1449765887,RO
+1449744384,1449750527,RO
+1449750528,1449752575,SE
+1449752576,1449765887,RO
1449765888,1449766911,MD
1449766912,1449775103,RO
1449775104,1449776127,MD
-1449776128,1449819135,RO
-1449819136,1449820159,MD
-1449820160,1449824255,RO
+1449776128,1449793279,RO
+1449793280,1449793535,NL
+1449793536,1449824255,RO
1449824256,1449826303,MD
-1449826304,1449840639,RO
+1449826304,1449828351,RO
+1449828352,1449830399,SE
+1449830400,1449840639,RO
1449840640,1449852927,MD
-1449852928,1449869311,RO
+1449852928,1449857023,IR
+1449857024,1449869311,RO
1449869312,1449870335,MD
-1449870336,1449883647,RO
+1449870336,1449879039,RO
+1449879040,1449879295,SG
+1449879296,1449883647,RO
1449883648,1449885695,BE
1449885696,1449893887,RO
1449893888,1449895935,MD
-1449895936,1449918463,RO
+1449895936,1449906175,RO
+1449906176,1449910271,IR
+1449910272,1449918463,RO
1449918464,1449951231,JO
1449951232,1449983999,TR
1449984000,1449992191,NL
@@ -19769,19 +20578,13 @@
1466097664,1466099711,ES
1466099712,1466101759,PL
1466101760,1466103807,DE
-1466103808,1466104116,FR
-1466104117,1466104117,GB
-1466104118,1466104442,FR
-1466104443,1466104443,GB
-1466104444,1466104467,FR
-1466104468,1466104468,GB
-1466104469,1466104942,FR
+1466103808,1466104575,GB
+1466104576,1466104942,FR
1466104943,1466104943,BE
1466104944,1466105173,FR
1466105174,1466105174,BE
1466105175,1466105343,FR
-1466105344,1466105599,GB
-1466105600,1466105855,FR
+1466105344,1466105855,GB
1466105856,1466122239,PL
1466122240,1466130431,LV
1466130432,1466138623,PL
@@ -19803,7 +20606,9 @@
1466499072,1466564607,PL
1466564608,1466571894,DE
1466571895,1466571895,AE
-1466571896,1466589183,DE
+1466571896,1466588785,DE
+1466588786,1466588786,FR
+1466588787,1466589183,DE
1466589184,1466590207,FR
1466590208,1466591999,GB
1466592000,1466613759,DE
@@ -19946,12 +20751,7 @@
1475211264,1475213311,DE
1475213312,1475215359,FR
1475215360,1475223551,IT
-1475223552,1475226239,SE
-1475226240,1475226367,NO
-1475226368,1475226495,SE
-1475226496,1475227647,NO
-1475227648,1475231743,SE
-1475231744,1475233791,NO
+1475223552,1475233791,NO
1475233792,1475235839,GB
1475235840,1475237887,IE
1475237888,1475239935,ES
@@ -19969,7 +20769,9 @@
1475260416,1475262463,FR
1475262464,1475266559,DE
1475266560,1475268607,GB
-1475268608,1475270655,RS
+1475268608,1475268863,RS
+1475268864,1475269119,XK
+1475269120,1475270655,RS
1475270656,1475272703,GB
1475272704,1475274751,BE
1475274752,1475276799,RU
@@ -20022,23 +20824,13 @@
1475575808,1475592191,AT
1475592192,1475608575,GB
1475608576,1475624959,RU
-1475624960,1475637303,JE
-1475637304,1475637311,GB
-1475637312,1475637471,JE
-1475637472,1475637479,GB
-1475637480,1475638783,JE
+1475624960,1475638783,JE
1475638784,1475639039,GB
1475639040,1475639391,JE
1475639392,1475639399,GB
1475639400,1475639479,JE
1475639480,1475639487,GB
-1475639488,1475639559,JE
-1475639560,1475639567,GB
-1475639568,1475639583,JE
-1475639584,1475639591,GB
-1475639592,1475639695,JE
-1475639696,1475639703,GB
-1475639704,1475641343,JE
+1475639488,1475641343,JE
1475641344,1475657727,UA
1475657728,1475674111,SK
1475674112,1475690495,DE
@@ -20049,10 +20841,8 @@
1475724868,1475724869,GB
1475724870,1475724870,RU
1475724871,1475725055,GB
-1475725056,1475725311,RU
-1475725312,1475726079,GB
-1475726080,1475726335,RU
-1475726336,1475729663,GB
+1475725056,1475725183,RU
+1475725184,1475729663,GB
1475729664,1475729671,UA
1475729672,1475731007,GB
1475731008,1475731071,UA
@@ -20184,7 +20974,8 @@
1481741568,1481741568,GG
1481741569,1481741823,GB
1481741824,1481742079,GG
-1481742080,1481744383,GB
+1481742080,1481744127,GB
+1481744128,1481744383,GG
1481744384,1481752575,IT
1481752576,1481760767,RU
1481760768,1481768959,UA
@@ -20244,19 +21035,7 @@
1482948608,1483210751,CZ
1483210752,1483735039,GB
1483735040,1483997183,FI
-1483997184,1484044287,AT
-1484044288,1484044543,DE
-1484044544,1484049911,AT
-1484049912,1484049915,DE
-1484049916,1484049921,AT
-1484049922,1484049922,DE
-1484049923,1484084607,AT
-1484084608,1484084735,DE
-1484084736,1484084991,AT
-1484084992,1484085119,DE
-1484085120,1484088831,AT
-1484088832,1484089087,DE
-1484089088,1484128255,AT
+1483997184,1484128255,AT
1484128256,1484259327,LT
1484259328,1484783615,FR
1484783616,1484849151,DE
@@ -20270,9 +21049,7 @@
1485250560,1485254655,IR
1485254656,1485259007,RU
1485259008,1485262847,UA
-1485262848,1485263615,RU
-1485263616,1485263871,UA
-1485263872,1485266943,RU
+1485262848,1485266943,RU
1485266944,1485271039,RO
1485271040,1485275135,UA
1485275136,1485283327,LV
@@ -20356,13 +21133,18 @@
1489644032,1489644287,IT
1489644288,1489644543,FR
1489644544,1489644799,IQ
-1489644800,1489648383,IT
+1489644800,1489647615,IT
+1489647616,1489648383,FR
1489648384,1489648639,GR
1489648640,1489649663,IT
1489649664,1489650687,FR
-1489650688,1489660159,IT
-1489660160,1489660415,LY
-1489660416,1489666047,IT
+1489650688,1489651199,IT
+1489651200,1489653247,FR
+1489653248,1489655295,IT
+1489655296,1489655551,GR
+1489655552,1489659647,IT
+1489659648,1489661951,FR
+1489661952,1489666047,IT
1489666048,1489674239,GB
1489674240,1489676287,NL
1489676288,1489698815,GB
@@ -20375,39 +21157,31 @@
1489928192,1489960959,SE
1489960960,1489993727,HR
1489993728,1490026495,LU
-1490026496,1490028543,US
-1490028544,1490029055,UA
-1490029056,1490042879,NL
+1490026496,1490028543,NL
+1490028544,1490028671,GB
+1490028672,1490028799,DE
+1490028800,1490042879,NL
1490042880,1490053375,CZ
-1490053376,1490053631,PL
-1490053632,1490059263,CZ
+1490053376,1490054143,PL
+1490054144,1490059263,CZ
1490059264,1490075647,DE
1490075648,1490092031,GB
1490092032,1490108415,DE
1490108416,1490124799,MC
1490124800,1490141183,HU
1490141184,1490142719,CZ
-1490142720,1490143231,HU
-1490143232,1490143999,CZ
-1490144000,1490144255,HU
-1490144256,1490146559,CZ
-1490146560,1490146815,HU
-1490146816,1490148863,CZ
-1490148864,1490149119,HU
-1490149120,1490151679,CZ
-1490151680,1490151935,HU
-1490151936,1490153983,CZ
-1490153984,1490154239,HU
-1490154240,1490154495,CZ
-1490154496,1490154751,HU
-1490154752,1490157567,CZ
+1490142720,1490142975,HU
+1490142976,1490145279,CZ
+1490145280,1490147327,HU
+1490147328,1490149375,CZ
+1490149376,1490150399,HU
+1490150400,1490155519,CZ
+1490155520,1490157567,HU
1490157568,1490173951,RU
1490173952,1490190335,PT
1490190336,1490196991,GB
1490196992,1490197247,IE
-1490197248,1490205183,GB
-1490205184,1490205439,LY
-1490205440,1490206719,GB
+1490197248,1490206719,GB
1490206720,1490223103,GE
1490223104,1490255871,GB
1490255872,1490272255,NL
@@ -20451,32 +21225,32 @@
1491075072,1493172223,TR
1493172224,1493303295,DE
1493303296,1493430527,FR
-1493430528,1493430783,GP
-1493430784,1493431039,FR
-1493431040,1493431551,GP
-1493431552,1493431807,FR
-1493431808,1493432319,GP
-1493432320,1493434111,MQ
-1493434112,1493434367,FR
+1493430528,1493431039,GP
+1493431040,1493431807,FR
+1493431808,1493432063,GP
+1493432064,1493433087,FR
+1493433088,1493433855,MQ
+1493433856,1493434111,FR
+1493434112,1493434367,MQ
1493434368,1493565439,SA
1493565440,1493696511,ES
1493696512,1493958655,NO
1493958656,1494220799,DE
-1494220800,1494221823,FR
-1494221824,1494222335,RE
+1494220800,1494222079,FR
+1494222080,1494222335,RE
1494222336,1494222591,FR
1494222592,1494222847,RE
-1494222848,1494223615,FR
-1494223616,1494223871,RE
-1494223872,1494225407,FR
+1494222848,1494223359,FR
+1494223360,1494223615,RE
+1494223616,1494223871,FR
+1494223872,1494224127,RE
+1494224128,1494224895,FR
+1494224896,1494225151,GP
+1494225152,1494225407,FR
1494225408,1494225663,GP
-1494225664,1494226687,FR
-1494226688,1494226943,GP
-1494226944,1494227455,FR
-1494227456,1494227967,GP
-1494227968,1494228479,FR
-1494228480,1494228735,GP
-1494228736,1494228991,FR
+1494225664,1494227711,FR
+1494227712,1494227967,GP
+1494227968,1494228991,FR
1494228992,1494237183,RU
1494237184,1494245375,IE
1494245376,1494253567,RU
@@ -20536,9 +21310,11 @@
1494663168,1494665215,PL
1494665216,1494667263,UA
1494667264,1494669311,PL
-1494669312,1494675455,RU
-1494675456,1494679551,UA
-1494679552,1494695935,RU
+1494669312,1494676735,RU
+1494676736,1494676991,UA
+1494676992,1494678527,RU
+1494678528,1494678783,UA
+1494678784,1494695935,RU
1494695936,1494704127,RS
1494704128,1494736895,RU
1494736896,1494745087,DK
@@ -20584,7 +21360,8 @@
1495207936,1495209983,RU
1495212032,1495214079,RU
1495214080,1495216127,CZ
-1495216128,1495220223,IT
+1495216128,1495218175,IT
+1495218176,1495220223,NL
1495220224,1495222271,PL
1495222272,1495224319,IT
1495224320,1495228415,RU
@@ -20606,9 +21383,15 @@
1495263232,1495265279,GB
1495265280,1495267327,US
1495267328,1495269375,SE
-1495269376,1495283711,RO
-1495283712,1495287807,MD
-1495287808,1495304191,RO
+1495269376,1495277567,IR
+1495277568,1495279615,SE
+1495279616,1495283711,RO
+1495283712,1495285759,MD
+1495285760,1495287807,RO
+1495287808,1495289855,SE
+1495289856,1495293951,RO
+1495293952,1495298047,IR
+1495298048,1495304191,RO
1495304192,1495306239,MD
1495306240,1495306573,GB
1495306574,1495306574,RO
@@ -20616,42 +21399,60 @@
1495308288,1495313407,RO
1495313408,1495314431,MD
1495314432,1495326719,RO
-1495326720,1495335935,MD
-1495335936,1495416831,RO
+1495326720,1495332863,MD
+1495332864,1495333887,RO
+1495333888,1495335935,MD
+1495335936,1495369727,RO
+1495369728,1495371775,SE
+1495371776,1495408639,RO
+1495408640,1495416831,IR
1495416832,1495418879,MD
1495418880,1495429119,RO
1495429120,1495431167,MD
-1495431168,1495442431,RO
-1495442432,1495443455,MD
-1495443456,1495446527,RO
-1495446528,1495447551,MD
-1495447552,1495449599,RO
+1495431168,1495433215,RO
+1495433216,1495441407,IR
+1495441408,1495444479,RO
+1495444480,1495444735,SG
+1495444736,1495447551,RO
+1495447552,1495449599,SE
1495449600,1495451647,MD
1495451648,1495452671,RO
1495452672,1495453695,MD
1495453696,1495459839,RO
1495459840,1495460863,MD
-1495460864,1495468031,RO
+1495460864,1495461887,RO
+1495461888,1495463935,SE
+1495463936,1495468031,RO
1495468032,1495470079,MD
1495470080,1495476223,RO
1495476224,1495478271,MD
1495478272,1495487487,RO
1495487488,1495488511,MD
-1495488512,1495492607,RO
-1495492608,1495494655,MD
-1495494656,1495508991,RO
-1495508992,1495510015,MD
+1495488512,1495489279,RO
+1495489280,1495489535,MD
+1495489536,1495498239,RO
+1495498240,1495498495,SG
+1495498496,1495508991,RO
+1495508992,1495510015,IT
1495510016,1495517183,RO
1495517184,1495518207,MD
1495518208,1495571455,RO
1495571456,1495572479,MD
-1495572480,1495608319,RO
+1495572480,1495597055,RO
+1495597056,1495601151,IR
+1495601152,1495608319,RO
1495608320,1495609343,MD
1495609344,1495623679,RO
1495623680,1495623935,MD
-1495623936,1495670783,RO
+1495623936,1495632127,RO
+1495632128,1495632639,MD
+1495632640,1495642111,RO
+1495642112,1495644159,SE
+1495644160,1495670783,RO
1495670784,1495671807,MD
-1495671808,1495678975,RO
+1495671808,1495672831,RO
+1495672832,1495674879,ES
+1495674880,1495678975,RO
1495678976,1495679999,MD
1495680000,1495682047,RO
1495682048,1495683071,MD
@@ -20662,26 +21463,38 @@
1495749120,1495749631,RO
1495749632,1495750655,MD
1495750656,1495752703,RO
-1495752704,1495755775,MD
-1495755776,1495756799,RO
+1495752704,1495754751,MD
+1495754752,1495756799,RO
1495756800,1495758847,MD
-1495758848,1495759871,RO
+1495758848,1495759359,RO
+1495759360,1495759615,SG
+1495759616,1495759871,RO
1495759872,1495760127,MD
-1495760128,1495762943,RO
-1495762944,1495764991,MD
-1495764992,1495782655,RO
+1495760128,1495760895,RO
+1495760896,1495762943,DE
+1495762944,1495765759,RO
+1495765760,1495766015,NL
+1495766016,1495771135,RO
+1495771136,1495772159,PL
+1495772160,1495782655,RO
1495782656,1495782911,GB
1495782912,1495790079,RO
1495790080,1495790335,MD
-1495790336,1495793663,RO
-1495793664,1495795711,MD
-1495795712,1495845631,RO
+1495790336,1495845631,RO
1495845632,1495845887,GB
1495845888,1495852031,RO
1495852032,1495853055,MD
-1495853056,1495875583,RO
+1495853056,1495861247,RO
+1495861248,1495865343,IR
+1495865344,1495875583,RO
1495875584,1495891967,MD
-1495891968,1495941119,RO
+1495891968,1495900159,RO
+1495900160,1495902207,SE
+1495902208,1495908351,RO
+1495908352,1495922687,IR
+1495922688,1495926783,RO
+1495926784,1495927039,SG
+1495927040,1495941119,RO
1495941120,1495942143,MD
1495942144,1495943167,RO
1495943168,1495945215,MD
@@ -20689,46 +21502,69 @@
1495951360,1495952383,MD
1495952384,1495957503,RO
1495957504,1495958527,MD
-1495958528,1495966719,RO
-1495966720,1495967743,MD
-1495967744,1495970815,RO
+1495958528,1495967743,RO
+1495967744,1495968767,NL
+1495968768,1495970815,RO
1495970816,1495971839,MD
1495971840,1495982079,RO
1495982080,1495983103,MD
-1495983104,1495986175,RO
-1495986176,1495988223,MD
-1495988224,1496004607,RO
-1496004608,1496005631,MD
-1496005632,1496018943,RO
-1496018944,1496020991,MD
-1496020992,1496023039,RO
+1495983104,1495990271,RO
+1495990272,1495994367,IR
+1495994368,1495998463,RO
+1495998464,1495998719,SG
+1495998720,1496012799,RO
+1496012800,1496016895,IR
+1496016896,1496023039,RO
1496023040,1496024063,MD
1496024064,1496033279,RO
1496033280,1496034303,MD
-1496034304,1496053759,RO
-1496053760,1496055807,MD
-1496055808,1496078335,RO
+1496034304,1496049663,RO
+1496049664,1496051711,SE
+1496051712,1496055807,RO
+1496055808,1496057855,SE
+1496057856,1496078335,RO
1496078336,1496079359,MD
1496079360,1496084991,RO
1496084992,1496085247,MD
1496085248,1496094719,RO
1496094720,1496095743,MD
-1496095744,1496121343,RO
+1496095744,1496119295,RO
+1496119296,1496121343,SE
1496121344,1496122367,MD
1496122368,1496131583,RO
1496131584,1496132607,MD
-1496132608,1496197119,RO
+1496132608,1496133631,RO
+1496133632,1496137727,IR
+1496137728,1496180735,RO
+1496180736,1496182783,SE
+1496182784,1496188927,RO
+1496188928,1496189951,ES
+1496189952,1496190975,RO
+1496190976,1496191999,SE
+1496192000,1496192255,RO
+1496192256,1496193023,SE
+1496193024,1496197119,RO
1496197120,1496197631,MD
-1496197632,1496228863,RO
+1496197632,1496203263,RO
+1496203264,1496205311,IT
+1496205312,1496213503,RO
+1496213504,1496215551,IT
+1496215552,1496228863,RO
1496228864,1496229887,MD
-1496229888,1496238079,RO
-1496238080,1496240127,MD
-1496240128,1496276735,RO
+1496229888,1496236031,RO
+1496236032,1496238079,IT
+1496238080,1496240127,IQ
+1496240128,1496268799,RO
+1496268800,1496272895,IR
+1496272896,1496276735,RO
1496276736,1496276991,MD
-1496276992,1496295423,RO
+1496276992,1496285183,RO
+1496285184,1496293375,IR
+1496293376,1496295423,RO
1496295424,1496297471,GB
1496297472,1496299519,MD
-1496299520,1496317951,RO
+1496299520,1496301567,SE
+1496301568,1496317951,RO
1496317952,1497366527,DE
1497366528,1498415103,PL
1498415104,1499463679,FR
@@ -20736,13 +21572,7 @@
1499594752,1499725823,NL
1499725824,1499856895,IE
1499856896,1499987967,CZ
-1499987968,1499989247,AT
-1499989248,1499989503,HU
-1499989504,1499990911,AT
-1499990912,1499991039,HU
-1499991040,1499992575,AT
-1499992576,1499992831,HU
-1499992832,1499996159,AT
+1499987968,1499996159,AT
1499996160,1500004351,GB
1500004352,1500020735,RU
1500020736,1500028927,IS
@@ -20818,11 +21648,7 @@
1500479488,1500495871,RU
1500495872,1500512255,BA
1500512256,1500643327,RU
-1500643328,1500661247,PT
-1500661248,1500661503,RO
-1500661504,1500667647,PT
-1500667648,1500667903,RO
-1500667904,1500774399,PT
+1500643328,1500774399,PT
1500774400,1500905471,LT
1500905472,1501036543,IT
1501036544,1501298687,RO
@@ -20862,11 +21688,15 @@
1502920704,1502937087,RU
1502937088,1502953471,RO
1502953472,1502969855,MD
-1502969856,1502975231,FR
-1502975232,1502975487,GB
-1502975488,1502975743,FR
-1502975744,1502975999,DE
-1502976000,1502978047,FR
+1502969856,1502973951,FR
+1502973952,1502974975,DE
+1502974976,1502975231,FR
+1502975232,1502975247,GB
+1502975248,1502975327,FR
+1502975328,1502975359,GB
+1502975360,1502975743,FR
+1502975744,1502977023,DE
+1502977024,1502978047,FR
1502978048,1502979071,US
1502979072,1502979135,FR
1502979136,1502979199,GB
@@ -20874,7 +21704,11 @@
1502979216,1502979231,CZ
1502979232,1502980351,FR
1502980352,1502980607,US
-1502980608,1502981887,FR
+1502980608,1502980879,FR
+1502980880,1502980895,DE
+1502980896,1502980991,FR
+1502980992,1502981119,DE
+1502981120,1502981887,FR
1502981888,1502982143,NL
1502982144,1502986239,FR
1502986240,1502999734,DE
@@ -20895,7 +21729,9 @@
1503084544,1503100927,GB
1503100928,1503117311,RU
1503117312,1503133695,NO
-1503133696,1503395839,PT
+1503133696,1503370138,PT
+1503370139,1503370139,GB
+1503370140,1503395839,PT
1503395840,1503657983,FR
1503657984,1503690751,SE
1503690752,1503723519,IS
@@ -21074,10 +21910,23 @@
1503905624,1503905647,DE
1503905648,1503905655,IT
1503905656,1503905663,AT
-1503905664,1503920127,DE
-1503920128,1503985151,HR
-1503985152,1503985407,DE
-1503985408,1503985663,HR
+1503905664,1503905863,DE
+1503905864,1503905871,FI
+1503905872,1503905895,DE
+1503905896,1503905903,GB
+1503905904,1503905983,DE
+1503905984,1503905991,UA
+1503905992,1503906015,DE
+1503906016,1503906023,AT
+1503906024,1503906031,DE
+1503906032,1503906039,SK
+1503906040,1503906055,DE
+1503906056,1503906063,CH
+1503906064,1503906071,TR
+1503906072,1503906111,DE
+1503906112,1503906175,TR
+1503906176,1503920127,DE
+1503920128,1503985663,HR
1503985664,1504018431,IR
1504018432,1504051199,RO
1504051200,1504083967,FI
@@ -21085,7 +21934,9 @@
1504116736,1504149503,PL
1504149504,1504149759,GB
1504149760,1504150015,ES
-1504150016,1504154623,GB
+1504150016,1504151039,GB
+1504151040,1504151295,FR
+1504151296,1504154623,GB
1504154624,1504155647,IE
1504155648,1504247807,GB
1504247808,1504313343,RU
@@ -21111,9 +21962,7 @@
1505304576,1505312767,FR
1505312768,1505320959,RU
1505320960,1505329151,AT
-1505329152,1505335807,IE
-1505335808,1505336063,GB
-1505336064,1505336575,IE
+1505329152,1505336575,IE
1505336576,1505336831,GB
1505336832,1505337343,IE
1505337344,1505345535,FR
@@ -21164,32 +22013,12 @@
1505705984,1505714175,DE
1505714176,1505722367,LV
1505722368,1505738751,PL
-1505738752,1505740543,GB
-1505740544,1505740607,IL
-1505740608,1505740631,GB
-1505740632,1505740799,IL
-1505740800,1505746943,GB
+1505738752,1505746943,GB
1505746944,1505755135,RU
1505755136,1506017279,GB
1506017280,1506082815,IR
1506082816,1506148351,GB
-1506148352,1506218751,IR
-1506218752,1506219007,DE
-1506219008,1506219263,IR
-1506219264,1506219519,DE
-1506219520,1506219775,IR
-1506219776,1506220031,DE
-1506220032,1506261759,IR
-1506261760,1506262783,DE
-1506262784,1506265343,IR
-1506265344,1506267135,DE
-1506267136,1506270207,IR
-1506270208,1506271231,DE
-1506271232,1506274303,IR
-1506274304,1506274559,DE
-1506274560,1506274815,IR
-1506274816,1506275071,DE
-1506275072,1506279423,IR
+1506148352,1506279423,IR
1506279424,1506312191,NL
1506312192,1506316287,GB
1506316288,1506322431,PL
@@ -21218,21 +22047,33 @@
1506446824,1506446831,NL
1506446832,1506448319,GB
1506448320,1506448383,IT
-1506448384,1506450047,GB
+1506448384,1506449263,GB
+1506449264,1506449279,BE
+1506449280,1506450047,GB
1506450048,1506450111,CH
1506450112,1506450863,GB
1506450864,1506450879,CZ
1506450880,1506453311,GB
1506453312,1506453319,SE
-1506453320,1506456831,GB
-1506456832,1506457087,IT
-1506457088,1506458244,GB
+1506453320,1506456533,GB
+1506456534,1506456534,IT
+1506456535,1506458244,GB
1506458245,1506458245,CH
-1506458246,1506460151,GB
+1506458246,1506459207,GB
+1506459208,1506459247,BE
+1506459248,1506459295,GB
+1506459296,1506459327,BE
+1506459328,1506459968,GB
+1506459969,1506459969,FR
+1506459970,1506460151,GB
1506460152,1506460159,FR
-1506460160,1506462719,GB
+1506460160,1506462511,GB
+1506462512,1506462527,FR
+1506462528,1506462719,GB
1506462720,1506462975,IT
-1506462976,1506463679,GB
+1506462976,1506463551,GB
+1506463552,1506463615,DE
+1506463616,1506463679,GB
1506463680,1506463695,DE
1506463696,1506464895,GB
1506464896,1506464911,NL
@@ -21241,8 +22082,8 @@
1506465189,1506466383,GB
1506466384,1506466391,DE
1506466392,1506466399,GB
-1506466400,1506466431,DE
-1506466432,1506469663,GB
+1506466400,1506466559,DE
+1506466560,1506469663,GB
1506469664,1506469695,IT
1506469696,1506469759,GB
1506469760,1506469775,IT
@@ -21250,11 +22091,7 @@
1506471984,1506471999,NL
1506472000,1506472031,GB
1506472032,1506472047,NL
-1506472048,1506473471,GB
-1506473472,1506473727,IT
-1506473728,1506474239,GB
-1506474240,1506474495,IT
-1506474496,1506476031,GB
+1506472048,1506476031,GB
1506476032,1506508799,KW
1506508800,1506541567,CZ
1506541568,1506574335,RU
@@ -21289,9 +22126,7 @@
1506793472,1506795519,RU
1506795520,1506799615,CH
1506799616,1506801663,LV
-1506801664,1506803135,DE
-1506803136,1506803151,CH
-1506803152,1506803711,DE
+1506801664,1506803711,DE
1506803712,1506869247,RU
1506869248,1506934783,UA
1506934784,1507000319,GR
@@ -21302,10 +22137,12 @@
1507262464,1507327999,BG
1507328000,1507393535,RS
1507393536,1507459071,CH
-1507459072,1507502847,KZ
-1507502848,1507503103,GB
-1507503104,1507524607,KZ
-1507524608,1507590143,EE
+1507459072,1507483903,KZ
+1507483904,1507484159,NZ
+1507484160,1507524607,KZ
+1507524608,1507525631,EE
+1507525632,1507529727,KZ
+1507529728,1507590143,EE
1507590144,1507655679,NL
1507655680,1507659775,DE
1507659776,1507663871,RU
@@ -21346,15 +22183,13 @@
1508589568,1508605951,IR
1508605952,1508622335,RU
1508622336,1508638719,EE
-1508638720,1508639999,SE
-1508640000,1508640255,DK
-1508640256,1508642175,SE
+1508638720,1508642175,SE
1508642176,1508642303,DK
1508642304,1508642559,SE
1508642560,1508642815,DK
-1508642816,1508650751,SE
-1508650752,1508651007,DK
-1508651008,1508655103,SE
+1508642816,1508647691,SE
+1508647692,1508647692,DK
+1508647693,1508655103,SE
1508655104,1508671487,FI
1508671488,1508687871,CH
1508687872,1508704255,UZ
@@ -21365,9 +22200,7 @@
1508769792,1508786175,PL
1508786176,1508802559,DE
1508802560,1508818943,GB
-1508818944,1508819711,RO
-1508819712,1508819967,DE
-1508819968,1508830719,RO
+1508818944,1508830719,RO
1508830720,1508831487,SK
1508831488,1508835327,RO
1508835328,1508851711,CZ
@@ -21385,9 +22218,7 @@
1509449728,1509453823,ES
1509453824,1509457919,RU
1509457920,1509462015,NL
-1509462016,1509465599,LI
-1509465600,1509465855,CH
-1509465856,1509466111,LI
+1509462016,1509466111,LI
1509466112,1509470207,NL
1509470208,1509478399,RU
1509478400,1509482495,FR
@@ -21448,230 +22279,354 @@
1509883904,1509900287,NL
1509900288,1509916671,RU
1509916672,1509933055,GB
-1509933056,1509949439,US
-1509949440,1510663167,FR
-1510663168,1510663423,RE
-1510663424,1511981055,FR
-1511981056,1511981567,RE
-1511981568,1511982591,FR
-1511982592,1511983615,RE
-1511983616,1511984639,FR
-1511984640,1511985151,RE
-1511985152,1511985407,FR
-1511985408,1511986175,RE
-1511986176,1511986431,FR
-1511986432,1511986687,RE
-1511986688,1511986943,FR
-1511986944,1511987199,RE
-1511987200,1511987967,FR
-1511987968,1511988479,RE
-1511988480,1511988735,FR
-1511988736,1511989247,RE
-1511989248,1511989503,FR
-1511989504,1511990271,RE
-1511990272,1511990527,FR
-1511990528,1511991295,RE
-1511991296,1511991551,FR
-1511991552,1511992575,RE
-1511992576,1511993087,FR
-1511993088,1511994367,RE
-1511994368,1511995135,FR
-1511995136,1511995391,RE
-1511995392,1511995647,FR
-1511995648,1511996415,RE
-1511996416,1511996671,FR
-1511996672,1511996927,RE
-1511996928,1511997439,FR
-1511997440,1511998207,MQ
-1511998208,1511998463,FR
-1511998464,1511998719,MQ
-1511998720,1511998975,FR
-1511998976,1511999487,MQ
-1511999488,1511999743,FR
-1511999744,1512001023,MQ
-1512001024,1512001535,FR
-1512001536,1512003583,MQ
-1512003584,1512003839,FR
-1512003840,1512004095,MQ
-1512004096,1512004351,FR
-1512004352,1512005631,MQ
-1512005632,1512006143,BL
-1512006144,1512006399,FR
-1512006400,1512006911,BL
-1512006912,1512007167,MF
-1512007168,1512007423,FR
-1512007424,1512007935,BL
-1512007936,1512008191,FR
-1512008192,1512008447,BL
-1512008448,1512008703,MF
-1512008704,1512009215,BL
-1512009216,1512009471,MF
-1512009472,1512010239,BL
-1512010240,1512010495,GP
-1512010496,1512010751,BL
-1512010752,1512011263,MF
-1512011264,1512012287,BL
-1512012288,1512012543,FR
-1512012544,1512013055,BL
-1512013056,1512013311,FR
-1512013312,1512013567,BL
-1512013568,1512013823,FR
-1512013824,1512016639,GF
-1512016640,1512016895,FR
-1512016896,1512018943,GF
-1512018944,1512019199,FR
-1512019200,1512020479,GF
-1512020480,1512022015,FR
-1512022016,1512022271,GF
-1512022272,1512022527,FR
-1512022528,1512028415,GF
-1512028416,1512030207,FR
+1509933056,1509949439,NL
+1509949440,1510605311,FR
+1510605312,1510605823,RE
+1510605824,1510608383,FR
+1510608384,1510608639,RE
+1510608640,1510609407,FR
+1510609408,1510610175,RE
+1510610176,1510614015,FR
+1510614016,1510614783,RE
+1510614784,1510615039,FR
+1510615040,1510615295,RE
+1510615296,1510615551,FR
+1510615552,1510616319,RE
+1510616320,1510616575,FR
+1510616576,1510616831,RE
+1510616832,1510617087,FR
+1510617088,1510617599,RE
+1510617600,1510617855,FR
+1510617856,1510619135,RE
+1510619136,1510619391,FR
+1510619392,1510620159,RE
+1510620160,1510621695,FR
+1510621696,1510621951,RE
+1510621952,1510622463,FR
+1510622464,1510622719,RE
+1510622720,1510624511,FR
+1510624512,1510624767,RE
+1510624768,1510625791,FR
+1510625792,1510626303,RE
+1510626304,1510626815,FR
+1510626816,1510627071,RE
+1510627072,1510628351,FR
+1510628352,1510628607,RE
+1510628608,1510628863,FR
+1510628864,1510629119,RE
+1510629120,1510629631,FR
+1510629632,1510629887,RE
+1510629888,1510630399,FR
+1510630400,1510630655,RE
+1510630656,1510631167,FR
+1510631168,1510631423,RE
+1510631424,1510631935,FR
+1510631936,1510632703,RE
+1510632704,1510632959,FR
+1510632960,1510633727,RE
+1510633728,1510633983,FR
+1510633984,1510635263,RE
+1510635264,1510637567,FR
+1510637568,1510638079,RE
+1510638080,1510638335,FR
+1510638336,1510638591,RE
+1510638592,1510638847,FR
+1510638848,1510639359,RE
+1510639360,1510639871,FR
+1510639872,1510640127,RE
+1510640128,1510640383,FR
+1510640384,1510641151,RE
+1510641152,1510641407,FR
+1510641408,1510641919,RE
+1510641920,1510642431,FR
+1510642432,1510642943,RE
+1510642944,1510643455,FR
+1510643456,1510643711,RE
+1510643712,1510644479,FR
+1510644480,1510645759,RE
+1510645760,1510646015,FR
+1510646016,1510646271,RE
+1510646272,1510646783,FR
+1510646784,1510647295,RE
+1510647296,1510647807,FR
+1510647808,1510648319,RE
+1510648320,1510649343,FR
+1510649344,1510649599,RE
+1510649600,1510650623,FR
+1510650624,1510650879,RE
+1510650880,1510651135,FR
+1510651136,1510651391,RE
+1510651392,1510651647,FR
+1510651648,1510652159,RE
+1510652160,1510652927,FR
+1510652928,1510653439,RE
+1510653440,1510654719,FR
+1510654720,1510654975,RE
+1510654976,1510655487,FR
+1510655488,1510656255,RE
+1510656256,1510656511,FR
+1510656512,1510657023,RE
+1510657024,1510658303,FR
+1510658304,1510658559,RE
+1510658560,1510658815,FR
+1510658816,1510659071,RE
+1510659072,1510659839,FR
+1510659840,1510660095,RE
+1510660096,1510660863,FR
+1510660864,1510661119,RE
+1510661120,1510661375,FR
+1510661376,1510661631,RE
+1510661632,1510662399,FR
+1510662400,1510663423,RE
+1510663424,1510663679,FR
+1510663680,1510663935,RE
+1510663936,1510664447,FR
+1510664448,1510664703,RE
+1510664704,1510664959,FR
+1510664960,1510665215,RE
+1510665216,1510665983,FR
+1510665984,1510667775,RE
+1510667776,1511981567,FR
+1511981568,1511982079,RE
+1511982080,1511982335,FR
+1511982336,1511982591,RE
+1511982592,1511984383,FR
+1511984384,1511984639,RE
+1511984640,1511985151,FR
+1511985152,1511985407,RE
+1511985408,1511987199,FR
+1511987200,1511987711,RE
+1511987712,1511990271,FR
+1511990272,1511990527,RE
+1511990528,1511992575,FR
+1511992576,1511992831,RE
+1511992832,1511995391,FR
+1511995392,1511995647,RE
+1511995648,1511996415,FR
+1511996416,1511996671,RE
+1511996672,1511997183,FR
+1511997184,1511997439,RE
+1511997440,1511997695,FR
+1511997696,1511998463,MQ
+1511998464,1512001279,FR
+1512001280,1512002047,MQ
+1512002048,1512002303,FR
+1512002304,1512002559,MQ
+1512002560,1512006143,FR
+1512006144,1512006399,MF
+1512006400,1512006655,FR
+1512006656,1512008191,BL
+1512008192,1512008703,FR
+1512008704,1512008959,BL
+1512008960,1512010495,FR
+1512010496,1512010751,MF
+1512010752,1512011263,FR
+1512011264,1512011775,BL
+1512011776,1512012287,FR
+1512012288,1512012543,BL
+1512012544,1512012799,MF
+1512012800,1512013055,FR
+1512013056,1512013311,BL
+1512013312,1512013567,FR
+1512013568,1512013823,BL
+1512013824,1512014335,FR
+1512014336,1512015103,GF
+1512015104,1512015615,FR
+1512015616,1512016127,GF
+1512016128,1512016383,FR
+1512016384,1512018175,GF
+1512018176,1512018431,FR
+1512018432,1512018687,GF
+1512018688,1512019711,FR
+1512019712,1512019967,GF
+1512019968,1512020479,FR
+1512020480,1512021503,GF
+1512021504,1512021759,FR
+1512021760,1512023295,GF
+1512023296,1512023551,FR
+1512023552,1512023807,GF
+1512023808,1512024831,FR
+1512024832,1512025087,GF
+1512025088,1512025599,FR
+1512025600,1512026879,GF
+1512026880,1512028159,FR
+1512028160,1512030207,GF
1512030208,1512046591,YT
-1512046592,1512767487,FR
-1512767488,1512767743,RE
-1512767744,1512767999,FR
-1512768000,1512768255,RE
-1512768256,1512768511,FR
-1512768512,1512770047,RE
-1512770048,1512770303,FR
-1512770304,1512770815,RE
-1512770816,1512771583,FR
-1512771584,1512772351,RE
-1512772352,1512772863,FR
-1512772864,1512777215,RE
-1512777216,1512777471,FR
-1512777472,1512778495,RE
-1512778496,1512779007,FR
-1512779008,1512779519,RE
-1512779520,1512780031,FR
-1512780032,1512780287,RE
-1512780288,1512780543,FR
-1512780544,1512781567,RE
-1512781568,1512782847,FR
-1512782848,1512783103,RE
-1512783104,1512783359,FR
-1512783360,1512785919,RE
-1512785920,1512787199,FR
-1512787200,1512787967,RE
-1512787968,1512788223,FR
-1512788224,1512791807,RE
-1512791808,1512793087,FR
-1512793088,1512794111,RE
-1512794112,1512794367,FR
-1512794368,1512794623,RE
-1512794624,1512794879,FR
-1512794880,1512795135,RE
-1512795136,1512795391,FR
-1512795392,1512796415,RE
-1512796416,1512796671,FR
-1512796672,1512797183,RE
-1512797184,1512797439,FR
-1512797440,1512797695,RE
-1512797696,1512797951,FR
-1512797952,1512798207,RE
-1512798208,1512799231,FR
-1512799232,1512799487,RE
-1512799488,1512800511,FR
-1512800512,1512801023,MQ
-1512801024,1512801535,FR
-1512801536,1512802303,MQ
-1512802304,1512802815,FR
-1512802816,1512803071,MQ
-1512803072,1512803327,FR
-1512803328,1512803839,MQ
-1512803840,1512804607,FR
-1512804608,1512805375,MQ
-1512805376,1512805631,FR
-1512805632,1512806399,MQ
-1512806400,1512806655,FR
-1512806656,1512807423,MQ
-1512807424,1512807679,FR
-1512807680,1512807935,MQ
-1512807936,1512808447,FR
-1512808448,1512808959,MQ
-1512808960,1512809215,FR
-1512809216,1512810495,MQ
-1512810496,1512810751,FR
-1512810752,1512812543,MQ
-1512812544,1512812799,FR
-1512812800,1512813311,MQ
-1512813312,1512813567,FR
-1512813568,1512813823,MQ
-1512813824,1512814079,FR
-1512814080,1512815615,MQ
-1512815616,1512815871,FR
-1512815872,1512816639,MQ
-1512816640,1512818431,GP
-1512818432,1512818687,FR
-1512818688,1512819967,GP
-1512819968,1512820223,FR
-1512820224,1512822271,GP
-1512822272,1512822527,FR
-1512822528,1512824319,GP
-1512824320,1512824831,FR
-1512824832,1512826367,GP
-1512826368,1512826623,FR
-1512826624,1512828671,GP
-1512828672,1512828927,FR
-1512828928,1512830463,GP
-1512830464,1512830719,FR
-1512830720,1512831999,GP
-1512832000,1512832255,FR
-1512832256,1512832767,GP
-1512832768,1514110975,FR
-1514110976,1514111487,GP
-1514111488,1514111743,FR
-1514111744,1514112255,GP
-1514112256,1514112767,FR
-1514112768,1514114047,GP
-1514114048,1514114559,FR
-1514114560,1514116863,GP
-1514116864,1514117119,FR
-1514117120,1514117887,GP
-1514117888,1514118143,FR
-1514118144,1514119423,GP
-1514119424,1514119679,FR
-1514119680,1514119935,GP
-1514119936,1514120191,FR
-1514120192,1514121215,GP
-1514121216,1514121471,FR
-1514121472,1514123007,GP
-1514123008,1514123263,FR
-1514123264,1514125055,GP
-1514125056,1514125823,FR
-1514125824,1514126079,GP
-1514126080,1514126335,FR
-1514126336,1514126591,GP
-1514126592,1514127359,FR
-1514127360,1514127871,RE
-1514127872,1514128127,FR
-1514128128,1514128895,RE
-1514128896,1514129151,FR
-1514129152,1514129919,RE
-1514129920,1514130175,FR
-1514130176,1514130687,RE
-1514130688,1514130943,FR
-1514130944,1514131455,RE
-1514131456,1514131711,FR
-1514131712,1514131967,RE
-1514131968,1514132223,FR
-1514132224,1514132735,RE
-1514132736,1514132991,FR
-1514132992,1514134015,RE
-1514134016,1514134271,FR
-1514134272,1514135295,RE
-1514135296,1514135551,FR
-1514135552,1514135807,RE
-1514135808,1514136063,FR
-1514136064,1514136831,RE
-1514136832,1514137855,FR
-1514137856,1514139391,RE
-1514139392,1514139647,FR
-1514139648,1514140415,RE
-1514140416,1514140671,FR
-1514140672,1514142207,RE
-1514142208,1514142463,FR
-1514142464,1514143743,RE
+1512046592,1512308991,FR
+1512308992,1512309247,GP
+1512309248,1512310271,FR
+1512310272,1512310527,GP
+1512310528,1512310783,FR
+1512310784,1512311295,GP
+1512311296,1512311551,FR
+1512311552,1512312063,GP
+1512312064,1512314367,FR
+1512314368,1512314623,GP
+1512314624,1512314879,FR
+1512314880,1512315391,GP
+1512315392,1512315647,FR
+1512315648,1512316159,GP
+1512316160,1512316415,FR
+1512316416,1512316927,GP
+1512316928,1512317439,FR
+1512317440,1512317951,GP
+1512317952,1512318207,FR
+1512318208,1512318463,GP
+1512318464,1512319231,FR
+1512319232,1512319487,GP
+1512319488,1512319743,FR
+1512319744,1512319999,GP
+1512320000,1512320511,FR
+1512320512,1512320767,GP
+1512320768,1512322047,FR
+1512322048,1512322303,GP
+1512322304,1512322559,FR
+1512322560,1512322815,GP
+1512322816,1512323327,FR
+1512323328,1512323583,GP
+1512323584,1512324095,FR
+1512324096,1512324351,GP
+1512324352,1512324863,FR
+1512324864,1512325119,GP
+1512325120,1512325631,FR
+1512325632,1512325887,GP
+1512325888,1512326399,FR
+1512326400,1512326655,GP
+1512326656,1512327423,FR
+1512327424,1512328191,GP
+1512328192,1512329727,FR
+1512329728,1512330239,GP
+1512330240,1512330495,FR
+1512330496,1512332287,GP
+1512332288,1512332799,FR
+1512332800,1512333311,GP
+1512333312,1512334079,FR
+1512334080,1512334335,GP
+1512334336,1512334847,FR
+1512334848,1512335103,GP
+1512335104,1512335359,FR
+1512335360,1512335871,GP
+1512335872,1512336383,FR
+1512336384,1512337151,GP
+1512337152,1512338175,FR
+1512338176,1512338431,GP
+1512338432,1512338943,FR
+1512338944,1512339199,GP
+1512339200,1512339455,FR
+1512339456,1512339711,GP
+1512339712,1512340735,FR
+1512340736,1512341247,GP
+1512341248,1512341503,FR
+1512341504,1512341759,GP
+1512341760,1512342271,FR
+1512342272,1512342527,GP
+1512342528,1512343295,FR
+1512343296,1512343551,GP
+1512343552,1512344063,FR
+1512344064,1512344575,GP
+1512344576,1512344831,FR
+1512344832,1512345087,GP
+1512345088,1512345855,FR
+1512345856,1512346111,GP
+1512346112,1512346367,FR
+1512346368,1512346623,GP
+1512346624,1512347391,FR
+1512347392,1512347903,GP
+1512347904,1512348159,FR
+1512348160,1512348927,GP
+1512348928,1512349439,FR
+1512349440,1512349951,GP
+1512349952,1512350463,FR
+1512350464,1512350719,GP
+1512350720,1512351231,FR
+1512351232,1512351487,GP
+1512351488,1512351999,FR
+1512352000,1512352767,GP
+1512352768,1512353535,FR
+1512353536,1512354047,GP
+1512354048,1512354303,FR
+1512354304,1512354559,GP
+1512354560,1512354815,FR
+1512354816,1512355327,GP
+1512355328,1512356095,FR
+1512356096,1512356351,GP
+1512356352,1512356607,FR
+1512356608,1512356863,GP
+1512356864,1512357119,FR
+1512357120,1512357375,GP
+1512357376,1512357631,FR
+1512357632,1512357887,GP
+1512357888,1512358655,FR
+1512358656,1512359167,GP
+1512359168,1512359423,FR
+1512359424,1512360191,GP
+1512360192,1512360447,FR
+1512360448,1512361471,GP
+1512361472,1512361727,FR
+1512361728,1512361983,GP
+1512361984,1512362239,FR
+1512362240,1512362495,GP
+1512362496,1512363007,FR
+1512363008,1512363263,GP
+1512363264,1512363519,FR
+1512363520,1512363775,GP
+1512363776,1512364031,FR
+1512364032,1512364287,GP
+1512364288,1512364543,FR
+1512364544,1512366847,GP
+1512366848,1512367359,FR
+1512367360,1512367615,GP
+1512367616,1512368127,FR
+1512368128,1512368383,GP
+1512368384,1512368639,FR
+1512368640,1512368895,GP
+1512368896,1512370431,FR
+1512370432,1512370441,GP
+1512370442,1512370442,FR
+1512370443,1512370687,GP
+1512370688,1512370943,FR
+1512370944,1512372223,GP
+1512372224,1512372735,FR
+1512372736,1512372991,GP
+1512372992,1514111231,FR
+1514111232,1514111743,GP
+1514111744,1514111999,FR
+1514112000,1514112255,GP
+1514112256,1514113791,FR
+1514113792,1514114047,GP
+1514114048,1514114815,FR
+1514114816,1514115071,GP
+1514115072,1514115583,FR
+1514115584,1514115839,GP
+1514115840,1514116351,FR
+1514116352,1514116607,GP
+1514116608,1514119935,FR
+1514119936,1514120191,GP
+1514120192,1514121215,FR
+1514121216,1514121471,GP
+1514121472,1514123007,FR
+1514123008,1514123263,GP
+1514123264,1514124287,FR
+1514124288,1514124543,GP
+1514124544,1514127871,FR
+1514127872,1514128127,RE
+1514128128,1514128895,FR
+1514128896,1514129407,RE
+1514129408,1514131967,FR
+1514131968,1514132223,RE
+1514132224,1514132735,FR
+1514132736,1514132991,RE
+1514132992,1514134271,FR
+1514134272,1514134527,RE
+1514134528,1514136063,FR
+1514136064,1514136319,RE
+1514136320,1514137599,FR
+1514137600,1514137855,RE
+1514137856,1514142207,FR
+1514142208,1514142719,RE
+1514142720,1514142975,FR
+1514142976,1514143231,RE
+1514143232,1514143743,FR
1514143744,1514176511,SK
1514176512,1515467007,FR
1515467008,1515467263,ES
@@ -21688,103 +22643,97 @@
1515488512,1515488895,US
1515488896,1515489023,FR
1515489024,1515489039,DE
-1515489040,1515489151,FR
+1515489040,1515489055,FR
+1515489056,1515489087,DE
+1515489088,1515489151,FR
1515489152,1515489167,ES
-1515489168,1518338047,FR
+1515489168,1515489791,FR
+1515489792,1515491007,NL
+1515491008,1518338047,FR
1518338048,1518370815,DE
-1518370816,1518403839,NL
-1518403840,1518404095,SE
-1518404096,1518404351,NL
-1518404352,1518404863,SE
-1518404864,1518405119,NL
-1518405120,1518405375,SE
-1518405376,1518406655,NL
-1518406656,1518406911,SE
-1518406912,1518407935,NL
-1518407936,1518408191,SE
-1518408192,1518409727,NL
-1518409728,1518436351,SE
+1518370816,1518409727,NL
+1518409728,1518412031,SE
+1518412032,1518413567,NO
+1518413568,1518413823,SE
+1518413824,1518418943,NO
+1518418944,1518419199,SE
+1518419200,1518419967,NO
+1518419968,1518436351,SE
1518436352,1518452735,NO
1518452736,1518460927,AT
-1518460928,1518470143,NL
-1518470144,1518472191,SE
+1518460928,1518471167,NL
+1518471168,1518472191,SE
1518472192,1518475263,LT
1518475264,1518476287,SE
1518476288,1518476799,EE
1518476800,1518477311,SE
1518477312,1518481407,EE
1518481408,1518489599,SE
-1518489600,1518490623,NL
-1518490624,1518493695,SE
-1518493696,1518501887,NL
+1518489600,1518501887,NL
1518501888,1518503935,EE
1518503936,1518510079,LT
1518510080,1518516223,LV
1518516224,1518517247,SE
1518517248,1518518271,LV
-1518518272,1518540543,SE
+1518518272,1518532351,SE
+1518532352,1518532607,NO
+1518532608,1518532863,SE
+1518532864,1518533375,NO
+1518533376,1518533887,SE
+1518533888,1518534143,NO
+1518534144,1518540543,SE
1518540544,1518540799,LT
-1518540800,1518542847,SE
+1518540800,1518541479,SE
+1518541480,1518541480,DE
+1518541481,1518542847,SE
1518542848,1518551039,LT
1518551040,1518565375,NL
1518565376,1518567423,SE
-1518567424,1518568703,LV
-1518568704,1518568959,SE
-1518568960,1518570239,LV
-1518570240,1518570495,SE
-1518570496,1518572543,LV
-1518572544,1518572799,SE
-1518572800,1518573311,LV
-1518573312,1518573823,SE
-1518573824,1518574335,LV
-1518574336,1518574591,SE
-1518574592,1518576127,LV
-1518576128,1518576383,SE
-1518576384,1518577407,LV
-1518577408,1518577919,SE
-1518577920,1518578687,LV
-1518578688,1518578943,SE
-1518578944,1518580479,LV
-1518580480,1518580735,SE
-1518580736,1518582271,LV
-1518582272,1518582527,SE
-1518582528,1518583039,LV
-1518583040,1518583295,SE
-1518583296,1518585343,LV
-1518585344,1518585599,SE
-1518585600,1518585855,LV
-1518585856,1518586111,SE
-1518586112,1518586623,LV
-1518586624,1518586879,SE
-1518586880,1518587647,LV
-1518587648,1518587903,SE
-1518587904,1518591743,LV
-1518591744,1518591999,SE
-1518592000,1518592255,LV
-1518592256,1518592511,SE
-1518592512,1518594047,LV
-1518594048,1518594303,SE
-1518594304,1518594815,LV
-1518594816,1518595071,SE
-1518595072,1518595327,LV
-1518595328,1518595583,SE
-1518595584,1518600191,LV
+1518567424,1518600191,LV
1518600192,1518633215,SE
1518633216,1518633471,NL
1518633472,1518635007,SE
1518635008,1518637055,NL
1518637056,1518641151,SE
1518641152,1518649343,NL
-1518649344,1518665727,SE
-1518665728,1518727167,RU
-1518727168,1518731263,SE
+1518649344,1518682879,SE
+1518682880,1518683135,RU
+1518683136,1518731263,SE
1518731264,1518747647,DE
1518747648,1518772223,LT
1518772224,1518780415,NL
1518780416,1518796799,HR
1518796800,1518927871,DE
-1518927872,1518944255,RU
-1518944256,1518960639,SE
+1518927872,1518944255,SE
+1518944256,1518945023,NL
+1518945024,1518945535,SE
+1518945536,1518946303,NL
+1518946304,1518946815,SE
+1518946816,1518947327,NL
+1518947328,1518948095,SE
+1518948096,1518948351,NL
+1518948352,1518948863,SE
+1518948864,1518949119,NL
+1518949120,1518949631,SE
+1518949632,1518950911,NL
+1518950912,1518951167,SE
+1518951168,1518951679,NL
+1518951680,1518952191,SE
+1518952192,1518954751,NL
+1518954752,1518955007,SE
+1518955008,1518955775,NL
+1518955776,1518956031,SE
+1518956032,1518956543,NL
+1518956544,1518957311,SE
+1518957312,1518957823,NL
+1518957824,1518958079,SE
+1518958080,1518958591,NL
+1518958592,1518958847,SE
+1518958848,1518959103,NL
+1518959104,1518959359,SE
+1518959360,1518959871,NL
+1518959872,1518960127,SE
+1518960128,1518960639,NL
1518960640,1518961663,LT
1518961664,1518962175,EE
1518962176,1518962687,SE
@@ -21792,51 +22741,79 @@
1518964736,1518966783,HR
1518966784,1518967807,SE
1518967808,1518977023,HR
-1518977024,1518993407,SE
-1518993408,1519190015,RU
-1519190016,1519206399,SE
+1518977024,1518977791,SE
+1518977792,1518978559,NL
+1518978560,1518979071,SE
+1518979072,1518980095,NL
+1518980096,1518980607,SE
+1518980608,1518980863,NL
+1518980864,1518981631,SE
+1518981632,1518982143,NL
+1518982144,1518982399,SE
+1518982400,1518982655,NL
+1518982656,1518983935,SE
+1518983936,1518984191,NL
+1518984192,1518989311,SE
+1518989312,1518992127,NL
+1518992128,1518992383,SE
+1518992384,1518992639,NL
+1518992640,1518992895,SE
+1518992896,1518993152,NL
+1518993153,1519190271,SE
+1519190272,1519190783,NL
+1519190784,1519191551,SE
+1519191552,1519192063,NL
+1519192064,1519193343,SE
+1519193344,1519194111,NL
+1519194112,1519194623,SE
+1519194624,1519194879,NL
+1519194880,1519195135,SE
+1519195136,1519196671,NL
+1519196672,1519197183,SE
+1519197184,1519197951,NL
+1519197952,1519200255,SE
+1519200256,1519200511,EE
+1519200512,1519201023,SE
+1519201024,1519201279,EE
+1519201280,1519202303,SE
+1519202304,1519202815,EE
+1519202816,1519203071,SE
+1519203072,1519203327,EE
+1519203328,1519203583,SE
+1519203584,1519204351,EE
+1519204352,1519204607,SE
+1519204608,1519204863,EE
+1519204864,1519205631,SE
+1519205632,1519206143,EE
+1519206144,1519206399,SE
1519206400,1519208447,LV
1519208448,1519214591,SE
-1519214592,1519214847,LV
-1519214848,1519215359,SE
-1519215360,1519215615,LV
-1519215616,1519215871,SE
-1519215872,1519219455,LV
+1519214592,1519219455,LV
1519219456,1519219711,SE
1519219712,1519222783,LV
1519222784,1519259647,SE
1519259648,1519260671,NL
1519260672,1519263743,SE
-1519263744,1519289343,NL
-1519289344,1519292415,SE
+1519263744,1519290367,NL
+1519290368,1519292415,SE
1519292416,1519293951,LT
-1519293952,1519297023,SE
-1519297024,1519297279,LT
-1519297280,1519297535,SE
-1519297536,1519297791,LT
-1519297792,1519298559,SE
-1519298560,1519298815,LT
-1519298816,1519300607,SE
+1519293952,1519296511,SE
+1519296512,1519299583,LT
+1519299584,1519300607,SE
1519300608,1519304703,LT
-1519304704,1519313151,SE
-1519313152,1519313407,LT
-1519313408,1519313663,SE
-1519313664,1519313919,LT
-1519313920,1519314175,SE
-1519314176,1519318271,LT
-1519318272,1519318527,SE
-1519318528,1519321087,LT
-1519321088,1519386623,RU
-1519386624,1519394815,SE
+1519304704,1519305983,NL
+1519305984,1519306239,SE
+1519306240,1519307775,NL
+1519307776,1519308031,SE
+1519308032,1519308287,NL
+1519308288,1519308543,SE
+1519308544,1519308799,NL
+1519308800,1519312895,SE
+1519312896,1519321087,LT
+1519321088,1519394815,SE
1519394816,1519398911,HR
1519398912,1519403007,SE
-1519403008,1519411711,NL
-1519411712,1519411967,SE
-1519411968,1519415295,NL
-1519415296,1519415551,SE
-1519415552,1519416575,NL
-1519416576,1519416831,SE
-1519416832,1519419391,NL
+1519403008,1519419391,NL
1519419392,1519452159,SE
1519452160,1519517695,NL
1519517696,1519583231,AT
@@ -21867,19 +22844,13 @@
1520271360,1520304127,SI
1520304128,1520435199,TR
1520435200,1521483775,ES
-1521483776,1521531391,CZ
-1521531392,1521531647,PL
-1521531648,1522008063,CZ
+1521483776,1522008063,CZ
1522008064,1522139135,DK
1522139136,1522270207,DE
1522270208,1522401279,RU
1522401280,1522532351,EE
1522532352,1524629503,GB
-1524629504,1525092351,SE
-1525092352,1525092479,DK
-1525092480,1525122047,SE
-1525122048,1525122175,DK
-1525122176,1525678079,SE
+1524629504,1525678079,SE
1525678080,1526726655,GB
1526726656,1531183103,DE
1531183104,1531445247,FR
@@ -21890,9 +22861,7 @@
1532199936,1532200959,RS
1532200960,1532231679,HU
1532231680,1532362751,GB
-1532362752,1532408063,BE
-1532408064,1532408319,DE
-1532408320,1532493823,BE
+1532362752,1532493823,BE
1532493824,1532559359,FR
1532559360,1532624895,DE
1532624896,1532626943,ES
@@ -21953,13 +22922,13 @@
1533472768,1533474815,ES
1533474816,1533476863,FR
1533476864,1533478911,IE
-1533478912,1533480959,RS
1533480960,1533483007,NL
1533483008,1533485055,AM
1533485056,1533486079,GB
1533486080,1533486335,SE
1533486336,1533486591,NO
-1533486592,1533487103,GB
+1533486592,1533486847,DK
+1533486848,1533487103,GB
1533487104,1533489151,FR
1533489152,1533491199,ES
1533491200,1533493247,AM
@@ -22037,29 +23006,7 @@
1533929472,1533932799,GB
1533932800,1533933055,DE
1533933056,1534066687,GB
-1534066688,1534135295,AT
-1534135296,1534135423,HU
-1534135424,1534145279,AT
-1534145280,1534145407,DE
-1534145408,1534147711,AT
-1534147712,1534147839,CZ
-1534147840,1534156543,AT
-1534156544,1534156671,SK
-1534156672,1534241535,AT
-1534241536,1534241663,DE
-1534241664,1534268671,AT
-1534268672,1534268927,HU
-1534268928,1534279423,AT
-1534279424,1534279551,SK
-1534279552,1534298751,AT
-1534298752,1534298879,HU
-1534298880,1534299903,AT
-1534299904,1534300159,HU
-1534300160,1534302975,AT
-1534302976,1534303231,HU
-1534303232,1534303999,AT
-1534304000,1534304255,SK
-1534304256,1534328831,AT
+1534066688,1534328831,AT
1534328832,1534459903,ES
1534459904,1534590975,AT
1534590976,1534656511,HU
@@ -22067,7 +23014,9 @@
1534711808,1534712831,BE
1534712832,1534714415,FR
1534714416,1534714431,ES
-1534714432,1534714751,FR
+1534714432,1534714639,FR
+1534714640,1534714655,IE
+1534714656,1534714751,FR
1534714752,1534714767,DE
1534714768,1534715263,FR
1534715264,1534715267,IT
@@ -22122,14 +23071,14 @@
1534849024,1534853119,NL
1534853120,1534918655,UA
1534918656,1534984191,GB
-1534984192,1534985215,NO
-1534985216,1535049727,ES
+1534984192,1534988287,NO
+1534988288,1535049727,ES
1535049728,1535115263,SK
-1535115264,1535146495,AT
-1535146496,1535146751,CH
-1535146752,1535197183,AT
-1535197184,1535203071,EE
-1535203072,1535246335,SE
+1535115264,1535197183,AT
+1535197184,1535203359,EE
+1535203360,1535205375,SE
+1535205376,1535213567,EE
+1535213568,1535246335,SE
1535246336,1535311871,AT
1535311872,1535344639,NO
1535344640,1535350783,LV
@@ -22137,8 +23086,7 @@
1535352832,1535361023,EE
1535361024,1535377407,NL
1535377408,1535442943,GR
-1535442944,1535450879,RU
-1535450880,1535451135,FI
+1535442944,1535451135,RU
1535451136,1535459327,DK
1535459328,1535475711,AT
1535475712,1535508479,IR
@@ -22165,17 +23113,13 @@
1535631360,1535635455,GB
1535635456,1535639551,AZ
1535639552,1535672319,GB
-1535672320,1535706111,DE
-1535706112,1535707135,CH
-1535707136,1535709183,DE
-1535709184,1535715327,CH
-1535715328,1535717375,DE
-1535717376,1535721471,CH
-1535721472,1535721727,DE
-1535721728,1535737855,CH
-1535737856,1535746815,HU
-1535746816,1535747071,RS
-1535747072,1535770623,HU
+1535672320,1535721727,DE
+1535721728,1535727871,CH
+1535727872,1535728127,DE
+1535728128,1535732735,CH
+1535732736,1535735807,DE
+1535735808,1535737855,CH
+1535737856,1535770623,HU
1535770624,1535803391,CH
1535803392,1535836159,GR
1535836160,1535868927,CZ
@@ -22277,9 +23221,7 @@
1536684032,1536688127,GB
1536688128,1537212415,FI
1537212416,1538260991,FR
-1538260992,1538628607,BE
-1538628608,1538629119,FR
-1538629120,1538785279,BE
+1538260992,1538785279,BE
1538785280,1538793471,NL
1538793472,1538797567,DE
1538797568,1538801663,NL
@@ -22358,7 +23300,11 @@
1539211264,1539213311,CZ
1539213312,1539215359,SE
1539215360,1539219455,DE
-1539219456,1539221247,GG
+1539219456,1539219967,GG
+1539219968,1539220223,GB
+1539220224,1539220479,GG
+1539220480,1539220991,GB
+1539220992,1539221247,GG
1539221248,1539221503,GB
1539221504,1539223551,FR
1539223552,1539225599,RU
@@ -22374,8 +23320,7 @@
1539260416,1539276799,SK
1539276800,1539280895,SE
1539280896,1539284991,FR
-1539284992,1539287039,DE
-1539287040,1539289087,TR
+1539284992,1539289087,TR
1539289088,1539293183,RU
1539293184,1539297279,AZ
1539297280,1539301375,BG
@@ -22484,7 +23429,7 @@
1539427328,1539428351,UA
1539428352,1539429375,PL
1539429376,1539434495,RU
-1539434496,1539435519,UA
+1539434496,1539435519,GB
1539435520,1539437567,RU
1539437568,1539438591,GB
1539439616,1539440639,UA
@@ -23266,8 +24211,7 @@
1539865600,1539866623,UA
1539866624,1539867647,IT
1539867648,1539868671,RO
-1539868672,1539868927,UA
-1539868928,1539869695,RU
+1539868672,1539869695,RU
1539869696,1539870719,ES
1539870720,1539871743,IL
1539872768,1539873791,SE
@@ -23407,7 +24351,6 @@
1540050944,1540052991,RU
1540052992,1540054015,UA
1540055040,1540056063,NO
-1540056064,1540057087,NL
1540057088,1540057343,PL
1540057344,1540057599,RU
1540057600,1540057855,US
@@ -23432,7 +24375,7 @@
1540081664,1540082687,DE
1540082688,1540083711,NO
1540083712,1540084735,RU
-1540084736,1540085759,NL
+1540084736,1540085759,DE
1540085760,1540087807,PL
1540087808,1540088831,RU
1540089856,1540092927,RU
@@ -23519,8 +24462,8 @@
1540199424,1540200447,CH
1540200448,1540201471,IL
1540201472,1540202495,UA
-1540202496,1540203519,RU
-1540203520,1540204543,UA
+1540202496,1540204287,RU
+1540204288,1540204543,UA
1540204544,1540205567,RU
1540205568,1540206591,DE
1540206592,1540208639,RU
@@ -23566,7 +24509,6 @@
1540242944,1540243455,RU
1540243456,1540243967,PL
1540243968,1540244479,RU
-1540244480,1540244735,CH
1540244992,1540245503,DE
1540245504,1540246015,RU
1540246016,1540246527,IT
@@ -23641,7 +24583,8 @@
1540284928,1540285439,UA
1540285440,1540285951,DE
1540285952,1540286463,RU
-1540286464,1540286975,NL
+1540286464,1540286719,GB
+1540286720,1540286975,NL
1540286976,1540287487,GB
1540287488,1540288511,AT
1540288512,1540289535,RU
@@ -23764,7 +24707,7 @@
1540361472,1540361727,DE
1540361728,1540361983,IT
1540361984,1540362239,EE
-1540362240,1540363263,DE
+1540362496,1540363007,DE
1540363264,1540363519,RU
1540363776,1540364031,IS
1540364032,1540364287,RU
@@ -24252,7 +25195,6 @@
1540588544,1540589567,UA
1540589568,1540593663,RU
1540594688,1540595711,IT
-1540595712,1540596735,UZ
1540596736,1540597759,FR
1540597760,1540598783,SE
1540598784,1540600831,UA
@@ -24291,7 +25233,6 @@
1540624384,1540624639,IR
1540624640,1540624895,BG
1540624896,1540625151,GB
-1540625152,1540625407,IR
1540625664,1540625919,FR
1540625920,1540626175,UA
1540626176,1540626431,RO
@@ -24313,7 +25254,6 @@
1540631040,1540631295,NL
1540631296,1540631551,CH
1540631552,1540631807,HR
-1540631808,1540632063,LV
1540632064,1540632319,AT
1540632320,1540632575,RU
1540632576,1540632831,DK
@@ -24358,7 +25298,6 @@
1540645120,1540645375,RU
1540645376,1540645631,BE
1540645632,1540645887,NL
-1540645888,1540646143,PL
1540646144,1540646399,RO
1540646400,1540646655,PS
1540646656,1540646911,SE
@@ -24386,7 +25325,7 @@
1540653056,1540653311,FR
1540653312,1540653567,DK
1540653568,1540653823,DE
-1540653824,1540654335,GB
+1540653824,1540654079,GB
1540654336,1540654591,RU
1540654592,1540654847,SI
1540654848,1540655103,RU
@@ -24470,7 +25409,6 @@
1540678656,1540678911,SE
1540678912,1540679167,GB
1540679168,1540679423,RU
-1540679424,1540679679,PL
1540679680,1540679935,LT
1540679936,1540680191,BG
1540680192,1540680447,CH
@@ -24525,7 +25463,7 @@
1540693760,1540694015,UZ
1540694016,1540694271,CH
1540694272,1540694527,UA
-1540694528,1540695039,RO
+1540694528,1540694783,RO
1540695040,1540695295,DE
1540695296,1540695551,NL
1540695552,1540695807,PL
@@ -24560,7 +25498,6 @@
1540703488,1540703743,NL
1540703744,1540703999,DK
1540704000,1540704255,PL
-1540704256,1540704511,KZ
1540704512,1540704767,IE
1540705280,1540705535,RO
1540705536,1540705791,AT
@@ -24579,7 +25516,6 @@
1540708864,1540709119,FR
1540709120,1540709375,DE
1540709376,1540709631,UA
-1540709632,1540709887,KZ
1540709888,1540710143,UA
1540710144,1540710399,NL
1540710400,1540710655,PL
@@ -24624,7 +25560,6 @@
1540722688,1540722943,RU
1540722944,1540723455,FR
1540723456,1540723711,SI
-1540723712,1540723967,RU
1540723968,1540724223,UA
1540724224,1540724479,HU
1540724736,1540724991,CH
@@ -24690,7 +25625,6 @@
1540742144,1540742399,RU
1540742400,1540742655,DE
1540742656,1540742911,AT
-1540742912,1540743167,RU
1540743168,1540743423,NO
1540743424,1540743679,GB
1540743680,1540743935,PL
@@ -24726,7 +25660,6 @@
1540756480,1540757503,DK
1540757504,1540758527,PL
1540758528,1540759551,UA
-1540760064,1540760319,UA
1540760576,1540761599,PL
1540761600,1540762623,RU
1540762624,1540763647,LU
@@ -24745,9 +25678,9 @@
1540779008,1540780031,NL
1540780032,1540781055,UA
1540781056,1540783103,RU
-1540783104,1540784639,UA
-1540784640,1540784895,RU
-1540784896,1540787199,UA
+1540783104,1540784383,UA
+1540784384,1540785151,RU
+1540785152,1540787199,UA
1540787200,1540788223,KZ
1540788224,1540790271,RU
1540790272,1540791295,KW
@@ -24799,11 +25732,10 @@
1540848640,1540849663,UA
1540849664,1540850687,RU
1540850688,1540851711,FI
-1540851712,1540852735,UA
-1540852736,1540853759,RU
+1540851712,1540853759,RU
1540853760,1540854783,UA
1540854784,1540855807,NL
-1540855808,1540856831,RU
+1540855808,1540856831,UA
1540856832,1540857855,NL
1540857856,1540858879,DK
1540858880,1540859903,GB
@@ -24811,7 +25743,9 @@
1540860928,1540861951,KZ
1540861952,1540862975,BY
1540862976,1540865023,GB
-1540865024,1540872191,RU
+1540865024,1540867071,RU
+1540867072,1540868095,KZ
+1540868096,1540872191,RU
1540872192,1540873215,BG
1540873216,1540875263,RU
1540875264,1540876287,PL
@@ -25265,7 +26199,7 @@
1541070848,1541071871,IT
1541071872,1541072895,RU
1541072896,1541073919,CZ
-1541073920,1541074943,RO
+1541073920,1541074943,GB
1541074944,1541075967,PL
1541075968,1541078015,RU
1541078016,1541079039,RO
@@ -25316,8 +26250,7 @@
1541133312,1541134335,RO
1541134336,1541135359,SE
1541135360,1541136383,UA
-1541136384,1541138431,RU
-1541138432,1541139455,UA
+1541136384,1541139455,RU
1541139456,1541140479,HU
1541140480,1541142527,CZ
1541142528,1541143551,RU
@@ -25399,13 +26332,11 @@
1541165312,1541165567,RU
1541165568,1541165823,NL
1541165824,1541166079,GB
-1541166080,1541166335,RU
1541166336,1541166591,FR
1541166592,1541166847,RO
1541166848,1541167103,RU
1541167104,1541167359,NL
1541167360,1541167615,AT
-1541167616,1541167871,RU
1541167872,1541168127,UA
1541168128,1541168639,RU
1541168640,1541168895,MD
@@ -25439,7 +26370,6 @@
1541176064,1541176319,NL
1541176320,1541176575,AM
1541176576,1541176831,DE
-1541176832,1541177087,RU
1541177088,1541177343,GB
1541177344,1541177599,CH
1541177600,1541177855,DE
@@ -25510,7 +26440,6 @@
1541195520,1541195775,GB
1541195776,1541196031,FR
1541196032,1541196287,CZ
-1541196288,1541196543,RU
1541196800,1541197055,UA
1541197056,1541197311,PL
1541197312,1541197567,RU
@@ -25592,7 +26521,6 @@
1541228032,1541228543,RU
1541228544,1541229055,CZ
1541229056,1541229567,UA
-1541229568,1541230079,RU
1541230080,1541230591,RO
1541230592,1541231103,RU
1541231104,1541231615,GB
@@ -25729,7 +26657,7 @@
1541338112,1541341183,UA
1541341184,1541341439,TR
1541341440,1541341695,RU
-1541341696,1541341951,HU
+1541341696,1541341951,DE
1541341952,1541342463,PL
1541342464,1541342719,FR
1541342720,1541342975,PL
@@ -25993,7 +26921,7 @@
1541420032,1541420543,RU
1541420544,1541421055,NL
1541421056,1541421567,PL
-1541421568,1541422079,GB
+1541421568,1541422079,CZ
1541422080,1541422591,PL
1541422592,1541423103,RU
1541423616,1541424127,AT
@@ -26004,8 +26932,8 @@
1541426176,1541426687,RU
1541426688,1541427199,UA
1541427200,1541428223,RU
-1541428224,1541428991,UA
-1541428992,1541429247,RU
+1541428224,1541428735,UA
+1541428736,1541429247,RU
1541429248,1541429759,FI
1541429760,1541430271,CZ
1541430272,1541430783,LT
@@ -26116,7 +27044,9 @@
1541532672,1541533695,RU
1541533696,1541534719,PL
1541534720,1541535743,IT
-1541535744,1541536767,US
+1541535744,1541536255,US
+1541536256,1541536511,IE
+1541536512,1541536767,US
1541536768,1541537791,RU
1541537792,1541538303,GB
1541538304,1541538815,RO
@@ -26145,15 +27075,14 @@
1541552128,1541553151,UA
1541553152,1541555199,RU
1541555200,1541556223,PL
-1541556224,1541556479,UA
1541556480,1541556735,RU
1541556736,1541557247,IT
1541557504,1541557759,SI
-1541557760,1541558015,RU
1541558016,1541558271,HU
1541558272,1541559295,RU
1541560320,1541561343,DE
-1541561344,1541562879,RU
+1541561344,1541562367,RU
+1541562624,1541562879,RU
1541562880,1541563135,FR
1541563136,1541563391,NL
1541563392,1541564415,PL
@@ -26386,7 +27315,7 @@
1541700864,1541701119,PL
1541701120,1541701631,IL
1541701632,1541702655,RO
-1541702656,1541703679,RU
+1541703424,1541703679,RU
1541703680,1541704703,PL
1541704704,1541706239,RO
1541706240,1541706751,UA
@@ -26401,7 +27330,6 @@
1541711872,1541712127,FR
1541712128,1541712383,TR
1541712384,1541712895,DE
-1541712896,1541713919,RU
1541713920,1541714175,NL
1541714176,1541716223,RU
1541716224,1541716479,PL
@@ -26454,7 +27382,6 @@
1541740032,1541740287,PL
1541740288,1541740543,NL
1541740544,1541740799,CZ
-1541740800,1541741055,RU
1541741056,1541741567,PL
1541741568,1541742079,SK
1541742080,1541742591,RO
@@ -26467,7 +27394,6 @@
1541746944,1541747199,NL
1541747200,1541747711,RU
1541747712,1541748735,UA
-1541748736,1541748991,RU
1541748992,1541749247,AT
1541749248,1541749503,ES
1541749504,1541749759,RU
@@ -26557,7 +27483,7 @@
1541795584,1541795839,ES
1541795840,1541796863,UA
1541796864,1541797375,RU
-1541797376,1541798143,GB
+1541797376,1541797887,GB
1541798144,1541798911,PL
1541798912,1541799935,CZ
1541799936,1541800447,FR
@@ -26738,7 +27664,6 @@
1541893632,1541894143,PL
1541894144,1541895167,RU
1541895168,1541897727,PL
-1541897728,1541897983,RU
1541897984,1541898239,UA
1541898240,1541900799,RU
1541900800,1541901055,RO
@@ -27170,7 +28095,7 @@
1542163456,1542163711,GB
1542163712,1542163967,FR
1542163968,1542164479,UA
-1542164480,1542165759,RU
+1542164480,1542165503,RU
1542165760,1542166015,PL
1542166016,1542166527,IL
1542166528,1542167551,PL
@@ -27472,7 +28397,6 @@
1542344448,1542345215,RU
1542345216,1542345471,UA
1542345472,1542345727,RU
-1542345728,1542345983,UA
1542345984,1542346239,PL
1542346240,1542348287,RU
1542348288,1542348799,MD
@@ -27558,7 +28482,7 @@
1542392832,1542393087,RO
1542393088,1542393343,BG
1542393344,1542393599,IR
-1542393600,1542394879,RU
+1542393856,1542394879,RU
1542394880,1542395135,DE
1542395136,1542395391,ES
1542395392,1542395647,RU
@@ -27754,7 +28678,6 @@
1542498304,1542499583,RU
1542499584,1542499839,ES
1542499840,1542500095,GB
-1542500096,1542500351,UA
1542500352,1542500607,GB
1542500608,1542500863,RO
1542500864,1542501119,GB
@@ -27870,7 +28793,6 @@
1542641664,1542641919,RO
1542641920,1542642175,AE
1542642176,1542642431,PL
-1542642432,1542642687,RU
1542642688,1542643199,PL
1542643200,1542643455,UA
1542643456,1542643711,NL
@@ -27882,7 +28804,8 @@
1542669568,1542669823,NO
1542669824,1542670079,DE
1542670080,1542670335,CH
-1542670336,1542671359,ES
+1542670336,1542670591,US
+1542670592,1542671359,ES
1542671360,1542671871,FR
1542671872,1542672383,RS
1542672384,1542681087,RU
@@ -27963,7 +28886,6 @@
1542849536,1542850559,UA
1542850560,1542851583,GB
1542851584,1542851839,BG
-1542851840,1542852095,LU
1542852096,1542852351,KW
1542852352,1542852607,PL
1542852608,1542855167,RU
@@ -28015,9 +28937,11 @@
1542979584,1543110655,DE
1543110656,1543127039,UA
1543127040,1543143423,DE
-1543143424,1543167999,RO
+1543143424,1543159807,RO
+1543159808,1543167999,SE
1543168000,1543172095,MD
-1543172096,1543241727,RO
+1543172096,1543176191,RO
+1543176192,1543241727,IR
1543241728,1543503871,IT
1543503872,1545601023,GB
1545601024,1545674495,SE
@@ -28026,8 +28950,8 @@
1545863168,1545895935,RU
1545895936,1545928703,BA
1545928704,1545961471,SI
-1545961472,1545994239,RU
-1545994240,1545995263,CZ
+1545961472,1545994751,RU
+1545994752,1545995263,CZ
1545995264,1545995519,RU
1545995520,1545996287,CZ
1545996288,1545998335,RU
@@ -28035,14 +28959,13 @@
1546000384,1546001407,UZ
1546001408,1546002943,RU
1546002944,1546003199,UA
-1546003200,1546003455,RU
-1546003456,1546004479,CZ
+1546003200,1546003967,RU
+1546003968,1546004479,CZ
1546004480,1546004735,UA
1546004736,1546005247,CZ
1546005248,1546006527,RU
1546006528,1546008575,UA
-1546008576,1546010623,BY
-1546010624,1546014719,CZ
+1546008576,1546014719,BY
1546014720,1546015743,RU
1546015744,1546027007,CZ
1546027008,1546059775,RU
@@ -28056,7 +28979,7 @@
1546088448,1546092543,GB
1546092544,1546096639,RU
1546096640,1546100735,IT
-1546100736,1546104831,DE
+1546100736,1546104831,AT
1546104832,1546108927,IE
1546108928,1546113023,IM
1546113024,1546121215,RU
@@ -28067,7 +28990,9 @@
1546122464,1546122479,DZ
1546122480,1546122649,FR
1546122650,1546122650,PT
-1546122651,1546125311,FR
+1546122651,1546122696,FR
+1546122697,1546122697,ES
+1546122698,1546125311,FR
1546125312,1546256383,GB
1546256384,1546264575,RU
1546264576,1546266623,TR
@@ -28137,20 +29062,25 @@
1546682368,1546698751,BE
1546698752,1546715135,NL
1546715136,1546731519,LV
-1546731520,1546731775,RE
-1546731776,1546735103,FR
+1546731520,1546735103,FR
1546735104,1546735359,RE
-1546735360,1546739711,FR
-1546739712,1546739967,GP
-1546739968,1546741503,FR
-1546741504,1546742015,GP
-1546742016,1546742527,FR
-1546742528,1546743295,GF
-1546743296,1546743551,FR
-1546743552,1546743807,GF
-1546743808,1546745087,FR
-1546745088,1546745855,MQ
-1546745856,1546747903,FR
+1546735360,1546735871,FR
+1546735872,1546736127,RE
+1546736128,1546736639,FR
+1546736640,1546736895,RE
+1546736896,1546740223,FR
+1546740224,1546740479,GP
+1546740480,1546741503,FR
+1546741504,1546741759,GP
+1546741760,1546742527,FR
+1546742528,1546743039,GF
+1546743040,1546743295,FR
+1546743296,1546743551,GF
+1546743552,1546745599,FR
+1546745600,1546745855,MQ
+1546745856,1546746111,FR
+1546746112,1546746367,MQ
+1546746368,1546747903,FR
1546747904,1546764287,RU
1546764288,1546780671,UA
1546780672,1546797055,IR
@@ -28162,7 +29092,9 @@
1546911744,1546928127,SK
1546928128,1546944511,GB
1546944512,1546960895,UA
-1546960896,1546977279,HU
+1546960896,1546964991,HU
+1546964992,1546966015,US
+1546966016,1546977279,HU
1546977280,1546993663,MK
1546993664,1547010047,RU
1547010048,1547026431,SI
@@ -28206,19 +29138,13 @@
1547542528,1547546623,FR
1547546624,1547550719,IR
1547550720,1547554815,IE
-1547554816,1547555071,AT
-1547555072,1547555078,DE
-1547555079,1547555079,AT
-1547555080,1547555327,DE
-1547555328,1547558911,AT
+1547554816,1547558911,AT
1547558912,1547563007,IL
1547563008,1547565311,NL
1547565312,1547565823,US
1547565824,1547567103,NL
1547567104,1547571199,GB
-1547571200,1547572991,AT
-1547572992,1547573247,HU
-1547573248,1547575295,AT
+1547571200,1547575295,AT
1547575296,1547579391,NO
1547579392,1547583487,RU
1547583488,1547587583,KG
@@ -28280,20 +29206,14 @@
1547685888,1547689983,AT
1547689984,1547694079,IT
1547694080,1547698175,HU
-1547698176,1547925783,NL
-1547925784,1547925791,DE
-1547925792,1548130303,NL
-1548130304,1548130559,BE
-1548130560,1548158599,NL
+1547698176,1548158599,NL
1548158600,1548158607,GB
1548158608,1548159231,NL
1548159232,1548159235,ES
1548159236,1548159487,NL
1548159488,1548159999,GB
-1548160000,1548160255,NL
-1548160256,1548160511,PL
-1548160512,1548162479,NL
-1548162480,1548162495,FR
+1548160000,1548162463,NL
+1548162464,1548162495,FR
1548162496,1548169215,NL
1548169216,1548171263,DE
1548171264,1548172287,FR
@@ -28322,10 +29242,14 @@
1549795328,1550057471,AE
1550057472,1550188543,RU
1550188544,1550319615,FR
-1550319616,1550581759,CH
+1550319616,1550519551,CH
+1550519552,1550519807,DE
+1550519808,1550581759,CH
1550581760,1550843903,NL
1550843904,1550974975,UA
-1550974976,1551007743,RO
+1550974976,1550979071,RO
+1550979072,1550983167,IR
+1550983168,1551007743,RO
1551007744,1551106047,MD
1551106048,1551237119,DE
1551237120,1551368191,GR
@@ -28346,101 +29270,32 @@
1551577088,1551580159,NL
1551604480,1551604735,SE
1551630336,1551892479,RU
-1551892480,1553989887,FR
-1553989888,1553990911,MQ
-1553990912,1553991167,FR
-1553991168,1553992703,MQ
-1553992704,1553993215,FR
-1553993216,1553996031,MQ
-1553996032,1553996543,FR
-1553996544,1553997311,MQ
-1553997312,1553997567,FR
-1553997568,1554001407,MQ
-1554001408,1554001663,FR
-1554001664,1554001919,MQ
-1554001920,1554002175,FR
-1554002176,1554005247,MQ
-1554005248,1554005503,FR
-1554005504,1554006015,MQ
-1554006016,1554006783,GP
-1554006784,1554007295,FR
-1554007296,1554007807,GP
-1554007808,1554008063,FR
-1554008064,1554009343,GP
-1554009344,1554009855,FR
-1554009856,1554011647,GP
-1554011648,1554011903,FR
-1554011904,1554013695,GP
-1554013696,1554014207,FR
-1554014208,1554015231,GP
-1554015232,1554015487,FR
-1554015488,1554016767,GP
-1554016768,1554017279,FR
-1554017280,1554018047,GP
-1554018048,1554018303,FR
-1554018304,1554019583,GP
-1554019584,1554019839,FR
-1554019840,1554021119,GP
-1554021120,1554021375,FR
-1554021376,1554021887,GP
-1554021888,1554022399,FR
-1554022400,1554023423,GP
-1554023424,1554023679,FR
-1554023680,1554024959,GP
-1554024960,1554025215,FR
-1554025216,1554025471,GP
-1554025472,1554025727,FR
-1554025728,1554026751,GP
-1554026752,1554027007,FR
-1554027008,1554027519,GP
-1554027520,1554027775,FR
-1554027776,1554029055,GP
-1554029056,1554029311,FR
-1554029312,1554030079,GP
-1554030080,1554030335,FR
-1554030336,1554030591,GP
-1554030592,1554031615,MQ
-1554031616,1554032127,FR
-1554032128,1554032383,MQ
-1554032384,1554032639,FR
-1554032640,1554035455,MQ
-1554035456,1554035967,FR
-1554035968,1554037503,MQ
-1554037504,1554037759,FR
-1554037760,1554038271,MQ
-1554038272,1554038783,FR
-1554038784,1554039295,RE
-1554039296,1554039807,FR
-1554039808,1554040063,RE
-1554040064,1554040319,FR
-1554040320,1554041343,RE
-1554041344,1554041599,FR
-1554041600,1554042367,RE
-1554042368,1554042879,FR
-1554042880,1554043903,RE
-1554043904,1554044159,FR
-1554044160,1554046463,RE
-1554046464,1554046719,FR
-1554046720,1554047231,RE
-1554047232,1554048255,FR
-1554048256,1554048767,RE
-1554048768,1554049279,FR
-1554049280,1554049535,RE
-1554049536,1554049791,FR
-1554049792,1554052351,RE
-1554052352,1554052607,FR
-1554052608,1554053887,RE
-1554053888,1554054143,FR
-1554054144,1554054655,RE
-1554054656,1556086783,FR
-1556086784,1557921791,DE
+1551892480,1556086783,FR
+1556086784,1557069823,DE
+1557069824,1557135359,GB
+1557135360,1557921791,DE
1557921792,1558052863,NO
1558052864,1558054399,FR
1558054400,1558054655,DE
-1558054656,1558118399,FR
+1558054656,1558056102,FR
+1558056103,1558056103,ES
+1558056104,1558079407,FR
+1558079408,1558079415,PL
+1558079416,1558079423,GB
+1558079424,1558081175,FR
+1558081176,1558081183,BE
+1558081184,1558084655,FR
+1558084656,1558084659,BE
+1558084660,1558085055,FR
+1558085056,1558085071,GB
+1558085072,1558093531,FR
+1558093532,1558093532,HR
+1558093533,1558118399,FR
1558118400,1558119423,DE
1558119424,1558122495,RU
-1558122496,1558151167,AT
+1558122496,1558123519,AT
+1558123520,1558124543,LU
+1558124544,1558151167,AT
1558151168,1558183935,IT
1558183936,1558708223,DE
1558708224,1559236607,GB
@@ -28493,7 +29348,7 @@
1559633920,1559642111,IT
1559650304,1559658495,IT
1559658496,1559683071,RU
-1559683072,1559691263,CH
+1559683072,1559691263,NL
1559691264,1559756799,BG
1559756800,1559789567,AT
1559789568,1559822335,RU
@@ -28502,14 +29357,19 @@
1559887872,1559920639,PT
1559920640,1559924693,LU
1559924694,1559924694,GB
-1559924695,1559932927,LU
+1559924695,1559929599,LU
+1559929600,1559929855,LV
+1559929856,1559932927,LU
1559932928,1559943167,DE
1559943168,1559944191,LU
1559944192,1559945727,FR
1559945728,1559946751,LU
1559946752,1559950335,DE
-1559950336,1559950847,LU
-1559950848,1559953407,DE
+1559950336,1559951359,LU
+1559951360,1559952383,DE
+1559952384,1559952895,LU
+1559952896,1559953151,DE
+1559953152,1559953407,LU
1559953408,1559986175,MT
1559986176,1560018943,IE
1560018944,1560051711,DE
@@ -28528,17 +29388,7 @@
1562378240,1564999679,IT
1564999680,1565523967,UA
1565523968,1565655039,RU
-1565655040,1565673215,AT
-1565673216,1565673471,DE
-1565673472,1565675263,AT
-1565675264,1565675391,DE
-1565675392,1565713295,AT
-1565713296,1565713299,CH
-1565713300,1565718919,AT
-1565718920,1565718927,DE
-1565718928,1565723135,AT
-1565723136,1565723391,HU
-1565723392,1565786111,AT
+1565655040,1565786111,AT
1565786112,1565917183,BY
1565917184,1566048255,RS
1566048256,1566056447,RU
@@ -28622,7 +29472,7 @@
1566359552,1566363647,RU
1566363648,1566365695,GB
1566365696,1566367743,RU
-1566367744,1566371839,ES
+1566369792,1566371839,ES
1566371840,1566373887,IT
1566373888,1566375935,RS
1566375936,1566377983,DE
@@ -28661,7 +29511,6 @@
1566425088,1566427135,RS
1566427136,1566429183,IT
1566429184,1566437375,GB
-1566437376,1566439423,BE
1566439424,1566443519,DE
1566443520,1566445567,NO
1566445568,1566447615,PL
@@ -28721,9 +29570,9 @@
1566558208,1566560255,JO
1566560256,1566560767,IT
1566560768,1566561015,SM
-1566561016,1566561017,IT
-1566561018,1566561023,SM
-1566561024,1566564351,IT
+1566561016,1566561019,IT
+1566561020,1566561279,SM
+1566561280,1566564351,IT
1566564352,1566566399,IS
1566566400,1566568447,FR
1566568448,1566570495,KZ
@@ -28746,42 +29595,44 @@
1567621120,1567696383,RO
1567696384,1567696895,MD
1567696896,1567703039,RO
-1567703040,1567707391,MD
-1567707392,1567707647,RO
-1567707648,1567707903,MD
-1567707904,1567708671,RO
-1567708672,1567709183,MD
+1567703040,1567709183,MD
1567709184,1567710207,RO
1567710208,1567711231,MD
-1567711232,1567713279,RO
-1567713280,1567714303,MD
-1567714304,1567715327,RO
+1567711232,1567715327,RO
1567715328,1567717375,MD
1567717376,1567727359,RO
1567727360,1567727615,GB
1567727616,1567742975,RO
1567742976,1567743487,MD
-1567743488,1567749119,RO
+1567743488,1567743999,RO
+1567744000,1567748095,IR
+1567748096,1567749119,RO
1567749120,1567750143,MD
1567750144,1567752191,RO
1567752192,1567756287,MD
-1567756288,1567775743,RO
+1567756288,1567760383,IR
+1567760384,1567767551,RO
+1567767552,1567768575,ES
+1567768576,1567775743,RO
1567775744,1567776767,MD
1567776768,1567830015,RO
1567830016,1567831039,MD
1567831040,1567852543,RO
1567852544,1567856639,MD
-1567856640,1567873023,RO
+1567856640,1567858687,RO
+1567858688,1567860735,SE
+1567860736,1567873023,RO
1567873024,1567879167,MD
1567879168,1567880191,RO
1567880192,1567881215,SE
1567881216,1567883263,RO
1567883264,1567948799,MD
-1567948800,1567961087,RO
+1567948800,1567961087,IR
1567961088,1567965183,MD
1567965184,1567966207,RO
1567966208,1567969279,MD
-1567969280,1567981567,RO
+1567969280,1567973375,RO
+1567973376,1567981567,IR
1567981568,1567983615,MD
1567983616,1567984639,RO
1567984640,1567987711,MD
@@ -28789,16 +29640,20 @@
1567988736,1567992831,MD
1567992832,1567993343,RO
1567993344,1567993599,GB
-1567993600,1567997951,RO
+1567993600,1567993855,RO
+1567993856,1567997951,IR
1567997952,1568014335,NL
1568014336,1568022527,DE
-1568022528,1568026623,RO
+1568022528,1568024063,RO
+1568024064,1568024319,SG
+1568024320,1568026623,RO
1568026624,1568030719,MD
-1568030720,1568059391,RO
-1568059392,1568063487,MD
-1568063488,1568083967,RO
-1568083968,1568086015,MD
-1568086016,1568104447,RO
+1568030720,1568038911,RO
+1568038912,1568059391,IR
+1568059392,1568060415,RO
+1568060416,1568062463,MD
+1568062464,1568088063,RO
+1568088064,1568104447,IR
1568104448,1568106495,MD
1568106496,1568107519,RO
1568107520,1568108543,MD
@@ -28810,79 +29665,35 @@
1568120832,1568122879,MD
1568122880,1568130047,RO
1568130048,1568133119,MD
-1568133120,1568138239,RO
+1568133120,1568137215,IR
+1568137216,1568138239,RO
1568138240,1568141311,MD
-1568141312,1568178175,RO
+1568141312,1568145407,DE
+1568145408,1568178175,RO
1568178176,1568210943,RU
1568210944,1568243711,GB
-1568243712,1568243967,FR
-1568243968,1568244735,GP
-1568244736,1568244991,FR
-1568244992,1568245759,GP
-1568245760,1568246271,FR
-1568246272,1568246527,GF
-1568246528,1568247039,GP
-1568247040,1568247295,FR
+1568243712,1568247295,GP
1568247296,1568247551,GF
1568247552,1568247807,MF
-1568247808,1568248063,FR
-1568248064,1568248831,GP
-1568248832,1568249087,MQ
-1568249088,1568249599,GP
-1568249600,1568249855,MQ
-1568249856,1568250111,FR
-1568250112,1568250879,GP
-1568250880,1568251135,FR
-1568251136,1568251647,GP
+1568247808,1568251647,GP
1568251648,1568251903,MF
-1568251904,1568252159,MQ
-1568252160,1568252415,GP
-1568252416,1568252671,MQ
-1568252672,1568252927,GP
+1568251904,1568252927,GP
1568252928,1568253183,GF
-1568253184,1568253951,GP
-1568253952,1568255743,FR
-1568255744,1568255999,GF
-1568256000,1568256511,GP
-1568256512,1568259071,FR
-1568259072,1568259327,MQ
-1568259328,1568260095,GP
-1568260096,1568260351,FR
-1568260352,1568260607,MF
-1568260608,1568261119,GP
-1568261120,1568261375,FR
-1568261376,1568262143,GP
-1568262144,1568262655,MQ
-1568262656,1568262911,GP
-1568262912,1568263167,MQ
-1568263168,1568263423,FR
-1568263424,1568263679,MQ
-1568263680,1568264447,FR
-1568264448,1568264703,GP
-1568264704,1568265215,MF
-1568265216,1568265471,FR
-1568265472,1568266239,GP
-1568266240,1568266495,FR
-1568266496,1568267263,GP
-1568267264,1568268543,FR
-1568268544,1568269311,GP
-1568269312,1568269567,MQ
-1568269568,1568270079,GP
+1568253184,1568260351,GP
+1568260352,1568260863,MF
+1568260864,1568262143,GP
+1568262144,1568262399,MQ
+1568262400,1568264959,GP
+1568264960,1568265215,MF
+1568265216,1568267263,GP
+1568267264,1568267775,MF
+1568267776,1568270079,GP
1568270080,1568270335,MQ
-1568270336,1568271359,GP
-1568271360,1568271615,FR
-1568271616,1568272383,GP
-1568272384,1568273151,FR
+1568270336,1568273151,GP
1568273152,1568273407,GF
-1568273408,1568274175,FR
-1568274176,1568274687,MQ
-1568274688,1568274943,GP
-1568274944,1568275199,MQ
-1568275200,1568275455,GP
-1568275456,1568275711,FR
+1568273408,1568275711,GP
1568275712,1568275967,MQ
-1568275968,1568276223,FR
-1568276224,1568276479,MQ
+1568275968,1568276479,GP
1568276480,1568309247,DE
1568309248,1568342015,RO
1568342016,1568374783,BG
@@ -28895,9 +29706,7 @@
1568571392,1568604159,LB
1568604160,1568636927,UA
1568636928,1569193983,DE
-1569193984,1569438463,HR
-1569438464,1569438719,BR
-1569438720,1569718271,HR
+1569193984,1569718271,HR
1569718272,1570242559,IT
1570242560,1570275327,GB
1570275328,1570308095,BG
@@ -28919,14 +29728,13 @@
1570586624,1570590719,PL
1570590720,1570592767,IL
1570592768,1570596863,PL
-1570596864,1570598911,UA
1570598912,1570600959,PL
1570600960,1570603007,RU
1570603008,1570605055,CZ
1570605056,1570607103,NL
1570607104,1570609151,RU
1570609152,1570611199,PL
-1570611200,1570619391,RU
+1570611200,1570617343,RU
1570619392,1570621439,BA
1570621440,1570625535,RU
1570625536,1570627583,GB
@@ -28936,7 +29744,9 @@
1570644776,1570644991,FR
1570644992,1570645247,GB
1570645248,1570652159,FR
-1570652160,1570668543,SE
+1570652160,1570660863,SE
+1570660864,1570661375,NO
+1570661376,1570668543,SE
1570668544,1570686975,RU
1570686976,1570693119,NL
1570693120,1570695167,RU
@@ -28953,7 +29763,7 @@
1570756608,1570764799,RU
1570764800,1570766847,DE
1570766848,1571291135,DK
-1571291136,1571422207,RO
+1571291136,1571422207,SA
1571422208,1571422463,CZ
1571422464,1571422719,UA
1571422720,1571423231,RU
@@ -28971,14 +29781,16 @@
1571425233,1571425279,CZ
1571425280,1571425535,RU
1571425536,1571425791,NL
-1571425792,1571428607,CZ
+1571425792,1571426047,CZ
+1571426048,1571426303,UA
+1571426304,1571428607,CZ
1571428608,1571428863,UA
1571428864,1571429375,CZ
1571429376,1571435519,UA
1571435520,1571435775,RU
1571435776,1571436287,CZ
1571436288,1571436543,UA
-1571436544,1571438591,RU
+1571436544,1571438591,BA
1571438592,1571440639,UA
1571440640,1571440895,RU
1571440896,1571441407,CZ
@@ -28991,9 +29803,9 @@
1571443712,1571444991,CZ
1571444992,1571445247,UA
1571445248,1571446271,NL
-1571446272,1571446783,CZ
+1571446272,1571446783,RU
1571446784,1571447039,GB
-1571447040,1571447295,CZ
+1571447040,1571447295,UA
1571447296,1571447807,RU
1571447808,1571448063,CZ
1571448064,1571448319,RU
@@ -29002,7 +29814,9 @@
1571449344,1571449855,CZ
1571449856,1571450879,RU
1571450880,1571452927,UA
-1571452928,1571453951,CZ
+1571452928,1571453183,CZ
+1571453184,1571453695,RU
+1571453696,1571453951,CZ
1571453952,1571455999,RU
1571456000,1571456511,UA
1571456512,1571456767,CZ
@@ -29018,10 +29832,15 @@
1571471104,1571471359,CZ
1571471360,1571475455,RU
1571475456,1571476479,CZ
-1571476480,1571478527,RU
-1571478528,1571487743,CZ
+1571476480,1571479551,RU
+1571479552,1571483647,CZ
+1571483648,1571484159,RU
+1571484160,1571487743,CZ
1571487744,1571495935,SK
-1571495936,1571504127,CZ
+1571495936,1571496447,RU
+1571496448,1571497983,BY
+1571497984,1571500031,RU
+1571500032,1571504127,BY
1571504128,1571508223,UA
1571508224,1571514367,CZ
1571514368,1571520511,BY
@@ -29034,8 +29853,11 @@
1571529216,1571529727,CZ
1571529728,1571530239,RU
1571530240,1571531263,CZ
-1571531264,1571531775,UA
-1571531776,1571534079,CZ
+1571531264,1571532031,UA
+1571532032,1571532287,RU
+1571532288,1571532543,CZ
+1571532544,1571532799,RU
+1571532800,1571534079,CZ
1571534080,1571534847,RU
1571534848,1571535103,LV
1571535104,1571535617,CZ
@@ -29045,7 +29867,8 @@
1571538944,1571540991,CZ
1571540992,1571541247,RU
1571541248,1571541503,UA
-1571541504,1571542527,CZ
+1571541504,1571542271,CZ
+1571542272,1571542527,RU
1571542528,1571542783,SK
1571542784,1571543039,CZ
1571543040,1571543551,NL
@@ -29105,30 +29928,24 @@
1571815424,1571815679,FR
1571815680,1571815935,RE
1571815936,1571816959,FR
-1571816960,1571817727,RE
-1571817728,1571818495,FR
+1571816960,1571817215,RE
+1571817216,1571818495,FR
1571818496,1571818751,RE
1571818752,1571819007,FR
1571819008,1571819263,RE
1571819264,1571819519,FR
1571819520,1571819775,RE
-1571819776,1571820287,FR
-1571820288,1571820543,RE
-1571820544,1571820799,FR
-1571820800,1571821055,RE
-1571821056,1571822591,FR
-1571822592,1571823103,RE
-1571823104,1571823871,FR
-1571823872,1571824127,RE
-1571824128,1571824895,FR
-1571824896,1571825151,RE
-1571825152,1571826687,FR
-1571826688,1571827199,RE
-1571827200,1571827711,FR
-1571827712,1571827967,RE
-1571827968,1571828991,FR
-1571828992,1571829247,RE
-1571829248,1571831807,FR
+1571819776,1571821055,FR
+1571821056,1571821823,RE
+1571821824,1571822847,FR
+1571822848,1571823615,RE
+1571823616,1571825407,FR
+1571825408,1571825663,RE
+1571825664,1571827455,FR
+1571827456,1571827967,RE
+1571827968,1571830783,FR
+1571830784,1571831039,RE
+1571831040,1571831807,FR
1571831808,1571848191,DK
1571848192,1571864575,RU
1571864576,1571880959,PL
@@ -29227,12 +30044,11 @@
1572524032,1572528127,GE
1572528128,1572532223,RU
1572532224,1572536319,IT
-1572536320,1572538367,JE
+1572536320,1572538367,GB
1572538368,1572540415,NL
1572540416,1572542463,GB
1572542464,1572544511,IT
-1572544512,1572544767,FR
-1572544768,1572546559,IQ
+1572544512,1572546559,IQ
1572546560,1572548607,FR
1572548608,1572550655,NL
1572550656,1572552703,DE
@@ -29244,11 +30060,12 @@
1572562944,1572564991,CZ
1572564992,1572567039,DE
1572567040,1572569087,RU
-1572571136,1572573183,RO
-1572573184,1572574463,GG
-1572574464,1572574719,GB
-1572574720,1572574975,GG
-1572574976,1572575231,GB
+1572571136,1572572159,RO
+1572572160,1572573183,BG
+1572573184,1572573951,GG
+1572573952,1572574207,GB
+1572574208,1572574463,GG
+1572574464,1572575231,GB
1572575232,1572577279,RU
1572577280,1572579327,AM
1572579328,1572581375,GB
@@ -29314,8 +30131,9 @@
1572706304,1572708351,DE
1572708352,1572708607,GB
1572708608,1572709375,GG
-1572709376,1572710143,GB
-1572710144,1572710399,GG
+1572709376,1572709887,GB
+1572709888,1572710143,GG
+1572710144,1572710399,GB
1572710400,1572712447,DE
1572712448,1572714495,ES
1572714496,1572714943,NG
@@ -29412,7 +30230,9 @@
1578590852,1578590855,ES
1578590856,1578590863,FR
1578590864,1578590879,BE
-1578590880,1578591695,FR
+1578590880,1578591087,FR
+1578591088,1578591103,IT
+1578591104,1578591695,FR
1578591696,1578591699,ES
1578591700,1578592167,FR
1578592168,1578592171,IT
@@ -29425,19 +30245,29 @@
1578592296,1578592303,NL
1578592304,1578593023,FR
1578593024,1578593279,DE
-1578593280,1578593439,FR
+1578593280,1578593415,FR
+1578593416,1578593423,IT
+1578593424,1578593439,FR
1578593440,1578593443,ES
1578593444,1578593551,FR
1578593552,1578593559,NL
1578593560,1578593955,FR
1578593956,1578593959,ES
-1578593960,1578595367,FR
+1578593960,1578594559,FR
+1578594560,1578594815,ES
+1578594816,1578595295,FR
+1578595296,1578595327,DE
+1578595328,1578595367,FR
1578595368,1578595371,IT
1578595372,1578595419,FR
1578595420,1578595423,GB
-1578595424,1578595987,FR
+1578595424,1578595807,FR
+1578595808,1578595823,ES
+1578595824,1578595987,FR
1578595988,1578595991,ES
-1578595992,1578602495,FR
+1578595992,1578596351,FR
+1578596352,1578596863,GB
+1578596864,1578602495,FR
1578602496,1578604543,NL
1578604544,1578606591,GB
1578606592,1578607725,DE
@@ -29453,7 +30283,8 @@
1578613936,1578614271,FR
1578614272,1578614527,ES
1578614528,1578631167,FR
-1578631168,1578663935,RO
+1578631168,1578659839,RO
+1578659840,1578663935,ES
1578663936,1578762239,RU
1578762240,1578795007,BG
1578795008,1578827775,RU
@@ -29475,29 +30306,17 @@
1580007424,1580015615,RU
1580015616,1580048383,UA
1580048384,1580064767,RU
-1580064768,1580072959,DE
+1580064768,1580072959,GB
1580072960,1580134399,PT
1580134400,1580136447,ES
1580136448,1580138495,PT
1580138496,1580204031,IT
-1580204032,1580335103,RO
+1580204032,1580335103,SA
1580335104,1580466175,RU
1580466176,1580597247,RO
1580597248,1580728319,TR
1580728320,1580990463,AE
-1580990464,1580999679,PT
-1580999680,1580999935,RO
-1580999936,1581001215,PT
-1581001216,1581001471,RO
-1581001472,1581118463,PT
-1581118464,1581118719,RO
-1581118720,1581126655,PT
-1581126656,1581127167,RO
-1581127168,1581132031,PT
-1581132032,1581132287,RO
-1581132288,1581208575,PT
-1581208576,1581208831,RO
-1581208832,1581252607,PT
+1580990464,1581252607,PT
1581252608,1581776895,GR
1581776896,1581793279,RU
1581793280,1581809663,PL
@@ -29548,7 +30367,9 @@
1583616000,1583620095,NL
1583620096,1583624191,IT
1583624192,1583624447,XK
-1583624448,1583628287,RS
+1583624448,1583626751,RS
+1583626752,1583627007,XK
+1583627008,1583628287,RS
1583628288,1583632383,DE
1583632384,1583636479,RU
1583636480,1583640575,MK
@@ -29559,7 +30380,9 @@
1583656960,1583665151,RU
1583665152,1583669247,UA
1583669248,1583673343,GE
-1583673344,1583677439,DE
+1583673344,1583675647,DE
+1583675648,1583675903,US
+1583675904,1583677439,DE
1583677440,1583681535,FI
1583681536,1583685631,PL
1583685632,1583689727,DE
@@ -29567,6 +30390,7 @@
1583693824,1583697919,RU
1583697920,1583702015,TR
1583702016,1583706111,RU
+1583706624,1583706879,RU
1583710208,1583714303,IR
1583714304,1583722495,GB
1583722496,1583726591,IR
@@ -29589,23 +30413,27 @@
1583780336,1583780343,IT
1583780344,1583780423,GB
1583780424,1583780431,IT
-1583780432,1583780767,GB
+1583780432,1583780727,GB
+1583780728,1583780735,IT
+1583780736,1583780767,GB
1583780768,1583780775,IT
1583780776,1583780791,GB
1583780792,1583780799,IT
-1583780800,1583781359,GB
+1583780800,1583780815,GB
+1583780816,1583780823,IT
+1583780824,1583781359,GB
1583781360,1583781367,IT
1583781368,1583781863,GB
1583781864,1583781871,IT
-1583781872,1583782223,GB
-1583782224,1583782231,IT
-1583782232,1583782415,GB
+1583781872,1583782415,GB
1583782416,1583782423,IT
1583782424,1583782431,GB
1583782432,1583782439,IT
1583782440,1583782703,GB
1583782704,1583782711,IT
-1583782712,1583782975,GB
+1583782712,1583782783,GB
+1583782784,1583782791,IT
+1583782792,1583782975,GB
1583782976,1583782983,IT
1583782984,1583783495,GB
1583783496,1583783503,IT
@@ -29630,9 +30458,7 @@
1583861760,1583865855,LU
1583865856,1583869951,RU
1583869952,1583874047,KZ
-1583874048,1584119935,BE
-1584119936,1584120063,FR
-1584120064,1584398335,BE
+1583874048,1584398335,BE
1584398336,1584529407,CZ
1584529408,1584660479,DE
1584660480,1584857087,GB
@@ -29655,9 +30481,8 @@
1585219584,1585221631,NL
1585221632,1585223679,SK
1585223680,1585224959,FR
-1585224960,1585225215,RE
-1585225216,1585225471,FR
-1585225472,1585225727,YT
+1585224960,1585225471,RE
+1585225472,1585225727,FR
1585225728,1585227007,UA
1585227008,1585227263,RU
1585227264,1585227775,UA
@@ -29665,9 +30490,11 @@
1585231872,1585233919,CZ
1585233920,1585238015,RU
1585238016,1585240063,DE
-1585240064,1585240575,FR
-1585240576,1585241855,MQ
-1585241856,1585242111,GP
+1585240064,1585240319,FR
+1585240320,1585240575,GP
+1585240576,1585240831,MQ
+1585240832,1585241087,FR
+1585241088,1585242111,MQ
1585242112,1585244159,RU
1585244160,1585246207,FR
1585246208,1585248255,RU
@@ -29713,7 +30540,8 @@
1585334272,1585336319,DE
1585336320,1585338367,SE
1585338368,1585340415,RU
-1585340416,1585342463,AT
+1585340416,1585340671,DE
+1585340672,1585342463,AT
1585342464,1585344511,GB
1585344512,1585346559,FR
1585346560,1585348607,GB
@@ -29791,9 +30619,7 @@
1586151424,1586159615,TR
1586159616,1586167807,MT
1586167808,1586175999,DE
-1586176000,1586177151,BE
-1586177152,1586177279,DE
-1586177280,1586184191,BE
+1586176000,1586184191,BE
1586184192,1586192383,NO
1586192384,1586200575,RU
1586200576,1586208767,MD
@@ -29896,17 +30722,25 @@
1588068352,1588592639,GB
1588592640,1588593663,RO
1588593664,1588593919,MD
-1588593920,1588609023,RO
+1588593920,1588596735,RO
+1588596736,1588602879,IR
+1588602880,1588604927,RO
+1588604928,1588609023,IR
1588609024,1588613119,MD
-1588613120,1588621311,RO
+1588613120,1588617215,IR
+1588617216,1588619775,RO
+1588619776,1588620031,SG
+1588620032,1588621311,RO
1588621312,1588625407,MD
1588625408,1588641791,RO
1588641792,1588643839,ES
-1588643840,1588653055,RO
-1588653056,1588654079,MD
-1588654080,1588673535,RO
+1588643840,1588649983,RO
+1588649984,1588652031,SE
+1588652032,1588673535,RO
1588673536,1588674559,MD
-1588674560,1588723711,RO
+1588674560,1588676607,RO
+1588676608,1588678655,IR
+1588678656,1588723711,RO
1588723712,1588854783,UA
1588854784,1588985855,RU
1588985856,1589182463,IR
@@ -29934,11 +30768,17 @@
1589608448,1589608703,SE
1589608704,1589608959,DK
1589608960,1589609215,SE
-1589609216,1589611519,DK
+1589609216,1589609983,DK
+1589609984,1589610239,SE
+1589610240,1589610495,DK
+1589610496,1589611263,SE
+1589611264,1589611519,DK
1589611520,1589611775,SE
-1589611776,1589612287,DK
-1589612288,1589620735,SE
-1589620736,1589641215,DK
+1589611776,1589612031,DK
+1589612032,1589620991,SE
+1589620992,1589621247,DK
+1589621248,1589621503,SE
+1589621504,1589641215,DK
1589641216,1590034431,GB
1590034432,1590036479,RU
1590036480,1590038527,GB
@@ -30001,9 +30841,7 @@
1590165504,1590689791,AE
1590689792,1591214079,NL
1591214080,1591738367,DE
-1591738368,1591977471,BE
-1591977472,1591977599,NL
-1591977600,1592000511,BE
+1591738368,1592000511,BE
1592000512,1592004607,ES
1592004608,1592008703,AM
1592008704,1592012799,GB
@@ -30121,7 +30959,9 @@
1593147392,1593163775,RU
1593163776,1593180159,AT
1593180160,1593196543,NO
-1593196544,1593212927,SE
+1593196544,1593203103,SE
+1593203104,1593203135,FI
+1593203136,1593212927,SE
1593212928,1593229311,PL
1593229312,1593245695,EE
1593245696,1593247743,NL
@@ -30164,7 +31004,15 @@
1593421568,1593421823,GB
1593421824,1593422591,DE
1593422592,1593422847,GB
-1593422848,1593442303,DE
+1593422848,1593423359,DE
+1593423360,1593423615,US
+1593423616,1593431167,DE
+1593431168,1593431295,GB
+1593431296,1593438719,DE
+1593438720,1593438975,US
+1593438976,1593440511,DE
+1593440512,1593440767,GB
+1593440768,1593442303,DE
1593442304,1593475071,BA
1593475072,1593491455,HR
1593491456,1593499647,DE
@@ -30194,30 +31042,30 @@
1596588032,1596719103,BG
1596719104,1596850175,IE
1596850176,1596866559,CZ
-1596866560,1596887039,RU
-1596887040,1596889087,UA
+1596866560,1596887295,RU
+1596887296,1596887551,KZ
+1596887552,1596889087,CZ
1596889088,1596889599,KZ
1596889600,1596889855,CZ
1596889856,1596890111,UA
1596890112,1596890623,RU
-1596890624,1596891135,CZ
-1596891136,1596900351,RU
+1596890624,1596890879,CZ
+1596890880,1596900351,RU
1596900352,1596907519,BY
1596907520,1596909567,RU
1596909568,1596911615,KZ
1596911616,1596915711,RU
-1596915712,1596925951,CZ
+1596915712,1596923903,UA
+1596923904,1596925951,CZ
1596925952,1596932095,RU
1596932096,1596940543,CZ
1596940544,1596940799,RU
1596940800,1596941055,UA
-1596941056,1596941311,CZ
+1596941056,1596941311,BY
1596941312,1596942335,RU
1596942336,1596945407,UA
1596945408,1596945919,CZ
-1596945920,1596946175,RU
-1596946176,1596946431,NL
-1596946432,1596947455,RU
+1596945920,1596947455,RU
1596947456,1596948479,UA
1596948480,1596950527,BY
1596950528,1596950783,UA
@@ -30231,8 +31079,8 @@
1596954624,1596954879,RU
1596954880,1596955391,CZ
1596955392,1596955647,RU
-1596955648,1596956415,CZ
-1596956416,1596956671,RU
+1596955648,1596956159,CZ
+1596956160,1596956671,RU
1596956672,1596956927,CZ
1596956928,1596956963,DE
1596956964,1596956964,RU
@@ -30250,9 +31098,7 @@
1596963328,1596963839,CZ
1596963840,1596964095,KZ
1596964096,1596964607,CZ
-1596964608,1596965887,RU
-1596965888,1596966911,KG
-1596966912,1596967167,RU
+1596964608,1596967167,RU
1596967168,1596967423,CZ
1596967424,1596967935,RU
1596967936,1596968959,UA
@@ -30303,7 +31149,8 @@
1599356928,1599373311,BH
1599373312,1599406079,RU
1599406080,1599422463,NL
-1599422464,1599438847,RU
+1599422464,1599430655,RU
+1599430656,1599438847,TM
1599438848,1599455231,RS
1599455232,1599471615,CZ
1599471616,1599487999,MK
@@ -30348,7 +31195,9 @@
1602230271,1602230271,DE
1602230272,1602232319,DK
1602232320,1602234367,CH
-1602234368,1602236415,FR
+1602234368,1602235967,FR
+1602235968,1602235999,ES
+1602236000,1602236415,FR
1602236416,1602238463,GB
1602238464,1602240511,TR
1602240512,1602242559,BY
@@ -30469,25 +31318,9 @@
1602781184,1602813951,FR
1602813952,1602846719,RU
1602846720,1602879487,GE
-1602879488,1602879488,MQ
-1602879489,1602879743,RE
-1602879744,1602882303,MQ
-1602882304,1602882559,RE
-1602882560,1602885631,MQ
-1602885632,1602885887,RE
-1602885888,1602891775,MQ
-1602891776,1602892031,RE
-1602892032,1602894847,MQ
-1602894848,1602895103,RE
-1602895104,1602896383,MQ
-1602896384,1602896639,RE
-1602896640,1602896924,MQ
+1602879488,1602896924,MQ
1602896925,1602896925,RE
-1602896926,1602897407,MQ
-1602897408,1602897663,RE
-1602897664,1602907135,MQ
-1602907136,1602907391,RE
-1602907392,1602912255,MQ
+1602896926,1602912255,MQ
1602912256,1602928639,GB
1602928640,1602930687,HU
1602930688,1602932735,GB
@@ -30520,8 +31353,7 @@
1603081256,1603081263,FI
1603081264,1603081279,GB
1603081280,1603081295,US
-1603081296,1603081407,GB
-1603081408,1603081471,ES
+1603081296,1603081471,ES
1603081472,1603082239,GB
1603082240,1603082495,DE
1603082496,1603082751,GT
@@ -30570,9 +31402,8 @@
1603207168,1603215359,RU
1603215360,1603219455,DE
1603219456,1603223551,CH
-1603223552,1603225087,GB
-1603225088,1603225343,FR
-1603225344,1603227647,GB
+1603223552,1603223807,FR
+1603223808,1603227647,GB
1603227648,1603231743,AT
1603231744,1603235839,IT
1603235840,1603239935,RU
@@ -30582,11 +31413,7 @@
1603252224,1603256319,RU
1603256320,1603260415,SE
1603260416,1603264511,RU
-1603264512,1603266559,AT
-1603266560,1603266815,HU
-1603266816,1603267711,AT
-1603267712,1603267839,SK
-1603267840,1603268607,AT
+1603264512,1603268607,AT
1603268608,1603272703,PL
1603272704,1603796991,GB
1603796992,1603813375,RU
@@ -30655,8 +31482,8 @@
1605091328,1605099519,PL
1605099520,1605107711,RU
1605107712,1605108247,GB
-1605108248,1605108263,IT
-1605108264,1605108407,GB
+1605108248,1605108255,IT
+1605108256,1605108407,GB
1605108408,1605108415,IT
1605108416,1605108567,GB
1605108568,1605108575,IT
@@ -30666,15 +31493,11 @@
1605109432,1605109439,IT
1605109440,1605109495,GB
1605109496,1605109503,IT
-1605109504,1605109599,GB
-1605109600,1605109607,IT
-1605109608,1605109639,GB
+1605109504,1605109639,GB
1605109640,1605109647,IT
1605109648,1605110111,GB
1605110112,1605110119,IT
-1605110120,1605110167,GB
-1605110168,1605110175,IT
-1605110176,1605110263,GB
+1605110120,1605110263,GB
1605110264,1605110271,IT
1605110272,1605111023,GB
1605111024,1605111031,IT
@@ -30686,44 +31509,44 @@
1605111920,1605111927,IT
1605111928,1605111935,GB
1605111936,1605111943,IT
-1605111944,1605112647,GB
-1605112648,1605112655,IT
-1605112656,1605112847,GB
+1605111944,1605112847,GB
1605112848,1605112855,IT
-1605112856,1605112983,GB
-1605112984,1605112991,IT
-1605112992,1605113087,GB
+1605112856,1605113087,GB
1605113088,1605113095,IT
1605113096,1605113383,GB
1605113384,1605113391,IT
1605113392,1605113407,GB
1605113408,1605113415,IT
-1605113416,1605113503,GB
-1605113504,1605113511,IT
-1605113512,1605114199,GB
+1605113416,1605113567,GB
+1605113568,1605113575,IT
+1605113576,1605113839,GB
+1605113840,1605113847,IT
+1605113848,1605114031,GB
+1605114032,1605114039,IT
+1605114040,1605114199,GB
1605114200,1605114207,IT
-1605114208,1605114263,GB
-1605114264,1605114271,IT
-1605114272,1605114295,GB
+1605114208,1605114295,GB
1605114296,1605114303,IT
1605114304,1605114327,GB
1605114328,1605114335,IT
1605114336,1605114871,GB
1605114872,1605114879,IT
-1605114880,1605115007,GB
+1605114880,1605114975,GB
+1605114976,1605114983,IT
+1605114984,1605115007,GB
1605115008,1605115015,IT
-1605115016,1605115599,GB
+1605115016,1605115583,GB
+1605115584,1605115591,IT
+1605115592,1605115599,GB
1605115600,1605115607,IT
-1605115608,1605115863,GB
-1605115864,1605115871,IT
-1605115872,1605115879,GB
-1605115880,1605115887,IT
-1605115888,1605115903,GB
+1605115608,1605115903,GB
1605115904,1605124095,RU
1605124096,1605125263,GB
1605125264,1605125267,DE
1605125268,1605125269,GB
-1605125270,1605125279,DE
+1605125270,1605125275,DE
+1605125276,1605125276,GB
+1605125277,1605125279,DE
1605125280,1605125903,GB
1605125904,1605125919,DE
1605125920,1605130239,GB
@@ -30772,43 +31595,29 @@
1605599232,1605631999,GR
1605632000,1605664767,RS
1605664768,1605697535,MK
-1605697536,1605734399,RU
-1605734400,1605734535,GB
-1605734536,1605734536,RU
-1605734537,1605735423,GB
-1605735424,1605742591,RU
-1605742592,1605744639,GB
-1605744640,1605750783,RU
-1605750784,1605751807,GB
-1605751808,1605763071,RU
-1605763072,1605765119,KZ
-1605765120,1605795839,RU
+1605697536,1605763071,RU
+1605763072,1605769215,KZ
+1605769216,1605771263,PL
+1605771264,1605795839,RU
1605795840,1605828607,BE
1605828608,1605828863,GB
-1605828864,1605830399,IL
+1605828864,1605829375,US
+1605829376,1605830399,IL
1605830400,1605830655,US
1605830656,1605840895,RU
1605840896,1605844991,CH
1605844992,1605861375,RU
1605861376,1605894143,TR
-1605894144,1606156287,RO
+1605894144,1606156287,SA
1606156288,1606418431,RU
-1606418432,1606636287,SE
-1606636288,1606636543,GB
-1606636544,1607467007,SE
+1606418432,1607467007,SE
1607467008,1607532543,DE
-1607532544,1607562495,SE
-1607562496,1607562751,DK
-1607562752,1607569407,SE
+1607532544,1607569407,SE
1607569408,1607572479,DK
1607572480,1607575551,SE
1607575552,1607577599,GB
1607577600,1607581695,SE
-1607581696,1607584511,DK
-1607584512,1607584767,SE
-1607584768,1607585023,DK
-1607585024,1607585279,SE
-1607585280,1607595263,DK
+1607581696,1607595263,DK
1607595264,1607595519,SE
1607595520,1607598079,DK
1607598080,1607601919,IT
@@ -30835,14 +31644,13 @@
1607640807,1607647231,IT
1607647232,1607651327,DE
1607651328,1607655423,FR
-1607655424,1607660287,IT
-1607660288,1607660543,PT
-1607660544,1607663615,IT
+1607655424,1607663615,IT
1607663616,1607729151,NL
1607729152,1607737343,SY
-1607737344,1607761919,EG
-1607761920,1607766015,SY
-1607766016,1607794687,EG
+1607737344,1607745535,EG
+1607745536,1607766015,SY
+1607766016,1607778303,EG
+1607778304,1607794687,SY
1607794688,1607860223,RU
1607860224,1607892991,ES
1607892992,1607893055,GB
@@ -30876,8 +31684,9 @@
1607949312,1607950335,UA
1607950336,1607952383,RU
1607952384,1607953407,UA
-1607953408,1607954431,RU
-1607954432,1607956479,UA
+1607953408,1607955711,RU
+1607955712,1607955967,UA
+1607955968,1607956479,RU
1607956480,1607957503,ES
1607957504,1607958527,UA
1607958528,1607959551,PS
@@ -30909,7 +31718,7 @@
1607988224,1607989247,KG
1607989248,1607991295,RU
1607991296,1608122367,UA
-1608122368,1608253439,RO
+1608122368,1608253439,SA
1608253440,1608384511,RU
1608384512,1608515583,DE
1608515584,1610612735,IT
@@ -30923,15 +31732,17 @@
1611923456,1612185599,CA
1612185600,1612611327,US
1612611328,1612636159,CA
-1612636160,1613405695,US
-1613405696,1613405951,CA
-1613405952,1613471743,US
+1612636160,1613405183,US
+1613405184,1613405311,CA
+1613405312,1613471743,US
1613471744,1613479935,JM
1613479936,1613480191,CA
1613480192,1613488127,US
1613488128,1613492223,CA
1613492224,1613504511,US
-1613504512,1613529087,CA
+1613504512,1613522431,CA
+1613522432,1613522687,US
+1613522688,1613529087,CA
1613529088,1613545471,US
1613545472,1613565951,CA
1613565952,1613606911,US
@@ -30951,15 +31762,13 @@
1613742080,1613758463,US
1613758464,1614282751,CA
1614282752,1614741503,US
-1614741504,1614743039,CA
-1614743040,1614743295,US
-1614743296,1614757887,CA
+1614741504,1614743295,CA
+1614743296,1614743551,US
+1614743552,1614757887,CA
1614757888,1614774271,US
1614774272,1614786559,CA
1614786560,1618837503,US
-1618837504,1618840319,CA
-1618840320,1618840575,US
-1618840576,1618841599,CA
+1618837504,1618841599,CA
1618841600,1618849791,US
1618849792,1618850303,CA
1618850304,1618850559,US
@@ -30974,9 +31783,9 @@
1632354304,1632362495,CA
1632362496,1632978303,US
1632978304,1632978431,CA
-1632978432,1632979583,US
-1632979584,1632979711,CA
-1632979712,1634414591,US
+1632978432,1632979071,US
+1632979072,1632979199,CA
+1632979200,1634414591,US
1634414592,1634418687,CA
1634418688,1634447359,US
1634447360,1634451455,CA
@@ -30986,9 +31795,11 @@
1634467840,1634729983,CA
1634729984,1652293631,US
1652293632,1652310015,CA
-1652310016,1652447849,US
-1652447850,1652447850,CN
-1652447851,1652481279,US
+1652310016,1652447743,US
+1652447744,1652447999,CN
+1652448000,1652461823,US
+1652461824,1652462079,CN
+1652462080,1652481279,US
1652481280,1652481791,CN
1652481792,1653500927,US
1653500928,1653501439,IL
@@ -31010,9 +31821,7 @@
1654554624,1654558719,CA
1654558720,1654648831,US
1654648832,1654652927,CA
-1654652928,1656731007,US
-1656731008,1656731135,VI
-1656731136,1673527295,US
+1654652928,1673527295,US
1673527296,1673560063,CA
1673560064,1673580287,US
1673580288,1673580543,CA
@@ -31024,7 +31833,35 @@
1680535552,1680539647,CA
1680539648,1680564223,US
1680564224,1680572415,CA
-1680572416,1681915903,US
+1680572416,1680627199,US
+1680627200,1680627263,CA
+1680627264,1680646399,US
+1680646400,1680646655,CA
+1680646656,1680646911,US
+1680646912,1680647423,CA
+1680647424,1680651775,US
+1680651776,1680652031,CA
+1680652032,1680652351,US
+1680652352,1680652543,CA
+1680652544,1680732927,US
+1680732928,1680733183,CA
+1680733184,1680734719,US
+1680734720,1680734975,CA
+1680734976,1680749567,US
+1680749568,1680749695,CA
+1680749696,1680780927,US
+1680780928,1680781055,CA
+1680781056,1680781439,US
+1680781440,1680781567,CA
+1680781568,1680798591,US
+1680798592,1680798719,CA
+1680798720,1680801023,US
+1680801024,1680801151,CA
+1680801152,1680808703,US
+1680808704,1680808831,CA
+1680808832,1680814399,US
+1680814400,1680814463,PR
+1680814464,1681915903,US
1686110208,1694498815,US
1694498816,1694499839,CN
1694499840,1694500863,ID
@@ -31091,8 +31928,8 @@
1701003264,1701011455,MY
1701011456,1701019647,CN
1701019648,1701052415,GU
-1701052416,1701101567,NZ
-1701101568,1701117951,SG
+1701052416,1701093375,NZ
+1701093376,1701117951,SG
1701117952,1701134335,NC
1701134336,1701142527,CN
1701142528,1701143551,HK
@@ -31127,8 +31964,13 @@
1703411712,1703673855,TW
1703673856,1703935999,JP
1703936000,1704984575,CN
-1704984576,1705498623,AU
-1705498624,1705500671,GB
+1704984576,1705488383,AU
+1705488384,1705489407,HK
+1705489408,1705490431,SG
+1705490432,1705491455,GB
+1705491456,1705494527,HK
+1705494528,1705497599,SG
+1705497600,1705500671,GB
1705500672,1707081727,AU
1707081728,1707737087,CN
1707737088,1707802623,KR
@@ -31170,7 +32012,8 @@
1728140288,1728141311,SG
1728141312,1728142335,CN
1728142336,1728143359,NP
-1728143360,1728144383,MP
+1728143360,1728143615,GU
+1728143616,1728144383,MP
1728144384,1728145407,IN
1728145408,1728146431,MY
1728146432,1728147455,AU
@@ -31270,7 +32113,6 @@
1728316416,1728317439,MY
1728317440,1728319487,JP
1728319488,1728320511,AU
-1728321536,1728322559,JP
1728322560,1728323583,MY
1728323584,1728324607,JP
1728324608,1728325631,SG
@@ -31297,7 +32139,11 @@
1728346112,1728346367,AU
1728346368,1728346623,NZ
1728346624,1728347135,AU
-1728347136,1728348159,SG
+1728347136,1728347391,SG
+1728347392,1728347421,AU
+1728347422,1728347422,SG
+1728347423,1728347647,AU
+1728347648,1728348159,SG
1728348160,1728349183,VN
1728349184,1728349951,AU
1728349952,1728350207,NP
@@ -31633,19 +32479,17 @@
1728673792,1728674815,JP
1728674816,1728675839,ID
1728675840,1728676863,KR
-1728676864,1728677887,IN
1728677888,1728678911,BD
+1728678912,1728679935,PG
1728679936,1728680959,ID
1728680960,1728681983,MY
1728681984,1728683007,CN
-1728683008,1728684031,BD
1728684032,1728685055,AU
1728685056,1728686079,JP
1728686080,1728687103,AU
1728687104,1728689407,JP
1728689408,1728689663,BD
1728689664,1728689919,PK
-1728689920,1728690175,SG
1728690176,1728691199,BD
1728691200,1728692223,KH
1728692224,1728693247,JP
@@ -31710,7 +32554,6 @@
1728750592,1728751615,JP
1728751616,1728751871,IN
1728751872,1728752639,ID
-1728752640,1728753663,LK
1728753664,1728754687,PH
1728754688,1728755711,IN
1728755712,1728756735,ID
@@ -31726,7 +32569,6 @@
1728762880,1728763903,VN
1728763904,1728764927,KR
1728764928,1728765439,SG
-1728765440,1728765695,IN
1728765696,1728765951,ID
1728765952,1728766975,IN
1728766976,1728767999,TH
@@ -31826,7 +32668,7 @@
1728855040,1728856063,HK
1728856064,1728857087,MY
1728857088,1728858111,CN
-1728858112,1728860159,BD
+1728858112,1728859135,BD
1728860160,1728860671,ID
1728860672,1728861183,BD
1728861184,1728861439,ID
@@ -31849,7 +32691,6 @@
1728878592,1728879615,MY
1728879616,1728880127,IN
1728880128,1728880383,JP
-1728880384,1728880639,MY
1728880640,1728881663,KH
1728881664,1728881919,ID
1728881920,1728882175,AU
@@ -31879,7 +32720,6 @@
1728901632,1728902143,ID
1728902144,1728902399,SG
1728902400,1728902655,IN
-1728902656,1728902911,MY
1728902912,1728903167,BD
1728903168,1728905215,KR
1728905472,1728905727,PK
@@ -31910,7 +32750,6 @@
1728935936,1728936959,MY
1728936960,1728937983,CN
1728937984,1728939007,SG
-1728939008,1728939519,MY
1728939520,1728939775,PH
1728939776,1728940031,IN
1728940032,1728942079,JP
@@ -31952,7 +32791,6 @@
1728974848,1728976383,ID
1728976384,1728976895,AU
1728976896,1728977151,AF
-1728977664,1728977919,BD
1728977920,1728978943,MY
1728978944,1728979967,JP
1728979968,1728980991,MN
@@ -31967,12 +32805,11 @@
1728988160,1728988191,NZ
1728988192,1728988199,US
1728988200,1728989183,NZ
-1728989184,1728990207,BD
+1728989184,1728989695,BD
1728990208,1728990335,MY
1728990336,1728990463,ID
1728990464,1728990975,KR
1728990976,1728991231,SG
-1728991232,1728992255,BD
1728992256,1728993279,CN
1728993280,1728994303,PG
1728994304,1728995327,AU
@@ -32013,15 +32850,13 @@
1729029120,1729029375,AU
1729029376,1729029631,ID
1729029632,1729029887,AU
-1729029888,1729030143,PK
1729030144,1729031167,IN
1729031168,1729032191,SG
1729032192,1729033215,CN
1729033216,1729033727,SG
1729033728,1729034239,GB
1729034240,1729035263,KH
-1729035264,1729035519,SG
-1729035520,1729036287,AU
+1729035264,1729036287,AU
1729036288,1729037311,JP
1729037312,1729039359,CN
1729039360,1729040383,JP
@@ -32035,7 +32870,6 @@
1729047552,1729048575,AU
1729048576,1729049599,VN
1729049600,1729050623,IN
-1729050624,1729051647,JP
1729051648,1729053695,IN
1729053696,1729054719,JP
1729054720,1729055231,AU
@@ -32045,7 +32879,6 @@
1729056768,1729057791,IN
1729057792,1729058815,HK
1729058816,1729059839,TH
-1729059840,1729060863,JP
1729060864,1729061887,CN
1729061888,1729062911,SG
1729062912,1729063935,MY
@@ -32084,7 +32917,7 @@
1729090560,1729091583,JP
1729091584,1729092607,HK
1729092608,1729094143,BD
-1729094144,1729094655,IN
+1729094400,1729094655,IN
1729094656,1729095167,AU
1729095680,1729096703,SG
1729096704,1729097215,AU
@@ -32100,11 +32933,8 @@
1729105664,1729105919,VU
1729105920,1729106943,SG
1729106944,1729107967,NZ
-1729107968,1729108479,IN
-1729108480,1729108616,KR
-1729108617,1729108617,HK
-1729108618,1729108735,KR
-1729108736,1729108991,HK
+1729108480,1729108607,KR
+1729108608,1729108991,HK
1729108992,1729111039,IN
1729111040,1729112063,JP
1729112064,1729113087,MY
@@ -32200,7 +33030,6 @@
1729190912,1729191935,HK
1729191936,1729195007,IN
1729195008,1729195519,MN
-1729195520,1729196031,BD
1729196032,1729197055,GU
1729197056,1729198079,HK
1729198080,1729199103,CN
@@ -32259,7 +33088,7 @@
1729248256,1729249279,JP
1729249280,1729252351,IN
1729254400,1729255423,AU
-1729255424,1729256447,MY
+1729255424,1729257471,MY
1729257472,1729258495,ID
1729258496,1729259519,JP
1729259520,1729260543,IN
@@ -32375,7 +33204,7 @@
1729376768,1729377023,SG
1729377024,1729377279,ID
1729377280,1729378303,BD
-1729378304,1729378815,IN
+1729378560,1729378815,IN
1729379072,1729379327,SG
1729379328,1729380351,HK
1729380352,1729381375,IN
@@ -32388,14 +33217,13 @@
1729387008,1729387519,ID
1729387520,1729388543,SG
1729388544,1729389567,HK
-1729389568,1729389823,IN
1729390592,1729391103,IN
1729391104,1729391615,ID
1729391616,1729392639,JP
1729392640,1729393663,CN
1729393664,1729394687,KR
1729394688,1729395711,TH
-1729395712,1729395967,NR
+1729395712,1729395967,AU
1729395968,1729396735,IN
1729396736,1729397759,CN
1729397760,1729398783,PK
@@ -32422,7 +33250,6 @@
1729419264,1729419519,AU
1729419520,1729419775,SG
1729419776,1729420031,IN
-1729420032,1729420287,AU
1729420288,1729421311,HK
1729421312,1729422335,MY
1729422336,1729423359,HK
@@ -32433,7 +33260,6 @@
1729426432,1729427455,AU
1729427456,1729428479,CN
1729428480,1729430527,AU
-1729431552,1729432575,JP
1729432576,1729433599,PH
1729433600,1729433855,IN
1729433856,1729434111,AU
@@ -32570,14 +33396,12 @@
1729596672,1729596927,ID
1729596928,1729597439,NZ
1729597440,1729598463,VN
-1729598464,1729598975,AU
1729598976,1729599231,IN
1729599232,1729599487,ID
1729599488,1729600511,AU
1729600512,1729601535,VN
1729601536,1729603583,CN
1729603584,1729604607,HK
-1729604608,1729605119,AU
1729605376,1729605631,ID
1729605632,1729606655,CN
1729606656,1729607679,ID
@@ -32693,7 +33517,6 @@
1729718272,1729719295,HK
1729719296,1729720319,ID
1729720320,1729721087,AU
-1729721088,1729721343,IN
1729721344,1729722367,NZ
1729723392,1729726463,IN
1729726464,1729727487,PK
@@ -32745,7 +33568,6 @@
1729774592,1729775615,AU
1729775616,1729776127,IN
1729776128,1729776639,MY
-1729776640,1729777663,IN
1729777664,1729779711,PK
1729779712,1729780735,AU
1729780736,1729781759,HK
@@ -32754,7 +33576,6 @@
1729783552,1729783807,NZ
1729783808,1729785855,IN
1729785856,1729786879,BD
-1729786880,1729787903,JP
1729787904,1729789951,HK
1729789952,1729790975,ID
1729792000,1729793023,BD
@@ -32803,13 +33624,11 @@
1729832448,1729832959,AU
1729832960,1729833983,JP
1729833984,1729835007,SG
-1729835008,1729836031,IN
1729836032,1729837055,NZ
1729837056,1729838079,CN
1729838080,1729840127,VN
1729840128,1729841151,JP
1729841152,1729842175,MY
-1729842176,1729843199,HK
1729843200,1729844223,JP
1729844224,1729845247,IN
1729845248,1729846271,NZ
@@ -32828,7 +33647,6 @@
1729856512,1729857535,AU
1729857536,1729858559,JP
1729858560,1729859583,IN
-1729859584,1729860607,HK
1729860608,1729861631,KR
1729861632,1729862655,AU
1729862656,1729863679,JP
@@ -32868,7 +33686,6 @@
1729884160,1729885183,CN
1729885184,1729886207,JP
1729886208,1729887743,ID
-1729887744,1729887999,VU
1729888000,1729888255,IN
1729888256,1729889279,KH
1729889280,1729891327,CN
@@ -33042,7 +33859,6 @@
1730066432,1730067455,AU
1730067456,1730068479,BD
1730068480,1730069503,IN
-1730069504,1730070527,JP
1730070528,1730071551,CN
1730071552,1730072575,KR
1730072576,1730073599,SG
@@ -33059,9 +33875,7 @@
1730082816,1730083839,PW
1730083840,1730084863,JP
1730084864,1730085887,CN
-1730085888,1730086143,AU
-1730086144,1730086399,ID
-1730086400,1730086911,AU
+1730085888,1730086911,AU
1730086912,1730087935,HK
1730087936,1730088959,JP
1730088960,1730091007,HK
@@ -33074,7 +33888,8 @@
1730094080,1730095103,ID
1730095104,1730096127,JP
1730096128,1730097151,ID
-1730097152,1730104319,CN
+1730097152,1730103295,CN
+1730103296,1730104319,HK
1730104320,1730105343,JP
1730105344,1730106367,PK
1730106368,1730107391,MV
@@ -33118,11 +33933,580 @@
1730147328,1730148351,JP
1730148352,1730149375,ID
1730149376,1730150399,JP
+1730150400,1730360319,CN
+1730412544,1730414591,AU
+1730414592,1730415615,ID
+1730415616,1730416127,AU
+1730416128,1730416639,ID
+1730416640,1730417663,PH
+1730417664,1730418687,CN
+1730418688,1730419711,BD
+1730419712,1730420735,CN
+1730420736,1730421759,ID
+1730421760,1730422783,CN
+1730422784,1730423807,ID
+1730423808,1730425855,IN
+1730425856,1730426879,HK
+1730426880,1730429951,CN
+1730429952,1730430207,ID
+1730430208,1730430463,AU
+1730430464,1730430719,HK
+1730430720,1730430975,IN
+1730430976,1730431999,CN
+1730432000,1730435071,IN
+1730435072,1730436095,HK
+1730436096,1730437119,SG
+1730437120,1730438143,CN
+1730438144,1730439167,BD
+1730439168,1730440191,IN
+1730440192,1730442239,HK
+1730442240,1730443263,TW
+1730443264,1730445311,IN
+1730445312,1730445567,NZ
+1730445568,1730446335,AU
+1730446336,1730448383,CN
+1730448384,1730449407,JP
+1730449408,1730450431,VU
+1730450432,1730450687,AU
+1730450688,1730450943,IN
+1730450944,1730451455,PH
+1730451456,1730452479,AU
+1730452480,1730453503,ID
+1730453504,1730476031,CN
+1730476032,1730476543,AU
+1730476544,1730476799,NZ
+1730476800,1730477055,IN
+1730477056,1730478079,AU
+1730478080,1730479103,CN
+1730479104,1730480127,HK
+1730480128,1730480639,AU
+1730480640,1730481151,JP
+1730481152,1730483199,CN
+1730483200,1730483711,IN
+1730483712,1730484223,AU
+1730484224,1730485247,CN
+1730485248,1730487295,VN
+1730487296,1730488319,TW
+1730488320,1730489343,HK
+1730489344,1730490367,CN
+1730490368,1730491391,PH
+1730491392,1730493439,CN
+1730493440,1730494463,HK
+1730494464,1730495487,JP
+1730495488,1730496511,AU
+1730496512,1730497535,CN
+1730497536,1730499583,IN
+1730499584,1730500607,HK
+1730500608,1730501631,IN
+1730501632,1730502655,JP
+1730502656,1730503167,MY
+1730503168,1730503423,ID
+1730503424,1730503679,AU
+1730503680,1730505727,CN
+1730505728,1730508799,JP
+1730508800,1730509823,AU
+1730509824,1730510847,CN
+1730510848,1730511871,AU
+1730511872,1730512895,JP
+1730512896,1730521087,CN
+1730521088,1730522111,ID
+1730522112,1730524159,CN
+1730524160,1730525183,IN
+1730525184,1730526207,HK
+1730526208,1730528255,JP
+1730528256,1730529279,SG
+1730529280,1730529791,IN
+1730529792,1730530303,AU
+1730530304,1730531327,NZ
+1730531328,1730535423,CN
+1730535424,1730536447,ID
+1730536448,1730536703,AU
+1730536704,1730537471,ID
+1730537472,1730538495,HK
+1730538496,1730540543,JP
+1730540544,1730541567,ID
+1730541568,1730544639,CN
+1730544640,1730545919,IN
+1730545920,1730546687,AU
+1730546688,1730547711,IN
+1730547712,1730548735,BD
+1730548736,1730549759,HK
+1730549760,1730550783,KR
+1730550784,1730551807,HK
+1730551808,1730552831,CN
+1730552832,1730553855,IN
+1730553856,1730555903,CN
+1730555904,1730556415,IN
+1730556416,1730556927,HK
+1730556928,1730557951,JP
+1730557952,1730558975,CN
+1730558976,1730559999,MY
+1730560000,1730561023,HK
+1730561024,1730562047,IN
+1730562048,1730563071,SG
+1730563072,1730564095,CN
+1730564096,1730565119,HK
+1730565120,1730566143,CN
+1730566144,1730566655,IN
+1730566656,1730567167,HK
+1730567168,1730569215,CN
+1730569216,1730570239,ID
+1730570240,1730571263,HK
+1730571264,1730572287,IN
+1730572288,1730573311,KH
+1730573312,1730574335,CN
+1730574336,1730575359,AU
+1730575360,1730577407,IN
+1730577408,1730578431,CN
+1730578432,1730579455,VN
+1730579456,1730580479,CN
+1730580480,1730580735,HK
+1730580736,1730580991,AU
+1730580992,1730581503,TW
+1730581504,1730582015,AU
+1730582016,1730582271,IN
+1730582272,1730582527,PH
+1730582528,1730585599,HK
+1730585600,1730586623,NZ
+1730586624,1730587647,HK
+1730587648,1730588671,PH
+1730588672,1730589695,IN
+1730589696,1730590719,JP
+1730590720,1730591743,SG
+1730591744,1730591999,PH
+1730592000,1730592767,IN
+1730592768,1730593791,MY
+1730593792,1730594815,NP
+1730594816,1730596863,IN
+1730596864,1730597887,JP
+1730597888,1730598911,PH
+1730598912,1730599423,AU
+1730599424,1730599935,VU
+1730599936,1730604031,CN
+1730605056,1730607103,IN
+1730607104,1730608127,JP
+1730608128,1730609151,CN
+1730609152,1730610687,IN
+1730610688,1730610943,MY
+1730610944,1730611199,SG
+1730611200,1730612223,IN
+1730612224,1730613247,ID
+1730613248,1730614271,CN
+1730614272,1730615295,NZ
+1730615296,1730616319,HK
+1730616320,1730617343,IN
+1730617344,1730618367,TW
+1730618368,1730619391,KR
+1730619392,1730619903,HK
+1730619904,1730620415,SG
+1730620416,1730621439,NZ
+1730621440,1730622719,ID
+1730622720,1730622975,AU
+1730622976,1730623231,IN
+1730623232,1730623487,AU
+1730623488,1730624511,HK
+1730624512,1730625535,AU
+1730625536,1730626559,CN
+1730626560,1730629631,HK
+1730629632,1730630655,PK
+1730630656,1730631679,AU
+1730631680,1730632703,CN
+1730632704,1730634751,VN
+1730634752,1730637823,CN
+1730637824,1730638079,AU
+1730638080,1730638335,JP
+1730638336,1730638847,NZ
+1730638848,1730639871,IN
+1730639872,1730640383,AU
+1730640384,1730640895,MY
+1730640896,1730641919,JP
+1730641920,1730643967,IN
+1730643968,1730644735,AU
+1730644736,1730644991,IN
+1730644992,1730646015,MY
+1730646016,1730647039,CN
+1730647040,1730649087,HK
+1730649088,1730650111,IN
+1730650112,1730658303,CN
+1730658304,1730660351,JP
+1730660352,1730669567,CN
+1730669568,1730670079,IN
+1730670080,1730670591,AU
+1730670592,1730672639,IN
+1730672640,1730673407,AU
+1730673408,1730673663,IN
+1730673664,1730674687,FM
+1730674688,1730675711,AU
+1730675712,1730677759,HK
+1730677760,1730686975,CN
+1730686976,1730687999,IN
+1730688000,1730688511,AU
+1730688512,1730689023,ID
+1730689024,1730692095,IN
+1730692096,1730692607,ID
+1730692608,1730693119,AU
+1730693120,1730694143,IN
+1730694144,1730695167,BD
+1730695168,1730695423,IN
+1730695424,1730695679,NZ
+1730695680,1730696191,BD
+1730696192,1730697215,HK
+1730697216,1730698239,CN
+1730698240,1730699263,ID
+1730699264,1730700287,JP
+1730700288,1730701311,CN
+1730701312,1730702335,JP
+1730702336,1730702591,ID
+1730702592,1730702847,AU
+1730702848,1730703359,HK
+1730703360,1730704383,CN
+1730704384,1730705407,TH
+1730705408,1730706431,ID
+1730706432,1730708479,JP
+1730708480,1730713599,TH
+1730713600,1730714623,HK
+1730714624,1730715647,JP
+1730715648,1730716671,HK
+1730716672,1730717183,PH
+1730717184,1730717695,AU
+1730717696,1730718719,IN
+1730718720,1730720767,HK
+1730720768,1730723839,TH
+1730723840,1730724863,CN
+1730724864,1730727935,IN
+1730727936,1730728959,HK
+1730728960,1730729983,CN
+1730729984,1730731007,JP
+1730731008,1730732031,CN
+1730732032,1730732287,AU
+1730732288,1730732543,HK
+1730732544,1730733055,BD
+1730733056,1730741247,CN
+1730741248,1730742271,HK
+1730742272,1730742783,AF
+1730742784,1730743295,IN
+1730743296,1730744319,SG
+1730744320,1730745343,CN
+1730745344,1730752511,IN
+1730752512,1730753535,HK
+1730753536,1730754559,CN
+1730754560,1730755071,IN
+1730755072,1730755583,TH
+1730755584,1730756607,JP
+1730756608,1730757631,HK
+1730757632,1730758655,SG
+1730758656,1730759679,JP
+1730759680,1730760703,SG
+1730760704,1730761727,HK
+1730761728,1730762751,TH
+1730762752,1730766847,IN
+1730766848,1730767871,HK
+1730767872,1730768127,AU
+1730768128,1730768639,ID
+1730768640,1730768895,BD
+1730768896,1730769919,JP
+1730769920,1730770943,CN
+1730770944,1730771967,ID
+1730771968,1730772991,HK
+1730772992,1730774015,SG
+1730774016,1730775039,HK
+1730775040,1730776063,JP
+1730776064,1730777087,CN
+1730777088,1730778111,IN
+1730778112,1730780159,CN
+1730780160,1730781183,AU
+1730781184,1730783231,CN
+1730783232,1730783487,IN
+1730783488,1730783743,ID
+1730783744,1730783999,IN
+1730784000,1730784255,ID
+1730784256,1730785279,HK
+1730785280,1730785535,NL
+1730785536,1730786303,AU
+1730786304,1730788351,HK
+1730788352,1730790399,ID
+1730790400,1730791423,IN
+1730791424,1730794495,ID
+1730794496,1730795007,BD
+1730795008,1730795519,IN
+1730795520,1730796543,AU
+1730796544,1730800639,CN
+1730800640,1730801663,IN
+1730801664,1730802687,JP
+1730802688,1730803199,BD
+1730803200,1730803711,ID
+1730803712,1730804735,HK
+1730804736,1730805759,JP
+1730805760,1730806783,AF
+1730806784,1730807807,JP
+1730807808,1730808831,CN
+1730808832,1730809855,HK
+1730809856,1730810623,IN
+1730810624,1730811903,AU
+1730811904,1730814975,CN
+1730814976,1730815999,HK
+1730816000,1730817023,ID
+1730817024,1730818047,JP
+1730818048,1730818815,AU
+1730818816,1730819071,IN
+1730819072,1730820095,JP
+1730820096,1730821119,VN
+1730821120,1730822143,HK
+1730822144,1730824191,CN
+1730824192,1730825215,IN
+1730825216,1730826239,CN
+1730826240,1730827263,JP
+1730827264,1730829311,IN
+1730829312,1730831359,PH
+1730831360,1730832383,HK
+1730832384,1730833407,CN
+1730833408,1730834431,AU
+1730834432,1730834943,TW
+1730834944,1730835455,IN
+1730835456,1730837503,ID
+1730837504,1730838527,IN
+1730838528,1730839551,TH
+1730839552,1730840575,AU
+1730840576,1730841599,SG
+1730841600,1730842623,AU
+1730842624,1730844671,TW
+1730844672,1730845695,BD
+1730845696,1730848767,IN
+1730848768,1730849791,JP
+1730849792,1730850815,IN
+1730850816,1730851839,HK
+1730851840,1730852863,CN
+1730852864,1730853887,KR
+1730853888,1730854143,IN
+1730854144,1730854399,AU
+1730854400,1730854655,NZ
+1730854656,1730854911,HK
+1730854912,1730856959,IN
+1730856960,1730857983,JP
+1730857984,1730858239,AU
+1730858240,1730858495,ID
+1730858496,1730859007,IN
+1730859008,1730860031,BN
+1730860032,1730861055,MY
+1730861056,1730862079,MM
+1730862080,1730863103,JP
+1730863104,1730864127,AU
+1730864128,1730865151,TW
+1730865152,1730866175,CN
+1730866176,1730867199,AU
+1730867200,1730868223,JP
+1730868224,1730869247,KR
+1730869248,1730870271,IN
+1730870272,1730871807,ID
+1730871808,1730873343,IN
+1730873344,1730875391,HK
+1730875392,1730876415,CN
+1730876416,1730877439,AU
+1730877440,1730878463,CN
+1730878464,1730879487,HK
+1730879488,1730881023,IN
+1730881024,1730881535,AU
+1730881536,1730882559,IN
+1730882560,1730883583,ID
+1730883584,1730884607,TW
+1730884608,1730885631,BD
+1730885632,1730886655,AU
+1730886656,1730887679,HK
+1730887680,1730887935,KR
+1730887936,1730888191,IN
+1730888192,1730888703,ID
+1730888704,1730889727,HK
+1730889728,1730889743,AU
+1730889744,1730890751,JP
+1730890752,1730891775,LA
+1730891776,1730892799,IN
+1730892800,1730893823,CN
+1730893824,1730895103,AU
+1730895104,1730895359,BD
+1730895360,1730895871,IN
+1730895872,1730898943,CN
+1730898944,1730899967,MY
+1730899968,1730900991,IN
+1730900992,1730901503,AU
+1730901504,1730901759,DE
+1730901760,1730902015,AU
+1730902016,1730903039,KR
+1730903040,1730904063,CN
+1730904064,1730905087,ID
+1730905088,1730906111,CN
+1730906112,1730906367,TH
+1730906368,1730907135,AU
+1730907136,1730908159,JP
+1730908160,1730909183,PG
+1730909184,1730910207,BD
+1730910208,1730911231,IN
+1730911232,1730912255,NC
+1730912256,1730913279,IN
+1730913280,1730914303,CN
+1730914304,1730915327,NP
+1730915328,1730916351,HK
+1730916352,1730918399,AU
+1730918400,1730919423,CN
+1730919424,1730920447,SG
+1730920448,1730922495,CN
+1730922496,1730923519,IN
+1730923520,1730924031,NF
+1730924032,1730924543,NZ
+1730924544,1730925567,CN
+1730925568,1730926591,NZ
+1730926592,1730927615,HK
+1730927616,1730929663,CN
+1730929664,1730929919,IN
+1730929920,1730930175,TH
+1730930176,1730930431,BD
+1730930432,1730930687,IN
+1730930688,1730931711,CN
+1730931712,1730932735,HK
+1730932736,1730933759,CN
+1730933760,1730934783,HK
+1730934784,1730936063,IN
+1730936064,1730936831,AU
+1730936832,1730937855,IN
+1730937856,1730938879,SG
+1730938880,1730939903,JP
+1730939904,1730940927,IN
+1730940928,1730941439,JP
+1730941440,1730941951,IN
+1730941952,1730942975,HK
+1730942976,1730943487,AU
+1730943488,1730943999,ID
+1730944000,1730945023,HK
+1730945024,1730946047,AU
+1730946048,1730947071,ID
+1730947072,1730948095,AU
+1730948096,1730948351,TH
+1730948352,1730948607,NZ
+1730948608,1730949119,AU
+1730949120,1730951167,IN
+1730951168,1730952191,CN
+1730952192,1730954239,HK
+1730954240,1730955263,SG
+1730955264,1730957311,BD
+1730957312,1730958335,CN
+1730958336,1730959359,JP
+1730959360,1730960383,CN
+1730960384,1730961407,AU
+1730961408,1730962431,IN
+1730962432,1730962687,ID
+1730962688,1730962943,AU
+1730962944,1730963455,JP
+1730963456,1730964479,IN
+1730964480,1730964735,MY
+1730964736,1730964991,HK
+1730964992,1730965503,NZ
+1730965504,1730966527,SG
+1730966528,1730967551,IN
+1730967552,1730969599,CN
+1730969600,1730970623,JP
+1730970624,1730971647,CN
+1730971648,1730973695,IN
+1730973696,1730974719,CN
+1730974720,1730974975,AU
+1730974976,1730975231,ID
+1730975232,1730975743,BD
+1730975744,1730976767,CN
+1730976768,1730977791,IN
+1730977792,1730978815,HK
+1730978816,1730979839,NZ
+1730979840,1730980863,CN
+1730980864,1730981887,IN
+1730981888,1730990079,CN
+1730990080,1730992127,JP
+1730992128,1730993151,TH
+1730993152,1730993407,SG
+1730993408,1730993663,IN
+1730993664,1730993919,NZ
+1730993920,1730994175,PK
+1730994176,1730995199,CN
+1730995200,1730996223,AU
+1730996224,1730997247,HK
+1730997248,1731018751,CN
+1731018752,1731020799,HK
+1731020800,1731060735,CN
+1731060736,1731063807,VN
+1731063808,1731064831,NZ
+1731064832,1731065855,JP
+1731065856,1731066879,CN
+1731066880,1731067391,PH
+1731067392,1731067903,AU
+1731067904,1731068927,CN
+1731068928,1731070975,JP
+1731070976,1731103743,CN
+1731103744,1731103871,TH
+1731103872,1731103999,FR
+1731104000,1731104127,KR
+1731104128,1731104767,HK
+1731104768,1731105791,TW
+1731105792,1731106815,BD
+1731106816,1731115007,CN
+1731115008,1731116031,HK
+1731116032,1731117055,TW
+1731117056,1731118847,IN
+1731118848,1731119103,AU
+1731119104,1731120127,IN
+1731120128,1731121151,JP
+1731121152,1731122175,AF
+1731122176,1731123199,AU
+1731123200,1731124223,PF
+1731124224,1731125247,AU
+1731125248,1731126271,HK
+1731126272,1731127295,AU
+1731127296,1731130367,IN
+1731130368,1731132415,CN
+1731132416,1731133439,SG
+1731133440,1731133951,AU
+1731133952,1731134207,JP
+1731134208,1731134463,NZ
+1731134464,1731135487,CN
+1731135488,1731136511,JP
+1731136512,1731138559,IN
+1731138560,1731139583,CN
+1731139584,1731140607,HK
+1731140608,1731141631,SG
+1731141632,1731142655,IN
+1731142656,1731144703,CN
+1731144704,1731145727,IN
+1731145728,1731146751,CN
+1731146752,1731148799,IN
+1731148800,1731149055,ID
+1731149056,1731149311,HK
+1731149312,1731149823,AU
+1731149824,1731152895,IN
+1731152896,1731153407,SG
+1731153408,1731153919,IN
+1731153920,1731154943,CN
+1731154944,1731155967,TH
+1731155968,1731156479,HK
+1731156480,1731158015,IN
+1731158016,1731159039,CN
+1731159040,1731160063,JP
+1731160064,1731161087,IN
+1731161088,1731162111,CN
+1731162112,1731163135,HK
+1731163136,1731165183,CN
+1731165184,1731167231,IN
+1731167232,1731168255,ID
+1731168256,1731170303,CN
+1731170304,1731171327,PK
+1731171328,1731172863,IN
+1731172864,1731173375,MY
+1731173376,1731178495,IN
+1731178496,1731179519,HK
+1731179520,1731180543,JP
+1731180544,1731181055,MM
+1731181056,1731181311,IN
+1731181568,1731182591,KH
+1731182592,1731183615,VN
+1731183616,1731184639,IN
1742733312,1742734335,HK
1742734336,1742735359,IN
1742735360,1742736383,JP
1742736384,1742737407,PK
-1742737408,1742738431,SG
1742738432,1742738687,HK
1742738688,1742738943,AU
1742738944,1742739199,HK
@@ -33404,7 +34788,7 @@
1743026176,1743027199,BD
1743027200,1743028223,AU
1743028224,1743029247,CN
-1743029248,1743030271,AU
+1743029248,1743029503,AU
1743030272,1743031295,HK
1743031296,1743035391,IN
1743035392,1743036415,PK
@@ -33544,7 +34928,7 @@
1743163392,1743166463,IN
1743166464,1743167487,AU
1743167488,1743168511,HK
-1743168512,1743169535,IN
+1743169024,1743169535,IN
1743169536,1743170559,JP
1743170560,1743171583,KR
1743171584,1743172607,AU
@@ -33625,15 +35009,13 @@
1743252480,1743253503,JP
1743253504,1743254527,PH
1743254528,1743255551,CN
-1743255552,1743256319,SG
-1743256320,1743256575,MY
+1743255552,1743256575,SG
1743256576,1743258623,HK
1743258624,1743259647,CN
1743259648,1743260671,IN
1743260672,1743261695,JP
1743261696,1743262719,HK
1743262720,1743264767,IN
-1743264768,1743265279,MY
1743265280,1743265535,ID
1743265536,1743265791,AU
1743265792,1743266303,ID
@@ -33871,7 +35253,7 @@
1743506944,1743507455,IN
1743507456,1743509503,VN
1743509504,1743510527,HK
-1743510528,1743545343,CN
+1743510528,1743552511,CN
1743585280,1743589375,CN
1743589376,1743590399,AU
1743590400,1743591423,KR
@@ -33931,7 +35313,9 @@
1743681536,1743682559,AU
1743682560,1743683583,MY
1743683584,1743683839,JP
-1743683840,1743684607,HK
+1743683840,1743684095,AU
+1743684096,1743684351,HK
+1743684352,1743684607,AU
1743684608,1743685631,CN
1743685632,1743686655,ID
1743686656,1743688703,CN
@@ -33982,6 +35366,38 @@
1743740928,1743741951,CN
1743741952,1743742975,HK
1743742976,1743743487,NZ
+1743743488,1743743999,AU
+1743744000,1743745023,JP
+1743745024,1743746047,KR
+1743746048,1743748095,VN
+1743748096,1743748607,IN
+1743748608,1743748863,HK
+1743748864,1743749119,MY
+1743749120,1743751167,AU
+1743751168,1743755263,IN
+1743755264,1743757311,CN
+1743757312,1743758335,TO
+1743758336,1743758591,HK
+1743758592,1743758847,ID
+1743758848,1743759359,AU
+1743759360,1743761407,IN
+1743761408,1743764479,CN
+1743764480,1743765503,ID
+1743765504,1743767551,CN
+1743767552,1743768575,PH
+1743768576,1743770623,CN
+1743770624,1743770879,AU
+1743770880,1743771135,PH
+1743771136,1743771647,NZ
+1743771648,1743772671,JP
+1743772672,1743773695,SG
+1743773696,1743774719,CN
+1743774720,1743775743,NZ
+1743775744,1743776767,IN
+1743776768,1743778815,KR
+1743778816,1743779839,CN
+1743779840,1743780863,MY
+1743780864,1743781887,BD
1743781888,1743783935,JP
1743783936,1743784959,IN
1743784960,1743785983,JP
@@ -34057,7 +35473,6 @@
1743864832,1743865855,TW
1743865856,1743866879,CN
1743866880,1743867903,KR
-1743867904,1743868927,JP
1743868928,1743870975,NZ
1743870976,1743873023,CN
1743873024,1743874047,AU
@@ -34086,7 +35501,6 @@
1743897600,1743899647,AU
1743899648,1743900671,ID
1743900672,1743901695,JP
-1743901696,1743902719,IN
1743902720,1743903743,AU
1743903744,1743904767,CN
1743904768,1743908863,IN
@@ -34117,7 +35531,7 @@
1743931392,1743932415,HK
1743932416,1743933439,IN
1743933440,1743934463,AU
-1743934464,1743936511,SG
+1743935488,1743936511,SG
1743936512,1743937535,AU
1743937536,1743938559,MM
1743938560,1743939583,HK
@@ -34128,7 +35542,6 @@
1743944704,1743945215,ID
1743945216,1743945727,TO
1743945728,1743947775,CN
-1743947776,1743948799,JP
1743948800,1743949823,HK
1743949824,1743950847,TH
1743950848,1743951359,HK
@@ -34158,7 +35571,6 @@
1743976448,1743977471,AU
1743977472,1743978495,JP
1743978496,1743979519,HK
-1743979520,1743980543,JP
1743980544,1743981567,IN
1743981568,1743982591,SG
1743982592,1743983359,AU
@@ -34166,8 +35578,9 @@
1743983616,1743984639,KR
1743984640,1743985663,CN
1743985664,1743994879,IN
-1743994880,1743995903,AU
-1743995904,1743997951,IN
+1743994880,1743995135,PG
+1743995136,1743995903,AU
+1743995904,1743996927,IN
1743997952,1743999999,BD
1744000000,1744001023,AU
1744001024,1744001535,IN
@@ -34181,7 +35594,6 @@
1744006656,1744006911,AU
1744006912,1744009215,IN
1744009216,1744010239,JP
-1744010240,1744011263,ID
1744011264,1744012287,HK
1744012288,1744013311,IN
1744013312,1744014335,CN
@@ -34199,7 +35611,6 @@
1744024320,1744024575,AF
1744024576,1744025599,HK
1744025600,1744026623,IN
-1744026624,1744027647,JP
1744027648,1744028671,MY
1744028672,1744029695,JP
1744029696,1744030719,KR
@@ -34223,7 +35634,6 @@
1744049152,1744050175,BD
1744050176,1744051199,HK
1744051200,1744052223,PH
-1744052224,1744053247,MN
1744053248,1744054271,ID
1744054272,1744055295,KR
1744055296,1744056319,HK
@@ -34231,15 +35641,15 @@
1744056576,1744056831,MY
1744056832,1744057087,NZ
1744057088,1744057343,ID
-1744057344,1744059391,HK
-1744059392,1744066559,CN
+1744057344,1744058879,HK
+1744058880,1744066559,CN
1744066560,1744067583,HK
1744067584,1744068607,JP
1744068608,1744069631,ID
1744069632,1744070655,SG
1744070656,1744071679,JP
1744071680,1744072703,KR
-1744072704,1744074751,JP
+1744072704,1744073727,JP
1744074752,1744076799,IN
1744076800,1744077823,AU
1744077824,1744078847,PK
@@ -34268,6 +35678,7 @@
1744101376,1744102399,HK
1744102400,1744103423,FJ
1744103424,1744104447,CN
+1744104448,1744105471,AU
1744105472,1744106751,IN
1744106752,1744107007,ID
1744107008,1744107519,SG
@@ -34354,7 +35765,7 @@
1744192512,1744194559,JP
1744194560,1744194815,ID
1744194816,1744195071,HK
-1744195072,1744195327,AU
+1744195072,1744195327,SG
1744195328,1744195583,HK
1744195584,1744196607,JP
1744196608,1744197631,IN
@@ -34388,7 +35799,7 @@
1744220928,1744221183,JP
1744221184,1744222207,NZ
1744222208,1744222719,ID
-1744222720,1744223231,AU
+1744222720,1744222975,AU
1744223232,1744224255,TH
1744225280,1744226303,IN
1744226304,1744227327,SG
@@ -34514,7 +35925,7 @@
1744349184,1744350207,CN
1744350208,1744351231,IN
1744351232,1744352255,NZ
-1744352256,1744354303,HK
+1744353280,1744354303,HK
1744354304,1744355327,AU
1744355328,1744356351,CN
1744356352,1744357375,JP
@@ -34535,7 +35946,6 @@
1744370688,1744371711,HK
1744371712,1744372735,BD
1744372736,1744373759,IN
-1744373760,1744374783,JP
1744374784,1744375807,CN
1744375808,1744376831,IN
1744376832,1744377855,VN
@@ -34543,7 +35953,9 @@
1744378880,1744379903,KR
1744379904,1744380927,HK
1744380928,1744383999,IN
-1744384000,1744384039,AU
+1744384000,1744384000,AU
+1744384001,1744384031,GU
+1744384032,1744384039,AU
1744384040,1744384047,GU
1744384048,1744385023,AU
1744385024,1744386047,CN
@@ -34560,7 +35972,7 @@
1744395264,1744396287,MY
1744396288,1744397311,IN
1744397312,1744398335,VN
-1744398336,1744400383,HK
+1744399360,1744400383,HK
1744400384,1744402431,JP
1744402432,1744403455,IN
1744403456,1744404479,AU
@@ -34582,7 +35994,6 @@
1744425472,1744425727,ID
1744425728,1744425983,IN
1744425984,1744427007,JP
-1744427008,1744428031,PG
1744428032,1744429567,AU
1744429568,1744429823,IN
1744429824,1744430079,ID
@@ -34591,7 +36002,7 @@
1744434176,1744435199,CN
1744435200,1744436223,IN
1744436224,1744437247,CN
-1744437248,1744439295,JP
+1744438272,1744439295,JP
1744439296,1744439807,AU
1744439808,1744440319,IN
1744440320,1744441343,HK
@@ -34600,7 +36011,6 @@
1744443392,1744444415,VN
1744444416,1744445439,IN
1744445440,1744446463,CN
-1744446464,1744447487,JP
1744447488,1744447743,IN
1744447744,1744447999,HK
1744448000,1744448511,BD
@@ -34631,7 +36041,6 @@
1744473344,1744474111,SG
1744474112,1744481279,IN
1744481280,1744482303,JP
-1744482304,1744483327,IN
1744483328,1744484351,CN
1744484352,1744485119,IN
1744485120,1744485375,MY
@@ -34668,7 +36077,6 @@
1744514560,1744514815,IN
1744514816,1744515071,AU
1744515072,1744516095,IN
-1744516096,1744517119,HK
1744517120,1744519167,IN
1744519168,1744520191,AU
1744520192,1744521215,TH
@@ -34688,7 +36096,6 @@
1744534528,1744536575,CN
1744536576,1744537087,PW
1744537088,1744538623,AU
-1744538624,1744539647,HK
1744539648,1744540671,AU
1744540672,1744541695,IN
1744541696,1744542719,ID
@@ -34700,7 +36107,6 @@
1744547840,1744548863,AF
1744548864,1744549887,ID
1744549888,1744551935,IN
-1744551936,1744552959,JP
1744552960,1744553471,SG
1744553472,1744553983,HK
1744553984,1744555007,MY
@@ -34709,12 +36115,10 @@
1744562176,1744563199,BD
1744563200,1744564223,HK
1744564224,1744565247,CN
-1744565248,1744566271,HK
1744566272,1744567295,IN
1744567296,1744568319,JP
1744568320,1744569343,VN
1744569344,1744570367,IN
-1744570368,1744570879,JP
1744570880,1744571391,AU
1744571392,1744571903,ID
1744571904,1744572415,AU
@@ -34728,7 +36132,6 @@
1744580608,1744580863,PH
1744580864,1744581119,SG
1744581120,1744581631,ID
-1744581632,1744582655,JP
1744582656,1744583679,AU
1744583680,1744584703,IN
1744584704,1744585727,CN
@@ -34746,7 +36149,7 @@
1744594944,1744595967,CN
1744595968,1744596991,IN
1744596992,1744598015,SG
-1744598016,1744602111,JP
+1744599040,1744601087,JP
1744602112,1744603135,HK
1744603136,1744604159,JP
1744604160,1744607231,IN
@@ -34762,11 +36165,9 @@
1744616448,1744616959,ID
1744616960,1744617471,AU
1744617472,1744618495,IN
-1744618496,1744619519,JP
1744619520,1744620543,SG
1744620544,1744622591,CN
1744622592,1744625663,IN
-1744625664,1744626687,SG
1744626688,1744627711,KR
1744627712,1744628735,CN
1744628736,1744629759,IN
@@ -34788,7 +36189,6 @@
1744643584,1744644095,BD
1744644096,1744645119,HK
1744645120,1744646143,BD
-1744646144,1744647167,PH
1744647168,1744648191,IN
1744648192,1744649215,KR
1744649216,1744650239,CN
@@ -34803,7 +36203,6 @@
1744658432,1744659455,HK
1744659456,1744660479,JP
1744660480,1744660735,IN
-1744660736,1744660991,MY
1744660992,1744661503,ID
1744661504,1744662527,MY
1744662528,1744663551,ID
@@ -34815,7 +36214,6 @@
1744665856,1744666111,IN
1744666112,1744666367,AU
1744666368,1744666623,PH
-1744666624,1744667647,JP
1744667648,1744668671,TH
1744668672,1744669695,NZ
1744669696,1744670719,HK
@@ -34877,7 +36275,8 @@
1744733184,1744734207,NZ
1744734208,1744736255,AU
1744736256,1744737279,JP
-1744737280,1744738303,CN
+1744737280,1744738047,HK
+1744738048,1744738303,CN
1744738304,1744739327,SG
1744739328,1744740351,NZ
1744740352,1744741375,IN
@@ -34889,7 +36288,6 @@
1744744448,1744745471,CN
1744745472,1744747519,NP
1744747520,1744748543,CN
-1744748544,1744749055,JP
1744749056,1744749567,NZ
1744749568,1744749823,CN
1744749824,1744750591,AU
@@ -34973,7 +36371,11 @@
1747219456,1747220479,CA
1747220480,1747227647,US
1747227648,1747228671,CA
-1747228672,1747256319,US
+1747228672,1747235839,US
+1747235840,1747236863,CA
+1747236864,1747255807,US
+1747255808,1747256063,CN
+1747256064,1747256319,US
1747256320,1747256575,IE
1747256576,1747256831,AU
1747256832,1747257087,AE
@@ -34989,11 +36391,30 @@
1747276800,1747283967,US
1747283968,1747284991,CA
1747284992,1747293183,US
+1747293184,1747294207,CA
1747294208,1747304447,US
1747304448,1747308543,CA
1747308544,1747316735,US
1747316736,1747317759,CA
-1747317760,1753251839,US
+1747317760,1747801855,US
+1747801856,1747802111,IE
+1747802112,1749061631,US
+1749061632,1749069823,NL
+1749069824,1749094399,US
+1749094400,1749098495,NL
+1749098496,1749172223,US
+1749172224,1749188607,NL
+1749188608,1749196799,US
+1749196800,1749204991,NL
+1749204992,1749213183,US
+1749213184,1749229567,NL
+1749229568,1749327871,US
+1749327872,1749344255,NL
+1749344256,1749372927,US
+1749372928,1749381119,NL
+1749381120,1749590015,US
+1749590016,1749598207,NL
+1749598208,1753251839,US
1753251840,1753252095,MN
1753252096,1753252351,SY
1753252352,1753252607,BY
@@ -35021,7 +36442,9 @@
1753483264,1753483519,IE
1753483520,1753486335,US
1753486336,1753486591,IN
-1753486592,1754136575,US
+1753486592,1753735167,US
+1753735168,1753743359,IE
+1753743360,1754136575,US
1754136576,1754169343,CA
1754169344,1754206719,US
1754206720,1754206975,GW
@@ -35030,7 +36453,11 @@
1754207488,1754207743,KI
1754207744,1754207999,MM
1754208000,1754208255,VU
-1754208256,1754208511,NA
+1754208256,1754208326,NA
+1754208327,1754208327,AO
+1754208328,1754208353,NA
+1754208354,1754208354,AO
+1754208355,1754208511,NA
1754208512,1754208767,DJ
1754208768,1754209023,BF
1754209024,1754209279,BW
@@ -35038,9 +36465,12 @@
1754209536,1754209791,BR
1754209792,1754210047,AR
1754210048,1754210303,BJ
-1754210304,1754251519,US
+1754210304,1754230783,US
+1754234880,1754251519,US
1754251520,1754251775,LY
-1754251776,1754252543,US
+1754251776,1754252031,US
+1754252032,1754252287,MR
+1754252288,1754252543,US
1754252544,1754252799,MZ
1754252800,1754253055,US
1754253056,1754253311,GN
@@ -35067,18 +36497,19 @@
1754258432,1754258687,MG
1754258688,1754258943,US
1754258944,1754259199,TN
-1754259200,1754792959,US
+1754259200,1754333183,US
+1754333184,1754337279,CA
+1754337280,1754792959,US
1754792960,1754793983,CA
1754793984,1754799103,US
1754799104,1754800127,CA
-1754800128,1754804223,US
-1754805248,1754822655,US
+1754800128,1754822655,US
1754822656,1754823679,CA
1754823680,1754830847,US
1754830848,1754831871,CA
1754831872,1754832895,US
-1754832896,1754836991,CA
-1754836992,1754845183,US
+1754832896,1754835967,CA
+1754835968,1754845183,US
1754845184,1754846207,CA
1754846208,1754849279,US
1754849280,1754850303,CA
@@ -35088,9 +36519,18 @@
1754863616,1754864639,CA
1754864640,1754869759,US
1754869760,1754870783,CA
+1754870784,1754871807,US
+1754871808,1754872831,CA
1754872832,1754890239,US
1754890240,1754892287,BB
-1754923008,1755062271,US
+1754892288,1754894335,CA
+1754894336,1754899455,US
+1754899456,1754900479,CA
+1754900480,1754911743,US
+1754911744,1754912767,CA
+1754912768,1754920959,US
+1754920960,1754921983,DM
+1754921984,1755062271,US
1755062272,1755066367,CA
1755066368,1755070463,US
1755070464,1755074559,CA
@@ -35126,14 +36566,458 @@
1755111168,1755111423,SD
1755111424,1755119615,US
1755119616,1755283455,CA
-1755283456,1755324415,US
-1755324416,1755328511,CA
-1755340800,1755348991,US
-1755357184,1755365375,US
-1755381760,1755512831,US
-1755512832,1755545599,CA
-1755578368,1755709439,US
-1762656256,1763704831,MU
+1755283456,1755365375,US
+1755365376,1755373567,CA
+1755373568,1755512831,US
+1755512832,1755578367,CA
+1755578368,1755717631,US
+1755717632,1755721727,BS
+1755721728,1755734271,US
+1755734272,1755734527,LB
+1755734528,1755734783,BS
+1755734784,1755735295,US
+1755735296,1755735551,KE
+1755735552,1755735807,MA
+1755735808,1755736063,CN
+1755736064,1755736319,US
+1755736320,1755736575,MX
+1755736576,1755736831,AW
+1755736832,1755737087,US
+1755737088,1755737343,GH
+1755737344,1755737599,IN
+1755737600,1755737855,MO
+1755737856,1755738111,MT
+1755738112,1755738367,QA
+1755738368,1755738623,YE
+1755738624,1755738879,GR
+1755738880,1755739135,US
+1755739136,1755739391,BH
+1755739392,1755739647,CO
+1755739648,1755739903,OM
+1755739904,1755740159,BN
+1755740160,1755740415,SC
+1755740416,1755740671,SY
+1755740672,1755741183,US
+1755741184,1755741439,PA
+1755741440,1755741695,BZ
+1755741696,1755741951,IM
+1755741952,1755742207,NG
+1755742208,1755799551,US
+1755799552,1755807743,CA
+1755807744,1755824127,US
+1755824128,1755824383,TV
+1755824384,1755824639,SY
+1755824640,1755824895,ZW
+1755824896,1755825151,TG
+1755825152,1755825407,GM
+1755825408,1755825663,AO
+1755825664,1755825919,LB
+1755825920,1755826175,MW
+1755826176,1755826431,CV
+1755826432,1755826687,TZ
+1755826688,1755826943,KM
+1755826944,1755827199,MN
+1755827200,1755827455,CG
+1755827456,1755827711,FM
+1755827712,1755827967,SB
+1755827968,1755828223,BI
+1755828224,1755828479,CD
+1755828480,1755828735,NE
+1755828736,1755828991,NP
+1755828992,1755829247,PK
+1755829248,1755829503,KZ
+1755829504,1755829759,OM
+1755829760,1755830015,CN
+1755830016,1755830271,ST
+1755830272,1755830527,LR
+1755830528,1755830783,JP
+1755830784,1755831039,SD
+1755831040,1755831295,MU
+1755831296,1755831551,GQ
+1755831552,1755831807,MK
+1755831808,1755832063,TL
+1755832064,1755832319,ML
+1755832320,1755832575,DZ
+1755832576,1755832831,MM
+1755832832,1755833087,NR
+1755833088,1755833343,SA
+1755833344,1755833599,IN
+1755833600,1755833855,BY
+1755833856,1755834111,SZ
+1755834112,1755834367,CN
+1755834368,1755834623,TN
+1755834624,1755834879,AS
+1755834880,1755835135,PG
+1755835136,1755835391,PR
+1755835392,1755835647,BA
+1755835648,1755835903,LS
+1755835904,1755836159,GN
+1755836160,1755836415,FJ
+1755836416,1755836671,MH
+1755836672,1755836927,SL
+1755836928,1755837183,LK
+1755837184,1755837439,MG
+1755837440,1755837695,ME
+1755837696,1755837951,MR
+1755837952,1755838207,SO
+1755838208,1755838463,UA
+1755838464,1755838719,LY
+1755838720,1755838975,TO
+1755838976,1755839231,TD
+1755839232,1755839487,MZ
+1755839488,1755839743,ZM
+1755839744,1755839999,ER
+1755840000,1755840255,AL
+1755840256,1755840511,RU
+1755840512,1756049407,US
+1756049408,1756053503,CA
+1756053504,1756066719,US
+1756066720,1756066751,RO
+1756066752,1756086271,US
+1756086272,1756090367,CA
+1756090368,1757417471,US
+1757417472,1757419519,CA
+1757419520,1757424639,US
+1757424640,1757425663,CA
+1757425664,1757426687,US
+1757426688,1757427711,CA
+1757427712,1757432831,US
+1757433856,1757443071,US
+1757443072,1757446143,CA
+1757446144,1757447167,US
+1757447168,1757448191,CA
+1757448192,1757450239,US
+1757450240,1757451263,CA
+1757451264,1757452287,US
+1757452288,1757453311,CA
+1757453312,1757457407,US
+1757457408,1757458431,CA
+1757458432,1757460479,US
+1757460480,1757462527,VI
+1757462528,1757472767,US
+1757472768,1757473791,CA
+1757473792,1757487103,US
+1757487104,1757489151,CA
+1757489152,1757491199,US
+1757491200,1757497343,CA
+1757497344,1757502463,US
+1757502464,1757503487,CA
+1757503488,1757505535,US
+1757505536,1757506559,CA
+1757506560,1757512703,US
+1757512704,1757513727,CA
+1757513728,1757522943,US
+1757522944,1757523967,CA
+1757523968,1757529087,US
+1757529088,1757530111,AI
+1757530112,1757532159,US
+1757532160,1757534207,CA
+1757534208,1757543295,US
+1757543296,1757543327,AU
+1757543328,1757552639,US
+1757552640,1757560831,CA
+1757560832,1757597695,US
+1757597696,1757599743,GB
+1757599744,1757642751,US
+1757642752,1757675519,CA
+1757675520,1757937663,US
+1757937664,1757941759,CA
+1757941760,1757958143,US
+1757958144,1757962239,CA
+1757962240,1757966335,BB
+1757966336,1758265343,US
+1758265344,1758330879,CA
+1758330880,1758412799,US
+1758412800,1758413055,BG
+1758413056,1758413311,SE
+1758413312,1758413567,PS
+1758413568,1758414335,US
+1758414336,1758414591,LV
+1758414592,1758414847,IN
+1758414848,1758415103,GD
+1758415104,1758415359,GB
+1758415360,1758415615,FR
+1758415616,1758415871,CY
+1758415872,1758416127,IT
+1758416128,1758416383,US
+1758416384,1758416639,CF
+1758416640,1758416895,IL
+1758416896,1758417151,VC
+1758417152,1758417407,ID
+1758417408,1758417663,CL
+1758417664,1758417919,HK
+1758417920,1758418175,DE
+1758418176,1758418431,RU
+1758418432,1758418687,CN
+1758418688,1758418943,BL
+1758418944,1758419199,US
+1758419200,1758419455,CR
+1758419456,1758419711,EG
+1758419712,1758419967,VE
+1758419968,1758420223,US
+1758420224,1758420479,HU
+1758420480,1758420735,CH
+1758420736,1758420991,MM
+1758420992,1759128575,US
+1759128576,1759129599,CA
+1759129600,1759131647,US
+1759131648,1759133695,CA
+1759133696,1759138815,US
+1759138816,1759139839,CA
+1759139840,1759140863,US
+1759140864,1759141887,CA
+1759141888,1759149055,US
+1759149056,1759150079,CA
+1759150080,1759160319,US
+1759160320,1759162367,BM
+1759162368,1759163391,BB
+1759163392,1759166463,US
+1759166464,1759167487,CA
+1759167488,1759172607,US
+1759172608,1759173631,VC
+1759173632,1759178751,US
+1759178752,1759179775,PR
+1759179776,1759184895,US
+1759184896,1759186943,CA
+1759186944,1759188991,US
+1759188992,1759190015,VC
+1759190016,1759191039,PR
+1759191040,1759201279,US
+1759201280,1759202303,VG
+1759202304,1759208447,US
+1759208448,1759209471,CA
+1759209472,1759212543,US
+1759212544,1759217663,CA
+1759217664,1759222783,US
+1759222784,1759223807,CA
+1759223808,1759230975,US
+1759230976,1759233023,CA
+1759233024,1759234047,US
+1759234048,1759236095,CA
+1759236096,1759239167,US
+1759239168,1759240191,CA
+1759240192,1759313919,US
+1759313920,1759346687,CA
+1759346688,1759408127,US
+1759408128,1759412223,CA
+1759412224,1759412991,US
+1759412992,1759413247,AU
+1759413248,1759414271,US
+1759414272,1759414527,SE
+1759414528,1759415295,US
+1759415296,1759415551,SG
+1759415552,1759416575,US
+1759416576,1759416831,HK
+1759416832,1759417599,US
+1759417600,1759417855,FR
+1759417856,1759419391,US
+1759419392,1759419647,MX
+1759419648,1759428607,US
+1759428608,1759428863,LB
+1759428864,1759429119,US
+1759429120,1759429375,LK
+1759429376,1759429631,MO
+1759429632,1759429887,CN
+1759429888,1759430143,DK
+1759430144,1759430399,QA
+1759430400,1759430655,BA
+1759430656,1759430911,AR
+1759430912,1759431167,MX
+1759431168,1759431423,AW
+1759431424,1759431679,BZ
+1759431680,1759431935,BS
+1759431936,1759432191,IN
+1759432192,1759432447,HR
+1759432448,1759432703,OM
+1759432704,1759432959,PK
+1759432960,1759433215,PS
+1759433216,1759433471,SA
+1759433472,1759433983,US
+1759433984,1759434239,MA
+1759434240,1759434495,DE
+1759434496,1759434751,JP
+1759434752,1759435007,SY
+1759435008,1759435263,US
+1759435264,1759435519,HK
+1759435520,1759435775,IQ
+1759435776,1759436031,KE
+1759436032,1759436287,AE
+1759436288,1759510527,US
+1759510528,1759510783,VE
+1759510784,1759511039,AG
+1759511040,1759511295,GT
+1759511296,1759511551,VC
+1759511552,1759511807,PY
+1759511808,1759512063,JM
+1759512064,1759512319,MS
+1759512320,1759512575,GD
+1759512576,1759512831,LC
+1759512832,1759513087,HT
+1759513088,1759513343,EC
+1759513344,1759513599,KN
+1759513600,1759513855,SR
+1759513856,1759514111,NI
+1759514112,1759514367,BB
+1759514368,1759514623,PE
+1759514624,1759514879,KY
+1759514880,1759515135,TT
+1759515136,1759515391,GY
+1759515392,1759515647,BO
+1759515648,1759515903,CU
+1759515904,1759516159,DM
+1759516160,1759516415,SH
+1759516416,1759516671,BM
+1759516672,1759516927,FJ
+1759516928,1759517183,HN
+1759517184,1759517439,GL
+1759517440,1759517695,MQ
+1759517696,1759517951,GF
+1759517952,1759518207,MF
+1759518208,1759518463,BZ
+1759518464,1759518719,GP
+1759518720,1759518975,AW
+1759518976,1759519231,AI
+1759519232,1759519487,BL
+1759519488,1759519743,CO
+1759519744,1759519999,TC
+1759520000,1759520255,VG
+1759520256,1759520511,AX
+1759520512,1759520767,UM
+1759520768,1759521023,SV
+1759521024,1759521279,TK
+1759521280,1759521535,SJ
+1759521536,1759521791,PM
+1759521792,1759522047,GS
+1759522048,1759522303,DO
+1759522304,1759522559,RE
+1759522560,1759522815,PN
+1759522816,1759523071,MP
+1759523072,1759523327,NF
+1759523328,1759523583,US
+1759523584,1759523839,NU
+1759523840,1759524095,NC
+1759524096,1759524351,NL
+1759524352,1759524607,CX
+1759524608,1759524863,BS
+1759524864,1759525119,PF
+1759525120,1759525375,CK
+1759525376,1759525631,TF
+1759525632,1759525887,FK
+1759525888,1759526143,GG
+1759526144,1759526399,CC
+1759526400,1759526655,JE
+1759526656,1759526911,FO
+1759526912,1759535103,US
+1759535104,1759543295,CA
+1759543296,1759547391,US
+1759547392,1759549439,NL
+1759549440,1759552511,US
+1759552512,1759555583,CA
+1759555584,1760047103,US
+1760047104,1760051199,CA
+1760051200,1760063487,US
+1760067584,1760092159,US
+1760100352,1760116735,US
+1760116736,1760133119,CA
+1760133120,1760165887,US
+1760165888,1760231423,CA
+1760231424,1760383743,US
+1760383744,1760383999,MO
+1760384000,1760384255,GB
+1760384256,1760384511,BZ
+1760384512,1760384767,US
+1760384768,1760385023,KE
+1760385024,1760385279,US
+1760385280,1760385535,SG
+1760385536,1760385791,US
+1760385792,1760386047,HK
+1760386048,1760386303,US
+1760386304,1760386559,GB
+1760386560,1760386815,US
+1760386816,1760387071,HK
+1760387072,1760391167,US
+1760395264,1760657407,US
+1760657408,1760673791,CA
+1760673792,1760690175,US
+1760690176,1760755711,CA
+1760755712,1760776191,US
+1760776192,1760784383,CA
+1760784384,1760817151,US
+1760817152,1760817407,MO
+1760817408,1760817663,BZ
+1760817664,1760817919,BS
+1760817920,1760818175,PA
+1760818176,1760818431,AR
+1760818432,1760818687,MX
+1760818688,1760818943,AW
+1760818944,1760819199,SE
+1760819200,1760819455,ES
+1760819456,1760819711,GB
+1760819712,1760819967,MA
+1760819968,1760820223,HK
+1760820224,1760820479,JP
+1760820480,1760820735,CA
+1760820736,1760837631,US
+1760837632,1760839679,CA
+1760839680,1760867327,US
+1760867328,1760868351,PR
+1760868352,1760869375,US
+1760869376,1760870399,CA
+1760870400,1760871423,US
+1760871424,1760872447,CA
+1760874496,1760878591,US
+1760878592,1760880639,JM
+1760880640,1760883711,US
+1760883712,1760884735,CA
+1760884736,1760886783,US
+1760886784,1760888831,CA
+1760888832,1760899071,US
+1760899072,1760900095,GD
+1760900096,1760901119,US
+1760903168,1760904191,CA
+1760904192,1760909311,US
+1760909312,1760910335,VG
+1760910336,1760911359,GD
+1760911360,1760923647,US
+1760923648,1760924671,CA
+1760924672,1760925695,US
+1760925696,1760929791,CA
+1760929792,1760937983,US
+1760937984,1760939007,CA
+1760939008,1760940031,DM
+1760940032,1760944127,US
+1760944128,1760945151,CA
+1760945152,1760985087,US
+1760985088,1761017855,CA
+1761017856,1761075199,US
+1761075200,1761083391,CA
+1761083392,1761181695,US
+1761181696,1761181951,MX
+1761181952,1761198079,US
+1761198080,1761214463,CA
+1761214464,1761222655,GP
+1761222656,1761230847,US
+1761230848,1761239039,CA
+1761239040,1761279999,US
+1761284096,1761288191,US
+1761288192,1761292287,CA
+1761292288,1761304575,US
+1761304576,1761308671,CA
+1761308672,1761478655,US
+1761478656,1761479679,CA
+1761479680,1761484799,US
+1761484800,1761485823,CA
+1761485824,1761488895,US
+1761488896,1761489919,CA
+1761489920,1761495039,US
+1761497088,1761499135,US
+1761499136,1761501183,CA
+1761501184,1761502207,VG
+1761502208,1761509375,US
+1761607680,1762656255,ZA
+1762656256,1763000335,MU
+1763000336,1763000339,UG
+1763000340,1763704831,MU
1763704832,1764753407,EG
1764753408,1765801983,KE
1765801984,1766850559,MA
@@ -35194,8 +37078,8 @@
1793064960,1794113535,CN
1794113536,1795162111,KR
1795162112,1795387903,US
-1795387904,1795388159,CA
-1795388160,1795555839,US
+1795387904,1795388287,CA
+1795388288,1795555839,US
1795555840,1795555855,CA
1795555856,1795556351,US
1795556352,1795556607,CA
@@ -35229,7 +37113,27 @@
1795593728,1795595775,NL
1795595776,1795596287,US
1795596288,1795603455,NL
-1795603456,1805049855,US
+1795603456,1796253695,US
+1796253696,1796253951,CA
+1796253952,1796257919,US
+1796257920,1796258047,PR
+1796258048,1796262911,US
+1796262912,1796263167,PR
+1796263168,1796325375,US
+1796325376,1796325631,PR
+1796325632,1796402431,US
+1796402432,1796402559,CA
+1796402560,1796403199,US
+1796403200,1796403327,CA
+1796403328,1796404095,US
+1796404096,1796404223,CA
+1796404224,1796404735,US
+1796404736,1796404863,CA
+1796404864,1796406655,US
+1796406656,1796406783,CA
+1796406784,1805000058,US
+1805000059,1805000059,CA
+1805000060,1805049855,US
1805049856,1805058047,CA
1805058048,1805144063,US
1805144064,1805148159,CA
@@ -35243,7 +37147,20 @@
1805190400,1805190655,ES
1805190656,1805210623,US
1805210624,1805210879,EG
-1805210880,1805582335,US
+1805210880,1805251583,US
+1805251584,1805251839,DE
+1805251840,1805252095,GB
+1805252096,1805252351,DE
+1805252352,1805252607,GB
+1805252608,1805252863,DE
+1805252864,1805253119,GB
+1805253120,1805253375,DE
+1805253376,1805253631,GB
+1805253632,1805253887,DE
+1805253888,1805254143,GB
+1805254144,1805254399,DE
+1805254400,1805254655,GB
+1805254656,1805582335,US
1805582336,1805647871,CA
1805647872,1805713407,US
1805713408,1805717503,CA
@@ -35257,7 +37174,12 @@
1805752576,1805753087,CA
1805753088,1805754111,US
1805754112,1805754367,CA
-1805754368,1806174207,US
+1805754368,1806172159,US
+1806172160,1806172415,DE
+1806172416,1806172671,GB
+1806172672,1806172927,DE
+1806172928,1806173183,GB
+1806173184,1806174207,US
1806174208,1806174463,BR
1806174464,1806205183,US
1806205184,1806205439,CA
@@ -35271,18 +37193,21 @@
1807056896,1807057151,AU
1807057152,1807057663,US
1807057664,1807057919,GB
-1807057920,1807597567,US
+1807057920,1807548415,US
+1807548416,1807548927,LU
+1807548928,1807597567,US
1807597568,1807646719,CA
1807646720,1807655679,US
1807655680,1807655935,IE
-1807655936,1807656191,LR
-1807656192,1807656447,CZ
+1807655936,1807656447,US
1807656448,1807656703,NL
1807656704,1807657983,US
1807657984,1807658239,SG
1807658240,1807658495,GB
1807658496,1807658751,BS
-1807658752,1807695871,US
+1807658752,1807691263,US
+1807691264,1807691519,CA
+1807691520,1807695871,US
1807695872,1807699967,VI
1807699968,1807707311,US
1807707312,1807707312,JP
@@ -35312,12 +37237,20 @@
1815966976,1815967231,US
1815967232,1815967487,CA
1815967488,1815968255,US
-1815968256,1815968511,FR
-1815968512,1815968639,US
-1815968640,1815968767,FR
+1815968256,1815968767,FR
1815968768,1815969279,US
1815969280,1815969791,JP
-1815969792,1815987199,US
+1815969792,1815977983,US
+1815977984,1815979007,JP
+1815979008,1815980031,NL
+1815980032,1815980543,AU
+1815980544,1815981055,DE
+1815981056,1815982079,GB
+1815982080,1815982591,FR
+1815982592,1815983103,DE
+1815983104,1815984127,JP
+1815984128,1815984639,AU
+1815984640,1815987199,US
1815987200,1815987711,GB
1815987712,1815988223,NL
1815988224,1815988735,JP
@@ -35336,7 +37269,9 @@
1815996160,1815996415,CA
1815996416,1815997695,US
1815997696,1815997951,FR
-1815997952,1816001791,US
+1815997952,1816001279,US
+1816001280,1816001535,AU
+1816001536,1816001791,US
1816001792,1816002559,NL
1816002560,1816068095,US
1816068096,1816133631,CA
@@ -35360,23 +37295,26 @@
1822553856,1822554111,HK
1822554112,1822572543,US
1822572544,1822605311,CA
-1822605312,1822609407,US
-1822609408,1822609535,SG
-1822609536,1822611487,US
-1822611488,1822611551,CA
-1822611552,1822611967,US
-1822611968,1822612479,CA
-1822612480,1822614015,US
+1822605312,1822611514,US
+1822611515,1822611515,CA
+1822611516,1822614015,US
1822614016,1822614271,JP
1822614272,1822614783,US
1822614784,1822615039,FR
-1822615040,1822617855,US
+1822615040,1822615295,NO
+1822615296,1822617855,US
1822617856,1822618367,CA
-1822618368,1822618879,US
-1822618880,1822619391,CA
-1822619392,1822619903,US
-1822619904,1822620415,AU
-1822620416,1822654463,US
+1822618368,1822619135,US
+1822619136,1822619391,CA
+1822619392,1822619647,US
+1822619648,1822620415,AU
+1822620416,1822620927,US
+1822620928,1822621247,NO
+1822621248,1822621249,US
+1822621250,1822621250,NO
+1822621251,1822621263,US
+1822621264,1822621264,NO
+1822621265,1822654463,US
1822654464,1822662143,CA
1822662144,1822662399,US
1822662400,1822670847,CA
@@ -35389,7 +37327,9 @@
1823170560,1823178751,US
1823178752,1823179007,GB
1823179008,1823179263,DE
-1823179264,1823186687,US
+1823179264,1823180287,US
+1823180288,1823180543,AU
+1823180544,1823186687,US
1823186688,1823186943,IN
1823186944,1823211519,US
1823211520,1823342591,CA
@@ -35422,9 +37362,7 @@
1831862272,1832124415,PT
1832124416,1832386559,IT
1832386560,1832517631,DK
-1832517632,1832582655,SE
-1832582656,1832582911,DK
-1832582912,1832583167,SE
+1832517632,1832583167,SE
1832583168,1832648703,DK
1832648704,1832681471,HR
1832681472,1832714239,RU
@@ -35433,26 +37371,12 @@
1832779776,1832780031,FR
1832780032,1832780287,MQ
1832780288,1832780799,FR
-1832780800,1832781567,MQ
-1832781568,1832782335,FR
-1832782336,1832783103,MQ
-1832783104,1832783359,FR
-1832783360,1832783615,MQ
-1832783616,1832783871,FR
+1832780800,1832781311,MQ
+1832781312,1832783871,FR
1832783872,1832784639,GP
-1832784640,1832785151,FR
-1832785152,1832785407,GP
-1832785408,1832785663,FR
-1832785664,1832785919,GP
-1832785920,1832787199,FR
-1832787200,1832787455,GF
-1832787456,1832788735,FR
-1832788736,1832788991,RE
-1832788992,1832789503,FR
-1832789504,1832790015,RE
-1832790016,1832791039,FR
-1832791040,1832791295,YT
-1832791296,1832791551,FR
+1832784640,1832786943,FR
+1832786944,1832787455,GF
+1832787456,1832791551,FR
1832791552,1832791807,YT
1832791808,1832794879,FR
1832794880,1832795135,GP
@@ -35460,15 +37384,17 @@
1832796416,1832796671,RE
1832796672,1832796927,FR
1832796928,1832797183,GP
-1832797184,1832798975,FR
-1832798976,1832799743,GP
-1832799744,1832801535,FR
-1832801536,1832802047,MQ
-1832802048,1832802559,FR
+1832797184,1832798463,FR
+1832798464,1832798719,GP
+1832798720,1832798975,FR
+1832798976,1832799231,GP
+1832799232,1832799743,FR
+1832799744,1832799999,GP
+1832800000,1832802559,FR
1832802560,1832802815,MQ
-1832802816,1832803839,FR
-1832803840,1832804351,MQ
-1832804352,1832812543,FR
+1832802816,1832803327,FR
+1832803328,1832803839,MQ
+1832803840,1832812543,FR
1832812544,1832845311,RU
1832845312,1832878079,BH
1832878080,1832878412,RU
@@ -35561,8 +37487,8 @@
1833357312,1833357587,GB
1833357588,1833357631,IE
1833357632,1833357823,GB
-1833357824,1833358079,IE
-1833358080,1833359359,GB
+1833357824,1833357903,IE
+1833357904,1833359359,GB
1833359360,1833361407,DE
1833361408,1833363455,GB
1833363456,1833365503,RU
@@ -35583,9 +37509,7 @@
1833398272,1833400319,DE
1833400320,1833402367,GB
1833402368,1833406463,FR
-1833406464,1833406719,GB
-1833406720,1833406975,LV
-1833406976,1833408511,GB
+1833406464,1833408511,GB
1833410560,1833412607,LU
1833412608,1833414655,GB
1833414656,1833416703,RU
@@ -35605,7 +37529,9 @@
1833455616,1833459711,NL
1833459712,1833463807,ME
1833463808,1833467903,UA
-1833467904,1833471999,CH
+1833467904,1833468579,CH
+1833468580,1833468580,RU
+1833468581,1833471999,CH
1833472000,1833473023,NL
1833474048,1833475071,UA
1833476096,1833484287,NL
@@ -35628,14 +37554,16 @@
1833542912,1833543167,GB
1833543168,1833543423,IN
1833543424,1833544959,GB
-1833544960,1833545087,IN
+1833544960,1833545001,IN
+1833545002,1833545002,GB
+1833545003,1833545087,IN
1833545088,1833545215,GB
1833545216,1833545471,NL
1833545472,1833545727,GB
1833545728,1833549823,IT
1833549824,1833553919,RU
1833553920,1833558015,CZ
-1833558016,1833562111,RO
+1833558016,1833562111,US
1833562112,1833566207,PS
1833566208,1833570303,SE
1833570304,1833571583,NL
@@ -35758,7 +37686,9 @@
1835909120,1835911167,RS
1835911168,1835913215,DE
1835913216,1835917311,RU
-1835917312,1835917855,GB
+1835917312,1835917783,GB
+1835917784,1835917791,IT
+1835917792,1835917855,GB
1835917856,1835917863,IT
1835917864,1835917919,GB
1835917920,1835917935,IT
@@ -35766,9 +37696,9 @@
1835918440,1835918447,IT
1835918448,1835918519,GB
1835918520,1835918527,IT
-1835918528,1835918599,GB
-1835918600,1835918607,IT
-1835918608,1835918711,GB
+1835918528,1835918679,GB
+1835918680,1835918687,IT
+1835918688,1835918711,GB
1835918712,1835918719,IT
1835918720,1835918735,GB
1835918736,1835918743,IT
@@ -35776,9 +37706,7 @@
1835918824,1835918831,IT
1835918832,1835918847,GB
1835918848,1835918855,IT
-1835918856,1835919095,GB
-1835919096,1835919103,IT
-1835919104,1835919127,GB
+1835918856,1835919127,GB
1835919128,1835919135,IT
1835919136,1835919151,GB
1835919152,1835919159,IT
@@ -35786,41 +37714,39 @@
1835919752,1835919759,IT
1835919760,1835920479,GB
1835920480,1835920487,IT
-1835920488,1835921047,GB
-1835921048,1835921055,IT
-1835921056,1835921119,GB
+1835920488,1835920519,GB
+1835920520,1835920527,IT
+1835920528,1835920991,GB
+1835920992,1835920999,IT
+1835921000,1835921119,GB
1835921120,1835921127,IT
1835921128,1835921343,GB
1835921344,1835921351,IT
-1835921352,1835921463,GB
-1835921464,1835921471,IT
-1835921472,1835921711,GB
+1835921352,1835921711,GB
1835921712,1835921719,IT
1835921720,1835922415,GB
1835922416,1835922423,IT
-1835922424,1835922455,GB
-1835922456,1835922463,IT
-1835922464,1835922559,GB
+1835922424,1835922559,GB
1835922560,1835922567,IT
1835922568,1835922647,GB
1835922648,1835922655,IT
-1835922656,1835923351,GB
+1835922656,1835922671,GB
+1835922672,1835922679,IT
+1835922680,1835923007,GB
+1835923008,1835923015,IT
+1835923016,1835923351,GB
1835923352,1835923359,IT
-1835923360,1835923487,GB
-1835923488,1835923495,IT
-1835923496,1835923863,GB
-1835923864,1835923871,IT
-1835923872,1835924375,GB
+1835923360,1835923879,GB
+1835923880,1835923887,IT
+1835923888,1835924375,GB
1835924376,1835924383,IT
-1835924384,1835925503,GB
+1835924384,1835925159,GB
+1835925160,1835925167,IT
+1835925168,1835925503,GB
1835925504,1835933695,LV
1835933696,1835942399,RU
1835942400,1835942655,UA
-1835942656,1835947775,RU
-1835947776,1835948031,UA
-1835948032,1835949055,RU
-1835949056,1835949311,UA
-1835949312,1835950079,RU
+1835942656,1835950079,RU
1835950080,1835958271,LB
1835958272,1835966463,HU
1835966464,1835974655,IR
@@ -35837,51 +37763,56 @@
1836580864,1836597247,RU
1836597248,1836598271,LU
1836598272,1836605439,FR
-1836605440,1836612607,LU
-1836612608,1836613631,DE
+1836605440,1836611583,LU
+1836611584,1836613631,DE
1836613632,1836626943,RU
1836626944,1836627967,NL
1836627968,1836630015,RU
1836630016,1836646399,BG
1836646400,1836679167,RS
-1836679168,1836686335,BG
-1836686336,1836687359,GR
-1836687360,1836711935,BG
+1836679168,1836680703,BG
+1836680704,1836681215,MK
+1836681216,1836711935,BG
1836711936,1836728319,UA
1836728320,1836744703,RS
-1836744704,1836746495,FR
+1836744704,1836745983,FR
+1836745984,1836746239,RE
+1836746240,1836746495,FR
1836746496,1836747007,RE
-1836747008,1836747263,FR
-1836747264,1836748031,RE
-1836748032,1836748543,FR
-1836748544,1836748799,RE
-1836748800,1836749055,FR
-1836749056,1836749567,RE
-1836749568,1836750079,FR
-1836750080,1836750591,RE
+1836747008,1836750335,FR
+1836750336,1836750591,RE
1836750592,1836751103,FR
-1836751104,1836751615,RE
-1836751616,1836753151,FR
-1836753152,1836753407,RE
-1836753408,1836753919,FR
-1836753920,1836754687,RE
-1836754688,1836755455,FR
-1836755456,1836755711,RE
+1836751104,1836751359,RE
+1836751360,1836751871,FR
+1836751872,1836752127,RE
+1836752128,1836752639,FR
+1836752640,1836753151,RE
+1836753152,1836754175,FR
+1836754176,1836754431,RE
+1836754432,1836755199,FR
+1836755200,1836755711,RE
1836755712,1836755967,FR
1836755968,1836756223,RE
-1836756224,1836756479,FR
-1836756480,1836756991,RE
-1836756992,1836758015,FR
-1836758016,1836758527,RE
-1836758528,1836758783,FR
+1836756224,1836756735,FR
+1836756736,1836756991,RE
+1836756992,1836758783,FR
1836758784,1836759039,RE
1836759040,1836759551,FR
-1836759552,1836760575,RE
-1836760576,1836760831,FR
-1836760832,1836761087,RE
+1836759552,1836759807,RE
+1836759808,1836760063,FR
+1836760064,1836760831,RE
+1836760832,1836761087,FR
1836761088,1836777471,IR
1836777472,1836793855,SI
-1836793856,1836810239,GB
+1836793856,1836794567,GB
+1836794568,1836794587,FR
+1836794588,1836794588,GB
+1836794589,1836794592,FR
+1836794593,1836794594,GB
+1836794595,1836794595,FR
+1836794596,1836797951,GB
+1836797952,1836798207,DE
+1836798208,1836810239,GB
1836810240,1836826623,RU
1836826624,1836843007,CZ
1836843008,1836875775,RU
@@ -35940,8 +37871,12 @@
1840119808,1840152575,RU
1840152576,1840185343,GB
1840185344,1840218111,BA
-1840218112,1840316415,GB
-1840316416,1840381951,RO
+1840218112,1840232447,GB
+1840232448,1840232703,US
+1840232704,1840247007,GB
+1840247008,1840247023,NL
+1840247024,1840316415,GB
+1840316416,1840381951,AE
1840381952,1840447487,GR
1840447488,1840513023,NO
1840513024,1840644095,GB
@@ -35984,8 +37919,7 @@
1841669120,1841669375,PL
1841669376,1841669631,BE
1841669632,1841670143,UA
-1841670144,1841671935,PL
-1841671936,1841672191,GB
+1841670144,1841672191,PL
1841672192,1841674239,FR
1841674240,1841676287,PL
1841676288,1841680383,RU
@@ -36003,7 +37937,7 @@
1841758208,1841766399,PL
1841766400,1841774591,HU
1841774592,1841782783,PL
-1841782784,1841790975,RO
+1841782784,1841790975,US
1841790976,1841799167,BG
1841799168,1841807359,DE
1841807360,1841815551,NO
@@ -36025,7 +37959,7 @@
1841897472,1841905663,RO
1841905664,1841922047,RU
1841922048,1841924351,NL
-1841924352,1841924607,DE
+1841924352,1841924607,GB
1841924608,1841925887,NL
1841925888,1841926143,DE
1841926144,1841930239,NL
@@ -36044,28 +37978,23 @@
1842017024,1842017279,BE
1842017280,1842020351,GB
1842020352,1842028543,NO
-1842028544,1842036735,CH
+1842028544,1842029567,CH
+1842029568,1842030591,FR
+1842030592,1842036735,CH
1842036736,1842042879,FR
1842042880,1842044927,LU
1842044928,1842053119,GB
1842053120,1842069503,IR
1842069504,1842077695,RU
-1842077696,1842077951,FR
-1842077952,1842078207,MQ
-1842078208,1842078719,FR
-1842078720,1842078975,MQ
-1842078976,1842079487,FR
-1842079488,1842080767,MQ
+1842077696,1842078207,MQ
+1842078208,1842078463,FR
+1842078464,1842078975,MQ
+1842078976,1842079743,FR
+1842079744,1842080767,MQ
1842080768,1842081023,GP
-1842081024,1842081279,MQ
-1842081280,1842081535,GP
-1842081536,1842081791,MQ
-1842081792,1842082047,GP
-1842082048,1842082559,MQ
-1842082560,1842082815,GP
-1842082816,1842083071,MQ
-1842083072,1842083583,GP
-1842083584,1842084607,MQ
+1842081024,1842083071,MQ
+1842083072,1842083327,GP
+1842083328,1842084607,MQ
1842084608,1842084863,GP
1842084864,1842085887,MQ
1842085888,1842118655,GB
@@ -36102,7 +38031,9 @@
1842206720,1842208767,SE
1842208768,1842210815,GB
1842210816,1842212863,LT
-1842212864,1842214911,CZ
+1842212864,1842213631,CZ
+1842213632,1842213887,SK
+1842213888,1842214911,CZ
1842214912,1842216959,RU
1842216960,1842225151,RO
1842225152,1842233343,UA
@@ -36133,9 +38064,7 @@
1843478528,1843494911,SE
1843494912,1843511295,IR
1843511296,1843527679,RU
-1843527680,1843539199,IL
-1843539200,1843539455,FR
-1843539456,1843544063,IL
+1843527680,1843544063,IL
1843544064,1843560447,RU
1843560448,1843576831,DE
1843576832,1843593215,RU
@@ -36179,7 +38108,6 @@
1843955712,1843957759,IT
1843957760,1843959807,CZ
1843959808,1843961855,GB
-1843961856,1843962111,DE
1843963904,1843965951,DE
1843965952,1843967999,GB
1843968000,1843970047,RU
@@ -36224,9 +38152,7 @@
1844068352,1844070399,ES
1844070400,1844072447,LU
1844072448,1844076543,ES
-1844076544,1844077055,GB
-1844077056,1844077567,IE
-1844077568,1844078591,GB
+1844076544,1844078591,GB
1844078592,1844080639,DE
1844080640,1844082687,GE
1844082688,1844084735,DE
@@ -36282,9 +38208,7 @@
1844174848,1844178943,DE
1844178944,1844180991,EE
1844180992,1844183039,TR
-1844183040,1844185087,IT
-1844185088,1844187135,CH
-1844187136,1844191231,IT
+1844183040,1844191231,IT
1844191232,1844195327,AL
1844199424,1844203519,RU
1844203520,1844207615,NL
@@ -36348,7 +38272,8 @@
1844772864,1844838399,RS
1844838400,1844903935,GB
1844903936,1844969471,NO
-1844969472,1845035007,RU
+1844969472,1845034751,RU
+1845034752,1845035007,BY
1845035008,1845100543,GB
1845100544,1845166079,DE
1845166080,1845231615,UA
@@ -36387,9 +38312,7 @@
1847757824,1847758847,CN
1847758848,1847770111,TH
1847770112,1847771135,SG
-1847771136,1847780351,TH
-1847780352,1847780607,CN
-1847780608,1847783423,TH
+1847771136,1847783423,TH
1847783424,1847787519,US
1847787520,1847803903,KR
1847803904,1847807999,VN
@@ -36564,7 +38487,9 @@
1866858496,1866989567,TW
1866989568,1867513855,CN
1867513856,1867775999,TW
-1867776000,1867841535,TH
+1867776000,1867825151,TH
+1867825152,1867825663,MM
+1867825664,1867841535,TH
1867841536,1867907071,CN
1867907072,1868038143,JP
1868038144,1868103679,PK
@@ -36584,10 +38509,8 @@
1868300288,1868333055,IN
1868333056,1868341247,PK
1868341248,1868345343,ID
-1868345344,1868346111,GU
-1868346112,1868346367,AU
+1868345344,1868346367,GU
1868346368,1868347391,TH
-1868347392,1868348415,AU
1868348416,1868349439,KR
1868349440,1868357631,SG
1868357632,1868361727,HK
@@ -36676,8 +38599,7 @@
1883770880,1883783167,KR
1883783168,1883799551,VN
1883799552,1883832319,KR
-1883832320,1883833855,HK
-1883833856,1884028927,CN
+1883832320,1884028927,CN
1884028928,1884159999,KR
1884160000,1884164095,VN
1884164096,1884168191,TW
@@ -36725,9 +38647,7 @@
1888031232,1888034815,HK
1888034816,1888038911,JP
1888038912,1888040959,CN
-1888040960,1888041471,JP
-1888041472,1888041727,NZ
-1888041728,1888059391,JP
+1888040960,1888059391,JP
1888059392,1888063487,VN
1888063488,1888067583,JP
1888067584,1888071679,MY
@@ -36813,11 +38733,7 @@
1897267200,1897365503,VN
1897365504,1897398271,MY
1897398272,1897660415,CN
-1897660416,1897663487,HK
-1897663488,1897663743,GB
-1897663744,1897697279,HK
-1897697280,1897697535,AU
-1897697536,1897725951,HK
+1897660416,1897725951,HK
1897725952,1897730047,JP
1897730048,1897734143,AU
1897734144,1897738239,HK
@@ -36852,7 +38768,7 @@
1899273216,1899274239,JP
1899274240,1899282431,CN
1899282432,1899290623,KR
-1899290624,1899294719,AU
+1899292672,1899294719,AU
1899294720,1899298815,JP
1899298816,1899364351,TH
1899364352,1899724799,CN
@@ -36869,9 +38785,7 @@
1899850752,1899851775,VN
1899851776,1899855871,JP
1899855872,1899888639,TW
-1899888640,1902210559,CN
-1902210560,1902210815,MO
-1902210816,1904345087,CN
+1899888640,1904345087,CN
1904345088,1904361471,JP
1904361472,1904369663,KR
1904369664,1904375807,CN
@@ -36953,7 +38867,6 @@
1914601472,1914634239,KR
1914634240,1914642431,BD
1914642432,1914650623,KR
-1914652160,1914652415,MN
1914652672,1914654719,AU
1914654720,1914658815,JP
1914658816,1914660863,AU
@@ -37000,7 +38913,9 @@
1919918080,1919926271,CN
1919926272,1919942655,KR
1919942656,1919999999,CN
-1920000000,1920008191,HK
+1920000000,1920002047,HK
+1920002048,1920003071,CN
+1920003072,1920008191,HK
1920008192,1920057343,CN
1920057344,1920058111,HK
1920058112,1920072703,CN
@@ -37073,7 +38988,10 @@
1925640192,1925642239,ID
1925642240,1925644287,CN
1925644288,1925660671,KR
-1925660672,1925664767,HK
+1925660672,1925661439,TW
+1925661440,1925662207,HK
+1925662208,1925663743,TW
+1925663744,1925664767,HK
1925664768,1925677055,ID
1925677056,1926234111,KR
1926234112,1929379839,CN
@@ -37211,7 +39129,6 @@
1941438464,1941569535,IN
1941569536,1941618687,PK
1941618688,1941635071,AU
-1941635072,1941639167,IN
1941639168,1941643263,NP
1941643264,1941651455,IN
1941651456,1941655551,JP
@@ -37250,7 +39167,9 @@
1947205632,1948254207,CN
1948254208,1949302783,KR
1949302784,1949391103,HK
-1949391104,1949391359,CN
+1949391104,1949391116,CN
+1949391117,1949391117,HK
+1949391118,1949391359,CN
1949391360,1949433855,HK
1949433856,1949437951,CN
1949437952,1949439999,AU
@@ -37365,8 +39284,8 @@
1958830080,1958838271,JP
1958838272,1958842367,IN
1958842368,1958844415,NZ
-1958845440,1958845951,MY
-1958845952,1958846463,HK
+1958845440,1958845695,MY
+1958845696,1958846463,HK
1958846464,1958847487,IN
1958848512,1958850559,BD
1958850560,1958852607,CN
@@ -37382,9 +39301,7 @@
1959104512,1959106559,AU
1959106560,1959108607,JP
1959110656,1959112703,JP
-1959112704,1959113215,HK
-1959113216,1959113471,IN
-1959113472,1959114751,HK
+1959112704,1959114751,HK
1959114752,1959115007,IN
1959115008,1959116799,HK
1959116800,1959133183,SG
@@ -37462,7 +39379,11 @@
1964120064,1964122111,JP
1964122112,1964122367,SG
1964122368,1964122879,JP
-1964122880,1964126207,SG
+1964122880,1964123135,HK
+1964123136,1964123391,GB
+1964123392,1964123647,US
+1964123648,1964123903,CN
+1964123904,1964126207,SG
1964126208,1964126463,HK
1964126464,1964130303,SG
1964130304,1964134399,HK
@@ -37694,7 +39615,7 @@
1991442432,1991499775,BD
1991499776,1991507967,NC
1991507968,1991835647,CN
-1991835648,1991901183,SG
+1991835648,1991901183,IN
1991901184,1992097791,CN
1992097792,1992163327,SG
1992163328,1992818687,CN
@@ -37718,14 +39639,17 @@
1996634112,1996636159,AU
1996636160,1996644351,ID
1996644352,1996652543,BT
-1996652544,1997078527,CN
+1996652544,1996685311,CN
+1996685312,1996750847,HK
+1996750848,1997078527,CN
1997078528,1997094911,AU
1997094912,1997144063,HK
1997144064,1997176831,CN
1997176832,1997180927,AU
1997180928,1997185023,HK
1997185024,1997187071,JP
-1997187072,1997189119,HK
+1997187072,1997188095,HK
+1997188096,1997189119,BD
1997189120,1997191167,ID
1997191168,1997209599,JP
1997209600,1997242367,AU
@@ -37789,9 +39713,14 @@
1998569472,1998577663,CN
1998577664,1998579711,AU
1998579712,1998581759,SG
-1998581760,1998584319,KR
+1998581760,1998584063,KR
+1998584064,1998584319,IN
1998584320,1998584575,OM
-1998584576,1998585855,KR
+1998584576,1998584831,IN
+1998584832,1998585087,ZA
+1998585088,1998585343,KR
+1998585344,1998585599,JP
+1998585600,1998585855,KR
1998585856,1999130623,CN
1999130624,1999134719,BD
1999134720,1999136767,MN
@@ -37849,19 +39778,17 @@
2001559552,2001567743,KR
2001567744,2001600511,TW
2001600512,2001797119,CN
-2001797120,2001798047,SG
+2001797120,2001797647,SG
+2001797648,2001797663,US
+2001797664,2001798047,SG
2001798048,2001798079,US
2001798080,2001798087,SG
2001798088,2001798095,US
-2001798096,2001798787,SG
-2001798788,2001798791,AU
-2001798792,2001799687,SG
+2001798096,2001798407,SG
+2001798408,2001798415,US
+2001798416,2001799687,SG
2001799688,2001799695,US
-2001799696,2001799711,SG
-2001799712,2001799743,US
-2001799744,2001799807,SG
-2001799808,2001799935,US
-2001799936,2001799967,SG
+2001799696,2001799967,SG
2001799968,2001799971,US
2001799972,2001800391,SG
2001800392,2001800399,US
@@ -37875,27 +39802,19 @@
2001801136,2001801151,US
2001801152,2001801339,SG
2001801340,2001801343,US
-2001801344,2001801615,SG
-2001801616,2001801623,NL
-2001801624,2001801663,SG
-2001801664,2001801703,US
-2001801704,2001801711,SG
+2001801344,2001801711,SG
2001801712,2001801727,US
2001801728,2001801775,SG
-2001801776,2001801807,US
-2001801808,2001801919,SG
+2001801776,2001801791,US
+2001801792,2001801919,SG
2001801920,2001801935,US
2001801936,2001801983,SG
2001801984,2001801999,US
2001802000,2001802191,SG
2001802192,2001802199,US
-2001802200,2001802879,SG
-2001802880,2001803007,US
-2001803008,2001803215,SG
+2001802200,2001803215,SG
2001803216,2001803223,US
-2001803224,2001803647,SG
-2001803648,2001803679,US
-2001803680,2001803735,SG
+2001803224,2001803735,SG
2001803736,2001803743,US
2001803744,2001803839,SG
2001803840,2001803871,US
@@ -37907,11 +39826,17 @@
2001804016,2001804023,US
2001804024,2001805943,SG
2001805944,2001805951,US
-2001805952,2001809383,SG
+2001805952,2001806527,SG
+2001806528,2001806559,SA
+2001806560,2001806735,SG
+2001806736,2001806739,MY
+2001806740,2001807703,SG
+2001807704,2001807711,CA
+2001807712,2001809383,SG
2001809384,2001809391,US
-2001809392,2001810495,SG
-2001810496,2001810527,MY
-2001810528,2001810559,SG
+2001809392,2001810111,SG
+2001810112,2001810143,US
+2001810144,2001810559,SG
2001810560,2001810623,MY
2001810624,2001812127,SG
2001812128,2001812159,SA
@@ -37919,9 +39844,7 @@
2001812256,2001812263,US
2001812264,2001812671,SG
2001812672,2001812675,GB
-2001812676,2001813655,SG
-2001813656,2001813663,AU
-2001813664,2001813783,SG
+2001812676,2001813783,SG
2001813784,2001813791,IN
2001813792,2001814431,SG
2001814432,2001814439,US
@@ -37929,390 +39852,100 @@
2001814576,2001814583,US
2001814584,2001815191,SG
2001815192,2001815199,US
-2001815200,2001817079,SG
-2001817080,2001817087,US
-2001817088,2001818639,SG
+2001815200,2001818063,SG
+2001818064,2001818071,US
+2001818072,2001818215,SG
+2001818216,2001818223,US
+2001818224,2001818471,SG
+2001818472,2001818479,CA
+2001818480,2001818615,SG
+2001818616,2001818623,IN
+2001818624,2001818639,SG
2001818640,2001818647,US
-2001818648,2001818847,SG
-2001818848,2001818851,AU
-2001818852,2001819495,SG
-2001819496,2001819503,US
-2001819504,2001819887,SG
+2001818648,2001819335,SG
+2001819336,2001819343,TH
+2001819344,2001819703,SG
+2001819704,2001819711,US
+2001819712,2001819887,SG
2001819888,2001819895,IE
2001819896,2001819999,SG
2001820000,2001820031,IE
2001820032,2001820719,SG
2001820720,2001820727,CA
-2001820728,2001820991,SG
-2001820992,2001820999,US
-2001821000,2001821191,SG
-2001821192,2001821199,US
-2001821200,2001821335,SG
+2001820728,2001821335,SG
2001821336,2001821343,US
2001821344,2001821367,SG
2001821368,2001821375,US
-2001821376,2001821423,SG
-2001821424,2001821431,US
-2001821432,2001821439,SG
-2001821440,2001821447,US
-2001821448,2001821623,SG
-2001821624,2001821631,US
-2001821632,2001823007,SG
+2001821376,2001823007,SG
2001823008,2001823015,US
-2001823016,2001823447,SG
+2001823016,2001823303,SG
+2001823304,2001823311,US
+2001823312,2001823447,SG
2001823448,2001823455,US
-2001823456,2001824175,SG
+2001823456,2001823903,SG
+2001823904,2001823911,US
+2001823912,2001824175,SG
2001824176,2001824183,US
-2001824184,2001824287,SG
-2001824288,2001824295,US
-2001824296,2001824479,SG
-2001824480,2001824487,US
-2001824488,2001824495,SG
-2001824496,2001824503,KR
-2001824504,2001825183,SG
-2001825184,2001825215,US
-2001825216,2001825647,SG
-2001825648,2001825655,US
-2001825656,2001829891,SG
-2001829892,2001829903,US
-2001829904,2001830091,SG
-2001830092,2001830095,US
-2001830096,2001830175,SG
-2001830176,2001830191,US
-2001830192,2001830207,SG
-2001830208,2001830223,US
-2001830224,2001830335,SG
-2001830336,2001830351,US
-2001830352,2001830479,SG
-2001830480,2001830495,US
-2001830496,2001830567,SG
-2001830568,2001830575,US
-2001830576,2001830673,SG
-2001830674,2001830674,HK
-2001830675,2001830719,SG
-2001830720,2001830783,US
-2001830784,2001830927,SG
-2001830928,2001830935,US
-2001830936,2001830943,NL
-2001830944,2001830975,SG
-2001830976,2001830983,US
-2001830984,2001831007,SG
-2001831008,2001831015,US
-2001831016,2001831027,SG
-2001831028,2001831031,US
-2001831032,2001831163,SG
-2001831164,2001831167,US
-2001831168,2001831287,SG
-2001831288,2001831295,US
-2001831296,2001831331,SG
-2001831332,2001831335,US
-2001831336,2001831683,SG
-2001831684,2001831687,US
-2001831688,2001831691,SG
-2001831692,2001831703,US
-2001831704,2001831915,SG
-2001831916,2001831919,US
-2001831920,2001831943,SG
-2001831944,2001831951,US
-2001831952,2001831963,SG
-2001831964,2001831967,US
-2001831968,2001831992,SG
-2001831993,2001831993,US
-2001831994,2001832135,SG
-2001832136,2001832139,US
-2001832140,2001832147,SG
-2001832148,2001832151,US
-2001832152,2001832315,SG
-2001832316,2001832319,US
-2001832320,2001832443,SG
-2001832444,2001832447,US
-2001832448,2001832615,SG
-2001832616,2001832623,AZ
-2001832624,2001832751,SG
-2001832752,2001832759,IE
-2001832760,2001832879,SG
-2001832880,2001832887,US
-2001832888,2001832903,SG
-2001832904,2001832911,US
-2001832912,2001832951,SG
-2001832952,2001832955,US
-2001832956,2001833007,SG
+2001824184,2001824543,SG
+2001824544,2001824551,PH
+2001824552,2001826607,SG
+2001826608,2001826623,CA
+2001826624,2001826655,SG
+2001826656,2001826671,US
+2001826672,2001826831,SG
+2001826832,2001826863,US
+2001826864,2001826911,SG
+2001826912,2001826943,US
+2001826944,2001827103,SG
+2001827104,2001827111,CA
+2001827112,2001827407,SG
+2001827408,2001827415,US
+2001827416,2001827551,SG
+2001827552,2001827567,PH
+2001827568,2001828351,SG
+2001828352,2001828367,US
+2001828368,2001828383,SG
+2001828384,2001828399,AU
+2001828400,2001828831,SG
+2001828832,2001828863,US
+2001828864,2001828927,SG
+2001828928,2001828991,US
+2001828992,2001829375,SG
+2001829376,2001829439,US
+2001829440,2001829535,SG
+2001829536,2001829567,US
+2001829568,2001829887,SG
+2001829888,2001833007,HK
2001833008,2001833015,CN
-2001833016,2001833071,SG
-2001833072,2001833079,US
-2001833080,2001833099,SG
-2001833100,2001833103,US
-2001833104,2001833255,SG
-2001833256,2001833263,US
-2001833264,2001833419,SG
-2001833420,2001833421,US
-2001833422,2001833439,SG
-2001833440,2001833447,US
-2001833448,2001833487,SG
-2001833488,2001833495,US
-2001833496,2001833655,SG
-2001833656,2001833663,GB
-2001833664,2001833679,SG
-2001833680,2001833687,GB
-2001833688,2001833727,SG
-2001833728,2001833791,US
-2001833792,2001834096,SG
-2001834097,2001834097,US
-2001834098,2001834239,SG
-2001834240,2001834495,HK
-2001834496,2001834751,SG
-2001834752,2001834815,US
-2001834816,2001834935,SG
-2001834936,2001834943,JP
-2001834944,2001834947,US
-2001834948,2001835035,SG
-2001835036,2001835039,US
-2001835040,2001835103,SG
-2001835104,2001835135,US
-2001835136,2001835147,SG
-2001835148,2001835151,US
-2001835152,2001835231,SG
-2001835232,2001835239,US
-2001835240,2001835247,SG
-2001835248,2001835263,US
-2001835264,2001835515,SG
-2001835516,2001835519,US
-2001835520,2001835587,SG
-2001835588,2001835591,US
-2001835592,2001835711,SG
-2001835712,2001835719,US
-2001835720,2001835793,SG
-2001835794,2001835794,US
-2001835795,2001835795,SG
-2001835796,2001835799,US
-2001835800,2001835959,SG
-2001835960,2001835983,US
-2001835984,2001836107,SG
-2001836108,2001836111,US
-2001836112,2001836267,SG
-2001836268,2001836271,US
-2001836272,2001836291,SG
-2001836292,2001836295,US
-2001836296,2001836419,SG
-2001836420,2001836423,US
-2001836424,2001836427,SG
-2001836428,2001836431,US
-2001836432,2001836435,SG
-2001836436,2001836439,US
-2001836440,2001836451,SG
-2001836452,2001836455,US
-2001836456,2001836471,SG
-2001836472,2001836487,US
-2001836488,2001836506,SG
-2001836507,2001836507,US
-2001836508,2001836543,SG
-2001836544,2001838079,US
-2001838080,2001838627,SG
-2001838628,2001838631,US
-2001838632,2001838633,SG
-2001838634,2001838634,HK
-2001838635,2001838755,SG
-2001838756,2001838759,US
-2001838760,2001838763,SG
-2001838764,2001838767,US
-2001838768,2001838847,SG
-2001838848,2001839103,HK
-2001839104,2001839111,SG
-2001839112,2001839115,US
-2001839116,2001839535,SG
-2001839536,2001839543,US
-2001839544,2001839595,SG
-2001839596,2001839599,SA
-2001839600,2001839739,SG
-2001839740,2001839743,US
-2001839744,2001839775,SG
-2001839776,2001839783,US
-2001839784,2001839803,SG
-2001839804,2001839807,US
-2001839808,2001840057,SG
-2001840058,2001840059,SA
-2001840060,2001840071,SG
-2001840072,2001840079,US
-2001840080,2001840175,SG
-2001840176,2001840183,US
-2001840184,2001840767,SG
-2001840768,2001840799,US
-2001840800,2001841159,SG
-2001841160,2001841167,US
-2001841168,2001841175,SG
-2001841176,2001841176,US
-2001841177,2001841177,SA
-2001841178,2001841179,SG
-2001841180,2001841247,US
-2001841248,2001841279,SA
-2001841280,2001841311,SG
-2001841312,2001841319,US
-2001841320,2001841343,SG
-2001841344,2001841407,US
-2001841408,2001841639,SG
-2001841640,2001841647,US
-2001841648,2001842047,SG
-2001842048,2001842111,US
-2001842112,2001842175,SG
-2001842176,2001842271,US
-2001842272,2001842319,SG
-2001842320,2001842327,US
-2001842328,2001842343,SG
-2001842344,2001842351,US
-2001842352,2001842687,SG
-2001842688,2001842751,US
-2001842752,2001842783,SG
-2001842784,2001842815,US
-2001842816,2001843249,SG
-2001843250,2001843251,US
-2001843252,2001843471,SG
-2001843472,2001843475,US
-2001843476,2001843839,SG
-2001843840,2001843967,US
-2001843968,2001844127,SG
-2001844128,2001845247,US
-2001845248,2001845335,SG
-2001845336,2001845343,US
-2001845344,2001845359,SG
-2001845360,2001845375,US
-2001845376,2001845391,SG
-2001845392,2001845503,US
-2001845504,2001845695,SG
-2001845696,2001845703,US
-2001845704,2001845799,SG
-2001845800,2001845807,US
-2001845808,2001846015,SG
-2001846016,2001846311,US
-2001846312,2001846335,SG
-2001846336,2001846359,US
-2001846360,2001846479,SG
-2001846480,2001846495,US
-2001846496,2001846503,SG
-2001846504,2001846511,US
-2001846512,2001846519,SG
-2001846520,2001846523,US
-2001846524,2001846531,SG
-2001846532,2001846543,US
-2001846544,2001846559,SG
-2001846560,2001846567,US
-2001846568,2001846571,SG
-2001846572,2001846607,US
-2001846608,2001846615,SG
-2001846616,2001846727,US
+2001833016,2001846271,HK
+2001846272,2001846719,SG
+2001846720,2001846727,US
2001846728,2001846735,SG
2001846736,2001846755,US
-2001846756,2001846847,SG
-2001846848,2001846911,US
-2001846912,2001846927,SG
-2001846928,2001846943,US
-2001846944,2001846959,SG
+2001846756,2001846959,SG
2001846960,2001846975,IN
-2001846976,2001847071,SG
-2001847072,2001847103,US
-2001847104,2001847167,SG
-2001847168,2001847416,US
-2001847417,2001847417,SG
-2001847418,2001847429,US
-2001847430,2001847439,SG
-2001847440,2001847455,US
-2001847456,2001847463,SG
-2001847464,2001847479,US
-2001847480,2001847487,SG
-2001847488,2001847491,US
-2001847492,2001847493,SG
-2001847494,2001847495,US
-2001847496,2001847519,SG
-2001847520,2001847535,US
-2001847536,2001847537,SG
-2001847538,2001847559,US
-2001847560,2001847567,SG
-2001847568,2001847575,US
-2001847576,2001847591,SG
-2001847592,2001847599,US
-2001847600,2001847623,SG
-2001847624,2001847647,US
-2001847648,2001847663,SG
-2001847664,2001847671,US
-2001847672,2001847679,SG
-2001847680,2001847703,US
-2001847704,2001847711,SG
-2001847712,2001847727,US
-2001847728,2001847743,SG
-2001847744,2001847747,US
-2001847748,2001847755,SG
-2001847756,2001847771,US
-2001847772,2001847783,SG
-2001847784,2001847791,US
-2001847792,2001847799,SG
-2001847800,2001847839,US
-2001847840,2001847855,SG
-2001847856,2001847871,US
-2001847872,2001847875,SG
-2001847876,2001847879,US
-2001847880,2001847895,SG
-2001847896,2001847903,US
-2001847904,2001847935,SG
-2001847936,2001847951,US
-2001847952,2001847955,SG
-2001847956,2001847959,US
-2001847960,2001847963,SG
-2001847964,2001847967,US
-2001847968,2001847975,SG
-2001847976,2001847979,US
-2001847980,2001847981,SG
-2001847982,2001847991,US
-2001847992,2001848007,SG
-2001848008,2001848015,US
-2001848016,2001848047,SG
-2001848048,2001848055,US
-2001848056,2001848071,SG
-2001848072,2001848079,IN
-2001848080,2001848103,SG
-2001848104,2001848111,US
-2001848112,2001848135,SG
-2001848136,2001848143,US
-2001848144,2001848151,SG
-2001848152,2001848167,US
-2001848168,2001848189,SG
-2001848190,2001848199,US
-2001848200,2001848207,SG
-2001848208,2001848231,US
-2001848232,2001848247,SG
-2001848248,2001848253,US
-2001848254,2001848254,SG
-2001848255,2001848255,MY
-2001848256,2001848279,SG
-2001848280,2001848287,US
-2001848288,2001848303,SG
-2001848304,2001848327,US
-2001848328,2001848335,SG
-2001848336,2001848367,US
-2001848368,2001848383,SG
-2001848384,2001848407,US
-2001848408,2001848415,SG
-2001848416,2001848447,US
-2001848448,2001848479,SG
-2001848480,2001848575,US
-2001848576,2001848623,SG
-2001848624,2001848679,US
-2001848680,2001848687,SG
-2001848688,2001848767,US
-2001848768,2001848863,SG
-2001848864,2001848879,US
-2001848880,2001848895,SG
-2001848896,2001848943,US
-2001848944,2001848951,SG
-2001848952,2001848975,US
+2001846976,2001847199,SG
+2001847200,2001847231,US
+2001847232,2001847455,SG
+2001847456,2001847487,US
+2001847488,2001847703,SG
+2001847704,2001847711,US
+2001847712,2001848767,SG
+2001848768,2001848783,US
+2001848784,2001848911,SG
+2001848912,2001848919,JP
+2001848920,2001848959,SG
+2001848960,2001848975,US
2001848976,2001848991,SG
2001848992,2001849015,US
2001849016,2001849023,SG
-2001849024,2001849167,US
-2001849168,2001849183,SG
-2001849184,2001849247,US
-2001849248,2001849255,SG
-2001849256,2001849271,US
-2001849272,2001849279,SG
-2001849280,2001850391,US
+2001849024,2001849087,US
+2001849088,2001849471,SG
+2001849472,2001849503,US
+2001849504,2001849631,SG
+2001849632,2001849663,US
+2001849664,2001849855,SG
+2001849856,2001850391,US
2001850392,2001850399,SG
2001850400,2001850415,US
2001850416,2001850423,SG
@@ -38731,7 +40364,9 @@
2019049472,2019078143,AU
2019078144,2019082239,IN
2019082240,2019098623,HK
-2019098624,2019115007,PH
+2019098624,2019106815,PH
+2019106816,2019107071,NO
+2019107072,2019115007,PH
2019115008,2019117055,US
2019117056,2019119103,IN
2019119104,2019121151,NZ
@@ -38914,8 +40549,10 @@
2047506432,2047508479,US
2047508480,2047574015,CN
2047574016,2047606783,SG
-2047606784,2047803391,CN
-2047803392,2047868927,SG
+2047606784,2047770879,CN
+2047770880,2047773184,HK
+2047773185,2047803391,CN
+2047803392,2047868927,IN
2047868928,2048917503,JP
2048917504,2049966079,KR
2049966080,2050047999,CN
@@ -38928,8 +40565,7 @@
2050091008,2050097151,JP
2050097152,2050101247,SG
2050101248,2050113535,JP
-2050113536,2050129663,SG
-2050129664,2050129919,JP
+2050113536,2050129919,SG
2050129920,2050162687,IN
2050162688,2050228223,CN
2050228224,2050490367,PH
@@ -38963,9 +40599,7 @@
2053534720,2053537791,IN
2053537792,2053636095,JP
2053636096,2054160383,AU
-2054160384,2054189567,CN
-2054189568,2054190591,HK
-2054190592,2054376447,CN
+2054160384,2054376447,CN
2054376448,2054377471,HK
2054377472,2054422527,CN
2054422528,2054619135,TW
@@ -39064,18 +40698,13 @@
2060451840,2061500415,JP
2061500416,2063073279,CN
2063073280,2063077375,BD
-2063077376,2063077377,PH
-2063077378,2063077378,HK
-2063077379,2063077631,PH
-2063077632,2063079423,HK
+2063077376,2063079423,HK
2063079424,2063081471,CN
2063081472,2063085567,ID
2063085568,2063089663,CN
2063089664,2063097855,JP
2063097856,2063106047,MM
-2063106048,2063106559,SG
-2063106560,2063106815,AU
-2063106816,2063107071,SG
+2063106048,2063107071,SG
2063107072,2063107327,JP
2063107328,2063107623,SG
2063107624,2063107631,AU
@@ -39084,19 +40713,18 @@
2063110144,2063111167,JP
2063111168,2063114239,AU
2063114240,2063115263,IN
-2063115264,2063117311,JP
-2063117312,2063117567,NZ
-2063117568,2063117823,JP
+2063115264,2063117823,JP
2063117824,2063117839,PH
2063117840,2063117951,JP
2063117952,2063118079,PH
-2063118080,2063118335,JP
+2063118080,2063118159,JP
+2063118160,2063118191,PH
+2063118192,2063118335,JP
2063118336,2063118591,IN
2063118592,2063119871,JP
2063119872,2063120383,IN
-2063120384,2063120895,JP
-2063120896,2063121151,AU
-2063121152,2063122431,JP
+2063120384,2063121919,JP
+2063121920,2063122431,IN
2063122432,2063138815,SG
2063138816,2063335423,JP
2063335424,2063341567,AU
@@ -39320,7 +40948,11 @@
2083389440,2083454975,KR
2083454976,2083471359,CN
2083471360,2083487743,JP
-2083487744,2083504127,AU
+2083487744,2083491583,AU
+2083491584,2083491839,US
+2083491840,2083492863,AU
+2083492864,2083493375,US
+2083493376,2083504127,AU
2083504128,2083520511,JP
2083520512,2083966719,KR
2083966720,2083966975,JP
@@ -39345,7 +40977,6 @@
2087452672,2087453695,AU
2087453696,2087454719,KH
2087454720,2087456767,CN
-2087456768,2087457791,MY
2087458816,2087460863,FJ
2087460864,2087462911,JP
2087462912,2087464959,CN
@@ -39481,7 +41112,9 @@
2099216384,2099232767,KR
2099232768,2100297727,CN
2100297728,2100854783,JP
-2100854784,2100887551,US
+2100854784,2100874495,US
+2100874496,2100874751,AU
+2100874752,2100887551,US
2100887552,2100953087,KR
2100953088,2100969471,VN
2100969472,2100985855,JP
@@ -39543,13 +41176,9 @@
2112487424,2112618495,VN
2112618496,2112880639,NZ
2112880640,2113683455,KR
-2113683456,2113685759,JP
-2113685760,2113686015,MY
-2113686016,2113687807,JP
-2113687808,2113688063,AU
-2113688064,2113688319,JP
-2113688320,2113688575,SG
-2113688576,2113693599,JP
+2113683456,2113687999,JP
+2113688000,2113688031,AU
+2113688032,2113693599,JP
2113693600,2113693615,HK
2113693616,2113716223,JP
2113716224,2113724927,SG
@@ -39571,7 +41200,11 @@
2147489792,2147491839,RU
2147491840,2147494911,DE
2147494912,2147495167,RO
-2147495168,2147498239,DE
+2147495168,2147495423,DE
+2147495424,2147495935,RO
+2147495936,2147497215,DE
+2147497216,2147497471,RO
+2147497472,2147498239,DE
2147498240,2147498495,RO
2147498496,2147500031,DE
2147500032,2147501055,FR
@@ -39614,7 +41247,9 @@
2151778304,2151780351,RU
2151780352,2151782399,DE
2151782400,2151784447,ES
-2151784448,2151792639,IR
+2151784448,2151788479,IR
+2151788480,2151788495,IQ
+2151788496,2151792639,IR
2151792640,2151794687,CH
2151794688,2151796735,IT
2151796736,2151797759,DE
@@ -39683,9 +41318,7 @@
2155827200,2155831295,PL
2155831296,2155833343,RU
2155833344,2155833855,SE
-2155833856,2155834084,NL
-2155834085,2155834111,SE
-2155834112,2155834367,NL
+2155833856,2155834367,NL
2155834368,2155834464,SE
2155834465,2155834512,NL
2155834513,2155834532,SE
@@ -39731,7 +41364,9 @@
2159673344,2159869951,US
2159869952,2159935487,CA
2159935488,2160525311,US
-2160525312,2160590847,SG
+2160525312,2160533503,SG
+2160533504,2160541695,NL
+2160541696,2160590847,SG
2160590848,2160656383,US
2160721920,2160852991,US
2160852992,2160885759,RU
@@ -39744,12 +41379,10 @@
2160914432,2160918527,SA
2160918528,2161508351,US
2161508352,2161573887,FI
-2161573888,2162228223,US
-2162228224,2162228479,CA
-2162228480,2162687999,US
+2161573888,2162687999,US
2162688000,2162753535,GB
2162753536,2162819071,CA
-2162819072,2162884607,RO
+2162819072,2162884607,SA
2162884608,2163212287,US
2163212288,2163277823,GB
2163277824,2163408895,US
@@ -39780,10 +41413,13 @@
2166571008,2166575103,GB
2166575104,2166575359,US
2166575360,2166575615,GB
-2166575616,2166607009,US
+2166575616,2166594563,US
+2166594564,2166594564,DE
+2166594565,2166606847,US
+2166606848,2166607009,GB
2166607010,2166607010,DE
-2166607011,2166607011,GB
-2166607012,2166613759,US
+2166607011,2166607103,GB
+2166607104,2166613759,US
2166613760,2166614015,DE
2166614016,2167209983,US
2167275520,2167930879,US
@@ -39855,7 +41491,9 @@
2178351104,2178416639,GB
2178416640,2178482175,US
2178482176,2178547711,DE
-2178547712,2179391487,US
+2178547712,2178900223,US
+2178900224,2178900479,NZ
+2178900480,2179391487,US
2179391488,2179391999,GB
2179392000,2179397632,US
2179397633,2179397633,GB
@@ -39993,15 +41631,21 @@
2188718582,2188718582,DE
2188718583,2188724463,US
2188724464,2188724464,NL
-2188724465,2188726783,US
+2188724465,2188724991,US
+2188724992,2188725247,RS
+2188725248,2188726783,US
2188726784,2188727039,GB
2188727040,2188728319,US
2188728320,2188728575,GB
2188728576,2188734463,US
2188734464,2188734719,FR
-2188734720,2188738306,US
+2188734720,2188736511,US
+2188736512,2188736767,GB
+2188736768,2188738306,US
2188738307,2188738307,GB
-2188738308,2188768767,US
+2188738308,2188749055,US
+2188749056,2188749311,SL
+2188749312,2188768767,US
2188768768,2188769279,YT
2188769280,2188902399,US
2188902400,2188967935,FR
@@ -40074,19 +41718,21 @@
2193707408,2193707415,IT
2193707416,2193707559,GB
2193707560,2193707567,IT
-2193707568,2193707615,GB
-2193707616,2193707623,IT
-2193707624,2193707751,GB
+2193707568,2193707655,GB
+2193707656,2193707663,IT
+2193707664,2193707751,GB
2193707752,2193707759,IT
-2193707760,2193707831,GB
-2193707832,2193707839,IT
-2193707840,2193708511,GB
-2193708512,2193708519,IT
-2193708520,2193708735,GB
+2193707760,2193708303,GB
+2193708304,2193708311,IT
+2193708312,2193708647,GB
+2193708648,2193708655,IT
+2193708656,2193708735,GB
2193708736,2193708743,IT
2193708744,2193709087,GB
2193709088,2193709095,IT
-2193709096,2193711103,GB
+2193709096,2193709631,GB
+2193709632,2193709639,IT
+2193709640,2193711103,GB
2193711104,2193713151,DE
2193713152,2193715199,ES
2193715200,2193717247,DE
@@ -40140,9 +41786,7 @@
2197780480,2197782527,DE
2197782528,2197782685,RU
2197782686,2197782686,UA
-2197782687,2197782783,RU
-2197782784,2197783039,UA
-2197783040,2197786623,RU
+2197782687,2197786623,RU
2197786624,2197788671,IT
2197788672,2197790719,PL
2197790720,2197792767,SE
@@ -40168,7 +41812,7 @@
2197859328,2197860351,CL
2197860352,2197865471,BR
2197865472,2197866495,AR
-2197867520,2197869567,BR
+2197866496,2197869567,BR
2197869568,2197870591,UY
2197870592,2197874687,BR
2197874688,2197875711,AR
@@ -40180,24 +41824,83 @@
2202534912,2202540031,BR
2202540032,2202541055,PY
2202541056,2202542079,AR
-2202542080,2202550271,BR
+2202542080,2202552319,BR
2202552320,2202553343,AR
-2202554368,2202559487,BR
+2202553344,2202554367,TT
+2202554368,2202562559,BR
2202562560,2202563583,CW
-2202565632,2202566655,BR
+2202563584,2202567679,BR
2202567680,2202568703,AR
-2202569728,2202570751,BR
+2202568704,2202569727,NL
+2202569728,2202573823,BR
2202573824,2202574847,AR
-2202574848,2202578943,BR
+2202574848,2202576895,BR
+2202576896,2202577919,VE
+2202577920,2202586111,BR
+2202586112,2202587135,AR
+2202587136,2202588159,HN
+2202588160,2202589183,MX
+2202589184,2202591231,BR
+2202591232,2202592255,PA
+2202592256,2202593279,MX
+2202593280,2202595327,CL
+2202595328,2202596351,AR
+2202596352,2202599423,BR
2202599424,2204172287,US
2204172288,2204237823,SE
2204237824,2204303359,US
2204303360,2204368895,DE
+2204368896,2204369919,PA
+2204369920,2204376063,BR
+2204376064,2204377087,CL
+2204377088,2204378111,BR
+2204378112,2204379135,TT
+2204379136,2204385279,BR
+2204385280,2204386303,AR
+2204386304,2204391423,BR
+2204391424,2204392447,AR
+2204392448,2204394495,BR
+2204394496,2204395519,AR
+2204395520,2204396543,BR
+2204396544,2204397567,AR
+2204397568,2204404735,BR
+2204404736,2204405759,SV
+2204405760,2204409855,BR
+2204409856,2204410879,TT
+2204410880,2204414975,BR
+2204414976,2204415999,AR
+2204416000,2204417023,PY
+2204417024,2204420095,BR
+2204420096,2204421119,BO
+2204421120,2204434431,BR
2204434432,2204499967,US
2204499968,2204565503,CH
2204565504,2204631039,US
2204631040,2204696575,CA
2204696576,2204893183,US
+2204893184,2204894207,AR
+2204894208,2204895231,PA
+2204895232,2204897279,BR
+2204897280,2204898303,HN
+2204898304,2204899327,PA
+2204899328,2204902399,BR
+2204902400,2204903423,CR
+2204903424,2204904447,AR
+2204904448,2204910591,BR
+2204910592,2204911615,CL
+2204911616,2204913663,BR
+2204913664,2204914687,AR
+2204914688,2204929023,BR
+2204929024,2204930047,AR
+2204930048,2204936191,BR
+2204936192,2204937215,CO
+2204937216,2204942335,BR
+2204942336,2204943359,PY
+2204943360,2204946431,BR
+2204946432,2204947455,CL
+2204947456,2204952575,BR
+2204952576,2204953599,HN
+2204953600,2204958719,BR
2204958720,2205089791,US
2205089792,2205155327,GB
2205155328,2205286399,JP
@@ -40216,12 +41919,13 @@
2205538304,2205540351,RU
2205540352,2205548543,IQ
2205548544,2206269439,US
-2206269440,2206334975,CA
+2206269440,2206334975,HK
2206334976,2206400511,AT
2206400512,2206466047,US
2206466048,2207121407,CA
2207121408,2207449087,US
-2207449088,2207647487,CA
+2207449088,2207514623,HK
+2207514624,2207647487,CA
2207647488,2207647743,US
2207647744,2207648511,CA
2207648512,2207649791,US
@@ -40248,6 +41952,28 @@
2208038912,2208235519,US
2208235520,2208301055,DE
2208301056,2208366591,FI
+2208366592,2208379903,BR
+2208379904,2208380927,HN
+2208380928,2208381951,CL
+2208381952,2208387071,BR
+2208387072,2208388095,HN
+2208388096,2208389119,SX
+2208389120,2208390143,AR
+2208390144,2208392191,BR
+2208392192,2208393215,PE
+2208393216,2208404479,BR
+2208404480,2208405503,BZ
+2208405504,2208406527,AR
+2208406528,2208413695,BR
+2208413696,2208414719,AR
+2208414720,2208417791,BR
+2208417792,2208418815,CL
+2208418816,2208425983,BR
+2208425984,2208428031,AR
+2208428032,2208429055,BR
+2208429056,2208430079,MX
+2208430080,2208431103,BR
+2208431104,2208432127,PY
2208432128,2208563199,CA
2208563200,2208759807,DK
2208759808,2208890879,US
@@ -40272,7 +41998,54 @@
2210594816,2210660351,CA
2210725888,2211053567,US
2211053568,2211119103,CA
-2211119104,2211184639,NZ
+2211119104,2211120127,AU
+2211120128,2211120383,NZ
+2211120384,2211121151,AU
+2211121152,2211121407,NZ
+2211121408,2211122431,AU
+2211122432,2211122687,NZ
+2211122688,2211135231,AU
+2211135232,2211135999,NZ
+2211136000,2211137791,AU
+2211137792,2211138047,NZ
+2211138048,2211138559,AU
+2211138560,2211138815,NZ
+2211138816,2211140351,AU
+2211140352,2211140607,NZ
+2211140608,2211140863,AU
+2211140864,2211141119,NZ
+2211141120,2211142399,AU
+2211142400,2211142911,NZ
+2211142912,2211144703,AU
+2211144704,2211144959,NZ
+2211144960,2211147007,AU
+2211147008,2211147263,NZ
+2211147264,2211148031,AU
+2211148032,2211148543,NZ
+2211148544,2211148671,AU
+2211148672,2211149567,NZ
+2211149568,2211149823,AU
+2211149824,2211150079,NZ
+2211150080,2211150847,AU
+2211150848,2211151359,NZ
+2211151360,2211151615,AU
+2211151616,2211151871,NZ
+2211151872,2211152639,AU
+2211152640,2211153151,NZ
+2211153152,2211153407,AU
+2211153408,2211153663,NZ
+2211153664,2211154175,AU
+2211154176,2211154431,NZ
+2211154432,2211179519,AU
+2211179520,2211179775,NZ
+2211179776,2211180287,AU
+2211180288,2211181823,NZ
+2211181824,2211182079,AU
+2211182080,2211182591,NZ
+2211182592,2211183103,AU
+2211183104,2211184127,NZ
+2211184128,2211184383,AU
+2211184384,2211184639,NZ
2211184640,2211250175,US
2211250176,2211315711,SE
2211315712,2211381247,JP
@@ -40280,11 +42053,33 @@
2211446784,2211643391,US
2211643392,2211708927,NL
2211708928,2211774463,US
-2211774464,2211839999,CA
+2211774464,2211839999,HK
2211840000,2212036607,US
2212036608,2212102143,AU
2212102144,2212233215,US
2212233216,2212298751,DE
+2212298752,2212299775,AR
+2212299776,2212300799,DO
+2212300800,2212301823,HN
+2212301824,2212302847,BR
+2212302848,2212303871,AR
+2212303872,2212304895,BR
+2212304896,2212305919,PA
+2212305920,2212306943,TT
+2212306944,2212307967,CL
+2212307968,2212308991,BR
+2212308992,2212310015,CO
+2212310016,2212315135,BR
+2212315136,2212316159,AR
+2212316160,2212327423,BR
+2212327424,2212328447,VE
+2212328448,2212335615,BR
+2212335616,2212336639,CW
+2212336640,2212337663,BR
+2212337664,2212338687,PE
+2212338688,2212340735,BR
+2212340736,2212341759,CL
+2212341760,2212364287,BR
2212364288,2212495359,US
2212495360,2212560895,NL
2212560896,2212691967,US
@@ -40321,13 +42116,28 @@
2214264832,2214330367,GB
2214330368,2214461439,US
2214461440,2214526975,FR
+2214526976,2214527999,BR
+2214528000,2214529023,AR
+2214529024,2214530047,BR
+2214530048,2214531071,AR
+2214531072,2214537215,BR
+2214537216,2214538239,BZ
+2214538240,2214542335,BR
+2214542336,2214543359,AR
+2214543360,2214553599,BR
+2214553600,2214554623,VE
+2214554624,2214561791,BR
+2214561792,2214562815,PE
+2214562816,2214573055,BR
+2214573056,2214574079,AR
+2214574080,2214576127,BR
+2214576128,2214577151,PE
+2214577152,2214590463,BR
+2214590464,2214591487,AR
+2214591488,2214592511,BR
2214592512,2218786815,US
2218786816,2219769855,IL
-2219769856,2222521855,US
-2222521856,2222522111,PR
-2222522112,2223111679,US
-2223111680,2223111935,VI
-2223111936,2224160767,US
+2219769856,2224160767,US
2224160768,2224226303,GB
2224226304,2224242687,US
2224242688,2224259071,SG
@@ -40394,6 +42204,29 @@
2231107584,2231173119,DE
2231173120,2231238655,US
2231238656,2231304191,MX
+2231304192,2231305215,PE
+2231305216,2231307263,AR
+2231307264,2231309311,BR
+2231309312,2231310335,CO
+2231310336,2231321599,BR
+2231321600,2231322623,CL
+2231322624,2231332863,BR
+2231332864,2231333887,AR
+2231333888,2231335935,BR
+2231335936,2231336959,MX
+2231336960,2231337983,BR
+2231337984,2231339007,HN
+2231339008,2231346175,BR
+2231346176,2231347199,PY
+2231347200,2231355391,BR
+2231355392,2231356415,AR
+2231356416,2231357439,BR
+2231357440,2231358463,SV
+2231358464,2231361535,BR
+2231361536,2231362559,AR
+2231362560,2231364607,BR
+2231364608,2231365631,CL
+2231365632,2231369727,BR
2231369728,2248146943,JP
2248146944,2248148991,IT
2248148992,2248151039,ES
@@ -40438,7 +42271,9 @@
2250047488,2250113023,US
2250113024,2250178559,DE
2250178560,2250244095,CA
-2250244096,2250375167,US
+2250244096,2250282239,US
+2250282240,2250282495,GB
+2250282496,2250375167,US
2250375168,2250440703,DE
2250440704,2250506239,US
2250506240,2250571775,GB
@@ -40532,24 +42367,11 @@
2258580032,2258582783,TW
2258582784,2258582791,GB
2258582792,2258583551,TW
-2258583552,2258583575,GB
-2258583576,2258583583,TW
-2258583584,2258583775,GB
-2258583776,2258583807,TW
-2258583808,2258583935,GB
-2258583936,2258583967,TW
-2258583968,2258584007,GB
-2258584008,2258584351,TW
-2258584352,2258584383,GB
-2258584384,2258584574,TW
-2258584575,2258584575,GB
-2258584576,2258591575,TW
-2258591576,2258591579,GB
-2258591580,2258591631,TW
-2258591632,2258591639,GB
-2258591640,2258591935,TW
+2258583552,2258591743,GB
+2258591744,2258591935,TW
2258591936,2258591967,HK
-2258591968,2258592271,TW
+2258591968,2258591999,AU
+2258592000,2258592271,TW
2258592272,2258592279,JP
2258592280,2258592287,TW
2258592288,2258592291,JP
@@ -40559,16 +42381,15 @@
2258592480,2258592495,AU
2258592496,2258592511,TW
2258592512,2258592767,AU
-2258592768,2258592791,TW
-2258592792,2258592803,HK
-2258592804,2258593279,TW
+2258592768,2258593023,HK
+2258593024,2258593279,TW
2258593280,2258593535,HK
2258593536,2258594047,TW
2258594048,2258594111,HK
-2258594112,2258594303,TW
-2258594304,2258594319,HK
-2258594320,2258594559,TW
-2258594560,2258594815,HK
+2258594112,2258594143,TW
+2258594144,2258594175,HK
+2258594176,2258594303,TW
+2258594304,2258594815,HK
2258594816,2258595167,TW
2258595168,2258595199,AU
2258595200,2258595383,TW
@@ -40586,13 +42407,9 @@
2258596104,2258596159,TW
2258596160,2258596255,HK
2258596256,2258596351,TW
-2258596352,2258596863,HK
-2258596864,2258596887,TW
-2258596888,2258596903,HK
-2258596904,2258596991,TW
-2258596992,2258597023,HK
-2258597024,2258597115,TW
-2258597116,2258597215,HK
+2258596352,2258597071,HK
+2258597072,2258597079,TW
+2258597080,2258597215,HK
2258597216,2258597263,TW
2258597264,2258597293,HK
2258597294,2258597294,PG
@@ -40647,9 +42464,11 @@
2258599676,2258599679,JP
2258599680,2258599743,TW
2258599744,2258599747,AU
-2258599748,2258600263,TW
-2258600264,2258600267,HK
-2258600268,2258600515,TW
+2258599748,2258599935,TW
+2258599936,2258599971,HK
+2258599972,2258599975,AU
+2258599976,2258600447,HK
+2258600448,2258600515,TW
2258600516,2258600519,IN
2258600520,2258600523,TW
2258600524,2258600527,IN
@@ -40674,18 +42493,10 @@
2258601408,2258601423,AU
2258601424,2258601471,TW
2258601472,2258601983,JP
-2258601984,2258602303,TW
-2258602304,2258602327,HK
-2258602328,2258602335,TW
-2258602336,2258602367,HK
-2258602368,2258602399,TW
-2258602400,2258602447,HK
-2258602448,2258602479,TW
-2258602480,2258602495,HK
-2258602496,2258602815,TW
-2258602816,2258602879,HK
-2258602880,2258603007,TW
-2258603008,2258603071,HK
+2258601984,2258602239,TW
+2258602240,2258602495,HK
+2258602496,2258602751,TW
+2258602752,2258603071,HK
2258603072,2258603087,TW
2258603088,2258603089,HK
2258603090,2258603090,PG
@@ -40705,12 +42516,11 @@
2258603944,2258603951,TW
2258603952,2258603967,HK
2258603968,2258604031,TW
-2258604032,2258604287,HK
-2258604288,2258604671,TW
+2258604032,2258604543,HK
+2258604544,2258604671,TW
2258604672,2258604735,SG
2258604736,2258604799,AU
-2258604800,2258605055,HK
-2258605056,2258605311,TW
+2258604800,2258605311,HK
2258605312,2258605439,SG
2258605440,2258605823,TW
2258605824,2258605951,AU
@@ -40718,12 +42528,7 @@
2258606000,2258606015,AU
2258606016,2258606047,TW
2258606048,2258606079,AU
-2258606080,2258606143,TW
-2258606144,2258606147,HK
-2258606148,2258606151,TW
-2258606152,2258606191,HK
-2258606192,2258606199,TW
-2258606200,2258606367,HK
+2258606080,2258606367,HK
2258606368,2258606415,TW
2258606416,2258606423,HK
2258606424,2258606463,TW
@@ -40743,17 +42548,17 @@
2258607088,2258607091,AU
2258607092,2258607095,NZ
2258607096,2258607103,AU
-2258607104,2258607263,TW
+2258607104,2258607171,TW
+2258607172,2258607172,AU
+2258607173,2258607263,TW
2258607264,2258607279,AU
2258607280,2258607351,TW
2258607352,2258607359,NZ
2258607360,2258607519,AU
2258607520,2258607543,TW
2258607544,2258607551,AU
-2258607552,2258607819,TW
-2258607820,2258607823,HK
-2258607824,2258607871,TW
-2258607872,2258607879,HK
+2258607552,2258607615,TW
+2258607616,2258607879,HK
2258607880,2258607903,TW
2258607904,2258607999,HK
2258608000,2258608063,TW
@@ -40762,7 +42567,8 @@
2258608256,2258608259,JP
2258608260,2258608279,TW
2258608280,2258608283,JP
-2258608284,2258608639,TW
+2258608284,2258608383,TW
+2258608384,2258608639,HK
2258608640,2258608647,AU
2258608648,2258608655,TW
2258608656,2258608663,JP
@@ -40774,12 +42580,8 @@
2258608896,2258609087,TW
2258609088,2258609119,AU
2258609120,2258609151,TW
-2258609152,2258609407,AU
-2258609408,2258609423,TW
-2258609424,2258609471,AU
-2258609472,2258609567,TW
-2258609568,2258609575,AU
-2258609576,2258609919,TW
+2258609152,2258609663,AU
+2258609664,2258609919,TW
2258609920,2258609967,AU
2258609968,2258610179,TW
2258610180,2258610183,IN
@@ -40795,35 +42597,32 @@
2258611216,2258611223,NZ
2258611224,2258611567,TW
2258611568,2258611583,AU
-2258611584,2258612223,TW
+2258611584,2258611967,TW
+2258611968,2258612223,HK
2258612224,2258612303,AU
2258612304,2258612351,TW
2258612352,2258612367,AU
2258612368,2258612383,TW
2258612384,2258612743,AU
-2258612744,2258613503,TW
+2258612744,2258612767,TW
+2258612768,2258612799,AU
+2258612800,2258613503,TW
2258613504,2258613567,AU
2258613568,2258614783,TW
2258614784,2258614815,IN
2258614816,2258615039,TW
2258615040,2258615055,IN
-2258615056,2258615347,TW
-2258615348,2258615355,AU
-2258615356,2258615391,TW
-2258615392,2258615395,AU
-2258615396,2258616191,TW
+2258615056,2258615295,TW
+2258615296,2258615551,AU
+2258615552,2258616191,TW
2258616192,2258616203,AU
2258616204,2258616207,TW
2258616208,2258616303,AU
2258616304,2258616311,TW
2258616312,2258616319,AU
-2258616320,2258620447,TW
-2258620448,2258620455,HK
-2258620456,2258620463,TW
-2258620464,2258620467,HK
-2258620468,2258620471,TW
-2258620472,2258620475,HK
-2258620476,2258632703,TW
+2258616320,2258620415,TW
+2258620416,2258621951,HK
+2258621952,2258632703,TW
2258632704,2258698239,JP
2258698240,2259222527,US
2259222528,2259288063,DE
@@ -40842,23 +42641,21 @@
2260467712,2260533247,NL
2260533248,2260598783,US
2260598784,2260664319,CA
-2260664320,2260720895,GB
-2260720896,2260721151,DE
-2260721152,2260723711,GB
+2260664320,2260720639,GB
+2260720640,2260720895,DE
+2260720896,2260723711,GB
2260723712,2260723967,IL
2260723968,2260729343,GB
2260729344,2260729599,IL
2260729600,2260729855,GB
2260729856,2260926463,US
-2260992000,2261057535,CN
+2260992000,2261057535,TH
2261057536,2261188607,US
2261188608,2261254143,CA
2261254144,2261385215,US
2261385216,2261450751,PR
2261450752,2261516287,NL
-2261516288,2261569535,US
-2261569536,2261569791,TH
-2261569792,2261647359,US
+2261516288,2261647359,US
2261647360,2261712895,FR
2261712896,2261778431,US
2261778432,2261843967,TW
@@ -40903,19 +42700,25 @@
2266431488,2266497023,CA
2266497024,2266694655,US
2266694656,2266694911,SG
-2266694912,2276786175,US
+2266694912,2270490623,US
+2270490624,2270494719,IN
+2270494720,2276786175,US
2276786176,2276851711,CA
2276851712,2277769215,US
2277769216,2277834751,GB
-2277834752,2281007103,US
+2277834752,2280998911,US
+2280998912,2280999167,FR
+2280999168,2281007103,US
2281007104,2281007359,IN
-2281007360,2281023487,US
+2281007360,2281010159,US
+2281010160,2281010175,SG
+2281010176,2281023487,US
2281023488,2281023743,IN
2281023744,2281029631,US
2281029632,2281029887,FR
2281029888,2281037823,US
-2281037824,2281038079,FR
-2281038080,2281701375,US
+2281037824,2281037951,FR
+2281037952,2281701375,US
2281701376,2281705471,CH
2281705472,2282226175,US
2282226176,2282226243,AU
@@ -40945,9 +42748,7 @@
2292973568,2293039103,DE
2293039104,2293080575,LU
2293080576,2293080831,BE
-2293080832,2293085183,LU
-2293085184,2293085439,BE
-2293085440,2293104639,LU
+2293080832,2293104639,LU
2293104640,2293825535,US
2293825536,2293891071,IN
2293891072,2293956607,AU
@@ -40970,7 +42771,11 @@
2297298944,2297364479,CH
2297364480,2297626623,US
2297626624,2297692159,DE
-2297692160,2299461631,US
+2297692160,2298144255,US
+2298144256,2298144511,GB
+2298144512,2298371071,US
+2298371072,2298371327,GB
+2298371328,2299461631,US
2299461632,2299527167,CA
2299527168,2299592703,US
2299592704,2299658239,NL
@@ -40997,7 +42802,7 @@
2303189558,2303189558,IE
2303189559,2303262719,US
2303262720,2303328255,GB
-2303328256,2303393791,CA
+2303328256,2303393791,HK
2303393792,2303459327,US
2303459328,2303524863,AU
2303524864,2303852543,US
@@ -41008,7 +42813,9 @@
2304638976,2304704511,CA
2304704512,2304770047,US
2304770048,2304835583,FI
-2304835584,2305097727,US
+2304835584,2304901119,US
+2304901120,2304966655,CZ
+2304966656,2305097727,US
2305097728,2305163263,PK
2305163264,2305359871,US
2305359872,2305425407,GB
@@ -41018,7 +42825,10 @@
2305687552,2305753087,US
2305753088,2305818623,AU
2305818624,2306015231,US
-2306080768,2306342911,US
+2306080768,2306129919,US
+2306129920,2306138111,NL
+2306138112,2306146303,IE
+2306146304,2306342911,US
2306342912,2306408447,NL
2306408448,2306473983,FR
2306473984,2306539519,CA
@@ -41089,6 +42899,22 @@
2314993664,2315059199,US
2315059200,2315124735,GB
2315124736,2315190271,US
+2315255808,2315257855,BR
+2315257856,2315258879,AR
+2315258880,2315259903,CL
+2315259904,2315266047,BR
+2315266048,2315267071,VE
+2315267072,2315270143,BR
+2315270144,2315271167,AR
+2315271168,2315278335,BR
+2315278336,2315279359,CO
+2315279360,2315282431,BR
+2315282432,2315283455,AR
+2315283456,2315285503,BR
+2315285504,2315286527,PA
+2315289600,2315290623,BR
+2315294720,2315296767,AR
+2315298816,2315299839,BR
2315321344,2315452415,US
2315452416,2315517951,GB
2315517952,2315583487,ES
@@ -41158,17 +42984,18 @@
2321874944,2321940479,JP
2321940480,2322006015,FR
2322006016,2322071551,US
-2322071552,2322137087,GB
+2322071552,2322130431,GB
+2322130432,2322130687,SG
+2322130688,2322137087,GB
2322137088,2322202623,US
2322202624,2322268159,SE
2322268160,2322333695,JP
2322333696,2322923519,US
2323054592,2323120127,CA
2323316736,2323382271,US
-2323382272,2323406847,NO
-2323406848,2323407103,DK
-2323407104,2323447807,NO
-2323447808,2323775487,US
+2323382272,2323447807,NO
+2323447808,2323693567,US
+2323709952,2323775487,US
2323775488,2323841023,AU
2323841024,2323906559,CH
2323906560,2323972095,IT
@@ -41214,7 +43041,13 @@
2330525696,2330591231,SE
2330591232,2330656767,US
2330656768,2330722303,NZ
-2330722304,2331181055,US
+2330722304,2330956287,US
+2330956288,2330956543,GB
+2330956544,2330956799,US
+2330956800,2330957311,NZ
+2330957312,2330968063,US
+2330968064,2330968319,IN
+2330968320,2331181055,US
2331181056,2331246591,JP
2331246592,2331443199,DE
2331443200,2331508735,US
@@ -41224,7 +43057,9 @@
2331836416,2331901951,GB
2331901952,2331967487,US
2332033024,2332098559,ID
-2332098560,2332360703,DE
+2332098560,2332298751,DE
+2332298752,2332298879,GB
+2332298880,2332360703,DE
2332426240,2332622847,DE
2332622848,2332688383,CN
2332688384,2332753919,NL
@@ -41317,8 +43152,7 @@
2342387712,2342453247,FR
2342453248,2342518783,CN
2342518784,2342584319,FR
-2342584320,2342649855,US
-2342649856,2342715391,NL
+2342584320,2342715391,US
2342715392,2342780927,AU
2342780928,2342846463,NO
2342846464,2342911999,BE
@@ -41348,7 +43182,6 @@
2344353792,2344419327,AU
2344419328,2344484863,CN
2344484864,2344550399,PK
-2344609024,2344609279,IT
2344615936,2344878079,ID
2344878080,2346188799,CN
2346188800,2346254335,AU
@@ -41488,7 +43321,9 @@
2366149536,2366149543,UA
2366149544,2366149551,BY
2366149552,2366149559,KZ
-2366149560,2366162943,RU
+2366149560,2366160223,RU
+2366160224,2366160255,DE
+2366160256,2366162943,RU
2366162944,2366164991,AL
2366164992,2366167039,GE
2366167040,2366169087,GB
@@ -41513,12 +43348,17 @@
2372075520,2372206591,DE
2372206592,2372214783,UA
2372214784,2372218879,DE
-2372218880,2372222975,FR
+2372218880,2372222463,FR
+2372222464,2372222975,CH
2372224512,2372224767,GB
-2372227072,2372227583,NO
-2372230400,2372230655,AT
-2372231424,2372231679,HU
+2372227072,2372227327,NO
+2372227500,2372227510,NO
+2372227520,2372227522,NO
+2372227571,2372227571,NO
+2372228352,2372228607,KR
+2372230400,2372230655,RU
2372231680,2372232191,GB
+2372233472,2372233727,NO
2372238730,2372238730,US
2372239360,2372240383,SK
2372240384,2372240895,NL
@@ -41540,7 +43380,8 @@
2372493312,2372497407,ES
2372497408,2372499455,IE
2372499456,2372501503,NL
-2372501504,2372505599,UA
+2372501504,2372503551,BG
+2372503552,2372505599,UA
2372505600,2372507647,NL
2372507648,2372509695,IT
2372509696,2372510207,AE
@@ -41548,7 +43389,7 @@
2372510336,2372510336,ES
2372510337,2372510463,AO
2372510464,2372511743,AE
-2372511744,2372513791,SI
+2372511744,2372513791,BA
2372513792,2372534271,GB
2372534272,2372665343,US
2372665344,2372730879,IT
@@ -41573,11 +43414,7 @@
2373911042,2373911042,US
2373911043,2373976063,FI
2373976064,2374107135,US
-2374107136,2374171135,DE
-2374171136,2374171206,CH
-2374171207,2374171207,DE
-2374171208,2374171391,CH
-2374171392,2374172671,DE
+2374107136,2374172671,DE
2374172672,2374238207,US
2374238208,2374303743,AU
2374303744,2374369279,US
@@ -41620,7 +43457,9 @@
2375155712,2375221247,US
2375221248,2375286783,SE
2375286784,2375352319,CH
-2375352320,2376269823,US
+2375352320,2376079615,US
+2376079616,2376079871,GB
+2376079872,2376269823,US
2376269824,2376335359,GB
2376335360,2376597503,US
2376597504,2376663039,AU
@@ -41642,12 +43481,18 @@
2377449472,2377515007,FR
2377515008,2377842687,US
2377842688,2377908223,GB
-2377908224,2378025983,US
+2377908224,2378022911,US
+2378022912,2378023423,HK
+2378023424,2378025983,US
2378025984,2378026239,NL
2378026240,2378026495,US
2378026496,2378027007,FR
2378027008,2378170367,US
-2378170368,2378235903,FI
+2378170368,2378203135,FI
+2378203136,2378203647,NO
+2378203648,2378210559,FI
+2378210560,2378211071,NO
+2378211072,2378235903,FI
2378235904,2378301439,US
2378301440,2378366975,FR
2378366976,2378432511,US
@@ -41674,9 +43519,7 @@
2380558848,2380559103,ZA
2380559104,2380578815,GB
2380578816,2380579071,JP
-2380579072,2380579327,GB
-2380579328,2380579583,HK
-2380579584,2380595199,GB
+2380579072,2380595199,GB
2380660736,2380726271,US
2380726272,2380791807,GB
2380791808,2381119487,US
@@ -41695,8 +43538,10 @@
2382168064,2382233599,BE
2382233600,2382299135,US
2382299136,2382331903,GR
-2382331904,2382335999,FR
-2382336000,2382340095,NL
+2382331904,2382336255,FR
+2382336256,2382337791,NL
+2382337792,2382338047,FR
+2382338048,2382340095,NL
2382340096,2382342143,CH
2382342144,2382344191,AT
2382344192,2382346239,NL
@@ -41723,7 +43568,9 @@
2382659072,2382676479,US
2382676480,2382676991,CA
2382676992,2382677503,US
-2382677504,2382677987,CA
+2382677504,2382677507,CA
+2382677508,2382677511,BY
+2382677512,2382677987,CA
2382677988,2382677991,US
2382677992,2382678015,CA
2382678016,2382678527,US
@@ -41746,15 +43593,13 @@
2386690048,2386988287,CA
2386988288,2386988543,CH
2386988544,2386989055,CA
-2386989056,2386989311,GB
+2386989056,2386989311,CH
2386989312,2387003391,CA
-2387003392,2387003647,GB
+2387003392,2387003647,CH
2387003648,2387003903,CA
-2387003904,2387004159,GB
+2387003904,2387004159,CH
2387004160,2387344127,CA
-2387344128,2387344895,US
-2387344896,2387345151,CA
-2387345152,2387345407,US
+2387344128,2387345407,US
2387345408,2387410943,CA
2387410944,2387476479,US
2387476480,2387542015,CA
@@ -41773,23 +43618,21 @@
2390818816,2390884351,US
2390884352,2390995455,CA
2390995456,2391015423,US
-2391015424,2391277567,CA
+2391015424,2391165439,CA
+2391165440,2391165695,US
+2391165696,2391277567,CA
2391277568,2391343103,US
-2391343104,2393044095,CA
-2393044096,2393044223,US
-2393044224,2394947583,CA
+2391343104,2393313407,CA
+2393313408,2393313535,US
+2393313536,2394947583,CA
2394947584,2395013119,US
2395013120,2395209727,CA
2395209728,2395340799,US
-2395340800,2395804159,CA
-2395804160,2395804415,GB
-2395804416,2395814911,CA
+2395340800,2395814911,CA
2395814912,2395815167,US
2395815168,2395841023,CA
2395841024,2395841535,GB
-2395841536,2395854079,CA
-2395854080,2395854335,US
-2395854336,2397700095,CA
+2395841536,2397700095,CA
2397700096,2397765631,US
2397765632,2398748671,CA
2398748672,2398945279,US
@@ -41914,13 +43757,13 @@
2418312960,2418313215,IN
2418313216,2418323007,US
2418323008,2418323008,PH
-2418323009,2418337023,US
-2418337024,2418337279,IN
-2418337280,2418338303,US
-2418338304,2418338815,IN
+2418323009,2418334719,US
+2418334720,2418338815,IN
2418338816,2418341887,US
2418341888,2418342143,IN
-2418342144,2418606079,US
+2418342144,2418342399,US
+2418342400,2418342911,IN
+2418342912,2418606079,US
2418606080,2418671615,DE
2418671616,2418737151,US
2418737152,2418802687,NL
@@ -41974,7 +43817,9 @@
2424111104,2424242175,US
2424242176,2424307711,NO
2424307712,2424438783,US
-2424438784,2425159679,AU
+2424438784,2424471551,AU
+2424471552,2424475647,US
+2424475648,2425159679,AU
2425159680,2425421823,US
2425421824,2425487359,DE
2425487360,2426667007,US
@@ -41987,7 +43832,9 @@
2427322368,2427453439,US
2427453440,2427536895,NO
2427536896,2427537151,US
-2427537152,2427584511,NO
+2427537152,2427544319,NO
+2427544320,2427544575,MY
+2427544576,2427584511,NO
2427584512,2427650047,GB
2427650048,2427846655,NO
2427846656,2428174335,US
@@ -42014,9 +43861,7 @@
2432172032,2432237567,BE
2432237568,2432568575,US
2432568576,2432568831,BE
-2432568832,2432577535,US
-2432577536,2432577791,GB
-2432577792,2432587263,US
+2432568832,2432587263,US
2432587264,2432587519,IE
2432587520,2432616447,US
2432616448,2432617471,NL
@@ -42035,7 +43880,9 @@
2436767744,2436767874,NL
2436767875,2436767875,DE
2436767876,2436767999,NL
-2436768000,2436825087,GB
+2436768000,2436775935,GB
+2436775936,2436784127,DE
+2436784128,2436825087,GB
2436825088,2436955647,NL
2436955648,2436955903,DE
2436955904,2441150463,NL
@@ -42098,7 +43945,9 @@
2449477632,2449479679,AL
2449479680,2449481727,FR
2449481728,2449485823,DE
-2449485824,2449489919,RO
+2449485824,2449487871,IE
+2449487872,2449488127,GB
+2449488128,2449489919,RO
2449489920,2449490943,FR
2449490944,2449491199,DE
2449491200,2449491967,FR
@@ -42106,7 +43955,8 @@
2449494016,2449496063,UA
2449496064,2449498111,FR
2449498112,2449506303,DE
-2449506304,2449539071,RO
+2449506304,2449534975,RO
+2449534976,2449539071,DE
2449539072,2449604607,US
2449604608,2449670143,NO
2449670144,2449735679,LU
@@ -42119,7 +43969,9 @@
2450849792,2450915327,SE
2450915328,2451026431,US
2451026432,2451026687,AU
-2451026688,2451042815,US
+2451026688,2451031807,US
+2451031808,2451032063,SG
+2451032064,2451042815,US
2451042816,2451043071,ZA
2451043072,2451986959,US
2451986960,2451986960,GB
@@ -42143,7 +43995,7 @@
2453803008,2453805055,KZ
2453805056,2453807103,FI
2453807104,2453815295,GB
-2453815296,2453831679,RO
+2453815296,2453831679,BG
2453831680,2453833727,IQ
2453833728,2453835775,ES
2453835776,2453837823,FR
@@ -42164,11 +44016,14 @@
2454585344,2454716415,US
2454716416,2454781951,GB
2454781952,2454847487,FI
-2454847488,2454851583,US
+2454847488,2454851327,US
+2454851328,2454851583,DE
2454851584,2454851839,DK
2454851840,2454853119,US
2454853120,2454853375,DK
-2454853376,2454885503,US
+2454853376,2454864895,US
+2454864896,2454865151,FR
+2454865152,2454885503,US
2454885504,2454885631,GB
2454885632,2454887423,US
2454887424,2454887679,DK
@@ -42178,9 +44033,9 @@
2454905920,2454905951,AR
2454905952,2454906943,US
2454906944,2454906951,CL
-2454906952,2454907265,US
-2454907266,2454907266,CL
-2454907267,2454907903,US
+2454906952,2454907263,US
+2454907264,2454907391,CL
+2454907392,2454907903,US
2454907904,2454908159,VE
2454908160,2454913023,US
2454913024,2454978559,CL
@@ -42188,17 +44043,20 @@
2455175168,2455240703,GB
2455240704,2455244799,US
2455244800,2455245567,AU
-2455245568,2455245823,US
+2455245568,2455245823,SG
2455245824,2455246847,AU
2455246848,2455247871,IN
2455247872,2455248895,US
2455248896,2455257087,TH
2455257088,2455261183,PH
-2455261184,2455262207,US
+2455261184,2455262207,MY
2455262208,2455263231,KR
-2455263232,2455273471,US
+2455263232,2455265279,PH
+2455265280,2455273471,US
2455273472,2455275519,AU
-2455275520,2455371775,US
+2455275520,2455281663,US
+2455281664,2455285759,IN
+2455285760,2455371775,US
2455371776,2455437311,GB
2455437312,2455830527,US
2455830528,2455896063,GB
@@ -42234,7 +44092,8 @@
2457367552,2457372671,CZ
2457372672,2457376767,RU
2457376768,2457378815,DE
-2457378816,2457393151,RU
+2457378816,2457379839,NL
+2457379840,2457393151,RU
2457393152,2457397247,CZ
2457397248,2457403391,RU
2457403392,2457599999,US
@@ -42258,9 +44117,7 @@
2459893760,2459959295,CH
2459959296,2460024831,US
2460024832,2460090367,FI
-2460090368,2460152319,GB
-2460152320,2460152575,FR
-2460152576,2460155903,GB
+2460090368,2460155903,GB
2460155904,2460221439,US
2460221440,2460286975,BR
2460286976,2460549119,US
@@ -42269,7 +44126,9 @@
2460680192,2460745727,NZ
2460745728,2460811263,NO
2460811264,2460876799,SE
-2460876800,2460942335,US
+2460876800,2460920319,US
+2460920320,2460920575,GB
+2460920576,2460942335,US
2460942336,2461007871,BE
2461007872,2461138943,GB
2461138944,2461204479,AU
@@ -42371,7 +44230,9 @@
2466242560,2466250751,GE
2466250752,2466318335,US
2466318336,2466318591,SG
-2466318592,2466323455,US
+2466318592,2466319103,US
+2466319104,2466319359,AU
+2466319360,2466323455,US
2466323456,2466323711,SG
2466323712,2466326015,US
2466326016,2466326271,SG
@@ -42409,11 +44270,15 @@
2470248448,2470510591,US
2470510592,2470576127,BR
2470576128,2470641663,AU
-2470641664,2470707199,LU
+2470641664,2470703359,LU
+2470703360,2470703615,BE
+2470703616,2470707199,LU
2470707200,2470772735,GB
2470772736,2470838271,AU
2470838272,2471165951,US
-2471165952,2471231487,CH
+2471165952,2471198719,CH
+2471198720,2471211007,US
+2471211008,2471231487,CH
2471231488,2471297023,AU
2471297024,2471362559,GB
2471428096,2471690239,US
@@ -42449,7 +44314,10 @@
2473656320,2473721855,US
2473721856,2473730559,GB
2473730560,2473731071,HK
-2473731072,2473787391,GB
+2473731072,2473785707,GB
+2473785708,2473785708,US
+2473785709,2473785709,HK
+2473785710,2473787391,GB
2473787392,2474049535,US
2474049536,2474115071,GB
2474115072,2474246143,US
@@ -42529,16 +44397,22 @@
2483027968,2483093503,DO
2483093504,2483159039,US
2483159040,2483224575,SE
-2483224576,2483290111,GB
+2483224576,2483290111,ES
2483290112,2483421183,US
2483421184,2483486719,HU
2483486720,2486566911,US
2486566912,2486632447,CH
2486632448,2486697983,US
-2486697984,2486763519,AT
+2486697984,2486763519,DE
2486763520,2486960127,US
2486960128,2487025663,FR
-2487025664,2488205311,US
+2487025664,2487369727,US
+2487369728,2487369983,PF
+2487369984,2487370495,US
+2487370496,2487384319,PF
+2487384320,2487384575,US
+2487384576,2487386111,PF
+2487386112,2488205311,US
2488205312,2488270847,GB
2488270848,2488336383,US
2488336384,2488401919,PL
@@ -42550,11 +44424,7 @@
2489712640,2489745407,PE
2489745408,2489778175,HT
2489778176,2489843711,DO
-2489843712,2489995519,US
-2489995520,2489995544,SG
-2489995545,2489995545,US
-2489995546,2489995775,SG
-2489995776,2490013695,US
+2489843712,2490013695,US
2490013696,2490015743,GB
2490015744,2490043391,US
2490043392,2490043647,GB
@@ -42580,23 +44450,17 @@
2492989440,2493513727,US
2493513728,2493579263,SE
2493579264,2493644799,JP
-2493644800,2493755391,US
-2493755904,2493756415,US
-2493759488,2494103551,US
+2493644800,2494103551,US
2494103552,2494169087,FR
2494169088,2494562303,US
2494562304,2494627839,GB
2494627840,2494650623,US
2494650624,2494650879,BR
-2494650880,2494657535,US
-2494657536,2494657791,CO
-2494657792,2494677247,US
+2494650880,2494677247,US
2494677248,2494677503,AU
2494677504,2494677759,US
2494677760,2494678015,AU
-2494678016,2494683135,US
-2494683136,2494683391,SG
-2494683392,2494689791,US
+2494678016,2494689791,US
2494689792,2494690047,IN
2494690048,2494889983,US
2494889984,2494955519,GB
@@ -42604,13 +44468,13 @@
2495021056,2495152127,US
2495217664,2495283199,US
2495283200,2495348735,CH
-2495348736,2495410943,US
-2495410944,2495411199,AU
-2495411200,2495807487,US
+2495348736,2495807487,US
2495807488,2495873023,AU
2495873024,2495938559,CH
2495938560,2496004095,GB
-2496004096,2496069631,AT
+2496004096,2496015103,AT
+2496015104,2496015359,PL
+2496015360,2496069631,AT
2496069632,2496135167,US
2496135168,2496200703,NL
2496200704,2497682431,MX
@@ -42650,29 +44514,37 @@
2500149504,2500149759,GB
2500149760,2500150527,US
2500150528,2500150783,GB
-2500150784,2500158463,US
-2500158464,2500158719,GB
-2500158720,2500161023,US
+2500150784,2500161023,US
2500161024,2500161535,GB
-2500161536,2500162175,US
-2500162176,2500162815,GB
-2500162816,2500166207,US
-2500166208,2500166223,GB
-2500166224,2500175871,US
+2500161536,2500162559,US
+2500162560,2500162815,GB
+2500162816,2500166143,US
+2500166144,2500166399,GB
+2500166400,2500175871,US
2500175872,2500175879,RO
-2500175880,2500188159,US
-2500188160,2500188415,CH
-2500188416,2500198911,US
+2500175880,2500188679,US
+2500188680,2500188687,CH
+2500188688,2500196351,US
+2500196352,2500198399,FI
+2500198400,2500198911,US
2500198912,2500199167,GB
2500199168,2500199423,US
2500199424,2500199679,IE
-2500199680,2500201535,US
+2500199680,2500200703,US
+2500200704,2500200959,GB
+2500200960,2500201535,US
2500201536,2500201543,GB
2500201544,2500202879,US
2500202880,2500203007,ES
-2500203008,2500219135,US
+2500203008,2500212415,US
+2500212416,2500212423,CH
+2500212424,2500212991,US
+2500212992,2500213247,ES
+2500213248,2500219135,US
2500219136,2500219391,DE
-2500219392,2500225551,US
+2500219392,2500221455,US
+2500221456,2500221459,FR
+2500221460,2500225551,US
2500225552,2500225559,ES
2500225560,2500228607,US
2500228608,2500228863,FR
@@ -42694,25 +44566,27 @@
2500245504,2500245759,GB
2500245760,2500246015,US
2500246016,2500246527,GB
-2500246528,2500272127,US
+2500246528,2500247551,US
+2500247552,2500248063,ES
+2500248064,2500272127,US
2500272128,2500272639,GB
-2500272640,2500274431,US
-2500274432,2500274687,GB
-2500274688,2500275199,US
-2500275200,2500275711,GB
-2500275712,2500276223,US
+2500272640,2500276223,US
2500276224,2500276735,GB
2500276736,2500276991,US
2500276992,2500277247,GB
-2500277248,2500289023,US
-2500289024,2500289279,FR
-2500289280,2500292607,US
+2500277248,2500278751,US
+2500278752,2500278783,GB
+2500278784,2500289023,US
+2500289024,2500289151,FR
+2500289152,2500292607,US
2500292608,2500292863,DE
2500292864,2500293375,US
2500293376,2500293631,DE
-2500293632,2500319231,US
-2500319232,2500319743,ES
-2500319744,2500392959,US
+2500293632,2500313855,US
+2500313856,2500314111,AT
+2500314112,2500319231,US
+2500319232,2500321279,ES
+2500321280,2500392959,US
2500392960,2500393215,IN
2500393216,2500393983,US
2500393984,2500394239,GB
@@ -42720,9 +44594,13 @@
2500532750,2500532750,GR
2500532751,2500535295,US
2500535296,2500535551,IE
-2500535552,2500537687,US
+2500535552,2500537343,US
+2500537344,2500537599,GB
+2500537600,2500537687,US
2500537688,2500537695,GB
-2500537696,2500551679,US
+2500537696,2500542751,US
+2500542752,2500542755,NL
+2500542756,2500551679,US
2500551680,2500551935,FR
2500551936,2500553759,US
2500553760,2500553767,GB
@@ -42730,9 +44608,9 @@
2500554380,2500554487,DE
2500554488,2500555263,US
2500555264,2500555519,FR
-2500555520,2500558847,US
-2500558848,2500559103,FR
-2500559104,2500591615,US
+2500555520,2500568679,US
+2500568680,2500568683,GB
+2500568684,2500591615,US
2500591616,2500595711,GB
2500595712,2500608511,US
2500608512,2500608767,ES
@@ -42742,19 +44620,33 @@
2500616192,2500616703,IT
2500616704,2500636735,US
2500636736,2500636799,GB
-2500636800,2500638719,US
+2500636800,2500637727,US
+2500637728,2500637759,GB
+2500637760,2500638719,US
2500638720,2500639743,GB
-2500639744,2500644863,US
-2500644864,2500645119,FR
-2500645120,2500646911,US
+2500639744,2500646911,US
2500646912,2500647935,ES
-2500647936,2500687871,US
+2500647936,2500666111,US
+2500666112,2500666367,LU
+2500666368,2500666463,US
+2500666464,2500666471,LU
+2500666472,2500681759,US
+2500681760,2500681767,PL
+2500681768,2500687871,US
2500687872,2500689919,FR
2500689920,2500694271,US
-2500694272,2500694527,IT
-2500694528,2500719103,US
+2500694272,2500694783,IT
+2500694784,2500719103,US
2500719104,2500720639,IE
-2500720640,2501574655,US
+2500720640,2500720652,US
+2500720653,2500720653,IE
+2500720654,2500723799,US
+2500723800,2500723807,ES
+2500723808,2500743215,US
+2500743216,2500743223,GB
+2500743224,2500984831,US
+2500984832,2501001215,GB
+2501001216,2501574655,US
2501574656,2501640191,KZ
2501640192,2503016447,US
2503016448,2503081983,IL
@@ -42772,21 +44664,43 @@
2503911424,2503915519,ES
2503915520,2503917567,IT
2503917568,2503933951,BG
-2503933952,2504470527,US
+2503933952,2504180735,US
+2504180736,2504180991,ES
+2504180992,2504470527,US
2504470528,2504470783,ES
-2504470784,2504474623,US
+2504470784,2504472831,US
+2504472832,2504473599,ES
+2504473600,2504474623,US
2504474624,2504482815,HR
-2504482816,2504491007,US
+2504482816,2504486911,ES
+2504486912,2504491007,US
2504491008,2504499199,IT
2504499200,2504916991,US
2504916992,2504982527,IL
-2504982528,2505793535,US
+2504982528,2505457663,US
+2505457664,2505459711,IE
+2505459712,2505469439,US
+2505469440,2505469951,ES
+2505469952,2505474047,NL
+2505474048,2505482239,US
+2505482240,2505484287,NL
+2505484288,2505488383,US
+2505488384,2505490431,FR
+2505490432,2505504767,US
+2505504768,2505506815,FI
+2505506816,2505572351,US
+2505572352,2505637887,IL
+2505637888,2505793535,US
2505793536,2505801727,ES
2505801728,2506293247,US
2506293248,2506358783,CA
-2506358784,2506360831,US
+2506358784,2506359039,US
+2506359040,2506359295,ES
+2506359296,2506360831,US
2506360832,2506361087,ES
-2506361088,2507124735,US
+2506361088,2506401791,US
+2506401792,2506402815,IT
+2506402816,2507124735,US
2507124736,2507124991,IN
2507124992,2507145215,US
2507210752,2508062719,US
@@ -42816,7 +44730,9 @@
2508324864,2508455935,US
2508455936,2508521471,IT
2508521472,2508587007,CH
-2508587008,2508652543,BE
+2508587008,2508631295,BE
+2508631296,2508631551,US
+2508631552,2508652543,BE
2508652544,2508718079,AU
2508718080,2508914687,US
2508914688,2508980223,IT
@@ -43107,11 +45023,14 @@
2533097472,2533228543,US
2533228544,2533294079,PL
2533294080,2533359615,CN
-2533359616,2533373951,UA
-2533373952,2533375999,BG
+2533359616,2533369855,UA
+2533369856,2533371903,BG
+2533371904,2533375999,UA
2533376000,2533392383,HU
2533392384,2533425151,RO
-2533425152,2539978751,IT
+2533425152,2538602495,IT
+2538602496,2538635263,FR
+2538635264,2539978751,IT
2539978752,2540240895,US
2540240896,2540306431,FI
2540306432,2540896255,US
@@ -43143,7 +45062,7 @@
2545090560,2545156095,US
2545156096,2545221631,GB
2545221632,2545287167,US
-2545287168,2545352703,GB
+2545287168,2545352703,ES
2545352704,2545352959,SE
2545352960,2545418239,CH
2545418240,2545483775,NL
@@ -43154,8 +45073,10 @@
2545811456,2547187711,US
2547187712,2547318783,GB
2547318784,2547515391,US
-2547515392,2547523583,GB
+2547523584,2547535871,GB
+2547540480,2547540735,SE
2547553024,2547553279,RU
+2547580928,2547646463,DE
2548039680,2548563967,GB
2548563968,2548826111,IR
2548826112,2548829695,AT
@@ -43198,7 +45119,8 @@
2549612544,2549614591,SE
2549614592,2549616639,IT
2549616640,2549618687,BE
-2549618688,2549620735,DE
+2549618688,2549618943,US
+2549618944,2549620735,DE
2549620736,2549624831,PL
2549624832,2549626879,BE
2549626880,2549628927,PL
@@ -43208,7 +45130,8 @@
2549645312,2549678079,CH
2549678080,2549698559,GB
2549698560,2549700607,PL
-2549700608,2549701375,DE
+2549700608,2549700863,FR
+2549700864,2549701375,DE
2549701376,2549701631,SE
2549701632,2549701887,PL
2549701888,2549702143,FR
@@ -43236,7 +45159,8 @@
2549927936,2549929983,HR
2549929984,2549932031,DE
2549932032,2549940223,HR
-2549940224,2550136831,RO
+2549940224,2550005759,AE
+2550005760,2550136831,SA
2550136832,2550202367,DO
2550202368,2553544703,US
2553544704,2553610239,IN
@@ -43282,7 +45206,8 @@
2556780032,2556780799,SG
2556780800,2556821503,HK
2556821504,2556887039,SG
-2556887040,2557018111,HK
+2556887040,2556985343,HK
+2556985344,2557018111,CN
2557018112,2557083647,GB
2557083648,2557542399,ZA
2557542400,2557607935,US
@@ -43392,7 +45317,109 @@
2584412160,2584477695,CA
2584477696,2584608767,US
2584608768,2584739839,CH
-2584739840,2584805375,MU
+2584739840,2584739903,SG
+2584739904,2584740351,MU
+2584740352,2584740415,HK
+2584740416,2584740863,MU
+2584740864,2584740927,SG
+2584740928,2584741375,MU
+2584741376,2584741439,HK
+2584741440,2584741887,MU
+2584741888,2584741951,SG
+2584741952,2584742399,MU
+2584742400,2584742463,HK
+2584742464,2584742911,MU
+2584742912,2584742975,SG
+2584742976,2584743423,MU
+2584743424,2584743487,HK
+2584743488,2584743935,MU
+2584743936,2584743999,SG
+2584744000,2584744447,MU
+2584744448,2584744511,HK
+2584744512,2584744959,MU
+2584744960,2584745023,SG
+2584745024,2584745471,MU
+2584745472,2584745535,HK
+2584745536,2584745983,MU
+2584745984,2584746047,SG
+2584746048,2584746495,MU
+2584746496,2584746559,HK
+2584746560,2584747007,MU
+2584747008,2584747071,SG
+2584747072,2584747519,MU
+2584747520,2584747583,HK
+2584747584,2584748031,MU
+2584748032,2584748095,SG
+2584748096,2584748543,MU
+2584748544,2584748607,HK
+2584748608,2584749055,MU
+2584749056,2584749119,SG
+2584749120,2584749567,MU
+2584749568,2584749631,HK
+2584749632,2584750079,MU
+2584750080,2584750143,SG
+2584750144,2584750591,MU
+2584750592,2584750655,HK
+2584750656,2584751103,MU
+2584751104,2584751167,SG
+2584751168,2584751615,MU
+2584751616,2584751679,HK
+2584751680,2584752127,MU
+2584752128,2584752191,SG
+2584752192,2584752639,MU
+2584752640,2584752703,HK
+2584752704,2584753151,MU
+2584753152,2584753215,SG
+2584753216,2584753663,MU
+2584753664,2584753727,HK
+2584753728,2584754175,MU
+2584754176,2584754239,SG
+2584754240,2584754687,MU
+2584754688,2584754751,HK
+2584754752,2584755199,MU
+2584755200,2584755263,SG
+2584755264,2584755711,MU
+2584755712,2584755775,HK
+2584755776,2584756223,MU
+2584756224,2584756287,SG
+2584756288,2584756735,MU
+2584756736,2584756799,HK
+2584756800,2584757247,MU
+2584757248,2584757311,SG
+2584757312,2584757759,MU
+2584757760,2584757823,HK
+2584757824,2584758271,MU
+2584758272,2584758335,SG
+2584758336,2584758783,MU
+2584758784,2584758847,HK
+2584758848,2584759295,MU
+2584759296,2584759359,SG
+2584759360,2584759807,MU
+2584759808,2584759871,HK
+2584759872,2584760319,MU
+2584760320,2584760383,SG
+2584760384,2584760831,MU
+2584760832,2584760895,HK
+2584760896,2584761343,MU
+2584761344,2584761407,SG
+2584761408,2584761855,MU
+2584761856,2584761919,HK
+2584761920,2584762367,MU
+2584762368,2584762431,SG
+2584762432,2584762879,MU
+2584762880,2584762943,HK
+2584762944,2584763391,MU
+2584763392,2584763455,SG
+2584763456,2584763903,MU
+2584763904,2584763967,HK
+2584763968,2584764671,MU
+2584764672,2584768511,US
+2584768512,2584770559,MU
+2584770560,2584775423,US
+2584775424,2584775679,KE
+2584775680,2584777727,MU
+2584777728,2584803327,US
+2584803328,2584805375,MU
2584805376,2585001983,US
2585001984,2585067519,CA
2585067520,2585788415,US
@@ -43409,18 +45436,27 @@
2586610176,2586610431,ES
2586610432,2586610687,US
2586610688,2586611711,ES
-2586611712,2586611967,GB
-2586611968,2586619903,US
+2586611712,2586619903,US
2586619904,2586620415,FR
2586620416,2586622463,US
2586622464,2586622975,ES
-2586622976,2586640895,US
+2586622976,2586640383,US
+2586640384,2586640399,MC
+2586640400,2586640895,US
2586640896,2586641407,FR
2586641408,2586650687,US
2586650688,2586650703,DE
-2586650704,2586733567,US
+2586650704,2586650879,US
+2586650880,2586651135,NL
+2586651136,2586714879,US
+2586714880,2586715135,NL
+2586715136,2586733567,US
2586733568,2586733823,LT
-2586733824,2586804223,US
+2586733824,2586734591,US
+2586734592,2586735615,LT
+2586735616,2586788607,US
+2586788608,2586788863,GB
+2586788864,2586804223,US
2586804224,2586804479,ES
2586804480,2586828799,US
2586828800,2586829055,CH
@@ -43429,19 +45465,23 @@
2586874880,2586875135,US
2586875136,2586875903,ES
2586875904,2586876927,US
-2586876928,2586877951,ES
-2586877952,2586952191,US
+2586876928,2586879999,ES
+2586880000,2586952191,US
2586952192,2586952447,FR
2586952448,2587017215,US
2587017216,2587017471,IE
2587017472,2587018239,US
2587018240,2587018495,IE
-2587018496,2587021823,US
+2587018496,2587018671,US
+2587018672,2587018687,IE
+2587018688,2587019263,US
+2587019264,2587019775,IE
+2587019776,2587021823,US
2587021824,2587022335,IE
2587022336,2587066879,US
2587066880,2587067135,GB
-2587067136,2587067647,US
-2587067648,2587067903,GB
+2587067136,2587067391,US
+2587067392,2587067903,GB
2587067904,2587068415,US
2587068416,2587068479,GB
2587068480,2587071759,US
@@ -43454,27 +45494,45 @@
2587240390,2587240390,FR
2587240391,2587249417,US
2587249418,2587249418,FR
-2587249419,2587394047,US
+2587249419,2587378175,US
+2587378176,2587378431,IT
+2587378432,2587379967,US
+2587379968,2587380223,IT
+2587380224,2587394047,US
2587394048,2587394559,ES
-2587394560,2587396095,US
+2587394560,2587394815,US
+2587394816,2587395071,ES
+2587395072,2587396095,US
2587396096,2587399167,ES
-2587399168,2587443199,US
+2587399168,2587412479,US
+2587412480,2587414527,IT
+2587414528,2587443199,US
2587443200,2587447295,CH
2587447296,2587476760,US
2587476761,2587476761,LB
-2587476762,2587479119,US
+2587476762,2587477759,US
+2587477760,2587478015,LB
+2587478016,2587479119,US
2587479120,2587479120,LB
-2587479121,2587481969,US
+2587479121,2587481087,US
+2587481088,2587481343,LB
+2587481344,2587481969,US
2587481970,2587481970,LB
2587481971,2587492351,US
2587492352,2587493375,ES
2587493376,2587508735,US
2587508736,2587525119,GB
2587525120,2587542527,US
-2587542528,2587543551,ES
-2587543552,2587926527,US
+2587542528,2587544063,ES
+2587544064,2587582463,US
+2587582464,2587586559,NL
+2587586560,2587926527,US
2587926528,2587930623,BG
-2587930624,2587951103,US
+2587930624,2587939071,US
+2587939072,2587939583,PR
+2587939584,2587940607,US
+2587940608,2587940863,PR
+2587940864,2587951103,US
2587951104,2587952127,ZA
2587952128,2587953151,NG
2587953152,2587954175,MU
@@ -43483,9 +45541,10 @@
2587959296,2587961343,SN
2587961344,2587962367,ZA
2587962368,2587963391,SS
-2587963392,2587964415,SD
+2587963392,2587964027,SD
+2587964028,2587964028,SS
+2587964029,2587964415,SD
2587964416,2587965439,ZA
-2587965440,2587966463,KE
2587966464,2587967487,BF
2587967488,2587975679,ZA
2587975680,2587983871,GH
@@ -43550,7 +45609,7 @@
2588442624,2588459007,CM
2588459008,2588467199,UG
2588467200,2588471295,TN
-2588471296,2588476415,ZA
+2588471296,2588477439,ZA
2588477440,2588478463,NG
2588478464,2588479487,UG
2588479488,2588480511,ZA
@@ -43576,7 +45635,7 @@
2588494848,2588495871,SO
2588495872,2588496895,ZW
2588496896,2588497919,BW
-2588497920,2588498943,SD
+2588497920,2588498943,SS
2588498944,2588499967,DZ
2588499968,2588500991,ZA
2588500992,2588502015,CI
@@ -43588,21 +45647,38 @@
2588507136,2588508159,SO
2588508160,2588510207,LY
2588510208,2588512255,ZA
-2588522496,2588526591,ZA
+2588512256,2588514303,TZ
+2588514304,2588516351,ZA
+2588516352,2588518399,TD
+2588518400,2588519423,TZ
+2588519424,2588520447,SN
+2588520448,2588521471,SL
+2588521472,2588526591,ZA
2588526592,2588528639,CM
-2588528640,2588530687,ZA
-2588532736,2588534783,ZA
-2588536832,2588538879,ZA
+2588528640,2588534783,ZA
+2588534784,2588535807,ZM
+2588535808,2588536831,NG
+2588536832,2588540927,ZA
2588672000,2588934143,KE
2588934144,2589982719,SC
2589982720,2590507007,SD
2590507008,2591031295,TN
2591031296,2591096831,GA
2591293440,2591326207,GA
+2591326208,2591358975,AO
+2591424512,2591457279,NG
+2591485952,2591486975,SO
+2591486976,2591487999,ZA
+2591488000,2591489023,GA
+2591489024,2591490047,ZA
+2591490048,2591498239,BI
+2591498240,2591510527,ZA
+2591510528,2591514623,ZW
+2591514624,2591522815,SZ
2591522816,2591526911,LR
-2591531008,2591539199,ZA
+2591526912,2591539199,ZA
2591539200,2591547391,GA
-2591547392,2591555583,ZA
+2591547392,2591571967,ZA
2591571968,2591588351,NG
2591588352,2591604735,MG
2591604736,2591612927,MU
@@ -43615,21 +45691,20 @@
2592006144,2592022527,TZ
2592022528,2592026623,BJ
2592026624,2592026879,US
-2592026880,2592027391,MU
+2592026880,2592027391,ZA
2592027392,2592027647,GB
-2592027648,2592028159,MU
+2592027648,2592028159,ZA
2592028160,2592028415,CA
-2592028416,2592028671,MU
+2592028416,2592028671,ZA
2592028672,2592028799,NG
2592028800,2592028927,KE
-2592028928,2592029183,MU
+2592028928,2592029183,ZA
2592029184,2592029311,CI
-2592029312,2592029695,MU
-2592029696,2592030207,ZA
+2592029312,2592030207,ZA
2592030208,2592030335,GH
2592030336,2592030463,CM
2592030464,2592030591,UG
-2592030592,2592030719,MU
+2592030592,2592030719,ZA
2592030720,2592034815,LY
2592034816,2592038911,NE
2592038912,2592043007,DZ
@@ -43678,9 +45753,7 @@
2609119232,2609184767,FR
2609184768,2609250303,PL
2609250304,2609381375,US
-2609381376,2609428479,GB
-2609428480,2609428735,IN
-2609428736,2609446911,GB
+2609381376,2609446911,GB
2609446912,2609512447,DK
2609512448,2609643519,US
2609643520,2609709055,GB
@@ -43717,9 +45790,7 @@
2614165504,2614231039,NO
2614231040,2614296575,ES
2614296576,2614362111,BR
-2614362112,2614386431,US
-2614386432,2614386559,PR
-2614386560,2615083007,US
+2614362112,2615083007,US
2615083008,2615148543,TR
2615148544,2615345151,US
2615345152,2615410687,NO
@@ -43773,7 +45844,7 @@
2617146624,2617146879,GY
2617146880,2617147135,DE
2617147136,2617147391,AO
-2617147392,2617148159,US
+2617147392,2617148415,US
2617151488,2617155583,CA
2617155584,2617163775,US
2617163776,2617164031,SK
@@ -43903,12 +45974,15 @@
2625961984,2626027519,LU
2626027520,2626093055,US
2626093056,2626158591,CH
-2626158592,2626879487,US
+2626158592,2626224127,US
+2626224128,2626289663,CZ
+2626289664,2626879487,US
2626879488,2626945023,KR
2626945024,2627010559,SI
2627010560,2627076095,NZ
2627076096,2627141631,NL
2627141632,2627403775,US
+2627469312,2627731455,TZ
2634022912,2634088447,CN
2634088448,2634350591,JP
2634416128,2635005951,JP
@@ -44005,7 +46079,9 @@
2647326720,2647392255,GB
2647392256,2647457791,US
2647457792,2647523327,JP
-2647523328,2647687167,US
+2647523328,2647605503,US
+2647605504,2647605759,GB
+2647605760,2647687167,US
2647687168,2647687423,CA
2647687424,2647851007,US
2647851008,2647916543,AU
@@ -44064,7 +46140,9 @@
2655125504,2655191039,PL
2655256576,2655715327,US
2655715328,2655780863,PL
-2655780864,2656632831,US
+2655780864,2656387071,US
+2656387072,2656403455,CA
+2656403456,2656632831,US
2656632832,2656698367,AU
2656698368,2656763903,FI
2656763904,2656829439,US
@@ -44087,7 +46165,9 @@
2658009088,2658074623,IT
2658074624,2658140159,US
2658140160,2658205695,NO
-2658205696,2658598911,US
+2658205696,2658451455,US
+2658451456,2658451711,MY
+2658451712,2658598911,US
2658598912,2658664447,GB
2658664448,2658926591,US
2658926592,2659057663,GB
@@ -44119,9 +46199,7 @@
2661548032,2661679103,US
2661679104,2661885951,LU
2661885952,2661886207,BE
-2661886208,2661909247,LU
-2661909248,2661909503,BE
-2661909504,2661914111,LU
+2661886208,2661914111,LU
2661914112,2661914367,BE
2661914368,2661941247,LU
2661941248,2662006783,CL
@@ -44155,7 +46233,9 @@
2665545728,2665611263,DE
2665611264,2665676799,CH
2665676800,2665742335,ES
-2665742336,2665873407,US
+2665742336,2665783551,US
+2665783552,2665783807,GB
+2665783808,2665873407,US
2665873408,2665938943,GB
2665938944,2666004479,FR
2666004480,2666070015,CH
@@ -44178,8 +46258,7 @@
2667528192,2667532287,FR
2667532288,2667534335,RU
2667534336,2667536383,PL
-2667536384,2667536639,FR
-2667536640,2667537087,AT
+2667536384,2667537087,AT
2667537088,2667537119,FR
2667537120,2667537151,AT
2667537152,2667541503,FR
@@ -44225,7 +46304,10 @@
2668102648,2668102655,US
2668102656,2668102991,NL
2668102992,2668102999,US
-2668103000,2668103743,NL
+2668103000,2668103719,NL
+2668103720,2668103727,US
+2668103728,2668103735,NL
+2668103736,2668103743,US
2668103744,2668103775,KE
2668103776,2668104127,NL
2668104128,2668104135,GB
@@ -44233,8 +46315,164 @@
2668104192,2668104207,KE
2668104208,2668104247,NL
2668104248,2668104255,US
-2668104256,2668167167,NL
-2668167168,2668363775,US
+2668104256,2668104999,NL
+2668105000,2668105015,US
+2668105016,2668105063,NL
+2668105064,2668105071,US
+2668105072,2668105135,NL
+2668105136,2668105151,US
+2668105152,2668105223,NL
+2668105224,2668105239,US
+2668105240,2668105255,NL
+2668105256,2668105271,US
+2668105272,2668105287,NL
+2668105288,2668105351,US
+2668105352,2668105383,NL
+2668105384,2668105391,US
+2668105392,2668105399,NL
+2668105400,2668105439,US
+2668105440,2668105471,NL
+2668105472,2668105479,US
+2668105480,2668105727,NL
+2668105728,2668105791,US
+2668105792,2668106935,NL
+2668106936,2668106943,US
+2668106944,2668106951,NL
+2668106952,2668106959,US
+2668106960,2668107599,NL
+2668107600,2668107607,US
+2668107608,2668107711,NL
+2668107712,2668107759,US
+2668107760,2668107767,NL
+2668107768,2668107775,US
+2668107776,2668108303,NL
+2668108304,2668108335,US
+2668108336,2668108343,CA
+2668108344,2668108359,US
+2668108360,2668108383,NL
+2668108384,2668108391,US
+2668108392,2668108399,NL
+2668108400,2668108415,US
+2668108416,2668108799,NL
+2668108800,2668108807,US
+2668108808,2668108823,NL
+2668108824,2668108831,US
+2668108832,2668108855,NL
+2668108856,2668108863,US
+2668108864,2668108887,NL
+2668108888,2668108903,US
+2668108904,2668108919,NL
+2668108920,2668108927,US
+2668108928,2668108935,NL
+2668108936,2668108951,GB
+2668108952,2668108967,NL
+2668108968,2668108983,US
+2668108984,2668108999,NL
+2668109000,2668109023,US
+2668109024,2668109031,NL
+2668109032,2668109047,US
+2668109048,2668109063,NL
+2668109064,2668109071,US
+2668109072,2668109615,NL
+2668109616,2668109623,US
+2668109624,2668109639,NL
+2668109640,2668109663,US
+2668109664,2668109671,NL
+2668109672,2668109687,US
+2668109688,2668109695,NL
+2668109696,2668109743,US
+2668109744,2668109751,NL
+2668109752,2668109759,US
+2668109760,2668109951,NL
+2668109952,2668110047,US
+2668110048,2668110271,NL
+2668110272,2668110303,US
+2668110304,2668110335,NL
+2668110336,2668110911,US
+2668110912,2668110943,NL
+2668110944,2668111039,US
+2668111040,2668111071,NL
+2668111072,2668111231,US
+2668111232,2668111327,NL
+2668111328,2668111359,US
+2668111360,2668111471,NL
+2668111472,2668111487,US
+2668111488,2668111743,NL
+2668111744,2668111903,US
+2668111904,2668111967,NL
+2668111968,2668112159,US
+2668112160,2668112191,NL
+2668112192,2668112223,US
+2668112224,2668112303,NL
+2668112304,2668112319,US
+2668112320,2668112575,NL
+2668112576,2668112607,US
+2668112608,2668112735,NL
+2668112736,2668112767,US
+2668112768,2668112799,NL
+2668112800,2668112895,US
+2668112896,2668112959,NL
+2668112960,2668112991,US
+2668112992,2668113055,NL
+2668113056,2668113151,US
+2668113152,2668113183,NL
+2668113184,2668113407,US
+2668113408,2668113567,NL
+2668113568,2668113585,US
+2668113586,2668113586,NL
+2668113587,2668113599,US
+2668113600,2668113607,JO
+2668113608,2668113623,US
+2668113624,2668113631,JO
+2668113632,2668113639,NL
+2668113640,2668113647,US
+2668113648,2668113759,NL
+2668113760,2668113791,US
+2668113792,2668113823,NL
+2668113824,2668113919,US
+2668113920,2668113951,NL
+2668113952,2668113983,US
+2668113984,2668114015,NL
+2668114016,2668114271,US
+2668114272,2668114335,NL
+2668114336,2668114367,US
+2668114368,2668114591,NL
+2668114592,2668114623,US
+2668114624,2668114639,NL
+2668114640,2668114719,US
+2668114720,2668114879,NL
+2668114880,2668114943,US
+2668114944,2668114959,NL
+2668114960,2668114991,US
+2668114992,2668115007,NL
+2668115008,2668115039,US
+2668115040,2668115071,NL
+2668115072,2668115087,US
+2668115088,2668115135,NL
+2668115136,2668115151,US
+2668115152,2668115279,NL
+2668115280,2668115343,US
+2668115344,2668115375,NL
+2668115376,2668115391,US
+2668115392,2668115711,NL
+2668115712,2668115775,US
+2668115776,2668115807,NL
+2668115808,2668115839,US
+2668115840,2668116319,NL
+2668116320,2668116335,IT
+2668116336,2668116511,NL
+2668116512,2668116543,US
+2668116544,2668116863,NL
+2668116864,2668116895,US
+2668116896,2668116927,NL
+2668116928,2668116991,US
+2668116992,2668118015,NL
+2668118016,2668134399,FR
+2668134400,2668150783,GB
+2668150784,2668167167,NL
+2668167168,2668286463,US
+2668286464,2668286719,GB
+2668286720,2668363775,US
2668363776,2668429311,CH
2668429312,2668494847,AU
2668494848,2668560383,US
@@ -44253,9 +46491,14 @@
2668916736,2668918783,TR
2668918784,2668920831,ES
2668920832,2668953599,IT
-2668953600,2668989951,US
+2668953600,2668969983,US
+2668969984,2668971007,GB
+2668971008,2668987135,US
+2668987136,2668987391,AU
+2668987392,2668989951,US
2668989952,2668990463,NZ
-2668990464,2669019135,US
+2668990464,2668991487,IN
+2668991488,2669019135,US
2669019136,2669084671,CH
2669084672,2669150207,ES
2669150208,2669215743,US
@@ -44280,9 +46523,11 @@
2671378432,2671443967,NO
2671443968,2671509503,US
2671509504,2671575039,NL
-2671575040,2671720191,US
-2671720192,2671720447,VE
-2671720448,2671749119,US
+2671575040,2671711479,US
+2671711480,2671711483,DE
+2671711484,2671718827,US
+2671718828,2671718831,GB
+2671718832,2671749119,US
2671749120,2671750143,CA
2671750144,2672295935,US
2672295936,2672361471,SE
@@ -44303,9 +46548,9 @@
2673737728,2673803263,US
2673803264,2673868799,FR
2673868800,2674130943,US
-2674130944,2674163711,GB
-2674163712,2674171903,CA
-2674171904,2674175999,GB
+2674130944,2674147327,GB
+2674147328,2674163711,NL
+2674163712,2674175999,GB
2674176000,2674192383,US
2674192384,2674196479,CH
2674196480,2674249727,GB
@@ -44324,8 +46569,24 @@
2675048448,2675113983,GB
2675113984,2675245055,US
2675245056,2675310591,NZ
-2675310592,2675572735,US
-2675572736,2675638271,NL
+2675310592,2675572767,US
+2675572768,2675572799,NL
+2675572800,2675572831,US
+2675572832,2675572863,NL
+2675572864,2675572895,US
+2675572896,2675589551,NL
+2675589552,2675589553,US
+2675589554,2675589567,NL
+2675589568,2675589599,US
+2675589600,2675590207,NL
+2675590208,2675590239,US
+2675590240,2675590335,NL
+2675590336,2675590351,US
+2675590352,2675590367,NL
+2675590368,2675590415,US
+2675590416,2675590431,NL
+2675590432,2675590975,US
+2675590976,2675638271,NL
2675638272,2675965951,US
2675965952,2676031487,CA
2676031488,2676097023,US
@@ -44337,23 +46598,25 @@
2677080064,2677145599,US
2677145600,2677178367,TR
2677178368,2677211135,UA
-2677211136,2677276671,GB
+2677211136,2677276671,ES
2677276672,2677342207,LV
2677342208,2677407743,IT
2677407744,2677473279,US
2677473280,2677538815,FR
2677538816,2677604351,FI
-2677604352,2677622783,US
-2677622784,2677623039,IE
-2677623040,2677635071,US
+2677604352,2677635071,US
2677635072,2677636095,CN
2677636096,2677639679,US
2677639680,2677639935,CA
2677639936,2677642239,US
2677642240,2677642495,ES
-2677642496,2677642751,US
+2677642496,2677642751,CA
2677642752,2677643007,SE
-2677643008,2677648383,US
+2677643008,2677644287,US
+2677644288,2677644347,GB
+2677644348,2677644348,US
+2677644349,2677644543,GB
+2677644544,2677648383,US
2677648384,2677649407,JP
2677649408,2677650431,US
2677650432,2677650943,RO
@@ -44368,7 +46631,9 @@
2677669888,2677735423,DE
2677735424,2677800959,US
2677800960,2677866495,CH
-2677866496,2677997567,US
+2677866496,2677924863,US
+2677924864,2677925119,GB
+2677925120,2677997567,US
2677997568,2678063103,CA
2678063104,2678128639,UA
2678128640,2678194175,US
@@ -44411,7 +46676,12 @@
2679242752,2679308287,US
2679308288,2679373823,CH
2679373824,2679406591,GB
-2679406592,2679422975,BR
+2679406592,2679414783,US
+2679414784,2679415307,PR
+2679415308,2679415308,DE
+2679415309,2679418879,PR
+2679418880,2679420927,SG
+2679420928,2679422975,PR
2679422976,2679431167,US
2679431168,2679439359,FR
2679439360,2679523327,US
@@ -44448,7 +46718,9 @@
2682014208,2682014719,GB
2682014720,2682015231,US
2682015232,2682015487,IN
-2682015488,2682123263,US
+2682015488,2682107903,US
+2682107904,2682108159,GB
+2682108160,2682123263,US
2682123264,2682123519,AU
2682123520,2682257407,US
2682257408,2682322943,UA
@@ -44467,8 +46739,9 @@
2683371520,2683437055,CH
2683437056,2683568127,US
2683568128,2683633663,GB
-2683637760,2683637859,NL
-2683637861,2683641855,NL
+2683637760,2683637859,FR
+2683637861,2683638015,FR
+2683638016,2683641855,NL
2683641856,2683645951,US
2683646208,2683650047,SG
2683650048,2683651071,US
@@ -44530,20 +46803,21 @@
2684192980,2684192983,US
2684192984,2684193147,NL
2684193148,2684193151,US
-2684193152,2684193275,NL
+2684193152,2684193175,NL
+2684193176,2684193183,US
+2684193184,2684193275,NL
2684193276,2684193279,US
-2684193280,2684193447,NL
-2684193448,2684193455,AZ
-2684193456,2684193583,NL
+2684193280,2684193583,NL
2684193584,2684193591,IE
2684193592,2684193735,NL
2684193736,2684193743,US
-2684193744,2684193887,NL
+2684193744,2684193751,NL
+2684193752,2684193759,US
+2684193760,2684193887,NL
2684193888,2684193911,US
2684193912,2684193931,NL
2684193932,2684193935,US
-2684193936,2684194002,NL
-2684194003,2684194003,BH
+2684193936,2684194003,NL
2684194004,2684194007,US
2684194008,2684194071,NL
2684194072,2684194079,US
@@ -44551,7 +46825,9 @@
2684194144,2684194151,US
2684194152,2684194167,NL
2684194168,2684194171,US
-2684194172,2684194351,NL
+2684194172,2684194319,NL
+2684194320,2684194327,SA
+2684194328,2684194351,NL
2684194352,2684194359,US
2684194360,2684194487,NL
2684194488,2684194495,GB
@@ -44595,7 +46871,9 @@
2684196940,2684196943,US
2684196944,2684196959,NL
2684196960,2684196963,US
-2684196964,2684197099,NL
+2684196964,2684197031,NL
+2684197032,2684197039,IT
+2684197040,2684197099,NL
2684197100,2684197103,US
2684197104,2684197115,NL
2684197116,2684197119,US
@@ -44660,9 +46938,8 @@
2687041536,2687238143,US
2687238144,2687297231,DE
2687297232,2687297239,GB
-2687297240,2687301375,DE
-2687301376,2687301631,NL
-2687301632,2687560191,DE
+2687297240,2687297247,SE
+2687297248,2687560191,DE
2687560192,2687560447,ZA
2687560448,2687762431,DE
2687762432,2687827967,AT
@@ -44735,6 +47012,7 @@
2692284416,2692546559,ZA
2692546560,2694316031,US
2694381568,2694447103,US
+2694840320,2696151039,MA
2696151040,2696216575,IT
2696216576,2696282111,ZA
2696413184,2696478719,ZA
@@ -44744,8 +47022,8 @@
2697854976,2697889791,AU
2697889792,2697891839,US
2697891840,2697892863,AU
-2697892864,2697894143,US
-2697894144,2697920511,AU
+2697892864,2697894399,US
+2697894400,2697920511,AU
2697920512,2698117119,US
2698117120,2698182655,IS
2698182656,2698248191,DE
@@ -44759,6 +47037,7 @@
2698838016,2698903551,BE
2698903552,2698969087,AU
2698969088,2699034623,CA
+2699034624,2699165695,AO
2699231232,2699296767,US
2699296768,2699362303,FR
2699362304,2699624447,US
@@ -44778,7 +47057,8 @@
2701156352,2701160447,CW
2701160448,2701162495,TT
2701162496,2701164543,UY
-2701164544,2701172735,HT
+2701164544,2701170687,HT
+2701170688,2701172735,TT
2701172736,2701176831,CL
2701176832,2701178879,AR
2701178880,2701180927,CL
@@ -44813,7 +47093,7 @@
2702835712,2702901247,US
2702901248,2702966783,IT
2702966784,2703032319,US
-2703032320,2703097855,NZ
+2703032320,2703097855,AU
2703097856,2703163391,GB
2703163392,2703556607,US
2703556608,2703622143,ES
@@ -44826,9 +47106,7 @@
2704343040,2704408575,US
2704408576,2704474111,AU
2704474112,2704476927,US
-2704476928,2704476929,GB
-2704476930,2704476930,US
-2704476931,2704477183,GB
+2704476928,2704477183,GB
2704477184,2704485119,US
2704485120,2704485375,AU
2704485376,2704539647,US
@@ -44843,13 +47121,16 @@
2705195008,2705260543,CH
2705260544,2705326079,US
2705326080,2705391615,MO
-2705391616,2705522687,NZ
+2705391616,2705399807,AU
+2705399808,2705407999,NZ
+2705408000,2705432575,AU
+2705432576,2705440767,NZ
+2705440768,2705456895,AU
+2705456896,2705522687,NZ
2705522688,2705588223,ES
2705588224,2705596159,US
2705596160,2705596415,CA
-2705596416,2705621247,US
-2705621248,2705621503,CH
-2705621504,2705691647,US
+2705596416,2705691647,US
2705691648,2705692671,GB
2705692672,2705710079,US
2705710080,2705711103,IN
@@ -44911,12 +47192,38 @@
2713583616,2713649151,AR
2713649152,2713946367,US
2713946368,2713946623,CA
-2713946624,2713976831,US
+2713946624,2713946879,GB
+2713946880,2713976831,US
2713976832,2714042367,VE
2714042368,2714238975,US
2714238976,2714304511,TH
2714304512,2714370047,US
-2714370048,2714435583,NL
+2714370048,2714386511,NL
+2714386512,2714386527,US
+2714386528,2714386943,NL
+2714386944,2714387199,JP
+2714387200,2714387455,US
+2714387456,2714387471,JP
+2714387472,2714387519,US
+2714387520,2714387583,NL
+2714387584,2714387615,US
+2714387616,2714387647,NL
+2714387648,2714387711,US
+2714387712,2714387743,NL
+2714387744,2714387775,US
+2714387776,2714388607,NL
+2714388608,2714388671,US
+2714388672,2714401791,NL
+2714401792,2714401823,US
+2714401824,2714401999,NL
+2714402000,2714402015,US
+2714402016,2714402017,NL
+2714402018,2714402019,US
+2714402020,2714402047,NL
+2714402048,2714402175,US
+2714402176,2714402303,NL
+2714402304,2714402559,JP
+2714402560,2714435583,NL
2714435584,2714697727,US
2714697728,2714763263,CN
2714763264,2715025407,US
@@ -45003,7 +47310,9 @@
2731674624,2731679743,US
2731679744,2731680767,CA
2731680768,2731681791,US
-2731681792,2731682815,PR
+2731681792,2731682047,PR
+2731682048,2731682303,VI
+2731682304,2731682815,PR
2731682816,2731685887,US
2731685888,2731686911,CA
2731686912,2731688959,US
@@ -45074,7 +47383,9 @@
2732111872,2732113919,CA
2732113920,2732136447,US
2732136448,2732138495,CA
-2732138496,2732189695,US
+2732138496,2732159999,US
+2732161024,2732170239,US
+2732171264,2732189695,US
2732189696,2732192767,CA
2732192768,2732201983,US
2732201984,2732203007,VG
@@ -45087,9 +47398,7 @@
2732220416,2732227583,US
2732227584,2732228607,CA
2732228608,2732261375,US
-2732261376,2732262399,CA
-2732262400,2732263423,US
-2732263424,2732265471,CA
+2732261376,2732265471,CA
2732265472,2732273663,US
2732273664,2732275711,CA
2732275712,2732278783,US
@@ -45112,7 +47421,8 @@
2732351488,2732353535,PR
2732353536,2732361727,US
2732361728,2732363775,BB
-2732363776,2732375039,US
+2732363776,2732371967,US
+2732372992,2732375039,US
2732375040,2732376063,CA
2732376064,2732379135,US
2732379136,2732380159,CA
@@ -45231,7 +47541,9 @@
2734200832,2734205951,CA
2734205952,2734206975,US
2734206976,2734209023,CA
-2734209024,2734229503,US
+2734209024,2734218239,US
+2734218240,2734218751,CA
+2734218752,2734229503,US
2734229504,2734230527,CA
2734230528,2734237695,US
2734237696,2734238719,CA
@@ -45352,12 +47664,15 @@
2737769472,2737770495,IN
2737770496,2737771263,AU
2737771264,2737771519,JP
-2737771520,2737772031,AU
-2737772544,2737774591,JP
+2737771520,2737771775,AU
+2737771776,2737772031,NZ
+2737772288,2737774591,JP
2737774592,2737776639,BD
2737776640,2737777663,AU
2737777664,2737778175,HK
-2737778432,2737785855,AU
+2737778432,2737781759,AU
+2737781760,2737782783,US
+2737782784,2737785855,AU
2737785856,2737788927,BD
2737788928,2737789951,MY
2737789952,2737793023,AU
@@ -45402,7 +47717,6 @@
2738167808,2738168831,AU
2738168832,2738177023,CN
2738177024,2738178047,AU
-2738178048,2738179071,HK
2738179072,2738182143,IN
2738182144,2738195455,CN
2738195456,2738196479,BD
@@ -45449,7 +47763,7 @@
2744844288,2744909823,CA
2744909824,2744975359,GB
2744975360,2745040895,SE
-2745040896,2745106431,DE
+2745040896,2745106431,NL
2745106432,2745171967,SI
2745171968,2745237503,GB
2745237504,2745303039,CH
@@ -45471,7 +47785,9 @@
2746482688,2746548223,KR
2746548224,2746824703,US
2746824704,2746824959,CA
-2746824960,2747072511,US
+2746824960,2746839295,US
+2746839296,2746839551,CA
+2746839552,2747072511,US
2747072512,2747138047,AU
2747138048,2747465727,US
2747465728,2748055551,ZA
@@ -45495,7 +47811,9 @@
2750873600,2750939135,CL
2750939136,2751070207,US
2751070208,2751135743,CL
-2751135744,2751397887,US
+2751135744,2751176703,US
+2751176704,2751176959,GU
+2751176960,2751397887,US
2751397888,2751463423,KR
2751463424,2751528959,KZ
2751528960,2751660031,FR
@@ -45597,7 +47915,7 @@
2760529920,2760531967,RU
2760534016,2760536063,BE
2760536064,2760540159,IL
-2760540160,2760556543,RO
+2760540160,2760556543,IR
2760556544,2760558591,DE
2760558592,2760562687,ES
2760562688,2760564735,BG
@@ -45637,9 +47955,7 @@
2765568000,2765570047,IR
2765570048,2765578239,RU
2765578240,2765580287,AZ
-2765580288,2765581567,GB
-2765581568,2765581823,ZA
-2765581824,2765582335,GB
+2765580288,2765582335,GB
2765582336,2765586431,CZ
2765586432,2765619199,IR
2765619200,2768240639,US
@@ -45661,7 +47977,9 @@
2770337792,2770993151,US
2770993152,2771124223,IN
2771124224,2771451903,US
+2771517440,2771648511,TN
2771648512,2771910655,ZA
+2771910656,2772434943,ZM
2772434944,2772631551,US
2772697088,2772762623,US
2772762624,2772828159,AU
@@ -45717,8 +48035,8 @@
2780561408,2780758015,US
2780758016,2780823551,AU
2780823552,2780925951,US
-2780925952,2780926207,GB
-2780926208,2780926975,US
+2780925952,2780926463,GB
+2780926464,2780926975,US
2780926976,2780927487,GB
2780927488,2780927743,US
2780927744,2780927999,GB
@@ -45768,11 +48086,12 @@
2784165888,2784296959,KR
2784296960,2784362495,US
2784362496,2784428031,KR
-2784428032,2784952319,US
-2785017856,2785300735,US
-2785300736,2785300991,PR
-2785300992,2785542143,US
-2785542144,2786066431,CH
+2784428032,2784952063,US
+2784952064,2784952319,NL
+2785017856,2785542143,US
+2785542144,2785673215,CH
+2785673216,2785738751,NL
+2785738752,2786066431,CH
2786066432,2788163583,US
2788163584,2788229119,CA
2788229120,2788261887,US
@@ -45796,6 +48115,7 @@
2790653952,2790719487,US
2790719488,2790785023,SA
2790785024,2791112703,US
+2791135872,2791135872,US
2791170304,2791170559,US
2791178240,2791571455,US
2791571456,2791636991,JP
@@ -45832,13 +48152,13 @@
2803826688,2803892223,US
2803892224,2805465087,CA
2805465088,2805989375,UY
-2805989376,2806012927,US
-2806012928,2806013183,HK
-2806013184,2806644735,US
+2805989376,2806644735,US
2806644736,2806710271,CA
2806710272,2807103487,US
2807103488,2807169023,NL
-2807169024,2807566335,US
+2807169024,2807271679,US
+2807271680,2807271935,AU
+2807271936,2807566335,US
2807566336,2807574527,CA
2807574528,2807587071,US
2807587072,2807587327,IT
@@ -45867,7 +48187,11 @@
2808872960,2808938495,UY
2808938496,2809069567,US
2809069568,2809135103,SA
-2809135104,2809397247,US
+2809135104,2809266175,US
+2809266176,2809286975,CA
+2809286976,2809286991,US
+2809286992,2809331711,CA
+2809331712,2809397247,US
2809397248,2809462783,UY
2809462784,2809855999,US
2809856000,2809921535,AU
@@ -45943,9 +48267,11 @@
2816264704,2816270335,US
2816270336,2816271615,SG
2816271616,2816271871,JP
-2816271872,2816272383,IN
+2816271872,2816272127,IN
+2816272128,2816272383,AU
2816272384,2816273407,JP
-2816273408,2816275455,IN
+2816273408,2816274431,IN
+2816274432,2816275455,AU
2816275456,2816278527,SG
2816278528,2816671743,US
2816671744,2816737279,CA
@@ -45955,8 +48281,7 @@
2817277952,2817294335,NL
2817294336,2817933055,US
2817933056,2817933311,CA
-2817933312,2817933567,PR
-2817933568,2818002943,US
+2817933312,2818002943,US
2818002944,2818003722,GB
2818003723,2818003723,US
2818003724,2818004991,GB
@@ -45964,7 +48289,9 @@
2818244608,2818310143,US
2818310144,2818375679,AR
2818375680,2818572287,US
-2818637824,2818703359,NL
+2818637824,2818654207,NL
+2818654208,2818670591,AU
+2818670592,2818703359,NL
2818703360,2822731894,US
2822731895,2822731895,GB
2822731896,2823159807,US
@@ -46050,7 +48377,9 @@
2829844480,2829910015,ZA
2829910016,2830066431,US
2830066432,2830066687,HK
-2830066688,2830106623,US
+2830066688,2830085887,US
+2830085888,2830086143,GB
+2830086144,2830106623,US
2830106624,2830172159,CO
2830172160,2830434303,US
2830499840,2830761983,US
@@ -46079,7 +48408,7 @@
2833907712,2833973247,GT
2833973248,2834010111,US
2834010112,2834014207,CA
-2834018304,2834030591,US
+2834014208,2834030591,US
2834030592,2834034687,CA
2834034688,2834497535,US
2834497536,2834563071,SV
@@ -46090,11 +48419,83 @@
2835218432,2835283967,US
2835283968,2835349503,MX
2835480576,2837446655,US
-2837446656,2838822911,CH
-2838822912,2839019519,NL
+2837446656,2837839871,CH
+2837839872,2837905407,NL
+2837905408,2838298623,CH
+2838298624,2838495231,NL
+2838495232,2838691839,CH
+2838691840,2838757375,NL
+2838757376,2838822911,CH
+2838822912,2838823679,US
+2838823680,2838823743,NL
+2838823744,2838823935,US
+2838823936,2838823999,NL
+2838824000,2838824031,US
+2838824032,2838824063,NL
+2838824064,2838824095,US
+2838824096,2838824127,NL
+2838824128,2838824191,US
+2838824192,2838824223,NL
+2838824224,2838824479,US
+2838824480,2838824607,NL
+2838824608,2838824639,US
+2838824640,2838824799,NL
+2838824800,2838824815,US
+2838824816,2838824879,NL
+2838824880,2838824895,US
+2838824896,2838824911,NL
+2838824912,2838824959,US
+2838824960,2838824991,NL
+2838824992,2838825023,US
+2838825024,2838825055,NL
+2838825056,2838825087,US
+2838825088,2838825119,NL
+2838825120,2838825151,US
+2838825152,2838825183,NL
+2838825184,2838825215,US
+2838825216,2838825247,NL
+2838825248,2838825343,US
+2838825344,2838825375,NL
+2838825376,2838825471,US
+2838825472,2838825599,NL
+2838825600,2838825727,US
+2838825728,2838826783,NL
+2838826784,2838826815,US
+2838826816,2838829343,NL
+2838829344,2838829375,US
+2838829376,2838831199,NL
+2838831200,2838831231,US
+2838831232,2838832159,NL
+2838832160,2838832175,KR
+2838832176,2838832319,NL
+2838832320,2838832351,US
+2838832352,2838832383,KR
+2838832384,2838832735,US
+2838832736,2838832767,NL
+2838832768,2838833407,US
+2838833408,2838856671,NL
+2838856672,2838856703,US
+2838856704,2838857567,NL
+2838857568,2838857599,US
+2838857600,2838857855,NL
+2838857856,2838857887,US
+2838857888,2838857919,NL
+2838857920,2838857951,US
+2838857952,2838857983,NL
+2838857984,2838858399,US
+2838858400,2838858463,NL
+2838858464,2838858527,US
+2838858528,2838858559,NL
+2838858560,2838858623,US
+2838858624,2838858687,NL
+2838858688,2838858719,US
+2838858720,2839019519,NL
2839019520,2839085055,CH
-2839085056,2839150591,NL
-2839150592,2839543807,CH
+2839085056,2839117823,MX
+2839117824,2839150591,NL
+2839150592,2839281663,CH
+2839281664,2839412735,NL
+2839412736,2839543807,CH
2839543808,2843803647,US
2843803648,2843869183,ZA
2843869184,2844524543,US
@@ -46112,6 +48513,7 @@
2844912640,2844912895,JP
2844912896,2845704191,US
2845704192,2845769727,CU
+2845769728,2845786111,GA
2845835264,2848212991,US
2848212992,2848215039,GB
2848215040,2848244735,US
@@ -46124,6 +48526,22 @@
2849964032,2850029567,HK
2850029568,2851012607,US
2851078144,2851995647,US
+2852061184,2852062207,ZA
+2852062208,2852063231,CM
+2852063232,2852064255,KE
+2852064256,2852065279,ZA
+2852065280,2852066303,GH
+2852066304,2852067327,ZA
+2852067328,2852068351,SD
+2852068352,2852070399,ZA
+2852071424,2852072447,NG
+2852072448,2852073471,ZA
+2852073472,2852074495,TZ
+2852074496,2852075519,MW
+2852075520,2852077567,ZA
+2852077568,2852078591,CD
+2852078592,2852079615,TN
+2852079616,2852080639,CG
2852192256,2852716653,US
2852716654,2852716654,AU
2852716655,2853306367,US
@@ -46139,11 +48557,7 @@
2855484672,2855485439,AR
2855485440,2855501823,UY
2855501824,2855534591,AR
-2855534592,2855811583,US
-2855811584,2855811730,DE
-2855811731,2855811731,US
-2855811732,2855811839,DE
-2855811840,2856058879,US
+2855534592,2856058879,US
2856058880,2856124415,CH
2856124416,2856184831,US
2856184832,2856185855,GB
@@ -46157,9 +48571,7 @@
2857697280,2858352639,US
2858418176,2859007999,US
2859008000,2859073535,JP
-2859073536,2861069055,US
-2861069056,2861069311,GB
-2861069312,2861850879,US
+2859073536,2861850879,US
2861850880,2861851391,HK
2861851392,2861851647,US
2861851648,2861861375,HK
@@ -46185,26 +48597,32 @@
2864844800,2864845055,NL
2864845056,2864848895,US
2864848896,2864849151,GB
-2864849152,2865417215,US
-2865417216,2865417471,GB
-2865417472,2865577983,US
+2864849152,2865417457,US
+2865417458,2865417458,GB
+2865417459,2865577983,US
2865577984,2865610751,BE
2865610752,2865889279,US
2865889280,2865954815,AR
-2865954816,2867265535,US
+2865954816,2866953215,US
+2866953216,2866953471,AU
+2866953472,2867265535,US
2867331072,2867396607,US
2867462144,2867593215,US
2867593216,2867724287,CH
2867855360,2868117503,US
-2868379648,2868605183,US
-2868605184,2868605439,NO
-2868605440,2868658175,US
+2868379648,2868420607,US
+2868420608,2868423679,IN
+2868423680,2868586495,US
+2868586496,2868588543,IN
+2868588544,2868605376,US
+2868605377,2868605377,NO
+2868605378,2868658175,US
2868658176,2868658431,GB
-2868658432,2868676607,US
+2868658432,2868673023,US
+2868673024,2868673279,FR
+2868673280,2868676607,US
2868676608,2868676863,AU
-2868676864,2868689407,US
-2868689408,2868689663,AU
-2868689664,2868772863,US
+2868676864,2868772863,US
2868838400,2868903935,BE
2868903936,2869035007,SG
2869035008,2869166079,JP
@@ -46213,7 +48631,9 @@
2869952512,2870018047,FR
2870018048,2870083583,DE
2870083584,2870089727,FR
-2870089728,2870091775,DE
+2870089728,2870090495,DE
+2870090496,2870090751,BE
+2870090752,2870091775,DE
2870091776,2870149119,FR
2870149120,2870214655,HU
2870214656,2870280191,DK
@@ -46307,15 +48727,17 @@
2895708160,2896035839,US
2896035840,2896101375,DE
2896101376,2896166911,GB
-2896166912,2897018879,US
+2896166912,2896429280,US
+2896429281,2896429281,CA
+2896429282,2897018879,US
2897018880,2897149951,DE
2897149952,2897215487,US
2897215488,2897739775,DE
2897739776,2898001919,FR
2898001920,2898132991,GB
2898132992,2898264063,US
-2898264064,2898264064,AU
-2898264065,2898788351,US
+2898264064,2898526207,AU
+2898526208,2898788351,US
2898788352,2899050495,GB
2899050496,2899116031,FR
2899116032,2899148799,VN
@@ -46363,19 +48785,15 @@
2905446656,2905446911,DE
2905446912,2905473023,US
2905473024,2905481215,CA
-2905481216,2913086719,US
-2913086720,2913086812,CA
-2913086813,2913086813,US
-2913086814,2913086816,CA
-2913086817,2913086817,US
-2913086818,2913086819,CA
-2913086820,2913086820,US
-2913086821,2913086975,CA
-2913086976,2913992703,US
+2905481216,2913992703,US
2913992704,2914516991,CA
-2914516992,2915092135,US
-2915092136,2915092143,SA
-2915092144,2915250175,US
+2914516992,2915195647,US
+2915195648,2915195903,CL
+2915195904,2915196927,US
+2915196928,2915197183,IE
+2915197184,2915197439,US
+2915197440,2915197695,FI
+2915197696,2915250175,US
2915250176,2915254271,CA
2915254272,2915516415,US
2915516416,2915516671,NL
@@ -46409,7 +48827,9 @@
2916319232,2916335615,PR
2916335616,2916368383,US
2916368384,2916401151,CA
-2916401152,2916515839,US
+2916401152,2916410879,US
+2916410880,2916411135,GB
+2916411136,2916515839,US
2916515840,2916519935,CA
2916519936,2916581375,US
2916581376,2916614143,PR
@@ -46432,7 +48852,10 @@
2917267712,2917267967,AG
2917267968,2917268223,JM
2917268224,2917268479,BB
-2917268480,2917269503,JM
+2917268480,2917268735,TC
+2917268736,2917269113,JM
+2917269114,2917269114,TC
+2917269115,2917269503,JM
2917269504,2917449727,US
2917449728,2917466111,PR
2917466112,2917572607,US
@@ -46488,11 +48911,7 @@
2918023168,2918043647,US
2918043648,2918047743,CA
2918047744,2918051839,US
-2918051840,2918111999,CA
-2918112000,2918112127,US
-2918112128,2918112895,CA
-2918112896,2918113023,US
-2918113024,2918121471,CA
+2918051840,2918121471,CA
2918121472,2918154239,US
2918154240,2918170623,CA
2918170624,2918187775,US
@@ -46517,9 +48936,7 @@
2918395904,2918404095,US
2918404096,2918406911,PR
2918406912,2918407167,US
-2918407168,2918407295,PR
-2918407296,2918407423,US
-2918407424,2918408191,PR
+2918407168,2918408191,PR
2918408192,2918432767,US
2918432768,2918436863,CA
2918436864,2918469631,US
@@ -46530,17 +48947,13 @@
2918473216,2918473727,CA
2918473728,2918477823,US
2918477824,2918481919,CA
-2918481920,2918528255,US
-2918528256,2918528511,NO
-2918528512,2918528767,US
-2918528768,2918528863,CA
-2918528864,2918528883,US
-2918528884,2918528885,CA
-2918528886,2918530559,US
-2918530560,2918530815,PH
-2918530816,2918536719,US
+2918481920,2918527743,US
+2918527744,2918527999,NO
+2918528000,2918536719,US
2918536720,2918536727,CA
-2918536728,2918570239,US
+2918536728,2918568191,US
+2918568192,2918568319,AU
+2918568320,2918570239,US
2918570240,2918570495,JP
2918570496,2918580223,US
2918580224,2918588415,CA
@@ -46607,42 +49020,49 @@
2919759872,2921512703,US
2921512704,2921512959,CA
2921512960,2921530367,US
-2921530368,2921531391,DE
-2921531392,2921541119,US
+2921530368,2921530879,DE
+2921530880,2921541119,US
2921541120,2921541375,DE
2921541376,2921542143,US
2921542144,2921542399,CA
-2921542400,2921545727,US
+2921542400,2921545215,US
+2921545216,2921545727,DE
2921545728,2921545983,NL
-2921545984,2921546495,US
+2921545984,2921546239,US
+2921546240,2921546495,FR
2921546496,2921546751,NL
-2921546752,2921547519,US
+2921546752,2921547007,US
+2921547008,2921547263,FR
+2921547264,2921547519,US
2921547520,2921547775,DE
2921547776,2921548031,GB
-2921548032,2921548799,US
-2921548800,2921549055,FR
+2921548032,2921548831,US
+2921548832,2921549055,FR
2921549056,2921550335,US
2921550336,2921550591,IT
-2921550592,2921552895,US
+2921550592,2921551615,US
+2921551616,2921551871,BR
+2921551872,2921552127,AR
+2921552128,2921552383,US
+2921552384,2921552639,MX
+2921552640,2921552895,US
2921552896,2921553151,CL
2921553152,2921553407,BR
2921553408,2921553663,CO
2921553664,2921562111,US
2921562112,2921594879,CA
-2921594880,2925002751,US
+2921594880,2921681631,US
+2921681632,2921681639,JP
+2921681640,2925002751,US
2925002752,2925527039,CA
2925527040,2926575615,US
-2926575616,2926777343,CA
-2926777344,2926777855,US
-2926777856,2926778111,CA
-2926778112,2926778239,US
-2926778240,2926779391,CA
-2926779392,2926779519,US
-2926779520,2927084799,CA
-2927084800,2927085055,US
-2927085056,2927085567,CA
-2927085568,2927085823,US
-2927085824,2927099903,CA
+2926575616,2926777727,CA
+2926777728,2926777983,US
+2926777984,2927084543,CA
+2927084544,2927085055,US
+2927085056,2927085311,CA
+2927085312,2927085567,US
+2927085568,2927099903,CA
2927099904,2927242751,US
2927242752,2927243263,AE
2927243264,2927254783,US
@@ -46687,16 +49107,15 @@
2938634240,2938699775,IN
2938699776,2938700031,PH
2938700032,2938700287,ID
-2938700288,2938700543,KR
+2938700288,2938700543,AE
2938700544,2938701055,SG
2938701056,2938701311,IQ
2938701312,2938701567,AU
-2938701568,2938701823,KR
-2938701824,2938702079,IN
+2938701568,2938702079,IN
2938702080,2938703103,HK
2938703104,2938703359,IL
2938703360,2938703615,ZA
-2938703616,2938703871,KR
+2938703616,2938703871,IN
2938703872,2938707967,HK
2938707968,2938710015,JP
2938710016,2938712063,AU
@@ -46786,9 +49205,9 @@
2947598336,2947602431,AU
2947602432,2947603455,NZ
2947603456,2947604479,TH
-2947604480,2947609599,HK
-2947609600,2947609855,GB
-2947609856,2947612671,HK
+2947604480,2947611135,HK
+2947611136,2947611391,AU
+2947611392,2947612671,HK
2947612672,2947678207,JP
2947678208,2947743743,CN
2947743744,2947809279,JP
@@ -46815,9 +49234,7 @@
2953466368,2953466879,GB
2953467392,2953467647,GB
2953467904,2953469951,BE
-2953469952,2953474815,CH
-2953474816,2953475071,DE
-2953475072,2953478143,CH
+2953469952,2953478143,CH
2953478144,2953503551,SE
2953503552,2953503559,NO
2953503560,2953510911,SE
@@ -46827,9 +49244,7 @@
2953596928,2953598975,ES
2953598976,2953601023,IT
2953601024,2953603071,RU
-2953603072,2953603977,GB
-2953603978,2953603979,IE
-2953603980,2953605119,GB
+2953603072,2953605119,GB
2953605120,2953609215,CZ
2953609216,2953707519,IL
2953707520,2953838591,RU
@@ -46843,15 +49258,21 @@
2954647552,2954657791,ES
2954657792,2954756095,JO
2954756096,2954821631,TR
-2954821632,2954822927,FR
+2954821632,2954822079,FR
+2954822080,2954822143,ES
+2954822144,2954822927,FR
2954822928,2954822931,DE
2954822932,2954823395,FR
2954823396,2954823399,GB
-2954823400,2954824255,FR
+2954823400,2954823999,FR
+2954824000,2954824015,ES
+2954824016,2954824255,FR
2954824256,2954824259,ES
2954824260,2954825063,FR
2954825064,2954825067,ES
-2954825068,2954825315,FR
+2954825068,2954825151,FR
+2954825152,2954825159,NL
+2954825160,2954825315,FR
2954825316,2954825319,ES
2954825320,2954825403,FR
2954825404,2954825407,ES
@@ -46868,19 +49289,35 @@
2954826776,2954826779,ES
2954826780,2954827799,FR
2954827800,2954827807,DE
-2954827808,2954829395,FR
+2954827808,2954828159,FR
+2954828160,2954828191,IT
+2954828192,2954829135,FR
+2954829136,2954829139,DE
+2954829140,2954829395,FR
2954829396,2954829399,IT
-2954829400,2954829751,FR
+2954829400,2954829427,FR
+2954829428,2954829431,NL
+2954829432,2954829751,FR
2954829752,2954829752,ES
2954829753,2954829759,FR
2954829760,2954829823,ES
2954829824,2954829843,FR
2954829844,2954829847,DE
-2954829848,2954830395,FR
+2954829848,2954829875,FR
+2954829876,2954829879,DE
+2954829880,2954830183,FR
+2954830184,2954830191,IT
+2954830192,2954830395,FR
2954830396,2954830399,ES
-2954830400,2954831247,FR
+2954830400,2954830735,FR
+2954830736,2954830751,NL
+2954830752,2954831247,FR
2954831248,2954831251,ES
-2954831252,2954832343,FR
+2954831252,2954831807,FR
+2954831808,2954831823,ES
+2954831824,2954832159,FR
+2954832160,2954832167,PT
+2954832168,2954832343,FR
2954832344,2954832347,CH
2954832348,2954832891,FR
2954832892,2954832895,ES
@@ -46896,7 +49333,11 @@
2954834520,2954834523,ES
2954834524,2954834671,FR
2954834672,2954834675,ES
-2954834676,2954835295,FR
+2954834676,2954834983,FR
+2954834984,2954834991,IT
+2954834992,2954835039,FR
+2954835040,2954835043,DE
+2954835044,2954835295,FR
2954835296,2954835299,ES
2954835300,2954835443,FR
2954835444,2954835447,ES
@@ -46912,10 +49353,16 @@
2954837828,2954837831,DE
2954837832,2954837867,FR
2954837868,2954837871,ES
-2954837872,2954838599,FR
+2954837872,2954838103,FR
+2954838104,2954838107,DE
+2954838108,2954838599,FR
2954838600,2954838607,GB
2954838608,2954838615,NL
-2954838616,2954839239,FR
+2954838616,2954838911,FR
+2954838912,2954838915,DE
+2954838916,2954839063,FR
+2954839064,2954839067,IT
+2954839068,2954839239,FR
2954839240,2954839243,IT
2954839244,2954839267,FR
2954839268,2954839271,ES
@@ -46925,7 +49372,9 @@
2954840256,2954840447,GB
2954840448,2954840515,FR
2954840516,2954840519,NL
-2954840520,2954840927,FR
+2954840520,2954840731,FR
+2954840732,2954840735,IT
+2954840736,2954840927,FR
2954840928,2954840931,DE
2954840932,2954841567,FR
2954841568,2954841583,ES
@@ -46935,8 +49384,8 @@
2954841808,2954841815,NL
2954841816,2954843503,FR
2954843504,2954843507,ES
-2954843508,2954843767,FR
-2954843768,2954843771,ES
+2954843508,2954843759,FR
+2954843760,2954843771,ES
2954843772,2954844147,FR
2954844148,2954844151,DE
2954844152,2954844999,FR
@@ -46947,7 +49396,9 @@
2954846108,2954846111,ES
2954846112,2954846139,FR
2954846140,2954846143,ES
-2954846144,2954855075,FR
+2954846144,2954854871,FR
+2954854872,2954854875,IT
+2954854876,2954855075,FR
2954855076,2954855079,ES
2954855080,2954855507,FR
2954855508,2954855511,DE
@@ -46957,9 +49408,21 @@
2954855528,2954855531,ES
2954855532,2954856179,FR
2954856180,2954856183,ES
-2954856184,2954859323,FR
+2954856184,2954857115,FR
+2954857116,2954857119,NL
+2954857120,2954858819,FR
+2954858820,2954858823,IT
+2954858824,2954858911,FR
+2954858912,2954858943,ES
+2954858944,2954859043,FR
+2954859044,2954859047,ES
+2954859048,2954859323,FR
2954859324,2954859327,ES
-2954859328,2954861875,FR
+2954859328,2954859871,FR
+2954859872,2954859903,ES
+2954859904,2954861623,FR
+2954861624,2954861631,IT
+2954861632,2954861875,FR
2954861876,2954861879,CH
2954861880,2954862415,FR
2954862416,2954862419,ES
@@ -46967,9 +49430,12 @@
2954863616,2954864639,DE
2954864640,2954865663,IT
2954865664,2954866687,ES
-2954866688,2954870799,FR
+2954866688,2954867041,FR
+2954867042,2954867043,PT
+2954867044,2954870799,FR
2954870800,2954870803,ES
-2954870804,2954870843,FR
+2954870804,2954870839,FR
+2954870840,2954870843,IT
2954870844,2954870847,ES
2954870848,2954870903,FR
2954870904,2954870907,ES
@@ -47022,11 +49488,11 @@
2955837440,2955845631,IR
2955845632,2955853823,GB
2955853824,2955870207,CH
-2955870208,2955935743,UA
+2955870208,2955935743,SA
2955935744,2956230655,RU
2956230656,2956238847,SI
2956238848,2956242943,ES
-2956242944,2956244991,SE
+2956242944,2956244991,JO
2956244992,2956245247,FR
2956245248,2956245503,RO
2956245504,2956245759,GB
@@ -47163,9 +49629,7 @@
2957240320,2957242367,BG
2957242368,2957244415,RU
2957244416,2957246463,HU
-2957246464,2957311999,SE
-2957312000,2957377535,RU
-2957377536,2957508607,SE
+2957246464,2957508607,SE
2957508608,2957574143,FI
2957574144,2957639679,GE
2957639680,2957641727,GB
@@ -47319,7 +49783,7 @@
2959753216,2959761407,RU
2959761408,2959763455,LV
2959763456,2959765503,PL
-2959765504,2959767551,RU
+2959765504,2959767551,GB
2959767552,2959769599,RS
2959769600,2959777791,RU
2959777792,2959783935,LV
@@ -47348,9 +49812,7 @@
2959884288,2959892479,KZ
2959892480,2959900671,UA
2959900672,2959902719,PL
-2959902720,2959915007,RU
-2959915008,2959917055,UA
-2959917056,2959925247,RU
+2959902720,2959925247,RU
2959925248,2959927295,RO
2959927296,2959929343,UA
2959929344,2959935487,RU
@@ -47406,8 +49868,7 @@
2960152576,2960158719,RU
2960158720,2960160767,PL
2960160768,2960162815,UA
-2960162816,2960171007,CZ
-2960171008,2960175103,RU
+2960162816,2960175103,RU
2960175104,2960179199,SK
2960179200,2960205823,RU
2960207872,2960211967,RU
@@ -47593,10 +50054,17 @@
2961088512,2961088767,SE
2961088768,2961089535,UA
2961089536,2961090559,KG
-2961090560,2961108991,RO
+2961090560,2961102847,RO
+2961102848,2961103871,DE
+2961103872,2961104895,RO
+2961104896,2961106943,GB
+2961106944,2961108991,RO
2961108992,2961111039,GB
-2961111040,2961113087,RO
-2961113088,2961178623,CH
+2961111040,2961112063,PL
+2961112064,2961113087,RO
+2961113088,2961166079,CH
+2961166080,2961166335,DE
+2961166336,2961178623,CH
2961178624,2965372927,FR
2965372928,2965766143,RU
2965766144,2965897215,DE
@@ -47605,12 +50073,14 @@
2966159360,2966290431,AE
2966290432,2966421503,IT
2966421504,2966945791,RU
-2966945792,2967273471,TR
+2966945792,2967268351,TR
+2967268352,2967269375,IN
+2967269376,2967273471,TR
2967273472,2967277567,RU
2967277568,2967281663,IR
2967281664,2967283711,PT
2967283712,2967285759,DE
-2967285760,2967287807,UA
+2967285760,2967287807,IT
2967287808,2967289855,GB
2967289856,2967291903,IR
2967291904,2967293951,RS
@@ -47738,11 +50208,7 @@
2987552768,2987556863,GB
2987556864,2987560959,NL
2987560960,2987565055,DE
-2987565056,2987566591,AT
-2987566592,2987566847,HU
-2987566848,2987568383,AT
-2987568384,2987568639,HU
-2987568640,2987569151,AT
+2987565056,2987569151,AT
2987569152,2987573247,FR
2987573248,2987577343,TR
2987577344,2987585535,RU
@@ -47762,8 +50228,7 @@
2987642880,2987651071,DE
2987651072,2987655167,RU
2987655168,2987659263,DE
-2987659264,2987661311,SI
-2987661312,2987663359,GB
+2987659264,2987661311,BA
2987663360,2987665407,IT
2987665408,2987667455,RU
2987667456,2987669503,FR
@@ -47817,7 +50282,9 @@
2987771904,2987773951,IT
2987773952,2987775999,FR
2987776000,2987778047,NL
-2987778048,2987780095,CH
+2987778048,2987779071,CH
+2987779072,2987779583,LI
+2987779584,2987780095,CH
2987780096,2987782143,GB
2987782144,2987784191,EE
2987784192,2987786239,DK
@@ -47896,11 +50363,15 @@
2988444209,2988444209,FI
2988444210,2988444671,FR
2988444672,2988444679,ES
-2988444680,2988449207,FR
+2988444680,2988448799,FR
+2988448800,2988448815,ES
+2988448816,2988449207,FR
2988449208,2988449215,ES
2988449216,2988451839,FR
2988451840,2988453887,BE
-2988453888,2988457983,GB
+2988453888,2988454399,GB
+2988454400,2988454655,FR
+2988454656,2988457983,GB
2988457984,2988458319,FR
2988458320,2988458327,NL
2988458328,2988459119,FR
@@ -47922,12 +50393,16 @@
2988461704,2988461707,NL
2988461708,2988462603,FR
2988462604,2988462607,ES
-2988462608,2988463915,FR
+2988462608,2988462747,FR
+2988462748,2988462751,ES
+2988462752,2988463915,FR
2988463916,2988463919,ES
2988463920,2988463999,FR
2988464000,2988464007,IE
2988464008,2988464015,LT
-2988464016,2988464611,FR
+2988464016,2988464359,FR
+2988464360,2988464360,NL
+2988464361,2988464611,FR
2988464612,2988464615,IT
2988464616,2988464623,FR
2988464624,2988464627,ES
@@ -47943,7 +50418,9 @@
2988478580,2988478583,DE
2988478584,2988478587,FR
2988478588,2988478591,DE
-2988478592,2988479791,FR
+2988478592,2988479003,FR
+2988479004,2988479007,ES
+2988479008,2988479791,FR
2988479792,2988479807,GB
2988479808,2988482111,FR
2988482112,2988482143,DE
@@ -47957,15 +50434,23 @@
2988484832,2988484847,GB
2988484848,2988485683,FR
2988485684,2988485687,PL
-2988485688,2988486311,FR
+2988485688,2988486075,FR
+2988486076,2988486079,DE
+2988486080,2988486083,FR
+2988486084,2988486087,PT
+2988486088,2988486311,FR
2988486312,2988486319,NL
2988486320,2988487071,FR
2988487072,2988487075,ES
2988487076,2988487095,FR
2988487096,2988487099,ES
-2988487100,2988489119,FR
-2988489120,2988489127,DE
-2988489128,2988489479,FR
+2988487100,2988487235,FR
+2988487236,2988487239,NL
+2988487240,2988487303,FR
+2988487304,2988487311,NL
+2988487312,2988487883,FR
+2988487884,2988487887,NL
+2988487888,2988489479,FR
2988489480,2988489483,DE
2988489484,2988489675,FR
2988489676,2988489679,ES
@@ -47974,7 +50459,8 @@
2988490184,2988490683,FR
2988490684,2988490686,IT
2988490687,2988490687,BE
-2988490688,2988492799,FR
+2988490688,2988490719,ES
+2988490720,2988492799,FR
2988492800,2988494847,PL
2988494848,2988499663,FR
2988499664,2988499671,NL
@@ -47988,7 +50474,9 @@
2988500856,2988500859,ES
2988500860,2988501127,FR
2988501128,2988501131,IT
-2988501132,2988502051,FR
+2988501132,2988501415,FR
+2988501416,2988501423,IT
+2988501424,2988502051,FR
2988502052,2988502055,PL
2988502056,2988502479,FR
2988502480,2988502483,ES
@@ -47998,57 +50486,98 @@
2988502882,2988502882,IT
2988502883,2988504371,FR
2988504372,2988504375,PL
-2988504376,2988505391,FR
+2988504376,2988505151,FR
+2988505152,2988505167,GB
+2988505168,2988505391,FR
2988505392,2988505395,ES
-2988505396,2988507163,FR
+2988505396,2988506235,FR
+2988506236,2988506239,NL
+2988506240,2988506943,FR
+2988506944,2988506975,DE
+2988506976,2988507163,FR
2988507164,2988507167,ES
-2988507168,2988507975,FR
+2988507168,2988507531,FR
+2988507532,2988507535,NL
+2988507536,2988507807,FR
+2988507808,2988507823,NL
+2988507824,2988507975,FR
2988507976,2988507979,IT
-2988507980,2988509511,FR
+2988507980,2988508607,FR
+2988508608,2988508639,ES
+2988508640,2988509511,FR
2988509512,2988509515,PL
2988509516,2988509747,FR
2988509748,2988509751,LT
-2988509752,2988512903,FR
+2988509752,2988510175,FR
+2988510176,2988510191,DE
+2988510192,2988512903,FR
2988512904,2988512907,GB
2988512908,2988513003,FR
2988513004,2988513007,ES
2988513008,2988513747,FR
2988513748,2988513751,IT
-2988513752,2988515327,FR
+2988513752,2988514207,FR
+2988514208,2988514215,PT
+2988514216,2988514399,FR
+2988514400,2988514431,NL
+2988514432,2988515327,FR
2988515328,2988517375,DE
2988517376,2988519423,FR
2988519424,2988521471,PL
-2988521472,2988524075,FR
+2988521472,2988523743,FR
+2988523744,2988523759,DE
+2988523760,2988524075,FR
2988524076,2988524079,ES
2988524080,2988524271,FR
2988524272,2988524287,DE
-2988524288,2988525887,FR
+2988524288,2988525579,FR
+2988525580,2988525583,IT
+2988525584,2988525887,FR
2988525888,2988525951,GB
2988525952,2988526415,FR
2988526416,2988526423,ES
2988526424,2988527527,FR
2988527528,2988527531,NL
-2988527532,2988527831,FR
+2988527532,2988527723,FR
+2988527724,2988527727,ES
+2988527728,2988527831,FR
2988527832,2988527839,ES
2988527840,2988527887,FR
2988527888,2988527891,ES
-2988527892,2988529351,FR
+2988527892,2988528699,FR
+2988528700,2988528703,CZ
+2988528704,2988529351,FR
2988529352,2988529359,GB
2988529360,2988529375,FR
2988529376,2988529383,GB
2988529384,2988529387,ES
-2988529388,2988535807,FR
+2988529388,2988531275,FR
+2988531276,2988531279,PT
+2988531280,2988535807,FR
2988535808,2988537855,ES
2988537856,2988539971,FR
2988539972,2988539975,ES
-2988539976,2988540503,FR
+2988539976,2988540199,FR
+2988540200,2988540207,BE
+2988540208,2988540503,FR
2988540504,2988540507,NL
-2988540508,2988544671,FR
+2988540508,2988540563,FR
+2988540564,2988540567,CZ
+2988540568,2988542627,FR
+2988542628,2988542631,NL
+2988542632,2988544671,FR
2988544672,2988544687,GB
-2988544688,2988544691,NL
-2988544692,2988546727,FR
+2988544688,2988546687,FR
+2988546688,2988546691,CH
+2988546692,2988546703,FR
+2988546704,2988546719,DE
+2988546720,2988546727,FR
2988546728,2988546731,ES
-2988546732,2988547067,FR
+2988546732,2988547019,FR
+2988547020,2988547023,NL
+2988547024,2988547055,FR
+2988547056,2988547059,NL
+2988547060,2988547067,FR
2988547068,2988547071,ES
2988547072,2988547095,FR
2988547096,2988547099,ES
@@ -48070,34 +50599,52 @@
2988551444,2988551447,ES
2988551448,2988551535,FR
2988551536,2988551551,DE
-2988551552,2988553531,FR
+2988551552,2988552883,FR
+2988552884,2988552887,IT
+2988552888,2988553399,FR
+2988553400,2988553407,NL
+2988553408,2988553531,FR
2988553532,2988553535,ES
2988553536,2988554035,FR
2988554036,2988554039,ES
2988554040,2988555527,FR
2988555528,2988555531,ES
-2988555532,2988556207,FR
+2988555532,2988555551,FR
+2988555552,2988555559,PT
+2988555560,2988556207,FR
2988556208,2988556211,DE
2988556212,2988556359,FR
2988556360,2988556363,ES
-2988556364,2988557507,FR
+2988556364,2988557103,FR
+2988557104,2988557111,PT
+2988557112,2988557507,FR
2988557508,2988557511,ES
2988557512,2988557539,FR
2988557540,2988557543,ES
2988557544,2988558203,FR
2988558204,2988558207,DE
-2988558208,2988558803,FR
+2988558208,2988558623,FR
+2988558624,2988558655,NL
+2988558656,2988558803,FR
2988558804,2988558807,ES
2988558808,2988558815,NL
-2988558816,2988561583,FR
+2988558816,2988560639,FR
+2988560640,2988560703,ES
+2988560704,2988561583,FR
2988561584,2988561591,GB
2988561592,2988561763,FR
2988561764,2988561767,IT
2988561768,2988562847,FR
2988562848,2988562863,GB
-2988562864,2988564143,FR
+2988562864,2988563559,FR
+2988563560,2988563567,NL
+2988563568,2988564023,FR
+2988564024,2988564027,IE
+2988564028,2988564143,FR
2988564144,2988564159,ES
-2988564160,2988572671,FR
+2988564160,2988564367,FR
+2988564368,2988564383,GB
+2988564384,2988572671,FR
2988572672,2988703743,RU
2988703744,2988834815,PL
2988834816,2988965887,CH
@@ -48114,18 +50661,25 @@
2989883392,2989948927,UA
2989948928,2990014463,FI
2990014464,2990079999,PL
-2990080000,2990096383,GB
-2990096384,2990104575,RU
-2990104576,2990112767,GB
-2990112768,2990145535,RU
+2990080000,2990145535,RU
2990145536,2990211071,SI
2990211072,2990276607,GR
2990276608,2990342143,ES
2990342144,2990407679,KW
-2990407680,2990421728,US
+2990407680,2990407935,US
+2990407936,2990408191,GB
+2990408192,2990417663,US
+2990417664,2990417919,GB
+2990417920,2990421728,US
2990421729,2990421729,GB
-2990421730,2990440447,US
-2990440448,2990473215,NL
+2990421730,2990423525,US
+2990423526,2990423526,GB
+2990423527,2990432440,US
+2990432441,2990432441,GB
+2990432442,2990440447,US
+2990440448,2990472492,GB
+2990472493,2990472493,NL
+2990472494,2990473215,GB
2990473216,2990475674,DE
2990475675,2990475675,HR
2990475676,2990500113,DE
@@ -48143,7 +50697,9 @@
2991161344,2991177727,FR
2991177728,2991179503,SE
2991179504,2991179507,ES
-2991179508,2991194111,SE
+2991179508,2991191807,SE
+2991191808,2991192063,FI
+2991192064,2991194111,SE
2991194112,2991210495,NO
2991210496,2991243263,RU
2991243264,2991259647,UA
@@ -48286,7 +50842,10 @@
2997515684,2997515684,GB
2997515685,2997518335,FR
2997518336,2997520383,DE
-2997520384,2997526527,NL
+2997520384,2997520895,NL
+2997520896,2997521151,MT
+2997521152,2997521407,US
+2997521408,2997526527,NL
2997526528,2997583871,RU
2997583872,2997616639,SY
2997616640,2997649407,SI
@@ -48305,28 +50864,12 @@
2997878784,2998140927,RU
2998140928,2998403071,PL
2998403072,2998665215,RU
-2998665216,2998710451,AT
-2998710452,2998710455,DE
-2998710456,2998712975,AT
-2998712976,2998712979,DE
-2998712980,2998720227,AT
-2998720228,2998720231,CZ
-2998720232,2998820735,AT
-2998820736,2998820863,CZ
-2998820864,2998834559,AT
-2998834560,2998834687,HU
-2998834688,2998841343,AT
-2998841344,2998841599,DE
-2998841600,2998875391,AT
-2998875392,2998875519,CZ
-2998875520,2998927359,AT
-2998927360,2998991615,CH
-2998991616,2998991871,DE
-2998991872,2999026943,CH
-2999026944,2999027071,DE
-2999027072,2999380223,CH
-2999380224,2999380479,DE
-2999380480,2999451647,CH
+2998665216,2998679039,AT
+2998679040,2998679295,SI
+2998679296,2998902527,AT
+2998902528,2998902783,SI
+2998902784,2998927359,AT
+2998927360,2999451647,CH
2999451648,2999713791,DE
2999713792,2999975935,RU
2999975936,2999984127,FR
@@ -48365,8 +50908,7 @@
3000246272,3000248319,RO
3000248320,3000252415,PL
3000252416,3000254463,RO
-3000254464,3000256511,UA
-3000256512,3000260607,RU
+3000254464,3000260607,RU
3000260608,3000262655,RS
3000262656,3000266751,UA
3000266752,3000268799,DE
@@ -48490,7 +51032,9 @@
3000709120,3000713215,AM
3000713216,3000717311,IT
3000717312,3000721407,UA
-3000721408,3000733695,PL
+3000721408,3000727551,PL
+3000727552,3000727807,CZ
+3000727808,3000733695,PL
3000733696,3000737791,RU
3000737792,3000741887,UA
3000741888,3000745983,RU
@@ -48537,7 +51081,9 @@
3001901056,3001905151,FR
3001905152,3001909247,GB
3001909248,3001917439,ES
-3001917440,3001921535,GB
+3001917440,3001919743,GB
+3001919744,3001919999,AU
+3001920000,3001921535,GB
3001921536,3001929727,RU
3001929728,3001933823,RS
3001933824,3001937919,ES
@@ -48622,7 +51168,7 @@
3002697728,3002699775,DE
3002699776,3002701823,SE
3002701824,3002703871,NL
-3002703872,3002705919,DE
+3002703872,3002705919,FR
3002705920,3002707967,MK
3002707968,3002710015,KW
3002710016,3002712063,IT
@@ -48639,9 +51185,7 @@
3002736640,3002738687,LT
3002738688,3002740735,PL
3002740736,3002742783,GB
-3002742784,3002743039,LI
-3002743040,3002743047,GR
-3002743048,3002744831,LI
+3002742784,3002744831,LI
3002744832,3002746879,IT
3002746880,3002748927,GB
3002748928,3002750975,DE
@@ -48720,7 +51264,8 @@
3003076608,3003078143,GB
3003078144,3003078151,US
3003078152,3003078155,IN
-3003078156,3003080703,GB
+3003078156,3003078399,US
+3003078400,3003080703,GB
3003080704,3003082751,FR
3003082752,3003084799,ES
3003086848,3003088895,RU
@@ -48762,29 +51307,43 @@
3003129088,3003129343,CO
3003129344,3003129599,BO
3003129600,3003129855,HN
-3003129856,3003138559,CR
+3003129856,3003130111,MX
+3003130112,3003130367,CR
+3003130368,3003130623,MX
+3003130624,3003131647,CR
+3003131648,3003133183,MX
+3003133184,3003133695,CR
+3003133696,3003134719,MX
+3003134720,3003134975,CR
+3003134976,3003135487,MX
+3003135488,3003136255,CR
+3003136256,3003137279,MX
+3003137280,3003137791,CR
+3003137792,3003138047,MX
+3003138048,3003138559,HN
3003138560,3003139071,PA
-3003139072,3003139583,CR
+3003139072,3003139583,HN
3003139584,3003140351,PA
-3003140352,3003140607,CR
+3003140352,3003140607,HN
3003140608,3003141375,PA
-3003141376,3003141631,CR
+3003141376,3003141631,HN
3003141632,3003141887,PA
-3003141888,3003143679,CR
+3003141888,3003143679,HN
3003143680,3003144447,PA
-3003144448,3003146239,CR
+3003144448,3003146239,HN
3003146240,3003146495,PA
-3003146496,3003147007,CR
+3003146496,3003147007,GT
3003147008,3003147263,PA
-3003147264,3003148031,CR
+3003147264,3003148031,GT
3003148032,3003148543,PA
-3003148544,3003148799,CR
+3003148544,3003148799,GT
3003148800,3003149311,PA
-3003149312,3003151871,CR
+3003149312,3003150335,GT
+3003150336,3003151871,SV
3003151872,3003152383,PA
-3003152384,3003152639,CR
+3003152384,3003152639,SV
3003152640,3003152895,PA
-3003152896,3003154431,CR
+3003152896,3003154431,SV
3003154432,3003154687,CL
3003154688,3003154943,EC
3003154944,3003159039,AR
@@ -48833,37 +51392,41 @@
3005888000,3005888255,CO
3005888256,3005890047,PA
3005890048,3005890303,CO
-3005890304,3005891071,PA
-3005891072,3005891327,CO
+3005890304,3005890559,PA
+3005890560,3005891327,CO
3005891328,3005893119,PA
3005893120,3005893631,CO
3005893632,3005893887,PA
-3005893888,3005894143,CO
-3005894144,3005894655,PA
-3005894656,3005894911,CO
-3005894912,3005896703,PA
+3005893888,3005894911,CO
+3005894912,3005895167,PA
+3005895168,3005895423,CO
+3005895424,3005896703,PA
3005896704,3005896959,CO
-3005896960,3005899263,PA
-3005899264,3005899519,CO
-3005899520,3005900031,PA
-3005900032,3005900287,CO
-3005900288,3005902591,PA
-3005902592,3005902847,CO
-3005902848,3005903359,PA
-3005903360,3005903871,CO
-3005903872,3005905151,PA
-3005905152,3005905407,CO
-3005905408,3005905919,PA
-3005905920,3005906943,CO
+3005896960,3005897215,PA
+3005897216,3005897727,CO
+3005897728,3005897983,PA
+3005897984,3005898239,CO
+3005898240,3005899007,PA
+3005899008,3005900543,CO
+3005900544,3005901055,PA
+3005901056,3005901311,CO
+3005901312,3005902591,PA
+3005902592,3005903871,CO
+3005903872,3005904895,PA
+3005904896,3005905407,CO
+3005905408,3005905663,PA
+3005905664,3005906943,CO
3005906944,3005911039,PA
3005911040,3005911295,CO
3005911296,3005911551,PA
3005911552,3005911807,CO
-3005911808,3005913343,PA
+3005911808,3005912831,PA
+3005912832,3005913087,CO
+3005913088,3005913343,PA
3005913344,3005913599,CO
3005913600,3005913855,PA
-3005913856,3005914623,CO
-3005914624,3005915135,PA
+3005913856,3005914879,CO
+3005914880,3005915135,PA
3005915136,3005918207,AR
3005918208,3005919231,CO
3005919232,3005923327,AR
@@ -48895,42 +51458,42 @@
3006279168,3006279423,NI
3006279424,3006283519,PA
3006283520,3006283775,NI
-3006283776,3006284287,CR
-3006284288,3006284799,PA
+3006283776,3006284543,CR
+3006284544,3006284799,PA
3006284800,3006285055,CR
3006285056,3006285311,PA
-3006285312,3006285567,CR
-3006285568,3006285823,PA
-3006285824,3006286079,CR
-3006286080,3006287103,PA
-3006287104,3006287359,CR
-3006287360,3006288639,PA
+3006285312,3006286079,CR
+3006286080,3006286847,PA
+3006286848,3006287359,CR
+3006287360,3006287871,PA
+3006287872,3006288127,CR
+3006288128,3006288639,PA
3006288640,3006289151,CR
-3006289152,3006289663,PA
-3006289664,3006289919,CR
-3006289920,3006291455,PA
-3006291456,3006291711,CR
-3006291712,3006292991,PA
-3006292992,3006293247,CR
-3006293248,3006296575,PA
+3006289152,3006289407,PA
+3006289408,3006289919,CR
+3006289920,3006291199,PA
+3006291200,3006291967,CR
+3006291968,3006296575,PA
3006296576,3006296831,CR
3006296832,3006308351,PA
3006308352,3006308863,CR
-3006308864,3006310143,PA
-3006310144,3006310399,CR
-3006310400,3006311167,PA
+3006308864,3006309631,PA
+3006309632,3006309887,CR
+3006309888,3006310143,PA
+3006310144,3006310655,CR
+3006310656,3006311167,PA
3006311168,3006311423,CR
3006311424,3006311679,PA
-3006311680,3006312191,CR
-3006312192,3006312703,PA
-3006312704,3006312959,CR
-3006312960,3006313727,PA
-3006313728,3006313983,CR
-3006313984,3006314239,PA
-3006314240,3006314495,CR
+3006311680,3006312447,CR
+3006312448,3006312703,PA
+3006312704,3006313471,CR
+3006313472,3006313727,PA
+3006313728,3006314495,CR
3006314496,3006315263,PA
3006315264,3006315775,CR
-3006315776,3006320895,PA
+3006315776,3006316031,PA
+3006316032,3006316287,CR
+3006316288,3006320895,PA
3006320896,3006321151,CR
3006321152,3006321663,PA
3006321664,3006322175,CR
@@ -48938,10 +51501,10 @@
3006322432,3006323199,CR
3006323200,3006323455,PA
3006323456,3006323711,CR
-3006323712,3006329343,PA
-3006329344,3006329855,NI
-3006329856,3006330367,PA
-3006330368,3006330623,NI
+3006323712,3006324223,PA
+3006324224,3006324479,CR
+3006324480,3006328831,PA
+3006328832,3006330623,NI
3006330624,3006330879,PA
3006330880,3006331903,CR
3006331904,3006332927,AR
@@ -48971,11 +51534,13 @@
3006513152,3006513663,PA
3006513664,3006514431,CR
3006514432,3006514687,PA
-3006514688,3006517503,CR
+3006514688,3006516479,CR
+3006516480,3006516735,PA
+3006516736,3006517503,CR
3006517504,3006517759,NI
3006517760,3006518527,CR
-3006518528,3006519039,NI
-3006519040,3006521343,CR
+3006518528,3006519295,NI
+3006519296,3006521343,CR
3006521344,3006528511,AR
3006528512,3006529535,BZ
3006529536,3006660607,DO
@@ -49014,85 +51579,225 @@
3007123456,3007143935,AR
3007143936,3007148031,CL
3007148032,3007152127,CO
-3007152128,3007152383,CL
+3007152128,3007152143,CL
+3007152144,3007152159,DE
+3007152160,3007152383,CL
3007152384,3007152639,US
-3007152640,3007152895,CL
+3007152640,3007152655,CL
+3007152656,3007152671,DE
+3007152672,3007152895,CL
3007152896,3007153151,US
-3007153152,3007153407,CL
-3007153408,3007153663,US
-3007153664,3007153919,CL
+3007153152,3007153167,CL
+3007153168,3007153183,DE
+3007153184,3007153279,CL
+3007153280,3007153663,US
+3007153664,3007153679,CL
+3007153680,3007153695,DE
+3007153696,3007153919,CL
3007153920,3007154175,US
-3007154176,3007154431,CL
-3007154432,3007154687,US
-3007154688,3007154943,CL
+3007154176,3007154191,CL
+3007154192,3007154207,DE
+3007154208,3007154303,CL
+3007154304,3007154687,US
+3007154688,3007154703,CL
+3007154704,3007154719,DE
+3007154720,3007154943,CL
3007154944,3007155199,US
-3007155200,3007155455,CL
+3007155200,3007155215,CL
+3007155216,3007155231,DE
+3007155232,3007155327,CL
+3007155328,3007155455,US
3007155456,3007155711,GB
-3007155712,3007155967,CL
+3007155712,3007155727,CL
+3007155728,3007155743,DE
+3007155744,3007155967,CL
3007155968,3007156223,DE
-3007156224,3007156479,CL
+3007156224,3007156239,CL
+3007156240,3007156255,DE
+3007156256,3007156351,CL
+3007156352,3007156479,US
3007156480,3007156495,ES
-3007156496,3007156991,CL
+3007156496,3007156511,DE
+3007156512,3007156543,CL
+3007156544,3007156607,GB
+3007156608,3007156751,CL
+3007156752,3007156767,DE
+3007156768,3007156991,CL
3007156992,3007157007,HR
-3007157008,3007157503,CL
+3007157008,3007157055,CL
+3007157056,3007157119,GB
+3007157120,3007157247,DE
+3007157248,3007157263,CL
+3007157264,3007157279,DE
+3007157280,3007157375,CL
+3007157376,3007157503,US
3007157504,3007157519,IE
-3007157520,3007158015,CL
+3007157520,3007157567,CL
+3007157568,3007157631,GB
+3007157632,3007157759,US
+3007157760,3007157775,CL
+3007157776,3007157791,DE
+3007157792,3007158015,CL
3007158016,3007158031,BE
-3007158032,3007158527,CL
+3007158032,3007158079,CL
+3007158080,3007158143,GB
+3007158144,3007158271,DE
+3007158272,3007158287,CL
+3007158288,3007158303,DE
+3007158304,3007158399,CL
+3007158400,3007158527,US
3007158528,3007158543,GB
-3007158544,3007159039,CL
+3007158544,3007158591,CL
+3007158592,3007158655,GB
+3007158656,3007158783,DE
+3007158784,3007158799,CL
+3007158800,3007158815,DE
+3007158816,3007159039,CL
3007159040,3007159055,GB
-3007159056,3007159551,CL
+3007159056,3007159103,CL
+3007159104,3007159167,GB
+3007159168,3007159295,US
+3007159296,3007159311,CL
+3007159312,3007159327,DE
+3007159328,3007159423,CL
+3007159424,3007159551,US
3007159552,3007159567,RU
-3007159568,3007160063,CL
+3007159568,3007159615,CL
+3007159616,3007159679,GB
+3007159680,3007159807,DE
+3007159808,3007159823,CL
+3007159824,3007159839,DE
+3007159840,3007160063,CL
3007160064,3007160079,HR
-3007160080,3007160575,CL
+3007160080,3007160127,CL
+3007160128,3007160191,GB
+3007160192,3007160319,DE
+3007160320,3007160335,CL
+3007160336,3007160351,DE
+3007160352,3007160447,CL
+3007160448,3007160575,US
3007160576,3007160591,IE
3007160592,3007160607,US
-3007160608,3007161087,CL
+3007160608,3007160703,CL
+3007160704,3007160831,US
+3007160832,3007160847,CL
+3007160848,3007160863,DE
+3007160864,3007161087,CL
3007161088,3007161103,GB
-3007161104,3007161599,CL
+3007161104,3007161215,CL
+3007161216,3007161343,DE
+3007161344,3007161359,CL
+3007161360,3007161375,DE
+3007161376,3007161471,CL
+3007161472,3007161599,US
3007161600,3007161615,GB
-3007161616,3007162111,CL
+3007161616,3007161727,CL
+3007161728,3007161855,DE
+3007161856,3007161871,CL
+3007161872,3007161887,DE
+3007161888,3007162111,CL
3007162112,3007162127,ES
-3007162128,3007162623,CL
+3007162128,3007162239,CL
+3007162240,3007162367,US
+3007162368,3007162383,CL
+3007162384,3007162399,DE
+3007162400,3007162495,CL
+3007162496,3007162623,US
3007162624,3007162639,NL
-3007162640,3007163135,CL
+3007162640,3007162751,CL
+3007162752,3007162879,DE
+3007162880,3007162895,CL
+3007162896,3007162911,DE
+3007162912,3007163135,CL
3007163136,3007163151,GB
-3007163152,3007163647,CL
+3007163152,3007163199,CL
+3007163200,3007163263,DE
+3007163264,3007163407,CL
+3007163408,3007163423,DE
+3007163424,3007163519,CL
+3007163520,3007163647,US
3007163648,3007163663,ES
-3007163664,3007164159,CL
+3007163664,3007163711,CL
+3007163712,3007163775,DE
+3007163776,3007163903,US
+3007163904,3007163919,CL
+3007163920,3007163935,DE
+3007163936,3007164159,CL
3007164160,3007164175,SK
-3007164176,3007164671,CL
+3007164176,3007164223,CL
+3007164224,3007164287,DE
+3007164288,3007164431,CL
+3007164432,3007164447,DE
+3007164448,3007164543,CL
+3007164544,3007164671,US
3007164672,3007164687,SE
-3007164688,3007165183,CL
+3007164688,3007164735,CL
+3007164736,3007164799,DE
+3007164800,3007164943,CL
+3007164944,3007164959,DE
+3007164960,3007165183,CL
3007165184,3007165199,GB
-3007165200,3007165695,CL
+3007165200,3007165247,CL
+3007165248,3007165311,DE
+3007165312,3007165439,US
+3007165440,3007165455,CL
+3007165456,3007165471,DE
+3007165472,3007165567,CL
+3007165568,3007165695,US
3007165696,3007165711,DK
-3007165712,3007166207,CL
+3007165712,3007165759,CL
+3007165760,3007165823,DE
+3007165824,3007165967,CL
+3007165968,3007165983,DE
+3007165984,3007166207,CL
3007166208,3007166223,TR
-3007166224,3007166719,CL
+3007166224,3007166271,CL
+3007166272,3007166335,DE
+3007166336,3007166479,CL
+3007166480,3007166495,DE
+3007166496,3007166591,CL
+3007166592,3007166719,US
3007166720,3007166735,GB
-3007166736,3007167231,CL
+3007166736,3007166751,DE
+3007166752,3007166847,CL
+3007166848,3007166975,US
+3007166976,3007166991,CL
+3007166992,3007167007,DE
+3007167008,3007167231,CL
3007167232,3007167247,ES
-3007167248,3007167743,CL
+3007167248,3007167263,DE
+3007167264,3007167503,CL
+3007167504,3007167519,DE
+3007167520,3007167615,CL
+3007167616,3007167743,US
3007167744,3007167759,AU
-3007167760,3007168255,CL
+3007167760,3007167775,DE
+3007167776,3007168015,CL
+3007168016,3007168031,DE
+3007168032,3007168127,CL
+3007168128,3007168255,US
3007168256,3007168271,GR
-3007168272,3007168511,CL
+3007168272,3007168287,DE
+3007168288,3007168383,CL
+3007168384,3007168511,US
3007168512,3007168767,QA
3007168768,3007169023,CL
3007169024,3007169151,US
-3007169152,3007171855,CL
+3007169152,3007169279,CL
+3007169280,3007169535,US
+3007169536,3007170559,CL
+3007170560,3007171071,DE
+3007171072,3007171855,CL
3007171856,3007171871,US
-3007171872,3007175679,CL
+3007171872,3007172607,CL
+3007172608,3007175679,BR
3007175680,3007175935,GB
-3007175936,3007183359,CL
+3007175936,3007183359,BR
3007183360,3007183615,AU
3007183616,3007183871,IE
3007183872,3007184127,JO
3007184128,3007184383,KW
-3007184384,3007184895,CL
+3007184384,3007184895,BR
3007184896,3007250431,AR
3007250432,3007268095,CR
3007268096,3007268607,PA
@@ -49117,9 +51822,9 @@
3007281920,3007283455,CR
3007283456,3007283711,PA
3007283712,3007283967,CR
-3007283968,3007284223,PA
-3007284224,3007286015,CR
-3007286016,3007286271,PA
+3007283968,3007284479,PA
+3007284480,3007285759,CR
+3007285760,3007286271,PA
3007286272,3007286783,CR
3007286784,3007287295,PA
3007287296,3007287551,CR
@@ -49160,7 +51865,9 @@
3025403904,3025600511,CN
3025600512,3025603071,IN
3025603072,3025603087,HK
-3025603088,3025603839,IN
+3025603088,3025603103,IN
+3025603104,3025603199,HK
+3025603200,3025603839,IN
3025603840,3025604095,HK
3025604096,3025604381,IN
3025604382,3025606655,SG
@@ -49173,7 +51880,9 @@
3025608192,3025608203,JP
3025608204,3025610751,IN
3025610752,3025612799,SG
-3025612800,3025616895,IN
+3025612800,3025612895,IN
+3025612896,3025612927,SG
+3025612928,3025616895,IN
3025616896,3025617407,SG
3025617408,3025618943,IN
3025618944,3025619487,SG
@@ -49191,7 +51900,8 @@
3025625400,3025625407,TH
3025625408,3025625471,SG
3025625472,3025625503,MY
-3025625504,3025625535,IN
+3025625504,3025625519,SG
+3025625520,3025625535,IN
3025625536,3025625599,CA
3025625600,3025625855,SG
3025625856,3025629439,IN
@@ -49205,7 +51915,11 @@
3025631240,3025631247,AU
3025631248,3025632255,IN
3025632256,3025632271,SG
-3025632272,3025633535,IN
+3025632272,3025632287,IN
+3025632288,3025632351,SG
+3025632352,3025632511,IN
+3025632512,3025632767,SG
+3025632768,3025633535,IN
3025633536,3025633791,HK
3025633792,3025633807,AU
3025633808,3025637151,IN
@@ -49224,18 +51938,27 @@
3025639176,3025639423,IN
3025639424,3025639679,SG
3025639680,3025639935,HK
-3025639936,3025640447,IN
+3025639936,3025640191,IN
+3025640192,3025640447,JP
3025640448,3025640799,MY
3025640800,3025641727,IN
3025641728,3025641743,HK
3025641744,3025641759,IN
3025641760,3025641775,HK
-3025641776,3025647103,IN
+3025641776,3025641983,IN
+3025641984,3025642495,HK
+3025642496,3025642751,SG
+3025642752,3025647103,IN
3025647104,3025647359,SG
3025647360,3025647615,AU
3025647616,3025647775,IN
3025647776,3025647791,SG
-3025647792,3025648079,IN
+3025647792,3025647839,IN
+3025647840,3025647871,SG
+3025647872,3025647903,HK
+3025647904,3025647935,IN
+3025647936,3025647967,SG
+3025647968,3025648079,IN
3025648080,3025648087,SG
3025648088,3025648091,US
3025648092,3025649151,IN
@@ -49352,15 +52075,15 @@
3031695360,3031760895,TH
3031760896,3031826431,AU
3031826432,3031891967,KR
-3031891968,3031913983,TH
-3031913984,3031914239,SG
-3031914240,3031957503,TH
+3031891968,3031957503,TH
3031957504,3032252415,CN
3032252416,3032271871,HK
3032271872,3032272895,AU
3032272896,3032276991,JP
3032276992,3032285183,IN
-3032285184,3032301567,JP
+3032285184,3032289279,JP
+3032289280,3032293375,AU
+3032293376,3032301567,JP
3032301568,3032317951,KR
3032317952,3032319999,JP
3032320000,3032323071,AU
@@ -49452,7 +52175,8 @@
3035324416,3035326463,JP
3035326464,3035328511,AU
3035332608,3035333631,AU
-3035333632,3035334655,HK
+3035333632,3035333887,JP
+3035333888,3035334655,HK
3035335680,3035337727,JP
3035337728,3035338751,ID
3035338752,3035339007,SG
@@ -49478,28 +52202,26 @@
3039166464,3039231999,PA
3039232000,3039297535,EC
3039297536,3039363071,PY
-3039363072,3039412223,BZ
-3039412224,3039412991,CL
-3039412992,3039413247,BR
+3039363072,3039411199,BZ
+3039411200,3039412223,US
+3039412224,3039412735,CL
+3039412736,3039413247,BR
3039413248,3039413503,CL
3039413504,3039414015,BR
3039414016,3039414271,CL
3039414272,3039414527,BR
3039414528,3039415295,CL
-3039415296,3039415807,BR
-3039415808,3039416713,CL
+3039415296,3039416319,BR
+3039416320,3039416713,CL
3039416714,3039416715,US
3039416716,3039416735,CL
3039416736,3039416739,US
3039416740,3039416831,CL
-3039416832,3039417343,BR
-3039417344,3039417855,CL
-3039417856,3039418111,BR
-3039418112,3039418367,CL
-3039418368,3039418879,BR
+3039416832,3039417599,BR
+3039417600,3039417855,CL
+3039417856,3039418879,BR
3039418880,3039419135,CL
-3039419136,3039420159,BR
-3039420160,3039420415,CL
+3039419136,3039420415,BR
3039420416,3039428607,AR
3039428608,3039559679,CL
3039559680,3039821823,AR
@@ -49544,7 +52266,7 @@
3048121344,3048122367,PA
3048122368,3048123391,CR
3048123392,3048126463,AR
-3048126464,3048128511,VE
+3048126464,3048128511,ES
3048128512,3048132607,AR
3048132608,3048135935,CR
3048135936,3048136447,PA
@@ -49631,11 +52353,14 @@
3050708480,3050708495,FR
3050708496,3050708991,CL
3050708992,3050709007,AT
-3050709008,3050709503,CL
+3050709008,3050709247,CL
+3050709248,3050709375,DE
+3050709376,3050709503,CL
3050709504,3050709519,TH
3050709520,3050710015,CL
3050710016,3050710031,ES
-3050710032,3050710527,CL
+3050710032,3050710271,CL
+3050710272,3050710527,US
3050710528,3050710543,FR
3050710544,3050711039,CL
3050711040,3050711055,AU
@@ -49647,7 +52372,14 @@
3050712576,3050712591,PL
3050712592,3050713087,CL
3050713088,3050713103,LV
-3050713104,3050766335,CL
+3050713104,3050714367,CL
+3050714368,3050714623,GB
+3050714624,3050715647,CL
+3050715648,3050718719,US
+3050718720,3050733567,CL
+3050733568,3050749951,US
+3050749952,3050764287,CL
+3050764288,3050766335,US
3050766336,3050766351,NO
3050766352,3050766847,CL
3050766848,3050766863,KR
@@ -49697,9 +52429,15 @@
3050778112,3050778127,KR
3050778128,3050778623,CL
3050778624,3050778639,TR
-3050778640,3050831871,CL
+3050778640,3050786815,CL
+3050786816,3050788863,US
+3050788864,3050790911,CL
+3050790912,3050807295,US
+3050807296,3050831871,CL
3050831872,3051356159,BR
-3051356160,3051373055,CR
+3051356160,3051372543,CR
+3051372544,3051372799,PA
+3051372800,3051373055,CR
3051373056,3051373311,PA
3051373312,3051374335,CR
3051374336,3051374591,PA
@@ -49899,7 +52637,6 @@
3068986368,3068987391,AU
3068987392,3068990463,IN
3068990464,3068991487,VN
-3068991488,3068991743,IN
3068993536,3069018111,KR
3069018112,3069034495,IN
3069034496,3069050879,KR
@@ -49974,7 +52711,8 @@
3078619136,3081437183,CN
3081437184,3081502719,MY
3081502720,3081764863,CN
-3081764864,3081846783,JP
+3081764864,3081844735,JP
+3081844736,3081846783,AU
3081846784,3081847807,TW
3081847808,3081848831,KR
3081848832,3081850879,SG
@@ -49991,7 +52729,9 @@
3082158080,3082166271,CN
3082166272,3082174463,JP
3082174464,3082178559,BZ
-3082178560,3082179583,HK
+3082178560,3082178823,HK
+3082178824,3082178824,SG
+3082178825,3082179583,HK
3082179584,3082181631,IN
3082181632,3082182655,ID
3082182656,3082190847,LA
@@ -50001,9 +52741,7 @@
3088605184,3088609279,NL
3088609280,3088629759,US
3088629760,3088633855,NL
-3088633856,3088924671,US
-3088924672,3088925695,NL
-3088925696,3088998399,US
+3088633856,3088998399,US
3088998400,3089002495,NL
3089002496,3089027071,US
3089027072,3089031167,NL
@@ -50019,9 +52757,7 @@
3091955712,3091959807,CA
3091959808,3091976191,US
3091976192,3091980287,CA
-3091980288,3092569343,US
-3092569344,3092569599,AU
-3092569600,3092578303,US
+3091980288,3092578303,US
3092578304,3092582399,NL
3092582400,3092615167,US
3092615168,3092619263,NL
@@ -50107,11 +52843,11 @@
3098263552,3098271743,CA
3098271744,3098278847,US
3098278848,3098278911,CA
-3098278912,3098411007,US
+3098278912,3098350383,US
+3098350384,3098350391,BR
+3098350392,3098411007,US
3098411008,3098415103,PK
-3098415104,3098439679,US
-3098439680,3098443775,CA
-3098443776,3098476543,US
+3098415104,3098476543,US
3098476544,3098492927,CA
3098492928,3098494719,US
3098494720,3098495743,CA
@@ -50145,6 +52881,12 @@
3103857408,3103857663,RS
3103857664,3103857919,FR
3103857920,3103858175,PL
+3103858176,3103858431,BG
+3103858432,3103858687,AT
+3103858688,3103858943,NL
+3103858944,3103859199,GB
+3103859200,3103859455,SK
+3103859456,3103859711,DE
3103916032,3103917055,CH
3103917056,3103918079,IT
3103918080,3103919103,DE
@@ -50206,8 +52948,8 @@
3103974400,3103974911,SE
3103974912,3103974919,LT
3103974920,3103974943,SE
-3103974944,3103975039,LT
-3103975040,3103975423,SE
+3103974944,3103975071,LT
+3103975072,3103975423,SE
3103975424,3103976447,SA
3103976448,3103977471,GB
3103977472,3103978495,NL
@@ -50239,7 +52981,9 @@
3104009216,3104010239,IT
3104010240,3104011263,PL
3104011264,3104012287,ES
-3104012288,3104013311,BH
+3104012288,3104012799,BH
+3104012800,3104013055,SA
+3104013056,3104013311,BH
3104013312,3104014335,IR
3104014336,3104015359,FR
3104015360,3104016383,SE
@@ -50302,7 +53046,7 @@
3104075776,3104076799,NL
3104076800,3104077823,GB
3104077824,3104078847,AT
-3104078848,3104079871,LU
+3104078848,3104079871,FR
3104079872,3104080895,GB
3104080896,3104081919,GR
3104081920,3104082943,DK
@@ -50329,7 +53073,6 @@
3104103424,3104104447,IR
3104104448,3104105471,TR
3104105472,3104106495,FI
-3104106496,3104107519,CH
3104107520,3104108543,UA
3104108544,3104109567,GB
3104109568,3104110591,ES
@@ -50394,6 +53137,7 @@
3104173056,3104174079,ES
3104174080,3104175103,IE
3104175104,3104176127,IT
+3104176128,3104177151,RU
3104177152,3104178175,UA
3104178176,3104179199,PL
3104179200,3104180223,ES
@@ -50415,7 +53159,7 @@
3104195584,3104196607,DE
3104196608,3104197631,IT
3104197632,3104198655,GR
-3104198656,3104199679,GB
+3104198656,3104199679,RU
3104199680,3104200703,NL
3104200704,3104201727,IT
3104201728,3104202751,FR
@@ -50542,9 +53286,7 @@
3104331776,3104333823,GB
3104333824,3104334847,ES
3104334848,3104335871,SE
-3104335872,3104336359,LT
-3104336360,3104336367,BE
-3104336368,3104336407,LT
+3104335872,3104336407,LT
3104336408,3104336415,CH
3104336416,3104336895,LT
3104336896,3104337919,GB
@@ -50650,7 +53392,15 @@
3104451584,3104452607,RU
3104452608,3104453631,NL
3104453632,3104454655,CH
-3104454656,3104455679,NL
+3104454656,3104454660,NL
+3104454661,3104454782,SE
+3104454783,3104455050,NL
+3104455051,3104455082,SE
+3104455083,3104455146,NL
+3104455147,3104455162,SE
+3104455163,3104455294,NL
+3104455295,3104455423,SE
+3104455424,3104455679,NL
3104455680,3104456703,RU
3104456704,3104457727,IL
3104457728,3104458751,DE
@@ -50675,7 +53425,6 @@
3104478208,3104479231,DE
3104479232,3104480255,RU
3104480256,3104483327,NL
-3104483328,3104484351,SA
3104484352,3104485375,RU
3104485376,3104486399,FR
3104486400,3104488447,RU
@@ -50725,7 +53474,6 @@
3104533504,3104534527,PL
3104534528,3104535551,SE
3104535552,3104536575,ES
-3104536576,3104537599,RO
3104537600,3104538623,US
3104538624,3104539647,PL
3104539648,3104540671,RU
@@ -50828,7 +53576,7 @@
3104642048,3104643071,KZ
3104643072,3104644095,RU
3104644096,3104645119,DE
-3104645120,3104646143,GB
+3104645120,3104646143,RU
3104646144,3104647167,FR
3104647168,3104648191,GB
3104648192,3104649215,RU
@@ -50922,7 +53670,9 @@
3104747520,3104749567,FR
3104749568,3104750591,NL
3104750592,3104751615,CZ
-3104751616,3104752639,UA
+3104751616,3104751871,UA
+3104751872,3104752127,CA
+3104752128,3104752639,UA
3104752640,3104753663,SA
3104753664,3104754687,GR
3104754688,3104755711,MK
@@ -50980,7 +53730,7 @@
3104809984,3104811007,NL
3104811008,3104812031,IT
3104812032,3104813055,RU
-3104814080,3104816127,DE
+3104813056,3104816127,DE
3104816128,3104817151,RU
3104817152,3104818175,DE
3104818176,3104819199,TR
@@ -50994,7 +53744,6 @@
3104826368,3104827391,CH
3104827392,3104828415,PL
3104828416,3104829439,AT
-3104829440,3104830463,DK
3104830464,3104831487,DE
3104831488,3104832511,NL
3104832512,3104833535,CZ
@@ -51014,7 +53763,9 @@
3104848896,3104849919,DE
3104849920,3104850943,RU
3104850944,3104851199,JE
-3104851200,3104851967,GB
+3104851200,3104851455,GB
+3104851456,3104851711,GG
+3104851712,3104851967,GB
3104851968,3104852991,DE
3104852992,3104854015,AT
3104854016,3104855039,GI
@@ -51147,7 +53898,7 @@
3104988160,3104989183,DE
3104989184,3104990207,FR
3104990208,3104991231,DE
-3104991232,3104992255,SK
+3104991232,3104992255,BE
3104992256,3104995327,RU
3104995328,3104996351,GB
3104996352,3104997375,RU
@@ -51196,6 +53947,7 @@
3105042432,3105043455,FR
3105043456,3105044479,DE
3105044480,3105045503,NL
+3105045504,3105046527,DE
3105046528,3105047551,NO
3105047552,3105048575,ES
3105048576,3105049599,SK
@@ -51222,6 +53974,7 @@
3105072128,3105073151,IT
3105073152,3105074175,RU
3105074176,3105075199,DE
+3105075200,3105076223,RU
3105076224,3105077247,BE
3105077248,3105078271,IT
3105078272,3105079295,ES
@@ -51236,7 +53989,7 @@
3105087488,3105088511,FR
3105088512,3105089535,JO
3105089536,3105090559,DE
-3105090560,3105091583,GB
+3105090560,3105091583,NL
3105091584,3105092607,FR
3105092608,3105093631,UA
3105093632,3105094655,SE
@@ -51420,7 +54173,6 @@
3105289216,3105290239,AT
3105290240,3105291263,TR
3105291264,3105292287,CH
-3105292288,3105293311,DE
3105293312,3105294335,GB
3105294336,3105295359,RU
3105295360,3105296383,PL
@@ -51448,8 +54200,7 @@
3105320960,3105321983,SK
3105321984,3105323007,GB
3105323008,3105324031,ES
-3105324032,3105324287,SA
-3105324288,3105325055,BH
+3105324032,3105325055,SA
3105325056,3105326079,IR
3105326080,3105328127,FR
3105328128,3105329151,NL
@@ -51458,6 +54209,7 @@
3105331200,3105332223,IQ
3105332224,3105333247,DE
3105333248,3105334271,LV
+3105334272,3105335295,UA
3105335296,3105336319,GR
3105336320,3105337343,IL
3105337344,3105339391,GB
@@ -51504,11 +54256,10 @@
3105383680,3105383935,SK
3105383936,3105384447,AT
3105384448,3105385471,IT
-3105386496,3105387519,RU
+3105385472,3105387519,RU
3105387520,3105388543,IT
3105388544,3105389567,GB
-3105389568,3105389823,LB
-3105389824,3105390591,TR
+3105389568,3105390591,TR
3105390592,3105391615,JO
3105391616,3105392639,NL
3105392640,3105393663,IR
@@ -51556,7 +54307,9 @@
3105441792,3105442815,IT
3105442816,3105443839,FI
3105443840,3105444863,NL
-3105444864,3105445887,GB
+3105444864,3105445119,GB
+3105445120,3105445631,US
+3105445632,3105445887,GB
3105445888,3105446911,RU
3105446912,3105447935,CH
3105447936,3105448959,DE
@@ -51624,6 +54377,7 @@
3105515520,3105516543,FR
3105516544,3105517567,NL
3105517568,3105518591,RU
+3105518592,3105519615,RS
3105519616,3105520639,RU
3105520640,3105521663,FR
3105521664,3105522687,NO
@@ -51640,9 +54394,7 @@
3105532928,3105533951,RS
3105533952,3105534975,BA
3105534976,3105535231,GB
-3105535232,3105535773,NO
-3105535774,3105535774,RU
-3105535775,3105535999,NO
+3105535232,3105535999,NO
3105536000,3105537023,AZ
3105537024,3105538047,AT
3105538048,3105539071,RU
@@ -51659,6 +54411,7 @@
3105549312,3105549823,AT
3105549824,3105550079,NL
3105550080,3105550335,FR
+3105550336,3105551359,GB
3105551360,3105552383,US
3105552384,3105553407,FR
3105553408,3105554431,DE
@@ -51720,7 +54473,10 @@
3105614848,3105615871,NL
3105615872,3105616895,SE
3105616896,3105617919,GB
-3105617920,3105618943,NL
+3105617920,3105617953,US
+3105617954,3105617954,NL
+3105617955,3105618175,US
+3105618176,3105618943,NL
3105618944,3105619967,DE
3105619968,3105620991,TR
3105620992,3105622015,DE
@@ -51763,7 +54519,8 @@
3105655808,3105656831,ES
3105656832,3105657855,SK
3105657856,3105658879,NL
-3105658880,3105659903,IL
+3105658880,3105659135,GB
+3105659136,3105659903,IL
3105659904,3105660927,DE
3105660928,3105661951,TR
3105661952,3105662975,GB
@@ -51771,7 +54528,13 @@
3105664000,3105665023,DE
3105665024,3105666047,PL
3105667072,3105668095,DE
-3105668096,3105669119,NL
+3105668096,3105668131,US
+3105668132,3105668159,NL
+3105668160,3105668191,US
+3105668192,3105668351,NL
+3105668352,3105668863,US
+3105668864,3105668879,NL
+3105668880,3105669119,US
3105669120,3105670143,CZ
3105670144,3105671167,IE
3105671168,3105673215,GB
@@ -51796,9 +54559,9 @@
3105692672,3105693695,DE
3105693696,3105696767,FR
3105696768,3105697791,GB
-3105697792,3105698815,FR
+3105697792,3105698815,GP
3105698816,3105700863,RU
-3105700864,3105701887,NL
+3105700864,3105701887,BE
3105701888,3105702911,FR
3105702912,3105703935,ES
3105703936,3105704959,IT
@@ -51816,7 +54579,7 @@
3105716224,3105717247,TR
3105717248,3105719295,RU
3105719296,3105721343,GB
-3105721344,3105722367,SI
+3105721344,3105722367,BA
3105722368,3105723391,IT
3105723392,3105724415,FR
3105724416,3105725439,CH
@@ -51904,7 +54667,7 @@
3105807360,3105808383,RU
3105808384,3105809407,NO
3105809408,3105810431,RU
-3105810432,3105811455,IL
+3105810432,3105811455,FR
3105811456,3105812479,NL
3105812480,3105814527,ES
3105814528,3105815551,JO
@@ -52002,6 +54765,7 @@
3105916928,3105917951,ES
3105917952,3105918975,NL
3105918976,3105919999,PL
+3105920000,3105921023,IQ
3105921024,3105922047,IE
3105922048,3105923071,PL
3105923072,3105924095,CZ
@@ -52014,17 +54778,22 @@
3105929216,3105930239,RU
3105930240,3105931263,PT
3105932288,3105933311,SE
-3105933312,3105933343,GB
-3105933344,3105933359,IT
+3105933312,3105933351,GB
+3105933352,3105933359,IT
3105933360,3105933463,GB
3105933464,3105933471,IT
-3105933472,3105934127,GB
-3105934128,3105934135,IT
-3105934136,3105934215,GB
+3105933472,3105933743,GB
+3105933744,3105933751,IT
+3105933752,3105933831,GB
+3105933832,3105933839,IT
+3105933840,3105933871,GB
+3105933872,3105933879,IT
+3105933880,3105934215,GB
3105934216,3105934223,IT
3105934224,3105934231,GB
3105934232,3105934239,IT
-3105934240,3105934335,GB
+3105934240,3105934327,GB
+3105934328,3105934335,IT
3105934336,3105935359,SE
3105935360,3105936383,FR
3105936384,3105937407,CH
@@ -52033,11 +54802,14 @@
3105939456,3105940479,BY
3105940480,3105941503,GR
3105941504,3105942527,NL
-3105942528,3105943551,LU
+3105942528,3105943039,LU
+3105943040,3105943295,BE
+3105943296,3105943551,LU
3105943552,3105944575,NL
3105944576,3105945599,DE
3105945600,3105946623,RU
3105946624,3105947647,IE
+3105947648,3105948671,RU
3105948672,3105949695,GB
3105949696,3105950719,AT
3105950720,3105951743,FR
@@ -52058,7 +54830,9 @@
3105966080,3105967103,FI
3105967104,3105968127,GB
3105968128,3105969151,HU
-3105969152,3105970175,GB
+3105969152,3105969663,GB
+3105969664,3105969695,DE
+3105969696,3105970175,GB
3105970176,3105971199,FR
3105971200,3105972223,GB
3105972224,3105973247,FI
@@ -52080,7 +54854,8 @@
3105987584,3105988607,CZ
3105988608,3105989631,RU
3105989632,3105990655,NL
-3105990656,3105991679,US
+3105990656,3105990911,PS
+3105990912,3105991679,US
3105991680,3105992703,SA
3105992704,3105993727,BH
3105993728,3105994751,DE
@@ -52163,7 +54938,9 @@
3106067456,3106068479,DE
3106068480,3106070527,NL
3106070528,3106071551,UA
-3106071552,3106072575,BH
+3106071552,3106072063,BH
+3106072064,3106072319,US
+3106072320,3106072575,BH
3106072576,3106073599,GB
3106073600,3106074623,PL
3106074624,3106076671,RU
@@ -52290,7 +55067,8 @@
3106202624,3106203647,RU
3106203648,3106204671,GR
3106204672,3106205695,MT
-3106205696,3106206719,NO
+3106205696,3106205951,SE
+3106205952,3106206719,NO
3106206720,3106207743,GE
3106207744,3106208767,GB
3106208768,3106209791,RO
@@ -52327,9 +55105,11 @@
3106239488,3106240511,IT
3106240512,3106241535,IE
3106241536,3106242559,NL
+3106242560,3106243583,RU
3106243584,3106244607,FI
3106244608,3106245631,DE
-3106245632,3106246655,SE
+3106245632,3106245887,DK
+3106245888,3106246655,SE
3106246656,3106247679,DE
3106247680,3106248703,NO
3106248704,3106249727,DE
@@ -52355,7 +55135,7 @@
3106271232,3106272255,SK
3106272256,3106273279,NL
3106273280,3106274303,DE
-3106274304,3106275327,FR
+3106274304,3106275327,CH
3106275328,3106276351,FI
3106276352,3106277375,AT
3106277376,3106278399,DE
@@ -52404,7 +55184,9 @@
3106324480,3106325503,AL
3106325504,3106326527,FR
3106326528,3106326783,NL
-3106326784,3106327551,IL
+3106326784,3106327039,US
+3106327040,3106327295,GB
+3106327296,3106327551,NL
3106327552,3106328575,RU
3106328576,3106329599,UA
3106329600,3106330623,IQ
@@ -52477,7 +55259,7 @@
3106403328,3106405375,GB
3106405376,3106406399,DE
3106406400,3106407423,RU
-3106407424,3106409471,GB
+3106408448,3106409471,GB
3106409472,3106411519,IT
3106411520,3106412543,HU
3106412544,3106413567,GB
@@ -52511,6 +55293,7 @@
3106442240,3106443263,GB
3106443264,3106445311,ES
3106445312,3106446335,RU
+3106446336,3106447359,AZ
3106447360,3106448383,DE
3106448384,3106449407,BG
3106449408,3106450431,AT
@@ -52551,7 +55334,17 @@
3106483426,3106483426,FR
3106483427,3106483429,GB
3106483430,3106483430,IE
-3106483431,3106484223,GB
+3106483431,3106483766,GB
+3106483767,3106483767,DE
+3106483768,3106483768,CZ
+3106483769,3106483769,BE
+3106483770,3106483770,DE
+3106483771,3106483771,FR
+3106483772,3106483772,DE
+3106483773,3106483773,IT
+3106483774,3106483774,PL
+3106483775,3106483775,IE
+3106483776,3106484223,GB
3106484224,3106485247,NL
3106485248,3106486271,CZ
3106486272,3106488319,DE
@@ -52706,12 +55499,14 @@
3106656256,3106657279,GB
3106657280,3106658303,NL
3106658304,3106659327,GB
-3106659328,3106660351,NL
+3106659328,3106660351,CZ
3106660352,3106661375,UA
3106661376,3106662399,TR
3106662400,3106663423,IE
3106663424,3106664447,UA
-3106664448,3106666495,FR
+3106664448,3106665727,FR
+3106665728,3106665983,CH
+3106665984,3106666495,FR
3106666496,3106667519,UA
3106667520,3106668543,ES
3106668544,3106669567,RU
@@ -52817,8 +55612,7 @@
3106780160,3106781183,FR
3106781184,3106782207,DK
3106782208,3106783231,IR
-3106783232,3106783743,NL
-3106783744,3106784255,AE
+3106783232,3106784255,NL
3106784256,3106785279,HU
3106785280,3106786303,CZ
3106786304,3106787327,DE
@@ -52850,7 +55644,11 @@
3106817024,3106818047,IT
3106818048,3106819071,IE
3106819072,3106820095,BE
-3106820096,3106824191,CH
+3106820096,3106821375,CH
+3106821376,3106821631,US
+3106821632,3106821887,HK
+3106821888,3106822143,RU
+3106822144,3106824191,CH
3106824192,3106825215,RU
3106825216,3106826239,IT
3106826240,3106827263,PL
@@ -52881,7 +55679,9 @@
3106850816,3106851839,GB
3106851840,3106852863,PL
3106852864,3106853887,GB
-3106853888,3106854911,CH
+3106853888,3106854015,CH
+3106854016,3106854143,NL
+3106854144,3106854911,CH
3106854912,3106855935,IR
3106855936,3106856959,UA
3106856960,3106857983,NO
@@ -52901,12 +55701,12 @@
3106872320,3106873343,BE
3106873344,3106874367,ES
3106874368,3106875391,RU
-3106875392,3106876415,SE
+3106875392,3106876415,NO
3106876416,3106877439,CZ
3106877440,3106878463,IR
3106878464,3106879487,RU
3106879488,3106880511,MK
-3106880512,3106881535,GB
+3106880512,3106881535,NL
3106881536,3106882559,PL
3106882560,3106883583,BE
3106883584,3106884607,GB
@@ -52966,7 +55766,7 @@
3106940928,3106941951,HU
3106941952,3106943999,FR
3106944000,3106945023,IT
-3106945024,3106946047,DE
+3106945024,3106946047,NL
3106946048,3106947071,GB
3106947072,3106948095,AE
3106948096,3106949119,NL
@@ -53185,7 +55985,6 @@
3107183616,3107184639,IQ
3107184640,3107185663,SE
3107185664,3107186687,CZ
-3107186688,3107187711,GB
3107187712,3107188735,MT
3107188736,3107189759,CZ
3107189760,3107190783,NL
@@ -53303,7 +56102,8 @@
3107315712,3107316735,GB
3107316736,3107317759,KG
3107317760,3107318783,RU
-3107318784,3107319807,NL
+3107318784,3107318799,IE
+3107318800,3107319807,NL
3107319808,3107320831,OM
3107320832,3107321855,SA
3107321856,3107322879,NL
@@ -53355,6 +56155,7 @@
3107371008,3107372031,PL
3107372032,3107373055,DE
3107373056,3107374079,ES
+3107374080,3107374080,SE
3107374081,3107374100,MT
3107374101,3107374120,CR
3107374121,3107374140,IT
@@ -53365,8 +56166,13 @@
3107374221,3107374240,CA
3107374241,3107374260,BO
3107374261,3107374280,US
+3107374281,3107374320,SE
3107374321,3107374332,MX
+3107374333,3107374333,SE
3107374334,3107374335,MX
+3107374336,3107374336,SE
+3107374337,3107374340,US
+3107374341,3107375103,SE
3107375104,3107376127,GB
3107376128,3107377151,NL
3107377152,3107378175,AT
@@ -53479,8 +56285,12 @@
3107496064,3107496191,FR
3107496192,3107496255,DE
3107496256,3107496287,BS
-3107496288,3107496319,FR
-3107496320,3107496703,NL
+3107496288,3107496319,VG
+3107496320,3107496447,NL
+3107496448,3107496463,CL
+3107496464,3107496479,ES
+3107496480,3107496511,GB
+3107496512,3107496703,NL
3107496704,3107496719,PE
3107496720,3107496735,KP
3107496736,3107496751,FJ
@@ -53492,7 +56302,8 @@
3107496832,3107496847,BR
3107496848,3107496863,KP
3107496864,3107496879,HK
-3107496880,3107496911,IS
+3107496880,3107496895,IS
+3107496896,3107496911,US
3107496912,3107496927,PL
3107496928,3107496959,FR
3107496960,3107497983,DK
@@ -53509,7 +56320,8 @@
3107508224,3107509247,PL
3107509248,3107510271,SE
3107510272,3107511295,IT
-3107511296,3107512319,SI
+3107511296,3107511807,RS
+3107511808,3107512319,SI
3107512320,3107513343,NL
3107513344,3107514367,DE
3107514368,3107515391,US
@@ -53538,7 +56350,7 @@
3107540992,3107542015,RO
3107542016,3107543039,SE
3107543040,3107544063,DE
-3107544064,3107545087,IR
+3107544064,3107545087,GB
3107545088,3107546111,NL
3107546112,3107547135,GB
3107547136,3107548159,SE
@@ -53688,7 +56500,10 @@
3107704832,3107705855,CZ
3107705856,3107706879,NO
3107706880,3107707903,RU
-3107707904,3107708927,GB
+3107707904,3107708159,DE
+3107708160,3107708415,GB
+3107708416,3107708671,NL
+3107708672,3107708927,US
3107708928,3107709951,PL
3107709952,3107710975,DK
3107710976,3107711999,RU
@@ -53777,7 +56592,7 @@
3107802112,3107803135,RU
3107803136,3107804159,ES
3107804160,3107805183,CZ
-3107805184,3107806207,ES
+3107805184,3107806207,GB
3107806208,3107807231,RU
3107807232,3107808255,GB
3107808256,3107809279,DE
@@ -53837,7 +56652,7 @@
3107867648,3107868671,GB
3107868672,3107869695,CH
3107869696,3107870719,GB
-3107870720,3107871743,CH
+3107870720,3107871743,DE
3107871744,3107872767,PL
3107872768,3107873791,LV
3107873792,3107874815,RU
@@ -53893,7 +56708,8 @@
3107929088,3107930111,RU
3107930112,3107931135,CH
3107931136,3107932159,NL
-3107932160,3107934207,MT
+3107932160,3107932415,SE
+3107932416,3107934207,MT
3107934208,3107935231,GB
3107935232,3107936255,PL
3107936256,3107937279,IT
@@ -53923,7 +56739,7 @@
3107961856,3107962879,RU
3107962880,3107963903,FR
3107963904,3107964927,RU
-3107964928,3107965951,ES
+3107964928,3107965951,PL
3107965952,3107966975,DE
3107966976,3107967999,NO
3107968000,3107969023,DE
@@ -53951,7 +56767,7 @@
3107991552,3107992575,AT
3107992576,3107993599,RU
3107993600,3107994623,RO
-3107994624,3107995647,DE
+3107994624,3107995647,AT
3107995648,3107996671,BE
3107996672,3107997695,IT
3107997696,3107998719,SE
@@ -53962,7 +56778,7 @@
3108002816,3108003839,RO
3108003840,3108004863,DE
3108004864,3108005887,RU
-3108005888,3108006911,RO
+3108005888,3108006911,LT
3108006912,3108007935,NL
3108007936,3108008959,DE
3108008960,3108009983,CH
@@ -53996,17 +56812,13 @@
3108038656,3108039679,ES
3108039680,3108040703,MD
3108040704,3108041727,ES
-3108041728,3108042751,DE
-3108042752,3108044799,GB
+3108041728,3108044799,GB
3108044800,3108045823,LU
3108045824,3108046847,DE
3108046848,3108047871,HU
-3108047872,3108048895,RU
-3108048896,3108049919,UA
-3108049920,3108050943,RU
+3108047872,3108050943,RU
3108050944,3108051967,GB
3108051968,3108052991,FR
-3108052992,3108054015,IR
3108054016,3108055039,LV
3108055040,3108056063,GB
3108056064,3108057087,IT
@@ -54030,7 +56842,7 @@
3108076544,3108077567,NL
3108077568,3108078591,GB
3108078592,3108079615,SE
-3108079616,3108080639,MD
+3108079616,3108080639,RU
3108080640,3108081663,SE
3108081664,3108082687,GB
3108082688,3108083711,RU
@@ -54039,13 +56851,15 @@
3108085760,3108086783,LV
3108086784,3108087807,GB
3108087808,3108088831,CH
-3108088832,3108089855,NL
+3108088832,3108089855,RU
3108089856,3108090879,SE
3108090880,3108091903,BE
3108091904,3108092927,ES
3108092928,3108093951,SE
3108093952,3108095999,DE
-3108096000,3108097023,RU
+3108096000,3108096511,LT
+3108096512,3108096767,RU
+3108096768,3108097023,ES
3108097024,3108098047,TR
3108098048,3108099071,DE
3108099072,3108100095,NL
@@ -54061,10 +56875,1013 @@
3108109312,3108110335,IQ
3108110336,3108111359,DK
3108111360,3108112383,GB
-3108112384,3108113407,UA
+3108112384,3108113407,US
3108113408,3108114431,RU
3108114432,3108115455,AE
3108115456,3108116479,GB
+3108116480,3108117503,IT
+3108117504,3108118527,RU
+3108118528,3108119551,GB
+3108119552,3108120575,CZ
+3108120576,3108122623,ES
+3108122624,3108123647,AT
+3108123648,3108124671,HU
+3108124672,3108125695,ES
+3108125696,3108126719,CH
+3108126720,3108127743,DE
+3108127744,3108128767,BY
+3108128768,3108129791,ES
+3108129792,3108130815,DE
+3108130816,3108131839,NL
+3108131840,3108132863,RU
+3108132864,3108133887,GB
+3108133888,3108134911,NL
+3108134912,3108135935,LU
+3108135936,3108136959,FR
+3108136960,3108137983,NL
+3108137984,3108139007,CH
+3108139008,3108141055,GB
+3108141056,3108142079,PL
+3108142080,3108143103,TR
+3108143104,3108144127,AL
+3108144128,3108145151,DE
+3108145152,3108146175,RO
+3108146176,3108147199,NL
+3108147200,3108148223,RU
+3108148224,3108149247,SI
+3108149248,3108150271,FR
+3108150272,3108151295,CH
+3108151296,3108152319,CY
+3108152320,3108153343,GB
+3108153344,3108154367,NL
+3108154368,3108155391,ES
+3108155392,3108156415,DE
+3108156416,3108157439,GB
+3108157440,3108158463,DK
+3108158464,3108159487,CZ
+3108159488,3108161535,DE
+3108161536,3108162559,SK
+3108162560,3108164607,GB
+3108164608,3108165631,PL
+3108165632,3108166655,RU
+3108166656,3108167679,DE
+3108167680,3108169727,IR
+3108169728,3108170751,FR
+3108170752,3108171775,DE
+3108171776,3108172799,GB
+3108172800,3108173823,DE
+3108173824,3108174847,NL
+3108174848,3108175871,KG
+3108175872,3108176127,NL
+3108176128,3108176895,UA
+3108176896,3108177919,NL
+3108177920,3108178943,PL
+3108178944,3108179967,IR
+3108179968,3108180991,NO
+3108180992,3108182015,IE
+3108182016,3108183039,DE
+3108183040,3108184063,ES
+3108184064,3108185087,TR
+3108185088,3108186111,DE
+3108186112,3108187135,NO
+3108187136,3108188159,NL
+3108188160,3108189183,GB
+3108189184,3108190207,RU
+3108191232,3108193279,NL
+3108193280,3108194303,PL
+3108194304,3108195327,FR
+3108195328,3108196351,ES
+3108196352,3108197375,FI
+3108197376,3108198399,IS
+3108198400,3108199423,FR
+3108199424,3108200447,RU
+3108200448,3108201471,ES
+3108201472,3108202495,IR
+3108202496,3108203519,ES
+3108203520,3108204543,AT
+3108204544,3108205567,ES
+3108205568,3108206591,NO
+3108206592,3108208639,TR
+3108208640,3108209663,DK
+3108209664,3108210687,CZ
+3108210688,3108211711,BR
+3108211712,3108212735,GB
+3108212736,3108215807,FR
+3108215808,3108216831,DE
+3108216832,3108217855,RU
+3108217856,3108218879,GB
+3108218880,3108219903,RU
+3108219904,3108220927,AT
+3108220928,3108221951,AL
+3108221952,3108222975,IS
+3108222976,3108223999,GB
+3108224000,3108225023,CZ
+3108225024,3108227071,CH
+3108227072,3108228095,NL
+3108228096,3108229119,TR
+3108229120,3108230143,ES
+3108230144,3108231167,IR
+3108231168,3108232191,PL
+3108232192,3108233215,DE
+3108233216,3108234239,NL
+3108234240,3108235263,AT
+3108235264,3108236287,GB
+3108236288,3108237311,IT
+3108237312,3108238335,LT
+3108238336,3108239359,RU
+3108239360,3108240383,GB
+3108240384,3108241407,CZ
+3108241408,3108242431,GB
+3108242432,3108243455,AT
+3108243456,3108244479,GE
+3108244480,3108245503,PL
+3108245504,3108246527,UA
+3108246528,3108247551,RU
+3108247552,3108248575,PL
+3108248576,3108249599,CZ
+3108249600,3108250623,CH
+3108250624,3108251647,LT
+3108251648,3108252671,DE
+3108252672,3108253695,LU
+3108253696,3108254719,ME
+3108254720,3108255743,CH
+3108255744,3108256767,FI
+3108256768,3108257791,RS
+3108257792,3108258815,CH
+3108258816,3108259839,CZ
+3108259840,3108260863,HU
+3108260864,3108261887,DE
+3108261888,3108262911,AE
+3108262912,3108263935,GB
+3108263936,3108264959,NL
+3108264960,3108265983,RU
+3108265984,3108267007,NL
+3108267008,3108268031,RU
+3108268032,3108269055,GB
+3108269056,3108270079,ES
+3108270080,3108271103,GB
+3108271104,3108272127,RU
+3108272128,3108273151,RO
+3108273152,3108274175,DE
+3108274176,3108275199,CY
+3108275200,3108276223,HR
+3108276224,3108277247,DE
+3108277248,3108278271,GB
+3108278272,3108279295,RU
+3108279296,3108280319,FR
+3108280320,3108281343,RU
+3108281344,3108282367,CZ
+3108282368,3108283391,NL
+3108283392,3108284415,CZ
+3108284416,3108285439,NO
+3108285440,3108286463,NL
+3108286464,3108287487,IT
+3108287488,3108288511,NL
+3108288512,3108289535,RU
+3108289536,3108290559,RO
+3108290560,3108291583,IT
+3108291584,3108292607,NL
+3108292608,3108293631,GB
+3108293632,3108294655,CH
+3108294656,3108295679,EE
+3108295680,3108297727,CZ
+3108297728,3108298751,TR
+3108298752,3108300799,FR
+3108300800,3108301823,GB
+3108301824,3108302847,CH
+3108302848,3108303871,NL
+3108303872,3108304895,RU
+3108304896,3108305919,GB
+3108305920,3108306943,DE
+3108306944,3108307967,PL
+3108307968,3108308991,IQ
+3108308992,3108310015,ES
+3108310016,3108312063,GB
+3108312064,3108313087,PL
+3108313088,3108314111,LV
+3108314112,3108315135,BA
+3108315136,3108316159,NL
+3108316160,3108317183,FI
+3108317184,3108318207,CH
+3108318208,3108319231,SE
+3108319232,3108320255,SK
+3108320256,3108321279,LT
+3108321280,3108322303,RO
+3108322304,3108323327,NL
+3108323328,3108324351,GB
+3108324352,3108325375,CZ
+3108325376,3108326399,FI
+3108326400,3108327423,FR
+3108327424,3108328447,RU
+3108328448,3108329471,GB
+3108329472,3108330495,NL
+3108330496,3108331519,CH
+3108331520,3108332543,HU
+3108332544,3108333567,NL
+3108333568,3108334591,SK
+3108334592,3108335615,IR
+3108335616,3108336639,NL
+3108336640,3108337663,GB
+3108337664,3108338687,IR
+3108338688,3108339711,RU
+3108339712,3108340735,NL
+3108340736,3108341759,RU
+3108341760,3108342783,CH
+3108342784,3108343807,FI
+3108343808,3108344831,GB
+3108344832,3108345855,SI
+3108345856,3108346879,UA
+3108346880,3108347903,NL
+3108347904,3108348927,AT
+3108348928,3108349951,BE
+3108349952,3108350975,SE
+3108350976,3108351999,GE
+3108352000,3108354047,DE
+3108354048,3108355071,TM
+3108355072,3108356095,IT
+3108356096,3108358143,PL
+3108358144,3108359167,DE
+3108359168,3108360191,NL
+3108360192,3108361215,RU
+3108361216,3108362239,IE
+3108362240,3108363263,LU
+3108363264,3108364287,RU
+3108364288,3108365311,LU
+3108365312,3108366335,FR
+3108366336,3108367359,NL
+3108367360,3108368383,AT
+3108368384,3108369407,RO
+3108369408,3108370431,AT
+3108370432,3108371455,FR
+3108371456,3108372479,ES
+3108372480,3108373503,SK
+3108373504,3108374527,NL
+3108374528,3108375551,GB
+3108375552,3108376575,BY
+3108376576,3108377599,UA
+3108377600,3108378623,DE
+3108378624,3108379647,CZ
+3108379648,3108380671,IE
+3108380672,3108381695,GB
+3108381696,3108382719,PL
+3108382720,3108383743,CH
+3108383744,3108384767,BE
+3108384768,3108385791,CH
+3108385792,3108386815,GE
+3108386816,3108387839,GB
+3108387840,3108388863,IR
+3108388864,3108389887,NL
+3108389888,3108390911,CH
+3108390912,3108391935,BE
+3108391936,3108392959,GR
+3108392960,3108393983,LI
+3108393984,3108395007,TR
+3108395008,3108396031,GB
+3108396032,3108397055,ES
+3108397056,3108398079,TR
+3108398080,3108399103,PT
+3108399104,3108400127,RU
+3108400128,3108401151,UA
+3108401152,3108402175,NL
+3108402176,3108403199,KZ
+3108403200,3108404223,DE
+3108404224,3108405247,SE
+3108405248,3108406271,UA
+3108406272,3108407295,GB
+3108407296,3108408319,ES
+3108408320,3108409343,TR
+3108409344,3108410367,DE
+3108410368,3108411391,IT
+3108411392,3108412415,ES
+3108412416,3108414463,GB
+3108414464,3108415487,RU
+3108415488,3108416511,GB
+3108416512,3108417535,ES
+3108417536,3108418559,FR
+3108418560,3108419583,PL
+3108419584,3108420607,NL
+3108420608,3108421631,MD
+3108421632,3108422655,GB
+3108422656,3108423679,IR
+3108423680,3108424703,IT
+3108424704,3108425727,DE
+3108425728,3108427775,NL
+3108427776,3108428799,CZ
+3108428800,3108429823,DE
+3108429824,3108430847,LB
+3108430848,3108433919,NL
+3108433920,3108434943,GB
+3108434944,3108435967,CH
+3108435968,3108436991,IL
+3108436992,3108438015,GB
+3108438016,3108439039,US
+3108439040,3108440063,DE
+3108440064,3108441087,IT
+3108441088,3108443135,CH
+3108443136,3108444159,PL
+3108444160,3108445183,GB
+3108445184,3108446207,ES
+3108446208,3108447231,DE
+3108447232,3108448255,GB
+3108448256,3108449279,CZ
+3108449280,3108450303,IT
+3108450304,3108451327,GB
+3108451328,3108452351,RU
+3108452352,3108453375,LU
+3108453376,3108454399,NL
+3108454400,3108456447,RU
+3108456448,3108457471,GB
+3108457472,3108459519,RU
+3108459520,3108460543,DE
+3108460544,3108461567,RO
+3108461568,3108462591,GB
+3108462592,3108463615,RU
+3108463616,3108464639,GB
+3108464640,3108465663,HU
+3108465664,3108466687,GB
+3108466688,3108467711,CH
+3108467712,3108468735,TR
+3108468736,3108470783,DE
+3108470784,3108471807,LV
+3108471808,3108472831,YE
+3108472832,3108473855,GB
+3108473856,3108474879,PS
+3108474880,3108475903,RU
+3108475904,3108476927,FR
+3108476928,3108477951,IR
+3108477952,3108478975,FR
+3108478976,3108479999,IE
+3108480000,3108481023,AT
+3108481024,3108482047,DE
+3108482048,3108483071,SI
+3108483072,3108484095,SE
+3108484096,3108485119,AL
+3108485120,3108486143,GB
+3108486144,3108487167,FR
+3108487168,3108488191,IR
+3108488192,3108489215,RU
+3108489216,3108490239,ES
+3108490240,3108491263,AE
+3108491264,3108492287,NO
+3108492288,3108493311,RU
+3108493312,3108494335,CY
+3108494336,3108496383,NL
+3108496384,3108497407,DE
+3108497408,3108498431,CZ
+3108498432,3108499455,HR
+3108499456,3108500479,PL
+3108500480,3108501503,IT
+3108501504,3108502527,DE
+3108502528,3108503551,AT
+3108503552,3108504575,CH
+3108504576,3108505599,FR
+3108505600,3108506623,RU
+3108506624,3108507647,ES
+3108507648,3108508671,HU
+3108508672,3108509695,CH
+3108509696,3108510719,IR
+3108510720,3108511743,SI
+3108511744,3108512767,PL
+3108512768,3108513791,DK
+3108513792,3108514815,IT
+3108514816,3108515839,ES
+3108515840,3108516863,UA
+3108516864,3108517887,ES
+3108517888,3108518911,BG
+3108518912,3108519935,SI
+3108519936,3108520959,CH
+3108520960,3108521983,CZ
+3108521984,3108523007,AT
+3108523008,3108524031,IT
+3108524032,3108525055,FR
+3108525056,3108526079,LV
+3108526080,3108527103,FR
+3108527104,3108528127,GB
+3108528128,3108529151,NO
+3108529152,3108530175,JO
+3108530176,3108531199,SI
+3108531200,3108532223,GB
+3108532224,3108533247,ES
+3108533248,3108534271,FI
+3108534272,3108536319,NL
+3108536320,3108537343,GB
+3108537344,3108538367,NL
+3108538368,3108539391,AT
+3108539392,3108540415,DK
+3108540416,3108541439,RU
+3108541440,3108542463,GR
+3108542464,3108543487,PT
+3108543488,3108544511,US
+3108544512,3108546559,NL
+3108546560,3108547583,BE
+3108547584,3108548607,GB
+3108548608,3108549631,RO
+3108549632,3108550655,NL
+3108550656,3108551679,PL
+3108551680,3108552703,RU
+3108552704,3108553727,CH
+3108553728,3108554751,PL
+3108554752,3108555775,DE
+3108555776,3108556799,LV
+3108556800,3108557823,DK
+3108557824,3108558847,ES
+3108558848,3108559871,LB
+3108559872,3108560895,NO
+3108560896,3108562943,RU
+3108562944,3108563967,DE
+3108563968,3108564991,CH
+3108564992,3108566015,RO
+3108566016,3108567039,DE
+3108567040,3108568063,FR
+3108568064,3108569087,TR
+3108569088,3108570111,IR
+3108570112,3108571135,SI
+3108571136,3108572159,GB
+3108572160,3108573183,NO
+3108573184,3108574207,RU
+3108574208,3108575231,DE
+3108575232,3108576255,NO
+3108576256,3108578303,NL
+3108578304,3108579327,GB
+3108579328,3108580351,GR
+3108580352,3108581375,GB
+3108581376,3108582399,DE
+3108582400,3108583423,FR
+3108583424,3108584447,BG
+3108584448,3108585471,PL
+3108585472,3108586495,GB
+3108586496,3108587519,EE
+3108587520,3108588543,DK
+3108588544,3108589567,IR
+3108589568,3108590591,DE
+3108590592,3108591615,GB
+3108591616,3108592639,PL
+3108592640,3108593663,NL
+3108593664,3108594687,ES
+3108594688,3108597759,CZ
+3108597760,3108598783,IR
+3108598784,3108600831,CH
+3108600832,3108601855,NL
+3108601856,3108602879,TR
+3108602880,3108603903,EE
+3108603904,3108604927,IT
+3108604928,3108605951,GB
+3108605952,3108606975,NL
+3108606976,3108609023,GB
+3108609024,3108610047,LI
+3108610048,3108611071,CZ
+3108611072,3108612095,IT
+3108612096,3108615167,ES
+3108615168,3108616191,RU
+3108616192,3108617215,GB
+3108617216,3108618239,ES
+3108618240,3108619263,RU
+3108619264,3108620287,DK
+3108620288,3108621311,TR
+3108621312,3108622335,FR
+3108622336,3108623359,PL
+3108623360,3108625407,RU
+3108625408,3108626431,NL
+3108626432,3108627455,CZ
+3108627456,3108628479,PL
+3108628480,3108629503,FR
+3108629504,3108630527,BG
+3108630528,3108631551,CH
+3108631552,3108633599,IT
+3108633600,3108634623,FR
+3108634624,3108635647,AT
+3108635648,3108636671,UZ
+3108636672,3108637695,FR
+3108637696,3108638719,DE
+3108638720,3108639743,ES
+3108639744,3108640767,TR
+3108640768,3108641791,GB
+3108641792,3108642815,CH
+3108642816,3108643839,FR
+3108643840,3108644863,IT
+3108644864,3108645887,FR
+3108645888,3108646911,US
+3108646912,3108647935,DK
+3108647936,3108648959,FR
+3108648960,3108649983,IM
+3108649984,3108651007,CZ
+3108651008,3108652031,DE
+3108652032,3108653055,CH
+3108653056,3108654079,GI
+3108654080,3108655103,NL
+3108655104,3108656127,ES
+3108656128,3108657151,PL
+3108657152,3108658175,RS
+3108658176,3108659199,GE
+3108659200,3108660223,FR
+3108660224,3108661247,UZ
+3108661248,3108662271,RU
+3108662272,3108676607,CH
+3108676608,3108677631,IR
+3108677632,3108678655,GB
+3108678656,3108679679,RU
+3108679680,3108680703,GB
+3108680704,3108681727,DE
+3108681728,3108682751,RU
+3108682752,3108683775,IT
+3108683776,3108684799,ES
+3108684800,3108685823,SK
+3108685824,3108686847,FR
+3108686848,3108687871,CZ
+3108687872,3108688895,FO
+3108688896,3108689919,CH
+3108689920,3108690943,DE
+3108690944,3108691967,RU
+3108691968,3108692991,DE
+3108692992,3108694015,RU
+3108694016,3108696063,GB
+3108696064,3108697087,ES
+3108697088,3108698111,DE
+3108698112,3108699135,IT
+3108699136,3108700159,CZ
+3108700160,3108701183,PL
+3108701184,3108702207,RU
+3108702208,3108703231,AT
+3108703232,3108704255,ES
+3108704256,3108705279,SA
+3108705280,3108706303,GB
+3108706304,3108707327,DE
+3108707328,3108708351,GB
+3108708352,3108709375,CH
+3108709376,3108710399,PL
+3108710400,3108711423,SE
+3108711424,3108712447,RU
+3108712448,3108713471,BG
+3108713472,3108714495,RO
+3108714496,3108715519,RS
+3108715520,3108716543,GB
+3108716544,3108717567,RU
+3108717568,3108718591,FR
+3108718592,3108719615,DE
+3108719616,3108720639,IT
+3108720640,3108721663,MD
+3108721664,3108723711,RU
+3108723712,3108724735,GB
+3108724736,3108725759,IQ
+3108725760,3108726783,DE
+3108726784,3108727807,GB
+3108727808,3108728831,IT
+3108728832,3108729855,NL
+3108729856,3108730879,CZ
+3108730880,3108731903,GB
+3108731904,3108732927,FR
+3108732928,3108733951,FI
+3108733952,3108734975,RU
+3108734976,3108735999,CZ
+3108736000,3108737023,FR
+3108737024,3108738047,IE
+3108738048,3108739071,DE
+3108739072,3108740095,CH
+3108740096,3108741119,NL
+3108741120,3108742143,PL
+3108742144,3108743167,DE
+3108743168,3108744191,NL
+3108744192,3108745215,GB
+3108745216,3108746239,ES
+3108746240,3108747263,RU
+3108747264,3108748287,DE
+3108748288,3108749311,RU
+3108749312,3108750335,HU
+3108750336,3108751359,IR
+3108751360,3108752383,RU
+3108752384,3108753407,IR
+3108753408,3108754431,NL
+3108754432,3108755455,GB
+3108755456,3108756479,AT
+3108756480,3108757503,NL
+3108757504,3108758527,FR
+3108758528,3108759551,DE
+3108759552,3108760575,CZ
+3108760576,3108761599,LV
+3108761600,3108762623,GB
+3108762624,3108763647,NL
+3108763648,3108764671,RU
+3108764672,3108765695,NL
+3108765696,3108766719,FR
+3108766720,3108767743,PT
+3108767744,3108768767,CZ
+3108768768,3108769791,UA
+3108769792,3108770815,NL
+3108770816,3108772863,FR
+3108772864,3108773887,RO
+3108773888,3108774911,IQ
+3108774912,3108775935,GB
+3108775936,3108776959,DE
+3108776960,3108779007,GB
+3108779008,3108780031,RO
+3108780032,3108781055,IT
+3108781056,3108782079,RO
+3108782080,3108783103,SE
+3108783104,3108784127,UA
+3108784128,3108785151,NL
+3108785152,3108786175,ES
+3108786176,3108787199,RU
+3108787200,3108788223,NO
+3108788224,3108789247,NL
+3108789248,3108790271,GB
+3108790272,3108791295,RU
+3108791296,3108792319,IT
+3108792320,3108793343,PL
+3108793344,3108794367,RU
+3108794368,3108795391,FR
+3108795392,3108796415,DE
+3108796416,3108797439,FR
+3108797440,3108798463,NL
+3108798464,3108799487,AE
+3108799488,3108800511,NL
+3108800512,3108801535,RO
+3108801536,3108802559,TR
+3108802560,3108803583,RU
+3108803584,3108804607,GB
+3108804608,3108805631,TR
+3108805632,3108808703,DE
+3108808704,3108809727,NL
+3108809728,3108810751,DE
+3108810752,3108811775,LB
+3108811776,3108812799,CH
+3108812800,3108813823,GB
+3108813824,3108814847,DE
+3108814848,3108815871,FR
+3108815872,3108817919,TR
+3108817920,3108818943,AE
+3108818944,3108819967,GB
+3108819968,3108822015,ES
+3108822016,3108823039,RU
+3108823040,3108825087,IE
+3108825088,3108826111,RU
+3108826112,3108827135,NL
+3108827136,3108828159,RU
+3108828160,3108829183,MT
+3108829184,3108830207,IR
+3108830208,3108831231,RU
+3108831232,3108832255,TR
+3108832256,3108833279,GB
+3108833280,3108834303,RU
+3108834304,3108835327,BE
+3108835328,3108836351,RU
+3108836352,3108837375,GB
+3108837376,3108838399,NL
+3108838400,3108839423,GE
+3108839424,3108840447,IT
+3108840448,3108841471,GR
+3108841472,3108842495,TR
+3108842496,3108843519,LI
+3108843520,3108844543,IT
+3108844544,3108845567,LI
+3108845568,3108846591,GB
+3108846592,3108847615,BE
+3108847616,3108848639,GB
+3108848640,3108849663,CH
+3108849664,3108850687,GB
+3108850688,3108851711,PL
+3108851712,3108852735,GB
+3108852736,3108853759,IT
+3108853760,3108854783,TR
+3108854784,3108855807,CH
+3108855808,3108856831,LT
+3108856832,3108857855,UA
+3108857856,3108858879,DE
+3108858880,3108859903,AT
+3108859904,3108860927,FR
+3108860928,3108861951,NO
+3108861952,3108862975,NL
+3108862976,3108863999,BG
+3108864000,3108865023,NL
+3108865024,3108866047,ES
+3108866048,3108867071,RU
+3108867072,3108868095,GB
+3108868096,3108869119,SK
+3108869120,3108870143,RU
+3108870144,3108871167,GB
+3108871168,3108872191,ES
+3108872192,3108873215,IT
+3108873216,3108874239,SG
+3108874240,3108875263,ES
+3108875264,3108876287,GB
+3108876288,3108877311,ES
+3108877312,3108878335,FR
+3108878336,3108879359,ES
+3108879360,3108880383,NL
+3108880384,3108881407,AM
+3108881408,3108882431,BE
+3108882432,3108883455,GB
+3108883456,3108884479,RU
+3108884480,3108885503,NL
+3108885504,3108886527,BE
+3108886528,3108888575,RU
+3108888576,3108889599,VA
+3108889600,3108893695,RU
+3108893696,3108894719,FI
+3108894720,3108895743,RO
+3108895744,3108896767,AT
+3108896768,3108897791,ES
+3108897792,3108899839,GB
+3108899840,3108900863,CZ
+3108900864,3108901887,IT
+3108901888,3108902911,IR
+3108902912,3108903935,ES
+3108903936,3108905983,RU
+3108905984,3108907007,BG
+3108907008,3108908031,DE
+3108908032,3108909055,EE
+3108909056,3108910079,IT
+3108910080,3108911103,GB
+3108911104,3108912127,CZ
+3108912128,3108913151,DE
+3108913152,3108914175,IT
+3108914176,3108915199,NO
+3108915200,3108916223,PL
+3108916224,3108917247,RU
+3108917248,3108918271,FR
+3108918272,3108919295,TR
+3108919296,3108920319,GB
+3108920320,3108921343,RU
+3108921344,3108922367,NL
+3108922368,3108923391,CZ
+3108923392,3108924415,IR
+3108924416,3108927487,RU
+3108927488,3108929535,CH
+3108929536,3108930559,CY
+3108930560,3108931583,PL
+3108931584,3108932607,UZ
+3108932608,3108933631,FR
+3108933632,3108934655,AM
+3108934656,3108935679,PL
+3108935680,3108936703,SK
+3108936704,3108937727,FR
+3108937728,3108938751,NL
+3108938752,3108940799,GB
+3108940800,3108941823,SE
+3108941824,3108942847,DE
+3108942848,3108943871,BE
+3108943872,3108944895,DE
+3108944896,3108945919,CH
+3108945920,3108946943,GB
+3108946944,3108947967,NL
+3108947968,3108948991,RU
+3108948992,3108950015,GB
+3108950016,3108951039,NO
+3108951040,3108952063,ES
+3108952064,3108953087,GB
+3108953088,3108954111,GR
+3108954112,3108955135,AL
+3108955136,3108956159,NO
+3108956160,3108956671,UA
+3108956672,3108957183,CZ
+3108957184,3108958207,RU
+3108958208,3108959231,SI
+3108959232,3108960255,AE
+3108960256,3108961279,NL
+3108961280,3108962303,DE
+3108962304,3108963327,AM
+3108963328,3108964351,ES
+3108964352,3108965375,NL
+3108965376,3108966399,TR
+3108966400,3108967423,BY
+3108967424,3108968447,ES
+3108968448,3108969471,DE
+3108969472,3108970495,ES
+3108970496,3108971519,PL
+3108971520,3108972543,ES
+3108972544,3108973567,MD
+3108973568,3108974591,DE
+3108974592,3108975615,RU
+3108975616,3108976639,IT
+3108976640,3108977663,GB
+3108977664,3108978687,IR
+3108978688,3108979711,DE
+3108979712,3108980735,RU
+3108980736,3108981759,DE
+3108981760,3108982783,RU
+3108982784,3108983807,NL
+3108983808,3108984831,NO
+3108984832,3108985855,CH
+3108985856,3108986879,HU
+3108986880,3108987903,IR
+3108987904,3108988927,RU
+3108988928,3108989951,CH
+3108989952,3108991999,GB
+3108992000,3108993023,RU
+3108993024,3108994047,BG
+3108994048,3108995071,DE
+3108995072,3108996095,ES
+3108996096,3108998143,RU
+3108998144,3108999167,GB
+3108999168,3109000191,ES
+3109000192,3109001215,FR
+3109001216,3109002239,NL
+3109002240,3109003263,IR
+3109003264,3109004287,NL
+3109004288,3109005311,SE
+3109005312,3109006335,DE
+3109006336,3109007359,ES
+3109007360,3109008383,GB
+3109008384,3109009407,CH
+3109009408,3109010431,GB
+3109010432,3109011455,GR
+3109011456,3109012479,FR
+3109012480,3109013503,DE
+3109013504,3109015551,CH
+3109015552,3109016575,DE
+3109016576,3109017599,KZ
+3109017600,3109018623,DE
+3109018624,3109019647,FR
+3109019648,3109020671,PT
+3109020672,3109021695,SI
+3109021696,3109022719,CH
+3109022720,3109023743,RU
+3109023744,3109024767,PL
+3109024768,3109025791,LT
+3109025792,3109026815,SA
+3109026816,3109027839,CH
+3109027840,3109028863,BG
+3109028864,3109029887,ES
+3109029888,3109030911,NL
+3109030912,3109031935,GB
+3109031936,3109032959,FR
+3109032960,3109033983,TR
+3109033984,3109035007,JO
+3109035008,3109036031,RU
+3109036032,3109037055,PL
+3109037056,3109038079,NL
+3109038080,3109039103,IQ
+3109039104,3109040127,YE
+3109040128,3109041151,HU
+3109041152,3109043199,RU
+3109043200,3109044223,NO
+3109044224,3109045247,CH
+3109045248,3109046271,RS
+3109046272,3109047295,TR
+3109047296,3109048319,PT
+3109048320,3109050367,GB
+3109050368,3109051391,CH
+3109051392,3109052415,DE
+3109052416,3109053439,ME
+3109053440,3109054463,RU
+3109054464,3109055487,JO
+3109055488,3109056511,IL
+3109056512,3109058559,GB
+3109058560,3109059583,DE
+3109059584,3109060607,LU
+3109060608,3109061631,LT
+3109061632,3109062655,GB
+3109062656,3109063679,TR
+3109063680,3109064703,YE
+3109064704,3109065727,DE
+3109065728,3109066751,RU
+3109066752,3109067775,UA
+3109067776,3109068799,NO
+3109068800,3109069823,PL
+3109069824,3109070847,MK
+3109070848,3109071871,DE
+3109071872,3109072895,AZ
+3109072896,3109073919,GB
+3109073920,3109074943,NO
+3109074944,3109075967,DE
+3109075968,3109076991,AT
+3109076992,3109078015,HR
+3109078016,3109079039,IR
+3109079040,3109080063,CZ
+3109080064,3109081087,RU
+3109081088,3109082111,SE
+3109082112,3109083135,PL
+3109083136,3109084159,SE
+3109084160,3109085183,GB
+3109085184,3109086207,AL
+3109086208,3109087231,RU
+3109087232,3109088255,NL
+3109088256,3109089279,LV
+3109089280,3109090303,AT
+3109090304,3109091327,NL
+3109091328,3109092351,RU
+3109092352,3109093375,SE
+3109093376,3109095423,RU
+3109095424,3109096447,NL
+3109096448,3109097471,NO
+3109097472,3109098495,GB
+3109098496,3109099519,HU
+3109099520,3109100543,RU
+3109100544,3109101567,SI
+3109101568,3109102591,CY
+3109102592,3109103615,DK
+3109103616,3109104639,IR
+3109104640,3109105663,FR
+3109105664,3109106687,LV
+3109106688,3109107711,FR
+3109107712,3109108735,PL
+3109108736,3109109759,RS
+3109109760,3109110783,RU
+3109110784,3109111807,FI
+3109111808,3109112831,IE
+3109112832,3109113855,ES
+3109113856,3109115903,AZ
+3109115904,3109116927,AU
+3109116928,3109117951,GE
+3109117952,3109118975,IR
+3109118976,3109119999,DE
+3109120000,3109121023,PL
+3109121024,3109122047,SE
+3109122048,3109123071,RU
+3109123072,3109124095,DK
+3109124096,3109126143,ES
+3109126144,3109127167,LV
+3109127168,3109128191,ES
+3109128192,3109129215,RU
+3109129216,3109130239,LB
+3109130240,3109131263,RU
+3109131264,3109132287,DE
+3109132288,3109133311,TR
+3109133312,3109134335,FR
+3109134336,3109135359,GB
+3109135360,3109136383,RO
+3109136384,3109137407,GB
+3109137408,3109138431,RU
+3109138432,3109139455,GB
+3109139456,3109140479,ES
+3109140480,3109141503,RU
+3109141504,3109143551,GB
+3109143552,3109144575,GR
+3109144576,3109145599,FR
+3109145600,3109148671,AT
+3109148672,3109149695,AZ
+3109149696,3109150719,RU
+3109150720,3109151743,BE
+3109151744,3109152767,HR
+3109152768,3109153791,GB
+3109153792,3109154815,TR
+3109154816,3109155839,AT
+3109155840,3109156863,GB
+3109156864,3109157887,RU
+3109157888,3109158911,GB
+3109158912,3109159935,IT
+3109159936,3109160959,DE
+3109160960,3109161983,GB
+3109161984,3109163007,RU
+3109163008,3109164031,AT
+3109164032,3109165055,DE
+3109165056,3109166079,RU
+3109166080,3109167103,IR
+3109167104,3109168127,LB
+3109168128,3109169151,BG
+3109169152,3109170175,DE
+3109170176,3109171199,IE
+3109171200,3109172223,GI
+3109172224,3109173247,IL
+3109173248,3109174271,ES
+3109174272,3109175295,GB
+3109175296,3109176319,IR
+3109176320,3109177343,IL
+3109177344,3109178367,IE
+3109178368,3109179391,GB
+3109179392,3109180415,ES
+3109180416,3109181439,DE
+3109181440,3109182463,NL
+3109182464,3109183487,LT
+3109183488,3109184511,LB
+3109184512,3109185535,CH
+3109185536,3109187583,RS
+3109187584,3109188607,IT
+3109188608,3109189631,SA
+3109189632,3109190655,AT
+3109190656,3109191679,NL
+3109191680,3109192703,CH
+3109192704,3109193727,IT
+3109193728,3109194751,IR
+3109194752,3109195775,NL
+3109195776,3109196799,FI
+3109196800,3109197823,FR
+3109197824,3109198847,NL
+3109198848,3109199871,GB
+3109199872,3109200895,DE
+3109200896,3109201919,IR
+3109201920,3109202943,IT
+3109202944,3109203967,RO
+3109203968,3109204991,RU
+3109204992,3109206015,IR
+3109206016,3109209087,NL
+3109209088,3109210111,GB
+3109210112,3109211135,NL
+3109211136,3109212159,CH
+3109212160,3109213183,NL
+3109213184,3109214207,CZ
+3109214208,3109215231,BG
+3109215232,3109216255,TR
+3109216256,3109217279,IT
+3109217280,3109218303,DK
+3109218304,3109219327,HU
+3109219328,3109220351,CZ
+3109220352,3109221375,IE
+3109221376,3109222399,GB
+3109222400,3109223423,PL
+3109223424,3109224447,TR
+3109224448,3109225471,RU
+3109225472,3109226495,EE
+3109226496,3109227519,NL
3120562176,3120594943,CO
3120594944,3120599039,AR
3120599040,3120601087,EC
@@ -54084,11 +57901,13 @@
3120691200,3120693247,CO
3120693248,3120726015,BO
3120726016,3120734207,HN
-3120734208,3120738303,BZ
+3120734208,3120735743,BZ
+3120735744,3120735999,RU
+3120736000,3120738303,BZ
3120738304,3120742399,CW
3120742400,3120754687,PY
3120754688,3120755711,CR
-3120755712,3120756735,GY
+3120755712,3120756735,GF
3120757504,3120757759,BZ
3120757760,3120758783,CL
3120758784,3120824319,EC
@@ -54164,7 +57983,9 @@
3123707904,3124232191,UY
3124232192,3124760751,AR
3124760752,3124760759,MX
-3124760760,3124783103,AR
+3124760760,3124765183,AR
+3124765184,3124765439,MX
+3124765440,3124783103,AR
3124783104,3124785151,GT
3124785152,3124788223,CL
3124788224,3124789247,PE
@@ -54178,7 +57999,13 @@
3124846592,3124848639,AR
3124848640,3124849663,PA
3124849664,3124850687,AR
-3124850688,3124853887,HN
+3124850688,3124851471,HN
+3124851472,3124851487,CM
+3124851488,3124852175,HN
+3124852176,3124852191,PH
+3124852192,3124853103,HN
+3124853104,3124853119,VN
+3124853120,3124853887,HN
3124853888,3124853903,FR
3124853904,3124854783,HN
3124854784,3124887551,CL
@@ -54186,9 +58013,7 @@
3124953088,3125018623,CL
3125018624,3125280767,EC
3125280768,3125542911,PA
-3125542912,3125658111,NI
-3125658112,3125658367,MX
-3125658368,3125673983,NI
+3125542912,3125673983,NI
3125673984,3125805055,CL
3125805056,3126329343,CO
3126329344,3126853631,VE
@@ -54198,7 +58023,11 @@
3126857856,3126857983,US
3126857984,3126858495,AR
3126858496,3126858623,US
-3126858624,3126870015,AR
+3126858624,3126861311,AR
+3126861312,3126861439,US
+3126861440,3126862591,AR
+3126862592,3126862719,US
+3126862720,3126870015,AR
3126870016,3126874111,VE
3126874112,3126878207,CR
3126878208,3126882303,PA
@@ -54229,7 +58058,8 @@
3130315776,3130316799,CR
3130316800,3130318847,CW
3130318848,3130319871,AR
-3130319872,3130320895,RU
+3130319872,3130320639,RU
+3130320640,3130320895,BR
3130320896,3130327039,AR
3130327040,3130458111,DO
3130458112,3130523647,GT
@@ -54282,7 +58112,8 @@
3154124800,3154126847,PL
3154126848,3154128895,RU
3154128896,3154132991,EE
-3154132992,3154157567,UA
+3154132992,3154149375,UA
+3154149376,3154157567,KZ
3154157568,3154173951,RU
3154173952,3154182143,MD
3154182144,3154247679,DE
@@ -54294,31 +58125,7 @@
3154575360,3154640895,FR
3154640896,3155165183,IT
3155165184,3155427327,RU
-3155427328,3155536647,AT
-3155536648,3155536655,DE
-3155536656,3155540735,AT
-3155540736,3155540991,HU
-3155540992,3155542323,AT
-3155542324,3155542327,CH
-3155542328,3155598079,AT
-3155598080,3155598335,DE
-3155598336,3155628031,AT
-3155628032,3155628287,HU
-3155628288,3155663743,AT
-3155663744,3155663871,CH
-3155663872,3155675647,AT
-3155675648,3155675775,DE
-3155675776,3155676415,AT
-3155676416,3155676671,HU
-3155676672,3155681791,AT
-3155681792,3155682047,HU
-3155682048,3155684095,AT
-3155684096,3155684223,HU
-3155684224,3155685119,AT
-3155685120,3155685247,HU
-3155685248,3155685375,AT
-3155685376,3155685631,CZ
-3155685632,3155689471,AT
+3155427328,3155689471,AT
3155689472,3155951615,RO
3155951616,3156213759,GB
3156213760,3156279295,RU
@@ -54333,7 +58140,9 @@
3156759432,3156759432,GB
3156759433,3156803583,DE
3156803584,3156869119,TR
-3156869120,3156930559,LU
+3156869120,3156926463,LU
+3156926464,3156928511,NL
+3156928512,3156930559,LU
3156930560,3156933631,US
3156933632,3156934655,SG
3156934656,3157000191,RU
@@ -54347,9 +58156,11 @@
3157196800,3157262335,PL
3157262336,3157786623,SA
3157786624,3158048767,TR
-3158048768,3158214911,CH
-3158214912,3158215167,DE
-3158215168,3158310911,CH
+3158048768,3158070548,CH
+3158070549,3158070549,SE
+3158070550,3158092031,CH
+3158092032,3158092287,DE
+3158092288,3158310911,CH
3158310912,3158312959,FI
3158312960,3158315007,AZ
3158315008,3158317055,DE
@@ -54421,13 +58232,23 @@
3158458368,3158474751,GB
3158474752,3158507519,OM
3158507520,3158573055,FI
-3158573056,3158630399,RU
+3158573056,3158581247,RU
+3158581248,3158589439,DE
+3158589440,3158615039,RU
+3158615040,3158616063,GB
+3158616064,3158630399,RU
3158630400,3158638591,PL
3158638592,3158704127,LT
3158704128,3158835199,KW
3158835200,3158851583,IQ
3158851584,3158859775,RU
-3158859776,3158861567,NL
+3158859776,3158860031,NL
+3158860032,3158860287,GB
+3158860288,3158860543,NL
+3158860544,3158860799,GB
+3158860800,3158861055,NL
+3158861056,3158861311,UA
+3158861312,3158861567,IE
3158861568,3158861823,AE
3158861824,3158862079,IN
3158862080,3158862335,GB
@@ -54446,7 +58267,8 @@
3158865408,3158865663,AL
3158865664,3158865919,CY
3158865920,3158866943,IT
-3158866944,3158867455,NL
+3158866944,3158867199,DE
+3158867200,3158867455,HU
3158867456,3158867711,DE
3158867712,3158867967,NL
3158867968,3158884351,AZ
@@ -54614,38 +58436,27 @@
3161620480,3161636863,DK
3161636864,3161653247,RU
3161653248,3161669631,LU
-3161669632,3161669887,FR
-3161669888,3161670143,RE
-3161670144,3161670399,FR
-3161670400,3161670655,RE
-3161670656,3161671167,FR
+3161669632,3161669887,RE
+3161669888,3161671167,FR
3161671168,3161671423,RE
-3161671424,3161672063,FR
-3161672064,3161672191,RE
-3161672192,3161672703,FR
-3161672704,3161672959,RE
-3161672960,3161673471,FR
-3161673472,3161673983,RE
-3161673984,3161675775,FR
-3161675776,3161676031,RE
-3161676032,3161677823,FR
+3161671424,3161672959,FR
+3161672960,3161673215,RE
+3161673216,3161673471,FR
+3161673472,3161673727,RE
+3161673728,3161677823,FR
3161677824,3161678079,MQ
-3161678080,3161678335,FR
-3161678336,3161679359,MQ
-3161679360,3161679615,FR
-3161679616,3161679871,MQ
+3161678080,3161678847,FR
+3161678848,3161679103,MQ
+3161679104,3161679871,FR
3161679872,3161680639,GP
3161680640,3161681151,FR
-3161681152,3161681919,GP
-3161681920,3161682175,GF
-3161682176,3161682431,FR
+3161681152,3161681663,GP
+3161681664,3161682431,FR
3161682432,3161682943,GF
-3161682944,3161683967,MQ
-3161683968,3161684223,FR
-3161684224,3161684479,MQ
-3161684480,3161685503,FR
-3161685504,3161685759,MQ
-3161685760,3161686015,FR
+3161682944,3161683711,MQ
+3161683712,3161684735,FR
+3161684736,3161684991,MQ
+3161684992,3161686015,FR
3161686016,3161702399,UA
3161702400,3161718783,AM
3161718784,3161735167,PL
@@ -54655,15 +58466,17 @@
3161784320,3161800703,FI
3161800704,3161817087,SA
3161817088,3161833471,PL
-3161833472,3161846015,AT
-3161846016,3161847039,MK
-3161847040,3161849855,AT
+3161833472,3161835519,RS
+3161835520,3161841663,AT
+3161841664,3161845759,RS
+3161845760,3161846015,AT
+3161846016,3161846783,MK
+3161846784,3161849855,AT
3161849856,3161866239,BE
3161866240,3161882623,IR
3161882624,3161899007,DE
3161899008,3161915391,AT
3161915392,3161931775,TR
-3161931776,3161948159,SA
3161948160,3161964543,RO
3161964544,3161980927,ES
3161980928,3161989119,SK
@@ -54680,18 +58493,14 @@
3162071040,3162087423,IR
3162087424,3162095615,SK
3162095616,3162103807,GE
-3162103808,3162105087,FR
-3162105088,3162105855,NL
-3162105856,3162106111,FR
-3162106112,3162106367,NL
-3162106368,3162106623,FR
-3162106624,3162107391,NL
+3162103808,3162104831,FR
+3162104832,3162105343,NL
+3162105344,3162105599,FR
+3162105600,3162107391,NL
3162107392,3162107647,FR
3162107648,3162108415,NL
3162108416,3162108671,FR
-3162108672,3162108927,NL
-3162108928,3162109183,FR
-3162109184,3162111103,NL
+3162108672,3162111103,NL
3162111104,3162111167,FR
3162111168,3162111999,NL
3162112000,3162120191,PL
@@ -54734,7 +58543,8 @@
3162374144,3162382335,BG
3162382336,3162390527,RU
3162390528,3162398719,SE
-3162398720,3162406911,BE
+3162398720,3162404863,NL
+3162404864,3162406911,BE
3162406912,3162415103,IR
3162415104,3162423295,DE
3162423296,3162431487,NO
@@ -54754,7 +58564,7 @@
3162669056,3162681343,RU
3162681344,3162682367,UA
3162682368,3162682879,RU
-3162682880,3162683135,CZ
+3162682880,3162683135,IE
3162683136,3162683391,ES
3162683392,3162685439,RU
3162685440,3162693631,UA
@@ -54778,7 +58588,9 @@
3163166976,3163167231,FR
3163167232,3163170527,DE
3163170528,3163170559,AE
-3163170560,3163186534,DE
+3163170560,3163184739,DE
+3163184740,3163184740,GR
+3163184741,3163186534,DE
3163186535,3163186535,FR
3163186536,3163186673,DE
3163186674,3163186674,FR
@@ -54826,7 +58638,9 @@
3164936192,3164937749,LT
3164937750,3164937750,FR
3164937751,3164938239,LT
-3164938240,3164947579,FR
+3164938240,3164946727,FR
+3164946728,3164946731,NL
+3164946732,3164947579,FR
3164947580,3164947583,IT
3164947584,3164949135,FR
3164949136,3164949151,NL
@@ -54848,24 +58662,30 @@
3164953584,3164953599,ES
3164953600,3164954511,FR
3164954512,3164954515,IT
-3164954516,3164960439,FR
+3164954516,3164959551,FR
+3164959552,3164959583,DE
+3164959584,3164960263,FR
+3164960264,3164960267,ES
+3164960268,3164960439,FR
3164960440,3164960443,DE
3164960444,3164960715,FR
3164960716,3164960719,NL
-3164960720,3164960843,FR
+3164960720,3164960799,FR
+3164960800,3164960831,PT
+3164960832,3164960843,FR
3164960844,3164960847,NL
3164960848,3164961391,FR
3164961392,3164961395,ES
-3164961396,3164961511,FR
-3164961512,3164961519,GB
-3164961520,3164961551,FR
+3164961396,3164961551,FR
3164961552,3164961555,ES
3164961556,3164962471,FR
3164962472,3164962475,ES
3164962476,3164962815,FR
3164962816,3164964863,ES
3164964864,3164966911,FI
-3164966912,3164968319,FR
+3164966912,3164967231,FR
+3164967232,3164967239,ES
+3164967240,3164968319,FR
3164968320,3164968447,GB
3164968448,3164968455,FR
3164968456,3164968459,NL
@@ -54889,22 +58709,37 @@
3164974336,3164974463,GB
3164974464,3164974527,FR
3164974528,3164974559,ES
-3164974560,3164976143,FR
+3164974560,3164974651,FR
+3164974652,3164974655,DE
+3164974656,3164976143,FR
3164976144,3164976159,BE
3164976160,3164976295,FR
3164976296,3164976303,IT
3164976304,3164995583,FR
-3164995584,3165061119,RU
+3164995584,3165061119,NL
3165061120,3165126655,SK
3165126656,3165192191,RU
3165192192,3165257727,GE
-3165257728,3165323263,RO
+3165257728,3165323263,RU
3165323264,3165388799,ES
-3165388800,3165417471,RO
+3165388800,3165417471,MT
3165417472,3165421567,DE
3165421568,3165425663,IE
-3165425664,3165437951,RO
-3165437952,3165454335,AT
+3165425664,3165429759,GB
+3165429760,3165437951,RO
+3165437952,3165438207,DK
+3165438208,3165439487,AT
+3165439488,3165439743,GB
+3165439744,3165439999,AT
+3165440000,3165440255,JP
+3165440256,3165440511,HK
+3165440512,3165440767,JP
+3165440768,3165442047,AT
+3165442048,3165442303,TW
+3165442304,3165442559,AU
+3165442560,3165442815,KR
+3165442816,3165443071,HK
+3165443072,3165454335,AT
3165454336,3165519871,RO
3165519872,3165585407,DE
3165585408,3165650943,CZ
@@ -54915,8 +58750,10 @@
3166568448,3166601215,UA
3166601216,3166609407,RU
3166609408,3166633983,UA
-3166633984,3166638079,RU
-3166638080,3166646271,UA
+3166633984,3166639103,RU
+3166639104,3166639359,UA
+3166639360,3166642175,RU
+3166642176,3166646271,UA
3166646272,3166650367,CZ
3166650368,3166654463,UA
3166654464,3166658559,RU
@@ -54940,42 +58777,73 @@
3166697472,3166699519,RO
3166699520,3166961663,DE
3166961664,3167223807,SI
-3167223808,3167321095,NL
-3167321096,3167321099,DE
-3167321100,3167476583,NL
-3167476584,3167476591,DE
-3167476592,3167748095,NL
+3167223808,3167748095,NL
3167748096,3167762431,RO
3167762432,3167764479,MD
-3167764480,3167772671,RO
+3167764480,3167772671,IR
3167772672,3167773695,MD
-3167773696,3167774719,RO
+3167773696,3167774207,RO
+3167774208,3167774463,SG
+3167774464,3167774719,RO
3167774720,3167775743,MD
3167775744,3167776511,RO
3167776512,3167776767,GB
3167776768,3167777791,MD
3167777792,3167778815,RO
3167778816,3167780863,MD
-3167780864,3167797247,RO
+3167780864,3167784959,RO
+3167784960,3167797247,IR
3167797248,3167798271,MD
3167798272,3167799295,RO
-3167799296,3167803391,MD
-3167803392,3167813631,RO
+3167799296,3167800319,MD
+3167800320,3167801343,RO
+3167801344,3167803391,MD
+3167803392,3167805439,RO
+3167805440,3167813631,IR
3167813632,3167815679,MD
-3167815680,3167868927,RO
+3167815680,3167825919,RO
+3167825920,3167830015,NL
+3167830016,3167834111,RO
+3167834112,3167838207,IT
+3167838208,3167842303,RO
+3167842304,3167843327,ES
+3167843328,3167846399,RO
+3167846400,3167852543,IR
+3167852544,3167853055,RO
+3167853056,3167853567,IR
+3167853568,3167854591,RO
+3167854592,3167866879,IR
+3167866880,3167868927,RO
3167868928,3167879167,MD
3167879168,3167895551,DE
-3167895552,3167938559,RO
+3167895552,3167899647,IR
+3167899648,3167902719,RO
+3167902720,3167902975,BE
+3167902976,3167903231,NL
+3167903232,3167911935,RO
+3167911936,3167932415,IR
+3167932416,3167934463,RO
+3167934464,3167935487,ES
+3167935488,3167936511,PL
+3167936512,3167938559,RO
3167938560,3167939583,MD
3167939584,3167940607,RO
3167940608,3167943679,MD
3167943680,3167944447,RO
3167944448,3167944703,GB
-3167944704,3167987711,RO
+3167944704,3167948799,IR
+3167948800,3167951359,RO
+3167951360,3167951615,SG
+3167951616,3167961087,RO
+3167961088,3167985663,IR
+3167985664,3167987711,RO
3167987712,3167989759,MD
-3167989760,3168005887,RO
+3167989760,3167993855,RO
+3167993856,3168002047,IR
+3168002048,3168005887,RO
3168005888,3168006143,NL
-3168006144,3168010239,RO
+3168006144,3168008191,SE
+3168008192,3168010239,RO
3168010240,3168011263,MD
3168011264,3168012287,RO
3168012288,3168014335,MD
@@ -54983,12 +58851,17 @@
3168016384,3168018431,MD
3168018432,3168020479,RO
3168020480,3168022527,MD
-3168022528,3168038911,RO
+3168022528,3168034815,IR
+3168034816,3168038911,RO
3168038912,3168039935,MD
3168039936,3168040959,BE
3168040960,3168050431,RO
3168050432,3168050687,MD
-3168050688,3168081919,RO
+3168050688,3168063487,RO
+3168063488,3168073727,IR
+3168073728,3168077823,RO
+3168077824,3168079871,ES
+3168079872,3168081919,RO
3168081920,3168083967,FR
3168083968,3168084991,RO
3168084992,3168086015,MD
@@ -54996,35 +58869,50 @@
3168088064,3168089087,RO
3168089088,3168090111,MD
3168090112,3168092159,ES
-3168092160,3168096255,RO
+3168092160,3168096255,IR
3168096256,3168100351,MD
-3168100352,3168129023,RO
+3168100352,3168111615,RO
+3168111616,3168112639,FR
+3168112640,3168124927,RO
+3168124928,3168126975,IR
+3168126976,3168129023,RO
3168129024,3168130047,MD
-3168130048,3168132095,RO
+3168130048,3168131583,RO
+3168131584,3168131839,SG
+3168131840,3168132095,RO
3168132096,3168133119,MD
3168133120,3168136191,RO
3168136192,3168137215,MD
-3168137216,3168138239,RO
+3168137216,3168137983,RO
+3168137984,3168138239,NL
3168138240,3168139263,MD
3168139264,3168156671,RO
3168156672,3168157695,MD
-3168157696,3168165887,RO
+3168157696,3168161791,IR
+3168161792,3168165119,RO
+3168165120,3168165375,DE
+3168165376,3168165887,RO
3168165888,3168166911,MD
-3168166912,3168169983,RO
+3168166912,3168167935,FR
+3168167936,3168169983,RO
3168169984,3168172031,ES
3168172032,3168176127,RO
3168176128,3168177151,MD
3168177152,3168178175,RO
3168178176,3168179199,MD
-3168179200,3168191999,RO
+3168179200,3168182271,RO
+3168182272,3168190463,IR
+3168190464,3168191999,RO
3168192000,3168192255,GB
3168192256,3168192511,RO
3168192512,3168194559,MD
3168194560,3168199679,RO
3168199680,3168200703,MD
-3168200704,3168202751,RO
+3168200704,3168202751,IR
3168202752,3168203775,ES
-3168203776,3168267263,RO
+3168203776,3168215551,RO
+3168215552,3168215807,SG
+3168215808,3168267263,RO
3168267264,3168269311,MD
3168269312,3168271359,RO
3168271360,3168272383,MD
@@ -55060,9 +58948,7 @@
3169648640,3169714175,MD
3169714176,3169779711,FI
3169779712,3169845247,UA
-3169845248,3169851391,RO
-3169851392,3169853439,MD
-3169853440,3169854463,RO
+3169845248,3169854463,RO
3169854464,3169855487,IR
3169855488,3169863167,RO
3169863168,3169863423,MD
@@ -55071,14 +58957,20 @@
3169864704,3169869823,RO
3169869824,3169878015,MD
3169878016,3169882111,RO
-3169882112,3169886207,MD
-3169886208,3169894399,RO
-3169894400,3169895423,MD
+3169882112,3169886207,SE
+3169886208,3169894399,GB
+3169894400,3169895423,ES
3169895424,3169896447,RO
3169896448,3169898495,ES
-3169898496,3169927423,RO
+3169898496,3169899263,RO
+3169899264,3169899519,SG
+3169899520,3169927423,RO
3169927424,3169927679,NL
-3169927680,3169976319,RO
+3169927680,3169951743,RO
+3169951744,3169955839,SE
+3169955840,3169960191,RO
+3169960192,3169960447,NL
+3169960448,3169976319,RO
3169976320,3170111487,RU
3170111488,3170115583,MD
3170115584,3170119679,RU
@@ -55099,14 +58991,22 @@
3170295808,3170303999,RU
3170304000,3170312191,SY
3170312192,3170320383,RU
-3170320384,3170328575,JO
+3170320384,3170327593,JO
+3170327594,3170327594,US
+3170327595,3170328575,JO
3170328576,3170336767,UA
-3170336768,3170369535,RO
+3170336768,3170338815,RO
+3170338816,3170344959,ES
+3170344960,3170347007,RO
+3170347008,3170349055,ES
+3170349056,3170369535,RO
3170369536,3170500607,SA
3170500608,3170631679,PT
3170631680,3170664447,PL
3170664448,3170697215,HR
-3170697216,3170729983,IR
+3170697216,3170717695,IR
+3170717696,3170720767,BG
+3170720768,3170729983,IR
3170729984,3170762751,AZ
3170762752,3170795519,RU
3170795520,3170828287,BG
@@ -55153,7 +59053,10 @@
3187910656,3187914751,CL
3187914752,3187916799,BO
3187916800,3187933183,CO
-3187933184,3187935519,GT
+3187933184,3187933311,HN
+3187933312,3187933341,GT
+3187933342,3187933342,HN
+3187933343,3187935519,GT
3187935520,3187935527,HN
3187935528,3187935607,GT
3187935608,3187935615,HN
@@ -55161,23 +59064,41 @@
3187936048,3187936063,HN
3187936064,3187936711,GT
3187936712,3187936719,HN
-3187936720,3187940351,GT
-3187940352,3187940607,HN
-3187940608,3187940963,GT
+3187936720,3187937799,GT
+3187937800,3187937807,HN
+3187937808,3187939847,GT
+3187939848,3187939855,HN
+3187939856,3187940479,GT
+3187940480,3187940543,HN
+3187940544,3187940963,GT
3187940964,3187940967,HN
-3187940968,3187943055,GT
+3187940968,3187941207,GT
+3187941208,3187941215,HN
+3187941216,3187943055,GT
3187943056,3187943063,HN
3187943064,3187943127,GT
3187943128,3187943135,HN
-3187943136,3187945971,GT
+3187943136,3187943399,GT
+3187943400,3187943403,HN
+3187943404,3187944671,GT
+3187944672,3187944679,HN
+3187944680,3187944773,GT
+3187944774,3187944774,HN
+3187944775,3187945971,GT
3187945972,3187945975,HN
3187945976,3187946111,GT
3187946112,3187946239,HN
-3187946240,3187946639,GT
+3187946240,3187946495,GT
+3187946496,3187946511,HN
+3187946512,3187946639,GT
3187946640,3187946647,HN
3187946648,3187947983,GT
3187947984,3187947987,HN
-3187947988,3187948799,GT
+3187947988,3187948031,GT
+3187948032,3187948159,HN
+3187948160,3187948479,GT
+3187948480,3187948543,HN
+3187948544,3187948799,GT
3187948800,3187948927,HN
3187948928,3187949567,GT
3187949568,3187950126,BQ
@@ -55212,7 +59133,7 @@
3188137184,3188146175,AR
3188146176,3188170751,CO
3188170752,3188174847,CR
-3188174848,3188178943,AR
+3188174848,3188178943,BR
3188178944,3188187135,CR
3188187136,3188203519,AR
3188203520,3188207615,DO
@@ -55221,14 +59142,14 @@
3188228096,3188236287,PE
3188236288,3188237311,PA
3188237312,3188239359,VE
-3188239360,3188240383,PE
+3188239360,3188239615,BR
+3188239616,3188240383,PE
3188240384,3188241407,CO
3188241408,3188242431,EC
3188242432,3188244479,AR
3188244480,3188260863,CO
3188260864,3188269055,AR
-3188269056,3188269183,VE
-3188269184,3188269311,MX
+3188269056,3188269311,MX
3188269312,3188269439,VE
3188269440,3188269567,CO
3188269568,3188269823,MX
@@ -55236,7 +59157,7 @@
3188270080,3188270335,MX
3188270336,3188270847,VE
3188270848,3188271103,BR
-3188271104,3188273151,VE
+3188271104,3188273151,MX
3188273152,3188275199,PA
3188275200,3188277247,CL
3188277248,3188293631,CO
@@ -55254,11 +59175,17 @@
3188473856,3188482047,PE
3188482048,3188490239,AR
3188490240,3188498431,CO
-3188498432,3188513407,AR
+3188498432,3188512127,AR
+3188512128,3188512255,US
+3188512256,3188513407,AR
3188513408,3188513535,US
-3188513536,3188517119,AR
+3188513536,3188516095,AR
+3188516096,3188516223,US
+3188516224,3188517119,AR
3188517120,3188517247,US
-3188517248,3188518271,AR
+3188517248,3188517759,AR
+3188517760,3188517887,US
+3188517888,3188518271,AR
3188518272,3188518399,US
3188518400,3188523007,AR
3188523008,3188539391,CO
@@ -55313,42 +59240,43 @@
3191108960,3191108991,CO
3191108992,3191109119,PE
3191109120,3191109631,MX
-3191109632,3191111679,PE
+3191109632,3191110655,PE
+3191110656,3191111167,MX
+3191111168,3191111679,PE
3191111680,3191128063,PY
3191128064,3191132159,EC
3191132160,3191136255,AR
3191136256,3191144447,DO
3191144448,3191152639,SV
3191152640,3191155711,NI
-3191155712,3191156735,SV
+3191155712,3191156223,SV
+3191156224,3191156735,NI
3191156736,3191169023,HN
3191169024,3191193599,SV
3191193600,3191209983,HN
3191209984,3191275519,CL
3191275520,3191341055,AR
-3191341056,3191405951,GT
-3191405952,3191406335,SV
+3191341056,3191406079,GT
+3191406080,3191406335,SV
3191406336,3191406591,GT
3191406592,3191439359,SV
3191439360,3191455743,EC
3191455744,3191472127,AR
3191472128,3191603199,TT
-3191603200,3191607807,CO
+3191603200,3191603519,CO
+3191603520,3191603583,PR
+3191603584,3191607807,CO
3191607808,3191608319,CL
3191608320,3191610623,CO
-3191610624,3191610879,PE
-3191610880,3191611391,CO
+3191610624,3191611135,PE
+3191611136,3191611391,CO
3191611392,3191619583,VE
-3191619584,3191624703,CL
-3191624704,3191624959,CO
-3191624960,3191626239,CL
-3191626240,3191626495,CO
-3191626496,3191633663,CL
-3191633664,3191633919,CO
-3191633920,3191635967,CL
-3191635968,3191647743,CO
-3191647744,3191647807,AR
-3191647808,3191648255,CO
+3191619584,3191635967,CL
+3191635968,3191637759,CO
+3191637760,3191638015,AR
+3191638016,3191647743,CO
+3191647744,3191647935,AR
+3191647936,3191648255,CO
3191648256,3191649791,US
3191649792,3191650303,CO
3191650304,3191650815,US
@@ -55358,27 +59286,25 @@
3191670016,3191670271,AR
3191670272,3191670783,CO
3191670784,3191672831,CL
-3191672832,3191674879,CO
-3191674880,3191676927,CL
+3191672832,3191673855,CO
+3191673856,3191676927,CL
3191676928,3191677951,US
3191677952,3191678207,AR
3191678208,3191678719,US
3191678720,3191678975,AR
-3191678976,3191680255,US
-3191680256,3191680511,AR
-3191680512,3191680767,US
+3191678976,3191680767,US
3191680768,3191681279,AR
3191681280,3191681535,US
-3191681536,3191683327,AR
-3191683328,3191684607,US
-3191684608,3191684863,AR
-3191684864,3191685119,US
+3191681536,3191682303,AR
+3191682304,3191682559,US
+3191682560,3191683071,AR
+3191683072,3191685119,US
3191685120,3191685631,AR
3191685632,3191685887,US
3191685888,3191687167,AR
3191687168,3191688703,CO
3191688704,3191693311,US
-3191693312,3191695871,CO
+3191693312,3191695871,CL
3191695872,3191696127,US
3191696128,3191696383,CO
3191696384,3191701503,US
@@ -55389,26 +59315,28 @@
3191704576,3191704831,CO
3191704832,3191705343,US
3191705344,3191705599,CO
-3191705600,3191705855,US
-3191705856,3191706111,CO
-3191706112,3191706623,US
-3191706624,3191719935,CO
-3191719936,3191721215,AR
-3191721216,3191721471,CO
-3191721472,3191722495,AR
-3191722496,3191725055,CO
+3191705600,3191706623,US
+3191706624,3191707647,CO
+3191707648,3191719935,CL
+3191719936,3191722495,AR
+3191722496,3191725055,CL
3191725056,3191725311,AR
-3191725312,3191726079,CO
+3191725312,3191725567,CL
+3191725568,3191726079,CO
3191726080,3191726335,AR
-3191726336,3191726591,CO
+3191726336,3191726591,CL
3191726592,3191726847,AR
-3191726848,3191727103,CO
+3191726848,3191727103,CL
3191727104,3191727359,AR
-3191727360,3191730431,CO
+3191727360,3191729919,CO
+3191729920,3191730431,CL
3191730432,3191730687,AR
3191730688,3191730943,CO
3191730944,3191731199,AR
-3191731200,3191732479,CO
+3191731200,3191731711,CO
+3191731712,3191731967,AR
+3191731968,3191732223,CO
+3191732224,3191732479,CL
3191732480,3191732735,AR
3191732736,3191734079,CO
3191734080,3191734143,US
@@ -55428,31 +59356,39 @@
3193438208,3193450495,CW
3193450496,3193450751,SR
3193450752,3193569279,CW
-3193569280,3193579263,CO
+3193569280,3193573087,CO
+3193573088,3193573095,US
+3193573096,3193579263,CO
3193579264,3193579519,EC
3193579520,3193582591,CO
3193582592,3193583103,EC
-3193583104,3193595391,CO
+3193583104,3193592319,CO
+3193592320,3193592575,EC
+3193592576,3193595391,CO
3193595392,3193595647,EC
-3193595648,3193599999,CO
-3193600000,3193600255,EC
-3193600256,3193605375,CO
-3193605376,3193605631,EC
+3193595648,3193599743,CO
+3193599744,3193600255,EC
+3193600256,3193604351,CO
+3193604352,3193605631,EC
3193605632,3193606143,CO
3193606144,3193606399,EC
3193606400,3193606655,CO
3193606656,3193607167,EC
3193607168,3193617151,CO
3193617152,3193617407,EC
-3193617408,3193622527,CO
+3193617408,3193621759,CO
+3193621760,3193622015,EC
+3193622016,3193622527,CO
3193622528,3193623551,EC
3193623552,3193625599,CO
3193625600,3193625855,EC
3193625856,3193626111,CO
3193626112,3193626623,US
-3193626624,3193629439,CO
-3193629440,3193629695,EC
-3193629696,3193634815,CO
+3193626624,3193628927,CO
+3193628928,3193629695,EC
+3193629696,3193630975,CO
+3193630976,3193631231,EC
+3193631232,3193634815,CO
3193634816,3193700351,CL
3193700352,3193722751,HN
3193722752,3193722879,GT
@@ -55463,16 +59399,12 @@
3193735168,3193735679,US
3193735680,3193736191,AR
3193736192,3193736447,US
-3193736448,3193737471,AR
-3193737472,3193739007,US
+3193736448,3193737215,AR
+3193737216,3193739007,US
3193739008,3193739263,AR
-3193739264,3193739519,US
-3193739520,3193739775,AR
-3193739776,3193740287,US
-3193740288,3193741311,AR
-3193741312,3193741823,US
-3193741824,3193742079,AR
-3193742080,3193742335,US
+3193739264,3193740543,US
+3193740544,3193741311,AR
+3193741312,3193742335,US
3193742336,3193742591,AR
3193742592,3193742847,US
3193742848,3193743231,AR
@@ -55481,39 +59413,43 @@
3193743744,3193743871,US
3193743872,3193743999,AR
3193744000,3193744127,US
-3193744128,3193745279,AR
-3193745280,3193745407,US
+3193744128,3193744639,AR
+3193744640,3193744895,US
+3193744896,3193745151,AR
+3193745152,3193745407,US
3193745408,3193746431,AR
3193746432,3193746687,US
3193746688,3193746751,AR
3193746752,3193746815,US
3193746816,3193746879,AR
-3193746880,3193746943,US
-3193746944,3193747199,AR
-3193747200,3193747455,US
+3193746880,3193747455,US
3193747456,3193747583,AR
-3193747584,3193748223,US
-3193748224,3193748863,AR
-3193748864,3193748991,US
-3193748992,3193749247,AR
-3193749248,3193749759,US
-3193749760,3193750015,AR
-3193750016,3193750271,US
+3193747584,3193748479,US
+3193748480,3193748863,AR
+3193748864,3193750271,US
3193750272,3193750527,AR
3193750528,3193750783,US
-3193750784,3193751807,AR
-3193751808,3193752319,US
-3193752320,3193752831,AR
+3193750784,3193751039,AR
+3193751040,3193751295,US
+3193751296,3193751807,AR
+3193751808,3193752703,US
+3193752704,3193752831,AR
3193752832,3193752959,US
3193752960,3193753087,AR
3193753088,3193753343,US
-3193753344,3193754623,AR
+3193753344,3193753471,AR
+3193753472,3193753599,US
+3193753600,3193754623,AR
3193754624,3193754751,US
3193754752,3193755135,AR
3193755136,3193755263,US
-3193755264,3193756415,AR
+3193755264,3193755647,AR
+3193755648,3193755775,US
+3193755776,3193756415,AR
3193756416,3193756543,US
-3193756544,3193757055,AR
+3193756544,3193756799,AR
+3193756800,3193756927,US
+3193756928,3193757055,AR
3193757056,3193757183,US
3193757184,3193765887,AR
3193765888,3193774079,TT
@@ -55544,8 +59480,9 @@
3194028032,3194044415,AR
3194044416,3194052607,CO
3194052608,3194056703,TT
-3194056704,3194058495,CW
-3194058496,3194058751,CA
+3194056704,3194057727,CW
+3194057728,3194057983,CA
+3194057984,3194058751,CW
3194058752,3194060799,AR
3194060800,3194068991,CO
3194068992,3194071039,PA
@@ -55557,11 +59494,13 @@
3194126336,3194127359,GT
3194127360,3194129407,PE
3194129408,3194129663,AR
-3194129664,3194129671,BR
-3194129672,3194130431,AR
+3194129664,3194129919,BR
+3194129920,3194130431,AR
3194130432,3194134527,BR
3194134528,3194135551,AR
-3194135552,3194136575,GT
+3194135552,3194136063,GT
+3194136064,3194136319,BR
+3194136320,3194136575,GT
3194136576,3194137087,BR
3194137088,3194140159,AR
3194140160,3194142719,CR
@@ -55621,7 +59560,10 @@
3194596352,3194597375,HT
3194597376,3194601471,AR
3194601472,3194602495,CW
-3194602496,3194613759,AR
+3194602496,3194610943,AR
+3194610944,3194611199,CO
+3194611200,3194613503,AR
+3194613504,3194613759,CL
3194613760,3194617855,PE
3194617856,3194626047,NI
3194626048,3194630143,AR
@@ -55639,8 +59581,8 @@
3194659840,3194660351,US
3194660352,3194661119,AR
3194661120,3194661375,US
-3194661376,3194662143,AR
-3194662144,3194662399,US
+3194661376,3194661887,AR
+3194661888,3194662399,US
3194662400,3194663167,AR
3194663168,3194664447,US
3194664448,3194664959,AR
@@ -55699,7 +59641,9 @@
3194925056,3194929151,AR
3194929152,3194937343,EC
3194937344,3194945535,AR
-3194945536,3194953727,GT
+3194945536,3194953215,GT
+3194953216,3194953343,NI
+3194953344,3194953727,GT
3194953728,3194959871,AR
3194959872,3194961919,US
3194961920,3194970111,EC
@@ -55735,7 +59679,22 @@
3195067392,3195068415,CR
3195068416,3195076607,CW
3195076608,3195084799,CL
-3195084800,3195092991,CR
+3195084800,3195085055,CR
+3195085056,3195086335,NI
+3195086336,3195087359,CR
+3195087360,3195087615,NI
+3195087616,3195088127,CR
+3195088128,3195088639,NI
+3195088640,3195088895,CR
+3195088896,3195089919,NI
+3195089920,3195090431,CR
+3195090432,3195090687,NI
+3195090688,3195091199,CR
+3195091200,3195091455,NI
+3195091456,3195092223,CR
+3195092224,3195092479,NI
+3195092480,3195092735,CR
+3195092736,3195092991,NI
3195092992,3195097087,DO
3195097088,3195099135,CR
3195099136,3195100159,GT
@@ -55747,7 +59706,8 @@
3195138048,3195139071,DO
3195139072,3195140095,CL
3195140096,3195142143,CR
-3195142144,3195150335,VE
+3195142144,3195142399,MX
+3195142400,3195150335,VE
3195150336,3195158527,CL
3195158528,3195199487,AR
3195199488,3195201535,PY
@@ -55769,9 +59729,7 @@
3195256832,3195265023,AR
3195265024,3195273215,CO
3195273216,3195535359,PE
-3195535360,3195536639,SV
-3195536640,3195536895,FR
-3195536896,3195543551,SV
+3195535360,3195543551,SV
3195547648,3195551743,AR
3195551744,3195559935,EC
3195559936,3195568127,AR
@@ -55804,12 +59762,16 @@
3195721728,3195723775,VE
3195723776,3195731967,AR
3195731968,3195736063,EC
-3195736064,3195737087,BQ
+3195736064,3195736575,BQ
+3195736576,3195736831,AI
+3195736832,3195737087,BQ
3195737088,3195738111,CW
3195738112,3195740159,HN
3195740160,3195740415,US
3195740416,3195740927,PA
-3195740928,3195741951,US
+3195740928,3195741055,US
+3195741056,3195741087,HN
+3195741088,3195741951,US
3195741952,3195744255,PA
3195744256,3195748351,EC
3195748352,3195752447,CL
@@ -55828,7 +59790,9 @@
3195805696,3195807743,NI
3195807744,3195808639,BZ
3195808640,3195808767,CO
-3195808768,3195809791,BZ
+3195808768,3195809151,BZ
+3195809152,3195809279,US
+3195809280,3195809791,BZ
3195809792,3195811839,PE
3195811840,3195813887,AR
3195813888,3195822079,DO
@@ -55898,7 +59862,8 @@
3199729664,3199762431,NI
3199762432,3199778815,CO
3199778816,3199779839,AR
-3199779840,3199780863,CR
+3199779840,3199780735,CR
+3199780736,3199780863,US
3199780864,3199782911,CO
3199782912,3199784959,AR
3199784960,3199785983,EC
@@ -55921,7 +59886,9 @@
3200614400,3200647167,AR
3200647168,3201302527,VE
3201302528,3201433599,CL
-3201433600,3201441791,AR
+3201433600,3201435135,AR
+3201435136,3201435263,US
+3201435264,3201441791,AR
3201441792,3201442047,US
3201442048,3201499135,AR
3201499136,3201515519,CL
@@ -55954,14 +59921,18 @@
3201867776,3201869823,PE
3201869824,3201869855,AR
3201869856,3201869871,PE
-3201869872,3201871743,AR
+3201869872,3201869919,AR
+3201869920,3201869935,PE
+3201869936,3201871743,AR
3201871744,3201871807,PE
-3201871808,3201871871,AR
+3201871808,3201871811,AR
+3201871812,3201871815,PE
+3201871816,3201871871,AR
3201871872,3201875967,PE
3201875968,3201880063,CO
3201880064,3201884159,EC
-3201884160,3201892351,VE
-3201892352,3201925119,AR
+3201884160,3201894399,VE
+3201894400,3201925119,AR
3201925120,3201957887,CL
3201957888,3202088959,PA
3202088960,3202220031,AR
@@ -55997,9 +59968,11 @@
3203556864,3203557119,DO
3203557120,3203561471,CO
3203561472,3203562495,SV
-3203562496,3203564031,CO
-3203564032,3203564287,PA
-3203564288,3203566591,CO
+3203562496,3203563775,CO
+3203563776,3203564287,PA
+3203564288,3203564799,CO
+3203564800,3203565055,DO
+3203565056,3203566591,CO
3203566592,3203566847,PA
3203566848,3203568639,CO
3203568640,3203569663,SV
@@ -56018,12 +59991,18 @@
3210740736,3210742015,BR
3210742016,3210742031,IT
3210742032,3210742047,US
-3210742048,3210742271,BR
+3210742048,3210742063,BR
+3210742064,3210742079,US
+3210742080,3210742271,BR
3210742272,3210742527,CL
3210742528,3210742543,KR
-3210742544,3210743039,CL
+3210742544,3210742567,CL
+3210742568,3210742575,US
+3210742576,3210743039,CL
3210743040,3210743055,GR
-3210743056,3210743295,CL
+3210743056,3210743079,CL
+3210743080,3210743087,US
+3210743088,3210743295,CL
3210743296,3210743551,US
3210743552,3210743567,TH
3210743568,3210743583,US
@@ -56036,7 +60015,7 @@
3210745360,3210745375,US
3210745376,3210745855,CL
3210745856,3210745871,IT
-3210745872,3210746367,CL
+3210745872,3210746367,BR
3210746368,3210746383,SE
3210746384,3210746879,CL
3210746880,3210746895,CH
@@ -56045,8 +60024,8 @@
3210747904,3210748159,BR
3210748160,3210748175,JP
3210748176,3210748415,BR
-3210748416,3210751999,CL
-3210752000,3210752255,US
+3210748416,3210749951,CL
+3210749952,3210752255,US
3210752256,3210755839,CL
3210755840,3210755855,MY
3210755856,3210755871,US
@@ -56059,21 +60038,24 @@
3210764048,3210764063,US
3210764064,3210765055,CL
3210765056,3210765071,SE
-3210765072,3210769919,CL
+3210765072,3210765311,BR
+3210765312,3210769919,CL
3210769920,3210770175,US
3210770176,3210771199,CL
3210771200,3210771215,TH
3210771216,3210772991,CL
3210772992,3210773247,US
-3210773248,3210773503,CL
+3210773248,3210773503,BR
3210773504,3210773519,PL
-3210773520,3210774271,CL
+3210773520,3210774015,CL
+3210774016,3210774271,BR
3210774272,3210774287,NO
-3210774288,3210774783,CL
+3210774288,3210774783,BR
3210774784,3210774799,IT
-3210774800,3210775295,CL
+3210774800,3210775295,BR
3210775296,3210775311,CH
-3210775312,3210776319,CL
+3210775312,3210775551,BR
+3210775552,3210776319,CL
3210776320,3210776575,US
3210776576,3210776831,CL
3210776832,3210777087,US
@@ -56093,7 +60075,9 @@
3210786560,3210786575,GR
3210786576,3210803071,CL
3210803072,3210803087,US
-3210803088,3210803327,CL
+3210803088,3210803199,CL
+3210803200,3210803201,US
+3210803202,3210803327,CL
3210803328,3210803455,BR
3210803456,3210805247,CL
3210805248,3210809343,PA
@@ -56120,78 +60104,214 @@
3210926080,3210928127,AR
3210928128,3210936319,NI
3210936320,3211067391,EC
-3211067392,3211073023,US
+3211067392,3211071487,US
+3211071488,3211071999,DE
+3211072000,3211073023,US
3211073024,3211073279,CA
-3211073280,3211073535,US
-3211073536,3211075583,CL
+3211073280,3211073791,US
+3211073792,3211074047,LT
+3211074048,3211075583,NL
3211075584,3211075839,US
-3211075840,3211080703,CL
+3211075840,3211076095,CL
+3211076096,3211076863,LT
+3211076864,3211079167,CL
+3211079168,3211079423,NL
+3211079424,3211079679,CL
+3211079680,3211079935,GB
+3211079936,3211080703,CL
3211080704,3211080959,NL
3211080960,3211081215,CL
3211081216,3211081727,CH
-3211081728,3211083775,CL
+3211081728,3211082239,US
+3211082240,3211082751,GB
+3211082752,3211083007,SG
+3211083008,3211083519,US
+3211083520,3211083775,HK
3211083776,3211083791,RU
-3211083792,3211084287,CL
+3211083792,3211083855,CL
+3211083856,3211083871,DE
+3211083872,3211084031,CL
+3211084032,3211084287,DE
3211084288,3211084303,NL
-3211084304,3211084671,CL
+3211084304,3211084367,CL
+3211084368,3211084383,DE
+3211084384,3211084559,CL
+3211084560,3211084575,DE
+3211084576,3211084671,CL
3211084672,3211084799,BY
3211084800,3211084815,AT
-3211084816,3211085311,CL
+3211084816,3211084879,CL
+3211084880,3211084895,DE
+3211084896,3211084927,CL
+3211084928,3211085055,US
+3211085056,3211085071,CL
+3211085072,3211085087,DE
+3211085088,3211085311,CL
3211085312,3211085327,GB
-3211085328,3211085695,CL
+3211085328,3211085391,CL
+3211085392,3211085407,DE
+3211085408,3211085583,CL
+3211085584,3211085599,DE
+3211085600,3211085695,CL
3211085696,3211085823,GE
3211085824,3211085839,TH
-3211085840,3211086095,CL
+3211085840,3211085903,CL
+3211085904,3211085919,DE
+3211085920,3211086095,CL
3211086096,3211086111,US
3211086112,3211086335,CL
3211086336,3211086351,FR
-3211086352,3211086847,CL
+3211086352,3211086367,DE
+3211086368,3211086463,CL
+3211086464,3211086591,US
+3211086592,3211086607,CL
+3211086608,3211086623,DE
+3211086624,3211086847,CL
3211086848,3211086863,PL
-3211086864,3211087359,CL
+3211086864,3211086879,DE
+3211086880,3211087119,CL
+3211087120,3211087135,DE
+3211087136,3211087359,CL
3211087360,3211087375,GB
-3211087376,3211087871,CL
+3211087376,3211087391,DE
+3211087392,3211087631,CL
+3211087632,3211087647,DE
+3211087648,3211087871,CL
3211087872,3211087887,ES
-3211087888,3211088383,CL
+3211087888,3211087903,DE
+3211087904,3211087999,CL
+3211088000,3211088127,US
+3211088128,3211088143,CL
+3211088144,3211088159,DE
+3211088160,3211088383,CL
3211088384,3211088399,BE
-3211088400,3211088895,CL
+3211088400,3211088415,DE
+3211088416,3211088655,CL
+3211088656,3211088671,DE
+3211088672,3211088895,CL
3211088896,3211088911,DK
-3211088912,3211089407,CL
+3211088912,3211089407,DE
3211089408,3211089423,GB
-3211089424,3211089919,CL
+3211089424,3211089439,DE
+3211089440,3211089535,CL
+3211089536,3211089663,US
+3211089664,3211089919,DE
3211089920,3211089935,GB
-3211089936,3211090431,CL
+3211089936,3211090431,DE
3211090432,3211090447,GR
-3211090448,3211090943,CL
+3211090448,3211090943,DE
3211090944,3211090959,TR
-3211090960,3211091455,CL
+3211090960,3211091071,DE
+3211091072,3211091199,US
+3211091200,3211091215,CL
+3211091216,3211091231,DE
+3211091232,3211091455,CL
3211091456,3211091471,FI
-3211091472,3211091967,CL
+3211091472,3211091487,DE
+3211091488,3211091727,CL
+3211091728,3211091743,DE
+3211091744,3211091967,CL
3211091968,3211091983,RU
-3211091984,3211092479,CL
+3211091984,3211091999,DE
+3211092000,3211092239,CL
+3211092240,3211092255,DE
+3211092256,3211092479,CL
3211092480,3211092495,BE
-3211092496,3211092991,CL
+3211092496,3211092511,DE
+3211092512,3211092607,CL
+3211092608,3211092735,US
+3211092736,3211092751,CL
+3211092752,3211092767,DE
+3211092768,3211092991,CL
3211092992,3211093007,SK
-3211093008,3211093503,CL
+3211093008,3211093023,DE
+3211093024,3211093263,CL
+3211093264,3211093279,DE
+3211093280,3211093503,CL
3211093504,3211093519,HR
-3211093520,3211094015,CL
+3211093520,3211093535,DE
+3211093536,3211093775,CL
+3211093776,3211093791,DE
+3211093792,3211094015,CL
3211094016,3211094031,CZ
-3211094032,3211094527,CL
+3211094032,3211094047,DE
+3211094048,3211094143,CL
+3211094144,3211094271,US
+3211094272,3211094287,CL
+3211094288,3211094303,DE
+3211094304,3211094527,CL
3211094528,3211094543,HR
-3211094544,3211095039,CL
+3211094544,3211095039,DE
3211095040,3211095055,ES
-3211095056,3211095551,CL
+3211095056,3211095071,DE
+3211095072,3211095311,CL
+3211095312,3211095327,DE
+3211095328,3211095551,CL
3211095552,3211095567,GB
-3211095568,3211096063,CL
+3211095568,3211095583,DE
+3211095584,3211095679,CL
+3211095680,3211095807,US
+3211095808,3211096063,DE
3211096064,3211096079,GB
-3211096080,3211096575,CL
+3211096080,3211096095,DE
+3211096096,3211096335,CL
+3211096336,3211096351,DE
+3211096352,3211096575,CL
3211096576,3211096831,GB
-3211096832,3211097087,CL
+3211096832,3211096847,CL
+3211096848,3211096863,DE
+3211096864,3211097087,CL
3211097088,3211097103,DE
-3211097104,3211099647,CL
+3211097104,3211097151,GB
+3211097152,3211097215,CL
+3211097216,3211097343,GB
+3211097344,3211097359,CL
+3211097360,3211097375,DE
+3211097376,3211097599,CL
+3211097600,3211097855,US
+3211097856,3211097871,CL
+3211097872,3211097887,DE
+3211097888,3211098111,CL
+3211098112,3211098367,US
+3211098368,3211098383,CL
+3211098384,3211098399,DE
+3211098400,3211098623,CL
+3211098624,3211098879,US
+3211098880,3211098895,CL
+3211098896,3211098911,DE
+3211098912,3211099135,CL
+3211099136,3211099391,DE
+3211099392,3211099407,CL
+3211099408,3211099423,DE
+3211099424,3211099647,CL
3211099648,3211099663,DE
-3211099664,3211129599,CL
-3211129600,3211129855,BR
-3211129856,3211132927,CL
+3211099664,3211099711,GB
+3211099712,3211099775,DE
+3211099776,3211099903,GB
+3211099904,3211099919,CL
+3211099920,3211099935,DE
+3211099936,3211101951,CL
+3211101952,3211102207,AR
+3211102208,3211104767,AU
+3211104768,3211106303,CL
+3211106304,3211108351,US
+3211108352,3211113983,CL
+3211113984,3211114239,LU
+3211114240,3211114495,SE
+3211114496,3211114751,IT
+3211114752,3211115007,US
+3211115008,3211115263,NO
+3211115264,3211115519,BE
+3211115520,3211115775,DK
+3211115776,3211116287,RU
+3211116288,3211116543,ES
+3211116544,3211124735,CL
+3211124736,3211128831,US
+3211128832,3211129343,CL
+3211129344,3211129599,SG
+3211129600,3211129855,NL
+3211129856,3211130879,CL
+3211130880,3211132927,US
3211132928,3211137023,CO
3211137024,3211141119,AR
3211141120,3211142143,CL
@@ -56307,7 +60427,7 @@
3220164608,3220168703,IE
3220168704,3220172799,US
3220172800,3221225471,BR
-3221225480,3221225727,GB
+3221225480,3221225727,US
3221226240,3221226495,US
3221226496,3221227519,KY
3221227520,3221242879,US
@@ -56318,7 +60438,9 @@
3221258240,3221291007,CA
3221291008,3221334269,US
3221334270,3221334270,DZ
-3221334271,3221560319,US
+3221334271,3221469175,US
+3221469176,3221469183,CA
+3221469184,3221560319,US
3221560320,3221561087,GB
3221561088,3221562367,US
3221562368,3221562623,SE
@@ -56367,7 +60489,18 @@
3221806080,3221806335,IN
3221806336,3221806591,US
3221806592,3221806847,IN
-3221806848,3222011903,US
+3221806848,3221808383,US
+3221808384,3221808639,IN
+3221808640,3221810431,US
+3221810432,3221810687,IN
+3221810688,3221813759,US
+3221813760,3221814015,IN
+3221814016,3221815039,US
+3221815040,3221815295,IN
+3221815296,3221946367,US
+3221946368,3221991167,FR
+3221991168,3221991423,NZ
+3221991424,3222011903,FR
3222011904,3222012159,CA
3222012160,3222012415,NL
3222012416,3222023935,US
@@ -56475,8 +60608,7 @@
3223223296,3223223551,AI
3223223552,3223227903,US
3223227904,3223228159,CA
-3223228160,3223228415,US
-3223228928,3223229695,US
+3223228160,3223229695,US
3223229696,3223229951,CA
3223229952,3223236607,US
3223236608,3223237631,GB
@@ -56494,9 +60626,7 @@
3223262976,3223263231,BE
3223263232,3223263743,US
3223263744,3223264255,NL
-3223264256,3223264511,US
-3223264512,3223264767,CA
-3223264768,3223265023,US
+3223264256,3223265023,US
3223265024,3223265279,NL
3223265280,3223266559,US
3223266560,3223266815,AU
@@ -56579,16 +60709,12 @@
3223473232,3223474175,CA
3223474176,3223477247,US
3223477248,3223478271,CA
-3223478272,3223480319,US
-3223480832,3223481087,US
+3223478272,3223481087,US
3223481088,3223481343,SE
3223481344,3223483391,US
3223483392,3223483647,NL
-3223483648,3223483903,US
-3223484416,3223491071,US
-3223491584,3223497215,US
-3223497728,3223498751,US
-3223499264,3223499519,US
+3223483904,3223491071,US
+3223491584,3223499519,US
3223499520,3223499775,FI
3223499776,3223500031,US
3223500032,3223503871,CA
@@ -56620,8 +60746,7 @@
3223556608,3223556863,NL
3223556864,3223557375,US
3223557376,3223558655,DE
-3223558656,3223559679,US
-3223559936,3223563263,US
+3223558656,3223563263,US
3223563264,3223563519,NL
3223563520,3223566079,US
3223566080,3223568639,NL
@@ -56635,7 +60760,9 @@
3223578112,3223580671,US
3223580672,3223581951,AT
3223581952,3223582207,US
-3223582208,3223582719,NL
+3223582208,3223582212,NL
+3223582213,3223582213,PT
+3223582214,3223582719,NL
3223582720,3223582975,AU
3223582976,3223584767,US
3223584768,3223585023,GB
@@ -56684,7 +60811,9 @@
3223638272,3223638527,GB
3223638528,3223640831,SE
3223640832,3223641087,GB
-3223641088,3223646207,SE
+3223641088,3223644415,SE
+3223644416,3223644671,DE
+3223644672,3223646207,SE
3223646208,3223646463,IT
3223646464,3223646975,SE
3223646976,3223647231,IT
@@ -56694,38 +60823,36 @@
3223650048,3223650303,GB
3223650304,3223715839,CH
3223715840,3223781375,DK
-3223781376,3223847935,US
-3223848448,3223855103,US
+3223781376,3223855103,US
3223855104,3223857151,CA
-3223857152,3223862783,US
-3223863296,3223863807,US
+3223857152,3223863807,US
+3223863808,3223864319,CA
3223864320,3223864575,US
3223864576,3223864831,AE
3223864832,3223865343,HR
3223865344,3223867391,FI
3223867392,3223867647,GB
3223867648,3223867903,CA
+3223867904,3223868415,US
3223868416,3223869439,BM
3223869440,3223871487,US
3223871488,3223873535,CA
-3223873536,3223875071,US
-3223875584,3223877119,US
-3223877632,3223881727,US
+3223873536,3223881727,US
3223881728,3223882751,CA
+3223882752,3223883263,US
3223883264,3223883519,CA
-3223883520,3223898623,US
-3223899136,3223902207,US
+3223883520,3223902463,US
3223902464,3223902719,CA
-3223903232,3223905279,US
+3223902720,3223905279,US
3223905280,3223905535,FI
3223905536,3223905791,US
3223906304,3223909375,CA
-3223909376,3223910911,US
+3223909376,3223911935,US
3223911936,3223912191,CA
-3223912192,3223938815,US
+3223912448,3223938815,US
3223938816,3223946239,GB
3223946240,3223947519,CH
-3223947520,3223947775,US
+3223947520,3223948287,US
3223948288,3223948543,NL
3223948544,3223949823,CH
3223949824,3223950079,AU
@@ -56734,10 +60861,10 @@
3223950592,3223953663,CH
3223953664,3223955967,US
3223955968,3223956223,AU
-3223956224,3223957759,US
+3223956224,3223958015,US
3223958016,3223963135,JP
3223963136,3223963647,US
-3223963904,3223964159,CA
+3223963648,3223964159,CA
3223964160,3223964415,US
3223964416,3223964671,AU
3223964672,3223965183,US
@@ -56765,7 +60892,9 @@
3223994112,3223994623,DE
3223994880,3223995391,US
3223995392,3223995647,CA
-3223995648,3223999487,US
+3223995648,3223996415,US
+3223996416,3223996927,CA
+3223996928,3223999487,US
3224000256,3224000511,NL
3224000512,3224001023,US
3224001024,3224001279,CA
@@ -56779,8 +60908,7 @@
3224006912,3224012031,NL
3224012032,3224014591,US
3224014592,3224014847,NL
-3224014848,3224015615,US
-3224015872,3224016639,US
+3224014848,3224016639,US
3224016640,3224016895,AU
3224016896,3224024063,US
3224024064,3224029695,CH
@@ -56789,8 +60917,7 @@
3224030720,3224030975,CA
3224030976,3224038655,US
3224038656,3224038911,AU
-3224038912,3224039679,US
-3224039936,3224042751,US
+3224038912,3224042751,US
3224042752,3224043007,DE
3224043008,3224084991,US
3224084992,3224087551,SE
@@ -56798,7 +60925,7 @@
3224088064,3224088319,AU
3224088320,3224090879,US
3224090880,3224091135,AU
-3224091648,3224091903,US
+3224091136,3224091903,US
3224091904,3224092159,AU
3224092160,3224092415,CA
3224092416,3224092671,US
@@ -56814,25 +60941,22 @@
3224097792,3224098047,NL
3224098048,3224099583,US
3224099584,3224099839,CA
-3224099840,3224100863,US
-3224101120,3224101375,US
+3224099840,3224101375,US
3224101376,3224102399,AU
+3224102400,3224103423,US
3224103424,3224103679,NL
3224103680,3224104703,US
3224104704,3224104959,AU
-3224104960,3224105471,US
-3224105728,3224106495,US
-3224106752,3224109055,US
+3224104960,3224109055,US
3224109056,3224109311,NL
3224109312,3224119551,DE
3224119552,3224126463,FR
-3224126976,3224127231,US
+3224126464,3224127231,US
3224127232,3224129791,FR
3224129792,3224132351,DE
3224132352,3224170495,US
3224170496,3224173567,SE
-3224173568,3224174335,US
-3224174592,3224288255,US
+3224173568,3224288255,US
3224288256,3224289023,DE
3224289024,3224302335,US
3224302336,3224302591,CA
@@ -56840,54 +60964,57 @@
3224305664,3224367615,JP
3224367616,3224368127,US
3224368128,3224369663,CH
-3224369664,3224373247,US
+3224369664,3224370431,US
+3224370432,3224370687,CA
+3224370688,3224370943,US
+3224370944,3224371199,CA
+3224371200,3224373247,US
3224373248,3224373503,AU
-3224373504,3224379135,US
+3224373504,3224373759,US
+3224373760,3224374015,AU
+3224374016,3224379135,US
3224379136,3224379391,NL
-3224379392,3224392191,US
-3224392704,3224398079,US
-3224398336,3224398591,US
+3224379392,3224398591,US
3224398592,3224398847,DE
3224398848,3224399103,US
3224399104,3224399615,AU
-3224399616,3224407039,US
+3224399616,3224407295,US
3224407296,3224407551,CA
-3224407808,3224408319,US
+3224407552,3224408319,US
3224408320,3224408575,NL
-3224408576,3224424959,US
-3224425216,3224427007,US
-3224427520,3224428543,US
+3224408576,3224427519,US
+3224427520,3224427775,CA
+3224427776,3224428543,US
3224428544,3224428799,NL
-3224428800,3224430079,US
+3224428800,3224430335,US
3224430336,3224430591,NL
-3224430592,3224430847,US
+3224430592,3224431103,US
3224431104,3224431359,CA
-3224431360,3224431615,US
-3224432128,3224432383,US
-3224433152,3224433407,US
-3224433664,3224434687,US
+3224431360,3224434687,US
3224434688,3224434943,AU
3224434944,3224435967,US
3224435968,3224436223,MU
-3224436224,3224436479,US
+3224436224,3224436735,US
3224436736,3224502271,FI
3224502272,3224567807,JP
3224567808,3224571903,NO
-3224571904,3224633343,JP
+3224571904,3224580095,JP
+3224580096,3224580351,US
+3224580352,3224616959,JP
+3224616960,3224617471,US
+3224617472,3224633343,JP
3224633344,3224646399,DE
3224646400,3224651775,US
3224651776,3224652287,AU
-3224652800,3224660991,US
+3224652288,3224660991,US
3224660992,3224661247,CA
-3224661504,3224662527,US
-3224663040,3224663551,US
+3224661248,3224663807,US
3224672000,3224672255,US
3224672256,3224672511,NL
-3224672512,3224673791,US
+3224672512,3224674047,US
3224674048,3224674559,DE
3224674560,3224674815,GB
-3224675072,3224675839,US
-3224676864,3224677119,US
+3224674816,3224677119,US
3224677120,3224678655,AU
3224678656,3224680703,US
3224680704,3224680959,AU
@@ -56900,22 +61027,21 @@
3224692736,3224692991,NL
3224692992,3224694527,US
3224694528,3224694783,CA
-3224694784,3224695039,US
-3224695808,3224697343,US
-3224697856,3224698111,US
+3224694784,3224698111,US
3224698112,3224698623,NL
-3224698880,3224699135,US
+3224698624,3224699135,US
3224699136,3224699647,BE
3224699648,3224725247,US
-3224725248,3224725503,DE
-3224725504,3224725759,NL
+3224725248,3224725759,NL
3224725760,3224739071,US
3224739072,3224739327,FI
3224739328,3224772351,US
-3224772352,3224778751,DE
+3224772352,3224776447,DE
+3224776448,3224776703,GB
+3224776704,3224777983,DE
+3224777984,3224778239,US
3224779776,3224785151,DE
-3224785152,3224787967,US
-3224788480,3224791039,US
+3224785152,3224791039,US
3224791040,3224791295,NL
3224791296,3224791807,AU
3224791808,3224793343,US
@@ -56924,7 +61050,7 @@
3224793856,3224795391,DK
3224795392,3224795647,CA
3224795648,3224795903,CH
-3224796160,3224796415,US
+3224795904,3224796415,US
3224796416,3224797439,DE
3224797440,3224797695,US
3224797696,3224797951,AU
@@ -56932,9 +61058,11 @@
3224798208,3224798463,NL
3224798464,3224798975,US
3224798976,3224799231,AU
+3224799232,3224799487,US
3224799488,3224799743,AU
3224799744,3224799999,US
3224800000,3224800255,NL
+3224800256,3224800511,US
3224800512,3224816639,FR
3224816640,3224816895,IL
3224816896,3224820735,FR
@@ -56942,8 +61070,7 @@
3224820992,3224821247,DE
3224821248,3224822015,US
3224822016,3224822271,NL
-3224822272,3224822527,US
-3224822784,3224823039,US
+3224822272,3224823039,US
3224823296,3224826367,US
3224826368,3224826623,CA
3224826624,3224826879,US
@@ -56952,25 +61079,23 @@
3224827648,3224827903,AU
3224827904,3224828671,US
3224828672,3224828927,AU
-3224829184,3224829439,US
+3224828928,3224829439,US
3224829440,3224829695,NL
-3224829952,3224834047,US
+3224829696,3224834047,US
3224834048,3224834303,SG
3224834304,3224834559,US
3224834560,3224834815,TH
3224834816,3224850175,US
3224850176,3224850431,IN
-3224850432,3224850943,US
-3224851200,3224851455,US
+3224850432,3224851455,US
3224851456,3224851711,NL
-3224851968,3224852735,US
+3224851712,3224852735,US
3224852736,3224852991,NL
-3224852992,3224854527,US
-3224854784,3224855039,US
+3224852992,3224855039,US
3224855040,3224855551,AU
3224855552,3224855807,US
3224855808,3224856063,IT
-3224856064,3224856575,US
+3224856064,3224856831,US
3224856832,3224857087,NL
3224857088,3224857855,US
3224857856,3224858111,PL
@@ -56981,8 +61106,10 @@
3224859392,3224859647,NL
3224859648,3224860159,US
3224860160,3224860415,AU
-3224860928,3224862719,US
+3224860416,3224860671,CA
+3224860672,3224862975,US
3224862976,3224863231,NL
+3224863232,3224863487,CA
3224863488,3224863743,US
3224863744,3224863999,NL
3224864000,3224870655,US
@@ -56991,33 +61118,31 @@
3224878080,3224878335,NL
3224878336,3224878591,US
3224878592,3224878847,AU
+3224878848,3224879359,US
3224879360,3224879615,NL
3224879616,3224879871,CA
3224879872,3224880383,US
3224880384,3224880639,NL
3224880640,3224880895,AU
-3224880896,3224882431,US
+3224880896,3224882687,US
3224882688,3224882943,CA
3224882944,3224883455,US
3224883456,3224883711,AU
3224883712,3224884223,US
3224884224,3224884479,NL
-3224884480,3224884991,US
+3224884480,3224885247,US
3224885248,3224885503,CA
-3224885760,3224886015,US
+3224885504,3224886015,US
3224886016,3224886527,AU
3224886528,3224887295,US
3224887296,3224887551,CA
-3224887808,3224889087,US
+3224887552,3224889343,US
3224889344,3224889599,AU
3224889600,3224890879,US
3224890880,3224891135,AU
-3224891136,3224891647,US
-3224892160,3224892415,CA
+3224891136,3224892415,US
3224892416,3224892671,NL
-3224892928,3224893183,US
-3224893440,3224893951,US
-3224894464,3224899071,US
+3224892672,3224899071,US
3224899072,3224899327,AT
3224899328,3224908543,US
3224908544,3224908799,CA
@@ -57034,64 +61159,61 @@
3225034752,3225035775,BG
3225035776,3225037055,US
3225037056,3225049599,FI
-3225050112,3225051135,US
-3225052672,3225056767,US
-3225057024,3225057535,US
+3225049600,3225057535,US
3225057536,3225057791,CA
-3225057792,3225060351,US
-3225060352,3225061631,AU
+3225057792,3225060607,US
+3225060608,3225061631,AU
+3225061632,3225062399,US
3225062400,3225063423,VC
-3225063424,3225064447,US
-3225064704,3225075967,US
+3225063424,3225076223,US
3225076224,3225076479,CA
3225076480,3225076991,US
3225076992,3225077247,SE
-3225077504,3225081087,US
+3225077248,3225081087,US
3225081088,3225081343,CA
-3225081600,3225082367,US
+3225081344,3225082367,US
3225082368,3225082623,NL
-3225082880,3225084671,US
+3225082624,3225084671,US
3225084672,3225085183,NL
3225085184,3225085439,ES
3225085440,3225089279,US
3225089280,3225089535,CA
-3225089536,3225091071,US
-3225091584,3225091839,US
-3225092096,3225314303,US
+3225089536,3225314303,US
3225314304,3225314559,GB
-3225314560,3225419775,US
-3225420032,3225420287,US
+3225314560,3225420799,US
3225420800,3225423871,CA
-3225423872,3225424383,US
-3225424896,3225426943,US
+3225423872,3225426943,US
3225426944,3225427199,NL
+3225427200,3225427455,US
+3225427456,3225427967,CA
3225427968,3225428991,US
-3225429504,3225429759,CA
-3225430016,3225431039,CA
+3225428992,3225431039,CA
3225431040,3225431551,NL
3225431552,3225434111,US
3225434112,3225436159,CA
-3225436160,3225437695,US
-3225438208,3225442559,US
-3225443328,3225444607,US
+3225436160,3225445375,US
3225445376,3225446399,BE
3225446400,3225450495,US
3225450496,3225451263,AG
3225451264,3225451519,MS
+3225451520,3225451775,US
3225451776,3225452031,NL
+3225452032,3225452543,US
3225452544,3225456639,CA
3225456640,3225459711,US
+3225459712,3225459967,CA
3225459968,3225460479,US
-3225460480,3225462783,CA
-3225462784,3225468927,US
-3225468928,3225469951,CA
-3225470464,3225470719,US
+3225460480,3225460735,CA
+3225460736,3225460991,US
+3225460992,3225462015,CA
+3225462016,3225468927,US
+3225468928,3225470463,CA
+3225470464,3225471487,US
3225471488,3225471743,NL
-3225471744,3225472511,US
-3225473024,3225498111,US
+3225471744,3225472255,HK
+3225472256,3225498367,US
3225498368,3225503487,NL
-3225503488,3225505535,US
-3225505792,3225506047,US
+3225503488,3225506303,US
3225506304,3225508863,AU
3225508864,3225509631,CH
3225509632,3225509887,US
@@ -57099,44 +61221,47 @@
3225510144,3225518591,US
3225518592,3225518847,AU
3225518848,3225519359,NL
-3225519872,3225520639,US
+3225519360,3225520895,US
3225520896,3225521151,NL
3225521152,3225522175,US
3225522176,3225522943,GB
3225522944,3225524223,US
3225524224,3225524479,VE
3225524480,3225524735,GB
-3225525248,3225526271,US
+3225524736,3225526271,US
3225526272,3225528319,BB
-3225529088,3225529343,US
-3225529600,3225530367,US
+3225528320,3225528831,US
+3225528832,3225529087,VI
+3225529088,3225530367,US
3225530368,3225530623,PR
-3225530624,3225530879,US
-3225531136,3225531647,US
+3225530624,3225531903,US
3225531904,3225532159,AU
3225532160,3225535999,CH
3225536000,3225540863,US
3225540864,3225541119,AU
3225541120,3225541375,US
-3225541376,3225544703,GB
+3225541376,3225543935,GB
+3225543936,3225544703,US
3225544704,3225546751,CA
-3225546752,3225548543,US
+3225546752,3225548799,US
3225548800,3225549055,AU
3225549056,3225549311,US
3225549312,3225549567,AU
-3225549568,3225550591,US
+3225549568,3225550847,US
3225550848,3225616383,DK
+3225616384,3225616639,US
3225616640,3225616895,AU
+3225616896,3225617151,US
3225617152,3225617663,NL
-3225617920,3225618175,US
-3225618432,3225618687,US
+3225617664,3225618687,US
3225618688,3225618943,CA
-3225619200,3225619455,US
+3225618944,3225619455,US
3225619456,3225619711,AU
3225619712,3225624575,US
3225624576,3225625599,CA
+3225625600,3225626367,US
3225626368,3225626623,GB
-3225626880,3225627391,US
+3225626624,3225627391,US
3225627392,3225627647,NL
3225627648,3225627903,US
3225627904,3225628159,CA
@@ -57146,14 +61271,11 @@
3225629184,3225629439,NL
3225629440,3225629695,US
3225629696,3225629951,NL
-3225629952,3225630207,US
+3225629952,3225630463,US
3225630464,3225630719,NL
3225630720,3225631231,US
3225631232,3225631487,NL
-3225631488,3225632767,US
-3225633536,3225633791,US
-3225634048,3225634815,US
-3225635072,3225635583,US
+3225631488,3225635839,US
3225635840,3225636095,NL
3225636096,3225636607,US
3225636608,3225636863,NL
@@ -57161,40 +61283,40 @@
3225637888,3225638399,AU
3225638400,3225638655,US
3225638656,3225638911,GB
-3225639424,3225640447,US
+3225638912,3225640447,US
3225640448,3225640703,NL
3225640704,3225641983,US
3225641984,3225643263,GB
3225643264,3225643775,CA
-3225643776,3225649919,US
-3225650176,3225650943,US
+3225643776,3225650943,US
3225650944,3225651199,GB
-3225651200,3225658367,US
-3225658624,3225658879,US
+3225651200,3225659135,US
3225659136,3225659391,DE
3225659392,3225659647,AU
+3225659648,3225659903,US
3225659904,3225660159,DE
3225660160,3225660415,AU
-3225660416,3225664511,US
-3225664512,3225669887,DE
+3225660416,3225664767,US
+3225664768,3225669887,DE
3225669888,3225671935,US
3225671936,3225672191,AU
3225672192,3225672447,DE
3225672448,3225672703,US
3225672704,3225673215,NL
+3225673216,3225673471,CA
3225673472,3225673727,IE
3225673728,3225679871,US
3225679872,3225680127,AU
3225680128,3225680383,GR
-3225680640,3225681151,US
-3225681408,3225681663,US
+3225680384,3225680639,CA
+3225680640,3225681663,US
+3225681664,3225681919,CA
3225681920,3225682943,DE
3225682944,3225683199,AT
3225683200,3225687039,DE
3225687040,3225687807,US
3225687808,3225688063,NL
-3225688064,3225689343,US
-3225689600,3225689855,US
+3225688064,3225689855,US
3225689856,3225694975,NL
3225694976,3225695231,PL
3225695232,3225695487,US
@@ -57203,26 +61325,26 @@
3225701376,3225709567,NO
3225709568,3225710079,US
3225710080,3225710591,AU
-3225710592,3225711615,US
-3225712128,3225715455,US
+3225710592,3225715455,US
3225715456,3225715711,CA
3225715712,3225715967,AU
3225715968,3225716991,US
3225716992,3225717247,CA
3225717248,3225717503,MU
3225717504,3225717759,AU
-3225717760,3225720063,US
+3225717760,3225720575,US
3225720576,3225721343,GB
-3225721344,3225722111,US
-3225722624,3225723903,US
-3225723904,3225725439,DE
+3225721344,3225723647,US
+3225723648,3225723903,CA
+3225723904,3225724159,US
+3225724160,3225725439,DE
3225725440,3225725695,GB
3225725696,3225726207,AU
3225726208,3225726463,US
3225726464,3225726719,NL
3225726720,3225726975,US
3225726976,3225727231,NL
-3225727232,3225727487,US
+3225727232,3225727743,US
3225727744,3225727999,AU
3225728000,3225728511,US
3225728512,3225728767,NL
@@ -57230,8 +61352,9 @@
3225729024,3225729279,CA
3225729280,3225729535,US
3225729536,3225729791,NL
-3225729792,3225733887,US
-3225734144,3225735167,US
+3225729792,3225730047,US
+3225730048,3225730303,CA
+3225730304,3225735423,US
3225735424,3225735679,PT
3225735680,3225735935,US
3225735936,3225737215,DE
@@ -57243,36 +61366,35 @@
3225739520,3225740543,US
3225740544,3225740799,CA
3225740800,3225741055,NL
-3225741056,3225741823,US
+3225741056,3225742079,US
3225742080,3225745919,JP
3225745920,3225746687,NL
3225746688,3225746943,US
3225746944,3225747199,NL
-3225747456,3225747711,US
-3225748480,3225752575,US
-3225752832,3225753087,US
-3225753600,3225757695,US
+3225747200,3225747711,US
+3225747712,3225747967,CA
+3225747968,3225757695,US
3225757696,3225758719,CA
-3225759232,3225759487,US
-3225759744,3225763839,US
+3225759232,3225763839,US
3225763840,3225764095,BE
+3225764096,3225764863,US
3225764864,3225765887,CA
+3225765888,3225766399,US
3225766400,3225766655,CA
-3225766912,3225773055,US
+3225766656,3225769471,US
+3225769472,3225769983,CA
+3225769984,3225773311,US
3225773312,3225773567,CA
-3225774080,3225776383,US
+3225773568,3225776639,US
+3225776640,3225777151,CA
3225777152,3225777407,AU
-3225777408,3225777663,US
-3225778176,3225780479,US
+3225777408,3225781247,US
3225781248,3225782271,CA
-3225782272,3225785343,US
-3225785344,3225788415,CA
-3225788416,3225795583,US
-3225796096,3225796351,US
-3225796608,3225806847,US
+3225782272,3225785599,US
+3225785600,3225788159,CA
+3225788160,3225807359,US
3225807360,3225807615,DE
-3225807872,3225809919,US
-3225810688,3225812991,US
+3225807616,3225812991,US
3225812992,3225843711,FR
3225843712,3225847039,US
3225847040,3225847551,NL
@@ -57280,8 +61402,7 @@
3225847808,3225848063,NL
3225848064,3225848831,US
3225848832,3225853951,DE
-3225853952,3225854719,US
-3225854976,3225857023,US
+3225853952,3225857023,US
3225857024,3225857279,CA
3225857280,3225857535,US
3225857536,3225857791,AU
@@ -57289,26 +61410,33 @@
3225858048,3225858559,CA
3225858560,3225858815,US
3225858816,3225859583,JP
-3225860096,3225861887,US
-3225862144,3225868287,US
+3225860096,3225868287,US
3225868288,3225868543,AU
3225868544,3225869055,US
3225869056,3225869311,AU
-3225869312,3225870335,US
+3225869312,3225869567,CA
+3225869568,3225870335,US
3225870336,3225870591,CA
3225870592,3225873663,US
3225873664,3225873919,ZA
3225873920,3225874943,US
3225874944,3225875199,GB
-3225875456,3225875967,US
-3225876480,3225878271,US
-3225878528,3225881343,SE
+3225875200,3225878527,US
+3225878528,3225880319,SE
+3225880320,3225880575,US
+3225880576,3225881343,SE
3225881344,3225881599,IT
-3225881600,3225885183,SE
+3225881600,3225882367,SE
+3225882368,3225882623,DE
+3225882624,3225882879,SE
+3225882880,3225883391,DE
+3225883392,3225885183,SE
3225885184,3225885695,AT
3225885696,3225887999,SE
3225888000,3225888255,GB
-3225888256,3225905407,SE
+3225888256,3225894399,SE
+3225894400,3225895423,GB
+3225895424,3225905407,SE
3225905408,3225905663,IT
3225905664,3225913855,SE
3225913856,3225914111,DE
@@ -57347,72 +61475,73 @@
3225940992,3225941247,IL
3225941248,3225941503,IT
3225941504,3225942271,SE
-3225942272,3225942527,HU
+3225942272,3225942527,BE
3225942528,3225944063,SE
-3225944064,3226008831,TW
-3226008832,3226009343,US
-3226009856,3226010879,US
+3225944064,3225944831,US
+3225944832,3226008831,TW
+3226008832,3226010879,US
3226010880,3226011135,CA
3226011136,3226012671,US
3226012672,3226012927,AU
-3226012928,3226014207,US
+3226012928,3226014463,US
3226014464,3226014975,NL
3226014976,3226015487,AU
+3226015488,3226015743,US
3226015744,3226016255,AU
3226016256,3226018303,US
3226018304,3226018559,DE
3226018560,3226021119,CH
-3226021376,3226023423,US
+3226021120,3226023423,US
3226023680,3226026495,US
3226026496,3226026751,AU
-3226026752,3226064383,US
-3226064640,3226067455,US
+3226026752,3226067455,US
3226067456,3226067711,BE
3226067712,3226068223,US
3226068224,3226068479,NL
3226068480,3226074879,US
3226074880,3226075135,AT
-3226075136,3226109951,US
-3226110208,3226110719,US
+3226075136,3226110719,US
3226110720,3226128639,AU
-3226128640,3226140671,US
+3226128640,3226140927,US
3226140928,3226141695,CA
3226141696,3226141951,US
3226141952,3226143487,CA
+3226143488,3226143743,US
3226143744,3226156543,CA
+3226156544,3226156799,US
3226156800,3226157567,CA
3226157568,3226157823,US
3226157824,3226167807,CA
-3226168064,3226175487,CA
-3226175744,3226175999,US
+3226168064,3226175231,CA
+3226175232,3226175999,US
3226176000,3226177535,CA
3226177536,3226178559,US
3226178560,3226188543,CA
-3226189056,3226189311,CA
-3226189568,3226189823,CA
-3226189824,3226190847,US
-3226191360,3226191615,US
+3226188544,3226188799,PR
+3226189056,3226189823,CA
+3226189824,3226191871,US
3226191872,3226194175,CA
+3226194176,3226194431,US
3226194432,3226194687,CA
+3226194688,3226194943,US
3226194944,3226201087,CA
3226201088,3226201343,US
3226201344,3226201855,CA
-3226201856,3226202111,US
3226202112,3226205439,CA
3226205440,3226205695,AE
3226205696,3226205951,CA
-3226206208,3226207231,US
+3226205952,3226207743,US
3226207744,3226215423,GB
-3226215424,3226236159,US
-3226237184,3226237439,US
+3226215424,3226237439,US
3226237440,3226237695,AU
-3226237696,3226241535,DE
+3226237696,3226240255,DE
+3226240256,3226240511,US
+3226240512,3226241535,DE
3226241536,3226241791,LI
3226241792,3226250495,DE
3226250496,3226251263,US
3226251264,3226251519,DE
-3226251520,3226252287,US
-3226252544,3226267903,US
+3226251520,3226267903,US
3226267904,3226268159,DE
3226268160,3226268415,PT
3226268416,3226268927,AT
@@ -57424,8 +61553,7 @@
3226274560,3226274815,NL
3226274816,3226276095,US
3226276096,3226276351,AU
-3226276352,3226276863,US
-3226277632,3226283519,US
+3226276352,3226283519,US
3226283520,3226291199,CA
3226291200,3226300159,US
3226300416,3226300927,US
@@ -57436,10 +61564,8 @@
3226305536,3226307327,GB
3226307328,3226307583,US
3226307584,3226308095,NL
-3226308096,3226317823,US
-3226318080,3226318335,US
-3226319360,3226319615,US
-3226319872,3226366975,US
+3226308096,3226308863,US
+3226309120,3226366975,US
3226366976,3226367231,CA
3226367232,3226374143,US
3226374144,3226375423,DE
@@ -57451,52 +61577,47 @@
3226393600,3226393855,DE
3226393856,3226397695,US
3226397696,3226400255,DE
-3226400256,3226470399,US
-3226470656,3226473471,US
+3226400256,3226473471,US
3226473472,3226473727,NL
3226473728,3226473983,PT
3226473984,3226474495,US
3226474496,3226474751,CL
-3226475264,3226475519,US
-3226475776,3226476287,US
+3226474752,3226476287,US
3226476288,3226479359,CH
-3226479360,3226479871,US
+3226479360,3226480127,US
3226480128,3226480383,NL
3226480384,3226481407,US
3226481408,3226481663,NL
3226481664,3226483199,US
-3226483968,3226484479,US
-3226484736,3226488831,US
-3226489088,3226520575,US
-3226521344,3226521855,US
+3226483968,3226488831,US
+3226489088,3226521855,US
3226521856,3226522111,BR
3226522112,3226523135,US
-3226523392,3226536191,US
+3226523392,3226536959,US
3226536960,3226542079,CA
-3226542080,3226546431,US
-3226547200,3226548223,CA
+3226542080,3226547199,US
+3226547200,3226548735,CA
3226548992,3226549247,BE
-3226549248,3226550271,NL
+3226549504,3226550015,NL
+3226550016,3226550783,US
3226551040,3226551807,US
+3226551808,3226552319,CA
+3226552320,3226552831,VI
3226552832,3226553087,US
3226553344,3226555391,US
-3226555648,3226555903,CA
-3226556416,3226556671,US
-3226557440,3226558463,US
-3226558720,3226558975,US
-3226559488,3226561535,US
+3226555392,3226555903,CA
+3226555904,3226561535,US
3226561792,3226562047,NL
-3226563072,3226563327,US
-3226563584,3226564607,US
+3226562048,3226564607,US
3226564864,3226565119,NL
3226565376,3226565631,FI
-3226565632,3226569727,US
-3226569984,3226570239,US
-3226570752,3226574847,US
+3226565632,3226574847,US
3226574848,3226575103,FI
-3226576384,3226576639,US
+3226575104,3226575359,US
+3226575360,3226576383,CA
+3226576384,3226576895,US
3226576896,3226578943,CA
-3226578944,3226579967,US
+3226578944,3226580479,US
3226580480,3226581247,FI
3226581248,3226583295,US
3226583552,3226583807,NL
@@ -57504,10 +61625,11 @@
3226584416,3226584447,AU
3226584448,3226591231,US
3226591232,3226592255,CA
+3226592256,3226592767,US
3226592768,3226593023,NL
+3226593280,3226593791,US
3226593792,3226594047,NL
-3226594304,3226598911,US
-3226599424,3226625535,US
+3226594304,3226625535,US
3226625792,3226626047,US
3226626048,3226626303,CA
3226626304,3226627327,US
@@ -57526,6 +61648,7 @@
3226635520,3226635775,US
3226635776,3226636031,ZA
3226636032,3226636287,AU
+3226636288,3226636799,US
3226637056,3226637823,US
3226637824,3226638079,CA
3226638080,3226638335,US
@@ -57534,8 +61657,7 @@
3226639616,3226640127,AT
3226640128,3226640639,US
3226640640,3226640895,AU
-3226640896,3226652927,US
-3226653696,3226654207,US
+3226640896,3226654207,US
3226654208,3226654463,NL
3226654464,3226655743,US
3226655744,3226656255,NL
@@ -57550,15 +61672,12 @@
3226690816,3226691071,CA
3226691072,3226691327,NL
3226691584,3226691839,AU
-3226691840,3226693631,US
-3226694144,3226695167,US
+3226691840,3226695167,US
3226695168,3226695679,AU
3226695680,3226695935,US
3226695936,3226696191,CA
3226696192,3226696703,AU
-3226696704,3226698495,US
-3226698496,3226698751,CA
-3226698752,3226704895,US
+3226696704,3226704895,US
3226705152,3226705407,AU
3226705408,3226705919,US
3226705920,3226706175,FR
@@ -57584,7 +61703,7 @@
3226726144,3226727679,US
3226727936,3226728191,US
3226728192,3226728447,CA
-3226728448,3226729983,US
+3226728448,3226730495,US
3226731008,3226731519,US
3226731776,3226732031,GB
3226732288,3226733567,US
@@ -57592,14 +61711,15 @@
3226733824,3226734079,NL
3226734080,3226734335,US
3226734336,3226734591,NL
-3226734592,3226736383,US
+3226734592,3226735615,US
+3226735872,3226736383,US
3226736896,3226737407,US
3226737408,3226737663,AT
3226737664,3226738175,US
3226738176,3226738431,NL
3226738432,3226738687,US
3226738688,3226739199,NL
-3226739712,3226743807,US
+3226739200,3226743807,US
3226744576,3226746367,US
3226746368,3226746623,NL
3226746624,3226748927,US
@@ -57623,8 +61743,7 @@
3226775040,3226775295,US
3226775552,3226782463,FI
3226782720,3226783743,FI
-3226783744,3226783999,US
-3226784256,3226784767,US
+3226783744,3226784767,US
3226784768,3226785023,GB
3226785024,3226786559,US
3226786560,3226786815,AU
@@ -57696,6 +61815,7 @@
3226994944,3226995455,NL
3226995456,3226996479,US
3226996992,3226997247,NL
+3226997248,3226997759,US
3226998016,3226998527,US
3226998528,3226999039,NL
3226999040,3227005439,US
@@ -57703,7 +61823,7 @@
3227013120,3227013375,AU
3227013376,3227013887,US
3227013888,3227014399,NL
-3227014400,3227014655,NZ
+3227014400,3227014655,AU
3227014656,3227014911,NL
3227014912,3227017215,US
3227017472,3227017983,NL
@@ -57750,7 +61870,7 @@
3227237120,3227237631,US
3227237632,3227237887,NO
3227237888,3227238143,US
-3227238144,3227238399,GB
+3227238144,3227238399,NL
3227238400,3227239935,US
3227240192,3227240447,GB
3227240704,3227240959,GB
@@ -57841,7 +61961,7 @@
3227425792,3227427583,DK
3227427584,3227427839,ES
3227427840,3227429119,US
-3227429120,3227429375,NZ
+3227429120,3227429375,AU
3227429376,3227429887,US
3227429888,3227430143,NL
3227430144,3227430399,US
@@ -57921,9 +62041,7 @@
3227526656,3227526911,ZA
3227526912,3227533311,MU
3227533312,3227534335,US
-3227534336,3227539455,MU
-3227539456,3227539711,ZA
-3227539712,3227541503,MU
+3227534336,3227541503,MU
3227541504,3227541759,ZA
3227541760,3227557887,MU
3227557888,3227558911,US
@@ -57944,13 +62062,19 @@
3227722522,3227722522,US
3227722523,3227724031,CA
3227724032,3227724287,US
-3227724288,3227748035,CA
+3227724288,3227738879,CA
+3227738880,3227739135,US
+3227739136,3227748035,CA
3227748036,3227748039,US
3227748040,3227751868,CA
3227751869,3227751869,US
-3227751870,3227756505,CA
+3227751870,3227755775,CA
+3227755776,3227756031,US
+3227756032,3227756505,CA
3227756506,3227756506,US
-3227756507,3227765503,CA
+3227756507,3227762655,CA
+3227762656,3227762671,US
+3227762672,3227765503,CA
3227765504,3227765759,US
3227765760,3227777759,CA
3227777760,3227777763,US
@@ -58017,11 +62141,11 @@
3227834368,3227837439,MX
3227837440,3227837951,BR
3227837952,3227842303,MX
-3227842560,3227842815,BR
+3227842304,3227842815,BR
3227842816,3227843327,MX
-3227843328,3227843583,BR
+3227843328,3227844095,BR
3227844096,3227844351,AR
-3227844864,3227845119,ES
+3227844864,3227845119,NL
3227845120,3227845631,US
3227845632,3227845887,NL
3227846144,3227846655,US
@@ -58091,7 +62215,7 @@
3227934720,3227947519,US
3227947520,3227955711,DE
3227955712,3227964927,US
-3227964928,3227965183,GB
+3227964928,3227965183,NL
3227965184,3227966975,US
3227967232,3227967487,US
3227967488,3227967999,NL
@@ -58163,7 +62287,8 @@
3228061696,3228061951,AU
3228061952,3228062207,US
3228062208,3228062463,GB
-3228062464,3228077055,US
+3228062464,3228069631,US
+3228069888,3228077055,US
3228077056,3228077311,NL
3228077312,3228077567,US
3228077568,3228077823,NL
@@ -58171,7 +62296,7 @@
3228078848,3228079103,GR
3228079104,3228080639,US
3228080640,3228081151,NL
-3228081152,3228081919,US
+3228081152,3228082175,US
3228082944,3228083967,US
3228083968,3228084479,NL
3228084480,3228085247,US
@@ -58281,8 +62406,7 @@
3228347392,3228348159,SK
3228348160,3228353279,US
3228353280,3228358399,SE
-3228358400,3228361471,US
-3228361728,3228362239,US
+3228358400,3228362239,US
3228362240,3228362495,AU
3228362496,3228362751,US
3228363008,3228363263,US
@@ -58298,7 +62422,8 @@
3228405504,3228405759,SG
3228405760,3228406015,IN
3228406016,3228406271,US
-3228406272,3228407039,FR
+3228406272,3228406527,IN
+3228406528,3228407039,FR
3228407040,3228420095,DE
3228420608,3228424703,DE
3228424704,3228424959,US
@@ -58342,7 +62467,9 @@
3228531712,3228532223,NO
3228532224,3228532479,US
3228532480,3228532735,NL
-3228532736,3228554751,US
+3228532736,3228539247,US
+3228539248,3228539251,AT
+3228539252,3228554751,US
3228555008,3228558591,US
3228558592,3228559103,BR
3228559104,3228564479,US
@@ -58380,20 +62507,16 @@
3228628992,3228630527,US
3228630528,3228630783,NL
3228631040,3228696575,NL
-3228696576,3228826371,IL
+3228696576,3228714764,IL
+3228714765,3228714765,CA
+3228714766,3228826371,IL
3228826372,3228826372,US
3228826373,3228830719,IL
3228830720,3228833791,PS
3228833792,3229024255,IL
3229024512,3229024767,US
3229025280,3229058047,US
-3229058816,3229061119,US
-3229061120,3229062433,CA
-3229062434,3229062450,US
-3229062451,3229064951,CA
-3229064952,3229064955,US
-3229064956,3229065215,CA
-3229065216,3229092095,US
+3229058816,3229092095,US
3229092096,3229093887,AU
3229093888,3229104895,US
3229104896,3229105151,ES
@@ -58411,9 +62534,11 @@
3229160960,3229161471,DE
3229161472,3229161727,SE
3229161728,3229161983,GB
-3229161984,3229164543,SE
+3229161984,3229164287,SE
+3229164288,3229164543,DK
3229164544,3229165055,GB
-3229165056,3229167103,SE
+3229165056,3229165311,NO
+3229165312,3229167103,SE
3229167104,3229167615,IT
3229167616,3229171711,SE
3229171712,3229172223,GB
@@ -58421,15 +62546,20 @@
3229182464,3229182975,GB
3229182976,3229183999,SE
3229184000,3229184511,GB
-3229184512,3229195263,SE
+3229184512,3229186815,SE
+3229186816,3229187327,ES
+3229187328,3229187583,SE
+3229187584,3229187839,DK
+3229187840,3229195263,SE
3229195264,3229196287,DE
3229196288,3229196799,SE
3229196800,3229197311,NL
3229197312,3229197823,SE
3229197824,3229198335,GB
-3229198336,3229198847,SE
+3229198336,3229198591,SE
+3229198592,3229198847,ES
3229198848,3229199103,CH
-3229199104,3229199359,AT
+3229199104,3229199359,IT
3229199360,3229200383,SE
3229200384,3229200895,GB
3229200896,3229201151,DE
@@ -58452,7 +62582,7 @@
3229264896,3229265919,US
3229265920,3229266175,AU
3229266176,3229266943,US
-3229266944,3229267199,NZ
+3229266944,3229267199,AU
3229267200,3229272319,US
3229273856,3229274623,US
3229274624,3229274879,AU
@@ -58539,7 +62669,9 @@
3229844736,3229844991,US
3229845248,3229845503,US
3229845504,3229847295,CA
-3229847296,3229870335,US
+3229847296,3229849599,US
+3229849600,3229849855,AU
+3229849856,3229870335,US
3229870848,3229874943,US
3229874944,3229875455,AU
3229875456,3229875967,US
@@ -58583,9 +62715,7 @@
3229940736,3229940991,CH
3229940992,3229941247,AU
3229941248,3229941503,US
-3229942272,3229942783,US
-3229943040,3229943295,US
-3229943552,3229944319,US
+3229941760,3229944319,US
3229944320,3229944575,AU
3229944576,3229945087,US
3229945344,3229945599,AU
@@ -58595,7 +62725,7 @@
3229947392,3229948927,US
3229948928,3229949183,IT
3229949184,3229949695,US
-3229949696,3229949951,NZ
+3229949696,3229949951,AU
3229949952,3229950207,NL
3229950208,3229950975,US
3229950976,3229951231,NL
@@ -58626,7 +62756,7 @@
3230004224,3230004479,NL
3230004480,3230004991,US
3230005760,3230006015,MU
-3230006016,3230007295,US
+3230006016,3230007039,US
3230007296,3230072831,FR
3230072832,3230074623,US
3230074624,3230074879,DE
@@ -58719,8 +62849,7 @@
3230156544,3230164991,FI
3230165504,3230167295,US
3230167552,3230168063,CA
-3230168832,3230174463,US
-3230175232,3230177791,US
+3230168832,3230177791,US
3230177792,3230178303,GB
3230178304,3230178559,CH
3230179328,3230210047,US
@@ -58792,15 +62921,13 @@
3230295040,3230295295,AU
3230295296,3230296319,US
3230296320,3230297343,NO
-3230297344,3230299647,SE
+3230297344,3230300159,SE
3230301696,3230302207,US
-3230302464,3230302719,CA
3230302976,3230307327,US
3230307584,3230309119,US
3230309120,3230309375,NO
3230309376,3230310143,GB
-3230310144,3230310655,US
-3230310912,3230316287,US
+3230310144,3230316287,US
3230316288,3230316543,NL
3230316544,3230316799,US
3230316800,3230317311,CA
@@ -58837,9 +62964,12 @@
3230372864,3230383359,CA
3230383616,3230384127,CA
3230384384,3230387455,CA
-3230387712,3230400255,CA
+3230387712,3230390015,CA
+3230390016,3230390271,US
+3230390272,3230400255,CA
3230681088,3230683135,FR
-3230787584,3230797311,US
+3230787584,3230793727,US
+3230793984,3230797311,US
3230797312,3230797567,SG
3230797568,3230823679,US
3230823680,3230823935,NL
@@ -58874,7 +63004,7 @@
3230842112,3230842367,AU
3230842624,3230843135,US
3230843136,3230843391,NL
-3230843392,3230844671,US
+3230843392,3230844927,US
3230844928,3230845183,AU
3230845184,3230845951,US
3230845952,3230846207,CZ
@@ -59233,6 +63363,7 @@
3231285248,3231291647,US
3231291648,3231291903,NL
3231291904,3231292159,US
+3231292160,3231292415,MX
3231292416,3231292927,US
3231292928,3231293183,AU
3231293184,3231294975,US
@@ -59247,7 +63378,7 @@
3231300352,3231300607,US
3231300608,3231301119,NL
3231301120,3231302143,US
-3231302144,3231302399,NO
+3231302144,3231302399,NL
3231302400,3231302655,US
3231302656,3231303167,AU
3231303168,3231307007,US
@@ -59263,11 +63394,16 @@
3231319040,3231322111,US
3231322112,3231324671,SG
3231325184,3231326207,CA
-3231326208,3231352831,US
+3231326208,3231349759,US
+3231350528,3231352831,US
3231352832,3231358975,CA
-3231358976,3231383551,US
+3231358976,3231369215,US
+3231369216,3231369471,TW
+3231369472,3231383551,US
3231383552,3231385599,NO
-3231385600,3231477759,US
+3231385600,3231444071,US
+3231444072,3231444079,CA
+3231444080,3231477759,US
3231477760,3231478015,CA
3231478016,3231482879,US
3231482880,3231483135,BE
@@ -59312,9 +63448,7 @@
3231513600,3231514367,US
3231514624,3231515647,NO
3231515648,3231516159,US
-3231516672,3231518719,SE
-3231518720,3231518975,BR
-3231518976,3231519231,SE
+3231516672,3231519231,SE
3231519744,3231521791,US
3231522560,3231528959,US
3231528960,3231528991,CA
@@ -59367,8 +63501,8 @@
3231588864,3231589119,GB
3231589120,3231591679,US
3231591680,3231591935,AU
-3231591936,3231593983,US
-3231593984,3231594495,GB
+3231591936,3231594239,US
+3231594240,3231594495,GB
3231594496,3231641855,US
3231641856,3231642111,SG
3231642112,3231644927,US
@@ -59398,7 +63532,7 @@
3231673856,3231674111,US
3231674112,3231674367,CA
3231674368,3231675391,US
-3231675392,3231675647,BR
+3231675392,3231675903,BR
3231675904,3231676159,NL
3231676416,3231677439,NL
3231677440,3231694847,US
@@ -59406,7 +63540,7 @@
3231711232,3231713023,US
3231713024,3231713279,CA
3231713280,3231713791,US
-3231713792,3231714047,GB
+3231713792,3231714047,NL
3231714048,3231715071,US
3231715072,3231715327,NL
3231715328,3231715583,AU
@@ -59429,8 +63563,7 @@
3231723008,3231723519,US
3231723776,3231724031,US
3231724032,3231724287,BR
-3231724288,3231725055,US
-3231725312,3231727871,US
+3231724288,3231727871,US
3231727872,3231728127,NL
3231728384,3231728639,NL
3231728640,3231729407,US
@@ -59441,7 +63574,8 @@
3231737600,3231738367,US
3231738368,3231738623,NL
3231738624,3231739135,US
-3231739136,3231739647,NL
+3231739136,3231739391,GB
+3231739392,3231739647,NL
3231739648,3231739903,BR
3231739904,3231742719,US
3231742720,3231742975,NL
@@ -59468,6 +63602,7 @@
3231755776,3231756543,PR
3231756544,3231757311,GB
3231757312,3231759359,US
+3231759360,3231759615,BR
3231759616,3231760895,US
3231760896,3231761151,GB
3231761152,3231761407,NL
@@ -59491,8 +63626,7 @@
3231800320,3231801343,CN
3231801344,3231809535,CA
3231809536,3231810047,AU
-3231810560,3231825919,US
-3231825920,3231842303,CA
+3231810560,3231842303,US
3231842304,3231843327,RU
3231843328,3231844351,NO
3231844352,3231845375,RU
@@ -59571,7 +63705,9 @@
3232065792,3232066303,GB
3232066304,3232066559,SE
3232066560,3232066815,NO
-3232066816,3232079871,SE
+3232066816,3232070399,SE
+3232070400,3232070655,ES
+3232070656,3232079871,SE
3232079872,3232080895,GB
3232080896,3232082687,SE
3232082688,3232083199,GB
@@ -59594,11 +63730,16 @@
3232098304,3232100095,SE
3232100096,3232100351,IE
3232100352,3232101119,GB
-3232101120,3232104447,SE
+3232101120,3232102143,SE
+3232102144,3232102144,DK
+3232102145,3232102145,SE
+3232102146,3232102399,DK
+3232102400,3232104447,SE
3232104448,3232106495,DE
3232107520,3232108543,RU
3232108544,3232112639,DE
-3232116736,3232129023,DE
+3232116736,3232125183,DE
+3232125952,3232129023,DE
3232129024,3232130047,NL
3232130048,3232131071,UA
3232131072,3232133119,DE
@@ -59617,7 +63758,6 @@
3232156160,3232156671,PL
3232157696,3232159743,DE
3232159744,3232160767,PL
-3232160768,3232161791,DE
3232163840,3232165887,RU
3232167936,3232168959,DE
3232169216,3232169727,DE
@@ -59676,9 +63816,9 @@
3232724152,3232724159,US
3232724160,3232727039,CA
3232727040,3232759807,US
-3232759808,3232772095,SE
-3232772096,3232774143,IT
-3232774144,3232774911,SE
+3232759808,3232765951,SE
+3232765952,3232766207,NO
+3232766208,3232774911,SE
3232774912,3232775167,IE
3232775168,3232794879,SE
3232794880,3232795135,DE
@@ -59771,8 +63911,7 @@
3233590528,3233590783,PR
3233590784,3233591295,AU
3233591552,3233593599,US
-3233593600,3233593855,NZ
-3233593856,3233594111,AU
+3233593600,3233594111,AU
3233594112,3233594367,NL
3233594368,3233594623,US
3233594624,3233594879,NL
@@ -59806,7 +63945,7 @@
3233625600,3233625855,AU
3233625856,3233626111,NL
3233626112,3233626879,US
-3233627136,3233628671,US
+3233627136,3233628415,US
3233628672,3233628927,FR
3233628928,3233629439,CA
3233629440,3233629695,GB
@@ -59839,7 +63978,7 @@
3233654272,3233655551,GB
3233655552,3233662975,US
3233663488,3233663999,NL
-3233664256,3233665023,US
+3233664000,3233665023,US
3233665024,3233666047,AU
3233666048,3233668863,US
3233668864,3233669119,AU
@@ -59852,6 +63991,7 @@
3233677312,3233679103,US
3233679360,3233682431,US
3233682944,3233684991,US
+3233684992,3233685247,MX
3233685248,3233685503,BR
3233685760,3233688063,US
3233688576,3233688831,NL
@@ -59955,11 +64095,7 @@
3233808384,3233873919,TW
3233873920,3233874175,US
3233874176,3233874687,AU
-3233874688,3233903615,US
-3233903616,3233903743,GB
-3233903744,3233903807,US
-3233903808,3233903871,GB
-3233903872,3233926294,US
+3233874688,3233926294,US
3233926295,3233926295,MX
3233926296,3233939455,US
3233939456,3234004991,FI
@@ -60065,13 +64201,16 @@
3234232576,3234232831,US
3234232832,3234233087,BR
3234233088,3234238975,US
-3234238976,3234239487,MY
-3234239488,3234240383,US
+3234238976,3234239231,MY
+3234239232,3234239327,US
+3234239328,3234239329,MY
+3234239330,3234240383,US
3234240384,3234240387,IE
3234240388,3234240607,US
3234240608,3234240611,IL
3234240612,3234247167,US
-3234247680,3234269695,US
+3234247680,3234267135,US
+3234267392,3234269695,US
3234270208,3234271231,CA
3234271232,3234275327,PT
3234275328,3234279423,AU
@@ -60083,7 +64222,14 @@
3234316288,3234320383,CA
3234320384,3234332671,US
3234332928,3234334975,US
-3234335744,3234349055,US
+3234335744,3234338815,US
+3234338816,3234339071,CN
+3234339072,3234339327,MT
+3234339328,3234339583,LB
+3234339584,3234339839,PA
+3234339840,3234340095,US
+3234340096,3234340351,IN
+3234340352,3234349055,US
3234349056,3234353151,NZ
3234353152,3234549759,US
3234549760,3234550015,RU
@@ -60129,7 +64275,8 @@
3234726144,3234726399,CA
3234726400,3234726911,US
3234726912,3234727935,CA
-3234727936,3234733055,US
+3234727936,3234730495,US
+3234730752,3234733055,US
3234733056,3234733311,CA
3234733312,3234735103,US
3234735616,3234737407,US
@@ -60160,7 +64307,8 @@
3234781440,3234781951,CA
3234781952,3234782719,US
3234782720,3234783999,IL
-3234784000,3234791167,US
+3234784000,3234786815,US
+3234787328,3234791167,US
3234791424,3234794495,US
3234794752,3234795007,US
3234795008,3234795263,NL
@@ -60227,15 +64375,15 @@
3234861056,3234886143,US
3234886656,3234926847,US
3234927616,3234988031,US
-3234988032,3234990847,CA
+3234988032,3234991103,CA
3234991104,3234998783,US
3234999296,3235004415,US
3235004416,3235021823,CA
3235021824,3235026943,US
-3235026944,3235028991,CA
-3235028992,3235045375,US
-3235045376,3235046143,CA
-3235046144,3235085311,US
+3235026944,3235027967,CA
+3235027968,3235045375,US
+3235045376,3235045887,CA
+3235045888,3235085311,US
3235085312,3235086335,CA
3235086336,3235184639,US
3235184640,3235184895,CA
@@ -60334,7 +64482,9 @@
3236102144,3236106239,PH
3236106240,3236140031,US
3236140032,3236142079,CA
-3236142080,3236142847,US
+3236142080,3236142335,US
+3236142336,3236142463,CA
+3236142464,3236142847,US
3236142848,3236143005,CA
3236143006,3236143006,US
3236143007,3236143103,CA
@@ -60344,8 +64494,15 @@
3236200448,3236233215,MY
3236233216,3236238591,US
3236239360,3236241407,CA
-3236241408,3236302847,US
-3236306944,3236364287,US
+3236241408,3236291071,US
+3236291072,3236291327,GB
+3236291328,3236302847,US
+3236306944,3236312063,US
+3236312064,3236312319,MO
+3236312320,3236312575,GH
+3236312576,3236312831,GR
+3236312832,3236313087,QA
+3236313088,3236364287,US
3236364544,3236365567,US
3236365824,3236368127,US
3236368128,3236368383,AU
@@ -60368,7 +64525,9 @@
3236389376,3236392447,US
3236392448,3236392703,CL
3236392704,3236393471,US
-3236393472,3236395519,BR
+3236393472,3236393983,BR
+3236393984,3236395007,CO
+3236395008,3236395519,BR
3236395520,3236396799,US
3236396800,3236397055,AU
3236397056,3236398591,US
@@ -60381,7 +64540,8 @@
3236406784,3236407551,AU
3236407552,3236408063,SG
3236408064,3236408319,US
-3236408320,3236409343,CA
+3236408320,3236409087,CA
+3236409088,3236409599,BR
3236409600,3236411135,US
3236411136,3236411391,AU
3236411392,3236412415,US
@@ -60475,10 +64635,7 @@
3236826112,3236827135,CA
3236827136,3236958207,US
3236958208,3236962303,AU
-3236962304,3236966143,US
-3236966400,3237021695,US
-3237021696,3237023743,CA
-3237023744,3237038079,US
+3236962304,3237038079,US
3237038080,3237038335,CA
3237038336,3237043967,US
3237043968,3237044223,CH
@@ -60486,9 +64643,7 @@
3237046016,3237046271,RO
3237046272,3237047039,US
3237047040,3237047295,FR
-3237047296,3237047551,US
-3237047552,3237047807,IE
-3237047808,3237050111,US
+3237047296,3237050111,US
3237050112,3237050367,GB
3237050368,3237051903,US
3237051904,3237052159,TR
@@ -60496,9 +64651,7 @@
3237052288,3237154815,US
3237154816,3237155839,ES
3237155840,3237156863,AU
-3237156864,3237163007,US
-3237163008,3237167103,DM
-3237167104,3237182463,US
+3237156864,3237182463,US
3237182464,3237183487,NL
3237183488,3237216255,US
3237216256,3237281791,JP
@@ -60509,6 +64662,7 @@
3237285632,3237287935,US
3237287936,3237288191,CA
3237288192,3237289471,US
+3237289472,3237289727,BR
3237289728,3237290495,US
3237291008,3237291263,NZ
3237291264,3237294847,US
@@ -60525,8 +64679,7 @@
3237308672,3237310719,AU
3237310720,3237312767,US
3237312768,3237313023,BO
-3237313024,3237317631,US
-3237317888,3237319679,US
+3237313024,3237319679,US
3237319680,3237319935,MU
3237319936,3237320703,US
3237320704,3237320959,UA
@@ -60586,7 +64739,9 @@
3237634310,3237634310,GB
3237634311,3237647103,US
3237647104,3237647359,AU
-3237647360,3237679359,US
+3237647360,3237648639,US
+3237648640,3237648895,AU
+3237648896,3237679359,US
3237679872,3237681663,US
3237681664,3237682943,CA
3237682944,3237684991,US
@@ -60621,7 +64776,7 @@
3237781504,3237785599,CA
3237785600,3237797887,US
3237797888,3237801983,CA
-3237806080,3237857535,US
+3237801984,3237857535,US
3237858304,3237863423,CA
3237863424,3237867519,US
3237867520,3237867775,HK
@@ -60640,7 +64795,8 @@
3237870976,3237871103,JP
3237871104,3237871231,TH
3237871232,3237871359,TW
-3237871360,3237871615,NZ
+3237871360,3237871487,SG
+3237871488,3237871615,MY
3237871616,3237896191,US
3237896192,3237900287,PR
3237900288,3237957631,US
@@ -60662,7 +64818,7 @@
3237961472,3237961727,HT
3237961728,3238002687,US
3238002688,3238008831,NL
-3238008832,3238010879,PL
+3238008832,3238010879,GB
3238010880,3238017023,CH
3238017024,3238018303,DK
3238018304,3238018559,UA
@@ -60735,20 +64891,23 @@
3238395904,3238461439,HU
3238461440,3238502399,DE
3238502400,3238504447,RU
-3238504448,3238526975,DE
+3238504448,3238510591,DE
+3238518784,3238526975,DE
3238526976,3238527231,RU
-3238527232,3238530047,CH
-3238530560,3238535167,CH
+3238529024,3238530047,CH
+3238530560,3238530815,CH
+3238531072,3238535167,CH
3238535168,3238536191,SE
3238536192,3238537215,DK
3238537216,3238538495,CH
3238538496,3238538751,PL
-3238538752,3238539263,RU
+3238538752,3238539263,UA
3238539264,3238541567,CH
3238541568,3238541823,PL
3238541824,3238542591,CH
3238542592,3238542847,PL
-3238542848,3238545407,CH
+3238542848,3238543103,CH
+3238543360,3238545407,CH
3238545920,3238546431,RU
3238546432,3238546943,CH
3238546944,3238547455,UA
@@ -60767,7 +64926,8 @@
3238578432,3238578687,UA
3238578688,3238578943,CH
3238578944,3238579199,RU
-3238579200,3238589951,CH
+3238579200,3238579455,CH
+3238580224,3238589951,CH
3238589952,3238590207,LT
3238590208,3238590719,CH
3238590976,3238591231,SA
@@ -60789,7 +64949,6 @@
3238599168,3238599679,HU
3238599680,3238599935,UA
3238599936,3238600703,HU
-3238600704,3238604799,DE
3238608896,3238621183,SE
3238623232,3238623487,LV
3238623488,3238623743,PL
@@ -60826,8 +64985,8 @@
3238867968,3238887423,SE
3238887424,3238888447,NL
3238888448,3238893567,SE
-3238893568,3238894591,NL
-3238894592,3238897663,SE
+3238893568,3238895615,NL
+3238895616,3238897663,SE
3238897664,3238899711,NL
3238899712,3238901759,SE
3238901760,3238902783,NL
@@ -60856,7 +65015,9 @@
3238993920,3238995967,HR
3238995968,3239001087,SE
3239001088,3239002111,NL
-3239002112,3239008255,SE
+3239002112,3239006207,SE
+3239006208,3239007231,NL
+3239007232,3239008255,SE
3239008256,3239009279,NL
3239009280,3239018495,SE
3239018496,3239020543,HR
@@ -60866,7 +65027,6 @@
3239026688,3239028735,HR
3239028736,3239051263,SE
3239051264,3239053311,DE
-3239054336,3239054847,DE
3239055360,3239059455,DE
3239062272,3239062527,ES
3239062528,3239062783,CH
@@ -60932,8 +65092,7 @@
3239116544,3239116799,PL
3239116800,3239117055,PT
3239117056,3239117311,SI
-3239117312,3239117823,DE
-3239118336,3239118591,DE
+3239117312,3239117567,DE
3239118848,3239119871,DE
3239119872,3239120127,GB
3239120128,3239120383,CZ
@@ -60970,7 +65129,7 @@
3239137024,3239137279,LI
3239138304,3239138559,PL
3239138560,3239138815,CH
-3239138816,3239141375,DE
+3239139328,3239141375,DE
3239141376,3239145471,US
3239145472,3239147519,DE
3239147520,3239149567,SG
@@ -60981,7 +65140,7 @@
3239161088,3239161343,BY
3239161344,3239161599,PL
3239161600,3239161855,HU
-3239161856,3239162623,DE
+3239162368,3239162623,DE
3239162624,3239162879,BE
3239163904,3239164159,PL
3239164160,3239164671,DE
@@ -61044,9 +65203,7 @@
3239275520,3239276543,UA
3239276544,3239277055,LU
3239277056,3239277567,DE
-3239277568,3239278079,RU
-3239278080,3239278591,UA
-3239278592,3239279103,RU
+3239277568,3239279103,RU
3239279104,3239280127,PL
3239280128,3239280639,RU
3239281664,3239282687,RU
@@ -61083,8 +65240,8 @@
3239445760,3239446015,PL
3239446016,3239446271,RU
3239446272,3239446527,FR
-3239446528,3239449599,DE
-3239450624,3239451647,DE
+3239446528,3239447551,DE
+3239448576,3239449599,DE
3239451648,3239451903,PL
3239451904,3239452159,DE
3239452160,3239452415,CY
@@ -61104,7 +65261,7 @@
3239468288,3239468543,RO
3239468544,3239468799,NO
3239468800,3239469055,RO
-3239469056,3239470591,DE
+3239470080,3239470591,DE
3239470592,3239470847,CH
3239470848,3239471103,BG
3239471872,3239472127,FR
@@ -61114,7 +65271,7 @@
3239480320,3239480575,UA
3239480832,3239481087,CH
3239481088,3239481343,FR
-3239481344,3239486719,DE
+3239485440,3239486719,DE
3239486720,3239486975,ES
3239486976,3239487487,DE
3239487744,3239487999,PL
@@ -61124,7 +65281,6 @@
3239489024,3239489279,DE
3239489280,3239489535,PL
3239489536,3239501823,DE
-3239505920,3239506431,DE
3239506432,3239506687,RU
3239506688,3239506943,GB
3239507200,3239507455,GB
@@ -61136,10 +65292,7 @@
3239508992,3239509247,PL
3239509248,3239509503,DE
3239509504,3239509759,CH
-3239509760,3239510015,DE
-3239510016,3239510271,UA
-3239510272,3239511039,DE
-3239512064,3239514111,DE
+3239509760,3239514111,DE
3239518208,3239521791,DE
3239522304,3239522559,PL
3239522560,3239522815,SI
@@ -61166,9 +65319,8 @@
3239541248,3239541503,UA
3239541504,3239541759,FR
3239541760,3239542015,GB
-3239542016,3239542271,PL
3239542272,3239542527,RU
-3239542784,3239544831,DE
+3239543808,3239544831,DE
3239544832,3239545087,GB
3239545088,3239545343,SI
3239545344,3239545855,HU
@@ -61176,7 +65328,7 @@
3239546112,3239546367,GB
3239546368,3239546623,RU
3239546624,3239546879,NL
-3239546880,3239549951,DE
+3239547904,3239549951,DE
3239549952,3239550207,TR
3239550208,3239550463,UA
3239550464,3239550719,FR
@@ -61199,10 +65351,13 @@
3239568384,3239568639,SE
3239568640,3239568895,NO
3239568896,3239573759,DE
-3239574016,3239574783,DE
+3239574272,3239574783,DE
3239575040,3239575295,DE
3239575296,3239575551,DK
-3239575552,3239578879,DE
+3239576064,3239576319,DE
+3239576576,3239576831,DE
+3239577088,3239577599,DE
+3239578624,3239578879,DE
3239579136,3239579391,PL
3239579392,3239581695,DE
3239581696,3239581951,PL
@@ -61215,7 +65370,8 @@
3239583744,3239584767,DE
3239585024,3239585279,DE
3239587840,3239591935,DE
-3239591936,3239592447,FI
+3239591936,3239592191,FI
+3239592192,3239592447,CN
3239592448,3239592703,US
3239592704,3239593983,FI
3239593984,3239624703,DE
@@ -61309,7 +65465,8 @@
3239740416,3239740671,DK
3239740928,3239741183,UA
3239741184,3239741439,RU
-3239741440,3239759871,DE
+3239741440,3239744511,DE
+3239745536,3239759871,DE
3239760128,3239760383,UA
3239761408,3239761663,RU
3239761920,3239762175,BG
@@ -61327,7 +65484,7 @@
3239773952,3239774207,SA
3239774464,3239774719,ES
3239774976,3239775231,PT
-3239776256,3239782399,DE
+3239776256,3239778303,DE
3239782400,3239782655,AT
3239782656,3239782911,RU
3239782912,3239783167,GB
@@ -61378,7 +65535,6 @@
3239837696,3239837951,PL
3239838976,3239839231,DE
3239839232,3239839487,RU
-3239839488,3239839743,DE
3239839744,3239839999,SK
3239840000,3239840511,SA
3239840512,3239840767,DE
@@ -61447,7 +65603,7 @@
3239896064,3239896575,DE
3239896576,3239896831,PL
3239896832,3239897087,HU
-3239897088,3239897343,IE
+3239897088,3239897343,GB
3239897344,3239897599,FR
3239897600,3239897855,RU
3239897856,3239898111,FR
@@ -61460,15 +65616,15 @@
3239902464,3239902719,RU
3239902720,3239902975,EE
3239903232,3239904255,DE
-3239904512,3239904767,DE
-3239905024,3239907327,DE
+3239904512,3239904767,GB
+3239905536,3239905791,DE
3239907328,3239907583,UA
3239907584,3239907839,DE
3239908096,3239908351,RU
3239908352,3239911423,DE
3239912960,3239913215,DE
3239913216,3239913471,LT
-3239913472,3239915519,DE
+3239914240,3239915519,DE
3239915520,3239915775,PL
3239915776,3239916031,HU
3239916032,3239916287,SA
@@ -61477,17 +65633,15 @@
3239916800,3239917055,KZ
3239917056,3239917311,DE
3239917312,3239917567,BG
-3239919616,3239922687,DE
-3239922688,3239922724,LU
-3239922725,3239922725,DE
-3239922726,3239922943,LU
-3239922944,3239935999,DE
+3239919616,3239927807,DE
+3239931904,3239935999,DE
3239936512,3239938815,DE
3239938816,3239939071,NL
-3239939072,3239949311,DE
+3239939072,3239948543,DE
3239950848,3239951103,DE
3239951104,3239951359,AT
-3239951360,3239954431,DE
+3239951360,3239951615,DE
+3239952384,3239954431,DE
3239954432,3239954687,UA
3239954688,3239954943,DK
3239954944,3239955199,ES
@@ -61501,20 +65655,23 @@
3239960064,3239960319,FR
3239960320,3239960575,GB
3239960576,3239966719,DE
-3239967232,3239968255,DE
+3239967232,3239967487,DE
+3239967744,3239968255,DE
3239968512,3239968767,PL
3239968768,3239969023,NO
-3239969536,3239971839,DE
+3239969536,3239970047,DE
+3239970816,3239971839,DE
3239972864,3239974911,DE
3239974912,3239975935,GB
3239975936,3239976191,RO
3239976192,3239976447,DE
3239976448,3239976959,NL
-3239976960,3239978751,DE
+3239977984,3239978751,DE
3239978752,3239979007,RU
3239979264,3239979519,GB
3239979520,3239979775,DE
-3239980032,3239996415,DE
+3239980032,3239993343,DE
+3239995392,3239996415,DE
3239996416,3239996671,GB
3239996928,3239997183,BE
3239997184,3239997439,GB
@@ -61543,13 +65700,15 @@
3240036096,3240037375,DE
3240037888,3240038143,AT
3240038400,3240040447,DE
-3240042496,3240048639,DE
-3240049664,3240083455,DE
+3240046592,3240048639,DE
+3240049664,3240050687,DE
+3240054784,3240058879,DE
+3240067072,3240083455,DE
3240083456,3240085503,RU
3240085504,3240087551,KZ
3240087552,3240097791,DE
3240098816,3240099327,CH
-3240100352,3240100863,GB
+3240100608,3240100863,GB
3240101376,3240101887,GB
3240102144,3240102399,GB
3240102912,3240103935,UA
@@ -61557,7 +65716,8 @@
3240104704,3240104959,NL
3240104960,3240105215,RU
3240105216,3240105471,UA
-3240105472,3240109055,GB
+3240105472,3240107007,GB
+3240107520,3240109055,GB
3240109056,3240109567,PL
3240109568,3240112639,GB
3240112640,3240112895,PL
@@ -61580,11 +65740,9 @@
3240120832,3240121343,GB
3240122368,3240123391,GB
3240125440,3240125695,RO
-3240125696,3240132607,GB
-3240140800,3240142847,GB
-3240153600,3240154111,GB
-3240161536,3240161791,GB
-3240163840,3240165375,GB
+3240125696,3240125951,GB
+3240126208,3240132607,GB
+3240163328,3240165375,GB
3240165376,3240165887,PL
3240165888,3240166399,ES
3240166400,3240166911,PL
@@ -61753,10 +65911,8 @@
3240280064,3240280191,DE
3240280192,3240280319,SE
3240280320,3240280447,PL
-3240280704,3240280831,RU
3240280832,3240280959,GB
3240280960,3240281215,PL
-3240281216,3240281343,FR
3240281344,3240281471,PL
3240281472,3240281599,FR
3240281600,3240281727,JO
@@ -61776,10 +65932,9 @@
3240285184,3240286207,PL
3240286208,3240287231,UA
3240287232,3240288255,PL
-3240288256,3240292351,GB
-3240294400,3240296447,GB
+3240288256,3240296447,GB
3240296448,3240296703,RO
-3240297472,3240300543,GB
+3240297472,3240300031,GB
3240302848,3240303103,UA
3240304640,3240305663,RU
3240305664,3240305919,PL
@@ -61800,14 +65955,15 @@
3240312832,3240321023,GB
3240321024,3240321791,RU
3240321792,3240322047,PL
-3240322048,3240322559,RU
+3240322048,3240322303,RU
3240322560,3240324095,CZ
3240324096,3240324351,RO
3240324352,3240324607,RU
3240324608,3240324863,PL
3240324864,3240325119,SI
3240325120,3240334335,GB
-3240336640,3240352255,GB
+3240336640,3240347647,GB
+3240351744,3240352255,GB
3240352768,3240353791,GB
3240355840,3240361983,GB
3240361984,3240362239,TR
@@ -61830,7 +65986,6 @@
3240373760,3240374015,DE
3240374016,3240374271,GB
3240378368,3240394751,GB
-3240395264,3240395775,GB
3240396032,3240396287,GB
3240396800,3240398847,GB
3240400896,3240407039,GB
@@ -61848,11 +66003,10 @@
3240411136,3240419327,RO
3240419840,3240420095,AT
3240420608,3240420863,NL
-3240420864,3240421375,GB
+3240420864,3240421119,GB
3240423424,3240435711,GB
3240436480,3240436735,GB
3240436736,3240437759,DE
-3240438784,3240443903,GB
3240450048,3240454911,GB
3240454912,3240455167,IN
3240456192,3240460287,GB
@@ -61882,24 +66036,24 @@
3240467968,3240468223,DE
3240468224,3240468479,CH
3240468480,3240476671,GB
-3240484864,3240486911,GB
-3240487424,3240487935,GB
+3240485120,3240485375,GB
+3240485888,3240486399,GB
3240487936,3240488191,CH
3240488192,3240488447,GB
3240488448,3240488703,BG
3240488704,3240488959,NL
-3240488960,3240493055,GB
+3240488960,3240491007,GB
3240493056,3240501247,SE
-3240503296,3240504319,GB
-3240505088,3240505343,GB
3240505344,3240505599,PL
3240505600,3240505855,GB
3240506368,3240506623,GB
-3240507392,3240529919,GB
+3240507392,3240525823,GB
+3240529408,3240529919,GB
3240534016,3240536640,GB
3240536641,3240536641,US
3240536642,3240550399,GB
-3240558592,3240575487,GB
+3240559616,3240560127,GB
+3240560640,3240575487,GB
3240575488,3240575743,RO
3240575744,3240575999,GB
3240576000,3240576255,DE
@@ -61922,7 +66076,7 @@
3240588800,3240589055,UA
3240589056,3240589311,RO
3240589312,3240593407,SE
-3240593408,3240594175,GB
+3240593408,3240593663,GB
3240594176,3240594431,DK
3240594432,3240599551,GB
3240602624,3240605695,GB
@@ -61931,7 +66085,6 @@
3240615936,3240622079,GB
3240622080,3240622591,RU
3240622592,3240623103,GB
-3240623872,3240624127,GB
3240624128,3240689663,EE
3240689664,3240690175,GB
3240690176,3240690687,TR
@@ -62037,7 +66190,8 @@
3240754176,3240755199,DE
3240755200,3240759295,IT
3240771584,3240779775,IT
-3240788992,3240791551,IT
+3240788992,3240790015,IT
+3240790528,3240791551,IT
3240791552,3240791807,RU
3240791808,3240792063,ES
3240792064,3240792319,GB
@@ -62065,11 +66219,7 @@
3240812288,3240812543,KW
3240813568,3240814591,PL
3240814592,3240816639,IT
-3240818688,3240819711,NL
-3240819712,3240819715,GB
-3240819716,3240819716,NL
-3240819717,3240819967,GB
-3240819968,3240820735,NL
+3240818688,3240820735,NL
3240820736,3240820799,FR
3240820800,3240820831,CY
3240820832,3240820863,GB
@@ -62082,7 +66232,7 @@
3240827392,3240827647,BG
3240827648,3240827903,CH
3240828160,3240828415,DE
-3240828416,3240837119,IT
+3240828928,3240837119,IT
3240839424,3240839679,IT
3240840192,3240840447,IT
3240840448,3240840703,PL
@@ -62096,7 +66246,8 @@
3240845312,3240845823,IT
3240846336,3240846847,IT
3240846848,3240847359,VA
-3240847360,3240852735,IT
+3240847360,3240848895,IT
+3240849152,3240852735,IT
3240852736,3240852991,GB
3240853248,3240853503,RU
3240853504,3240854527,VA
@@ -62131,7 +66282,9 @@
3240886272,3241017343,SE
3241017344,3241017855,AT
3241017856,3241018111,RU
-3241018112,3241029119,AT
+3241018112,3241018367,FR
+3241018368,3241022463,AT
+3241027584,3241029119,AT
3241029120,3241029375,UA
3241029376,3241029631,PL
3241029632,3241031679,AT
@@ -62181,9 +66334,8 @@
3241071616,3241071871,PL
3241071872,3241072127,RU
3241072384,3241072639,DE
-3241073664,3241073919,AT
3241073920,3241074175,GB
-3241074432,3241076735,AT
+3241074688,3241076735,AT
3241077248,3241077759,AT
3241077760,3241078015,LV
3241078016,3241078271,PL
@@ -62191,7 +66343,8 @@
3241078528,3241078783,DE
3241078784,3241082879,AT
3241082880,3241083135,FR
-3241083136,3241100287,CH
+3241083136,3241091071,CH
+3241099264,3241100287,CH
3241101056,3241101311,DK
3241101312,3241101567,RO
3241101568,3241101823,DE
@@ -62254,15 +66407,19 @@
3241146624,3241146879,RO
3241146880,3241147903,CH
3241148160,3241148415,CH
-3241148416,3241476095,FR
-3241476608,3241477631,BE
+3241148416,3241416767,FR
+3241416768,3241416831,US
+3241416832,3241476095,FR
+3241476864,3241477375,BE
3241477632,3241477887,GB
3241478144,3241481727,BE
3241481728,3241481983,PT
3241481984,3241482239,DE
3241482240,3241484799,SE
3241484800,3241485055,BE
-3241485312,3241496575,BE
+3241485312,3241486335,BE
+3241486336,3241487615,SE
+3241487616,3241496575,BE
3241496576,3241496831,AT
3241497344,3241497599,UA
3241497600,3241497855,SE
@@ -62281,25 +66438,34 @@
3241503488,3241508095,BE
3241508096,3241508351,NL
3241508352,3241508607,BE
-3241508864,3241541375,BE
+3241508864,3241540607,BE
+3241540864,3241541119,BE
3241541376,3241541631,PL
3241541632,3241672703,FR
-3241673472,3241689087,FR
-3241691136,3241699327,FR
+3241673728,3241674751,FR
+3241675776,3241676799,FR
+3241680896,3241689087,FR
+3241693184,3241699327,FR
3241699584,3241699839,FR
3241699840,3241700095,SE
-3241700096,3241723903,FR
+3241700096,3241722879,FR
3241724160,3241724415,FR
3241724416,3241724671,RU
3241724672,3241724927,FR
-3241725952,3241736191,FR
-3241737216,3241740287,FR
-3241740544,3241748479,FR
+3241725952,3241734143,FR
+3241734400,3241736191,FR
+3241737216,3241737727,FR
+3241739264,3241740287,FR
+3241740544,3241741823,FR
+3241742336,3241742847,FR
+3241743360,3241743615,DE
+3241744128,3241748479,FR
3241750528,3241752831,FR
3241754368,3241758719,FR
3241759744,3241763071,FR
3241763072,3241763327,DE
-3241763328,3241771007,FR
+3241764864,3241765887,FR
+3241766144,3241771007,FR
3241772032,3241789439,FR
3241789696,3241789951,FR
3241790464,3241790975,FR
@@ -62316,7 +66482,6 @@
3241842688,3241843455,BE
3241843456,3241843711,CH
3241843712,3241848063,BE
-3241851904,3241852927,GB
3241852928,3241854463,SK
3241854464,3241854975,GB
3241854976,3241855999,DE
@@ -62368,11 +66533,9 @@
3243238400,3243245567,NL
3243245568,3243376639,AT
3243376640,3243442175,GB
-3243442176,3243443199,AT
-3243443200,3243443455,DE
-3243443456,3243507711,AT
+3243442176,3243507711,AT
3243507712,3243507967,GB
-3243509248,3243509759,CZ
+3243509504,3243509759,CZ
3243509760,3243510015,RU
3243510016,3243510271,NL
3243510272,3243510527,CZ
@@ -62440,7 +66603,6 @@
3243571456,3243571711,CZ
3243571968,3243572223,GR
3243572224,3243572479,CZ
-3243572736,3243572991,CZ
3243572992,3243573247,RU
3243573248,3243704319,CZ
3243704320,3243769855,SK
@@ -62499,7 +66661,7 @@
3244153856,3244154879,NO
3244154880,3244155903,GB
3244155904,3244156927,UA
-3244156928,3244158975,RU
+3244157952,3244158975,RU
3244158976,3244159999,DE
3244160000,3244161023,RU
3244161024,3244163071,NO
@@ -62520,7 +66682,6 @@
3244820736,3244820991,DE
3244820992,3244821247,SI
3244821248,3244821503,RU
-3244821504,3244821759,UA
3244821760,3244822015,TR
3244822016,3244822271,RU
3244822272,3244822527,GB
@@ -62683,7 +66844,8 @@
3244866560,3244866815,FI
3244866816,3244867071,UA
3244867072,3244867583,RU
-3244867584,3244868095,NL
+3244867584,3244867839,NL
+3244867840,3244868095,BE
3244868096,3244868351,DE
3244868352,3244868607,RU
3244868608,3244868863,FI
@@ -62735,7 +66897,6 @@
3244882176,3244882431,UA
3244882432,3244882687,IT
3244882688,3244882943,PL
-3244882944,3244883199,NL
3244883200,3244883455,RU
3244883456,3244883711,CZ
3244883712,3244883967,NL
@@ -62963,7 +67124,6 @@
3244945664,3244945919,NL
3244945920,3244946175,PL
3244946176,3244946431,TR
-3244946432,3244946687,RO
3244946688,3244946943,RU
3244946944,3244947455,DE
3244947456,3244947711,PL
@@ -63142,10 +67302,7 @@
3245126656,3245126911,FR
3245126912,3245127167,DE
3245127168,3245127423,RU
-3245127424,3245127679,AT
-3245127680,3245127742,US
-3245127743,3245127743,DE
-3245127744,3245127935,US
+3245127680,3245127935,DE
3245127936,3245128191,LV
3245128192,3245128447,IT
3245128448,3245128703,CH
@@ -63161,7 +67318,6 @@
3245132288,3245132543,PL
3245132544,3245132799,FR
3245132800,3245133311,IT
-3245133312,3245133567,PL
3245134080,3245134335,UA
3245134336,3245134591,NL
3245134848,3245135103,AT
@@ -63216,7 +67372,6 @@
3245169152,3245169407,IT
3245169408,3245169663,PL
3245169920,3245170175,PT
-3245170176,3245170431,GB
3245170432,3245170687,CH
3245170688,3245171711,DE
3245172736,3245173759,IT
@@ -63291,8 +67446,7 @@
3245219840,3245221887,FI
3245221888,3245223935,DE
3245223936,3245225471,NL
-3245225472,3245225727,GB
-3245225728,3245225983,NL
+3245225472,3245225983,GB
3245225984,3245228031,HU
3245228032,3245229055,FI
3245229056,3245230079,DE
@@ -63323,7 +67477,7 @@
3245243392,3245244415,UA
3245244416,3245244671,ES
3245244672,3245244927,AT
-3245244928,3245245183,BE
+3245244928,3245245183,US
3245245440,3245245695,BG
3245245696,3245245951,DE
3245246720,3245246975,PL
@@ -63470,22 +67624,23 @@
3246129152,3246260223,RU
3246260224,3246325759,PT
3246351616,3246352639,ES
-3246374400,3246374655,ES
-3246376960,3246377215,ES
+3246370816,3246371073,ES
+3246371074,3246371074,PT
+3246371075,3246374911,ES
3246378752,3246379007,ES
3246379008,3246381055,GB
+3246387200,3246388223,GB
3246391296,3246613503,GB
3246613504,3246614527,HU
3246614528,3246744543,GB
3246744544,3246744559,NG
3246744560,3246784511,GB
-3246784512,3246825727,CH
-3246825728,3246825983,GB
+3246784512,3246825983,CH
3246825984,3246826239,US
3246826240,3246915583,CH
3246915584,3247046655,PT
3247046656,3247046911,AT
-3247046912,3247048191,SI
+3247046912,3247047679,SI
3247048192,3247048703,NO
3247048704,3247048959,EE
3247048960,3247049215,SI
@@ -63574,9 +67729,9 @@
3247112192,3247177727,FR
3247177728,3247243263,TR
3247243264,3247244287,DE
-3247244288,3247252319,NL
-3247252320,3247252327,DE
-3247252328,3247253503,NL
+3247244288,3247250175,NL
+3247250176,3247250431,DE
+3247250432,3247253503,NL
3247253504,3247254527,DE
3247254528,3247267839,NL
3247267840,3247268351,DE
@@ -63587,18 +67742,18 @@
3247300608,3247308799,NL
3247308800,3247309055,BG
3247309056,3247309567,FI
-3247309824,3247313663,FI
+3247309824,3247313407,FI
3247313664,3247313919,AM
-3247313920,3247316479,FI
-3247316480,3247316991,RU
+3247314688,3247315967,FI
+3247316480,3247316735,IR
+3247316736,3247316991,RU
3247321600,3247322111,FI
3247322368,3247322623,DE
-3247322624,3247323135,FI
+3247322880,3247323135,FI
3247323136,3247323647,RU
-3247324160,3247324415,FI
3247324416,3247324671,SE
3247324672,3247324927,CH
-3247324928,3247333631,FI
+3247325184,3247333631,FI
3247333632,3247333887,DE
3247333888,3247334399,FI
3247334400,3247334655,NO
@@ -63618,7 +67773,6 @@
3247341312,3247341567,DE
3247343616,3247345663,FI
3247345920,3247346175,HU
-3247346176,3247346943,FI
3247346944,3247347199,SI
3247347200,3247347455,FI
3247347456,3247347711,IL
@@ -63627,7 +67781,8 @@
3247349248,3247349503,FR
3247349504,3247349759,UA
3247349760,3247353855,SE
-3247353856,3247362047,FI
+3247353856,3247357951,FI
+3247361024,3247361279,FI
3247362048,3247362303,RO
3247362304,3247362559,HU
3247362560,3247362815,PL
@@ -63660,7 +67815,7 @@
3247394048,3247394303,PL
3247394560,3247397887,FI
3247397888,3247398143,RU
-3247398144,3247399167,FI
+3247398144,3247398911,FI
3247399424,3247399679,RU
3247399680,3247404799,FI
3247404800,3247405055,RU
@@ -63670,12 +67825,13 @@
3247406080,3247431679,FI
3247431936,3247432191,FI
3247432192,3247432447,TR
-3247432448,3247437823,FI
+3247432448,3247433471,FI
+3247433728,3247437823,FI
3247438080,3247438335,IT
3247438848,3247439871,FI
3247439872,3247702015,ES
3247702016,3247702271,RO
-3247702528,3247703551,ES
+3247702528,3247703295,ES
3247703552,3247704063,FR
3247705856,3247706111,RU
3247708160,3247711743,ES
@@ -63683,7 +67839,6 @@
3247713280,3247713535,RU
3247713536,3247713791,BE
3247713792,3247714047,SK
-3247714304,3247716351,CH
3247726592,3247742975,ES
3247742976,3247751167,DE
3247751168,3247769599,ES
@@ -63772,7 +67927,8 @@
3247909888,3247910911,DE
3247910912,3247912959,PL
3247912960,3247913983,UA
-3247913984,3247915007,DE
+3247913984,3247914495,DE
+3247914496,3247915007,AT
3247915008,3247917055,PL
3247917056,3247918079,NL
3247918080,3247919103,PL
@@ -63813,7 +67969,6 @@
3248521984,3248522239,RU
3248522240,3248522751,NO
3248523264,3248524287,NO
-3248525312,3248525567,DE
3248526336,3248527359,NO
3248528384,3248528895,NO
3248528896,3248529151,RU
@@ -63827,30 +67982,31 @@
3248551936,3248553215,NO
3248553728,3248553983,RU
3248553984,3248554239,RO
-3248554496,3248557055,NO
3248557056,3248558079,UA
3248558080,3248575487,NO
3248575488,3248576511,CZ
-3248576512,3248591871,NO
-3248592384,3248599039,NO
+3248576512,3248582655,NO
+3248584704,3248586751,NO
+3248589312,3248589823,NO
+3248590848,3248591871,NO
+3248592896,3248599039,NO
3248599040,3248603135,SE
3248603136,3248603391,BG
3248603392,3248603647,RU
3248603648,3248604159,NO
-3248604928,3248608767,NO
-3248609280,3248619519,NO
+3248606208,3248608255,NO
+3248609280,3248610303,NO
+3248611328,3248619519,NO
3248619520,3248624383,DK
3248624384,3248624639,US
3248624640,3248750591,DK
3248750592,3248750847,PT
-3248751616,3248752127,PL
3248752640,3248752895,DE
3248752896,3248753151,TR
3248753408,3248753663,GB
3248753664,3248753919,FR
3248753920,3248754431,GB
3248754432,3248754687,AT
-3248754688,3248758783,PL
3248758784,3248774143,SE
3248774144,3248775167,UA
3248775168,3248783615,GB
@@ -63896,10 +68052,8 @@
3248807936,3248808447,AT
3248808448,3248808959,GR
3248808960,3248810111,FR
-3248810112,3248810143,RU
3248810144,3248810175,CY
3248810176,3248810207,FR
-3248810208,3248810239,GB
3248810240,3248810495,CH
3248810496,3248812543,AT
3248812544,3248813055,GB
@@ -63910,12 +68064,12 @@
3248816128,3248881663,CZ
3248881664,3249012735,FI
3249012736,3249012991,DE
-3249012992,3249014271,LU
+3249012992,3249013759,LU
3249014272,3249014783,DE
3249014784,3249025023,LU
3249025536,3249025791,FR
3249026560,3249026815,PL
-3249026816,3249045503,LU
+3249027584,3249045503,LU
3249045504,3249078271,DE
3249078272,3249078783,RU
3249078784,3249079295,CH
@@ -64022,43 +68176,47 @@
3249141760,3249142271,RU
3249142784,3249143295,UA
3249143296,3249143807,GB
-3249143808,3249242879,AT
-3249242880,3249243135,DE
-3249243136,3249274879,AT
+3249143808,3249274879,AT
3249274880,3249405951,NL
3249405952,3249521279,DE
3249521280,3249521343,UA
3249521344,3249537023,DE
3249537024,3249537279,PT
-3249537536,3249537791,NL
3249537792,3249538047,GB
-3249538048,3249551359,NL
+3249538048,3249541119,NL
+3249545216,3249547263,NL
+3249548288,3249551359,NL
3249551360,3249552639,GB
-3249552640,3249565695,NL
+3249552640,3249552895,NL
+3249553152,3249553407,NL
+3249561600,3249565695,NL
3249569792,3249574143,NL
3249574144,3249574399,RU
3249574400,3249574655,GB
3249574656,3249574911,UA
-3249574912,3249583103,NL
-3249583616,3249590527,NL
+3249574912,3249576191,NL
+3249577728,3249583103,NL
+3249585152,3249590527,NL
3249590528,3249590783,FR
-3249590784,3249591295,NL
-3249591808,3249600255,NL
+3249592320,3249595135,NL
+3249596416,3249600255,NL
3249600256,3249600511,AT
3249600512,3249601535,UA
3249601536,3249601791,RU
-3249601792,3249655807,NL
+3249601792,3249635327,NL
+3249637376,3249655807,NL
3249659904,3249668095,NL
3249668096,3249676287,IE
3249676288,3249676543,GB
-3249676544,3249676799,IE
3249676800,3249677055,UA
3249677056,3249677311,SE
-3249677312,3249678847,IE
+3249678336,3249678847,IE
3249679104,3249679359,CH
-3249679360,3249683455,IE
+3249679360,3249682431,IE
3249683456,3249684479,SE
-3249684480,3249698047,IE
+3249684480,3249696767,IE
+3249697280,3249697535,IE
+3249697792,3249698047,IE
3249698048,3249698303,PL
3249698304,3249698559,RU
3249698560,3249698815,HU
@@ -64069,8 +68227,8 @@
3249702144,3249702399,FI
3249702400,3249702655,FR
3249702656,3249702911,RU
-3249702912,3249703679,FR
-3249703680,3249703935,GB
+3249702912,3249703167,FR
+3249703424,3249703679,FR
3249703936,3249704191,FR
3249704192,3249704447,RO
3249704704,3249704959,PL
@@ -64090,7 +68248,6 @@
3249710592,3249710847,BG
3249710848,3249711103,PL
3249711104,3249711359,HU
-3249711360,3249711615,DE
3249711872,3249712127,AT
3249712384,3249712639,GB
3249712896,3249713151,DK
@@ -64113,7 +68270,6 @@
3249723392,3249723647,IT
3249723648,3249723903,GB
3249724160,3249724415,LU
-3249724416,3249724671,IL
3249724672,3249724927,RU
3249724928,3249725183,BG
3249725184,3249725439,GB
@@ -64161,8 +68317,8 @@
3249863424,3249863679,SE
3249863680,3249863935,ES
3249863936,3249865471,SE
-3249865472,3249866751,GB
-3249866752,3249868543,SE
+3249865472,3249865727,GB
+3249865728,3249868543,SE
3249868544,3249868799,DE
3249868800,3249869823,NL
3249869824,3249871103,SE
@@ -64171,9 +68327,7 @@
3249871616,3249871871,NO
3249871872,3249872383,SE
3249872384,3249872639,GB
-3249872640,3249910783,SE
-3249910784,3249911807,GB
-3249911808,3249926143,SE
+3249872640,3249926143,SE
3249926144,3249926399,AU
3249926400,3249926655,SE
3249926656,3249926911,AU
@@ -64182,7 +68336,9 @@
3249929984,3249932287,SE
3249932288,3249934335,US
3249934336,3249934847,IT
-3249934848,3249960447,SE
+3249934848,3249935871,SE
+3249935872,3249936383,DE
+3249936384,3249960447,SE
3249960448,3249960959,DE
3249960960,3249961215,CA
3249961216,3249961471,SE
@@ -64223,7 +68379,13 @@
3250010368,3250010879,CH
3250010880,3250012159,SE
3250012160,3250013183,DE
-3250013184,3250020863,SE
+3250013184,3250014207,SE
+3250014208,3250014719,DE
+3250014720,3250015231,SE
+3250015232,3250015743,FI
+3250015744,3250017791,SE
+3250017792,3250018303,DE
+3250018304,3250020863,SE
3250020864,3250021375,IT
3250021376,3250022399,FR
3250022400,3250023423,SE
@@ -64239,7 +68401,9 @@
3250035456,3250035711,US
3250035712,3250038271,SE
3250038272,3250039295,ES
-3250039296,3250042623,SE
+3250039296,3250039807,SE
+3250039808,3250040319,GB
+3250040320,3250042623,SE
3250042624,3250043135,FR
3250043136,3250061311,SE
3250061312,3250192383,FI
@@ -64254,7 +68418,7 @@
3250194688,3250194943,UA
3250194944,3250195199,RO
3250195456,3250195711,DE
-3250195712,3250196223,GB
+3250195712,3250195967,GB
3250196224,3250196479,UA
3250196480,3250200575,AT
3250200576,3250200831,HU
@@ -64275,7 +68439,7 @@
3250246656,3250247423,AT
3250247680,3250257663,AT
3250257664,3250257919,PL
-3250258176,3250271231,AT
+3250258432,3250271231,AT
3250271232,3250271743,PL
3250271744,3250271999,LB
3250272000,3250272255,GB
@@ -64295,9 +68459,8 @@
3250324480,3250324991,GB
3250324992,3250325247,AE
3250325248,3250325503,MA
-3250325504,3250326527,OM
3250326528,3250327039,BH
-3250327040,3250327551,SA
+3250327040,3250327295,SA
3250331648,3250335743,MT
3250335744,3250339839,KW
3250339840,3250348031,JO
@@ -64312,8 +68475,7 @@
3250357904,3250357919,FR
3250357920,3250357927,PL
3250357928,3250357959,CY
-3250357960,3250357967,GB
-3250357976,3250358015,GB
+3250357984,3250357999,GB
3250358016,3250358527,LB
3250358528,3250358783,HU
3250359296,3250359807,HU
@@ -64325,8 +68487,7 @@
3250372608,3250373631,HU
3250373632,3250374143,DE
3250374144,3250374655,PL
-3250374656,3250374911,SA
-3250374912,3250375679,SE
+3250374656,3250375679,SE
3250375680,3250376703,GB
3250376704,3250380799,AT
3250380800,3250386943,CH
@@ -64390,7 +68551,6 @@
3250588928,3250589183,GB
3250589184,3250589439,DE
3250589504,3250589567,HR
-3250589632,3250589695,NO
3250589696,3250593791,CH
3250593792,3250594815,GB
3250594816,3250595327,UA
@@ -64415,7 +68575,6 @@
3250667520,3250675711,PL
3250675712,3250683903,GB
3250683904,3250692095,CH
-3250692096,3250692351,NO
3250692352,3250692607,NL
3250693376,3250693631,UA
3250693632,3250694143,DE
@@ -64452,12 +68611,11 @@
3250748416,3250749439,UA
3250749440,3250749695,GH
3250749696,3250749951,IT
-3250750208,3250750463,RO
3250750464,3250751487,FR
3250751488,3250751999,DE
3250752000,3250752511,CH
3250752512,3250753023,BG
-3250753024,3250754047,DE
+3250753536,3250754047,DE
3250754048,3250754303,AT
3250754560,3250755071,DE
3250755584,3250755839,FR
@@ -64477,11 +68635,10 @@
3251111168,3251111423,CH
3251111424,3251111679,AT
3251111680,3251111935,ES
-3251111936,3251112191,BG
3251112192,3251112447,SK
3251112448,3251112703,RU
3251112704,3251112959,SE
-3251112960,3251113983,BG
+3251113472,3251113983,BG
3251114496,3251114751,RU
3251114752,3251115007,RO
3251115008,3251115263,PL
@@ -64510,7 +68667,6 @@
3251126784,3251127295,PL
3251127296,3251127807,UA
3251127808,3251128319,NL
-3251128832,3251129343,SE
3251129344,3251129855,UA
3251129856,3251130367,CH
3251130368,3251130879,GB
@@ -64552,7 +68708,6 @@
3251147264,3251147519,PL
3251147520,3251147775,NL
3251147776,3251148031,SE
-3251148032,3251148287,RU
3251148544,3251148799,UA
3251149056,3251149311,NL
3251149312,3251149567,DE
@@ -64567,7 +68722,6 @@
3251152128,3251152639,RO
3251152640,3251152895,UA
3251152896,3251153151,RU
-3251153152,3251153407,UA
3251153408,3251153663,TR
3251153664,3251153919,FR
3251153920,3251154175,DE
@@ -64578,7 +68732,7 @@
3251155456,3251155711,NL
3251155712,3251155967,UA
3251155968,3251156223,TR
-3251156224,3251156735,FR
+3251156480,3251156735,FR
3251156736,3251156991,UA
3251156992,3251157247,FR
3251157248,3251157503,BE
@@ -64589,7 +68743,6 @@
3251158784,3251159295,GB
3251159296,3251159551,DE
3251159808,3251160063,DE
-3251160064,3251160319,JO
3251160320,3251160575,PL
3251160576,3251160831,NL
3251160832,3251161087,RU
@@ -64630,7 +68783,6 @@
3251171840,3251172095,RO
3251172096,3251172351,ES
3251172608,3251172863,GB
-3251172864,3251173119,UA
3251173120,3251173375,SA
3251173376,3251173631,UA
3251173632,3251173887,DE
@@ -64652,7 +68804,6 @@
3251183872,3251184127,CH
3251184128,3251184383,PL
3251184640,3251184895,PL
-3251184896,3251185151,DE
3251185408,3251185663,DK
3251185664,3251185919,IT
3251185920,3251186175,AT
@@ -64660,7 +68811,6 @@
3251186432,3251186687,SE
3251186688,3251186943,RO
3251186944,3251187199,SI
-3251187200,3251187455,GR
3251187456,3251187711,GB
3251187712,3251188735,NL
3251188736,3251189759,DE
@@ -64711,13 +68861,11 @@
3251213312,3251213375,CY
3251213376,3251213439,DE
3251213504,3251213567,NL
-3251213568,3251213631,FR
3251213632,3251213695,PL
3251213760,3251213823,CY
3251213824,3251213887,GB
3251213888,3251214015,CY
3251214080,3251214143,CY
-3251214144,3251214207,AF
3251214272,3251214335,DE
3251214336,3251214463,RU
3251214464,3251214591,UA
@@ -64744,11 +68892,9 @@
3251220224,3251220479,UA
3251220480,3251222527,DE
3251222528,3251224575,GB
-3251225088,3251225599,FR
3251225600,3251226111,GB
3251226112,3251226623,UA
3251226624,3251227135,GB
-3251227136,3251227647,DE
3251227648,3251228159,GB
3251228160,3251228671,UA
3251229696,3251230719,SI
@@ -64759,7 +68905,6 @@
3251234816,3251235839,RO
3251235840,3251236863,DE
3251236864,3251237887,BG
-3251238912,3251239935,FR
3251240960,3251241215,BE
3251241216,3251243007,GB
3251245056,3251245311,DE
@@ -64775,7 +68920,7 @@
3251252736,3251256831,CH
3251256832,3251257343,GB
3251257344,3251259903,BE
-3251260672,3251261439,FR
+3251260416,3251261439,FR
3251261440,3251264255,CH
3251264256,3251265535,FR
3251265536,3251267839,NL
@@ -64805,23 +68950,25 @@
3251302400,3251306495,LI
3251306496,3251306751,AT
3251306752,3251307007,MK
-3251307008,3251307519,RS
3251307520,3251307775,MK
3251307776,3251308031,GB
3251308032,3251308543,RS
-3251310592,3251311103,SI
3251311104,3251311615,RS
3251311616,3251312127,GB
-3251312384,3251312639,CH
-3251312640,3251314687,RS
+3251312384,3251312639,RS
+3251313152,3251313663,RS
3251314688,3251315711,FR
3251315712,3251317759,RU
3251317760,3251318783,PL
3251318784,3251319807,UA
3251320832,3251321855,PL
3251321856,3251322879,RU
-3251322880,3251331327,GB
-3251331328,3251331583,FR
+3251322880,3251331071,GB
+3251331072,3251331262,FR
+3251331263,3251331263,GB
+3251331264,3251331321,FR
+3251331322,3251331322,GB
+3251331323,3251331583,FR
3251331584,3251332095,PL
3251332096,3251333119,RU
3251333120,3251333631,CH
@@ -64850,7 +68997,6 @@
3251362304,3251362815,UA
3251362816,3251363327,NL
3251363328,3251363839,PL
-3251363840,3251364095,MK
3251364096,3251364607,NL
3251364608,3251364863,RO
3251364864,3251366911,IT
@@ -64872,8 +69018,8 @@
3252167680,3252176127,NL
3252176128,3252177919,SE
3252177920,3252178943,HR
-3252178944,3252179455,SE
-3252179456,3252189183,NL
+3252178944,3252179199,SE
+3252179200,3252189183,NL
3252189184,3252190719,SE
3252190720,3252190975,NO
3252190976,3252191231,SE
@@ -64902,8 +69048,8 @@
3252289792,3252291327,GR
3252291584,3252293631,FR
3252293632,3252297727,DE
-3252297984,3252298239,GR
-3252298752,3252308223,GR
+3252298752,3252299007,GR
+3252299776,3252308223,GR
3252308224,3252308479,DE
3252308480,3252310527,GR
3252311040,3252313599,GR
@@ -64919,9 +69065,9 @@
3252318976,3252319231,PL
3252319232,3252319743,AT
3252319744,3252319999,RU
-3252320000,3252320255,GR
3252320256,3252320511,CZ
-3252320768,3252321791,GR
+3252320768,3252321023,GR
+3252321280,3252321791,GR
3252321792,3252322303,PL
3252322304,3252323327,NO
3252323328,3252324351,PL
@@ -64935,9 +69081,7 @@
3252336640,3252337663,UA
3252337664,3252338687,RU
3252338688,3252340735,BE
-3252340736,3252340991,TR
3252341248,3252341503,DE
-3252341504,3252341759,GR
3252342016,3252342079,GB
3252342080,3252342239,CY
3252342240,3252342271,CH
@@ -64948,7 +69092,6 @@
3252342608,3252342655,CY
3252342656,3252342783,IL
3252342784,3252346367,DE
-3252346368,3252346623,GB
3252346624,3252355071,GR
3252355072,3252356351,LT
3252357120,3252358911,LT
@@ -64988,21 +69131,30 @@
3252387584,3252387839,RU
3252387840,3252404223,LT
3252404224,3252405759,NO
-3252405760,3252409663,LT
+3252405760,3252406271,FR
+3252406272,3252407295,NO
+3252407296,3252409663,FR
3252409664,3252409679,CD
-3252409680,3252421631,LT
-3252421632,3252423679,NO
-3252423680,3252448511,LT
+3252409680,3252415487,FR
+3252415488,3252415743,LT
+3252415744,3252420607,FR
+3252420608,3252424703,NO
+3252424704,3252428799,FR
+3252428800,3252429823,NO
+3252429824,3252448511,FR
3252448512,3252448767,NO
-3252448768,3252449791,LT
+3252448768,3252449791,FR
3252449792,3252450047,DK
-3252450048,3252452543,LT
+3252450048,3252452543,FR
3252452544,3252452551,SS
-3252452552,3252455679,LT
+3252452552,3252455679,FR
3252455680,3252455807,BI
-3252455808,3252469759,LT
+3252455808,3252461567,FR
+3252461568,3252469759,NO
3252469760,3252473855,NL
-3252473856,3252486143,LT
+3252473856,3252475903,NO
+3252475904,3252477951,FR
+3252477952,3252486143,NO
3252486144,3252490239,BE
3252490240,3252496127,SE
3252496128,3252496383,AU
@@ -65030,9 +69182,9 @@
3252518656,3252518911,DE
3252518912,3252527103,NL
3252527104,3252535295,BE
-3252540416,3252541951,NL
3252541952,3252542207,CI
-3252542208,3252551679,BE
+3252542208,3252542719,BE
+3252543488,3252551679,BE
3252551680,3252563967,CH
3252563968,3252564479,RU
3252564480,3252564735,GB
@@ -65041,11 +69193,12 @@
3252566016,3252566271,DE
3252566272,3252566527,RO
3252566528,3252566783,RU
-3252566784,3252567295,CH
+3252566784,3252567039,CH
3252567296,3252567551,GB
3252567552,3252567807,RU
3252567808,3252568063,RO
-3252568064,3252579327,CH
+3252568064,3252576255,CH
+3252578816,3252579327,CH
3252579328,3252579583,FR
3252579584,3252579839,RU
3252579840,3252580095,SE
@@ -65120,7 +69273,6 @@
3252913152,3252913407,ES
3252913408,3252913663,FR
3252913664,3252913919,RU
-3252913920,3252914175,NO
3252914176,3252916223,FR
3252916224,3252920319,DE
3252920320,3252928511,LB
@@ -65140,7 +69292,6 @@
3252939264,3252939775,DE
3252940288,3252940799,PT
3252940800,3252941311,RU
-3252941312,3252941823,RO
3252941824,3252942847,GB
3252942848,3252943359,FR
3252943360,3252943871,UA
@@ -65149,7 +69300,7 @@
3252944896,3252945151,AT
3252945152,3252945407,GB
3252945408,3252945663,UA
-3252945664,3252980735,AT
+3252945920,3252976639,AT
3252980992,3252981247,GB
3252981248,3252981503,RU
3252981504,3252981759,SE
@@ -65165,18 +69316,21 @@
3252984832,3252985087,FR
3252985088,3252985343,SE
3252985344,3252985855,RU
-3252985856,3252989439,AT
+3252985856,3252989183,AT
3252989440,3252989695,PL
-3252989696,3253004799,AT
+3252989952,3253004799,AT
3253004800,3253005055,CZ
-3253005056,3253010431,AT
+3253005056,3253006335,AT
+3253006336,3253010431,DE
3253010432,3253075967,FI
3253075968,3253207039,RO
3253207040,3253270527,RU
3253270528,3253271551,BY
3253271552,3253338111,RU
3253338112,3253338367,PL
-3253338368,3253380863,SE
+3253338368,3253380351,SE
+3253380352,3253380607,GB
+3253380608,3253380863,SE
3253380864,3253381119,IT
3253381120,3253383935,SE
3253383936,3253384191,NO
@@ -65184,9 +69338,12 @@
3253388288,3253388799,FR
3253388800,3253389055,SE
3253389056,3253389823,FR
-3253389824,3253395455,SE
+3253389824,3253395199,SE
+3253395200,3253395455,GB
3253395456,3253395967,IT
-3253395968,3253398271,SE
+3253395968,3253397503,SE
+3253397504,3253397759,GB
+3253397760,3253398271,SE
3253398272,3253398783,FR
3253398784,3253399039,SE
3253399040,3253399295,FR
@@ -65200,11 +69357,15 @@
3253403648,3253403903,PL
3253403904,3253409791,SE
3253409792,3253410047,GB
-3253410048,3253412351,SE
+3253410048,3253411327,SE
+3253411328,3253411583,NO
+3253411584,3253412351,SE
3253412352,3253412607,US
3253412608,3253416447,SE
3253416448,3253416703,GB
-3253416704,3253428223,SE
+3253416704,3253419519,SE
+3253419520,3253419775,GB
+3253419776,3253428223,SE
3253428224,3253428479,DE
3253428480,3253429247,SE
3253429248,3253429759,JP
@@ -65222,7 +69383,8 @@
3253436416,3253440511,SE
3253440512,3253440767,FR
3253440768,3253441023,SE
-3253441024,3253441535,AT
+3253441024,3253441279,CL
+3253441280,3253441535,NL
3253441536,3253443839,SE
3253443840,3253444351,NO
3253444352,3253453311,SE
@@ -65266,7 +69428,6 @@
3253627904,3253628927,UA
3253628928,3253629951,GR
3253629952,3253630975,UA
-3253630976,3253631999,RU
3253632000,3253633023,DE
3253633024,3253635071,RU
3253635072,3253636095,IT
@@ -65291,7 +69452,6 @@
3253658624,3253659647,DE
3253659648,3253660671,GB
3253661696,3253662719,NL
-3253662720,3253663743,RO
3253663744,3253664767,NL
3253664768,3253665791,DE
3253665792,3253666815,CZ
@@ -65313,7 +69473,6 @@
3253683200,3253685247,UA
3253685248,3253686271,FR
3253686272,3253687295,PL
-3253687296,3253688319,RU
3253688320,3253690367,NL
3253690368,3253691391,DK
3253691392,3253692415,PL
@@ -65384,8 +69543,14 @@
3253737848,3253737855,HU
3253737856,3253738559,GB
3253738560,3253738567,CZ
-3253738568,3253738575,BE
-3253738576,3253741679,GB
+3253738568,3253738569,BE
+3253738570,3253738570,GB
+3253738571,3253738575,BE
+3253738576,3253739263,GB
+3253739264,3253739519,FR
+3253739520,3253741055,GB
+3253741056,3253741311,BE
+3253741312,3253741679,GB
3253741680,3253741695,RU
3253741696,3253745151,GB
3253745152,3253745279,NO
@@ -65415,7 +69580,13 @@
3253765280,3253765295,NL
3253765296,3253765311,BE
3253765312,3253765375,TR
-3253765376,3253796863,GB
+3253765376,3253767615,GB
+3253767616,3253767679,IE
+3253767680,3253767711,GB
+3253767712,3253767743,DE
+3253767744,3253771199,GB
+3253771200,3253771263,IE
+3253771264,3253796863,GB
3253796864,3253862399,SE
3253862400,3253862655,GB
3253862656,3253882879,FR
@@ -65423,14 +69594,12 @@
3253886976,3253887231,GB
3253887232,3253887487,NL
3253887488,3253887743,ES
-3253887744,3253887999,GB
3253888000,3253888255,PL
3253888256,3253888511,BE
3253888512,3253888767,GB
3253888768,3253889023,SE
3253889024,3253889279,RO
3253889280,3253889535,CH
-3253889536,3253889791,DE
3253889792,3253890047,DK
3253890048,3253890303,NL
3253890560,3253890815,GB
@@ -65465,7 +69634,7 @@
3253901824,3253902079,SI
3253902080,3253902335,DK
3253902336,3253904383,UA
-3253904384,3253904895,GB
+3253904384,3253904895,ES
3253904896,3253905151,UA
3253905152,3253905407,RU
3253905408,3253905919,PL
@@ -65508,23 +69677,37 @@
3253967872,3253968895,UA
3253968896,3253969151,DE
3253969408,3253969919,AT
-3253969920,3253970431,NL
3253970432,3253970687,RU
3253970688,3253970943,UA
3253970944,3253971967,RS
3253971968,3253972991,RU
3253972992,3253974527,GB
-3253974784,3253974847,NO
-3253974848,3253974911,SE
-3253974976,3253975039,SE
+3253974784,3253975039,SE
3253975040,3253977087,DE
3253977088,3253985279,TR
3253985280,3253993471,GB
-3253993472,3254124543,BE
+3253993472,3254001919,BE
+3254001920,3254002175,NL
+3254002176,3254079743,BE
+3254079744,3254079999,HU
+3254080000,3254124543,BE
3254124544,3254255615,CH
-3254255616,3254263807,FR
-3254263808,3254264063,GF
-3254264064,3254488431,FR
+3254255616,3254256127,RE
+3254256128,3254256639,GP
+3254256640,3254257151,YT
+3254257152,3254259455,FR
+3254259456,3254259967,YT
+3254259968,3254260223,GF
+3254260224,3254260479,MQ
+3254260480,3254260991,FR
+3254260992,3254262015,YT
+3254262016,3254262527,FR
+3254262528,3254263039,YT
+3254263040,3254266367,FR
+3254266368,3254266623,RE
+3254266624,3254277119,FR
+3254277120,3254278143,YT
+3254278144,3254488431,FR
3254488432,3254488447,MG
3254488448,3254489407,FR
3254489408,3254489439,MR
@@ -65556,27 +69739,24 @@
3254508800,3254508831,MQ
3254508832,3254521855,FR
3254521856,3254522111,GB
-3254522112,3254607871,FR
-3254607872,3254610175,RE
-3254610176,3254610431,FR
-3254610432,3254610687,RE
-3254610688,3254611455,FR
-3254611456,3254611456,YT
-3254611457,3254611711,FR
-3254611712,3254611712,YT
-3254611713,3254611967,FR
-3254611968,3254612991,RE
-3254612992,3254613247,FR
-3254613248,3254614015,RE
-3254614016,3254614527,FR
-3254614528,3254615039,RE
-3254615040,3254615551,FR
-3254615552,3254615552,YT
-3254615553,3254615807,FR
-3254615808,3254615808,YT
-3254615809,3254648831,FR
-3254648832,3254649087,GB
-3254649088,3254649855,AL
+3254522112,3254608895,FR
+3254608896,3254609151,RE
+3254609152,3254609407,FR
+3254609408,3254609663,RE
+3254609664,3254609919,FR
+3254609920,3254610431,RE
+3254610432,3254610687,FR
+3254610688,3254610943,RE
+3254610944,3254611199,FR
+3254611200,3254611455,RE
+3254611456,3254611967,YT
+3254611968,3254612991,FR
+3254612992,3254613247,RE
+3254613248,3254615039,FR
+3254615040,3254615551,RE
+3254615552,3254616063,YT
+3254616064,3254648831,FR
+3254648832,3254649855,AL
3254649856,3254650879,SE
3254653440,3254654847,DE
3254654848,3254654975,DK
@@ -65584,7 +69764,9 @@
3254656256,3254656511,BG
3254656512,3254656767,DE
3254656768,3254657023,GB
-3254657024,3254665215,RO
+3254657024,3254661119,ES
+3254661120,3254664959,RO
+3254664960,3254665215,GB
3254681600,3254697983,DE
3254697984,3254698495,SE
3254698496,3254699007,GB
@@ -65638,6 +69820,7 @@
3254788352,3254789119,ES
3254789120,3254789375,FR
3254789376,3254789631,BE
+3254789890,3254789890,TK
3254790656,3254790911,LU
3254790912,3254791423,BE
3254791424,3254791679,SK
@@ -65698,7 +69881,6 @@
3254822144,3254822399,DE
3254822400,3254822655,FR
3254822656,3254822911,PL
-3254822912,3254823167,CH
3254823168,3254823423,NO
3254823424,3254823679,NL
3254823680,3254823935,PL
@@ -65729,7 +69911,6 @@
3254832128,3254832383,RO
3254832384,3254832639,BE
3254832640,3254832895,UA
-3254832896,3254833151,LV
3254833152,3254833407,DE
3254833408,3254833663,RU
3254833664,3254833919,GB
@@ -65759,7 +69940,6 @@
3254841344,3254841599,PL
3254841600,3254841855,IE
3254841856,3254842111,LV
-3254842624,3254842879,RU
3254842880,3254843135,SE
3254843136,3254843391,DE
3254843648,3254843903,FR
@@ -65831,7 +70011,6 @@
3254901760,3254902271,UA
3254902272,3254904831,SK
3254904832,3254907903,RU
-3254907904,3254908159,SK
3254908160,3254908415,CH
3254908416,3254908671,PL
3254908672,3254908927,MT
@@ -65841,34 +70020,34 @@
3254910976,3255044095,FR
3255044608,3255056383,FR
3255058432,3255067647,FR
-3255068672,3255114751,FR
+3255068672,3255081727,FR
+3255081984,3255114751,FR
3255115264,3255117823,FR
-3255118336,3255120127,FR
+3255118336,3255119871,FR
3255120384,3255120639,FR
3255120640,3255120895,DE
-3255120896,3255123711,FR
+3255120896,3255121919,FR
+3255123200,3255123711,FR
3255123712,3255123967,DE
-3255123968,3255127551,FR
+3255123968,3255124991,FR
+3255126016,3255127551,FR
3255127808,3255128575,FR
3255129856,3255130111,HR
-3255130112,3255146495,FR
+3255130112,3255134207,FR
+3255135232,3255140351,FR
+3255141376,3255146495,FR
3255148544,3255153151,FR
-3255153664,3255166975,FR
-3255167488,3255172351,FR
+3255153664,3255153919,FR
+3255154176,3255164927,FR
+3255166720,3255166975,FR
+3255167488,3255167743,FR
+3255168512,3255169279,FR
3255172352,3255172607,DE
3255172608,3255173119,FR
3255173120,3255173631,SH
3255173648,3255173711,GB
3255173760,3255173823,GB
-3255173840,3255174151,GB
-3255174160,3255174167,GB
-3255174200,3255174207,GB
-3255174216,3255174247,GB
-3255174272,3255174279,GB
-3255174312,3255174319,GB
-3255174328,3255174335,GB
-3255174376,3255174383,GB
-3255174400,3255175167,GB
+3255173840,3255175167,GB
3255175200,3255175231,GB
3255175248,3255175263,GB
3255175280,3255175295,GB
@@ -65936,7 +70115,7 @@
3255304192,3255304447,DE
3255304448,3255305215,LV
3255305216,3255305471,BG
-3255305472,3255307775,LV
+3255305472,3255307263,LV
3255307776,3255308031,PL
3255308032,3255308287,CH
3255308288,3255311359,LV
@@ -66056,7 +70235,6 @@
3255488512,3255489535,AT
3255492608,3255496703,GB
3255498752,3255500799,FR
-3255500800,3255504895,CH
3255504896,3255505151,RU
3255505152,3255505663,GB
3255505920,3255506431,RU
@@ -66067,7 +70245,9 @@
3255507712,3255507967,AT
3255507968,3255508223,UA
3255508224,3255508479,RU
-3255508480,3255544319,CH
+3255508480,3255522303,CH
+3255523328,3255529471,CH
+3255533568,3255544319,CH
3255544320,3255544575,DE
3255544576,3255544831,AT
3255544832,3255558143,CH
@@ -66076,7 +70256,7 @@
3255562240,3255563263,CH
3255563776,3255564031,CH
3255564032,3255564287,RU
-3255564288,3255565311,CH
+3255564288,3255564543,CH
3255565312,3255565955,DE
3255565956,3255565956,CH
3255565957,3255566079,DE
@@ -66088,9 +70268,11 @@
3255599104,3255615487,CH
3255615488,3255623679,DE
3255623680,3255631871,BG
-3255631872,3255660287,NL
+3255631872,3255649279,NL
+3255650304,3255660287,NL
3255660288,3255660543,GR
-3255660544,3255666431,NL
+3255660544,3255663615,NL
+3255664640,3255666175,NL
3255666432,3255666687,DE
3255666688,3255697407,NL
3255697408,3255710719,SE
@@ -66104,25 +70286,34 @@
3255743232,3255743487,IT
3255743488,3255743743,DE
3255743744,3255743999,US
-3255744000,3255762943,SE
+3255744000,3255745535,SE
+3255745536,3255745791,DK
+3255745792,3255752959,SE
+3255752960,3255753215,LI
+3255753216,3255762943,SE
3255762944,3255771135,DE
-3255779328,3255791615,DE
+3255779328,3255782655,DE
+3255783424,3255791615,DE
3255791616,3255792639,UA
3255792640,3255793663,RU
3255793664,3255794943,PL
3255794944,3255795711,RU
-3255795712,3255799039,DE
+3255795712,3255798783,DE
3255799040,3255799295,SE
3255799296,3255800575,DE
3255800576,3255800831,UA
3255800832,3255801855,DE
-3255802368,3255817215,DE
+3255802368,3255802623,DE
+3255802880,3255817215,DE
3255817216,3255817471,SE
3255817472,3255817727,ES
3255817728,3255820287,DE
3255821312,3255822335,CH
-3255822336,3255828479,DE
-3255828480,3256025087,SE
+3255822336,3255826943,DE
+3255827456,3255828479,DE
+3255828480,3255939623,SE
+3255939624,3255939624,GB
+3255939625,3256025087,SE
3256025088,3256057855,NO
3256057856,3256082431,DK
3256082432,3256090623,LV
@@ -66161,7 +70352,6 @@
3256415232,3256415743,PL
3256415744,3256416255,UA
3256416256,3256416767,RS
-3256417024,3256417279,GB
3256417280,3256417791,NO
3256417792,3256418303,GB
3256418304,3256483839,DE
@@ -66169,13 +70359,16 @@
3256489472,3256489983,GR
3256489984,3256490239,BE
3256490496,3256490751,CH
-3256490752,3256511487,NL
+3256490752,3256502271,NL
+3256503296,3256509439,NL
+3256510464,3256511487,NL
3256511744,3256513023,NL
-3256513280,3256524287,NL
+3256513536,3256522239,NL
+3256522752,3256524287,NL
3256524288,3256524799,DE
-3256524800,3256528895,NL
-3256530688,3256530943,DE
-3256530944,3256549375,NL
+3256524800,3256526847,NL
+3256530944,3256531967,NL
+3256532992,3256549375,NL
3256549376,3256614911,TR
3256614912,3256615935,FI
3256615936,3256616959,UA
@@ -66233,6 +70426,7 @@
3256692736,3256693759,GR
3256694784,3256695807,DE
3256695808,3256696831,UA
+3256698368,3256698623,NL
3256699392,3256699647,GB
3256705024,3256705279,IE
3256705536,3256705791,BE
@@ -66254,7 +70448,6 @@
3256745984,3256778751,ES
3256778752,3256786943,CY
3256786944,3256787199,NL
-3256787200,3256787455,RO
3256787456,3256787711,DE
3256787712,3256787967,UA
3256787968,3256788223,PL
@@ -66298,25 +70491,32 @@
3256827136,3256827391,IS
3256827392,3256827647,GB
3256827648,3256827903,PL
-3256827904,3256864511,DE
+3256827904,3256844287,DE
+3256860672,3256863743,DE
+3256864256,3256864511,DE
3256864512,3256864767,CH
-3256864768,3256870911,DE
+3256864768,3256866815,DE
+3256867840,3256870911,DE
3256870912,3256871167,RU
3256871168,3256871935,DE
-3256872448,3256874239,DE
-3256874496,3256875007,DE
+3256872448,3256873983,DE
+3256874496,3256874751,DE
3256875008,3256875519,UA
3256875520,3256876031,RU
3256876032,3256876287,PL
3256876288,3256876543,RU
3256876544,3256876799,CH
-3256877056,3256898559,GB
+3256877056,3256896511,GB
+3256898048,3256898303,GB
3256898560,3256899071,TR
3256899072,3256899583,RU
-3256899584,3256915455,GB
+3256899584,3256901631,GB
+3256905216,3256905471,GB
+3256909824,3256915455,GB
3256915456,3256915711,RS
3256915712,3256915967,SE
-3256915968,3256945663,GB
+3256915968,3256944639,GB
+3256944896,3256945151,GB
3256945664,3256945919,SI
3256945920,3256946175,GB
3256946176,3256946431,RO
@@ -66352,8 +70552,7 @@
3256973312,3256973823,DE
3256973824,3256975359,IR
3256975360,3256988671,GB
-3256988672,3256988927,RU
-3256988928,3256989183,UA
+3256988672,3256989183,UA
3256989440,3256989695,GB
3256989696,3256989951,HU
3256989952,3256990207,PL
@@ -66367,13 +70566,21 @@
3257011456,3257024511,GB
3257024512,3257032703,AU
3257032704,3257040895,GB
-3257042944,3257051135,GB
-3257052160,3257057279,GB
+3257042944,3257043711,GB
+3257043968,3257051135,GB
+3257052160,3257052927,GB
+3257053184,3257057279,GB
3257058816,3257059071,PL
-3257059072,3257092607,GB
+3257059328,3257065471,GB
+3257073664,3257092351,GB
3257092608,3257092863,RO
-3257092864,3257121535,GB
-3257121792,3257139199,GB
+3257092864,3257093119,GB
+3257093632,3257094143,GB
+3257094656,3257095167,GB
+3257097472,3257097983,GB
+3257098240,3257131007,GB
+3257135104,3257137151,GB
+3257138176,3257139199,GB
3257139200,3257139455,DK
3257139456,3257143295,GB
3257143296,3257143807,RU
@@ -66383,9 +70590,8 @@
3257144576,3257144831,GB
3257144832,3257145087,FR
3257145088,3257145343,GB
-3257146112,3257146367,GB
3257147392,3257163775,GB
-3257167872,3257169919,GB
+3257167872,3257168895,GB
3257170176,3257176063,GB
3257178112,3257180159,GB
3257180160,3257180415,TR
@@ -66396,58 +70602,63 @@
3257181440,3257181695,PL
3257181696,3257181951,FR
3257182208,3257182463,PL
-3257182464,3257186303,GB
-3257188352,3257196543,GB
+3257182720,3257183231,GB
+3257184256,3257186303,GB
+3257192448,3257196543,GB
3257196544,3257200639,LU
3257200640,3257204735,GB
3257204736,3257225215,AT
-3257226240,3257227263,AT
+3257226240,3257227263,DE
3257229312,3257268223,AT
3257268224,3257268479,UA
3257268480,3257268735,SE
-3257268736,3257269247,AT
+3257268992,3257269247,AT
3257269248,3257269503,IT
-3257269504,3257270015,AT
+3257269504,3257269759,AT
3257270016,3257270271,DE
3257286656,3257294847,CH
3257294848,3257303039,HU
3257303040,3257311231,PT
3257311232,3257335807,CH
-3257335808,3257355775,DE
-3257356288,3257357311,DE
+3257335808,3257343999,DE
+3257348096,3257355775,DE
+3257356288,3257356799,DE
3257357312,3257357567,PT
3257357568,3257357823,SI
-3257357824,3257371903,DE
+3257357824,3257363455,DE
+3257364480,3257371903,DE
3257371904,3257372159,BE
3257372416,3257372671,GB
-3257372672,3257382911,DE
+3257372672,3257381375,DE
+3257381888,3257382911,DE
3257382912,3257383167,NL
3257383168,3257383679,DE
-3257383936,3257388799,DE
-3257388800,3257389055,FR
-3257389056,3257390079,DE
-3257390592,3257401343,DE
+3257383936,3257387007,DE
+3257388544,3257388799,DE
+3257390592,3257390847,DE
+3257391104,3257395199,DE
+3257396480,3257396735,DE
+3257397248,3257401343,DE
3257401344,3257453567,CH
3257453568,3257454591,RO
3257454592,3257455103,IT
3257455104,3257455359,RO
3257455360,3257455615,SI
-3257455616,3257466879,CH
+3257455616,3257461759,CH
+3257462016,3257462271,CH
+3257462784,3257466879,CH
3257466880,3257467135,DE
3257467392,3257467903,SE
3257467904,3257468927,IT
3257469184,3257469439,IT
-3257469440,3257469951,GB
3257469952,3257470975,PL
3257470976,3257471999,FI
3257472000,3257472511,SG
3257472512,3257475071,FI
-3257476096,3257477119,DE
-3257480192,3257480447,GB
+3257476864,3257477119,DE
3257481216,3257481471,GB
3257481472,3257481727,DE
3257481728,3257481983,FI
-3257481984,3257482239,FR
3257482240,3257482751,RO
3257482752,3257483007,NL
3257483008,3257491455,CH
@@ -66468,9 +70679,11 @@
3257546688,3257546719,DE
3257546720,3257546751,DK
3257546752,3257548799,IE
-3257548800,3257555199,GB
-3257555200,3257555455,CH
-3257555456,3257556991,GB
+3257548800,3257551623,GB
+3257551624,3257551647,BE
+3257551648,3257551711,GB
+3257551712,3257551719,BE
+3257551720,3257556991,GB
3257557504,3257558015,LU
3257558016,3257559039,RO
3257559552,3257560063,UA
@@ -66505,23 +70718,43 @@
3257742336,3257743359,DE
3257743360,3257748479,NL
3257748480,3257749503,DE
-3257749504,3257753087,NL
-3257753088,3257753343,DE
-3257753344,3257759631,NL
-3257759632,3257759639,DE
-3257759640,3257765887,NL
+3257749504,3257765887,NL
3257765888,3257767935,DE
3257767936,3257782271,NL
3257782272,3257784319,DE
3257784320,3257794559,NL
3257794560,3257835519,GB
-3257835520,3257843711,IE
-3257843712,3257844735,GB
-3257844736,3257860095,IE
+3257835520,3257836287,IE
+3257836288,3257836543,GB
+3257836544,3257836799,IE
+3257836800,3257837055,GB
+3257837056,3257837311,IE
+3257837312,3257837567,GB
+3257837568,3257837823,IE
+3257837824,3257838335,GB
+3257838336,3257838591,IE
+3257838592,3257839103,GB
+3257839104,3257839359,IE
+3257839360,3257839615,GB
+3257839616,3257839871,IE
+3257839872,3257840127,GB
+3257840128,3257840383,IE
+3257840384,3257840639,GB
+3257840640,3257840895,IE
+3257840896,3257841151,GB
+3257841152,3257841407,IE
+3257841408,3257841663,GB
+3257841664,3257841919,IE
+3257841920,3257842943,GB
+3257842944,3257843199,IE
+3257843200,3257843711,GB
+3257843712,3257860095,IE
3257860096,3257925631,SE
3257925632,3257925887,AT
3257925888,3257926143,SE
-3257926144,3257977855,AT
+3257926144,3257926399,AT
+3257926656,3257970687,AT
+3257972736,3257977855,AT
3257977856,3257978111,GB
3257978112,3257978367,SE
3257978368,3257978623,BG
@@ -66529,7 +70762,6 @@
3257978880,3257979135,FR
3257979136,3257979391,UA
3257979392,3257979647,GB
-3257979648,3257979903,DE
3257979904,3257980159,UA
3257980160,3257980415,SE
3257980416,3257980671,NL
@@ -66538,15 +70770,18 @@
3257981184,3257981439,GB
3257981440,3257981695,RU
3257981696,3257981951,PL
-3257981952,3257987327,AT
+3257986048,3257987327,AT
3257987328,3257987583,CZ
-3257987584,3257988095,AT
-3257989120,3257991167,AT
-3257991168,3257995519,DE
+3257987840,3257988095,AT
+3257990656,3257990911,AT
+3257991168,3257995263,DE
3257996032,3258003967,DE
3258003968,3258004479,RU
-3258004480,3258018815,DE
-3258019328,3258021887,DE
+3258004992,3258005503,DE
+3258006528,3258016767,DE
+3258017792,3258018815,DE
+3258019328,3258019583,DE
+3258019840,3258021887,DE
3258021888,3258022911,RU
3258022912,3258023167,PL
3258023168,3258023423,DE
@@ -66555,12 +70790,12 @@
3258023936,3258056703,DE
3258057216,3258057471,CZ
3258058240,3258058495,RU
-3258058496,3258059007,RO
+3258058496,3258058751,RO
3258059008,3258059263,UA
3258059264,3258059519,RU
3258059520,3258059775,RO
3258062848,3258063103,RU
-3258063104,3258063871,CZ
+3258063360,3258063871,CZ
3258063872,3258064127,AT
3258064128,3258064383,FR
3258064384,3258065151,GB
@@ -66583,7 +70818,6 @@
3258070528,3258071295,GB
3258071296,3258071551,DK
3258071552,3258071807,DE
-3258071808,3258072063,GB
3258072064,3258072319,FR
3258072320,3258072575,PL
3258072576,3258072831,BE
@@ -66622,7 +70856,6 @@
3258084352,3258084607,GB
3258084608,3258084863,AT
3258084864,3258085119,PL
-3258085120,3258085375,LT
3258085376,3258085631,NL
3258085632,3258085887,DE
3258085888,3258086143,UA
@@ -66672,18 +70905,18 @@
3258103040,3258103295,SE
3258103296,3258103551,DE
3258103552,3258103807,AE
-3258104064,3258104319,GB
3258104320,3258104575,PL
3258104576,3258104831,DE
-3258105088,3258105599,CZ
+3258105088,3258105343,CZ
3258105600,3258105855,DE
3258105856,3258109951,CZ
3258109952,3258110207,DK
-3258110208,3258111487,CZ
+3258110208,3258110975,CZ
+3258111232,3258111487,CZ
3258111488,3258111743,PL
3258111744,3258118399,CZ
3258118400,3258118655,UA
-3258118656,3258119679,CZ
+3258118656,3258118911,CZ
3258120192,3258120703,CZ
3258121216,3258121471,PL
3258121728,3258121983,UA
@@ -66693,16 +70926,18 @@
3258230784,3258232831,NO
3258232832,3258249215,SE
3258249216,3258253311,NO
-3258253312,3258272767,NL
+3258253312,3258269695,NL
+3258271744,3258272767,NL
3258272768,3258273791,FR
-3258273792,3258279935,NL
-3258281984,3258284031,NL
-3258284288,3258290175,NL
+3258273792,3258275071,NL
+3258275840,3258286079,NL
+3258286592,3258288127,NL
3258294272,3258297343,NL
3258297344,3258297599,BE
3258297600,3258298111,NL
3258298112,3258298367,GB
-3258298368,3258318847,NL
+3258298368,3258302463,NL
+3258306560,3258318847,NL
3258318848,3258320895,DE
3258320896,3258321919,GB
3258321920,3258322943,RU
@@ -66719,7 +70954,6 @@
3258343424,3258351615,NO
3258351616,3258352639,RO
3258352640,3258353663,RU
-3258353664,3258354687,NO
3258354688,3258355711,BG
3258355712,3258356735,NL
3258356736,3258357759,RU
@@ -66733,14 +70967,19 @@
3258366976,3258367999,PL
3258368000,3258384383,KW
3258384384,3258385407,DE
-3258386432,3258411007,DE
-3258411520,3258427647,DE
+3258388480,3258395647,DE
+3258396672,3258423295,DE
+3258424320,3258424575,DE
+3258424832,3258426367,DE
3258427648,3258427903,RO
3258427904,3258428159,DE
-3258428416,3258449919,DE
-3258449920,3258486783,CH
+3258428416,3258444799,DE
+3258445824,3258449919,DE
+3258449920,3258468351,CH
+3258474496,3258486783,CH
3258486784,3258487807,LI
-3258487808,3258503935,CH
+3258488832,3258495999,CH
+3258499072,3258503935,CH
3258503936,3258504191,PL
3258504192,3258504703,CH
3258504704,3258504959,DE
@@ -66750,11 +70989,15 @@
3258507008,3258515455,CH
3258515456,3258580991,FR
3258580992,3258646527,RU
-3258646528,3258691583,DE
+3258646528,3258654719,DE
+3258655232,3258659839,DE
+3258660864,3258681343,DE
+3258683136,3258689023,DE
+3258689536,3258690047,DE
+3258690560,3258691583,DE
3258691840,3258692351,AT
3258692352,3258692607,DE
3258692608,3258692863,FR
-3258692864,3258693119,DE
3258693120,3258693375,SI
3258693376,3258693631,DE
3258693632,3258693887,RU
@@ -66780,10 +71023,10 @@
3258732544,3258732799,SE
3258732800,3258733055,CH
3258733056,3258733311,RO
-3258733312,3258734591,GB
+3258733312,3258734079,GB
3258735104,3258735359,GB
3258736640,3258745855,GB
-3258746880,3258762751,GB
+3258746880,3258762239,GB
3258763264,3258764287,GB
3258764288,3258764543,DE
3258764800,3258765055,BE
@@ -66802,7 +71045,8 @@
3258776064,3258776319,GE
3258776320,3258776575,PL
3258776576,3258777599,UA
-3258777600,3258789887,GB
+3258777600,3258784255,GB
+3258784768,3258789887,GB
3258789888,3258790911,CZ
3258790912,3258792191,RU
3258792192,3258792447,PL
@@ -66813,20 +71057,23 @@
3258794496,3258794751,PL
3258794752,3258795007,RU
3258795008,3258796031,PL
-3258796032,3258802175,GB
+3258797056,3258797311,GB
+3258797568,3258802175,GB
3258802176,3258806271,LU
-3258806272,3258813439,GB
-3258814464,3258818047,GB
+3258806272,3258810367,GB
+3258812416,3258813439,GB
3258818048,3258818303,SE
-3258818560,3258843135,GB
+3258818560,3258834943,GB
+3258839040,3258843135,GB
3258843136,3258843391,RU
-3258843648,3258847231,GB
+3258844928,3258847231,GB
3258848256,3258848767,GB
3258848768,3258849023,RO
3258849024,3258849279,DE
3258849280,3258859519,GB
3258859520,3258859775,BY
-3258859776,3258900479,GB
+3258859776,3258860031,GB
+3258860288,3258900479,GB
3258901504,3258902783,GB
3258903040,3258903295,FR
3258903296,3258903551,GB
@@ -66850,16 +71097,15 @@
3259226112,3259227391,RU
3259227392,3259227647,KZ
3259227648,3259236351,RU
-3259236352,3259236863,SE
-3259236864,3259237119,CH
-3259237120,3259237887,SE
+3259236352,3259237887,SE
3259237888,3259238143,FR
3259238144,3259243007,SE
3259243008,3259243519,AT
3259243520,3259244543,US
3259244544,3259246591,SE
3259246592,3259247615,IT
-3259247616,3259248127,SE
+3259247616,3259247871,LI
+3259247872,3259248127,SE
3259248128,3259248383,GB
3259248384,3259248895,SE
3259248896,3259249151,GB
@@ -66881,7 +71127,9 @@
3259285760,3259286015,GB
3259286016,3259290879,SE
3259290880,3259291135,US
-3259291136,3259297535,SE
+3259291136,3259293951,SE
+3259293952,3259294207,LI
+3259294208,3259297535,SE
3259297536,3259297791,GB
3259297792,3259301887,SE
3259301888,3259302143,DE
@@ -66912,7 +71160,9 @@
3259438080,3259438335,ES
3259438336,3259457279,SE
3259457280,3259457535,IT
-3259457536,3259470847,SE
+3259457536,3259466239,SE
+3259466240,3259466495,LI
+3259466496,3259470847,SE
3259470848,3259471871,US
3259471872,3259479807,SE
3259479808,3259480063,DK
@@ -66920,20 +71170,25 @@
3259480832,3259481087,ES
3259481088,3259490303,SE
3259490304,3259490815,IN
-3259490816,3259498495,SE
+3259490816,3259491071,SE
+3259491072,3259491327,LI
+3259491328,3259498495,SE
3259498496,3259541503,GB
3259541504,3259543551,NL
3259543552,3259760639,GB
-3259760640,3259814399,DE
+3259761152,3259767295,DE
+3259768064,3259787263,DE
+3259787776,3259789311,DE
+3259791360,3259814399,DE
3259814400,3259814655,AT
3259814656,3259816447,DE
3259816704,3259821055,DE
3259821824,3259822079,AT
-3259822080,3259823103,DE
+3259822592,3259823103,DE
3259823104,3259823615,RO
3259823616,3259823871,NO
3259823872,3259824127,IE
-3259824128,3259825919,DE
+3259824128,3259825663,DE
3259826176,3259891711,DE
3259891712,3259957247,BE
3259957248,3259958271,DE
@@ -66976,12 +71231,10 @@
3260549120,3260549375,AT
3260549376,3260549631,CH
3260549632,3260549887,DE
-3260550144,3260550399,PL
-3260550400,3260550655,DE
3260550656,3260551167,RU
3260551168,3260553983,DE
3260553984,3260554239,GB
-3260554240,3260555263,SE
+3260554240,3260555263,CH
3260555264,3260563455,HU
3260563456,3260571647,GB
3260571648,3260579839,BE
@@ -67030,8 +71283,7 @@
3260678144,3260743679,IL
3260743680,3260809215,IT
3260809216,3260874751,PL
-3260891136,3260893439,DK
-3260893440,3260894207,SE
+3260893184,3260894207,SE
3260894208,3260895231,AT
3260895232,3260898303,SE
3260898304,3260899327,ES
@@ -67041,7 +71293,7 @@
3260900608,3260901119,NL
3260901120,3260903423,DE
3260903424,3260906239,CH
-3260906240,3260906495,DE
+3260906368,3260906495,DE
3260906496,3260907519,PL
3260907520,3260915711,GB
3260915712,3260923903,UA
@@ -67056,8 +71308,9 @@
3261202432,3261213439,FR
3261213440,3261213695,AF
3261213696,3261267967,FR
-3261267968,3261281023,DE
-3261281280,3261297663,DE
+3261267968,3261280767,DE
+3261281280,3261282559,DE
+3261283328,3261297663,DE
3261297664,3261297919,RU
3261297920,3261298175,PL
3261298176,3261333503,DE
@@ -67072,11 +71325,14 @@
3261534720,3261534975,US
3261534976,3261539327,SE
3261539328,3261540351,SG
-3261540352,3261595647,SE
+3261540352,3261554175,SE
+3261554176,3261554431,DK
+3261554432,3261595647,SE
3261595648,3261599743,NL
-3261600768,3261627903,NL
-3261628160,3261632511,NL
-3261633536,3261636095,NL
+3261600768,3261624831,NL
+3261625344,3261625855,NL
+3261626368,3261632511,NL
+3261634048,3261636095,NL
3261636352,3261643775,NL
3261644800,3261661183,NL
3261661184,3261669375,RO
@@ -67088,9 +71344,7 @@
3261677568,3261685759,GB
3261685760,3261687807,DE
3261687808,3261689855,RO
-3261689856,3261690623,GB
-3261690624,3261690879,AU
-3261690880,3261691903,GB
+3261689856,3261691903,GB
3261691904,3261692997,NL
3261692998,3261692998,US
3261692999,3261694463,NL
@@ -67143,14 +71397,17 @@
3261797632,3261797887,RU
3261797888,3261798143,TR
3261798144,3261798399,RU
-3261798400,3261812735,AT
+3261798400,3261805567,AT
+3261805568,3261806591,DE
+3261806592,3261810687,AT
3261812736,3261812991,RU
-3261812992,3261816575,AT
+3261812992,3261815807,AT
+3261816064,3261816575,AT
3261816576,3261816831,DE
3261816832,3261820927,AT
3261820928,3261821183,RO
3261821184,3261821439,AT
-3261821440,3261821695,NL
+3261821440,3261821695,GB
3261821696,3261821951,UA
3261821952,3261822207,RU
3261822208,3261822463,UA
@@ -67163,21 +71420,18 @@
3261824000,3261824255,RU
3261824512,3261824767,FR
3261824768,3261825023,PT
-3261825024,3261837311,AT
-3261839360,3261855743,AT
+3261825280,3261827071,AT
+3261828096,3261855743,AT
3261857792,3261923327,CZ
3261923328,3261988863,NL
3261988864,3261989119,SE
-3261989120,3261989631,FI
-3261990144,3261990399,FI
3261990400,3261990655,UA
-3261990656,3261990911,FI
-3261992448,3261993215,FI
3261993472,3261993727,RU
-3261993728,3261995263,FI
+3261993728,3261993983,FI
+3261994752,3261995263,FI
3261995264,3261995519,DE
3261995520,3261995775,PL
-3261995776,3262005247,FI
+3261996800,3262005247,FI
3262005248,3262005759,PL
3262005760,3262006015,RU
3262006016,3262006271,NL
@@ -67191,20 +71445,16 @@
3262008576,3262008831,PL
3262008832,3262009087,AT
3262009088,3262009343,UA
-3262009344,3262010367,FI
-3262011392,3262013439,FI
+3262010112,3262010367,FI
3262013440,3262017535,SE
-3262017536,3262018559,FI
3262018560,3262018815,PL
-3262018816,3262019071,FI
-3262020096,3262021119,FI
3262021120,3262021375,UA
3262021376,3262021631,PL
3262021632,3262021887,CH
3262021888,3262022143,UA
3262022912,3262023167,DE
3262023680,3262023935,DK
-3262023936,3262025727,FI
+3262025216,3262025471,FI
3262027264,3262027519,TR
3262027520,3262027775,BE
3262027776,3262028287,RU
@@ -67213,7 +71463,6 @@
3262028800,3262029823,DE
3262029824,3262030847,NL
3262030848,3262031871,FR
-3262031872,3262033919,FI
3262033920,3262038015,AX
3262038016,3262038271,FR
3262038272,3262038527,RU
@@ -67292,15 +71541,17 @@
3262151936,3262152191,DE
3262152664,3262152671,DE
3262152704,3262185471,AT
-3262185472,3262191615,DE
-3262192128,3262192383,DE
-3262192640,3262196479,DE
-3262196736,3262203903,DE
-3262204928,3262224383,DE
+3262185472,3262194175,DE
+3262195712,3262196223,DE
+3262197760,3262200319,DE
+3262200576,3262201087,DE
+3262201856,3262224383,DE
3262224896,3262225151,AT
-3262225152,3262227711,DE
+3262226432,3262227455,DE
3262227712,3262227967,RO
-3262227968,3262229247,DE
+3262227968,3262228223,DE
+3262228480,3262228735,DE
+3262228992,3262229247,DE
3262229248,3262229503,NL
3262229504,3262248191,DE
3262248448,3262283775,DE
@@ -67376,7 +71627,6 @@
3262461312,3262461439,NO
3262461440,3262461567,DE
3262461568,3262461695,GB
-3262461696,3262461823,UA
3262461824,3262461951,RO
3262461952,3262463999,IQ
3262464000,3262472191,RU
@@ -67479,18 +71729,14 @@
3262479428,3262479428,FR
3262479429,3262479654,DE
3262479655,3262479655,NL
-3262479656,3262479751,DE
-3262479752,3262479752,CH
-3262479753,3262480282,DE
+3262479656,3262480282,DE
3262480283,3262480283,GB
-3262480284,3262480316,DE
-3262480317,3262480317,NL
+3262480284,3262480317,DE
3262480318,3262480318,IT
3262480319,3262480383,DE
3262480384,3262488575,GB
3262488576,3262496767,SE
3262496768,3262504959,FR
-3262504960,3262505471,DE
3262505472,3262505983,GB
3262505984,3262506495,PL
3262506496,3262507007,RO
@@ -67502,11 +71748,7 @@
3262511104,3262511615,GB
3262512128,3262512639,UA
3262512640,3262513151,DE
-3262513152,3262550271,AT
-3262550272,3262550527,DE
-3262550528,3262562815,AT
-3262562816,3262563071,HU
-3262563072,3262578687,AT
+3262513152,3262578687,AT
3262578688,3262611455,FR
3262611456,3262627839,GB
3262627840,3262636031,IT
@@ -67515,19 +71757,17 @@
3262648320,3262648575,DE
3262648576,3262654463,NL
3262654464,3262654719,DE
-3262654720,3262658967,NL
-3262658968,3262658975,DE
-3262658976,3262664703,NL
-3262664704,3262670847,DE
+3262654720,3262664703,NL
+3262664704,3262665736,DE
+3262665737,3262665737,CH
+3262665738,3262670847,DE
3262670848,3262690815,NL
3262690816,3262691583,DE
3262691584,3262693375,NL
3262693376,3262701567,DE
3262701568,3262715135,NL
3262715136,3262715391,DE
-3262715392,3262718463,NL
-3262718464,3262718471,DE
-3262718472,3262722815,NL
+3262715392,3262722815,NL
3262722816,3262723071,DE
3262723072,3262732799,NL
3262732800,3262733055,DE
@@ -67536,9 +71776,13 @@
3262754816,3262832639,NL
3262832640,3262840319,DE
3262840320,3262906367,NL
-3262906368,3262954495,CH
+3262906368,3262914559,CH
+3262922752,3262954495,CH
3262954496,3262955519,LI
-3262955520,3262964991,CH
+3262955520,3262958591,CH
+3262959360,3262960127,CH
+3262960640,3262960895,CH
+3262961408,3262964991,CH
3262964992,3262965247,DE
3262965248,3262971903,CH
3262971904,3263029247,IE
@@ -67557,7 +71801,6 @@
3263062016,3263070207,EE
3263070208,3263070719,FR
3263070720,3263070975,NL
-3263070976,3263071487,DE
3263072256,3263074303,LB
3263074304,3263074815,CH
3263074816,3263075327,RO
@@ -67573,7 +71816,7 @@
3263085568,3263086591,CH
3263086592,3263086847,DK
3263086848,3263087103,NL
-3263087104,3263087871,DE
+3263087360,3263087871,DE
3263087872,3263088127,SI
3263088128,3263088383,DE
3263088384,3263088639,LV
@@ -67589,7 +71832,6 @@
3263091456,3263091711,NO
3263091712,3263091967,FI
3263091968,3263092479,HR
-3263092480,3263092735,ES
3263092736,3263092991,PL
3263092992,3263093247,FR
3263093248,3263093503,CH
@@ -67599,12 +71841,12 @@
3263094784,3263095039,UA
3263095040,3263095295,ES
3263095296,3263095551,FR
-3263095552,3263095807,RO
3263095808,3263096063,DE
3263096064,3263096319,PL
3263096320,3263096575,TR
3263096576,3263096831,SA
3263096832,3263097087,PL
+3263097088,3263097343,FR
3263097344,3263097599,DK
3263097600,3263097855,NL
3263097856,3263098111,FR
@@ -67632,7 +71874,7 @@
3263104042,3263121420,DE
3263121421,3263121421,BE
3263121422,3263131647,DE
-3263132672,3263137791,DE
+3263133696,3263137791,DE
3263137792,3263138303,PL
3263138304,3263138551,DE
3263138552,3263138815,AT
@@ -67640,7 +71882,9 @@
3263168512,3263430655,GB
3263430656,3263436543,SE
3263436544,3263436799,ES
-3263436800,3263458047,SE
+3263436800,3263446527,SE
+3263446528,3263447039,DE
+3263447040,3263458047,SE
3263458048,3263458303,DE
3263458304,3263459583,SE
3263459584,3263459839,FR
@@ -67652,9 +71896,7 @@
3263478528,3263478783,ES
3263478784,3263480831,SE
3263480832,3263481855,JP
-3263481856,3263482879,SE
-3263482880,3263483903,IT
-3263483904,3263496191,SE
+3263481856,3263496191,SE
3263496192,3263501519,GB
3263501520,3263501527,IE
3263501528,3263503103,GB
@@ -67683,7 +71925,11 @@
3263692800,3263823871,FI
3263823872,3263826943,DE
3263826944,3263827199,AT
-3263827200,3263878145,DE
+3263827200,3263833855,DE
+3263833856,3263833903,GB
+3263833904,3263833919,DE
+3263833920,3263834111,GB
+3263834112,3263878145,DE
3263878146,3263878146,US
3263878147,3263886079,DE
3263886080,3263886335,SG
@@ -67692,7 +71938,8 @@
3263979520,3263987711,DE
3263987712,3264004095,ES
3264004096,3264012287,HU
-3264012544,3264013055,GB
+3264012544,3264012799,FR
+3264012800,3264013055,GB
3264013056,3264013311,TR
3264013312,3264013567,UA
3264013824,3264014079,NL
@@ -67746,18 +71993,15 @@
3264307200,3264311295,PL
3264311808,3264312063,DE
3264312064,3264312319,CH
-3264312320,3264312575,PL
3264312576,3264312831,UA
3264312832,3264313087,DE
3264313088,3264313343,NL
3264313344,3264313599,RO
3264313600,3264313855,PT
3264313856,3264314623,DE
-3264314624,3264314879,SE
3264314880,3264315135,GB
3264315392,3264317439,IE
3264318464,3264318975,ES
-3264318976,3264319487,DE
3264319488,3264319743,FR
3264319744,3264319999,SE
3264320000,3264320255,DE
@@ -67765,7 +72009,6 @@
3264321024,3264321535,DE
3264321792,3264322047,RS
3264322048,3264322303,FR
-3264322304,3264322559,RO
3264322560,3264322815,HU
3264322816,3264323071,CH
3264323072,3264323327,RU
@@ -67808,9 +72051,13 @@
3264345088,3264346111,NL
3264346112,3264347135,SE
3264347136,3264348159,DE
-3264348672,3264372223,FR
-3264372736,3264375039,FR
-3264375040,3264376063,SE
+3264350208,3264356351,FR
+3264356608,3264356863,FR
+3264357632,3264357887,DE
+3264359936,3264360191,FR
+3264360448,3264369151,FR
+3264372736,3264374783,FR
+3264374784,3264376063,SE
3264376064,3264376319,HR
3264376320,3264376575,UA
3264376576,3264376831,CH
@@ -67850,33 +72097,36 @@
3264409600,3264410623,RU
3264410624,3264411647,NO
3264411648,3264413695,PL
-3264417536,3264419327,CH
+3264417792,3264419839,CH
3264423424,3264428031,CH
-3264430592,3264431103,CH
+3264430592,3264430847,CH
3264431104,3264431615,LI
3264431616,3264431871,CH
-3264432128,3264434687,CH
+3264432128,3264434431,CH
3264434944,3264438783,CH
-3264439296,3264439551,CH
-3264439808,3264441343,CH
+3264439808,3264440831,CH
3264441344,3264441599,PL
-3264442112,3264444415,CH
-3264444672,3264444927,CH
-3264444928,3264445183,DE
-3264445184,3264445439,CH
+3264442368,3264446463,CH
3264447488,3264447743,CH
3264447744,3264447999,DE
-3264448000,3264452607,CH
+3264448000,3264448511,CH
+3264449792,3264450047,CH
+3264450304,3264452607,CH
3264454656,3264456191,CH
3264456704,3264463871,CH
3264463872,3264466943,LI
3264466944,3264474623,CH
-3264474880,3264476671,CH
+3264475136,3264475391,CH
+3264476416,3264476671,CH
3264476672,3264477183,RU
3264477184,3264477439,PL
3264477440,3264477695,RU
-3264477696,3264544767,CH
-3264544768,3264561151,HU
+3264477952,3264544767,CH
+3264544768,3264556799,HU
+3264556800,3264557055,BG
+3264557056,3264557823,HU
+3264557824,3264558079,BG
+3264558080,3264561151,HU
3264561152,3264563199,RU
3264563200,3264564223,ES
3264564224,3264565247,IE
@@ -67902,7 +72152,11 @@
3264606976,3264607231,BE
3264607232,3264607487,IT
3264607488,3264610303,DE
-3264610304,3264614911,GB
+3264610304,3264612479,GB
+3264612480,3264612575,FR
+3264612576,3264613027,GB
+3264613028,3264613031,FR
+3264613032,3264614911,GB
3264614912,3264615167,SE
3264615168,3264617983,GB
3264617984,3264618239,US
@@ -67912,7 +72166,7 @@
3264624640,3264624671,US
3264624672,3264626687,GB
3264626688,3264627711,EE
-3264628736,3264630783,UA
+3264628736,3264629759,UA
3264630784,3264631807,DE
3264631808,3264632831,RO
3264632832,3264633855,RU
@@ -68038,19 +72292,16 @@
3264846208,3264846335,AE
3264846336,3264846463,GB
3264846464,3264846591,NO
-3264846592,3264846719,US
3264846720,3264846847,RU
3264846848,3264846911,DK
3264846912,3264847103,CY
3264847168,3264847199,IE
-3264847200,3264847231,NO
3264847232,3264847263,CH
3264847264,3264847295,LI
3264847296,3264847359,CY
3264847488,3264847615,RU
3264847616,3264847679,PL
3264847680,3264847743,FI
-3264847744,3264847807,BE
3264847808,3264847871,SE
3264847872,3264849919,DE
3264849920,3264850431,GB
@@ -68078,24 +72329,36 @@
3264921600,3264929791,LU
3264929792,3264937983,SK
3264937984,3265003519,GB
-3265003520,3265018879,DE
+3265003520,3265005567,DE
+3265007616,3265010175,DE
+3265011712,3265018879,DE
3265018880,3265019903,HK
-3265036288,3265042943,DE
-3265043456,3265045759,DE
+3265036288,3265037311,DE
+3265038080,3265042943,DE
+3265043712,3265043967,DE
+3265044736,3265044991,DE
3265045760,3265046015,TR
-3265046016,3265055231,DE
+3265046016,3265048575,DE
+3265050624,3265052671,DE
+3265053696,3265054719,DE
3265055232,3265055743,FR
3265055744,3265069055,DE
3265069056,3265134591,FI
3265134592,3265137983,CH
3265137984,3265138047,NL
-3265138048,3265138863,CH
+3265138048,3265138599,CH
+3265138600,3265138607,NL
+3265138608,3265138863,CH
3265138864,3265138879,SE
-3265138880,3265139999,CH
+3265138880,3265139967,CH
+3265139968,3265139975,BE
+3265139976,3265139999,CH
3265140000,3265140015,BE
-3265140016,3265140991,CH
-3265140992,3265141247,GB
-3265141248,3265141551,CH
+3265140016,3265140119,CH
+3265140120,3265140127,BE
+3265140128,3265141135,CH
+3265141136,3265141151,GB
+3265141152,3265141551,CH
3265141552,3265141555,IE
3265141556,3265141759,CH
3265141760,3265141775,GB
@@ -68125,7 +72388,7 @@
3265371136,3265376255,DE
3265377280,3265378303,GB
3265378304,3265379327,NL
-3265380352,3265382399,GB
+3265380352,3265382911,GB
3265386496,3265386751,NL
3265387008,3265387263,NL
3265388544,3265392639,GB
@@ -68137,7 +72400,6 @@
3265593344,3265594367,RU
3265594880,3265595391,UA
3265595392,3265595903,PL
-3265595904,3265596415,RU
3265596416,3265596927,GB
3265596928,3265597439,FR
3265597440,3265599999,RU
@@ -68149,7 +72411,6 @@
3265602048,3265602303,NL
3265602560,3265602815,IT
3265602816,3265603071,IE
-3265603072,3265603327,DK
3265603328,3265603583,MD
3265603584,3265603839,DE
3265603840,3265604095,PL
@@ -68182,9 +72443,13 @@
3265724416,3265789951,FR
3265789952,3265824767,GB
3265824768,3265825023,US
-3265825024,3265877247,GB
-3265877504,3265879039,GB
-3265880064,3265887487,GB
+3265825024,3265867775,GB
+3265868288,3265868543,GB
+3265868800,3265869055,DE
+3265869312,3265869823,GB
+3265871872,3265878015,GB
+3265880064,3265886207,GB
+3265887232,3265887487,GB
3265887488,3265887743,PT
3265887744,3265888255,PL
3265888256,3265902335,GB
@@ -68192,7 +72457,6 @@
3265904384,3265904639,RO
3265904640,3265904895,DE
3265905152,3265905663,GB
-3265905664,3265905919,IE
3265905920,3265906175,GB
3265906176,3265906431,DE
3265906432,3265906687,CH
@@ -68214,7 +72478,6 @@
3265911808,3265912063,PL
3265912064,3265912319,GB
3265912320,3265912575,DE
-3265912576,3265912831,RO
3265912832,3265913087,CZ
3265913088,3265913343,SE
3265913344,3265914367,PL
@@ -68297,21 +72560,21 @@
3266420736,3266428927,GB
3266428928,3266437119,GR
3266437120,3266445311,GL
-3266445312,3266472959,NL
-3266472960,3266473215,SE
-3266473216,3266510847,NL
+3266445312,3266510847,NL
3266510848,3266543615,ES
3266543616,3266576383,IT
-3266576384,3266582783,DE
-3266583040,3266588927,DE
-3266589184,3266603519,DE
-3266604032,3266617327,DE
+3266576384,3266588927,DE
+3266589440,3266603007,DE
+3266603264,3266603519,DE
+3266604032,3266617279,DE
3266617328,3266617343,GB
-3266617344,3266634383,DE
+3266617344,3266621439,DE
+3266624512,3266634383,DE
3266634392,3266634399,EE
3266634400,3266634431,DE
-3266634464,3266634751,DE
-3266635520,3266637055,DE
+3266634496,3266634751,DE
+3266636288,3266636799,DE
+3266636928,3266636991,DE
3266637312,3266641919,DE
3266641920,3266707455,PL
3266707456,3266772991,DK
@@ -68334,7 +72597,6 @@
3267040256,3267041279,RO
3267042304,3267043327,UA
3267043328,3267044351,GB
-3267044352,3267045375,RU
3267045376,3267046399,PL
3267046400,3267047423,NL
3267047424,3267048447,UA
@@ -68406,18 +72668,25 @@
3267537920,3267538943,FR
3267549184,3267550207,DK
3267559424,3267624959,DE
+3267628400,3267628415,FR
3267630080,3267631095,GB
3267631096,3267631103,IT
3267631104,3267631615,GB
3267634176,3267635199,GB
-3267636864,3267636991,ZA
3267648320,3267648335,GB
3267650320,3267650335,AT
-3267660608,3267660671,ES
+3267657576,3267657583,RO
+3267657696,3267657703,RO
+3267657712,3267657727,RO
+3267661904,3267661967,ES
+3267662896,3267662911,IE
3267665920,3267666943,GB
3267667456,3267667967,GB
3267670016,3267671039,ZA
3267674208,3267674239,GB
+3267681312,3267681327,FR
+3267681888,3267681903,FR
+3267683936,3267683967,PL
3267684352,3267684863,GB
3267690496,3267691519,FI
3267691520,3267692543,SE
@@ -68449,7 +72718,7 @@
3268223200,3268223231,GB
3268224768,3268225023,US
3268226368,3268226399,GB
-3268226496,3268226663,GB
+3268226496,3268226655,GB
3268226688,3268226815,GB
3268227328,3268227391,GB
3268227520,3268227615,GB
@@ -68471,12 +72740,14 @@
3268235520,3268235775,GB
3268235936,3268236031,GB
3268236192,3268236207,GB
-3268236544,3268236607,GB
-3268236672,3268236799,GB
+3268236544,3268236799,GB
+3268237824,3268237839,GB
3268238336,3268238359,GB
3268238368,3268238399,GB
3268238472,3268238543,GB
-3268238552,3268238847,GB
+3268238552,3268238591,GB
+3268238632,3268238783,GB
+3268238816,3268238847,GB
3268239584,3268240127,GB
3268240160,3268240191,GB
3268240384,3268240399,GB
@@ -68501,9 +72772,7 @@
3268249600,3268251311,GB
3268251312,3268251327,IE
3268251328,3268251647,GB
-3268254464,3268254543,GB
-3268254592,3268254607,GB
-3268254624,3268254639,GB
+3268254464,3268254719,GB
3268254896,3268254903,GB
3268255824,3268255863,GB
3268255896,3268255919,GB
@@ -68562,14 +72831,10 @@
3268345856,3268411391,GB
3268411392,3268426751,AT
3268426752,3268427775,CH
-3268427776,3268463615,AT
-3268463616,3268463871,CH
-3268463872,3268464127,AT
+3268427776,3268464127,AT
3268464128,3268464383,LI
3268464384,3268476927,AT
-3268476928,3268537087,CH
-3268537088,3268537343,US
-3268537344,3268542463,CH
+3268476928,3268542463,CH
3268542464,3268607999,PT
3268608000,3268673535,FI
3268673536,3268739071,CZ
@@ -68663,6 +72928,7 @@
3269285088,3269285135,DE
3269285136,3269285151,GB
3269285152,3269285215,DE
+3269285216,3269285311,FR
3269285312,3269285327,DE
3269285336,3269285343,FR
3269285344,3269285344,GB
@@ -68791,7 +73057,9 @@
3270680576,3270688767,FR
3270688768,3270836223,IT
3270836224,3270901759,DE
-3270901760,3270909951,IT
+3270901760,3270903807,IT
+3270903808,3270905855,SE
+3270905856,3270909951,IT
3270909952,3270911743,DE
3270911840,3270911871,PL
3270911872,3270911935,DE
@@ -68916,7 +73184,7 @@
3271745024,3271745535,PL
3271745536,3271746047,GB
3271746048,3271746559,RU
-3271746560,3271747071,CH
+3271746560,3271747071,US
3271747072,3271747583,KZ
3271747584,3271748095,RU
3271748096,3271748607,GR
@@ -68977,7 +73245,7 @@
3271916032,3271916543,GB
3271916544,3271917311,UA
3271917312,3271925759,RU
-3271925760,3271926015,DE
+3271925760,3271926015,DK
3271926016,3271926271,MD
3271926272,3271926527,RU
3271926528,3271926783,NL
@@ -69005,8 +73273,9 @@
3271933440,3271933695,SE
3271933696,3271933951,DE
3271933952,3272015871,FR
-3272015872,3272017407,RO
-3272017664,3272018943,RO
+3272015872,3272016639,RO
+3272016896,3272017919,RO
+3272018176,3272018431,RO
3272019968,3272020991,IT
3272020992,3272024063,DK
3272024064,3272032255,IE
@@ -69233,15 +73502,15 @@
3272392704,3272400895,AT
3272400912,3272400919,GB
3272402432,3272402687,GB
-3272402688,3272402815,SE
3272403968,3272404991,FR
3272404992,3272406015,DE
3272406016,3272407039,NL
3272409088,3272417279,BE
-3272417280,3272418687,FR
-3272418688,3272419327,PL
+3272417280,3272418303,FR
+3272418304,3272418559,GB
+3272418560,3272418687,FR
+3272418816,3272419327,PL
3272419328,3272420351,DE
-3272420608,3272420863,DE
3272420864,3272420991,PL
3272420992,3272421119,DK
3272421376,3272421887,RO
@@ -69275,7 +73544,6 @@
3272479744,3272480255,SE
3272480256,3272480511,FR
3272480512,3272480767,CH
-3272480768,3272481023,DE
3272481024,3272481279,SE
3272481792,3272482047,IT
3272482048,3272482303,NL
@@ -69336,7 +73604,7 @@
3272884224,3272892415,DE
3272892416,3272892927,UA
3272893440,3272893951,SE
-3272893952,3272894463,UA
+3272893952,3272894463,RU
3272894976,3272895487,RO
3272895488,3272895999,GB
3272896000,3272896511,PL
@@ -69448,7 +73716,6 @@
3273261056,3273261567,NO
3273261568,3273262079,BE
3273262080,3273262591,LU
-3273262592,3273263103,RU
3273263616,3273264127,SE
3273264128,3273264639,PL
3273264640,3273265151,AT
@@ -69473,6 +73740,7 @@
3273326592,3273326847,IE
3273326984,3273326987,DE
3273326992,3273327047,DE
+3273327104,3273327231,DE
3273327264,3273327287,DE
3273327376,3273327423,IE
3273327424,3273327511,GB
@@ -69503,9 +73771,8 @@
3273333056,3273333119,DE
3273334272,3273334783,DE
3273334784,3273335039,AE
-3273335040,3273335295,DE
3273335296,3273335423,GB
-3273335432,3273335439,GB
+3273335432,3273335455,GB
3273335936,3273335999,DE
3273336848,3273336863,DE
3273336864,3273336871,GB
@@ -69639,17 +73906,14 @@
3273687040,3273719807,DE
3273719808,3273720831,NL
3273720832,3273720847,IE
-3273720848,3273726719,NL
-3273726720,3273726975,GB
-3273726976,3273727087,DK
+3273720848,3273727087,NL
3273727088,3273727088,GB
3273727089,3273727095,ES
-3273727096,3273727119,DK
+3273727096,3273727119,NL
3273727120,3273727127,PT
-3273727128,3273727135,DK
+3273727128,3273727135,NL
3273727136,3273727167,IT
-3273727168,3273727231,DK
-3273727232,3273732095,NL
+3273727168,3273732095,NL
3273732096,3273736191,GB
3273736192,3273744383,FR
3273744384,3273746943,GB
@@ -69660,7 +73924,9 @@
3273762304,3273762559,NL
3273762560,3273768959,DE
3273768960,3273785343,TR
-3273785344,3273801727,RU
+3273785344,3273792511,RU
+3273792512,3273793023,UZ
+3273793024,3273801727,RU
3273801728,3273802239,DE
3273802752,3273803263,SA
3273803776,3273804287,CH
@@ -69690,7 +73956,6 @@
3273867264,3273867519,BE
3273867520,3273867775,UA
3273867776,3273868031,PT
-3273868032,3273868287,GB
3273868288,3273869311,RU
3273869312,3273871359,DE
3273871360,3273871615,PL
@@ -69725,14 +73990,15 @@
3273883392,3273883647,DE
3273883648,3273916415,NL
3273916416,3273932799,IT
-3273932800,3273949183,DE
+3273932800,3273940991,DE
+3273940992,3273943039,GB
+3273943040,3273949183,DE
3273949184,3273981951,FR
3273981952,3274047487,DE
3274050560,3274051583,PL
3274051584,3274052351,UA
3274052352,3274052607,GB
3274052608,3274052863,DE
-3274052864,3274053119,GB
3274053120,3274053375,KZ
3274053376,3274053631,RU
3274053632,3274054655,DE
@@ -69751,7 +74017,6 @@
3274163200,3274163711,UA
3274163712,3274164223,BG
3274164224,3274164735,AT
-3274165248,3274165759,GB
3274165760,3274166271,RU
3274166272,3274166783,AT
3274166784,3274167295,UA
@@ -69811,7 +74076,6 @@
3274368512,3274368767,AT
3274368768,3274369023,FR
3274370048,3274371071,GB
-3274371072,3274373375,NL
3274373376,3274373631,PL
3274373632,3274374143,FR
3274374144,3274375167,DE
@@ -69940,8 +74204,7 @@
3274471680,3274471935,GB
3274472960,3274483711,GB
3274489600,3274489855,GB
-3274490176,3274490895,GB
-3274490912,3274491199,GB
+3274490176,3274491199,GB
3274491208,3274491247,GB
3274491256,3274491295,GB
3274491304,3274491319,GB
@@ -70003,7 +74266,6 @@
3274695424,3274695679,PL
3274695680,3274695935,SI
3274695936,3274696191,DE
-3274696192,3274696447,DK
3274696448,3274696703,CH
3274696704,3274696959,IT
3274696960,3274697215,GR
@@ -70041,11 +74303,7 @@
3274814464,3274815487,GB
3274815488,3274816511,RU
3274816512,3274817535,SK
-3274817536,3274819839,RU
-3274819840,3274820095,UA
-3274820096,3274821119,RU
-3274821120,3274821375,UA
-3274821376,3274821631,RU
+3274817536,3274821631,RU
3274821632,3274823679,KZ
3274823680,3274825727,TR
3274825728,3274827775,DE
@@ -70113,16 +74371,16 @@
3275415552,3275423743,UA
3275423744,3275423751,GB
3275423808,3275423839,GB
-3275423872,3275424735,GB
-3275424752,3275425343,GB
-3275425536,3275425559,GB
-3275425568,3275425583,GB
-3275425792,3275426559,GB
+3275423872,3275424719,GB
+3275424728,3275424735,GB
+3275424752,3275425311,GB
+3275425328,3275425343,GB
+3275425536,3275426559,GB
3275426576,3275428367,GB
3275428376,3275428407,GB
3275428416,3275428447,GB
+3275428608,3275428863,GB
3275429888,3275430143,GB
-3275430272,3275430399,GB
3275430592,3275430631,GB
3275430656,3275430911,GB
3275431936,3275432959,GB
@@ -70143,20 +74401,30 @@
3275443840,3275443967,GB
3275444224,3275444735,GB
3275446272,3275446783,GB
-3275446800,3275446823,GB
+3275446800,3275446815,GB
3275446848,3275447039,GB
3275447056,3275447151,GB
-3275448320,3275450207,GB
+3275448320,3275449359,GB
+3275449376,3275449399,GB
+3275449408,3275449519,GB
+3275449520,3275449527,FR
+3275449528,3275449567,GB
+3275449584,3275450207,GB
3275450224,3275450879,GB
3275451232,3275451263,GB
3275451392,3275451663,GB
3275451680,3275451711,GB
3275451720,3275451727,GB
3275451744,3275451767,GB
-3275452416,3275455231,GB
+3275451776,3275451779,GB
+3275452416,3275453695,GB
+3275453824,3275453839,GB
+3275453848,3275454063,GB
+3275454080,3275454127,GB
+3275454144,3275455231,GB
3275455248,3275456407,GB
-3275456416,3275457535,GB
-3275457536,3275457791,FK
+3275456416,3275457279,GB
+3275457280,3275457791,FK
3275457792,3275458559,GB
3275458560,3275460095,IE
3275460096,3275460223,GB
@@ -70172,20 +74440,19 @@
3275468768,3275468799,IE
3275468800,3275474951,GB
3275474960,3275475039,GB
-3275475044,3275476223,GB
-3275476288,3275476479,GB
-3275476656,3275476687,GB
-3275476704,3275476735,GB
+3275475044,3275475711,GB
+3275475720,3275475791,GB
+3275475800,3275475879,GB
+3275475968,3275476735,GB
3275476992,3275477567,GB
3275477760,3275478271,GB
3275478528,3275481087,GB
+3275481344,3275481599,GB
+3275482112,3275482367,GB
3275483136,3275483647,GB
3275484160,3275484415,GB
-3275485184,3275485215,GB
-3275485224,3275485231,GB
-3275485248,3275485375,GB
-3275485408,3275485423,GB
-3275485440,3275485759,GB
+3275485184,3275485759,GB
+3275486208,3275487231,GB
3275488768,3275489279,CZ
3275489280,3275497471,GB
3275497472,3275505663,DE
@@ -70225,7 +74492,6 @@
3275512320,3275512447,FI
3275512448,3275512575,DK
3275512576,3275512703,BE
-3275512704,3275512831,PL
3275512832,3275512895,SE
3275512896,3275512959,AT
3275512960,3275513023,PL
@@ -70241,7 +74507,6 @@
3275530240,3275530751,DK
3275530752,3275531263,AT
3275531264,3275531775,GB
-3275531776,3275532287,IE
3275532288,3275532799,UA
3275532800,3275533311,GB
3275533824,3275534335,UA
@@ -70422,30 +74687,26 @@
3275931648,3275939839,UA
3275939840,3275948031,GB
3275948032,3276013567,SE
-3276013568,3276014239,GB
-3276014240,3276014247,FR
-3276014248,3276014799,GB
+3276013568,3276014079,GB
+3276014080,3276014335,FR
+3276014336,3276014799,GB
3276014800,3276014815,FR
3276014816,3276014951,GB
3276014952,3276014959,ES
-3276014960,3276018175,GB
-3276018176,3276018431,FR
-3276018432,3276019495,GB
-3276019496,3276019503,FR
-3276019504,3276019631,GB
-3276019632,3276019639,FR
-3276019640,3276020129,GB
+3276014960,3276020129,GB
3276020130,3276020130,FR
-3276020131,3276020735,GB
-3276020736,3276020991,FR
-3276020992,3276025159,GB
+3276020131,3276023039,GB
+3276023040,3276023295,FR
+3276023296,3276025159,GB
3276025160,3276025167,FR
3276025168,3276026367,GB
3276026368,3276026623,FR
-3276026624,3276027647,GB
-3276027648,3276027903,FR
-3276027904,3276029375,GB
-3276029376,3276029439,FR
+3276026624,3276027391,GB
+3276027392,3276027647,FR
+3276027648,3276028543,GB
+3276028544,3276028671,FR
+3276028672,3276029183,GB
+3276029184,3276029439,FR
3276029440,3276030591,GB
3276030592,3276030607,FR
3276030608,3276031479,GB
@@ -70460,11 +74721,13 @@
3276042016,3276042031,FR
3276042032,3276042079,GB
3276042080,3276042095,FR
-3276042096,3276042495,GB
-3276042496,3276042751,FR
-3276042752,3276045247,GB
+3276042096,3276042751,GB
+3276042752,3276043007,FR
+3276043008,3276045247,GB
3276045248,3276045255,FR
-3276045256,3276046335,GB
+3276045256,3276045823,GB
+3276045824,3276046079,FR
+3276046080,3276046335,GB
3276046336,3276062719,RU
3276062720,3276063231,PL
3276063232,3276063743,FR
@@ -70599,7 +74862,6 @@
3276428544,3276428799,BG
3276428800,3276429055,DE
3276429056,3276429311,NL
-3276429312,3276430079,RU
3276430080,3276430591,PL
3276430592,3276430847,GB
3276430848,3276431103,DE
@@ -70609,20 +74871,26 @@
3276455936,3276464127,BE
3276464128,3276472319,GR
3276473304,3276473311,AT
-3276480256,3276480511,FR
+3276474880,3276474927,IT
+3276478064,3276478095,CH
+3276478720,3276478975,FR
3276485632,3276486655,GB
+3276490776,3276490776,NL
+3276490782,3276490782,AT
+3276490783,3276490783,CH
+3276494336,3276494591,GB
+3276499504,3276499567,DE
3276503040,3276505087,DE
-3276508680,3276508687,GB
-3276508928,3276509183,GB
3276509184,3276510207,IT
3276512256,3276513023,ZA
-3276517632,3276517887,NL
3276518368,3276518383,NL
+3276520704,3276520735,SE
3276522496,3276523519,NL
-3276527616,3276527743,PK
+3276524864,3276524895,PT
+3276528128,3276528191,GB
3276528352,3276528359,GB
3276530688,3276531711,NL
-3276536688,3276536695,HU
+3276536752,3276536783,HU
3276537344,3276537599,AT
3276537856,3276668927,ES
3276668928,3276677119,MC
@@ -70713,42 +74981,43 @@
3276861184,3276861439,DE
3276861440,3276865535,DK
3276865536,3276866303,NL
-3276866304,3276866559,GB
-3276866560,3276866815,IT
-3276866816,3276870911,GB
-3276870912,3276871423,IT
-3276871424,3276873983,GB
+3276866304,3276870911,GB
+3276870912,3276871679,IT
+3276871680,3276873760,GB
+3276873761,3276873761,ES
+3276873762,3276873983,GB
3276873984,3276874239,ES
-3276874240,3276876383,GB
+3276874240,3276874959,GB
+3276874960,3276874975,NL
+3276874976,3276876383,GB
3276876384,3276876415,NL
3276876416,3276882431,GB
-3276882432,3276882943,IT
-3276882944,3276883711,GB
-3276883712,3276883967,IT
-3276883968,3276886363,GB
+3276882432,3276882687,IT
+3276882688,3276883077,GB
+3276883078,3276883078,IT
+3276883079,3276883711,GB
+3276883712,3276883839,IT
+3276883840,3276886363,GB
3276886364,3276886367,DE
-3276886368,3276890111,GB
-3276890112,3276890367,US
-3276890368,3276892159,GB
+3276886368,3276890175,GB
+3276890176,3276890191,US
+3276890192,3276892159,GB
3276892160,3276893183,IT
3276893184,3276893695,GB
3276893696,3276893951,IT
-3276893952,3276898671,GB
+3276893952,3276897727,GB
+3276897728,3276897791,BE
+3276897792,3276898671,GB
3276898672,3276898687,CH
-3276898688,3276902141,GB
+3276898688,3276901613,GB
+3276901614,3276901614,CH
+3276901615,3276902141,GB
3276902142,3276902142,CH
3276902143,3276902655,GB
3276902656,3276902911,SE
-3276902912,3276903167,GB
-3276903168,3276903679,SE
-3276903680,3276907519,GB
-3276907520,3276907775,NL
-3276907776,3276908287,GB
-3276908288,3276908543,BE
-3276908544,3276908799,SE
-3276908800,3276909823,GB
-3276909824,3276910079,SE
-3276910080,3276911167,GB
+3276902912,3276907519,GB
+3276907520,3276907551,NL
+3276907552,3276911167,GB
3276911168,3276911199,IT
3276911200,3276911615,GB
3276911616,3276911871,IT
@@ -70770,9 +75039,7 @@
3276919488,3276919535,DE
3276919536,3276922879,GB
3276922880,3276923135,FR
-3276923136,3276923647,GB
-3276923648,3276924159,FR
-3276924160,3276925951,GB
+3276923136,3276925951,GB
3276925952,3276926207,FR
3276926208,3276931071,GB
3276931072,3276939263,KZ
@@ -70803,7 +75070,6 @@
3277178880,3277179135,ES
3277179392,3277179647,DE
3277179648,3277180159,BE
-3277180160,3277180415,NL
3277180416,3277180671,RU
3277180928,3277181183,UA
3277181184,3277181439,PL
@@ -70813,7 +75079,6 @@
3277182208,3277182463,RU
3277182464,3277182719,UA
3277182720,3277182975,BG
-3277182976,3277183231,UA
3277183232,3277183487,DE
3277183744,3277183999,UA
3277184000,3277184255,DE
@@ -70827,7 +75092,6 @@
3277186560,3277186815,PL
3277186816,3277187071,RU
3277187072,3277187327,GB
-3277187328,3277187583,UA
3277187584,3277188351,RU
3277188352,3277188607,DE
3277188608,3277188863,RU
@@ -70836,7 +75100,6 @@
3277189376,3277189631,PL
3277189632,3277189887,TR
3277189888,3277190143,PL
-3277190144,3277190399,SE
3277190400,3277190655,GB
3277190656,3277190911,BE
3277190912,3277191167,FR
@@ -70962,9 +75225,7 @@
3277389312,3277389823,AM
3277389824,3277394943,GB
3277394944,3277395455,US
-3277395456,3277402591,GB
-3277402592,3277402607,ES
-3277402608,3277403135,GB
+3277395456,3277403135,GB
3277403136,3277403215,FR
3277403216,3277403231,GB
3277403232,3277403279,FR
@@ -70972,15 +75233,13 @@
3277403296,3277403311,FR
3277403312,3277403327,GB
3277403328,3277403359,FR
-3277403360,3277403391,GB
-3277403392,3277403455,FR
+3277403360,3277403375,GB
+3277403376,3277403455,FR
3277403456,3277403647,GB
3277403648,3277403807,ES
3277403808,3277404159,GB
3277404160,3277404415,DE
-3277404416,3277404511,IT
-3277404512,3277404527,GB
-3277404528,3277404655,IT
+3277404416,3277404655,IT
3277404656,3277404671,GB
3277404672,3277404735,CH
3277404736,3277404927,GB
@@ -71007,7 +75266,7 @@
3277482496,3277483007,PL
3277483008,3277483519,IT
3277483520,3277484031,RO
-3277484032,3277486079,CH
+3277484032,3277484543,CH
3277486080,3277486591,GB
3277486592,3277487103,UA
3277487104,3277487615,RO
@@ -71077,13 +75336,13 @@
3277717504,3277725695,YE
3277725696,3277733887,CH
3277733888,3277742079,DE
-3277742080,3277746175,FI
+3277742080,3277745151,FI
+3277745152,3277746175,CH
3277746176,3277750271,GB
3277750272,3277766655,IT
3277766656,3277774847,PL
3277774848,3277783039,RU
3277783040,3277815807,BE
-3277815808,3277816063,RO
3277816064,3277816319,PL
3277816576,3277816831,GB
3277816832,3277817087,CH
@@ -71158,7 +75417,6 @@
3277843456,3277843967,PT
3277843968,3277845503,DK
3277845504,3277847039,NL
-3277847040,3277847551,DK
3277847552,3277848063,RU
3277848064,3277848575,RO
3277848576,3277856767,AT
@@ -71187,9 +75445,7 @@
3278061568,3278065663,NL
3278065664,3278110719,GB
3278110720,3278176255,SE
-3278176256,3278210559,FR
-3278210560,3278210815,MQ
-3278210816,3278241791,FR
+3278176256,3278241791,FR
3278241792,3278307327,GB
3278307328,3278372863,IT
3278372864,3278635007,GB
@@ -71234,7 +75490,9 @@
3278929920,3278938111,TR
3278938112,3278939611,DE
3278939612,3278939615,FR
-3278939616,3278940055,DE
+3278939616,3278939715,DE
+3278939716,3278939719,TR
+3278939720,3278940055,DE
3278940056,3278940059,SG
3278940060,3278940355,DE
3278940356,3278940359,NL
@@ -71359,7 +75617,6 @@
3279028224,3279028735,PL
3279028736,3279029247,RU
3279029760,3279030271,UA
-3279030272,3279030783,RU
3279030784,3279031295,DE
3279031296,3279031807,NL
3279032320,3279032831,HU
@@ -71382,7 +75639,6 @@
3279057408,3279057919,FR
3279058944,3279059455,UA
3279059456,3279060479,RU
-3279060480,3279060991,PL
3279060992,3279069183,UA
3279069184,3279077375,PL
3279077376,3279085567,ES
@@ -71409,7 +75665,9 @@
3279388672,3279396863,GR
3279421440,3279486975,IT
3279486976,3279552511,NL
-3279552512,3279560703,LV
+3279552512,3279559028,LV
+3279559029,3279559029,US
+3279559030,3279560703,LV
3279560704,3279568895,GB
3279568896,3279577087,IT
3279577088,3279585279,BE
@@ -71429,7 +75687,9 @@
3279601664,3279609855,CZ
3279609856,3279618047,RU
3279618048,3279683583,UA
-3279683584,3279946751,DE
+3279683584,3279794943,DE
+3279794944,3279795199,NO
+3279795200,3279946751,DE
3279946752,3279947775,SE
3279947776,3279948799,NL
3279949824,3279950847,UA
@@ -71513,7 +75773,6 @@
3280128256,3280128511,GB
3280128512,3280129023,HU
3280129280,3280129535,LV
-3280129536,3280129791,SA
3280129792,3280130047,FR
3280130304,3280130559,RU
3280130560,3280130815,GB
@@ -71566,7 +75825,6 @@
3280577792,3280578047,NL
3280578048,3280578303,RO
3280578304,3280578559,UA
-3280578560,3280578815,PL
3280578816,3280579071,NL
3280579072,3280579327,DE
3280579328,3280579583,RU
@@ -71657,7 +75915,6 @@
3280765952,3280766975,DK
3280766976,3280767999,AT
3280768000,3280769023,FR
-3280769024,3280770047,NL
3280770048,3280771071,FR
3280771072,3280772095,PL
3280772096,3280773119,ES
@@ -71717,7 +75974,7 @@
3280998656,3280999423,GB
3280999424,3280999679,HU
3280999680,3280999935,UA
-3280999936,3281000447,DE
+3280999936,3281000191,DE
3281000448,3281000703,FR
3281000704,3281000959,UA
3281000960,3281001215,SI
@@ -71757,7 +76014,7 @@
3281339648,3281339903,GB
3281339904,3281340159,UA
3281340160,3281340415,BG
-3281340416,3281340927,RO
+3281340416,3281340671,RO
3281340928,3281341183,DE
3281341184,3281341439,AT
3281341440,3281341695,DE
@@ -71770,7 +76027,7 @@
3281344000,3281344255,NL
3281344256,3281344511,RU
3281344512,3281344767,UA
-3281344768,3281345279,RU
+3281344768,3281345023,RU
3281345280,3281345535,SA
3281345536,3281345791,CH
3281346048,3281346303,SI
@@ -71948,7 +76205,6 @@
3282746112,3282746367,SE
3282746368,3282746623,PL
3282746624,3282746879,SE
-3282746880,3282747135,RO
3282747136,3282747391,PL
3282747392,3282763775,RU
3282763776,3282960383,GB
@@ -71958,11 +76214,10 @@
3283113472,3283156991,CH
3283156992,3283173375,DE
3283173376,3283174399,PL
-3283174400,3283176447,UA
-3283176448,3283177471,GB
+3283174400,3283175423,GB
+3283175424,3283176447,UA
3283177472,3283178495,BE
3283178496,3283179519,PL
-3283179520,3283180543,LU
3283180544,3283181567,UA
3283181568,3283182591,NO
3283182592,3283183615,PL
@@ -72020,7 +76275,6 @@
3283249152,3283249663,UA
3283249664,3283250175,RO
3283250176,3283250687,RU
-3283250688,3283251199,RO
3283251200,3283251711,FR
3283251712,3283252223,PL
3283252224,3283252735,BG
@@ -72048,11 +76302,9 @@
3283488256,3283488511,PL
3283488768,3283489279,FR
3283489280,3283489535,DE
-3283489536,3283489791,PL
3283489792,3283490047,RU
3283490048,3283490559,UA
3283490560,3283490815,PL
-3283490816,3283491071,CH
3283491072,3283491327,TR
3283491328,3283491583,AT
3283491584,3283491839,RO
@@ -72064,7 +76316,6 @@
3283493120,3283493375,IL
3283493376,3283493887,PL
3283493888,3283494143,DK
-3283494400,3283494655,PL
3283494656,3283494911,DK
3283494912,3283495167,PL
3283495168,3283495423,BG
@@ -72123,7 +76374,6 @@
3283636224,3283636735,UA
3283636736,3283637759,PL
3283638272,3283638783,PL
-3283638784,3283639295,RU
3283639296,3283639807,CH
3283639808,3283640319,DE
3283640320,3283648511,DK
@@ -72143,8 +76393,7 @@
3283944448,3283945471,AT
3283945472,3283946495,UA
3283946496,3283947519,GB
-3283947520,3283947775,UA
-3283947776,3283948543,RU
+3283947520,3283948543,RU
3283948544,3283949567,NL
3283949568,3283950591,SE
3283950592,3283951615,KZ
@@ -72196,7 +76445,6 @@
3283990016,3283990527,SE
3283991040,3283991551,RO
3283991552,3283992063,SE
-3283992064,3283992575,RO
3283992576,3283993087,IL
3283993088,3283993599,RO
3283993600,3283994111,UA
@@ -72255,10 +76503,16 @@
3284016384,3284016639,CH
3284016640,3284017151,DK
3284017152,3284025343,GR
-3284025344,3284030471,GB
+3284025344,3284028287,GB
+3284028288,3284028319,US
+3284028320,3284029183,GB
+3284029184,3284029199,US
+3284029200,3284030471,GB
3284030472,3284030479,IL
3284030480,3284030495,FR
-3284030496,3284033535,GB
+3284030496,3284030615,GB
+3284030616,3284030623,SE
+3284030624,3284033535,GB
3284033536,3284041727,RU
3284041728,3284041983,DK
3284041984,3284042239,SI
@@ -72272,7 +76526,7 @@
3284044032,3284044287,FR
3284044288,3284044543,DE
3284044800,3284045055,CZ
-3284045056,3284045311,LT
+3284045056,3284045311,EE
3284045312,3284045567,DE
3284045568,3284045823,AT
3284046080,3284046335,DE
@@ -72353,7 +76607,6 @@
3284108800,3284109311,FR
3284109312,3284109823,RU
3284109824,3284110335,UA
-3284110336,3284110847,RU
3284110848,3284111359,DK
3284111360,3284111871,SE
3284111872,3284112383,RU
@@ -72451,7 +76704,7 @@
3284717312,3284717567,DE
3284717568,3284717823,FR
3284717824,3284718079,RU
-3284718080,3284718591,GB
+3284718336,3284718591,GB
3284718592,3284718847,PL
3284718848,3284719103,RU
3284719104,3284719359,PL
@@ -72483,9 +76736,7 @@
3284811776,3284819967,KE
3284819968,3284828159,GB
3284828160,3284844543,AT
-3284844544,3284856063,CH
-3284856064,3284856191,DE
-3284856192,3284860927,CH
+3284844544,3284860927,CH
3284860928,3284926463,DE
3284926464,3284991999,NO
3284992000,3285057535,PL
@@ -72599,14 +76850,20 @@
3285451608,3285451615,GB
3285452496,3285452511,GB
3285453440,3285453567,GB
-3285457072,3285457079,GB
3285461184,3285461215,NL
+3285461808,3285461839,NL
+3285463168,3285463199,LU
+3285465600,3285465855,GB
3285472256,3285472271,US
3285472272,3285472287,DE
3285472288,3285472511,US
+3285477136,3285477151,IT
3285480960,3285481215,CH
-3285501696,3285501951,GB
+3285495296,3285495807,ES
+3285501328,3285501359,CZ
3285510144,3285512191,GB
+3285515776,3285515799,GR
+3285515816,3285515823,GR
3285516288,3285516687,BE
3285516688,3285516691,NL
3285516692,3285517311,BE
@@ -72715,23 +76972,27 @@
3285913648,3285913655,IE
3285913656,3285913703,GB
3285913708,3285913711,FI
+3285913712,3285913719,GB
+3285913728,3285913855,GB
3285917696,3285917703,GB
-3285917712,3285917759,GB
+3285917712,3285917807,GB
+3285917952,3285918207,GB
3285919744,3285921791,QA
-3285922048,3285922303,FR
3285924912,3285924919,CH
+3285924920,3285924927,FI
+3285924928,3285924943,DE
3285925164,3285925171,CH
3285926432,3285926463,CH
3285926592,3285926623,DE
3285928304,3285928311,GB
3285931528,3285931535,DE
+3285934592,3285934847,ES
3285935872,3285936127,GB
3285939136,3285939175,GB
3285939184,3285939191,GB
3285939744,3285939759,GB
3285939840,3285939967,GB
3285941248,3285941503,ES
-3285946112,3285946367,ES
3285949856,3285949887,ES
3285950208,3285950463,IT
3285951648,3285951679,ES
@@ -72742,6 +77003,7 @@
3285954576,3285954815,GB
3285962752,3285963775,DE
3285964800,3285964927,DE
+3285965056,3285965311,DE
3285975040,3286013695,FR
3286013696,3286013951,RE
3286013952,3286106111,FR
@@ -72811,7 +77073,6 @@
3286355968,3286356991,DE
3286356992,3286358015,PL
3286358016,3286359039,GB
-3286359040,3286360063,PT
3286360064,3286361087,IT
3286361088,3286362111,UA
3286362112,3286363135,RU
@@ -72826,11 +77087,13 @@
3286403072,3286403327,GG
3286403328,3286404863,GB
3286404864,3286405375,GG
-3286405376,3286405887,GB
-3286405888,3286406143,GG
-3286406144,3286406399,GB
-3286406400,3286406655,GG
-3286406656,3286409215,GB
+3286405376,3286406399,GB
+3286406400,3286406911,GG
+3286406912,3286407167,GB
+3286407168,3286407423,GG
+3286407424,3286407679,GB
+3286407680,3286407935,GG
+3286407936,3286409215,GB
3286409216,3286417407,DE
3286417408,3286417663,UA
3286417664,3286417919,IT
@@ -72864,7 +77127,15 @@
3286425344,3286425599,IT
3286425600,3286433791,KW
3286433792,3286499327,DE
-3286499328,3286564863,HU
+3286499328,3286502143,HU
+3286502144,3286502399,BG
+3286502400,3286510335,HU
+3286510336,3286510591,BG
+3286510592,3286514431,HU
+3286514432,3286514687,RO
+3286514688,3286552575,HU
+3286552576,3286553087,BG
+3286553088,3286564863,HU
3286564864,3286566655,AE
3286566656,3286567423,KW
3286567424,3286630399,AE
@@ -72902,9 +77173,7 @@
3286662400,3286662655,UA
3286662656,3286662911,DE
3286662912,3286671359,UA
-3286671360,3286672639,AT
-3286672640,3286672895,HU
-3286672896,3286679551,AT
+3286671360,3286679551,AT
3286679552,3286695935,IT
3286695936,3286761471,DK
3286761472,3286773759,GB
@@ -72912,7 +77181,9 @@
3286777856,3286778111,GB
3286778112,3286781951,FR
3286781952,3286794239,GB
-3286794240,3286888447,DE
+3286794240,3286799103,DE
+3286799104,3286799359,IT
+3286799360,3286888447,DE
3286888448,3286889471,IE
3286889472,3286892543,DE
3286892544,3286893055,LI
@@ -72962,7 +77233,6 @@
3286917120,3286918143,RU
3286918144,3286919167,AT
3286919168,3286920191,DE
-3286920192,3286920447,RU
3286921216,3286922239,UA
3286922240,3286923263,GB
3286923264,3286924287,CM
@@ -72981,7 +77251,6 @@
3286929408,3286929663,LV
3286929664,3286929919,BE
3286929920,3286930175,SE
-3286930176,3286930431,RU
3286930432,3286930687,UA
3286930688,3286930943,DE
3286930944,3286931199,SE
@@ -73092,7 +77361,6 @@
3287218432,3287218687,GB
3287218688,3287218943,RU
3287218944,3287219199,FR
-3287219200,3287219455,DE
3287219456,3287219711,CH
3287219712,3287220223,SE
3287220224,3287285759,RU
@@ -73167,7 +77435,7 @@
3287465984,3287467007,DK
3287467008,3287468031,SA
3287468032,3287469055,UA
-3287469056,3287471103,DE
+3287469056,3287470079,DE
3287471104,3287472127,GB
3287472128,3287472639,RU
3287472640,3287473151,UA
@@ -73178,7 +77446,7 @@
3287479296,3287480319,RO
3287480320,3287481343,AT
3287481344,3287482367,PL
-3287482368,3287548927,DE
+3287482368,3287548415,DE
3287548928,3287549439,UA
3287549440,3287549951,SE
3287549952,3287550463,UA
@@ -73265,7 +77533,6 @@
3287675648,3287675903,DE
3287675904,3287676159,BE
3287676160,3287676415,DE
-3287676416,3287676671,RU
3287676672,3287676927,GB
3287676928,3287677183,ES
3287677184,3287677439,RU
@@ -73297,7 +77564,6 @@
3287728128,3287729407,IT
3287729664,3287729919,DK
3287729920,3287730175,HU
-3287731200,3287732223,DE
3287732224,3287734271,IT
3287734272,3287734527,PL
3287734528,3287734783,UA
@@ -73339,7 +77605,6 @@
3287830784,3287831039,GB
3287831040,3287831295,RU
3287831296,3287831551,CH
-3287831552,3287831807,RO
3287831808,3287832063,AT
3287832064,3287832319,FI
3287832320,3287832575,NL
@@ -73369,7 +77634,6 @@
3287869952,3287870463,UA
3287870464,3287870975,RU
3287870976,3287871487,NL
-3287872512,3287873023,GB
3287873024,3287873535,PL
3287873536,3287874047,RU
3287874048,3287874559,FR
@@ -73397,7 +77661,7 @@
3287954432,3287954687,CH
3287954688,3287954943,RO
3287954944,3287955199,PL
-3287955200,3287955711,RU
+3287955456,3287955711,RU
3287955712,3287955967,DE
3287955968,3287956223,SI
3287956224,3287956479,RO
@@ -73501,10 +77765,8 @@
3288466432,3288467455,SY
3288467456,3288469503,BI
3288469504,3288481791,ZA
-3288481792,3288482303,ZW
-3288482304,3288483071,ZA
-3288483072,3288483327,ZW
-3288483328,3288485631,ZA
+3288481792,3288482559,ZW
+3288482560,3288485631,ZA
3288485632,3288485887,ZW
3288485888,3288489983,MA
3288489984,3288514559,ZA
@@ -73554,14 +77816,14 @@
3288578048,3288580095,JM
3288580096,3288588287,BB
3288588288,3288608255,ZA
-3288608256,3288614655,US
+3288608256,3288608264,US
+3288608265,3288608265,DE
+3288608266,3288614655,US
3288614656,3288616959,ZA
3288616960,3288617215,ZW
3288617216,3288661759,ZA
3288661760,3288662015,LS
-3288662016,3288727551,ZA
-3288727552,3288727807,MU
-3288727808,3288753919,ZA
+3288662016,3288753919,ZA
3288753920,3288754175,NG
3288758272,3288758527,EG
3288758528,3288772607,ZA
@@ -73582,7 +77844,9 @@
3288787968,3288788223,EG
3288788224,3288792831,ZA
3288792832,3288793087,AO
-3288793088,3289004031,ZA
+3288793088,3289002751,ZA
+3289002752,3289003007,AO
+3289003008,3289004031,ZA
3289004032,3289005055,NG
3289005056,3289005311,TZ
3289005312,3289014527,ZA
@@ -73602,7 +77866,8 @@
3289027584,3289027839,MZ
3289027840,3289041407,ZA
3289041408,3289041663,NG
-3289041664,3289044991,ZA
+3289041664,3289044735,ZA
+3289044736,3289044991,GH
3289044992,3289047039,ML
3289047040,3289048063,ZA
3289048064,3289048319,UG
@@ -73610,8 +77875,7 @@
3289048832,3289049087,NG
3289049088,3289053951,ZA
3289053952,3289055231,NG
-3289055232,3289063423,ZA
-3289067520,3289071103,ZA
+3289055232,3289071103,ZA
3289071104,3289071359,SO
3289071616,3289074431,ZA
3289074432,3289074687,DZ
@@ -73636,6 +77900,7 @@
3289108480,3289114367,ZA
3289114368,3289114623,NG
3289114624,3289115135,ZA
+3289115136,3289115391,AO
3289115392,3289120511,ZA
3289120512,3289120767,TZ
3289120768,3289123327,PR
@@ -73650,20 +77915,28 @@
3289169920,3289186303,MA
3289186304,3289212159,ZA
3289212160,3289212415,MZ
+3289212416,3289212927,NG
3289214976,3289215231,NG
3289215232,3289217279,ZA
3289217280,3289217535,KE
3289218560,3289220351,ZA
3289220352,3289220607,TZ
3289220608,3289221119,ZA
-3289221632,3289229311,ZA
+3289221120,3289221631,KE
+3289221632,3289227519,ZA
+3289227520,3289227775,NG
+3289227776,3289229311,ZA
3289229312,3289229567,SZ
-3289229824,3289230591,ZA
+3289229568,3289230591,ZA
+3289230592,3289230847,KE
3289233408,3289233919,ZA
3289233920,3289234175,TZ
3289234176,3289235199,ZA
3289235200,3289235455,KE
-3289237504,3289243391,ZA
+3289237504,3289237759,ZA
+3289238528,3289238783,AO
+3289238784,3289239039,ZA
+3289239552,3289243391,ZA
3289243392,3289243647,BI
3289243648,3289321471,ZA
3289321472,3289325567,IN
@@ -73754,9 +78027,11 @@
3290719232,3290955775,ZA
3290955776,3290980351,CR
3290980352,3290984447,ZA
+3290984448,3290988543,MZ
3290988544,3290992639,KE
3290992640,3290996735,GH
3290996736,3291000831,NG
+3291000832,3291004927,ZA
3291004928,3291021311,NG
3291021312,3291029503,ZA
3291029504,3291037695,TZ
@@ -73818,6 +78093,7 @@
3291215616,3291215871,BF
3291215872,3291216127,KE
3291216128,3291216383,LS
+3291216384,3291216639,ZA
3291216640,3291216895,NG
3291217920,3291230207,ZA
3291230208,3291234303,GH
@@ -73897,15 +78173,16 @@
3291546624,3291546879,SZ
3291546880,3291547135,TZ
3291547136,3291547391,AO
+3291547392,3291547647,RW
+3291547648,3291547903,BJ
+3291547904,3291548159,MU
3291742208,3292004351,US
3292004352,3292266495,SC
3292397568,3292528639,ZA
3300917248,3300921343,MU
3300921344,3300925439,BJ
3300925440,3300929535,MG
-3300933632,3300935679,MU
-3300937728,3300938751,MU
-3300941824,3300950015,MU
+3300933632,3300950015,MU
3300953088,3300954111,MU
3300966400,3301113855,ZA
3301113856,3301146623,NG
@@ -73945,8 +78222,9 @@
3301471488,3301474047,NG
3301474048,3301474303,GH
3301474304,3301490687,MA
+3301490688,3301494783,ZA
3301494784,3301498879,ZM
-3301507328,3301507583,ZW
+3301507328,3301507583,MU
3301507584,3301507839,GH
3301507840,3301508095,EG
3301508608,3301509119,ZA
@@ -73987,12 +78265,12 @@
3302490624,3302491135,MU
3302491136,3302492159,NG
3302492160,3302494207,MW
-3302494208,3302496255,ZA
3302498304,3302502399,NA
3302502400,3302505471,AO
3302505472,3302506495,NA
3302506496,3302514687,KE
3302522880,3302523903,KE
+3302523904,3302525951,ZA
3302525952,3302526975,EG
3302526976,3302529023,NG
3302529024,3302530047,ZA
@@ -74014,6 +78292,7 @@
3302540288,3302540799,UG
3302540800,3302541311,AO
3302541312,3302542335,NG
+3302542336,3302542591,ZA
3302543360,3302544383,NG
3302544384,3302544639,CM
3302544640,3302544895,MU
@@ -74023,8 +78302,8 @@
3302548992,3302549503,ZA
3302549504,3302550015,KE
3302550016,3302550527,TZ
-3302550528,3302551039,ZA
-3302551040,3302551551,MU
+3302550528,3302551295,ZA
+3302551296,3302551551,MU
3302551552,3302552063,EG
3302552064,3302552575,KE
3302552832,3302553087,KE
@@ -74035,7 +78314,6 @@
3302554368,3302554623,NG
3302554624,3302554879,EG
3302554880,3302555135,NG
-3302555136,3302555391,MU
3302555392,3302555647,NG
3302555648,3302621183,MA
3302621184,3302684671,EG
@@ -74048,6 +78326,7 @@
3302766592,3302768639,ZA
3302768640,3302776831,NG
3302776832,3302785023,ZW
+3302785024,3302793215,NG
3302801408,3302805503,NG
3302805504,3302809599,MW
3302809600,3302817791,NG
@@ -74085,16 +78364,15 @@
3302958080,3302958335,BI
3302958336,3302958591,SZ
3302958592,3302958847,DJ
+3302958848,3302959103,GA
+3302959104,3302959359,BJ
+3302985728,3302987775,MU
3304062976,3304456191,SC
3304456192,3304521727,NG
3304521728,3304587263,SC
3304587264,3304718335,ZA
3304849408,3305111551,ZA
-3305111552,3305130239,TN
-3305130240,3305130495,GP
-3305130496,3305362687,TN
-3305362688,3305362943,GP
-3305362944,3307208703,TN
+3305111552,3307208703,TN
3307208704,3309305855,EG
3309305856,3312451583,ZA
3312451584,3312975871,DZ
@@ -74170,13 +78448,13 @@
3315463168,3315464191,SO
3315464192,3315465215,CD
3315465216,3315466239,CG
-3315466240,3315467263,MZ
-3315467264,3315467519,ZA
-3315467520,3315482623,MZ
+3315466240,3315482623,MZ
3315482624,3315499007,MG
3315499008,3315515391,ZM
3315515392,3315531775,SC
-3315531776,3315539967,CM
+3315531776,3315535871,CM
+3315535872,3315536127,TD
+3315536128,3315539967,CM
3315539968,3315548159,ZA
3315548160,3315552255,NG
3315552256,3315556351,GW
@@ -74194,9 +78472,7 @@
3317301248,3317432319,TZ
3317432320,3317497855,NA
3317497856,3317530623,CD
-3317530624,3317538815,LS
-3317538816,3317539071,ZA
-3317539072,3317547007,LS
+3317530624,3317547007,LS
3317547008,3317563391,ZA
3317563392,3317694463,GH
3317694464,3318218751,EG
@@ -74301,7 +78577,9 @@
3320905728,3320938495,DJ
3320938496,3320971263,AO
3320971264,3320979455,GA
-3320979456,3320995839,ZA
+3320979456,3320985599,ZA
+3320985600,3320985607,KE
+3320985608,3320995839,ZA
3320995840,3321004031,NG
3321004032,3321008127,GM
3321008128,3321012223,ZA
@@ -74332,7 +78610,11 @@
3321790464,3321806847,LS
3321806848,3321823231,SD
3321823232,3321839615,NG
-3321839616,3321855999,GH
+3321839616,3321848831,GH
+3321848832,3321849855,ZA
+3321849856,3321850879,GH
+3321850880,3321851903,ZA
+3321851904,3321855999,GH
3321856000,3321860095,CV
3321860096,3321864191,ZA
3321864192,3321868287,NG
@@ -74410,7 +78692,9 @@
3323244544,3323244671,CA
3323244672,3323245319,US
3323245320,3323245327,CA
-3323245328,3323270420,US
+3323245328,3323245463,US
+3323245464,3323245471,CA
+3323245472,3323270420,US
3323270421,3323270421,CH
3323270422,3323331583,US
3323331584,3323331839,CA
@@ -74461,14 +78745,14 @@
3323680329,3323680413,CA
3323680414,3323680414,US
3323680415,3323680511,CA
-3323680512,3323680767,US
-3323680768,3323681023,CA
-3323681024,3323681279,US
+3323680512,3323681279,US
3323681280,3323682955,CA
3323682956,3323682959,US
3323682960,3323684863,CA
3323684864,3323685375,US
-3323685376,3323685887,CA
+3323685376,3323685551,CA
+3323685552,3323685555,BY
+3323685556,3323685887,CA
3323685888,3323686399,US
3323686400,3323686911,CA
3323686912,3323687423,US
@@ -74476,7 +78760,7 @@
3323687936,3323687999,US
3323688000,3323688959,CA
3323688960,3323689199,US
-3323689200,3323689215,BY
+3323689200,3323689215,CA
3323689216,3323689471,US
3323689472,3323690495,CA
3323690496,3323741439,US
@@ -74603,11 +78887,7 @@
3324706304,3324706559,CA
3324706560,3324811047,US
3324811048,3324811055,AU
-3324811056,3324843775,US
-3324843776,3324843799,AU
-3324843800,3324843801,US
-3324843802,3324844031,AU
-3324844032,3324980223,US
+3324811056,3324980223,US
3324980224,3324981247,CA
3324981248,3325034495,US
3325034496,3325035519,NZ
@@ -74642,11 +78922,15 @@
3325206640,3325206655,US
3325206656,3325207807,CA
3325207808,3325207935,US
-3325207936,3325211419,CA
+3325207936,3325208119,CA
+3325208120,3325208123,US
+3325208124,3325211419,CA
3325211420,3325211423,US
3325211424,3325211647,CA
3325211648,3325211775,US
-3325211776,3325213687,CA
+3325211776,3325212647,CA
+3325212648,3325212655,US
+3325212656,3325213687,CA
3325213688,3325213695,US
3325213696,3325216527,CA
3325216528,3325216531,US
@@ -74664,7 +78948,11 @@
3325221452,3325221455,US
3325221456,3325221791,CA
3325221792,3325221795,FR
-3325221796,3325223647,CA
+3325221796,3325222203,CA
+3325222204,3325222207,BY
+3325222208,3325223083,CA
+3325223084,3325223087,BY
+3325223088,3325223647,CA
3325223648,3325223663,DE
3325223664,3325224671,CA
3325224672,3325224675,US
@@ -74678,7 +78966,9 @@
3325229592,3325229599,US
3325229600,3325230319,CA
3325230320,3325230323,US
-3325230324,3325231103,CA
+3325230324,3325230583,CA
+3325230584,3325230591,SN
+3325230592,3325231103,CA
3325231104,3325232127,US
3325233152,3325234175,US
3325234176,3325234431,SA
@@ -74706,9 +78996,10 @@
3325284864,3325285119,AU
3325285376,3325296383,US
3325296384,3325296639,CA
-3325296640,3325304063,US
-3325304064,3325304319,AS
-3325304320,3325304831,US
+3325296640,3325304127,US
+3325304128,3325304191,AS
+3325304192,3325304319,US
+3325304320,3325304831,AS
3325304832,3325307647,CA
3325307648,3325307903,BB
3325307904,3325313023,CA
@@ -74724,9 +79015,7 @@
3325438976,3325442559,MU
3325442560,3325443583,ZA
3325443584,3325444095,US
-3325444096,3325444351,MU
-3325444352,3325444607,ZA
-3325444608,3325448447,MU
+3325444096,3325448447,MU
3325448448,3325448959,US
3325448960,3325450239,MU
3325450240,3325451007,US
@@ -74808,7 +79097,9 @@
3326413824,3326414335,YE
3326414336,3326420991,US
3326420992,3326423039,PR
-3326423040,3326526463,US
+3326423040,3326499327,US
+3326499328,3326499583,IN
+3326499584,3326526463,US
3326526464,3326526719,CA
3326526720,3326613503,US
3326613504,3326615551,CA
@@ -74827,7 +79118,9 @@
3326713344,3326714111,US
3326714112,3326716927,CA
3326716928,3326717951,US
-3326717952,3326726399,CA
+3326717952,3326722047,CA
+3326722048,3326726143,US
+3326726144,3326726399,CA
3326726400,3326726655,US
3326726656,3326729215,CA
3326729216,3326729471,JP
@@ -74839,9 +79132,7 @@
3326738176,3326740479,US
3326741760,3326742015,US
3326742528,3326746623,US
-3326749184,3326796863,US
-3326796864,3326796927,GB
-3326796928,3326952191,US
+3326749184,3326952191,US
3326952192,3326952447,AS
3326952448,3326953983,US
3326953984,3326954495,AS
@@ -74928,9 +79219,7 @@
3328481792,3328482303,CA
3328482304,3328483071,US
3328483072,3328483327,CA
-3328483328,3328510064,US
-3328510065,3328510077,AE
-3328510078,3328515071,US
+3328483328,3328515071,US
3328515072,3328516095,DM
3328516096,3328617983,US
3328617984,3328618239,CA
@@ -74946,8 +79235,24 @@
3328774400,3328775935,CA
3328775936,3328788479,US
3328788480,3328789503,FR
-3328789504,3328794623,US
-3328794624,3328802815,CA
+3328789504,3328794879,US
+3328794880,3328795391,CA
+3328795392,3328796159,US
+3328796160,3328796671,CA
+3328796672,3328797695,US
+3328797696,3328797951,CA
+3328797952,3328798207,US
+3328798208,3328798719,CA
+3328798720,3328799487,US
+3328799488,3328799999,CA
+3328800000,3328800255,NL
+3328800256,3328800767,IT
+3328800768,3328801023,NZ
+3328801024,3328801279,SE
+3328801280,3328801791,CZ
+3328801792,3328802047,US
+3328802048,3328802303,DE
+3328802304,3328802815,AU
3328802816,3328826813,US
3328826814,3328826814,SG
3328826815,3329230335,US
@@ -75032,7 +79337,14 @@
3331102464,3331102719,CA
3331102720,3331194879,US
3331194880,3331260415,AU
-3331260416,3331356671,US
+3331260416,3331269375,US
+3331269376,3331269631,AU
+3331269632,3331269887,FR
+3331269888,3331270655,US
+3331270656,3331270911,FR
+3331270912,3331271423,US
+3331271424,3331271679,FR
+3331271680,3331356671,US
3331356672,3331357183,BZ
3331357184,3331362815,US
3331362816,3331366911,CA
@@ -75046,13 +79358,13 @@
3331563520,3331563775,CH
3331563776,3331565567,US
3331565568,3331566079,CA
-3331566080,3331575807,US
-3331575808,3331576831,KY
-3331576832,3331632639,US
+3331566080,3331632639,US
3331632640,3331632895,CA
3331632896,3331633407,US
3331633408,3331633919,CH
-3331633920,3331647231,US
+3331633920,3331637247,US
+3331637248,3331638271,KR
+3331638272,3331647231,US
3331647232,3331647487,CA
3331647488,3331649279,US
3331649280,3331649535,CA
@@ -75069,9 +79381,7 @@
3331983360,3331988479,US
3331988480,3331989503,CA
3331989504,3332028415,US
-3332028416,3332028927,CA
-3332028928,3332029183,US
-3332029184,3332030463,CA
+3332028416,3332030463,CA
3332030464,3332083967,US
3332083968,3332084223,AU
3332084224,3332423423,US
@@ -75151,9 +79461,7 @@
3332898560,3332899071,US
3332899072,3332906495,CA
3332906496,3332909567,US
-3332909568,3332909823,CA
-3332909824,3332910079,US
-3332910080,3332922879,CA
+3332909568,3332922879,CA
3332922880,3332923391,US
3332923392,3332925695,CA
3332925696,3332929023,US
@@ -75184,16 +79492,21 @@
3333374976,3333375231,IN
3333375232,3333385983,US
3333385984,3333386239,JP
-3333386240,3333427967,US
+3333386240,3333396479,US
+3333396480,3333396689,GB
+3333396690,3333396691,US
+3333396692,3333396735,GB
+3333396736,3333427967,US
3333427968,3333428007,GB
3333428008,3333428008,US
3333428009,3333428223,GB
-3333428224,3333476607,US
-3333477376,3333480191,US
+3333428224,3333480191,US
3333480192,3333481471,DE
3333481472,3333517823,US
3333517824,3333518335,CA
-3333518336,3333583871,US
+3333518336,3333519359,US
+3333519360,3333521407,GB
+3333521408,3333583871,US
3333583872,3333584895,CA
3333584896,3333593855,US
3333593856,3333594111,CA
@@ -75271,11 +79584,13 @@
3335252736,3335252991,CA
3335252992,3335276287,US
3335276288,3335276799,PR
-3335276800,3335439615,US
+3335276800,3335354179,US
+3335354180,3335354183,CA
+3335354184,3335439615,US
3335439616,3335439871,CH
3335439872,3335440383,US
3335440384,3335441151,CH
-3335441152,3335458815,US
+3335441152,3335456767,US
3335458816,3335460863,BM
3335460864,3335475199,US
3335475200,3335475455,DE
@@ -75291,7 +79606,9 @@
3336139776,3336140799,CA
3336140800,3336854015,US
3336854016,3336854271,CO
-3336854272,3336991231,US
+3336854272,3336896767,US
+3336896768,3336897023,VE
+3336897024,3336991231,US
3336991232,3336991487,CA
3336991488,3336993023,US
3336993024,3336993535,CA
@@ -75313,7 +79630,9 @@
3337055232,3337060351,CA
3337060352,3337069055,US
3337069056,3337069119,GB
-3337069120,3337289983,US
+3337069120,3337107711,US
+3337107712,3337107967,GB
+3337107968,3337289983,US
3337289984,3337293567,CA
3337293568,3337293823,US
3337293824,3337297919,CA
@@ -75356,7 +79675,9 @@
3337961728,3337961983,CA
3337961984,3337963391,US
3337963392,3337963519,CA
-3337963520,3337969663,US
+3337963520,3337963639,US
+3337963640,3337963647,CA
+3337963648,3337969663,US
3337969664,3337973759,PR
3337973760,3337977855,CA
3337977856,3337980671,US
@@ -75463,13 +79784,18 @@
3338371072,3338403839,CA
3338403840,3338424319,US
3338424320,3338428415,CA
-3338428416,3338429439,US
-3338429440,3338429951,CA
+3338428416,3338429695,US
+3338429696,3338429951,SG
3338429952,3338430719,US
-3338430720,3338432511,CA
+3338430720,3338430975,NL
+3338430976,3338431487,US
+3338431488,3338431743,CA
+3338431744,3338432255,US
+3338432256,3338432511,CA
3338432512,3338455039,US
3338455040,3338455295,GB
-3338455296,3338567679,US
+3338455296,3338541567,US
+3338542080,3338567679,US
3338567680,3338600447,CA
3338600448,3338686463,US
3338686464,3338688511,AW
@@ -75479,7 +79805,9 @@
3338825728,3338827775,AW
3338827776,3338912767,US
3338912768,3338913023,EC
-3338913024,3338935039,US
+3338913024,3338934015,US
+3338934016,3338934271,GB
+3338934272,3338935039,US
3338935040,3338935295,GB
3338935296,3338964991,US
3338964992,3338965247,CA
@@ -75532,7 +79860,9 @@
3339180032,3339181055,CA
3339181056,3339184127,US
3339184128,3339186175,CA
-3339186176,3339270399,US
+3339186176,3339261951,US
+3339261952,3339263999,HK
+3339264000,3339270399,US
3339271168,3339327999,US
3339328512,3339329535,CA
3339329536,3339337727,US
@@ -75581,9 +79911,7 @@
3339965440,3339968511,CA
3339968512,3339975935,US
3339975936,3339976191,CA
-3339976192,3339991807,US
-3339991808,3339992063,CA
-3339992064,3340080127,US
+3339976192,3340080127,US
3340080128,3340081151,CA
3340081152,3340084223,US
3340084224,3340085247,KN
@@ -75655,11 +79983,9 @@
3341216768,3341217791,CA
3341217792,3341218623,US
3341218624,3341218655,CA
-3341218656,3341339647,US
-3341339648,3341339903,CZ
-3341339904,3341340159,US
-3341340160,3341340415,CZ
-3341340416,3341439200,US
+3341218656,3341287423,US
+3341287424,3341418495,CZ
+3341418496,3341439200,US
3341439201,3341439201,CA
3341439202,3341444863,US
3341444864,3341445631,DE
@@ -75685,9 +80011,7 @@
3341518848,3341520895,CA
3341520896,3341521663,US
3341521664,3341531135,CA
-3341531392,3341531647,US
-3341531648,3341531903,IN
-3341531904,3341534207,US
+3341531136,3341534207,US
3341534976,3341537279,CA
3341537280,3341546239,US
3341546240,3341547007,CA
@@ -75752,7 +80076,8 @@
3342517248,3342526463,US
3342526464,3342528511,CA
3342528512,3342543359,US
-3342543872,3342552063,US
+3342543872,3342548991,US
+3342551040,3342552063,US
3342552064,3342553087,CA
3342553088,3342565375,US
3342565376,3342567423,CA
@@ -75768,17 +80093,15 @@
3342603264,3342604799,US
3342604800,3342605311,CA
3342605312,3342605567,US
-3342605568,3342614271,CA
-3342614528,3342623743,CA
-3342624256,3342627839,CA
-3342628096,3342663423,CA
+3342605568,3342663423,CA
3342663680,3342831103,US
3342831104,3342831359,IN
3342831360,3343013887,US
3343013888,3343015935,CA
3343015936,3343055871,US
3343055872,3343056895,CA
-3343056896,3343129087,US
+3343056896,3343126015,US
+3343126528,3343129087,US
3343129600,3343153151,US
3343153152,3343154943,CA
3343154944,3343167487,US
@@ -75809,7 +80132,9 @@
3343465472,3343466495,JM
3343466496,3343470847,US
3343471104,3343557119,US
-3343557376,3343858687,US
+3343557376,3343649791,US
+3343649792,3343650815,VI
+3343650816,3343858687,US
3343858688,3343859199,VG
3343859200,3344111871,US
3344112128,3344116223,US
@@ -75837,7 +80162,9 @@
3344242176,3344242687,US
3344242688,3344255999,CA
3344256000,3344261631,US
-3344261888,3344266239,CA
+3344261888,3344263430,CA
+3344263431,3344263431,US
+3344263432,3344266239,CA
3344266240,3344266751,US
3344266752,3344268543,CA
3344268544,3344268799,GB
@@ -75882,9 +80209,7 @@
3344656384,3344658431,US
3344658432,3344660479,CA
3344660480,3344670719,US
-3344670720,3344671231,GP
-3344671232,3344671487,MF
-3344671488,3344671743,GP
+3344670720,3344671743,GP
3344671744,3344676863,US
3344676864,3344677407,CA
3344677408,3344677423,US
@@ -75979,7 +80304,9 @@
3345447680,3345448447,FR
3345448448,3345448703,BE
3345448704,3345448959,DE
-3345448960,3346140671,US
+3345448960,3345659903,US
+3345659904,3345660159,CA
+3345660160,3346140671,US
3346141184,3346188799,US
3346189312,3346196479,US
3346196480,3346197503,CA
@@ -76069,8 +80396,8 @@
3349545728,3349545983,US
3349545984,3349549567,CA
3349550080,3349551103,CA
-3349551104,3349553663,US
-3349553664,3349605375,CA
+3349551104,3349553407,US
+3349553408,3349605375,CA
3349605632,3349607423,CA
3349607936,3349608447,CA
3349608448,3349609471,US
@@ -76193,7 +80520,8 @@
3351043072,3351043583,FR
3351043584,3351044095,CA
3351044096,3351058943,US
-3351059456,3351071743,US
+3351059456,3351068159,US
+3351068672,3351071743,US
3351071744,3351072767,CA
3351072768,3351074815,US
3351074816,3351076863,CA
@@ -76201,8 +80529,10 @@
3351080960,3351081983,AG
3351081984,3351086079,US
3351086080,3351087103,CA
-3351087104,3351094527,US
-3351094528,3351095295,CA
+3351087104,3351094271,US
+3351094272,3351094527,CA
+3351094528,3351095039,US
+3351095040,3351095295,CA
3351095296,3351103487,US
3351103488,3351104511,CA
3351104512,3351104639,JP
@@ -76233,8 +80563,7 @@
3351306240,3351307263,VC
3351307264,3351308287,US
3351308288,3351310335,CA
-3351310336,3351318015,US
-3351318528,3351326719,US
+3351310336,3351326719,US
3351326720,3351328767,CA
3351328768,3351336959,US
3351336960,3351339007,CA
@@ -76242,7 +80571,9 @@
3351357440,3351359487,CA
3351359488,3351372799,US
3351372800,3351373823,BM
-3351373824,3351380223,US
+3351373824,3351376127,US
+3351376128,3351376383,PR
+3351376384,3351380223,US
3351380224,3351380479,CA
3351380480,3351380735,US
3351380736,3351381759,CA
@@ -76345,14 +80676,18 @@
3351475712,3351475967,IS
3351475968,3351483391,US
3351483392,3351484415,CA
-3351484416,3351485439,US
-3351485440,3351488511,CA
+3351484416,3351486463,US
+3351486464,3351488511,CA
3351488512,3351494911,US
3351494912,3351495679,SG
3351495680,3351495935,US
-3351495936,3351496191,SG
+3351495936,3351495989,SG
+3351495990,3351495990,US
+3351495991,3351496191,SG
3351496192,3351496447,US
-3351496448,3351496703,SG
+3351496448,3351496675,SG
+3351496676,3351496679,US
+3351496680,3351496703,SG
3351496704,3351497727,US
3351497728,3351498751,CA
3351498752,3351501823,US
@@ -76438,8 +80773,8 @@
3353731504,3353732607,US
3353732608,3353732863,DE
3353732864,3353736191,US
-3353736192,3353736703,PR
-3353736704,3353737215,US
+3353736192,3353736959,PR
+3353736960,3353737215,US
3353737216,3353737471,GB
3353737472,3353741823,US
3353742336,3353780223,US
@@ -76450,9 +80785,7 @@
3353861120,3353862143,CA
3353862144,3353862719,US
3353862720,3353862751,CA
-3353862752,3353864447,US
-3353864448,3353864703,CA
-3353864704,3353864959,US
+3353862752,3353864959,US
3353864960,3353865215,CA
3353865216,3353884927,US
3353884928,3353885183,GB
@@ -76482,7 +80815,9 @@
3354656768,3354663423,US
3354663936,3354676223,US
3354676224,3354677247,CA
-3354677248,3354687487,US
+3354677248,3354686975,US
+3354686976,3354687231,HK
+3354687232,3354687487,US
3354687488,3354688511,CA
3354688512,3354720767,US
3354721280,3354758655,US
@@ -76504,8 +80839,7 @@
3354972160,3354972415,CA
3354972416,3355012607,US
3355013120,3355017215,CA
-3355017216,3355052031,US
-3355052032,3355052287,CA
+3355017216,3355052287,US
3355052288,3355052543,AU
3355052544,3355053311,CA
3355053312,3355053567,US
@@ -76527,14 +80861,19 @@
3355372288,3355372543,CA
3355372544,3355384831,US
3355384832,3355385855,CA
-3355385856,3355407359,US
+3355385856,3355389439,US
+3355389440,3355389695,GB
+3355389696,3355389951,JP
+3355389952,3355407359,US
3355407360,3355408383,PR
3355408384,3355412479,US
-3355412480,3355412991,BE
+3355412480,3355412607,BE
+3355412608,3355412735,US
+3355412736,3355412991,BE
3355412992,3355432959,US
3355432960,3355435007,CA
3355435008,3355443199,US
-3355443200,3355443200,GB
+3355443200,3355443200,CN
3355443201,3355445247,CO
3355445248,3355447295,BR
3355447296,3355447551,CU
@@ -76550,7 +80889,6 @@
3355459584,3355459839,PA
3355459840,3355460095,VE
3355460096,3355460351,CL
-3355460352,3355460607,BR
3355460608,3355460863,UY
3355460864,3355461887,BR
3355461888,3355463423,EC
@@ -76566,7 +80904,7 @@
3355467264,3355467519,US
3355467520,3355467775,MX
3355467776,3355468799,AR
-3355469312,3355469567,BR
+3355468800,3355469567,BR
3355469568,3355470591,MX
3355470592,3355470847,PE
3355470848,3355471103,CL
@@ -76714,8 +81052,7 @@
3355870720,3355871231,CR
3355871232,3355873279,BR
3355873280,3355875327,BQ
-3355875328,3355876351,MX
-3355876352,3355877375,VE
+3355875328,3355877375,MX
3355877376,3355885567,CO
3355885568,3355901951,GT
3355901952,3355902975,BR
@@ -76783,7 +81120,9 @@
3356076288,3356078079,BR
3356078080,3356078335,EC
3356078336,3356079359,CL
+3356079616,3356080127,MX
3356080128,3356080383,BR
+3356080384,3356080639,MX
3356080896,3356082431,NI
3356082432,3356082687,CL
3356082688,3356082943,AR
@@ -76899,7 +81238,10 @@
3356180480,3356190719,CL
3356190720,3356192767,DO
3356192768,3356194815,AR
-3356196864,3356229631,VE
+3356196864,3356201471,KY
+3356201472,3356201727,VE
+3356201728,3356213247,KY
+3356213248,3356229631,VE
3356229632,3356233727,BR
3356233728,3356237823,CL
3356237824,3356246015,GT
@@ -76951,8 +81293,8 @@
3356329984,3356332031,GF
3356332032,3356334079,CU
3356334080,3356336127,BO
-3356336128,3356337151,SV
-3356337152,3356337663,HN
+3356336128,3356336895,SV
+3356336896,3356337663,HN
3356337664,3356337919,SV
3356337920,3356338175,HN
3356338176,3356339967,SV
@@ -76969,7 +81311,7 @@
3356368896,3356369407,BR
3356369408,3356369663,EC
3356369664,3356369919,BR
-3356370176,3356370943,AR
+3356369920,3356370943,AR
3356370944,3356372991,CO
3356372992,3356375039,CU
3356377088,3356379647,CL
@@ -76988,13 +81330,13 @@
3356391168,3356391423,PA
3356393472,3356413439,CL
3356413440,3356413823,CO
-3356413824,3356420607,CL
-3356420608,3356420991,CO
-3356420992,3356421247,CL
-3356421248,3356421375,CO
-3356421376,3356421759,CL
-3356421760,3356422015,CO
-3356422016,3356425471,CL
+3356413824,3356419839,CL
+3356419840,3356419967,CO
+3356419968,3356420863,CL
+3356420864,3356421375,CO
+3356421376,3356421631,CL
+3356421632,3356422143,CO
+3356422144,3356425471,CL
3356425472,3356425599,CO
3356425600,3356426239,CL
3356426240,3356427263,BR
@@ -77005,7 +81347,9 @@
3356499968,3356508159,MX
3356508160,3356508671,AR
3356508672,3356509183,CR
-3356509184,3356510207,VE
+3356509184,3356509439,VE
+3356509440,3356509503,US
+3356509504,3356510207,VE
3356510208,3356511999,AR
3356512000,3356512255,CO
3356512256,3356514303,AR
@@ -77027,15 +81371,15 @@
3356958720,3356967167,MX
3356967424,3356967935,MX
3356967936,3356968959,BR
-3356968960,3356970495,MX
-3356971520,3356972031,MX
+3356968960,3356972031,MX
3356972288,3356979967,MX
3356980480,3356980735,MX
3356981248,3356988415,MX
3356988672,3356989439,MX
3356989952,3356996607,MX
3356996608,3356997631,BR
-3356997632,3357003007,MX
+3356997632,3356998911,MX
+3356999168,3357003007,MX
3357003776,3357007871,MX
3357007872,3357011967,BR
3357011968,3357015551,MX
@@ -77128,9 +81472,8 @@
3357451144,3357451151,HN
3357451152,3357451263,GT
3357451264,3357451519,HN
-3357451520,3357451575,GT
-3357451576,3357451583,NI
-3357451584,3357452287,GT
+3357451520,3357451775,NI
+3357451776,3357452287,GT
3357452288,3357452799,HN
3357452800,3357453055,NI
3357453056,3357453071,GT
@@ -77151,7 +81494,9 @@
3357457712,3357457727,CR
3357457728,3357458431,GT
3357458432,3357474815,CL
-3357474816,3357475071,US
+3357474816,3357475015,US
+3357475016,3357475019,AR
+3357475020,3357475071,US
3357475072,3357475887,AR
3357475888,3357475903,VE
3357475904,3357475999,AR
@@ -77198,7 +81543,9 @@
3357480360,3357480367,CO
3357480368,3357480463,AR
3357480464,3357480479,CO
-3357480480,3357480719,AR
+3357480480,3357480511,AR
+3357480512,3357480543,CO
+3357480544,3357480719,AR
3357480720,3357480735,CO
3357480736,3357480959,AR
3357480960,3357483007,EC
@@ -77213,7 +81560,9 @@
3357556992,3357557247,AR
3357557248,3357557759,MX
3357557760,3357558783,EC
-3357558784,3357559039,AR
+3357558784,3357558895,AR
+3357558896,3357558903,EC
+3357558904,3357559039,AR
3357559040,3357559295,EC
3357559296,3357559551,CA
3357559552,3357559807,US
@@ -77236,9 +81585,7 @@
3357606912,3357607167,AR
3357607168,3357613055,MX
3357613056,3357613311,AR
-3357613312,3357616127,MX
-3357616384,3357618943,MX
-3357619200,3357623039,MX
+3357613312,3357623039,MX
3357623040,3357623295,AR
3357623296,3357626623,MX
3357627392,3357627647,MX
@@ -77266,9 +81613,9 @@
3357715456,3357715711,MX
3357715968,3357723903,MX
3357724416,3357725183,MX
-3357725440,3357726463,MX
+3357725440,3357726719,MX
3357726720,3357727743,BR
-3357728000,3357728767,MX
+3357727744,3357728767,MX
3357728768,3357736959,BR
3357736960,3357745151,VE
3357745152,3357753343,CO
@@ -77280,7 +81627,11 @@
3357776128,3357776383,UY
3357776384,3357776895,US
3357776896,3357777919,CL
-3357777920,3357786111,GT
+3357777920,3357778415,GT
+3357778416,3357778423,SV
+3357778424,3357784319,GT
+3357784320,3357784335,SV
+3357784336,3357786111,GT
3357786112,3357802495,VE
3357802496,3357868031,MX
3357868032,3357933567,PE
@@ -77301,28 +81652,30 @@
3358132128,3358132135,CO
3358132136,3358132607,AR
3358132608,3358132735,CO
-3358132736,3358132991,AR
-3358132992,3358133119,EC
+3358132736,3358132975,AR
+3358132976,3358133119,EC
3358133120,3358133247,AR
3358133248,3358133759,VE
3358133760,3358142719,AR
3358142720,3358142975,US
3358142976,3358143231,CO
-3358143232,3358143487,AR
+3358143232,3358143295,VE
+3358143296,3358143487,AR
3358143488,3358143999,US
-3358144000,3358144255,AR
+3358144000,3358144127,CL
+3358144128,3358144255,AR
3358144256,3358144511,CL
3358144512,3358145023,VE
3358145024,3358149631,AR
-3358149632,3358149887,CO
-3358149888,3358150015,AR
-3358150016,3358150143,CO
-3358150144,3358150423,AR
+3358149632,3358150399,CO
+3358150400,3358150423,AR
3358150424,3358150431,CO
3358150432,3358150479,AR
3358150480,3358150655,CO
3358150656,3358150911,EC
-3358150912,3358151263,AR
+3358150912,3358151039,AR
+3358151040,3358151167,EC
+3358151168,3358151263,AR
3358151264,3358151271,EC
3358151272,3358151423,AR
3358151424,3358151551,EC
@@ -77330,12 +81683,12 @@
3358151680,3358151807,PE
3358151808,3358151935,AR
3358151936,3358152191,PE
-3358152192,3358152559,AR
-3358152560,3358152575,PE
+3358152192,3358152543,AR
+3358152544,3358152575,PE
3358152576,3358152703,AR
3358152704,3358152959,US
-3358152960,3358153087,EC
-3358153088,3358153279,AR
+3358152960,3358153215,EC
+3358153216,3358153279,AR
3358153280,3358153311,US
3358153312,3358153343,AR
3358153344,3358153535,US
@@ -77363,10 +81716,18 @@
3358326784,3358392319,VE
3358392320,3358457855,AR
3358457856,3358523391,PA
-3358523392,3358529535,VE
+3358523392,3358524159,VE
+3358524160,3358524415,AR
+3358524416,3358525951,VE
+3358525952,3358526463,AR
+3358526464,3358529535,VE
3358529536,3358530303,AR
-3358530304,3358532607,VE
-3358532608,3358532863,AR
+3358530304,3358530943,VE
+3358530944,3358531071,AR
+3358531072,3358531583,VE
+3358531584,3358531839,AR
+3358531840,3358532351,VE
+3358532352,3358532863,AR
3358532864,3358534399,VE
3358534400,3358534655,AR
3358534656,3358535167,VE
@@ -77375,15 +81736,22 @@
3358539520,3358539775,AR
3358539776,3358543871,VE
3358543872,3358544127,MX
-3358544128,3358548223,VE
+3358544128,3358544383,AR
+3358544384,3358545407,VE
+3358545408,3358545663,AR
+3358545664,3358548223,VE
3358548224,3358548479,AR
3358548480,3358549759,VE
3358549760,3358550015,AR
3358550016,3358553599,VE
3358553600,3358553855,AR
-3358553856,3358558463,VE
+3358553856,3358556159,VE
+3358556160,3358558463,AR
3358558464,3358558591,PY
-3358558592,3358562303,VE
+3358558592,3358559231,AR
+3358559232,3358560255,VE
+3358560256,3358561791,AR
+3358561792,3358562303,VE
3358562304,3358563327,PE
3358563328,3358564095,CO
3358564096,3358564351,MX
@@ -77406,15 +81774,9 @@
3358565184,3358565247,AR
3358565248,3358565311,VE
3358565312,3358565343,AR
-3358565344,3358565567,VE
-3358565568,3358565599,AR
-3358565600,3358565791,VE
-3358565792,3358565855,AR
-3358565856,3358565951,VE
-3358565952,3358566015,AR
-3358566016,3358566047,VE
-3358566048,3358566111,AR
-3358566112,3358566847,VE
+3358565344,3358565375,VE
+3358565376,3358566399,AR
+3358566400,3358566847,VE
3358566848,3358566879,AR
3358566880,3358566911,VE
3358566912,3358566975,AR
@@ -77429,24 +81791,17 @@
3358567392,3358567407,VE
3358567408,3358567423,AR
3358567424,3358568959,CO
-3358568960,3358570495,VE
+3358568960,3358569471,AR
+3358569472,3358570495,VE
3358570496,3358570751,MX
3358570752,3358571263,PE
3358571264,3358572543,MX
-3358572544,3358573055,VE
-3358573056,3358573311,AR
-3358573312,3358574847,VE
-3358574848,3358576127,AR
-3358576128,3358577151,VE
+3358572544,3358577151,AR
3358577152,3358577407,PE
-3358577408,3358577919,AR
-3358577920,3358578175,VE
-3358578176,3358578431,AR
+3358577408,3358578431,AR
3358578432,3358578687,VE
3358578688,3358579967,CO
-3358579968,3358580223,AR
-3358580224,3358580735,MX
-3358580736,3358588927,VE
+3358579968,3358588927,AR
3358588928,3358654463,PE
3358654464,3358658559,AR
3358658560,3358660607,CL
@@ -77479,9 +81834,7 @@
3358892032,3358918655,MX
3358918656,3358924799,BR
3358924800,3358965759,MX
-3358965760,3358966783,BR
-3358966784,3358967039,MX
-3358967040,3358973951,BR
+3358965760,3358973951,BR
3358973952,3358982143,MX
3358982144,3359047679,CL
3359047680,3359080447,AR
@@ -77552,7 +81905,9 @@
3359899648,3359916031,CL
3359916032,3359932415,AR
3359932416,3359948799,MX
-3359948800,3359989759,AR
+3359948800,3359989247,AR
+3359989248,3359989503,US
+3359989504,3359989759,AR
3359989760,3359997951,CO
3359997952,3360006143,AR
3360006144,3360014335,EC
@@ -77574,7 +81929,9 @@
3360251904,3360253951,BO
3360253952,3360255999,SV
3360256000,3360260095,CL
-3360260096,3360276479,AR
+3360260096,3360260351,AR
+3360260352,3360260607,US
+3360260608,3360276479,AR
3360276480,3360278527,VE
3360278528,3360280575,EC
3360280576,3360282623,CL
@@ -77584,9 +81941,7 @@
3360342016,3360354303,VE
3360354304,3360356351,PA
3360356352,3360358399,CR
-3360358400,3360358911,CL
-3360358912,3360358919,CO
-3360358920,3360366591,CL
+3360358400,3360366591,CL
3360366592,3360382975,CO
3360382976,3360399359,VE
3360399360,3360403455,BO
@@ -77610,7 +81965,9 @@
3360707584,3360708095,US
3360708096,3360708223,AR
3360708224,3360708351,US
-3360708352,3360708991,AR
+3360708352,3360708479,AR
+3360708480,3360708735,US
+3360708736,3360708991,AR
3360708992,3360709247,US
3360709248,3360709631,AR
3360709632,3360709759,US
@@ -77626,13 +81983,19 @@
3360765952,3360767999,CO
3360768000,3360772351,AR
3360772352,3360772479,BO
-3360772480,3360781839,AR
+3360772480,3360780303,AR
+3360780304,3360780319,BR
+3360780320,3360780399,AR
+3360780400,3360780415,BR
+3360780416,3360781839,AR
3360781840,3360781847,DO
3360781848,3360781943,AR
3360781944,3360781947,MX
3360781948,3360782167,AR
3360782168,3360782175,MX
-3360782176,3360788479,AR
+3360782176,3360782239,AR
+3360782240,3360782247,MX
+3360782248,3360788479,AR
3360788480,3360790527,CL
3360790528,3360849919,AR
3360849920,3360882687,VE
@@ -77645,17 +82008,14 @@
3361034240,3361036287,EC
3361036288,3361046527,AR
3361046528,3361052671,BO
-3361052672,3361054719,AR
+3361052672,3361054463,AR
+3361054464,3361054719,PE
3361054720,3361058815,NI
3361058816,3361062911,AR
3361062912,3361071103,CL
3361071104,3361072639,CO
3361072640,3361072767,VE
-3361072768,3361072895,CO
-3361072896,3361073151,VE
-3361073152,3361074175,CO
-3361074176,3361074431,VE
-3361074432,3361079295,CO
+3361072768,3361079295,CO
3361079296,3361144831,CL
3361144832,3361210367,BO
3361210368,3361275903,DO
@@ -77704,19 +82064,25 @@
3362258944,3362324479,CL
3362324480,3362324735,AR
3362324736,3362324991,US
-3362324992,3362328063,AR
+3362324992,3362326015,AR
+3362326016,3362326271,US
+3362326272,3362327039,AR
+3362327040,3362327551,US
+3362327552,3362328063,AR
3362328064,3362328575,US
3362328576,3362337279,AR
3362337280,3362338047,US
-3362338048,3362342143,AR
+3362338048,3362338559,AR
+3362338560,3362338815,US
+3362338816,3362339327,AR
+3362339328,3362339583,US
+3362339584,3362342143,AR
3362342144,3362342399,PA
3362342400,3362343423,AR
3362343424,3362343679,US
3362343680,3362344447,AR
-3362344448,3362344703,US
-3362344704,3362344959,AR
-3362344960,3362346751,US
-3362346752,3362348799,AR
+3362344448,3362346495,US
+3362346496,3362348799,AR
3362348800,3362349055,US
3362349056,3362351103,CR
3362351104,3362353151,AR
@@ -77729,8 +82095,7 @@
3362426880,3362428927,PA
3362428928,3362430975,CL
3362430976,3362447359,CO
-3362447360,3362447871,SV
-3362447872,3362448895,HN
+3362447360,3362448895,HN
3362448896,3362449151,SV
3362449152,3362449407,HN
3362449408,3362451199,SV
@@ -77760,7 +82125,13 @@
3362529280,3362537471,PA
3362537472,3362545663,AR
3362545664,3362549759,PE
-3362549760,3362553855,AR
+3362549760,3362551871,AR
+3362551872,3362551887,MX
+3362551888,3362552143,AR
+3362552144,3362552159,PR
+3362552160,3362553023,AR
+3362553024,3362553039,PR
+3362553040,3362553855,AR
3362553856,3362557951,PY
3362557952,3362562047,AR
3362570240,3362586623,UY
@@ -77893,7 +82264,9 @@
3368086528,3368087551,CR
3368087552,3370188799,BR
3370188800,3370196991,MX
-3370196992,3370487807,BR
+3370196992,3370214399,BR
+3370214400,3370215423,AR
+3370215424,3370487807,BR
3370487808,3370488831,CR
3370488832,3370489855,AR
3370489856,3370490879,VE
@@ -77901,7 +82274,9 @@
3370506240,3370507263,VE
3370507264,3370514943,BR
3370515456,3370516479,AR
-3370516480,3376873471,BR
+3370516480,3371106303,BR
+3371106304,3371122687,MX
+3371122688,3376873471,BR
3376881664,3376922623,BR
3376926720,3377291263,BR
3377295360,3377303551,BR
@@ -77917,21 +82292,34 @@
3380761088,3380761599,VE
3380761600,3380764671,BR
3380764672,3380808191,MX
+3380808192,3380808703,CR
3380808704,3380811775,MX
3380811776,3380813823,BR
3380813824,3380815103,MX
3380815104,3380815359,CR
+3380815360,3380815871,CL
3380815872,3380816127,MX
3380816128,3380816383,BO
+3380816384,3380816639,SV
+3380816640,3380816895,CW
3380816896,3380817151,MX
+3380817152,3380817407,BO
+3380817408,3380817663,CO
+3380817664,3380817919,AR
3380817920,3380818175,MX
+3380818176,3380818431,PA
3380818944,3380822527,MX
+3380822528,3380822783,NI
3380823040,3380824063,BR
-3380824064,3380826111,MX
+3380824064,3380824319,MX
+3380824320,3380824575,GT
+3380825088,3380825343,MX
+3380825344,3380825599,HT
3380826112,3380828159,BR
3380828160,3380828671,MX
3380829184,3380830207,BR
3380830208,3380830463,MX
+3380830464,3380830719,CO
3380831232,3380831743,MX
3380832256,3380832767,MX
3380833280,3380833791,MX
@@ -77939,6 +82327,7 @@
3380835328,3380835839,MX
3380836352,3380836607,MX
3380836608,3380836863,PE
+3380836864,3380837375,SV
3380837376,3380840447,MX
3380840448,3380843519,BR
3380843520,3380844543,PA
@@ -78062,9 +82451,7 @@
3384410112,3384672255,CL
3384672256,3384688639,HN
3384688640,3384705023,CO
-3384705024,3384705535,US
-3384705536,3384706047,PA
-3384706048,3384707071,US
+3384705024,3384707071,US
3384707072,3384721407,PA
3384721408,3384725503,US
3384725504,3384732415,PA
@@ -78151,16 +82538,20 @@
3387424768,3387555839,CO
3387555840,3387568127,AR
3387568128,3387572223,PE
-3387572224,3387573375,AR
-3387573376,3387573759,CO
-3387573760,3387574015,AR
+3387572224,3387572539,AR
+3387572540,3387572543,CO
+3387572544,3387573375,AR
+3387573376,3387573887,CO
+3387573888,3387574015,AR
3387574016,3387574143,CO
3387574144,3387574783,AR
3387574784,3387575039,CO
3387575040,3387575295,AR
3387575296,3387575423,CO
-3387575424,3387575807,AR
-3387575808,3387576063,CO
+3387575424,3387575551,AR
+3387575552,3387575567,CO
+3387575568,3387575679,AR
+3387575680,3387576063,CO
3387576064,3387576319,AR
3387576320,3387578367,EC
3387578368,3387584511,AR
@@ -78268,7 +82659,8 @@
3389143040,3389145087,AU
3389145088,3389151231,HK
3389151232,3389152255,JP
-3389152256,3389153279,AU
+3389152256,3389153023,US
+3389153024,3389153279,AU
3389153280,3389161471,TV
3389161472,3389194239,JP
3389194240,3389195775,AU
@@ -78291,8 +82683,7 @@
3389214720,3389218815,NZ
3389218816,3389222911,AU
3389222912,3389223935,US
-3389223936,3389225983,IN
-3389225984,3389226239,SG
+3389223936,3389226239,IN
3389226240,3389226495,AU
3389226496,3389227007,IN
3389227008,3389227519,CN
@@ -78396,7 +82787,6 @@
3389420032,3389420287,CN
3389420288,3389420543,AU
3389420544,3389421055,NZ
-3389421056,3389421311,AU
3389421312,3389421567,JP
3389421568,3389422591,KI
3389422592,3389431807,AU
@@ -78414,7 +82804,7 @@
3389458432,3389460479,AU
3389460480,3389464575,JP
3389464576,3389469695,NZ
-3389469696,3389471743,IN
+3389471232,3389471487,IN
3389471744,3389472767,NZ
3389472768,3389480959,AU
3389480960,3389489151,JP
@@ -78543,7 +82933,10 @@
3389812736,3389813759,AU
3389813760,3389814015,CN
3389814016,3389814527,TH
-3389814528,3389846527,AU
+3389814528,3389815295,AU
+3389816064,3389816575,AU
+3389816576,3389816831,US
+3389816832,3389846527,AU
3389846528,3389847551,JP
3389847552,3389849599,NZ
3389849600,3389915135,JP
@@ -78668,7 +83061,6 @@
3390339328,3390339839,NZ
3390339840,3390340351,JP
3390340352,3390340607,CN
-3390340608,3390340863,IN
3390340864,3390341119,CN
3390341120,3390375935,KR
3390375936,3390377983,AU
@@ -78762,7 +83154,9 @@
3391620864,3391621119,CN
3391621120,3391622911,HK
3391622912,3391623167,CN
-3391623168,3391653631,HK
+3391623168,3391627263,HK
+3391627264,3391651839,IN
+3391651840,3391653631,HK
3391653632,3391654143,CN
3391654144,3391654911,HK
3391654912,3391655167,CN
@@ -78890,7 +83284,9 @@
3391954944,3391971327,HK
3391971328,3391979519,AU
3391979520,3391979775,HK
-3391979776,3391980031,JP
+3391979776,3391979955,CN
+3391979956,3391979957,JP
+3391979958,3391980031,CN
3391980032,3391980543,HK
3391980544,3391983615,MY
3391983616,3391984639,NP
@@ -78991,7 +83387,6 @@
3392416256,3392416767,HK
3392416768,3392417023,IN
3392417024,3392417535,AU
-3392417536,3392417791,HK
3392417792,3392418559,ID
3392418560,3392418815,SG
3392418816,3392419071,ID
@@ -79041,8 +83436,7 @@
3392503808,3392505343,HK
3392506880,3392507903,HK
3392512000,3392516095,BD
-3392516096,3392520191,NZ
-3392520192,3392524287,AU
+3392516096,3392524287,AU
3392524288,3392528383,JP
3392528384,3392536575,ID
3392536576,3392602111,IN
@@ -79073,9 +83467,7 @@
3392692224,3392700415,IN
3392700416,3392708607,SG
3392708608,3392712703,ID
-3392712704,3392714751,AF
-3392714752,3392715007,FR
-3392715008,3392716799,AF
+3392712704,3392716799,AF
3392716800,3392733183,IN
3392733184,3392741375,ID
3392741376,3392765951,PH
@@ -79189,7 +83581,6 @@
3393021696,3393021951,HK
3393021952,3393022463,ID
3393022464,3393022975,SG
-3393022976,3393023231,PH
3393023232,3393023487,AU
3393023488,3393023743,SG
3393023744,3393023999,IN
@@ -79197,7 +83588,6 @@
3393024512,3393025023,NZ
3393025024,3393025279,AU
3393025280,3393025535,IN
-3393025536,3393025791,PH
3393025792,3393026047,AU
3393026560,3393026815,AU
3393027072,3393028095,ID
@@ -79237,9 +83627,7 @@
3393189888,3393190911,CN
3393190912,3393191167,IN
3393191424,3393191935,SB
-3393191936,3393222911,HK
-3393222912,3393223167,MY
-3393223168,3393257471,HK
+3393191936,3393257471,HK
3393257472,3393260031,CN
3393260032,3393260543,BD
3393260544,3393265663,AU
@@ -79307,7 +83695,7 @@
3393620992,3393621247,JP
3393621248,3393622015,AU
3393622016,3393626111,PK
-3393626112,3393630207,CN
+3393626112,3393630207,HK
3393630208,3393634303,JP
3393634304,3393638399,CN
3393638400,3393650687,JP
@@ -79356,7 +83744,9 @@
3393855744,3393855999,NZ
3393856000,3393856255,AU
3393856256,3393856511,HK
-3393856768,3393857023,SG
+3393856768,3393856896,AU
+3393856897,3393856897,SG
+3393856898,3393857023,AU
3393857024,3393857535,NZ
3393857536,3393858047,HK
3393858304,3393858559,ID
@@ -79488,7 +83878,9 @@
3394347008,3394351103,PH
3394355200,3394359295,IN
3394359296,3394363391,AU
-3394363392,3394441215,HK
+3394363392,3394375839,HK
+3394375840,3394375847,CN
+3394375848,3394441215,HK
3394441216,3394453503,IN
3394453504,3394461695,AU
3394461696,3394465791,SG
@@ -79553,7 +83945,9 @@
3394760704,3394764799,ID
3394764800,3394772991,HK
3394777088,3394781183,JP
-3394781184,3394789375,MP
+3394781184,3394785023,MP
+3394785024,3394785279,US
+3394785280,3394789375,MP
3394789376,3394797567,HK
3394797568,3394813951,IN
3394813952,3394815999,JP
@@ -79603,7 +83997,7 @@
3394904320,3394904575,IN
3394904576,3394905087,AU
3394905088,3394905343,BN
-3394905344,3394906111,AU
+3394905600,3394906111,AU
3394906112,3394906367,IN
3394906368,3394906623,AU
3394906624,3394907135,IN
@@ -79611,7 +84005,6 @@
3394908160,3394910207,AU
3394910208,3394912255,NZ
3394912256,3394920447,PF
-3394920448,3394924543,IN
3394924544,3394928639,CN
3394928640,3394936831,PH
3394936832,3394940927,AU
@@ -79745,9 +84138,9 @@
3397070848,3397074943,PH
3397074944,3397083135,HK
3397083136,3397087231,CN
-3397091328,3397097471,GU
-3397097472,3397097855,MP
-3397097856,3397099519,GU
+3397091328,3397095679,GU
+3397095680,3397095935,MP
+3397095936,3397099519,GU
3397099520,3397103615,HK
3397103616,3397105663,LA
3397105664,3397107711,JP
@@ -79789,7 +84182,7 @@
3397213184,3397213439,IN
3397213440,3397213695,AU
3397213696,3397214207,ID
-3397214208,3397214719,MN
+3397214208,3397214719,BD
3397214720,3397215231,AU
3397215232,3397215743,ID
3397215744,3397216255,PH
@@ -79870,7 +84263,8 @@
3397500928,3397501951,BD
3397501952,3397503999,IN
3397504000,3397505023,TH
-3397505024,3397506559,IN
+3397505280,3397505535,IN
+3397506048,3397506559,IN
3397506560,3397506815,AU
3397506816,3397507071,IN
3397507072,3397507583,ID
@@ -79947,19 +84341,27 @@
3397812224,3397816319,CN
3397816320,3397832703,IN
3397836800,3397844991,AU
-3397844992,3397857791,JP
-3397857792,3397858047,AU
-3397858048,3397862143,JP
-3397862144,3397862399,PH
+3397844992,3397845247,JP
+3397845248,3397845503,AU
+3397845504,3397846015,JP
+3397846016,3397846271,AU
+3397846272,3397857791,JP
+3397857792,3397858559,AU
+3397858560,3397861887,JP
+3397861888,3397862399,PH
3397862400,3397869823,JP
3397869824,3397870079,AU
-3397870080,3397878527,JP
+3397870080,3397871871,JP
+3397871872,3397872127,AU
+3397872128,3397878527,JP
3397878528,3397878783,TW
3397878784,3397881855,JP
3397881856,3397882111,HK
3397882112,3397887999,JP
-3397888000,3397888768,IN
-3397888769,3397910527,JP
+3397888000,3397889023,IN
+3397889024,3397895423,JP
+3397895424,3397895679,AU
+3397895680,3397910527,JP
3397910528,3397918719,SG
3397918720,3397922815,AU
3397922816,3397926911,CN
@@ -80070,16 +84472,15 @@
3398639904,3398639907,MY
3398639908,3398640671,JP
3398640672,3398640695,SG
-3398640696,3398641407,JP
-3398641408,3398641663,MY
-3398641664,3398641919,JP
+3398640696,3398641919,JP
3398641920,3398642175,AU
3398642176,3398642431,JP
3398642432,3398642943,AU
3398642944,3398643199,JP
3398643200,3398643455,AU
3398643456,3398647807,JP
-3398647808,3398668287,AU
+3398647808,3398655999,IN
+3398656000,3398668287,AU
3398668288,3398672383,CN
3398672384,3398680575,PK
3398680576,3398684671,ID
@@ -80108,8 +84509,7 @@
3398830080,3398831103,KH
3398831104,3398831359,JP
3398831360,3398831615,HK
-3398831616,3398831871,SG
-3398831872,3398832127,JP
+3398831616,3398832127,JP
3398832128,3398840319,CN
3398840320,3398842367,JP
3398842368,3398843391,CN
@@ -80256,7 +84656,7 @@
3399827456,3399835647,AU
3399835648,3399839743,CN
3399839744,3399841791,JP
-3399841792,3399852031,TW
+3399843840,3399852031,TW
3399852032,3399856127,JP
3399856128,3399860223,CN
3399860224,3399864319,PG
@@ -80400,7 +84800,9 @@
3400433664,3400435711,HK
3400435712,3400435967,BD
3400435968,3400441855,HK
-3400441856,3400450047,NZ
+3400441856,3400446975,NZ
+3400446976,3400447231,GB
+3400447232,3400450047,NZ
3400450048,3400458239,JP
3400458240,3400466431,AU
3400466432,3400499199,MO
@@ -80428,7 +84830,9 @@
3400648832,3400649943,SG
3400649944,3400649951,HK
3400649952,3400650239,SG
-3400650240,3400654847,AU
+3400650240,3400650495,AU
+3400650496,3400650751,SG
+3400650752,3400654847,AU
3400654848,3400663039,IN
3400663040,3400683519,MY
3400683520,3400691711,JP
@@ -80476,7 +84880,8 @@
3401400320,3401404415,AU
3401404416,3401408511,CN
3401408512,3401416703,HK
-3401416704,3401420799,KR
+3401416704,3401416959,KR
+3401417728,3401420799,SG
3401420800,3401424895,JP
3401424896,3401428991,NZ
3401428992,3401431039,JP
@@ -80500,7 +84905,9 @@
3401545728,3401547775,BD
3401547776,3401580543,IN
3401580544,3402629119,CN
-3402629120,3405774847,JP
+3402629120,3402917631,JP
+3402917632,3402917887,US
+3402917888,3405774847,JP
3405774848,3405775871,AU
3405775872,3405776895,CN
3405776896,3405777407,AU
@@ -80698,8 +85105,6 @@
3406208512,3406208767,AU
3406208768,3406209023,CN
3406209024,3406221311,AU
-3406221824,3406222079,IN
-3406222592,3406222847,IN
3406223360,3406225407,AU
3406225408,3406229503,CN
3406229504,3406231039,AU
@@ -80817,7 +85222,9 @@
3406512384,3406512639,IN
3406512640,3406513663,AU
3406513664,3406513919,CN
-3406513920,3406514687,AU
+3406513920,3406514175,AU
+3406514176,3406514431,IN
+3406514432,3406514687,AU
3406514688,3406514943,TH
3406514944,3406515199,AU
3406515200,3406516223,CN
@@ -80927,7 +85334,8 @@
3406696960,3406697215,IN
3406697216,3406698495,AU
3406698496,3406699519,CN
-3406699520,3406700799,AU
+3406699520,3406700543,AU
+3406700544,3406700799,IN
3406700800,3406701055,CN
3406701056,3406706687,AU
3406706688,3406706943,CN
@@ -81009,7 +85417,9 @@
3406864640,3406865151,CN
3406865152,3406865663,AU
3406865664,3406865919,IN
-3406865920,3406871039,AU
+3406865920,3406869759,AU
+3406869760,3406870015,JP
+3406870016,3406871039,AU
3406871040,3406871551,CN
3406871552,3406881791,AU
3406881792,3406882047,CN
@@ -81056,7 +85466,9 @@
3406948352,3406948607,AU
3406948608,3406948863,CN
3406948864,3406950655,AU
-3406950656,3406951423,NF
+3406950656,3406950911,NF
+3406950912,3406951167,AU
+3406951168,3406951423,NF
3406951424,3406952447,AU
3406952448,3406952703,CN
3406952960,3406954239,AU
@@ -81072,7 +85484,8 @@
3406962688,3406963967,AU
3406963968,3406964223,CN
3406964224,3406966783,AU
-3406966784,3406967551,CN
+3406966784,3406967295,CN
+3406967296,3406967551,HK
3406967552,3406967807,IN
3406967808,3406968063,CN
3406968064,3406972927,AU
@@ -81294,7 +85707,8 @@
3407297792,3407298559,CN
3407298560,3407300863,AU
3407300864,3407301119,CN
-3407301120,3407303935,AU
+3407301120,3407301887,AU
+3407302144,3407303935,AU
3407303936,3407304191,CN
3407304192,3407305727,AU
3407305728,3407306751,CN
@@ -81361,8 +85775,8 @@
3407377408,3407377663,CN
3407377664,3407378943,AU
3407378944,3407379455,CN
-3407379456,3407382271,AU
-3407382272,3407382527,JP
+3407379456,3407382015,AU
+3407382016,3407382527,JP
3407382528,3407384831,AU
3407384832,3407385087,CN
3407385088,3407386623,AU
@@ -81401,7 +85815,9 @@
3407438592,3407439103,CN
3407439104,3407440383,AU
3407440384,3407440639,CN
-3407440640,3407446783,AU
+3407440640,3407440895,AU
+3407440896,3407441151,IN
+3407441152,3407446783,AU
3407446784,3407447039,CN
3407447040,3407447807,AU
3407447808,3407448063,CN
@@ -81436,7 +85852,11 @@
3407473408,3407473919,CN
3407473920,3407475199,AU
3407475200,3407475455,CN
-3407475456,3407481855,AU
+3407475456,3407481087,AU
+3407481088,3407481223,JP
+3407481224,3407481231,AU
+3407481232,3407481599,JP
+3407481600,3407481855,AU
3407481856,3407482111,CN
3407482112,3407487487,AU
3407487488,3407487743,CN
@@ -81594,7 +86014,8 @@
3407667712,3407668223,CN
3407668224,3407671039,AU
3407671040,3407671295,CN
-3407671296,3407675903,AU
+3407671296,3407674367,AU
+3407674880,3407675903,AU
3407675904,3407676159,CN
3407676160,3407677439,AU
3407677440,3407677951,CN
@@ -82101,7 +86522,9 @@
3409871616,3409871871,CN
3409871872,3409873663,AU
3409873664,3409873919,CN
-3409873920,3409876991,AU
+3409873920,3409875967,AU
+3409875968,3409876735,JP
+3409876736,3409876991,AU
3409876992,3409878015,TH
3409878016,3409879295,AU
3409879296,3409879551,CN
@@ -82111,7 +86534,11 @@
3409888000,3409888255,HK
3409888256,3409888511,AU
3409888512,3409888767,CN
-3409888768,3409896447,AU
+3409888768,3409891327,AU
+3409891328,3409891839,GB
+3409891840,3409892351,AU
+3409892352,3409892863,US
+3409892864,3409896447,AU
3409896448,3409897471,CN
3409897472,3409897983,AU
3409897984,3409898239,CN
@@ -82299,7 +86726,7 @@
3411641344,3411642367,IN
3411642368,3411643391,CN
3411643392,3411644415,VN
-3411644416,3411644927,AU
+3411644672,3411644927,AU
3411644928,3411645951,ID
3411645952,3411646207,SG
3411646208,3411647487,IN
@@ -82346,12 +86773,7 @@
3411859252,3411861503,JP
3411861504,3411869695,AU
3411869696,3411943423,CN
-3411943424,3411946495,NZ
-3411946496,3411947007,AU
-3411947008,3411948031,NZ
-3411948032,3411948543,AU
-3411948544,3411950591,NZ
-3411950592,3411951615,AU
+3411943424,3411951615,NZ
3411951616,3411967999,LK
3411968000,3411984383,AU
3411984384,3412000767,IN
@@ -82478,7 +86900,8 @@
3413180416,3413213183,TH
3413213184,3413229567,VN
3413229568,3413245951,AU
-3413245952,3413262335,MY
+3413245952,3413251071,MY
+3413251072,3413262335,JP
3413262336,3413263359,PH
3413270528,3413278719,TH
3413278720,3413295103,NZ
@@ -82495,11 +86918,7 @@
3413327872,3413344255,IN
3413344256,3413360639,PH
3413360640,3413377023,MY
-3413377024,3413395199,SG
-3413395200,3413395455,AU
-3413395456,3413415935,SG
-3413415936,3413416191,AU
-3413416192,3413524479,SG
+3413377024,3413524479,SG
3413524480,3413540863,TH
3413540864,3413557247,NZ
3413557248,3413565439,CN
@@ -82577,7 +86996,9 @@
3413934080,3413946367,IN
3413946368,3413950463,AU
3413950464,3413966847,IN
-3413966848,3414050303,SG
+3413966848,3414024191,SG
+3414024192,3414024447,AU
+3414024448,3414050303,SG
3414050304,3414050559,US
3414050560,3414155519,SG
3414155520,3414155775,PH
@@ -82748,7 +87169,6 @@
3416262656,3416264703,AU
3416264704,3416268799,JP
3416268800,3416272895,HK
-3416274688,3416274943,MN
3416274944,3416276991,ID
3416276992,3416285183,HK
3416285184,3416287231,VN
@@ -82777,8 +87197,6 @@
3416372224,3416372479,CN
3416372480,3416372735,SG
3416372736,3416372991,AU
-3416373248,3416373503,AU
-3416373504,3416373759,SG
3416373760,3416374271,AU
3416374272,3416374527,PH
3416374528,3416374783,IN
@@ -82790,12 +87208,13 @@
3416474584,3416474599,AU
3416474600,3416474639,JP
3416474640,3416474647,NZ
-3416474648,3416475391,JP
-3416475392,3416475647,NZ
-3416475648,3416482047,JP
-3416482048,3416482303,SG
-3416482304,3416489727,JP
-3416489728,3416489983,AU
+3416474648,3416475439,JP
+3416475440,3416475455,NZ
+3416475456,3416482047,JP
+3416482048,3416482055,SG
+3416482056,3416489755,JP
+3416489756,3416489759,AU
+3416489760,3416489983,JP
3416489984,3416506367,VN
3416506368,3416514559,TW
3416514560,3416522751,IN
@@ -82803,8 +87222,8 @@
3416588288,3416653823,JP
3416653824,3416667135,AU
3416667136,3416667647,US
-3416667648,3416667775,AU
-3416667776,3416668159,US
+3416667648,3416667903,AU
+3416667904,3416668159,US
3416668160,3416686591,AU
3416686592,3416694783,SG
3416694784,3416702975,CN
@@ -82887,7 +87306,7 @@
3417014272,3417022463,JP
3417022464,3417030655,KR
3417030656,3417034751,AU
-3417034752,3417035775,IN
+3417035008,3417035775,IN
3417035776,3417036799,JP
3417036800,3417037823,ID
3417037824,3417038079,AU
@@ -82912,21 +87331,17 @@
3417182208,3417184767,AU
3417184768,3417185023,MN
3417185024,3417185279,AF
-3417185280,3417185535,AU
-3417185536,3417185791,SG
+3417185280,3417185791,SG
3417185792,3417186303,NZ
3417186304,3417194495,HK
3417194496,3417198591,JP
-3417198592,3417200127,SG
-3417200128,3417200383,AU
-3417200384,3417200639,SG
+3417198592,3417200639,SG
3417200640,3417202687,JP
3417202688,3417210879,CN
3417210880,3417227263,AU
3417227264,3417243647,JP
3417243648,3417244671,PH
3417244672,3417245695,IN
-3417245696,3417247743,BT
3417247744,3417251839,JP
3417251840,3417260031,KR
3417260032,3417264127,PK
@@ -83034,7 +87449,9 @@
3418243072,3418251263,PH
3418251264,3418255359,CN
3418255360,3418257407,ID
-3418257408,3418259455,HK
+3418257408,3418257663,HK
+3418257664,3418257919,AU
+3418257920,3418259455,HK
3418259456,3418267647,IN
3418267648,3418271743,VN
3418271744,3418273791,SG
@@ -83045,9 +87462,7 @@
3418282240,3418282495,AU
3418282496,3418283519,PH
3418283520,3418284031,AU
-3418284032,3418286847,SG
-3418286848,3418287103,AU
-3418287104,3418288127,SG
+3418284032,3418288127,SG
3418288128,3418290175,ID
3418290176,3418290431,IN
3418290432,3418290687,CN
@@ -83066,7 +87481,6 @@
3418301440,3418302463,AU
3418302464,3418304511,ID
3418304512,3418306559,VN
-3418306560,3418307583,MN
3418308608,3418324991,CN
3418324992,3418326015,VU
3418326016,3418326271,AU
@@ -83094,7 +87508,9 @@
3418403584,3418403839,AU
3418403840,3418406911,JP
3418406912,3418423295,IN
-3418423296,3418444091,HK
+3418423296,3418434559,HK
+3418434560,3418434815,SG
+3418434816,3418444091,HK
3418444092,3418444095,CN
3418444096,3418456063,HK
3418456064,3418472447,IN
@@ -83123,7 +87539,9 @@
3418642944,3418643199,ID
3418643200,3418643455,JP
3418643456,3418644479,AU
-3418644480,3418650807,JP
+3418644480,3418644735,JP
+3418644736,3418644863,AU
+3418644864,3418650807,JP
3418650808,3418650808,HK
3418650809,3418650823,JP
3418650824,3418650839,HK
@@ -83156,7 +87574,13 @@
3419078656,3419209727,TW
3419209728,3419226111,VN
3419226112,3419234303,CN
-3419234304,3419242495,JP
+3419234304,3419239935,JP
+3419239936,3419240447,US
+3419240448,3419240959,JP
+3419240960,3419241471,US
+3419241472,3419241983,JP
+3419241984,3419242239,US
+3419242240,3419242495,JP
3419242496,3419275263,CN
3419275264,3419340799,AU
3419340800,3419344895,TW
@@ -83233,8 +87657,8 @@
3419897856,3419899903,JP
3419899904,3419900159,FR
3419900160,3419900415,BE
-3419900416,3419901439,AU
-3419901440,3419901951,NZ
+3419900416,3419901567,AU
+3419901568,3419901951,NZ
3419901952,3419902207,AU
3419902208,3419902463,HK
3419902464,3419902719,CN
@@ -83313,15 +87737,13 @@
3422000536,3422000536,IN
3422000537,3422552063,KR
3422552064,3422850559,US
-3422850560,3422851071,GB
-3422851072,3422955519,US
+3422850560,3422850815,GB
+3422850816,3422955519,US
3422955520,3422956799,FR
-3422956800,3423092735,US
-3423092736,3423092767,VI
-3423092768,3423092783,US
-3423092784,3423092831,VI
-3423092832,3423092847,US
-3423092848,3423093759,VI
+3422956800,3423076351,US
+3423076352,3423077375,CA
+3423077376,3423092735,US
+3423092736,3423093759,VI
3423093760,3423094783,US
3423094784,3423095807,CA
3423095808,3423128575,US
@@ -83333,10 +87755,8 @@
3423182848,3423184895,CA
3423184896,3423204095,US
3423204096,3423204351,CA
-3423204352,3423222271,US
-3423222272,3423222527,CA
-3423222528,3423229951,US
-3423232000,3423236095,US
+3423204352,3423229951,US
+3423230976,3423236095,US
3423238144,3423248383,US
3423248384,3423249407,CA
3423249408,3423258623,US
@@ -83368,9 +87788,7 @@
3423468544,3423469567,CA
3423469568,3423473663,US
3423473664,3423474687,CA
-3423474688,3423480063,US
-3423480064,3423480319,AU
-3423480320,3423480831,US
+3423474688,3423480831,US
3423480832,3423480987,NG
3423480988,3423480988,US
3423480989,3423481343,NG
@@ -83391,7 +87809,8 @@
3423586304,3423588351,US
3423590400,3423602687,US
3423602688,3423603711,KN
-3423603712,3423626239,US
+3423603712,3423614975,US
+3423616000,3423626239,US
3423626240,3423627263,CA
3423627264,3423629311,US
3423629312,3423630335,AG
@@ -83440,15 +87859,16 @@
3424507136,3424507391,CA
3424507392,3425173503,US
3425173504,3425304575,CA
-3425304576,3425471487,US
-3425472512,3425697791,US
+3425304576,3425697791,US
3425697792,3425699839,CA
3425699840,3425711615,US
3425713152,3425714175,US
3425714176,3425722367,CA
3425722368,3425726463,US
3425728512,3425828863,US
-3425828864,3425894399,CA
+3425828864,3425869167,CA
+3425869168,3425869183,US
+3425869184,3425894399,CA
3425894400,3426013183,US
3426013184,3426013439,IL
3426013440,3426306559,US
@@ -83499,7 +87919,6 @@
3427618304,3427618559,CA
3427618560,3427631103,US
3427632128,3427647999,US
-3427648000,3427648511,CA
3427648512,3427651071,US
3427651072,3427651327,CA
3427651328,3427729407,US
@@ -83694,8 +88113,8 @@
3428589568,3428591871,US
3428591872,3428592127,CA
3428592128,3428592383,US
-3428592384,3428594175,CA
-3428594176,3428594687,US
+3428592384,3428593919,CA
+3428593920,3428594687,US
3428594688,3428595199,CA
3428595200,3428596223,US
3428596224,3428596735,CA
@@ -83767,9 +88186,7 @@
3429171200,3429236735,CA
3429236736,3429382143,US
3429382144,3429382399,DE
-3429382400,3429401855,US
-3429401856,3429402111,CA
-3429402112,3429500927,US
+3429382400,3429500927,US
3429500928,3429502975,CA
3429502976,3429517407,US
3429517408,3429517411,HK
@@ -83784,11 +88201,10 @@
3429777408,3429809151,US
3429810176,3429892095,US
3429892096,3429957631,CA
-3429957632,3430073354,US
+3429957632,3430025471,US
+3430025728,3430073354,US
3430073355,3430073355,AU
-3430073356,3430074111,US
-3430074112,3430074367,AU
-3430074368,3430146047,US
+3430073356,3430146047,US
3430148096,3430328831,US
3430328832,3430329087,GH
3430329088,3430354943,US
@@ -83856,12 +88272,15 @@
3430845440,3430845951,MX
3430845952,3430849535,US
3430849536,3430850047,CA
-3430850048,3430973951,US
-3430974208,3431114495,US
+3430850048,3431114495,US
3431114496,3431114751,CA
3431114752,3431468031,US
3431468032,3431469055,CA
-3431469056,3431596287,US
+3431469056,3431526911,US
+3431526912,3431526921,CH
+3431526922,3431526922,US
+3431526923,3431527167,CH
+3431527168,3431596287,US
3431596288,3431602687,CA
3431602688,3431602943,US
3431602944,3431606271,CA
@@ -83933,9 +88352,9 @@
3432493824,3432495103,DE
3432495104,3432517119,US
3432517120,3432517631,MU
-3432517632,3432571647,US
-3432571648,3432571903,CA
-3432571904,3432579071,US
+3432517632,3432570879,US
+3432570880,3432572927,HK
+3432572928,3432579071,US
3432580096,3432585215,US
3432585216,3432585727,MX
3432585728,3432609791,US
@@ -83951,7 +88370,8 @@
3432689152,3432689663,CA
3432689664,3432695807,US
3432697856,3432708095,US
-3432710144,3432807423,US
+3432710144,3432717311,US
+3432718336,3432807423,US
3432807424,3432808447,CA
3432808448,3433824511,US
3433824512,3433824767,DE
@@ -83969,7 +88389,8 @@
3434014720,3434015231,US
3434015232,3434020607,CA
3434020608,3434427391,US
-3434427392,3434428415,HR
+3434427392,3434428159,HR
+3434428160,3434428415,HN
3434428416,3434433279,US
3434433280,3434433535,PR
3434433536,3434553343,US
@@ -83981,7 +88402,9 @@
3434575616,3434583039,US
3434583040,3434584063,NL
3434584064,3434807551,US
-3434807552,3434831359,CA
+3434807552,3434810111,CA
+3434810112,3434810367,US
+3434810368,3434831359,CA
3434831360,3434831615,US
3434831616,3434872575,CA
3434872576,3434913791,US
@@ -84016,9 +88439,7 @@
3436290048,3436314367,CA
3436314368,3436476415,US
3436476416,3436478463,AW
-3436478464,3436492799,US
-3436492800,3436493055,NL
-3436493056,3436507135,US
+3436478464,3436507135,US
3436507136,3436509183,BB
3436509184,3436697087,US
3436697088,3436697343,VE
@@ -84140,8 +88561,8 @@
3437755904,3437756159,US
3437756160,3437756415,IE
3437756416,3437772799,US
-3437772800,3437776895,CA
-3437776896,3437789863,US
+3437772800,3437776639,CA
+3437776640,3437789863,US
3437789864,3437789871,AU
3437789872,3437961215,US
3437961216,3437964287,ZA
@@ -84290,8 +88711,8 @@
3449212928,3449213183,US
3449213184,3449213695,CA
3449213696,3449214975,US
-3449214976,3449215743,CA
-3449215744,3449215871,US
+3449214976,3449215487,CA
+3449215488,3449215871,US
3449215872,3449215999,CA
3449216000,3449220607,US
3449220608,3449221375,CA
@@ -84310,9 +88731,7 @@
3449575680,3449593855,US
3449593856,3449594111,AU
3449594112,3449638911,US
-3449638912,3449639167,GB
-3449639168,3449639423,US
-3449639424,3449639679,GB
+3449638912,3449639679,GB
3449639680,3449639935,US
3449639936,3449640191,GB
3449640192,3449640447,NL
@@ -84329,7 +88748,9 @@
3449843200,3449843711,YE
3449843712,3449874687,US
3449874688,3449874943,AG
-3449874944,3449923583,US
+3449874944,3449884159,US
+3449884160,3449884415,AS
+3449884416,3449923583,US
3449923584,3449923839,ES
3449923840,3449974783,US
3449974784,3449976831,CA
@@ -84380,17 +88801,13 @@
3450950656,3450951679,JP
3450951680,3450953727,US
3450953728,3450957823,DE
-3450957824,3450974207,US
-3450974208,3450974463,GB
-3450974464,3450975231,US
+3450957824,3450975231,US
3450975232,3450975743,LB
3450975744,3450982399,US
3450982400,3450984447,TW
3450984448,3450986495,PH
3450986496,3450986751,HK
-3450986752,3450987007,US
-3450987008,3450987263,CN
-3450987264,3451170303,US
+3450986752,3451170303,US
3451170304,3451170559,VE
3451170560,3451187967,US
3451187968,3451188223,AU
@@ -84467,9 +88884,7 @@
3452174336,3452180479,US
3452181504,3452436479,US
3452436480,3452502015,CA
-3452502016,3452678399,US
-3452678400,3452682239,BE
-3452682240,3452715007,US
+3452502016,3452715007,US
3452715008,3452723199,CA
3452723200,3452764671,US
3452764672,3452765183,CA
@@ -84491,9 +88906,7 @@
3452770304,3452770559,CA
3452770560,3452770815,US
3452770816,3452771071,CA
-3452771072,3452771327,US
-3452771328,3452771583,CA
-3452771584,3452771839,US
+3452771072,3452771839,US
3452771840,3452773119,CA
3452773120,3452773375,US
3452773376,3452773887,CA
@@ -84570,7 +88983,9 @@
3452813312,3452813567,US
3452813568,3452814079,CA
3452814080,3452814335,US
-3452814336,3452816127,CA
+3452814336,3452815359,CA
+3452815360,3452815615,US
+3452815616,3452816127,CA
3452816128,3452816511,US
3452816512,3452816527,CA
3452816528,3452816895,US
@@ -84588,7 +89003,9 @@
3452821504,3452822271,US
3452822272,3452822527,CA
3452822528,3452822783,US
-3452822784,3452824063,CA
+3452822784,3452823551,CA
+3452823552,3452823807,US
+3452823808,3452824063,CA
3452824064,3452824319,US
3452824320,3452824575,CA
3452824576,3452824831,US
@@ -84917,12 +89334,14 @@
3456303104,3456311295,JP
3456311296,3456360447,US
3456360448,3456364543,BG
-3456364544,3456892927,US
+3456364544,3456856063,US
+3456856064,3456856319,CA
+3456856320,3456892927,US
3456892928,3456958463,CA
3456958464,3457551871,US
3457551872,3457552127,CA
-3457552128,3457553151,US
-3457553152,3457553663,CA
+3457552128,3457553407,US
+3457553408,3457553663,CA
3457553664,3457554175,US
3457554176,3457554431,CA
3457554432,3457555711,US
@@ -84965,6 +89384,8 @@
3458820096,3458820351,CA
3458820352,3458820863,US
3458820864,3458821119,JM
+3458821120,3458821887,US
+3458821888,3458822143,CA
3458822144,3459055615,US
3459055616,3459121151,CA
3459121152,3459186687,US
@@ -85091,14 +89512,12 @@
3459456512,3459456767,US
3459456768,3459457279,CA
3459457536,3459457791,CA
-3459457792,3459458047,PR
3459458048,3459512319,US
3459512320,3459513855,CA
3459513856,3459592191,US
3459592192,3459596287,CA
-3459596288,3459614719,US
-3459616768,3459617023,CA
-3459617024,3459617791,US
+3459596288,3459614975,US
+3459616768,3459617791,US
3459617792,3459617999,CA
3459618000,3459618000,ID
3459618001,3459618047,CA
@@ -85107,12 +89526,14 @@
3459619072,3459622911,US
3459624960,3459629055,BM
3459629056,3459631103,US
-3459633152,3459731455,US
+3459633152,3459686399,US
+3459686400,3459687167,NL
+3459687168,3459731455,US
3459731456,3459735551,CA
3459735552,3459745535,US
3459745536,3459745791,IT
3459745792,3459842815,US
-3459842816,3459843071,AR
+3459842816,3459843071,BR
3459843072,3459848959,US
3459848960,3459849215,FR
3459849216,3459850239,US
@@ -85286,7 +89707,9 @@
3461513728,3461513983,BF
3461513984,3461514495,US
3461514496,3461514751,QA
-3461514752,3461516287,US
+3461514752,3461515775,US
+3461515776,3461516031,CA
+3461516032,3461516287,US
3461516288,3461516543,IL
3461516544,3461548031,US
3461550080,3461554175,US
@@ -85441,7 +89864,9 @@
3464388608,3464391935,US
3464391936,3464392191,CA
3464392192,3464394751,US
-3464394752,3464396799,VC
+3464394752,3464395263,VC
+3464395264,3464395519,LC
+3464395520,3464396799,VC
3464396800,3464415231,US
3464417280,3464421631,US
3464421632,3464421887,CA
@@ -85510,9 +89935,9 @@
3465962496,3465962751,CA
3465962752,3466067967,US
3466067968,3466068223,CA
-3466068224,3466068991,US
-3466068992,3466069247,CA
-3466069248,3466069343,US
+3466068224,3466069055,US
+3466069056,3466069087,CA
+3466069088,3466069343,US
3466069344,3466069375,CA
3466069376,3466069447,US
3466069448,3466069455,CA
@@ -85556,11 +89981,13 @@
3466914304,3466914559,FR
3466914560,3466929407,US
3466929408,3466929663,IT
-3466929664,3466937663,US
+3466929664,3466937599,US
+3466937600,3466937663,ES
3466937664,3466937669,DE
3466937670,3466937670,US
3466937671,3466937727,DE
-3466937728,3466938444,US
+3466937728,3466937855,ES
+3466937856,3466938444,US
3466938445,3466938448,HK
3466938449,3466938807,US
3466938808,3466938811,GB
@@ -85700,9 +90127,7 @@
3469176320,3469176575,MX
3469176576,3469186303,US
3469186304,3469186559,MX
-3469186560,3469859583,US
-3469859584,3469859839,CA
-3469859840,3469893631,US
+3469186560,3469893631,US
3469893632,3469901823,CA
3469901824,3469989887,US
3469990400,3470131199,US
@@ -85735,11 +90160,11 @@
3470610432,3470614527,AR
3470614528,3470646591,US
3470646592,3470646599,CN
-3470646600,3470651391,US
+3470646600,3470646831,US
+3470646832,3470646847,IL
+3470646848,3470651391,US
3470651392,3470655487,CA
-3470655488,3470660647,US
-3470660648,3470660655,IE
-3470660656,3470671871,US
+3470655488,3470671871,US
3470671872,3470680063,CA
3470680064,3470744063,US
3470744064,3470744575,CA
@@ -85802,7 +90227,9 @@
3473755392,3473755647,HN
3473755648,3473765887,US
3473765888,3473766399,EC
-3473766400,3473901055,US
+3473766400,3473786111,US
+3473786112,3473786127,PR
+3473786128,3473901055,US
3473901056,3473901311,EC
3473901312,3473917439,US
3473917440,3473917695,PR
@@ -85837,7 +90264,9 @@
3475670272,3475670527,AI
3475670528,3475670783,LC
3475670784,3475670847,DM
-3475670848,3475671039,AG
+3475670848,3475670857,AG
+3475670858,3475670858,DM
+3475670859,3475671039,AG
3475671040,3475681279,US
3475681280,3475685375,HN
3475685376,3475851263,US
@@ -85865,7 +90294,8 @@
3476447232,3476455423,CA
3476455424,3476881407,US
3476881408,3476946943,CA
-3476946944,3477542143,US
+3476946944,3477389311,US
+3477393408,3477542143,US
3477542144,3477542399,IN
3477542400,3478114303,US
3478114304,3478118399,PE
@@ -85873,7 +90303,9 @@
3478192128,3478257663,CA
3478257664,3478274823,US
3478274824,3478274831,GB
-3478274832,3478288671,US
+3478274832,3478288607,US
+3478288608,3478288615,GB
+3478288616,3478288671,US
3478288672,3478288703,GB
3478288704,3478372351,US
3478372352,3478380543,MX
@@ -86021,7 +90453,9 @@
3481843456,3481843711,GB
3481843712,3481951395,US
3481951396,3481951399,GB
-3481951400,3481964575,US
+3481951400,3481958271,US
+3481958272,3481958399,NL
+3481958400,3481964575,US
3481964576,3481964579,IE
3481964580,3481993791,US
3481993792,3481993799,CA
@@ -86105,9 +90539,9 @@
3482039296,3482039551,US
3482039552,3482040319,CA
3482040320,3482041087,US
-3482041088,3482041343,CA
-3482041344,3482041599,US
-3482041600,3482042367,CA
+3482041088,3482041855,CA
+3482041856,3482042111,US
+3482042112,3482042367,CA
3482042368,3482043903,US
3482043904,3482044927,CA
3482044928,3482045183,US
@@ -86125,7 +90559,11 @@
3482051584,3482051839,US
3482051840,3482052863,CA
3482052864,3482053631,US
-3482053632,3482054655,CA
+3482053632,3482053887,CA
+3482053888,3482053999,US
+3482054000,3482054015,CA
+3482054016,3482054143,US
+3482054144,3482054655,CA
3482054656,3482058239,US
3482058240,3482058495,CA
3482058496,3482583039,US
@@ -86160,8 +90598,13 @@
3484322048,3484323839,US
3484326912,3484327423,US
3484331008,3484437503,US
-3484437504,3484442623,GB
-3484442624,3484450815,US
+3484437504,3484438527,GB
+3484438528,3484438783,ZM
+3484438784,3484439039,US
+3484439040,3484439295,GB
+3484439296,3484439551,US
+3484439552,3484439807,ZM
+3484439808,3484450815,US
3484450816,3484451839,CA
3484451840,3484452095,US
3484452096,3484453631,CA
@@ -86246,9 +90689,9 @@
3485462528,3485464575,VC
3485464576,3485466623,LC
3485466624,3485597695,US
-3485597696,3485672543,CA
-3485672544,3485672551,US
-3485672552,3485695999,CA
+3485597696,3485694975,CA
+3485694976,3485695231,US
+3485695232,3485695999,CA
3485696000,3485721056,US
3485721057,3485721057,AE
3485721058,3485959423,US
@@ -86457,11 +90900,11 @@
3486702592,3486702847,CA
3486702848,3487039487,US
3487039488,3487105023,CA
-3487105024,3487175935,US
+3487105024,3487174143,US
+3487174144,3487174271,CH
+3487174272,3487175935,US
3487175936,3487176191,GB
-3487176192,3487177983,US
-3487177984,3487178239,GB
-3487178240,3487181359,US
+3487176192,3487181359,US
3487181360,3487181375,GB
3487181376,3487189247,US
3487189248,3487189503,DK
@@ -86522,7 +90965,9 @@
3488940032,3488956415,CA
3488956416,3488989183,US
3488989184,3489005567,CA
-3489005568,3489136639,US
+3489005568,3489058047,US
+3489058048,3489058063,GB
+3489058064,3489136639,US
3489136640,3489153535,MX
3489153536,3489154047,HN
3489154048,3489155583,MX
@@ -86551,7 +90996,7 @@
3489399040,3489464319,US
3489464320,3489529855,CA
3489529856,3489562623,US
-3489563136,3489563391,JM
+3489565440,3489565695,JM
3489566720,3489575935,US
3489575936,3489576959,CN
3489576960,3489577215,US
@@ -86581,7 +91026,9 @@
3490265344,3490267135,CO
3490267136,3490488319,US
3490488320,3490489343,PR
-3490489344,3490703615,US
+3490489344,3490702847,US
+3490702848,3490703103,AS
+3490703104,3490703615,US
3490703616,3490703871,PR
3490703872,3490786047,US
3490786048,3490786303,PR
@@ -86594,9 +91041,7 @@
3491478528,3491637247,US
3491637248,3491637759,CO
3491637760,3491651583,US
-3491651584,3491654655,VI
-3491654656,3491654911,US
-3491654912,3491659775,VI
+3491651584,3491659775,VI
3491659776,3491743743,US
3491743744,3491745791,CO
3491745792,3491969023,US
@@ -86609,21 +91054,27 @@
3492812760,3492812763,JP
3492812764,3492845823,US
3492845824,3492846079,CH
-3492846080,3492867071,US
+3492846080,3492858111,US
+3492858112,3492858367,SA
+3492858368,3492864767,US
+3492864768,3492865023,CA
+3492865024,3492865279,US
+3492865280,3492865359,GB
+3492865360,3492865375,US
+3492865376,3492865504,GB
+3492865505,3492865505,US
+3492865506,3492865535,GB
+3492865536,3492867071,US
3492867072,3492867327,FR
-3492867328,3492868607,US
-3492868608,3492868863,MX
-3492868864,3492869631,US
+3492867328,3492869631,US
3492869632,3492869887,BR
3492869888,3492877954,US
3492877955,3492877955,CA
-3492877956,3492886527,US
-3492886528,3492886559,GB
-3492886560,3492886591,US
-3492886592,3492886783,GB
-3492886784,3492894975,US
+3492877956,3492894975,US
3492894976,3492895231,BE
-3492895232,3492912127,US
+3492895232,3492910079,US
+3492910080,3492910207,GB
+3492910208,3492912127,US
3492912128,3492912151,GB
3492912152,3492912159,US
3492912160,3492912383,GB
@@ -86631,9 +91082,9 @@
3492913664,3492913919,CA
3492913920,3492917247,US
3492917248,3492917503,VI
-3492917504,3492923391,US
-3492923392,3492923647,GB
-3492923648,3492933375,US
+3492917504,3492921855,US
+3492921856,3492922111,VI
+3492922112,3492933375,US
3492933376,3492933376,CA
3492933377,3492933377,CH
3492933378,3492933631,CA
@@ -86645,17 +91096,15 @@
3492950864,3492950879,DE
3492950880,3492954623,US
3492954624,3492955135,GB
-3492955136,3492960255,US
-3492960256,3492960511,ES
-3492960512,3492962815,US
-3492962816,3492963071,GB
-3492963072,3492968191,US
+3492955136,3492957695,US
+3492957696,3492958207,VI
+3492958208,3492962559,US
+3492962560,3492962815,GB
+3492962816,3492968191,US
3492968192,3492968447,GB
-3492968448,3492969505,US
-3492969506,3492969506,VI
-3492969507,3492969535,US
-3492969536,3492969599,VI
-3492969600,3492994815,US
+3492968448,3492969471,US
+3492969472,3492969727,VI
+3492969728,3492994815,US
3492994816,3492995071,GB
3492995072,3492996127,US
3492996128,3492996136,GB
@@ -86665,15 +91114,15 @@
3493013760,3493014015,GB
3493014016,3493014627,US
3493014628,3493014628,GB
-3493014629,3493029341,US
-3493029342,3493029342,GB
-3493029343,3493039359,US
+3493014629,3493029119,US
+3493029120,3493029311,GB
+3493029312,3493029327,US
+3493029328,3493029375,GB
+3493029376,3493039359,US
3493039360,3493039615,AR
3493039616,3493061119,US
3493061120,3493061375,BR
-3493061376,3493062911,US
-3493062912,3493063167,DE
-3493063168,3493073151,US
+3493061376,3493073151,US
3493073152,3493073407,BO
3493073408,3493073663,US
3493073664,3493073919,BO
@@ -86708,10 +91157,10 @@
3493987328,3493990399,US
3493990400,3493991423,CA
3493991424,3493998591,US
-3493998592,3493998847,AI
-3493998848,3493999359,KN
+3493998592,3493999103,AI
+3493999104,3493999359,KN
3493999360,3494000639,AI
-3494000640,3494003711,US
+3494000640,3494002687,US
3494003712,3494004735,CA
3494004736,3494009855,US
3494009856,3494010879,CA
@@ -86756,8 +91205,8 @@
3494198272,3494244351,US
3494244352,3494246399,CA
3494246400,3494247423,US
-3494247424,3494250495,CA
-3494250496,3494262783,US
+3494247424,3494251519,CA
+3494252544,3494262783,US
3494262784,3494264831,CA
3494264832,3494271999,US
3494272000,3494273023,KN
@@ -86780,7 +91229,8 @@
3494361088,3494362111,CA
3494362112,3494380543,US
3494380544,3494381567,CA
-3494381568,3494402559,US
+3494381568,3494386687,US
+3494387712,3494402559,US
3494402560,3494402815,GB
3494402816,3494410239,US
3494410240,3494412287,CA
@@ -86799,13 +91249,9 @@
3494459392,3494460415,CA
3494460416,3494464511,US
3494464512,3494465535,CA
-3494465536,3494496255,US
-3494496512,3494496767,US
-3494498304,3494510591,US
+3494465536,3494510591,US
3494510592,3494512639,CA
-3494512640,3494512895,US
-3494512896,3494513151,NO
-3494513152,3494516735,US
+3494512640,3494516735,US
3494516736,3494517759,CA
3494517760,3494540031,US
3494540032,3494540287,UG
@@ -86855,7 +91301,8 @@
3494788096,3494788351,NG
3494788352,3494788607,LY
3494788608,3494789119,CA
-3494789120,3494852607,US
+3494789120,3494812671,US
+3494813696,3494852607,US
3494852608,3494854655,CA
3494854656,3494862847,US
3494862848,3494863871,DM
@@ -86916,10 +91363,11 @@
3495215104,3495217151,VI
3495217152,3495219199,VC
3495219200,3495225343,US
+3495225856,3495226111,GB
3495226624,3495226879,US
3495227392,3495251967,US
3495251968,3495254015,CA
-3495254016,3495260159,US
+3495255040,3495260159,US
3495260160,3495261183,CA
3495261184,3495271423,US
3495272192,3495285759,US
@@ -86980,9 +91428,9 @@
3495620608,3495622655,CA
3495622656,3495635967,US
3495636992,3495647231,US
-3495648000,3495653887,US
-3495653888,3495654143,CA
-3495654144,3495673855,US
+3495648000,3495654143,US
+3495654144,3495654399,CA
+3495654400,3495673855,US
3495673856,3495674879,MF
3495674880,3495675391,VG
3495675392,3495688191,US
@@ -87018,9 +91466,10 @@
3495864320,3495864831,DM
3495864832,3495865343,MF
3495865344,3495866367,US
-3495866368,3495866623,VC
-3495866624,3495866879,LC
-3495866880,3495867391,VC
+3495866368,3495866623,LC
+3495866624,3495867050,VC
+3495867051,3495867051,LC
+3495867052,3495867391,VC
3495867392,3495867647,LC
3495867648,3495868415,VC
3495868416,3495871487,US
@@ -87046,8 +91495,10 @@
3496189952,3496190519,US
3496190520,3496190527,CA
3496190528,3496190719,US
-3496190720,3496190975,CA
-3496190976,3496296447,US
+3496190720,3496190735,CA
+3496190736,3496190751,US
+3496190752,3496190767,CA
+3496190768,3496296447,US
3496296448,3496312831,CA
3496312832,3496468479,US
3496468480,3496476671,CA
@@ -87294,7 +91745,9 @@
3507038208,3507040255,TW
3507040256,3507290111,US
3507290112,3507355647,AR
-3507355648,3507470335,US
+3507355648,3507427583,US
+3507427584,3507427839,CA
+3507427840,3507470335,US
3507470336,3507486719,CA
3507486720,3507585023,US
3507585024,3507598911,CA
@@ -87498,15 +91951,11 @@
3509522176,3509522431,CA
3509522432,3509522687,KW
3509522688,3509522943,CA
-3509522944,3509523679,US
-3509523680,3509523695,CA
-3509523696,3509524223,US
-3509524224,3509524735,CA
+3509522944,3509524479,US
+3509524480,3509524735,CA
3509524736,3509524991,US
3509524992,3509525759,CA
-3509525760,3509526015,US
-3509526016,3509526271,CA
-3509526272,3509526527,US
+3509525760,3509526527,US
3509526528,3509526783,CA
3509526784,3509527807,US
3509527808,3509528063,CA
@@ -87517,7 +91966,9 @@
3509532672,3509532927,US
3509532928,3509533439,CA
3509533440,3509534719,US
-3509534720,3509535999,CA
+3509534720,3509535487,CA
+3509535488,3509535743,US
+3509535744,3509535999,CA
3509536000,3509536255,US
3509536256,3509536767,CA
3509536768,3509537279,US
@@ -87526,9 +91977,11 @@
3509538560,3509538815,CA
3509538816,3509539071,US
3509539072,3509539327,CA
-3509539328,3509539583,US
-3509539584,3509540095,CA
-3509540096,3509540607,US
+3509539328,3509539631,US
+3509539632,3509539647,CA
+3509539648,3509539967,US
+3509539968,3509540031,CA
+3509540032,3509540607,US
3509540608,3509541503,CA
3509541504,3509541631,US
3509541632,3509541887,CA
@@ -87544,14 +91997,16 @@
3509546096,3509546111,CA
3509546112,3509546495,US
3509546496,3509547007,CA
-3509547008,3509551359,US
-3509551360,3509551871,CA
+3509547008,3509551615,US
+3509551616,3509551871,CA
3509551872,3509552127,US
3509552128,3509552639,CA
3509552640,3509553919,US
3509553920,3509554959,CA
3509554960,3509555199,US
-3509555200,3509556735,CA
+3509555200,3509555455,CA
+3509555456,3509555711,US
+3509555712,3509556735,CA
3509556736,3509557759,US
3509557760,3509558015,CA
3509558016,3509559039,US
@@ -87573,11 +92028,9 @@
3509567232,3509569023,CA
3509569024,3509569535,US
3509569536,3509569791,CA
-3509569792,3509570815,US
-3509570816,3509571583,CA
-3509571584,3509571839,US
-3509571840,3509572095,CA
-3509572096,3509572351,US
+3509569792,3509571071,US
+3509571072,3509571327,CA
+3509571328,3509572351,US
3509572352,3509573375,CA
3509573376,3509573439,US
3509573440,3509573455,CA
@@ -87903,7 +92356,9 @@
3514592256,3514593279,SV
3514593280,3514596863,US
3514596864,3514597375,SV
-3514597376,3514732071,US
+3514597376,3514724635,US
+3514724636,3514724636,UA
+3514724637,3514732071,US
3514732072,3514732075,UA
3514732076,3514826751,US
3514826752,3514843135,CA
@@ -87927,7 +92382,9 @@
3515301888,3515318271,CA
3515318272,3515358975,US
3515358976,3515359231,MX
-3515359232,3515596799,US
+3515359232,3515450623,US
+3515450624,3515450879,CA
+3515450880,3515596799,US
3515596800,3515613183,CA
3515613184,3515711487,US
3515711488,3515731967,CA
@@ -87958,7 +92415,9 @@
3516530688,3516643083,US
3516643084,3516643087,PR
3516643088,3516899839,US
-3516899840,3516900095,NG
+3516899840,3516900031,NG
+3516900032,3516900063,US
+3516900064,3516900095,NG
3516900096,3516900351,US
3516900352,3516900607,NG
3516900608,3516900863,US
@@ -87983,13 +92442,17 @@
3517120512,3517173759,US
3517173760,3517174783,IN
3517174784,3517233151,US
-3517233152,3517235199,GU
+3517233152,3517234687,GU
+3517234688,3517234943,US
+3517234944,3517235199,GU
3517235200,3517382655,US
3517382656,3517383167,CA
3517383168,3517383423,US
3517383424,3517384703,CA
-3517384704,3517385215,US
-3517385216,3517385727,CA
+3517384704,3517385407,US
+3517385408,3517385439,CA
+3517385440,3517385471,US
+3517385472,3517385727,CA
3517385728,3517385983,US
3517385984,3517387263,CA
3517387264,3517387519,US
@@ -88027,14 +92490,14 @@
3517399040,3517399807,US
3517399808,3517399871,CA
3517399872,3517400063,US
-3517400064,3517400575,CA
-3517400576,3517401855,US
+3517400064,3517400319,CA
+3517400320,3517401855,US
3517401856,3517402367,CA
3517402368,3517402623,US
3517402624,3517402879,CA
3517402880,3517403647,US
-3517403648,3517404159,CA
-3517404160,3517404415,US
+3517403648,3517403903,CA
+3517403904,3517404415,US
3517404416,3517404927,CA
3517404928,3517405183,US
3517405184,3517405439,CA
@@ -88058,10 +92521,10 @@
3517413120,3517414399,CA
3517414400,3517414911,US
3517414912,3517415423,CA
-3517415424,3517416191,US
-3517416192,3517416447,CA
-3517416448,3517416703,US
-3517416704,3517417471,CA
+3517415424,3517416919,US
+3517416920,3517416927,CA
+3517416928,3517416959,US
+3517416960,3517417471,CA
3517417472,3517418495,US
3517418496,3517419007,CA
3517419008,3517419519,US
@@ -88111,7 +92574,9 @@
3517438464,3517438943,US
3517438944,3517439231,CA
3517439232,3517439743,US
-3517439744,3517442047,CA
+3517439744,3517441279,CA
+3517441280,3517441535,US
+3517441536,3517442047,CA
3517442048,3517442175,US
3517442176,3517442207,CA
3517442208,3517442559,US
@@ -88152,7 +92617,9 @@
3517602560,3517602687,SE
3517602688,3517602815,US
3517602816,3517603071,SE
-3517603072,3517603583,US
+3517603072,3517603231,US
+3517603232,3517603327,SE
+3517603328,3517603583,US
3517603584,3517603647,SE
3517603648,3517603711,US
3517603712,3517604095,SE
@@ -88168,9 +92635,13 @@
3517608192,3517608447,US
3517608448,3517608703,GB
3517608704,3517609727,US
-3517609728,3517610495,SE
+3517609728,3517609743,SE
+3517609744,3517609751,US
+3517609752,3517610495,SE
3517610496,3517611263,IE
-3517611264,3517612031,SE
+3517611264,3517611311,SE
+3517611312,3517611343,US
+3517611344,3517612031,SE
3517612032,3517644799,US
3517644800,3517710335,CA
3517710336,3517718527,US
@@ -88216,7 +92687,9 @@
3519351424,3519351455,GB
3519351456,3519351551,US
3519351552,3519351807,GB
-3519351808,3519381503,US
+3519351808,3519354909,US
+3519354910,3519354910,BR
+3519354911,3519381503,US
3519381504,3519397887,CA
3519397888,3519467519,US
3519469568,3519475711,US
@@ -88246,7 +92719,9 @@
3519877888,3519878143,CA
3519878144,3519878271,US
3519878272,3519878303,CA
-3519878304,3519879727,US
+3519878304,3519878911,US
+3519878912,3519879167,CA
+3519879168,3519879727,US
3519879728,3519879735,CA
3519879736,3519879935,US
3519879936,3519880447,CA
@@ -88255,7 +92730,9 @@
3519882496,3519882751,US
3519882752,3519884031,CA
3519884032,3519884287,US
-3519884288,3519901695,CA
+3519884288,3519898367,CA
+3519898368,3519898623,US
+3519898624,3519901695,CA
3519901696,3519930367,US
3519934464,3519938559,CA
3519938560,3520020479,US
@@ -88318,8 +92795,8 @@
3521965056,3521966079,DE
3521966080,3522101247,US
3522101248,3522109439,CA
-3522109440,3522118399,US
-3522118400,3522118655,GB
+3522109440,3522118143,US
+3522118144,3522118655,GB
3522118656,3522118911,US
3522118912,3522119679,GB
3522119680,3522119935,US
@@ -88336,9 +92813,13 @@
3522123520,3522123775,GB
3522123776,3522125055,US
3522125056,3522125311,GB
-3522125312,3522132395,US
+3522125312,3522131858,US
+3522131859,3522131859,DE
+3522131860,3522132395,US
3522132396,3522132396,BR
-3522132397,3522174975,US
+3522132397,3522133663,US
+3522133664,3522133695,DE
+3522133696,3522174975,US
3522174976,3522179071,BM
3522179072,3522195455,US
3522195456,3522199551,CA
@@ -88389,12 +92870,25 @@
3523557376,3523559423,CN
3523559424,3523575807,PH
3523575808,3523583999,CN
-3523584000,3523601663,HK
+3523584000,3523596359,HK
+3523596360,3523596375,PK
+3523596376,3523596783,HK
+3523596784,3523596791,PK
+3523596792,3523596927,HK
+3523596928,3523597055,PK
+3523597056,3523597063,HK
+3523597064,3523597103,PK
+3523597104,3523597119,HK
+3523597120,3523597127,PK
+3523597128,3523597567,HK
+3523597568,3523597823,PK
+3523597824,3523601663,HK
3523601664,3523601919,SA
3523601920,3523674111,HK
3523674112,3523682303,FJ
3523682304,3523686399,NZ
-3523686400,3523690495,AU
+3523686400,3523688447,AU
+3523688704,3523690495,AU
3523690496,3523698687,IN
3523698688,3523700735,JP
3523700736,3523701759,HK
@@ -88426,7 +92920,9 @@
3524722688,3524730879,SG
3524730880,3524739071,CN
3524739072,3524743167,ID
-3524743168,3524745727,MP
+3524743168,3524745215,MP
+3524745216,3524745471,GU
+3524745472,3524745727,MP
3524745728,3524745983,GU
3524745984,3524747263,MP
3524747264,3524755455,PH
@@ -88448,8 +92944,8 @@
3526651136,3526651391,KP
3526651392,3526754303,CN
3526754304,3526845183,NZ
-3526845184,3526845439,AU
-3526845440,3526885375,NZ
+3526845184,3526845311,AU
+3526845312,3526885375,NZ
3526885376,3526893567,PK
3526893568,3526897663,NZ
3526897664,3526901759,HK
@@ -88499,10 +92995,10 @@
3529089024,3529097215,KR
3529097216,3529113599,JP
3529113600,3531603967,KR
-3531603968,3533765631,JP
-3533765632,3533765887,CN
-3533765888,3534749695,JP
-3534749696,3534757887,HK
+3531603968,3534749695,JP
+3534749696,3534756351,HK
+3534756352,3534756383,CN
+3534756384,3534757887,HK
3534757888,3534758143,AU
3534758144,3534758147,JP
3534758148,3534758911,AU
@@ -88532,7 +93028,11 @@
3535831040,3535863807,TW
3535863808,3535880191,SG
3535880192,3535896575,JP
-3535896576,3535929343,AU
+3535896576,3535905791,AU
+3535905792,3535906047,US
+3535906048,3535909887,AU
+3535909888,3535910143,US
+3535910144,3535929343,AU
3535929344,3535994879,JP
3535994880,3536060415,MY
3536060416,3536322559,JP
@@ -88623,9 +93123,7 @@
3557072896,3557081087,DE
3557081088,3557089279,NL
3557089280,3557105663,DE
-3557105664,3557111807,BG
-3557111808,3557112831,GB
-3557112832,3557113855,BG
+3557105664,3557113855,BG
3557113856,3557130239,RU
3557130240,3557138431,BG
3557138432,3557146623,RU
@@ -88639,8 +93137,8 @@
3557253120,3557261311,RU
3557261312,3557277695,DE
3557277696,3557283839,NL
-3557283840,3557284863,PL
-3557284864,3557285887,NL
+3557283840,3557285119,PL
+3557285120,3557285887,NL
3557285888,3557294079,RU
3557294080,3557302271,DE
3557302272,3557310463,UA
@@ -88730,8 +93228,12 @@
3557916672,3557920055,NO
3557920056,3557920056,DK
3557920057,3557924863,NO
-3557924864,3557925887,AX
-3557925888,3557929983,FI
+3557924864,3557926143,AX
+3557926144,3557926399,FI
+3557926400,3557926655,AX
+3557926656,3557929471,FI
+3557929472,3557929727,AX
+3557929728,3557929983,FI
3557929984,3557933055,AX
3557933056,3557941247,IT
3557941248,3557957631,DE
@@ -88759,9 +93261,7 @@
3558146048,3558154239,RU
3558154240,3558157391,GB
3558157392,3558157407,AF
-3558157408,3558161663,GB
-3558161664,3558161919,TD
-3558161920,3558162431,GB
+3558157408,3558162431,GB
3558162432,3558170623,DE
3558170624,3558178815,GB
3558178816,3558187007,BG
@@ -88773,9 +93273,11 @@
3558203392,3558211583,ES
3558211584,3558219775,GB
3558219776,3558227967,ES
-3558227968,3558232063,RU
-3558232064,3558234111,ES
-3558234112,3558234623,RU
+3558227968,3558228479,RU
+3558228480,3558228735,FR
+3558228736,3558232063,RU
+3558232064,3558232575,LB
+3558232576,3558234623,RU
3558234624,3558234879,UA
3558234880,3558235647,RU
3558235648,3558235903,LB
@@ -88803,9 +93305,7 @@
3558293504,3558301695,RU
3558301696,3558318079,DE
3558318080,3558334463,FR
-3558334464,3558339959,CH
-3558339960,3558339967,DE
-3558339968,3558342655,CH
+3558334464,3558342655,CH
3558342656,3558350847,IT
3558350848,3558359039,RU
3558359040,3558367231,GB
@@ -88850,11 +93350,9 @@
3558719488,3558735871,IL
3558735872,3558741503,GB
3558741504,3558742015,GG
-3558742016,3558742527,GB
-3558742528,3558742783,GG
-3558742784,3558743039,GB
-3558743040,3558743295,GG
-3558743296,3558743551,GB
+3558742016,3558742271,GB
+3558742272,3558742527,GG
+3558742528,3558743551,GB
3558743552,3558743807,GG
3558743808,3558744063,GB
3558744064,3558752255,LB
@@ -88897,16 +93395,22 @@
3559055360,3559063551,AM
3559063552,3559079935,CH
3559079936,3559088127,JO
-3559088128,3559090239,GB
+3559088128,3559089527,GB
+3559089528,3559089535,BE
+3559089536,3559089935,GB
+3559089936,3559089951,BE
+3559089952,3559090239,GB
3559090240,3559090303,BE
3559090304,3559093311,GB
3559093312,3559093319,BE
3559093320,3559093503,GB
3559093504,3559093759,BE
-3559093760,3559095455,GB
+3559093760,3559094303,GB
+3559094304,3559094319,BE
+3559094320,3559095455,GB
3559095456,3559095456,BE
3559095457,3559096063,GB
-3559096064,3559096319,BE
+3559096064,3559096319,NL
3559096320,3559104511,RO
3559104512,3559112703,RU
3559112704,3559120895,IT
@@ -88930,13 +93434,15 @@
3559276544,3559284735,GB
3559284736,3559292927,RU
3559292928,3559301119,JO
-3559301120,3559305215,GB
-3559305216,3559305471,US
-3559305472,3559309311,GB
+3559301120,3559306576,GB
+3559306577,3559306577,AT
+3559306578,3559309311,GB
3559309312,3559317503,PL
3559317504,3559325695,FI
3559325696,3559333887,IT
-3559333888,3559342079,SE
+3559333888,3559336447,SE
+3559336448,3559336703,US
+3559336704,3559342079,SE
3559342080,3559350271,BG
3559350272,3559358463,BA
3559358464,3559366655,FR
@@ -89004,9 +93510,11 @@
3559890944,3559899135,CH
3559899136,3559899647,UA
3559899648,3559899967,EE
-3559899968,3559900223,UA
-3559900224,3559900287,EE
-3559900288,3559902719,UA
+3559899968,3559900031,UA
+3559900032,3559900095,EE
+3559900096,3559900223,UA
+3559900224,3559900351,EE
+3559900352,3559902719,UA
3559902720,3559902975,EE
3559902976,3559903231,UA
3559903232,3559907327,EE
@@ -89022,9 +93530,11 @@
3559989248,3559997439,PL
3559997440,3560005631,KE
3560005632,3560013823,RU
-3560013824,3560022527,GB
-3560022528,3560022783,ES
-3560022784,3560023631,GB
+3560013824,3560015871,GB
+3560015872,3560016127,ES
+3560016128,3560022751,GB
+3560022752,3560022767,ES
+3560022768,3560023631,GB
3560023632,3560023639,ES
3560023640,3560023791,GB
3560023792,3560023799,ES
@@ -89063,9 +93573,9 @@
3560316928,3560325119,NL
3560325120,3560333311,DK
3560333312,3560341503,RO
-3560341504,3560346623,GB
-3560346624,3560347647,US
-3560347648,3560357887,GB
+3560341504,3560345855,GB
+3560345856,3560348670,US
+3560348671,3560357887,GB
3560357888,3560366079,GR
3560366080,3560374271,CH
3560374272,3560382463,ES
@@ -89108,9 +93618,7 @@
3560669184,3560685567,CH
3560685568,3560693759,ES
3560693760,3560701951,PL
-3560705536,3560705791,DE
3560707584,3560707839,DE
-3560708096,3560708351,DE
3560709632,3560709887,DE
3560710144,3560718335,CH
3560718336,3560726527,GM
@@ -89251,9 +93759,7 @@
3561242624,3561259007,DE
3561259008,3561267199,IL
3561267200,3561275391,UA
-3561275392,3561288831,BE
-3561288832,3561288959,FR
-3561288960,3561291775,BE
+3561275392,3561291775,BE
3561291776,3561299967,RS
3561299968,3561308159,GB
3561308160,3561316351,PL
@@ -89277,7 +93783,9 @@
3561472000,3561480191,DE
3561480192,3561488383,GB
3561488384,3561496575,OM
-3561496576,3561502719,GB
+3561496576,3561496831,GB
+3561496832,3561497087,NL
+3561497088,3561502719,GB
3561502720,3561503743,NL
3561503744,3561504767,GB
3561504768,3561512959,DE
@@ -89296,10 +93804,12 @@
3561604352,3561604607,FR
3561604608,3561607391,GB
3561607392,3561607423,FR
-3561607424,3561609215,GB
-3561609216,3561609471,FR
-3561609472,3561616639,GB
-3561616640,3561616895,FR
+3561607424,3561607935,GB
+3561607936,3561608191,FR
+3561608192,3561609215,GB
+3561609216,3561609727,FR
+3561609728,3561616383,GB
+3561616384,3561616895,FR
3561616896,3561618943,GB
3561618944,3561619455,ES
3561619456,3561641450,GB
@@ -89320,11 +93830,7 @@
3561775104,3561783295,IL
3561783296,3561799679,RU
3561799680,3561807871,DE
-3561807872,3561808895,BE
-3561808896,3561809151,LU
-3561809152,3561814271,BE
-3561814272,3561814527,LU
-3561814528,3561815039,BE
+3561807872,3561815039,BE
3561815040,3561815295,LU
3561815296,3561816063,BE
3561816064,3561824255,VA
@@ -89496,7 +94002,9 @@
3563011072,3563012095,DE
3563012096,3563020287,FR
3563020288,3563028479,DE
-3563028480,3563036671,IR
+3563028480,3563033599,IR
+3563033600,3563034623,DE
+3563034624,3563036671,IR
3563036672,3563044863,BG
3563044864,3563053055,ES
3563053056,3563061247,GB
@@ -89524,9 +94032,7 @@
3563225088,3563233279,LB
3563233280,3563241471,BY
3563241472,3563257855,TR
-3563257856,3563268351,FR
-3563268352,3563268607,BE
-3563268608,3563290623,FR
+3563257856,3563290623,FR
3563290624,3563315199,DE
3563315200,3563323391,DK
3563323648,3563329791,GB
@@ -89595,9 +94101,7 @@
3563855872,3563864063,AT
3563864064,3563872255,GB
3563872256,3563880447,RU
-3563880448,3563884651,CY
-3563884652,3563884652,TR
-3563884653,3563888639,CY
+3563880448,3563888639,TR
3563888640,3563896831,DE
3563896832,3563913215,HU
3563913216,3563921407,RU
@@ -89736,7 +94240,9 @@
3564883200,3564883455,NL
3564883456,3564886719,GB
3564886720,3564886751,NL
-3564886752,3564889633,GB
+3564886752,3564888479,GB
+3564888480,3564888495,NL
+3564888496,3564889633,GB
3564889634,3564889634,NL
3564889635,3564892735,GB
3564892736,3564892751,NL
@@ -89745,9 +94251,7 @@
3564895744,3564896255,GB
3564896256,3564904447,RU
3564904448,3564912639,DE
-3564912640,3564915711,NL
-3564915712,3564915967,BG
-3564915968,3564920831,NL
+3564912640,3564920831,NL
3564920832,3564922111,DE
3564922112,3564929023,US
3564929024,3564937215,AT
@@ -89768,15 +94272,9 @@
3565002752,3565027327,NO
3565027328,3565035519,PL
3565035520,3565036287,IE
-3565036288,3565037055,GB
-3565037056,3565037311,IE
-3565037312,3565038079,GB
-3565038080,3565038335,IE
-3565038336,3565038879,GB
+3565036288,3565038879,GB
3565038880,3565038895,IE
-3565038896,3565039103,GB
-3565039104,3565039359,IE
-3565039360,3565039615,GB
+3565038896,3565039615,GB
3565039616,3565041663,IE
3565041664,3565043711,GB
3565043712,3565051903,AT
@@ -89874,11 +94372,7 @@
3565767272,3565767287,GB
3565767296,3565767351,GB
3565767360,3565767399,GB
-3565767408,3565767439,GB
-3565767456,3565767487,GB
-3565767504,3565767599,GB
-3565767616,3565767631,GB
-3565767680,3565767999,GB
+3565767408,3565767999,GB
3565768208,3565768223,GB
3565768240,3565768247,GB
3565768448,3565768575,GB
@@ -89963,7 +94457,6 @@
3567152256,3567152383,GB
3567152400,3567152407,GB
3567152640,3567152647,GB
-3567152664,3567152671,GB
3567152744,3567152751,GB
3567152832,3567152863,GB
3567152960,3567152991,GB
@@ -89994,9 +94487,7 @@
3567389696,3567390975,DE
3567390976,3567391231,GB
3567391232,3567391487,DE
-3567391488,3567394815,GB
-3567394816,3567395071,FR
-3567395072,3567399167,GB
+3567391488,3567399167,GB
3567399168,3567399423,DE
3567399424,3567399935,GB
3567399936,3567401471,DE
@@ -90008,13 +94499,17 @@
3567453696,3567453951,ES
3567453952,3567456407,GB
3567456408,3567456415,ES
-3567456416,3567458305,GB
+3567456416,3567456511,GB
+3567456512,3567456767,ES
+3567456768,3567458305,GB
3567458306,3567458306,ES
3567458307,3567459935,GB
3567459936,3567459943,ES
3567459944,3567465983,GB
3567465984,3567466239,ES
-3567466240,3567495679,GB
+3567466240,3567490559,GB
+3567490560,3567490815,ES
+3567490816,3567495679,GB
3567495680,3567495935,ES
3567495936,3567499007,GB
3567499008,3567499135,ES
@@ -90084,9 +94579,7 @@
3568476160,3568484351,DK
3568484352,3568492543,NL
3568492544,3568500735,RS
-3568500736,3568520137,IL
-3568520138,3568520138,SY
-3568520139,3568566271,IL
+3568500736,3568566271,IL
3568566272,3568599039,FR
3568599040,3568631807,PL
3568631808,3568697343,SE
@@ -90144,8 +94637,8 @@
3570663424,3570728959,GB
3570728960,3570729983,FI
3570729984,3570731007,SE
-3570731008,3570794495,FI
-3570794496,3570860031,SE
+3570731008,3570794751,FI
+3570794752,3570860031,SE
3570860032,3570892799,CH
3570892800,3570925567,SA
3570925568,3570991103,IT
@@ -90170,7 +94663,11 @@
3571580928,3571646463,FI
3571646464,3571655560,DE
3571655561,3571655561,RO
-3571655562,3571711999,DE
+3571655562,3571688383,DE
+3571688384,3571689215,ES
+3571689216,3571699711,DE
+3571699712,3571700735,GB
+3571700736,3571711999,DE
3571712000,3571843071,GB
3571843072,3571974143,ES
3571974144,3571978239,RU
@@ -90245,7 +94742,9 @@
3574136832,3574169599,DE
3574169600,3574174839,GB
3574174840,3574174847,ES
-3574174848,3574187007,GB
+3574174848,3574186799,GB
+3574186800,3574186815,ES
+3574186816,3574187007,GB
3574187008,3574188031,ES
3574188032,3574190591,GB
3574190592,3574190847,ES
@@ -90265,22 +94764,19 @@
3574464512,3574530047,TR
3574530048,3574594559,SE
3574594560,3574595583,GB
-3574595584,3574595839,GF
-3574595840,3574597887,FR
-3574597888,3574598143,GP
-3574598144,3574598399,MQ
-3574598400,3574599423,FR
+3574595584,3574596607,FR
+3574596608,3574596863,MF
+3574596864,3574597119,MQ
+3574597120,3574597631,FR
+3574597632,3574597887,GP
+3574597888,3574598911,FR
+3574598912,3574599167,MQ
+3574599168,3574599423,FR
3574599424,3574599679,MQ
3574599680,3574599935,GP
-3574599936,3574600191,FR
-3574600192,3574600447,MQ
-3574600448,3574601215,FR
+3574599936,3574601215,FR
3574601216,3574601471,GP
-3574601472,3574602239,FR
-3574602240,3574602495,GF
-3574602496,3574602751,FR
-3574602752,3574603007,RE
-3574603008,3574603775,FR
+3574601472,3574603775,FR
3574603776,3574611967,BG
3574611968,3574628351,HU
3574628352,3574661119,GR
@@ -90290,7 +94786,9 @@
3574792192,3574824959,CZ
3574824960,3574830079,GB
3574830080,3574831103,NL
-3574831104,3574857727,GB
+3574831104,3574842367,GB
+3574842368,3574842623,NL
+3574842624,3574857727,GB
3574857728,3574923263,DE
3574923264,3574939647,RU
3574939648,3574941375,SE
@@ -90319,11 +94817,7 @@
3575590912,3575640063,BE
3575640064,3575644159,TR
3575644160,3575709695,DK
-3575709696,3575715839,AT
-3575715840,3575716351,SK
-3575716352,3575739391,AT
-3575739392,3575739647,FR
-3575739648,3575742463,AT
+3575709696,3575742463,AT
3575742464,3575775231,RU
3575775232,3575824383,NL
3575824384,3575832575,KW
@@ -90451,7 +94945,7 @@
3576084704,3576084735,GB
3576084864,3576084927,GB
3576085184,3576085215,GB
-3576085696,3576085711,GB
+3576085504,3576085759,GB
3576086016,3576086143,GB
3576086368,3576086399,GB
3576086496,3576086527,GB
@@ -90478,9 +94972,9 @@
3576093184,3576093247,GB
3576095232,3576096767,GB
3576099072,3576100863,GB
-3576101376,3576111359,GB
-3576111360,3576111615,FR
-3576111616,3576135679,GB
+3576101376,3576134653,GB
+3576134654,3576134654,CH
+3576134655,3576135679,GB
3576135680,3576168447,DE
3576168448,3576233983,GB
3576233984,3576236543,FR
@@ -90488,11 +94982,7 @@
3576241992,3576241999,FR
3576242000,3576242383,GB
3576242384,3576242391,FR
-3576242392,3576245247,GB
-3576245248,3576245503,FR
-3576245504,3576251135,GB
-3576251136,3576251391,FR
-3576251392,3576251711,GB
+3576242392,3576251711,GB
3576251712,3576251775,FR
3576251776,3576252415,GB
3576252416,3576252671,FR
@@ -90504,14 +94994,14 @@
3576254696,3576254703,FR
3576254704,3576254775,GB
3576254776,3576254783,FR
-3576254784,3576260607,GB
+3576254784,3576258047,GB
+3576258048,3576258303,FR
+3576258304,3576260607,GB
3576260608,3576260623,FR
3576260624,3576260863,GB
-3576260864,3576261119,FR
-3576261120,3576263447,GB
-3576263448,3576263455,FR
-3576263456,3576263679,GB
-3576263680,3576263935,FR
+3576260864,3576260871,FR
+3576260872,3576263919,GB
+3576263920,3576263935,FR
3576263936,3576264255,GB
3576264256,3576264263,FR
3576264264,3576264351,GB
@@ -90520,15 +95010,15 @@
3576264376,3576264383,FR
3576264384,3576264679,GB
3576264680,3576264687,FR
-3576264688,3576264959,GB
-3576264960,3576265215,FR
-3576265216,3576266751,GB
+3576264688,3576266751,GB
3576266752,3576299519,FR
3576299520,3576365055,AE
3576365056,3576430591,TR
3576430592,3576496127,FR
3576496128,3576561663,IT
-3576561664,3576627199,NL
+3576561664,3576622100,NL
+3576622101,3576622101,GB
+3576622102,3576627199,NL
3576627200,3576692735,AT
3576692736,3576758271,GB
3576758272,3576823807,BE
@@ -90538,22 +95028,28 @@
3576987648,3577020415,GB
3577020416,3577085951,NL
3577085952,3577151487,DE
-3577151488,3577152767,RE
-3577152768,3577154047,FR
-3577154048,3577155583,RE
-3577155584,3577155839,FR
-3577155840,3577156351,RE
-3577156352,3577157631,FR
-3577157632,3577158399,RE
-3577158400,3577158911,FR
-3577158912,3577159167,RE
-3577159168,3577159679,FR
-3577159680,3577159935,RE
-3577159936,3577160959,FR
-3577160960,3577161023,YT
-3577161024,3577161087,FR
-3577161088,3577161215,YT
-3577161216,3577165567,FR
+3577151488,3577151999,RE
+3577152000,3577152255,FR
+3577152256,3577152511,RE
+3577152512,3577153023,FR
+3577153024,3577153279,RE
+3577153280,3577153791,FR
+3577153792,3577154303,RE
+3577154304,3577154815,FR
+3577154816,3577155327,RE
+3577155328,3577155839,FR
+3577155840,3577156095,RE
+3577156096,3577156607,FR
+3577156608,3577156863,RE
+3577156864,3577157375,FR
+3577157376,3577157887,RE
+3577157888,3577158655,FR
+3577158656,3577159167,RE
+3577159168,3577160959,FR
+3577160960,3577161215,YT
+3577161216,3577163775,FR
+3577163776,3577164031,RE
+3577164032,3577165567,FR
3577165568,3577166079,RE
3577166080,3577166591,FR
3577166592,3577167103,RE
@@ -90568,14 +95064,13 @@
3577544704,3577545983,DE
3577545984,3577546111,SE
3577546112,3577610239,DE
-3577625600,3577625855,GB
-3577626112,3577626367,GB
+3577626176,3577626239,GB
3577628672,3577629695,CH
3577635840,3577636863,DE
3577636864,3577637887,GB
3577641200,3577641215,FR
+3577641472,3577641983,FR
3577650048,3577650063,NL
-3577653248,3577655295,IT
3577663488,3577664511,SE
3577669632,3577670655,BE
3577675776,3577741311,PT
@@ -90611,7 +95106,9 @@
3579197312,3579197439,US
3579197440,3579248639,GB
3579248640,3579346943,RU
-3579346944,3579445247,SE
+3579346944,3579362055,SE
+3579362056,3579362063,NO
+3579362064,3579445247,SE
3579445248,3579478015,AT
3579478016,3579527167,FR
3579527168,3579543551,BA
@@ -90646,8 +95143,7 @@
3580199936,3580200447,EE
3580200448,3580201983,SE
3580201984,3580203007,LT
-3580203008,3580203519,SE
-3580203520,3580204543,RU
+3580203008,3580204543,SE
3580204544,3580205055,NL
3580205056,3580206079,SE
3580206080,3580207103,HR
@@ -90683,7 +95179,7 @@
3580268544,3580272639,LV
3580272640,3580276735,SE
3580276736,3580280831,NL
-3580280832,3580329983,RU
+3580280832,3580329983,SE
3580329984,3580338175,NL
3580338176,3580338687,SE
3580338688,3580339199,HR
@@ -90706,7 +95202,9 @@
3580643328,3580645375,UA
3580645376,3580647423,PL
3580647424,3580647935,GB
-3580647936,3580649471,DE
+3580647936,3580648703,DE
+3580648704,3580648959,GB
+3580648960,3580649471,DE
3580649472,3580651519,SE
3580651520,3580653567,NL
3580653568,3580655615,PL
@@ -90747,21 +95245,7 @@
3581239296,3581241343,NL
3581242624,3581245439,FR
3581255680,3581258751,FR
-3581280256,3581365247,BE
-3581365248,3581365503,NL
-3581365504,3581365759,BE
-3581365760,3581366015,NL
-3581366016,3581366783,BE
-3581366784,3581367039,NL
-3581367040,3581367295,BE
-3581367296,3581367807,NL
-3581367808,3581368063,BE
-3581368064,3581368319,NL
-3581368320,3581371391,BE
-3581371392,3581371647,NL
-3581371648,3581371903,BE
-3581371904,3581372159,NL
-3581372160,3581411327,BE
+3581280256,3581411327,BE
3581411328,3581673471,GB
3581673472,3581935615,NL
3581935616,3581943807,RU
@@ -90834,9 +95318,7 @@
3582313872,3582320639,JE
3582320640,3582328831,CH
3582328832,3582337023,HU
-3582337024,3582343167,ES
-3582343168,3582343423,PT
-3582343424,3582345215,ES
+3582337024,3582345215,PT
3582345216,3582353407,IT
3582353408,3582361599,SE
3582361600,3582377983,PL
@@ -90856,7 +95338,7 @@
3582509056,3582517247,SA
3582517248,3582525439,PL
3582525440,3582533631,IM
-3582533632,3582541823,BG
+3582533632,3582541823,IT
3582541824,3582550015,US
3582550016,3582558207,RS
3582558208,3582570911,MC
@@ -90903,7 +95385,8 @@
3582885888,3582894079,TR
3582894080,3582902271,CH
3582902272,3582910463,RU
-3582910464,3582917631,SI
+3582910464,3582916607,SI
+3582916608,3582917631,ZA
3582917632,3582918655,LU
3582918656,3582926847,GB
3582926848,3582935039,ES
@@ -90939,7 +95422,9 @@
3583157760,3583160319,GB
3583160320,3583161343,DE
3583161344,3583162623,GB
-3583162624,3583162879,ZA
+3583162624,3583162751,ZA
+3583162752,3583162815,GB
+3583162816,3583162879,ZA
3583162880,3583164415,GB
3583164416,3583172607,PT
3583172608,3583188991,DE
@@ -90975,7 +95460,11 @@
3583418368,3583426559,TN
3583426560,3583434751,CI
3583434752,3583442943,AT
-3583442944,3583451135,UA
+3583442944,3583445247,RU
+3583445248,3583445503,UA
+3583445504,3583446783,RU
+3583446784,3583447039,UA
+3583447040,3583451135,RU
3583451136,3583459327,IL
3583459328,3583467111,CZ
3583467112,3583467119,PL
@@ -91006,7 +95495,9 @@
3583696896,3583705087,NL
3583705088,3583713279,UA
3583713280,3583721471,CZ
-3583721472,3583729663,DE
+3583721472,3583727871,DE
+3583727872,3583728127,GB
+3583728128,3583729663,DE
3583729664,3583737855,TR
3583742976,3583743487,PL
3583743488,3583743743,GB
@@ -91115,12 +95606,17 @@
3584509232,3584509239,AW
3584509240,3584509695,GB
3584509696,3584509951,JE
-3584509952,3584516095,GB
+3584509952,3584513535,GB
+3584513536,3584513791,JE
+3584513792,3584516095,GB
3584516096,3584524287,NO
3584524288,3584532479,IS
3584532480,3584540671,DE
3584540672,3584548863,RU
-3584548864,3584557055,ES
+3584548864,3584549887,ES
+3584549888,3584550911,FR
+3584550912,3584552959,IT
+3584552960,3584557055,FR
3584557056,3584565247,EE
3584565248,3584573439,RU
3584573440,3584589823,DE
@@ -91259,7 +95755,9 @@
3585646592,3585654783,SA
3585654784,3585662975,NO
3585662976,3585671167,BY
-3585671168,3585679359,SE
+3585671168,3585672191,SE
+3585672192,3585672447,DK
+3585672448,3585679359,SE
3585679360,3585687551,FI
3585687552,3585695743,DE
3585695744,3585702527,GB
@@ -91289,9 +95787,8 @@
3585861632,3585863679,EE
3585863680,3585865471,NL
3585865472,3585865727,LB
-3585865728,3585866495,EE
-3585866496,3585866751,RU
-3585866752,3585867775,EE
+3585865728,3585865983,UA
+3585865984,3585867775,EE
3585867776,3585875967,NO
3585875968,3585884159,CH
3585884160,3585892351,IQ
@@ -91299,22 +95796,7 @@
3585900544,3585906687,NO
3585906688,3585907711,CZ
3585907712,3585908735,NO
-3585908736,3585908991,FR
-3585908992,3585909247,GF
-3585909248,3585909503,FR
-3585909504,3585909759,GF
-3585909760,3585910271,FR
-3585910272,3585910527,GP
-3585910528,3585912831,FR
-3585912832,3585913087,GP
-3585913088,3585913855,FR
-3585913856,3585914623,GP
-3585914624,3585914879,GF
-3585914880,3585915391,FR
-3585915392,3585915647,GP
-3585915648,3585915903,FR
-3585915904,3585916159,GP
-3585916160,3585916671,FR
+3585908736,3585916671,GP
3585916672,3585916927,MQ
3585916928,3585925119,IT
3585925120,3585933311,CH
@@ -91323,7 +95805,9 @@
3585949696,3585957887,KW
3585957888,3585966079,SE
3585966080,3585974271,CH
-3585974272,3585982463,BE
+3585974272,3585976831,BE
+3585976832,3585977087,GB
+3585977088,3585982463,BE
3585982464,3585998847,RU
3585998848,3586007039,ES
3586007040,3586015231,LT
@@ -91343,7 +95827,9 @@
3586162688,3586179071,FI
3586179072,3586195455,ES
3586195456,3586203647,RU
-3586203648,3586205695,KE
+3586203648,3586204415,KE
+3586204416,3586204671,ZM
+3586204672,3586205695,KE
3586205696,3586207743,BW
3586207744,3586208767,ZA
3586208768,3586211071,KE
@@ -91450,9 +95936,7 @@
3587129344,3587145727,NL
3587145728,3587162111,CY
3587162112,3587178495,IR
-3587178496,3587182591,AT
-3587182592,3587182847,HU
-3587182848,3587186687,AT
+3587178496,3587186687,AT
3587186688,3587186943,DE
3587186944,3587187199,GB
3587187200,3587187455,DE
@@ -91469,9 +95953,7 @@
3587231232,3587231263,NL
3587231264,3587233087,GB
3587233088,3587233095,NL
-3587233096,3587233279,GB
-3587233280,3587233535,NL
-3587233536,3587234191,GB
+3587233096,3587234191,GB
3587234192,3587234207,NL
3587234208,3587237631,GB
3587237632,3587237887,NL
@@ -91532,9 +96014,7 @@
3587620864,3587637247,SE
3587637248,3587646975,FR
3587646976,3587647231,MC
-3587647232,3587647743,FR
-3587647744,3587647999,GB
-3587648000,3587653631,FR
+3587647232,3587653631,FR
3587653632,3587670015,SK
3587670016,3587702783,IT
3587702784,3587710975,DE
@@ -91573,8 +96053,7 @@
3588153344,3588161535,RU
3588161536,3588173311,FR
3588173312,3588173567,RE
-3588173568,3588173823,YT
-3588173824,3588227071,FR
+3588173568,3588227071,FR
3588227072,3588292607,BE
3588292608,3588308991,AT
3588308992,3588325375,NO
@@ -91656,9 +96135,7 @@
3589242880,3589259263,NL
3589259264,3589275647,DE
3589275648,3589292031,RS
-3589292032,3589305343,AT
-3589305344,3589305599,DE
-3589305600,3589308415,AT
+3589292032,3589308415,AT
3589308416,3589324799,DE
3589324800,3589341183,BG
3589341184,3589373951,PL
@@ -91670,9 +96147,7 @@
3589431040,3589431295,ES
3589431296,3589432831,GB
3589432832,3589433087,CH
-3589433088,3589433855,GB
-3589433856,3589434111,IE
-3589434112,3589435759,GB
+3589433088,3589435759,GB
3589435760,3589435763,ES
3589435764,3589439487,GB
3589439488,3589455871,SE
@@ -91685,15 +96160,18 @@
3589545984,3589554175,DE
3589554176,3589570559,PS
3589570560,3589578751,GB
-3589578752,3589579007,IN
+3589578752,3589579007,NL
3589579008,3589580543,GB
-3589580544,3589580799,NL
-3589580800,3589582975,GB
+3589580544,3589581055,NL
+3589581056,3589582975,GB
3589582976,3589583103,NL
3589583104,3589583871,GB
3589583872,3589584127,NL
3589584128,3589586943,GB
-3589586944,3589603327,RS
+3589586944,3589587199,DE
+3589587200,3589599231,RS
+3589599232,3589601279,SE
+3589601280,3589603327,RS
3589603328,3589668863,FR
3589668864,3589677055,RU
3589677056,3589685247,FR
@@ -91705,13 +96183,13 @@
3589742592,3589746175,NL
3589746176,3589746687,US
3589746688,3589767167,NL
-3589767168,3589816319,RU
+3589767168,3589810431,RU
+3589810432,3589810687,PL
+3589810688,3589816319,RU
3589825792,3589826047,DE
3589827712,3589827839,DE
-3589828352,3589828607,FR
3589828736,3589828863,NL
3589829632,3589830143,GB
-3589831680,3589831935,FR
3589832704,3589849087,TR
3589849088,3589865471,GB
3589865472,3589881855,GR
@@ -91759,9 +96237,7 @@
3590251648,3590251775,NL
3590251776,3590252543,FR
3590252544,3590253055,LB
-3590253056,3590253311,FR
-3590253312,3590253567,GB
-3590253568,3590254847,FR
+3590253056,3590254847,FR
3590254848,3590255103,GB
3590255104,3590255871,FR
3590255872,3590255935,US
@@ -91775,7 +96251,9 @@
3590258688,3590291455,IT
3590291456,3590299647,EG
3590299648,3590307839,FI
-3590307840,3590312935,GB
+3590307840,3590308951,GB
+3590308952,3590308959,GH
+3590308960,3590312935,GB
3590312936,3590312943,UG
3590312944,3590317951,GB
3590317952,3590318015,UA
@@ -91821,7 +96299,9 @@
3624298496,3624299519,PH
3624299520,3624300031,US
3624300032,3624300287,LY
-3624300288,3624302847,US
+3624300288,3624302335,US
+3624302336,3624302591,CA
+3624302592,3624302847,US
3624302848,3624303103,MY
3624303104,3624303871,US
3624303872,3624304127,CA
@@ -91843,7 +96323,9 @@
3624376336,3624376343,AU
3624376344,3624376351,US
3624376352,3624376359,PT
-3624376360,3624377863,US
+3624376360,3624376655,US
+3624376656,3624376679,GB
+3624376680,3624377863,US
3624377864,3624377871,GB
3624377872,3624377879,US
3624377880,3624377887,GB
@@ -91852,11 +96334,9 @@
3624377912,3624386559,US
3624386560,3624394751,CA
3624394752,3624402943,US
-3624402944,3624407039,JP
-3624407040,3624435711,US
-3624435712,3624443391,CA
-3624443392,3624443903,US
-3624443904,3624452095,CA
+3624402944,3624411135,JP
+3624411136,3624435711,US
+3624435712,3624452095,CA
3624452096,3624480767,US
3624480768,3624484863,CA
3624484864,3624534015,US
@@ -91875,9 +96355,10 @@
3624721920,3624730623,US
3624730624,3624796159,CA
3624796160,3624812543,US
-3624813056,3624814079,US
+3624813056,3624813823,US
3624814336,3624815103,US
-3624815616,3624828927,US
+3624815616,3624816383,US
+3624816640,3624828927,US
3624828928,3624833023,CA
3624833024,3624845311,US
3624845312,3624849407,AU
@@ -91964,7 +96445,9 @@
3628161024,3628161279,CA
3628161280,3628179455,US
3628179456,3628187647,CA
-3628187648,3628225779,US
+3628187648,3628225387,US
+3628225388,3628225395,GB
+3628225396,3628225779,US
3628225780,3628225783,GB
3628225784,3628236799,US
3628236800,3628257279,CA
@@ -92055,17 +96538,7 @@
3629789952,3629790207,CA
3629790208,3629839103,US
3629839104,3629839359,CA
-3629839360,3630039047,US
-3630039048,3630039055,CA
-3630039056,3630039079,US
-3630039080,3630039087,CA
-3630039088,3630039119,US
-3630039120,3630039135,CA
-3630039136,3630039159,US
-3630039160,3630039167,CA
-3630039168,3630039183,US
-3630039184,3630039199,CA
-3630039200,3630039295,US
+3629839360,3630039295,US
3630039296,3630039551,CA
3630039552,3630040063,US
3630040064,3630040319,CA
@@ -92105,9 +96578,7 @@
3630058752,3630059007,CA
3630059008,3630059263,US
3630059264,3630059519,CA
-3630059520,3630060799,US
-3630060800,3630061055,CA
-3630061056,3630061567,US
+3630059520,3630061567,US
3630061568,3630062079,CA
3630062080,3630062335,US
3630062336,3630062591,CA
@@ -92116,38 +96587,34 @@
3630063872,3630063935,US
3630063936,3630063951,CA
3630063952,3630066431,US
-3630066432,3630067967,CA
-3630067968,3630068991,US
+3630066432,3630067711,CA
+3630067712,3630068991,US
3630068992,3630069247,CA
3630069248,3630069503,US
3630069504,3630069759,CA
3630069760,3630071295,US
3630071296,3630071551,CA
3630071552,3630072575,US
-3630072576,3630074111,CA
+3630072576,3630073599,CA
+3630073600,3630073855,US
+3630073856,3630074111,CA
3630074112,3630074879,US
3630074880,3630075135,CA
-3630075136,3630075311,US
-3630075312,3630075327,CA
-3630075328,3630075391,US
-3630075392,3630075647,CA
-3630075648,3630076927,US
-3630076928,3630077439,CA
-3630077440,3630078463,US
+3630075136,3630076927,US
+3630076928,3630077183,CA
+3630077184,3630078463,US
3630078464,3630078719,CA
-3630078720,3630078975,US
-3630078976,3630079039,CA
-3630079040,3630079407,US
-3630079408,3630079423,CA
-3630079424,3630080575,US
-3630080576,3630080639,CA
-3630080640,3630081151,US
-3630081152,3630081791,CA
-3630081792,3630082047,US
-3630082048,3630082559,CA
+3630078720,3630081151,US
+3630081152,3630081279,CA
+3630081280,3630081535,US
+3630081536,3630081791,CA
+3630081792,3630082303,US
+3630082304,3630082559,CA
3630082560,3630082815,US
3630082816,3630083071,CA
-3630083072,3630084607,US
+3630083072,3630083583,US
+3630083584,3630083839,CA
+3630083840,3630084607,US
3630084608,3630084863,CA
3630084864,3630085119,US
3630085120,3630085375,CA
@@ -92196,33 +96663,29 @@
3630151680,3630152191,CA
3630152192,3630152703,US
3630152704,3630153215,CA
-3630153216,3630155775,US
-3630155776,3630158079,CA
-3630158080,3630158295,US
-3630158296,3630158303,CA
-3630158304,3630159103,US
-3630159104,3630159359,CA
-3630159360,3630159615,US
+3630153216,3630156287,US
+3630156288,3630156543,CA
+3630156544,3630157311,US
+3630157312,3630157567,CA
+3630157568,3630158079,US
+3630158080,3630158335,CA
+3630158336,3630159615,US
3630159616,3630159871,CA
3630159872,3630160127,US
3630160128,3630160383,CA
-3630160384,3630160639,US
-3630160640,3630160895,CA
-3630160896,3630161151,US
-3630161152,3630161919,CA
-3630161920,3630162431,US
-3630162432,3630162943,CA
-3630162944,3630163199,US
+3630160384,3630161151,US
+3630161152,3630161407,CA
+3630161408,3630162431,US
+3630162432,3630162687,CA
+3630162688,3630163199,US
3630163200,3630163455,CA
-3630163456,3630163967,US
-3630163968,3630164735,CA
-3630164736,3630164991,US
-3630164992,3630166527,CA
-3630166528,3630167007,US
-3630167008,3630167023,CA
-3630167024,3630168319,US
-3630168320,3630169087,CA
-3630169088,3630169855,US
+3630163456,3630163711,US
+3630163712,3630163967,CA
+3630163968,3630164991,US
+3630164992,3630165247,CA
+3630165248,3630165503,US
+3630165504,3630166015,CA
+3630166016,3630169855,US
3630169856,3630170111,CA
3630170112,3630309375,US
3630309376,3630317567,CA
@@ -92274,8 +96737,19 @@
3631667200,3631667455,US
3631667456,3631668223,CA
3631668224,3631668479,US
-3631668480,3631668991,CA
-3631668992,3631822815,US
+3631668480,3631668735,CA
+3631668736,3631669807,US
+3631669808,3631669823,EC
+3631669824,3631670527,US
+3631670528,3631670783,NG
+3631670784,3631671039,EC
+3631671040,3631671295,US
+3631671296,3631671551,JM
+3631671552,3631671807,PY
+3631671808,3631672063,US
+3631672064,3631672575,PY
+3631672576,3631672831,NG
+3631672832,3631822815,US
3631822816,3631822831,AU
3631822832,3631825647,US
3631825648,3631825663,NZ
@@ -92291,7 +96765,9 @@
3632197632,3632201727,CA
3632201728,3632244223,US
3632244224,3632244479,CA
-3632244480,3632332799,US
+3632244480,3632279039,US
+3632279040,3632279295,SA
+3632279296,3632332799,US
3632332800,3632357375,CA
3632357376,3632381951,US
3632381952,3632390143,CA
@@ -92329,7 +96805,6 @@
3633348608,3633405951,US
3633405952,3633410047,CA
3633410048,3633446911,US
-3633454080,3633454335,US
3633455104,3633456383,US
3633456384,3633456639,AU
3633456640,3633479679,US
@@ -92349,7 +96824,9 @@
3633550848,3633551359,GA
3633551360,3633757439,US
3633757440,3633757695,IN
-3633757696,3633785343,US
+3633757696,3633757951,US
+3633757952,3633758207,PH
+3633758208,3633785343,US
3633785600,3633786367,US
3633786880,3633815807,US
3633815808,3633816063,CA
@@ -92379,7 +96856,8 @@
3634094080,3634098175,SE
3634098176,3634511871,US
3634511872,3634515967,CA
-3634515968,3634552831,US
+3634515968,3634524159,US
+3634528256,3634552831,US
3634552832,3634556927,CA
3634556928,3634741247,US
3634741248,3634749439,CA
@@ -92587,7 +97065,9 @@
3636158208,3636158215,CA
3636158216,3636158463,US
3636158464,3636158719,CA
-3636158720,3636158975,US
+3636158720,3636158871,US
+3636158872,3636158879,CA
+3636158880,3636158975,US
3636158976,3636159743,CA
3636159744,3636160511,US
3636160512,3636160767,CA
@@ -92597,14 +97077,11 @@
3636163584,3636164095,CA
3636164096,3636164327,US
3636164328,3636164335,CA
-3636164336,3636165119,US
-3636165120,3636165375,CA
-3636165376,3636166399,US
+3636164336,3636166399,US
3636166400,3636166655,CA
3636166656,3636206079,US
3636206080,3636206335,AU
-3636206336,3636301823,US
-3636305920,3636396031,US
+3636206336,3636396031,US
3636396032,3636461567,CA
3636461568,3636609023,US
3636609024,3636621311,CA
@@ -92615,7 +97092,11 @@
3636627200,3636627455,BR
3636627456,3636628479,MX
3636628480,3636628991,PE
-3636628992,3636822015,US
+3636628992,3636740095,US
+3636740096,3636740351,CA
+3636740352,3636741503,US
+3636741504,3636741631,CA
+3636741632,3636822015,US
3636822016,3636854783,CA
3636854784,3636887551,US
3636887552,3636895743,CA
@@ -92642,7 +97123,9 @@
3637641216,3637665791,US
3637665792,3637669887,CA
3637669888,3637706751,US
-3637706752,3637739519,CA
+3637706752,3637726591,CA
+3637726592,3637726719,US
+3637726720,3637739519,CA
3637739520,3638165503,US
3638165504,3638181887,CA
3638181888,3638214399,US
@@ -92655,7 +97138,9 @@
3638247936,3638248703,GB
3638248704,3638249215,US
3638249216,3638249471,GB
-3638249472,3638304767,US
+3638249472,3638250559,US
+3638250560,3638250623,GB
+3638250624,3638304767,US
3638304768,3638312959,CA
3638312960,3638349823,US
3638349824,3638350079,AU
@@ -92666,15 +97151,15 @@
3638400000,3638401087,US
3638401088,3638401119,CA
3638401120,3638509567,US
-3638509568,3638534143,CA
+3638509568,3638526719,CA
+3638526720,3638526975,US
+3638526976,3638534143,CA
3638534144,3638697983,US
3638697984,3638706175,CA
3638706176,3638706687,US
3638706688,3638706943,NG
3638706944,3638738943,US
-3638740992,3638746111,US
-3638746112,3638746367,MX
-3638746368,3638874111,US
+3638740992,3638874111,US
3638874112,3638878207,CA
3638878208,3638984703,US
3638984704,3638992895,GT
@@ -92688,7 +97173,7 @@
3639148544,3639222271,US
3639222272,3639230463,CA
3639230464,3639247359,US
-3639248128,3639249151,US
+3639247872,3639249151,US
3639249664,3639255039,US
3639255040,3639263231,CA
3639263232,3639279615,US
@@ -92709,7 +97194,8 @@
3639402240,3639402495,GH
3639402496,3639513239,US
3639513240,3639513243,AE
-3639513244,3639533567,US
+3639513244,3639525375,US
+3639529472,3639533567,US
3639533568,3639537663,CA
3639537664,3639550207,US
3639550208,3639550215,AR
@@ -92720,7 +97206,9 @@
3639550312,3639550319,AU
3639550320,3639550327,CO
3639550328,3639554559,US
-3639554560,3639554815,GB
+3639554560,3639554748,GB
+3639554749,3639554749,US
+3639554750,3639554815,GB
3639554816,3639555839,US
3639555840,3639555847,AR
3639555848,3639555855,BR
@@ -92746,9 +97234,9 @@
3639664640,3639668735,CA
3639668736,3639672831,US
3639672832,3639681023,CL
-3639681024,3639684991,US
-3639684992,3639685119,SA
-3639685120,3639692031,US
+3639681024,3639685055,US
+3639685056,3639685063,SA
+3639685064,3639692031,US
3639692032,3639692287,GB
3639692288,3639704573,US
3639704574,3639704574,GB
@@ -92760,7 +97248,9 @@
3639737375,3639737599,GB
3639737600,3639737629,US
3639737630,3639737630,GB
-3639737631,3639902207,US
+3639737631,3639868415,US
+3639868416,3639868543,MX
+3639868544,3639902207,US
3639902208,3639918591,PE
3639918592,3639934975,AR
3639934976,3640057855,US
@@ -92842,7 +97332,9 @@
3641356536,3641356543,CM
3641356544,3641357983,GB
3641357984,3641358015,SL
-3641358016,3641360383,GB
+3641358016,3641359359,GB
+3641359360,3641359615,US
+3641359616,3641360383,GB
3641360384,3641368575,RO
3641368576,3641372671,GB
3641372672,3641376767,BG
@@ -92873,7 +97365,10 @@
3641483264,3641491455,IT
3641491456,3641493503,UA
3641493504,3641494015,NL
-3641494016,3641499647,UA
+3641494016,3641494527,BG
+3641494528,3641495551,UA
+3641495552,3641496063,NL
+3641496064,3641499647,UA
3641499648,3641503743,SA
3641503744,3641507839,RU
3641507840,3641516031,NO
@@ -92915,9 +97410,9 @@
3641669120,3641670271,ZW
3641670272,3641670911,GB
3641670912,3641671167,LS
-3641671168,3641671423,ZW
-3641671424,3641671679,GB
+3641671168,3641671679,GB
3641671680,3641679871,RU
+3641679872,3641680127,DK
3641681152,3641681407,SE
3641681408,3641681663,FR
3641683968,3641688063,KZ
@@ -92959,7 +97454,6 @@
3641835520,3641839615,IT
3641839616,3641843711,GB
3641843712,3641847807,ES
-3641847808,3641851903,IT
3641851904,3641855999,NL
3641856000,3641860095,GB
3641860096,3641868287,IT
@@ -93053,8 +97547,7 @@
3642253312,3642257407,FI
3642257408,3642261503,RU
3642261504,3642265599,BA
-3642265600,3642267647,AE
-3642267648,3642269695,IR
+3642265600,3642269695,AE
3642269696,3642273791,UA
3642273792,3642277887,RU
3642277888,3642290175,DE
@@ -93125,7 +97618,9 @@
3642554199,3642554199,RU
3642554200,3642554367,UA
3642554368,3642554623,LT
-3642554624,3642556415,UA
+3642554624,3642554720,UA
+3642554721,3642554721,LV
+3642554722,3642556415,UA
3642556416,3642560511,CZ
3642560512,3642564607,KG
3642564608,3642568703,DE
@@ -93160,7 +97655,9 @@
3642691584,3642695679,DE
3642695680,3642699775,SK
3642699776,3642703871,CZ
-3642703872,3642707967,LU
+3642703872,3642705151,LU
+3642705152,3642705407,DE
+3642705408,3642707967,LU
3642707968,3642712063,DE
3642712064,3642716159,NO
3642716160,3642720255,IT
@@ -93202,15 +97699,7 @@
3644928000,3644932095,GI
3644932096,3644936191,IT
3644936192,3644940287,RU
-3644940288,3644942847,HU
-3644942848,3644943103,BG
-3644943104,3644943359,HU
-3644943360,3644943615,BG
-3644943616,3644946175,HU
-3644946176,3644946687,BG
-3644946688,3644946943,HU
-3644946944,3644947967,BG
-3644947968,3644948479,HU
+3644940288,3644948479,HU
3644948480,3644952575,DE
3644952576,3644960767,GB
3644960768,3644964863,TR
@@ -93226,9 +97715,7 @@
3645009920,3645014015,FR
3645014016,3645018111,DE
3645018112,3645022207,RU
-3645022208,3645023743,CZ
-3645023744,3645023999,SK
-3645024000,3645030399,CZ
+3645022208,3645030399,CZ
3645030400,3645038591,IR
3645038592,3645046783,PS
3645046784,3645050879,RU
@@ -93261,17 +97748,14 @@
3645169664,3645173759,CH
3645173760,3645177855,GB
3645177856,3645181951,GR
-3645181952,3645183375,FR
-3645183376,3645183383,SA
-3645183384,3645185759,FR
+3645181952,3645185759,FR
3645185760,3645185775,GB
3645185776,3645186047,FR
3645186048,3645190143,GB
3645190144,3645194239,FI
3645194240,3645202431,DE
3645202432,3645206527,CZ
-3645206528,3645208575,LV
-3645208576,3645210623,LT
+3645206528,3645210623,LV
3645210624,3645214719,RU
3645214720,3645218815,NL
3645218816,3645222911,DE
@@ -93302,6 +97786,7 @@
3645325312,3645329407,IT
3645329408,3645333503,CH
3645334272,3645335039,DE
+3645335688,3645335691,DE
3645337600,3645341695,FR
3645341696,3645345791,RU
3645345792,3645349887,FI
@@ -93438,6 +97923,7 @@
3645767680,3645771775,IE
3645771776,3645779967,SE
3645779968,3645784063,PS
+3645784064,3645788159,DJ
3645788160,3645792255,GB
3645792256,3645796351,TR
3645796352,3645800447,CH
@@ -93491,7 +97977,11 @@
3647966208,3647967231,GB
3647967232,3647968255,BE
3647968256,3647969279,FR
-3647969280,3647971327,DE
+3647969280,3647969327,DE
+3647969328,3647969335,IT
+3647969336,3647970047,DE
+3647970048,3647970303,BE
+3647970304,3647971327,DE
3647971328,3647972351,GB
3647972352,3647973375,IT
3647973376,3647973399,DE
@@ -93514,9 +98004,7 @@
3647980384,3647980415,FR
3647980416,3647980543,DE
3647980544,3647981567,GB
-3647981568,3647981823,BE
-3647981824,3647982079,DK
-3647982080,3647982591,BE
+3647981568,3647982591,BE
3647982592,3647983615,IT
3647983616,3647984031,DE
3647984032,3647984047,NL
@@ -93527,12 +98015,16 @@
3647987656,3647987695,DE
3647987696,3647987711,ES
3647987712,3647988735,IT
-3647988736,3647989759,BE
-3647989760,3647995903,DE
+3647988736,3647989063,DE
+3647989064,3647989071,BE
+3647989072,3647989247,DE
+3647989248,3647989503,BE
+3647989504,3647995903,DE
3647995904,3648004095,RU
3648004096,3648007167,GB
3648007168,3648007679,US
-3648007680,3648008191,GB
+3648007680,3648007935,RU
+3648007936,3648008191,GB
3648008192,3648016383,FR
3648016384,3648020479,GB
3648020480,3648024575,IT
@@ -93540,6 +98032,7 @@
3648028672,3648032767,HU
3648032768,3648033023,IE
3648034888,3648034895,IE
+3648036096,3648036351,IE
3648036864,3648040959,CZ
3648040960,3648045055,BE
3648045056,3648049151,FI
@@ -93560,15 +98053,16 @@
3648080896,3648081023,ZM
3648081024,3648081055,GA
3648081056,3648081151,ZM
-3648081152,3648082239,BE
+3648081152,3648081407,BE
+3648081408,3648081663,CG
+3648081664,3648082239,BE
3648082240,3648082311,NE
3648082312,3648082431,BE
3648082432,3648082479,ZM
3648082480,3648084223,BE
3648084224,3648084479,CD
3648084480,3648084991,BE
-3648084992,3648085759,GB
-3648085760,3648086015,ZM
+3648084992,3648086015,GB
3648086016,3648090111,AT
3648090112,3648094207,RU
3648094208,3648102399,PL
@@ -93599,7 +98093,9 @@
3648192512,3648196607,DE
3648196608,3648200703,IT
3648200704,3648208895,SE
-3648208896,3648212991,DE
+3648208896,3648209166,DE
+3648209167,3648209169,GB
+3648209170,3648212991,DE
3648212992,3648217087,RU
3648217088,3648221183,UA
3648221184,3648225279,IE
@@ -93618,8 +98114,7 @@
3648282624,3648286719,PL
3648286720,3648290815,DE
3648290816,3648299007,RU
-3648299008,3648301055,FI
-3648301056,3648303103,CZ
+3648299008,3648303103,FI
3648303104,3648307199,AT
3648307200,3648311295,TR
3648311296,3648323583,DK
@@ -93643,7 +98138,9 @@
3648397312,3648405503,NO
3648405504,3648413695,RU
3648413696,3648417791,SK
-3648417792,3648425983,GB
+3648417792,3648419903,GB
+3648419904,3648419935,BE
+3648419936,3648425983,GB
3648425984,3648430079,IT
3648430080,3648434175,NL
3648434176,3648438271,RU
@@ -93667,9 +98164,7 @@
3648512000,3648516095,NL
3648516096,3648519167,RS
3648519168,3648520191,MK
-3648520192,3648523775,NL
-3648523776,3648524031,DE
-3648524032,3648782335,NL
+3648520192,3648782335,NL
3648782336,3649044479,ES
3649044480,3649110015,FR
3649110016,3649175551,PT
@@ -93736,7 +98231,7 @@
3650225408,3650225663,BR
3650225664,3650226175,TR
3650226176,3650226431,RS
-3650226432,3650226687,AT
+3650226432,3650226687,SG
3650226688,3650227455,IN
3650227456,3650227711,PL
3650227712,3650227967,PT
@@ -93763,7 +98258,9 @@
3650285568,3650289663,UA
3650289664,3650297855,RU
3650297856,3650301951,LT
-3650301952,3650310143,DE
+3650301952,3650307103,DE
+3650307104,3650307134,GB
+3650307135,3650310143,DE
3650310144,3650314239,GB
3650314240,3650318335,DE
3650318336,3650322431,GI
@@ -93854,7 +98351,9 @@
3650611836,3650611836,RU
3650611837,3650611866,LB
3650611867,3650611867,RU
-3650611868,3650611947,LB
+3650611868,3650611920,LB
+3650611921,3650611921,RU
+3650611922,3650611947,LB
3650611948,3650611948,RU
3650611949,3650611967,LB
3650611968,3650613247,RU
@@ -93864,16 +98363,17 @@
3650748416,3650879487,GB
3650879488,3650912255,RO
3650912256,3650915327,GB
-3650915328,3650915337,FR
-3650915338,3650915338,BE
-3650915339,3650915583,FR
+3650915328,3650915583,FR
3650915584,3650920447,GB
3650920448,3650920457,FR
3650920458,3650920458,GB
3650920459,3650920703,FR
-3650920704,3650926079,GB
-3650926080,3650926335,BE
-3650926336,3650926591,GB
+3650920704,3650920895,LB
+3650920896,3650920927,GB
+3650920928,3650920959,LB
+3650920960,3650922799,GB
+3650922800,3650922815,FR
+3650922816,3650926591,GB
3650926592,3650929663,ES
3650929664,3650929847,GB
3650929848,3650929855,FR
@@ -93885,9 +98385,9 @@
3650932976,3650939599,GB
3650939600,3650939607,FR
3650939608,3650939615,TR
-3650939616,3650944511,GB
-3650944512,3650944767,FR
-3650944768,3650945023,GB
+3650939616,3650940927,GB
+3650940928,3650941183,NL
+3650941184,3650945023,GB
3650945024,3651010559,DK
3651010560,3651076095,GB
3651076096,3651108863,DE
@@ -93896,7 +98396,9 @@
3651152896,3651153919,GB
3651153920,3651168255,DE
3651168256,3651169023,ES
-3651169024,3651207167,DE
+3651169024,3651192319,DE
+3651192320,3651193343,GB
+3651193344,3651207167,DE
3651207168,3651207199,GB
3651207224,3651207295,GB
3651207424,3651207615,GB
@@ -94007,7 +98509,9 @@
3651958784,3651960831,IR
3651960832,3651964927,GB
3651964928,3651969023,SK
-3651969024,3651977215,DE
+3651969024,3651971613,DE
+3651971614,3651971614,TR
+3651971615,3651977215,DE
3651977216,3651985407,IT
3651985408,3651997695,PL
3651997696,3652001791,RU
@@ -94017,8 +98521,8 @@
3652014080,3652018175,SA
3652018176,3652022271,IE
3652022272,3652026367,ES
-3652026368,3652032511,DE
-3652032512,3652033791,NL
+3652026368,3652032767,DE
+3652032768,3652033791,NL
3652033792,3652034559,DE
3652034560,3652046847,PL
3652046848,3652050943,IE
@@ -94044,16 +98548,18 @@
3652149248,3652153343,DE
3652153344,3652157439,SE
3652157440,3652165631,RU
-3652165632,3652169471,FR
+3652165632,3652165887,GF
+3652165888,3652169471,FR
3652169472,3652169727,GF
-3652169728,3652170495,MQ
-3652170496,3652170751,FR
+3652169728,3652170239,MQ
+3652170240,3652170751,FR
3652170752,3652171007,MQ
-3652171008,3652172031,FR
-3652172032,3652172287,RE
-3652172288,3652172799,FR
-3652172800,3652173055,RE
-3652173056,3652173823,FR
+3652171008,3652171519,FR
+3652171520,3652171775,MQ
+3652171776,3652172287,RE
+3652172288,3652172543,FR
+3652172544,3652172799,RE
+3652172800,3652173823,FR
3652173824,3652177919,AT
3652177920,3652182015,CY
3652182016,3652190207,DE
@@ -94067,7 +98573,9 @@
3653386240,3653390335,DE
3653390336,3653394431,FR
3653394432,3653402623,NL
-3653402624,3653410060,GB
+3653402624,3653407103,GB
+3653407104,3653407111,UG
+3653407112,3653410060,GB
3653410061,3653410061,YT
3653410062,3653410815,GB
3653410816,3653414911,CZ
@@ -94083,9 +98591,6 @@
3653451776,3653464063,RU
3653464064,3653468159,NL
3653468160,3653472255,GR
-3653472256,3653472511,NL
-3653472512,3653472767,US
-3653472768,3653476351,NL
3653476352,3653480447,CZ
3653480448,3653484543,DK
3653484544,3653488639,TR
@@ -94152,8 +98657,7 @@
3654025216,3654287359,GB
3654287360,3654608404,SE
3654608405,3654608405,NO
-3654608406,3654608639,SE
-3654608640,3654608895,RU
+3654608406,3654608895,SE
3654608896,3654609919,NO
3654609920,3654614143,SE
3654614144,3654614271,FI
@@ -94168,13 +98672,13 @@
3659628544,3659661311,JP
3659661312,3659792383,TW
3659792384,3660054527,KR
-3660054528,3660097535,JP
-3660097536,3660097791,US
-3660097792,3660099583,JP
-3660099584,3660099839,US
-3660099840,3660102143,JP
-3660102144,3660102399,US
-3660102400,3660102655,JP
+3660054528,3660097023,JP
+3660097024,3660097279,US
+3660097280,3660099071,JP
+3660099072,3660099583,US
+3660099584,3660100095,JP
+3660100096,3660100607,US
+3660100608,3660102655,JP
3660102656,3660102911,US
3660102912,3660578815,JP
3660578816,3661103103,KR
@@ -94250,7 +98754,9 @@
3669618688,3669620735,CN
3669622784,3669688319,SG
3669688320,3669753855,TW
-3669753856,3670015999,HK
+3669753856,3669777663,HK
+3669777664,3669777919,SG
+3669777920,3670015999,HK
3670016000,3671064575,CN
3671064576,3671130111,MY
3671130112,3671195647,KR
@@ -94385,7 +98891,9 @@
3715760128,3715891199,CN
3715891200,3716153343,HK
3716153344,3716169727,SG
-3716169728,3716186111,TH
+3716169728,3716175615,JP
+3716175616,3716184575,TH
+3716184576,3716186111,JP
3716186112,3716415487,CN
3716415488,3716431871,VN
3716431872,3716440063,KR
@@ -94480,7 +98988,9 @@
3743121408,3743125503,MY
3743125504,3743129599,ID
3743129600,3743130623,HK
-3743130624,3743133695,SG
+3743130624,3743130879,SG
+3743130880,3743131135,HK
+3743131136,3743133695,SG
3743133696,3743134719,AU
3743134720,3743135743,JP
3743135744,3743136767,CN
@@ -94546,16 +99056,12 @@
3755988992,3755990015,HK
3755990016,3755991039,SG
3755991040,3755999231,JP
-3755999232,3756002815,IN
-3756002816,3756003071,LK
-3756003072,3757047807,IN
+3755999232,3757047807,IN
3757047808,3757834239,CN
3757834240,3757867007,AU
3757867008,3757875519,CN
3757875520,3757875583,HK
-3757875584,3757880063,CN
-3757880064,3757883391,HK
-3757883392,3757899775,CN
+3757875584,3757899775,CN
3757899776,3757965311,KR
3757965312,3758063615,CN
3758063616,3758079999,HK
diff --git a/src/config/geoip6 b/src/config/geoip6
index 06bd578b85..db79a4335b 100644
--- a/src/config/geoip6
+++ b/src/config/geoip6
@@ -1,8 +1,17 @@
-# Last updated based on August 7 2014 Maxmind GeoLite2 Country
+# Last updated based on January 7 2015 Maxmind GeoLite2 Country
# wget https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.mmdb.gz
# gunzip GeoLite2-Country.mmdb.gz
# python mmdb-convert.py GeoLite2-Country.mmdb
-2001:218::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:200::,2001:200::ffff:ffff:ffff:ffff:ffff,JP
+2001:200:120::,2001:200:120:ffff:ffff:ffff:ffff:ffff,JP
+2001:200:148::,2001:200:148:ffff:ffff:ffff:ffff:ffff,JP
+2001:200:167::,2001:200:167:ffff:ffff:ffff:ffff:ffff,JP
+2001:200:601::,2001:200:601:ffff:ffff:ffff:ffff:ffff,AU
+2001:208:3::,2001:208:3:ffff:ffff:ffff:ffff:ffff,SG
+2001:208:5::,2001:208:5:ffff:ffff:ffff:ffff:ffff,SG
+2001:218::,2001:218:e000:ffff:ffff:ffff:ffff:ffff,JP
+2001:218:e001::,2001:218:e001:ffff:ffff:ffff:ffff:ffff,US
+2001:218:e002::,2001:218:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:220::,2001:220:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:230::,2001:230:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:238::,2001:238:ffff:ffff:ffff:ffff:ffff:ffff,TW
@@ -46,7 +55,9 @@
2001:368::,2001:368:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:370::,2001:370:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:378::,2001:378:ffff:ffff:ffff:ffff:ffff:ffff,KR
-2001:380::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:380::,2001:380:1fb:ffff:ffff:ffff:ffff:ffff,JP
+2001:380:1fc::,2001:380:1fc:ffff:ffff:ffff:ffff:ffff,VN
+2001:380:1fd::,2001:380:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:388::,2001:388:ffff:ffff:ffff:ffff:ffff:ffff,AU
2001:390::,2001:390:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:398::,2001:398:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -60,9 +71,2308 @@
2001:3d8::,2001:3d8:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:3e0::,2001:3e0:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:3e8::,2001:3e8:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:400::,2001:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:500::,2001:5ff:ffff:ffff:ffff:ffff:ffff:ffff,US
-2001:600::,2001:7ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:400::,2001:400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:408::,2001:408:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:410::,2001:410:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:418::,2001:418:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:420::,2001:420:4049:ffff:ffff:ffff:ffff:ffff,US
+2001:420:404a::,2001:420:404a:ffff:ffff:ffff:ffff:ffff,GB
+2001:420:404b::,2001:420:5040:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5041::,2001:420:5041:ffff:ffff:ffff:ffff:ffff,AU
+2001:420:5042::,2001:420:5042:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5043::,2001:420:5043:ffff:ffff:ffff:ffff:ffff,AU
+2001:420:5044::,2001:420:5046:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5047::,2001:420:5047:ffff:ffff:ffff:ffff:ffff,AU
+2001:420:5048::,2001:420:5441:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5442::,2001:420:5442:ffff:ffff:ffff:ffff:ffff,IN
+2001:420:5443::,2001:420:5502:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5503::,2001:420:5503:ffff:ffff:ffff:ffff:ffff,IN
+2001:420:5504::,2001:420:5882:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5883::,2001:420:5883:ffff:ffff:ffff:ffff:ffff,CN
+2001:420:5884::,2001:420:5a3f:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5a40::,2001:420:5a40:ffff:ffff:ffff:ffff:ffff,CN
+2001:420:5a41::,2001:420:5a43:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5a44::,2001:420:5a44:ffff:ffff:ffff:ffff:ffff,CN
+2001:420:5a45::,2001:420:5c3f:ffff:ffff:ffff:ffff:ffff,US
+2001:420:5c40::,2001:420:5c40:ffff:ffff:ffff:ffff:ffff,SG
+2001:420:5c41::,2001:420:c0c0:ffff:ffff:ffff:ffff:ffff,US
+2001:420:c0c1::,2001:420:c0c1:ffff:ffff:ffff:ffff:ffff,CH
+2001:420:c0c2::,2001:420:c0cf:ffff:ffff:ffff:ffff:ffff,US
+2001:420:c0d0::,2001:420:c0d0:ffff:ffff:ffff:ffff:ffff,AU
+2001:420:c0d1::,2001:420:c0d3:ffff:ffff:ffff:ffff:ffff,US
+2001:420:c0d4::,2001:420:c0d4:ffff:ffff:ffff:ffff:ffff,SG
+2001:420:c0d5::,2001:420:c0d7:ffff:ffff:ffff:ffff:ffff,US
+2001:420:c0d8::,2001:420:c0d8:ffff:ffff:ffff:ffff:ffff,CN
+2001:420:c0d9::,2001:420:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:428::,2001:428:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:430::,2001:430:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:438::,2001:438:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:440::,2001:440:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:448::,2001:448:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2001:450::,2001:450:1b:ffff:ffff:ffff:ffff:ffff,US
+2001:450:1c::,2001:450:1c:ffff:ffff:ffff:ffff:ffff,CA
+2001:450:1d::,2001:450:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:458::,2001:458:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:460::,2001:460:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:468::,2001:468:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:470::,2001:470:18:ffff:ffff:ffff:ffff:ffff,US
+2001:470:19::,2001:470:19:5ff:ffff:ffff:ffff:ffff,HK
+2001:470:19:600::,2001:470:19:7ff:ffff:ffff:ffff:ffff,US
+2001:470:19:800::,2001:470:19:fff:ffff:ffff:ffff:ffff,CN
+2001:470:19:1000::,2001:470:1c:7ff:ffff:ffff:ffff:ffff,US
+2001:470:1c:800::,2001:470:1c:bff:ffff:ffff:ffff:ffff,CA
+2001:470:1c:c00::,2001:470:1c:ffff:ffff:ffff:ffff:ffff,US
+2001:470:1d::,2001:470:1d:fff:ffff:ffff:ffff:ffff,CA
+2001:470:1d:1000::,2001:470:23:ffff:ffff:ffff:ffff:ffff,US
+2001:470:24::,2001:470:24:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:25::,2001:470:26:7ff:ffff:ffff:ffff:ffff,US
+2001:470:26:800::,2001:470:26:fff:ffff:ffff:ffff:ffff,CH
+2001:470:26:1000::,2001:470:34:ffff:ffff:ffff:ffff:ffff,US
+2001:470:35::,2001:470:35:7ff:ffff:ffff:ffff:ffff,ID
+2001:470:35:800::,2001:470:3c:ffff:ffff:ffff:ffff:ffff,US
+2001:470:3d::,2001:470:3d:ffff:ffff:ffff:ffff:ffff,PH
+2001:470:3e::,2001:470:65:ffff:ffff:ffff:ffff:ffff,US
+2001:470:66::,2001:470:66:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:67::,2001:470:6f:1ff:ffff:ffff:ffff:ffff,US
+2001:470:6f:200::,2001:470:6f:3ff:ffff:ffff:ffff:ffff,UA
+2001:470:6f:400::,2001:470:1eff:ffff:ffff:ffff:ffff:ffff,US
+2001:470:1f00::,2001:470:1f00:ffff:ffff:ffff:ffff:ffff,AU
+2001:470:1f01::,2001:470:1f16:ffff:ffff:ffff:ffff:ffff,US
+2001:470:1f17::,2001:470:1f17:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:1f18::,2001:470:2092:ffff:ffff:ffff:ffff:ffff,US
+2001:470:2093::,2001:470:2093:ffff:ffff:ffff:ffff:ffff,SI
+2001:470:2094::,2001:470:507c:ffff:ffff:ffff:ffff:ffff,US
+2001:470:507d::,2001:470:507d:ffff:ffff:ffff:ffff:ffff,UA
+2001:470:507e::,2001:470:5853:ffff:ffff:ffff:ffff:ffff,US
+2001:470:5854::,2001:470:5854:ffff:ffff:ffff:ffff:ffff,CZ
+2001:470:5855::,2001:470:591a:ffff:ffff:ffff:ffff:ffff,US
+2001:470:591b::,2001:470:591b:ffff:ffff:ffff:ffff:ffff,CZ
+2001:470:591c::,2001:470:591c:ffff:ffff:ffff:ffff:ffff,US
+2001:470:591d::,2001:470:591d:ffff:ffff:ffff:ffff:ffff,CZ
+2001:470:591e::,2001:470:5948:ffff:ffff:ffff:ffff:ffff,US
+2001:470:5949::,2001:470:5949:ffff:ffff:ffff:ffff:ffff,CZ
+2001:470:594a::,2001:470:618d:ffff:ffff:ffff:ffff:ffff,US
+2001:470:618e::,2001:470:618e:ffff:ffff:ffff:ffff:ffff,PL
+2001:470:618f::,2001:470:6914:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6915::,2001:470:6915:ffff:ffff:ffff:ffff:ffff,ES
+2001:470:6916::,2001:470:69a3:ffff:ffff:ffff:ffff:ffff,US
+2001:470:69a4::,2001:470:69a4:ffff:ffff:ffff:ffff:ffff,GB
+2001:470:69a5::,2001:470:6adc:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6add::,2001:470:6add:ffff:ffff:ffff:ffff:ffff,GB
+2001:470:6ade::,2001:470:6b2e:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6b2f::,2001:470:6b2f:ffff:ffff:ffff:ffff:ffff,GB
+2001:470:6b30::,2001:470:6be4:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6be5::,2001:470:6be5:ffff:ffff:ffff:ffff:ffff,GB
+2001:470:6be6::,2001:470:6bed:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6bee::,2001:470:6bee:ffff:ffff:ffff:ffff:ffff,IN
+2001:470:6bef::,2001:470:6c96:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6c97::,2001:470:6c97:ffff:ffff:ffff:ffff:ffff,RU
+2001:470:6c98::,2001:470:6cee:ffff:ffff:ffff:ffff:ffff,US
+2001:470:6cef::,2001:470:6cef:ffff:ffff:ffff:ffff:ffff,ES
+2001:470:6cf0::,2001:470:710f:ffff:ffff:ffff:ffff:ffff,US
+2001:470:7110::,2001:470:7110:ffff:ffff:ffff:ffff:ffff,UA
+2001:470:7111::,2001:470:74e0:ffff:ffff:ffff:ffff:ffff,US
+2001:470:74e1::,2001:470:74e1:ffff:ffff:ffff:ffff:ffff,FI
+2001:470:74e2::,2001:470:75bf:ffff:ffff:ffff:ffff:ffff,US
+2001:470:75c0::,2001:470:75c0:ffff:ffff:ffff:ffff:ffff,TR
+2001:470:75c1::,2001:470:75c4:ffff:ffff:ffff:ffff:ffff,US
+2001:470:75c5::,2001:470:75c5:ffff:ffff:ffff:ffff:ffff,DE
+2001:470:75c6::,2001:470:79ff:ffff:ffff:ffff:ffff:ffff,US
+2001:470:7a00::,2001:470:7a00:ffff:ffff:ffff:ffff:ffff,NL
+2001:470:7a01::,2001:470:7c14:ffff:ffff:ffff:ffff:ffff,US
+2001:470:7c15::,2001:470:7c15:ffff:ffff:ffff:ffff:ffff,DE
+2001:470:7c16::,2001:470:8091:ffff:ffff:ffff:ffff:ffff,US
+2001:470:8092::,2001:470:8092:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:8093::,2001:470:80b6:ffff:ffff:ffff:ffff:ffff,US
+2001:470:80b7::,2001:470:80b7:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:80b8::,2001:470:81ee:ffff:ffff:ffff:ffff:ffff,US
+2001:470:81ef::,2001:470:81ef:ffff:ffff:ffff:ffff:ffff,CA
+2001:470:81f0::,2001:470:8327:ffff:ffff:ffff:ffff:ffff,US
+2001:470:8328::,2001:470:8328:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:8329::,2001:470:83a2:ffff:ffff:ffff:ffff:ffff,US
+2001:470:83a3::,2001:470:83a3:ffff:ffff:ffff:ffff:ffff,AU
+2001:470:83a4::,2001:470:83bb:ffff:ffff:ffff:ffff:ffff,US
+2001:470:83bc::,2001:470:83bc:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:83bd::,2001:470:83cf:ffff:ffff:ffff:ffff:ffff,US
+2001:470:83d0::,2001:470:83d0:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:83d1::,2001:470:83e8:ffff:ffff:ffff:ffff:ffff,US
+2001:470:83e9::,2001:470:83e9:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:83ea::,2001:470:859e:ffff:ffff:ffff:ffff:ffff,US
+2001:470:859f::,2001:470:859f:ffff:ffff:ffff:ffff:ffff,AU
+2001:470:85a0::,2001:470:903e:ffff:ffff:ffff:ffff:ffff,US
+2001:470:903f::,2001:470:903f:ffff:ffff:ffff:ffff:ffff,GB
+2001:470:9040::,2001:470:9d38:ffff:ffff:ffff:ffff:ffff,US
+2001:470:9d39::,2001:470:9d39:ffff:ffff:ffff:ffff:ffff,DE
+2001:470:9d3a::,2001:470:9ebf:ffff:ffff:ffff:ffff:ffff,US
+2001:470:9ec0::,2001:470:9ec0:ffff:ffff:ffff:ffff:ffff,DE
+2001:470:9ec1::,2001:470:b7a4:ffff:ffff:ffff:ffff:ffff,US
+2001:470:b7a5::,2001:470:b7a5:ffff:ffff:ffff:ffff:ffff,CH
+2001:470:b7a6::,2001:470:c322:ffff:ffff:ffff:ffff:ffff,US
+2001:470:c323::,2001:470:c323:ffff:ffff:ffff:ffff:ffff,CA
+2001:470:c324::,2001:470:c8f1:ffff:ffff:ffff:ffff:ffff,US
+2001:470:c8f2::,2001:470:c8f2:ffff:ffff:ffff:ffff:ffff,ES
+2001:470:c8f3::,2001:470:d6b8:ffff:ffff:ffff:ffff:ffff,US
+2001:470:d6b9::,2001:470:d6b9:ffff:ffff:ffff:ffff:ffff,RU
+2001:470:d6ba::,2001:470:de60:ffff:ffff:ffff:ffff:ffff,US
+2001:470:de61::,2001:470:de61:ffff:ffff:ffff:ffff:ffff,RU
+2001:470:de62::,2001:470:deb4:ffff:ffff:ffff:ffff:ffff,US
+2001:470:deb5::,2001:470:deb5:ffff:ffff:ffff:ffff:ffff,RU
+2001:470:deb6::,2001:470:dfad:ffff:ffff:ffff:ffff:ffff,US
+2001:470:dfae::,2001:470:dfae:ffff:ffff:ffff:ffff:ffff,SE
+2001:470:dfaf::,2001:470:e97e:ffff:ffff:ffff:ffff:ffff,US
+2001:470:e97f::,2001:470:e97f:ffff:ffff:ffff:ffff:ffff,CA
+2001:470:e980::,2001:470:ea76:ffff:ffff:ffff:ffff:ffff,US
+2001:470:ea77::,2001:470:ea77:ffff:ffff:ffff:ffff:ffff,AU
+2001:470:ea78::,2001:470:ecf6:ffff:ffff:ffff:ffff:ffff,US
+2001:470:ecf7::,2001:470:ecf7:ffff:ffff:ffff:ffff:ffff,ID
+2001:470:ecf8::,2001:470:f1fa:ffff:ffff:ffff:ffff:ffff,US
+2001:470:f1fb::,2001:470:f1fb:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:f1fc::,2001:470:f382:ffff:ffff:ffff:ffff:ffff,US
+2001:470:f383::,2001:470:f383:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:f384::,2001:470:fe3f:ffff:ffff:ffff:ffff:ffff,US
+2001:470:fe40::,2001:470:fe40:ffff:ffff:ffff:ffff:ffff,JP
+2001:470:fe41::,2001:470:fe7b:ffff:ffff:ffff:ffff:ffff,US
+2001:470:fe7c::,2001:470:fe7c:ffff:ffff:ffff:ffff:ffff,CN
+2001:470:fe7d::,2001:470:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:478::,2001:478:ffff:ffff:ffff:ffff:ffff:ffff,KN
+2001:480::,2001:480:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:490::,2001:490:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4a0::,2001:4a0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4b0::,2001:4b0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4b8::,2001:4b8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4c0::,2001:4c0:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:4c8::,2001:4c8:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:4d0::,2001:4d0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4e0::,2001:4e0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4e8::,2001:4e8:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:4f0::,2001:4f0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4f8::,2001:4f8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:500:1::,2001:500:4:ffff:ffff:ffff:ffff:ffff,US
+2001:500:6::,2001:500:f:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:10::,2001:500:10:ffff:ffff:ffff:ffff:ffff,PR
+2001:500:11::,2001:500:15:ffff:ffff:ffff:ffff:ffff,US
+2001:500:16::,2001:500:2c:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:2d::,2001:500:31:ffff:ffff:ffff:ffff:ffff,US
+2001:500:40::,2001:500:56:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:60::,2001:500:7d:ffff:ffff:ffff:ffff:ffff,US
+2001:500:80::,2001:500:83:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:84::,2001:500:89:ffff:ffff:ffff:ffff:ffff,US
+2001:500:8c::,2001:500:9f:ffff:ffff:ffff:ffff:ffff,US
+2001:500:a0::,2001:500:a7:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:a8::,2001:500:a8:ffff:ffff:ffff:ffff:ffff,US
+2001:500:c0::,2001:500:ef:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:f0::,2001:500:f0:ffff:ffff:ffff:ffff:ffff,US
+2001:500:f1::,2001:500:f1:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:100::,2001:500:109:ffff:ffff:ffff:ffff:ffff,CA
+2001:500:3e5::,2001:500:3e5:ffff:ffff:ffff:ffff:ffff,US
+2001:500:30ff::,2001:500:30ff:ffff:ffff:ffff:ffff:ffff,US
+2001:500:3682::,2001:500:3682:ffff:ffff:ffff:ffff:ffff,US
+2001:500:4431::,2001:500:4431:ffff:ffff:ffff:ffff:ffff,US
+2001:500:7967::,2001:500:7967:ffff:ffff:ffff:ffff:ffff,US
+2001:500:856e::,2001:500:856e:ffff:ffff:ffff:ffff:ffff,US
+2001:500:d937::,2001:500:d937:ffff:ffff:ffff:ffff:ffff,US
+2001:500:ed30::,2001:500:ed30:ffff:ffff:ffff:ffff:ffff,US
+2001:501:8a29::,2001:501:8a29:ffff:ffff:ffff:ffff:ffff,US
+2001:501:973c::,2001:501:973c:ffff:ffff:ffff:ffff:ffff,US
+2001:501:b1f9::,2001:501:b1f9:ffff:ffff:ffff:ffff:ffff,US
+2001:502:8cc::,2001:502:8cc:ffff:ffff:ffff:ffff:ffff,US
+2001:502:100e::,2001:502:100e:ffff:ffff:ffff:ffff:ffff,US
+2001:502:1ca1::,2001:502:1ca1:ffff:ffff:ffff:ffff:ffff,US
+2001:502:2eda::,2001:502:2eda:ffff:ffff:ffff:ffff:ffff,US
+2001:502:4612::,2001:502:4612:ffff:ffff:ffff:ffff:ffff,US
+2001:502:63bd::,2001:502:63bd:ffff:ffff:ffff:ffff:ffff,US
+2001:502:7094::,2001:502:7094:ffff:ffff:ffff:ffff:ffff,US
+2001:502:7a71::,2001:502:7a71:ffff:ffff:ffff:ffff:ffff,US
+2001:502:8c25::,2001:502:8c25:ffff:ffff:ffff:ffff:ffff,US
+2001:502:ad09::,2001:502:ad09:ffff:ffff:ffff:ffff:ffff,US
+2001:502:be98::,2001:502:be98:ffff:ffff:ffff:ffff:ffff,US
+2001:502:cbe4::,2001:502:cbe4:ffff:ffff:ffff:ffff:ffff,US
+2001:502:cfb5::,2001:502:cfb5:ffff:ffff:ffff:ffff:ffff,US
+2001:502:d399::,2001:502:d399:ffff:ffff:ffff:ffff:ffff,US
+2001:502:f3ff::,2001:502:f3ff:ffff:ffff:ffff:ffff:ffff,US
+2001:503:c27::,2001:503:c27:ffff:ffff:ffff:ffff:ffff,US
+2001:503:d2d::,2001:503:d2d:ffff:ffff:ffff:ffff:ffff,US
+2001:503:231d::,2001:503:231d:ffff:ffff:ffff:ffff:ffff,US
+2001:503:3227::,2001:503:3227:ffff:ffff:ffff:ffff:ffff,US
+2001:503:39c1::,2001:503:39c1:ffff:ffff:ffff:ffff:ffff,US
+2001:503:4872::,2001:503:4872:ffff:ffff:ffff:ffff:ffff,US
+2001:503:5419::,2001:503:5419:ffff:ffff:ffff:ffff:ffff,US
+2001:503:5ae2::,2001:503:5ae2:ffff:ffff:ffff:ffff:ffff,US
+2001:503:6810::,2001:503:6810:ffff:ffff:ffff:ffff:ffff,US
+2001:503:7bbb::,2001:503:7bbb:ffff:ffff:ffff:ffff:ffff,US
+2001:503:7bbf::,2001:503:7bbf:ffff:ffff:ffff:ffff:ffff,US
+2001:503:8028::,2001:503:8028:ffff:ffff:ffff:ffff:ffff,US
+2001:503:83eb::,2001:503:83eb:ffff:ffff:ffff:ffff:ffff,US
+2001:503:91ef::,2001:503:91ef:ffff:ffff:ffff:ffff:ffff,US
+2001:503:a124::,2001:503:a124:ffff:ffff:ffff:ffff:ffff,US
+2001:503:a83e::,2001:503:a83e:ffff:ffff:ffff:ffff:ffff,US
+2001:503:ba3e::,2001:503:ba3e:ffff:ffff:ffff:ffff:ffff,US
+2001:503:bfb0::,2001:503:bfb0:ffff:ffff:ffff:ffff:ffff,US
+2001:503:c779::,2001:503:c779:ffff:ffff:ffff:ffff:ffff,US
+2001:503:cc2c::,2001:503:cc2c:ffff:ffff:ffff:ffff:ffff,US
+2001:503:d1ae::,2001:503:d1ae:ffff:ffff:ffff:ffff:ffff,US
+2001:503:d414::,2001:503:d414:ffff:ffff:ffff:ffff:ffff,US
+2001:503:e239::,2001:503:e239:ffff:ffff:ffff:ffff:ffff,US
+2001:503:e8ef::,2001:503:e8ef:ffff:ffff:ffff:ffff:ffff,US
+2001:503:eea3::,2001:503:eea3:ffff:ffff:ffff:ffff:ffff,US
+2001:503:f189::,2001:503:f189:ffff:ffff:ffff:ffff:ffff,US
+2001:503:f261::,2001:503:f261:ffff:ffff:ffff:ffff:ffff,US
+2001:503:f3da::,2001:503:f3da:ffff:ffff:ffff:ffff:ffff,US
+2001:503:ff39::,2001:503:ff39:ffff:ffff:ffff:ffff:ffff,US
+2001:504::,2001:504:13:ffff:ffff:ffff:ffff:ffff,US
+2001:504:15::,2001:504:15:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:16::,2001:504:19:ffff:ffff:ffff:ffff:ffff,US
+2001:504:1a::,2001:504:1a:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:1b::,2001:504:1c:ffff:ffff:ffff:ffff:ffff,US
+2001:504:1d::,2001:504:1d:ffff:ffff:ffff:ffff:ffff,PR
+2001:504:20::,2001:504:23:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:24::,2001:504:24:ffff:ffff:ffff:ffff:ffff,US
+2001:504:25::,2001:504:26:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:27::,2001:504:29:ffff:ffff:ffff:ffff:ffff,US
+2001:504:2b::,2001:504:2d:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:2e::,2001:504:2e:ffff:ffff:ffff:ffff:ffff,US
+2001:504:2f::,2001:504:2f:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:30::,2001:504:34:ffff:ffff:ffff:ffff:ffff,US
+2001:504:35::,2001:504:35:ffff:ffff:ffff:ffff:ffff,GD
+2001:504:36::,2001:504:36:ffff:ffff:ffff:ffff:ffff,US
+2001:504:37::,2001:504:37:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:38::,2001:504:38:ffff:ffff:ffff:ffff:ffff,US
+2001:504:39::,2001:504:39:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:3a::,2001:504:3d:ffff:ffff:ffff:ffff:ffff,US
+2001:504:3e::,2001:504:3e:ffff:ffff:ffff:ffff:ffff,JM
+2001:504:3f::,2001:504:41:ffff:ffff:ffff:ffff:ffff,US
+2001:504:42::,2001:504:42:ffff:ffff:ffff:ffff:ffff,CA
+2001:504:43::,2001:504:43:ffff:ffff:ffff:ffff:ffff,US
+2001:506::,2001:506:1:ffff:ffff:ffff:ffff:ffff,US
+2001:506:8::,2001:506:8:ffff:ffff:ffff:ffff:ffff,US
+2001:506:20::,2001:506:20:ffff:ffff:ffff:ffff:ffff,CA
+2001:506:28::,2001:506:28:ffff:ffff:ffff:ffff:ffff,US
+2001:506:100::,2001:506:100:ffff:ffff:ffff:ffff:ffff,US
+2001:506:1000::,2001:506:2fff:ffff:ffff:ffff:ffff:ffff,US
+2001:506:4000::,2001:506:7fff:ffff:ffff:ffff:ffff:ffff,US
+2001:508::,2001:508:ffff:ffff:ffff:ffff:ffff:ffff,BM
+2001:510::,2001:510:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:518::,2001:518:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:520::,2001:520:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:528::,2001:528:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:530::,2001:530:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:538::,2001:538:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:540::,2001:540:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:548::,2001:548:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:550::,2001:550:907:ffff:ffff:ffff:ffff:ffff,US
+2001:550:908::,2001:550:908:ffff:ffff:ffff:ffff:ffff,CA
+2001:550:909::,2001:550:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:558::,2001:560:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:568::,2001:56f:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:570::,2001:570:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:578::,2001:57b:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:580::,2001:580:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:590::,2001:590:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:598::,2001:598:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:5a0::,2001:5a0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5a8::,2001:5a8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5b0::,2001:5b0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5b8::,2001:5b8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5c0:1000::,2001:5c0:1100:7fff:ffff:ffff:ffff:ffff,CA
+2001:5c0:1100:8000::,2001:5c0:1100:bfff:ffff:ffff:ffff:ffff,US
+2001:5c0:1100:c000::,2001:5c0:1504:ffff:ffff:ffff:ffff:ffff,CA
+2001:5c0:1505::,2001:5c0:1505:ffff:ffff:ffff:ffff:ffff,RU
+2001:5c0:1506::,2001:5c0:1507:7fff:ffff:ffff:ffff:ffff,CA
+2001:5c0:1507:8000::,2001:5c0:1507:ffff:ffff:ffff:ffff:ffff,IT
+2001:5c0:1508::,2001:5c0:1fff:ffff:ffff:ffff:ffff:ffff,CA
+2001:5c8::,2001:5c8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5d0::,2001:5d0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5d8::,2001:5d8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5e0::,2001:5e0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5e8::,2001:5e8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5f0::,2001:5f0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:5f8::,2001:5f8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:608::,2001:608:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:610::,2001:610:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:618::,2001:618:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:620::,2001:620:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:628::,2001:62f:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:630::,2001:630:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:638::,2001:638:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:640::,2001:640:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2001:648::,2001:64f:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2001:650::,2001:65f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:660::,2001:667:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:668::,2001:66f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:670::,2001:673:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:678:1::,2001:678:1:ffff:ffff:ffff:ffff:ffff,CZ
+2001:678:2::,2001:678:2:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:3::,2001:678:3:ffff:ffff:ffff:ffff:ffff,CH
+2001:678:4::,2001:678:5:ffff:ffff:ffff:ffff:ffff,GB
+2001:678:6::,2001:678:6:ffff:ffff:ffff:ffff:ffff,LT
+2001:678:7::,2001:678:7:ffff:ffff:ffff:ffff:ffff,GR
+2001:678:8::,2001:678:8:ffff:ffff:ffff:ffff:ffff,NL
+2001:678:9::,2001:678:a:ffff:ffff:ffff:ffff:ffff,BE
+2001:678:b::,2001:678:b:ffff:ffff:ffff:ffff:ffff,LV
+2001:678:c::,2001:678:c:ffff:ffff:ffff:ffff:ffff,FR
+2001:678:d::,2001:678:d:ffff:ffff:ffff:ffff:ffff,AT
+2001:678:e::,2001:678:e:ffff:ffff:ffff:ffff:ffff,DE
+2001:678:f::,2001:678:11:ffff:ffff:ffff:ffff:ffff,CZ
+2001:678:12::,2001:678:12:ffff:ffff:ffff:ffff:ffff,IT
+2001:678:13::,2001:678:18:ffff:ffff:ffff:ffff:ffff,RU
+2001:678:19::,2001:678:19:ffff:ffff:ffff:ffff:ffff,LT
+2001:678:1a::,2001:678:1a:ffff:ffff:ffff:ffff:ffff,DK
+2001:678:1b::,2001:678:1b:ffff:ffff:ffff:ffff:ffff,LU
+2001:678:1c::,2001:678:1c:ffff:ffff:ffff:ffff:ffff,AT
+2001:678:20::,2001:678:20:ffff:ffff:ffff:ffff:ffff,AT
+2001:678:24::,2001:678:24:ffff:ffff:ffff:ffff:ffff,AT
+2001:678:28::,2001:678:28:ffff:ffff:ffff:ffff:ffff,SM
+2001:678:2c::,2001:678:2c:ffff:ffff:ffff:ffff:ffff,NL
+2001:678:30::,2001:678:30:ffff:ffff:ffff:ffff:ffff,NL
+2001:678:34::,2001:678:34:ffff:ffff:ffff:ffff:ffff,NL
+2001:678:38::,2001:678:38:ffff:ffff:ffff:ffff:ffff,NL
+2001:678:3c::,2001:678:3c:ffff:ffff:ffff:ffff:ffff,BG
+2001:678:40::,2001:678:40:ffff:ffff:ffff:ffff:ffff,ES
+2001:678:44::,2001:678:44:ffff:ffff:ffff:ffff:ffff,ES
+2001:678:48::,2001:678:48:ffff:ffff:ffff:ffff:ffff,ES
+2001:678:4c::,2001:678:4c:ffff:ffff:ffff:ffff:ffff,FR
+2001:678:60::,2001:678:60:ffff:ffff:ffff:ffff:ffff,LU
+2001:678:64::,2001:678:64:ffff:ffff:ffff:ffff:ffff,BE
+2001:678:68::,2001:678:68:ffff:ffff:ffff:ffff:ffff,BE
+2001:678:6c::,2001:678:6c:ffff:ffff:ffff:ffff:ffff,BE
+2001:678:70::,2001:678:70:ffff:ffff:ffff:ffff:ffff,SK
+2001:678:74::,2001:678:74:ffff:ffff:ffff:ffff:ffff,DK
+2001:678:78::,2001:678:78:ffff:ffff:ffff:ffff:ffff,DK
+2001:678:7c::,2001:678:7c:ffff:ffff:ffff:ffff:ffff,LV
+2001:678:80::,2001:678:80:ffff:ffff:ffff:ffff:ffff,LV
+2001:678:84::,2001:678:84:ffff:ffff:ffff:ffff:ffff,LV
+2001:678:88::,2001:678:88:ffff:ffff:ffff:ffff:ffff,LT
+2001:678:8c::,2001:678:8c:ffff:ffff:ffff:ffff:ffff,LT
+2001:678:90::,2001:678:90:ffff:ffff:ffff:ffff:ffff,SK
+2001:678:94::,2001:678:94:ffff:ffff:ffff:ffff:ffff,EE
+2001:678:98::,2001:678:98:ffff:ffff:ffff:ffff:ffff,KZ
+2001:678:9c::,2001:678:9c:ffff:ffff:ffff:ffff:ffff,SK
+2001:678:a0::,2001:678:a0:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c::,2001:67c::ffff:ffff:ffff:ffff:ffff,IE
+2001:67c:4::,2001:67c:4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:8::,2001:67c:8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:c::,2001:67c:c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:10::,2001:67c:10:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:14::,2001:67c:14:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18::,2001:67c:18:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1c::,2001:67c:1c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:20::,2001:67c:20:ffff:ffff:ffff:ffff:ffff,IE
+2001:67c:24::,2001:67c:24:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c::,2001:67c:2c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:30::,2001:67c:30:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:34::,2001:67c:34:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:38::,2001:67c:38:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:40::,2001:67c:40:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:44::,2001:67c:44:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:4c::,2001:67c:4c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:50::,2001:67c:50:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:54::,2001:67c:54:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:58::,2001:67c:58:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:5c::,2001:67c:5c:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:60::,2001:67c:60:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:64::,2001:67c:64:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:68::,2001:67c:68:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:6c::,2001:67c:6c:ffff:ffff:ffff:ffff:ffff,IS
+2001:67c:70::,2001:67c:70:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:74::,2001:67c:74:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:78::,2001:67c:78:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:84::,2001:67c:84:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:88::,2001:67c:88:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:8c::,2001:67c:8c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:90::,2001:67c:90:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:94::,2001:67c:94:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:98::,2001:67c:98:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:9c::,2001:67c:9c:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:a0::,2001:67c:a0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:a4::,2001:67c:a4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:a8::,2001:67c:a8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:ac::,2001:67c:ac:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:b0::,2001:67c:b0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:b4::,2001:67c:b4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:b8::,2001:67c:b8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:bc::,2001:67c:bc:ffff:ffff:ffff:ffff:ffff,EE
+2001:67c:c4::,2001:67c:c4:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:c8::,2001:67c:c8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:cc::,2001:67c:cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:d0::,2001:67c:d0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:d4::,2001:67c:d4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:d8::,2001:67c:d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:dc::,2001:67c:dc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:e0::,2001:67c:e0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:e4::,2001:67c:e4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:e8::,2001:67c:e8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:ec::,2001:67c:ec:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:f0::,2001:67c:f0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:f4::,2001:67c:f4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:f8::,2001:67c:f8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:fc::,2001:67c:fc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:100::,2001:67c:100:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:108::,2001:67c:108:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:10c::,2001:67c:10c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:110::,2001:67c:110:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:114::,2001:67c:114:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:118::,2001:67c:118:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:11c::,2001:67c:11c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:120::,2001:67c:120:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:124::,2001:67c:124:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:128::,2001:67c:128:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:12c::,2001:67c:12c:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:130::,2001:67c:130:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:134::,2001:67c:134:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:138::,2001:67c:138:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:13c::,2001:67c:13c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:140::,2001:67c:140:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:148::,2001:67c:148:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:14c::,2001:67c:14d:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:154::,2001:67c:154:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:158::,2001:67c:158:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:15c::,2001:67c:15c:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:160::,2001:67c:160:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:164::,2001:67c:164:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:168::,2001:67c:168:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:170::,2001:67c:170:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:174::,2001:67c:174:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:178::,2001:67c:178:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:17c::,2001:67c:17c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:180::,2001:67c:180:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:184::,2001:67c:184:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:188::,2001:67c:188:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:18c::,2001:67c:18c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:190::,2001:67c:190:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:194::,2001:67c:194:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:19c::,2001:67c:19c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1a0::,2001:67c:1a0:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:1a4::,2001:67c:1a4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1a8::,2001:67c:1a8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1ac::,2001:67c:1ac:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b0::,2001:67c:1b0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1b4::,2001:67c:1b4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1b8::,2001:67c:1b8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1bc::,2001:67c:1bc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1c0::,2001:67c:1c0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1c4::,2001:67c:1c4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1c8::,2001:67c:1c8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1cc::,2001:67c:1cc:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1d0::,2001:67c:1d0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1d4::,2001:67c:1d4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1d8::,2001:67c:1d8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1dc::,2001:67c:1dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1e0::,2001:67c:1e0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1e4::,2001:67c:1e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1e8::,2001:67c:1e8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1ec::,2001:67c:1ec:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:1f0::,2001:67c:1f0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1f4::,2001:67c:1f4:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:1f8::,2001:67c:1f8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1fc::,2001:67c:1fc:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:200::,2001:67c:200:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:204::,2001:67c:204:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:208::,2001:67c:208:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:20c::,2001:67c:20c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:210::,2001:67c:210:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:218::,2001:67c:218:ffff:ffff:ffff:ffff:ffff,LT
+2001:67c:21c::,2001:67c:21c:ffff:ffff:ffff:ffff:ffff,AM
+2001:67c:220::,2001:67c:220:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:224::,2001:67c:224:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:228::,2001:67c:228:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:22c::,2001:67c:22c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:230::,2001:67c:230:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:234::,2001:67c:234:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:238::,2001:67c:238:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:23c::,2001:67c:23c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:240::,2001:67c:240:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:244::,2001:67c:244:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:248::,2001:67c:248:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:24c::,2001:67c:24c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:250::,2001:67c:250:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:254::,2001:67c:254:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:258::,2001:67c:258:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:25c::,2001:67c:25c:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:260::,2001:67c:260:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:264::,2001:67c:264:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:268::,2001:67c:268:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:26c::,2001:67c:26c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:270::,2001:67c:270:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:274::,2001:67c:274:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:278::,2001:67c:278:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:27c::,2001:67c:27c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:280::,2001:67c:280:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:284::,2001:67c:284:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:288::,2001:67c:288:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:28c::,2001:67c:28c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:294::,2001:67c:294:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:298::,2001:67c:298:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:29c::,2001:67c:29c:ffff:ffff:ffff:ffff:ffff,IT
+2001:67c:2a0::,2001:67c:2a0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2a4::,2001:67c:2a4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a8::,2001:67c:2a8:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2ac::,2001:67c:2ac:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2b0::,2001:67c:2b0:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2b8::,2001:67c:2b8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2bc::,2001:67c:2bc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c0::,2001:67c:2c0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2c4::,2001:67c:2c4:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c8::,2001:67c:2c8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2cc::,2001:67c:2cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2d0::,2001:67c:2d0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2d4::,2001:67c:2d4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2d8::,2001:67c:2d8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2dc::,2001:67c:2dc:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2e0::,2001:67c:2e0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2e4::,2001:67c:2e4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2e8::,2001:67c:2e8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2ec::,2001:67c:2ec:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2f4::,2001:67c:2f4:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:2f8::,2001:67c:2f8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2fc::,2001:67c:2fc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:300::,2001:67c:300:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:304::,2001:67c:304:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:308::,2001:67c:308:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:30c::,2001:67c:30c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:310::,2001:67c:310:ffff:ffff:ffff:ffff:ffff,CY
+2001:67c:314::,2001:67c:314:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:318::,2001:67c:318:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:31c::,2001:67c:31c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:324::,2001:67c:324:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:328::,2001:67c:328:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:32c::,2001:67c:32c:ffff:ffff:ffff:ffff:ffff,EE
+2001:67c:330::,2001:67c:330:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:334::,2001:67c:334:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:338::,2001:67c:338:ffff:ffff:ffff:ffff:ffff,IE
+2001:67c:33c::,2001:67c:33c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:340::,2001:67c:340:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:344::,2001:67c:344:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:348::,2001:67c:348:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:34c::,2001:67c:34c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:350::,2001:67c:350:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:354::,2001:67c:354:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:358::,2001:67c:358:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:35c::,2001:67c:35c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:360::,2001:67c:360:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:364::,2001:67c:364:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:368::,2001:67c:368:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:36c::,2001:67c:36c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:370::,2001:67c:370:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:374::,2001:67c:374:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:37c::,2001:67c:37c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:380::,2001:67c:380:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:384::,2001:67c:384:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:388::,2001:67c:388:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:38c::,2001:67c:38c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:390::,2001:67c:390:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:394::,2001:67c:394:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:398::,2001:67c:398:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:39c::,2001:67c:39c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:3a0::,2001:67c:3a0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:3a4::,2001:67c:3a4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:3a8::,2001:67c:3a8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:3ac::,2001:67c:3ac:ffff:ffff:ffff:ffff:ffff,RS
+2001:67c:3b0::,2001:67c:3b0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:3b4::,2001:67c:3b4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:3b8::,2001:67c:3b8:ffff:ffff:ffff:ffff:ffff,IE
+2001:67c:3bc::,2001:67c:3bc:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:3c0::,2001:67c:3c0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:3c4::,2001:67c:3c4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:3c8::,2001:67c:3c8:ffff:ffff:ffff:ffff:ffff,EE
+2001:67c:3cc::,2001:67c:3cc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:3d0::,2001:67c:3d0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:3d4::,2001:67c:3d4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:3d8::,2001:67c:3d8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:3dc::,2001:67c:3dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:3e0::,2001:67c:3e0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:3e4::,2001:67c:3e4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:3e8::,2001:67c:3e9:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:3f0::,2001:67c:3f0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:3f4::,2001:67c:3f4:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:3f8::,2001:67c:3f8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:3fc::,2001:67c:3fc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:400::,2001:67c:400:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:404::,2001:67c:404:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:408::,2001:67c:408:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:40c::,2001:67c:40c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:410::,2001:67c:410:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:414::,2001:67c:414:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:418::,2001:67c:418:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:41c::,2001:67c:41c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:420::,2001:67c:420:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:424::,2001:67c:424:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:428::,2001:67c:428:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:42c::,2001:67c:42c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:430::,2001:67c:430:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:434::,2001:67c:434:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:438::,2001:67c:438:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:43c::,2001:67c:43c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:440::,2001:67c:440:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:444::,2001:67c:444:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:448::,2001:67c:448:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:44c::,2001:67c:44c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:450::,2001:67c:450:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:454::,2001:67c:454:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:458::,2001:67c:458:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:45c::,2001:67c:45c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:460::,2001:67c:460:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:464::,2001:67c:464:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:468::,2001:67c:468:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:46c::,2001:67c:46c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:470::,2001:67c:470:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:474::,2001:67c:474:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:478::,2001:67c:478:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:47c::,2001:67c:47c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:480::,2001:67c:480:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:484::,2001:67c:484:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:488::,2001:67c:488:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:48c::,2001:67c:48c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:490::,2001:67c:490:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:494::,2001:67c:494:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:498::,2001:67c:498:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:49c::,2001:67c:49c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4a0::,2001:67c:4a0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4a4::,2001:67c:4a4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4a8::,2001:67c:4a8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:4ac::,2001:67c:4ac:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:4b0::,2001:67c:4b0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:4b4::,2001:67c:4b4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:4b8::,2001:67c:4b8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:4bc::,2001:67c:4bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4c0::,2001:67c:4c0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:4c4::,2001:67c:4c4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4c8::,2001:67c:4c8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4cc::,2001:67c:4cc:ffff:ffff:ffff:ffff:ffff,IL
+2001:67c:4d0::,2001:67c:4d0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4d4::,2001:67c:4d4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:4d8::,2001:67c:4d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4dc::,2001:67c:4dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:4e4::,2001:67c:4e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:4e8::,2001:67c:4e8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:4ec::,2001:67c:4ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:4f0::,2001:67c:4f0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:4f4::,2001:67c:4f4:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:4f8::,2001:67c:4f8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:4fc::,2001:67c:4fc:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:500::,2001:67c:500:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:504::,2001:67c:504:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:508::,2001:67c:508:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:50c::,2001:67c:50c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:510::,2001:67c:510:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:514::,2001:67c:514:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:518::,2001:67c:518:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:51c::,2001:67c:51c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:520::,2001:67c:520:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:524::,2001:67c:524:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:528::,2001:67c:528:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:530::,2001:67c:530:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:534::,2001:67c:534:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:538::,2001:67c:538:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:53c::,2001:67c:53c:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:540::,2001:67c:540:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:544::,2001:67c:544:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:548::,2001:67c:548:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:54c::,2001:67c:54c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:550::,2001:67c:550:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:554::,2001:67c:554:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:558::,2001:67c:558:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:55c::,2001:67c:55c:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:560::,2001:67c:560:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:564::,2001:67c:564:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:568::,2001:67c:568:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:56c::,2001:67c:56c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:570::,2001:67c:570:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:574::,2001:67c:574:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:578::,2001:67c:578:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:57c::,2001:67c:57c:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:580::,2001:67c:580:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:584::,2001:67c:584:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:588::,2001:67c:588:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:58c::,2001:67c:58c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:590::,2001:67c:590:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:594::,2001:67c:594:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:598::,2001:67c:598:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:59c::,2001:67c:59c:ffff:ffff:ffff:ffff:ffff,HU
+2001:67c:5a0::,2001:67c:5a1:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5a8::,2001:67c:5a8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5ac::,2001:67c:5ac:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:5b0::,2001:67c:5b0:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:5b4::,2001:67c:5b4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:5b8::,2001:67c:5b8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:5bc::,2001:67c:5bc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5c0::,2001:67c:5c0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:5c4::,2001:67c:5c4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:5c8::,2001:67c:5c8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:5cc::,2001:67c:5cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5d0::,2001:67c:5d0:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:5d4::,2001:67c:5d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5d8::,2001:67c:5d8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:5dc::,2001:67c:5dc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:5e0::,2001:67c:5e0:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:5e4::,2001:67c:5e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5e8::,2001:67c:5e8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:5ec::,2001:67c:5ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:5f0::,2001:67c:5f0:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:5f4::,2001:67c:5f4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:5f8::,2001:67c:5f8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:5fc::,2001:67c:5fc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:600::,2001:67c:600:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:604::,2001:67c:604:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:608::,2001:67c:608:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:60c::,2001:67c:60c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:610::,2001:67c:610:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:61c::,2001:67c:61c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:620::,2001:67c:620:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:624::,2001:67c:624:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:628::,2001:67c:628:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:62c::,2001:67c:62c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:630::,2001:67c:630:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:634::,2001:67c:634:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:638::,2001:67c:638:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:63c::,2001:67c:63c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:640::,2001:67c:640:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:644::,2001:67c:644:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:648::,2001:67c:648:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:64c::,2001:67c:64c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:650::,2001:67c:650:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:654::,2001:67c:654:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:658::,2001:67c:658:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:65c::,2001:67c:65c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:660::,2001:67c:660:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:664::,2001:67c:664:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:668::,2001:67c:668:ffff:ffff:ffff:ffff:ffff,MD
+2001:67c:66c::,2001:67c:66c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:670::,2001:67c:670:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:674::,2001:67c:674:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:678::,2001:67c:678:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:67c::,2001:67c:67c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:680::,2001:67c:680:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:684::,2001:67c:684:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:688::,2001:67c:688:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:68c::,2001:67c:68c:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:690::,2001:67c:690:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:694::,2001:67c:694:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:698::,2001:67c:698:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:69c::,2001:67c:69c:ffff:ffff:ffff:ffff:ffff,RS
+2001:67c:6a0::,2001:67c:6a0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:6a4::,2001:67c:6a4:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:6a8::,2001:67c:6a8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:6ac::,2001:67c:6ac:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:6b0::,2001:67c:6b0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:6b4::,2001:67c:6b4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:6b8::,2001:67c:6b8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:6bc::,2001:67c:6bc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:6c0::,2001:67c:6c0:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:6c4::,2001:67c:6c4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:6c8::,2001:67c:6c8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:6cc::,2001:67c:6cc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:6d0::,2001:67c:6d0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:6d4::,2001:67c:6d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:6d8::,2001:67c:6d8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:6dc::,2001:67c:6dc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:6e0::,2001:67c:6e0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:6e4::,2001:67c:6e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:6e8::,2001:67c:6e8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:6ec::,2001:67c:6ec:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:6f0::,2001:67c:6f0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:6f4::,2001:67c:6f4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:6fc::,2001:67c:6fc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:700::,2001:67c:700:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:704::,2001:67c:704:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:708::,2001:67c:708:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:70c::,2001:67c:70c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:710::,2001:67c:710:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:714::,2001:67c:714:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:718::,2001:67c:718:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:71c::,2001:67c:71c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:720::,2001:67c:720:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:724::,2001:67c:724:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:728::,2001:67c:728:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:72c::,2001:67c:72c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:730::,2001:67c:730:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:734::,2001:67c:734:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:738::,2001:67c:738:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:73c::,2001:67c:73c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:740::,2001:67c:740:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:744::,2001:67c:744:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:748::,2001:67c:748:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:74c::,2001:67c:74c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:750::,2001:67c:750:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:754::,2001:67c:754:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:758::,2001:67c:758:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:75c::,2001:67c:75c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:760::,2001:67c:760:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:764::,2001:67c:764:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:768::,2001:67c:768:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:76c::,2001:67c:76c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:770::,2001:67c:771:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:778::,2001:67c:778:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:77c::,2001:67c:77c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:784::,2001:67c:784:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:788::,2001:67c:788:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:78c::,2001:67c:78c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:790::,2001:67c:790:ffff:ffff:ffff:ffff:ffff,IT
+2001:67c:794::,2001:67c:794:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:798::,2001:67c:798:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:79c::,2001:67c:79c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:7a0::,2001:67c:7a0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:7a4::,2001:67c:7a4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:7a8::,2001:67c:7a8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:7ac::,2001:67c:7ac:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:7b0::,2001:67c:7b0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:7b4::,2001:67c:7b4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:7b8::,2001:67c:7b8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:7c0::,2001:67c:7c3:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:7d0::,2001:67c:7d0:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:7d4::,2001:67c:7d4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:7d8::,2001:67c:7d8:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:7dc::,2001:67c:7dc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:7e0::,2001:67c:7e0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:7e4::,2001:67c:7e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:7e8::,2001:67c:7e8:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:7ec::,2001:67c:7ec:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:7f0::,2001:67c:7f0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:7f4::,2001:67c:7f4:ffff:ffff:ffff:ffff:ffff,KW
+2001:67c:7f8::,2001:67c:7f8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:7fc::,2001:67c:7fc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1000::,2001:67c:1001:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1008::,2001:67c:1009:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1010::,2001:67c:1011:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1018::,2001:67c:1019:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1020::,2001:67c:1021:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1028::,2001:67c:1029:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1030::,2001:67c:1030:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1034::,2001:67c:1034:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1038::,2001:67c:1038:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:103c::,2001:67c:103c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1040::,2001:67c:1040:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1044::,2001:67c:1044:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1048::,2001:67c:1048:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:104c::,2001:67c:104c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1054::,2001:67c:1054:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1058::,2001:67c:1058:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:105c::,2001:67c:105c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1060::,2001:67c:1060:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:1064::,2001:67c:1064:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1068::,2001:67c:1068:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:106c::,2001:67c:106c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1070::,2001:67c:1071:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:1078::,2001:67c:1078:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:107c::,2001:67c:107c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1080::,2001:67c:1080:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1084::,2001:67c:1084:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1090::,2001:67c:1090:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1098::,2001:67c:1098:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:109c::,2001:67c:109c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:10a0::,2001:67c:10a0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:10a4::,2001:67c:10a4:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:10a8::,2001:67c:10a9:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:10b0::,2001:67c:10b0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:10b4::,2001:67c:10b4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:10b8::,2001:67c:10b8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:10bc::,2001:67c:10bc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:10c0::,2001:67c:10c0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10c4::,2001:67c:10c4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:10c8::,2001:67c:10c8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10cc::,2001:67c:10cc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10d0::,2001:67c:10d0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10d4::,2001:67c:10d4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:10d8::,2001:67c:10d8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:10dc::,2001:67c:10dc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10e0::,2001:67c:10e0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:10e4::,2001:67c:10e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:10e8::,2001:67c:10e8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:10ec::,2001:67c:10ec:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:10f0::,2001:67c:10f0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:10f4::,2001:67c:10f4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:10f8::,2001:67c:10f8:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:10fc::,2001:67c:10fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1100::,2001:67c:1100:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1104::,2001:67c:1104:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1108::,2001:67c:1109:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1110::,2001:67c:1111:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1118::,2001:67c:1118:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:111c::,2001:67c:111c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1120::,2001:67c:1120:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1124::,2001:67c:1124:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:1128::,2001:67c:1128:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:112c::,2001:67c:112c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1130::,2001:67c:1130:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1134::,2001:67c:1134:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1138::,2001:67c:1138:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:113c::,2001:67c:113c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1140::,2001:67c:1140:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1144::,2001:67c:1144:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1148::,2001:67c:1148:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:114c::,2001:67c:114c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1150::,2001:67c:1150:ffff:ffff:ffff:ffff:ffff,IL
+2001:67c:1154::,2001:67c:1154:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:1158::,2001:67c:1158:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:115c::,2001:67c:115c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1160::,2001:67c:1160:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1164::,2001:67c:1164:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:116c::,2001:67c:116c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1170::,2001:67c:1170:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1174::,2001:67c:1174:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1178::,2001:67c:1178:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:117c::,2001:67c:117c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1184::,2001:67c:1184:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:1188::,2001:67c:1188:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:118c::,2001:67c:118c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1190::,2001:67c:1190:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1194::,2001:67c:1194:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1198::,2001:67c:1199:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:11a0::,2001:67c:11a0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:11a4::,2001:67c:11a4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:11a8::,2001:67c:11a8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:11ac::,2001:67c:11ac:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:11b0::,2001:67c:11b0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:11b4::,2001:67c:11b4:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:11b8::,2001:67c:11b8:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:11bc::,2001:67c:11bc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:11c0::,2001:67c:11c0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:11c4::,2001:67c:11c4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:11c8::,2001:67c:11c8:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:11cc::,2001:67c:11cc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:11d0::,2001:67c:11d0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:11d4::,2001:67c:11d4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:11d8::,2001:67c:11d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:11dc::,2001:67c:11dc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:11e0::,2001:67c:11e0:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:11e4::,2001:67c:11e4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:11e8::,2001:67c:11e8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:11ec::,2001:67c:11ec:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:11f4::,2001:67c:11f4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:11f8::,2001:67c:11f8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:11fc::,2001:67c:11fc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1200::,2001:67c:1203:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1210::,2001:67c:1213:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1220::,2001:67c:1223:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1230::,2001:67c:1233:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1240::,2001:67c:1240:ffff:ffff:ffff:ffff:ffff,IE
+2001:67c:1244::,2001:67c:1244:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1248::,2001:67c:1248:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:124c::,2001:67c:124c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1254::,2001:67c:1254:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:125c::,2001:67c:125c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1260::,2001:67c:1260:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1264::,2001:67c:1264:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1268::,2001:67c:1268:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:126c::,2001:67c:126c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1270::,2001:67c:1270:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1274::,2001:67c:1274:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1278::,2001:67c:1278:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1280::,2001:67c:1280:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1284::,2001:67c:1284:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1288::,2001:67c:1288:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:128c::,2001:67c:128c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1294::,2001:67c:1294:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:129c::,2001:67c:129c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:12a0::,2001:67c:12a0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:12a4::,2001:67c:12a4:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:12a8::,2001:67c:12a8:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:12ac::,2001:67c:12ac:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:12b0::,2001:67c:12b0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:12b4::,2001:67c:12b4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:12b8::,2001:67c:12b8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:12bc::,2001:67c:12bc:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:12c0::,2001:67c:12c1:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:12c8::,2001:67c:12c8:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:12cc::,2001:67c:12cc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:12d0::,2001:67c:12d0:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:12d4::,2001:67c:12d4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:12d8::,2001:67c:12d8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:12dc::,2001:67c:12dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:12e0::,2001:67c:12e0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:12e4::,2001:67c:12e4:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:12e8::,2001:67c:12e9:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:12f4::,2001:67c:12f4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:12f8::,2001:67c:12f8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:12fc::,2001:67c:12fc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1300::,2001:67c:1300:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1304::,2001:67c:1304:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1308::,2001:67c:1308:ffff:ffff:ffff:ffff:ffff,MD
+2001:67c:130c::,2001:67c:130c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1310::,2001:67c:1310:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1314::,2001:67c:1314:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1318::,2001:67c:1318:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:131c::,2001:67c:131c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1320::,2001:67c:1320:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1324::,2001:67c:1324:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1328::,2001:67c:1328:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:132c::,2001:67c:132c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1330::,2001:67c:1330:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1334::,2001:67c:1334:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1338::,2001:67c:1338:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:133c::,2001:67c:133c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1340::,2001:67c:1340:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:1348::,2001:67c:1348:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:134c::,2001:67c:134c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1350::,2001:67c:1350:ffff:ffff:ffff:ffff:ffff,CY
+2001:67c:1354::,2001:67c:1354:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1358::,2001:67c:1358:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:135c::,2001:67c:135c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1360::,2001:67c:1360:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1364::,2001:67c:1364:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1368::,2001:67c:1368:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:136c::,2001:67c:136c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1370::,2001:67c:1370:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1374::,2001:67c:1374:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1378::,2001:67c:1378:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:137c::,2001:67c:137c:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:1380::,2001:67c:1380:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1384::,2001:67c:1384:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1388::,2001:67c:1388:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:138c::,2001:67c:138c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1390::,2001:67c:1390:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1394::,2001:67c:1394:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1398::,2001:67c:1398:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:139c::,2001:67c:139c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:13a0::,2001:67c:13a0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:13a8::,2001:67c:13a8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:13ac::,2001:67c:13ac:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:13b0::,2001:67c:13b0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:13b4::,2001:67c:13b4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:13b8::,2001:67c:13b8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:13bc::,2001:67c:13bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:13c0::,2001:67c:13c0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:13c4::,2001:67c:13c4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:13c8::,2001:67c:13c8:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:13cc::,2001:67c:13cc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:13d0::,2001:67c:13d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:13d4::,2001:67c:13d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:13d8::,2001:67c:13d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:13e0::,2001:67c:13e0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:13e4::,2001:67c:13e4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:13e8::,2001:67c:13e8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:13ec::,2001:67c:13ec:ffff:ffff:ffff:ffff:ffff,PT
+2001:67c:13f0::,2001:67c:13f0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:13f4::,2001:67c:13f4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:13f8::,2001:67c:13f8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1400::,2001:67c:1407:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1420::,2001:67c:1427:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1440::,2001:67c:1447:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1460::,2001:67c:1467:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1480::,2001:67c:1480:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1484::,2001:67c:1484:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1488::,2001:67c:1488:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:148c::,2001:67c:148c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1490::,2001:67c:1490:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1494::,2001:67c:1494:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1498::,2001:67c:1498:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:149c::,2001:67c:149c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:14a0::,2001:67c:14a0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:14a4::,2001:67c:14a4:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:14ac::,2001:67c:14ac:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:14b0::,2001:67c:14b0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:14b4::,2001:67c:14b4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:14b8::,2001:67c:14b8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:14bc::,2001:67c:14bc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:14c4::,2001:67c:14c4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:14d0::,2001:67c:14d0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:14d4::,2001:67c:14d4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:14d8::,2001:67c:14d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:14dc::,2001:67c:14dc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:14e0::,2001:67c:14e7:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1500::,2001:67c:1500:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1504::,2001:67c:1504:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1508::,2001:67c:1508:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:150c::,2001:67c:150c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1510::,2001:67c:1510:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1514::,2001:67c:1514:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1518::,2001:67c:1518:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:151c::,2001:67c:151c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1520::,2001:67c:1520:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1524::,2001:67c:1524:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1528::,2001:67c:1528:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:152c::,2001:67c:152c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1530::,2001:67c:1530:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1534::,2001:67c:1534:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1538::,2001:67c:1538:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:153c::,2001:67c:153c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1540::,2001:67c:1540:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1544::,2001:67c:1544:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:154c::,2001:67c:154c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1554::,2001:67c:1554:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:1558::,2001:67c:1558:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:155c::,2001:67c:155c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1560::,2001:67c:1563:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1570::,2001:67c:1570:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1574::,2001:67c:1574:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1578::,2001:67c:1578:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:157c::,2001:67c:157c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1580::,2001:67c:1580:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1584::,2001:67c:1584:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:158c::,2001:67c:158c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1590::,2001:67c:1591:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1598::,2001:67c:1598:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:159c::,2001:67c:159c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:15a0::,2001:67c:15a3:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:15b0::,2001:67c:15b0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:15b8::,2001:67c:15b8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:15bc::,2001:67c:15bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15c0::,2001:67c:15c0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:15c4::,2001:67c:15c4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15c8::,2001:67c:15c8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15cc::,2001:67c:15cc:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:15d0::,2001:67c:15d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:15d4::,2001:67c:15d4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15d8::,2001:67c:15d8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:15dc::,2001:67c:15dc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:15e0::,2001:67c:15e0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:15e4::,2001:67c:15e4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:15e8::,2001:67c:15e8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15ec::,2001:67c:15ec:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:15f0::,2001:67c:15f0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:15f4::,2001:67c:15f4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:15f8::,2001:67c:15f8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:15fc::,2001:67c:15fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1600::,2001:67c:160f:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1640::,2001:67c:164f:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:1680::,2001:67c:1680:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1684::,2001:67c:1684:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:1688::,2001:67c:1688:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:168c::,2001:67c:168c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1690::,2001:67c:1690:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1694::,2001:67c:1694:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1698::,2001:67c:1698:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:169c::,2001:67c:169c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:16a0::,2001:67c:16a0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:16a4::,2001:67c:16a4:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:16a8::,2001:67c:16a8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:16ac::,2001:67c:16ac:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:16b0::,2001:67c:16b0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:16b4::,2001:67c:16b4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:16b8::,2001:67c:16b8:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:16bc::,2001:67c:16bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:16c0::,2001:67c:16c0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:16c4::,2001:67c:16c4:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:16c8::,2001:67c:16c8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:16d0::,2001:67c:16d1:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:16d8::,2001:67c:16d8:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:16dc::,2001:67c:16dc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:16e0::,2001:67c:16e0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:16e4::,2001:67c:16e4:ffff:ffff:ffff:ffff:ffff,HR
+2001:67c:16e8::,2001:67c:16e8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:16ec::,2001:67c:16ec:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:16f0::,2001:67c:16f0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:16f4::,2001:67c:16f4:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:16f8::,2001:67c:16f8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:16fc::,2001:67c:16fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1700::,2001:67c:1700:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1704::,2001:67c:1704:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1708::,2001:67c:1708:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:170c::,2001:67c:170c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1710::,2001:67c:1710:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1720::,2001:67c:1720:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1724::,2001:67c:1724:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1728::,2001:67c:1728:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:172c::,2001:67c:172c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1730::,2001:67c:1730:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1734::,2001:67c:1734:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1738::,2001:67c:1738:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:173c::,2001:67c:173c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1740::,2001:67c:1740:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1744::,2001:67c:1744:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:1748::,2001:67c:1748:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:174c::,2001:67c:174c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1750::,2001:67c:1750:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1754::,2001:67c:1754:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1758::,2001:67c:1758:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:175c::,2001:67c:175c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1760::,2001:67c:1760:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:1764::,2001:67c:1764:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1768::,2001:67c:1768:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:176c::,2001:67c:176c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1770::,2001:67c:1770:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1774::,2001:67c:1774:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:177c::,2001:67c:177c:ffff:ffff:ffff:ffff:ffff,LT
+2001:67c:1780::,2001:67c:1780:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1784::,2001:67c:1784:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1788::,2001:67c:1788:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:178c::,2001:67c:178c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1790::,2001:67c:1790:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1794::,2001:67c:1794:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1798::,2001:67c:1798:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:179c::,2001:67c:179c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17a0::,2001:67c:17a0:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:17a8::,2001:67c:17a8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17ac::,2001:67c:17ac:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17b0::,2001:67c:17b0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:17b4::,2001:67c:17b4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:17b8::,2001:67c:17b8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:17bc::,2001:67c:17bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17c0::,2001:67c:17c0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17c4::,2001:67c:17c4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17c8::,2001:67c:17c8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:17cc::,2001:67c:17cc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17d0::,2001:67c:17d0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:17d4::,2001:67c:17d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:17d8::,2001:67c:17d8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:17dc::,2001:67c:17dc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17e0::,2001:67c:17e0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17e4::,2001:67c:17e4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:17e8::,2001:67c:17e8:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:17ec::,2001:67c:17ec:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:17f0::,2001:67c:17f0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17f4::,2001:67c:17f4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:17f8::,2001:67c:17f8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:17fc::,2001:67c:17fc:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1800::,2001:67c:1800:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1804::,2001:67c:1804:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1808::,2001:67c:1809:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1810::,2001:67c:1810:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1814::,2001:67c:1814:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1818::,2001:67c:1818:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:181c::,2001:67c:181c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1820::,2001:67c:1820:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1828::,2001:67c:1828:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:182c::,2001:67c:182c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1830::,2001:67c:1830:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1834::,2001:67c:1834:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1838::,2001:67c:1838:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:183c::,2001:67c:183c:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1840::,2001:67c:1840:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1844::,2001:67c:1844:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1848::,2001:67c:1848:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:184c::,2001:67c:184c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1854::,2001:67c:1854:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1858::,2001:67c:1858:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:185c::,2001:67c:185c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:1860::,2001:67c:1860:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1864::,2001:67c:1864:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1868::,2001:67c:1868:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:186c::,2001:67c:186c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1870::,2001:67c:1870:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1874::,2001:67c:1874:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1878::,2001:67c:1878:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:187c::,2001:67c:187c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1880::,2001:67c:1880:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1884::,2001:67c:1884:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1888::,2001:67c:1888:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:188c::,2001:67c:188c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1890::,2001:67c:1890:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1894::,2001:67c:1894:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1898::,2001:67c:1898:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:189c::,2001:67c:189c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:18a0::,2001:67c:18a0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:18a4::,2001:67c:18a4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:18a8::,2001:67c:18a8:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:18ac::,2001:67c:18ac:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:18b0::,2001:67c:18b0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18b4::,2001:67c:18b4:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:18b8::,2001:67c:18b8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18bc::,2001:67c:18bc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18c0::,2001:67c:18c0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:18c4::,2001:67c:18c4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:18c8::,2001:67c:18c9:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:18d0::,2001:67c:18d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:18d4::,2001:67c:18d4:ffff:ffff:ffff:ffff:ffff,NZ
+2001:67c:18d8::,2001:67c:18d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:18dc::,2001:67c:18dc:ffff:ffff:ffff:ffff:ffff,LI
+2001:67c:18e0::,2001:67c:18e0:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:18e4::,2001:67c:18e4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:18e8::,2001:67c:18e8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18ec::,2001:67c:18ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18f0::,2001:67c:18f0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:18f4::,2001:67c:18f4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:18f8::,2001:67c:18f8:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:18fc::,2001:67c:18fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1900::,2001:67c:1903:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:1910::,2001:67c:1910:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1918::,2001:67c:1918:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:191c::,2001:67c:191c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1920::,2001:67c:1920:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1924::,2001:67c:1924:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1928::,2001:67c:1928:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1930::,2001:67c:1933:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1940::,2001:67c:1940:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1944::,2001:67c:1944:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1948::,2001:67c:1948:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:194c::,2001:67c:194c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1950::,2001:67c:1950:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1954::,2001:67c:1954:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1958::,2001:67c:1958:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:195c::,2001:67c:195c:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:1960::,2001:67c:1960:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1964::,2001:67c:1964:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1968::,2001:67c:1968:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:196c::,2001:67c:196c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1970::,2001:67c:1970:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1974::,2001:67c:1974:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1978::,2001:67c:1978:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:197c::,2001:67c:197c:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:1980::,2001:67c:1980:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1984::,2001:67c:1984:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:1988::,2001:67c:1988:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:198c::,2001:67c:198c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1990::,2001:67c:1990:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1994::,2001:67c:1994:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1998::,2001:67c:1998:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:19a0::,2001:67c:19a0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:19a4::,2001:67c:19a4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:19a8::,2001:67c:19a8:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:19ac::,2001:67c:19ac:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:19b0::,2001:67c:19b3:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:19c0::,2001:67c:19c0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:19c4::,2001:67c:19c4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:19c8::,2001:67c:19c8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:19cc::,2001:67c:19cc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:19d0::,2001:67c:19d0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:19d4::,2001:67c:19d4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:19d8::,2001:67c:19d8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:19dc::,2001:67c:19dc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:19e0::,2001:67c:19e0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:19e4::,2001:67c:19e4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:19e8::,2001:67c:19e8:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:19ec::,2001:67c:19ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:19f0::,2001:67c:19f0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:19f4::,2001:67c:19f4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:19f8::,2001:67c:19f8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:19fc::,2001:67c:19fc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1a00::,2001:67c:1a3f:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1b00::,2001:67c:1b00:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b04::,2001:67c:1b04:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b08::,2001:67c:1b08:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1b0c::,2001:67c:1b0c:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:1b10::,2001:67c:1b10:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b14::,2001:67c:1b14:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1b18::,2001:67c:1b18:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b1c::,2001:67c:1b1c:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:1b20::,2001:67c:1b20:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1b24::,2001:67c:1b24:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1b30::,2001:67c:1b30:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1b34::,2001:67c:1b34:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b3c::,2001:67c:1b3c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:1b40::,2001:67c:1b43:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1b50::,2001:67c:1b50:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1b54::,2001:67c:1b54:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1b58::,2001:67c:1b59:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:1b60::,2001:67c:1b60:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b64::,2001:67c:1b64:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1b6c::,2001:67c:1b6c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b70::,2001:67c:1b70:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:1b78::,2001:67c:1b78:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b7c::,2001:67c:1b7c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b80::,2001:67c:1b80:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1b84::,2001:67c:1b84:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1b88::,2001:67c:1b88:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1b8c::,2001:67c:1b8c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1b90::,2001:67c:1b90:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:1b94::,2001:67c:1b94:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1b98::,2001:67c:1b98:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1b9c::,2001:67c:1b9c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1ba4::,2001:67c:1ba4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1ba8::,2001:67c:1ba8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1bb0::,2001:67c:1bb0:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1bb4::,2001:67c:1bb4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1bb8::,2001:67c:1bb8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1bbc::,2001:67c:1bbc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:1bc0::,2001:67c:1bc0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1bc4::,2001:67c:1bc4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:1bc8::,2001:67c:1bc8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1bcc::,2001:67c:1bcc:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1bd0::,2001:67c:1bd0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:1bd4::,2001:67c:1bd4:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:1bd8::,2001:67c:1bd8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1bdc::,2001:67c:1bdc:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:1be0::,2001:67c:1be0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:1be4::,2001:67c:1be4:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:1be8::,2001:67c:1be8:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:1bec::,2001:67c:1bec:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:1bf4::,2001:67c:1bf4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:1bf8::,2001:67c:1bf8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:1bfc::,2001:67c:1bfc:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:1c00::,2001:67c:1cff:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2004::,2001:67c:2004:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2008::,2001:67c:2008:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:200c::,2001:67c:200c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2010::,2001:67c:2010:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2014::,2001:67c:2014:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2018::,2001:67c:2018:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2020::,2001:67c:2020:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2024::,2001:67c:2024:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2028::,2001:67c:2028:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2030::,2001:67c:2030:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2034::,2001:67c:2034:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2038::,2001:67c:2038:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:203c::,2001:67c:203c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2040::,2001:67c:2040:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:2044::,2001:67c:2044:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2048::,2001:67c:2048:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:204c::,2001:67c:204c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2050::,2001:67c:2050:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:205c::,2001:67c:205c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2060::,2001:67c:2060:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2064::,2001:67c:2064:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2068::,2001:67c:2068:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:206c::,2001:67c:206c:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2070::,2001:67c:2070:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2074::,2001:67c:2074:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2078::,2001:67c:2078:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:207c::,2001:67c:207c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2080::,2001:67c:2080:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2084::,2001:67c:2084:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2088::,2001:67c:2088:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:208c::,2001:67c:208c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:20a0::,2001:67c:20a1:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:20a8::,2001:67c:20a8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:20ac::,2001:67c:20ac:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:20b0::,2001:67c:20b0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:20b4::,2001:67c:20b4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:20b8::,2001:67c:20b9:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:20c0::,2001:67c:20c0:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:20c4::,2001:67c:20c4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:20c8::,2001:67c:20c8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:20cc::,2001:67c:20cc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:20d0::,2001:67c:20d1:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:20d8::,2001:67c:20d8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:20dc::,2001:67c:20dc:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:20e0::,2001:67c:20e0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:20e4::,2001:67c:20e4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:20e8::,2001:67c:20e8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:20ec::,2001:67c:20ec:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:20f0::,2001:67c:20f0:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:20f4::,2001:67c:20f4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:20f8::,2001:67c:20f8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2100::,2001:67c:2100:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2104::,2001:67c:2104:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2108::,2001:67c:2108:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:210c::,2001:67c:210c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2110::,2001:67c:2110:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2114::,2001:67c:2114:ffff:ffff:ffff:ffff:ffff,IS
+2001:67c:2118::,2001:67c:2118:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:211c::,2001:67c:211c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2120::,2001:67c:2120:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2124::,2001:67c:2124:ffff:ffff:ffff:ffff:ffff,HU
+2001:67c:2128::,2001:67c:2128:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:212c::,2001:67c:212c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2130::,2001:67c:2130:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2134::,2001:67c:2134:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2138::,2001:67c:2138:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:213c::,2001:67c:213c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2144::,2001:67c:2144:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2148::,2001:67c:2148:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:214c::,2001:67c:214c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2150::,2001:67c:2150:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2154::,2001:67c:2154:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2158::,2001:67c:2158:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:215c::,2001:67c:215c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2160::,2001:67c:2160:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2164::,2001:67c:2164:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:2168::,2001:67c:2168:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:216c::,2001:67c:216c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2170::,2001:67c:2170:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2174::,2001:67c:2174:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2178::,2001:67c:2178:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:217c::,2001:67c:217c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2180::,2001:67c:2180:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2188::,2001:67c:2188:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:218c::,2001:67c:218c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2190::,2001:67c:2190:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2194::,2001:67c:2194:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2198::,2001:67c:2198:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:219c::,2001:67c:219c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:21a0::,2001:67c:21a0:ffff:ffff:ffff:ffff:ffff,IT
+2001:67c:21a4::,2001:67c:21a4:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:21a8::,2001:67c:21a8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:21ac::,2001:67c:21ac:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:21b0::,2001:67c:21b0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:21b4::,2001:67c:21b4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:21b8::,2001:67c:21b8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:21c0::,2001:67c:21c0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:21c4::,2001:67c:21c4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:21c8::,2001:67c:21c8:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:21cc::,2001:67c:21cc:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:21d0::,2001:67c:21d0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:21d8::,2001:67c:21d8:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:21dc::,2001:67c:21dc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:21e0::,2001:67c:21e0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:21e4::,2001:67c:21e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:21e8::,2001:67c:21e8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:21ec::,2001:67c:21ec:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:21f0::,2001:67c:21f0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:21f4::,2001:67c:21f4:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:21f8::,2001:67c:21f8:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:21fc::,2001:67c:21fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2200::,2001:67c:2200:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2204::,2001:67c:2204:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2208::,2001:67c:2208:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:220c::,2001:67c:220c:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2210::,2001:67c:2210:ffff:ffff:ffff:ffff:ffff,RS
+2001:67c:2214::,2001:67c:2214:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2218::,2001:67c:2219:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2220::,2001:67c:2220:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2224::,2001:67c:2224:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2228::,2001:67c:2228:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:222c::,2001:67c:222c:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:2234::,2001:67c:2234:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2238::,2001:67c:2238:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:223c::,2001:67c:223c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2240::,2001:67c:2240:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2244::,2001:67c:2244:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2248::,2001:67c:2248:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2250::,2001:67c:2250:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2254::,2001:67c:2254:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2258::,2001:67c:2258:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:225c::,2001:67c:225c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2260::,2001:67c:2260:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2264::,2001:67c:2264:ffff:ffff:ffff:ffff:ffff,KG
+2001:67c:2268::,2001:67c:2268:ffff:ffff:ffff:ffff:ffff,BY
+2001:67c:226c::,2001:67c:226c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2270::,2001:67c:2270:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2274::,2001:67c:2274:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2278::,2001:67c:2278:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:227c::,2001:67c:227c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2280::,2001:67c:2280:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2284::,2001:67c:2284:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2288::,2001:67c:2288:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:228c::,2001:67c:228c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2290::,2001:67c:2290:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2294::,2001:67c:2294:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:2298::,2001:67c:2298:ffff:ffff:ffff:ffff:ffff,US
+2001:67c:229c::,2001:67c:229c:ffff:ffff:ffff:ffff:ffff,GR
+2001:67c:22a0::,2001:67c:22a0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:22a4::,2001:67c:22a4:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:22a8::,2001:67c:22a8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:22b0::,2001:67c:22b0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:22b4::,2001:67c:22b4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:22b8::,2001:67c:22b8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:22bc::,2001:67c:22bc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:22c0::,2001:67c:22c0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:22c4::,2001:67c:22c4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:22c8::,2001:67c:22c8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:22cc::,2001:67c:22cc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:22d0::,2001:67c:22d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:22d8::,2001:67c:22d8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:22dc::,2001:67c:22dc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:22e0::,2001:67c:22e0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:22e4::,2001:67c:22e4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:22e8::,2001:67c:22e8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:22ec::,2001:67c:22ec:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:22f0::,2001:67c:22f0:ffff:ffff:ffff:ffff:ffff,RS
+2001:67c:22f8::,2001:67c:22f8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:22fc::,2001:67c:22fc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2300::,2001:67c:2300:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2304::,2001:67c:2304:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2308::,2001:67c:2308:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:230c::,2001:67c:230c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2310::,2001:67c:2310:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2314::,2001:67c:2314:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2318::,2001:67c:2318:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:231c::,2001:67c:231c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2320::,2001:67c:2320:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2324::,2001:67c:2324:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2328::,2001:67c:2328:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:232c::,2001:67c:232c:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:2330::,2001:67c:2330:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2334::,2001:67c:2334:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2338::,2001:67c:2338:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:233c::,2001:67c:233c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2340::,2001:67c:2340:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2348::,2001:67c:2348:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:234c::,2001:67c:234c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2354::,2001:67c:2354:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2358::,2001:67c:2358:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:235c::,2001:67c:235c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2360::,2001:67c:2360:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2364::,2001:67c:2364:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2368::,2001:67c:2368:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:236c::,2001:67c:236c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2370::,2001:67c:2370:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2374::,2001:67c:2374:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2378::,2001:67c:2378:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:237c::,2001:67c:237c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2380::,2001:67c:2380:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2384::,2001:67c:2384:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2388::,2001:67c:2388:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:238c::,2001:67c:238c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2394::,2001:67c:2394:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:239c::,2001:67c:239c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:23a0::,2001:67c:23a0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:23a4::,2001:67c:23a4:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:23a8::,2001:67c:23a8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:23b0::,2001:67c:23b0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:23b4::,2001:67c:23b4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:23b8::,2001:67c:23b8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:23bc::,2001:67c:23bc:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:23c0::,2001:67c:23c0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:23c4::,2001:67c:23c4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:23c8::,2001:67c:23c8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:23cc::,2001:67c:23cc:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:23d4::,2001:67c:23d4:ffff:ffff:ffff:ffff:ffff,EE
+2001:67c:23d8::,2001:67c:23d9:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:23e4::,2001:67c:23e4:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:23e8::,2001:67c:23e8:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:23ec::,2001:67c:23ec:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:23f0::,2001:67c:23f0:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:23f4::,2001:67c:23f4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:23f8::,2001:67c:23f8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:23fc::,2001:67c:23fc:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2400::,2001:67c:2400:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2404::,2001:67c:2404:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2408::,2001:67c:2408:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:240c::,2001:67c:240c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2410::,2001:67c:2410:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:2414::,2001:67c:2414:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2418::,2001:67c:2418:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2420::,2001:67c:2420:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2424::,2001:67c:2424:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2428::,2001:67c:2428:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:242c::,2001:67c:242c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2430::,2001:67c:2433:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2440::,2001:67c:2440:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2444::,2001:67c:2444:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2448::,2001:67c:2448:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:244c::,2001:67c:244c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2454::,2001:67c:2454:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:245c::,2001:67c:245c:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2460::,2001:67c:2460:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2464::,2001:67c:2464:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2468::,2001:67c:2468:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:246c::,2001:67c:246c:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2470::,2001:67c:2470:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2474::,2001:67c:2474:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2478::,2001:67c:2478:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:247c::,2001:67c:247c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2480::,2001:67c:2480:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2484::,2001:67c:2484:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2488::,2001:67c:2488:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:248c::,2001:67c:248c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2490::,2001:67c:2490:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2494::,2001:67c:2494:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2498::,2001:67c:2498:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:249c::,2001:67c:249c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:24a0::,2001:67c:24a0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:24a4::,2001:67c:24a4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:24a8::,2001:67c:24a8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:24ac::,2001:67c:24ac:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:24b4::,2001:67c:24b4:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:24b8::,2001:67c:24b8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:24c4::,2001:67c:24c4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:24c8::,2001:67c:24c8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:24cc::,2001:67c:24cc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:24d0::,2001:67c:24d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:24d4::,2001:67c:24d4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:24d8::,2001:67c:24d8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:24dc::,2001:67c:24dc:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:24e0::,2001:67c:24e0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:24e4::,2001:67c:24e4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:24e8::,2001:67c:24e9:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:24f0::,2001:67c:24f0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:24f4::,2001:67c:24f4:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:24f8::,2001:67c:24f8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:24fc::,2001:67c:24fc:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2500::,2001:67c:2507:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2520::,2001:67c:2520:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2524::,2001:67c:2524:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2528::,2001:67c:2528:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:252c::,2001:67c:252c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2534::,2001:67c:2534:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2538::,2001:67c:2538:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:253c::,2001:67c:253c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2540::,2001:67c:2540:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2544::,2001:67c:2544:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2548::,2001:67c:2548:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:254c::,2001:67c:254c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2550::,2001:67c:2550:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2554::,2001:67c:2554:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2558::,2001:67c:2558:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:255c::,2001:67c:255c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2560::,2001:67c:2560:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2564::,2001:67c:2564:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:256c::,2001:67c:256c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2574::,2001:67c:2574:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2578::,2001:67c:2578:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:257c::,2001:67c:257c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2580::,2001:67c:2580:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2584::,2001:67c:2584:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2588::,2001:67c:2588:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2590::,2001:67c:2590:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2594::,2001:67c:2594:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2598::,2001:67c:2598:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:259c::,2001:67c:259c:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:25a0::,2001:67c:25a0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:25a4::,2001:67c:25a4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:25a8::,2001:67c:25a8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:25ac::,2001:67c:25ac:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:25b0::,2001:67c:25b0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:25b4::,2001:67c:25b4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:25b8::,2001:67c:25b8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:25bc::,2001:67c:25bc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:25c0::,2001:67c:25c0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:25c4::,2001:67c:25c4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:25cc::,2001:67c:25cc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:25d0::,2001:67c:25d0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:25d4::,2001:67c:25d4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:25d8::,2001:67c:25d8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:25dc::,2001:67c:25dc:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:25e4::,2001:67c:25e4:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:25f4::,2001:67c:25f4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:25fc::,2001:67c:25fc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2600::,2001:67c:2600:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2604::,2001:67c:2604:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:260c::,2001:67c:260c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2610::,2001:67c:2610:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2614::,2001:67c:2614:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2618::,2001:67c:2618:ffff:ffff:ffff:ffff:ffff,EE
+2001:67c:261c::,2001:67c:261c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2620::,2001:67c:2620:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2624::,2001:67c:2624:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:262c::,2001:67c:262c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2630::,2001:67c:2630:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2634::,2001:67c:2634:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2638::,2001:67c:2638:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:263c::,2001:67c:263c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2640::,2001:67c:2640:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:2644::,2001:67c:2644:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:264c::,2001:67c:264c:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2650::,2001:67c:2650:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2654::,2001:67c:2654:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:265c::,2001:67c:265c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2660::,2001:67c:2660:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2664::,2001:67c:2664:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2668::,2001:67c:2668:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:266c::,2001:67c:266c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2670::,2001:67c:2670:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:2674::,2001:67c:2674:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2678::,2001:67c:2678:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:267c::,2001:67c:267c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2684::,2001:67c:2684:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2688::,2001:67c:2688:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:268c::,2001:67c:268c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2690::,2001:67c:2690:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2694::,2001:67c:2694:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2698::,2001:67c:2698:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:269c::,2001:67c:269c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:26a0::,2001:67c:26a0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:26a4::,2001:67c:26a4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:26ac::,2001:67c:26ac:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:26b0::,2001:67c:26b0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:26b4::,2001:67c:26b4:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:26b8::,2001:67c:26b8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:26bc::,2001:67c:26bc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:26c0::,2001:67c:26c3:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:26d0::,2001:67c:26d0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:26d4::,2001:67c:26d4:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:26d8::,2001:67c:26d8:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:26dc::,2001:67c:26dc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:26e0::,2001:67c:26e0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:26e4::,2001:67c:26e4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:26e8::,2001:67c:26e8:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:26ec::,2001:67c:26ec:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:26f0::,2001:67c:26f0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:26f4::,2001:67c:26f4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:26f8::,2001:67c:26f8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:26fc::,2001:67c:26fc:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2700::,2001:67c:2700:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2704::,2001:67c:2704:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2708::,2001:67c:2708:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:270c::,2001:67c:270c:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2710::,2001:67c:2710:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2714::,2001:67c:2714:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2718::,2001:67c:2718:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:271c::,2001:67c:271c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2720::,2001:67c:2720:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2724::,2001:67c:2724:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2728::,2001:67c:2728:ffff:ffff:ffff:ffff:ffff,IR
+2001:67c:272c::,2001:67c:272c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2730::,2001:67c:2730:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2734::,2001:67c:2734:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2738::,2001:67c:2738:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:273c::,2001:67c:273c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2740::,2001:67c:2740:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:2744::,2001:67c:2744:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2748::,2001:67c:2748:ffff:ffff:ffff:ffff:ffff,GR
+2001:67c:274c::,2001:67c:274c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2758::,2001:67c:2758:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:275c::,2001:67c:275c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2760::,2001:67c:2760:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2764::,2001:67c:2764:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2768::,2001:67c:2768:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:276c::,2001:67c:276c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2770::,2001:67c:2770:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2774::,2001:67c:2774:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:2778::,2001:67c:2778:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:277c::,2001:67c:277c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2780::,2001:67c:2780:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2784::,2001:67c:2784:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2788::,2001:67c:2788:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:278c::,2001:67c:278c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2790::,2001:67c:2790:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2794::,2001:67c:2794:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2798::,2001:67c:2798:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:27c0::,2001:67c:27c0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:27c4::,2001:67c:27c4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:27c8::,2001:67c:27c8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:27cc::,2001:67c:27cc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:27d0::,2001:67c:27d0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:27d4::,2001:67c:27d4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:27d8::,2001:67c:27d8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:27dc::,2001:67c:27dc:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:27e0::,2001:67c:27e0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:27e4::,2001:67c:27e4:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:27e8::,2001:67c:27e8:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:27ec::,2001:67c:27ec:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:27f0::,2001:67c:27f0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:27f4::,2001:67c:27f4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:27f8::,2001:67c:27f8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:27fc::,2001:67c:27fc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2800::,2001:67c:2800:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2804::,2001:67c:2804:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2808::,2001:67c:2808:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:280c::,2001:67c:280c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2810::,2001:67c:2810:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2814::,2001:67c:2814:ffff:ffff:ffff:ffff:ffff,LI
+2001:67c:2818::,2001:67c:2818:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:281c::,2001:67c:281c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2820::,2001:67c:2820:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2824::,2001:67c:2824:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2828::,2001:67c:2828:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:282c::,2001:67c:282c:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2830::,2001:67c:2830:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2834::,2001:67c:2834:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2838::,2001:67c:2838:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:283c::,2001:67c:283c:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:2840::,2001:67c:2840:ffff:ffff:ffff:ffff:ffff,IL
+2001:67c:2844::,2001:67c:2844:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2848::,2001:67c:2848:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:284c::,2001:67c:284c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2850::,2001:67c:2850:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2854::,2001:67c:2854:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:285c::,2001:67c:285c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2860::,2001:67c:2860:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2864::,2001:67c:2864:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2868::,2001:67c:2868:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:286c::,2001:67c:286c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2870::,2001:67c:2870:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2874::,2001:67c:2874:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2878::,2001:67c:2878:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:287c::,2001:67c:287c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2880::,2001:67c:2880:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2884::,2001:67c:2884:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2888::,2001:67c:2889:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2890::,2001:67c:2890:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2894::,2001:67c:2894:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2898::,2001:67c:2898:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:289c::,2001:67c:289c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:28a0::,2001:67c:28a0:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:28a4::,2001:67c:28a4:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:28a8::,2001:67c:28a8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:28ac::,2001:67c:28ac:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:28b0::,2001:67c:28b0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:28b4::,2001:67c:28b4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:28b8::,2001:67c:28b8:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:28bc::,2001:67c:28bc:ffff:ffff:ffff:ffff:ffff,HU
+2001:67c:28c0::,2001:67c:28c0:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:28c4::,2001:67c:28c4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:28cc::,2001:67c:28cc:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:28d0::,2001:67c:28d0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:28d8::,2001:67c:28d8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:28e0::,2001:67c:28e0:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:28e4::,2001:67c:28e4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:28e8::,2001:67c:28e8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:28f0::,2001:67c:28f0:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:28f4::,2001:67c:28f4:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:28f8::,2001:67c:28f8:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:28fc::,2001:67c:28fc:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2900::,2001:67c:291f:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2980::,2001:67c:2980:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2984::,2001:67c:2984:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2988::,2001:67c:2989:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:2994::,2001:67c:2994:ffff:ffff:ffff:ffff:ffff,SA
+2001:67c:2998::,2001:67c:2998:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:299c::,2001:67c:299c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:29a0::,2001:67c:29a0:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:29a8::,2001:67c:29a8:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:29ac::,2001:67c:29ac:ffff:ffff:ffff:ffff:ffff,CY
+2001:67c:29b0::,2001:67c:29b1:ffff:ffff:ffff:ffff:ffff,CY
+2001:67c:29bc::,2001:67c:29bc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:29c0::,2001:67c:29c1:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:29c8::,2001:67c:29c8:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:29cc::,2001:67c:29cc:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:29d0::,2001:67c:29d0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:29d4::,2001:67c:29d4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:29d8::,2001:67c:29d8:ffff:ffff:ffff:ffff:ffff,AE
+2001:67c:29dc::,2001:67c:29dc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:29e0::,2001:67c:29e0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:29e4::,2001:67c:29e4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:29e8::,2001:67c:29e8:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:29ec::,2001:67c:29ec:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:29f0::,2001:67c:29f0:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:29f4::,2001:67c:29f4:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:29f8::,2001:67c:29f8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:29fc::,2001:67c:29fc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2a00::,2001:67c:2a00:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2a04::,2001:67c:2a04:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2a08::,2001:67c:2a08:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2a0c::,2001:67c:2a0c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a14::,2001:67c:2a14:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a18::,2001:67c:2a18:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2a24::,2001:67c:2a24:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2a28::,2001:67c:2a28:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2a2c::,2001:67c:2a2c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2a30::,2001:67c:2a30:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a34::,2001:67c:2a34:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a38::,2001:67c:2a38:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2a3c::,2001:67c:2a3c:ffff:ffff:ffff:ffff:ffff,ES
+2001:67c:2a40::,2001:67c:2a40:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2a44::,2001:67c:2a44:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2a48::,2001:67c:2a48:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2a4c::,2001:67c:2a4c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2a50::,2001:67c:2a50:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2a54::,2001:67c:2a54:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a58::,2001:67c:2a58:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2a5c::,2001:67c:2a5c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2a64::,2001:67c:2a64:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2a68::,2001:67c:2a68:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2a6c::,2001:67c:2a6c:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:2a70::,2001:67c:2a70:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2a74::,2001:67c:2a74:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2a78::,2001:67c:2a78:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2a7c::,2001:67c:2a7c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2a80::,2001:67c:2a80:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2a84::,2001:67c:2a84:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2a88::,2001:67c:2a88:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:2a8c::,2001:67c:2a8c:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2a90::,2001:67c:2a90:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2a94::,2001:67c:2a94:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2a98::,2001:67c:2a98:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2a9c::,2001:67c:2a9c:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2aa0::,2001:67c:2aa0:ffff:ffff:ffff:ffff:ffff,LU
+2001:67c:2aa4::,2001:67c:2aa4:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2aa8::,2001:67c:2aa8:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2aac::,2001:67c:2aac:ffff:ffff:ffff:ffff:ffff,IS
+2001:67c:2ab0::,2001:67c:2ab0:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2ab4::,2001:67c:2ab4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2ab8::,2001:67c:2ab8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2abc::,2001:67c:2abc:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2ac0::,2001:67c:2ac0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2ac4::,2001:67c:2ac4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2ac8::,2001:67c:2ac8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2acc::,2001:67c:2acc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2ad0::,2001:67c:2ad0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2ad4::,2001:67c:2ad4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2ad8::,2001:67c:2ad8:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2adc::,2001:67c:2adc:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2ae0::,2001:67c:2ae0:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2ae4::,2001:67c:2ae4:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2ae8::,2001:67c:2ae8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2aec::,2001:67c:2aec:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2af0::,2001:67c:2af0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2af4::,2001:67c:2af4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2afc::,2001:67c:2afc:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2b04::,2001:67c:2b04:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2b08::,2001:67c:2b08:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b0c::,2001:67c:2b0c:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2b10::,2001:67c:2b10:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2b14::,2001:67c:2b14:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2b18::,2001:67c:2b18:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2b1c::,2001:67c:2b1c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2b20::,2001:67c:2b20:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2b24::,2001:67c:2b24:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b28::,2001:67c:2b28:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2b2c::,2001:67c:2b2c:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2b30::,2001:67c:2b30:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2b34::,2001:67c:2b34:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b3c::,2001:67c:2b3c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2b40::,2001:67c:2b40:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2b44::,2001:67c:2b44:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2b48::,2001:67c:2b48:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b4c::,2001:67c:2b4c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2b50::,2001:67c:2b50:ffff:ffff:ffff:ffff:ffff,AT
+2001:67c:2b54::,2001:67c:2b54:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2b58::,2001:67c:2b58:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b5c::,2001:67c:2b5c:ffff:ffff:ffff:ffff:ffff,FR
+2001:67c:2b60::,2001:67c:2b60:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2b64::,2001:67c:2b64:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2b68::,2001:67c:2b68:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2b6c::,2001:67c:2b6c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b70::,2001:67c:2b70:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2b74::,2001:67c:2b74:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2b78::,2001:67c:2b79:ffff:ffff:ffff:ffff:ffff,GR
+2001:67c:2b80::,2001:67c:2b80:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2b84::,2001:67c:2b84:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2b88::,2001:67c:2b88:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2b8c::,2001:67c:2b8c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2b90::,2001:67c:2b90:ffff:ffff:ffff:ffff:ffff,SI
+2001:67c:2b94::,2001:67c:2b94:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2b98::,2001:67c:2b98:ffff:ffff:ffff:ffff:ffff,DK
+2001:67c:2b9c::,2001:67c:2b9c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2ba0::,2001:67c:2ba0:ffff:ffff:ffff:ffff:ffff,TR
+2001:67c:2ba4::,2001:67c:2ba4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2ba8::,2001:67c:2ba8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2bac::,2001:67c:2bac:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2bb4::,2001:67c:2bb4:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2bb8::,2001:67c:2bb8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2bbc::,2001:67c:2bbc:ffff:ffff:ffff:ffff:ffff,RO
+2001:67c:2bc0::,2001:67c:2bc0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bc4::,2001:67c:2bc4:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2bc8::,2001:67c:2bc8:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2bcc::,2001:67c:2bcc:ffff:ffff:ffff:ffff:ffff,LV
+2001:67c:2bd0::,2001:67c:2bd0:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bd4::,2001:67c:2bd4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bd8::,2001:67c:2bd8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bdc::,2001:67c:2bdc:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2be4::,2001:67c:2be4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2be8::,2001:67c:2be8:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2bec::,2001:67c:2bec:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2bf0::,2001:67c:2bf0:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2bf4::,2001:67c:2bf4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2bf8::,2001:67c:2bf8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2bfc::,2001:67c:2bfc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c00::,2001:67c:2c00:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2c04::,2001:67c:2c04:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c08::,2001:67c:2c08:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c0c::,2001:67c:2c0c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c10::,2001:67c:2c10:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c14::,2001:67c:2c14:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c18::,2001:67c:2c18:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c1c::,2001:67c:2c1c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2c20::,2001:67c:2c20:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c24::,2001:67c:2c24:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2c28::,2001:67c:2c28:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c2c::,2001:67c:2c2c:ffff:ffff:ffff:ffff:ffff,HU
+2001:67c:2c30::,2001:67c:2c30:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c34::,2001:67c:2c34:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c38::,2001:67c:2c38:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c3c::,2001:67c:2c3c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c40::,2001:67c:2c40:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c44::,2001:67c:2c44:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2c48::,2001:67c:2c48:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2c4c::,2001:67c:2c4c:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c50::,2001:67c:2c50:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c54::,2001:67c:2c54:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c58::,2001:67c:2c58:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c5c::,2001:67c:2c5c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2c60::,2001:67c:2c60:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2c64::,2001:67c:2c64:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2c68::,2001:67c:2c68:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2c6c::,2001:67c:2c6c:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2c70::,2001:67c:2c70:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c74::,2001:67c:2c74:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c78::,2001:67c:2c78:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c7c::,2001:67c:2c7c:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2c80::,2001:67c:2c80:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2c84::,2001:67c:2c84:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2c88::,2001:67c:2c89:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2c90::,2001:67c:2c93:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2ca0::,2001:67c:2ca7:ffff:ffff:ffff:ffff:ffff,BE
+2001:67c:2cc0::,2001:67c:2cc0:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2cc4::,2001:67c:2cc4:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2cc8::,2001:67c:2cc8:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2ccc::,2001:67c:2ccc:ffff:ffff:ffff:ffff:ffff,CH
+2001:67c:2cd0::,2001:67c:2cd0:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2cd4::,2001:67c:2cd4:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2cd8::,2001:67c:2cd8:ffff:ffff:ffff:ffff:ffff,SK
+2001:67c:2cdc::,2001:67c:2cdc:ffff:ffff:ffff:ffff:ffff,RU
+2001:67c:2ce0::,2001:67c:2ce0:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2ce4::,2001:67c:2ce4:ffff:ffff:ffff:ffff:ffff,BG
+2001:67c:2ce8::,2001:67c:2ce8:ffff:ffff:ffff:ffff:ffff,FI
+2001:67c:2cec::,2001:67c:2cec:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2cf0::,2001:67c:2cf0:ffff:ffff:ffff:ffff:ffff,NO
+2001:67c:2cf4::,2001:67c:2cf4:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2cf8::,2001:67c:2cf8:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2cfc::,2001:67c:2cfc:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2d00::,2001:67c:2d00:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2d04::,2001:67c:2d04:ffff:ffff:ffff:ffff:ffff,SE
+2001:67c:2d08::,2001:67c:2d08:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2d0c::,2001:67c:2d0c:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2d10::,2001:67c:2d10:ffff:ffff:ffff:ffff:ffff,NL
+2001:67c:2d18::,2001:67c:2d19:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2d20::,2001:67c:2d20:ffff:ffff:ffff:ffff:ffff,UA
+2001:67c:2d24::,2001:67c:2d24:ffff:ffff:ffff:ffff:ffff,PL
+2001:67c:2d28::,2001:67c:2d28:ffff:ffff:ffff:ffff:ffff,DE
+2001:67c:2d2c::,2001:67c:2d2c:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2d30::,2001:67c:2d30:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2d34::,2001:67c:2d34:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2d38::,2001:67c:2d38:ffff:ffff:ffff:ffff:ffff,CZ
+2001:67c:2d3c::,2001:67c:2d3c:ffff:ffff:ffff:ffff:ffff,GB
+2001:67c:2d40::,2001:67c:2d40:ffff:ffff:ffff:ffff:ffff,UA
+2001:680::,2001:680:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:688::,2001:688:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:690::,2001:697:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2001:6a0::,2001:6a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:6a8::,2001:6a8:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2001:6b0::,2001:6b0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:6b8::,2001:6b8:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:6c8::,2001:6cf:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2001:6d0::,2001:6d0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2001:6d8::,2001:6df:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:6e0::,2001:6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:6e8::,2001:6ef:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:6f0::,2001:6f7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:6f8::,2001:6f8:900:87ff:ffff:ffff:ffff:ffff,GB
+2001:6f8:900:8800::,2001:6f8:900:9fff:ffff:ffff:ffff:ffff,DE
+2001:6f8:900:a000::,2001:6f8:11ab:ffff:ffff:ffff:ffff:ffff,GB
+2001:6f8:11ac::,2001:6f8:11ac:ffff:ffff:ffff:ffff:ffff,DE
+2001:6f8:11ad::,2001:6f8:1bff:ffff:ffff:ffff:ffff:ffff,GB
+2001:6f8:1c00::,2001:6f8:1c00:ffff:ffff:ffff:ffff:ffff,DE
+2001:6f8:1c01::,2001:6f8:1c3b:ffff:ffff:ffff:ffff:ffff,GB
+2001:6f8:1c3c::,2001:6f8:1c3c:ffff:ffff:ffff:ffff:ffff,DE
+2001:6f8:1c3d::,2001:6f8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:700::,2001:700:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:708::,2001:708:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:710::,2001:710:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:718::,2001:718:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:720::,2001:720:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:728::,2001:728:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:730::,2001:737:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:738::,2001:738:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2001:748::,2001:748:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:750::,2001:750:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:758::,2001:758:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:760::,2001:760:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:768::,2001:768:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:770::,2001:770:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2001:778::,2001:77f:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2001:780::,2001:787:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:788::,2001:78f:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:790::,2001:790:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2001:798::,2001:798:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:7a0::,2001:7a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:7a8::,2001:7a8:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:7b0::,2001:7b0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:7b8::,2001:7b8:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:7c0::,2001:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:7c8::,2001:7c8:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2001:7d0::,2001:7d0:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2001:7d8::,2001:7d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:7e0::,2001:7e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:7e8::,2001:7e8:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2001:7f8::,2001:7f8::ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:1::,2001:7f8:1:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:2::,2001:7f8:2:ffff:ffff:ffff:ffff:ffff,IT
+2001:7f8:3::,2001:7f8:5:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:6::,2001:7f8:6:ffff:ffff:ffff:ffff:ffff,BG
+2001:7f8:7::,2001:7f8:7:ffff:ffff:ffff:ffff:ffff,FI
+2001:7f8:8::,2001:7f8:8:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:9::,2001:7f8:9:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:a::,2001:7f8:a:ffff:ffff:ffff:ffff:ffff,PT
+2001:7f8:b::,2001:7f8:b:ffff:ffff:ffff:ffff:ffff,IT
+2001:7f8:c::,2001:7f8:c:ffff:ffff:ffff:ffff:ffff,CH
+2001:7f8:d::,2001:7f8:d:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:e::,2001:7f8:e:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:f::,2001:7f8:f:ffff:ffff:ffff:ffff:ffff,ES
+2001:7f8:10::,2001:7f8:10:ffff:ffff:ffff:ffff:ffff,IT
+2001:7f8:12::,2001:7f8:12:ffff:ffff:ffff:ffff:ffff,NO
+2001:7f8:13::,2001:7f8:13:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:14::,2001:7f8:14:ffff:ffff:ffff:ffff:ffff,CZ
+2001:7f8:15::,2001:7f8:15:ffff:ffff:ffff:ffff:ffff,EE
+2001:7f8:16::,2001:7f8:16:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:17::,2001:7f8:17:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:18::,2001:7f8:18:ffff:ffff:ffff:ffff:ffff,IE
+2001:7f8:19::,2001:7f8:19:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:1b::,2001:7f8:1b:ffff:ffff:ffff:ffff:ffff,BE
+2001:7f8:1c::,2001:7f8:1c:ffff:ffff:ffff:ffff:ffff,CH
+2001:7f8:1d::,2001:7f8:1d:ffff:ffff:ffff:ffff:ffff,FI
+2001:7f8:1e::,2001:7f8:1e:ffff:ffff:ffff:ffff:ffff,RS
+2001:7f8:1f::,2001:7f8:1f:ffff:ffff:ffff:ffff:ffff,DK
+2001:7f8:20::,2001:7f8:20:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:21::,2001:7f8:21:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:23::,2001:7f8:23:ffff:ffff:ffff:ffff:ffff,IT
+2001:7f8:24::,2001:7f8:24:ffff:ffff:ffff:ffff:ffff,CH
+2001:7f8:25::,2001:7f8:25:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:26::,2001:7f8:26:ffff:ffff:ffff:ffff:ffff,BE
+2001:7f8:27::,2001:7f8:27:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:28::,2001:7f8:28:ffff:ffff:ffff:ffff:ffff,HR
+2001:7f8:29::,2001:7f8:29:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:2a::,2001:7f8:2a:ffff:ffff:ffff:ffff:ffff,ES
+2001:7f8:2d::,2001:7f8:2d:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:2f::,2001:7f8:2f:ffff:ffff:ffff:ffff:ffff,SK
+2001:7f8:30::,2001:7f8:30:ffff:ffff:ffff:ffff:ffff,AT
+2001:7f8:31::,2001:7f8:31:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:33::,2001:7f8:33:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:34::,2001:7f8:34:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:35::,2001:7f8:35:ffff:ffff:ffff:ffff:ffff,HU
+2001:7f8:37::,2001:7f8:38:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:39::,2001:7f8:39:ffff:ffff:ffff:ffff:ffff,EE
+2001:7f8:3a::,2001:7f8:3a:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:3b::,2001:7f8:3b:ffff:ffff:ffff:ffff:ffff,IL
+2001:7f8:3d::,2001:7f8:3d:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:3e::,2001:7f8:3e:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:41::,2001:7f8:41:ffff:ffff:ffff:ffff:ffff,NO
+2001:7f8:42::,2001:7f8:42:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:43::,2001:7f8:43:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:44::,2001:7f8:44:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:45::,2001:7f8:45:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:46::,2001:7f8:46:ffff:ffff:ffff:ffff:ffff,SI
+2001:7f8:47::,2001:7f8:47:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:48::,2001:7f8:48:ffff:ffff:ffff:ffff:ffff,IS
+2001:7f8:4a::,2001:7f8:4a:ffff:ffff:ffff:ffff:ffff,AT
+2001:7f8:4b::,2001:7f8:4b:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:4c::,2001:7f8:4c:ffff:ffff:ffff:ffff:ffff,LU
+2001:7f8:4d::,2001:7f8:4d:ffff:ffff:ffff:ffff:ffff,IE
+2001:7f8:4e::,2001:7f8:4e:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:4f::,2001:7f8:4f:ffff:ffff:ffff:ffff:ffff,BH
+2001:7f8:50::,2001:7f8:50:ffff:ffff:ffff:ffff:ffff,EE
+2001:7f8:51::,2001:7f8:51:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:52::,2001:7f8:52:ffff:ffff:ffff:ffff:ffff,LB
+2001:7f8:53::,2001:7f8:53:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:54::,2001:7f8:54:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:55::,2001:7f8:55:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:56::,2001:7f8:56:ffff:ffff:ffff:ffff:ffff,DE
+2001:7f8:58::,2001:7f8:58:ffff:ffff:ffff:ffff:ffff,BG
+2001:7f8:59::,2001:7f8:59:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:5a::,2001:7f8:5a:ffff:ffff:ffff:ffff:ffff,BY
+2001:7f8:5b::,2001:7f8:5b:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:5c::,2001:7f8:5c:ffff:ffff:ffff:ffff:ffff,SE
+2001:7f8:5d::,2001:7f8:5d:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:5e::,2001:7f8:5e:ffff:ffff:ffff:ffff:ffff,CZ
+2001:7f8:5f::,2001:7f8:5f:ffff:ffff:ffff:ffff:ffff,IT
+2001:7f8:60::,2001:7f8:60:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:61::,2001:7f8:61:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:63::,2001:7f8:63:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:64::,2001:7f8:64:ffff:ffff:ffff:ffff:ffff,RO
+2001:7f8:66::,2001:7f8:66:ffff:ffff:ffff:ffff:ffff,AT
+2001:7f8:67::,2001:7f8:67:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:68::,2001:7f8:68:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:69::,2001:7f8:69:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:6a::,2001:7f8:6a:ffff:ffff:ffff:ffff:ffff,MD
+2001:7f8:6b::,2001:7f8:6b:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:6c::,2001:7f8:6c:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:6d::,2001:7f8:6d:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:6e::,2001:7f8:6e:ffff:ffff:ffff:ffff:ffff,GR
+2001:7f8:6f::,2001:7f8:70:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:71::,2001:7f8:71:ffff:ffff:ffff:ffff:ffff,AT
+2001:7f8:72::,2001:7f8:72:ffff:ffff:ffff:ffff:ffff,PS
+2001:7f8:73::,2001:7f8:73:ffff:ffff:ffff:ffff:ffff,AE
+2001:7f8:74::,2001:7f8:75:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:76::,2001:7f8:76:ffff:ffff:ffff:ffff:ffff,NO
+2001:7f8:77::,2001:7f8:78:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:79::,2001:7f8:79:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:7a::,2001:7f8:7a:ffff:ffff:ffff:ffff:ffff,AE
+2001:7f8:7b::,2001:7f8:7b:ffff:ffff:ffff:ffff:ffff,UA
+2001:7f8:7c::,2001:7f8:7c:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:7d::,2001:7f8:7d:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:7e::,2001:7f8:7e:ffff:ffff:ffff:ffff:ffff,ES
+2001:7f8:7f::,2001:7f8:7f:ffff:ffff:ffff:ffff:ffff,CZ
+2001:7f8:81::,2001:7f8:81:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:82::,2001:7f8:82:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:83::,2001:7f8:83:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:84::,2001:7f8:84:ffff:ffff:ffff:ffff:ffff,RU
+2001:7f8:85::,2001:7f8:85:ffff:ffff:ffff:ffff:ffff,HU
+2001:7f8:86::,2001:7f8:86:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:87::,2001:7f8:87:ffff:ffff:ffff:ffff:ffff,CZ
+2001:7f8:88::,2001:7f8:89:ffff:ffff:ffff:ffff:ffff,FR
+2001:7f8:8a::,2001:7f8:8a:ffff:ffff:ffff:ffff:ffff,PL
+2001:7f8:8b::,2001:7f8:8b:ffff:ffff:ffff:ffff:ffff,BY
+2001:7f8:8d::,2001:7f8:8d:ffff:ffff:ffff:ffff:ffff,AT
+2001:7f8:8e::,2001:7f8:8e:ffff:ffff:ffff:ffff:ffff,BG
+2001:7f8:8f::,2001:7f8:8f:ffff:ffff:ffff:ffff:ffff,NL
+2001:7f8:90::,2001:7f8:90:ffff:ffff:ffff:ffff:ffff,GB
+2001:7f8:91::,2001:7f8:91:ffff:ffff:ffff:ffff:ffff,SK
+2001:7f8:92::,2001:7f8:92:ffff:ffff:ffff:ffff:ffff,DE
+2001:7fa:0:1::,2001:7fa::1:ffff:ffff:ffff:ffff,HK
+2001:7fa:0:2::,2001:7fa::2:ffff:ffff:ffff:ffff,KR
+2001:7fa:0:3::,2001:7fa::3:ffff:ffff:ffff:ffff,JP
+2001:7fa:1::,2001:7fa:1:ffff:ffff:ffff:ffff:ffff,TW
+2001:7fa:2::,2001:7fa:2:ffff:ffff:ffff:ffff:ffff,ID
+2001:7fa:3::,2001:7fa:4:ffff:ffff:ffff:ffff:ffff,NZ
+2001:7fa:5::,2001:7fa:5:ffff:ffff:ffff:ffff:ffff,CN
+2001:7fa:6::,2001:7fa:6:ffff:ffff:ffff:ffff:ffff,VN
+2001:7fa:7::,2001:7fa:7:ffff:ffff:ffff:ffff:ffff,JP
+2001:7fa:8::,2001:7fa:8:ffff:ffff:ffff:ffff:ffff,KR
+2001:7fa:9::,2001:7fa:e:ffff:ffff:ffff:ffff:ffff,AU
+2001:7fa:f::,2001:7fa:f:ffff:ffff:ffff:ffff:ffff,ID
+2001:7fa:10::,2001:7fa:10:ffff:ffff:ffff:ffff:ffff,CN
+2001:7fa:11::,2001:7fa:11:ffff:ffff:ffff:ffff:ffff,AU
+2001:7fe::,2001:7fe:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:808::,2001:808:ffff:ffff:ffff:ffff:ffff:ffff,PL
2001:810::,2001:810:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:818::,2001:81f:ffff:ffff:ffff:ffff:ffff:ffff,PT
@@ -93,8 +2403,64 @@
2001:8e0::,2001:8e8:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:8f0::,2001:8f3:ffff:ffff:ffff:ffff:ffff:ffff,CY
2001:8f8::,2001:8ff:ffff:ffff:ffff:ffff:ffff:ffff,AE
-2001:900::,2001:9ff:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:a00::,2001:aff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:900::,2001:900:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:908::,2001:908:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:910::,2001:917:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:918::,2001:918:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:920::,2001:927:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:928::,2001:928:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:930::,2001:930:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2001:938::,2001:938:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:940::,2001:940:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:948::,2001:948:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:950::,2001:950:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2001:958::,2001:958:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:960::,2001:960:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:968::,2001:968:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:978::,2001:978:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:980::,2001:987:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:988::,2001:988:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:990::,2001:990:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:998::,2001:99b:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:9a0::,2001:9a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:9a8::,2001:9a8:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:9b0::,2001:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:9c0::,2001:9c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:9c8::,2001:9cf:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:9d0::,2001:9d0:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:9d8::,2001:9d8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:9e0::,2001:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:9e8::,2001:9e8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:9f0::,2001:9f0:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:a00::,2001:a00:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2001:a08::,2001:a08:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:a10::,2001:a10:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:a18::,2001:a1f:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2001:a20::,2001:a20:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:a30::,2001:a30:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:a38::,2001:a38:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:a40::,2001:a40:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2001:a48::,2001:a48:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:a50::,2001:a50:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:a58::,2001:a58:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2001:a60::,2001:a67:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:a68::,2001:a68:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2001:a70::,2001:a70:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:a78::,2001:a78:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:a80::,2001:a80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:a88::,2001:a88:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:a90::,2001:a90:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:a98::,2001:a98:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2001:aa0::,2001:aa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:aa8::,2001:ab7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:ab8::,2001:ab8:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2001:ac0::,2001:ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:ac8::,2001:ac8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:ad0::,2001:ad0:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2001:ad8::,2001:ae0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:ae8::,2001:ae8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:af0::,2001:af0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:af8::,2001:af8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:b00::,2001:b07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2001:b08::,2001:b08:ffff:ffff:ffff:ffff:ffff:ffff,RU
2001:b10::,2001:b10:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -116,7 +2482,7 @@
2001:b98::,2001:b98:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:ba0::,2001:ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2001:ba8::,2001:ba8:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2001:bb0::,2001:bb0:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2001:bb0::,2001:bb7:ffff:ffff:ffff:ffff:ffff:ffff,IE
2001:bb8::,2001:bb8:ffff:ffff:ffff:ffff:ffff:ffff,EE
2001:bc0::,2001:bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:bc8::,2001:bc8:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -156,8 +2522,777 @@
2001:ce8::,2001:ce8:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:cf0::,2001:cf0:ffff:ffff:ffff:ffff:ffff:ffff,KR
2001:cf8::,2001:cf8:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:d00::,2001:db7:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2001:db9::,2001:dff:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2001:d00::,2001:d00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d08::,2001:d08:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2001:d10::,2001:d10:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2001:d18::,2001:d18:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2001:d28::,2001:d28:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d30::,2001:d30:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d38::,2001:d38:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:d40::,2001:d40:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2001:d48::,2001:d48:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2001:d50::,2001:d50:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d58::,2001:d58:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2001:d68::,2001:d68:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2001:d70::,2001:d73:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d80::,2001:d80:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d88::,2001:d88:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d90::,2001:d90:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:d98::,2001:d98:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2001:da0::,2001:da0:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:da8::,2001:daa:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2001:db0::,2001:db0:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:dc0::,2001:dc0:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:dc1::,2001:dc1:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2001:dc2::,2001:dc4:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:dc5::,2001:dc5:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:dc6::,2001:dc6:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2001:dc7::,2001:dc7:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2001:dc8::,2001:dc8:ffff:ffff:ffff:ffff:ffff:ffff,VN
+2001:dc9::,2001:dc9:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:dca::,2001:dca:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2001:dcc::,2001:dcc:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:dcd::,2001:dcd:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:dce::,2001:dce:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2001:dd8::,2001:dd8::ffff:ffff:ffff:ffff:ffff,FJ
+2001:dd8:1::,2001:dd8:1:ffff:ffff:ffff:ffff:ffff,CN
+2001:dd8:2::,2001:dd8:2:ffff:ffff:ffff:ffff:ffff,MY
+2001:dd8:3::,2001:dd8:3:ffff:ffff:ffff:ffff:ffff,NZ
+2001:dd8:4::,2001:dd8:4:ffff:ffff:ffff:ffff:ffff,SG
+2001:dd8:5::,2001:dd8:5:ffff:ffff:ffff:ffff:ffff,CN
+2001:dd8:6::,2001:dd8:6:ffff:ffff:ffff:ffff:ffff,AU
+2001:dd8:7::,2001:dd8:7:ffff:ffff:ffff:ffff:ffff,NP
+2001:dd8:8::,2001:dd8:f:ffff:ffff:ffff:ffff:ffff,AU
+2001:dd8:10::,2001:dd8:11:ffff:ffff:ffff:ffff:ffff,NP
+2001:dd8:12::,2001:dd8:12:ffff:ffff:ffff:ffff:ffff,AU
+2001:dd8:13::,2001:dd8:13:ffff:ffff:ffff:ffff:ffff,NZ
+2001:dd8:14::,2001:dd8:14:ffff:ffff:ffff:ffff:ffff,AU
+2001:dd8:15::,2001:dd8:15:ffff:ffff:ffff:ffff:ffff,HK
+2001:dd8:16::,2001:dd8:16:ffff:ffff:ffff:ffff:ffff,SG
+2001:dd8:17::,2001:dd8:17:ffff:ffff:ffff:ffff:ffff,KR
+2001:dd8:18::,2001:dd8:18:ffff:ffff:ffff:ffff:ffff,TW
+2001:dd8:19::,2001:dd8:19:ffff:ffff:ffff:ffff:ffff,IN
+2001:dd8:1a::,2001:dd8:1a:ffff:ffff:ffff:ffff:ffff,CN
+2001:dd8:1b::,2001:dd8:1b:ffff:ffff:ffff:ffff:ffff,IN
+2001:dd8:1c::,2001:dd8:1c:ffff:ffff:ffff:ffff:ffff,PK
+2001:dd8:1d::,2001:dd8:1d:ffff:ffff:ffff:ffff:ffff,BD
+2001:dd8:1e::,2001:dd8:1e:ffff:ffff:ffff:ffff:ffff,KH
+2001:dd8:1f::,2001:dd8:1f:ffff:ffff:ffff:ffff:ffff,ID
+2001:dd8:20::,2001:dd8:21:ffff:ffff:ffff:ffff:ffff,IN
+2001:dd8:22::,2001:dd8:22:ffff:ffff:ffff:ffff:ffff,JP
+2001:dd8:24::,2001:dd8:25:ffff:ffff:ffff:ffff:ffff,NP
+2001:dda::,2001:dda::ffff:ffff:ffff:ffff:ffff,JP
+2001:ddc::,2001:ddc::ffff:ffff:ffff:ffff:ffff,MY
+2001:de1::,2001:de1:3f:ffff:ffff:ffff:ffff:ffff,JP
+2001:de8::,2001:de8::ffff:ffff:ffff:ffff:ffff,TH
+2001:de8:1::,2001:de8:1:ffff:ffff:ffff:ffff:ffff,IN
+2001:de8:2::,2001:de8:2:ffff:ffff:ffff:ffff:ffff,ID
+2001:de8:3::,2001:de8:3:ffff:ffff:ffff:ffff:ffff,VN
+2001:de8:4::,2001:de8:7:ffff:ffff:ffff:ffff:ffff,SG
+2001:de8:8::,2001:de8:8:ffff:ffff:ffff:ffff:ffff,JP
+2001:de8:9::,2001:de8:9:ffff:ffff:ffff:ffff:ffff,AU
+2001:de8:a::,2001:de8:a:ffff:ffff:ffff:ffff:ffff,VN
+2001:de8:b::,2001:de8:b:ffff:ffff:ffff:ffff:ffff,BD
+2001:de8:c::,2001:de8:c:ffff:ffff:ffff:ffff:ffff,JP
+2001:de8:d::,2001:de8:d:ffff:ffff:ffff:ffff:ffff,SG
+2001:de8:e::,2001:de8:e:ffff:ffff:ffff:ffff:ffff,TH
+2001:de8:f::,2001:de8:10:ffff:ffff:ffff:ffff:ffff,MY
+2001:de8:11::,2001:de8:11:ffff:ffff:ffff:ffff:ffff,ID
+2001:de8:12::,2001:de8:12:ffff:ffff:ffff:ffff:ffff,SG
+2001:de8:13::,2001:de8:13:ffff:ffff:ffff:ffff:ffff,MY
+2001:de8:14::,2001:de8:14:ffff:ffff:ffff:ffff:ffff,AU
+2001:de8:15::,2001:de8:15:ffff:ffff:ffff:ffff:ffff,ID
+2001:de8:16::,2001:de8:16:ffff:ffff:ffff:ffff:ffff,PF
+2001:de8:17::,2001:de8:17:ffff:ffff:ffff:ffff:ffff,AU
+2001:de8:19::,2001:de8:19:ffff:ffff:ffff:ffff:ffff,NZ
+2001:de8:1a::,2001:de8:1a:ffff:ffff:ffff:ffff:ffff,ID
+2001:de8:1b::,2001:de8:1b:ffff:ffff:ffff:ffff:ffff,MY
+2001:de8:1d::,2001:de8:1d:ffff:ffff:ffff:ffff:ffff,KH
+2001:de8:1e::,2001:de8:1e:ffff:ffff:ffff:ffff:ffff,JP
+2001:de9::,2001:de9::ffff:ffff:ffff:ffff:ffff,LK
+2001:dea::,2001:dea::ffff:ffff:ffff:ffff:ffff,AU
+2001:deb::,2001:deb::ffff:ffff:ffff:ffff:ffff,TH
+2001:dec::,2001:dec::ffff:ffff:ffff:ffff:ffff,VU
+2001:ded::,2001:ded::ffff:ffff:ffff:ffff:ffff,SG
+2001:dee::,2001:dee::ffff:ffff:ffff:ffff:ffff,HK
+2001:df0::,2001:df0:1:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:2::,2001:df0:2:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:4::,2001:df0:4:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:7::,2001:df0:7:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:8::,2001:df0:8:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:9::,2001:df0:a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:c::,2001:df0:13:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:14::,2001:df0:14:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:15::,2001:df0:15:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:17::,2001:df0:17:ffff:ffff:ffff:ffff:ffff,LK
+2001:df0:18::,2001:df0:18:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:19::,2001:df0:1d:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:1e::,2001:df0:1e:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:1f::,2001:df0:1f:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:20::,2001:df0:3f:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:40::,2001:df0:40:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:41::,2001:df0:41:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:42::,2001:df0:42:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:43::,2001:df0:43:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:44::,2001:df0:44:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:45::,2001:df0:46:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:48::,2001:df0:48:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:49::,2001:df0:49:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:4a::,2001:df0:4a:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:4b::,2001:df0:4d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:4f::,2001:df0:60:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:62::,2001:df0:62:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:63::,2001:df0:63:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:65::,2001:df0:65:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:66::,2001:df0:66:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:68::,2001:df0:68:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:69::,2001:df0:69:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:6a::,2001:df0:6a:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:6b::,2001:df0:6b:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:6c::,2001:df0:6c:ffff:ffff:ffff:ffff:ffff,WS
+2001:df0:6f::,2001:df0:6f:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:70::,2001:df0:70:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:71::,2001:df0:71:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:73::,2001:df0:74:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:75::,2001:df0:75:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:76::,2001:df0:76:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:77::,2001:df0:77:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:78::,2001:df0:78:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:7b::,2001:df0:7c:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:7d::,2001:df0:7d:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:7e::,2001:df0:81:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:82::,2001:df0:82:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:83::,2001:df0:83:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:84::,2001:df0:84:ffff:ffff:ffff:ffff:ffff,PK
+2001:df0:85::,2001:df0:85:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:86::,2001:df0:87:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:89::,2001:df0:89:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:8b::,2001:df0:8b:ffff:ffff:ffff:ffff:ffff,NP
+2001:df0:8c::,2001:df0:8c:ffff:ffff:ffff:ffff:ffff,NU
+2001:df0:8e::,2001:df0:90:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:91::,2001:df0:91:ffff:ffff:ffff:ffff:ffff,FJ
+2001:df0:92::,2001:df0:92:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:93::,2001:df0:93:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:94::,2001:df0:94:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:95::,2001:df0:95:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:96::,2001:df0:96:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:97::,2001:df0:97:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:98::,2001:df0:9a:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:9c::,2001:df0:9c:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:9d::,2001:df0:9d:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:9e::,2001:df0:9e:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:9f::,2001:df0:9f:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:a0::,2001:df0:a1:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:a2::,2001:df0:a2:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:a3::,2001:df0:a3:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:a4::,2001:df0:a4:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:a5::,2001:df0:a6:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:a7::,2001:df0:ab:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:ad::,2001:df0:ad:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:ae::,2001:df0:ae:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:b0::,2001:df0:b0:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:b1::,2001:df0:b8:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:b9::,2001:df0:b9:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:ba::,2001:df0:bd:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:be::,2001:df0:be:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:bf::,2001:df0:bf:ffff:ffff:ffff:ffff:ffff,LA
+2001:df0:c0::,2001:df0:c0:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:c1::,2001:df0:c2:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:c4::,2001:df0:c4:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:c5::,2001:df0:c5:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:c6::,2001:df0:c6:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:c7::,2001:df0:c8:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:c9::,2001:df0:cc:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:cd::,2001:df0:cd:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:ce::,2001:df0:ce:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:cf::,2001:df0:cf:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:d1::,2001:df0:d1:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:d2::,2001:df0:d2:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:d4::,2001:df0:d6:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:d7::,2001:df0:d7:ffff:ffff:ffff:ffff:ffff,KR
+2001:df0:d8::,2001:df0:d8:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:d9::,2001:df0:d9:ffff:ffff:ffff:ffff:ffff,TW
+2001:df0:da::,2001:df0:da:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:dc::,2001:df0:dc:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:dd::,2001:df0:dd:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:de::,2001:df0:df:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:e1::,2001:df0:e1:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:e2::,2001:df0:e2:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:e3::,2001:df0:e3:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:e4::,2001:df0:e5:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:e6::,2001:df0:e6:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:e7::,2001:df0:e8:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:e9::,2001:df0:e9:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:ea::,2001:df0:ea:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:eb::,2001:df0:eb:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:ed::,2001:df0:ed:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:ee::,2001:df0:ee:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:ef::,2001:df0:f0:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:f1::,2001:df0:f1:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:f2::,2001:df0:f2:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:f3::,2001:df0:f3:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:f4::,2001:df0:f4:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:f5::,2001:df0:f5:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:f6::,2001:df0:f6:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:f7::,2001:df0:f7:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:f8::,2001:df0:fa:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:fb::,2001:df0:fb:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:fc::,2001:df0:fc:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:fd::,2001:df0:fe:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:100::,2001:df0:1ff:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:201::,2001:df0:201:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:202::,2001:df0:202:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:203::,2001:df0:203:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:204::,2001:df0:204:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:205::,2001:df0:205:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:206::,2001:df0:206:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:207::,2001:df0:207:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:208::,2001:df0:208:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:209::,2001:df0:209:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:20a::,2001:df0:20a:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:20b::,2001:df0:20b:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:20c::,2001:df0:20c:ffff:ffff:ffff:ffff:ffff,NF
+2001:df0:20d::,2001:df0:20d:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:20e::,2001:df0:20e:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:210::,2001:df0:210:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:211::,2001:df0:211:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:212::,2001:df0:212:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:213::,2001:df0:213:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:214::,2001:df0:214:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:215::,2001:df0:215:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:216::,2001:df0:217:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:218::,2001:df0:219:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:21a::,2001:df0:21a:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:21b::,2001:df0:21b:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:21c::,2001:df0:21c:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:21d::,2001:df0:21d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:21e::,2001:df0:21e:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:21f::,2001:df0:220:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:221::,2001:df0:221:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:222::,2001:df0:222:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:224::,2001:df0:224:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:225::,2001:df0:225:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:226::,2001:df0:228:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:229::,2001:df0:229:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:22b::,2001:df0:22b:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:22c::,2001:df0:22d:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:22e::,2001:df0:22f:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:230::,2001:df0:230:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:231::,2001:df0:231:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:232::,2001:df0:232:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:233::,2001:df0:234:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:235::,2001:df0:235:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:237::,2001:df0:237:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:238::,2001:df0:238:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:239::,2001:df0:239:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:23a::,2001:df0:23a:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:23b::,2001:df0:23b:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:23c::,2001:df0:23d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:23e::,2001:df0:23e:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:23f::,2001:df0:23f:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:240::,2001:df0:241:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:242::,2001:df0:242:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:243::,2001:df0:243:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:245::,2001:df0:246:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:247::,2001:df0:247:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:248::,2001:df0:248:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:249::,2001:df0:24a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:24b::,2001:df0:24b:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:24c::,2001:df0:24c:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:24e::,2001:df0:24e:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:24f::,2001:df0:24f:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:250::,2001:df0:250:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:251::,2001:df0:252:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:253::,2001:df0:253:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:254::,2001:df0:254:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:255::,2001:df0:255:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:256::,2001:df0:256:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:257::,2001:df0:257:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:258::,2001:df0:258:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:259::,2001:df0:259:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:25a::,2001:df0:25a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:25b::,2001:df0:25b:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:25c::,2001:df0:25d:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:25e::,2001:df0:25e:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:260::,2001:df0:260:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:261::,2001:df0:261:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:262::,2001:df0:262:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:263::,2001:df0:263:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:264::,2001:df0:264:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:265::,2001:df0:265:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:266::,2001:df0:266:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:267::,2001:df0:267:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:268::,2001:df0:269:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:26a::,2001:df0:26b:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:26c::,2001:df0:26c:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:26d::,2001:df0:26f:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:270::,2001:df0:270:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:271::,2001:df0:271:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:272::,2001:df0:272:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:273::,2001:df0:273:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:274::,2001:df0:277:ffff:ffff:ffff:ffff:ffff,NP
+2001:df0:278::,2001:df0:278:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:279::,2001:df0:279:ffff:ffff:ffff:ffff:ffff,PK
+2001:df0:27a::,2001:df0:27a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:27b::,2001:df0:27b:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:27c::,2001:df0:27c:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:27d::,2001:df0:27d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:27e::,2001:df0:27e:ffff:ffff:ffff:ffff:ffff,CN
+2001:df0:27f::,2001:df0:27f:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:280::,2001:df0:28f:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:290::,2001:df0:290:ffff:ffff:ffff:ffff:ffff,KR
+2001:df0:291::,2001:df0:291:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:292::,2001:df0:292:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:293::,2001:df0:293:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:294::,2001:df0:294:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:295::,2001:df0:296:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:298::,2001:df0:298:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:299::,2001:df0:299:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:29a::,2001:df0:29a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:29b::,2001:df0:29b:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:29c::,2001:df0:29c:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:29d::,2001:df0:29d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:29e::,2001:df0:29e:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:29f::,2001:df0:29f:ffff:ffff:ffff:ffff:ffff,BD
+2001:df0:2a0::,2001:df0:2a0:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:2a1::,2001:df0:2a1:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2a2::,2001:df0:2a2:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:2a3::,2001:df0:2a3:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2a4::,2001:df0:2a4:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2a5::,2001:df0:2a5:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:2a6::,2001:df0:2a6:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2a7::,2001:df0:2a7:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2a8::,2001:df0:2a8:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:2a9::,2001:df0:2aa:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2ab::,2001:df0:2ab:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2ac::,2001:df0:2ac:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:2ad::,2001:df0:2ad:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2ae::,2001:df0:2ae:ffff:ffff:ffff:ffff:ffff,WS
+2001:df0:2af::,2001:df0:2af:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:2b0::,2001:df0:2b1:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2b2::,2001:df0:2b2:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2b4::,2001:df0:2b4:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2b5::,2001:df0:2b5:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2b7::,2001:df0:2b7:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2b8::,2001:df0:2b8:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:2b9::,2001:df0:2b9:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:2ba::,2001:df0:2ba:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:2bb::,2001:df0:2bb:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:2bc::,2001:df0:2bc:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2bd::,2001:df0:2bd:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2be::,2001:df0:2be:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2bf::,2001:df0:2bf:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:2c1::,2001:df0:2c1:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:2c2::,2001:df0:2c2:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2c3::,2001:df0:2c3:ffff:ffff:ffff:ffff:ffff,BD
+2001:df0:2c4::,2001:df0:2c4:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2c5::,2001:df0:2c5:ffff:ffff:ffff:ffff:ffff,BD
+2001:df0:2c6::,2001:df0:2c8:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2c9::,2001:df0:2c9:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2ca::,2001:df0:2ca:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2cb::,2001:df0:2cb:ffff:ffff:ffff:ffff:ffff,PK
+2001:df0:2cc::,2001:df0:2cc:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2ce::,2001:df0:2e0:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2e1::,2001:df0:2e1:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2e2::,2001:df0:2e2:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2e3::,2001:df0:2e3:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2e4::,2001:df0:2e4:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2e5::,2001:df0:2e5:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2e6::,2001:df0:2e7:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2e8::,2001:df0:2e8:ffff:ffff:ffff:ffff:ffff,VN
+2001:df0:2e9::,2001:df0:2e9:ffff:ffff:ffff:ffff:ffff,CN
+2001:df0:2ea::,2001:df0:2ea:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:2ec::,2001:df0:2ec:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2ed::,2001:df0:2ee:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2ef::,2001:df0:2ef:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:2f0::,2001:df0:2f3:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2f4::,2001:df0:2f4:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2f5::,2001:df0:2f5:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:2f6::,2001:df0:2f6:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2f9::,2001:df0:2f9:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2fa::,2001:df0:2fa:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2fb::,2001:df0:2fb:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:2fc::,2001:df0:2fc:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:2fd::,2001:df0:2fd:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:2fe::,2001:df0:2ff:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:300::,2001:df0:311:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:314::,2001:df0:317:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:400::,2001:df0:400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:401::,2001:df0:401:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:402::,2001:df0:403:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:404::,2001:df0:404:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:405::,2001:df0:405:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:407::,2001:df0:407:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:408::,2001:df0:408:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:409::,2001:df0:409:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:40a::,2001:df0:40a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:40c::,2001:df0:40c:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:40d::,2001:df0:40d:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:40e::,2001:df0:40f:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:410::,2001:df0:410:ffff:ffff:ffff:ffff:ffff,VU
+2001:df0:411::,2001:df0:411:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:412::,2001:df0:412:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:413::,2001:df0:413:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:415::,2001:df0:415:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:417::,2001:df0:417:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:418::,2001:df0:419:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:41a::,2001:df0:41a:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:41b::,2001:df0:41b:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:41c::,2001:df0:41c:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:41d::,2001:df0:41e:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:41f::,2001:df0:41f:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:420::,2001:df0:420:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:421::,2001:df0:421:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:422::,2001:df0:422:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:423::,2001:df0:423:ffff:ffff:ffff:ffff:ffff,CN
+2001:df0:424::,2001:df0:424:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:425::,2001:df0:425:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:426::,2001:df0:426:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:427::,2001:df0:427:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:430::,2001:df0:43f:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:440::,2001:df0:440:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:441::,2001:df0:441:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:442::,2001:df0:443:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:444::,2001:df0:445:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:446::,2001:df0:446:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:447::,2001:df0:447:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:448::,2001:df0:448:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:449::,2001:df0:449:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:44a::,2001:df0:44a:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:44b::,2001:df0:44b:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:44c::,2001:df0:44d:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:44e::,2001:df0:44e:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:44f::,2001:df0:44f:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:450::,2001:df0:450:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:451::,2001:df0:451:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:452::,2001:df0:452:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:453::,2001:df0:453:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:454::,2001:df0:454:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:455::,2001:df0:455:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:456::,2001:df0:456:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:457::,2001:df0:457:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:458::,2001:df0:458:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:459::,2001:df0:459:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:45a::,2001:df0:45a:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:45b::,2001:df0:45b:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:45c::,2001:df0:45d:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:45e::,2001:df0:45e:ffff:ffff:ffff:ffff:ffff,BD
+2001:df0:45f::,2001:df0:45f:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:460::,2001:df0:460:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:461::,2001:df0:461:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:462::,2001:df0:462:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:463::,2001:df0:463:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:464::,2001:df0:464:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:465::,2001:df0:465:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:466::,2001:df0:466:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:467::,2001:df0:467:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:468::,2001:df0:469:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:46a::,2001:df0:46a:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:46b::,2001:df0:46b:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:46c::,2001:df0:46c:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:500::,2001:df0:5ff:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:800::,2001:df0:800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:c00::,2001:df0:c00:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:1000::,2001:df0:1000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df0:1400::,2001:df0:1400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:1800::,2001:df0:1800:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:1c00::,2001:df0:1c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2000::,2001:df0:2000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2400::,2001:df0:2400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:2800::,2001:df0:2800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:2c00::,2001:df0:2c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:3000::,2001:df0:3000:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:3400::,2001:df0:3400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:3c00::,2001:df0:3c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:4000::,2001:df0:4000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:4400::,2001:df0:4400:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:4800::,2001:df0:4800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:4c00::,2001:df0:4c00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:5000::,2001:df0:5000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:5400::,2001:df0:5400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:5800::,2001:df0:5800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:5c00::,2001:df0:5c00:ffff:ffff:ffff:ffff:ffff,BD
+2001:df0:6000::,2001:df0:6000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:6400::,2001:df0:6400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df0:6800::,2001:df0:6800:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:6c00::,2001:df0:6c00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:7000::,2001:df0:7000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:7400::,2001:df0:7400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:7800::,2001:df0:7800:ffff:ffff:ffff:ffff:ffff,WS
+2001:df0:7c00::,2001:df0:7c00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:8000::,2001:df0:8000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:8400::,2001:df0:8400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:8800::,2001:df0:8800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:8c00::,2001:df0:8c00:ffff:ffff:ffff:ffff:ffff,MY
+2001:df0:9400::,2001:df0:9400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:9800::,2001:df0:9800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:9c00::,2001:df0:9c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:a000::,2001:df0:a000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:a400::,2001:df0:a400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:a800::,2001:df0:a800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:ac00::,2001:df0:ac00:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:b000::,2001:df0:b000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df0:b400::,2001:df0:b400:ffff:ffff:ffff:ffff:ffff,JP
+2001:df0:b800::,2001:df0:b800:ffff:ffff:ffff:ffff:ffff,PH
+2001:df0:bc00::,2001:df0:bc00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:c000::,2001:df0:c000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:c400::,2001:df0:c400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:c800::,2001:df0:c800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:cc00::,2001:df0:cc00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:d000::,2001:df0:d000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:d400::,2001:df0:d400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:d800::,2001:df0:d800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:dc00::,2001:df0:dc00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:e000::,2001:df0:e000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:e400::,2001:df0:e400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:e800::,2001:df0:e800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df0:ec00::,2001:df0:ec00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:f000::,2001:df0:f000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df0:f400::,2001:df0:f401:ffff:ffff:ffff:ffff:ffff,IN
+2001:df0:f800::,2001:df0:f800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df0:fc00::,2001:df0:fc01:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1::,2001:df1::ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:400::,2001:df1:400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:800::,2001:df1:801:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:c00::,2001:df1:c00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:1000::,2001:df1:1000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:1400::,2001:df1:1400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:1800::,2001:df1:1800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:1c00::,2001:df1:1c00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:2000::,2001:df1:2000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:2400::,2001:df1:2400:ffff:ffff:ffff:ffff:ffff,PH
+2001:df1:2800::,2001:df1:2800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:2c00::,2001:df1:2c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:3000::,2001:df1:3000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:3400::,2001:df1:3400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:3800::,2001:df1:3800:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df1:3c00::,2001:df1:3c00:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:4000::,2001:df1:4000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:4400::,2001:df1:4400:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:4800::,2001:df1:4800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:4c00::,2001:df1:4c00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:5000::,2001:df1:5000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:5400::,2001:df1:5400:ffff:ffff:ffff:ffff:ffff,KR
+2001:df1:5800::,2001:df1:5800:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:5c00::,2001:df1:5c00:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:6000::,2001:df1:6000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:6400::,2001:df1:6400:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:6800::,2001:df1:6800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:6c00::,2001:df1:6c00:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:7000::,2001:df1:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:7400::,2001:df1:7400:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:7800::,2001:df1:7800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:7c00::,2001:df1:7c00:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df1:8000::,2001:df1:8000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:8400::,2001:df1:8400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:8800::,2001:df1:8800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:8c00::,2001:df1:8c00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:9000::,2001:df1:9000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:9400::,2001:df1:9400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:9800::,2001:df1:9800:ffff:ffff:ffff:ffff:ffff,MY
+2001:df1:9c00::,2001:df1:9c00:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:a000::,2001:df1:a000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df1:a400::,2001:df1:a400:ffff:ffff:ffff:ffff:ffff,BD
+2001:df1:a800::,2001:df1:a800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:ac00::,2001:df1:ac00:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:b000::,2001:df1:b000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df1:b400::,2001:df1:b400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:b800::,2001:df1:b800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:bc00::,2001:df1:bc00:ffff:ffff:ffff:ffff:ffff,SG
+2001:df1:c400::,2001:df1:c400:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:c800::,2001:df1:c800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:cc00::,2001:df1:cc00:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:d000::,2001:df1:d000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:d400::,2001:df1:d400:ffff:ffff:ffff:ffff:ffff,HK
+2001:df1:d800::,2001:df1:d800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:e000::,2001:df1:e000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:e800::,2001:df1:e800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df1:f000::,2001:df1:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df1:f800::,2001:df1:f800:ffff:ffff:ffff:ffff:ffff,BN
+2001:df2::,2001:df2::ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:800::,2001:df2:800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:1000::,2001:df2:1001:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:1800::,2001:df2:1803:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:2000::,2001:df2:2000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:2800::,2001:df2:2800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:3000::,2001:df2:3000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df2:3800::,2001:df2:3800:ffff:ffff:ffff:ffff:ffff,TH
+2001:df2:4000::,2001:df2:4000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df2:4800::,2001:df2:4800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:5000::,2001:df2:5000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:5800::,2001:df2:5800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df2:6000::,2001:df2:6000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:6800::,2001:df2:6800:ffff:ffff:ffff:ffff:ffff,PH
+2001:df2:7000::,2001:df2:7000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:7800::,2001:df2:7800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:8000::,2001:df2:8000:ffff:ffff:ffff:ffff:ffff,BN
+2001:df2:8800::,2001:df2:8800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:9800::,2001:df2:9803:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:a000::,2001:df2:a000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:a800::,2001:df2:a800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:b000::,2001:df2:b000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:c000::,2001:df2:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df2:c800::,2001:df2:c800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:d000::,2001:df2:d000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df2:d800::,2001:df2:d800:ffff:ffff:ffff:ffff:ffff,JP
+2001:df2:e000::,2001:df2:e000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df2:e800::,2001:df2:e800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df2:f000::,2001:df2:f000:ffff:ffff:ffff:ffff:ffff,VN
+2001:df2:f800::,2001:df2:f800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3::,2001:df3::ffff:ffff:ffff:ffff:ffff,MY
+2001:df3:800::,2001:df3:80f:ffff:ffff:ffff:ffff:ffff,CN
+2001:df3:1000::,2001:df3:1000:ffff:ffff:ffff:ffff:ffff,BD
+2001:df3:1800::,2001:df3:1800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:2000::,2001:df3:2000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:2800::,2001:df3:2800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:3000::,2001:df3:3000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:3800::,2001:df3:3800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:4000::,2001:df3:4000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df3:4800::,2001:df3:4800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:5000::,2001:df3:5000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:5800::,2001:df3:5800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df3:6000::,2001:df3:6000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df3:6800::,2001:df3:6800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df3:7000::,2001:df3:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:7800::,2001:df3:7800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df3:8000::,2001:df3:8000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:8800::,2001:df3:8800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:9800::,2001:df3:9800:ffff:ffff:ffff:ffff:ffff,MY
+2001:df3:a000::,2001:df3:a003:ffff:ffff:ffff:ffff:ffff,PH
+2001:df3:a800::,2001:df3:a800:ffff:ffff:ffff:ffff:ffff,MY
+2001:df3:b000::,2001:df3:b000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df3:b800::,2001:df3:b800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:c000::,2001:df3:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:c800::,2001:df3:c800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:d000::,2001:df3:d000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df3:d800::,2001:df3:d800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df3:e000::,2001:df3:e000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df3:e800::,2001:df3:e800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df3:f000::,2001:df3:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df3:f800::,2001:df3:f800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4::,2001:df4::ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:800::,2001:df4:800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df4:1000::,2001:df4:1000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:1800::,2001:df4:1800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:2000::,2001:df4:2000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df4:2800::,2001:df4:2800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:3000::,2001:df4:3000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df4:3800::,2001:df4:3800:ffff:ffff:ffff:ffff:ffff,BD
+2001:df4:4000::,2001:df4:400f:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:4800::,2001:df4:4800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df4:5000::,2001:df4:5000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:5800::,2001:df4:5800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df4:6000::,2001:df4:6000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:6800::,2001:df4:6800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:7000::,2001:df4:7000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:7800::,2001:df4:7800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:8000::,2001:df4:8000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df4:8800::,2001:df4:8800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df4:9000::,2001:df4:9000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:9800::,2001:df4:9800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:a000::,2001:df4:a000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df4:a800::,2001:df4:a800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:b000::,2001:df4:b000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:b800::,2001:df4:b800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df4:c000::,2001:df4:c000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df4:c800::,2001:df4:c800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df4:d000::,2001:df4:d000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:d800::,2001:df4:d800:ffff:ffff:ffff:ffff:ffff,VN
+2001:df4:e000::,2001:df4:e000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df4:e800::,2001:df4:e800:ffff:ffff:ffff:ffff:ffff,MN
+2001:df4:f800::,2001:df4:f800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5::,2001:df5::ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:800::,2001:df5:800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df5:1000::,2001:df5:1000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:1800::,2001:df5:1800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:2000::,2001:df5:2000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:2800::,2001:df5:2800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df5:3000::,2001:df5:3000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:3800::,2001:df5:3800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df5:4000::,2001:df5:4000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:4800::,2001:df5:4800:ffff:ffff:ffff:ffff:ffff,BN
+2001:df5:5800::,2001:df5:5800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:6000::,2001:df5:6000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:6800::,2001:df5:6800:ffff:ffff:ffff:ffff:ffff,KR
+2001:df5:7000::,2001:df5:7000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:7800::,2001:df5:7800:ffff:ffff:ffff:ffff:ffff,CN
+2001:df5:8000::,2001:df5:8000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df5:8800::,2001:df5:8800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df5:9000::,2001:df5:9000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df5:9800::,2001:df5:9800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df5:a000::,2001:df5:a000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:a800::,2001:df5:a800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:b000::,2001:df5:b000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df5:b800::,2001:df5:b800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df5:c800::,2001:df5:c800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df5:d000::,2001:df5:d000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:d800::,2001:df5:d800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df5:e000::,2001:df5:e000:ffff:ffff:ffff:ffff:ffff,MY
+2001:df5:e800::,2001:df5:e800:ffff:ffff:ffff:ffff:ffff,PH
+2001:df5:f000::,2001:df5:f000:ffff:ffff:ffff:ffff:ffff,ID
+2001:df5:f800::,2001:df5:f800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df6::,2001:df6:1:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:800::,2001:df6:80f:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:1000::,2001:df6:1000:ffff:ffff:ffff:ffff:ffff,PH
+2001:df6:1800::,2001:df6:1800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df6:2000::,2001:df6:2001:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:2800::,2001:df6:2800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:3000::,2001:df6:3000:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df6:3800::,2001:df6:3800:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df6:4000::,2001:df6:4001:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:4800::,2001:df6:4801:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df6:5000::,2001:df6:5000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:5800::,2001:df6:5800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:6000::,2001:df6:6000:ffff:ffff:ffff:ffff:ffff,JP
+2001:df6:6800::,2001:df6:6800:ffff:ffff:ffff:ffff:ffff,CN
+2001:df6:7000::,2001:df6:7000:ffff:ffff:ffff:ffff:ffff,VN
+2001:df6:7800::,2001:df6:7800:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:8000::,2001:df6:8000:ffff:ffff:ffff:ffff:ffff,JP
+2001:df6:8800::,2001:df6:8800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:9000::,2001:df6:9000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:9800::,2001:df6:9800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df6:a000::,2001:df6:a000:ffff:ffff:ffff:ffff:ffff,JP
+2001:df6:a800::,2001:df6:a800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:b000::,2001:df6:b000:ffff:ffff:ffff:ffff:ffff,TH
+2001:df6:b800::,2001:df6:b800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df6:c800::,2001:df6:c800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:d000::,2001:df6:d000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:d800::,2001:df6:d800:ffff:ffff:ffff:ffff:ffff,BD
+2001:df6:e800::,2001:df6:e800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df6:f000::,2001:df6:f000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df6:f800::,2001:df6:f800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7::,2001:df7::ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:800::,2001:df7:800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:1000::,2001:df7:1000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:1800::,2001:df7:1800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:2000::,2001:df7:2000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:2800::,2001:df7:2800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:3000::,2001:df7:3001:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df7:3800::,2001:df7:3800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:4000::,2001:df7:4000:ffff:ffff:ffff:ffff:ffff,SG
+2001:df7:4800::,2001:df7:481f:ffff:ffff:ffff:ffff:ffff,JP
+2001:df7:5000::,2001:df7:5000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:5800::,2001:df7:5800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:6000::,2001:df7:6000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:6800::,2001:df7:6800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:7000::,2001:df7:7000:ffff:ffff:ffff:ffff:ffff,HK
+2001:df7:7800::,2001:df7:7800:ffff:ffff:ffff:ffff:ffff,JP
+2001:df7:8800::,2001:df7:8800:ffff:ffff:ffff:ffff:ffff,ID
+2001:df7:9800::,2001:df7:9800:ffff:ffff:ffff:ffff:ffff,NZ
+2001:df7:a000::,2001:df7:a000:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:a800::,2001:df7:a800:ffff:ffff:ffff:ffff:ffff,JP
+2001:df7:b000::,2001:df7:b000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:b800::,2001:df7:b800:ffff:ffff:ffff:ffff:ffff,SG
+2001:df7:c000::,2001:df7:c003:ffff:ffff:ffff:ffff:ffff,SG
+2001:df7:c800::,2001:df7:c800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:d000::,2001:df7:d000:ffff:ffff:ffff:ffff:ffff,BD
+2001:df7:d800::,2001:df7:d800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:e000::,2001:df7:e000:ffff:ffff:ffff:ffff:ffff,IN
+2001:df7:e800::,2001:df7:e800:ffff:ffff:ffff:ffff:ffff,AU
+2001:df7:f000::,2001:df7:f000:ffff:ffff:ffff:ffff:ffff,JP
+2001:df7:f800::,2001:df7:f800:ffff:ffff:ffff:ffff:ffff,IN
+2001:df8::,2001:df9:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:dfa::,2001:dfa:ffff:ffff:ffff:ffff:ffff:ffff,JP
2001:e00::,2001:e01:ffff:ffff:ffff:ffff:ffff:ffff,ID
2001:e08::,2001:e08:ffff:ffff:ffff:ffff:ffff:ffff,CN
2001:e10::,2001:e10:ffff:ffff:ffff:ffff:ffff:ffff,TW
@@ -303,7 +3438,7 @@
2001:13e8::,2001:13e8:ffff:ffff:ffff:ffff:ffff:ffff,AR
2001:13f0::,2001:13f0:ffff:ffff:ffff:ffff:ffff:ffff,DO
2001:13f8::,2001:13f8:ffff:ffff:ffff:ffff:ffff:ffff,CO
-2001:1400::,2001:1400:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:1400::,2001:1407:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:1408::,2001:1408:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:1410::,2001:1410:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1418::,2001:1418:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -316,7 +3451,9 @@
2001:1450::,2001:1450:ffff:ffff:ffff:ffff:ffff:ffff,IT
2001:1458::,2001:1459:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:1460::,2001:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:1468::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:1468::,2001:1469:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:146a::,2001:146a::ffff:ffff:ffff:ffff:ffff,RU
+2001:146a:1::,2001:146f:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2001:1470::,2001:1477:ffff:ffff:ffff:ffff:ffff:ffff,SI
2001:1478::,2001:1478:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:1488::,2001:1488:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -344,7 +3481,7 @@
2001:1540::,2001:1540:ffff:ffff:ffff:ffff:ffff:ffff,NL
2001:1548::,2001:1548:ffff:ffff:ffff:ffff:ffff:ffff,GR
2001:1558::,2001:1558:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:1560::,2001:1560:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:1560::,2001:1567:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1568::,2001:1568:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2001:1570::,2001:1570:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:1578::,2001:1578:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -368,7 +3505,6 @@
2001:1610::,2001:1610:ffff:ffff:ffff:ffff:ffff:ffff,LU
2001:1618::,2001:1618:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:1620::,2001:1623:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:1628::,2001:1628:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:1630::,2001:1637:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:1638::,2001:1638:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:1640::,2001:1640:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -386,13 +3522,17 @@
2001:16a8::,2001:16a8:ffff:ffff:ffff:ffff:ffff:ffff,IT
2001:16b0::,2001:16b0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2001:16b8::,2001:16b8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:16c0::,2001:16c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2001:16c0::,2001:16c0:1233:ffff:ffff:ffff:ffff:ffff,IR
+2001:16c0:1234::,2001:16c0:1234:ffff:ffff:ffff:ffff:ffff,AU
+2001:16c0:1235::,2001:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2001:16c8::,2001:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:16d0::,2001:16d0:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2001:16d8::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:16d8::,2001:16d8:edff:ffff:ffff:ffff:ffff:ffff,SE
+2001:16d8:ee00::,2001:16d8:ee00:ffff:ffff:ffff:ffff:ffff,NO
+2001:16d8:ee01::,2001:16d8:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:16e0::,2001:16e7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:16e8::,2001:16e8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2001:16f0::,2001:16f0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:16f0::,2001:16f7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:16f8::,2001:16f8:ffff:ffff:ffff:ffff:ffff:ffff,NL
2001:1700::,2001:171f:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:1800::,2001:1800:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -451,7 +3591,11 @@
2001:19d8::,2001:19d8:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:19e0::,2001:19e0:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:19e8::,2001:19e8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2001:19f0::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:19f0::,2001:19f0:67ff:ffff:ffff:ffff:ffff:ffff,US
+2001:19f0:6800::,2001:19f0:6800:ffff:ffff:ffff:ffff:ffff,FR
+2001:19f0:6801::,2001:19f0:73ff:ffff:ffff:ffff:ffff:ffff,US
+2001:19f0:7400::,2001:19f0:7400:ffff:ffff:ffff:ffff:ffff,GB
+2001:19f0:7401::,2001:19f0:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:19f8::,2001:19f8:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:1a08::,2001:1a08:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:1a10::,2001:1a10:ffff:ffff:ffff:ffff:ffff:ffff,QA
@@ -497,7 +3641,7 @@
2001:1b50::,2001:1b57:ffff:ffff:ffff:ffff:ffff:ffff,CH
2001:1b58::,2001:1b58:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:1b60::,2001:1b67:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:1b68::,2001:1b68:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2001:1b68::,2001:1b6f:ffff:ffff:ffff:ffff:ffff:ffff,TR
2001:1b70::,2001:1b77:ffff:ffff:ffff:ffff:ffff:ffff,SE
2001:1b78::,2001:1b78:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:1b80::,2001:1b80:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -517,6 +3661,22 @@
2001:1bf0::,2001:1bf7:ffff:ffff:ffff:ffff:ffff:ffff,EE
2001:1bf8::,2001:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,LV
2001:1c00::,2001:1dff:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:2002:4e44::,2001:2002:4e44:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:4e46::,2001:2002:4e46:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:4e48::,2001:2002:4e48:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:51e0::,2001:2002:51e0:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:51e4::,2001:2002:51e4:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:51e8::,2001:2002:51e9:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:51ed::,2001:2002:51ed:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:d4b5::,2001:2002:d4b5:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:d541::,2001:2002:d542:ffff:ffff:ffff:ffff:ffff,SE
+2001:2002:d9d0::,2001:2002:d9d0:7fff:ffff:ffff:ffff:ffff,SE
+2001:2002:d9d1::,2001:2002:d9d1:ffff:ffff:ffff:ffff:ffff,SE
+2001:2003:50dc::,2001:2003:50dc:ffff:ffff:ffff:ffff:ffff,FI
+2001:2003:54f8::,2001:2003:54f8:ffff:ffff:ffff:ffff:ffff,FI
+2001:2003:54fa::,2001:2003:54fa:ffff:ffff:ffff:ffff:ffff,FI
+2001:2010:d00a::,2001:2010:d00a:ffff:ffff:ffff:ffff:ffff,DK
+2001:2010:d013::,2001:2010:d013:ffff:ffff:ffff:ffff:ffff,DK
2001:4000::,2001:4000:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:4010::,2001:4010:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:4018::,2001:4018:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -575,7 +3735,6 @@
2001:41f0::,2001:41f0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2001:41f8::,2001:41f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2001:4200::,2001:4200:ffff:ffff:ffff:ffff:ffff:ffff,ZA
-2001:4208::,2001:4208:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:4210::,2001:4210:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:4218::,2001:4218:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:4220::,2001:4220:ffff:ffff:ffff:ffff:ffff:ffff,EG
@@ -626,7 +3785,7 @@
2001:43c8::,2001:43c8:ffff:ffff:ffff:ffff:ffff:ffff,EG
2001:43d0::,2001:43d0:ffff:ffff:ffff:ffff:ffff:ffff,KE
2001:43d8::,2001:43d8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
-2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,GH
+2001:43e0::,2001:43e0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:43e8::,2001:43e8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f0::,2001:43f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW
2001:43f8::,2001:43f8:1:ffff:ffff:ffff:ffff:ffff,TZ
@@ -641,6 +3800,7 @@
2001:43f8:a0::,2001:43f8:a0:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:b0::,2001:43f8:b0:ffff:ffff:ffff:ffff:ffff,SL
2001:43f8:c0::,2001:43f8:c0:ffff:ffff:ffff:ffff:ffff,KE
+2001:43f8:d0::,2001:43f8:d0:ffff:ffff:ffff:ffff:ffff,MU
2001:43f8:e0::,2001:43f8:e0:ffff:ffff:ffff:ffff:ffff,TZ
2001:43f8:100::,2001:43f8:100:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:110::,2001:43f8:110:ffff:ffff:ffff:ffff:ffff,MU
@@ -656,14 +3816,14 @@
2001:43f8:1c0::,2001:43f8:1c0:ffff:ffff:ffff:ffff:ffff,DZ
2001:43f8:1d0::,2001:43f8:1d0:ffff:ffff:ffff:ffff:ffff,GH
2001:43f8:1e0::,2001:43f8:1e0:ffff:ffff:ffff:ffff:ffff,NG
-2001:43f8:1f0::,2001:43f8:1f5:ffff:ffff:ffff:ffff:ffff,ZA
+2001:43f8:1f0::,2001:43f8:1f6:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:200::,2001:43f8:200:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:210::,2001:43f8:210:ffff:ffff:ffff:ffff:ffff,LS
2001:43f8:230::,2001:43f8:230:ffff:ffff:ffff:ffff:ffff,ZA
2001:43f8:240::,2001:43f8:241:ffff:ffff:ffff:ffff:ffff,GH
2001:43f8:250::,2001:43f8:250:ffff:ffff:ffff:ffff:ffff,KE
2001:43f8:260::,2001:43f8:260:ffff:ffff:ffff:ffff:ffff,KE
-2001:43f8:270::,2001:43f8:270:ffff:ffff:ffff:ffff:ffff,MU
+2001:43f8:270::,2001:43f8:271:ffff:ffff:ffff:ffff:ffff,MU
2001:43f8:290::,2001:43f8:290:ffff:ffff:ffff:ffff:ffff,MG
2001:43f8:2a0::,2001:43f8:2a0:ffff:ffff:ffff:ffff:ffff,BW
2001:43f8:2b0::,2001:43f8:2b0:ffff:ffff:ffff:ffff:ffff,BW
@@ -724,7 +3884,34 @@
2001:43f8:9a0::,2001:43f8:9a0:ffff:ffff:ffff:ffff:ffff,BJ
2001:43f8:9b0::,2001:43f8:9b1:ffff:ffff:ffff:ffff:ffff,SZ
2001:43f8:9c0::,2001:43f8:9c0:ffff:ffff:ffff:ffff:ffff,DJ
-2001:4400::,2001:44ff:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:43f8:9d0::,2001:43f8:9d0:ffff:ffff:ffff:ffff:ffff,AO
+2001:43f8:9e0::,2001:43f8:9e0:ffff:ffff:ffff:ffff:ffff,ZW
+2001:43f8:9f0::,2001:43f8:9f0:ffff:ffff:ffff:ffff:ffff,NG
+2001:43f8:a00::,2001:43f8:a00:ffff:ffff:ffff:ffff:ffff,NG
+2001:4400::,2001:4403:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2001:4408::,2001:4408:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2001:4410::,2001:4410:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2001:4420::,2001:4420:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2001:4428::,2001:4428:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2001:4430::,2001:4430:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:4438::,2001:4438:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2001:4450::,2001:4450:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2001:4458::,2001:4458:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2001:4460::,2001:4460:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:4470::,2001:4470:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2001:4478::,2001:447b:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:4480::,2001:4480:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2001:4488::,2001:448b:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2001:4490::,2001:4493:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2001:4498::,2001:4498:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2001:44a0::,2001:44a0:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:44a8::,2001:44a8:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:44b0::,2001:44b0:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2001:44b8::,2001:44b8:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2001:44c0::,2001:44c0:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2001:44c8::,2001:44c8:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2001:44d0::,2001:44df:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2001:44f0::,2001:44f0:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:4500::,2001:4500:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:4508::,2001:4508:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:4510::,2001:4517:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -735,7 +3922,40 @@
2001:4540::,2001:455f:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:4580::,2001:45bf:ffff:ffff:ffff:ffff:ffff:ffff,TW
2001:4600::,2001:46ff:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2001:4800::,2001:48ff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4800::,2001:4808:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4810::,2001:4810:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4818::,2001:4818:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2001:4828::,2001:4828:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4830::,2001:4830:10ff:ffff:ffff:ffff:ffff:ffff,US
+2001:4830:1100::,2001:4830:1100:ffff:ffff:ffff:ffff:ffff,CA
+2001:4830:1101::,2001:4830:1200:7fff:ffff:ffff:ffff:ffff,US
+2001:4830:1200:8000::,2001:4830:1200:81ff:ffff:ffff:ffff:ffff,AU
+2001:4830:1200:8200::,2001:4830:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4838::,2001:4838:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4840::,2001:4840:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4848::,2001:4848:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4850::,2001:4850:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4858::,2001:4858:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4860::,2001:4860:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4868::,2001:4868:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4870::,2001:4871:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4878::,2001:4878:8304:ffff:ffff:ffff:ffff:ffff,US
+2001:4878:8305::,2001:4878:8305:ffff:ffff:ffff:ffff:ffff,IN
+2001:4878:8306::,2001:4878:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4888::,2001:4888:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4890::,2001:4890:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:4898::,2001:489a:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48a0::,2001:48a0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48a8::,2001:48a8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48b0::,2001:48b0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48b8::,2001:48b8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48c0::,2001:48c0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48c8::,2001:48c8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48d0::,2001:48d0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48d8::,2001:48d8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48e0::,2001:48e0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48e8::,2001:48e8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2001:48f8::,2001:48f8:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:4900::,2001:4900:ffff:ffff:ffff:ffff:ffff:ffff,CA
2001:4908::,2001:4908:ffff:ffff:ffff:ffff:ffff:ffff,US
2001:4910::,2001:4910:ffff:ffff:ffff:ffff:ffff:ffff,BM
@@ -788,7 +4008,7 @@
2001:4b90::,2001:4b90:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:4b98::,2001:4b98:ffff:ffff:ffff:ffff:ffff:ffff,FR
2001:4ba0::,2001:4ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2001:4ba8::,2001:4ba8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:4ba8::,2001:4baf:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2001:4bb0::,2001:4bb0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2001:4bb8::,2001:4bb8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2001:4bc0::,2001:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -799,14 +4019,77 @@
2001:4be8::,2001:4be8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:4bf0::,2001:4bf0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2001:4bf8::,2001:4bf8:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2001:4c00::,2001:4dff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4c00::,2001:4c07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:4c08::,2001:4c08:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4c10::,2001:4c10:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:4c20::,2001:4c20:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4c28::,2001:4c28:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:4c30::,2001:4c30:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:4c38::,2001:4c3f:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:4c40::,2001:4c40:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2001:4c48::,2001:4c4f:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2001:4c50::,2001:4c57:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4c58::,2001:4c5f:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:4c60::,2001:4c60:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:4c68::,2001:4c68:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4c70::,2001:4c70:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2001:4c78::,2001:4c78:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:4c80::,2001:4c80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4c88::,2001:4c88:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2001:4c90::,2001:4c97:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:4c98::,2001:4c98:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4ca0::,2001:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4ca8::,2001:4ca8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4cb0::,2001:4cb0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4cb8::,2001:4cb8:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:4cc0::,2001:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2001:4cc8::,2001:4cc8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:4cd0::,2001:4cd0:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2001:4cd8::,2001:4cd8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4ce0::,2001:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4ce8::,2001:4cf0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4cf8::,2001:4cf8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d00::,2001:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2001:4d08::,2001:4d08:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d10::,2001:4d10:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:4d18::,2001:4d18:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2001:4d20::,2001:4d20:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d30::,2001:4d30:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4d38::,2001:4d38:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2001:4d48::,2001:4d48:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4d50::,2001:4d50:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d58::,2001:4d58:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:4d60::,2001:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:4d68::,2001:4d68:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2001:4d70::,2001:4d70:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2001:4d78::,2001:4d78:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4d80::,2001:4d80:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2001:4d88::,2001:4d88:1010:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d88:1011::,2001:4d88:1011:ffff:ffff:ffff:ffff:ffff,ZA
+2001:4d88:1012::,2001:4d88:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4d90::,2001:4d90:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2001:4d98::,2001:4d98:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:4da0::,2001:4da7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2001:4da8::,2001:4da8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:4db0::,2001:4db0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4db8::,2001:4db8:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2001:4dc0::,2001:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2001:4dc8::,2001:4dc8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4dd0::,2001:4dd7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:4dd8::,2001:4dd8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2001:4de0::,2001:4de0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2001:4de8::,2001:4de8:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2001:4df0::,2001:4df0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2001:8000::,2001:8fff:ffff:ffff:ffff:ffff:ffff:ffff,AU
2001:a000::,2001:a7ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2001:b000::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW
-2003::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2001:b000::,2001:b010:fc7f:ffff:ffff:ffff:ffff:ffff,TW
+2001:b010:fc80::,2001:b010:fc80:ffff:ffff:ffff:ffff:ffff,CN
+2001:b010:fc81::,2001:b7ff:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2003::,2003:49:4e71:ffff:ffff:ffff:ffff:ffff,DE
+2003:49:4e72::,2003:49:4e72:ffff:ffff:ffff:ffff:ffff,CZ
+2003:49:4e73::,2003:1fff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2400::,2400:fff:ffff:ffff:ffff:ffff:ffff:ffff,KR
2400:1000::,2400:1000:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2400:1080::,2400:1080:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:1100::,2400:1100:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:1200::,2400:1200:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2400:1300::,2400:1300:ffff:ffff:ffff:ffff:ffff:ffff,TW
@@ -885,7 +4168,6 @@
2400:4c00::,2400:4c00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:4c80::,2400:4c80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2400:4d00::,2400:4d00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2400:4d80::,2400:4d80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:4e00::,2400:4e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:4e80::,2400:4e80:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:4f00::,2400:4f00:ffff:ffff:ffff:ffff:ffff:ffff,PK
@@ -909,7 +4191,6 @@
2400:5800::,2400:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:5880::,2400:5880:ffff:ffff:ffff:ffff:ffff:ffff,MY
2400:5900::,2400:5900:ffff:ffff:ffff:ffff:ffff:ffff,NZ
-2400:5980::,2400:5980:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:5a00::,2400:5a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:5a80::,2400:5a80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:5b00::,2400:5b00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
@@ -1003,7 +4284,7 @@
2400:8780::,2400:8780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:8800::,2400:8800:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:8880::,2400:8880:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2400:8900::,2400:8900:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2400:8900::,2400:8901:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:8980::,2400:8980:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:8a00::,2400:8a00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:8a80::,2400:8a80:ffff:ffff:ffff:ffff:ffff:ffff,PH
@@ -1051,7 +4332,6 @@
2400:a000::,2400:a000:ffff:ffff:ffff:ffff:ffff:ffff,IN
2400:a080::,2400:a080:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:a100::,2400:a100:ffff:ffff:ffff:ffff:ffff:ffff,NP
-2400:a180::,2400:a180:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:a280::,2400:a280:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:a300::,2400:a300:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:a380::,2400:a380:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -1131,7 +4411,15 @@
2400:c980::,2400:c980:ffff:ffff:ffff:ffff:ffff:ffff,SG
2400:ca00::,2400:ca00:ffff:ffff:ffff:ffff:ffff:ffff,BD
2400:ca80::,2400:ca80:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2400:cb00::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb00::,2400:cb00:20:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb00:21::,2400:cb00:21:ffff:ffff:ffff:ffff:ffff,IT
+2400:cb00:22::,2400:cb00:24:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb00:25::,2400:cb00:25:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:26::,2400:cb00:38:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb00:39::,2400:cb00:39:ffff:ffff:ffff:ffff:ffff,IT
+2400:cb00:3a::,2400:cb00:f00c:ffff:ffff:ffff:ffff:ffff,HK
+2400:cb00:f00d::,2400:cb00:f00d:ffff:ffff:ffff:ffff:ffff,US
+2400:cb00:f00e::,2400:cb00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:cb80::,2400:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2400:cc00::,2400:cc00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:cc80::,2400:cc80:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -1180,7 +4468,6 @@
2400:e200::,2400:e200:ffff:ffff:ffff:ffff:ffff:ffff,AU
2400:e280::,2400:e280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:e300::,2400:e300:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2400:e380::,2400:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK
2400:e400::,2400:e400:ffff:ffff:ffff:ffff:ffff:ffff,JP
2400:e480::,2400:e480:ffff:ffff:ffff:ffff:ffff:ffff,TW
2400:e500::,2400:e500:ffff:ffff:ffff:ffff:ffff:ffff,AF
@@ -1339,7 +4626,6 @@
2401:3380::,2401:3380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:3400::,2401:3400:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:3480::,2401:3480:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2401:3500::,2401:3500:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:3580::,2401:3580:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:3600::,2401:3600:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:3680::,2401:3680:ffff:ffff:ffff:ffff:ffff:ffff,HK
@@ -1372,6 +4658,7 @@
2401:4480::,2401:4480:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:4500::,2401:4500:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:4580::,2401:4580:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:4600::,2401:4600:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:4680::,2401:4680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:4700::,2401:4700:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:4780::,2401:4780:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -1402,133 +4689,262 @@
2401:5480::,2401:5480:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5500::,2401:5500:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:5580::,2401:5580:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:5680::,2401:5680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5700::,2401:5700:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:5780::,2401:5780:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:5800::,2401:5800:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:5880::,2401:5880:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5900::,2401:5900:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:5980::,2401:5980:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:5a00::,2401:5a00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:5a80::,2401:5a80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:5b00::,2401:5b00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5b80::,2401:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:5c00::,2401:5c00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5c80::,2401:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:5d00::,2401:5d00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:5d80::,2401:5d80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:5e00::,2401:5e00:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:5e80::,2401:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:5f00::,2401:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:5f80::,2401:5f80:ffff:ffff:ffff:ffff:ffff:ffff,VN
2401:6000::,2401:6fff:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7000::,2401:7000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:7080::,2401:7080:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:7100::,2401:7100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7180::,2401:7180:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7200::,2401:7200:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7280::,2401:7280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:7300::,2401:7300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7380::,2401:7380:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7400::,2401:7401:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:7480::,2401:7480:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:7500::,2401:7500:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:7580::,2401:7580:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7600::,2401:7600:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:7680::,2401:7680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7700::,2401:7700:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7780::,2401:7780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7800::,2401:7800:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:7880::,2401:7880:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7900::,2401:7900:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2401:7980::,2401:7980:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7a00::,2401:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7a80::,2401:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7b00::,2401:7b00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:7b80::,2401:7b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7c00::,2401:7c00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:7c80::,2401:7c80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7d00::,2401:7d00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:7d80::,2401:7d80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:7e00::,2401:7e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:7e80::,2401:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:7f00::,2401:7f00:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2401:8000::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:7f80::,2401:7f80:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8000::,2401:8000::ffff:ffff:ffff:ffff:ffff,CN
+2401:8000:1::,2401:803f:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:8080::,2401:8080:ffff:ffff:ffff:ffff:ffff:ffff,AF
2401:8100::,2401:8100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:8180::,2401:8180:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8200::,2401:8200:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8280::,2401:8280:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:8300::,2401:8300:ffff:ffff:ffff:ffff:ffff:ffff,MV
+2401:8380::,2401:8380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8400::,2401:8400:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:8480::,2401:8480:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8500::,2401:8500:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8580::,2401:8580:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:8600::,2401:8600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8680::,2401:8680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:8700::,2401:8700:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:8780::,2401:8780:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:8800::,2401:8800:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8880::,2401:8880:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8900::,2401:8900:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:8980::,2401:8980:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8a00::,2401:8a00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:8a80::,2401:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8b00::,2401:8b00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:8b80::,2401:8b80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:8c00::,2401:8c01:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:8c80::,2401:8c80:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:8d00::,2401:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:8d80::,2401:8d80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:8e00::,2401:8e00:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:8e80::,2401:8e80:ffff:ffff:ffff:ffff:ffff:ffff,PH
2401:8f00::,2401:8f00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:8f80::,2401:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:9080::,2401:9080:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:9100::,2401:9100:ffff:ffff:ffff:ffff:ffff:ffff,MO
+2401:9180::,2401:9180:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:9200::,2401:9200:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:9280::,2401:9280:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:9300::,2401:9300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:9380::,2401:9380:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:9400::,2401:9400:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:9480::,2401:9480:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:9500::,2401:9500:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:9580::,2401:9580:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:9600::,2401:9600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:9680::,2401:9680:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:9700::,2401:9700:ffff:ffff:ffff:ffff:ffff:ffff,KH
+2401:9780::,2401:9780:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:9800::,2401:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH
-2401:9900::,2401:9900:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2401:9880::,2401:9880:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:9980::,2401:9980:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:9a00::,2401:9a00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:9a80::,2401:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:9b00::,2401:9b00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:9b80::,2401:9b80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:9c00::,2401:9c00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:9c80::,2401:9c80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:9d00::,2401:9d00:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:9d80::,2401:9d80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:9e00::,2401:9e00:ffff:ffff:ffff:ffff:ffff:ffff,PK
+2401:9e80::,2401:9e80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:9f00::,2401:9f00:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:9f80::,2401:9f80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:a000::,2401:a000:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2401:a080::,2401:a080:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:a100::,2401:a100:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:a180::,2401:a180:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:a280::,2401:a280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:a300::,2401:a300:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:a380::,2401:a380:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:a400::,2401:a400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:a480::,2401:a480:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:a500::,2401:a500:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:a580::,2401:a580:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:a600::,2401:a600:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:a680::,2401:a680:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:a700::,2401:a700:ffff:ffff:ffff:ffff:ffff:ffff,KH
+2401:a780::,2401:a780:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:a800::,2401:a800:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2401:a880::,2401:a880:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:a900::,2401:a900:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:a980::,2401:a980:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:aa00::,2401:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:aa80::,2401:aa80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:ab00::,2401:ab00:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2401:ab80::,2401:ab80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:ac00::,2401:ac00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:ac80::,2401:ac80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:ad00::,2401:ad00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:ad80::,2401:ad80:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:ae00::,2401:ae00:ffff:ffff:ffff:ffff:ffff:ffff,ID
+2401:ae80::,2401:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:af00::,2401:af00:ffff:ffff:ffff:ffff:ffff:ffff,NC
+2401:af80::,2401:af80:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:b000::,2401:b000:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:b080::,2401:b080:ffff:ffff:ffff:ffff:ffff:ffff,SG
2401:b100::,2401:b100:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:b180::,2401:b180:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:b200::,2401:b200:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:b280::,2401:b280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:b300::,2401:b300:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:b380::,2401:b380:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:b400::,2401:b400:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:b480::,2401:b480:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:b500::,2401:b500:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:b580::,2401:b580:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:b600::,2401:b600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:b680::,2401:b680:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:b700::,2401:b700:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:b780::,2401:b780:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:b800::,2401:b800:ffff:ffff:ffff:ffff:ffff:ffff,VN
+2401:b880::,2401:b880:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:b900::,2401:b900:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:b980::,2401:b980:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:ba00::,2401:ba00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:ba80::,2401:ba80:ffff:ffff:ffff:ffff:ffff:ffff,PK
2401:bb00::,2401:bb00:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:bb80::,2401:bb80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:bc00::,2401:bc00:ffff:ffff:ffff:ffff:ffff:ffff,PH
+2401:bc80::,2401:bc80:ffff:ffff:ffff:ffff:ffff:ffff,MM
2401:bd00::,2401:bd00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:bd80::,2401:bd80:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:be00::,2401:be00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:be80::,2401:be80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:bf00::,2401:bf00:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:bf80::,2401:bf80:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:c000::,2401:c000:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:c080::,2401:c080:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:c100::,2401:c100:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:c180::,2401:c180:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:c200::,2401:c200:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:c280::,2401:c280:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:c300::,2401:c300:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:c380::,2401:c380:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:c400::,2401:c400:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:c480::,2401:c480:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:c500::,2401:c500:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2401:c580::,2401:c580:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:c600::,2401:c600:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:c680::,2401:c680:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:c700::,2401:c700:ffff:ffff:ffff:ffff:ffff:ffff,HK
+2401:c780::,2401:c780:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:c800::,2401:c800:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:c880::,2401:c880:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:c900::,2401:c901:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:c980::,2401:c980:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2401:ca00::,2401:ca00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:ca80::,2401:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:cb00::,2401:cb00:ffff:ffff:ffff:ffff:ffff:ffff,KH
+2401:cb80::,2401:cb80:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:cc00::,2401:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:cc80::,2401:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:cd00::,2401:cd00:ffff:ffff:ffff:ffff:ffff:ffff,BD
+2401:cd80::,2401:cd81:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:ce00::,2401:ce00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:ce80::,2401:ce80:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:cf00::,2401:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:cf80::,2401:cf80:ffff:ffff:ffff:ffff:ffff:ffff,PH
2401:d000::,2401:d000:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:d080::,2401:d080:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:d100::,2401:d100:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:d180::,2401:d180:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:d200::,2401:d200:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:d280::,2401:d280:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:d300::,2401:d300:ffff:ffff:ffff:ffff:ffff:ffff,MY
+2401:d380::,2401:d380:ffff:ffff:ffff:ffff:ffff:ffff,BD
2401:d400::,2401:d400:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2401:d480::,2401:d480:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:d500::,2401:d500:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:d580::,2401:d580:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:d600::,2401:d600:ffff:ffff:ffff:ffff:ffff:ffff,MN
+2401:d680::,2401:d680:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:d700::,2401:d700:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:d780::,2401:d780:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:d800::,2401:d800:ffff:ffff:ffff:ffff:ffff:ffff,VN
+2401:d880::,2401:d880:ffff:ffff:ffff:ffff:ffff:ffff,TH
2401:d900::,2401:d900:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:d980::,2401:d980:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:da00::,2401:da00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:da80::,2401:da80:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:db00::,2401:db00:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2401:db80::,2401:db80:ffff:ffff:ffff:ffff:ffff:ffff,SG
2401:dc00::,2401:dc00:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:dc80::,2401:dc80:ffff:ffff:ffff:ffff:ffff:ffff,PF
2401:dd00::,2401:dd00:ffff:ffff:ffff:ffff:ffff:ffff,LK
+2401:dd80::,2401:dd80:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:de00::,2401:de00:ffff:ffff:ffff:ffff:ffff:ffff,CN
+2401:de80::,2401:de80:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:df00::,2401:df01:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:df80::,2401:df80:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:e000::,2401:e000:ffff:ffff:ffff:ffff:ffff:ffff,TH
+2401:e080::,2401:e080:ffff:ffff:ffff:ffff:ffff:ffff,CN
2401:e100::,2401:e100:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:e180::,2401:e180:ffff:ffff:ffff:ffff:ffff:ffff,TW
2401:e200::,2401:e200:ffff:ffff:ffff:ffff:ffff:ffff,KR
+2401:e280::,2401:e280:ffff:ffff:ffff:ffff:ffff:ffff,MY
2401:e300::,2401:e300:ffff:ffff:ffff:ffff:ffff:ffff,JP
+2401:e380::,2401:e380:ffff:ffff:ffff:ffff:ffff:ffff,HK
2401:e400::,2401:e400:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2401:e480::,2401:e480:ffff:ffff:ffff:ffff:ffff:ffff,ID
2401:e500::,2401:e500:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:e580::,2401:e580:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:e600::,2401:e600:ffff:ffff:ffff:ffff:ffff:ffff,FJ
+2401:e680::,2401:e680:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:e700::,2401:e700:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:e800::,2401:e800:ffff:ffff:ffff:ffff:ffff:ffff,VN
2401:e900::,2401:e900:ffff:ffff:ffff:ffff:ffff:ffff,BD
@@ -1548,7 +4964,21 @@
2401:f700::,2401:f700:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:f800::,2401:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP
2401:f900::,2401:f900:ffff:ffff:ffff:ffff:ffff:ffff,SG
-2401:fa00::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00::,2401:fa00::ffff:ffff:ffff:ffff:ffff,AU
+2401:fa00:1::,2401:fa00:1:ffff:ffff:ffff:ffff:ffff,TW
+2401:fa00:2::,2401:fa00:8:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:9::,2401:fa00:9:ffff:ffff:ffff:ffff:ffff,AU
+2401:fa00:a::,2401:fa00:c:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:d::,2401:fa00:d:ffff:ffff:ffff:ffff:ffff,KR
+2401:fa00:e::,2401:fa00:e:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:f::,2401:fa00:f:ffff:ffff:ffff:ffff:ffff,SG
+2401:fa00:10::,2401:fa00:10:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:11::,2401:fa00:11:ffff:ffff:ffff:ffff:ffff,AU
+2401:fa00:12::,2401:fa00:12:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:13::,2401:fa00:13:ffff:ffff:ffff:ffff:ffff,HK
+2401:fa00:14::,2401:fa00:3f:ffff:ffff:ffff:ffff:ffff,IN
+2401:fa00:40::,2401:fa00:40:ffff:ffff:ffff:ffff:ffff,CN
+2401:fa00:41::,2401:fa00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:fb00::,2401:fb00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2401:fc00::,2401:fc00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2401:fd00::,2401:fd00:ffff:ffff:ffff:ffff:ffff:ffff,MY
@@ -1613,7 +5043,6 @@
2402:3c00::,2402:3c00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:3d00::,2402:3d00:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:3e00::,2402:3e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
-2402:3f00::,2402:3f00:ffff:ffff:ffff:ffff:ffff:ffff,MN
2402:4000::,2402:4000:ffff:ffff:ffff:ffff:ffff:ffff,LK
2402:4100::,2402:4100:ffff:ffff:ffff:ffff:ffff:ffff,ID
2402:4200::,2402:4200:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -1645,7 +5074,11 @@
2402:5d00::,2402:5d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:5e00::,2402:5e00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2402:5f00::,2402:5f00:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2402:6000::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,NZ
+2402:6000::,2402:6000:ff:ffff:ffff:ffff:ffff:ffff,AU
+2402:6000:100::,2402:6000:100:ffff:ffff:ffff:ffff:ffff,NZ
+2402:6000:101::,2402:6000:1fe:ffff:ffff:ffff:ffff:ffff,AU
+2402:6000:1ff::,2402:6000:1ff:ffff:ffff:ffff:ffff:ffff,NZ
+2402:6000:200::,2402:6000:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:6100::,2402:6100:ffff:ffff:ffff:ffff:ffff:ffff,KR
2402:6200::,2402:6200:ffff:ffff:ffff:ffff:ffff:ffff,GU
2402:6300::,2402:6300:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -1776,7 +5209,6 @@
2402:e600::,2402:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG
2402:e800::,2402:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP
2402:e900::,2402:e900:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2402:ea00::,2402:ea00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2402:eb00::,2402:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:ec00::,2402:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2402:ed00::,2402:ed00:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -2005,6 +5437,7 @@
2403:d400::,2403:d400:ffff:ffff:ffff:ffff:ffff:ffff,CN
2403:d500::,2403:d500:ffff:ffff:ffff:ffff:ffff:ffff,AU
2403:d600::,2403:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2403:d700::,2403:d700:ffff:ffff:ffff:ffff:ffff:ffff,MN
2403:d800::,2403:d800:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2403:d900::,2403:d900:ffff:ffff:ffff:ffff:ffff:ffff,AU
2403:da00::,2403:da00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -2089,7 +5522,7 @@
2404:1300::,2404:1300:ffff:ffff:ffff:ffff:ffff:ffff,JP
2404:1400::,2404:1400:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:1500::,2404:1500:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2404:1600::,2404:1600:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2404:1600::,2404:1601:ffff:ffff:ffff:ffff:ffff:ffff,AU
2404:1700::,2404:1700:ffff:ffff:ffff:ffff:ffff:ffff,JP
2404:1800::,2404:1800:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2404:1900::,2404:1900:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -2290,7 +5723,7 @@
2404:e500::,2404:e500:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:e600::,2404:e600:ffff:ffff:ffff:ffff:ffff:ffff,SG
2404:e700::,2404:e700:ffff:ffff:ffff:ffff:ffff:ffff,ID
-2404:e800::,2404:e8ff:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2404:e800::,2404:e801:ffff:ffff:ffff:ffff:ffff:ffff,SG
2404:e900::,2404:e900:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:ea00::,2404:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2404:eb00::,2404:eb00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -2307,7 +5740,11 @@
2404:f600::,2404:f600:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:f700::,2404:f700:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:f800::,2404:f800:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2404:f801::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2404:f801::,2404:f801:802f:ffff:ffff:ffff:ffff:ffff,SG
+2404:f801:8030::,2404:f801:8030:ffff:ffff:ffff:ffff:ffff,AU
+2404:f801:8031::,2404:f801:8057:ffff:ffff:ffff:ffff:ffff,SG
+2404:f801:8058::,2404:f801:8058:ffff:ffff:ffff:ffff:ffff,IN
+2404:f801:8059::,2404:f801:ffff:ffff:ffff:ffff:ffff:ffff,SG
2404:f900::,2404:f900:ffff:ffff:ffff:ffff:ffff:ffff,ID
2404:fa00::,2404:fa00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2404:fb00::,2404:fb00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -2520,7 +5957,6 @@
2405:d200::,2405:d200:ffff:ffff:ffff:ffff:ffff:ffff,JP
2405:d300::,2405:d300:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:d400::,2405:d400:ffff:ffff:ffff:ffff:ffff:ffff,PH
-2405:d500::,2405:d500:ffff:ffff:ffff:ffff:ffff:ffff,HK
2405:d600::,2405:d600:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:d700::,2405:d700:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:d800::,2405:d800:ffff:ffff:ffff:ffff:ffff:ffff,SG
@@ -2537,7 +5973,6 @@
2405:e600::,2405:e600:ffff:ffff:ffff:ffff:ffff:ffff,CN
2405:e700::,2405:e700:ffff:ffff:ffff:ffff:ffff:ffff,IN
2405:e800::,2405:e800:ffff:ffff:ffff:ffff:ffff:ffff,JP
-2405:e900::,2405:e900:ffff:ffff:ffff:ffff:ffff:ffff,PH
2405:ea00::,2405:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AU
2405:eb00::,2405:eb00:ffff:ffff:ffff:ffff:ffff:ffff,SG
2405:ec00::,2405:ec00:ffff:ffff:ffff:ffff:ffff:ffff,BT
@@ -2590,7 +6025,11 @@
2406:1d00::,2406:1d00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2406:1e00::,2406:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NZ
2406:1f00::,2406:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2406:2000::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW
+2406:2000::,2406:2000:ef95:ffff:ffff:ffff:ffff:ffff,TW
+2406:2000:ef96::,2406:2000:ef96:ffff:ffff:ffff:ffff:ffff,HK
+2406:2000:ef97::,2406:2000:efb9:ffff:ffff:ffff:ffff:ffff,TW
+2406:2000:efba::,2406:2000:efba:ffff:ffff:ffff:ffff:ffff,HK
+2406:2000:efbb::,2406:2000:ffff:ffff:ffff:ffff:ffff:ffff,TW
2406:2100::,2406:2100:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:2200::,2406:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU
2406:2300::,2406:2300:ffff:ffff:ffff:ffff:ffff:ffff,NZ
@@ -2606,7 +6045,7 @@
2406:2d00::,2406:2d00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:2e00::,2406:2e00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:2f00::,2406:2f00:ffff:ffff:ffff:ffff:ffff:ffff,IN
-2406:3000::,2406:30ff:ffff:ffff:ffff:ffff:ffff:ffff,SG
+2406:3000::,2406:3003:ffff:ffff:ffff:ffff:ffff:ffff,SG
2406:3100::,2406:3100:ffff:ffff:ffff:ffff:ffff:ffff,TH
2406:3200::,2406:3200:ffff:ffff:ffff:ffff:ffff:ffff,PH
2406:3300::,2406:3300:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -2677,6 +6116,7 @@
2406:7400::,2406:7400:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:7500::,2406:7500:ffff:ffff:ffff:ffff:ffff:ffff,AU
2406:7600::,2406:7600:ffff:ffff:ffff:ffff:ffff:ffff,AU
+2406:7700::,2406:7700:ffff:ffff:ffff:ffff:ffff:ffff,MY
2406:7800::,2406:7801:ffff:ffff:ffff:ffff:ffff:ffff,BN
2406:7900::,2406:7900:ffff:ffff:ffff:ffff:ffff:ffff,TH
2406:7a00::,2406:7a00:ffff:ffff:ffff:ffff:ffff:ffff,ID
@@ -2770,6 +6210,7 @@
2406:d600::,2406:d600:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:d700::,2406:d700:ffff:ffff:ffff:ffff:ffff:ffff,KR
2406:d800::,2406:d800:ffff:ffff:ffff:ffff:ffff:ffff,IN
+2406:da01::,2406:daff:ffff:ffff:ffff:ffff:ffff:ffff,JP
2406:db00::,2406:db00:ffff:ffff:ffff:ffff:ffff:ffff,IN
2406:dc00::,2406:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2406:dd00::,2406:dd00:ffff:ffff:ffff:ffff:ffff:ffff,CN
@@ -2837,7 +6278,6 @@
2407:1c00::,2407:1c00:ffff:ffff:ffff:ffff:ffff:ffff,SG
2407:1d00::,2407:1d00:ffff:ffff:ffff:ffff:ffff:ffff,CN
2407:1e00::,2407:1e00:ffff:ffff:ffff:ffff:ffff:ffff,AU
-2407:1f00::,2407:1f00:ffff:ffff:ffff:ffff:ffff:ffff,HK
2407:2000::,2407:2000:ffff:ffff:ffff:ffff:ffff:ffff,KR
2407:2100::,2407:2100:ffff:ffff:ffff:ffff:ffff:ffff,HK
2407:2200::,2407:2200:ffff:ffff:ffff:ffff:ffff:ffff,AU
@@ -2951,7 +6391,6 @@
2407:9300::,2407:9300:ffff:ffff:ffff:ffff:ffff:ffff,IN
2407:9400::,2407:9400:ffff:ffff:ffff:ffff:ffff:ffff,MY
2407:9500::,2407:9500:ffff:ffff:ffff:ffff:ffff:ffff,NP
-2407:9700::,2407:9700:ffff:ffff:ffff:ffff:ffff:ffff,IN
2407:9800::,2407:9800:ffff:ffff:ffff:ffff:ffff:ffff,PH
2407:9900::,2407:9900:ffff:ffff:ffff:ffff:ffff:ffff,JP
2407:9a00::,2407:9a00:ffff:ffff:ffff:ffff:ffff:ffff,IN
@@ -3064,6 +6503,7 @@
240b:240::,240b:27f:ffff:ffff:ffff:ffff:ffff:ffff,JP
240b:8000::,240b:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN
240c::,240c:f:ffff:ffff:ffff:ffff:ffff:ffff,CN
+240c:8000::,240c:87ff:ffff:ffff:ffff:ffff:ffff:ffff,CN
240d::,240d:1f:ffff:ffff:ffff:ffff:ffff:ffff,JP
240e::,240e:fff:ffff:ffff:ffff:ffff:ffff:ffff,CN
240f::,240f:ff:ffff:ffff:ffff:ffff:ffff:ffff,JP
@@ -3088,10 +6528,11 @@
2600:1900::,2600:190f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1a00::,2600:1a0f:ffff:ffff:ffff:ffff:ffff:ffff,GD
2600:1b00::,2600:1bff:ffff:ffff:ffff:ffff:ffff:ffff,JM
-2600:1c00::,2600:1c0f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1d00::,2600:1d0f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:1e00::,2600:1e0f:ffff:ffff:ffff:ffff:ffff:ffff,VC
-2600:2000::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:1f00::,2600:200f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:2100::,2600:210f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2600:2200::,2600:220f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:2400::,2600:2407:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:2800::,2600:2803:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:2c00::,2600:2c03:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3119,7 +6560,9 @@
2600:8400::,2600:840f:ffff:ffff:ffff:ffff:ffff:ffff,BB
2600:8800::,2600:880f:ffff:ffff:ffff:ffff:ffff:ffff,US
2600:e000::,2600:e00f:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2601::,2601:ff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2601::,2601:6:117f:ffff:ffff:ffff:ffff:ffff,US
+2601:6:1180::,2601:6:1180:ffff:ffff:ffff:ffff:ffff,CA
+2601:6:1181::,2601:fff:ffff:ffff:ffff:ffff:ffff:ffff,US
2602::,2602:10f:ffff:ffff:ffff:ffff:ffff:ffff,US
2602:200::,2602:200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2602:210::,2602:210:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -3128,6 +6571,31 @@
2602:232::,2602:232:ffff:ffff:ffff:ffff:ffff:ffff,CA
2602:240::,2602:25f:ffff:ffff:ffff:ffff:ffff:ffff,US
2602:300::,2602:3ff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2602:ff97::,2602:ff97:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ff98::,2602:ff98:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:ff99::,2602:ff99:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ff9a::,2602:ff9a:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ff9b::,2602:ff9b:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ff9c::,2602:ff9c:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:ff9d::,2602:ff9d:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:ff9e::,2602:ff9e:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:ff9f::,2602:ff9f:fff:ffff:ffff:ffff:ffff:ffff,CA
+2602:ffa0::,2602:ffa0:fff:ffff:ffff:ffff:ffff:ffff,VG
+2602:ffa1::,2602:ffa1:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa2::,2602:ffa2:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa3::,2602:ffa3:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa4::,2602:ffa4:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa5::,2602:ffa5:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa6::,2602:ffa6:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa7::,2602:ffa7:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa8::,2602:ffa8:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffa9::,2602:ffa9:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffaa::,2602:ffaa:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffab::,2602:ffab:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffac::,2602:ffac:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffad::,2602:ffad:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffae::,2602:ffae:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffaf::,2602:ffaf:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffb0::,2602:ffb0:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffb1::,2602:ffb1:fff:ffff:ffff:ffff:ffff:ffff,CA
2602:ffb2::,2602:ffb2:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -3152,8 +6620,7 @@
2602:ffc5::,2602:ffc5:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffc6::,2602:ffc6:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffc7::,2602:ffc7:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ffc8::,2602:ffc8:fff:ffff:ffff:ffff:ffff:ffff,US
-2602:ffc9::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US
+2602:ffc8::,2602:ffc9:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffca::,2602:ffca:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffcb::,2602:ffcb:fff:ffff:ffff:ffff:ffff:ffff,US
2602:ffcc::,2602:ffcc:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -3205,6 +6672,7 @@
2602:fffd::,2602:fffd:fff:ffff:ffff:ffff:ffff:ffff,CA
2602:ffff::,2602:ffff:fff:ffff:ffff:ffff:ffff:ffff,US
2603::,2603:10ff:ffff:ffff:ffff:ffff:ffff:ffff,US
+2603:2000::,2603:2fff:ffff:ffff:ffff:ffff:ffff:ffff,US
2604::,2604::ffff:ffff:ffff:ffff:ffff:ffff,US
2604:10::,2604:10:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:100::,2604:100:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3269,7 +6737,9 @@
2604:1e80::,2604:1e80:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:1f00::,2604:1f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:1f80::,2604:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2604:2000::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:2000::,2604:2000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:2080::,2604:2080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:2100::,2604:2100:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:2180::,2604:2180:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:2200::,2604:2200:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:2280::,2604:2280:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3395,7 +6865,9 @@
2604:5e80::,2604:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5f00::,2604:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:5f80::,2604:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:6000::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:6000::,2604:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:6080::,2604:6080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:6100::,2604:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:6180::,2604:6180:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:6200::,2604:6200:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:6280::,2604:6280:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3469,10 +6941,10 @@
2604:8500::,2604:8500:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:8580::,2604:8580:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:8600::,2604:8600:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2604:8680::,2604:8680:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:8700::,2604:8700:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:8780::,2604:8780:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:8800::,2604:88ff:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2604:8800::,2604:8800:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:8880::,2604:8880:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:8900::,2604:8900:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:8980::,2604:8980:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:8a00::,2604:8a00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3558,6 +7030,7 @@
2604:b200::,2604:b200:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:b280::,2604:b280:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:b300::,2604:b300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:b380::,2604:b380:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:b400::,2604:b400:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:b480::,2604:b480:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:b500::,2604:b500:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3601,6 +7074,7 @@
2604:c800::,2604:c800:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:c880::,2604:c880:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:c900::,2604:c900:ffff:ffff:ffff:ffff:ffff:ffff,US
+2604:c980::,2604:c980:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:ca00::,2604:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:ca80::,2604:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:cb00::,2604:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3630,13 +7104,11 @@
2604:d700::,2604:d700:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:d780::,2604:d780:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:d800::,2604:d801:ffff:ffff:ffff:ffff:ffff:ffff,US
-2604:d880::,2604:d880:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:d900::,2604:d900:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:d980::,2604:d980:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:da00::,2604:da00:fff:ffff:ffff:ffff:ffff:ffff,US
2604:da80::,2604:da80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:db00::,2604:db00:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2604:db80::,2604:db80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:dc00::,2604:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:dc80::,2604:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:dd00::,2604:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3676,7 +7148,6 @@
2604:ee00::,2604:ee00:fff:ffff:ffff:ffff:ffff:ffff,US
2604:ee80::,2604:ee80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:ef00::,2604:ef00:ffff:ffff:ffff:ffff:ffff:ffff,CA
-2604:ef80::,2604:ef80:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:f000::,2604:f000:ffff:ffff:ffff:ffff:ffff:ffff,CA
2604:f080::,2604:f080:ffff:ffff:ffff:ffff:ffff:ffff,US
2604:f100::,2604:f100:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3745,7 +7216,6 @@
2605:1080::,2605:1080:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:1100::,2605:1100:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:1180::,2605:1180:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:1200::,2605:1200:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:1280::,2605:1280:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:1300::,2605:1300:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:1380::,2605:1380:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -3800,6 +7270,7 @@
2605:2c80::,2605:2c80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:2d00::,2605:2d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:2d80::,2605:2d80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:2e00::,2605:2e00:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:2e80::,2605:2e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:2f00::,2605:2f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:2f80::,2605:2f80:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3852,7 +7323,6 @@
2605:4700::,2605:4700:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:4780::,2605:4780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:4800::,2605:4800:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:4880::,2605:4880:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:4900::,2605:4900:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:4980::,2605:4980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:4a00::,2605:4a00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -3882,7 +7352,6 @@
2605:5600::,2605:5600:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5680::,2605:5680:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5700::,2605:5700:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:5780::,2605:5780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5800::,2605:5800:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5880::,2605:5880:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5900::,2605:5900:ffff:ffff:ffff:ffff:ffff:ffff,JM
@@ -3899,7 +7368,9 @@
2605:5e80::,2605:5e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5f00::,2605:5f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:5f80::,2605:5f80:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:6000::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:6000::,2605:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:6080::,2605:6080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:6100::,2605:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:6180::,2605:6180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:6200::,2605:6200:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:6280::,2605:6280:ffff:ffff:ffff:ffff:ffff:ffff,AI
@@ -3950,7 +7421,6 @@
2605:7900::,2605:7900:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:7980::,2605:7980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:7a00::,2605:7a00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:7a80::,2605:7a80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:7b00::,2605:7b00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:7b80::,2605:7b80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:7c00::,2605:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -3990,7 +7460,6 @@
2605:8d00::,2605:8d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:8d80::,2605:8d80:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:8e00::,2605:8e00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:8e80::,2605:8e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:8f00::,2605:8f00:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:8f80::,2605:8f80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9000::,2605:9000:ffff:ffff:ffff:ffff:ffff:ffff,CA
@@ -4014,74 +7483,149 @@
2605:9900::,2605:9900:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9980::,2605:9980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9a00::,2605:9a00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9a80::,2605:9a80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9b00::,2605:9b00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9b80::,2605:9b80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9c00::,2605:9c00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9c80::,2605:9c80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9d00::,2605:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9d80::,2605:9d80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9e00::,2605:9e00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9e80::,2605:9e80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:9f00::,2605:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:a000::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:9f80::,2605:9f80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a000::,2605:a000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a080::,2605:a080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a100::,2605:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a180::,2605:a180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a200::,2605:a200:ffff:ffff:ffff:ffff:ffff:ffff,JM
+2605:a280::,2605:a280:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a300::,2605:a300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a380::,2605:a380:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a400::,2605:a40f:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a480::,2605:a480:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a500::,2605:a500:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:a600::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a580::,2605:a580:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a600::,2605:a601:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a680::,2605:a680:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:a700::,2605:a700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a780::,2605:a780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a800::,2605:a800:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:a880::,2605:a880:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:a900::,2605:a900:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:a980::,2605:a980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:aa00::,2605:aa00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:aa80::,2605:aa80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ab00::,2605:ab00:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:ab80::,2605:ab80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ac00::,2605:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:ac80::,2605:ac80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ad00::,2605:ad00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:ad80::,2605:ad80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ae00::,2605:ae00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:ae80::,2605:ae80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:af00::,2605:af00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:af80::,2605:af80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b000::,2605:b000:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:b080::,2605:b080:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b100::,2605:b100:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:b180::,2605:b180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b200::,2605:b200:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:b280::,2605:b280:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b300::,2605:b300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:b380::,2605:b380:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b400::,2605:b400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:b480::,2605:b480:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:b500::,2605:b500:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:b580::,2605:b580:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b600::,2605:b600:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:b680::,2605:b680:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b700::,2605:b700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:b780::,2605:b780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:b800::,2605:b800:ffff:ffff:ffff:ffff:ffff:ffff,PR
+2605:b880::,2605:b880:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:b900::,2605:b900:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:b980::,2605:b980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ba00::,2605:ba00:ffff:ffff:ffff:ffff:ffff:ffff,PR
+2605:ba80::,2605:ba80:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:bb00::,2605:bb00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:bb80::,2605:bb80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:bc00::,2605:bc00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:bc80::,2605:bc80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:bd00::,2605:bd00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:bd80::,2605:bd80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:be00::,2605:be00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:be80::,2605:be80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:bf00::,2605:bf00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:bf80::,2605:bf80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c000::,2605:c000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c080::,2605:c080:ffff:ffff:ffff:ffff:ffff:ffff,GD
2605:c100::,2605:c100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c180::,2605:c180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c200::,2605:c200:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c280::,2605:c280:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c300::,2605:c300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c380::,2605:c380:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c400::,2605:c400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c480::,2605:c480:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c500::,2605:c500:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:c580::,2605:c580:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:c600::,2605:c600:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c680::,2605:c680:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c700::,2605:c700:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:c780::,2605:c780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c800::,2605:c800:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c880::,2605:c880:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:c900::,2605:c900:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:c980::,2605:c980:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:ca00::,2605:ca00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:ca80::,2605:ca80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:cb00::,2605:cb00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:cb80::,2605:cb80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:cc00::,2605:cc00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:cc80::,2605:cc80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:cd00::,2605:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:cd80::,2605:cd80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:ce00::,2605:ce00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:ce80::,2605:ce80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:cf00::,2605:cf00:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:cf80::,2605:cf80:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:d000::,2605:d000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d080::,2605:d080:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d100::,2605:d100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d180::,2605:d180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d200::,2605:d200:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d280::,2605:d280:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d300::,2605:d300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d380::,2605:d380:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d400::,2605:d400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d480::,2605:d480:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d500::,2605:d500:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2605:d580::,2605:d580:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d600::,2605:d600:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d680::,2605:d680:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d700::,2605:d700:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d780::,2605:d780:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:d800::,2605:d800:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d880::,2605:d880:ffff:ffff:ffff:ffff:ffff:ffff,DM
2605:d900::,2605:d900:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:d980::,2605:d980:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:da00::,2605:da00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:da80::,2605:da80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:db00::,2605:db00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:db80::,2605:db80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:dc00::,2605:dc00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:dc80::,2605:dc80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:dd00::,2605:dd00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:dd80::,2605:dd80:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:de00::,2605:de00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:de80::,2605:de80:ffff:ffff:ffff:ffff:ffff:ffff,VI
2605:df00::,2605:df00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2605:e000::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:df80::,2605:df80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:e000::,2605:e000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:e080::,2605:e080:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:e100::,2605:e100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2605:e180::,2605:e180:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:e200::,2605:e200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2605:e300::,2605:e300:ffff:ffff:ffff:ffff:ffff:ffff,US
2605:e400::,2605:e400:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4208,7 +7752,8 @@
2606:5d00::,2606:5d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:5e00::,2606:5e00:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:5f00::,2606:5f00:ffff:ffff:ffff:ffff:ffff:ffff,PR
-2606:6000::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:6000::,2606:6000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:6100::,2606:6100:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:6200::,2606:6200:ffff:ffff:ffff:ffff:ffff:ffff,CA
2606:6300::,2606:6300:ffff:ffff:ffff:ffff:ffff:ffff,CA
2606:6400::,2606:6400:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4271,7 +7816,10 @@
2606:9d00::,2606:9d00:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:9e00::,2606:9e00:ffff:ffff:ffff:ffff:ffff:ffff,BM
2606:9f00::,2606:9f00:ffff:ffff:ffff:ffff:ffff:ffff,US
-2606:a000::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:a000::,2606:a000:dd41:f5ff:ffff:ffff:ffff:ffff,US
+2606:a000:dd41:f600::,2606:a000:dd41:f7ff:ffff:ffff:ffff:ffff,AU
+2606:a000:dd41:f800::,2606:a000:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:a100::,2606:a100:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:a200::,2606:a200:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:a300::,2606:a300:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:a400::,2606:a400:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4320,7 +7868,7 @@
2606:d000::,2606:d000:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:d100::,2606:d100:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:d200::,2606:d200:ffff:ffff:ffff:ffff:ffff:ffff,US
-2606:d300::,2606:d300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2606:d300::,2606:d300:fff:ffff:ffff:ffff:ffff:ffff,US
2606:d400::,2606:d400:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:d500::,2606:d500:ffff:ffff:ffff:ffff:ffff:ffff,US
2606:d600::,2606:d600:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4681,7 +8229,7 @@
2607:f270::,2607:f270:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f278::,2607:f278:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f280::,2607:f281:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:f288::,2607:f288:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f290::,2607:f290:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f298::,2607:f298:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f2a8::,2607:f2a8:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4694,7 +8242,36 @@
2607:f2e8::,2607:f2e8:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f2f0::,2607:f2f0:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f2f8::,2607:f2f8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:f300::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f300::,2607:f300:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f308::,2607:f308:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f310::,2607:f310:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f318::,2607:f318:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f330::,2607:f330:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f338::,2607:f338:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:f340::,2607:f340:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f348::,2607:f348:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f350::,2607:f350:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f358::,2607:f358:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f360::,2607:f360:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f368::,2607:f368:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f370::,2607:f370:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f378::,2607:f378:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f380::,2607:f380:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f388::,2607:f388:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f390::,2607:f390:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f398::,2607:f398:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3a0::,2607:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3b0::,2607:f3b0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3b8::,2607:f3b8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3c0::,2607:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3c8::,2607:f3c8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3d0::,2607:f3d0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3d8::,2607:f3d8:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:f3e0::,2607:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:f3e8::,2607:f3e8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3f0::,2607:f3f0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f3f8::,2607:f3f8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f400::,2607:f400:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f408::,2607:f408:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f418::,2607:f418:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f420::,2607:f420:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4791,7 +8368,11 @@
2607:f720::,2607:f720:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f728::,2607:f728:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f738::,2607:f738:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:f740::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:f740::,2607:f740:e:ffff:ffff:ffff:ffff:ffff,US
+2607:f740:f::,2607:f740:f:ffff:ffff:ffff:ffff:ffff,CA
+2607:f740:10::,2607:f740:6f:ffff:ffff:ffff:ffff:ffff,US
+2607:f740:70::,2607:f740:70:ffff:ffff:ffff:ffff:ffff,CA
+2607:f740:71::,2607:f740:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f748::,2607:f748:ffff:ffff:ffff:ffff:ffff:ffff,CA
2607:f750::,2607:f750:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:f758::,2607:f758:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4915,7 +8496,6 @@
2607:fb50::,2607:fb50:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fb58::,2607:fb58:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fb60::,2607:fb60:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fb68::,2607:fb68:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fb70::,2607:fb70:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fb78::,2607:fb78:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fb80::,2607:fb80:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -4933,7 +8513,38 @@
2607:fbe8::,2607:fbe8:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fbf0::,2607:fbf0:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fbf8::,2607:fbf8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2607:fc00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc00::,2607:fc00:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc08::,2607:fc08:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc10::,2607:fc10:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fc18::,2607:fc18:fff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc20::,2607:fc20:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc28::,2607:fc28:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc30::,2607:fc30:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc38::,2607:fc38:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc40::,2607:fc40:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc48::,2607:fc48:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc50::,2607:fc50:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc58::,2607:fc58:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc60::,2607:fc60:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc68::,2607:fc68:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc70::,2607:fc70:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fc78::,2607:fc78:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fc80::,2607:fc80:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc88::,2607:fc88:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc90::,2607:fc90:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fc98::,2607:fc98:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fca0::,2607:fca0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fca8::,2607:fca8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcb8::,2607:fcb8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcc0::,2607:fcc0:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fcc8::,2607:fcc8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcd0::,2607:fcd0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcd8::,2607:fcd8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fce0::,2607:fce0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fce8::,2607:fce8:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcf0::,2607:fcf0:ffff:ffff:ffff:ffff:ffff:ffff,US
+2607:fcf8::,2607:fcf8:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2607:fd00::,2607:fd00:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fd08::,2607:fd08:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fd10::,2607:fd10:ffff:ffff:ffff:ffff:ffff:ffff,US
2607:fd28::,2607:fd28:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -5098,7 +8709,1072 @@
2610:1e8::,2610:1e8:ffff:ffff:ffff:ffff:ffff:ffff,CA
2610:1f0::,2610:1f0:ffff:ffff:ffff:ffff:ffff:ffff,US
2610:1f8::,2610:1f8:ffff:ffff:ffff:ffff:ffff:ffff,US
-2620::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US
+2620::,2620::ffff:ffff:ffff:ffff:ffff,US
+2620:0:10::,2620::10:ffff:ffff:ffff:ffff:ffff,US
+2620:0:20::,2620::20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:30::,2620::37:ffff:ffff:ffff:ffff:ffff,US
+2620:0:60::,2620::60:ffff:ffff:ffff:ffff:ffff,FR
+2620:0:70::,2620::70:ffff:ffff:ffff:ffff:ffff,US
+2620:0:80::,2620::80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:90::,2620::90:ffff:ffff:ffff:ffff:ffff,US
+2620:0:a0::,2620::a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b0::,2620::b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c0::,2620::c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:f0::,2620::f0:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:100::,2620::100:ffff:ffff:ffff:ffff:ffff,US
+2620:0:110::,2620::110:ffff:ffff:ffff:ffff:ffff,US
+2620:0:120::,2620::120:ffff:ffff:ffff:ffff:ffff,US
+2620:0:140::,2620::140:ffff:ffff:ffff:ffff:ffff,US
+2620:0:150::,2620::150:ffff:ffff:ffff:ffff:ffff,US
+2620:0:160::,2620::160:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:170::,2620::170:ffff:ffff:ffff:ffff:ffff,US
+2620:0:180::,2620::180:ffff:ffff:ffff:ffff:ffff,US
+2620:0:190::,2620::190:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a0::,2620::1a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1b0::,2620::1b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1c0::,2620::1c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1d0::,2620::1d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1f0::,2620::1f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:200::,2620::200:ffff:ffff:ffff:ffff:ffff,US
+2620:0:210::,2620::210:ffff:ffff:ffff:ffff:ffff,US
+2620:0:220::,2620::220:ffff:ffff:ffff:ffff:ffff,US
+2620:0:230::,2620::230:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:240::,2620::240:ffff:ffff:ffff:ffff:ffff,US
+2620:0:250::,2620::250:ffff:ffff:ffff:ffff:ffff,US
+2620:0:260::,2620::260:ffff:ffff:ffff:ffff:ffff,US
+2620:0:270::,2620::270:ffff:ffff:ffff:ffff:ffff,US
+2620:0:280::,2620::280:ffff:ffff:ffff:ffff:ffff,US
+2620:0:290::,2620::290:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b0::,2620::2b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2c0::,2620::2c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2d0::,2620::2d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2f0::,2620::2f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:300::,2620::300:ffff:ffff:ffff:ffff:ffff,US
+2620:0:320::,2620::320:ffff:ffff:ffff:ffff:ffff,US
+2620:0:350::,2620::353:ffff:ffff:ffff:ffff:ffff,US
+2620:0:360::,2620::361:ffff:ffff:ffff:ffff:ffff,US
+2620:0:380::,2620::380:ffff:ffff:ffff:ffff:ffff,US
+2620:0:390::,2620::390:ffff:ffff:ffff:ffff:ffff,US
+2620:0:3b0::,2620::3b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:3c0::,2620::3c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:3e0::,2620::3e0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:3f0::,2620::3f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:400::,2620::57f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:600::,2620::600:ffff:ffff:ffff:ffff:ffff,US
+2620:0:610::,2620::61f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:630::,2620::630:ffff:ffff:ffff:ffff:ffff,US
+2620:0:640::,2620::640:ffff:ffff:ffff:ffff:ffff,US
+2620:0:650::,2620::650:ffff:ffff:ffff:ffff:ffff,US
+2620:0:660::,2620::660:ffff:ffff:ffff:ffff:ffff,US
+2620:0:670::,2620::671:ffff:ffff:ffff:ffff:ffff,US
+2620:0:680::,2620::680:ffff:ffff:ffff:ffff:ffff,US
+2620:0:690::,2620::691:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6a0::,2620::6a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6b0::,2620::6b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6c0::,2620::6c7:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6d0::,2620::6d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6e0::,2620::6e0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:6f0::,2620::6f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:700::,2620::77f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:800::,2620::802:ffff:ffff:ffff:ffff:ffff,US
+2620:0:810::,2620::810:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:840::,2620::840:ffff:ffff:ffff:ffff:ffff,US
+2620:0:850::,2620::850:ffff:ffff:ffff:ffff:ffff,US
+2620:0:860::,2620::863:ffff:ffff:ffff:ffff:ffff,US
+2620:0:870::,2620::877:ffff:ffff:ffff:ffff:ffff,US
+2620:0:880::,2620::880:ffff:ffff:ffff:ffff:ffff,US
+2620:0:890::,2620::890:ffff:ffff:ffff:ffff:ffff,US
+2620:0:8a0::,2620::8a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:8d0::,2620::8d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:8e0::,2620::8e0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:8f0::,2620::8f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:900::,2620::900:ffff:ffff:ffff:ffff:ffff,US
+2620:0:910::,2620::910:ffff:ffff:ffff:ffff:ffff,US
+2620:0:920::,2620::920:ffff:ffff:ffff:ffff:ffff,US
+2620:0:930::,2620::930:ffff:ffff:ffff:ffff:ffff,US
+2620:0:940::,2620::940:ffff:ffff:ffff:ffff:ffff,US
+2620:0:950::,2620::950:ffff:ffff:ffff:ffff:ffff,US
+2620:0:960::,2620::960:ffff:ffff:ffff:ffff:ffff,US
+2620:0:970::,2620::970:ffff:ffff:ffff:ffff:ffff,US
+2620:0:980::,2620::980:ffff:ffff:ffff:ffff:ffff,US
+2620:0:990::,2620::990:ffff:ffff:ffff:ffff:ffff,US
+2620:0:9a0::,2620::9a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:9b0::,2620::9b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:9c0::,2620::9c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:9e0::,2620::9e0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:9f0::,2620::9f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:a00::,2620::a1f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b00::,2620::b00:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b10::,2620::b13:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b20::,2620::b20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b30::,2620::b30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b40::,2620::b40:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b60::,2620::b61:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b80::,2620::b80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:b90::,2620::b90:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ba0::,2620::ba0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:bb0::,2620::bb0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:bd0::,2620::bd0:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:be0::,2620::be0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:bf0::,2620::bf0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c10::,2620::c20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c30::,2620::c30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c40::,2620::c40:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c60::,2620::c60:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c70::,2620::c70:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c80::,2620::c80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:c90::,2620::ca0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:cb0::,2620::cb0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:cc0::,2620::ccf:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ce0::,2620::ce0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:cf0::,2620::cf0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d20::,2620::d20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d30::,2620::d30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d50::,2620::d50:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d60::,2620::d63:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d70::,2620::d77:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d80::,2620::d80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:d90::,2620::d90:ffff:ffff:ffff:ffff:ffff,US
+2620:0:dc0::,2620::dc0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:dd0::,2620::dd0:ffff:ffff:ffff:ffff:ffff,CN
+2620:0:de0::,2620::de0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:df0::,2620::df0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e00::,2620::e00:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e10::,2620::e10:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e20::,2620::e23:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e30::,2620::e30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e50::,2620::e50:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e60::,2620::e60:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e80::,2620::e80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:e90::,2620::e90:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ea0::,2620::eb0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ed0::,2620::ed0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ee0::,2620::ee0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:ef0::,2620::ef0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:f00::,2620::f7f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1000::,2620::100c:ffff:ffff:ffff:ffff:ffff,US
+2620:0:100d::,2620::100d:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:100e::,2620::101f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1020::,2620::1020:ffff:ffff:ffff:ffff:ffff,MX
+2620:0:1021::,2620::1024:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1025::,2620::1025:ffff:ffff:ffff:ffff:ffff,BR
+2620:0:1026::,2620::103f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1040::,2620::1040:ffff:ffff:ffff:ffff:ffff,IE
+2620:0:1041::,2620::1041:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1042::,2620::1042:ffff:ffff:ffff:ffff:ffff,GB
+2620:0:1043::,2620::1044:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1045::,2620::1045:ffff:ffff:ffff:ffff:ffff,IL
+2620:0:1046::,2620::1046:ffff:ffff:ffff:ffff:ffff,DE
+2620:0:1047::,2620::1048:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1049::,2620::1049:ffff:ffff:ffff:ffff:ffff,DE
+2620:0:104a::,2620::104a:ffff:ffff:ffff:ffff:ffff,US
+2620:0:104b::,2620::104b:ffff:ffff:ffff:ffff:ffff,NL
+2620:0:104c::,2620::1051:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1052::,2620::1052:ffff:ffff:ffff:ffff:ffff,IE
+2620:0:1053::,2620::1053:ffff:ffff:ffff:ffff:ffff,FR
+2620:0:1054::,2620::105e:ffff:ffff:ffff:ffff:ffff,US
+2620:0:105f::,2620::105f:ffff:ffff:ffff:ffff:ffff,CH
+2620:0:1060::,2620::1068:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1069::,2620::1069:ffff:ffff:ffff:ffff:ffff,PL
+2620:0:106a::,2620::106a:ffff:ffff:ffff:ffff:ffff,US
+2620:0:106b::,2620::106b:ffff:ffff:ffff:ffff:ffff,RU
+2620:0:106c::,2620::1072:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1073::,2620::1073:ffff:ffff:ffff:ffff:ffff,GB
+2620:0:1074::,2620::10ff:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1400::,2620::143f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1500::,2620::157f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1600::,2620::167f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1700::,2620::170f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1800::,2620::181f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a00::,2620::1a00:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a10::,2620::1a10:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a20::,2620::1a20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a30::,2620::1a30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a40::,2620::1a40:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a50::,2620::1a50:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a70::,2620::1a70:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1a80::,2620::1a80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1aa0::,2620::1aa0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1ab0::,2620::1ab0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1ac0::,2620::1ac0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1ad0::,2620::1ad7:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1ae0::,2620::1ae0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1af0::,2620::1af0:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:1b00::,2620::1b07:ffff:ffff:ffff:ffff:ffff,US
+2620:0:1c00::,2620::1cff:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2000::,2620::203f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2210::,2620::2210:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2220::,2620::2220:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:2240::,2620::2240:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2250::,2620::2250:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2260::,2620::2260:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2280::,2620::2280:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2290::,2620::2290:ffff:ffff:ffff:ffff:ffff,US
+2620:0:22a0::,2620::22a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:22b0::,2620::22b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:22c0::,2620::22c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:22d0::,2620::22d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:22e0::,2620::22e0:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:22f0::,2620::22f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2300::,2620::230f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2400::,2620::24ff:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2800::,2620::2800:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2810::,2620::2810:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2820::,2620::2820:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2830::,2620::2830:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2840::,2620::2840:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2850::,2620::2850:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2860::,2620::2860:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2870::,2620::2870:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2880::,2620::2880:ffff:ffff:ffff:ffff:ffff,US
+2620:0:28a0::,2620::28a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:28b0::,2620::28b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:28d0::,2620::28d0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:28f0::,2620::28f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2900::,2620::290f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2a00::,2620::2a1f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b00::,2620::2b00:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b10::,2620::2b10:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b20::,2620::2b20:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b30::,2620::2b40:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b50::,2620::2b50:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b60::,2620::2b60:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2b70::,2620::2b8f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2bc0::,2620::2bc3:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2be0::,2620::2be0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2d00::,2620::2d7f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e00::,2620::2e00:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e10::,2620::2e10:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e30::,2620::2e30:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e40::,2620::2e40:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e50::,2620::2e50:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e60::,2620::2e60:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2e70::,2620::2e80:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2ea0::,2620::2ea0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2eb0::,2620::2eb0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2ed0::,2620::2ed0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2ee0::,2620::2ee0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:2f00::,2620::2f7f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5000::,2620::5000:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5010::,2620::5010:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5030::,2620::5030:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5040::,2620::5040:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5050::,2620::5050:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5060::,2620::5060:ffff:ffff:ffff:ffff:ffff,CA
+2620:0:5070::,2620::5070:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5080::,2620::5080:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5090::,2620::5090:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50a0::,2620::50a0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50b0::,2620::50b0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50c0::,2620::50c0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50d0::,2620::50d1:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50e0::,2620::50e0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:50f0::,2620::50f0:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5100::,2620::510f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5200::,2620::5200:ffff:ffff:ffff:ffff:ffff,US
+2620:0:5300::,2620::530f:ffff:ffff:ffff:ffff:ffff,US
+2620:0:aa00::,2620::aa00:ffff:ffff:ffff:ffff:ffff,US
+2620:1::,2620:1::ffff:ffff:ffff:ffff:ffff,US
+2620:1:4000::,2620:1:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1:8000::,2620:1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1:c000::,2620:1:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:2::,2620:2::ffff:ffff:ffff:ffff:ffff,US
+2620:2:4000::,2620:2:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:2:8000::,2620:2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2:c000::,2620:2:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:3::,2620:3::ffff:ffff:ffff:ffff:ffff,US
+2620:3:4000::,2620:3:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:3:8000::,2620:3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3:c000::,2620:3:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:4::,2620:4::ffff:ffff:ffff:ffff:ffff,US
+2620:4:4000::,2620:4:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:4:8000::,2620:4:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:4:c000::,2620:4:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:5::,2620:5::ffff:ffff:ffff:ffff:ffff,US
+2620:5:4000::,2620:5:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:5:8000::,2620:5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5:c000::,2620:5:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:6::,2620:6::ffff:ffff:ffff:ffff:ffff,CA
+2620:6:4000::,2620:6:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:6:8000::,2620:6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:6:c000::,2620:6:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:7::,2620:7::ffff:ffff:ffff:ffff:ffff,US
+2620:7:4000::,2620:7:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:7:8000::,2620:7:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:7:c000::,2620:7:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8::,2620:8:7f:ffff:ffff:ffff:ffff:ffff,CA
+2620:8:8200::,2620:8:8200:ffff:ffff:ffff:ffff:ffff,US
+2620:9::,2620:9::ffff:ffff:ffff:ffff:ffff,US
+2620:9:4000::,2620:9:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9:8000::,2620:9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9:c000::,2620:9:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:a::,2620:a:f:ffff:ffff:ffff:ffff:ffff,CA
+2620:a:4000::,2620:a:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:a:8000::,2620:a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a:c000::,2620:a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:b::,2620:b::ffff:ffff:ffff:ffff:ffff,US
+2620:b:4000::,2620:b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:b:8000::,2620:b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b:c000::,2620:b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:c::,2620:c::ffff:ffff:ffff:ffff:ffff,US
+2620:c:4000::,2620:c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:c:8000::,2620:c:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c:c000::,2620:c:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:d::,2620:d::ffff:ffff:ffff:ffff:ffff,US
+2620:d:4000::,2620:d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:d:8000::,2620:d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d:c000::,2620:d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:e::,2620:e::ffff:ffff:ffff:ffff:ffff,US
+2620:e:4000::,2620:e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:e:8000::,2620:e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e:c000::,2620:e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:f::,2620:f:f:ffff:ffff:ffff:ffff:ffff,US
+2620:f:4000::,2620:f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:f:8000::,2620:f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f:c000::,2620:f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:10::,2620:10::ffff:ffff:ffff:ffff:ffff,US
+2620:10:4000::,2620:10:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:10:8000::,2620:10:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:10:c000::,2620:10:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:11::,2620:11:ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11:4000::,2620:11:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:11:8000::,2620:11:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:11:c000::,2620:11:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:12::,2620:12::ffff:ffff:ffff:ffff:ffff,US
+2620:12:4000::,2620:12:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:12:8000::,2620:12:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:12:c000::,2620:12:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:13::,2620:13::ffff:ffff:ffff:ffff:ffff,CA
+2620:13:4000::,2620:13:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:13:8000::,2620:13:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:13:c000::,2620:13:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:14::,2620:14::ffff:ffff:ffff:ffff:ffff,US
+2620:14:4000::,2620:14:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:14:8000::,2620:14:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:14:c000::,2620:14:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:15::,2620:15::ffff:ffff:ffff:ffff:ffff,US
+2620:15:4000::,2620:15:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:15:8000::,2620:15:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:15:c000::,2620:15:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:16::,2620:16::ffff:ffff:ffff:ffff:ffff,CA
+2620:16:4000::,2620:16:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:16:8000::,2620:16:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:16:c000::,2620:16:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:17::,2620:17::ffff:ffff:ffff:ffff:ffff,US
+2620:17:4000::,2620:17:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:17:8000::,2620:17:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:17:c000::,2620:17:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:18::,2620:18::ffff:ffff:ffff:ffff:ffff,US
+2620:18:4000::,2620:18:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:18:8000::,2620:18:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:18:c000::,2620:18:c000:ffff:ffff:ffff:ffff:ffff,KN
+2620:19::,2620:19::ffff:ffff:ffff:ffff:ffff,US
+2620:19:4000::,2620:19:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:19:8000::,2620:19:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:19:c000::,2620:19:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1a::,2620:1a::ffff:ffff:ffff:ffff:ffff,US
+2620:1a:4000::,2620:1a:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1a:8000::,2620:1a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1a:c000::,2620:1a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1b::,2620:1b:f:ffff:ffff:ffff:ffff:ffff,US
+2620:1b:4000::,2620:1b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1b:8000::,2620:1b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1b:c000::,2620:1b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1c::,2620:1c::ffff:ffff:ffff:ffff:ffff,US
+2620:1c:4000::,2620:1c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1c:8000::,2620:1c:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1c:c000::,2620:1c:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1d::,2620:1d::ffff:ffff:ffff:ffff:ffff,US
+2620:1d:4000::,2620:1d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1d:8000::,2620:1d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1d:c000::,2620:1d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1e::,2620:1e::ffff:ffff:ffff:ffff:ffff,US
+2620:1e:4000::,2620:1e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:1e:8000::,2620:1e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1e:c000::,2620:1e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:1f::,2620:1f::ffff:ffff:ffff:ffff:ffff,US
+2620:1f:4000::,2620:1f:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:1f:8000::,2620:1f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:1f:c000::,2620:1f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:20::,2620:20::ffff:ffff:ffff:ffff:ffff,US
+2620:20:4000::,2620:20:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:20:8000::,2620:20:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:20:c000::,2620:20:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:21::,2620:21::ffff:ffff:ffff:ffff:ffff,US
+2620:21:4000::,2620:21:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:21:8000::,2620:21:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:21:c000::,2620:21:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:22::,2620:22::ffff:ffff:ffff:ffff:ffff,US
+2620:22:4000::,2620:22:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:22:8000::,2620:22:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:22:c000::,2620:22:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:23::,2620:23::ffff:ffff:ffff:ffff:ffff,US
+2620:23:4000::,2620:23:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:23:8000::,2620:23:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:23:c000::,2620:23:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:24::,2620:24:1f:ffff:ffff:ffff:ffff:ffff,US
+2620:24:8080::,2620:24:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:25::,2620:25::ffff:ffff:ffff:ffff:ffff,US
+2620:25:4000::,2620:25:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:25:8000::,2620:25:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:25:c000::,2620:25:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:26::,2620:26::ffff:ffff:ffff:ffff:ffff,US
+2620:26:4000::,2620:26:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:26:8000::,2620:26:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:26:c000::,2620:26:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:27::,2620:27:f:ffff:ffff:ffff:ffff:ffff,US
+2620:27:8080::,2620:27:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:28::,2620:28::ffff:ffff:ffff:ffff:ffff,US
+2620:28:4000::,2620:28:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:28:8000::,2620:28:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:28:c000::,2620:28:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:29::,2620:29::ffff:ffff:ffff:ffff:ffff,US
+2620:29:4000::,2620:29:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:29:8000::,2620:29:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:29:c000::,2620:29:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:2a::,2620:2a::ffff:ffff:ffff:ffff:ffff,US
+2620:2a:4000::,2620:2a:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:2a:8000::,2620:2a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2a:c000::,2620:2a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:2b::,2620:2b::ffff:ffff:ffff:ffff:ffff,US
+2620:2b:4000::,2620:2b:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:2b:8000::,2620:2b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2b:c000::,2620:2b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:2c::,2620:2c:f:ffff:ffff:ffff:ffff:ffff,US
+2620:2c:8080::,2620:2c:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:2d::,2620:2d::ffff:ffff:ffff:ffff:ffff,US
+2620:2d:4000::,2620:2d:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:2d:8000::,2620:2d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2d:c000::,2620:2d:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:2e::,2620:2e:3f:ffff:ffff:ffff:ffff:ffff,US
+2620:2e:8080::,2620:2e:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:2f::,2620:2f::ffff:ffff:ffff:ffff:ffff,CA
+2620:2f:4000::,2620:2f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:2f:8000::,2620:2f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:2f:c000::,2620:2f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:30::,2620:30::ffff:ffff:ffff:ffff:ffff,US
+2620:30:4000::,2620:30:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:30:8000::,2620:30:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:30:c000::,2620:30:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:31::,2620:31::ffff:ffff:ffff:ffff:ffff,US
+2620:31:4000::,2620:31:40ff:ffff:ffff:ffff:ffff:ffff,US
+2620:31:8000::,2620:31:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:31:c000::,2620:31:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:32::,2620:32::ffff:ffff:ffff:ffff:ffff,US
+2620:32:4000::,2620:32:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:32:8000::,2620:32:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:32:c000::,2620:32:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:33::,2620:33::ffff:ffff:ffff:ffff:ffff,US
+2620:33:4000::,2620:33:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:33:8000::,2620:33:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:33:c000::,2620:33:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:34::,2620:34::ffff:ffff:ffff:ffff:ffff,US
+2620:34:4000::,2620:34:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:34:8000::,2620:34:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:34:c000::,2620:34:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:35::,2620:35::ffff:ffff:ffff:ffff:ffff,US
+2620:35:4000::,2620:35:400f:ffff:ffff:ffff:ffff:ffff,CA
+2620:35:8000::,2620:35:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:35:c000::,2620:35:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:36::,2620:36::ffff:ffff:ffff:ffff:ffff,US
+2620:36:4000::,2620:36:400f:ffff:ffff:ffff:ffff:ffff,CA
+2620:36:8000::,2620:36:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:36:c000::,2620:36:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:37::,2620:37::ffff:ffff:ffff:ffff:ffff,US
+2620:37:4000::,2620:37:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:37:8000::,2620:37:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:37:c000::,2620:37:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:38::,2620:38::ffff:ffff:ffff:ffff:ffff,US
+2620:38:4000::,2620:38:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:38:8000::,2620:38:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:38:c000::,2620:38:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:39::,2620:39::ffff:ffff:ffff:ffff:ffff,US
+2620:39:4000::,2620:39:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:39:8000::,2620:39:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:39:c000::,2620:39:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:3a::,2620:3a::ffff:ffff:ffff:ffff:ffff,US
+2620:3a:4000::,2620:3a:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:3a:8000::,2620:3a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3a:c000::,2620:3a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:3b::,2620:3b::ffff:ffff:ffff:ffff:ffff,US
+2620:3b:4000::,2620:3b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:3b:8000::,2620:3b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3b:c000::,2620:3b:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:3c::,2620:3c:3f:ffff:ffff:ffff:ffff:ffff,US
+2620:3c:8080::,2620:3c:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:3d::,2620:3d::ffff:ffff:ffff:ffff:ffff,US
+2620:3d:4000::,2620:3d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:3d:8000::,2620:3d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3d:c000::,2620:3d:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:3e::,2620:3e::ffff:ffff:ffff:ffff:ffff,US
+2620:3e:4000::,2620:3e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:3e:8000::,2620:3e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3e:c000::,2620:3e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:3f::,2620:3f::ffff:ffff:ffff:ffff:ffff,US
+2620:3f:4000::,2620:3f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:3f:8000::,2620:3f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:3f:c000::,2620:3f:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:40::,2620:40::ffff:ffff:ffff:ffff:ffff,US
+2620:40:4000::,2620:40:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:40:8000::,2620:40:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:40:c000::,2620:40:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:41::,2620:41:1:ffff:ffff:ffff:ffff:ffff,US
+2620:41:4000::,2620:41:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:41:8000::,2620:41:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:41:c000::,2620:41:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:42::,2620:42::ffff:ffff:ffff:ffff:ffff,US
+2620:42:4000::,2620:42:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:42:c000::,2620:42:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:43::,2620:43::ffff:ffff:ffff:ffff:ffff,US
+2620:43:4000::,2620:43:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:43:8000::,2620:43:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:43:c000::,2620:43:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:44::,2620:44:1:ffff:ffff:ffff:ffff:ffff,US
+2620:44:4000::,2620:44:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:44:8000::,2620:44:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:45::,2620:45::ffff:ffff:ffff:ffff:ffff,CA
+2620:45:4000::,2620:45:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:45:8000::,2620:45:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:45:c000::,2620:45:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:46::,2620:46::ffff:ffff:ffff:ffff:ffff,US
+2620:46:4000::,2620:46:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:46:8000::,2620:46:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:46:c000::,2620:46:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:47::,2620:47::ffff:ffff:ffff:ffff:ffff,US
+2620:47:4000::,2620:47:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:47:8000::,2620:47:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:47:c000::,2620:47:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:48::,2620:48::ffff:ffff:ffff:ffff:ffff,US
+2620:48:4000::,2620:48:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:48:8000::,2620:48:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:48:c000::,2620:48:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:49::,2620:49:f:ffff:ffff:ffff:ffff:ffff,CA
+2620:49:8080::,2620:49:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:4a::,2620:4a::ffff:ffff:ffff:ffff:ffff,US
+2620:4a:4000::,2620:4a:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:4a:8000::,2620:4a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:4a:c000::,2620:4a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:4b::,2620:4b::ffff:ffff:ffff:ffff:ffff,CA
+2620:4b:4000::,2620:4b:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:4b:8000::,2620:4b:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:4b:c000::,2620:4b:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:4c::,2620:4c:1:ffff:ffff:ffff:ffff:ffff,US
+2620:4c:4000::,2620:4c:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:4c:c000::,2620:4c:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:4d::,2620:4d::ffff:ffff:ffff:ffff:ffff,US
+2620:4d:4000::,2620:4d:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:4d:8000::,2620:4d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:4d:c000::,2620:4d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:4e::,2620:4e::ffff:ffff:ffff:ffff:ffff,US
+2620:4e:4000::,2620:4e:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:4e:8000::,2620:4e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:4e:c000::,2620:4e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:4f::,2620:4f::ffff:ffff:ffff:ffff:ffff,US
+2620:4f:4000::,2620:4f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:4f:8000::,2620:4f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:4f:c000::,2620:4f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:50::,2620:50:f:ffff:ffff:ffff:ffff:ffff,US
+2620:50:8080::,2620:50:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:51::,2620:51::ffff:ffff:ffff:ffff:ffff,US
+2620:51:4000::,2620:51:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:51:8000::,2620:51:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:51:c000::,2620:51:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:52::,2620:52:3:ffff:ffff:ffff:ffff:ffff,US
+2620:52:4000::,2620:52:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:52:8000::,2620:52:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:52:c000::,2620:52:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:53::,2620:53::ffff:ffff:ffff:ffff:ffff,US
+2620:53:4000::,2620:53:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:53:8000::,2620:53:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:53:c000::,2620:53:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:54::,2620:54::ffff:ffff:ffff:ffff:ffff,US
+2620:54:4000::,2620:54:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:54:8000::,2620:54:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:54:c000::,2620:54:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:55::,2620:55::ffff:ffff:ffff:ffff:ffff,US
+2620:55:4000::,2620:55:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:55:8000::,2620:55:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:55:c000::,2620:55:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:56::,2620:56::ffff:ffff:ffff:ffff:ffff,US
+2620:56:4000::,2620:56:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:56:8000::,2620:56:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:56:c000::,2620:56:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:57::,2620:57::ffff:ffff:ffff:ffff:ffff,US
+2620:57:4000::,2620:57:400f:ffff:ffff:ffff:ffff:ffff,KY
+2620:57:8000::,2620:57:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:57:c000::,2620:57:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:58::,2620:58:ff:ffff:ffff:ffff:ffff:ffff,US
+2620:58:8800::,2620:58:8800:ffff:ffff:ffff:ffff:ffff,US
+2620:59::,2620:59::ffff:ffff:ffff:ffff:ffff,US
+2620:59:4000::,2620:59:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:59:8000::,2620:59:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:59:c000::,2620:59:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:5a::,2620:5a::ffff:ffff:ffff:ffff:ffff,US
+2620:5a:4000::,2620:5a:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:5a:8000::,2620:5a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5a:c000::,2620:5a:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:5b::,2620:5b::ffff:ffff:ffff:ffff:ffff,US
+2620:5b:4000::,2620:5b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:5b:8000::,2620:5b:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:5b:c000::,2620:5b:c00f:ffff:ffff:ffff:ffff:ffff,CA
+2620:5c::,2620:5c::ffff:ffff:ffff:ffff:ffff,US
+2620:5c:4000::,2620:5c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:5c:8000::,2620:5c:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5c:c000::,2620:5c:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:5d::,2620:5d::ffff:ffff:ffff:ffff:ffff,US
+2620:5d:4000::,2620:5d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:5d:8000::,2620:5d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5d:c000::,2620:5d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:5e::,2620:5e::ffff:ffff:ffff:ffff:ffff,US
+2620:5e:4000::,2620:5e:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:5e:8000::,2620:5e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5e:c000::,2620:5e:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:5f::,2620:5f::ffff:ffff:ffff:ffff:ffff,US
+2620:5f:4000::,2620:5f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:5f:8000::,2620:5f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:5f:c000::,2620:5f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:60::,2620:60::ffff:ffff:ffff:ffff:ffff,US
+2620:60:4000::,2620:60:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:60:8000::,2620:60:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:60:c000::,2620:60:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:61::,2620:61::ffff:ffff:ffff:ffff:ffff,CA
+2620:61:4000::,2620:61:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:61:8000::,2620:61:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:61:c000::,2620:61:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:62::,2620:62::ffff:ffff:ffff:ffff:ffff,US
+2620:62:4000::,2620:62:400f:ffff:ffff:ffff:ffff:ffff,CA
+2620:62:8000::,2620:62:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:62:c000::,2620:62:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:63::,2620:63::ffff:ffff:ffff:ffff:ffff,US
+2620:63:4000::,2620:63:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:63:8000::,2620:63:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:63:c000::,2620:63:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:64::,2620:64::ffff:ffff:ffff:ffff:ffff,US
+2620:64:4000::,2620:64:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:64:8000::,2620:64:8000:ffff:ffff:ffff:ffff:ffff,TW
+2620:64:c000::,2620:64:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:65::,2620:65:ff:ffff:ffff:ffff:ffff:ffff,US
+2620:65:8000::,2620:65:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:65:c000::,2620:65:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:66::,2620:66::ffff:ffff:ffff:ffff:ffff,CA
+2620:66:4000::,2620:66:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:66:8000::,2620:66:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:66:c000::,2620:66:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:67::,2620:67::ffff:ffff:ffff:ffff:ffff,US
+2620:67:4000::,2620:67:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:67:8000::,2620:67:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:67:c000::,2620:67:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:68::,2620:68::ffff:ffff:ffff:ffff:ffff,US
+2620:68:4000::,2620:68:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:68:8000::,2620:68:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:68:c000::,2620:68:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:69:4000::,2620:69:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:69:8000::,2620:69:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:69:c000::,2620:69:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:6a::,2620:6a::ffff:ffff:ffff:ffff:ffff,US
+2620:6a:4000::,2620:6a:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:6a:8000::,2620:6a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:6a:c000::,2620:6a:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:6b::,2620:6b::ffff:ffff:ffff:ffff:ffff,US
+2620:6b:4000::,2620:6b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:6b:8000::,2620:6b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:6b:c000::,2620:6b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:6c::,2620:6c:3f:ffff:ffff:ffff:ffff:ffff,US
+2620:6c:8080::,2620:6c:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:6d:40::,2620:6d:40:ffff:ffff:ffff:ffff:ffff,US
+2620:6d:8000::,2620:6d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:6d:c000::,2620:6d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:6e::,2620:6e::ffff:ffff:ffff:ffff:ffff,US
+2620:6e:4000::,2620:6e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:6e:8000::,2620:6e:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:6e:c000::,2620:6e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:6f::,2620:6f::ffff:ffff:ffff:ffff:ffff,US
+2620:6f:4000::,2620:6f:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:6f:8000::,2620:6f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:6f:c000::,2620:6f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:70::,2620:70::ffff:ffff:ffff:ffff:ffff,US
+2620:70:4000::,2620:70:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:70:8000::,2620:70:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:70:c000::,2620:70:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:71::,2620:71::ffff:ffff:ffff:ffff:ffff,US
+2620:71:4000::,2620:71:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:71:8000::,2620:71:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:71:c000::,2620:71:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:72::,2620:72::ffff:ffff:ffff:ffff:ffff,US
+2620:72:4000::,2620:72:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:72:8000::,2620:72:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:72:c000::,2620:72:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:73::,2620:73::ffff:ffff:ffff:ffff:ffff,US
+2620:73:4000::,2620:73:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:73:8000::,2620:73:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:73:c000::,2620:73:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:74::,2620:74:1f:ffff:ffff:ffff:ffff:ffff,US
+2620:74:8080::,2620:74:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:75::,2620:75::ffff:ffff:ffff:ffff:ffff,US
+2620:75:4000::,2620:75:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:75:8000::,2620:75:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:75:c000::,2620:75:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:76::,2620:76::ffff:ffff:ffff:ffff:ffff,US
+2620:76:4000::,2620:76:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:76:8000::,2620:76:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:76:c000::,2620:76:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:77::,2620:77::ffff:ffff:ffff:ffff:ffff,US
+2620:77:4000::,2620:77:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:77:8000::,2620:77:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:77:c000::,2620:77:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:78::,2620:78::ffff:ffff:ffff:ffff:ffff,US
+2620:78:4000::,2620:78:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:78:8000::,2620:78:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:78:c000::,2620:78:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:79::,2620:79::ffff:ffff:ffff:ffff:ffff,US
+2620:79:4000::,2620:79:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:79:8000::,2620:79:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:79:c000::,2620:79:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:7a::,2620:7a::ffff:ffff:ffff:ffff:ffff,US
+2620:7a:4000::,2620:7a:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:7a:8000::,2620:7a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:7a:c000::,2620:7a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:7b::,2620:7b::ffff:ffff:ffff:ffff:ffff,US
+2620:7b:4000::,2620:7b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:7b:8000::,2620:7b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:7b:e000::,2620:7b:e000:ffff:ffff:ffff:ffff:ffff,US
+2620:7c:4000::,2620:7c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:7c:a000::,2620:7c:a000:ffff:ffff:ffff:ffff:ffff,US
+2620:7d::,2620:7d::ffff:ffff:ffff:ffff:ffff,US
+2620:7d:4000::,2620:7d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:7d:8000::,2620:7d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:7d:c000::,2620:7d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:7e::,2620:7e:f:ffff:ffff:ffff:ffff:ffff,US
+2620:7e:60c0::,2620:7e:60c0:ffff:ffff:ffff:ffff:ffff,US
+2620:7e:c080::,2620:7e:c080:ffff:ffff:ffff:ffff:ffff,US
+2620:7f:2040::,2620:7f:2040:ffff:ffff:ffff:ffff:ffff,US
+2620:7f:8000::,2620:7f:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:7f:c000::,2620:7f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:80:4000::,2620:80:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:80:8000::,2620:80:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:80:c000::,2620:80:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:81::,2620:81::ffff:ffff:ffff:ffff:ffff,US
+2620:81:4000::,2620:81:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:81:8000::,2620:81:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:81:c000::,2620:81:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:82:4000::,2620:82:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:82:8000::,2620:82:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:82:c000::,2620:82:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:83::,2620:83::ffff:ffff:ffff:ffff:ffff,US
+2620:83:4000::,2620:83:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:83:8000::,2620:83:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:83:c000::,2620:83:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:84::,2620:84:1:ffff:ffff:ffff:ffff:ffff,US
+2620:84:4000::,2620:84:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:84:8000::,2620:84:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:84:c000::,2620:84:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:85::,2620:85::ffff:ffff:ffff:ffff:ffff,US
+2620:85:4000::,2620:85:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:85:8000::,2620:85:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:85:c000::,2620:85:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:86::,2620:86::ffff:ffff:ffff:ffff:ffff,US
+2620:86:4000::,2620:86:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:86:8000::,2620:86:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:86:c000::,2620:86:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:87::,2620:87::ffff:ffff:ffff:ffff:ffff,US
+2620:87:4000::,2620:87:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:87:8000::,2620:87:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:87:c000::,2620:87:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:88::,2620:88::ffff:ffff:ffff:ffff:ffff,US
+2620:88:4000::,2620:88:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:88:8000::,2620:88:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:88:c000::,2620:88:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:89::,2620:89::ffff:ffff:ffff:ffff:ffff,US
+2620:89:4000::,2620:89:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:89:8000::,2620:89:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:89:c000::,2620:89:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8a::,2620:8a::ffff:ffff:ffff:ffff:ffff,US
+2620:8a:4000::,2620:8a:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:8a:8000::,2620:8a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:8a:c000::,2620:8a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8b::,2620:8b::ffff:ffff:ffff:ffff:ffff,US
+2620:8b:4000::,2620:8b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:8b:8000::,2620:8b:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:8b:c000::,2620:8b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8c:4000::,2620:8c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:8c:8000::,2620:8c:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:8c:c000::,2620:8c:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8d::,2620:8d::ffff:ffff:ffff:ffff:ffff,US
+2620:8d:4000::,2620:8d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:8d:8000::,2620:8d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:8d:c000::,2620:8d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8e::,2620:8e::ffff:ffff:ffff:ffff:ffff,US
+2620:8e:4000::,2620:8e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:8e:8000::,2620:8e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:8e:c000::,2620:8e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:8f::,2620:8f::ffff:ffff:ffff:ffff:ffff,US
+2620:8f:4000::,2620:8f:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:8f:8000::,2620:8f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:8f:c000::,2620:8f:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:90::,2620:90::ffff:ffff:ffff:ffff:ffff,CA
+2620:90:4000::,2620:90:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:90:8000::,2620:90:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:90:c000::,2620:90:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:91::,2620:91::ffff:ffff:ffff:ffff:ffff,US
+2620:91:4000::,2620:91:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:91:8000::,2620:91:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:91:c000::,2620:91:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:92::,2620:92:f:ffff:ffff:ffff:ffff:ffff,US
+2620:92:4000::,2620:92:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:92:8000::,2620:92:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:92:c000::,2620:92:c000:ffff:ffff:ffff:ffff:ffff,CA
+2620:93::,2620:93::ffff:ffff:ffff:ffff:ffff,US
+2620:93:4000::,2620:93:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:93:8000::,2620:93:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:93:c000::,2620:93:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:94::,2620:94::ffff:ffff:ffff:ffff:ffff,US
+2620:94:4000::,2620:94:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:94:8000::,2620:94:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:94:c000::,2620:94:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:95::,2620:95::ffff:ffff:ffff:ffff:ffff,US
+2620:95:4000::,2620:95:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:95:8000::,2620:95:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:95:c000::,2620:95:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:96::,2620:96::ffff:ffff:ffff:ffff:ffff,US
+2620:96:4000::,2620:96:400f:ffff:ffff:ffff:ffff:ffff,CA
+2620:96:8000::,2620:96:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:96:c000::,2620:96:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:97::,2620:97::ffff:ffff:ffff:ffff:ffff,US
+2620:97:4000::,2620:97:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:97:8000::,2620:97:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:97:c000::,2620:97:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:98::,2620:98::ffff:ffff:ffff:ffff:ffff,US
+2620:98:4000::,2620:98:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:98:8000::,2620:98:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:98:c000::,2620:98:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:99::,2620:99::ffff:ffff:ffff:ffff:ffff,US
+2620:99:4000::,2620:99:4000:ffff:ffff:ffff:ffff:ffff,CA
+2620:99:8000::,2620:99:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:99:c000::,2620:99:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9a::,2620:9a::ffff:ffff:ffff:ffff:ffff,CA
+2620:9a:4000::,2620:9a:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9a:8000::,2620:9a:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9a:c000::,2620:9a:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9b:4000::,2620:9b:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9b:8000::,2620:9b:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9b:c000::,2620:9b:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9c::,2620:9c::ffff:ffff:ffff:ffff:ffff,US
+2620:9c:4000::,2620:9c:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9c:8000::,2620:9c:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9c:c000::,2620:9c:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9d::,2620:9d::ffff:ffff:ffff:ffff:ffff,US
+2620:9d:4000::,2620:9d:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9d:8000::,2620:9d:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9d:c000::,2620:9d:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9e::,2620:9e::ffff:ffff:ffff:ffff:ffff,US
+2620:9e:4000::,2620:9e:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:9e:8000::,2620:9e:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9e:c000::,2620:9e:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:9f::,2620:9f:ff:ffff:ffff:ffff:ffff:ffff,US
+2620:9f:8000::,2620:9f:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:9f:c000::,2620:9f:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:a0::,2620:a0::ffff:ffff:ffff:ffff:ffff,US
+2620:a0:4000::,2620:a0:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:a0:8000::,2620:a0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a0:c000::,2620:a0:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:a1::,2620:a1::ffff:ffff:ffff:ffff:ffff,US
+2620:a1:4000::,2620:a1:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:a1:8000::,2620:a1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a1:c000::,2620:a1:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:a2::,2620:a2::ffff:ffff:ffff:ffff:ffff,US
+2620:a2:4000::,2620:a2:4000:ffff:ffff:ffff:ffff:ffff,US
+2620:a2:8000::,2620:a2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a2:c000::,2620:a2:c000:ffff:ffff:ffff:ffff:ffff,US
+2620:a3::,2620:a3::ffff:ffff:ffff:ffff:ffff,US
+2620:a3:4000::,2620:a3:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:a3:8000::,2620:a3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a3:c020::,2620:a3:c020:ffff:ffff:ffff:ffff:ffff,US
+2620:a4:40::,2620:a4:40:ffff:ffff:ffff:ffff:ffff,US
+2620:a4:4060::,2620:a4:4060:ffff:ffff:ffff:ffff:ffff,US
+2620:a4:8080::,2620:a4:8080:ffff:ffff:ffff:ffff:ffff,US
+2620:a5::,2620:a5::ffff:ffff:ffff:ffff:ffff,US
+2620:a5:8000::,2620:a5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a6::,2620:a6::ffff:ffff:ffff:ffff:ffff,US
+2620:a6:8000::,2620:a6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a7::,2620:a7::ffff:ffff:ffff:ffff:ffff,US
+2620:a7:8000::,2620:a7:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a8::,2620:a8::ffff:ffff:ffff:ffff:ffff,US
+2620:a8:8000::,2620:a8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:a9::,2620:a9::ffff:ffff:ffff:ffff:ffff,US
+2620:a9:8000::,2620:a9:800f:ffff:ffff:ffff:ffff:ffff,US
+2620:aa::,2620:aa::ffff:ffff:ffff:ffff:ffff,US
+2620:aa:8000::,2620:aa:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ab::,2620:ab::ffff:ffff:ffff:ffff:ffff,US
+2620:ab:8000::,2620:ab:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ac::,2620:ac::ffff:ffff:ffff:ffff:ffff,US
+2620:ac:8000::,2620:ac:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ad::,2620:ad::ffff:ffff:ffff:ffff:ffff,US
+2620:ad:8000::,2620:ad:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ae::,2620:ae::ffff:ffff:ffff:ffff:ffff,CA
+2620:ae:8000::,2620:ae:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:af::,2620:af::ffff:ffff:ffff:ffff:ffff,US
+2620:af:8000::,2620:af:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b0::,2620:b0::ffff:ffff:ffff:ffff:ffff,CA
+2620:b0:8000::,2620:b0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b1::,2620:b1::ffff:ffff:ffff:ffff:ffff,US
+2620:b1:8000::,2620:b1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b2::,2620:b2::ffff:ffff:ffff:ffff:ffff,US
+2620:b2:8000::,2620:b2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b3::,2620:b3::ffff:ffff:ffff:ffff:ffff,US
+2620:b3:8000::,2620:b3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b4::,2620:b4::ffff:ffff:ffff:ffff:ffff,US
+2620:b4:8000::,2620:b4:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:b5::,2620:b5::ffff:ffff:ffff:ffff:ffff,US
+2620:b5:8000::,2620:b5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b6::,2620:b6::ffff:ffff:ffff:ffff:ffff,US
+2620:b6:8000::,2620:b6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b7::,2620:b7::ffff:ffff:ffff:ffff:ffff,US
+2620:b7:8000::,2620:b7:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:b8::,2620:b8::ffff:ffff:ffff:ffff:ffff,US
+2620:b8:8000::,2620:b8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:b9::,2620:b9::ffff:ffff:ffff:ffff:ffff,US
+2620:b9:8000::,2620:b9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ba::,2620:ba::ffff:ffff:ffff:ffff:ffff,US
+2620:ba:8000::,2620:ba:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:bb::,2620:bb::ffff:ffff:ffff:ffff:ffff,US
+2620:bb:8000::,2620:bb:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:bc:8000::,2620:bc:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:bd::,2620:bd::ffff:ffff:ffff:ffff:ffff,CA
+2620:bd:8000::,2620:bd:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:be::,2620:be::ffff:ffff:ffff:ffff:ffff,US
+2620:be:8000::,2620:be:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:bf::,2620:bf::ffff:ffff:ffff:ffff:ffff,US
+2620:bf:8000::,2620:bf:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c0::,2620:c0::ffff:ffff:ffff:ffff:ffff,US
+2620:c0:8000::,2620:c0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c1::,2620:c1::ffff:ffff:ffff:ffff:ffff,US
+2620:c1:8000::,2620:c1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c2::,2620:c2::ffff:ffff:ffff:ffff:ffff,CA
+2620:c2:8000::,2620:c2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c3::,2620:c3::ffff:ffff:ffff:ffff:ffff,US
+2620:c3:8000::,2620:c3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c4::,2620:c4::ffff:ffff:ffff:ffff:ffff,US
+2620:c4:8000::,2620:c4:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c5::,2620:c5::ffff:ffff:ffff:ffff:ffff,US
+2620:c5:8000::,2620:c5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c6::,2620:c6::ffff:ffff:ffff:ffff:ffff,US
+2620:c6:8000::,2620:c6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c7::,2620:c7::ffff:ffff:ffff:ffff:ffff,US
+2620:c7:8000::,2620:c7:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c8::,2620:c8::ffff:ffff:ffff:ffff:ffff,US
+2620:c8:8000::,2620:c8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:c9::,2620:c9::ffff:ffff:ffff:ffff:ffff,US
+2620:c9:8000::,2620:c9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ca::,2620:ca::ffff:ffff:ffff:ffff:ffff,US
+2620:ca:8000::,2620:ca:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:cb::,2620:cb::ffff:ffff:ffff:ffff:ffff,US
+2620:cb:8000::,2620:cb:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:cc::,2620:cc::ffff:ffff:ffff:ffff:ffff,US
+2620:cc:8000::,2620:cc:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:cd::,2620:cd::ffff:ffff:ffff:ffff:ffff,US
+2620:cd:8000::,2620:cd:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ce::,2620:ce::ffff:ffff:ffff:ffff:ffff,US
+2620:ce:8000::,2620:ce:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:cf::,2620:cf::ffff:ffff:ffff:ffff:ffff,US
+2620:cf:8000::,2620:cf:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d0::,2620:d0::ffff:ffff:ffff:ffff:ffff,US
+2620:d0:8000::,2620:d0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d1::,2620:d1::ffff:ffff:ffff:ffff:ffff,US
+2620:d1:8000::,2620:d1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d2::,2620:d2::ffff:ffff:ffff:ffff:ffff,US
+2620:d2:8000::,2620:d2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d3::,2620:d3::ffff:ffff:ffff:ffff:ffff,US
+2620:d3:8000::,2620:d3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d4::,2620:d4::ffff:ffff:ffff:ffff:ffff,US
+2620:d4:8000::,2620:d4:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d5::,2620:d5::ffff:ffff:ffff:ffff:ffff,US
+2620:d5:8000::,2620:d5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d6::,2620:d6::ffff:ffff:ffff:ffff:ffff,US
+2620:d6:8000::,2620:d6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d7::,2620:d7::ffff:ffff:ffff:ffff:ffff,US
+2620:d7:8000::,2620:d7:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d8::,2620:d8::ffff:ffff:ffff:ffff:ffff,US
+2620:d8:8000::,2620:d8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:d9::,2620:d9::ffff:ffff:ffff:ffff:ffff,US
+2620:d9:8000::,2620:d9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:da::,2620:da::ffff:ffff:ffff:ffff:ffff,US
+2620:da:8000::,2620:da:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:db::,2620:db::ffff:ffff:ffff:ffff:ffff,US
+2620:db:8000::,2620:db:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:dc::,2620:dc::ffff:ffff:ffff:ffff:ffff,US
+2620:dc:8::,2620:dc:8:ffff:ffff:ffff:ffff:ffff,US
+2620:dc:8000::,2620:dc:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:dd::,2620:dd::ffff:ffff:ffff:ffff:ffff,CA
+2620:dd:8000::,2620:dd:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:de::,2620:de::ffff:ffff:ffff:ffff:ffff,US
+2620:de:8000::,2620:de:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:df::,2620:df::ffff:ffff:ffff:ffff:ffff,US
+2620:df:8000::,2620:df:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e0::,2620:e0::ffff:ffff:ffff:ffff:ffff,US
+2620:e0:8000::,2620:e0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e1::,2620:e1::ffff:ffff:ffff:ffff:ffff,US
+2620:e1:8000::,2620:e1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e2::,2620:e2::ffff:ffff:ffff:ffff:ffff,US
+2620:e2:8000::,2620:e2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e3::,2620:e3::ffff:ffff:ffff:ffff:ffff,US
+2620:e3:8000::,2620:e3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e4::,2620:e4::ffff:ffff:ffff:ffff:ffff,US
+2620:e4:8000::,2620:e4:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e5::,2620:e5::ffff:ffff:ffff:ffff:ffff,US
+2620:e5:8000::,2620:e5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e6::,2620:e6::ffff:ffff:ffff:ffff:ffff,US
+2620:e6:8000::,2620:e6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e7::,2620:e7::ffff:ffff:ffff:ffff:ffff,US
+2620:e7:8000::,2620:e7:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:e8::,2620:e8::ffff:ffff:ffff:ffff:ffff,US
+2620:e8:8000::,2620:e8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:e9::,2620:e9::ffff:ffff:ffff:ffff:ffff,US
+2620:e9:8000::,2620:e9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ea::,2620:ea:f:ffff:ffff:ffff:ffff:ffff,US
+2620:ea:8000::,2620:ea:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:eb::,2620:eb::ffff:ffff:ffff:ffff:ffff,US
+2620:eb:8000::,2620:eb:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ec::,2620:ec::ffff:ffff:ffff:ffff:ffff,US
+2620:ec:8000::,2620:ec:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ed::,2620:ed::ffff:ffff:ffff:ffff:ffff,US
+2620:ed:8000::,2620:ed:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ee::,2620:ee::ffff:ffff:ffff:ffff:ffff,US
+2620:ee:8000::,2620:ee:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ef::,2620:ef::ffff:ffff:ffff:ffff:ffff,US
+2620:ef:8000::,2620:ef:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f0::,2620:f0::ffff:ffff:ffff:ffff:ffff,US
+2620:f0:8000::,2620:f0:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f1::,2620:f1::ffff:ffff:ffff:ffff:ffff,US
+2620:f1:8000::,2620:f1:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f2::,2620:f2::ffff:ffff:ffff:ffff:ffff,CA
+2620:f2:8000::,2620:f2:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f3::,2620:f3::ffff:ffff:ffff:ffff:ffff,US
+2620:f3:8000::,2620:f3:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f4::,2620:f4::ffff:ffff:ffff:ffff:ffff,US
+2620:f4:8000::,2620:f4:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:f5::,2620:f5::ffff:ffff:ffff:ffff:ffff,US
+2620:f5:8000::,2620:f5:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f6::,2620:f6::ffff:ffff:ffff:ffff:ffff,CA
+2620:f6:8000::,2620:f6:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f7::,2620:f7::ffff:ffff:ffff:ffff:ffff,US
+2620:f7:8000::,2620:f7:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f8::,2620:f8::ffff:ffff:ffff:ffff:ffff,US
+2620:f8:8000::,2620:f8:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:f9::,2620:f9:f:ffff:ffff:ffff:ffff:ffff,US
+2620:f9:8000::,2620:f9:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:fa::,2620:fa::ffff:ffff:ffff:ffff:ffff,US
+2620:fa:8000::,2620:fa:8000:ffff:ffff:ffff:ffff:ffff,CA
+2620:fb::,2620:fb::ffff:ffff:ffff:ffff:ffff,US
+2620:fb:8000::,2620:fb:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:fc::,2620:fc::ffff:ffff:ffff:ffff:ffff,CA
+2620:fc:8000::,2620:fc:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:fd::,2620:fd::ffff:ffff:ffff:ffff:ffff,CA
+2620:fd:8000::,2620:fd:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:fe::,2620:fe:ff:ffff:ffff:ffff:ffff:ffff,US
+2620:fe:8000::,2620:fe:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:ff::,2620:ff::ffff:ffff:ffff:ffff:ffff,US
+2620:ff:8000::,2620:ff:8000:ffff:ffff:ffff:ffff:ffff,US
+2620:100::,2620:100:f:ffff:ffff:ffff:ffff:ffff,US
2620:100:1000::,2620:100:1001:ffff:ffff:ffff:ffff:ffff,US
2620:100:3000::,2620:100:3007:ffff:ffff:ffff:ffff:ffff,US
2620:100:4000::,2620:100:403f:ffff:ffff:ffff:ffff:ffff,US
@@ -5121,7 +9797,9 @@
2620:101:6000::,2620:101:6001:ffff:ffff:ffff:ffff:ffff,US
2620:101:7000::,2620:101:7001:ffff:ffff:ffff:ffff:ffff,US
2620:101:8000::,2620:101:80ff:ffff:ffff:ffff:ffff:ffff,US
-2620:101:9000::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US
+2620:101:9000::,2620:101:9004:ffff:ffff:ffff:ffff:ffff,US
+2620:101:9005::,2620:101:9005:ffff:ffff:ffff:ffff:ffff,CA
+2620:101:9006::,2620:101:900f:ffff:ffff:ffff:ffff:ffff,US
2620:101:a000::,2620:101:a001:ffff:ffff:ffff:ffff:ffff,US
2620:101:b000::,2620:101:b07f:ffff:ffff:ffff:ffff:ffff,US
2620:101:c000::,2620:101:c00f:ffff:ffff:ffff:ffff:ffff,CA
@@ -5143,7 +9821,6 @@
2620:102:d000::,2620:102:d07f:ffff:ffff:ffff:ffff:ffff,US
2620:102:e000::,2620:102:e00f:ffff:ffff:ffff:ffff:ffff,US
2620:102:f000::,2620:102:f003:ffff:ffff:ffff:ffff:ffff,US
-2620:103::,2620:103:7:ffff:ffff:ffff:ffff:ffff,US
2620:103:1000::,2620:103:100f:ffff:ffff:ffff:ffff:ffff,US
2620:103:2000::,2620:103:200f:ffff:ffff:ffff:ffff:ffff,CA
2620:103:3000::,2620:103:30ff:ffff:ffff:ffff:ffff:ffff,US
@@ -5162,7 +9839,8 @@
2620:104:1000::,2620:104:100f:ffff:ffff:ffff:ffff:ffff,US
2620:104:2000::,2620:104:20ff:ffff:ffff:ffff:ffff:ffff,US
2620:104:3000::,2620:104:300f:ffff:ffff:ffff:ffff:ffff,US
-2620:104:4000::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:104:4000::,2620:104:4000:ffff:ffff:ffff:ffff:ffff,GB
+2620:104:4001::,2620:104:400f:ffff:ffff:ffff:ffff:ffff,US
2620:104:5000::,2620:104:500f:ffff:ffff:ffff:ffff:ffff,US
2620:104:6000::,2620:104:600f:ffff:ffff:ffff:ffff:ffff,US
2620:104:7000::,2620:104:70ff:ffff:ffff:ffff:ffff:ffff,US
@@ -5426,7 +10104,7 @@
2620:115::,2620:115:f:ffff:ffff:ffff:ffff:ffff,US
2620:115:1000::,2620:115:100f:ffff:ffff:ffff:ffff:ffff,US
2620:115:2000::,2620:115:200f:ffff:ffff:ffff:ffff:ffff,US
-2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,KY
+2620:115:3000::,2620:115:300f:ffff:ffff:ffff:ffff:ffff,US
2620:115:4000::,2620:115:40ff:ffff:ffff:ffff:ffff:ffff,US
2620:115:5000::,2620:115:500f:ffff:ffff:ffff:ffff:ffff,US
2620:115:6000::,2620:115:600f:ffff:ffff:ffff:ffff:ffff,US
@@ -5526,6 +10204,41 @@
2620:11b:4000::,2620:11b:40ff:ffff:ffff:ffff:ffff:ffff,US
2620:11b:5000::,2620:11b:500f:ffff:ffff:ffff:ffff:ffff,US
2620:11b:6000::,2620:11b:600f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:7000::,2620:11b:700f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:8000::,2620:11b:80ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:9000::,2620:11b:900f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:a000::,2620:11b:a00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:b000::,2620:11b:b00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:c000::,2620:11b:c00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:d000::,2620:11b:d0ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:e000::,2620:11b:e0ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11b:f000::,2620:11b:f0ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11c::,2620:11c:f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:1000::,2620:11c:10ff:ffff:ffff:ffff:ffff:ffff,BB
+2620:11c:2000::,2620:11c:20ff:ffff:ffff:ffff:ffff:ffff,CA
+2620:11c:3000::,2620:11c:30ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:4000::,2620:11c:40ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:5000::,2620:11c:500f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:6000::,2620:11c:600f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:7000::,2620:11c:700f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:8000::,2620:11c:80ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:9000::,2620:11c:900f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:a000::,2620:11c:a00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:b000::,2620:11c:b00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:c000::,2620:11c:c00f:ffff:ffff:ffff:ffff:ffff,CA
+2620:11c:d000::,2620:11c:d00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:e000::,2620:11c:e00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11c:f000::,2620:11c:f00f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d::,2620:11d:f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:1000::,2620:11d:100f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:2000::,2620:11d:20ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:3000::,2620:11d:300f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:4000::,2620:11d:400f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:5000::,2620:11d:500f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:6000::,2620:11d:60ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:7000::,2620:11d:700f:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:8000::,2620:11d:80ff:ffff:ffff:ffff:ffff:ffff,US
+2620:11d:9000::,2620:11d:900f:ffff:ffff:ffff:ffff:ffff,US
2620:140::,2620:140:3ff:ffff:ffff:ffff:ffff:ffff,US
2620:141::,2620:141:fff:ffff:ffff:ffff:ffff:ffff,US
2620:143::,2620:143:7ff:ffff:ffff:ffff:ffff:ffff,US
@@ -5575,7 +10288,7 @@
2620:176::,2620:177:fff:ffff:ffff:ffff:ffff:ffff,US
2620:178::,2620:178:fff:ffff:ffff:ffff:ffff:ffff,US
2620:179::,2620:179:fff:ffff:ffff:ffff:ffff:ffff,US
-2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:17a::,2620:17a:fff:ffff:ffff:ffff:ffff:ffff,FR
2620:17b::,2620:17b:fff:ffff:ffff:ffff:ffff:ffff,US
2620:17c::,2620:17c:fff:ffff:ffff:ffff:ffff:ffff,US
2620:17e::,2620:17e:fff:ffff:ffff:ffff:ffff:ffff,US
@@ -5587,6 +10300,12 @@
2620:1d0::,2620:1d0:ffff:ffff:ffff:ffff:ffff:ffff,US
2620:1e0::,2620:1e1:fff:ffff:ffff:ffff:ffff:ffff,US
2620:1e2::,2620:1e2:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:1e3::,2620:1e3:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:1e4::,2620:1e4:ffff:ffff:ffff:ffff:ffff:ffff,CA
+2620:1e5::,2620:1e5:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:1e6::,2620:1e6:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:1e7::,2620:1e7:fff:ffff:ffff:ffff:ffff:ffff,US
+2620:1e8::,2620:1e8:fff:ffff:ffff:ffff:ffff:ffff,US
2620:1f0::,2620:1f1:fff:ffff:ffff:ffff:ffff:ffff,US
2620:1f2::,2620:1f4:fff:ffff:ffff:ffff:ffff:ffff,US
2620:1f5::,2620:1f5:fff:ffff:ffff:ffff:ffff:ffff,CA
@@ -5875,84 +10594,104 @@
2801:10::,2801:10:7:ffff:ffff:ffff:ffff:ffff,AR
2801:10:2000::,2801:10:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:4000::,2801:10:4000:ffff:ffff:ffff:ffff:ffff,AR
+2801:10:6000::,2801:10:6000:ffff:ffff:ffff:ffff:ffff,HN
2801:10:8000::,2801:10:8000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:a000::,2801:10:a000:ffff:ffff:ffff:ffff:ffff,AR
2801:10:c000::,2801:10:c000:ffff:ffff:ffff:ffff:ffff,CO
2801:11::,2801:11::ffff:ffff:ffff:ffff:ffff,AR
2801:11:2000::,2801:11:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:11:4000::,2801:11:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:11:6000::,2801:11:6000:ffff:ffff:ffff:ffff:ffff,AR
2801:11:8000::,2801:11:8000:ffff:ffff:ffff:ffff:ffff,CO
2801:11:a000::,2801:11:a000:ffff:ffff:ffff:ffff:ffff,VE
2801:11:c000::,2801:11:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:12::,2801:12::ffff:ffff:ffff:ffff:ffff,PY
2801:12:2000::,2801:12:2000:ffff:ffff:ffff:ffff:ffff,HN
2801:12:4000::,2801:12:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:12:6000::,2801:12:6000:ffff:ffff:ffff:ffff:ffff,SV
2801:12:8000::,2801:12:8000:ffff:ffff:ffff:ffff:ffff,AR
-2801:12:a000::,2801:12:a000:ffff:ffff:ffff:ffff:ffff,CL
+2801:12:a000::,2801:12:a00f:ffff:ffff:ffff:ffff:ffff,CL
2801:12:c000::,2801:12:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:13::,2801:13::ffff:ffff:ffff:ffff:ffff,VE
2801:13:2000::,2801:13:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:13:4000::,2801:13:4000:ffff:ffff:ffff:ffff:ffff,CL
+2801:13:6000::,2801:13:6000:ffff:ffff:ffff:ffff:ffff,GT
2801:13:8000::,2801:13:8000:ffff:ffff:ffff:ffff:ffff,SV
+2801:13:a000::,2801:13:a000:ffff:ffff:ffff:ffff:ffff,CO
2801:13:c000::,2801:13:c000:ffff:ffff:ffff:ffff:ffff,TT
2801:14::,2801:14::ffff:ffff:ffff:ffff:ffff,CO
2801:14:2000::,2801:14:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:14:4000::,2801:14:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:14:6000::,2801:14:6000:ffff:ffff:ffff:ffff:ffff,BO
2801:14:a000::,2801:14:a001:ffff:ffff:ffff:ffff:ffff,UY
2801:14:c000::,2801:14:c000:ffff:ffff:ffff:ffff:ffff,BO
2801:15::,2801:15::ffff:ffff:ffff:ffff:ffff,EC
2801:15:2000::,2801:15:2000:ffff:ffff:ffff:ffff:ffff,CR
2801:15:4000::,2801:15:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:15:6000::,2801:15:6000:ffff:ffff:ffff:ffff:ffff,SV
2801:15:8000::,2801:15:8000:ffff:ffff:ffff:ffff:ffff,CR
+2801:15:a000::,2801:15:a000:ffff:ffff:ffff:ffff:ffff,DO
2801:15:c000::,2801:15:c000:ffff:ffff:ffff:ffff:ffff,GT
2801:16::,2801:16::ffff:ffff:ffff:ffff:ffff,CW
2801:16:2000::,2801:16:2000:ffff:ffff:ffff:ffff:ffff,HN
2801:16:4000::,2801:16:4000:ffff:ffff:ffff:ffff:ffff,AR
+2801:16:6000::,2801:16:6000:ffff:ffff:ffff:ffff:ffff,AR
2801:16:8000::,2801:16:8000:ffff:ffff:ffff:ffff:ffff,CO
2801:16:a000::,2801:16:a000:ffff:ffff:ffff:ffff:ffff,CR
2801:16:c000::,2801:16:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:17::,2801:17::ffff:ffff:ffff:ffff:ffff,CL
2801:17:2000::,2801:17:2000:ffff:ffff:ffff:ffff:ffff,PY
2801:17:4000::,2801:17:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:17:6000::,2801:17:6000:ffff:ffff:ffff:ffff:ffff,AR
2801:17:8000::,2801:17:8000:ffff:ffff:ffff:ffff:ffff,CR
+2801:17:a000::,2801:17:a000:ffff:ffff:ffff:ffff:ffff,HT
2801:17:c000::,2801:17:c000:ffff:ffff:ffff:ffff:ffff,PA
2801:18::,2801:18::ffff:ffff:ffff:ffff:ffff,CR
2801:18:2000::,2801:18:2000:ffff:ffff:ffff:ffff:ffff,CO
2801:18:4000::,2801:18:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:18:6000::,2801:18:6000:ffff:ffff:ffff:ffff:ffff,AR
2801:18:8000::,2801:18:8000:ffff:ffff:ffff:ffff:ffff,AR
2801:18:a000::,2801:18:a000:ffff:ffff:ffff:ffff:ffff,BO
2801:18:c000::,2801:18:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:19::,2801:19::ffff:ffff:ffff:ffff:ffff,AR
2801:19:2000::,2801:19:2000:ffff:ffff:ffff:ffff:ffff,CL
2801:19:4000::,2801:19:4000:ffff:ffff:ffff:ffff:ffff,PY
+2801:19:6000::,2801:19:6000:ffff:ffff:ffff:ffff:ffff,CW
2801:19:8000::,2801:19:8000:ffff:ffff:ffff:ffff:ffff,EC
2801:19:a000::,2801:19:a000:ffff:ffff:ffff:ffff:ffff,BO
2801:19:c000::,2801:19:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:1a::,2801:1a::ffff:ffff:ffff:ffff:ffff,CO
2801:1a:2000::,2801:1a:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:1a:4000::,2801:1a:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:1a:6000::,2801:1a:6000:ffff:ffff:ffff:ffff:ffff,CR
2801:1a:8000::,2801:1a:8000:ffff:ffff:ffff:ffff:ffff,CL
2801:1a:a000::,2801:1a:a000:ffff:ffff:ffff:ffff:ffff,AR
2801:1a:c000::,2801:1a:c000:ffff:ffff:ffff:ffff:ffff,CO
2801:1b::,2801:1b::ffff:ffff:ffff:ffff:ffff,CR
2801:1b:2000::,2801:1b:2000:ffff:ffff:ffff:ffff:ffff,UY
2801:1b:4000::,2801:1b:4000:ffff:ffff:ffff:ffff:ffff,CL
+2801:1b:6000::,2801:1b:6000:ffff:ffff:ffff:ffff:ffff,CL
2801:1b:8000::,2801:1b:8000:ffff:ffff:ffff:ffff:ffff,CL
+2801:1b:a000::,2801:1b:a000:ffff:ffff:ffff:ffff:ffff,AR
2801:1b:c000::,2801:1b:c000:ffff:ffff:ffff:ffff:ffff,PA
2801:1c::,2801:1c::ffff:ffff:ffff:ffff:ffff,PY
2801:1c:2000::,2801:1c:2000:ffff:ffff:ffff:ffff:ffff,PE
2801:1c:4000::,2801:1c:4000:ffff:ffff:ffff:ffff:ffff,CO
+2801:1c:6000::,2801:1c:6000:ffff:ffff:ffff:ffff:ffff,PA
2801:1c:8000::,2801:1c:8000:ffff:ffff:ffff:ffff:ffff,EC
2801:1c:a000::,2801:1c:a000:ffff:ffff:ffff:ffff:ffff,CO
2801:1c:c000::,2801:1c:c000:ffff:ffff:ffff:ffff:ffff,HN
2801:1d::,2801:1d::ffff:ffff:ffff:ffff:ffff,PY
2801:1d:2000::,2801:1d:2000:ffff:ffff:ffff:ffff:ffff,GT
2801:1d:4000::,2801:1d:4000:ffff:ffff:ffff:ffff:ffff,TT
+2801:1d:6000::,2801:1d:6000:ffff:ffff:ffff:ffff:ffff,NI
2801:1d:8000::,2801:1d:8000:ffff:ffff:ffff:ffff:ffff,AR
+2801:1d:a000::,2801:1d:a000:ffff:ffff:ffff:ffff:ffff,CR
2801:1d:c000::,2801:1d:c000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e::,2801:1e::ffff:ffff:ffff:ffff:ffff,EC
2801:1e:2000::,2801:1e:2000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:4000::,2801:1e:4007:ffff:ffff:ffff:ffff:ffff,AR
+2801:1e:6000::,2801:1e:6000:ffff:ffff:ffff:ffff:ffff,CO
2801:1e:8000::,2801:1e:8000:ffff:ffff:ffff:ffff:ffff,CR
2801:1e:a000::,2801:1e:a000:ffff:ffff:ffff:ffff:ffff,AR
2801:1e:c000::,2801:1e:c000:ffff:ffff:ffff:ffff:ffff,AR
@@ -5960,6 +10699,7 @@
2801:1f:2000::,2801:1f:2000:ffff:ffff:ffff:ffff:ffff,CR
2801:1f:4000::,2801:1f:4000:ffff:ffff:ffff:ffff:ffff,CR
2801:1f:8000::,2801:1f:8000:ffff:ffff:ffff:ffff:ffff,AR
+2801:1f:a000::,2801:1f:a000:ffff:ffff:ffff:ffff:ffff,CL
2801:1f:c000::,2801:1f:c000:ffff:ffff:ffff:ffff:ffff,CR
2801:80::,2801:80::ffff:ffff:ffff:ffff:ffff,BR
2801:80:10::,2801:80:10:ffff:ffff:ffff:ffff:ffff,BR
@@ -6137,7 +10877,6 @@
2801:80:b10::,2801:80:b10:ffff:ffff:ffff:ffff:ffff,BR
2801:80:b20::,2801:80:b20:ffff:ffff:ffff:ffff:ffff,BR
2801:80:b30::,2801:80:b30:ffff:ffff:ffff:ffff:ffff,BR
-2801:80:b40::,2801:80:b40:ffff:ffff:ffff:ffff:ffff,BR
2801:80:b50::,2801:80:b50:ffff:ffff:ffff:ffff:ffff,BR
2801:80:b60::,2801:80:b60:ffff:ffff:ffff:ffff:ffff,BR
2801:80:b70::,2801:80:b70:ffff:ffff:ffff:ffff:ffff,BR
@@ -6151,6 +10890,39 @@
2801:80:c10::,2801:80:c10:ffff:ffff:ffff:ffff:ffff,BR
2801:80:c20::,2801:80:c20:ffff:ffff:ffff:ffff:ffff,BR
2801:80:c30::,2801:80:c30:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c40::,2801:80:c40:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c50::,2801:80:c50:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c60::,2801:80:c60:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c70::,2801:80:c70:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c80::,2801:80:c80:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:c90::,2801:80:c90:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:ca0::,2801:80:ca0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:cb0::,2801:80:cb0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:cc0::,2801:80:cc0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:cd0::,2801:80:cd0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:ce0::,2801:80:ce0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:cf0::,2801:80:cf0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d00::,2801:80:d00:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d10::,2801:80:d10:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d20::,2801:80:d2f:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d40::,2801:80:d40:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d50::,2801:80:d50:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d60::,2801:80:d6f:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d80::,2801:80:d80:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:d90::,2801:80:d90:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:da0::,2801:80:daf:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:dc0::,2801:80:dcf:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:de0::,2801:80:de0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:df0::,2801:80:df0:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e00::,2801:80:e00:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e10::,2801:80:e10:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e20::,2801:80:e20:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e30::,2801:80:e30:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e40::,2801:80:e40:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e50::,2801:80:e50:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e60::,2801:80:e60:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:e70::,2801:80:e70:ffff:ffff:ffff:ffff:ffff,BR
+2801:80:1000::,2801:80:10ff:ffff:ffff:ffff:ffff:ffff,BR
2801:82::,2801:82:ffff:ffff:ffff:ffff:ffff:ffff,BR
2801:84::,2801:84:ffff:ffff:ffff:ffff:ffff:ffff,BR
2801:86::,2801:86:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -6205,10 +10977,12 @@
2801:120::,2801:120:ffff:ffff:ffff:ffff:ffff:ffff,AR
2801:130::,2801:130:fff:ffff:ffff:ffff:ffff:ffff,CO
2801:140::,2801:140:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2801:148::,2801:148:ff:ffff:ffff:ffff:ffff:ffff,AR
2801:150::,2801:150:ffff:ffff:ffff:ffff:ffff:ffff,PE
2801:160::,2801:160:ff:ffff:ffff:ffff:ffff:ffff,CO
2801:170::,2801:170:fff:ffff:ffff:ffff:ffff:ffff,CO
2801:180::,2801:180:f:ffff:ffff:ffff:ffff:ffff,PA
+2801:188::,2801:188:f:ffff:ffff:ffff:ffff:ffff,AR
2801:190::,2801:190:fff:ffff:ffff:ffff:ffff:ffff,CO
2801:1a0::,2801:1a0:3f:ffff:ffff:ffff:ffff:ffff,CO
2801:1b0::,2801:1b0:ff:ffff:ffff:ffff:ffff:ffff,CO
@@ -6224,6 +10998,7 @@
2803:200::,2803:200:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:280::,2803:280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:300::,2803:300:ffff:ffff:ffff:ffff:ffff:ffff,DO
+2803:380::,2803:380:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:400::,2803:400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:480::,2803:480:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:500::,2803:500:ffff:ffff:ffff:ffff:ffff:ffff,PE
@@ -6231,6 +11006,7 @@
2803:600::,2803:600:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:680::,2803:680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:700::,2803:700:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:780::,2803:780:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:800::,2803:800:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:880::,2803:880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:900::,2803:900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6238,6 +11014,7 @@
2803:a00::,2803:a00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a80::,2803:a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:b00::,2803:b00:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:b80::,2803:b80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:c00::,2803:c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c80::,2803:c80:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:d00::,2803:d00:ffff:ffff:ffff:ffff:ffff:ffff,GY
@@ -6252,13 +11029,14 @@
2803:1200::,2803:1200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:1280::,2803:1280:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1300::,2803:1300:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:1380::,2803:1380:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:1400::,2803:1400:ffff:ffff:ffff:ffff:ffff:ffff,DO
-2803:1480::,2803:1480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1500::,2803:1500:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:1580::,2803:1580:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1600::,2803:1600:ffff:ffff:ffff:ffff:ffff:ffff,BQ
2803:1680::,2803:1680:ffff:ffff:ffff:ffff:ffff:ffff,GF
2803:1700::,2803:1700:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:1780::,2803:1780:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1800::,2803:1800:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1880::,2803:1880:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:1900::,2803:1900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6266,8 +11044,10 @@
2803:1a00::,2803:1a00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:1a80::,2803:1a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:1b00::,2803:1b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:1b80::,2803:1b80:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:1c80::,2803:1c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1d00::,2803:1d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:1d80::,2803:1d80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1e00::,2803:1e00:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:1e80::,2803:1e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:1f00::,2803:1f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6278,6 +11058,7 @@
2803:2200::,2803:2200:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:2280::,2803:2280:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:2300::,2803:2300:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:2380::,2803:2380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2400::,2803:2400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2480::,2803:2480:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:2500::,2803:2500:ffff:ffff:ffff:ffff:ffff:ffff,PE
@@ -6285,6 +11066,7 @@
2803:2600::,2803:2600:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2680::,2803:2680:ffff:ffff:ffff:ffff:ffff:ffff,UY
2803:2700::,2803:2700:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:2780::,2803:2780:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2800::,2803:2800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:2880::,2803:2880:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:2900::,2803:2900:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -6292,9 +11074,11 @@
2803:2a00::,2803:2a00:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:2a80::,2803:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:2b00::,2803:2b00:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:2b80::,2803:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:2c00::,2803:2c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2c80::,2803:2c80:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:2d00::,2803:2d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:2d80::,2803:2d80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:2e00::,2803:2e00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:2e80::,2803:2e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:2f00::,2803:2f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6305,6 +11089,7 @@
2803:3200::,2803:3200:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:3280::,2803:3280:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:3300::,2803:3300:ffff:ffff:ffff:ffff:ffff:ffff,PE
+2803:3380::,2803:3380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3400::,2803:3400:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:3480::,2803:3480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3500::,2803:3500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6319,9 +11104,11 @@
2803:3a00::,2803:3a00:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:3a80::,2803:3a80:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:3b00::,2803:3b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:3b80::,2803:3b80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3c00::,2803:3c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:3c80::,2803:3c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:3d00::,2803:3d00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
+2803:3d80::,2803:3d80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3e00::,2803:3e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:3e80::,2803:3e80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:3f00::,2803:3f00:ffff:ffff:ffff:ffff:ffff:ffff,HN
@@ -6332,6 +11119,7 @@
2803:4200::,2803:4200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:4280::,2803:4280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4300::,2803:4300:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:4380::,2803:4380:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:4400::,2803:4400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4480::,2803:4480:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4500::,2803:4500:ffff:ffff:ffff:ffff:ffff:ffff,CW
@@ -6339,6 +11127,7 @@
2803:4600::,2803:4600:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:4680::,2803:4680:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:4700::,2803:4700:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:4780::,2803:4780:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4800::,2803:4800:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:4880::,2803:4880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4900::,2803:4900:ffff:ffff:ffff:ffff:ffff:ffff,BQ
@@ -6346,6 +11135,7 @@
2803:4a00::,2803:4a00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:4a80::,2803:4a80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4b00::,2803:4b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:4b80::,2803:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4c00::,2803:4c00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:4c80::,2803:4c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:4d00::,2803:4d00:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -6360,6 +11150,7 @@
2803:5200::,2803:5200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:5280::,2803:5280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:5300::,2803:5300:ffff:ffff:ffff:ffff:ffff:ffff,GT
+2803:5380::,2803:5380:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:5400::,2803:5400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5480::,2803:5480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5500::,2803:5500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6367,15 +11158,18 @@
2803:5600::,2803:5600:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:5680::,2803:5680:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:5700::,2803:5700:ffff:ffff:ffff:ffff:ffff:ffff,BO
+2803:5780::,2803:5780:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5880::,2803:5880:ffff:ffff:ffff:ffff:ffff:ffff,AR
-2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GY
+2803:5900::,2803:5900:ffff:ffff:ffff:ffff:ffff:ffff,GF
2803:5980::,2803:5980:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5a00::,2803:5a00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5a80::,2803:5a80:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:5b00::,2803:5b00:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:5b80::,2803:5b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5c00::,2803:5c00:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:5c80::,2803:5c80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:5d00::,2803:5d00:ffff:ffff:ffff:ffff:ffff:ffff,SV
+2803:5d80::,2803:5d80:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:5e00::,2803:5e00:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:5e80::,2803:5e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:5f00::,2803:5f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6386,6 +11180,7 @@
2803:6200::,2803:6200:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:6280::,2803:6280:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:6300::,2803:6300:ffff:ffff:ffff:ffff:ffff:ffff,GT
+2803:6380::,2803:6380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6400::,2803:6400:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:6480::,2803:6480:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:6500::,2803:6500:ffff:ffff:ffff:ffff:ffff:ffff,PE
@@ -6393,6 +11188,7 @@
2803:6600::,2803:6600:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6680::,2803:6680:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:6700::,2803:6700:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:6780::,2803:6780:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:6800::,2803:6800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6880::,2803:6880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6900::,2803:6900:ffff:ffff:ffff:ffff:ffff:ffff,CR
@@ -6400,9 +11196,11 @@
2803:6a00::,2803:6a00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:6a80::,2803:6a80:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:6b00::,2803:6b00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:6b80::,2803:6b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6c00::,2803:6c00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6c80::,2803:6c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:6d00::,2803:6d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:6d80::,2803:6d80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:6e00::,2803:6e00:ffff:ffff:ffff:ffff:ffff:ffff,SR
2803:6e80::,2803:6e80:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:6f00::,2803:6f00:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -6413,6 +11211,7 @@
2803:7200::,2803:7200:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:7280::,2803:7280:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:7300::,2803:7300:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:7380::,2803:7380:ffff:ffff:ffff:ffff:ffff:ffff,SX
2803:7400::,2803:7400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7480::,2803:7480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7500::,2803:7500:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -6427,9 +11226,11 @@
2803:7a00::,2803:7a00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7a80::,2803:7a80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7b00::,2803:7b00:ffff:ffff:ffff:ffff:ffff:ffff,CL
+2803:7b80::,2803:7b80:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:7c00::,2803:7c00:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:7c80::,2803:7c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:7d00::,2803:7d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:7d80::,2803:7d80:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:7e00::,2803:7e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7e80::,2803:7e80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:7f00::,2803:7f00:ffff:ffff:ffff:ffff:ffff:ffff,CO
@@ -6440,6 +11241,7 @@
2803:8200::,2803:8200:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:8280::,2803:8280:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:8300::,2803:8300:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:8380::,2803:8380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8400::,2803:8400:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:8480::,2803:8480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8500::,2803:8500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6447,13 +11249,14 @@
2803:8600::,2803:8600:ffff:ffff:ffff:ffff:ffff:ffff,HT
2803:8680::,2803:8680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8700::,2803:8700:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:8780::,2803:8780:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:8800::,2803:8800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:8880::,2803:8880:ffff:ffff:ffff:ffff:ffff:ffff,NI
2803:8900::,2803:8900:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8980::,2803:8980:ffff:ffff:ffff:ffff:ffff:ffff,CO
-2803:8a00::,2803:8a00:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:8a80::,2803:8a80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:8b00::,2803:8b00:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:8b80::,2803:8b80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:8c00::,2803:8c00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:8c80::,2803:8c80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:8d00::,2803:8d00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6468,6 +11271,7 @@
2803:9200::,2803:9200:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:9280::,2803:9280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9300::,2803:9300:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:9380::,2803:9380:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:9400::,2803:9400:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:9480::,2803:9480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9500::,2803:9500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6475,6 +11279,7 @@
2803:9600::,2803:9600:ffff:ffff:ffff:ffff:ffff:ffff,CW
2803:9680::,2803:9680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9700::,2803:9700:ffff:ffff:ffff:ffff:ffff:ffff,EC
+2803:9780::,2803:9780:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9800::,2803:9800:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9880::,2803:9880:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:9900::,2803:9900:ffff:ffff:ffff:ffff:ffff:ffff,CL
@@ -6482,9 +11287,11 @@
2803:9a00::,2803:9a00:ffff:ffff:ffff:ffff:ffff:ffff,BZ
2803:9a80::,2803:9a80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:9b00::,2803:9b00:ffff:ffff:ffff:ffff:ffff:ffff,DO
+2803:9b80::,2803:9b80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9c00::,2803:9c00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9c80::,2803:9c80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9d00::,2803:9d00:ffff:ffff:ffff:ffff:ffff:ffff,SV
+2803:9d80::,2803:9d80:ffff:ffff:ffff:ffff:ffff:ffff,SV
2803:9e00::,2803:9e00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:9e80::,2803:9e80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:9f00::,2803:9f00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6495,6 +11302,7 @@
2803:a200::,2803:a200:ffff:ffff:ffff:ffff:ffff:ffff,SR
2803:a280::,2803:a280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:a300::,2803:a300:ffff:ffff:ffff:ffff:ffff:ffff,BZ
+2803:a380::,2803:a380:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:a400::,2803:a400:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:a480::,2803:a480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a500::,2803:a500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6502,6 +11310,7 @@
2803:a600::,2803:a600:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a680::,2803:a680:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a700::,2803:a700:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:a780::,2803:a780:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a800::,2803:a800:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:a880::,2803:a880:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:a900::,2803:a900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6509,9 +11318,11 @@
2803:aa00::,2803:aa00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:aa80::,2803:aa80:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:ab00::,2803:ab00:ffff:ffff:ffff:ffff:ffff:ffff,DO
+2803:ab80::,2803:ab80:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:ac00::,2803:ac00:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:ac80::,2803:ac80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:ad00::,2803:ad00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:ad80::,2803:ad80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:ae00::,2803:ae00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ae80::,2803:ae80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:af00::,2803:af00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6522,6 +11333,7 @@
2803:b200::,2803:b200:ffff:ffff:ffff:ffff:ffff:ffff,UY
2803:b280::,2803:b280:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:b300::,2803:b300:ffff:ffff:ffff:ffff:ffff:ffff,PY
+2803:b380::,2803:b380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:b400::,2803:b400:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:b480::,2803:b480:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:b500::,2803:b500:ffff:ffff:ffff:ffff:ffff:ffff,VE
@@ -6536,9 +11348,11 @@
2803:ba00::,2803:ba00:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:ba80::,2803:ba80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bb00::,2803:bb00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:bb80::,2803:bb80:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:bc00::,2803:bc00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:bc80::,2803:bc80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:bd00::,2803:bd00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:bd80::,2803:bd80:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:be00::,2803:be00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:be80::,2803:be80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:bf00::,2803:bf00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6549,6 +11363,7 @@
2803:c200::,2803:c200:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:c280::,2803:c280:ffff:ffff:ffff:ffff:ffff:ffff,EC
2803:c300::,2803:c300:ffff:ffff:ffff:ffff:ffff:ffff,GT
+2803:c380::,2803:c380:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:c400::,2803:c400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c480::,2803:c480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c500::,2803:c500:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6556,6 +11371,7 @@
2803:c600::,2803:c600:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:c680::,2803:c680:ffff:ffff:ffff:ffff:ffff:ffff,HT
2803:c700::,2803:c700:ffff:ffff:ffff:ffff:ffff:ffff,GF
+2803:c780::,2803:c780:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:c800::,2803:c800:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:c880::,2803:c880:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:c900::,2803:c900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6563,9 +11379,11 @@
2803:ca00::,2803:ca00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ca80::,2803:ca80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:cb00::,2803:cb00:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:cb80::,2803:cb80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cc00::,2803:cc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:cc80::,2803:cc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cd00::,2803:cd00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:cd80::,2803:cd80:ffff:ffff:ffff:ffff:ffff:ffff,TT
2803:ce00::,2803:ce00:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:ce80::,2803:ce80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:cf00::,2803:cf00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6576,6 +11394,7 @@
2803:d200::,2803:d200:ffff:ffff:ffff:ffff:ffff:ffff,CR
2803:d280::,2803:d280:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:d300::,2803:d300:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:d380::,2803:d380:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:d400::,2803:d400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:d480::,2803:d480:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:d500::,2803:d500:ffff:ffff:ffff:ffff:ffff:ffff,BZ
@@ -6590,9 +11409,11 @@
2803:da00::,2803:da00:ffff:ffff:ffff:ffff:ffff:ffff,GY
2803:da80::,2803:da80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:db00::,2803:db00:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:db80::,2803:db80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:dc00::,2803:dc00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:dc80::,2803:dc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:dd00::,2803:dd00:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:dd80::,2803:dd80:ffff:ffff:ffff:ffff:ffff:ffff,VE
2803:de00::,2803:de00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:de80::,2803:de80:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:df00::,2803:df00:ffff:ffff:ffff:ffff:ffff:ffff,SV
@@ -6603,6 +11424,7 @@
2803:e200::,2803:e200:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e280::,2803:e280:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e300::,2803:e300:ffff:ffff:ffff:ffff:ffff:ffff,CR
+2803:e380::,2803:e380:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:e400::,2803:e400:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e480::,2803:e480:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:e500::,2803:e500:ffff:ffff:ffff:ffff:ffff:ffff,PE
@@ -6610,6 +11432,7 @@
2803:e600::,2803:e600:ffff:ffff:ffff:ffff:ffff:ffff,PA
2803:e680::,2803:e680:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:e700::,2803:e700:ffff:ffff:ffff:ffff:ffff:ffff,HN
+2803:e780::,2803:e780:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:e800::,2803:e800:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:e880::,2803:e880:ffff:ffff:ffff:ffff:ffff:ffff,GT
2803:e900::,2803:e900:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -6617,9 +11440,10 @@
2803:ea00::,2803:ea00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ea80::,2803:ea80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:eb00::,2803:eb00:ffff:ffff:ffff:ffff:ffff:ffff,AR
-2803:ec00::,2803:ec00:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:eb80::,2803:eb80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ec80::,2803:ec80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ed00::,2803:ed00:ffff:ffff:ffff:ffff:ffff:ffff,PE
+2803:ed80::,2803:ed80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:ee00::,2803:ee00:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ee80::,2803:ee80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:ef00::,2803:ef00:ffff:ffff:ffff:ffff:ffff:ffff,PA
@@ -6630,6 +11454,7 @@
2803:f200::,2803:f200:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f280::,2803:f280:ffff:ffff:ffff:ffff:ffff:ffff,DO
2803:f300::,2803:f300:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:f380::,2803:f380:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:f400::,2803:f400:ffff:ffff:ffff:ffff:ffff:ffff,HN
2803:f480::,2803:f480:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:f500::,2803:f500:ffff:ffff:ffff:ffff:ffff:ffff,CW
@@ -6644,8 +11469,11 @@
2803:fa00::,2803:fa00:ffff:ffff:ffff:ffff:ffff:ffff,BO
2803:fa80::,2803:fa80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:fb00::,2803:fb00:ffff:ffff:ffff:ffff:ffff:ffff,PA
+2803:fb80::,2803:fb80:ffff:ffff:ffff:ffff:ffff:ffff,AR
+2803:fc00::,2803:fc00:ffff:ffff:ffff:ffff:ffff:ffff,PY
2803:fc80::,2803:fc80:ffff:ffff:ffff:ffff:ffff:ffff,AR
2803:fd00::,2803:fd00:ffff:ffff:ffff:ffff:ffff:ffff,CO
+2803:fd80::,2803:fd80:ffff:ffff:ffff:ffff:ffff:ffff,CL
2803:fe00::,2803:fe00:ffff:ffff:ffff:ffff:ffff:ffff,CO
2803:fe80::,2803:fe80:ffff:ffff:ffff:ffff:ffff:ffff,PE
2803:ff00::,2803:ff00:ffff:ffff:ffff:ffff:ffff:ffff,AR
@@ -7050,7 +11878,6 @@
2804:670::,2804:670:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:674::,2804:674:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:678::,2804:678:ffff:ffff:ffff:ffff:ffff:ffff,BR
-2804:67c::,2804:67c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:680::,2804:680:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:684::,2804:684:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:688::,2804:688:ffff:ffff:ffff:ffff:ffff:ffff,BR
@@ -8381,15 +13208,326 @@
2804:1b78::,2804:1b78:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1b7c::,2804:1b7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1b80::,2804:1b80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b84::,2804:1b84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b88::,2804:1b88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b8c::,2804:1b8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b90::,2804:1b90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b94::,2804:1b94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b98::,2804:1b98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1b9c::,2804:1b9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ba0::,2804:1ba0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ba4::,2804:1ba4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ba8::,2804:1ba8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bac::,2804:1bac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bb0::,2804:1bb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bb4::,2804:1bb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bb8::,2804:1bb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bbc::,2804:1bbc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bc0::,2804:1bc0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bc4::,2804:1bc4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bc8::,2804:1bc8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bcc::,2804:1bcc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bd0::,2804:1bd0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bd4::,2804:1bd4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bd8::,2804:1bd8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bdc::,2804:1bdc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1be0::,2804:1be0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1be4::,2804:1be4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1be8::,2804:1be8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bec::,2804:1bec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bf0::,2804:1bf0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bf4::,2804:1bf4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bf8::,2804:1bf8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1bfc::,2804:1bfc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c00::,2804:1c00:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c04::,2804:1c04:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c08::,2804:1c08:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c0c::,2804:1c0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c10::,2804:1c10:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c14::,2804:1c14:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c18::,2804:1c18:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c1c::,2804:1c1c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c20::,2804:1c20:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c24::,2804:1c24:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c28::,2804:1c28:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c2c::,2804:1c2c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c30::,2804:1c30:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c34::,2804:1c34:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c38::,2804:1c38:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c3c::,2804:1c3c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c40::,2804:1c40:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c44::,2804:1c44:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c48::,2804:1c48:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c4c::,2804:1c4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c50::,2804:1c50:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c54::,2804:1c54:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c58::,2804:1c58:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c5c::,2804:1c5c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c60::,2804:1c60:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c64::,2804:1c64:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c68::,2804:1c68:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c6c::,2804:1c6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c70::,2804:1c70:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c74::,2804:1c74:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c78::,2804:1c78:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c7c::,2804:1c7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c80::,2804:1c80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c84::,2804:1c84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c88::,2804:1c88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c8c::,2804:1c8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c90::,2804:1c90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c94::,2804:1c94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c98::,2804:1c98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1c9c::,2804:1c9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ca0::,2804:1ca0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ca4::,2804:1ca4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ca8::,2804:1ca8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cac::,2804:1cac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cb0::,2804:1cb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cb4::,2804:1cb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cb8::,2804:1cb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cbc::,2804:1cbc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cc0::,2804:1cc0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cc4::,2804:1cc4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cc8::,2804:1cc8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ccc::,2804:1ccc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cd0::,2804:1cd0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cd4::,2804:1cd4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cd8::,2804:1cd8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cdc::,2804:1cdc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ce0::,2804:1ce0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ce4::,2804:1ce4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ce8::,2804:1ce8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cec::,2804:1cec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cf0::,2804:1cf0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cf4::,2804:1cf4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cf8::,2804:1cf8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1cfc::,2804:1cfc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d00::,2804:1d00:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d04::,2804:1d04:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d08::,2804:1d08:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d0c::,2804:1d0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d10::,2804:1d10:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d14::,2804:1d14:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d18::,2804:1d18:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d1c::,2804:1d1c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d20::,2804:1d20:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d24::,2804:1d24:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d28::,2804:1d28:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d2c::,2804:1d2c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d30::,2804:1d30:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d34::,2804:1d34:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d38::,2804:1d38:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d3c::,2804:1d3c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d40::,2804:1d40:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d44::,2804:1d44:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d48::,2804:1d48:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d4c::,2804:1d4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d50::,2804:1d50:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d54::,2804:1d54:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d58::,2804:1d58:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d5c::,2804:1d5c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d60::,2804:1d60:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d64::,2804:1d64:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d68::,2804:1d68:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d6c::,2804:1d6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d70::,2804:1d70:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d74::,2804:1d74:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d78::,2804:1d78:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d7c::,2804:1d7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d80::,2804:1d80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d84::,2804:1d84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d88::,2804:1d88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d8c::,2804:1d8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d90::,2804:1d90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d94::,2804:1d94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d98::,2804:1d98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1d9c::,2804:1d9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1da0::,2804:1da0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1da4::,2804:1da4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1da8::,2804:1da8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dac::,2804:1dac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1db0::,2804:1db0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1db4::,2804:1db4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1db8::,2804:1db8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dbc::,2804:1dbc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dc0::,2804:1dc0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dc4::,2804:1dc4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dc8::,2804:1dc8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dcc::,2804:1dcc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dd0::,2804:1dd0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dd4::,2804:1dd4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dd8::,2804:1dd8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ddc::,2804:1ddc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1de0::,2804:1de0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1de4::,2804:1de4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1de8::,2804:1de8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dec::,2804:1dec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1df0::,2804:1df0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1df4::,2804:1df4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1df8::,2804:1df8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1dfc::,2804:1dfc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e00::,2804:1e00:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e04::,2804:1e04:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e08::,2804:1e08:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e0c::,2804:1e0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e10::,2804:1e10:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e14::,2804:1e14:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e18::,2804:1e18:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e1c::,2804:1e1c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e20::,2804:1e20:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e24::,2804:1e24:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e28::,2804:1e28:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e2c::,2804:1e2c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e30::,2804:1e30:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e34::,2804:1e34:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e38::,2804:1e38:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e3c::,2804:1e3c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e40::,2804:1e40:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e44::,2804:1e44:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e48::,2804:1e48:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e4c::,2804:1e4c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e50::,2804:1e50:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e54::,2804:1e54:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e58::,2804:1e58:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e5c::,2804:1e5c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e60::,2804:1e60:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e64::,2804:1e64:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e68::,2804:1e68:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e6c::,2804:1e6c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e70::,2804:1e70:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e74::,2804:1e74:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e78::,2804:1e78:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e7c::,2804:1e7c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e80::,2804:1e80:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e84::,2804:1e84:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e88::,2804:1e88:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e8c::,2804:1e8c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e90::,2804:1e90:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e94::,2804:1e94:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e98::,2804:1e98:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1e9c::,2804:1e9c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ea0::,2804:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ea4::,2804:1ea4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ea8::,2804:1ea8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1eac::,2804:1eac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1eb0::,2804:1eb0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1eb4::,2804:1eb4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1eb8::,2804:1eb8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ebc::,2804:1ebc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ec0::,2804:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ec4::,2804:1ec4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ec8::,2804:1ec8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ecc::,2804:1ecc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ed0::,2804:1ed0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ed4::,2804:1ed4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ed8::,2804:1ed8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1edc::,2804:1edc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ee0::,2804:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ee4::,2804:1ee4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ee8::,2804:1ee8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1eec::,2804:1eec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ef0::,2804:1ef0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ef4::,2804:1ef4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1ef8::,2804:1ef8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1efc::,2804:1efc:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f00::,2804:1f00:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f02::,2804:1f02:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f04::,2804:1f04:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f06::,2804:1f06:ffff:ffff:ffff:ffff:ffff:ffff,BR
2804:1f08::,2804:1f08:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f0a::,2804:1f0a:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f0c::,2804:1f0c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:1f0e::,2804:1f0e:1fff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2000::,2804:2000:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2004::,2804:2004:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2008::,2804:2008:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:200c::,2804:200c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2010::,2804:2010:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2014::,2804:2014:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2018::,2804:2018:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:201c::,2804:201c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2020::,2804:2020:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2024::,2804:2024:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2028::,2804:2028:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:202c::,2804:202c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2030::,2804:2030:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2034::,2804:2034:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2038::,2804:2038:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:203c::,2804:203c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2040::,2804:2040:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2044::,2804:2044:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2048::,2804:2048:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:204c::,2804:204c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2050::,2804:2050:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2054::,2804:2054:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2058::,2804:2058:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:205c::,2804:205c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2060::,2804:2060:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2064::,2804:2064:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2068::,2804:2068:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:206c::,2804:206c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2070::,2804:2070:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2074::,2804:2074:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2078::,2804:2078:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:207c::,2804:207c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2080::,2804:2080:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2084::,2804:2084:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2088::,2804:2088:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:208c::,2804:208c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2090::,2804:2090:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2094::,2804:2094:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2098::,2804:2098:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:209c::,2804:209c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20a0::,2804:20a0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20a4::,2804:20a4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20a8::,2804:20a8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20ac::,2804:20ac:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20b0::,2804:20b0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20b4::,2804:20b4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20b8::,2804:20b8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20bc::,2804:20bc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20c0::,2804:20c0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20c4::,2804:20c4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20c8::,2804:20c8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20cc::,2804:20cc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20d0::,2804:20d0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20d4::,2804:20d4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20d8::,2804:20d8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20dc::,2804:20dc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20e0::,2804:20e0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20e4::,2804:20e4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20e8::,2804:20e8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20ec::,2804:20ec:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20f0::,2804:20f0:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20f4::,2804:20f4:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20f8::,2804:20f8:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:20fc::,2804:20fc:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2100::,2804:2100:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2104::,2804:2104:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2108::,2804:2108:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:210c::,2804:210c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2110::,2804:2110:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2114::,2804:2114:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2118::,2804:2118:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:211c::,2804:211c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2120::,2804:2120:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2124::,2804:2124:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2128::,2804:2128:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:212c::,2804:212c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2130::,2804:2130:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2134::,2804:2134:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2138::,2804:2138:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:213c::,2804:213c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2140::,2804:2140:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2144::,2804:2144:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2148::,2804:2148:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:214c::,2804:214c:ffff:ffff:ffff:ffff:ffff:ffff,BR
+2804:2150::,2804:2150:ffff:ffff:ffff:ffff:ffff:ffff,BR
2806::,2806:f:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:200::,2806:200:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:210::,2806:216::ffff:ffff:ffff:ffff:ffff,MX
-2806:217::,2806:218:ffff:ffff:ffff:ffff:ffff:ffff,MX
+2806:217::,2806:21c:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:220::,2806:220:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:230::,2806:230:ffff:ffff:ffff:ffff:ffff:ffff,MX
2806:238::,2806:238::ffff:ffff:ffff:ffff:ffff,MX
@@ -8481,7 +13619,6 @@
2a00:e10::,2a00:e10:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e18::,2a00:e18:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a00:e20::,2a00:e20:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:e28::,2a00:e28:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:e30::,2a00:e30:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:e38::,2a00:e38:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:e40::,2a00:e40:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -8545,7 +13682,6 @@
2a00:1020::,2a00:1020:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:1028::,2a00:1028:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a00:1030::,2a00:1030:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:1038::,2a00:1038:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:1040::,2a00:1040:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a00:1048::,2a00:1048:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:1050::,2a00:1050:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -8793,7 +13929,7 @@
2a00:1878::,2a00:1878:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a00:1880::,2a00:1880:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a00:1888::,2a00:1888:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:1890::,2a00:1890:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:1890::,2a00:1897:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1898::,2a00:1898:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:18a0::,2a00:18a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:18a8::,2a00:18a8:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -8809,7 +13945,7 @@
2a00:18f8::,2a00:18f8:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a00:1900::,2a00:1900:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1908::,2a00:1908:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a00:1910::,2a00:1910:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:1910::,2a00:1917:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1918::,2a00:191f:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a00:1920::,2a00:1920:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:1928::,2a00:1928:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -9113,7 +14249,7 @@
2a00:4a80::,2a00:4a80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:4aa0::,2a00:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:4ac0::,2a00:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a00:4ae0::,2a00:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:4ae0::,2a00:4ae7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:4b00::,2a00:4b00:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:4b40::,2a00:4b40:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a00:4b60::,2a00:4b60:ffff:ffff:ffff:ffff:ffff:ffff,CY
@@ -9124,7 +14260,6 @@
2a00:4c00::,2a00:4c00:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:4c20::,2a00:4c20:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a00:4c40::,2a00:4c40:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a00:4c60::,2a00:4c60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:4c80::,2a00:4c87:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a00:4ca0::,2a00:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:4cc0::,2a00:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -9240,7 +14375,7 @@
2a00:5b40::,2a00:5b40:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:5b60::,2a00:5b60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:5b80::,2a00:5b87:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a00:5ba0::,2a00:5ba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:5ba0::,2a00:5ba7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:5bc0::,2a00:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:5be0::,2a00:5be0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:5c00::,2a00:5c00:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -9285,7 +14420,7 @@
2a00:6140::,2a00:6140:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:6160::,2a00:6160:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:6180::,2a00:6180:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a00:61a0::,2a00:61a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a00:61a0::,2a00:61a7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:61c0::,2a00:61c7:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a00:61e0::,2a00:61e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:6200::,2a00:6200:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -9322,8 +14457,7 @@
2a00:65e0::,2a00:65e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:6600::,2a00:6600:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a00:6620::,2a00:6620:ffff:ffff:ffff:ffff:ffff:ffff,GR
-2a00:6640::,2a00:6640:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a00:6660::,2a00:6660:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a00:6640::,2a00:6647:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:6680::,2a00:6680:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:66a0::,2a00:66a0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a00:66e0::,2a00:66e0:ffff:ffff:ffff:ffff:ffff:ffff,TR
@@ -9402,7 +14536,9 @@
2a00:70e0::,2a00:70e0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a00:7100::,2a00:7100:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:7120::,2a00:7120:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a00:7140::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a00:7140::,2a00:7143:ff:ffff:ffff:ffff:ffff:ffff,NL
+2a00:7143:100::,2a00:7143:100:ffff:ffff:ffff:ffff:ffff,US
+2a00:7143:101::,2a00:7147:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:7160::,2a00:7160:ffff:ffff:ffff:ffff:ffff:ffff,KG
2a00:7180::,2a00:7180:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:71a0::,2a00:71a0:ffff:ffff:ffff:ffff:ffff:ffff,BA
@@ -9444,7 +14580,7 @@
2a00:7660::,2a00:7660:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a00:7680::,2a00:7680:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a00:76a0::,2a00:76a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a00:76c0::,2a00:76c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a00:76c0::,2a00:76c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a00:76e0::,2a00:76e0:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a00:7700::,2a00:7700:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:7720::,2a00:7720:ffff:ffff:ffff:ffff:ffff:ffff,ES
@@ -9529,7 +14665,7 @@
2a00:81e0::,2a00:81e0:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a00:8200::,2a00:8200:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a00:8220::,2a00:8220:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a00:8240::,2a00:8240:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a00:8240::,2a00:8247:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:8260::,2a00:8260:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:8280::,2a00:8280:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:82a0::,2a00:82a0:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -9691,7 +14827,7 @@
2a00:97a0::,2a00:97a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:97c0::,2a00:97c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a00:97e0::,2a00:97e0:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a00:9800::,2a00:9800:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a00:9800::,2a00:9801:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:9820::,2a00:9820:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:9840::,2a00:9840:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:9860::,2a00:9860:ffff:ffff:ffff:ffff:ffff:ffff,HR
@@ -9806,7 +14942,6 @@
2a00:a6a0::,2a00:a6a0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a00:a6c0::,2a00:a6c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:a6e0::,2a00:a6e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a00:a700::,2a00:a700:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:a720::,2a00:a720:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:a740::,2a00:a740:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a00:a760::,2a00:a760:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -9852,7 +14987,7 @@
2a00:ace0::,2a00:ace0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:ad00::,2a00:ad00:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a00:ad20::,2a00:ad20:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a00:ad40::,2a00:ad40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:ad40::,2a00:ad47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:ad60::,2a00:ad60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:ad80::,2a00:ad87:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:adc0::,2a00:adc0:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -9922,7 +15057,6 @@
2a00:b640::,2a00:b640:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a00:b660::,2a00:b660:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:b680::,2a00:b680:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a00:b6a0::,2a00:b6a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:b6c0::,2a00:b6c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:b6e0::,2a00:b6e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:b700::,2a00:b700:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -9982,7 +15116,7 @@
2a00:bde0::,2a00:bde0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:be00::,2a00:be00:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:be20::,2a00:be20:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:be40::,2a00:be40:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a00:be40::,2a00:be47:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a00:be60::,2a00:be60:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a00:be80::,2a00:be80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:bea0::,2a00:bea0:ffff:ffff:ffff:ffff:ffff:ffff,AE
@@ -10001,10 +15135,16 @@
2a00:c0a0::,2a00:c0a0:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a00:c0c0::,2a00:c0c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:c0e0::,2a00:c0e0:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a00:c100::,2a00:c1ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:c100::,2a00:c100:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a00:c120::,2a00:c120:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a00:c140::,2a00:c140:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a00:c160::,2a00:c160:ffff:ffff:ffff:ffff:ffff:ffff,AL
+2a00:c180::,2a00:c180:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a00:c1a0::,2a00:c1a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a00:c1c0::,2a00:c1c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a00:c1e0::,2a00:c1e7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:c200::,2a00:c200:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a00:c220::,2a00:c220:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:c240::,2a00:c240:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a00:c260::,2a00:c260:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:c280::,2a00:c280:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a00:c2a0::,2a00:c2a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -10059,7 +15199,7 @@
2a00:c920::,2a00:c920:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:c940::,2a00:c940:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:c960::,2a00:c960:ffff:ffff:ffff:ffff:ffff:ffff,GR
-2a00:c980::,2a00:c980:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a00:c980::,2a00:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:c9a0::,2a00:c9a0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a00:c9c0::,2a00:c9c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:c9e0::,2a00:c9e0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -10072,8 +15212,6 @@
2a00:cae0::,2a00:cae0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a00:cb00::,2a00:cb00:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a00:cb20::,2a00:cb20:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a00:cb40::,2a00:cb40:ffff:ffff:ffff:ffff:ffff:ffff,SK
-2a00:cb60::,2a00:cb60:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a00:cb80::,2a00:cb80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:cba0::,2a00:cba0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:cbc0::,2a00:cbc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -10231,7 +15369,6 @@
2a00:dfa0::,2a00:dfa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:dfc0::,2a00:dfc0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a00:dfe0::,2a00:dfe7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a00:e000::,2a00:e000:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a00:e020::,2a00:e020:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:e040::,2a00:e040:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:e060::,2a00:e060:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -10289,7 +15426,8 @@
2a00:e760::,2a00:e760:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a00:e780::,2a00:e780:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a00:e7a0::,2a00:e7a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a00:e7c0::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a00:e7c0::,2a00:e7c0::ffff:ffff:ffff:ffff:ffff,LT
+2a00:e7c0:1::,2a00:e7c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a00:e7e0::,2a00:e7e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a00:e800::,2a00:e807:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:e840::,2a00:e840:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -10380,7 +15518,6 @@
2a00:f3a0::,2a00:f3a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a00:f3c0::,2a00:f3c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a00:f3e0::,2a00:f3e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a00:f400::,2a00:f400:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a00:f420::,2a00:f420:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a00:f440::,2a00:f440:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a00:f460::,2a00:f460:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -10473,12 +15610,47 @@
2a00:ffa0::,2a00:ffa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a00:ffc0::,2a00:ffc0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a00:ffe0::,2a00:ffe0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a01::,2a01:ff:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01::,2a01::ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:8::,2a01:8:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a01:10::,2a01:10:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a01:18::,2a01:18:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a01:20::,2a01:20:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:28::,2a01:28:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:30::,2a01:30:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:38::,2a01:38:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:40::,2a01:40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:48::,2a01:48:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:50::,2a01:50:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:58::,2a01:58:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:68::,2a01:68:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:70::,2a01:70:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:78::,2a01:78:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:80::,2a01:80:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a01:88::,2a01:88:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:90::,2a01:90:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:98::,2a01:98:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:a0::,2a01:a0:ffff:ffff:ffff:ffff:ffff:ffff,MT
+2a01:a8::,2a01:a8:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a01:b0::,2a01:b1:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a01:b8::,2a01:b8:ffff:ffff:ffff:ffff:ffff:ffff,VA
+2a01:c0::,2a01:c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:c8::,2a01:c8:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:d0::,2a01:d0:9008:ffff:ffff:ffff:ffff:ffff,UA
+2a01:d0:9009::,2a01:d0:9009:ffff:ffff:ffff:ffff:ffff,RU
+2a01:d0:900a::,2a01:d0:92ea:ffff:ffff:ffff:ffff:ffff,UA
+2a01:d0:92eb::,2a01:d0:92eb:ffff:ffff:ffff:ffff:ffff,RU
+2a01:d0:92ec::,2a01:d0:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a01:d8::,2a01:d8:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a01:e0::,2a01:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a01:e8::,2a01:e8:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a01:f0::,2a01:f0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:f8::,2a01:f8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:100::,2a01:100:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:108::,2a01:108:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a01:110:10::,2a01:110:10:ffff:ffff:ffff:ffff:ffff,GB
+2a01:110:8008::,2a01:110:8008:ffff:ffff:ffff:ffff:ffff,GB
2a01:120::,2a01:120:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:130::,2a01:130:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:138::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:130::,2a01:13f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:140::,2a01:140:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:148::,2a01:148:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:150::,2a01:150:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -10496,7 +15668,7 @@
2a01:1b0::,2a01:1b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:1b8::,2a01:1b8:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a01:1c0::,2a01:1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a01:1c8::,2a01:1c8:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:1c8::,2a01:1cf:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:1d0::,2a01:1d0:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a01:1d8::,2a01:1d8:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:1e0::,2a01:1e0:ffff:ffff:ffff:ffff:ffff:ffff,IE
@@ -10529,23 +15701,25 @@
2a01:2c0::,2a01:2c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:2c8::,2a01:2c8:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:2d0::,2a01:2d0:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a01:2d8::,2a01:2d8:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a01:2d8::,2a01:2df:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:2e0::,2a01:2ef:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a01:300:22::,2a01:300:22:ffff:ffff:ffff:ffff:ffff,GB
2a01:308::,2a01:308:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:310::,2a01:310:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:320::,2a01:320:ffff:ffff:ffff:ffff:ffff:ffff,MD
2a01:328::,2a01:328:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a01:330::,2a01:330:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:338::,2a01:338:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a01:340::,2a01:340:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a01:348::,2a01:348:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:350::,2a01:350:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:358::,2a01:358:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a01:358::,2a01:35f:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:360::,2a01:360:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:368::,2a01:36f:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:378::,2a01:378:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:380::,2a01:380:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:388::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:388::,2a01:388:250:ffff:ffff:ffff:ffff:ffff,GB
+2a01:388:251::,2a01:388:251:ffff:ffff:ffff:ffff:ffff,NL
+2a01:388:252::,2a01:38f:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:390::,2a01:390:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a01:398::,2a01:398:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:3a0::,2a01:3a7:ffff:ffff:ffff:ffff:ffff:ffff,DK
@@ -10576,7 +15750,7 @@
2a01:488::,2a01:488:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:490::,2a01:490:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:498::,2a01:498:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a01:4a0::,2a01:4a8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:4a0::,2a01:4af:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:4b0::,2a01:4b0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:4c0::,2a01:4c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a01:4c8::,2a01:4cf:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -10585,7 +15759,9 @@
2a01:4e0::,2a01:4e7:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a01:4e8::,2a01:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:4f0::,2a01:4f0:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a01:4f8::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:4f8::,2a01:4f8:12f:ffff:ffff:ffff:ffff:ffff,DE
+2a01:4f8:130::,2a01:4f8:130:ffff:ffff:ffff:ffff:ffff,AT
+2a01:4f8:131::,2a01:4ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:500::,2a01:500:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:508::,2a01:508:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:510::,2a01:510:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -10676,9 +15852,11 @@
2a01:7e8::,2a01:7e8:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a01:7f0::,2a01:7f0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7f8::,2a01:7f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:800::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a01:800::,2a01:838:fffe:ffff:ffff:ffff:ffff:ffff,DE
+2a01:838:ffff::,2a01:838:ffff:ffff:ffff:ffff:ffff:ffff,MT
+2a01:839::,2a01:8ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:c00::,2a01:c3f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a01:e00::,2a01:eff:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a01:e00::,2a01:e3f:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:1000::,2a01:17ff:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:2000::,2a01:2fff:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:4000::,2a01:4000:ffff:ffff:ffff:ffff:ffff:ffff,AM
@@ -10704,7 +15882,6 @@
2a01:4300::,2a01:4300:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:4320::,2a01:4320:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:4340::,2a01:4340:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a01:4360::,2a01:4360:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:4380::,2a01:4380:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:43a0::,2a01:43a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:43c0::,2a01:43c0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -10724,7 +15901,6 @@
2a01:45c0::,2a01:45c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:45e0::,2a01:45e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:4600::,2a01:4600:ffff:ffff:ffff:ffff:ffff:ffff,BH
-2a01:4620::,2a01:4620:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:4640::,2a01:4640:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:4660::,2a01:4660:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:4680::,2a01:4680:ffff:ffff:ffff:ffff:ffff:ffff,RS
@@ -10750,7 +15926,6 @@
2a01:4920::,2a01:4920:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:4940::,2a01:4940:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:4960::,2a01:4960:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a01:4980::,2a01:4980:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:49a0::,2a01:49a0:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a01:49c0::,2a01:49c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:49e0::,2a01:49e0:ffff:ffff:ffff:ffff:ffff:ffff,AZ
@@ -10813,7 +15988,6 @@
2a01:5140::,2a01:5140:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:5160::,2a01:5160:ffff:ffff:ffff:ffff:ffff:ffff,ME
2a01:5180::,2a01:5180:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a01:51a0::,2a01:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:51c0::,2a01:51c7:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a01:5200::,2a01:5200:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a01:5220::,2a01:5220:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -10850,7 +16024,7 @@
2a01:5620::,2a01:5620:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:5640::,2a01:5640:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:5660::,2a01:5660:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a01:5680::,2a01:5680:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a01:5680::,2a01:5687:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:56a0::,2a01:56a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:56c0::,2a01:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:56e0::,2a01:56e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -10863,7 +16037,6 @@
2a01:57c0::,2a01:57c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:57e0::,2a01:57e0:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a01:5800::,2a01:5800:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a01:5820::,2a01:5820:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:5840::,2a01:5840:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a01:5860::,2a01:5860:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:58a0::,2a01:58a0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -10876,9 +16049,7 @@
2a01:59c0::,2a01:59c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:59e0::,2a01:59e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:5a00::,2a01:5a00:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a01:5a20::,2a01:5a20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:5a40::,2a01:5a40:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a01:5a60::,2a01:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:5a80::,2a01:5a80:ffff:ffff:ffff:ffff:ffff:ffff,US
2a01:5aa0::,2a01:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:5ac0::,2a01:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -11081,7 +16252,6 @@
2a01:7400::,2a01:7400:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:7420::,2a01:7420:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7440::,2a01:7440:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a01:7460::,2a01:7460:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7480::,2a01:7480:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:74a0::,2a01:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:74c0::,2a01:74c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -11113,7 +16283,6 @@
2a01:7820::,2a01:7820:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7840::,2a01:7840:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:7860::,2a01:7860:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:7880::,2a01:7880:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:78a0::,2a01:78a0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:78c0::,2a01:78c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:78e0::,2a01:78e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -11164,7 +16333,6 @@
2a01:7ec0::,2a01:7ec0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:7ee0::,2a01:7ee0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:7f00::,2a01:7f00:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a01:7f20::,2a01:7f20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:7f40::,2a01:7f40:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a01:7f60::,2a01:7f60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:7f80::,2a01:7f80:ffff:ffff:ffff:ffff:ffff:ffff,PS
@@ -11232,8 +16400,7 @@
2a01:8780::,2a01:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:87c0::,2a01:87c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:87e0::,2a01:87e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:8800::,2a01:8800:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a01:8820::,2a01:8820:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a01:8800::,2a01:8807:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8840::,2a01:8840:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:8860::,2a01:8860:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a01:8880::,2a01:8880:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -11272,7 +16439,7 @@
2a01:8ca0::,2a01:8ca0:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a01:8cc0::,2a01:8cc0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a01:8ce0::,2a01:8ce0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
-2a01:8d00::,2a01:8d00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a01:8d00::,2a01:8d03:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:8d20::,2a01:8d20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:8d40::,2a01:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:8d80::,2a01:8d80:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -11289,7 +16456,7 @@
2a01:8f00::,2a01:8f00:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8f20::,2a01:8f20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:8f40::,2a01:8f40:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a01:8f60::,2a01:8f60:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a01:8f60::,2a01:8f67:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:8f80::,2a01:8f80:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a01:8fa0::,2a01:8fa0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:8fc0::,2a01:8fc0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -11318,7 +16485,6 @@
2a01:92c0::,2a01:92c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a01:92e0::,2a01:92e0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a01:9300::,2a01:9300:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a01:9320::,2a01:9320:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a01:9340::,2a01:9340:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:9360::,2a01:9360:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a01:9380::,2a01:9380:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -11453,7 +16619,6 @@
2a01:a400::,2a01:a400:ffff:ffff:ffff:ffff:ffff:ffff,JE
2a01:a420::,2a01:a420:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a01:a440::,2a01:a440:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a01:a460::,2a01:a460:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:a4a0::,2a01:a4a0:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a01:a4c0::,2a01:a4c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a01:a4e0::,2a01:a4e0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -11597,7 +16762,6 @@
2a01:b700::,2a01:b700:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a01:b720::,2a01:b720:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b740::,2a01:b740:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a01:b760::,2a01:b760:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a01:b780::,2a01:b780:ffff:ffff:ffff:ffff:ffff:ffff,MK
2a01:b7a0::,2a01:b7a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a01:b7c0::,2a01:b7c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -11625,7 +16789,6 @@
2a01:ba80::,2a01:ba80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a01:baa0::,2a01:baa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a01:bac0::,2a01:bac0:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2a01:bae0::,2a01:bae0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a01:bb20::,2a01:bb20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a01:bb40::,2a01:bb40:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a01:bb60::,2a01:bb60:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -11712,7 +16875,6 @@
2a02:188::,2a02:18f:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:190::,2a02:190:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:198::,2a02:198:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a02:1a0::,2a02:1a7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:1a8::,2a02:1a8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:1b8::,2a02:1b8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:1c0::,2a02:1c0:ffff:ffff:ffff:ffff:ffff:ffff,BG
@@ -11726,7 +16888,7 @@
2a02:200::,2a02:200:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:208::,2a02:208:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:210::,2a02:210:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a02:218::,2a02:218:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:218::,2a02:21f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:220::,2a02:220:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a02:228::,2a02:22f:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:230::,2a02:230:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -11734,7 +16896,7 @@
2a02:240::,2a02:240:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:248::,2a02:248:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:250::,2a02:250:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a02:258::,2a02:258:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:258::,2a02:25f:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:260::,2a02:260:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:268::,2a02:268:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:270::,2a02:270:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -11798,7 +16960,7 @@
2a02:450::,2a02:450:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:458::,2a02:458:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:460::,2a02:460:ffff:ffff:ffff:ffff:ffff:ffff,DK
-2a02:468::,2a02:468:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:468::,2a02:46f:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:470::,2a02:470:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:478::,2a02:478:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:480::,2a02:480:ffff:ffff:ffff:ffff:ffff:ffff,TR
@@ -11813,16 +16975,48 @@
2a02:4d0::,2a02:4d0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:4d8::,2a02:4d8:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a02:4e0::,2a02:4e0:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a02:4e8::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4e8::,2a02:4e8:3:ffff:ffff:ffff:ffff:ffff,GB
+2a02:4e8:4::,2a02:4e8:4:ffff:ffff:ffff:ffff:ffff,CA
+2a02:4e8:5::,2a02:4e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:4f0::,2a02:4f0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:4f8::,2a02:4f8:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:500::,2a02:5ff:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:500::,2a02:500:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a02:508::,2a02:508:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:518::,2a02:518:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:520::,2a02:520:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:530::,2a02:530:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:538::,2a02:538:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:540::,2a02:540:ffff:ffff:ffff:ffff:ffff:ffff,CY
+2a02:548::,2a02:548:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:550::,2a02:550:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:558::,2a02:558:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a02:560::,2a02:560:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:568::,2a02:568:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:570::,2a02:570:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:578::,2a02:578:5001:ffff:ffff:ffff:ffff:ffff,BE
+2a02:578:5002::,2a02:578:5002:ffff:ffff:ffff:ffff:ffff,RU
+2a02:578:5003::,2a02:578:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:580::,2a02:580:d3ab:ffff:ffff:ffff:ffff:ffff,GR
+2a02:580:d3ac::,2a02:580:d3ac:ffff:ffff:ffff:ffff:ffff,FR
+2a02:580:d3ad::,2a02:587:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:588::,2a02:588:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:590::,2a02:590:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:598::,2a02:598:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:5a0::,2a02:5a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:5b0::,2a02:5b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:5b8::,2a02:5b8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5c0::,2a02:5c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:5c8::,2a02:5c8:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:5d0::,2a02:5d0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:5d8::,2a02:5d8:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:5e0::,2a02:5e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:5f0::,2a02:5f0:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:5f8::,2a02:5f8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:600::,2a02:600:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:608::,2a02:608:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:610::,2a02:610:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a02:618::,2a02:618:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:620::,2a02:620:ffff:ffff:ffff:ffff:ffff:ffff,CH
-2a02:628::,2a02:628:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a02:630::,2a02:630:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:638::,2a02:638:ffff:ffff:ffff:ffff:ffff:ffff,GI
2a02:640::,2a02:640:ffff:ffff:ffff:ffff:ffff:ffff,CY
@@ -11892,7 +17086,7 @@
2a02:840::,2a02:840:ffff:ffff:ffff:ffff:ffff:ffff,SI
2a02:848::,2a02:848:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:850::,2a02:850:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a02:858::,2a02:858:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a02:858::,2a02:85f:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a02:860::,2a02:860:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:868::,2a02:868:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:870::,2a02:870:ffff:ffff:ffff:ffff:ffff:ffff,PT
@@ -11913,7 +17107,38 @@
2a02:8e8::,2a02:8e8:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a02:8f0::,2a02:8f0:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a02:8f8::,2a02:8f8:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a02:900::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:900::,2a02:900:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:908::,2a02:908:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:910::,2a02:910:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:918::,2a02:918:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:920::,2a02:920:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:928::,2a02:928:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:930::,2a02:930:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:938::,2a02:93f:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:940::,2a02:940:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:950::,2a02:957:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:958::,2a02:958:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:960::,2a02:960:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:968::,2a02:968:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:970::,2a02:970:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:978::,2a02:978:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:980::,2a02:980:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:988::,2a02:988:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:990::,2a02:990:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:998::,2a02:998:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:9a0::,2a02:9a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a02:9a8::,2a02:9a8:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:9b0::,2a02:9b0:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a02:9b8::,2a02:9b9:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:9c0::,2a02:9c0:ffff:ffff:ffff:ffff:ffff:ffff,JO
+2a02:9c8::,2a02:9c8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:9d0::,2a02:9d0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a02:9d8::,2a02:9d8:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:9e0::,2a02:9e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:9e8::,2a02:9e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:9f0::,2a02:9f0:ffff:ffff:ffff:ffff:ffff:ffff,IS
+2a02:9f8::,2a02:9f8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:a00::,2a02:a00:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:a08::,2a02:a08:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:a10::,2a02:a10:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:a18::,2a02:a18:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -11946,13 +17171,13 @@
2a02:af0::,2a02:af0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:af8::,2a02:af8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:b00::,2a02:b00:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:b08::,2a02:b08:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:b08::,2a02:b0f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:b10::,2a02:b10:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:b18::,2a02:b18:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:b20::,2a02:b20:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:b28::,2a02:b28:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:b30::,2a02:b30:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:b48::,2a02:b48:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:b48::,2a02:b4f:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:b50::,2a02:b50:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:b58::,2a02:b58:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a02:b60::,2a02:b60:ffff:ffff:ffff:ffff:ffff:ffff,IQ
@@ -12095,9 +17320,8 @@
2a02:fe0::,2a02:fe7:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:fe8::,2a02:fe8:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:ff0::,2a02:ff0:ffff:ffff:ffff:ffff:ffff:ffff,TR
-2a02:ff8::,2a02:ff8:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a02:1000::,2a02:103f:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:1200::,2a02:12ff:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a02:1200::,2a02:121f:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:1300::,2a02:1300:ffff:ffff:ffff:ffff:ffff:ffff,IS
2a02:1308::,2a02:1308:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:1310::,2a02:1310:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -12144,7 +17368,7 @@
2a02:1650::,2a02:1650:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a02:1658::,2a02:1658:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:1660::,2a02:1660:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a02:1668::,2a02:1668:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:1668::,2a02:166f:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:1670::,2a02:1670:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:1678::,2a02:1678:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:1680::,2a02:1680:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12154,7 +17378,7 @@
2a02:16a8::,2a02:16a8:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:16b0::,2a02:16b0:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a02:16b8::,2a02:16b8:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a02:16c0::,2a02:16c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a02:16c0::,2a02:16c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a02:16c8::,2a02:16c8:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:16d0::,2a02:16d0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:16d8::,2a02:16d8:ffff:ffff:ffff:ffff:ffff:ffff,LV
@@ -12193,7 +17417,38 @@
2a02:17f0::,2a02:17f0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:17f8::,2a02:17f8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:1800::,2a02:18ff:ffff:ffff:ffff:ffff:ffff:ffff,BE
-2a02:2000::,2a02:20ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2000::,2a02:2000:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:2008::,2a02:2008:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:2010::,2a02:2010:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a02:2018::,2a02:2018:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2020::,2a02:2020:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a02:2028::,2a02:2028:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2030::,2a02:2030:ffff:ffff:ffff:ffff:ffff:ffff,BA
+2a02:2038::,2a02:2038:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:2040::,2a02:2040:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:2048::,2a02:2048:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a02:2050::,2a02:2050:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:2058::,2a02:2058:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:2060::,2a02:2060:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:2068::,2a02:2068:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:2070::,2a02:2070:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2078::,2a02:2078:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:2080::,2a02:2080:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:2088::,2a02:2088:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:2090::,2a02:2090:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2098::,2a02:209f:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:20a0::,2a02:20a0:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:20a8::,2a02:20a8:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:20b0::,2a02:20b0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:20b8::,2a02:20b8:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a02:20c0::,2a02:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:20c8::,2a02:20c8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:20d0::,2a02:20d0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:20d8::,2a02:20d8:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:20e0::,2a02:20e7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:20e8::,2a02:20e8:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:20f0::,2a02:20f0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:20f8::,2a02:20f8:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:2100::,2a02:2100:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:2108::,2a02:2108:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:2110::,2a02:2110:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -12240,7 +17495,7 @@
2a02:2278::,2a02:2278:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:2280::,2a02:2280:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:2288::,2a02:2288:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:2290::,2a02:2290:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a02:2290::,2a02:2297:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a02:2298::,2a02:2298:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a02:22a0::,2a02:22a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:22a8::,2a02:22a8:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -12309,7 +17564,7 @@
2a02:24b8::,2a02:24bf:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:24c0::,2a02:24c0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:24c8::,2a02:24c8:ffff:ffff:ffff:ffff:ffff:ffff,SA
-2a02:24d0::,2a02:24d0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:24d0::,2a02:24d7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:24d8::,2a02:24d8:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:24e0::,2a02:24e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:24e8::,2a02:24e8:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -12333,7 +17588,6 @@
2a02:2580::,2a02:2587:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:2588::,2a02:2588:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:2590::,2a02:2590:ffff:ffff:ffff:ffff:ffff:ffff,SI
-2a02:2598::,2a02:2598:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:25a0::,2a02:25a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:25a8::,2a02:25af:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:25b0::,2a02:25b0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
@@ -12373,13 +17627,46 @@
2a02:26c0::,2a02:26c0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:26c8::,2a02:26c8:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a02:26d0::,2a02:26d0:ffff:ffff:ffff:ffff:ffff:ffff,PS
-2a02:26d8::,2a02:26d8:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:26e0::,2a02:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:26e8::,2a02:26e8:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:26f8::,2a02:26ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:2700::,2a02:27ff:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:2700::,2a02:2700:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a02:2708::,2a02:2708:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2710::,2a02:2710:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:2718::,2a02:271f:ffff:ffff:ffff:ffff:ffff:ffff,YE
+2a02:2720::,2a02:2720:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a02:2728::,2a02:2728:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:2730::,2a02:2730:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:2738::,2a02:2738:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:2740::,2a02:2740:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:2748::,2a02:2748:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2750::,2a02:2750:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a02:2760::,2a02:2760:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2768::,2a02:2768:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2770::,2a02:2770:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:2778::,2a02:2778:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:2780::,2a02:2780:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a02:2788::,2a02:2788:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:2790::,2a02:2790:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:2798::,2a02:2798:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:27a0::,2a02:27a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:27a8::,2a02:27af:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a02:27b0::,2a02:27b0:ffff:ffff:ffff:ffff:ffff:ffff,BA
+2a02:27b8::,2a02:27b8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:27c0::,2a02:27c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:27c8::,2a02:27c8:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:27d0::,2a02:27d0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:27d8::,2a02:27d8:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:27e0::,2a02:27e0:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a02:27e8::,2a02:27e8:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a02:27f0::,2a02:27f0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:27f8::,2a02:27f8:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:2800::,2a02:2800:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:2808::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:2808::,2a02:2808:1005:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:2808:1006::,2a02:2808:1006:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2808:1007::,2a02:2808:2800:ffff:ffff:ffff:ffff:ffff,CZ
+2a02:2808:2801::,2a02:2808:2801:ffff:ffff:ffff:ffff:ffff,RU
+2a02:2808:2802::,2a02:2808:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:2810::,2a02:2810:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:2818::,2a02:2818:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:2820::,2a02:2820:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -12413,8 +17700,7 @@
2a02:2900::,2a02:2900:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:2908::,2a02:2908:ffff:ffff:ffff:ffff:ffff:ffff,OM
2a02:2910::,2a02:2910:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:2918::,2a02:2918:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:2920::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2918::,2a02:2920:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2928::,2a02:2928:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:2930::,2a02:2930:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:2938::,2a02:2938:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12482,7 +17768,7 @@
2a02:2b30::,2a02:2b30:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:2b38::,2a02:2b38:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:2b40::,2a02:2b47:ffff:ffff:ffff:ffff:ffff:ffff,SI
-2a02:2b48::,2a02:2b48:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:2b48::,2a02:2b4f:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:2b50::,2a02:2b50:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:2b58::,2a02:2b58:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a02:2b80::,2a02:2b80:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -12511,12 +17797,16 @@
2a02:2dc0::,2a02:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:2de0::,2a02:2de0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:2e00::,2a02:2e1f:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:2f00::,2a02:2fff:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a02:2f00::,2a02:2f0f:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a02:2f80::,2a02:2f80:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a02:2fa0::,2a02:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:2fc0::,2a02:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:2fe0::,2a02:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:3000::,2a02:31ff:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:4000::,2a02:4000:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:4020::,2a02:4020:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:4040::,2a02:4040:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:4060::,2a02:4060:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a02:4060::,2a02:4067:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:4080::,2a02:4080:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a02:40a0::,2a02:40a0:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a02:40c0::,2a02:40c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -12573,7 +17863,7 @@
2a02:4780::,2a02:4780:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a02:47a0::,2a02:47a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:47c0::,2a02:47c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:47e0::,2a02:47e0:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:47e0::,2a02:47e7:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:4800::,2a02:4800:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a02:4820::,2a02:4820:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a02:4840::,2a02:4840:ffff:ffff:ffff:ffff:ffff:ffff,LV
@@ -12733,7 +18023,7 @@
2a02:5d20::,2a02:5d20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:5d40::,2a02:5d47:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:5d60::,2a02:5d60:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:5d80::,2a02:5d80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:5d80::,2a02:5d87:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:5da0::,2a02:5da0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:5dc0::,2a02:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a02:5de0::,2a02:5de0:ffff:ffff:ffff:ffff:ffff:ffff,FI
@@ -12751,7 +18041,6 @@
2a02:5f80::,2a02:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:5fa0::,2a02:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:5fc0::,2a02:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:5fe0::,2a02:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:6000::,2a02:6000:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6020::,2a02:6020:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a02:6040::,2a02:6040:ffff:ffff:ffff:ffff:ffff:ffff,IR
@@ -12815,9 +18104,7 @@
2a02:67c0::,2a02:67c0:ffff:ffff:ffff:ffff:ffff:ffff,SY
2a02:67e0::,2a02:67e0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:6800::,2a02:6800:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2a02:6820::,2a02:6820:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:6840::,2a02:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:6860::,2a02:6860:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a02:6880::,2a02:6880:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a02:68a0::,2a02:68a0:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a02:68c0::,2a02:68c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -12887,7 +18174,6 @@
2a02:7120::,2a02:7120:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:7140::,2a02:7140:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:7160::,2a02:7160:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:7180::,2a02:7180:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:71a0::,2a02:71a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:71c0::,2a02:71c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:71e0::,2a02:71e0:ffff:ffff:ffff:ffff:ffff:ffff,SI
@@ -12910,9 +18196,7 @@
2a02:7420::,2a02:7420:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:7440::,2a02:7440:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:7460::,2a02:7460:ffff:ffff:ffff:ffff:ffff:ffff,MQ
-2a02:7480::,2a02:7480:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:74a0::,2a02:74a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a02:74c0::,2a02:74c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:74e0::,2a02:74e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:7500::,2a02:7500:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a02:7520::,2a02:7520:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -12941,7 +18225,7 @@
2a02:7800::,2a02:7800:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:7820::,2a02:7820:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:7840::,2a02:7840:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a02:7860::,2a02:7860:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:7860::,2a02:7867:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:7880::,2a02:7880:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:78a0::,2a02:78a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:78c0::,2a02:78c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -12999,13 +18283,22 @@
2a02:7fa0::,2a02:7fa0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:7fc0::,2a02:7fc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:7fe0::,2a02:7fe0:ffff:ffff:ffff:ffff:ffff:ffff,IS
-2a02:8000::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:8010::,2a02:8017:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a02:8020::,2a02:8023:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:8040::,2a02:8043:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a02:8060::,2a02:8061:ffff:ffff:ffff:ffff:ffff:ffff,AD
+2a02:8070::,2a02:8071:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:8080::,2a02:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a02:80c0::,2a02:80c3:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a02:80e0::,2a02:80e3:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a02:8100::,2a02:811f:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a02:8200::,2a02:821f:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:8300::,2a02:830f:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a02:8380::,2a02:838f:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a02:8400::,2a02:847f:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:8800::,2a02:88ff:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:9000::,2a02:91ff:ffff:ffff:ffff:ffff:ffff:ffff,ES
-2a02:a000::,2a02:a0ff:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a02:a000::,2a02:a03f:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a02:a200::,2a02:a21f:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:a300::,2a02:a31f:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:a400::,2a02:a47f:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -13048,7 +18341,6 @@
2a02:c3c0::,2a02:c3c7:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a02:c400::,2a02:c407:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a02:c440::,2a02:c447:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a02:c480::,2a02:c487:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:c4c0::,2a02:c4c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:c500::,2a02:c507:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a02:c540::,2a02:c547:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -13172,9 +18464,7 @@
2a02:e180::,2a02:e187:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:e1c0::,2a02:e1c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:e200::,2a02:e203:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a02:e220::,2a02:e223:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a02:e240::,2a02:e247:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:e280::,2a02:e287:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:e2c0::,2a02:e2c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a02:e300::,2a02:e307:ffff:ffff:ffff:ffff:ffff:ffff,BY
2a02:e340::,2a02:e347:ffff:ffff:ffff:ffff:ffff:ffff,NO
@@ -13183,12 +18473,10 @@
2a02:e400::,2a02:e407:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a02:e440::,2a02:e447:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:e480::,2a02:e487:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:e4c0::,2a02:e4c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a02:e500::,2a02:e507:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:e540::,2a02:e547:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a02:e580::,2a02:e587:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a02:e5c0::,2a02:e5c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a02:e600::,2a02:e603:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:e620::,2a02:e623:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:e640::,2a02:e647:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:e680::,2a02:e687:ffff:ffff:ffff:ffff:ffff:ffff,JO
@@ -13200,10 +18488,8 @@
2a02:e840::,2a02:e847:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:e880::,2a02:e887:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a02:e900::,2a02:e907:ffff:ffff:ffff:ffff:ffff:ffff,IE
-2a02:e940::,2a02:e947:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a02:e980::,2a02:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL
2a02:e9c0::,2a02:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a02:ea00::,2a02:ea07:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a02:ea40::,2a02:ea47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:ea80::,2a02:ea87:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a02:eac0::,2a02:eac7:ffff:ffff:ffff:ffff:ffff:ffff,PL
@@ -13234,7 +18520,9 @@
2a02:f0c0::,2a02:f0c7:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a02:f100::,2a02:f107:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a02:f140::,2a02:f147:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a02:f180::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:f180::,2a02:f181:2fff:ffff:ffff:ffff:ffff:ffff,FR
+2a02:f181:3000::,2a02:f181:3000:ffff:ffff:ffff:ffff:ffff,RO
+2a02:f181:3001::,2a02:f187:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a02:f1c0::,2a02:f1c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a02:f200::,2a02:f207:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a02:f240::,2a02:f247:ffff:ffff:ffff:ffff:ffff:ffff,IR
@@ -13299,7 +18587,6 @@
2a03:a0::,2a03:a0:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a03:c0::,2a03:c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:e0::,2a03:e0:ffff:ffff:ffff:ffff:ffff:ffff,SK
-2a03:100::,2a03:100:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a03:120::,2a03:120:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:140::,2a03:140:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:160::,2a03:160:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -13331,7 +18618,7 @@
2a03:4c0::,2a03:4c0:ffff:ffff:ffff:ffff:ffff:ffff,IE
2a03:4e0::,2a03:4e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:500::,2a03:500:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a03:520::,2a03:520:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a03:520::,2a03:527:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:540::,2a03:540:ffff:ffff:ffff:ffff:ffff:ffff,UZ
2a03:560::,2a03:560:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:580::,2a03:580:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -13354,7 +18641,7 @@
2a03:7a0::,2a03:7a0:ffff:ffff:ffff:ffff:ffff:ffff,ME
2a03:7c0::,2a03:7c0:ffff:ffff:ffff:ffff:ffff:ffff,PS
2a03:7e0::,2a03:7e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a03:800::,2a03:800:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:800::,2a03:807:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:820::,2a03:820:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:840::,2a03:840:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:860::,2a03:860:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -13396,7 +18683,6 @@
2a03:d20::,2a03:d20:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:d40::,2a03:d40:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:d60::,2a03:d60:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a03:d80::,2a03:d80:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:da0::,2a03:da0:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a03:dc0::,2a03:dc0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:de0::,2a03:de0:ffff:ffff:ffff:ffff:ffff:ffff,BE
@@ -13435,7 +18721,6 @@
2a03:1240::,2a03:1240:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:1260::,2a03:1260:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:1280::,2a03:1280:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a03:12a0::,2a03:12a0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:12c0::,2a03:12c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:12e0::,2a03:12e0:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a03:1300::,2a03:1300:ffff:ffff:ffff:ffff:ffff:ffff,CY
@@ -13450,7 +18735,6 @@
2a03:1420::,2a03:1420:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:1440::,2a03:1440:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:1460::,2a03:1460:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a03:1480::,2a03:1480:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:14a0::,2a03:14a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:14c0::,2a03:14c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:14e0::,2a03:14e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -13489,7 +18773,7 @@
2a03:1920::,2a03:1920:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:1940::,2a03:1940:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:1960::,2a03:1960:ffff:ffff:ffff:ffff:ffff:ffff,LT
-2a03:1980::,2a03:1980:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a03:1980::,2a03:1987:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:19a0::,2a03:19a0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:19e0::,2a03:19e0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:1a00::,2a03:1a00:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -13528,307 +18812,565 @@
2a03:1e20::,2a03:1e20:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:1e40::,2a03:1e40:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:1e60::,2a03:1e60:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:1e80::,2a03:1e80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:1e80::,2a03:1e87:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:1ea0::,2a03:1ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:1ec0::,2a03:1ec0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a03:1ee0::,2a03:1ee0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:1f00::,2a03:1f00:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:1f20::,2a03:1f20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:1f40::,2a03:1f40:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:1f60::,2a03:1f60:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:1f80::,2a03:1f80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:1fa0::,2a03:1fa0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:2000::,2a03:2000:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:2040::,2a03:2040:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:2020::,2a03:2020:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:2040::,2a03:2047:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:2060::,2a03:2060:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:2080::,2a03:2080:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:20a0::,2a03:20a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:20c0::,2a03:20c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:20e0::,2a03:20e0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:2100::,2a03:2100:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:2120::,2a03:2120:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:2140::,2a03:2140:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:2160::,2a03:2160:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2180::,2a03:2180:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:21a0::,2a03:21a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:21c0::,2a03:21c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:21e0::,2a03:21e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2200::,2a03:2200:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a03:2220::,2a03:2220:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:2240::,2a03:2240:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:2260::,2a03:2267:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2280::,2a03:2280:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:22a0::,2a03:22a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:22c0::,2a03:22c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a03:2300::,2a03:2300:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2a03:22e0::,2a03:22e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:2300::,2a03:2307:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2a03:2320::,2a03:2320:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:2340::,2a03:2340:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:2360::,2a03:2360:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:2380::,2a03:2380:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:23a0::,2a03:23a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:23c0::,2a03:23c0:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a03:23e0::,2a03:23e0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:2400::,2a03:2400:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2420::,2a03:2420:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:2440::,2a03:2440:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:2460::,2a03:2460:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:2480::,2a03:2480:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:24a0::,2a03:24a0:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a03:24c0::,2a03:24c0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:24e0::,2a03:24e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:2500::,2a03:2500:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2520::,2a03:2520:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:2540::,2a03:2540:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2560::,2a03:2560:ffff:ffff:ffff:ffff:ffff:ffff,MK
2a03:2580::,2a03:2580:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:25a0::,2a03:25a0:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:25c0::,2a03:25c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:25e0::,2a03:25e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:2600::,2a03:2600:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:2620::,2a03:2620:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:2640::,2a03:2640:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:2660::,2a03:2660:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a03:2680::,2a03:2680:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:26a0::,2a03:26a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:26c0::,2a03:26c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:26e0::,2a03:26e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:2700::,2a03:2700:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:2720::,2a03:2720:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2740::,2a03:2740:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:2760::,2a03:2760:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a03:2780::,2a03:2780:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:27a0::,2a03:27a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:27c0::,2a03:27c0:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2a03:27e0::,2a03:27e0:ffff:ffff:ffff:ffff:ffff:ffff,CY
2a03:2800::,2a03:2800:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2820::,2a03:2820:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:2840::,2a03:2840:ffff:ffff:ffff:ffff:ffff:ffff,US
-2a03:2880::,2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:2860::,2a03:2860:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:2880::,2a03:2880:10:ffff:ffff:ffff:ffff:ffff,IE
+2a03:2880:11::,2a03:2880:11:ffff:ffff:ffff:ffff:ffff,US
+2a03:2880:12::,2a03:2880:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:28a0::,2a03:28a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:28c0::,2a03:28c0:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:28e0::,2a03:28e0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:2900::,2a03:2900:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2920::,2a03:2920:ffff:ffff:ffff:ffff:ffff:ffff,ME
2a03:2940::,2a03:2940:ffff:ffff:ffff:ffff:ffff:ffff,PS
+2a03:2960::,2a03:2960:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:2980::,2a03:2980:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:29a0::,2a03:29a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:29c0::,2a03:29c0:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a03:29e0::,2a03:29e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:2a00::,2a03:2a00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2a20::,2a03:2a20:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:2a40::,2a03:2a40:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a03:2a60::,2a03:2a60:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:2a80::,2a03:2a80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:2aa0::,2a03:2aa0:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a03:2ac0::,2a03:2ac0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2ae0::,2a03:2ae0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:2b00::,2a03:2b00:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:2b20::,2a03:2b20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2b40::,2a03:2b40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:2b60::,2a03:2b60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:2b80::,2a03:2b80:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:2ba0::,2a03:2ba0:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a03:2bc0::,2a03:2bc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:2be0::,2a03:2be0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:2c00::,2a03:2c00:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:2c20::,2a03:2c20:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:2c40::,2a03:2c40:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:2c60::,2a03:2c60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:2c80::,2a03:2c80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2ca0::,2a03:2ca0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:2cc0::,2a03:2cc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:2d00::,2a03:2d00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2d20::,2a03:2d20:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2d60::,2a03:2d60:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:2d80::,2a03:2d80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:2da0::,2a03:2da0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:2dc0::,2a03:2dc0:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a03:2de0::,2a03:2de0:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:2e00::,2a03:2e00:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:2e20::,2a03:2e20:ffff:ffff:ffff:ffff:ffff:ffff,LV
2a03:2e40::,2a03:2e40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:2e60::,2a03:2e60:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:2ea0::,2a03:2ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:2ec0::,2a03:2ec0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:2ee0::,2a03:2ee0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:2f00::,2a03:2f00:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a03:2f20::,2a03:2f20:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:2f40::,2a03:2f40:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a03:2f60::,2a03:2f60:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:2f80::,2a03:2f80:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:2fa0::,2a03:2fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:2fc0::,2a03:2fc0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:2fe0::,2a03:2fe0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:3000::,2a03:3000:ffff:ffff:ffff:ffff:ffff:ffff,BY
+2a03:3020::,2a03:3020:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3040::,2a03:3040:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:3060::,2a03:3060:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:30a0::,2a03:30a0:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a03:30c0::,2a03:30c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:30e0::,2a03:30e0:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:3100::,2a03:3100:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3120::,2a03:3120:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3140::,2a03:3140:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:3160::,2a03:3160:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:3180::,2a03:3180:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a03:31a0::,2a03:31a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:31c0::,2a03:31c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:3200::,2a03:3200:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3220::,2a03:3220:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a03:3240::,2a03:3240:ffff:ffff:ffff:ffff:ffff:ffff,UZ
+2a03:3260::,2a03:3260:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:3280::,2a03:3280:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:32a0::,2a03:32a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:32c0::,2a03:32c0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a03:32e0::,2a03:32e0:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a03:3300::,2a03:3300:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:3320::,2a03:3320:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a03:3340::,2a03:3340:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:3360::,2a03:3360:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:3380::,2a03:3380:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a03:33a0::,2a03:33a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:33c0::,2a03:33c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:33e0::,2a03:33e0:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:3400::,2a03:3400:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:3420::,2a03:3420:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:3440::,2a03:3440:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a03:3460::,2a03:3460:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:3480::,2a03:3480:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:34a0::,2a03:34a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:34c0::,2a03:34c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:34e0::,2a03:34e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:3500::,2a03:3500:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:3520::,2a03:3520:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:3540::,2a03:3547:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:3580::,2a03:3580:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a03:35a0::,2a03:35a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:35c0::,2a03:35c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:35e0::,2a03:35e0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:3600::,2a03:3600:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a03:3620::,2a03:3620:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:3640::,2a03:3640:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:3660::,2a03:3660:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3680::,2a03:3680:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:36a0::,2a03:36a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:36c0::,2a03:36c0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:36e0::,2a03:36e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3700::,2a03:3700:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3720::,2a03:3720:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a03:3760::,2a03:3760:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:37a0::,2a03:37a0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:37c0::,2a03:37c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:37e0::,2a03:37e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3800::,2a03:3800:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:3820::,2a03:3820:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3840::,2a03:3847:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:3880::,2a03:3880:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:38a0::,2a03:38a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:38c0::,2a03:38c0:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:38e0::,2a03:38e0:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a03:3900::,2a03:3900:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:3920::,2a03:3920:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:3940::,2a03:3940:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:3960::,2a03:3960:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:3980::,2a03:3980:ffff:ffff:ffff:ffff:ffff:ffff,BY
2a03:39c0::,2a03:39c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:39e0::,2a03:39e0:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a03:3a00::,2a03:3a00:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:3a20::,2a03:3a20:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a03:3a40::,2a03:3a40:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3a80::,2a03:3a80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3aa0::,2a03:3aa0:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:3ac0::,2a03:3ac0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:3ae0::,2a03:3ae0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:3b00::,2a03:3b00:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:3b20::,2a03:3b20:ffff:ffff:ffff:ffff:ffff:ffff,CY
2a03:3b40::,2a03:3b40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:3b60::,2a03:3b60:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:3b80::,2a03:3b80:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:3ba0::,2a03:3ba0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3bc0::,2a03:3bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:3be0::,2a03:3be0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3c00::,2a03:3c00:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:3c20::,2a03:3c20:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:3c40::,2a03:3c40:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:3c60::,2a03:3c60:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3c80::,2a03:3c80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:3ca0::,2a03:3ca0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:3cc0::,2a03:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:3d00::,2a03:3d00:ffff:ffff:ffff:ffff:ffff:ffff,AM
+2a03:3d20::,2a03:3d20:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3d40::,2a03:3d40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3d60::,2a03:3d60:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:3d80::,2a03:3d80:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:3da0::,2a03:3da0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:3dc0::,2a03:3dc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a03:3e00::,2a03:3e00:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:3de0::,2a03:3de0:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:3e00::,2a03:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:3e40::,2a03:3e40:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3e60::,2a03:3e60:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:3e80::,2a03:3e80:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:3ea0::,2a03:3ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:3ec0::,2a03:3ec0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:3ee0::,2a03:3ee0:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a03:3f00::,2a03:3f00:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:3f20::,2a03:3f20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:3f40::,2a03:3f40:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:3f60::,2a03:3f60:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a03:3f80::,2a03:3f80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:3fa0::,2a03:3fa0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:3fc0::,2a03:3fc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:3fe0::,2a03:3fe0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4000::,2a03:4000:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4020::,2a03:4020:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4040::,2a03:4040:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4060::,2a03:4060:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:4080::,2a03:4080:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:40a0::,2a03:40a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:40c0::,2a03:40c0:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:40e0::,2a03:40e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4100::,2a03:4107:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a03:4140::,2a03:4140:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4160::,2a03:4160:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4180::,2a03:4180:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:41a0::,2a03:41a0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:41c0::,2a03:41c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:41e0::,2a03:41e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4200::,2a03:4200:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:4220::,2a03:4220:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:4240::,2a03:4240:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4260::,2a03:4260:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:4280::,2a03:4280:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a03:42a0::,2a03:42a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:42c0::,2a03:42c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:42e0::,2a03:42e0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4300::,2a03:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4340::,2a03:4340:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4360::,2a03:4360:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a03:4380::,2a03:4380:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:43a0::,2a03:43a0:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:43c0::,2a03:43c0:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a03:43e0::,2a03:43e0:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:4400::,2a03:4400:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:4440::,2a03:4440:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a03:4460::,2a03:4460:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:4480::,2a03:4480:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a03:44a0::,2a03:44a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:44c0::,2a03:44c0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:4500::,2a03:4500:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:4520::,2a03:4520:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:4540::,2a03:4540:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:4560::,2a03:4560:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:4580::,2a03:4580:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:45a0::,2a03:45a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:45c0::,2a03:45c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:45e0::,2a03:45e0:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:4600::,2a03:4600:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:4620::,2a03:4620:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:4640::,2a03:4640:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:4680::,2a03:4680:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a03:4680::,2a03:4687:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a03:46a0::,2a03:46a0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a03:46c0::,2a03:46c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:46e0::,2a03:46e0:ffff:ffff:ffff:ffff:ffff:ffff,UZ
2a03:4700::,2a03:4700:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4720::,2a03:4720:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:4740::,2a03:4740:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:4760::,2a03:4760:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:4780::,2a03:4780:ffff:ffff:ffff:ffff:ffff:ffff,KW
+2a03:47a0::,2a03:47a0:ffff:ffff:ffff:ffff:ffff:ffff,SK
2a03:47c0::,2a03:47c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:4800::,2a03:4800:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:4820::,2a03:4820:ffff:ffff:ffff:ffff:ffff:ffff,GE
2a03:4840::,2a03:4847:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:4880::,2a03:4880:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:48a0::,2a03:48a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:48c0::,2a03:48c0:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:48e0::,2a03:48e0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4900::,2a03:4900:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4920::,2a03:4920:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4940::,2a03:4940:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:4960::,2a03:4960:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a03:4980::,2a03:4980:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:49a0::,2a03:49a0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:49c0::,2a03:49c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2a03:4a00::,2a03:4a00:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:49e0::,2a03:49e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:4a20::,2a03:4a20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4a40::,2a03:4a40:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:4a60::,2a03:4a60:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a03:4a80::,2a03:4a80:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:4aa0::,2a03:4aa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4ac0::,2a03:4ac0:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a03:4ae0::,2a03:4ae0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:4b00::,2a03:4b00:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:4b20::,2a03:4b20:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:4b40::,2a03:4b40:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:4b80::,2a03:4b80:ffff:ffff:ffff:ffff:ffff:ffff,AL
2a03:4bc0::,2a03:4bc0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:4c00::,2a03:4c07:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:4c40::,2a03:4c40:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a03:4c60::,2a03:4c60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4c80::,2a03:4c80:ffff:ffff:ffff:ffff:ffff:ffff,LI
+2a03:4ca0::,2a03:4ca0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:4cc0::,2a03:4cc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:4ce0::,2a03:4ce0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:4d00::,2a03:4d00:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4d20::,2a03:4d20:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a03:4d40::,2a03:4d40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4d60::,2a03:4d60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4d80::,2a03:4d80:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:4da0::,2a03:4da0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:4dc0::,2a03:4dc0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4de0::,2a03:4de0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:4e00::,2a03:4e00:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:4e20::,2a03:4e20:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4e40::,2a03:4e40:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a03:4e60::,2a03:4e60:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:4e80::,2a03:4e80:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a03:4ea0::,2a03:4ea0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:4ec0::,2a03:4ec0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:4ee0::,2a03:4ee0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:4f00::,2a03:4f00:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:4f20::,2a03:4f20:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:4f40::,2a03:4f40:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:4f60::,2a03:4f60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:4f80::,2a03:4f80:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:4fa0::,2a03:4fa0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:5000::,2a03:5000:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:5020::,2a03:5020:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:5040::,2a03:5040:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5060::,2a03:5060:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5080::,2a03:5080:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:50a0::,2a03:50a0:ffff:ffff:ffff:ffff:ffff:ffff,FI
2a03:50c0::,2a03:50c0:ffff:ffff:ffff:ffff:ffff:ffff,GI
+2a03:50e0::,2a03:50e0:ffff:ffff:ffff:ffff:ffff:ffff,MT
2a03:5100::,2a03:5100:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:5120::,2a03:5120:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:5140::,2a03:5140:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:5160::,2a03:5160:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:5180::,2a03:5180:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a03:51a0::,2a03:51a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:51c0::,2a03:51c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:51e0::,2a03:51e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5200::,2a03:5200:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5220::,2a03:5220:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a03:5240::,2a03:5240:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5260::,2a03:5260:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:5280::,2a03:5280:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:52c0::,2a03:52c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:52e0::,2a03:52e0:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:5300::,2a03:5307:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:5360::,2a03:5360:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:5380::,2a03:5380:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:53a0::,2a03:53a0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:53c0::,2a03:53c0:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:53e0::,2a03:53e0:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:5400::,2a03:5400:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a03:5420::,2a03:5420:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:5440::,2a03:5440:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a03:5460::,2a03:5460:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:5480::,2a03:5480:ffff:ffff:ffff:ffff:ffff:ffff,LI
2a03:54c0::,2a03:54c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:54e0::,2a03:54e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:5500::,2a03:5501:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:5520::,2a03:5520:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:5540::,2a03:5540:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:5560::,2a03:5560:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:5580::,2a03:5587:ffff:ffff:ffff:ffff:ffff:ffff,NO
-2a03:55c0::,2a03:55c0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:5600::,2a03:5600:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5620::,2a03:5620:ffff:ffff:ffff:ffff:ffff:ffff,AM
2a03:5640::,2a03:5640:ffff:ffff:ffff:ffff:ffff:ffff,LU
2a03:5680::,2a03:5680:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:56c0::,2a03:56c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:56e0::,2a03:56e0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a03:5700::,2a03:5700:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:5720::,2a03:5720:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:5740::,2a03:5740:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:5760::,2a03:5760:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:5780::,2a03:5780:ffff:ffff:ffff:ffff:ffff:ffff,KW
+2a03:57a0::,2a03:57a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:57c0::,2a03:57c0:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a03:57e0::,2a03:57e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:5800::,2a03:5800:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5820::,2a03:5820:ffff:ffff:ffff:ffff:ffff:ffff,EE
2a03:5840::,2a03:5840:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:5860::,2a03:5860:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:5880::,2a03:5880:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a03:58a0::,2a03:58a0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:58c0::,2a03:58c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:58e0::,2a03:58e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:5900::,2a03:5907:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a03:5940::,2a03:5940:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:5960::,2a03:5960:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:5980::,2a03:5980:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:59a0::,2a03:59a0:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:59c0::,2a03:59c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:59e0::,2a03:59e0:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:5a00::,2a03:5a07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5a60::,2a03:5a60:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5a80::,2a03:5a80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5aa0::,2a03:5aa0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:5ac0::,2a03:5ac0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:5ae0::,2a03:5ae0:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:5b00::,2a03:5b00:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a03:5b20::,2a03:5b20:ffff:ffff:ffff:ffff:ffff:ffff,RE
2a03:5b40::,2a03:5b40:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:5b60::,2a03:5b60:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:5b80::,2a03:5b80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5bc0::,2a03:5bc0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:5be0::,2a03:5be0:ffff:ffff:ffff:ffff:ffff:ffff,BY
2a03:5c00::,2a03:5c00:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a03:5c40::,2a03:5c40:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:5c20::,2a03:5c20:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:5c60::,2a03:5c60:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:5c80::,2a03:5c80:ffff:ffff:ffff:ffff:ffff:ffff,RU
-2a03:5cc0::,2a03:5cc0:ffff:ffff:ffff:ffff:ffff:ffff,BA
+2a03:5ca0::,2a03:5ca0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5ce0::,2a03:5ce0:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a03:5d00::,2a03:5d07:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:5d40::,2a03:5d40:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:5d60::,2a03:5d60:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:5d80::,2a03:5d80:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:5da0::,2a03:5da0:ffff:ffff:ffff:ffff:ffff:ffff,GR
2a03:5dc0::,2a03:5dc0:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a03:5de0::,2a03:5de0:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:5e20::,2a03:5e20:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:5e40::,2a03:5e40:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a03:5e60::,2a03:5e60:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:5e80::,2a03:5e80:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a03:5ea0::,2a03:5ea0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:5ec0::,2a03:5ec0:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:5ee0::,2a03:5ee0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:5f00::,2a03:5f00:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a03:5f20::,2a03:5f20:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:5f60::,2a03:5f60:ffff:ffff:ffff:ffff:ffff:ffff,HU
2a03:5f80::,2a03:5f80:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:5fa0::,2a03:5fa0:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:5fc0::,2a03:5fc0:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a03:5fe0::,2a03:5fe0:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a03:6000::,2a03:6000:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:6020::,2a03:6020:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a03:6040::,2a03:6040:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:6060::,2a03:6060:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:6080::,2a03:6087:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:60c0::,2a03:60c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:60e0::,2a03:60e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6100::,2a03:6100:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a03:6120::,2a03:6120:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:6140::,2a03:6140:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:6160::,2a03:6160:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a03:6180::,2a03:6180:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a03:61a0::,2a03:61a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:61c0::,2a03:61c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:6200::,2a03:6200:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:6220::,2a03:6220:ffff:ffff:ffff:ffff:ffff:ffff,HR
2a03:6240::,2a03:6240:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a03:6260::,2a03:6260:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:62a0::,2a03:62a0:ffff:ffff:ffff:ffff:ffff:ffff,AU
2a03:62c0::,2a03:62c0:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:62e0::,2a03:62e0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:6300::,2a03:6300:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a03:6340::,2a03:6340:ffff:ffff:ffff:ffff:ffff:ffff,KZ
2a03:6380::,2a03:6380:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a03:63a0::,2a03:63a7:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a03:63c0::,2a03:63c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:63e0::,2a03:63e0:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:6400::,2a03:6400:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:6420::,2a03:6420:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6440::,2a03:6440:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:6460::,2a03:6460:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6480::,2a03:6480:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a03:64a0::,2a03:64a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:64c0::,2a03:64c0:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a03:64e0::,2a03:64e0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6500::,2a03:6500:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:6520::,2a03:6520:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:6540::,2a03:6540:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a03:6560::,2a03:6560:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:6580::,2a03:6580:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:65a0::,2a03:65a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:65c0::,2a03:65c0:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:65e0::,2a03:65e0:ffff:ffff:ffff:ffff:ffff:ffff,AT
2a03:6600::,2a03:6600:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a03:6620::,2a03:6620:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:6640::,2a03:6640:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a03:6660::,2a03:6660:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6680::,2a03:6680:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a03:66a0::,2a03:66a0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:66c0::,2a03:66c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:66e0::,2a03:66e0:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:6700::,2a03:6707:ffff:ffff:ffff:ffff:ffff:ffff,KW
2a03:6740::,2a03:6740:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a03:6760::,2a03:6760:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:6780::,2a03:6780:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a03:67a0::,2a03:67a0:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a03:67c0::,2a03:67c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:67e0::,2a03:67e0:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a03:6800::,2a03:6800:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a03:6820::,2a03:6820:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:6840::,2a03:6840:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:6860::,2a03:6860:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:6880::,2a03:6880:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:68a0::,2a03:68a0:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a03:68c0::,2a03:68c0:ffff:ffff:ffff:ffff:ffff:ffff,CY
+2a03:68e0::,2a03:68e0:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:6900::,2a03:6900:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a03:6920::,2a03:6920:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:6940::,2a03:6940:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a03:6960::,2a03:6960:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:6980::,2a03:6980:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a03:69a0::,2a03:69a0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:69c0::,2a03:69c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
-2a03:6a00::,2a03:6a00:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:6a00::,2a03:6a07:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:6a40::,2a03:6a40:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6a80::,2a03:6a80:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:6ac0::,2a03:6ac0:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a03:6b00::,2a03:6b00:ffff:ffff:ffff:ffff:ffff:ffff,JO
2a03:6b40::,2a03:6b40:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:6b80::,2a03:6b80:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a03:6bc0::,2a03:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:6c00::,2a03:6c00:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:6c40::,2a03:6c40:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:6c80::,2a03:6c80:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -14100,7 +19642,6 @@
2a03:b240::,2a03:b240:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a03:b280::,2a03:b280:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a03:b300::,2a03:b300:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a03:b340::,2a03:b340:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a03:b380::,2a03:b380:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:b3c0::,2a03:b3c0:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a03:b400::,2a03:b400:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -14200,7 +19741,6 @@
2a03:cb80::,2a03:cb80:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a03:cbc0::,2a03:cbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a03:cc00::,2a03:cc00:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a03:cc40::,2a03:cc40:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a03:cc80::,2a03:cc80:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a03:ccc0::,2a03:ccc0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:cd00::,2a03:cd00:ffff:ffff:ffff:ffff:ffff:ffff,US
@@ -14214,14 +19754,14 @@
2a03:cf40::,2a03:cf40:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:cf80::,2a03:cf80:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:cfc0::,2a03:cfc0:ffff:ffff:ffff:ffff:ffff:ffff,PL
-2a03:d000::,2a03:d000:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a03:d000::,2a03:d007:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:d040::,2a03:d040:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:d080::,2a03:d080:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:d0c0::,2a03:d0c0:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a03:d100::,2a03:d100:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:d140::,2a03:d140:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a03:d180::,2a03:d180:ffff:ffff:ffff:ffff:ffff:ffff,BG
-2a03:d1c0::,2a03:d1c0:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a03:d1c0::,2a03:d1c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:d200::,2a03:d200:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a03:d280::,2a03:d280:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a03:d2c0::,2a03:d2c0:ffff:ffff:ffff:ffff:ffff:ffff,IT
@@ -14231,7 +19771,9 @@
2a03:d3c0::,2a03:d3c0:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:d400::,2a03:d400:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a03:d440::,2a03:d440:ffff:ffff:ffff:ffff:ffff:ffff,HU
-2a03:d480::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a03:d480::,2a03:d480::ffff:ffff:ffff:ffff:ffff,GB
+2a03:d480:1::,2a03:d480:1:ffff:ffff:ffff:ffff:ffff,IM
+2a03:d480:2::,2a03:d480:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:d4c0::,2a03:d4c0:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a03:d500::,2a03:d500:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a03:d540::,2a03:d540:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -14531,13 +20073,11 @@
2a04:2000::,2a04:2007:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:2040::,2a04:2047:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:2080::,2a04:2087:ffff:ffff:ffff:ffff:ffff:ffff,IT
-2a04:20c0::,2a04:20c7:ffff:ffff:ffff:ffff:ffff:ffff,TR
2a04:2100::,2a04:2107:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:2140::,2a04:2147:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:2180::,2a04:2187:ffff:ffff:ffff:ffff:ffff:ffff,LT
2a04:21c0::,2a04:21c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:2200::,2a04:2207:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a04:2240::,2a04:2247:ffff:ffff:ffff:ffff:ffff:ffff,BH
2a04:2280::,2a04:2287:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:22c0::,2a04:22c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:2300::,2a04:2307:ffff:ffff:ffff:ffff:ffff:ffff,SE
@@ -14790,7 +20330,6 @@
2a04:6540::,2a04:6547:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:6580::,2a04:6587:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:65c0::,2a04:65c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
-2a04:6600::,2a04:6607:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:6640::,2a04:6647:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:6650::,2a04:6651:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:6680::,2a04:6687:ffff:ffff:ffff:ffff:ffff:ffff,TR
@@ -14805,7 +20344,6 @@
2a04:68c0::,2a04:68c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:6900::,2a04:6907:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a04:6940::,2a04:6947:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a04:6980::,2a04:6987:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:69c0::,2a04:69c7:ffff:ffff:ffff:ffff:ffff:ffff,MK
2a04:6a00::,2a04:6a07:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:6a40::,2a04:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -14819,7 +20357,6 @@
2a04:6c40::,2a04:6c47:ffff:ffff:ffff:ffff:ffff:ffff,BE
2a04:6c80::,2a04:6c87:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:6cc0::,2a04:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,SE
-2a04:6d00::,2a04:6d07:ffff:ffff:ffff:ffff:ffff:ffff,SE
2a04:6d40::,2a04:6d47:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a04:6d80::,2a04:6d87:ffff:ffff:ffff:ffff:ffff:ffff,PT
2a04:6dc0::,2a04:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
@@ -14864,7 +20401,6 @@
2a04:7740::,2a04:7747:ffff:ffff:ffff:ffff:ffff:ffff,IQ
2a04:7780::,2a04:7787:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:77c0::,2a04:77c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
-2a04:7800::,2a04:7807:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:7840::,2a04:7847:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:7880::,2a04:7887:ffff:ffff:ffff:ffff:ffff:ffff,NO
2a04:78c0::,2a04:78c3:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -14930,7 +20466,6 @@
2a04:8740::,2a04:8747:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:8780::,2a04:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:87c0::,2a04:87c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
-2a04:8800::,2a04:8807:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:8840::,2a04:8847:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:8880::,2a04:8887:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:88c0::,2a04:88c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
@@ -15043,7 +20578,6 @@
2a04:a3c0::,2a04:a3c7:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:a400::,2a04:a407:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:a440::,2a04:a440:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a04:a450::,2a04:a451:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:a460::,2a04:a461:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:a470::,2a04:a471:ffff:ffff:ffff:ffff:ffff:ffff,DK
2a04:a480::,2a04:a487:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -15069,7 +20603,6 @@
2a04:a980::,2a04:a987:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:a9c0::,2a04:a9c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:aa00::,2a04:aa07:ffff:ffff:ffff:ffff:ffff:ffff,UA
-2a04:aa40::,2a04:aa47:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:aa80::,2a04:aa87:ffff:ffff:ffff:ffff:ffff:ffff,SA
2a04:aac0::,2a04:aac7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:ab00::,2a04:ab07:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -15147,7 +20680,6 @@
2a04:be80::,2a04:be87:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:bec0::,2a04:bec7:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:bf00::,2a04:bf07:ffff:ffff:ffff:ffff:ffff:ffff,AT
-2a04:bf40::,2a04:bf47:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a04:bf80::,2a04:bf87:ffff:ffff:ffff:ffff:ffff:ffff,CZ
2a04:bfc0::,2a04:bfc7:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a04:c000::,2a04:c007:ffff:ffff:ffff:ffff:ffff:ffff,CH
@@ -15182,7 +20714,6 @@
2a04:c800::,2a04:c807:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:c840::,2a04:c847:ffff:ffff:ffff:ffff:ffff:ffff,AZ
2a04:c880::,2a04:c887:ffff:ffff:ffff:ffff:ffff:ffff,GB
-2a04:c8c0::,2a04:c8c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:c900::,2a04:c907:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:c940::,2a04:c947:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:c980::,2a04:c987:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -15249,7 +20780,6 @@
2a04:d900::,2a04:d907:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:d940::,2a04:d947:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:d980::,2a04:d987:ffff:ffff:ffff:ffff:ffff:ffff,IL
-2a04:d9c0::,2a04:d9c7:ffff:ffff:ffff:ffff:ffff:ffff,RO
2a04:da00::,2a04:da07:ffff:ffff:ffff:ffff:ffff:ffff,AE
2a04:da40::,2a04:da47:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a04:da80::,2a04:da87:ffff:ffff:ffff:ffff:ffff:ffff,GB
@@ -15311,9 +20841,7 @@
2a04:e900::,2a04:e907:ffff:ffff:ffff:ffff:ffff:ffff,FR
2a04:e940::,2a04:e947:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:e980::,2a04:e987:ffff:ffff:ffff:ffff:ffff:ffff,IL
-2a04:e9c0::,2a04:e9c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:ea00::,2a04:ea07:ffff:ffff:ffff:ffff:ffff:ffff,AE
-2a04:ea40::,2a04:ea47:ffff:ffff:ffff:ffff:ffff:ffff,PL
2a04:ea80::,2a04:ea87:ffff:ffff:ffff:ffff:ffff:ffff,LB
2a04:eac0::,2a04:eac7:ffff:ffff:ffff:ffff:ffff:ffff,DE
2a04:eb00::,2a04:eb07:ffff:ffff:ffff:ffff:ffff:ffff,LT
@@ -15321,6 +20849,7 @@
2a04:eb80::,2a04:eb87:ffff:ffff:ffff:ffff:ffff:ffff,ES
2a04:ebc0::,2a04:ebc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:ec00::,2a04:ec01:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a04:ec10::,2a04:ec11:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:ec20::,2a04:ec23:ffff:ffff:ffff:ffff:ffff:ffff,RS
2a04:ec40::,2a04:ec47:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:ec80::,2a04:ec87:ffff:ffff:ffff:ffff:ffff:ffff,DE
@@ -15349,7 +20878,6 @@
2a04:f280::,2a04:f287:ffff:ffff:ffff:ffff:ffff:ffff,BG
2a04:f2c0::,2a04:f2c7:ffff:ffff:ffff:ffff:ffff:ffff,BA
2a04:f300::,2a04:f300:ffff:ffff:ffff:ffff:ffff:ffff,NL
-2a04:f320::,2a04:f323:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a04:f340::,2a04:f347:ffff:ffff:ffff:ffff:ffff:ffff,CH
2a04:f380::,2a04:f387:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:f3c0::,2a04:f3c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
@@ -15383,7 +20911,6 @@
2a04:fbc0::,2a04:fbc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2a04:fc00::,2a04:fc07:ffff:ffff:ffff:ffff:ffff:ffff,IT
2a04:fc40::,2a04:fc47:ffff:ffff:ffff:ffff:ffff:ffff,LU
-2a04:fc80::,2a04:fc87:ffff:ffff:ffff:ffff:ffff:ffff,IR
2a04:fcc0::,2a04:fcc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:fd00::,2a04:fd07:ffff:ffff:ffff:ffff:ffff:ffff,GB
2a04:ff40::,2a04:ff47:ffff:ffff:ffff:ffff:ffff:ffff,AT
@@ -15412,6 +20939,567 @@
2a05:500::,2a05:507:ffff:ffff:ffff:ffff:ffff:ffff,UA
2a05:540::,2a05:547:ffff:ffff:ffff:ffff:ffff:ffff,RU
2a05:580::,2a05:587:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a05:5c0::,2a05:5c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:600::,2a05:607:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:640::,2a05:647:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:680::,2a05:687:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:6c0::,2a05:6c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:700::,2a05:707:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a05:740::,2a05:747:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:780::,2a05:787:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:7c0::,2a05:7c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:800::,2a05:807:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:840::,2a05:843:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:860::,2a05:863:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:880::,2a05:887:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:8c0::,2a05:8c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:900::,2a05:907:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:940::,2a05:947:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:980::,2a05:987:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a05:9c0::,2a05:9c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:a00::,2a05:a07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:a40::,2a05:a47:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:a80::,2a05:a87:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:ac0::,2a05:ac7:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:b00::,2a05:b07:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:b40::,2a05:b47:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:b80::,2a05:b87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:bc0::,2a05:bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:c00::,2a05:c07:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:c40::,2a05:c47:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:c80::,2a05:c87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:cc0::,2a05:cc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:d00::,2a05:d07:ffff:ffff:ffff:ffff:ffff:ffff,CY
+2a05:d40::,2a05:d47:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:d80::,2a05:d87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:dc0::,2a05:dc7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:e00::,2a05:e07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:e40::,2a05:e47:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:e80::,2a05:e87:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:ec0::,2a05:ec7:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:f00::,2a05:f07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:f40::,2a05:f47:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:f80::,2a05:f87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:fc0::,2a05:fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1000::,2a05:1007:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:1040::,2a05:1047:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1080::,2a05:1087:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:10c0::,2a05:10c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:1100::,2a05:1107:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:1140::,2a05:1147:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:1180::,2a05:1187:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:11c0::,2a05:11c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1200::,2a05:1203:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:1220::,2a05:1223:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:1240::,2a05:1247:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:1280::,2a05:1287:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:12c0::,2a05:12c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:1300::,2a05:1307:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1340::,2a05:1347:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:1380::,2a05:1387:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:13c0::,2a05:13c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1400::,2a05:1407:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:1440::,2a05:1447:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1480::,2a05:1487:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:14c0::,2a05:14c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:1540::,2a05:1547:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:1580::,2a05:1587:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a05:15c0::,2a05:15c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:1600::,2a05:1607:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a05:1640::,2a05:1647:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:1680::,2a05:1687:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:16c0::,2a05:16c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:1700::,2a05:1707:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:1740::,2a05:1747:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1780::,2a05:1787:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:17c0::,2a05:17c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:1800::,2a05:1807:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:1840::,2a05:1847:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a05:1880::,2a05:1887:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:18c0::,2a05:18c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:1900::,2a05:1907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:1940::,2a05:1947:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:1980::,2a05:1987:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:19c0::,2a05:19c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:1a00::,2a05:1a3f:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:1c00::,2a05:1c07:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:1c40::,2a05:1c47:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:1c80::,2a05:1c87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1cc0::,2a05:1cc7:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a05:1d00::,2a05:1d07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1d40::,2a05:1d43:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:1d60::,2a05:1d63:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1d80::,2a05:1d87:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:1e00::,2a05:1e07:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:1e40::,2a05:1e47:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:1e80::,2a05:1e87:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:1ec0::,2a05:1ec7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:1f00::,2a05:1f07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:1f40::,2a05:1f47:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a05:1f80::,2a05:1f87:ffff:ffff:ffff:ffff:ffff:ffff,BA
+2a05:1fc0::,2a05:1fc7:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:2000::,2a05:2007:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:2040::,2a05:2047:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:2080::,2a05:2087:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:20c0::,2a05:20c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2100::,2a05:2107:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:2140::,2a05:2147:ffff:ffff:ffff:ffff:ffff:ffff,SK
+2a05:2180::,2a05:2187:ffff:ffff:ffff:ffff:ffff:ffff,TM
+2a05:21c0::,2a05:21c7:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:2200::,2a05:2207:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2240::,2a05:2247:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:2280::,2a05:2287:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a05:2300::,2a05:2307:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2340::,2a05:2347:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2380::,2a05:2387:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:23c0::,2a05:23c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:2400::,2a05:2407:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:2440::,2a05:2447:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:2480::,2a05:2487:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:24c0::,2a05:24c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2500::,2a05:2507:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2540::,2a05:2547:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:2580::,2a05:2587:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:25c0::,2a05:25c7:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:2600::,2a05:2607:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:2640::,2a05:2647:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:2680::,2a05:2687:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:26c0::,2a05:26c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2700::,2a05:2707:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:2740::,2a05:2747:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:2780::,2a05:2787:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:27c0::,2a05:27c7:ffff:ffff:ffff:ffff:ffff:ffff,KZ
+2a05:2800::,2a05:2807:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:2880::,2a05:2887:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:28c0::,2a05:28c7:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a05:2900::,2a05:2907:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2940::,2a05:2947:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:2980::,2a05:2987:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:29c0::,2a05:29c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:2a00::,2a05:2a07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2a40::,2a05:2a47:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:2a80::,2a05:2a87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2ac0::,2a05:2ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:2b00::,2a05:2b07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2b40::,2a05:2b47:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2b80::,2a05:2b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2bc0::,2a05:2bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2c00::,2a05:2c03:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:2c20::,2a05:2c23:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:2c40::,2a05:2c47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2c80::,2a05:2c87:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a05:2cc0::,2a05:2cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2d00::,2a05:2d07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:2d40::,2a05:2d47:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:2d80::,2a05:2d87:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a05:2dc0::,2a05:2dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:2e00::,2a05:2e07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:2e40::,2a05:2e47:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:2e80::,2a05:2e87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2ec0::,2a05:2ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:2f00::,2a05:2f07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:2f80::,2a05:2f87:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:2fc0::,2a05:2fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3000::,2a05:3007:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:3040::,2a05:3047:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:3080::,2a05:3087:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a05:30c0::,2a05:30c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3100::,2a05:3107:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:3140::,2a05:3147:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:3180::,2a05:3187:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:31c0::,2a05:31c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:3240::,2a05:3247:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3280::,2a05:3287:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a05:32c0::,2a05:32c7:ffff:ffff:ffff:ffff:ffff:ffff,PS
+2a05:3300::,2a05:3307:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:3340::,2a05:3347:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3380::,2a05:3387:ffff:ffff:ffff:ffff:ffff:ffff,YE
+2a05:33c0::,2a05:33c7:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a05:3400::,2a05:3407:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:3440::,2a05:3447:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:3480::,2a05:3487:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:34c0::,2a05:34c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:3500::,2a05:3507:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:3540::,2a05:3547:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:3580::,2a05:3587:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:35c0::,2a05:35c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:3640::,2a05:3647:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:3680::,2a05:3687:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:36c0::,2a05:36c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:3700::,2a05:3707:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:3740::,2a05:3747:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:3780::,2a05:3787:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:37c0::,2a05:37c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:3800::,2a05:3807:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:3840::,2a05:3847:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:3880::,2a05:3887:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:38c0::,2a05:38c7:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:3900::,2a05:3907:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:3940::,2a05:3941:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:3950::,2a05:3951:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:3960::,2a05:3963:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:3980::,2a05:3987:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:39c0::,2a05:39c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:3a00::,2a05:3a07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:3a40::,2a05:3a47:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:3a80::,2a05:3a87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:3ac0::,2a05:3ac7:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a05:3b00::,2a05:3b07:ffff:ffff:ffff:ffff:ffff:ffff,US
+2a05:3b40::,2a05:3b47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:3b80::,2a05:3b87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:3bc0::,2a05:3bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3c00::,2a05:3c07:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:3c40::,2a05:3c47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:3c80::,2a05:3c87:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:3cc0::,2a05:3cc7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:3d00::,2a05:3d07:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:3d40::,2a05:3d47:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:3d80::,2a05:3d87:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:3dc0::,2a05:3dc7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:3e00::,2a05:3e07:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:3e40::,2a05:3e47:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:3e80::,2a05:3e87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:3ec0::,2a05:3ec7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:3f00::,2a05:3f07:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:3f40::,2a05:3f47:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:3f80::,2a05:3f87:ffff:ffff:ffff:ffff:ffff:ffff,GR
+2a05:3fc0::,2a05:3fc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:4000::,2a05:4007:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4040::,2a05:4047:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4080::,2a05:4087:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a05:40c0::,2a05:40c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:4100::,2a05:4107:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:4140::,2a05:4147:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4180::,2a05:4187:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:41c0::,2a05:41c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:4200::,2a05:4207:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4240::,2a05:4247:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:4280::,2a05:4287:ffff:ffff:ffff:ffff:ffff:ffff,EE
+2a05:42c0::,2a05:42c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:4300::,2a05:4307:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4340::,2a05:4347:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4380::,2a05:4387:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:43c0::,2a05:43c7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:4400::,2a05:4407:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:4440::,2a05:4447:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:4480::,2a05:4487:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:44c0::,2a05:44c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:4500::,2a05:4507:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:4580::,2a05:4587:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:45c0::,2a05:45c7:ffff:ffff:ffff:ffff:ffff:ffff,UZ
+2a05:4600::,2a05:4607:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:4640::,2a05:4647:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:4680::,2a05:4687:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:46c0::,2a05:46c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:4700::,2a05:4707:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:4740::,2a05:4747:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:4780::,2a05:4787:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:47c0::,2a05:47c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:4800::,2a05:4807:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:4840::,2a05:4847:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:4880::,2a05:4887:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:48c0::,2a05:48c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:4900::,2a05:4907:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:4940::,2a05:4947:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a05:4980::,2a05:4987:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a05:49c0::,2a05:49c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:4a00::,2a05:4a07:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:4a40::,2a05:4a47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:4a80::,2a05:4a87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4ac0::,2a05:4ac7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:4b00::,2a05:4b07:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:4b40::,2a05:4b47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:4b80::,2a05:4b87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4bc0::,2a05:4bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4c00::,2a05:4c07:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a05:4c40::,2a05:4c47:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4c80::,2a05:4c87:ffff:ffff:ffff:ffff:ffff:ffff,MD
+2a05:4cc0::,2a05:4cc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:4d00::,2a05:4d07:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:4d80::,2a05:4d87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:4dc0::,2a05:4dc7:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:4e00::,2a05:4e07:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:4e40::,2a05:4e47:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:4ec0::,2a05:4ec7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:4f00::,2a05:4f07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:4f40::,2a05:4f47:ffff:ffff:ffff:ffff:ffff:ffff,HR
+2a05:4f80::,2a05:4f87:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a05:4fc0::,2a05:4fc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5000::,2a05:5007:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5040::,2a05:5047:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:5080::,2a05:5087:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:50c0::,2a05:50c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a05:5100::,2a05:5107:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5140::,2a05:5147:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:5180::,2a05:5187:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:51c0::,2a05:51c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:5200::,2a05:5207:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5240::,2a05:5247:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5280::,2a05:5283:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:52a0::,2a05:52a3:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:52c0::,2a05:52c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5300::,2a05:5307:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:5340::,2a05:5347:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:5380::,2a05:5387:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:53c0::,2a05:53c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5400::,2a05:5407:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:5440::,2a05:5447:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:5480::,2a05:5487:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:54c0::,2a05:54c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5500::,2a05:5507:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:5540::,2a05:5547:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a05:5580::,2a05:5587:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:55c0::,2a05:55c7:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a05:5600::,2a05:5607:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5640::,2a05:5647:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5680::,2a05:5687:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:56c0::,2a05:56c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5740::,2a05:5747:ffff:ffff:ffff:ffff:ffff:ffff,UA
+2a05:5780::,2a05:5787:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:57c0::,2a05:57c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5800::,2a05:5807:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5840::,2a05:5847:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5880::,2a05:5887:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:58c0::,2a05:58c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5900::,2a05:5907:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5940::,2a05:5947:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5980::,2a05:5987:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:59c0::,2a05:59c7:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5a00::,2a05:5a07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5a40::,2a05:5a47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5a80::,2a05:5a87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5b00::,2a05:5b07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5b40::,2a05:5b47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:5b80::,2a05:5b87:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a05:5bc0::,2a05:5bc7:ffff:ffff:ffff:ffff:ffff:ffff,MK
+2a05:5c00::,2a05:5c07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:5c40::,2a05:5c47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5c80::,2a05:5c87:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:5cc0::,2a05:5cc7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:5d00::,2a05:5d07:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5d40::,2a05:5d47:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:5d80::,2a05:5d87:ffff:ffff:ffff:ffff:ffff:ffff,MK
+2a05:5dc0::,2a05:5dc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:5e00::,2a05:5e07:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a05:5e40::,2a05:5e47:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a05:5e80::,2a05:5e87:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:5ec0::,2a05:5ec7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:5f00::,2a05:5f07:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:5f40::,2a05:5f47:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:5f80::,2a05:5f87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:5fc0::,2a05:5fc7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:6000::,2a05:6007:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a05:6040::,2a05:6047:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6080::,2a05:6087:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:60c0::,2a05:60c7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:6100::,2a05:6107:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:6140::,2a05:6147:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6180::,2a05:6187:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:61c0::,2a05:61c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:6200::,2a05:6207:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:6240::,2a05:6247:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:6280::,2a05:6287:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a05:62c0::,2a05:62c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:6300::,2a05:6307:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a05:6340::,2a05:6347:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:6380::,2a05:6387:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:63c0::,2a05:63c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6400::,2a05:6407:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:6440::,2a05:6447:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:64c0::,2a05:64c7:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:6500::,2a05:6507:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:6540::,2a05:6547:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6580::,2a05:6587:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:65c0::,2a05:65c7:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:6600::,2a05:6607:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:6640::,2a05:6647:ffff:ffff:ffff:ffff:ffff:ffff,VA
+2a05:6680::,2a05:6687:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:66c0::,2a05:66c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6700::,2a05:6707:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:6740::,2a05:6747:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:6800::,2a05:6807:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:6840::,2a05:6847:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6880::,2a05:6887:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:68c0::,2a05:68c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:6900::,2a05:6907:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6940::,2a05:6947:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:6980::,2a05:6987:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:69c0::,2a05:69c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6a00::,2a05:6a07:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:6a40::,2a05:6a47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6a80::,2a05:6a87:ffff:ffff:ffff:ffff:ffff:ffff,BE
+2a05:6ac0::,2a05:6ac7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:6b00::,2a05:6b07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6b80::,2a05:6b87:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:6bc0::,2a05:6bc7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:6c00::,2a05:6c07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6c40::,2a05:6c47:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6c80::,2a05:6c87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:6cc0::,2a05:6cc7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:6d00::,2a05:6d07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:6d40::,2a05:6d47:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:6d80::,2a05:6d87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6dc0::,2a05:6dc7:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:6e00::,2a05:6e07:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:6e80::,2a05:6e87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:6ec0::,2a05:6ec7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:6f00::,2a05:6f07:ffff:ffff:ffff:ffff:ffff:ffff,IS
+2a05:6f40::,2a05:6f47:ffff:ffff:ffff:ffff:ffff:ffff,AE
+2a05:6f80::,2a05:6f87:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:6fc0::,2a05:6fc7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:7000::,2a05:7007:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:7040::,2a05:7047:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7080::,2a05:7087:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:70c0::,2a05:70c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:7100::,2a05:7107:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:7140::,2a05:7147:ffff:ffff:ffff:ffff:ffff:ffff,MD
+2a05:7180::,2a05:7187:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:71c0::,2a05:71c7:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:7200::,2a05:7207:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:7240::,2a05:7247:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:7280::,2a05:7287:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:72c0::,2a05:72c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7300::,2a05:7307:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7380::,2a05:7387:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:73c0::,2a05:73c7:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a05:7400::,2a05:7407:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:7440::,2a05:7447:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:7480::,2a05:7487:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:74c0::,2a05:74c7:ffff:ffff:ffff:ffff:ffff:ffff,JO
+2a05:7500::,2a05:7507:ffff:ffff:ffff:ffff:ffff:ffff,JO
+2a05:7540::,2a05:7547:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a05:7580::,2a05:7587:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:75c0::,2a05:75c7:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:7600::,2a05:7607:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7640::,2a05:7647:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:7680::,2a05:7687:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:76c0::,2a05:76c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7700::,2a05:7707:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:7740::,2a05:7747:ffff:ffff:ffff:ffff:ffff:ffff,SI
+2a05:7780::,2a05:7787:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:77c0::,2a05:77c7:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:7800::,2a05:7807:ffff:ffff:ffff:ffff:ffff:ffff,PT
+2a05:7840::,2a05:7847:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a05:7880::,2a05:7887:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:78c0::,2a05:78c7:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a05:7900::,2a05:7907:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:7940::,2a05:7947:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7980::,2a05:7987:ffff:ffff:ffff:ffff:ffff:ffff,FR
+2a05:79c0::,2a05:79c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:7a00::,2a05:7a07:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a05:7a40::,2a05:7a47:ffff:ffff:ffff:ffff:ffff:ffff,YE
+2a05:7a80::,2a05:7a87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:7b00::,2a05:7b07:ffff:ffff:ffff:ffff:ffff:ffff,NO
+2a05:7b40::,2a05:7b47:ffff:ffff:ffff:ffff:ffff:ffff,ME
+2a05:7b80::,2a05:7b87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7bc0::,2a05:7bc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7c00::,2a05:7c07:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a05:7c40::,2a05:7c47:ffff:ffff:ffff:ffff:ffff:ffff,LU
+2a05:7c80::,2a05:7c87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7cc0::,2a05:7cc7:ffff:ffff:ffff:ffff:ffff:ffff,LT
+2a05:7d00::,2a05:7d07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:7d40::,2a05:7d47:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:7d80::,2a05:7d87:ffff:ffff:ffff:ffff:ffff:ffff,YE
+2a05:7dc0::,2a05:7dc1:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:7dd0::,2a05:7dd1:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:7de0::,2a05:7de3:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:7e00::,2a05:7e07:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:7e40::,2a05:7e47:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:7e80::,2a05:7e87:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:7ec0::,2a05:7ec7:ffff:ffff:ffff:ffff:ffff:ffff,CZ
+2a05:7f00::,2a05:7f07:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:7f40::,2a05:7f47:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:7f80::,2a05:7f87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:7fc0::,2a05:7fc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8000::,2a05:8007:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:8040::,2a05:8047:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:8080::,2a05:8087:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:80c0::,2a05:80c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8100::,2a05:8107:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:8140::,2a05:8147:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:8180::,2a05:8187:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:81c0::,2a05:81c7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:8280::,2a05:8287:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:82c0::,2a05:82c7:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a05:8300::,2a05:8307:ffff:ffff:ffff:ffff:ffff:ffff,AL
+2a05:8340::,2a05:8347:ffff:ffff:ffff:ffff:ffff:ffff,AZ
+2a05:8380::,2a05:8387:ffff:ffff:ffff:ffff:ffff:ffff,SE
+2a05:83c0::,2a05:83c7:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:8400::,2a05:8407:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:8440::,2a05:8447:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8480::,2a05:8487:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a05:8500::,2a05:8507:ffff:ffff:ffff:ffff:ffff:ffff,CY
+2a05:8540::,2a05:8547:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:8580::,2a05:8587:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a05:85c0::,2a05:85c7:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:8600::,2a05:8607:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:8640::,2a05:8647:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:8680::,2a05:8687:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:86c0::,2a05:86c7:ffff:ffff:ffff:ffff:ffff:ffff,GE
+2a05:8700::,2a05:8707:ffff:ffff:ffff:ffff:ffff:ffff,LV
+2a05:8740::,2a05:8747:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:8780::,2a05:8787:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:87c0::,2a05:87c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8800::,2a05:8807:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a05:8840::,2a05:8847:ffff:ffff:ffff:ffff:ffff:ffff,DK
+2a05:8880::,2a05:8883:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:88c0::,2a05:88c7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:8900::,2a05:8907:ffff:ffff:ffff:ffff:ffff:ffff,AT
+2a05:8940::,2a05:8947:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8980::,2a05:8987:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:89c0::,2a05:89c7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8a00::,2a05:8a07:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:8a40::,2a05:8a47:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8a80::,2a05:8a87:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8ac0::,2a05:8ac7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:8b00::,2a05:8b07:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a05:8b40::,2a05:8b47:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a05:8b80::,2a05:8b87:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:8bc0::,2a05:8bc7:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:8c00::,2a05:8c07:ffff:ffff:ffff:ffff:ffff:ffff,GI
+2a05:8c40::,2a05:8c47:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a05:8c80::,2a05:8c87:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:8cc0::,2a05:8cc7:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a05:8d00::,2a05:8d07:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8d40::,2a05:8d47:ffff:ffff:ffff:ffff:ffff:ffff,IL
+2a05:8d80::,2a05:8d87:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:8dc0::,2a05:8dc7:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:8e00::,2a05:8e07:ffff:ffff:ffff:ffff:ffff:ffff,ES
+2a05:8e40::,2a05:8e47:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:8e80::,2a05:8e87:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:8ec0::,2a05:8ec7:ffff:ffff:ffff:ffff:ffff:ffff,LB
+2a05:8f00::,2a05:8f07:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:8f40::,2a05:8f47:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:8f80::,2a05:8f87:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:8fc0::,2a05:8fc7:ffff:ffff:ffff:ffff:ffff:ffff,RS
+2a05:9000::,2a05:9007:ffff:ffff:ffff:ffff:ffff:ffff,SA
+2a05:9040::,2a05:9047:ffff:ffff:ffff:ffff:ffff:ffff,CH
+2a05:9080::,2a05:9087:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:90c0::,2a05:90c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:9100::,2a05:9107:ffff:ffff:ffff:ffff:ffff:ffff,FI
+2a05:9140::,2a05:9147:ffff:ffff:ffff:ffff:ffff:ffff,DE
+2a05:9180::,2a05:9187:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:91c0::,2a05:91c7:ffff:ffff:ffff:ffff:ffff:ffff,RO
+2a05:9200::,2a05:9207:ffff:ffff:ffff:ffff:ffff:ffff,RU
+2a05:9240::,2a05:9247:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:9280::,2a05:9287:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:92c0::,2a05:92c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:9300::,2a05:9307:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:9340::,2a05:9347:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:9380::,2a05:9387:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:93c0::,2a05:93c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
+2a05:9400::,2a05:9407:ffff:ffff:ffff:ffff:ffff:ffff,BG
+2a05:9440::,2a05:9447:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:9480::,2a05:9487:ffff:ffff:ffff:ffff:ffff:ffff,IQ
+2a05:94c0::,2a05:94c7:ffff:ffff:ffff:ffff:ffff:ffff,IR
+2a05:9500::,2a05:9507:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:9540::,2a05:9547:ffff:ffff:ffff:ffff:ffff:ffff,IT
+2a05:9580::,2a05:9587:ffff:ffff:ffff:ffff:ffff:ffff,HU
+2a05:95c0::,2a05:95c7:ffff:ffff:ffff:ffff:ffff:ffff,TR
+2a05:9600::,2a05:9607:ffff:ffff:ffff:ffff:ffff:ffff,IE
+2a05:9640::,2a05:9647:ffff:ffff:ffff:ffff:ffff:ffff,GB
+2a05:9680::,2a05:9687:ffff:ffff:ffff:ffff:ffff:ffff,PL
+2a05:96c0::,2a05:96c7:ffff:ffff:ffff:ffff:ffff:ffff,NL
2c0e::,2c0e:fff:ffff:ffff:ffff:ffff:ffff:ffff,EG
2c0e:2000::,2c0e:200f:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f600::,2c0f:f600:ffff:ffff:ffff:ffff:ffff:ffff,GN
@@ -15453,12 +21541,31 @@
2c0f:f720::,2c0f:f720:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f728::,2c0f:f728:ffff:ffff:ffff:ffff:ffff:ffff,BW
2c0f:f730::,2c0f:f730:ffff:ffff:ffff:ffff:ffff:ffff,TZ
+2c0f:f738::,2c0f:f738:ffff:ffff:ffff:ffff:ffff:ffff,MU
+2c0f:f740::,2c0f:f740:ffff:ffff:ffff:ffff:ffff:ffff,AO
+2c0f:f748::,2c0f:f748:ffff:ffff:ffff:ffff:ffff:ffff,MU
+2c0f:f750::,2c0f:f750:ffff:ffff:ffff:ffff:ffff:ffff,UG
+2c0f:f758::,2c0f:f758:ffff:ffff:ffff:ffff:ffff:ffff,ZW
+2c0f:f760::,2c0f:f760:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f768::,2c0f:f768:ffff:ffff:ffff:ffff:ffff:ffff,NG
+2c0f:f770::,2c0f:f770:ffff:ffff:ffff:ffff:ffff:ffff,BJ
+2c0f:f778::,2c0f:f778:ffff:ffff:ffff:ffff:ffff:ffff,NA
+2c0f:f780::,2c0f:f780:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f788::,2c0f:f788:ffff:ffff:ffff:ffff:ffff:ffff,BI
+2c0f:f798::,2c0f:f798:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f7a0::,2c0f:f7a0:ffff:ffff:ffff:ffff:ffff:ffff,ZW
+2c0f:f7a8::,2c0f:f7af:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f7b0::,2c0f:f7b0:ffff:ffff:ffff:ffff:ffff:ffff,TZ
+2c0f:f7b8::,2c0f:f7b8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
+2c0f:f7c0::,2c0f:f7c0:ffff:ffff:ffff:ffff:ffff:ffff,GH
+2c0f:f7c8::,2c0f:f7c8:ffff:ffff:ffff:ffff:ffff:ffff,TN
+2c0f:f7d0::,2c0f:f7d0:ffff:ffff:ffff:ffff:ffff:ffff,CM
2c0f:f800::,2c0f:f80f:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f810::,2c0f:f810:ffff:ffff:ffff:ffff:ffff:ffff,AO
2c0f:f818::,2c0f:f818:ffff:ffff:ffff:ffff:ffff:ffff,BJ
2c0f:f820::,2c0f:f820:ffff:ffff:ffff:ffff:ffff:ffff,GH
2c0f:f828::,2c0f:f828:ffff:ffff:ffff:ffff:ffff:ffff,AO
-2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,ZW
+2c0f:f830::,2c0f:f830:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:f838::,2c0f:f838:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:f840::,2c0f:f840:ffff:ffff:ffff:ffff:ffff:ffff,GQ
2c0f:f848::,2c0f:f848:ffff:ffff:ffff:ffff:ffff:ffff,GH
@@ -15480,7 +21587,7 @@
2c0f:f8d8::,2c0f:f8d8:ffff:ffff:ffff:ffff:ffff:ffff,BW
2c0f:f8e0::,2c0f:f8e0:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:f8e8::,2c0f:f8e8:ffff:ffff:ffff:ffff:ffff:ffff,GH
-2c0f:f8f0::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,ZW
+2c0f:f8f0::,2c0f:f8f0:ffff:ffff:ffff:ffff:ffff:ffff,MU
2c0f:f8f8::,2c0f:f8f8:ffff:ffff:ffff:ffff:ffff:ffff,SO
2c0f:f900::,2c0f:f900:ffff:ffff:ffff:ffff:ffff:ffff,ML
2c0f:f908::,2c0f:f908:ffff:ffff:ffff:ffff:ffff:ffff,BI
@@ -15535,7 +21642,6 @@
2c0f:fab0::,2c0f:fabf:ffff:ffff:ffff:ffff:ffff:ffff,TN
2c0f:fac0::,2c0f:fac0:ffff:ffff:ffff:ffff:ffff:ffff,MW
2c0f:fac8::,2c0f:fac8:ffff:ffff:ffff:ffff:ffff:ffff,BW
-2c0f:fad0::,2c0f:fad0:ffff:ffff:ffff:ffff:ffff:ffff,RW
2c0f:fad8::,2c0f:fad8:ffff:ffff:ffff:ffff:ffff:ffff,KE
2c0f:fae0::,2c0f:fae0:ffff:ffff:ffff:ffff:ffff:ffff,CM
2c0f:fae8::,2c0f:fae8:ffff:ffff:ffff:ffff:ffff:ffff,KE
@@ -15606,7 +21712,6 @@
2c0f:fd58::,2c0f:fd58:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fd60::,2c0f:fd60:ffff:ffff:ffff:ffff:ffff:ffff,UG
2c0f:fd68::,2c0f:fd68:ffff:ffff:ffff:ffff:ffff:ffff,ZA
-2c0f:fd70::,2c0f:fd70:ffff:ffff:ffff:ffff:ffff:ffff,UG
2c0f:fd78::,2c0f:fd78:ffff:ffff:ffff:ffff:ffff:ffff,BI
2c0f:fd80::,2c0f:fd80:ffff:ffff:ffff:ffff:ffff:ffff,BF
2c0f:fd88::,2c0f:fd88:ffff:ffff:ffff:ffff:ffff:ffff,GH
@@ -15620,7 +21725,6 @@
2c0f:fdc8::,2c0f:fdc8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fdd0::,2c0f:fdd0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fdd8::,2c0f:fdd8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
-2c0f:fde0::,2c0f:fde0:ffff:ffff:ffff:ffff:ffff:ffff,MW
2c0f:fde8::,2c0f:fde8:ffff:ffff:ffff:ffff:ffff:ffff,MW
2c0f:fdf0::,2c0f:fdf0:ffff:ffff:ffff:ffff:ffff:ffff,ZA
2c0f:fdf8::,2c0f:fdf8:ffff:ffff:ffff:ffff:ffff:ffff,ZA
diff --git a/src/ext/ht.h b/src/ext/ht.h
index ee64e557f4..9b3bcaf91b 100644
--- a/src/ext/ht.h
+++ b/src/ext/ht.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2002, Christopher Clark.
* Copyright (c) 2005-2006, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See license at end. */
/* Based on ideas by Christopher Clark and interfaces from Niels Provos. */
diff --git a/src/ext/tinytest_demo.c b/src/ext/tinytest_demo.c
index 634e112cb8..c07f099791 100644
--- a/src/ext/tinytest_demo.c
+++ b/src/ext/tinytest_demo.c
@@ -74,13 +74,13 @@ test_strcmp(void *data)
values of the failing things.
Fail unless strcmp("abc, "abc") == 0 */
- tt_int_op(strcmp("abc", "abc"), ==, 0);
+ tt_int_op(strcmp("abc", "abc"), OP_EQ, 0);
/* Fail unless strcmp("abc, "abcd") is less than 0 */
- tt_int_op(strcmp("abc", "abcd"), < , 0);
+ tt_int_op(strcmp("abc", "abcd"), OP_LT, 0);
/* Incidentally, there's a test_str_op that uses strcmp internally. */
- tt_str_op("abc", <, "abcd");
+ tt_str_op("abc", OP_LT, "abcd");
/* Every test-case function needs to finish with an "end:"
@@ -153,11 +153,11 @@ test_memcpy(void *ptr)
/* Let's make sure that memcpy does what we'd like. */
strcpy(db->buffer1, "String 0");
memcpy(db->buffer2, db->buffer1, sizeof(db->buffer1));
- tt_str_op(db->buffer1, ==, db->buffer2);
+ tt_str_op(db->buffer1, OP_EQ, db->buffer2);
/* tt_mem_op() does a memcmp, as opposed to the strcmp in tt_str_op() */
db->buffer2[100] = 3; /* Make the buffers unequal */
- tt_mem_op(db->buffer1, <, db->buffer2, sizeof(db->buffer1));
+ tt_mem_op(db->buffer1, OP_LT, db->buffer2, sizeof(db->buffer1));
/* Now we've allocated memory that's referenced by a local variable.
The end block of the function will clean it up. */
@@ -165,7 +165,7 @@ test_memcpy(void *ptr)
tt_assert(mem);
/* Another rather trivial test. */
- tt_str_op(db->buffer1, !=, mem);
+ tt_str_op(db->buffer1, OP_NE, mem);
end:
/* This time our end block has something to do. */
@@ -186,9 +186,9 @@ test_timeout(void *ptr)
#endif
t2 = time(NULL);
- tt_int_op(t2-t1, >=, 4);
+ tt_int_op(t2-t1, OP_GE, 4);
- tt_int_op(t2-t1, <=, 6);
+ tt_int_op(t2-t1, OP_LE, 6);
end:
;
diff --git a/src/ext/trunnel/trunnel-impl.h b/src/ext/trunnel/trunnel-impl.h
index c88ee3988e..8714fded9f 100644
--- a/src/ext/trunnel/trunnel-impl.h
+++ b/src/ext/trunnel/trunnel-impl.h
@@ -5,7 +5,7 @@
/* trunnel-impl.h -- Implementation helpers for trunnel, included by
* generated trunnel files
*
- * Copyright 2014, The Tor Project, Inc.
+ * Copyright 2014-2015, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
diff --git a/src/ext/trunnel/trunnel.c b/src/ext/trunnel/trunnel.c
index a18d67584e..735323798f 100644
--- a/src/ext/trunnel/trunnel.c
+++ b/src/ext/trunnel/trunnel.c
@@ -4,7 +4,7 @@
*/
/* trunnel.c -- Helper functions to implement trunnel.
*
- * Copyright 2014, The Tor Project, Inc.
+ * Copyright 2014-2015, The Tor Project, Inc.
* See license at the end of this file for copying information.
*
* See trunnel-impl.h for documentation of these functions.
diff --git a/src/ext/trunnel/trunnel.h b/src/ext/trunnel/trunnel.h
index f51cade03f..22c1ed80c9 100644
--- a/src/ext/trunnel/trunnel.h
+++ b/src/ext/trunnel/trunnel.h
@@ -5,7 +5,7 @@
/* trunnel.h -- Public declarations for trunnel, to be included
* in trunnel header files.
- * Copyright 2014, The Tor Project, Inc.
+ * Copyright 2014-2015, The Tor Project, Inc.
* See license at the end of this file for copying information.
*/
diff --git a/src/or/Makefile.nmake b/src/or/Makefile.nmake
index 523bf3306b..2ac98cd372 100644
--- a/src/or/Makefile.nmake
+++ b/src/or/Makefile.nmake
@@ -63,6 +63,7 @@ LIBTOR_OBJECTS = \
routerlist.obj \
routerparse.obj \
routerset.obj \
+ scheduler.obj \
statefile.obj \
status.obj \
transports.obj
diff --git a/src/or/addressmap.c b/src/or/addressmap.c
index d7ac7c8ec7..9c29fb2acb 100644
--- a/src/or/addressmap.c
+++ b/src/or/addressmap.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ADDRESSMAP_PRIVATE
@@ -94,7 +94,7 @@ addressmap_ent_free(void *_ent)
tor_free(ent);
}
-/** Free storage held by a virtaddress_entry_t* entry in <b>ent</b>. */
+/** Free storage held by a virtaddress_entry_t* entry in <b>_ent</b>. */
static void
addressmap_virtaddress_ent_free(void *_ent)
{
@@ -104,11 +104,13 @@ addressmap_virtaddress_ent_free(void *_ent)
ent = _ent;
tor_free(ent->ipv4_address);
+ tor_free(ent->ipv6_address);
tor_free(ent->hostname_address);
tor_free(ent);
}
-/** Free storage held by a virtaddress_entry_t* entry in <b>ent</b>. */
+/** Remove <b>address</b> (which must map to <b>ent</b>) from the
+ * virtual address map. */
static void
addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
{
@@ -120,9 +122,11 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
if (ve) {
if (!strcmp(address, ve->ipv4_address))
tor_free(ve->ipv4_address);
+ if (!strcmp(address, ve->ipv6_address))
+ tor_free(ve->ipv6_address);
if (!strcmp(address, ve->hostname_address))
tor_free(ve->hostname_address);
- if (!ve->ipv4_address && !ve->hostname_address) {
+ if (!ve->ipv4_address && !ve->ipv6_address && !ve->hostname_address) {
tor_free(ve);
strmap_remove(virtaddress_reversemap, ent->new_address);
}
@@ -131,7 +135,7 @@ addressmap_virtaddress_remove(const char *address, addressmap_entry_t *ent)
}
/** Remove <b>ent</b> (which must be mapped to by <b>address</b>) from the
- * client address maps. */
+ * client address maps, and then free it. */
static void
addressmap_ent_remove(const char *address, addressmap_entry_t *ent)
{
@@ -226,6 +230,8 @@ addressmap_address_should_automap(const char *address,
return 0;
SMARTLIST_FOREACH_BEGIN(suffix_list, const char *, suffix) {
+ if (!strcmp(suffix, "."))
+ return 1;
if (!strcasecmpend(address, suffix))
return 1;
} SMARTLIST_FOREACH_END(suffix);
@@ -384,13 +390,35 @@ addressmap_rewrite(char *address, size_t maxlen,
goto done;
}
- if (ent && ent->source == ADDRMAPSRC_DNS) {
- sa_family_t f;
- tor_addr_t tmp;
- f = tor_addr_parse(&tmp, ent->new_address);
- if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
- goto done;
- else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
+ switch (ent->source) {
+ case ADDRMAPSRC_DNS:
+ {
+ sa_family_t f;
+ tor_addr_t tmp;
+ f = tor_addr_parse(&tmp, ent->new_address);
+ if (f == AF_INET && !(flags & AMR_FLAG_USE_IPV4_DNS))
+ goto done;
+ else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
+ goto done;
+ }
+ break;
+ case ADDRMAPSRC_CONTROLLER:
+ case ADDRMAPSRC_TORRC:
+ if (!(flags & AMR_FLAG_USE_MAPADDRESS))
+ goto done;
+ break;
+ case ADDRMAPSRC_AUTOMAP:
+ if (!(flags & AMR_FLAG_USE_AUTOMAP))
+ goto done;
+ break;
+ case ADDRMAPSRC_TRACKEXIT:
+ if (!(flags & AMR_FLAG_USE_TRACKEXIT))
+ goto done;
+ break;
+ case ADDRMAPSRC_NONE:
+ default:
+ log_warn(LD_BUG, "Unknown addrmap source value %d. Ignoring it.",
+ (int) ent->source);
goto done;
}
@@ -425,7 +453,7 @@ addressmap_rewrite(char *address, size_t maxlen,
if (exit_source_out)
*exit_source_out = exit_source;
if (expires_out)
- *expires_out = TIME_MAX;
+ *expires_out = expires;
return (rewrites > 0);
}
@@ -449,6 +477,8 @@ addressmap_rewrite_reverse(char *address, size_t maxlen, unsigned flags,
return 0;
else if (f == AF_INET6 && !(flags & AMR_FLAG_USE_IPV6_DNS))
return 0;
+ /* FFFF we should reverse-map virtual addresses even if we haven't
+ * enabled DNS cacheing. */
}
tor_asprintf(&s, "REVERSE[%s]", address);
@@ -496,7 +526,7 @@ addressmap_have_mapping(const char *address, int update_expiry)
* equal to <b>address</b>, or any address ending with a period followed by
* <b>address</b>. If <b>wildcard_addr</b> and <b>wildcard_new_addr</b> are
* both true, the mapping will rewrite addresses that end with
- * ".<b>address</b>" into ones that end with ".<b>new_address</b>."
+ * ".<b>address</b>" into ones that end with ".<b>new_address</b>".
*
* If <b>new_address</b> is NULL, or <b>new_address</b> is equal to
* <b>address</b> and <b>wildcard_addr</b> is equal to
@@ -535,9 +565,9 @@ addressmap_register(const char *address, char *new_address, time_t expires,
if (expires > 1) {
log_info(LD_APP,"Temporary addressmap ('%s' to '%s') not performed, "
"since it's already mapped to '%s'",
- safe_str_client(address),
- safe_str_client(new_address),
- safe_str_client(ent->new_address));
+ safe_str_client(address),
+ safe_str_client(new_address),
+ safe_str_client(ent->new_address));
tor_free(new_address);
return;
}
@@ -670,10 +700,10 @@ client_dns_set_addressmap(entry_connection_t *for_conn,
return; /* If address was an IP address already, don't add a mapping. */
if (tor_addr_family(val) == AF_INET) {
- if (! for_conn->cache_ipv4_answers)
+ if (! for_conn->entry_cfg.cache_ipv4_answers)
return;
} else if (tor_addr_family(val) == AF_INET6) {
- if (! for_conn->cache_ipv6_answers)
+ if (! for_conn->entry_cfg.cache_ipv6_answers)
return;
}
@@ -702,8 +732,8 @@ client_dns_set_reverse_addressmap(entry_connection_t *for_conn,
{
tor_addr_t tmp_addr;
sa_family_t f = tor_addr_parse(&tmp_addr, address);
- if ((f == AF_INET && ! for_conn->cache_ipv4_answers) ||
- (f == AF_INET6 && ! for_conn->cache_ipv6_answers))
+ if ((f == AF_INET && ! for_conn->entry_cfg.cache_ipv4_answers) ||
+ (f == AF_INET6 && ! for_conn->entry_cfg.cache_ipv6_answers))
return;
}
tor_asprintf(&s, "REVERSE[%s]", address);
@@ -738,6 +768,12 @@ parse_virtual_addr_network(const char *val, sa_family_t family,
const int max_bits = ipv6 ? 40 : 16;
virtual_addr_conf_t *conf = ipv6 ? &virtaddr_conf_ipv6 : &virtaddr_conf_ipv4;
+ if (!val || val[0] == '\0') {
+ if (msg)
+ tor_asprintf(msg, "Value not present (%s) after VirtualAddressNetwork%s",
+ val?"Empty":"NULL", ipv6?"IPv6":"");
+ return -1;
+ }
if (tor_addr_parse_mask_ports(val, 0, &addr, &bits, NULL, NULL) < 0) {
if (msg)
tor_asprintf(msg, "Error parsing VirtualAddressNetwork%s %s",
@@ -839,8 +875,8 @@ get_random_virtual_addr(const virtual_addr_conf_t *conf, tor_addr_t *addr_out)
}
/** Return a newly allocated string holding an address of <b>type</b>
- * (one of RESOLVED_TYPE_{IPV4|HOSTNAME}) that has not yet been mapped,
- * and that is very unlikely to be the address of any real host.
+ * (one of RESOLVED_TYPE_{IPV4|IPV6|HOSTNAME}) that has not yet been
+ * mapped, and that is very unlikely to be the address of any real host.
*
* May return NULL if we have run out of virtual addresses.
*/
@@ -888,7 +924,7 @@ addressmap_get_virtual_address(int type)
/* XXXX This code is to make sure I didn't add an undecorated version
* by mistake. I hope it's needless. */
char tmp[TOR_ADDR_BUF_LEN];
- tor_addr_to_str(buf, &addr, sizeof(tmp), 0);
+ tor_addr_to_str(tmp, &addr, sizeof(tmp), 0);
if (strmap_get(addressmap, tmp)) {
log_warn(LD_BUG, "%s wasn't in the addressmap, but %s was.",
buf, tmp);
@@ -945,7 +981,7 @@ addressmap_register_virtual_address(int type, char *new_address)
!strcasecmp(new_address, ent->new_address)) {
tor_free(new_address);
tor_assert(!vent_needs_to_be_added);
- return tor_strdup(*addrp);
+ return *addrp;
} else {
log_warn(LD_BUG,
"Internal confusion: I thought that '%s' was mapped to by "
@@ -969,6 +1005,8 @@ addressmap_register_virtual_address(int type, char *new_address)
strmap_set(virtaddress_reversemap, new_address, vent);
addressmap_register(*addrp, new_address, 2, ADDRMAPSRC_AUTOMAP, 0, 0);
+ /* FFFF register corresponding reverse mapping. */
+
#if 0
{
/* Try to catch possible bugs */
diff --git a/src/or/addressmap.h b/src/or/addressmap.h
index 598f7b0e3e..ff108df024 100644
--- a/src/or/addressmap.h
+++ b/src/or/addressmap.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_ADDRESSMAP_H
@@ -16,8 +16,11 @@ void addressmap_clean(time_t now);
void addressmap_clear_configured(void);
void addressmap_clear_transient(void);
void addressmap_free_all(void);
-#define AMR_FLAG_USE_IPV4_DNS (1u<<0)
-#define AMR_FLAG_USE_IPV6_DNS (1u<<1)
+#define AMR_FLAG_USE_IPV4_DNS (1u<<0)
+#define AMR_FLAG_USE_IPV6_DNS (1u<<1)
+#define AMR_FLAG_USE_MAPADDRESS (1u<<2)
+#define AMR_FLAG_USE_AUTOMAP (1u<<3)
+#define AMR_FLAG_USE_TRACKEXIT (1u<<4)
int addressmap_rewrite(char *address, size_t maxlen, unsigned flags,
time_t *expires_out,
addressmap_entry_source_t *exit_source_out);
diff --git a/src/or/buffers.c b/src/or/buffers.c
index bd33fe451d..ca0e815e33 100644
--- a/src/or/buffers.c
+++ b/src/or/buffers.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -562,8 +562,8 @@ buf_clear(buf_t *buf)
}
/** Return the number of bytes stored in <b>buf</b> */
-size_t
-buf_datalen(const buf_t *buf)
+MOCK_IMPL(size_t,
+buf_datalen, (const buf_t *buf))
{
return buf->datalen;
}
@@ -2063,9 +2063,7 @@ parse_socks(const char *data, size_t datalen, socks_request_t *req,
socks_request_set_socks5_error(req, SOCKS5_NOT_ALLOWED);
return -1;
}
- }
-
- if (!string_is_valid_hostname(req->address)) {
+ } else if (!string_is_valid_hostname(req->address)) {
socks_request_set_socks5_error(req, SOCKS5_GENERAL_ERROR);
log_warn(LD_PROTOCOL,
diff --git a/src/or/buffers.h b/src/or/buffers.h
index 9c2c7d0e9d..6dd3d1762b 100644
--- a/src/or/buffers.h
+++ b/src/or/buffers.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -24,7 +24,7 @@ void buf_shrink(buf_t *buf);
size_t buf_shrink_freelists(int free_all);
void buf_dump_freelist_sizes(int severity);
-size_t buf_datalen(const buf_t *buf);
+MOCK_DECL(size_t, buf_datalen, (const buf_t *buf));
size_t buf_allocation(const buf_t *buf);
size_t buf_slack(const buf_t *buf);
diff --git a/src/or/channel.c b/src/or/channel.c
index 13a122662a..bf0387f10e 100644
--- a/src/or/channel.c
+++ b/src/or/channel.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -13,6 +13,9 @@
#define TOR_CHANNEL_INTERNAL_
+/* This one's for stuff only channel.c and the test suite should see */
+#define CHANNEL_PRIVATE_
+
#include "or.h"
#include "channel.h"
#include "channeltls.h"
@@ -29,29 +32,7 @@
#include "rephist.h"
#include "router.h"
#include "routerlist.h"
-
-/* Cell queue structure */
-
-typedef struct cell_queue_entry_s cell_queue_entry_t;
-struct cell_queue_entry_s {
- TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next;
- enum {
- CELL_QUEUE_FIXED,
- CELL_QUEUE_VAR,
- CELL_QUEUE_PACKED
- } type;
- union {
- struct {
- cell_t *cell;
- } fixed;
- struct {
- var_cell_t *var_cell;
- } var;
- struct {
- packed_cell_t *packed_cell;
- } packed;
- } u;
-};
+#include "scheduler.h"
/* Global lists of channels */
@@ -75,6 +56,59 @@ static smartlist_t *finished_listeners = NULL;
/* Counter for ID numbers */
static uint64_t n_channels_allocated = 0;
+/*
+ * Channel global byte/cell counters, for statistics and for scheduler high
+ * /low-water marks.
+ */
+
+/*
+ * Total number of cells ever given to any channel with the
+ * channel_write_*_cell() functions.
+ */
+
+static uint64_t n_channel_cells_queued = 0;
+
+/*
+ * Total number of cells ever passed to a channel lower layer with the
+ * write_*_cell() methods.
+ */
+
+static uint64_t n_channel_cells_passed_to_lower_layer = 0;
+
+/*
+ * Current number of cells in all channel queues; should be
+ * n_channel_cells_queued - n_channel_cells_passed_to_lower_layer.
+ */
+
+static uint64_t n_channel_cells_in_queues = 0;
+
+/*
+ * Total number of bytes for all cells ever queued to a channel and
+ * counted in n_channel_cells_queued.
+ */
+
+static uint64_t n_channel_bytes_queued = 0;
+
+/*
+ * Total number of bytes for all cells ever passed to a channel lower layer
+ * and counted in n_channel_cells_passed_to_lower_layer.
+ */
+
+static uint64_t n_channel_bytes_passed_to_lower_layer = 0;
+
+/*
+ * Current number of bytes in all channel queues; should be
+ * n_channel_bytes_queued - n_channel_bytes_passed_to_lower_layer.
+ */
+
+static uint64_t n_channel_bytes_in_queues = 0;
+
+/*
+ * Current total estimated queue size *including lower layer queues and
+ * transmit overhead*
+ */
+
+STATIC uint64_t estimated_total_queue_size = 0;
/* Digest->channel map
*
@@ -112,7 +146,6 @@ HT_GENERATE2(channel_idmap, channel_idmap_entry_s, node, channel_idmap_hash,
channel_idmap_eq, 0.5, tor_reallocarray_, tor_free_);
static cell_queue_entry_t * cell_queue_entry_dup(cell_queue_entry_t *q);
-static void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off);
#if 0
static int cell_queue_entry_is_padding(cell_queue_entry_t *q);
#endif
@@ -123,6 +156,8 @@ cell_queue_entry_new_var(var_cell_t *var_cell);
static int is_destroy_cell(channel_t *chan,
const cell_queue_entry_t *q, circid_t *circid_out);
+static void channel_assert_counter_consistency(void);
+
/* Functions to maintain the digest map */
static void channel_add_to_digest_map(channel_t *chan);
static void channel_remove_from_digest_map(channel_t *chan);
@@ -140,6 +175,8 @@ channel_free_list(smartlist_t *channels, int mark_for_close);
static void
channel_listener_free_list(smartlist_t *channels, int mark_for_close);
static void channel_listener_force_free(channel_listener_t *chan_l);
+static size_t channel_get_cell_queue_entry_size(channel_t *chan,
+ cell_queue_entry_t *q);
static void
channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q);
@@ -378,8 +415,7 @@ channel_register(channel_t *chan)
smartlist_add(all_channels, chan);
/* Is it finished? */
- if (chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) {
+ if (CHANNEL_FINISHED(chan)) {
/* Put it in the finished list, creating it if necessary */
if (!finished_channels) finished_channels = smartlist_new();
smartlist_add(finished_channels, chan);
@@ -388,7 +424,7 @@ channel_register(channel_t *chan)
if (!active_channels) active_channels = smartlist_new();
smartlist_add(active_channels, chan);
- if (chan->state != CHANNEL_STATE_CLOSING) {
+ if (!CHANNEL_IS_CLOSING(chan)) {
/* It should have a digest set */
if (!tor_digest_is_zero(chan->identity_digest)) {
/* Yeah, we're good, add it to the map */
@@ -423,8 +459,7 @@ channel_unregister(channel_t *chan)
if (!(chan->registered)) return;
/* Is it finished? */
- if (chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) {
+ if (CHANNEL_FINISHED(chan)) {
/* Get it out of the finished list */
if (finished_channels) smartlist_remove(finished_channels, chan);
} else {
@@ -440,9 +475,7 @@ channel_unregister(channel_t *chan)
/* Should it be in the digest map? */
if (!tor_digest_is_zero(chan->identity_digest) &&
- !(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)) {
+ !(CHANNEL_CONDEMNED(chan))) {
/* Remove it */
channel_remove_from_digest_map(chan);
}
@@ -542,9 +575,7 @@ channel_add_to_digest_map(channel_t *chan)
tor_assert(chan);
/* Assert that the state makes sense */
- tor_assert(!(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR));
+ tor_assert(!CHANNEL_CONDEMNED(chan));
/* Assert that there is a digest */
tor_assert(!tor_digest_is_zero(chan->identity_digest));
@@ -746,6 +777,9 @@ channel_init(channel_t *chan)
/* It hasn't been open yet. */
chan->has_been_open = 0;
+
+ /* Scheduler state is idle */
+ chan->scheduler_state = SCHED_CHAN_IDLE;
}
/**
@@ -779,8 +813,8 @@ channel_free(channel_t *chan)
if (!chan) return;
/* It must be closed or errored */
- tor_assert(chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ tor_assert(CHANNEL_FINISHED(chan));
+
/* It must be deregistered */
tor_assert(!(chan->registered));
@@ -788,6 +822,9 @@ channel_free(channel_t *chan)
"Freeing channel " U64_FORMAT " at %p",
U64_PRINTF_ARG(chan->global_identifier), chan);
+ /* Get this one out of the scheduler */
+ scheduler_release_channel(chan);
+
/*
* Get rid of cmux policy before we do anything, so cmux policies don't
* see channels in weird half-freed states.
@@ -863,6 +900,9 @@ channel_force_free(channel_t *chan)
"Force-freeing channel " U64_FORMAT " at %p",
U64_PRINTF_ARG(chan->global_identifier), chan);
+ /* Get this one out of the scheduler */
+ scheduler_release_channel(chan);
+
/*
* Get rid of cmux policy before we do anything, so cmux policies don't
* see channels in weird half-freed states.
@@ -988,9 +1028,7 @@ channel_get_cell_handler(channel_t *chan)
{
tor_assert(chan);
- if (chan->state == CHANNEL_STATE_OPENING ||
- chan->state == CHANNEL_STATE_OPEN ||
- chan->state == CHANNEL_STATE_MAINT)
+ if (CHANNEL_CAN_HANDLE_CELLS(chan))
return chan->cell_handler;
return NULL;
@@ -1008,9 +1046,7 @@ channel_get_var_cell_handler(channel_t *chan)
{
tor_assert(chan);
- if (chan->state == CHANNEL_STATE_OPENING ||
- chan->state == CHANNEL_STATE_OPEN ||
- chan->state == CHANNEL_STATE_MAINT)
+ if (CHANNEL_CAN_HANDLE_CELLS(chan))
return chan->var_cell_handler;
return NULL;
@@ -1033,9 +1069,7 @@ channel_set_cell_handlers(channel_t *chan,
int try_again = 0;
tor_assert(chan);
- tor_assert(chan->state == CHANNEL_STATE_OPENING ||
- chan->state == CHANNEL_STATE_OPEN ||
- chan->state == CHANNEL_STATE_MAINT);
+ tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan));
log_debug(LD_CHANNEL,
"Setting cell_handler callback for channel %p to %p",
@@ -1089,9 +1123,8 @@ channel_mark_for_close(channel_t *chan)
tor_assert(chan->close != NULL);
/* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */
- if (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) return;
+ if (CHANNEL_CONDEMNED(chan))
+ return;
log_debug(LD_CHANNEL,
"Closing channel %p (global ID " U64_FORMAT ") "
@@ -1170,9 +1203,8 @@ channel_close_from_lower_layer(channel_t *chan)
tor_assert(chan != NULL);
/* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */
- if (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) return;
+ if (CHANNEL_CONDEMNED(chan))
+ return;
log_debug(LD_CHANNEL,
"Closing channel %p (global ID " U64_FORMAT ") "
@@ -1230,9 +1262,8 @@ channel_close_for_error(channel_t *chan)
tor_assert(chan != NULL);
/* If it's already in CLOSING, CLOSED or ERROR, this is a no-op */
- if (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) return;
+ if (CHANNEL_CONDEMNED(chan))
+ return;
log_debug(LD_CHANNEL,
"Closing channel %p due to lower-layer error",
@@ -1288,18 +1319,16 @@ void
channel_closed(channel_t *chan)
{
tor_assert(chan);
- tor_assert(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ tor_assert(CHANNEL_CONDEMNED(chan));
/* No-op if already inactive */
- if (chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) return;
+ if (CHANNEL_FINISHED(chan))
+ return;
/* Inform any pending (not attached) circs that they should
* give up. */
if (! chan->has_been_open)
- circuit_n_chan_done(chan, 0);
+ circuit_n_chan_done(chan, 0, 0);
/* Now close all the attached circuits on it. */
circuit_unlink_all_from_channel(chan, END_CIRC_REASON_CHANNEL_CLOSED);
@@ -1357,10 +1386,7 @@ channel_clear_identity_digest(channel_t *chan)
"global ID " U64_FORMAT,
chan, U64_PRINTF_ARG(chan->global_identifier));
- state_not_in_map =
- (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
if (!state_not_in_map && chan->registered &&
!tor_digest_is_zero(chan->identity_digest))
@@ -1393,10 +1419,8 @@ channel_set_identity_digest(channel_t *chan,
identity_digest ?
hex_str(identity_digest, DIGEST_LEN) : "(null)");
- state_not_in_map =
- (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
+
was_in_digest_map =
!state_not_in_map &&
chan->registered &&
@@ -1446,10 +1470,7 @@ channel_clear_remote_end(channel_t *chan)
"global ID " U64_FORMAT,
chan, U64_PRINTF_ARG(chan->global_identifier));
- state_not_in_map =
- (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
if (!state_not_in_map && chan->registered &&
!tor_digest_is_zero(chan->identity_digest))
@@ -1485,10 +1506,8 @@ channel_set_remote_end(channel_t *chan,
identity_digest ?
hex_str(identity_digest, DIGEST_LEN) : "(null)");
- state_not_in_map =
- (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR);
+ state_not_in_map = CHANNEL_CONDEMNED(chan);
+
was_in_digest_map =
!state_not_in_map &&
chan->registered &&
@@ -1548,7 +1567,7 @@ cell_queue_entry_dup(cell_queue_entry_t *q)
* them) or not (we should free).
*/
-static void
+STATIC void
cell_queue_entry_free(cell_queue_entry_t *q, int handed_off)
{
if (!q) return;
@@ -1666,6 +1685,36 @@ cell_queue_entry_new_var(var_cell_t *var_cell)
}
/**
+ * Ask how big the cell contained in a cell_queue_entry_t is
+ */
+
+static size_t
+channel_get_cell_queue_entry_size(channel_t *chan, cell_queue_entry_t *q)
+{
+ size_t rv = 0;
+
+ tor_assert(chan);
+ tor_assert(q);
+
+ switch (q->type) {
+ case CELL_QUEUE_FIXED:
+ rv = get_cell_network_size(chan->wide_circ_ids);
+ break;
+ case CELL_QUEUE_VAR:
+ rv = get_var_cell_header_size(chan->wide_circ_ids) +
+ (q->u.var.var_cell ? q->u.var.var_cell->payload_len : 0);
+ break;
+ case CELL_QUEUE_PACKED:
+ rv = get_cell_network_size(chan->wide_circ_ids);
+ break;
+ default:
+ tor_assert(1);
+ }
+
+ return rv;
+}
+
+/**
* Write to a channel based on a cell_queue_entry_t
*
* Given a cell_queue_entry_t filled out by the caller, try to send the cell
@@ -1677,14 +1726,13 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
{
int result = 0, sent = 0;
cell_queue_entry_t *tmp = NULL;
+ size_t cell_bytes;
tor_assert(chan);
tor_assert(q);
/* Assert that the state makes sense for a cell write */
- tor_assert(chan->state == CHANNEL_STATE_OPENING ||
- chan->state == CHANNEL_STATE_OPEN ||
- chan->state == CHANNEL_STATE_MAINT);
+ tor_assert(CHANNEL_CAN_HANDLE_CELLS(chan));
{
circid_t circ_id;
@@ -1693,9 +1741,12 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
}
}
+ /* For statistical purposes, figure out how big this cell is */
+ cell_bytes = channel_get_cell_queue_entry_size(chan, q);
+
/* Can we send it right out? If so, try */
if (TOR_SIMPLEQ_EMPTY(&chan->outgoing_queue) &&
- chan->state == CHANNEL_STATE_OPEN) {
+ CHANNEL_IS_OPEN(chan)) {
/* Pick the right write function for this cell type and save the result */
switch (q->type) {
case CELL_QUEUE_FIXED:
@@ -1726,6 +1777,13 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
channel_timestamp_drained(chan);
/* Update the counter */
++(chan->n_cells_xmitted);
+ chan->n_bytes_xmitted += cell_bytes;
+ /* Update global counters */
+ ++n_channel_cells_queued;
+ ++n_channel_cells_passed_to_lower_layer;
+ n_channel_bytes_queued += cell_bytes;
+ n_channel_bytes_passed_to_lower_layer += cell_bytes;
+ channel_assert_counter_consistency();
}
}
@@ -1737,8 +1795,16 @@ channel_write_cell_queue_entry(channel_t *chan, cell_queue_entry_t *q)
*/
tmp = cell_queue_entry_dup(q);
TOR_SIMPLEQ_INSERT_TAIL(&chan->outgoing_queue, tmp, next);
+ /* Update global counters */
+ ++n_channel_cells_queued;
+ ++n_channel_cells_in_queues;
+ n_channel_bytes_queued += cell_bytes;
+ n_channel_bytes_in_queues += cell_bytes;
+ channel_assert_counter_consistency();
+ /* Update channel queue size */
+ chan->bytes_in_queue += cell_bytes;
/* Try to process the queue? */
- if (chan->state == CHANNEL_STATE_OPEN) channel_flush_cells(chan);
+ if (CHANNEL_IS_OPEN(chan)) channel_flush_cells(chan);
}
}
@@ -1759,7 +1825,7 @@ channel_write_cell(channel_t *chan, cell_t *cell)
tor_assert(chan);
tor_assert(cell);
- if (chan->state == CHANNEL_STATE_CLOSING) {
+ if (CHANNEL_IS_CLOSING(chan)) {
log_debug(LD_CHANNEL, "Discarding cell_t %p on closing channel %p with "
"global ID "U64_FORMAT, cell, chan,
U64_PRINTF_ARG(chan->global_identifier));
@@ -1775,6 +1841,9 @@ channel_write_cell(channel_t *chan, cell_t *cell)
q.type = CELL_QUEUE_FIXED;
q.u.fixed.cell = cell;
channel_write_cell_queue_entry(chan, &q);
+
+ /* Update the queue size estimate */
+ channel_update_xmit_queue_size(chan);
}
/**
@@ -1793,7 +1862,7 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell)
tor_assert(chan);
tor_assert(packed_cell);
- if (chan->state == CHANNEL_STATE_CLOSING) {
+ if (CHANNEL_IS_CLOSING(chan)) {
log_debug(LD_CHANNEL, "Discarding packed_cell_t %p on closing channel %p "
"with global ID "U64_FORMAT, packed_cell, chan,
U64_PRINTF_ARG(chan->global_identifier));
@@ -1810,6 +1879,9 @@ channel_write_packed_cell(channel_t *chan, packed_cell_t *packed_cell)
q.type = CELL_QUEUE_PACKED;
q.u.packed.packed_cell = packed_cell;
channel_write_cell_queue_entry(chan, &q);
+
+ /* Update the queue size estimate */
+ channel_update_xmit_queue_size(chan);
}
/**
@@ -1829,7 +1901,7 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell)
tor_assert(chan);
tor_assert(var_cell);
- if (chan->state == CHANNEL_STATE_CLOSING) {
+ if (CHANNEL_IS_CLOSING(chan)) {
log_debug(LD_CHANNEL, "Discarding var_cell_t %p on closing channel %p "
"with global ID "U64_FORMAT, var_cell, chan,
U64_PRINTF_ARG(chan->global_identifier));
@@ -1846,6 +1918,9 @@ channel_write_var_cell(channel_t *chan, var_cell_t *var_cell)
q.type = CELL_QUEUE_VAR;
q.u.var.var_cell = var_cell;
channel_write_cell_queue_entry(chan, &q);
+
+ /* Update the queue size estimate */
+ channel_update_xmit_queue_size(chan);
}
/**
@@ -1941,6 +2016,41 @@ channel_change_state(channel_t *chan, channel_state_t to_state)
}
}
+ /*
+ * If we're going to a closed/closing state, we don't need scheduling any
+ * more; in CHANNEL_STATE_MAINT we can't accept writes.
+ */
+ if (to_state == CHANNEL_STATE_CLOSING ||
+ to_state == CHANNEL_STATE_CLOSED ||
+ to_state == CHANNEL_STATE_ERROR) {
+ scheduler_release_channel(chan);
+ } else if (to_state == CHANNEL_STATE_MAINT) {
+ scheduler_channel_doesnt_want_writes(chan);
+ }
+
+ /*
+ * If we're closing, this channel no longer counts toward the global
+ * estimated queue size; if we're open, it now does.
+ */
+ if ((to_state == CHANNEL_STATE_CLOSING ||
+ to_state == CHANNEL_STATE_CLOSED ||
+ to_state == CHANNEL_STATE_ERROR) &&
+ (from_state == CHANNEL_STATE_OPEN ||
+ from_state == CHANNEL_STATE_MAINT)) {
+ estimated_total_queue_size -= chan->bytes_in_queue;
+ }
+
+ /*
+ * If we're opening, this channel now does count toward the global
+ * estimated queue size.
+ */
+ if ((to_state == CHANNEL_STATE_OPEN ||
+ to_state == CHANNEL_STATE_MAINT) &&
+ !(from_state == CHANNEL_STATE_OPEN ||
+ from_state == CHANNEL_STATE_MAINT)) {
+ estimated_total_queue_size += chan->bytes_in_queue;
+ }
+
/* Tell circuits if we opened and stuff */
if (to_state == CHANNEL_STATE_OPEN) {
channel_do_open_actions(chan);
@@ -2056,12 +2166,13 @@ channel_listener_change_state(channel_listener_t *chan_l,
#define MAX_CELLS_TO_GET_FROM_CIRCUITS_FOR_UNLIMITED 256
-ssize_t
-channel_flush_some_cells(channel_t *chan, ssize_t num_cells)
+MOCK_IMPL(ssize_t,
+channel_flush_some_cells, (channel_t *chan, ssize_t num_cells))
{
unsigned int unlimited = 0;
ssize_t flushed = 0;
int num_cells_from_circs, clamped_num_cells;
+ int q_len_before, q_len_after;
tor_assert(chan);
@@ -2069,7 +2180,7 @@ channel_flush_some_cells(channel_t *chan, ssize_t num_cells)
if (!unlimited && num_cells <= flushed) goto done;
/* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */
- if (chan->state == CHANNEL_STATE_OPEN) {
+ if (CHANNEL_IS_OPEN(chan)) {
/* Try to flush as much as we can that's already queued */
flushed += channel_flush_some_cells_from_outgoing_queue(chan,
(unlimited ? -1 : num_cells - flushed));
@@ -2087,14 +2198,45 @@ channel_flush_some_cells(channel_t *chan, ssize_t num_cells)
clamped_num_cells = (int)(num_cells - flushed);
}
}
+
+ /*
+ * Keep track of the change in queue size; we have to count cells
+ * channel_flush_from_first_active_circuit() writes out directly,
+ * but not double-count ones we might get later in
+ * channel_flush_some_cells_from_outgoing_queue()
+ */
+ q_len_before = chan_cell_queue_len(&(chan->outgoing_queue));
+
/* Try to get more cells from any active circuits */
num_cells_from_circs = channel_flush_from_first_active_circuit(
chan, clamped_num_cells);
- /* If it claims we got some, process the queue again */
+ q_len_after = chan_cell_queue_len(&(chan->outgoing_queue));
+
+ /*
+ * If it claims we got some, adjust the flushed counter and consider
+ * processing the queue again
+ */
if (num_cells_from_circs > 0) {
- flushed += channel_flush_some_cells_from_outgoing_queue(chan,
- (unlimited ? -1 : num_cells - flushed));
+ /*
+ * Adjust flushed by the number of cells counted in
+ * num_cells_from_circs that didn't go to the cell queue.
+ */
+
+ if (q_len_after > q_len_before) {
+ num_cells_from_circs -= (q_len_after - q_len_before);
+ if (num_cells_from_circs < 0) num_cells_from_circs = 0;
+ }
+
+ flushed += num_cells_from_circs;
+
+ /* Now process the queue if necessary */
+
+ if ((q_len_after > q_len_before) &&
+ (unlimited || (flushed < num_cells))) {
+ flushed += channel_flush_some_cells_from_outgoing_queue(chan,
+ (unlimited ? -1 : num_cells - flushed));
+ }
}
}
}
@@ -2117,6 +2259,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
unsigned int unlimited = 0;
ssize_t flushed = 0;
cell_queue_entry_t *q = NULL;
+ size_t cell_size;
+ int free_q = 0, handed_off = 0;
tor_assert(chan);
tor_assert(chan->write_cell);
@@ -2127,11 +2271,15 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
if (!unlimited && num_cells <= flushed) return 0;
/* If we aren't in CHANNEL_STATE_OPEN, nothing goes through */
- if (chan->state == CHANNEL_STATE_OPEN) {
+ if (CHANNEL_IS_OPEN(chan)) {
while ((unlimited || num_cells > flushed) &&
NULL != (q = TOR_SIMPLEQ_FIRST(&chan->outgoing_queue))) {
+ free_q = 0;
+ handed_off = 0;
if (1) {
+ /* Figure out how big it is for statistical purposes */
+ cell_size = channel_get_cell_queue_entry_size(chan, q);
/*
* Okay, we have a good queue entry, try to give it to the lower
* layer.
@@ -2144,8 +2292,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
++flushed;
channel_timestamp_xmit(chan);
++(chan->n_cells_xmitted);
- cell_queue_entry_free(q, 1);
- q = NULL;
+ chan->n_bytes_xmitted += cell_size;
+ free_q = 1;
+ handed_off = 1;
}
/* Else couldn't write it; leave it on the queue */
} else {
@@ -2156,8 +2305,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
"(global ID " U64_FORMAT ").",
chan, U64_PRINTF_ARG(chan->global_identifier));
/* Throw it away */
- cell_queue_entry_free(q, 0);
- q = NULL;
+ free_q = 1;
+ handed_off = 0;
}
break;
case CELL_QUEUE_PACKED:
@@ -2167,8 +2316,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
++flushed;
channel_timestamp_xmit(chan);
++(chan->n_cells_xmitted);
- cell_queue_entry_free(q, 1);
- q = NULL;
+ chan->n_bytes_xmitted += cell_size;
+ free_q = 1;
+ handed_off = 1;
}
/* Else couldn't write it; leave it on the queue */
} else {
@@ -2179,8 +2329,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
"(global ID " U64_FORMAT ").",
chan, U64_PRINTF_ARG(chan->global_identifier));
/* Throw it away */
- cell_queue_entry_free(q, 0);
- q = NULL;
+ free_q = 1;
+ handed_off = 0;
}
break;
case CELL_QUEUE_VAR:
@@ -2190,8 +2340,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
++flushed;
channel_timestamp_xmit(chan);
++(chan->n_cells_xmitted);
- cell_queue_entry_free(q, 1);
- q = NULL;
+ chan->n_bytes_xmitted += cell_size;
+ free_q = 1;
+ handed_off = 1;
}
/* Else couldn't write it; leave it on the queue */
} else {
@@ -2202,8 +2353,8 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
"(global ID " U64_FORMAT ").",
chan, U64_PRINTF_ARG(chan->global_identifier));
/* Throw it away */
- cell_queue_entry_free(q, 0);
- q = NULL;
+ free_q = 1;
+ handed_off = 0;
}
break;
default:
@@ -2213,12 +2364,32 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
"(global ID " U64_FORMAT "; ignoring it."
" Someone should fix this.",
q->type, chan, U64_PRINTF_ARG(chan->global_identifier));
- cell_queue_entry_free(q, 0);
- q = NULL;
+ free_q = 1;
+ handed_off = 0;
}
- /* if q got NULLed out, we used it and should remove the queue entry */
- if (!q) TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next);
+ /*
+ * if free_q is set, we used it and should remove the queue entry;
+ * we have to do the free down here so TOR_SIMPLEQ_REMOVE_HEAD isn't
+ * accessing freed memory
+ */
+ if (free_q) {
+ TOR_SIMPLEQ_REMOVE_HEAD(&chan->outgoing_queue, next);
+ /*
+ * ...and we handed a cell off to the lower layer, so we should
+ * update the counters.
+ */
+ ++n_channel_cells_passed_to_lower_layer;
+ --n_channel_cells_in_queues;
+ n_channel_bytes_passed_to_lower_layer += cell_size;
+ n_channel_bytes_in_queues -= cell_size;
+ channel_assert_counter_consistency();
+ /* Update the channel's queue size too */
+ chan->bytes_in_queue -= cell_size;
+ /* Finally, free q */
+ cell_queue_entry_free(q, handed_off);
+ q = NULL;
+ }
/* No cell removed from list, so we can't go on any further */
else break;
}
@@ -2230,6 +2401,9 @@ channel_flush_some_cells_from_outgoing_queue(channel_t *chan,
channel_timestamp_drained(chan);
}
+ /* Update the estimate queue size */
+ channel_update_xmit_queue_size(chan);
+
return flushed;
}
@@ -2352,8 +2526,9 @@ void
channel_do_open_actions(channel_t *chan)
{
tor_addr_t remote_addr;
- int started_here, not_using = 0;
+ int started_here;
time_t now = time(NULL);
+ int close_origin_circuits = 0;
tor_assert(chan);
@@ -2370,8 +2545,7 @@ channel_do_open_actions(channel_t *chan)
log_debug(LD_OR,
"New entry guard was reachable, but closing this "
"connection so we can retry the earlier entry guards.");
- circuit_n_chan_done(chan, 0);
- not_using = 1;
+ close_origin_circuits = 1;
}
router_set_status(chan->identity_digest, 1);
} else {
@@ -2391,7 +2565,7 @@ channel_do_open_actions(channel_t *chan)
}
}
- if (!not_using) circuit_n_chan_done(chan, 1);
+ circuit_n_chan_done(chan, 1, close_origin_circuits);
}
/**
@@ -2462,9 +2636,8 @@ channel_process_cells(channel_t *chan)
{
cell_queue_entry_t *q;
tor_assert(chan);
- tor_assert(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_MAINT ||
- chan->state == CHANNEL_STATE_OPEN);
+ tor_assert(CHANNEL_IS_CLOSING(chan) || CHANNEL_IS_MAINT(chan) ||
+ CHANNEL_IS_OPEN(chan));
log_debug(LD_CHANNEL,
"Processing as many incoming cells as we can for channel %p",
@@ -2531,7 +2704,7 @@ channel_queue_cell(channel_t *chan, cell_t *cell)
tor_assert(chan);
tor_assert(cell);
- tor_assert(chan->state == CHANNEL_STATE_OPEN);
+ tor_assert(CHANNEL_IS_OPEN(chan));
/* Do we need to queue it, or can we just call the handler right away? */
if (!(chan->cell_handler)) need_to_queue = 1;
@@ -2541,8 +2714,9 @@ channel_queue_cell(channel_t *chan, cell_t *cell)
/* Timestamp for receiving */
channel_timestamp_recv(chan);
- /* Update the counter */
+ /* Update the counters */
++(chan->n_cells_recved);
+ chan->n_bytes_recved += get_cell_network_size(chan->wide_circ_ids);
/* If we don't need to queue we can just call cell_handler */
if (!need_to_queue) {
@@ -2584,7 +2758,7 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell)
tor_assert(chan);
tor_assert(var_cell);
- tor_assert(chan->state == CHANNEL_STATE_OPEN);
+ tor_assert(CHANNEL_IS_OPEN(chan));
/* Do we need to queue it, or can we just call the handler right away? */
if (!(chan->var_cell_handler)) need_to_queue = 1;
@@ -2596,6 +2770,8 @@ channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell)
/* Update the counter */
++(chan->n_cells_recved);
+ chan->n_bytes_recved += get_var_cell_header_size(chan->wide_circ_ids) +
+ var_cell->payload_len;
/* If we don't need to queue we can just call cell_handler */
if (!need_to_queue) {
@@ -2645,6 +2821,19 @@ packed_cell_is_destroy(channel_t *chan,
return 0;
}
+/**
+ * Assert that the global channel stats counters are internally consistent
+ */
+
+static void
+channel_assert_counter_consistency(void)
+{
+ tor_assert(n_channel_cells_queued ==
+ (n_channel_cells_in_queues + n_channel_cells_passed_to_lower_layer));
+ tor_assert(n_channel_bytes_queued ==
+ (n_channel_bytes_in_queues + n_channel_bytes_passed_to_lower_layer));
+}
+
/** DOCDOC */
static int
is_destroy_cell(channel_t *chan,
@@ -2692,10 +2881,7 @@ channel_send_destroy(circid_t circ_id, channel_t *chan, int reason)
}
/* Check to make sure we can send on this channel first */
- if (!(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR) &&
- chan->cmux) {
+ if (!CHANNEL_CONDEMNED(chan) && chan->cmux) {
channel_note_destroy_pending(chan, circ_id);
circuitmux_append_destroy_cell(chan, chan->cmux, circ_id, reason);
log_debug(LD_OR,
@@ -2727,6 +2913,19 @@ channel_dumpstats(int severity)
{
if (all_channels && smartlist_len(all_channels) > 0) {
tor_log(severity, LD_GENERAL,
+ "Channels have queued " U64_FORMAT " bytes in " U64_FORMAT " cells, "
+ "and handed " U64_FORMAT " bytes in " U64_FORMAT " cells to the lower"
+ " layer.",
+ U64_PRINTF_ARG(n_channel_bytes_queued),
+ U64_PRINTF_ARG(n_channel_cells_queued),
+ U64_PRINTF_ARG(n_channel_bytes_passed_to_lower_layer),
+ U64_PRINTF_ARG(n_channel_cells_passed_to_lower_layer));
+ tor_log(severity, LD_GENERAL,
+ "There are currently " U64_FORMAT " bytes in " U64_FORMAT " cells "
+ "in channel queues.",
+ U64_PRINTF_ARG(n_channel_bytes_in_queues),
+ U64_PRINTF_ARG(n_channel_cells_in_queues));
+ tor_log(severity, LD_GENERAL,
"Dumping statistics about %d channels:",
smartlist_len(all_channels));
tor_log(severity, LD_GENERAL,
@@ -2872,9 +3071,7 @@ channel_free_list(smartlist_t *channels, int mark_for_close)
}
channel_unregister(curr);
if (mark_for_close) {
- if (!(curr->state == CHANNEL_STATE_CLOSING ||
- curr->state == CHANNEL_STATE_CLOSED ||
- curr->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(curr)) {
channel_mark_for_close(curr);
}
channel_force_free(curr);
@@ -3088,9 +3285,7 @@ channel_get_for_extend(const char *digest,
tor_assert(tor_memeq(chan->identity_digest,
digest, DIGEST_LEN));
- if (chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)
+ if (CHANNEL_CONDEMNED(chan))
continue;
/* Never return a channel on which the other end appears to be
@@ -3100,7 +3295,7 @@ channel_get_for_extend(const char *digest,
}
/* Never return a non-open connection. */
- if (chan->state != CHANNEL_STATE_OPEN) {
+ if (!CHANNEL_IS_OPEN(chan)) {
/* If the address matches, don't launch a new connection for this
* circuit. */
if (channel_matches_target_addr_for_extend(chan, target_addr))
@@ -3200,7 +3395,7 @@ channel_listener_describe_transport(channel_listener_t *chan_l)
/**
* Return the number of entries in <b>queue</b>
*/
-static int
+STATIC int
chan_cell_queue_len(const chan_cell_queue_t *queue)
{
int r = 0;
@@ -3216,8 +3411,8 @@ chan_cell_queue_len(const chan_cell_queue_t *queue)
* Dump statistics for one channel to the log
*/
-void
-channel_dump_statistics(channel_t *chan, int severity)
+MOCK_IMPL(void,
+channel_dump_statistics, (channel_t *chan, int severity))
{
double avg, interval, age;
time_t now = time(NULL);
@@ -3369,12 +3564,22 @@ channel_dump_statistics(channel_t *chan, int severity)
/* Describe counters and rates */
tor_log(severity, LD_GENERAL,
" * Channel " U64_FORMAT " has received "
- U64_FORMAT " cells and transmitted " U64_FORMAT,
+ U64_FORMAT " bytes in " U64_FORMAT " cells and transmitted "
+ U64_FORMAT " bytes in " U64_FORMAT " cells",
U64_PRINTF_ARG(chan->global_identifier),
+ U64_PRINTF_ARG(chan->n_bytes_recved),
U64_PRINTF_ARG(chan->n_cells_recved),
+ U64_PRINTF_ARG(chan->n_bytes_xmitted),
U64_PRINTF_ARG(chan->n_cells_xmitted));
if (now > chan->timestamp_created &&
chan->timestamp_created > 0) {
+ if (chan->n_bytes_recved > 0) {
+ avg = (double)(chan->n_bytes_recved) / age;
+ tor_log(severity, LD_GENERAL,
+ " * Channel " U64_FORMAT " has averaged %f "
+ "bytes received per second",
+ U64_PRINTF_ARG(chan->global_identifier), avg);
+ }
if (chan->n_cells_recved > 0) {
avg = (double)(chan->n_cells_recved) / age;
if (avg >= 1.0) {
@@ -3390,6 +3595,13 @@ channel_dump_statistics(channel_t *chan, int severity)
U64_PRINTF_ARG(chan->global_identifier), interval);
}
}
+ if (chan->n_bytes_xmitted > 0) {
+ avg = (double)(chan->n_bytes_xmitted) / age;
+ tor_log(severity, LD_GENERAL,
+ " * Channel " U64_FORMAT " has averaged %f "
+ "bytes transmitted per second",
+ U64_PRINTF_ARG(chan->global_identifier), avg);
+ }
if (chan->n_cells_xmitted > 0) {
avg = (double)(chan->n_cells_xmitted) / age;
if (avg >= 1.0) {
@@ -3807,6 +4019,50 @@ channel_mark_outgoing(channel_t *chan)
chan->is_incoming = 0;
}
+/************************
+ * Flow control queries *
+ ***********************/
+
+/*
+ * Get the latest estimate for the total queue size of all open channels
+ */
+
+uint64_t
+channel_get_global_queue_estimate(void)
+{
+ return estimated_total_queue_size;
+}
+
+/*
+ * Estimate the number of writeable cells
+ *
+ * Ask the lower layer for an estimate of how many cells it can accept, and
+ * then subtract the length of our outgoing_queue, if any, to produce an
+ * estimate of the number of cells this channel can accept for writes.
+ */
+
+int
+channel_num_cells_writeable(channel_t *chan)
+{
+ int result;
+
+ tor_assert(chan);
+ tor_assert(chan->num_cells_writeable);
+
+ if (chan->state == CHANNEL_STATE_OPEN) {
+ /* Query lower layer */
+ result = chan->num_cells_writeable(chan);
+ /* Subtract cell queue length, if any */
+ result -= chan_cell_queue_len(&chan->outgoing_queue);
+ if (result < 0) result = 0;
+ } else {
+ /* No cells are writeable in any other state */
+ result = 0;
+ }
+
+ return result;
+}
+
/*********************
* Timestamp updates *
********************/
@@ -4209,3 +4465,87 @@ channel_set_circid_type(channel_t *chan,
}
}
+/**
+ * Update the estimated number of bytes queued to transmit for this channel,
+ * and notify the scheduler. The estimate includes both the channel queue and
+ * the queue size reported by the lower layer, and an overhead estimate
+ * optionally provided by the lower layer.
+ */
+
+void
+channel_update_xmit_queue_size(channel_t *chan)
+{
+ uint64_t queued, adj;
+ double overhead;
+
+ tor_assert(chan);
+ tor_assert(chan->num_bytes_queued);
+
+ /*
+ * First, get the number of bytes we have queued without factoring in
+ * lower-layer overhead.
+ */
+ queued = chan->num_bytes_queued(chan) + chan->bytes_in_queue;
+ /* Next, adjust by the overhead factor, if any is available */
+ if (chan->get_overhead_estimate) {
+ overhead = chan->get_overhead_estimate(chan);
+ if (overhead >= 1.0f) {
+ queued *= overhead;
+ } else {
+ /* Ignore silly overhead factors */
+ log_notice(LD_CHANNEL, "Ignoring silly overhead factor %f", overhead);
+ }
+ }
+
+ /* Now, compare to the previous estimate */
+ if (queued > chan->bytes_queued_for_xmit) {
+ adj = queued - chan->bytes_queued_for_xmit;
+ log_debug(LD_CHANNEL,
+ "Increasing queue size for channel " U64_FORMAT " by " U64_FORMAT
+ " from " U64_FORMAT " to " U64_FORMAT,
+ U64_PRINTF_ARG(chan->global_identifier),
+ U64_PRINTF_ARG(adj),
+ U64_PRINTF_ARG(chan->bytes_queued_for_xmit),
+ U64_PRINTF_ARG(queued));
+ /* Update the channel's estimate */
+ chan->bytes_queued_for_xmit = queued;
+
+ /* Update the global queue size estimate if appropriate */
+ if (chan->state == CHANNEL_STATE_OPEN ||
+ chan->state == CHANNEL_STATE_MAINT) {
+ estimated_total_queue_size += adj;
+ log_debug(LD_CHANNEL,
+ "Increasing global queue size by " U64_FORMAT " for channel "
+ U64_FORMAT ", new size is " U64_FORMAT,
+ U64_PRINTF_ARG(adj), U64_PRINTF_ARG(chan->global_identifier),
+ U64_PRINTF_ARG(estimated_total_queue_size));
+ /* Tell the scheduler we're increasing the queue size */
+ scheduler_adjust_queue_size(chan, 1, adj);
+ }
+ } else if (queued < chan->bytes_queued_for_xmit) {
+ adj = chan->bytes_queued_for_xmit - queued;
+ log_debug(LD_CHANNEL,
+ "Decreasing queue size for channel " U64_FORMAT " by " U64_FORMAT
+ " from " U64_FORMAT " to " U64_FORMAT,
+ U64_PRINTF_ARG(chan->global_identifier),
+ U64_PRINTF_ARG(adj),
+ U64_PRINTF_ARG(chan->bytes_queued_for_xmit),
+ U64_PRINTF_ARG(queued));
+ /* Update the channel's estimate */
+ chan->bytes_queued_for_xmit = queued;
+
+ /* Update the global queue size estimate if appropriate */
+ if (chan->state == CHANNEL_STATE_OPEN ||
+ chan->state == CHANNEL_STATE_MAINT) {
+ estimated_total_queue_size -= adj;
+ log_debug(LD_CHANNEL,
+ "Decreasing global queue size by " U64_FORMAT " for channel "
+ U64_FORMAT ", new size is " U64_FORMAT,
+ U64_PRINTF_ARG(adj), U64_PRINTF_ARG(chan->global_identifier),
+ U64_PRINTF_ARG(estimated_total_queue_size));
+ /* Tell the scheduler we're decreasing the queue size */
+ scheduler_adjust_queue_size(chan, -1, adj);
+ }
+ }
+}
+
diff --git a/src/or/channel.h b/src/or/channel.h
index 4cd8f4391e..ecc2a092e4 100644
--- a/src/or/channel.h
+++ b/src/or/channel.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -57,6 +57,32 @@ struct channel_s {
CHANNEL_CLOSE_FOR_ERROR
} reason_for_closing;
+ /** State variable for use by the scheduler */
+ enum {
+ /*
+ * The channel is not open, or it has a full output buffer but no queued
+ * cells.
+ */
+ SCHED_CHAN_IDLE = 0,
+ /*
+ * The channel has space on its output buffer to write, but no queued
+ * cells.
+ */
+ SCHED_CHAN_WAITING_FOR_CELLS,
+ /*
+ * The scheduler has queued cells but no output buffer space to write.
+ */
+ SCHED_CHAN_WAITING_TO_WRITE,
+ /*
+ * The scheduler has both queued cells and output buffer space, and is
+ * eligible for the scheduler loop.
+ */
+ SCHED_CHAN_PENDING
+ } scheduler_state;
+
+ /** Heap index for use by the scheduler */
+ int sched_heap_idx;
+
/** Timestamps for both cell channels and listeners */
time_t timestamp_created; /* Channel created */
time_t timestamp_active; /* Any activity */
@@ -79,6 +105,11 @@ struct channel_s {
/* Methods implemented by the lower layer */
/**
+ * Ask the lower layer for an estimate of the average overhead for
+ * transmissions on this channel.
+ */
+ double (*get_overhead_estimate)(channel_t *);
+ /*
* Ask the underlying transport what the remote endpoint address is, in
* a tor_addr_t. This is optional and subclasses may leave this NULL.
* If they implement it, they should write the address out to the
@@ -110,7 +141,11 @@ struct channel_s {
int (*matches_extend_info)(channel_t *, extend_info_t *);
/** Check if this channel matches a target address when extending */
int (*matches_target)(channel_t *, const tor_addr_t *);
- /** Write a cell to an open channel */
+ /* Ask the lower layer how many bytes it has queued but not yet sent */
+ size_t (*num_bytes_queued)(channel_t *);
+ /* Ask the lower layer how many cells can be written */
+ int (*num_cells_writeable)(channel_t *);
+ /* Write a cell to an open channel */
int (*write_cell)(channel_t *, cell_t *);
/** Write a packed cell to an open channel */
int (*write_packed_cell)(channel_t *, packed_cell_t *);
@@ -198,8 +233,16 @@ struct channel_s {
uint64_t dirreq_id;
/** Channel counters for cell channels */
- uint64_t n_cells_recved;
- uint64_t n_cells_xmitted;
+ uint64_t n_cells_recved, n_bytes_recved;
+ uint64_t n_cells_xmitted, n_bytes_xmitted;
+
+ /** Our current contribution to the scheduler's total xmit queue */
+ uint64_t bytes_queued_for_xmit;
+
+ /** Number of bytes in this channel's cell queue; does not include
+ * lower-layer queueing.
+ */
+ uint64_t bytes_in_queue;
};
struct channel_listener_s {
@@ -311,6 +354,36 @@ void channel_set_cmux_policy_everywhere(circuitmux_policy_t *pol);
#ifdef TOR_CHANNEL_INTERNAL_
+#ifdef CHANNEL_PRIVATE_
+/* Cell queue structure (here rather than channel.c for test suite use) */
+
+typedef struct cell_queue_entry_s cell_queue_entry_t;
+struct cell_queue_entry_s {
+ TOR_SIMPLEQ_ENTRY(cell_queue_entry_s) next;
+ enum {
+ CELL_QUEUE_FIXED,
+ CELL_QUEUE_VAR,
+ CELL_QUEUE_PACKED
+ } type;
+ union {
+ struct {
+ cell_t *cell;
+ } fixed;
+ struct {
+ var_cell_t *var_cell;
+ } var;
+ struct {
+ packed_cell_t *packed_cell;
+ } packed;
+ } u;
+};
+
+/* Cell queue functions for benefit of test suite */
+STATIC int chan_cell_queue_len(const chan_cell_queue_t *queue);
+
+STATIC void cell_queue_entry_free(cell_queue_entry_t *q, int handed_off);
+#endif
+
/* Channel operations for subclasses and internal use only */
/* Initialize a newly allocated channel - do this first in subclass
@@ -384,7 +457,8 @@ void channel_queue_var_cell(channel_t *chan, var_cell_t *var_cell);
void channel_flush_cells(channel_t *chan);
/* Request from lower layer for more cells if available */
-ssize_t channel_flush_some_cells(channel_t *chan, ssize_t num_cells);
+MOCK_DECL(ssize_t, channel_flush_some_cells,
+ (channel_t *chan, ssize_t num_cells));
/* Query if data available on this channel */
int channel_more_to_flush(channel_t *chan);
@@ -431,11 +505,44 @@ channel_t * channel_find_by_remote_digest(const char *identity_digest);
channel_t * channel_next_with_digest(channel_t *chan);
/*
+ * Helper macros to lookup state of given channel.
+ */
+
+#define CHANNEL_IS_CLOSED(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_CLOSED))
+#define CHANNEL_IS_OPENING(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_OPENING))
+#define CHANNEL_IS_OPEN(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_OPEN))
+#define CHANNEL_IS_MAINT(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_MAINT))
+#define CHANNEL_IS_CLOSING(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_CLOSING))
+#define CHANNEL_IS_ERROR(chan) (channel_is_in_state((chan), \
+ CHANNEL_STATE_ERROR))
+
+#define CHANNEL_FINISHED(chan) (CHANNEL_IS_CLOSED(chan) || \
+ CHANNEL_IS_ERROR(chan))
+
+#define CHANNEL_CONDEMNED(chan) (CHANNEL_IS_CLOSING(chan) || \
+ CHANNEL_FINISHED(chan))
+
+#define CHANNEL_CAN_HANDLE_CELLS(chan) (CHANNEL_IS_OPENING(chan) || \
+ CHANNEL_IS_OPEN(chan) || \
+ CHANNEL_IS_MAINT(chan))
+
+static INLINE int
+channel_is_in_state(channel_t *chan, channel_state_t state)
+{
+ return chan->state == state;
+}
+
+/*
* Metadata queries/updates
*/
const char * channel_describe_transport(channel_t *chan);
-void channel_dump_statistics(channel_t *chan, int severity);
+MOCK_DECL(void, channel_dump_statistics, (channel_t *chan, int severity));
void channel_dump_transport_statistics(channel_t *chan, int severity);
const char * channel_get_actual_remote_descr(channel_t *chan);
const char * channel_get_actual_remote_address(channel_t *chan);
@@ -458,6 +565,7 @@ unsigned int channel_num_circuits(channel_t *chan);
void channel_set_circid_type(channel_t *chan, crypto_pk_t *identity_rcvd,
int consider_identity);
void channel_timestamp_client(channel_t *chan);
+void channel_update_xmit_queue_size(channel_t *chan);
const char * channel_listener_describe_transport(channel_listener_t *chan_l);
void channel_listener_dump_statistics(channel_listener_t *chan_l,
@@ -465,6 +573,10 @@ void channel_listener_dump_statistics(channel_listener_t *chan_l,
void channel_listener_dump_transport_statistics(channel_listener_t *chan_l,
int severity);
+/* Flow control queries */
+uint64_t channel_get_global_queue_estimate(void);
+int channel_num_cells_writeable(channel_t *chan);
+
/* Timestamp queries */
time_t channel_when_created(channel_t *chan);
time_t channel_when_last_active(channel_t *chan);
diff --git a/src/or/channeltls.c b/src/or/channeltls.c
index db044aee56..e194c1c4df 100644
--- a/src/or/channeltls.c
+++ b/src/or/channeltls.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -25,6 +25,7 @@
#include "relay.h"
#include "router.h"
#include "routerlist.h"
+#include "scheduler.h"
/** How many CELL_PADDING cells have we received, ever? */
uint64_t stats_n_padding_cells_processed = 0;
@@ -54,6 +55,7 @@ static void channel_tls_common_init(channel_tls_t *tlschan);
static void channel_tls_close_method(channel_t *chan);
static const char * channel_tls_describe_transport_method(channel_t *chan);
static void channel_tls_free_method(channel_t *chan);
+static double channel_tls_get_overhead_estimate_method(channel_t *chan);
static int
channel_tls_get_remote_addr_method(channel_t *chan, tor_addr_t *addr_out);
static int
@@ -67,6 +69,8 @@ channel_tls_matches_extend_info_method(channel_t *chan,
extend_info_t *extend_info);
static int channel_tls_matches_target_method(channel_t *chan,
const tor_addr_t *target);
+static int channel_tls_num_cells_writeable_method(channel_t *chan);
+static size_t channel_tls_num_bytes_queued_method(channel_t *chan);
static int channel_tls_write_cell_method(channel_t *chan,
cell_t *cell);
static int channel_tls_write_packed_cell_method(channel_t *chan,
@@ -116,6 +120,7 @@ channel_tls_common_init(channel_tls_t *tlschan)
chan->close = channel_tls_close_method;
chan->describe_transport = channel_tls_describe_transport_method;
chan->free = channel_tls_free_method;
+ chan->get_overhead_estimate = channel_tls_get_overhead_estimate_method;
chan->get_remote_addr = channel_tls_get_remote_addr_method;
chan->get_remote_descr = channel_tls_get_remote_descr_method;
chan->get_transport_name = channel_tls_get_transport_name_method;
@@ -123,6 +128,8 @@ channel_tls_common_init(channel_tls_t *tlschan)
chan->is_canonical = channel_tls_is_canonical_method;
chan->matches_extend_info = channel_tls_matches_extend_info_method;
chan->matches_target = channel_tls_matches_target_method;
+ chan->num_bytes_queued = channel_tls_num_bytes_queued_method;
+ chan->num_cells_writeable = channel_tls_num_cells_writeable_method;
chan->write_cell = channel_tls_write_cell_method;
chan->write_packed_cell = channel_tls_write_packed_cell_method;
chan->write_var_cell = channel_tls_write_var_cell_method;
@@ -435,6 +442,40 @@ channel_tls_free_method(channel_t *chan)
}
/**
+ * Get an estimate of the average TLS overhead for the upper layer
+ */
+
+static double
+channel_tls_get_overhead_estimate_method(channel_t *chan)
+{
+ double overhead = 1.0f;
+ channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
+
+ tor_assert(tlschan);
+ tor_assert(tlschan->conn);
+
+ /* Just return 1.0f if we don't have sensible data */
+ if (tlschan->conn->bytes_xmitted > 0 &&
+ tlschan->conn->bytes_xmitted_by_tls >=
+ tlschan->conn->bytes_xmitted) {
+ overhead = ((double)(tlschan->conn->bytes_xmitted_by_tls)) /
+ ((double)(tlschan->conn->bytes_xmitted));
+
+ /*
+ * Never estimate more than 2.0; otherwise we get silly large estimates
+ * at the very start of a new TLS connection.
+ */
+ if (overhead > 2.0f) overhead = 2.0f;
+ }
+
+ log_debug(LD_CHANNEL,
+ "Estimated overhead ratio for TLS chan " U64_FORMAT " is %f",
+ U64_PRINTF_ARG(chan->global_identifier), overhead);
+
+ return overhead;
+}
+
+/**
* Get the remote address of a channel_tls_t
*
* This implements the get_remote_addr method for channel_tls_t; copy the
@@ -673,6 +714,53 @@ channel_tls_matches_target_method(channel_t *chan,
}
/**
+ * Tell the upper layer how many bytes we have queued and not yet
+ * sent.
+ */
+
+static size_t
+channel_tls_num_bytes_queued_method(channel_t *chan)
+{
+ channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
+
+ tor_assert(tlschan);
+ tor_assert(tlschan->conn);
+
+ return connection_get_outbuf_len(TO_CONN(tlschan->conn));
+}
+
+/**
+ * Tell the upper layer how many cells we can accept to write
+ *
+ * This implements the num_cells_writeable method for channel_tls_t; it
+ * returns an estimate of the number of cells we can accept with
+ * channel_tls_write_*_cell().
+ */
+
+static int
+channel_tls_num_cells_writeable_method(channel_t *chan)
+{
+ size_t outbuf_len;
+ ssize_t n;
+ channel_tls_t *tlschan = BASE_CHAN_TO_TLS(chan);
+ size_t cell_network_size;
+
+ tor_assert(tlschan);
+ tor_assert(tlschan->conn);
+
+ cell_network_size = get_cell_network_size(tlschan->conn->wide_circ_ids);
+ outbuf_len = connection_get_outbuf_len(TO_CONN(tlschan->conn));
+ /* Get the number of cells */
+ n = CEIL_DIV(OR_CONN_HIGHWATER - outbuf_len, cell_network_size);
+ if (n < 0) n = 0;
+#if SIZEOF_SIZE_T > SIZEOF_INT
+ if (n > INT_MAX) n = INT_MAX;
+#endif
+
+ return (int)n;
+}
+
+/**
* Write a cell to a channel_tls_t
*
* This implements the write_cell method for channel_tls_t; given a
@@ -852,13 +940,13 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan,
base_chan = TLS_CHAN_TO_BASE(chan);
- /* Make sure the base connection state makes sense - shouldn't be error,
- * closed or listening. */
+ /* Make sure the base connection state makes sense - shouldn't be error
+ * or closed. */
- tor_assert(base_chan->state == CHANNEL_STATE_OPENING ||
- base_chan->state == CHANNEL_STATE_OPEN ||
- base_chan->state == CHANNEL_STATE_MAINT ||
- base_chan->state == CHANNEL_STATE_CLOSING);
+ tor_assert(CHANNEL_IS_OPENING(base_chan) ||
+ CHANNEL_IS_OPEN(base_chan) ||
+ CHANNEL_IS_MAINT(base_chan) ||
+ CHANNEL_IS_CLOSING(base_chan));
/* Did we just go to state open? */
if (state == OR_CONN_STATE_OPEN) {
@@ -867,69 +955,21 @@ channel_tls_handle_state_change_on_orconn(channel_tls_t *chan,
* CHANNEL_STATE_MAINT on this.
*/
channel_change_state(base_chan, CHANNEL_STATE_OPEN);
+ /* We might have just become writeable; check and tell the scheduler */
+ if (connection_or_num_cells_writeable(conn) > 0) {
+ scheduler_channel_wants_writes(base_chan);
+ }
} else {
/*
* Not open, so from CHANNEL_STATE_OPEN we go to CHANNEL_STATE_MAINT,
* otherwise no change.
*/
- if (base_chan->state == CHANNEL_STATE_OPEN) {
+ if (CHANNEL_IS_OPEN(base_chan)) {
channel_change_state(base_chan, CHANNEL_STATE_MAINT);
}
}
}
-/**
- * Flush cells from a channel_tls_t
- *
- * Try to flush up to about num_cells cells, and return how many we flushed.
- */
-
-ssize_t
-channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells)
-{
- ssize_t flushed = 0;
-
- tor_assert(chan);
-
- if (flushed >= num_cells) goto done;
-
- /*
- * If channel_tls_t ever buffers anything below the channel_t layer, flush
- * that first here.
- */
-
- flushed += channel_flush_some_cells(TLS_CHAN_TO_BASE(chan),
- num_cells - flushed);
-
- /*
- * If channel_tls_t ever buffers anything below the channel_t layer, check
- * how much we actually got and push it on down here.
- */
-
- done:
- return flushed;
-}
-
-/**
- * Check if a channel_tls_t has anything to flush
- *
- * Return true if there is any more to flush on this channel (cells in queue
- * or active circuits).
- */
-
-int
-channel_tls_more_to_flush(channel_tls_t *chan)
-{
- tor_assert(chan);
-
- /*
- * If channel_tls_t ever buffers anything below channel_t, the
- * check for that should go here first.
- */
-
- return channel_more_to_flush(TLS_CHAN_TO_BASE(chan));
-}
-
#ifdef KEEP_TIMING_STATS
/**
diff --git a/src/or/channeltls.h b/src/or/channeltls.h
index 06be6fa555..507429420b 100644
--- a/src/or/channeltls.h
+++ b/src/or/channeltls.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -40,8 +40,6 @@ channel_t * channel_tls_to_base(channel_tls_t *tlschan);
channel_tls_t * channel_tls_from_base(channel_t *chan);
/* Things for connection_or.c to call back into */
-ssize_t channel_tls_flush_some_cells(channel_tls_t *chan, ssize_t num_cells);
-int channel_tls_more_to_flush(channel_tls_t *chan);
void channel_tls_handle_cell(cell_t *cell, or_connection_t *conn);
void channel_tls_handle_state_change_on_orconn(channel_tls_t *chan,
or_connection_t *conn,
diff --git a/src/or/circpathbias.c b/src/or/circpathbias.c
index a6858a3460..a0115cc6ec 100644
--- a/src/or/circpathbias.c
+++ b/src/or/circpathbias.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -768,8 +768,8 @@ pathbias_send_usable_probe(circuit_t *circ)
/* Can't probe if the channel isn't open */
if (circ->n_chan == NULL ||
- (circ->n_chan->state != CHANNEL_STATE_OPEN
- && circ->n_chan->state != CHANNEL_STATE_MAINT)) {
+ (!CHANNEL_IS_OPEN(circ->n_chan)
+ && !CHANNEL_IS_MAINT(circ->n_chan))) {
log_info(LD_CIRC,
"Skipping pathbias probe for circuit %d: Channel is not open.",
ocirc->global_identifier);
diff --git a/src/or/circpathbias.h b/src/or/circpathbias.h
index bb8846353c..9e973850d5 100644
--- a/src/or/circpathbias.h
+++ b/src/or/circpathbias.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 42c4870e87..6d5bbbf16c 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -14,6 +14,7 @@
#include "or.h"
#include "channel.h"
#include "circpathbias.h"
+#define CIRCUITBUILD_PRIVATE
#include "circuitbuild.h"
#include "circuitlist.h"
#include "circuitstats.h"
@@ -550,9 +551,13 @@ circuit_handle_first_hop(origin_circuit_t *circ)
* open and get them to send their create cells forward.
*
* Status is 1 if connect succeeded, or 0 if connect failed.
+ *
+ * Close_origin_circuits is 1 if we should close all the origin circuits
+ * through this channel, or 0 otherwise. (This happens when we want to retry
+ * an older guard.)
*/
void
-circuit_n_chan_done(channel_t *chan, int status)
+circuit_n_chan_done(channel_t *chan, int status, int close_origin_circuits)
{
smartlist_t *pending_circs;
int err_reason = 0;
@@ -590,6 +595,11 @@ circuit_n_chan_done(channel_t *chan, int status)
circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED);
continue;
}
+ if (close_origin_circuits && CIRCUIT_IS_ORIGIN(circ)) {
+ log_info(LD_CIRC,"Channel deprecated for origin circs; closing circ.");
+ circuit_mark_for_close(circ, END_CIRC_REASON_CHANNEL_CLOSED);
+ continue;
+ }
log_debug(LD_CIRC, "Found circ, sending create cell.");
/* circuit_deliver_create_cell will set n_circ_id and add us to
* chan_circuid_circuit_map, so we don't need to call
@@ -671,7 +681,7 @@ circuit_deliver_create_cell(circuit_t *circ, const create_cell_t *create_cell,
if (CIRCUIT_IS_ORIGIN(circ)) {
/* Update began timestamp for circuits starting their first hop */
if (TO_ORIGIN_CIRCUIT(circ)->cpath->state == CPATH_STATE_CLOSED) {
- if (circ->n_chan->state != CHANNEL_STATE_OPEN) {
+ if (!CHANNEL_IS_OPEN(circ->n_chan)) {
log_warn(LD_CIRC,
"Got first hop for a circuit without an opened channel. "
"State: %s.", channel_state_to_string(circ->n_chan->state));
@@ -943,9 +953,9 @@ circuit_send_next_onion_skin(origin_circuit_t *circ)
circuit_rep_hist_note_result(circ);
circuit_has_opened(circ); /* do other actions as necessary */
- if (!can_complete_circuit && !circ->build_state->onehop_tunnel) {
+ if (!have_completed_a_circuit() && !circ->build_state->onehop_tunnel) {
const or_options_t *options = get_options();
- can_complete_circuit=1;
+ note_that_we_completed_a_circuit();
/* FFFF Log a count of known routers here */
log_notice(LD_GENERAL,
"Tor has successfully opened a circuit. "
@@ -1033,7 +1043,8 @@ circuit_note_clock_jumped(int seconds_elapsed)
seconds_elapsed >=0 ? "forward" : "backward");
control_event_general_status(LOG_WARN, "CLOCK_JUMPED TIME=%d",
seconds_elapsed);
- can_complete_circuit=0; /* so it'll log when it works again */
+ /* so we log when it works again */
+ note_that_we_maybe_cant_complete_circuits();
control_event_client_status(severity, "CIRCUIT_NOT_ESTABLISHED REASON=%s",
"CLOCK_JUMPED");
circuit_mark_all_unused_circs();
@@ -1376,8 +1387,10 @@ onionskin_answer(or_circuit_t *circ,
log_debug(LD_CIRC,"Finished sending '%s' cell.",
circ->is_first_hop ? "created_fast" : "created");
- if (!channel_is_local(circ->p_chan) &&
- !channel_is_outgoing(circ->p_chan)) {
+ /* Ignore the local bit when testing - many test networks run on local
+ * addresses */
+ if ((!channel_is_local(circ->p_chan) || get_options()->TestingTorNetwork)
+ && !channel_is_outgoing(circ->p_chan)) {
/* record that we could process create cells from a non-local conn
* that we didn't initiate; presumably this means that create cells
* can reach us too. */
@@ -1861,7 +1874,7 @@ onion_pick_cpath_exit(origin_circuit_t *circ, extend_info_t *exit)
choose_good_exit_server(circ->base_.purpose, state->need_uptime,
state->need_capacity, state->is_internal);
if (!node) {
- log_warn(LD_CIRC,"failed to choose an exit server");
+ log_warn(LD_CIRC,"Failed to choose an exit server");
return -1;
}
exit = extend_info_from_node(node, 0);
@@ -1988,7 +2001,8 @@ choose_good_middle_server(uint8_t purpose,
tor_assert(CIRCUIT_PURPOSE_MIN_ <= purpose &&
purpose <= CIRCUIT_PURPOSE_MAX_);
- log_debug(LD_CIRC, "Contemplating intermediate hop: random choice.");
+ log_debug(LD_CIRC, "Contemplating intermediate hop %d: random choice.",
+ cur_len);
excluded = smartlist_new();
if ((r = build_state_get_exit_node(state))) {
nodelist_add_node_and_family(excluded, r);
@@ -2050,9 +2064,18 @@ choose_good_entry_server(uint8_t purpose, cpath_build_state_t *state)
smartlist_add(excluded, (void*)node);
});
}
- /* and exclude current entry guards and their families, if applicable */
+ /* and exclude current entry guards and their families,
+ * unless we're in a test network, and excluding guards
+ * would exclude all nodes (i.e. we're in an incredibly small tor network,
+ * or we're using TestingAuthVoteGuard *).
+ * This is an incomplete fix, but is no worse than the previous behaviour,
+ * and only applies to minimal, testing tor networks
+ * (so it's no less secure) */
/*XXXX025 use the using_as_guard flag to accomplish this.*/
- if (options->UseEntryGuards) {
+ if (options->UseEntryGuards
+ && (!options->TestingTorNetwork ||
+ smartlist_len(nodelist_get_list()) > smartlist_len(get_entry_guards())
+ )) {
SMARTLIST_FOREACH(get_entry_guards(), const entry_guard_t *, entry,
{
if ((node = node_get_by_id(entry->identity))) {
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index e70cdc5825..c72016d530 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -22,7 +22,8 @@ origin_circuit_t *circuit_establish_circuit(uint8_t purpose,
extend_info_t *exit,
int flags);
int circuit_handle_first_hop(origin_circuit_t *circ);
-void circuit_n_chan_done(channel_t *chan, int status);
+void circuit_n_chan_done(channel_t *chan, int status,
+ int close_origin_circuits);
int inform_testing_reachability(void);
int circuit_timeout_want_to_count_circ(origin_circuit_t *circ);
int circuit_send_next_onion_skin(origin_circuit_t *circ);
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index d9da1e7f88..d964e66922 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1,7 +1,7 @@
/* Copyright 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -302,8 +302,8 @@ channel_note_destroy_pending(channel_t *chan, circid_t id)
/** Called to indicate that a DESTROY is no longer pending on <b>chan</b> with
* circuit ID <b>id</b> -- typically, because it has been sent. */
-void
-channel_note_destroy_not_pending(channel_t *chan, circid_t id)
+MOCK_IMPL(void, channel_note_destroy_not_pending,
+ (channel_t *chan, circid_t id))
{
circuit_t *circ = circuit_get_by_circid_channel_even_if_marked(id,chan);
if (circ) {
@@ -745,6 +745,7 @@ circuit_free(circuit_t *circ)
{
void *mem;
size_t memlen;
+ int should_free = 1;
if (!circ)
return;
@@ -784,6 +785,8 @@ circuit_free(circuit_t *circ)
memlen = sizeof(or_circuit_t);
tor_assert(circ->magic == OR_CIRCUIT_MAGIC);
+ should_free = (ocirc->workqueue_entry == NULL);
+
crypto_cipher_free(ocirc->p_crypto);
crypto_digest_free(ocirc->p_digest);
crypto_cipher_free(ocirc->n_crypto);
@@ -826,8 +829,18 @@ circuit_free(circuit_t *circ)
* "active" checks will be violated. */
cell_queue_clear(&circ->n_chan_cells);
- memwipe(mem, 0xAA, memlen); /* poison memory */
- tor_free(mem);
+ if (should_free) {
+ memwipe(mem, 0xAA, memlen); /* poison memory */
+ tor_free(mem);
+ } else {
+ /* If we made it here, this is an or_circuit_t that still has a pending
+ * cpuworker request which we weren't able to cancel. Instead, set up
+ * the magic value so that when the reply comes back, we'll know to discard
+ * the reply and free this structure.
+ */
+ memwipe(mem, 0xAA, memlen);
+ circ->magic = DEAD_CIRCUIT_MAGIC;
+ }
}
/** Deallocate the linked list circ-><b>cpath</b>, and remove the cpath from
@@ -1719,36 +1732,40 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line,
tor_assert(circ->state == CIRCUIT_STATE_OPEN);
tor_assert(ocirc->build_state->chosen_exit);
tor_assert(ocirc->rend_data);
- /* treat this like getting a nack from it */
- log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s",
- safe_str_client(ocirc->rend_data->onion_address),
- safe_str_client(build_state_get_exit_nickname(ocirc->build_state)),
- timed_out ? "Recording timeout." : "Removing from descriptor.");
- rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
- ocirc->rend_data,
- timed_out ?
- INTRO_POINT_FAILURE_TIMEOUT :
- INTRO_POINT_FAILURE_GENERIC);
+ if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) {
+ /* treat this like getting a nack from it */
+ log_info(LD_REND, "Failed intro circ %s to %s (awaiting ack). %s",
+ safe_str_client(ocirc->rend_data->onion_address),
+ safe_str_client(build_state_get_exit_nickname(ocirc->build_state)),
+ timed_out ? "Recording timeout." : "Removing from descriptor.");
+ rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
+ ocirc->rend_data,
+ timed_out ?
+ INTRO_POINT_FAILURE_TIMEOUT :
+ INTRO_POINT_FAILURE_GENERIC);
+ }
} else if (circ->purpose == CIRCUIT_PURPOSE_C_INTRODUCING &&
reason != END_CIRC_REASON_TIMEOUT) {
origin_circuit_t *ocirc = TO_ORIGIN_CIRCUIT(circ);
if (ocirc->build_state->chosen_exit && ocirc->rend_data) {
- log_info(LD_REND, "Failed intro circ %s to %s "
- "(building circuit to intro point). "
- "Marking intro point as possibly unreachable.",
- safe_str_client(ocirc->rend_data->onion_address),
- safe_str_client(build_state_get_exit_nickname(ocirc->build_state)));
- rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
- ocirc->rend_data,
- INTRO_POINT_FAILURE_UNREACHABLE);
+ if (orig_reason != END_CIRC_REASON_IP_NOW_REDUNDANT) {
+ log_info(LD_REND, "Failed intro circ %s to %s "
+ "(building circuit to intro point). "
+ "Marking intro point as possibly unreachable.",
+ safe_str_client(ocirc->rend_data->onion_address),
+ safe_str_client(build_state_get_exit_nickname(
+ ocirc->build_state)));
+ rend_client_report_intro_point_failure(ocirc->build_state->chosen_exit,
+ ocirc->rend_data,
+ INTRO_POINT_FAILURE_UNREACHABLE);
+ }
}
}
+
if (circ->n_chan) {
circuit_clear_cell_queue(circ, circ->n_chan);
/* Only send destroy if the channel isn't closing anyway */
- if (!(circ->n_chan->state == CHANNEL_STATE_CLOSING ||
- circ->n_chan->state == CHANNEL_STATE_CLOSED ||
- circ->n_chan->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(circ->n_chan)) {
channel_send_destroy(circ->n_circ_id, circ->n_chan, reason);
}
circuitmux_detach_circuit(circ->n_chan->cmux, circ);
@@ -1780,9 +1797,7 @@ circuit_mark_for_close_, (circuit_t *circ, int reason, int line,
if (or_circ->p_chan) {
circuit_clear_cell_queue(circ, or_circ->p_chan);
/* Only send destroy if the channel isn't closing anyway */
- if (!(or_circ->p_chan->state == CHANNEL_STATE_CLOSING ||
- or_circ->p_chan->state == CHANNEL_STATE_CLOSED ||
- or_circ->p_chan->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(or_circ->p_chan)) {
channel_send_destroy(or_circ->p_circ_id, or_circ->p_chan, reason);
}
circuitmux_detach_circuit(or_circ->p_chan->cmux, circ);
diff --git a/src/or/circuitlist.h b/src/or/circuitlist.h
index addaa725d4..4e600da57d 100644
--- a/src/or/circuitlist.h
+++ b/src/or/circuitlist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -72,7 +72,8 @@ void circuit_free_all(void);
void circuits_handle_oom(size_t current_allocation);
void channel_note_destroy_pending(channel_t *chan, circid_t id);
-void channel_note_destroy_not_pending(channel_t *chan, circid_t id);
+MOCK_DECL(void, channel_note_destroy_not_pending,
+ (channel_t *chan, circid_t id));
#ifdef CIRCUITLIST_PRIVATE
STATIC void circuit_free(circuit_t *circ);
diff --git a/src/or/circuitmux.c b/src/or/circuitmux.c
index 663711c6c0..a77bffac90 100644
--- a/src/or/circuitmux.c
+++ b/src/or/circuitmux.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -621,8 +621,8 @@ circuitmux_clear_policy(circuitmux_t *cmux)
* Return the policy currently installed on a circuitmux_t
*/
-const circuitmux_policy_t *
-circuitmux_get_policy(circuitmux_t *cmux)
+MOCK_IMPL(const circuitmux_policy_t *,
+circuitmux_get_policy, (circuitmux_t *cmux))
{
tor_assert(cmux);
@@ -896,8 +896,8 @@ circuitmux_num_cells_for_circuit(circuitmux_t *cmux, circuit_t *circ)
* Query total number of available cells on a circuitmux
*/
-unsigned int
-circuitmux_num_cells(circuitmux_t *cmux)
+MOCK_IMPL(unsigned int,
+circuitmux_num_cells, (circuitmux_t *cmux))
{
tor_assert(cmux);
@@ -1951,3 +1951,51 @@ circuitmux_count_queued_destroy_cells(const channel_t *chan,
return n_destroy_cells;
}
+/**
+ * Compare cmuxes to see which is more preferred; return < 0 if
+ * cmux_1 has higher priority (i.e., cmux_1 < cmux_2 in the scheduler's
+ * sort order), > 0 if cmux_2 has higher priority, or 0 if they are
+ * equally preferred.
+ *
+ * If the cmuxes have different cmux policies or the policy does not
+ * support the cmp_cmux method, return 0.
+ */
+
+MOCK_IMPL(int,
+circuitmux_compare_muxes, (circuitmux_t *cmux_1, circuitmux_t *cmux_2))
+{
+ const circuitmux_policy_t *policy;
+
+ tor_assert(cmux_1);
+ tor_assert(cmux_2);
+
+ if (cmux_1 == cmux_2) {
+ /* Equivalent because they're the same cmux */
+ return 0;
+ }
+
+ if (cmux_1->policy && cmux_2->policy) {
+ if (cmux_1->policy == cmux_2->policy) {
+ policy = cmux_1->policy;
+
+ if (policy->cmp_cmux) {
+ /* Okay, we can compare! */
+ return policy->cmp_cmux(cmux_1, cmux_1->policy_data,
+ cmux_2, cmux_2->policy_data);
+ } else {
+ /*
+ * Equivalent because the policy doesn't know how to compare between
+ * muxes.
+ */
+ return 0;
+ }
+ } else {
+ /* Equivalent because they have different policies */
+ return 0;
+ }
+ } else {
+ /* Equivalent because one or both are missing a policy */
+ return 0;
+ }
+}
+
diff --git a/src/or/circuitmux.h b/src/or/circuitmux.h
index eade2486a2..837e3961bf 100644
--- a/src/or/circuitmux.h
+++ b/src/or/circuitmux.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -57,6 +57,9 @@ struct circuitmux_policy_s {
/* Choose a circuit */
circuit_t * (*pick_active_circuit)(circuitmux_t *cmux,
circuitmux_policy_data_t *pol_data);
+ /* Optional: channel comparator for use by the scheduler */
+ int (*cmp_cmux)(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1,
+ circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2);
};
/*
@@ -105,7 +108,8 @@ void circuitmux_free(circuitmux_t *cmux);
/* Policy control */
void circuitmux_clear_policy(circuitmux_t *cmux);
-const circuitmux_policy_t * circuitmux_get_policy(circuitmux_t *cmux);
+MOCK_DECL(const circuitmux_policy_t *,
+ circuitmux_get_policy, (circuitmux_t *cmux));
void circuitmux_set_policy(circuitmux_t *cmux,
const circuitmux_policy_t *pol);
@@ -117,7 +121,7 @@ int circuitmux_is_circuit_attached(circuitmux_t *cmux, circuit_t *circ);
int circuitmux_is_circuit_active(circuitmux_t *cmux, circuit_t *circ);
unsigned int circuitmux_num_cells_for_circuit(circuitmux_t *cmux,
circuit_t *circ);
-unsigned int circuitmux_num_cells(circuitmux_t *cmux);
+MOCK_DECL(unsigned int, circuitmux_num_cells, (circuitmux_t *cmux));
unsigned int circuitmux_num_circuits(circuitmux_t *cmux);
unsigned int circuitmux_num_active_circuits(circuitmux_t *cmux);
@@ -148,5 +152,9 @@ void circuitmux_append_destroy_cell(channel_t *chan,
void circuitmux_mark_destroyed_circids_usable(circuitmux_t *cmux,
channel_t *chan);
+/* Optional interchannel comparisons for scheduling */
+MOCK_DECL(int, circuitmux_compare_muxes,
+ (circuitmux_t *cmux_1, circuitmux_t *cmux_2));
+
#endif /* TOR_CIRCUITMUX_H */
diff --git a/src/or/circuitmux_ewma.c b/src/or/circuitmux_ewma.c
index 49d899e5e7..1c0318de06 100644
--- a/src/or/circuitmux_ewma.c
+++ b/src/or/circuitmux_ewma.c
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -187,6 +187,9 @@ ewma_notify_xmit_cells(circuitmux_t *cmux,
static circuit_t *
ewma_pick_active_circuit(circuitmux_t *cmux,
circuitmux_policy_data_t *pol_data);
+static int
+ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1,
+ circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2);
/*** EWMA global variables ***/
@@ -209,7 +212,8 @@ circuitmux_policy_t ewma_policy = {
/*.notify_circ_inactive =*/ ewma_notify_circ_inactive,
/*.notify_set_n_cells =*/ NULL, /* EWMA doesn't need this */
/*.notify_xmit_cells =*/ ewma_notify_xmit_cells,
- /*.pick_active_circuit =*/ ewma_pick_active_circuit
+ /*.pick_active_circuit =*/ ewma_pick_active_circuit,
+ /*.cmp_cmux =*/ ewma_cmp_cmux
};
/*** EWMA method implementations using the below EWMA helper functions ***/
@@ -453,6 +457,58 @@ ewma_pick_active_circuit(circuitmux_t *cmux,
return circ;
}
+/**
+ * Compare two EWMA cmuxes, and return -1, 0 or 1 to indicate which should
+ * be more preferred - see circuitmux_compare_muxes() of circuitmux.c.
+ */
+
+static int
+ewma_cmp_cmux(circuitmux_t *cmux_1, circuitmux_policy_data_t *pol_data_1,
+ circuitmux_t *cmux_2, circuitmux_policy_data_t *pol_data_2)
+{
+ ewma_policy_data_t *p1 = NULL, *p2 = NULL;
+ cell_ewma_t *ce1 = NULL, *ce2 = NULL;
+
+ tor_assert(cmux_1);
+ tor_assert(pol_data_1);
+ tor_assert(cmux_2);
+ tor_assert(pol_data_2);
+
+ p1 = TO_EWMA_POL_DATA(pol_data_1);
+ p2 = TO_EWMA_POL_DATA(pol_data_1);
+
+ if (p1 != p2) {
+ /* Get the head cell_ewma_t from each queue */
+ if (smartlist_len(p1->active_circuit_pqueue) > 0) {
+ ce1 = smartlist_get(p1->active_circuit_pqueue, 0);
+ }
+
+ if (smartlist_len(p2->active_circuit_pqueue) > 0) {
+ ce2 = smartlist_get(p2->active_circuit_pqueue, 0);
+ }
+
+ /* Got both of them? */
+ if (ce1 != NULL && ce2 != NULL) {
+ /* Pick whichever one has the better best circuit */
+ return compare_cell_ewma_counts(ce1, ce2);
+ } else {
+ if (ce1 != NULL ) {
+ /* We only have a circuit on cmux_1, so prefer it */
+ return -1;
+ } else if (ce2 != NULL) {
+ /* We only have a circuit on cmux_2, so prefer it */
+ return 1;
+ } else {
+ /* No circuits at all; no preference */
+ return 0;
+ }
+ }
+ } else {
+ /* We got identical params */
+ return 0;
+ }
+}
+
/** Helper for sorting cell_ewma_t values in their priority queue. */
static int
compare_cell_ewma_counts(const void *p1, const void *p2)
diff --git a/src/or/circuitmux_ewma.h b/src/or/circuitmux_ewma.h
index ce78a8ef0d..3feef834dd 100644
--- a/src/or/circuitmux_ewma.h
+++ b/src/or/circuitmux_ewma.h
@@ -1,4 +1,4 @@
-/* * Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* * Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuitstats.c b/src/or/circuitstats.c
index a136278e58..18cb1c8484 100644
--- a/src/or/circuitstats.c
+++ b/src/or/circuitstats.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CIRCUITSTATS_PRIVATE
diff --git a/src/or/circuitstats.h b/src/or/circuitstats.h
index 7cef4f7fb1..fe05a24e97 100644
--- a/src/or/circuitstats.h
+++ b/src/or/circuitstats.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/circuituse.c b/src/or/circuituse.c
index 441a8fcbb5..612b536bad 100644
--- a/src/or/circuituse.c
+++ b/src/or/circuituse.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -200,7 +200,7 @@ circuit_is_better(const origin_circuit_t *oa, const origin_circuit_t *ob,
return 1;
} else {
if (a->timestamp_dirty ||
- timercmp(&a->timestamp_began, &b->timestamp_began, >))
+ timercmp(&a->timestamp_began, &b->timestamp_began, OP_GT))
return 1;
if (ob->build_state->is_internal)
/* XXX023 what the heck is this internal thing doing here. I
@@ -514,7 +514,7 @@ circuit_expire_building(void)
if (TO_ORIGIN_CIRCUIT(victim)->hs_circ_has_timed_out)
cutoff = hs_extremely_old_cutoff;
- if (timercmp(&victim->timestamp_began, &cutoff, >))
+ if (timercmp(&victim->timestamp_began, &cutoff, OP_GT))
continue; /* it's still young, leave it alone */
/* We need to double-check the opened state here because
@@ -524,7 +524,7 @@ circuit_expire_building(void)
* aren't either. */
if (!any_opened_circs && victim->state != CIRCUIT_STATE_OPEN) {
/* It's still young enough that we wouldn't close it, right? */
- if (timercmp(&victim->timestamp_began, &close_cutoff, >)) {
+ if (timercmp(&victim->timestamp_began, &close_cutoff, OP_GT)) {
if (!TO_ORIGIN_CIRCUIT(victim)->relaxed_timeout) {
int first_hop_succeeded = TO_ORIGIN_CIRCUIT(victim)->cpath->state
== CPATH_STATE_OPEN;
@@ -672,7 +672,7 @@ circuit_expire_building(void)
* it off at, we probably had a suspend event along this codepath,
* and we should discard the value.
*/
- if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, <)) {
+ if (timercmp(&victim->timestamp_began, &extremely_old_cutoff, OP_LT)) {
log_notice(LD_CIRC,
"Extremely large value for circuit build timeout: %lds. "
"Assuming clock jump. Purpose %d (%s)",
@@ -1024,9 +1024,11 @@ circuit_predict_and_launch_new(void)
/* Second, see if we need any more exit circuits. */
/* check if we know of a port that's been requested recently
- * and no circuit is currently available that can handle it. */
+ * and no circuit is currently available that can handle it.
+ * Exits (obviously) require an exit circuit. */
if (!circuit_all_predicted_ports_handled(now, &port_needs_uptime,
- &port_needs_capacity)) {
+ &port_needs_capacity)
+ && router_have_consensus_path() == CONSENSUS_PATH_EXIT) {
if (port_needs_uptime)
flags |= CIRCLAUNCH_NEED_UPTIME;
if (port_needs_capacity)
@@ -1038,8 +1040,10 @@ circuit_predict_and_launch_new(void)
return;
}
- /* Third, see if we need any more hidden service (server) circuits. */
- if (num_rend_services() && num_uptime_internal < 3) {
+ /* Third, see if we need any more hidden service (server) circuits.
+ * HS servers only need an internal circuit. */
+ if (num_rend_services() && num_uptime_internal < 3
+ && router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) {
flags = (CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_NEED_UPTIME |
CIRCLAUNCH_IS_INTERNAL);
log_info(LD_CIRC,
@@ -1050,11 +1054,13 @@ circuit_predict_and_launch_new(void)
return;
}
- /* Fourth, see if we need any more hidden service (client) circuits. */
+ /* Fourth, see if we need any more hidden service (client) circuits.
+ * HS clients only need an internal circuit. */
if (rep_hist_get_predicted_internal(now, &hidserv_needs_uptime,
&hidserv_needs_capacity) &&
((num_uptime_internal<2 && hidserv_needs_uptime) ||
- num_internal<2)) {
+ num_internal<2)
+ && router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) {
if (hidserv_needs_uptime)
flags |= CIRCLAUNCH_NEED_UPTIME;
if (hidserv_needs_capacity)
@@ -1071,15 +1077,23 @@ circuit_predict_and_launch_new(void)
/* Finally, check to see if we still need more circuits to learn
* a good build timeout. But if we're close to our max number we
* want, don't do another -- we want to leave a few slots open so
- * we can still build circuits preemptively as needed. */
- if (num < MAX_UNUSED_OPEN_CIRCUITS-2 &&
- ! circuit_build_times_disabled() &&
- circuit_build_times_needs_circuits_now(get_circuit_build_times())) {
- flags = CIRCLAUNCH_NEED_CAPACITY;
- log_info(LD_CIRC,
- "Have %d clean circs need another buildtime test circ.", num);
- circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags);
- return;
+ * we can still build circuits preemptively as needed.
+ * XXXX make the assumption that build timeout streams should be
+ * created whenever we can build internal circuits. */
+ if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN) {
+ if (num < MAX_UNUSED_OPEN_CIRCUITS-2 &&
+ ! circuit_build_times_disabled() &&
+ circuit_build_times_needs_circuits_now(get_circuit_build_times())) {
+ flags = CIRCLAUNCH_NEED_CAPACITY;
+ /* if there are no exits in the consensus, make timeout
+ * circuits internal */
+ if (router_have_consensus_path() == CONSENSUS_PATH_INTERNAL)
+ flags |= CIRCLAUNCH_IS_INTERNAL;
+ log_info(LD_CIRC,
+ "Have %d clean circs need another buildtime test circ.", num);
+ circuit_launch(CIRCUIT_PURPOSE_C_GENERAL, flags);
+ return;
+ }
}
}
@@ -1096,11 +1110,17 @@ circuit_build_needed_circs(time_t now)
{
const or_options_t *options = get_options();
- /* launch a new circ for any pending streams that need one */
- connection_ap_attach_pending();
+ /* launch a new circ for any pending streams that need one
+ * XXXX make the assumption that (some) AP streams (i.e. HS clients)
+ * don't require an exit circuit, review in #13814.
+ * This allows HSs to function in a consensus without exits. */
+ if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN)
+ connection_ap_attach_pending();
- /* make sure any hidden services have enough intro points */
- rend_services_introduce();
+ /* make sure any hidden services have enough intro points
+ * HS intro point streams only require an internal circuit */
+ if (router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN)
+ rend_services_introduce();
circuit_expire_old_circs_as_needed(now);
@@ -1255,7 +1275,7 @@ circuit_expire_old_circuits_clientside(void)
if (circ->purpose != CIRCUIT_PURPOSE_PATH_BIAS_TESTING)
circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
} else if (!circ->timestamp_dirty && circ->state == CIRCUIT_STATE_OPEN) {
- if (timercmp(&circ->timestamp_began, &cutoff, <)) {
+ if (timercmp(&circ->timestamp_began, &cutoff, OP_LT)) {
if (circ->purpose == CIRCUIT_PURPOSE_C_GENERAL ||
circ->purpose == CIRCUIT_PURPOSE_C_MEASURE_TIMEOUT ||
circ->purpose == CIRCUIT_PURPOSE_S_ESTABLISH_INTRO ||
@@ -1632,6 +1652,16 @@ circuit_launch(uint8_t purpose, int flags)
return circuit_launch_by_extend_info(purpose, NULL, flags);
}
+/** DOCDOC */
+static int
+have_enough_path_info(int need_exit)
+{
+ if (need_exit)
+ return router_have_consensus_path() == CONSENSUS_PATH_EXIT;
+ else
+ return router_have_consensus_path() != CONSENSUS_PATH_UNKNOWN;
+}
+
/** Launch a new circuit with purpose <b>purpose</b> and exit node
* <b>extend_info</b> (or NULL to select a random exit node). If flags
* contains CIRCLAUNCH_NEED_UPTIME, choose among routers with high uptime. If
@@ -1646,10 +1676,14 @@ circuit_launch_by_extend_info(uint8_t purpose,
{
origin_circuit_t *circ;
int onehop_tunnel = (flags & CIRCLAUNCH_ONEHOP_TUNNEL) != 0;
-
- if (!onehop_tunnel && !router_have_minimum_dir_info()) {
- log_debug(LD_CIRC,"Haven't fetched enough directory info yet; canceling "
- "circuit launch.");
+ int have_path = have_enough_path_info(! (flags & CIRCLAUNCH_IS_INTERNAL) );
+
+ if (!onehop_tunnel && (!router_have_minimum_dir_info() || !have_path)) {
+ log_debug(LD_CIRC,"Haven't %s yet; canceling "
+ "circuit launch.",
+ !router_have_minimum_dir_info() ?
+ "fetched enough directory info" :
+ "received a consensus with exits");
return NULL;
}
@@ -1806,7 +1840,9 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn,
return 1; /* we're happy */
}
- if (!want_onehop && !router_have_minimum_dir_info()) {
+ int have_path = have_enough_path_info(!need_internal);
+
+ if (!want_onehop && (!router_have_minimum_dir_info() || !have_path)) {
if (!connection_get_by_type(CONN_TYPE_DIR)) {
int severity = LOG_NOTICE;
/* FFFF if this is a tunneled directory fetch, don't yell
@@ -1814,14 +1850,20 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn,
if (entry_list_is_constrained(options) &&
entries_known_but_down(options)) {
log_fn(severity, LD_APP|LD_DIR,
- "Application request when we haven't used client functionality "
- "lately. Optimistically trying known %s again.",
+ "Application request when we haven't %s. "
+ "Optimistically trying known %s again.",
+ !router_have_minimum_dir_info() ?
+ "used client functionality lately" :
+ "received a consensus with exits",
options->UseBridges ? "bridges" : "entrynodes");
entries_retry_all(options);
} else if (!options->UseBridges || any_bridge_descriptors_known()) {
log_fn(severity, LD_APP|LD_DIR,
- "Application request when we haven't used client functionality "
- "lately. Optimistically trying directory fetches again.");
+ "Application request when we haven't %s. "
+ "Optimistically trying directory fetches again.",
+ !router_have_minimum_dir_info() ?
+ "used client functionality lately" :
+ "received a consensus with exits");
routerlist_retry_directory_downloads(time(NULL));
}
}
@@ -2012,7 +2054,7 @@ circuit_get_open_circ_or_launch(entry_connection_t *conn,
circ->rend_data = rend_data_dup(ENTRY_TO_EDGE_CONN(conn)->rend_data);
if (circ->base_.purpose == CIRCUIT_PURPOSE_C_ESTABLISH_REND &&
circ->base_.state == CIRCUIT_STATE_OPEN)
- rend_client_rendcirc_has_opened(circ);
+ circuit_has_opened(circ);
}
}
} /* endif (!circ) */
@@ -2324,7 +2366,7 @@ connection_ap_handshake_attach_circuit(entry_connection_t *conn)
tor_assert(rendcirc);
/* one is already established, attach */
log_info(LD_REND,
- "rend joined circ %d already here. attaching. "
+ "rend joined circ %u already here. attaching. "
"(stream %d sec old)",
(unsigned)rendcirc->base_.n_circ_id, conn_age);
/* Mark rendezvous circuits as 'newly dirty' every time you use
diff --git a/src/or/circuituse.h b/src/or/circuituse.h
index ce044d30dc..a59f478ac8 100644
--- a/src/or/circuituse.h
+++ b/src/or/circuituse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/command.c b/src/or/command.c
index 268c495371..c4a0f9baeb 100644
--- a/src/or/command.c
+++ b/src/or/command.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -310,7 +310,7 @@ command_process_create_cell(cell_t *cell, channel_t *chan)
/* hand it off to the cpuworkers, and then return. */
if (connection_or_digest_is_known_relay(chan->identity_digest))
rep_hist_note_circuit_handshake_requested(create_cell->handshake_type);
- if (assign_onionskin_to_cpuworker(NULL, circ, create_cell) < 0) {
+ if (assign_onionskin_to_cpuworker(circ, create_cell) < 0) {
log_debug(LD_GENERAL,"Failed to hand off onionskin. Closing.");
circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
return;
@@ -438,6 +438,7 @@ command_process_created_cell(cell_t *cell, channel_t *chan)
static void
command_process_relay_cell(cell_t *cell, channel_t *chan)
{
+ const or_options_t *options = get_options();
circuit_t *circ;
int reason, direction;
@@ -511,6 +512,14 @@ command_process_relay_cell(cell_t *cell, channel_t *chan)
direction==CELL_DIRECTION_OUT?"forward":"backward");
circuit_mark_for_close(circ, -reason);
}
+
+ /* If this is a cell in an RP circuit, count it as part of the
+ hidden service stats */
+ if (options->HiddenServiceStatistics &&
+ !CIRCUIT_IS_ORIGIN(circ) &&
+ TO_OR_CIRCUIT(circ)->circuit_carries_hs_traffic_stats) {
+ rep_hist_seen_new_rp_cell();
+ }
}
/** Process a 'destroy' <b>cell</b> that just arrived from
diff --git a/src/or/command.h b/src/or/command.h
index 509b4a0e9f..bea96261bb 100644
--- a/src/or/command.h
+++ b/src/or/command.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/config.c b/src/or/config.c
index ca56b6dcd1..568baec703 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -11,6 +11,7 @@
#define CONFIG_PRIVATE
#include "or.h"
+#include "compat.h"
#include "addressmap.h"
#include "channel.h"
#include "circuitbuild.h"
@@ -43,6 +44,7 @@
#include "util.h"
#include "routerlist.h"
#include "routerset.h"
+#include "scheduler.h"
#include "statefile.h"
#include "transports.h"
#include "ext_orport.h"
@@ -53,6 +55,16 @@
#include "procmon.h"
+#ifdef HAVE_SYSTEMD
+# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__)
+/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse
+ * Coverity. Here's a kludge to unconfuse it.
+ */
+# define __INCLUDE_LEVEL__ 2
+# endif
+#include <systemd/sd-daemon.h>
+#endif
+
/* From main.c */
extern int quiet_level;
@@ -63,7 +75,6 @@ static config_abbrev_t option_abbrevs_[] = {
PLURAL(AuthDirBadExitCC),
PLURAL(AuthDirInvalidCC),
PLURAL(AuthDirRejectCC),
- PLURAL(ExitNode),
PLURAL(EntryNode),
PLURAL(ExcludeNode),
PLURAL(FirewallPort),
@@ -189,6 +200,8 @@ static config_var_t option_vars_[] = {
V(ControlPortWriteToFile, FILENAME, NULL),
V(ControlSocket, LINELIST, NULL),
V(ControlSocketsGroupWritable, BOOL, "0"),
+ V(SocksSocket, LINELIST, NULL),
+ V(SocksSocketsGroupWritable, BOOL, "0"),
V(CookieAuthentication, BOOL, "0"),
V(CookieAuthFileGroupReadable, BOOL, "0"),
V(CookieAuthFile, STRING, NULL),
@@ -227,6 +240,7 @@ static config_var_t option_vars_[] = {
V(ExitPolicyRejectPrivate, BOOL, "1"),
V(ExitPortStatistics, BOOL, "0"),
V(ExtendAllowPrivateAddresses, BOOL, "0"),
+ V(ExitRelay, AUTOBOOL, "auto"),
VPORT(ExtORPort, LINELIST, NULL),
V(ExtORPortCookieAuthFile, STRING, NULL),
V(ExtORPortCookieAuthFileGroupReadable, BOOL, "0"),
@@ -267,6 +281,8 @@ static config_var_t option_vars_[] = {
VAR("HiddenServicePort", LINELIST_S, RendConfigLines, NULL),
VAR("HiddenServiceVersion",LINELIST_S, RendConfigLines, NULL),
VAR("HiddenServiceAuthorizeClient",LINELIST_S,RendConfigLines, NULL),
+ VAR("HiddenServiceAllowUnknownPorts",LINELIST_S, RendConfigLines, NULL),
+ V(HiddenServiceStatistics, BOOL, "0"),
V(HidServAuth, LINELIST, NULL),
V(CloseHSClientCircuitsImmediatelyOnTimeout, BOOL, "0"),
V(CloseHSServiceRendCircuitsImmediatelyOnTimeout, BOOL, "0"),
@@ -368,6 +384,9 @@ static config_var_t option_vars_[] = {
V(ServerDNSSearchDomains, BOOL, "0"),
V(ServerDNSTestAddresses, CSV,
"www.google.com,www.mit.edu,www.yahoo.com,www.slashdot.org"),
+ V(SchedulerLowWaterMark__, MEMUNIT, "100 MB"),
+ V(SchedulerHighWaterMark__, MEMUNIT, "101 MB"),
+ V(SchedulerMaxFlushCells__, UINT, "1000"),
V(ShutdownWaitLength, INTERVAL, "30 seconds"),
V(SocksListenAddress, LINELIST, NULL),
V(SocksPolicy, LINELIST, NULL),
@@ -377,7 +396,7 @@ static config_var_t option_vars_[] = {
OBSOLETE("StrictEntryNodes"),
OBSOLETE("StrictExitNodes"),
V(StrictNodes, BOOL, "0"),
- V(Support022HiddenServices, AUTOBOOL, "auto"),
+ OBSOLETE("Support022HiddenServices"),
V(TestSocks, BOOL, "0"),
V(TokenBucketRefillInterval, MSEC_INTERVAL, "100 msec"),
V(Tor2webMode, BOOL, "0"),
@@ -421,7 +440,7 @@ static config_var_t option_vars_[] = {
VAR("__HashedControlSessionPassword", LINELIST, HashedControlSessionPassword,
NULL),
VAR("__OwningControllerProcess",STRING,OwningControllerProcess, NULL),
- V(MinUptimeHidServDirectoryV2, INTERVAL, "25 hours"),
+ V(MinUptimeHidServDirectoryV2, INTERVAL, "96 hours"),
V(VoteOnHidServDirectoriesV2, BOOL, "1"),
V(TestingServerDownloadSchedule, CSV_INTERVAL, "0, 0, 0, 60, 60, 120, "
"300, 900, 2147483647"),
@@ -442,6 +461,7 @@ static config_var_t option_vars_[] = {
V(TestingCertMaxDownloadTries, UINT, "8"),
V(TestingDirAuthVoteExit, ROUTERSET, NULL),
V(TestingDirAuthVoteGuard, ROUTERSET, NULL),
+ V(TestingDirAuthVoteHSDir, ROUTERSET, NULL),
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "0"),
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
@@ -464,7 +484,7 @@ static const config_var_t testing_tor_network_defaults[] = {
V(V3AuthVotingInterval, INTERVAL, "5 minutes"),
V(V3AuthVoteDelay, INTERVAL, "20 seconds"),
V(V3AuthDistDelay, INTERVAL, "20 seconds"),
- V(TestingV3AuthInitialVotingInterval, INTERVAL, "5 minutes"),
+ V(TestingV3AuthInitialVotingInterval, INTERVAL, "150 seconds"),
V(TestingV3AuthInitialVoteDelay, INTERVAL, "20 seconds"),
V(TestingV3AuthInitialDistDelay, INTERVAL, "20 seconds"),
V(TestingV3AuthVotingStartOffset, INTERVAL, "0"),
@@ -490,6 +510,7 @@ static const config_var_t testing_tor_network_defaults[] = {
V(TestingEnableCellStatsEvent, BOOL, "1"),
V(TestingEnableTbEmptyEvent, BOOL, "1"),
VAR("___UsingTestNetworkDefaults", BOOL, UsingTestNetworkDefaults_, "1"),
+ V(RendPostPeriod, INTERVAL, "2 minutes"),
{ NULL, CONFIG_TYPE_OBSOLETE, 0, NULL }
};
@@ -824,22 +845,22 @@ add_default_trusted_dir_authorities(dirinfo_type_t type)
"moria1 orport=9101 "
"v3ident=D586D18309DED4CD6D57C18FDB97EFA96D330566 "
"128.31.0.39:9131 9695 DFC3 5FFE B861 329B 9F1A B04C 4639 7020 CE31",
- "tor26 orport=443 v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 "
+ "tor26 orport=443 "
+ "v3ident=14C131DFC5C6F93646BE72FA1401C02A8DF2E8B4 "
"86.59.21.38:80 847B 1F85 0344 D787 6491 A548 92F9 0493 4E4E B85D",
- "dizum orport=443 v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
+ "dizum orport=443 "
+ "v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
"194.109.206.212:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755",
- "Tonga orport=443 bridge 82.94.251.203:80 "
- "4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D",
- "turtles orport=9090 "
- "v3ident=27B6B5996C426270A5C95488AA5BCEB6BCC86956 "
- "76.73.17.194:9030 F397 038A DC51 3361 35E7 B80B D99C A384 4360 292B",
+ "Tonga orport=443 bridge "
+ "82.94.251.203:80 4A0C CD2D DC79 9508 3D73 F5D6 6710 0C8A 5831 F16D",
"gabelmoo orport=443 "
"v3ident=ED03BB616EB2F60BEC80151114BB25CEF515B226 "
"131.188.40.189:80 F204 4413 DAC2 E02E 3D6B CF47 35A1 9BCA 1DE9 7281",
"dannenberg orport=443 "
"v3ident=585769C78764D58426B8B52B6651A5A71137189A "
"193.23.244.244:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123",
- "urras orport=80 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
+ "urras orport=80 "
+ "v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
"208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417",
"maatuska orport=80 "
"v3ident=49015F787433103580E3B66A1707A00E60F2D15B "
@@ -847,6 +868,9 @@ add_default_trusted_dir_authorities(dirinfo_type_t type)
"Faravahar orport=443 "
"v3ident=EFCBE720AB3A82B99F9E953CD5BF50F7EEFC7B97 "
"154.35.32.5:80 CF6D 0AAF B385 BE71 B8E1 11FC 5CFF 4B47 9237 33BC",
+ "longclaw orport=443 "
+ "v3ident=23D15D965BC35114467363C165C4F724B64B4F66 "
+ "199.254.238.52:80 74A9 1064 6BCE EFBC D2E8 74FC 1DC9 9743 0F96 8145",
NULL
};
for (i=0; authorities[i]; i++) {
@@ -1007,6 +1031,11 @@ options_act_reversible(const or_options_t *old_options, char **msg)
start_daemon();
}
+#ifdef HAVE_SYSTEMD
+ /* Our PID may have changed, inform supervisor */
+ sd_notifyf(0, "MAINPID=%ld\n", (long int)getpid());
+#endif
+
#ifndef HAVE_SYS_UN_H
if (options->ControlSocket || options->ControlSocketsGroupWritable) {
*msg = tor_strdup("Unix domain sockets (ControlSocket) not supported "
@@ -1021,6 +1050,20 @@ options_act_reversible(const or_options_t *old_options, char **msg)
}
#endif
+#ifndef HAVE_SYS_UN_H
+ if (options->SocksSocket || options->SocksSocketsGroupWritable) {
+ *msg = tor_strdup("Unix domain sockets (SocksSocket) not supported "
+ "on this OS/with this build.");
+ goto rollback;
+ }
+#else
+ if (options->SocksSocketsGroupWritable && !options->SocksSocket) {
+ *msg = tor_strdup("Setting SocksSocketGroupWritable without setting"
+ "a SocksSocket makes no sense.");
+ goto rollback;
+ }
+#endif
+
if (running_tor) {
int n_ports=0;
/* We need to set the connection limit before we can open the listeners. */
@@ -1042,6 +1085,14 @@ options_act_reversible(const or_options_t *old_options, char **msg)
if (running_tor && !libevent_initialized) {
init_libevent(options);
libevent_initialized = 1;
+
+ /*
+ * Initialize the scheduler - this has to come after
+ * options_init_from_torrc() sets up libevent - why yes, that seems
+ * completely sensible to hide the libevent setup in the option parsing
+ * code! It also needs to happen before init_keys(), so it needs to
+ * happen here too. How yucky. */
+ scheduler_init();
}
/* Adjust the port configuration so we can launch listeners. */
@@ -1071,6 +1122,8 @@ options_act_reversible(const or_options_t *old_options, char **msg)
"non-control network connections. Shutting down all existing "
"connections.");
connection_mark_all_noncontrol_connections();
+ /* We can't complete circuits until the network is re-enabled. */
+ note_that_we_maybe_cant_complete_circuits();
}
}
@@ -1521,6 +1574,12 @@ options_act(const or_options_t *old_options)
return -1;
}
+ /* Set up scheduler thresholds */
+ scheduler_set_watermarks((uint32_t)options->SchedulerLowWaterMark__,
+ (uint32_t)options->SchedulerHighWaterMark__,
+ (options->SchedulerMaxFlushCells__ > 0) ?
+ options->SchedulerMaxFlushCells__ : 1000);
+
/* Set up accounting */
if (accounting_parse_options(options, 0)<0) {
log_warn(LD_CONFIG,"Error in accounting options");
@@ -1668,10 +1727,10 @@ options_act(const or_options_t *old_options)
if (server_mode(options) && !server_mode(old_options)) {
ip_address_changed(0);
- if (can_complete_circuit || !any_predicted_circuits(time(NULL)))
+ if (have_completed_a_circuit() || !any_predicted_circuits(time(NULL)))
inform_testing_reachability();
}
- cpuworkers_rotate();
+ cpuworkers_rotate_keyinfo();
if (dns_reset())
return -1;
} else {
@@ -1691,6 +1750,7 @@ options_act(const or_options_t *old_options)
if (options->CellStatistics || options->DirReqStatistics ||
options->EntryStatistics || options->ExitPortStatistics ||
options->ConnDirectionStatistics ||
+ options->HiddenServiceStatistics ||
options->BridgeAuthoritativeDir) {
time_t now = time(NULL);
int print_notice = 0;
@@ -1699,6 +1759,7 @@ options_act(const or_options_t *old_options)
if (!public_server_mode(options)) {
options->CellStatistics = 0;
options->EntryStatistics = 0;
+ options->HiddenServiceStatistics = 0;
options->ExitPortStatistics = 0;
}
@@ -1744,6 +1805,11 @@ options_act(const or_options_t *old_options)
options->ConnDirectionStatistics) {
rep_hist_conn_stats_init(now);
}
+ if ((!old_options || !old_options->HiddenServiceStatistics) &&
+ options->HiddenServiceStatistics) {
+ log_info(LD_CONFIG, "Configured to measure hidden service statistics.");
+ rep_hist_hs_stats_init(now);
+ }
if ((!old_options || !old_options->BridgeAuthoritativeDir) &&
options->BridgeAuthoritativeDir) {
rep_hist_desc_stats_init(now);
@@ -1755,6 +1821,8 @@ options_act(const or_options_t *old_options)
"data directory in 24 hours from now.");
}
+ /* If we used to have statistics enabled but we just disabled them,
+ stop gathering them. */
if (old_options && old_options->CellStatistics &&
!options->CellStatistics)
rep_hist_buffer_stats_term();
@@ -1764,6 +1832,9 @@ options_act(const or_options_t *old_options)
if (old_options && old_options->EntryStatistics &&
!options->EntryStatistics)
geoip_entry_stats_term();
+ if (old_options && old_options->HiddenServiceStatistics &&
+ !options->HiddenServiceStatistics)
+ rep_hist_hs_stats_term();
if (old_options && old_options->ExitPortStatistics &&
!options->ExitPortStatistics)
rep_hist_exit_stats_term();
@@ -1796,7 +1867,7 @@ options_act(const or_options_t *old_options)
directory_fetches_dir_info_early(old_options)) ||
!bool_eq(directory_fetches_dir_info_later(options),
directory_fetches_dir_info_later(old_options))) {
- /* Make sure update_router_have_min_dir_info gets called. */
+ /* Make sure update_router_have_minimum_dir_info() gets called. */
router_dir_info_changed();
/* We might need to download a new consensus status later or sooner than
* we had expected. */
@@ -2010,7 +2081,7 @@ print_usage(void)
printf(
"Copyright (c) 2001-2004, Roger Dingledine\n"
"Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n"
-"Copyright (c) 2007-2014, The Tor Project, Inc.\n\n"
+"Copyright (c) 2007-2015, The Tor Project, Inc.\n\n"
"tor -f <torrc> [args]\n"
"See man page for options, or https://www.torproject.org/ for "
"documentation.\n");
@@ -2050,7 +2121,33 @@ reset_last_resolved_addr(void)
}
/**
- * Use <b>options-\>Address</b> to guess our public IP address.
+ * Attempt getting our non-local (as judged by tor_addr_is_internal()
+ * function) IP address using following techniques, listed in
+ * order from best (most desirable, try first) to worst (least
+ * desirable, try if everything else fails).
+ *
+ * First, attempt using <b>options-\>Address</b> to get our
+ * non-local IP address.
+ *
+ * If <b>options-\>Address</b> represents a non-local IP address,
+ * consider it ours.
+ *
+ * If <b>options-\>Address</b> is a DNS name that resolves to
+ * a non-local IP address, consider this IP address ours.
+ *
+ * If <b>options-\>Address</b> is NULL, fall back to getting local
+ * hostname and using it in above-described ways to try and
+ * get our IP address.
+ *
+ * In case local hostname cannot be resolved to a non-local IP
+ * address, try getting an IP address of network interface
+ * in hopes it will be non-local one.
+ *
+ * Fail if one or more of the following is true:
+ * - DNS name in <b>options-\>Address</b> cannot be resolved.
+ * - <b>options-\>Address</b> is a local host address.
+ * - Attempt to getting local hostname fails.
+ * - Attempt to getting network interface address fails.
*
* Return 0 if all is well, or -1 if we can't find a suitable
* public IP address.
@@ -2059,6 +2156,11 @@ reset_last_resolved_addr(void)
* - Put our public IP address (in host order) into *<b>addr_out</b>.
* - If <b>method_out</b> is non-NULL, set *<b>method_out</b> to a static
* string describing how we arrived at our answer.
+ * - "CONFIGURED" - parsed from IP address string in
+ * <b>options-\>Address</b>
+ * - "RESOLVED" - resolved from DNS name in <b>options-\>Address</b>
+ * - "GETHOSTNAME" - resolved from a local hostname.
+ * - "INTERFACE" - retrieved from a network interface.
* - If <b>hostname_out</b> is non-NULL, and we resolved a hostname to
* get our address, set *<b>hostname_out</b> to a newly allocated string
* holding that hostname. (If we didn't get our address by resolving a
@@ -2097,7 +2199,7 @@ resolve_my_address(int warn_severity, const or_options_t *options,
explicit_ip = 0; /* it's implicit */
explicit_hostname = 0; /* it's implicit */
- if (gethostname(hostname, sizeof(hostname)) < 0) {
+ if (tor_gethostname(hostname, sizeof(hostname)) < 0) {
log_fn(warn_severity, LD_NET,"Error obtaining local hostname");
return -1;
}
@@ -2264,8 +2366,8 @@ resolve_my_address(int warn_severity, const or_options_t *options,
/** Return true iff <b>addr</b> is judged to be on the same network as us, or
* on a private network.
*/
-int
-is_local_addr(const tor_addr_t *addr)
+MOCK_IMPL(int,
+is_local_addr, (const tor_addr_t *addr))
{
if (tor_addr_is_internal(addr, 0))
return 1;
@@ -2424,6 +2526,7 @@ compute_publishserverdescriptor(or_options_t *options)
/** Lowest allowable value for RendPostPeriod; if this is too low, hidden
* services can overload the directory system. */
#define MIN_REND_POST_PERIOD (10*60)
+#define MIN_REND_POST_PERIOD_TESTING (5)
/** Higest allowable value for PredictedPortsRelevanceTime; if this is
* too high, our selection of exits will decrease for an extended
@@ -2548,11 +2651,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
REJECT("Failed to resolve/guess local address. See logs for details.");
}
-#ifndef _WIN32
- if (options->RunAsDaemon && torrc_fname && path_is_relative(torrc_fname))
- REJECT("Can't use a relative path to torrc when RunAsDaemon is set.");
-#endif
-
if (server_mode(options) && options->RendConfigLines)
log_warn(LD_CONFIG,
"Tor is currently configured as a relay and a hidden service. "
@@ -2574,20 +2672,24 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (!strcasecmp(options->TransProxyType, "default")) {
options->TransProxyType_parsed = TPT_DEFAULT;
} else if (!strcasecmp(options->TransProxyType, "pf-divert")) {
-#ifndef __OpenBSD__
- REJECT("pf-divert is a OpenBSD-specific feature.");
+#if !defined(__OpenBSD__) && !defined( DARWIN )
+ /* Later versions of OS X have pf */
+ REJECT("pf-divert is a OpenBSD-specific "
+ "and OS X/Darwin-specific feature.");
#else
options->TransProxyType_parsed = TPT_PF_DIVERT;
#endif
} else if (!strcasecmp(options->TransProxyType, "tproxy")) {
-#ifndef __linux__
+#if !defined(__linux__)
REJECT("TPROXY is a Linux-specific feature.");
#else
options->TransProxyType_parsed = TPT_TPROXY;
#endif
} else if (!strcasecmp(options->TransProxyType, "ipfw")) {
-#ifndef __FreeBSD__
- REJECT("ipfw is a FreeBSD-specific feature.");
+#if !defined(__FreeBSD__) && !defined( DARWIN )
+ /* Earlier versions of OS X have ipfw */
+ REJECT("ipfw is a FreeBSD-specific"
+ "and OS X/Darwin-specific feature.");
#else
options->TransProxyType_parsed = TPT_IPFW;
#endif
@@ -2618,6 +2720,17 @@ options_validate(or_options_t *old_options, or_options_t *options,
routerset_union(options->ExcludeExitNodesUnion_,options->ExcludeNodes);
}
+ if (options->SchedulerLowWaterMark__ == 0 ||
+ options->SchedulerLowWaterMark__ > UINT32_MAX) {
+ log_warn(LD_GENERAL, "Bad SchedulerLowWaterMark__ option");
+ return -1;
+ } else if (options->SchedulerHighWaterMark__ <=
+ options->SchedulerLowWaterMark__ ||
+ options->SchedulerHighWaterMark__ > UINT32_MAX) {
+ log_warn(LD_GENERAL, "Bad SchedulerHighWaterMark option");
+ return -1;
+ }
+
if (options->NodeFamilies) {
options->NodeFamilySets = smartlist_new();
for (cl = options->NodeFamilies; cl; cl = cl->next) {
@@ -2828,6 +2941,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
options->MaxMemInQueues =
compute_real_max_mem_in_queues(options->MaxMemInQueues_raw,
server_mode(options));
+ options->MaxMemInQueues_low_threshold = (options->MaxMemInQueues / 4) * 3;
options->AllowInvalid_ = 0;
@@ -2892,10 +3006,13 @@ options_validate(or_options_t *old_options, or_options_t *options,
options->MinUptimeHidServDirectoryV2 = 0;
}
- if (options->RendPostPeriod < MIN_REND_POST_PERIOD) {
+ const int min_rendpostperiod =
+ options->TestingTorNetwork ?
+ MIN_REND_POST_PERIOD_TESTING : MIN_REND_POST_PERIOD;
+ if (options->RendPostPeriod < min_rendpostperiod) {
log_warn(LD_CONFIG, "RendPostPeriod option is too short; "
- "raising to %d seconds.", MIN_REND_POST_PERIOD);
- options->RendPostPeriod = MIN_REND_POST_PERIOD;
+ "raising to %d seconds.", min_rendpostperiod);
+ options->RendPostPeriod = min_rendpostperiod;;
}
if (options->RendPostPeriod > MAX_DIR_PERIOD) {
@@ -3363,19 +3480,68 @@ options_validate(or_options_t *old_options, or_options_t *options,
if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
options->V3AuthVotingInterval/2) {
- REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
- "V3AuthVotingInterval");
+ /*
+ This doesn't work, but it seems like it should:
+ what code is preventing the interval being less than twice the lead-up?
+ if (options->TestingTorNetwork) {
+ if (options->V3AuthVoteDelay + options->V3AuthDistDelay >=
+ options->V3AuthVotingInterval) {
+ REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than "
+ "V3AuthVotingInterval");
+ } else {
+ COMPLAIN("V3AuthVoteDelay plus V3AuthDistDelay is more than half "
+ "V3AuthVotingInterval. This may lead to "
+ "consensus instability, particularly if clocks drift.");
+ }
+ } else {
+ */
+ REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half "
+ "V3AuthVotingInterval");
+ /*
+ }
+ */
+ }
+
+ if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) {
+ if (options->TestingTorNetwork) {
+ if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS_TESTING) {
+ REJECT("V3AuthVoteDelay is way too low.");
+ } else {
+ COMPLAIN("V3AuthVoteDelay is very low. "
+ "This may lead to failure to vote for a consensus.");
+ }
+ } else {
+ REJECT("V3AuthVoteDelay is way too low.");
+ }
+ }
+
+ if (options->V3AuthDistDelay < MIN_DIST_SECONDS) {
+ if (options->TestingTorNetwork) {
+ if (options->V3AuthDistDelay < MIN_DIST_SECONDS_TESTING) {
+ REJECT("V3AuthDistDelay is way too low.");
+ } else {
+ COMPLAIN("V3AuthDistDelay is very low. "
+ "This may lead to missing votes in a consensus.");
+ }
+ } else {
+ REJECT("V3AuthDistDelay is way too low.");
+ }
}
- if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS)
- REJECT("V3AuthVoteDelay is way too low.");
- if (options->V3AuthDistDelay < MIN_DIST_SECONDS)
- REJECT("V3AuthDistDelay is way too low.");
if (options->V3AuthNIntervalsValid < 2)
REJECT("V3AuthNIntervalsValid must be at least 2.");
if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL) {
- REJECT("V3AuthVotingInterval is insanely low.");
+ if (options->TestingTorNetwork) {
+ if (options->V3AuthVotingInterval < MIN_VOTE_INTERVAL_TESTING) {
+ REJECT("V3AuthVotingInterval is insanely low.");
+ } else {
+ COMPLAIN("V3AuthVotingInterval is very low. "
+ "This may lead to failure to synchronise for a consensus.");
+ }
+ } else {
+ REJECT("V3AuthVotingInterval is insanely low.");
+ }
} else if (options->V3AuthVotingInterval > 24*60*60) {
REJECT("V3AuthVotingInterval is insanely high.");
} else if (((24*60*60) % options->V3AuthVotingInterval) != 0) {
@@ -3397,15 +3563,6 @@ options_validate(or_options_t *old_options, or_options_t *options,
AF_INET6, 1, msg)<0)
return -1;
- if (options->AutomapHostsSuffixes) {
- SMARTLIST_FOREACH(options->AutomapHostsSuffixes, char *, suf,
- {
- size_t len = strlen(suf);
- if (len && suf[len-1] == '.')
- suf[len-1] = '\0';
- });
- }
-
if (options->TestingTorNetwork &&
!(options->DirAuthorities ||
(options->AlternateDirAuthority &&
@@ -3450,26 +3607,27 @@ options_validate(or_options_t *old_options, or_options_t *options,
CHECK_DEFAULT(TestingCertMaxDownloadTries);
#undef CHECK_DEFAULT
- if (options->TestingV3AuthInitialVotingInterval < MIN_VOTE_INTERVAL) {
+ if (options->TestingV3AuthInitialVotingInterval
+ < MIN_VOTE_INTERVAL_TESTING_INITIAL) {
REJECT("TestingV3AuthInitialVotingInterval is insanely low.");
} else if (((30*60) % options->TestingV3AuthInitialVotingInterval) != 0) {
REJECT("TestingV3AuthInitialVotingInterval does not divide evenly into "
"30 minutes.");
}
- if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS) {
+ if (options->TestingV3AuthInitialVoteDelay < MIN_VOTE_SECONDS_TESTING) {
REJECT("TestingV3AuthInitialVoteDelay is way too low.");
}
- if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS) {
+ if (options->TestingV3AuthInitialDistDelay < MIN_DIST_SECONDS_TESTING) {
REJECT("TestingV3AuthInitialDistDelay is way too low.");
}
if (options->TestingV3AuthInitialVoteDelay +
options->TestingV3AuthInitialDistDelay >=
- options->TestingV3AuthInitialVotingInterval/2) {
+ options->TestingV3AuthInitialVotingInterval) {
REJECT("TestingV3AuthInitialVoteDelay plus TestingV3AuthInitialDistDelay "
- "must be less than half TestingV3AuthInitialVotingInterval");
+ "must be less than TestingV3AuthInitialVotingInterval");
}
if (options->TestingV3AuthVotingStartOffset >
@@ -3477,6 +3635,8 @@ options_validate(or_options_t *old_options, or_options_t *options,
options->V3AuthVotingInterval)) {
REJECT("TestingV3AuthVotingStartOffset is higher than the voting "
"interval.");
+ } else if (options->TestingV3AuthVotingStartOffset < 0) {
+ REJECT("TestingV3AuthVotingStartOffset must be non-negative.");
}
if (options->TestingAuthDirTimeToLearnReachability < 0) {
@@ -3797,6 +3957,7 @@ options_transition_affects_descriptor(const or_options_t *old_options,
!opt_streq(old_options->Nickname,new_options->Nickname) ||
!opt_streq(old_options->Address,new_options->Address) ||
!config_lines_eq(old_options->ExitPolicy,new_options->ExitPolicy) ||
+ old_options->ExitRelay != new_options->ExitRelay ||
old_options->ExitPolicyRejectPrivate !=
new_options->ExitPolicyRejectPrivate ||
old_options->IPv6Exit != new_options->IPv6Exit ||
@@ -3885,7 +4046,10 @@ get_windows_conf_root(void)
static const char *
get_default_conf_file(int defaults_file)
{
-#ifdef _WIN32
+#ifdef DISABLE_SYSTEM_TORRC
+ (void) defaults_file;
+ return NULL;
+#elif defined(_WIN32)
if (defaults_file) {
static char defaults_path[MAX_PATH+1];
tor_snprintf(defaults_path, MAX_PATH, "%s\\torrc-defaults",
@@ -4012,21 +4176,28 @@ find_torrc_filename(config_line_t *cmd_arg,
if (*using_default_fname) {
/* didn't find one, try CONFDIR */
const char *dflt = get_default_conf_file(defaults_file);
- if (dflt && file_status(dflt) == FN_FILE) {
+ file_status_t st = file_status(dflt);
+ if (dflt && (st == FN_FILE || st == FN_EMPTY)) {
fname = tor_strdup(dflt);
} else {
#ifndef _WIN32
char *fn = NULL;
- if (!defaults_file)
+ if (!defaults_file) {
fn = expand_filename("~/.torrc");
- if (fn && file_status(fn) == FN_FILE) {
- fname = fn;
+ }
+ if (fn) {
+ file_status_t hmst = file_status(fn);
+ if (hmst == FN_FILE || hmst == FN_EMPTY || dflt == NULL) {
+ fname = fn;
+ } else {
+ tor_free(fn);
+ fname = tor_strdup(dflt);
+ }
} else {
- tor_free(fn);
- fname = tor_strdup(dflt);
+ fname = dflt ? tor_strdup(dflt) : NULL;
}
#else
- fname = tor_strdup(dflt);
+ fname = dflt ? tor_strdup(dflt) : NULL;
#endif
}
}
@@ -4049,16 +4220,20 @@ load_torrc_from_disk(config_line_t *cmd_arg, int defaults_file)
int ignore_missing_torrc = 0;
char **fname_var = defaults_file ? &torrc_defaults_fname : &torrc_fname;
- fname = find_torrc_filename(cmd_arg, defaults_file,
- &using_default_torrc, &ignore_missing_torrc);
- tor_assert(fname);
- log_debug(LD_CONFIG, "Opening config file \"%s\"", fname);
-
- tor_free(*fname_var);
- *fname_var = fname;
+ if (*fname_var == NULL) {
+ fname = find_torrc_filename(cmd_arg, defaults_file,
+ &using_default_torrc, &ignore_missing_torrc);
+ tor_free(*fname_var);
+ *fname_var = fname;
+ } else {
+ fname = *fname_var;
+ }
+ log_debug(LD_CONFIG, "Opening config file \"%s\"", fname?fname:"<NULL>");
/* Open config file */
- if (file_status(fname) != FN_FILE ||
+ file_status_t st = fname ? file_status(fname) : FN_EMPTY;
+ if (fname == NULL ||
+ !(st == FN_FILE || st == FN_EMPTY) ||
!(cf = read_file_to_str(fname,0,NULL))) {
if (using_default_torrc == 1 || ignore_missing_torrc) {
if (!defaults_file)
@@ -4347,7 +4522,7 @@ options_init_from_string(const char *cf_defaults, const char *cf,
return err;
}
-/** Return the location for our configuration file.
+/** Return the location for our configuration file. May return NULL.
*/
const char *
get_torrc_fname(int defaults_fname)
@@ -5201,14 +5376,6 @@ parse_dir_authority_line(const char *line, dirinfo_type_t required_type,
fingerprint, (int)strlen(fingerprint));
goto err;
}
- if (!strcmp(fingerprint, "E623F7625FBE0C87820F11EC5F6D5377ED816294")) {
- /* a known bad fingerprint. refuse to use it. We can remove this
- * clause once Tor 0.1.2.17 is obsolete. */
- log_warn(LD_CONFIG, "Dangerous dirserver line. To correct, erase your "
- "torrc file (%s), or reinstall Tor and use the default torrc.",
- get_torrc_fname(0));
- goto err;
- }
if (base16_decode(digest, DIGEST_LEN, fingerprint, HEX_DIGEST_LEN)<0) {
log_warn(LD_CONFIG, "Unable to decode DirAuthority key digest.");
goto err;
@@ -5338,12 +5505,13 @@ parse_dir_fallback_line(const char *line,
/** Allocate and return a new port_cfg_t with reasonable defaults. */
static port_cfg_t *
-port_cfg_new(void)
+port_cfg_new(size_t namelen)
{
- port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t));
- cfg->ipv4_traffic = 1;
- cfg->cache_ipv4_answers = 1;
- cfg->prefer_ipv6_virtaddr = 1;
+ tor_assert(namelen <= SIZE_T_CEILING - sizeof(port_cfg_t) - 1);
+ port_cfg_t *cfg = tor_malloc_zero(sizeof(port_cfg_t) + namelen + 1);
+ cfg->entry_cfg.ipv4_traffic = 1;
+ cfg->entry_cfg.cache_ipv4_answers = 1;
+ cfg->entry_cfg.prefer_ipv6_virtaddr = 1;
return cfg;
}
@@ -5450,6 +5618,7 @@ warn_nonlocal_controller_ports(smartlist_t *ports, unsigned forbid)
#define CL_PORT_SERVER_OPTIONS (1u<<3)
#define CL_PORT_FORBID_NONLOCAL (1u<<4)
#define CL_PORT_TAKES_HOSTNAMES (1u<<5)
+#define CL_PORT_IS_UNIXSOCKET (1u<<6)
/**
* Parse port configuration for a single port type.
@@ -5497,7 +5666,7 @@ parse_port_config(smartlist_t *out,
int listener_type,
const char *defaultaddr,
int defaultport,
- unsigned flags)
+ const unsigned flags)
{
smartlist_t *elts;
int retval = -1;
@@ -5510,6 +5679,7 @@ parse_port_config(smartlist_t *out,
const unsigned allow_spurious_listenaddr =
flags & CL_PORT_ALLOW_EXTRA_LISTENADDR;
const unsigned takes_hostnames = flags & CL_PORT_TAKES_HOSTNAMES;
+ const unsigned is_unix_socket = flags & CL_PORT_IS_UNIXSOCKET;
int got_zero_port=0, got_nonzero_port=0;
/* FooListenAddress is deprecated; let's make it work like it used to work,
@@ -5546,14 +5716,14 @@ parse_port_config(smartlist_t *out,
if (use_server_options && out) {
/* Add a no_listen port. */
- port_cfg_t *cfg = port_cfg_new();
+ port_cfg_t *cfg = port_cfg_new(0);
cfg->type = listener_type;
cfg->port = mainport;
tor_addr_make_unspec(&cfg->addr); /* Server ports default to 0.0.0.0 */
- cfg->no_listen = 1;
- cfg->bind_ipv4_only = 1;
- cfg->ipv4_traffic = 1;
- cfg->prefer_ipv6_virtaddr = 1;
+ cfg->server_cfg.no_listen = 1;
+ cfg->server_cfg.bind_ipv4_only = 1;
+ cfg->entry_cfg.ipv4_traffic = 1;
+ cfg->entry_cfg.prefer_ipv6_virtaddr = 1;
smartlist_add(out, cfg);
}
@@ -5566,13 +5736,13 @@ parse_port_config(smartlist_t *out,
return -1;
}
if (out) {
- port_cfg_t *cfg = port_cfg_new();
+ port_cfg_t *cfg = port_cfg_new(0);
cfg->type = listener_type;
cfg->port = port ? port : mainport;
tor_addr_copy(&cfg->addr, &addr);
- cfg->session_group = SESSION_GROUP_UNSET;
- cfg->isolation_flags = ISO_DEFAULT;
- cfg->no_advertise = 1;
+ cfg->entry_cfg.session_group = SESSION_GROUP_UNSET;
+ cfg->entry_cfg.isolation_flags = ISO_DEFAULT;
+ cfg->server_cfg.no_advertise = 1;
smartlist_add(out, cfg);
}
}
@@ -5591,13 +5761,19 @@ parse_port_config(smartlist_t *out,
/* No ListenAddress lines. If there's no FooPort, then maybe make a default
* one. */
if (! ports) {
- if (defaultport && out) {
- port_cfg_t *cfg = port_cfg_new();
+ if (defaultport && defaultaddr && out) {
+ port_cfg_t *cfg = port_cfg_new(is_unix_socket ? strlen(defaultaddr) : 0);
cfg->type = listener_type;
- cfg->port = defaultport;
- tor_addr_parse(&cfg->addr, defaultaddr);
- cfg->session_group = SESSION_GROUP_UNSET;
- cfg->isolation_flags = ISO_DEFAULT;
+ if (is_unix_socket) {
+ tor_addr_make_unspec(&cfg->addr);
+ memcpy(cfg->unix_addr, defaultaddr, strlen(defaultaddr) + 1);
+ cfg->is_unix_addr = 1;
+ } else {
+ cfg->port = defaultport;
+ tor_addr_parse(&cfg->addr, defaultaddr);
+ }
+ cfg->entry_cfg.session_group = SESSION_GROUP_UNSET;
+ cfg->entry_cfg.isolation_flags = ISO_DEFAULT;
smartlist_add(out, cfg);
}
return 0;
@@ -5638,7 +5814,13 @@ parse_port_config(smartlist_t *out,
/* Now parse the addr/port value */
addrport = smartlist_get(elts, 0);
- if (!strcmp(addrport, "auto")) {
+ if (is_unix_socket) {
+ /* leave it as it is. */
+ if (!strcmp(addrport, "0"))
+ port = 0;
+ else
+ port = 1;
+ } else if (!strcmp(addrport, "auto")) {
port = CFG_AUTO_PORT;
tor_addr_parse(&addr, defaultaddr);
} else if (!strcasecmpend(addrport, ":auto")) {
@@ -5823,28 +6005,35 @@ parse_port_config(smartlist_t *out,
}
if (out && port) {
- port_cfg_t *cfg = port_cfg_new();
- tor_addr_copy(&cfg->addr, &addr);
- cfg->port = port;
+ size_t namelen = is_unix_socket ? strlen(addrport) : 0;
+ port_cfg_t *cfg = port_cfg_new(namelen);
+ if (is_unix_socket) {
+ tor_addr_make_unspec(&cfg->addr);
+ memcpy(cfg->unix_addr, addrport, strlen(addrport) + 1);
+ cfg->is_unix_addr = 1;
+ } else {
+ tor_addr_copy(&cfg->addr, &addr);
+ cfg->port = port;
+ }
cfg->type = listener_type;
- cfg->isolation_flags = isolation;
- cfg->session_group = sessiongroup;
- cfg->no_advertise = no_advertise;
- cfg->no_listen = no_listen;
- cfg->all_addrs = all_addrs;
- cfg->bind_ipv4_only = bind_ipv4_only;
- cfg->bind_ipv6_only = bind_ipv6_only;
- cfg->ipv4_traffic = ipv4_traffic;
- cfg->ipv6_traffic = ipv6_traffic;
- cfg->prefer_ipv6 = prefer_ipv6;
- cfg->cache_ipv4_answers = cache_ipv4;
- cfg->cache_ipv6_answers = cache_ipv6;
- cfg->use_cached_ipv4_answers = use_cached_ipv4;
- cfg->use_cached_ipv6_answers = use_cached_ipv6;
- cfg->prefer_ipv6_virtaddr = prefer_ipv6_automap;
- cfg->socks_prefer_no_auth = prefer_no_auth;
+ cfg->entry_cfg.isolation_flags = isolation;
+ cfg->entry_cfg.session_group = sessiongroup;
+ cfg->server_cfg.no_advertise = no_advertise;
+ cfg->server_cfg.no_listen = no_listen;
+ cfg->server_cfg.all_addrs = all_addrs;
+ cfg->server_cfg.bind_ipv4_only = bind_ipv4_only;
+ cfg->server_cfg.bind_ipv6_only = bind_ipv6_only;
+ cfg->entry_cfg.ipv4_traffic = ipv4_traffic;
+ cfg->entry_cfg.ipv6_traffic = ipv6_traffic;
+ cfg->entry_cfg.prefer_ipv6 = prefer_ipv6;
+ cfg->entry_cfg.cache_ipv4_answers = cache_ipv4;
+ cfg->entry_cfg.cache_ipv6_answers = cache_ipv6;
+ cfg->entry_cfg.use_cached_ipv4_answers = use_cached_ipv4;
+ cfg->entry_cfg.use_cached_ipv6_answers = use_cached_ipv6;
+ cfg->entry_cfg.prefer_ipv6_virtaddr = prefer_ipv6_automap;
+ cfg->entry_cfg.socks_prefer_no_auth = prefer_no_auth;
if (! (isolation & ISO_SOCKSAUTH))
- cfg->socks_prefer_no_auth = 1;
+ cfg->entry_cfg.socks_prefer_no_auth = 1;
smartlist_add(out, cfg);
}
@@ -5875,29 +6064,6 @@ parse_port_config(smartlist_t *out,
return retval;
}
-/** Parse a list of config_line_t for an AF_UNIX unix socket listener option
- * from <b>cfg</b> and add them to <b>out</b>. No fancy options are
- * supported: the line contains nothing but the path to the AF_UNIX socket. */
-static int
-parse_unix_socket_config(smartlist_t *out, const config_line_t *cfg,
- int listener_type)
-{
-
- if (!out)
- return 0;
-
- for ( ; cfg; cfg = cfg->next) {
- size_t len = strlen(cfg->value);
- port_cfg_t *port = tor_malloc_zero(sizeof(port_cfg_t) + len + 1);
- port->is_unix_addr = 1;
- memcpy(port->unix_addr, cfg->value, len+1);
- port->type = listener_type;
- smartlist_add(out, port);
- }
-
- return 0;
-}
-
/** Return the number of ports which are actually going to listen with type
* <b>listenertype</b>. Do not count no_listen ports. Do not count unix
* sockets. */
@@ -5906,7 +6072,7 @@ count_real_listeners(const smartlist_t *ports, int listenertype)
{
int n = 0;
SMARTLIST_FOREACH_BEGIN(ports, port_cfg_t *, port) {
- if (port->no_listen || port->is_unix_addr)
+ if (port->server_cfg.no_listen || port->is_unix_addr)
continue;
if (port->type != listenertype)
continue;
@@ -5986,12 +6152,21 @@ parse_ports(or_options_t *options, int validate_only,
"configuration");
goto err;
}
- if (parse_unix_socket_config(ports,
- options->ControlSocket,
- CONN_TYPE_CONTROL_LISTENER) < 0) {
+
+ if (parse_port_config(ports, options->ControlSocket, NULL,
+ "ControlSocket",
+ CONN_TYPE_CONTROL_LISTENER, NULL, 0,
+ control_port_flags | CL_PORT_IS_UNIXSOCKET) < 0) {
*msg = tor_strdup("Invalid ControlSocket configuration");
goto err;
}
+ if (parse_port_config(ports, options->SocksSocket, NULL,
+ "SocksSocket",
+ CONN_TYPE_AP_LISTENER, NULL, 0,
+ CL_PORT_IS_UNIXSOCKET) < 0) {
+ *msg = tor_strdup("Invalid SocksSocket configuration");
+ goto err;
+ }
}
if (! options->ClientOnly) {
if (parse_port_config(ports,
@@ -6035,6 +6210,8 @@ parse_ports(or_options_t *options, int validate_only,
!! count_real_listeners(ports, CONN_TYPE_OR_LISTENER);
options->SocksPort_set =
!! count_real_listeners(ports, CONN_TYPE_AP_LISTENER);
+ options->SocksSocket_set =
+ !! count_real_listeners(ports, CONN_TYPE_AP_LISTENER);
options->TransPort_set =
!! count_real_listeners(ports, CONN_TYPE_AP_TRANS_LISTENER);
options->NATDPort_set =
@@ -6082,25 +6259,25 @@ check_server_ports(const smartlist_t *ports,
SMARTLIST_FOREACH_BEGIN(ports, const port_cfg_t *, port) {
if (port->type == CONN_TYPE_DIR_LISTENER) {
- if (! port->no_advertise)
+ if (! port->server_cfg.no_advertise)
++n_dirport_advertised;
- if (! port->no_listen)
+ if (! port->server_cfg.no_listen)
++n_dirport_listeners;
} else if (port->type == CONN_TYPE_OR_LISTENER) {
- if (! port->no_advertise) {
+ if (! port->server_cfg.no_advertise) {
++n_orport_advertised;
if (tor_addr_family(&port->addr) == AF_INET ||
(tor_addr_family(&port->addr) == AF_UNSPEC &&
- !port->bind_ipv6_only))
+ !port->server_cfg.bind_ipv6_only))
++n_orport_advertised_ipv4;
}
- if (! port->no_listen)
+ if (! port->server_cfg.no_listen)
++n_orport_listeners;
} else {
continue;
}
#ifndef _WIN32
- if (!port->no_listen && port->port < 1024)
+ if (!port->server_cfg.no_listen && port->port < 1024)
++n_low_port;
#endif
} SMARTLIST_FOREACH_END(port);
@@ -6178,7 +6355,7 @@ get_first_listener_addrport_string(int listener_type)
return NULL;
SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) {
- if (cfg->no_listen)
+ if (cfg->server_cfg.no_listen)
continue;
if (cfg->type == listener_type &&
@@ -6225,12 +6402,12 @@ get_first_advertised_port_by_type_af(int listener_type, int address_family)
return 0;
SMARTLIST_FOREACH_BEGIN(configured_ports, const port_cfg_t *, cfg) {
if (cfg->type == listener_type &&
- !cfg->no_advertise &&
+ !cfg->server_cfg.no_advertise &&
(tor_addr_family(&cfg->addr) == address_family ||
tor_addr_family(&cfg->addr) == AF_UNSPEC)) {
if (tor_addr_family(&cfg->addr) != AF_UNSPEC ||
- (address_family == AF_INET && !cfg->bind_ipv6_only) ||
- (address_family == AF_INET6 && !cfg->bind_ipv4_only)) {
+ (address_family == AF_INET && !cfg->server_cfg.bind_ipv6_only) ||
+ (address_family == AF_INET6 && !cfg->server_cfg.bind_ipv4_only)) {
return cfg->port;
}
}
@@ -6314,10 +6491,13 @@ write_configuration_file(const char *fname, const or_options_t *options)
char *old_val=NULL, *new_val=NULL, *new_conf=NULL;
int rename_old = 0, r;
- tor_assert(fname);
+ if (!fname)
+ return -1;
switch (file_status(fname)) {
+ /* create backups of old config files, even if they're empty */
case FN_FILE:
+ case FN_EMPTY:
old_val = read_file_to_str(fname, 0, NULL);
if (!old_val || strcmpstart(old_val, GENERATED_FILE_PREFIX)) {
rename_old = 1;
diff --git a/src/or/config.h b/src/or/config.h
index 6cc81ab948..6bd3eb5734 100644
--- a/src/or/config.h
+++ b/src/or/config.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -33,7 +33,7 @@ void reset_last_resolved_addr(void);
int resolve_my_address(int warn_severity, const or_options_t *options,
uint32_t *addr_out,
const char **method_out, char **hostname_out);
-int is_local_addr(const tor_addr_t *addr);
+MOCK_DECL(int, is_local_addr, (const tor_addr_t *addr));
void options_init(or_options_t *options);
#define OPTIONS_DUMP_MINIMAL 1
diff --git a/src/or/confparse.c b/src/or/confparse.c
index 8ee985c92a..ac21df25cb 100644
--- a/src/or/confparse.c
+++ b/src/or/confparse.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/or/confparse.h b/src/or/confparse.h
index 3712924ac7..83c0f75b52 100644
--- a/src/or/confparse.h
+++ b/src/or/confparse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_CONFPARSE_H
diff --git a/src/or/connection.c b/src/or/connection.c
index c9c371c001..f26ada096b 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -29,7 +29,6 @@
#include "connection_edge.h"
#include "connection_or.h"
#include "control.h"
-#include "cpuworker.h"
#include "directory.h"
#include "dirserv.h"
#include "dns.h"
@@ -57,6 +56,11 @@
#include <pwd.h>
#endif
+#ifdef HAVE_SYS_UN_H
+#include <sys/socket.h>
+#include <sys/un.h>
+#endif
+
static connection_t *connection_listener_new(
const struct sockaddr *listensockaddr,
socklen_t listensocklen, int type,
@@ -130,7 +134,6 @@ conn_type_to_string(int type)
case CONN_TYPE_AP: return "Socks";
case CONN_TYPE_DIR_LISTENER: return "Directory listener";
case CONN_TYPE_DIR: return "Directory";
- case CONN_TYPE_CPUWORKER: return "CPU worker";
case CONN_TYPE_CONTROL_LISTENER: return "Control listener";
case CONN_TYPE_CONTROL: return "Control";
case CONN_TYPE_EXT_OR: return "Extended OR";
@@ -213,12 +216,6 @@ conn_state_to_string(int type, int state)
case DIR_CONN_STATE_SERVER_WRITING: return "writing";
}
break;
- case CONN_TYPE_CPUWORKER:
- switch (state) {
- case CPUWORKER_STATE_IDLE: return "idle";
- case CPUWORKER_STATE_BUSY_ONION: return "busy with onion";
- }
- break;
case CONN_TYPE_CONTROL:
switch (state) {
case CONTROL_CONN_STATE_OPEN: return "open (protocol v1)";
@@ -248,7 +245,6 @@ connection_type_uses_bufferevent(connection_t *conn)
case CONN_TYPE_CONTROL:
case CONN_TYPE_OR:
case CONN_TYPE_EXT_OR:
- case CONN_TYPE_CPUWORKER:
return 1;
default:
return 0;
@@ -305,9 +301,11 @@ entry_connection_new(int type, int socket_family)
* in a little while. Otherwise, we're doing this as a linked connection
* of some kind, and we should set it up here based on the socket family */
if (socket_family == AF_INET)
- entry_conn->ipv4_traffic_ok = 1;
+ entry_conn->entry_cfg.ipv4_traffic = 1;
else if (socket_family == AF_INET6)
- entry_conn->ipv6_traffic_ok = 1;
+ entry_conn->entry_cfg.ipv6_traffic = 1;
+ else if (socket_family == AF_UNIX)
+ entry_conn->is_socks_socket = 1;
return entry_conn;
}
@@ -516,9 +514,10 @@ connection_free_(connection_t *conn)
buf_free(conn->outbuf);
} else {
if (conn->socket_family == AF_UNIX) {
- /* For now only control ports can be Unix domain sockets
+ /* For now only control and SOCKS ports can be Unix domain sockets
* and listeners at the same time */
- tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER);
+ tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER ||
+ conn->type == CONN_TYPE_AP_LISTENER);
if (unlink(conn->address) < 0 && errno != ENOENT) {
log_warn(LD_NET, "Could not unlink %s: %s", conn->address,
@@ -544,8 +543,7 @@ connection_free_(connection_t *conn)
or_conn, TLS_CHAN_TO_BASE(or_conn->chan),
U64_PRINTF_ARG(
TLS_CHAN_TO_BASE(or_conn->chan)->global_identifier));
- if (!(TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_CLOSED ||
- TLS_CHAN_TO_BASE(or_conn->chan)->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_FINISHED(TLS_CHAN_TO_BASE(or_conn->chan))) {
channel_close_for_error(TLS_CHAN_TO_BASE(or_conn->chan));
}
@@ -575,8 +573,10 @@ connection_free_(connection_t *conn)
tor_free(control_conn->incoming_cmd);
}
- tor_free(conn->read_event); /* Probably already freed by connection_free. */
- tor_free(conn->write_event); /* Probably already freed by connection_free. */
+ /* Probably already freed by connection_free. */
+ tor_event_free(conn->read_event);
+ tor_event_free(conn->write_event);
+ conn->read_event = conn->write_event = NULL;
IF_HAS_BUFFEREVENT(conn, {
/* This was a workaround to handle bugs in some old versions of libevent
* where callbacks can occur after calling bufferevent_free(). Setting
@@ -914,13 +914,57 @@ warn_too_many_conns(void)
}
#ifdef HAVE_SYS_UN_H
+
+#define UNIX_SOCKET_PURPOSE_CONTROL_SOCKET 0
+#define UNIX_SOCKET_PURPOSE_SOCKS_SOCKET 1
+
+/** Check if the purpose isn't one of the ones we know what to do with */
+
+static int
+is_valid_unix_socket_purpose(int purpose)
+{
+ int valid = 0;
+
+ switch (purpose) {
+ case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET:
+ case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET:
+ valid = 1;
+ break;
+ }
+
+ return valid;
+}
+
+/** Return a string description of a unix socket purpose */
+static const char *
+unix_socket_purpose_to_string(int purpose)
+{
+ const char *s = "unknown-purpose socket";
+
+ switch (purpose) {
+ case UNIX_SOCKET_PURPOSE_CONTROL_SOCKET:
+ s = "control socket";
+ break;
+ case UNIX_SOCKET_PURPOSE_SOCKS_SOCKET:
+ s = "SOCKS socket";
+ break;
+ }
+
+ return s;
+}
+
/** Check whether we should be willing to open an AF_UNIX socket in
* <b>path</b>. Return 0 if we should go ahead and -1 if we shouldn't. */
static int
-check_location_for_unix_socket(const or_options_t *options, const char *path)
+check_location_for_unix_socket(const or_options_t *options, const char *path,
+ int purpose)
{
int r = -1;
- char *p = tor_strdup(path);
+ char *p = NULL;
+
+ tor_assert(is_valid_unix_socket_purpose(purpose));
+
+ p = tor_strdup(path);
cpd_check_t flags = CPD_CHECK_MODE_ONLY;
if (get_parent_directory(p)<0 || p[0] != '/') {
log_warn(LD_GENERAL, "Bad unix socket address '%s'. Tor does not support "
@@ -928,18 +972,23 @@ check_location_for_unix_socket(const or_options_t *options, const char *path)
goto done;
}
- if (options->ControlSocketsGroupWritable)
+ if ((purpose == UNIX_SOCKET_PURPOSE_CONTROL_SOCKET &&
+ options->ControlSocketsGroupWritable) ||
+ (purpose == UNIX_SOCKET_PURPOSE_SOCKS_SOCKET &&
+ options->SocksSocketsGroupWritable)) {
flags |= CPD_GROUP_OK;
+ }
if (check_private_dir(p, flags, options->User) < 0) {
char *escpath, *escdir;
escpath = esc_for_log(path);
escdir = esc_for_log(p);
- log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the "
- "directory %s needs to exist, and to be accessible only by the "
- "user%s account that is running Tor. (On some Unix systems, "
- "anybody who can list a socket can connect to it, so Tor is "
- "being careful.)", escpath, escdir,
+ log_warn(LD_GENERAL, "Before Tor can create a %s in %s, the directory "
+ "%s needs to exist, and to be accessible only by the user%s "
+ "account that is running Tor. (On some Unix systems, anybody "
+ "who can list a socket can connect to it, so Tor is being "
+ "careful.)",
+ unix_socket_purpose_to_string(purpose), escpath, escdir,
options->ControlSocketsGroupWritable ? " and group" : "");
tor_free(escpath);
tor_free(escdir);
@@ -1022,15 +1071,15 @@ connection_listener_new(const struct sockaddr *listensockaddr,
static int global_next_session_group = SESSION_GROUP_FIRST_AUTO;
tor_addr_t addr;
- if (get_n_open_sockets() >= get_options()->ConnLimit_-1) {
+ if (get_n_open_sockets() >= options->ConnLimit_-1) {
warn_too_many_conns();
return NULL;
}
if (listensockaddr->sa_family == AF_INET ||
listensockaddr->sa_family == AF_INET6) {
- int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER);
- if (is_tcp)
+ int is_stream = (type != CONN_TYPE_AP_DNS_LISTENER);
+ if (is_stream)
start_reading = 1;
tor_addr_from_sockaddr(&addr, listensockaddr, &usePort);
@@ -1039,10 +1088,10 @@ connection_listener_new(const struct sockaddr *listensockaddr,
conn_type_to_string(type), fmt_addrport(&addr, usePort));
s = tor_open_socket_nonblocking(tor_addr_family(&addr),
- is_tcp ? SOCK_STREAM : SOCK_DGRAM,
- is_tcp ? IPPROTO_TCP: IPPROTO_UDP);
+ is_stream ? SOCK_STREAM : SOCK_DGRAM,
+ is_stream ? IPPROTO_TCP: IPPROTO_UDP);
if (!SOCKET_OK(s)) {
- log_warn(LD_NET,"Socket creation failed: %s",
+ log_warn(LD_NET, "Socket creation failed: %s",
tor_socket_strerror(tor_socket_errno(-1)));
goto err;
}
@@ -1099,7 +1148,7 @@ connection_listener_new(const struct sockaddr *listensockaddr,
goto err;
}
- if (is_tcp) {
+ if (is_stream) {
if (tor_listen(s) < 0) {
log_warn(LD_NET, "Could not listen on %s:%u: %s", address, usePort,
tor_socket_strerror(tor_socket_errno(s)));
@@ -1122,15 +1171,25 @@ connection_listener_new(const struct sockaddr *listensockaddr,
tor_addr_from_sockaddr(&addr2, (struct sockaddr*)&ss, &gotPort);
}
#ifdef HAVE_SYS_UN_H
+ /*
+ * AF_UNIX generic setup stuff (this covers both CONN_TYPE_CONTROL_LISTENER
+ * and CONN_TYPE_AP_LISTENER cases)
+ */
} else if (listensockaddr->sa_family == AF_UNIX) {
+ /* We want to start reading for both AF_UNIX cases */
start_reading = 1;
- /* For now only control ports can be Unix domain sockets
+ /* For now only control ports or SOCKS ports can be Unix domain sockets
* and listeners at the same time */
- tor_assert(type == CONN_TYPE_CONTROL_LISTENER);
+ tor_assert(type == CONN_TYPE_CONTROL_LISTENER ||
+ type == CONN_TYPE_AP_LISTENER);
- if (check_location_for_unix_socket(options, address) < 0)
- goto err;
+ if (check_location_for_unix_socket(options, address,
+ (type == CONN_TYPE_CONTROL_LISTENER) ?
+ UNIX_SOCKET_PURPOSE_CONTROL_SOCKET :
+ UNIX_SOCKET_PURPOSE_SOCKS_SOCKET) < 0) {
+ goto err;
+ }
log_notice(LD_NET, "Opening %s on %s",
conn_type_to_string(type), address);
@@ -1142,17 +1201,20 @@ connection_listener_new(const struct sockaddr *listensockaddr,
strerror(errno));
goto err;
}
+
s = tor_open_socket_nonblocking(AF_UNIX, SOCK_STREAM, 0);
if (! SOCKET_OK(s)) {
log_warn(LD_NET,"Socket creation failed: %s.", strerror(errno));
goto err;
}
- if (bind(s, listensockaddr, (socklen_t)sizeof(struct sockaddr_un)) == -1) {
+ if (bind(s, listensockaddr,
+ (socklen_t)sizeof(struct sockaddr_un)) == -1) {
log_warn(LD_NET,"Bind to %s failed: %s.", address,
tor_socket_strerror(tor_socket_errno(s)));
goto err;
}
+
#ifdef HAVE_PWD_H
if (options->User) {
pw = tor_getpwnam(options->User);
@@ -1167,13 +1229,27 @@ connection_listener_new(const struct sockaddr *listensockaddr,
}
}
#endif
- if (options->ControlSocketsGroupWritable) {
+
+ if ((type == CONN_TYPE_CONTROL_LISTENER &&
+ options->ControlSocketsGroupWritable) ||
+ (type == CONN_TYPE_AP_LISTENER &&
+ options->SocksSocketsGroupWritable)) {
/* We need to use chmod; fchmod doesn't work on sockets on all
* platforms. */
if (chmod(address, 0660) < 0) {
log_warn(LD_FS,"Unable to make %s group-writable.", address);
goto err;
}
+ } else if ((type == CONN_TYPE_CONTROL_LISTENER &&
+ !(options->ControlSocketsGroupWritable)) ||
+ (type == CONN_TYPE_AP_LISTENER &&
+ !(options->SocksSocketsGroupWritable))) {
+ /* We need to use chmod; fchmod doesn't work on sockets on all
+ * platforms. */
+ if (chmod(address, 0600) < 0) {
+ log_warn(LD_FS,"Unable to make %s group-writable.", address);
+ goto err;
+ }
}
if (listen(s, SOMAXCONN) < 0) {
@@ -1181,8 +1257,6 @@ connection_listener_new(const struct sockaddr *listensockaddr,
tor_socket_strerror(tor_socket_errno(s)));
goto err;
}
-#else
- (void)options;
#endif /* HAVE_SYS_UN_H */
} else {
log_err(LD_BUG, "Got unexpected address family %d.",
@@ -1199,10 +1273,10 @@ connection_listener_new(const struct sockaddr *listensockaddr,
conn->port = gotPort;
tor_addr_copy(&conn->addr, &addr);
- if (port_cfg->isolation_flags) {
- lis_conn->isolation_flags = port_cfg->isolation_flags;
- if (port_cfg->session_group >= 0) {
- lis_conn->session_group = port_cfg->session_group;
+ if (port_cfg->entry_cfg.isolation_flags) {
+ lis_conn->entry_cfg.isolation_flags = port_cfg->entry_cfg.isolation_flags;
+ if (port_cfg->entry_cfg.session_group >= 0) {
+ lis_conn->entry_cfg.session_group = port_cfg->entry_cfg.session_group;
} else {
/* This can wrap after around INT_MAX listeners are opened. But I don't
* believe that matters, since you would need to open a ridiculous
@@ -1210,23 +1284,17 @@ connection_listener_new(const struct sockaddr *listensockaddr,
* hit this. An OR with a dozen ports open, for example, would have to
* close and re-open its listeners every second for 4 years nonstop.
*/
- lis_conn->session_group = global_next_session_group--;
+ lis_conn->entry_cfg.session_group = global_next_session_group--;
}
}
- if (type == CONN_TYPE_AP_LISTENER) {
- lis_conn->socks_ipv4_traffic = port_cfg->ipv4_traffic;
- lis_conn->socks_ipv6_traffic = port_cfg->ipv6_traffic;
- lis_conn->socks_prefer_ipv6 = port_cfg->prefer_ipv6;
- } else {
- lis_conn->socks_ipv4_traffic = 1;
- lis_conn->socks_ipv6_traffic = 1;
+
+ memcpy(&lis_conn->entry_cfg, &port_cfg->entry_cfg, sizeof(entry_port_cfg_t));
+
+ if (type != CONN_TYPE_AP_LISTENER) {
+ lis_conn->entry_cfg.ipv4_traffic = 1;
+ lis_conn->entry_cfg.ipv6_traffic = 1;
+ lis_conn->entry_cfg.prefer_ipv6 = 0;
}
- lis_conn->cache_ipv4_answers = port_cfg->cache_ipv4_answers;
- lis_conn->cache_ipv6_answers = port_cfg->cache_ipv6_answers;
- lis_conn->use_cached_ipv4_answers = port_cfg->use_cached_ipv4_answers;
- lis_conn->use_cached_ipv6_answers = port_cfg->use_cached_ipv6_answers;
- lis_conn->prefer_ipv6_virtaddr = port_cfg->prefer_ipv6_virtaddr;
- lis_conn->socks_prefer_no_auth = port_cfg->socks_prefer_no_auth;
if (connection_add(conn) < 0) { /* no space, forget it */
log_warn(LD_NET,"connection_add for listener failed. Giving up.");
@@ -1293,6 +1361,8 @@ check_sockaddr(const struct sockaddr *sa, int len, int level)
"Address for new connection has address/port equal to zero.");
ok = 0;
}
+ } else if (sa->sa_family == AF_UNIX) {
+ ok = 1;
} else {
ok = 0;
}
@@ -1377,7 +1447,8 @@ connection_handle_listener_read(connection_t *conn, int new_type)
return 0;
}
- if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6) {
+ if (conn->socket_family == AF_INET || conn->socket_family == AF_INET6 ||
+ (conn->socket_family == AF_UNIX && new_type == CONN_TYPE_AP)) {
tor_addr_t addr;
uint16_t port;
if (check_sockaddr(remote, remotelen, LOG_INFO)<0) {
@@ -1418,18 +1489,21 @@ connection_handle_listener_read(connection_t *conn, int new_type)
newconn->port = port;
newconn->address = tor_dup_addr(&addr);
- if (new_type == CONN_TYPE_AP) {
- TO_ENTRY_CONN(newconn)->socks_request->socks_prefer_no_auth =
- TO_LISTENER_CONN(conn)->socks_prefer_no_auth;
+ if (new_type == CONN_TYPE_AP && conn->socket_family != AF_UNIX) {
+ log_info(LD_NET, "New SOCKS connection opened from %s.",
+ fmt_and_decorate_addr(&addr));
+ }
+ if (new_type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) {
+ newconn->port = 0;
+ newconn->address = tor_strdup(conn->address);
+ log_info(LD_NET, "New SOCKS SocksSocket connection opened");
}
if (new_type == CONN_TYPE_CONTROL) {
log_notice(LD_CONTROL, "New control connection opened from %s.",
fmt_and_decorate_addr(&addr));
}
- } else if (conn->socket_family == AF_UNIX) {
- /* For now only control ports can be Unix domain sockets
- * and listeners at the same time */
+ } else if (conn->socket_family == AF_UNIX && conn->type != CONN_TYPE_AP) {
tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER);
tor_assert(new_type == CONN_TYPE_CONTROL);
log_notice(LD_CONTROL, "New control connection opened.");
@@ -1484,25 +1558,16 @@ connection_init_accepted_conn(connection_t *conn,
return rv;
break;
case CONN_TYPE_AP:
- TO_ENTRY_CONN(conn)->isolation_flags = listener->isolation_flags;
- TO_ENTRY_CONN(conn)->session_group = listener->session_group;
+ memcpy(&TO_ENTRY_CONN(conn)->entry_cfg, &listener->entry_cfg,
+ sizeof(entry_port_cfg_t));
TO_ENTRY_CONN(conn)->nym_epoch = get_signewnym_epoch();
TO_ENTRY_CONN(conn)->socks_request->listener_type = listener->base_.type;
- TO_ENTRY_CONN(conn)->ipv4_traffic_ok = listener->socks_ipv4_traffic;
- TO_ENTRY_CONN(conn)->ipv6_traffic_ok = listener->socks_ipv6_traffic;
- TO_ENTRY_CONN(conn)->prefer_ipv6_traffic = listener->socks_prefer_ipv6;
- TO_ENTRY_CONN(conn)->cache_ipv4_answers = listener->cache_ipv4_answers;
- TO_ENTRY_CONN(conn)->cache_ipv6_answers = listener->cache_ipv6_answers;
- TO_ENTRY_CONN(conn)->use_cached_ipv4_answers =
- listener->use_cached_ipv4_answers;
- TO_ENTRY_CONN(conn)->use_cached_ipv6_answers =
- listener->use_cached_ipv6_answers;
- TO_ENTRY_CONN(conn)->prefer_ipv6_virtaddr =
- listener->prefer_ipv6_virtaddr;
switch (TO_CONN(listener)->type) {
case CONN_TYPE_AP_LISTENER:
conn->state = AP_CONN_STATE_SOCKS_WAIT;
+ TO_ENTRY_CONN(conn)->socks_request->socks_prefer_no_auth =
+ listener->entry_cfg.socks_prefer_no_auth;
break;
case CONN_TYPE_AP_TRANS_LISTENER:
TO_ENTRY_CONN(conn)->is_transparent_ap = 1;
@@ -1525,37 +1590,31 @@ connection_init_accepted_conn(connection_t *conn,
return 0;
}
-/** Take conn, make a nonblocking socket; try to connect to
- * addr:port (they arrive in *host order*). If fail, return -1 and if
- * applicable put your best guess about errno into *<b>socket_error</b>.
- * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0.
- *
- * address is used to make the logs useful.
- *
- * On success, add conn to the list of polled connections.
- */
-int
-connection_connect(connection_t *conn, const char *address,
- const tor_addr_t *addr, uint16_t port, int *socket_error)
+
+static int
+connection_connect_sockaddr(connection_t *conn,
+ const struct sockaddr *sa,
+ socklen_t sa_len,
+ const struct sockaddr *bindaddr,
+ socklen_t bindaddr_len,
+ int *socket_error)
{
tor_socket_t s;
int inprogress = 0;
- struct sockaddr_storage addrbuf;
- struct sockaddr *dest_addr;
- int dest_addr_len;
const or_options_t *options = get_options();
int protocol_family;
+ tor_assert(conn);
+ tor_assert(sa);
+ tor_assert(socket_error);
+
if (get_n_open_sockets() >= get_options()->ConnLimit_-1) {
warn_too_many_conns();
*socket_error = SOCK_ERRNO(ENOBUFS);
return -1;
}
- if (tor_addr_family(addr) == AF_INET6)
- protocol_family = PF_INET6;
- else
- protocol_family = PF_INET;
+ protocol_family = sa->sa_family;
if (get_options()->DisableNetwork) {
/* We should never even try to connect anyplace if DisableNetwork is set.
@@ -1568,7 +1627,7 @@ connection_connect(connection_t *conn, const char *address,
return -1;
}
- s = tor_open_socket_nonblocking(protocol_family,SOCK_STREAM,IPPROTO_TCP);
+ s = tor_open_socket_nonblocking(protocol_family, SOCK_STREAM, 0);
if (! SOCKET_OK(s)) {
*socket_error = tor_socket_errno(-1);
log_warn(LD_NET,"Error creating network socket: %s",
@@ -1581,6 +1640,74 @@ connection_connect(connection_t *conn, const char *address,
tor_socket_strerror(errno));
}
+ if (bindaddr && bind(s, bindaddr, bindaddr_len) < 0) {
+ *socket_error = tor_socket_errno(s);
+ log_warn(LD_NET,"Error binding network socket: %s",
+ tor_socket_strerror(*socket_error));
+ tor_close_socket(s);
+ return -1;
+ }
+
+ tor_assert(options);
+ if (options->ConstrainedSockets)
+ set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);
+
+ if (connect(s, sa, sa_len) < 0) {
+ int e = tor_socket_errno(s);
+ if (!ERRNO_IS_CONN_EINPROGRESS(e)) {
+ /* yuck. kill it. */
+ *socket_error = e;
+ log_info(LD_NET,
+ "connect() to socket failed: %s",
+ tor_socket_strerror(e));
+ tor_close_socket(s);
+ return -1;
+ } else {
+ inprogress = 1;
+ }
+ }
+
+ /* it succeeded. we're connected. */
+ log_fn(inprogress ? LOG_DEBUG : LOG_INFO, LD_NET,
+ "Connection to socket %s (sock "TOR_SOCKET_T_FORMAT").",
+ inprogress ? "in progress" : "established", s);
+ conn->s = s;
+ if (connection_add_connecting(conn) < 0) {
+ /* no space, forget it */
+ *socket_error = SOCK_ERRNO(ENOBUFS);
+ return -1;
+ }
+ return inprogress ? 0 : 1;
+
+}
+
+
+/** Take conn, make a nonblocking socket; try to connect to
+ * addr:port (they arrive in *host order*). If fail, return -1 and if
+ * applicable put your best guess about errno into *<b>socket_error</b>.
+ * Else assign s to conn-\>s: if connected return 1, if EAGAIN return 0.
+ *
+ * address is used to make the logs useful.
+ *
+ * On success, add conn to the list of polled connections.
+ */
+int
+connection_connect(connection_t *conn, const char *address,
+ const tor_addr_t *addr, uint16_t port, int *socket_error)
+{
+ struct sockaddr_storage addrbuf;
+ struct sockaddr_storage bind_addr_ss;
+ struct sockaddr *bind_addr = NULL;
+ struct sockaddr *dest_addr;
+ int dest_addr_len, bind_addr_len = 0;
+ const or_options_t *options = get_options();
+ int protocol_family;
+
+ if (tor_addr_family(addr) == AF_INET6)
+ protocol_family = PF_INET6;
+ else
+ protocol_family = PF_INET;
+
if (!tor_addr_is_loopback(addr)) {
const tor_addr_t *ext_addr = NULL;
if (protocol_family == AF_INET &&
@@ -1590,33 +1717,21 @@ connection_connect(connection_t *conn, const char *address,
!tor_addr_is_null(&options->OutboundBindAddressIPv6_))
ext_addr = &options->OutboundBindAddressIPv6_;
if (ext_addr) {
- struct sockaddr_storage ext_addr_sa;
socklen_t ext_addr_len = 0;
- memset(&ext_addr_sa, 0, sizeof(ext_addr_sa));
- ext_addr_len = tor_addr_to_sockaddr(ext_addr, 0,
- (struct sockaddr *) &ext_addr_sa,
- sizeof(ext_addr_sa));
+ memset(&bind_addr_ss, 0, sizeof(bind_addr_ss));
+ bind_addr_len = tor_addr_to_sockaddr(ext_addr, 0,
+ (struct sockaddr *) &bind_addr_ss,
+ sizeof(bind_addr_ss));
if (ext_addr_len == 0) {
log_warn(LD_NET,
"Error converting OutboundBindAddress %s into sockaddr. "
"Ignoring.", fmt_and_decorate_addr(ext_addr));
} else {
- if (bind(s, (struct sockaddr *) &ext_addr_sa, ext_addr_len) < 0) {
- *socket_error = tor_socket_errno(s);
- log_warn(LD_NET,"Error binding network socket to %s: %s",
- fmt_and_decorate_addr(ext_addr),
- tor_socket_strerror(*socket_error));
- tor_close_socket(s);
- return -1;
- }
+ bind_addr = (struct sockaddr *)&bind_addr_ss;
}
}
}
- tor_assert(options);
- if (options->ConstrainedSockets)
- set_constrained_socket_buffers(s, (int)options->ConstrainedSockSize);
-
memset(&addrbuf,0,sizeof(addrbuf));
dest_addr = (struct sockaddr*) &addrbuf;
dest_addr_len = tor_addr_to_sockaddr(addr, port, dest_addr, sizeof(addrbuf));
@@ -1625,36 +1740,51 @@ connection_connect(connection_t *conn, const char *address,
log_debug(LD_NET, "Connecting to %s:%u.",
escaped_safe_str_client(address), port);
- if (connect(s, dest_addr, (socklen_t)dest_addr_len) < 0) {
- int e = tor_socket_errno(s);
- if (!ERRNO_IS_CONN_EINPROGRESS(e)) {
- /* yuck. kill it. */
- *socket_error = e;
- log_info(LD_NET,
- "connect() to %s:%u failed: %s",
- escaped_safe_str_client(address),
- port, tor_socket_strerror(e));
- tor_close_socket(s);
- return -1;
- } else {
- inprogress = 1;
- }
- }
+ return connection_connect_sockaddr(conn, dest_addr, dest_addr_len,
+ bind_addr, bind_addr_len, socket_error);
+}
- /* it succeeded. we're connected. */
- log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET,
- "Connection to %s:%u %s (sock "TOR_SOCKET_T_FORMAT").",
- escaped_safe_str_client(address),
- port, inprogress?"in progress":"established", s);
- conn->s = s;
- if (connection_add_connecting(conn) < 0) {
- /* no space, forget it */
- *socket_error = SOCK_ERRNO(ENOBUFS);
+#ifdef HAVE_SYS_UN_H
+
+/** Take conn, make a nonblocking socket; try to connect to
+ * an AF_UNIX socket at socket_path. If fail, return -1 and if applicable
+ * put your best guess about errno into *<b>socket_error</b>. Else assign s
+ * to conn-\>s: if connected return 1, if EAGAIN return 0.
+ *
+ * On success, add conn to the list of polled connections.
+ */
+int
+connection_connect_unix(connection_t *conn, const char *socket_path,
+ int *socket_error)
+{
+ struct sockaddr_un dest_addr;
+
+ tor_assert(socket_path);
+
+ /* Check that we'll be able to fit it into dest_addr later */
+ if (strlen(socket_path) + 1 > sizeof(dest_addr.sun_path)) {
+ log_warn(LD_NET,
+ "Path %s is too long for an AF_UNIX socket\n",
+ escaped_safe_str_client(socket_path));
+ *socket_error = SOCK_ERRNO(ENAMETOOLONG);
return -1;
}
- return inprogress ? 0 : 1;
+
+ memset(&dest_addr, 0, sizeof(dest_addr));
+ dest_addr.sun_family = AF_UNIX;
+ strlcpy(dest_addr.sun_path, socket_path, sizeof(dest_addr.sun_path));
+
+ log_debug(LD_NET,
+ "Connecting to AF_UNIX socket at %s.",
+ escaped_safe_str_client(socket_path));
+
+ return connection_connect_sockaddr(conn,
+ (struct sockaddr *)&dest_addr, sizeof(dest_addr),
+ NULL, 0, socket_error);
}
+#endif /* defined(HAVE_SYS_UN_H) */
+
/** Convert state number to string representation for logging purposes.
*/
static const char *
@@ -2185,7 +2315,7 @@ retry_listener_ports(smartlist_t *old_conns,
(conn->socket_family == AF_UNIX && ! wanted->is_unix_addr))
continue;
- if (wanted->no_listen)
+ if (wanted->server_cfg.no_listen)
continue; /* We don't want to open a listener for this one */
if (wanted->is_unix_addr) {
@@ -2226,7 +2356,7 @@ retry_listener_ports(smartlist_t *old_conns,
connection_t *conn;
int real_port = port->port == CFG_AUTO_PORT ? 0 : port->port;
tor_assert(real_port <= UINT16_MAX);
- if (port->no_listen)
+ if (port->server_cfg.no_listen)
continue;
if (port->is_unix_addr) {
@@ -2348,7 +2478,6 @@ connection_mark_all_noncontrol_connections(void)
if (conn->marked_for_close)
continue;
switch (conn->type) {
- case CONN_TYPE_CPUWORKER:
case CONN_TYPE_CONTROL_LISTENER:
case CONN_TYPE_CONTROL:
break;
@@ -2391,6 +2520,7 @@ connection_is_rate_limited(connection_t *conn)
return 0; /* Internal connection */
else if (! options->CountPrivateBandwidth &&
(tor_addr_family(&conn->addr) == AF_UNSPEC || /* no address */
+ tor_addr_family(&conn->addr) == AF_UNIX || /* no address */
tor_addr_is_internal(&conn->addr, 0)))
return 0; /* Internal address */
else
@@ -3839,6 +3969,8 @@ connection_handle_write_impl(connection_t *conn, int force)
tor_tls_get_n_raw_bytes(or_conn->tls, &n_read, &n_written);
log_debug(LD_GENERAL, "After TLS write of %d: %ld read, %ld written",
result, (long)n_read, (long)n_written);
+ or_conn->bytes_xmitted += result;
+ or_conn->bytes_xmitted_by_tls += n_written;
/* So we notice bytes were written even on error */
/* XXXX024 This cast is safe since we can never write INT_MAX bytes in a
* single set of TLS operations. But it looks kinda ugly. If we refactor
@@ -4439,8 +4571,6 @@ connection_process_inbuf(connection_t *conn, int package_partial)
package_partial);
case CONN_TYPE_DIR:
return connection_dir_process_inbuf(TO_DIR_CONN(conn));
- case CONN_TYPE_CPUWORKER:
- return connection_cpu_process_inbuf(conn);
case CONN_TYPE_CONTROL:
return connection_control_process_inbuf(TO_CONTROL_CONN(conn));
default:
@@ -4500,8 +4630,6 @@ connection_finished_flushing(connection_t *conn)
return connection_edge_finished_flushing(TO_EDGE_CONN(conn));
case CONN_TYPE_DIR:
return connection_dir_finished_flushing(TO_DIR_CONN(conn));
- case CONN_TYPE_CPUWORKER:
- return connection_cpu_finished_flushing(conn);
case CONN_TYPE_CONTROL:
return connection_control_finished_flushing(TO_CONTROL_CONN(conn));
default:
@@ -4557,8 +4685,6 @@ connection_reached_eof(connection_t *conn)
return connection_edge_reached_eof(TO_EDGE_CONN(conn));
case CONN_TYPE_DIR:
return connection_dir_reached_eof(TO_DIR_CONN(conn));
- case CONN_TYPE_CPUWORKER:
- return connection_cpu_reached_eof(conn);
case CONN_TYPE_CONTROL:
return connection_control_reached_eof(TO_CONTROL_CONN(conn));
default:
@@ -4764,10 +4890,6 @@ assert_connection_ok(connection_t *conn, time_t now)
tor_assert(conn->purpose >= DIR_PURPOSE_MIN_);
tor_assert(conn->purpose <= DIR_PURPOSE_MAX_);
break;
- case CONN_TYPE_CPUWORKER:
- tor_assert(conn->state >= CPUWORKER_STATE_MIN_);
- tor_assert(conn->state <= CPUWORKER_STATE_MAX_);
- break;
case CONN_TYPE_CONTROL:
tor_assert(conn->state >= CONTROL_CONN_STATE_MIN_);
tor_assert(conn->state <= CONTROL_CONN_STATE_MAX_);
@@ -4868,9 +4990,7 @@ proxy_type_to_string(int proxy_type)
}
/** Call connection_free_() on every connection in our array, and release all
- * storage held by connection.c. This is used by cpuworkers and dnsworkers
- * when they fork, so they don't keep resources held open (especially
- * sockets).
+ * storage held by connection.c.
*
* Don't do the checks in connection_free(), because they will
* fail.
diff --git a/src/or/connection.h b/src/or/connection.h
index 7cdfd3e253..50bea51e5b 100644
--- a/src/or/connection.h
+++ b/src/or/connection.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -89,6 +89,13 @@ int connection_connect(connection_t *conn, const char *address,
const tor_addr_t *addr,
uint16_t port, int *socket_error);
+#ifdef HAVE_SYS_UN_H
+
+int connection_connect_unix(connection_t *conn, const char *socket_path,
+ int *socket_error);
+
+#endif /* defined(HAVE_SYS_UN_H) */
+
/** Maximum size of information that we can fit into SOCKS5 username
or password fields. */
#define MAX_SOCKS5_AUTH_FIELD_SIZE 255
diff --git a/src/or/connection_edge.c b/src/or/connection_edge.c
index 14b391180e..9690653d59 100644
--- a/src/or/connection_edge.c
+++ b/src/or/connection_edge.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -46,6 +46,19 @@
#ifdef HAVE_LINUX_NETFILTER_IPV4_H
#include <linux/netfilter_ipv4.h>
#define TRANS_NETFILTER
+#define TRANS_NETFILTER_IPV4
+#endif
+
+#ifdef HAVE_LINUX_IF_H
+#include <linux/if.h>
+#endif
+
+#ifdef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H
+#include <linux/netfilter_ipv6/ip6_tables.h>
+#if defined(IP6T_SO_ORIGINAL_DST)
+#define TRANS_NETFILTER
+#define TRANS_NETFILTER_IPV6
+#endif
#endif
#if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H)
@@ -744,8 +757,9 @@ connection_ap_fail_onehop(const char *failed_digest,
/* we don't know the digest; have to compare addr:port */
tor_addr_t addr;
if (!build_state || !build_state->chosen_exit ||
- !entry_conn->socks_request || !entry_conn->socks_request->address)
+ !entry_conn->socks_request) {
continue;
+ }
if (tor_addr_parse(&addr, entry_conn->socks_request->address)<0 ||
!tor_addr_eq(&build_state->chosen_exit->addr, &addr) ||
build_state->chosen_exit->port != entry_conn->socks_request->port)
@@ -894,78 +908,102 @@ connection_ap_rewrite_and_attach_if_allowed(entry_connection_t *conn,
return connection_ap_handshake_rewrite_and_attach(conn, circ, cpath);
}
-/** Connection <b>conn</b> just finished its socks handshake, or the
- * controller asked us to take care of it. If <b>circ</b> is defined,
- * then that's where we'll want to attach it. Otherwise we have to
- * figure it out ourselves.
- *
- * First, parse whether it's a .exit address, remap it, and so on. Then
- * if it's for a general circuit, try to attach it to a circuit (or launch
- * one as needed), else if it's for a rendezvous circuit, fetch a
- * rendezvous descriptor first (or attach/launch a circuit if the
- * rendezvous descriptor is already here and fresh enough).
- *
- * The stream will exit from the hop
- * indicated by <b>cpath</b>, or from the last hop in circ's cpath if
- * <b>cpath</b> is NULL.
+/* Try to perform any map-based rewriting of the target address in
+ * <b>conn</b>, filling in the fields of <b>out</b> as we go, and modifying
+ * conn->socks_request.address as appropriate.
*/
-int
-connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
- origin_circuit_t *circ,
- crypt_path_t *cpath)
+STATIC void
+connection_ap_handshake_rewrite(entry_connection_t *conn,
+ rewrite_result_t *out)
{
socks_request_t *socks = conn->socks_request;
- hostname_type_t addresstype;
const or_options_t *options = get_options();
tor_addr_t addr_tmp;
- /* We set this to true if this is an address we should automatically
- * remap to a local address in VirtualAddrNetwork */
- int automap = 0;
- char orig_address[MAX_SOCKS_ADDR_LEN];
- time_t map_expires = TIME_MAX;
- time_t now = time(NULL);
- connection_t *base_conn = ENTRY_TO_CONN(conn);
- addressmap_entry_source_t exit_source = ADDRMAPSRC_NONE;
- tor_strlower(socks->address); /* normalize it */
- strlcpy(orig_address, socks->address, sizeof(orig_address));
+ /* Initialize all the fields of 'out' to reasonable defaults */
+ out->automap = 0;
+ out->exit_source = ADDRMAPSRC_NONE;
+ out->map_expires = TIME_MAX;
+ out->end_reason = 0;
+ out->should_close = 0;
+ out->orig_address[0] = 0;
+
+ /* We convert all incoming addresses to lowercase. */
+ tor_strlower(socks->address);
+ /* Remember the original address. */
+ strlcpy(out->orig_address, socks->address, sizeof(out->orig_address));
log_debug(LD_APP,"Client asked for %s:%d",
safe_str_client(socks->address),
socks->port);
+ /* Check for whether this is a .exit address. By default, those are
+ * disallowed when they're coming straight from the client, but you're
+ * allowed to have them in MapAddress commands and so forth. */
if (!strcmpend(socks->address, ".exit") && !options->AllowDotExit) {
log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to "
"security risks. Set AllowDotExit in your torrc to enable "
"it (at your own risk).");
control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s",
escaped(socks->address));
- connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
- return -1;
+ out->end_reason = END_STREAM_REASON_TORPROTOCOL;
+ out->should_close = 1;
+ return;
}
- if (! conn->original_dest_address)
+ /* Remember the original address so we can tell the user about what
+ * they actually said, not just what it turned into. */
+ if (! conn->original_dest_address) {
+ /* Is the 'if' necessary here? XXXX */
conn->original_dest_address = tor_strdup(conn->socks_request->address);
+ }
+ /* First, apply MapAddress and MAPADDRESS mappings. We need to do
+ * these only for non-reverse lookups, since they don't exist for those.
+ * We need to do this before we consider automapping, since we might
+ * e.g. resolve irc.oftc.net into irconionaddress.onion, at which point
+ * we'd need to automap it. */
+ if (socks->command != SOCKS_COMMAND_RESOLVE_PTR) {
+ const unsigned rewrite_flags = AMR_FLAG_USE_MAPADDRESS;
+ if (addressmap_rewrite(socks->address, sizeof(socks->address),
+ rewrite_flags, &out->map_expires, &out->exit_source)) {
+ control_event_stream_status(conn, STREAM_EVENT_REMAP,
+ REMAP_STREAM_SOURCE_CACHE);
+ }
+ }
+
+ /* Now, handle automapping. Automapping happens when we're asked to
+ * resolve a hostname, and AutomapHostsOnResolve is set, and
+ * the hostname has a suffix listed in AutomapHostsSuffixes.
+ */
if (socks->command == SOCKS_COMMAND_RESOLVE &&
tor_addr_parse(&addr_tmp, socks->address)<0 &&
options->AutomapHostsOnResolve) {
- automap = addressmap_address_should_automap(socks->address, options);
- if (automap) {
+ /* Check the suffix... */
+ out->automap = addressmap_address_should_automap(socks->address, options);
+ if (out->automap) {
+ /* If we get here, then we should apply an automapping for this. */
const char *new_addr;
+ /* We return an IPv4 address by default, or an IPv6 address if we
+ * are allowed to do so. */
int addr_type = RESOLVED_TYPE_IPV4;
if (conn->socks_request->socks_version != 4) {
- if (!conn->ipv4_traffic_ok ||
- (conn->ipv6_traffic_ok && conn->prefer_ipv6_traffic) ||
- conn->prefer_ipv6_virtaddr)
+ if (!conn->entry_cfg.ipv4_traffic ||
+ (conn->entry_cfg.ipv6_traffic && conn->entry_cfg.prefer_ipv6) ||
+ conn->entry_cfg.prefer_ipv6_virtaddr)
addr_type = RESOLVED_TYPE_IPV6;
}
+ /* Okay, register the target address as automapped, and find the new
+ * address we're supposed to give as a resolve answer. (Return a cached
+ * value if we've looked up this address before.
+ */
new_addr = addressmap_register_virtual_address(
addr_type, tor_strdup(socks->address));
if (! new_addr) {
log_warn(LD_APP, "Unable to automap address %s",
escaped_safe_str(socks->address));
- connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL);
- return -1;
+ out->end_reason = END_STREAM_REASON_INTERNAL;
+ out->should_close = 1;
+ return;
}
log_info(LD_APP, "Automapping %s to %s",
escaped_safe_str_client(socks->address),
@@ -974,28 +1012,35 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
}
}
+ /* Now handle reverse lookups, if they're in the cache. This doesn't
+ * happen too often, since client-side DNS caching is off by default. */
if (socks->command == SOCKS_COMMAND_RESOLVE_PTR) {
unsigned rewrite_flags = 0;
- if (conn->use_cached_ipv4_answers)
+ if (conn->entry_cfg.use_cached_ipv4_answers)
rewrite_flags |= AMR_FLAG_USE_IPV4_DNS;
- if (conn->use_cached_ipv6_answers)
+ if (conn->entry_cfg.use_cached_ipv6_answers)
rewrite_flags |= AMR_FLAG_USE_IPV6_DNS;
if (addressmap_rewrite_reverse(socks->address, sizeof(socks->address),
- rewrite_flags, &map_expires)) {
+ rewrite_flags, &out->map_expires)) {
char *result = tor_strdup(socks->address);
/* remember _what_ is supposed to have been resolved. */
tor_snprintf(socks->address, sizeof(socks->address), "REVERSE[%s]",
- orig_address);
+ out->orig_address);
connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_HOSTNAME,
strlen(result), (uint8_t*)result,
-1,
- map_expires);
- connection_mark_unattached_ap(conn,
- END_STREAM_REASON_DONE |
- END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
- return 0;
+ out->map_expires);
+ tor_free(result);
+ out->end_reason = END_STREAM_REASON_DONE |
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED;
+ out->should_close = 1;
+ return;
}
+
+ /* Hang on, did we find an answer saying that this is a reverse lookup for
+ * an internal address? If so, we should reject it if we're condigured to
+ * do so. */
if (options->ClientDNSRejectInternalAddresses) {
/* Don't let people try to do a reverse lookup on 10.0.0.1. */
tor_addr_t addr;
@@ -1005,43 +1050,108 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
if (ok == 1 && tor_addr_is_internal(&addr, 0)) {
connection_ap_handshake_socks_resolved(conn, RESOLVED_TYPE_ERROR,
0, NULL, -1, TIME_MAX);
- connection_mark_unattached_ap(conn,
- END_STREAM_REASON_SOCKSPROTOCOL |
- END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
- return -1;
+ out->end_reason = END_STREAM_REASON_SOCKSPROTOCOL |
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED;
+ out->should_close = 1;
+ return;
}
}
- } else if (!automap) {
- /* For address map controls, remap the address. */
- unsigned rewrite_flags = 0;
- if (conn->use_cached_ipv4_answers)
+ }
+
+ /* If we didn't automap it before, then this is still the address
+ * that came straight from the user, mapped according to any
+ * MapAddress/MAPADDRESS commands. Now other mappings, including
+ * previously registered Automap entries, TrackHostExits entries,
+ * and client-side DNS cache entries (not recommended).
+ */
+ if (socks->command != SOCKS_COMMAND_RESOLVE_PTR &&
+ !out->automap) {
+ unsigned rewrite_flags = AMR_FLAG_USE_AUTOMAP | AMR_FLAG_USE_TRACKEXIT;
+ addressmap_entry_source_t exit_source2;
+ if (conn->entry_cfg.use_cached_ipv4_answers)
rewrite_flags |= AMR_FLAG_USE_IPV4_DNS;
- if (conn->use_cached_ipv6_answers)
+ if (conn->entry_cfg.use_cached_ipv6_answers)
rewrite_flags |= AMR_FLAG_USE_IPV6_DNS;
if (addressmap_rewrite(socks->address, sizeof(socks->address),
- rewrite_flags, &map_expires, &exit_source)) {
+ rewrite_flags, &out->map_expires, &exit_source2)) {
control_event_stream_status(conn, STREAM_EVENT_REMAP,
REMAP_STREAM_SOURCE_CACHE);
}
+ if (out->exit_source == ADDRMAPSRC_NONE) {
+ /* If it wasn't a .exit before, maybe it turned into a .exit. Remember
+ * the original source of a .exit. */
+ out->exit_source = exit_source2;
+ }
}
- if (!automap && address_is_in_virtual_range(socks->address)) {
- /* This address was probably handed out by client_dns_get_unmapped_address,
- * but the mapping was discarded for some reason. We *don't* want to send
- * the address through Tor; that's likely to fail, and may leak
- * information.
+ /* Check to see whether we're about to use an address in the virtual
+ * range without actually having gotten it from an Automap. */
+ if (!out->automap && address_is_in_virtual_range(socks->address)) {
+ /* This address was probably handed out by
+ * client_dns_get_unmapped_address, but the mapping was discarded for some
+ * reason. Or the user typed in a virtual address range manually. We
+ * *don't* want to send the address through Tor; that's likely to fail,
+ * and may leak information.
*/
log_warn(LD_APP,"Missing mapping for virtual address '%s'. Refusing.",
safe_str_client(socks->address));
- connection_mark_unattached_ap(conn, END_STREAM_REASON_INTERNAL);
- return -1;
+ out->end_reason = END_STREAM_REASON_INTERNAL;
+ out->should_close = 1;
+ return;
+ }
+}
+
+/** Connection <b>conn</b> just finished its socks handshake, or the
+ * controller asked us to take care of it. If <b>circ</b> is defined,
+ * then that's where we'll want to attach it. Otherwise we have to
+ * figure it out ourselves.
+ *
+ * First, parse whether it's a .exit address, remap it, and so on. Then
+ * if it's for a general circuit, try to attach it to a circuit (or launch
+ * one as needed), else if it's for a rendezvous circuit, fetch a
+ * rendezvous descriptor first (or attach/launch a circuit if the
+ * rendezvous descriptor is already here and fresh enough).
+ *
+ * The stream will exit from the hop
+ * indicated by <b>cpath</b>, or from the last hop in circ's cpath if
+ * <b>cpath</b> is NULL.
+ */
+int
+connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
+ origin_circuit_t *circ,
+ crypt_path_t *cpath)
+{
+ socks_request_t *socks = conn->socks_request;
+ const or_options_t *options = get_options();
+ connection_t *base_conn = ENTRY_TO_CONN(conn);
+ time_t now = time(NULL);
+ rewrite_result_t rr;
+
+ memset(&rr, 0, sizeof(rr));
+ connection_ap_handshake_rewrite(conn,&rr);
+
+ if (rr.should_close) {
+ /* connection_ap_handshake_rewrite told us to close the connection,
+ * either because it sent back an answer, or because it sent back an
+ * error */
+ connection_mark_unattached_ap(conn, rr.end_reason);
+ if (END_STREAM_REASON_DONE == (rr.end_reason & END_STREAM_REASON_MASK))
+ return 0;
+ else
+ return -1;
}
+ const time_t map_expires = rr.map_expires;
+ const int automap = rr.automap;
+ const addressmap_entry_source_t exit_source = rr.exit_source;
+
/* Parse the address provided by SOCKS. Modify it in-place if it
* specifies a hidden-service (.onion) or particular exit node (.exit).
*/
- addresstype = parse_extended_hostname(socks->address);
+ const hostname_type_t addresstype = parse_extended_hostname(socks->address);
+ /* Now see whether the hostname is bogus. This could happen because of an
+ * onion hostname whose format we don't recognize. */
if (addresstype == BAD_HOSTNAME) {
control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s",
escaped(socks->address));
@@ -1049,16 +1159,21 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
+ /* If this is a .exit hostname, strip off the .name.exit part, and
+ * see whether we're going to connect there, and otherwise handle it.
+ * (The ".exit" part got stripped off by "parse_extended_hostname").
+ *
+ * We'll set chosen_exit_name and/or close the connection as appropriate.
+ */
if (addresstype == EXIT_HOSTNAME) {
- /* foo.exit -- modify conn->chosen_exit_node to specify the exit
- * node, and conn->address to hold only the address portion. */
- char *s = strrchr(socks->address,'.');
-
- /* If StrictNodes is not set, then .exit overrides ExcludeNodes. */
+ /* If StrictNodes is not set, then .exit overrides ExcludeNodes but
+ * not ExcludeExitNodes. */
routerset_t *excludeset = options->StrictNodes ?
options->ExcludeExitNodesUnion_ : options->ExcludeExitNodes;
- const node_t *node;
+ const node_t *node = NULL;
+ /* If this .exit was added by an AUTOMAP, then it came straight from
+ * a user. Make sure that options->AllowDotExit permits that. */
if (exit_source == ADDRMAPSRC_AUTOMAP && !options->AllowDotExit) {
/* Whoops; this one is stale. It must have gotten added earlier,
* when AllowDotExit was on. */
@@ -1071,6 +1186,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
+ /* Double-check to make sure there are no .exits coming from
+ * impossible/weird sources. */
if (exit_source == ADDRMAPSRC_DNS ||
(exit_source == ADDRMAPSRC_NONE && !options->AllowDotExit)) {
/* It shouldn't be possible to get a .exit address from any of these
@@ -1085,9 +1202,12 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
}
tor_assert(!automap);
+ /* Now, find the character before the .(name) part. */
+ char *s = strrchr(socks->address,'.');
if (s) {
/* The address was of the form "(stuff).(name).exit */
if (s[1] != '\0') {
+ /* Looks like a real .exit one. */
conn->chosen_exit_name = tor_strdup(s+1);
node = node_get_by_nickname(conn->chosen_exit_name, 1);
@@ -1106,7 +1226,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
} else {
- /* It looks like they just asked for "foo.exit". */
+ /* It looks like they just asked for "foo.exit". That's a special
+ * form that means (foo's address).foo.exit. */
conn->chosen_exit_name = tor_strdup(socks->address);
node = node_get_by_nickname(conn->chosen_exit_name, 1);
@@ -1115,6 +1236,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
node_get_address_string(node, socks->address, sizeof(socks->address));
}
}
+
/* Now make sure that the chosen exit exists... */
if (!node) {
log_warn(LD_APP,
@@ -1136,8 +1258,12 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
implies no. */
}
+ /* Now, handle everything that isn't a .onion address. */
if (addresstype != ONION_HOSTNAME) {
- /* not a hidden-service request (i.e. normal or .exit) */
+ /* Not a hidden-service request. It's either a hostname or an IP,
+ * possibly with a .exit that we stripped off. */
+
+ /* Check for funny characters in the address. */
if (address_is_invalid_destination(socks->address, 1)) {
control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s",
escaped(socks->address));
@@ -1148,6 +1274,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
+ /* If we're running in Tor2webMode, we don't allow anything BUT .onion
+ * addresses. */
if (options->Tor2webMode) {
log_warn(LD_APP, "Refusing to connect to non-hidden-service hostname %s "
"because tor2web mode is enabled.",
@@ -1156,12 +1284,15 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
+ /* See if this is a hostname lookup that we can answer immediately.
+ * (For example, an attempt to look up the IP address for an IP address.)
+ */
if (socks->command == SOCKS_COMMAND_RESOLVE) {
tor_addr_t answer;
/* Reply to resolves immediately if we can. */
if (tor_addr_parse(&answer, socks->address) >= 0) {/* is it an IP? */
/* remember _what_ is supposed to have been resolved. */
- strlcpy(socks->address, orig_address, sizeof(socks->address));
+ strlcpy(socks->address, rr.orig_address, sizeof(socks->address));
connection_ap_handshake_socks_resolved_addr(conn, &answer, -1,
map_expires);
connection_mark_unattached_ap(conn,
@@ -1172,14 +1303,22 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
tor_assert(!automap);
rep_hist_note_used_resolve(now); /* help predict this next time */
} else if (socks->command == SOCKS_COMMAND_CONNECT) {
+ /* Special handling for attempts to connect */
tor_assert(!automap);
+ /* Don't allow connections to port 0. */
if (socks->port == 0) {
log_notice(LD_APP,"Application asked to connect to port 0. Refusing.");
connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
return -1;
}
+ /* You can't make connections to internal addresses, by default.
+ * Exceptions are begindir requests (where the address is meaningless,
+ * or cases where you've hand-configured a particular exit, thereby
+ * making the local address meaningful. */
if (options->ClientRejectInternalAddresses &&
!conn->use_begindir && !conn->chosen_exit_name && !circ) {
+ /* If we reach this point then we don't want to allow internal
+ * addresses. Check if we got one. */
tor_addr_t addr;
if (tor_addr_hostname_is_local(socks->address) ||
(tor_addr_parse(&addr, socks->address) >= 0 &&
@@ -1214,39 +1353,58 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
connection_mark_unattached_ap(conn, END_STREAM_REASON_PRIVATE_ADDR);
return -1;
}
- }
+ } /* end "if we should check for internal addresses" */
+ /* Okay. We're still doing a CONNECT, and it wasn't a private
+ * address. Do special handling for literal IP addresses */
{
tor_addr_t addr;
/* XXX Duplicate call to tor_addr_parse. */
if (tor_addr_parse(&addr, socks->address) >= 0) {
+ /* If we reach this point, it's an IPv4 or an IPv6 address. */
sa_family_t family = tor_addr_family(&addr);
- if ((family == AF_INET && ! conn->ipv4_traffic_ok) ||
- (family == AF_INET6 && ! conn->ipv4_traffic_ok)) {
+
+ if ((family == AF_INET && ! conn->entry_cfg.ipv4_traffic) ||
+ (family == AF_INET6 && ! conn->entry_cfg.ipv6_traffic)) {
+ /* You can't do an IPv4 address on a v6-only socks listener,
+ * or vice versa. */
log_warn(LD_NET, "Rejecting SOCKS request for an IP address "
"family that this listener does not support.");
connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY);
return -1;
} else if (family == AF_INET6 && socks->socks_version == 4) {
+ /* You can't make a socks4 request to an IPv6 address. Socks4
+ * doesn't support that. */
log_warn(LD_NET, "Rejecting SOCKS4 request for an IPv6 address.");
connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY);
return -1;
- } else if (socks->socks_version == 4 && !conn->ipv4_traffic_ok) {
+ } else if (socks->socks_version == 4 &&
+ !conn->entry_cfg.ipv4_traffic) {
+ /* You can't do any kind of Socks4 request when IPv4 is forbidden.
+ *
+ * XXX raise this check outside the enclosing block? */
log_warn(LD_NET, "Rejecting SOCKS4 request on a listener with "
"no IPv4 traffic supported.");
connection_mark_unattached_ap(conn, END_STREAM_REASON_ENTRYPOLICY);
return -1;
} else if (family == AF_INET6) {
- conn->ipv4_traffic_ok = 0;
+ /* Tell the exit: we won't accept any ipv4 connection to an IPv6
+ * address. */
+ conn->entry_cfg.ipv4_traffic = 0;
} else if (family == AF_INET) {
- conn->ipv6_traffic_ok = 0;
+ /* Tell the exit: we won't accept any ipv6 connection to an IPv4
+ * address. */
+ conn->entry_cfg.ipv6_traffic = 0;
}
}
}
if (socks->socks_version == 4)
- conn->ipv6_traffic_ok = 0;
+ conn->entry_cfg.ipv6_traffic = 0;
+ /* Still handling CONNECT. Now, check for exit enclaves. (Which we
+ * don't do on BEGINDIR, or there is a chosen exit.)
+ */
if (!conn->use_begindir && !conn->chosen_exit_name && !circ) {
/* see if we can find a suitable enclave exit */
const node_t *r =
@@ -1263,11 +1421,13 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
}
}
- /* warn or reject if it's using a dangerous port */
+ /* Still handling CONNECT: warn or reject if it's using a dangerous
+ * port. */
if (!conn->use_begindir && !conn->chosen_exit_name && !circ)
if (consider_plaintext_ports(conn, socks->port) < 0)
return -1;
+ /* Remember the port so that we do predicted requests there. */
if (!conn->use_begindir) {
/* help predict this next time */
rep_hist_note_used_port(now, socks->port);
@@ -1276,25 +1436,41 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
rep_hist_note_used_resolve(now); /* help predict this next time */
/* no extra processing needed */
} else {
+ /* We should only be doing CONNECT or RESOLVE! */
tor_fragile_assert();
}
+
+ /* Okay. At this point we've set chosen_exit_name if needed, rewritten the
+ * address, and decided not to reject it for any number of reasons. Now
+ * mark the connection as waiting for a circuit, and try to attach it!
+ */
base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
- if ((circ && connection_ap_handshake_attach_chosen_circuit(
- conn, circ, cpath) < 0) ||
- (!circ &&
- connection_ap_handshake_attach_circuit(conn) < 0)) {
+
+ /* If we were given a circuit to attach to, try to attach. Otherwise,
+ * try to find a good one and attach to that. */
+ int rv;
+ if (circ)
+ rv = connection_ap_handshake_attach_chosen_circuit(conn, circ, cpath);
+ else
+ rv = connection_ap_handshake_attach_circuit(conn);
+
+ /* If the above function returned 0 then we're waiting for a circuit.
+ * if it returned 1, we're attached. Both are okay. But if it returned
+ * -1, there was an error, so make sure the connection is marked, and
+ * return -1. */
+ if (rv < 0) {
if (!base_conn->marked_for_close)
connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
return -1;
}
+
return 0;
} else {
- /* it's a hidden-service request */
- rend_cache_entry_t *entry;
- int r;
- rend_service_authorization_t *client_auth;
- rend_data_t *rend_data;
+ /* If we get here, it's a request for a .onion address! */
tor_assert(!automap);
+
+ /* Check whether it's RESOLVE or RESOLVE_PTR. We don't handle those
+ * for hidden service addresses. */
if (SOCKS_COMMAND_IS_RESOLVE(socks->command)) {
/* if it's a resolve request, fail it right now, rather than
* building all the circuits and then realizing it won't work. */
@@ -1308,6 +1484,8 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
+ /* If we were passed a circuit, then we need to fail. .onion addresses
+ * only work when we launch our own circuits for now. */
if (circ) {
log_warn(LD_CONTROL, "Attachstream to a circuit is not "
"supported for .onion addresses currently. Failing.");
@@ -1315,15 +1493,22 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
return -1;
}
- ENTRY_TO_EDGE_CONN(conn)->rend_data = rend_data =
+ /* Fill in the rend_data field so we can start doing a connection to
+ * a hidden service. */
+ rend_data_t *rend_data = ENTRY_TO_EDGE_CONN(conn)->rend_data =
tor_malloc_zero(sizeof(rend_data_t));
strlcpy(rend_data->onion_address, socks->address,
sizeof(rend_data->onion_address));
log_info(LD_REND,"Got a hidden service request for ID '%s'",
safe_str_client(rend_data->onion_address));
- /* see if we already have it cached */
- r = rend_cache_lookup_entry(rend_data->onion_address, -1, &entry);
- if (r<0) {
+
+ /* see if we already have a hidden service descriptor cached for this
+ * address. */
+ rend_cache_entry_t *entry = NULL;
+ const int rend_cache_lookup_result =
+ rend_cache_lookup_entry(rend_data->onion_address, -1, &entry);
+ if (rend_cache_lookup_result < 0) {
+ /* We should already have rejected this address! */
log_warn(LD_BUG,"Invalid service name '%s'",
safe_str_client(rend_data->onion_address));
connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
@@ -1334,8 +1519,10 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
* a stable circuit yet, but we know we'll need *something*. */
rep_hist_note_used_internal(now, 0, 1);
- /* Look up if we have client authorization for it. */
- client_auth = rend_client_lookup_service_authorization(
+ /* Look up if we have client authorization configured for this hidden
+ * service. If we do, associate it with the rend_data. */
+ rend_service_authorization_t *client_auth =
+ rend_client_lookup_service_authorization(
rend_data->onion_address);
if (client_auth) {
log_info(LD_REND, "Using previously configured client authorization "
@@ -1344,12 +1531,16 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
client_auth->descriptor_cookie, REND_DESC_COOKIE_LEN);
rend_data->auth_type = client_auth->auth_type;
}
- if (r==0) {
+
+ /* Now, we either launch an attempt to connect to the hidden service,
+ * or we launch an attempt to look up its descriptor, depending on
+ * whether we had the descriptor. */
+ if (rend_cache_lookup_result == 0) {
base_conn->state = AP_CONN_STATE_RENDDESC_WAIT;
log_info(LD_REND, "Unknown descriptor %s. Fetching.",
safe_str_client(rend_data->onion_address));
rend_client_refetch_v2_renddesc(rend_data);
- } else { /* r > 0 */
+ } else { /* rend_cache_lookup_result > 0 */
base_conn->state = AP_CONN_STATE_CIRCUIT_WAIT;
log_info(LD_REND, "Descriptor is here. Great.");
if (connection_ap_handshake_attach_circuit(conn) < 0) {
@@ -1360,6 +1551,7 @@ connection_ap_handshake_rewrite_and_attach(entry_connection_t *conn,
}
return 0;
}
+
return 0; /* unreached but keeps the compiler happy */
}
@@ -1400,10 +1592,29 @@ destination_from_socket(entry_connection_t *conn, socks_request_t *req)
struct sockaddr_storage orig_dst;
socklen_t orig_dst_len = sizeof(orig_dst);
tor_addr_t addr;
+ int rv;
#ifdef TRANS_NETFILTER
- if (getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST,
- (struct sockaddr*)&orig_dst, &orig_dst_len) < 0) {
+ switch (ENTRY_TO_CONN(conn)->socket_family) {
+#ifdef TRANS_NETFILTER_IPV4
+ case AF_INET:
+ rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IP, SO_ORIGINAL_DST,
+ (struct sockaddr*)&orig_dst, &orig_dst_len);
+ break;
+#endif
+#ifdef TRANS_NETFILTER_IPV6
+ case AF_INET6:
+ rv = getsockopt(ENTRY_TO_CONN(conn)->s, SOL_IPV6, IP6T_SO_ORIGINAL_DST,
+ (struct sockaddr*)&orig_dst, &orig_dst_len);
+ break;
+#endif
+ default:
+ log_warn(LD_BUG,
+ "Received transparent data from an unsuported socket family %d",
+ ENTRY_TO_CONN(conn)->socket_family);
+ return -1;
+ }
+ if (rv < 0) {
int e = tor_socket_errno(ENTRY_TO_CONN(conn)->s);
log_warn(LD_NET, "getsockopt() failed: %s", tor_socket_strerror(e));
return -1;
@@ -1793,19 +2004,19 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn)
return 0;
/* If only IPv4 is supported, no flags */
- if (ap_conn->ipv4_traffic_ok && !ap_conn->ipv6_traffic_ok)
+ if (ap_conn->entry_cfg.ipv4_traffic && !ap_conn->entry_cfg.ipv6_traffic)
return 0;
if (! cpath_layer ||
! cpath_layer->extend_info)
return 0;
- if (!ap_conn->ipv4_traffic_ok)
+ if (!ap_conn->entry_cfg.ipv4_traffic)
flags |= BEGIN_FLAG_IPV4_NOT_OK;
exitnode = node_get_by_id(cpath_layer->extend_info->identity_digest);
- if (ap_conn->ipv6_traffic_ok && exitnode) {
+ if (ap_conn->entry_cfg.ipv6_traffic && exitnode) {
tor_addr_t a;
tor_addr_make_null(&a, AF_INET6);
if (compare_tor_addr_to_node_policy(&a, ap_conn->socks_request->port,
@@ -1820,7 +2031,7 @@ connection_ap_get_begincell_flags(entry_connection_t *ap_conn)
if (flags == BEGIN_FLAG_IPV6_OK) {
/* When IPv4 and IPv6 are both allowed, consider whether to say we
* prefer IPv6. Otherwise there's no point in declaring a preference */
- if (ap_conn->prefer_ipv6_traffic)
+ if (ap_conn->entry_cfg.prefer_ipv6)
flags |= BEGIN_FLAG_IPV6_PREFERRED;
}
@@ -2057,8 +2268,8 @@ connection_ap_make_link(connection_t *partner,
/* Populate isolation fields. */
conn->socks_request->listener_type = CONN_TYPE_DIR_LISTENER;
conn->original_dest_address = tor_strdup(address);
- conn->session_group = session_group;
- conn->isolation_flags = isolation_flags;
+ conn->entry_cfg.session_group = session_group;
+ conn->entry_cfg.isolation_flags = isolation_flags;
base_conn->address = tor_strdup("(Tor_internal)");
tor_addr_make_unspec(&base_conn->addr);
@@ -2461,7 +2672,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
relay_header_unpack(&rh, cell->payload);
if (rh.length > RELAY_PAYLOAD_SIZE)
- return -1;
+ return -END_CIRC_REASON_TORPROTOCOL;
/* Note: we have to use relay_send_command_from_edge here, not
* connection_edge_end or connection_edge_send_command, since those require
@@ -2479,7 +2690,7 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
r = begin_cell_parse(cell, &bcell, &end_reason);
if (r < -1) {
- return -1;
+ return -END_CIRC_REASON_TORPROTOCOL;
} else if (r == -1) {
tor_free(bcell.address);
relay_send_end_cell_from_edge(rh.stream_id, circ, end_reason, NULL);
@@ -2577,15 +2788,31 @@ connection_exit_begin_conn(cell_t *cell, circuit_t *circ)
n_stream->rend_data = rend_data_dup(origin_circ->rend_data);
tor_assert(connection_edge_is_rendezvous_stream(n_stream));
assert_circuit_ok(circ);
- if (rend_service_set_connection_addr_port(n_stream, origin_circ) < 0) {
+
+ const int r = rend_service_set_connection_addr_port(n_stream, origin_circ);
+ if (r < 0) {
log_info(LD_REND,"Didn't find rendezvous service (port %d)",
n_stream->base_.port);
+ /* Send back reason DONE because we want to make hidden service port
+ * scanning harder thus instead of returning that the exit policy
+ * didn't match, which makes it obvious that the port is closed,
+ * return DONE and kill the circuit. That way, a user (malicious or
+ * not) needs one circuit per bad port unless it matches the policy of
+ * the hidden service. */
relay_send_end_cell_from_edge(rh.stream_id, circ,
- END_STREAM_REASON_EXITPOLICY,
+ END_STREAM_REASON_DONE,
origin_circ->cpath->prev);
connection_free(TO_CONN(n_stream));
tor_free(address);
- return 0;
+
+ /* Drop the circuit here since it might be someone deliberately
+ * scanning the hidden service ports. Note that this mitigates port
+ * scanning by adding more work on the attacker side to successfully
+ * scan but does not fully solve it. */
+ if (r < -1)
+ return END_CIRC_AT_ORIGIN;
+ else
+ return 0;
}
assert_circuit_ok(circ);
log_debug(LD_REND,"Finished assigning addr/port");
@@ -2713,7 +2940,7 @@ connection_exit_connect(edge_connection_t *edge_conn)
const tor_addr_t *addr;
uint16_t port;
connection_t *conn = TO_CONN(edge_conn);
- int socket_error = 0;
+ int socket_error = 0, result;
if ( (!connection_edge_is_rendezvous_stream(edge_conn) &&
router_compare_to_my_exit_policy(&edge_conn->base_.addr,
@@ -2728,14 +2955,36 @@ connection_exit_connect(edge_connection_t *edge_conn)
return;
}
- addr = &conn->addr;
- port = conn->port;
+#ifdef HAVE_SYS_UN_H
+ if (conn->socket_family != AF_UNIX) {
+#else
+ {
+#endif /* defined(HAVE_SYS_UN_H) */
+ addr = &conn->addr;
+ port = conn->port;
+
+ if (tor_addr_family(addr) == AF_INET6)
+ conn->socket_family = AF_INET6;
+
+ log_debug(LD_EXIT, "about to try connecting");
+ result = connection_connect(conn, conn->address,
+ addr, port, &socket_error);
+#ifdef HAVE_SYS_UN_H
+ } else {
+ /*
+ * In the AF_UNIX case, we expect to have already had conn->port = 1,
+ * tor_addr_make_unspec(conn->addr) (cf. the way we mark in the incoming
+ * case in connection_handle_listener_read()), and conn->address should
+ * have the socket path to connect to.
+ */
+ tor_assert(conn->address && strlen(conn->address) > 0);
- if (tor_addr_family(addr) == AF_INET6)
- conn->socket_family = AF_INET6;
+ log_debug(LD_EXIT, "about to try connecting");
+ result = connection_connect_unix(conn, conn->address, &socket_error);
+#endif /* defined(HAVE_SYS_UN_H) */
+ }
- log_debug(LD_EXIT,"about to try connecting");
- switch (connection_connect(conn, conn->address, addr, port, &socket_error)) {
+ switch (result) {
case -1: {
int reason = errno_to_stream_end_reason(socket_error);
connection_edge_end(edge_conn, reason);
@@ -2903,10 +3152,10 @@ connection_ap_can_use_exit(const entry_connection_t *conn, const node_t *exit)
addr_policy_result_t r;
if (0 == tor_addr_parse(&addr, conn->socks_request->address)) {
addrp = &addr;
- } else if (!conn->ipv4_traffic_ok && conn->ipv6_traffic_ok) {
+ } else if (!conn->entry_cfg.ipv4_traffic && conn->entry_cfg.ipv6_traffic) {
tor_addr_make_null(&addr, AF_INET6);
addrp = &addr;
- } else if (conn->ipv4_traffic_ok && !conn->ipv6_traffic_ok) {
+ } else if (conn->entry_cfg.ipv4_traffic && !conn->entry_cfg.ipv6_traffic) {
tor_addr_make_null(&addr, AF_INET);
addrp = &addr;
}
@@ -3012,7 +3261,7 @@ int
connection_edge_compatible_with_circuit(const entry_connection_t *conn,
const origin_circuit_t *circ)
{
- const uint8_t iso = conn->isolation_flags;
+ const uint8_t iso = conn->entry_cfg.isolation_flags;
const socks_request_t *sr = conn->socks_request;
/* If circ has never been used for an isolated connection, we can
@@ -3061,7 +3310,8 @@ connection_edge_compatible_with_circuit(const entry_connection_t *conn,
if ((iso & ISO_CLIENTADDR) &&
!tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr))
return 0;
- if ((iso & ISO_SESSIONGRP) && conn->session_group != circ->session_group)
+ if ((iso & ISO_SESSIONGRP) &&
+ conn->entry_cfg.session_group != circ->session_group)
return 0;
if ((iso & ISO_NYM_EPOCH) && conn->nym_epoch != circ->nym_epoch)
return 0;
@@ -3100,7 +3350,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn,
circ->client_proto_type = conn->socks_request->listener_type;
circ->client_proto_socksver = conn->socks_request->socks_version;
tor_addr_copy(&circ->client_addr, &ENTRY_TO_CONN(conn)->addr);
- circ->session_group = conn->session_group;
+ circ->session_group = conn->entry_cfg.session_group;
circ->nym_epoch = conn->nym_epoch;
circ->socks_username = sr->username ?
tor_memdup(sr->username, sr->usernamelen) : NULL;
@@ -3127,7 +3377,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn,
mixed |= ISO_CLIENTPROTO;
if (!tor_addr_eq(&ENTRY_TO_CONN(conn)->addr, &circ->client_addr))
mixed |= ISO_CLIENTADDR;
- if (conn->session_group != circ->session_group)
+ if (conn->entry_cfg.session_group != circ->session_group)
mixed |= ISO_SESSIONGRP;
if (conn->nym_epoch != circ->nym_epoch)
mixed |= ISO_NYM_EPOCH;
@@ -3135,7 +3385,7 @@ connection_edge_update_circuit_isolation(const entry_connection_t *conn,
if (dry_run)
return mixed;
- if ((mixed & conn->isolation_flags) != 0) {
+ if ((mixed & conn->entry_cfg.isolation_flags) != 0) {
log_warn(LD_BUG, "Updating a circuit with seemingly incompatible "
"isolation flags.");
}
diff --git a/src/or/connection_edge.h b/src/or/connection_edge.h
index 5071086a41..7c0b9c0767 100644
--- a/src/or/connection_edge.h
+++ b/src/or/connection_edge.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -143,6 +143,30 @@ STATIC int begin_cell_parse(const cell_t *cell, begin_cell_t *bcell,
STATIC int connected_cell_format_payload(uint8_t *payload_out,
const tor_addr_t *addr,
uint32_t ttl);
+
+typedef struct {
+ /** Original address, after we lowercased it but before we started
+ * mapping it.
+ */
+ char orig_address[MAX_SOCKS_ADDR_LEN];
+ /** True iff the address has been automatically remapped to a local
+ * address in VirtualAddrNetwork. (Only set true when we do a resolve
+ * and get a virtual address; not when we connect to the address.) */
+ int automap;
+ /** If this connection has a .exit address, who put it there? */
+ addressmap_entry_source_t exit_source;
+ /** If we've rewritten the address, when does this map expire? */
+ time_t map_expires;
+ /** If we should close the connection, this is the end_reason to pass
+ * to connection_mark_unattached_ap */
+ int end_reason;
+ /** True iff we should close the connection, either because of error or
+ * because of successful early RESOLVED reply. */
+ int should_close;
+} rewrite_result_t;
+
+STATIC void connection_ap_handshake_rewrite(entry_connection_t *conn,
+ rewrite_result_t *out);
#endif
#endif
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index 29b88041b7..85462d899d 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -38,6 +38,8 @@
#include "router.h"
#include "routerlist.h"
#include "ext_orport.h"
+#include "scheduler.h"
+
#ifdef USE_BUFFEREVENTS
#include <event2/bufferevent_ssl.h>
#endif
@@ -574,48 +576,51 @@ connection_or_process_inbuf(or_connection_t *conn)
return ret;
}
-/** When adding cells to an OR connection's outbuf, keep adding until the
- * outbuf is at least this long, or we run out of cells. */
-#define OR_CONN_HIGHWATER (32*1024)
-
-/** Add cells to an OR connection's outbuf whenever the outbuf's data length
- * drops below this size. */
-#define OR_CONN_LOWWATER (16*1024)
-
/** Called whenever we have flushed some data on an or_conn: add more data
* from active circuits. */
int
connection_or_flushed_some(or_connection_t *conn)
{
- size_t datalen, temp;
- ssize_t n, flushed;
- size_t cell_network_size = get_cell_network_size(conn->wide_circ_ids);
+ size_t datalen;
+
+ /* The channel will want to update its estimated queue size */
+ channel_update_xmit_queue_size(TLS_CHAN_TO_BASE(conn->chan));
/* If we're under the low water mark, add cells until we're just over the
* high water mark. */
datalen = connection_get_outbuf_len(TO_CONN(conn));
if (datalen < OR_CONN_LOWWATER) {
- while ((conn->chan) && channel_tls_more_to_flush(conn->chan)) {
- /* Compute how many more cells we want at most */
- n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size);
- /* Bail out if we don't want any more */
- if (n <= 0) break;
- /* We're still here; try to flush some more cells */
- flushed = channel_tls_flush_some_cells(conn->chan, n);
- /* Bail out if it says it didn't flush anything */
- if (flushed <= 0) break;
- /* How much in the outbuf now? */
- temp = connection_get_outbuf_len(TO_CONN(conn));
- /* Bail out if we didn't actually increase the outbuf size */
- if (temp <= datalen) break;
- /* Update datalen for the next iteration */
- datalen = temp;
- }
+ /* Let the scheduler know */
+ scheduler_channel_wants_writes(TLS_CHAN_TO_BASE(conn->chan));
}
return 0;
}
+/** This is for channeltls.c to ask how many cells we could accept if
+ * they were available. */
+ssize_t
+connection_or_num_cells_writeable(or_connection_t *conn)
+{
+ size_t datalen, cell_network_size;
+ ssize_t n = 0;
+
+ tor_assert(conn);
+
+ /*
+ * If we're under the high water mark, we're potentially
+ * writeable; note this is different from the calculation above
+ * used to trigger when to start writing after we've stopped.
+ */
+ datalen = connection_get_outbuf_len(TO_CONN(conn));
+ if (datalen < OR_CONN_HIGHWATER) {
+ cell_network_size = get_cell_network_size(conn->wide_circ_ids);
+ n = CEIL_DIV(OR_CONN_HIGHWATER - datalen, cell_network_size);
+ }
+
+ return n;
+}
+
/** Connection <b>conn</b> has finished writing and has no bytes left on
* its outbuf.
*
@@ -1144,9 +1149,7 @@ connection_or_notify_error(or_connection_t *conn,
if (conn->chan) {
chan = TLS_CHAN_TO_BASE(conn->chan);
/* Don't transition if we're already in closing, closed or error */
- if (!(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(chan)) {
channel_close_for_error(chan);
}
}
@@ -1169,10 +1172,10 @@ connection_or_notify_error(or_connection_t *conn,
*
* Return the launched conn, or NULL if it failed.
*/
-or_connection_t *
-connection_or_connect(const tor_addr_t *_addr, uint16_t port,
- const char *id_digest,
- channel_tls_t *chan)
+
+MOCK_IMPL(or_connection_t *,
+connection_or_connect, (const tor_addr_t *_addr, uint16_t port,
+ const char *id_digest, channel_tls_t *chan))
{
or_connection_t *conn;
const or_options_t *options = get_options();
@@ -1305,9 +1308,7 @@ connection_or_close_normally(or_connection_t *orconn, int flush)
if (orconn->chan) {
chan = TLS_CHAN_TO_BASE(orconn->chan);
/* Don't transition if we're already in closing, closed or error */
- if (!(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(chan)) {
channel_close_from_lower_layer(chan);
}
}
@@ -1328,9 +1329,7 @@ connection_or_close_for_error(or_connection_t *orconn, int flush)
if (orconn->chan) {
chan = TLS_CHAN_TO_BASE(orconn->chan);
/* Don't transition if we're already in closing, closed or error */
- if (!(chan->state == CHANNEL_STATE_CLOSING ||
- chan->state == CHANNEL_STATE_CLOSED ||
- chan->state == CHANNEL_STATE_ERROR)) {
+ if (!CHANNEL_CONDEMNED(chan)) {
channel_close_for_error(chan);
}
}
diff --git a/src/or/connection_or.h b/src/or/connection_or.h
index 1ceabdaa4b..fc261c6bac 100644
--- a/src/or/connection_or.h
+++ b/src/or/connection_or.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -24,6 +24,7 @@ void connection_or_set_bad_connections(const char *digest, int force);
void connection_or_block_renegotiation(or_connection_t *conn);
int connection_or_reached_eof(or_connection_t *conn);
int connection_or_process_inbuf(or_connection_t *conn);
+ssize_t connection_or_num_cells_writeable(or_connection_t *conn);
int connection_or_flushed_some(or_connection_t *conn);
int connection_or_finished_flushing(or_connection_t *conn);
int connection_or_finished_connecting(or_connection_t *conn);
@@ -36,9 +37,10 @@ void connection_or_connect_failed(or_connection_t *conn,
int reason, const char *msg);
void connection_or_notify_error(or_connection_t *conn,
int reason, const char *msg);
-or_connection_t *connection_or_connect(const tor_addr_t *addr, uint16_t port,
- const char *id_digest,
- channel_tls_t *chan);
+MOCK_DECL(or_connection_t *,
+ connection_or_connect,
+ (const tor_addr_t *addr, uint16_t port,
+ const char *id_digest, channel_tls_t *chan));
void connection_or_close_normally(or_connection_t *orconn, int flush);
void connection_or_close_for_error(or_connection_t *orconn, int flush);
diff --git a/src/or/control.c b/src/or/control.c
index e3f913177b..e963aeab7f 100644
--- a/src/or/control.c
+++ b/src/or/control.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1263,6 +1263,7 @@ static const struct signal_t signal_table[] = {
{ SIGTERM, "INT" },
{ SIGNEWNYM, "NEWNYM" },
{ SIGCLEARDNSCACHE, "CLEARDNSCACHE"},
+ { SIGHEARTBEAT, "HEARTBEAT"},
{ 0, NULL },
};
@@ -1437,10 +1438,16 @@ getinfo_helper_misc(control_connection_t *conn, const char *question,
(void) conn;
if (!strcmp(question, "version")) {
*answer = tor_strdup(get_version());
+ } else if (!strcmp(question, "bw-event-cache")) {
+ *answer = get_bw_samples();
} else if (!strcmp(question, "config-file")) {
- *answer = tor_strdup(get_torrc_fname(0));
+ const char *a = get_torrc_fname(0);
+ if (a)
+ *answer = tor_strdup(a);
} else if (!strcmp(question, "config-defaults-file")) {
- *answer = tor_strdup(get_torrc_fname(1));
+ const char *a = get_torrc_fname(1);
+ if (a)
+ *answer = tor_strdup(a);
} else if (!strcmp(question, "config-text")) {
*answer = options_dump(get_options(), OPTIONS_DUMP_MINIMAL);
} else if (!strcmp(question, "info/names")) {
@@ -1875,6 +1882,20 @@ circuit_describe_status_for_controller(origin_circuit_t *circ)
smartlist_add_asprintf(descparts, "TIME_CREATED=%s", tbuf);
}
+ // Show username and/or password if available.
+ if (circ->socks_username_len > 0) {
+ char* socks_username_escaped = esc_for_log_len(circ->socks_username,
+ (size_t) circ->socks_username_len);
+ smartlist_add_asprintf(descparts, "SOCKS_USERNAME=%s", socks_username_escaped);
+ tor_free(socks_username_escaped);
+ }
+ if (circ->socks_password_len > 0) {
+ char* socks_password_escaped = esc_for_log_len(circ->socks_password,
+ (size_t) circ->socks_password_len);
+ smartlist_add_asprintf(descparts, "SOCKS_PASSWORD=%s", socks_password_escaped);
+ tor_free(socks_password_escaped);
+ }
+
rv = smartlist_join_strings(descparts, " ", 0, NULL);
SMARTLIST_FOREACH(descparts, char *, cp, tor_free(cp));
@@ -2015,7 +2036,7 @@ getinfo_helper_events(control_connection_t *control_conn,
/* Note that status/ is not a catch-all for events; there's only supposed
* to be a status GETINFO if there's a corresponding STATUS event. */
if (!strcmp(question, "status/circuit-established")) {
- *answer = tor_strdup(can_complete_circuit ? "1" : "0");
+ *answer = tor_strdup(have_completed_a_circuit() ? "1" : "0");
} else if (!strcmp(question, "status/enough-dir-info")) {
*answer = tor_strdup(router_have_minimum_dir_info() ? "1" : "0");
} else if (!strcmp(question, "status/good-server-descriptor") ||
@@ -2112,6 +2133,7 @@ typedef struct getinfo_item_t {
* to answer them. */
static const getinfo_item_t getinfo_items[] = {
ITEM("version", misc, "The current version of Tor."),
+ ITEM("bw-event-cache", misc, "Cached BW events for a short interval."),
ITEM("config-file", misc, "Current location of the \"torrc\" file."),
ITEM("config-defaults-file", misc, "Current location of the defaults file."),
ITEM("config-text", misc,
@@ -2464,6 +2486,14 @@ handle_control_extendcircuit(control_connection_t *conn, uint32_t len,
goto done;
}
+ if (smartlist_len(args) < 2) {
+ connection_printf_to_buf(conn,
+ "512 syntax error: not enough arguments.\r\n");
+ SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
+ smartlist_free(args);
+ goto done;
+ }
+
smartlist_split_string(router_nicknames, smartlist_get(args,1), ",", 0, 0);
SMARTLIST_FOREACH(args, char *, cp, tor_free(cp));
@@ -4146,11 +4176,29 @@ control_event_tb_empty(const char *bucket, uint32_t read_empty_time,
return 0;
}
+/* about 5 minutes worth. */
+#define N_BW_EVENTS_TO_CACHE 300
+/* Index into cached_bw_events to next write. */
+static int next_measurement_idx = 0;
+/* number of entries set in n_measurements */
+static int n_measurements = 0;
+static struct cached_bw_event_s {
+ uint32_t n_read;
+ uint32_t n_written;
+} cached_bw_events[N_BW_EVENTS_TO_CACHE];
+
/** A second or more has elapsed: tell any interested control
* connections how much bandwidth we used. */
int
control_event_bandwidth_used(uint32_t n_read, uint32_t n_written)
{
+ cached_bw_events[next_measurement_idx].n_read = n_read;
+ cached_bw_events[next_measurement_idx].n_written = n_written;
+ if (++next_measurement_idx == N_BW_EVENTS_TO_CACHE)
+ next_measurement_idx = 0;
+ if (n_measurements < N_BW_EVENTS_TO_CACHE)
+ ++n_measurements;
+
if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) {
send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS,
"650 BW %lu %lu\r\n",
@@ -4161,6 +4209,35 @@ control_event_bandwidth_used(uint32_t n_read, uint32_t n_written)
return 0;
}
+STATIC char *
+get_bw_samples(void)
+{
+ int i;
+ int idx = (next_measurement_idx + N_BW_EVENTS_TO_CACHE - n_measurements)
+ % N_BW_EVENTS_TO_CACHE;
+ tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE);
+
+ smartlist_t *elements = smartlist_new();
+
+ for (i = 0; i < n_measurements; ++i) {
+ tor_assert(0 <= idx && idx < N_BW_EVENTS_TO_CACHE);
+ const struct cached_bw_event_s *bwe = &cached_bw_events[idx];
+
+ smartlist_add_asprintf(elements, "%u,%u",
+ (unsigned)bwe->n_read,
+ (unsigned)bwe->n_written);
+
+ idx = (idx + 1) % N_BW_EVENTS_TO_CACHE;
+ }
+
+ char *result = smartlist_join_strings(elements, " ", 0, NULL);
+
+ SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp));
+ smartlist_free(elements);
+
+ return result;
+}
+
/** Called when we are sending a log message to the controllers: suspend
* sending further log messages to the controllers until we're done. Used by
* CONN_LOG_PROTECT. */
@@ -4454,6 +4531,9 @@ control_event_signal(uintptr_t signal)
case SIGCLEARDNSCACHE:
signal_string = "CLEARDNSCACHE";
break;
+ case SIGHEARTBEAT:
+ signal_string = "HEARTBEAT";
+ break;
default:
log_warn(LD_BUG, "Unrecognized signal %lu in control_event_signal",
(unsigned long)signal);
@@ -4803,23 +4883,43 @@ bootstrap_status_to_string(bootstrap_status_t s, const char **tag,
break;
case BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS:
*tag = "requesting_descriptors";
- *summary = "Asking for relay descriptors";
+ /* XXXX this appears to incorrectly report internal on most loads */
+ *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ?
+ "Asking for relay descriptors for internal paths" :
+ "Asking for relay descriptors";
break;
+ /* If we're sure there are no exits in the consensus,
+ * inform the controller by adding "internal"
+ * to the status summaries.
+ * (We only check this while loading descriptors,
+ * so we may not know in the earlier stages.)
+ * But if there are exits, we can't be sure whether
+ * we're creating internal or exit paths/circuits.
+ * XXXX Or should be use different tags or statuses
+ * for internal and exit/all? */
case BOOTSTRAP_STATUS_LOADING_DESCRIPTORS:
*tag = "loading_descriptors";
- *summary = "Loading relay descriptors";
+ *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ?
+ "Loading relay descriptors for internal paths" :
+ "Loading relay descriptors";
break;
case BOOTSTRAP_STATUS_CONN_OR:
*tag = "conn_or";
- *summary = "Connecting to the Tor network";
+ *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ?
+ "Connecting to the Tor network internally" :
+ "Connecting to the Tor network";
break;
case BOOTSTRAP_STATUS_HANDSHAKE_OR:
*tag = "handshake_or";
- *summary = "Finishing handshake with first hop";
+ *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ?
+ "Finishing handshake with first hop of internal circuit" :
+ "Finishing handshake with first hop";
break;
case BOOTSTRAP_STATUS_CIRCUIT_CREATE:
*tag = "circuit_create";
- *summary = "Establishing a Tor circuit";
+ *summary = router_have_consensus_path() == CONSENSUS_PATH_INTERNAL ?
+ "Establishing an internal Tor circuit" :
+ "Establishing a Tor circuit";
break;
case BOOTSTRAP_STATUS_DONE:
*tag = "done";
@@ -5096,20 +5196,30 @@ control_event_hs_descriptor_requested(const rend_data_t *rend_query,
void
control_event_hs_descriptor_receive_end(const char *action,
const rend_data_t *rend_query,
- const char *id_digest)
+ const char *id_digest,
+ const char *reason)
{
+ char *reason_field = NULL;
+
if (!action || !rend_query || !id_digest) {
log_warn(LD_BUG, "Called with action==%p, rend_query==%p, "
"id_digest==%p", action, rend_query, id_digest);
return;
}
+ if (reason) {
+ tor_asprintf(&reason_field, " REASON=%s", reason);
+ }
+
send_control_event(EVENT_HS_DESC, ALL_FORMATS,
- "650 HS_DESC %s %s %s %s\r\n",
+ "650 HS_DESC %s %s %s %s%s\r\n",
action,
rend_query->onion_address,
rend_auth_type_to_string(rend_query->auth_type),
- node_describe_longname_by_id(id_digest));
+ node_describe_longname_by_id(id_digest),
+ reason_field ? reason_field : "");
+
+ tor_free(reason_field);
}
/** send HS_DESC RECEIVED event
@@ -5125,23 +5235,27 @@ control_event_hs_descriptor_received(const rend_data_t *rend_query,
rend_query, id_digest);
return;
}
- control_event_hs_descriptor_receive_end("RECEIVED", rend_query, id_digest);
+ control_event_hs_descriptor_receive_end("RECEIVED", rend_query,
+ id_digest, NULL);
}
-/** send HS_DESC FAILED event
- *
- * called when request for hidden service descriptor returned failure.
+/** Send HS_DESC event to inform controller that query <b>rend_query</b>
+ * failed to retrieve hidden service descriptor identified by
+ * <b>id_digest</b>. If <b>reason</b> is not NULL, add it to REASON=
+ * field.
*/
void
control_event_hs_descriptor_failed(const rend_data_t *rend_query,
- const char *id_digest)
+ const char *id_digest,
+ const char *reason)
{
if (!rend_query || !id_digest) {
log_warn(LD_BUG, "Called with rend_query==%p, id_digest==%p",
rend_query, id_digest);
return;
}
- control_event_hs_descriptor_receive_end("FAILED", rend_query, id_digest);
+ control_event_hs_descriptor_receive_end("FAILED", rend_query,
+ id_digest, reason);
}
/** Free any leftover allocated memory of the control.c subsystem. */
diff --git a/src/or/control.h b/src/or/control.h
index 0c92d5503d..8c9f7bbdc9 100644
--- a/src/or/control.h
+++ b/src/or/control.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -108,11 +108,13 @@ void control_event_hs_descriptor_requested(const rend_data_t *rend_query,
const char *hs_dir);
void control_event_hs_descriptor_receive_end(const char *action,
const rend_data_t *rend_query,
- const char *hs_dir);
+ const char *hs_dir,
+ const char *reason);
void control_event_hs_descriptor_received(const rend_data_t *rend_query,
const char *hs_dir);
void control_event_hs_descriptor_failed(const rend_data_t *rend_query,
- const char *hs_dir);
+ const char *hs_dir,
+ const char *reason);
void control_free_all(void);
@@ -201,6 +203,7 @@ void append_cell_stats_by_command(smartlist_t *event_parts,
const uint64_t *number_to_include);
void format_cell_stats(char **event_string, circuit_t *circ,
cell_stats_t *cell_stats);
+STATIC char *get_bw_samples(void);
#endif
#endif
diff --git a/src/or/cpuworker.c b/src/or/cpuworker.c
index 568d9e42d8..3ddb37a262 100644
--- a/src/or/cpuworker.c
+++ b/src/or/cpuworker.c
@@ -1,88 +1,102 @@
/* Copyright (c) 2003-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
* \file cpuworker.c
- * \brief Implements a farm of 'CPU worker' processes to perform
- * CPU-intensive tasks in another thread or process, to not
- * interrupt the main thread.
+ * \brief Uses the workqueue/threadpool code to farm CPU-intensive activities
+ * out to subprocesses.
*
* Right now, we only use this for processing onionskins.
**/
#include "or.h"
-#include "buffers.h"
#include "channel.h"
-#include "channeltls.h"
#include "circuitbuild.h"
#include "circuitlist.h"
-#include "config.h"
-#include "connection.h"
#include "connection_or.h"
+#include "config.h"
#include "cpuworker.h"
#include "main.h"
#include "onion.h"
#include "rephist.h"
#include "router.h"
+#include "workqueue.h"
-/** The maximum number of cpuworker processes we will keep around. */
-#define MAX_CPUWORKERS 16
-/** The minimum number of cpuworker processes we will keep around. */
-#define MIN_CPUWORKERS 1
-
-/** The tag specifies which circuit this onionskin was from. */
-#define TAG_LEN 12
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
-/** How many cpuworkers we have running right now. */
-static int num_cpuworkers=0;
-/** How many of the running cpuworkers have an assigned task right now. */
-static int num_cpuworkers_busy=0;
-/** We need to spawn new cpuworkers whenever we rotate the onion keys
- * on platforms where execution contexts==processes. This variable stores
- * the last time we got a key rotation event. */
-static time_t last_rotation_time=0;
+static void queue_pending_tasks(void);
-static void cpuworker_main(void *data) ATTR_NORETURN;
-static int spawn_cpuworker(void);
-static void spawn_enough_cpuworkers(void);
-static void process_pending_task(connection_t *cpuworker);
+typedef struct worker_state_s {
+ int generation;
+ server_onion_keys_t *onion_keys;
+} worker_state_t;
-/** Initialize the cpuworker subsystem.
- */
-void
-cpu_init(void)
+static void *
+worker_state_new(void *arg)
{
- cpuworkers_rotate();
+ worker_state_t *ws;
+ (void)arg;
+ ws = tor_malloc_zero(sizeof(worker_state_t));
+ ws->onion_keys = server_onion_keys_new();
+ return ws;
}
-
-/** Called when we're done sending a request to a cpuworker. */
-int
-connection_cpu_finished_flushing(connection_t *conn)
+static void
+worker_state_free(void *arg)
{
- tor_assert(conn);
- tor_assert(conn->type == CONN_TYPE_CPUWORKER);
- return 0;
+ worker_state_t *ws = arg;
+ server_onion_keys_free(ws->onion_keys);
+ tor_free(ws);
}
-/** Pack global_id and circ_id; set *tag to the result. (See note on
- * cpuworker_main for wire format.) */
+static replyqueue_t *replyqueue = NULL;
+static threadpool_t *threadpool = NULL;
+static struct event *reply_event = NULL;
+
+static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT;
+
+static int total_pending_tasks = 0;
+static int max_pending_tasks = 128;
+
static void
-tag_pack(uint8_t *tag, uint64_t chan_id, circid_t circ_id)
+replyqueue_process_cb(evutil_socket_t sock, short events, void *arg)
{
- /*XXXX RETHINK THIS WHOLE MESS !!!! !NM NM NM NM*/
- /*XXXX DOUBLEPLUSTHIS!!!! AS AS AS AS*/
- set_uint64(tag, chan_id);
- set_uint32(tag+8, circ_id);
+ replyqueue_t *rq = arg;
+ (void) sock;
+ (void) events;
+ replyqueue_process(rq);
}
-/** Unpack <b>tag</b> into addr, port, and circ_id.
+/** Initialize the cpuworker subsystem.
*/
-static void
-tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id)
+void
+cpu_init(void)
{
- *chan_id = get_uint64(tag);
- *circ_id = get_uint32(tag+8);
+ if (!replyqueue) {
+ replyqueue = replyqueue_new(0);
+ }
+ if (!reply_event) {
+ reply_event = tor_event_new(tor_libevent_get_base(),
+ replyqueue_get_socket(replyqueue),
+ EV_READ|EV_PERSIST,
+ replyqueue_process_cb,
+ replyqueue);
+ event_add(reply_event, NULL);
+ }
+ if (!threadpool) {
+ threadpool = threadpool_new(get_num_cpus(get_options()),
+ replyqueue,
+ worker_state_new,
+ worker_state_free,
+ NULL);
+ }
+ /* Total voodoo. Can we make this more sensible? */
+ max_pending_tasks = get_num_cpus(get_options()) * 64;
+ crypto_seed_weak_rng(&request_sample_rng);
}
/** Magic numbers to make sure our cpuworker_requests don't grow any
@@ -94,10 +108,6 @@ tag_unpack(const uint8_t *tag, uint64_t *chan_id, circid_t *circ_id)
typedef struct cpuworker_request_t {
/** Magic number; must be CPUWORKER_REQUEST_MAGIC. */
uint32_t magic;
- /** Opaque tag to identify the job */
- uint8_t tag[TAG_LEN];
- /** Task code. Must be one of CPUWORKER_TASK_* */
- uint8_t task;
/** Flag: Are we timing this request? */
unsigned timed : 1;
@@ -114,8 +124,7 @@ typedef struct cpuworker_request_t {
typedef struct cpuworker_reply_t {
/** Magic number; must be CPUWORKER_REPLY_MAGIC. */
uint32_t magic;
- /** Opaque tag to identify the job; matches the request's tag.*/
- uint8_t tag[TAG_LEN];
+
/** True iff we got a successful request. */
uint8_t success;
@@ -142,42 +151,39 @@ typedef struct cpuworker_reply_t {
uint8_t rend_auth_material[DIGEST_LEN];
} cpuworker_reply_t;
-/** Called when the onion key has changed and we need to spawn new
- * cpuworkers. Close all currently idle cpuworkers, and mark the last
- * rotation time as now.
- */
-void
-cpuworkers_rotate(void)
+typedef struct cpuworker_job_u {
+ or_circuit_t *circ;
+ union {
+ cpuworker_request_t request;
+ cpuworker_reply_t reply;
+ } u;
+} cpuworker_job_t;
+
+static int
+update_state_threadfn(void *state_, void *work_)
{
- connection_t *cpuworker;
- while ((cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER,
- CPUWORKER_STATE_IDLE))) {
- connection_mark_for_close(cpuworker);
- --num_cpuworkers;
- }
- last_rotation_time = time(NULL);
- if (server_mode(get_options()))
- spawn_enough_cpuworkers();
+ worker_state_t *state = state_;
+ worker_state_t *update = work_;
+ server_onion_keys_free(state->onion_keys);
+ state->onion_keys = update->onion_keys;
+ update->onion_keys = NULL;
+ ++state->generation;
+ return WQ_RPL_REPLY;
}
-/** If the cpuworker closes the connection,
- * mark it as closed and spawn a new one as needed. */
-int
-connection_cpu_reached_eof(connection_t *conn)
+/** Called when the onion key has changed so update all CPU worker(s) with
+ * new function pointers with which a new state will be generated.
+ */
+void
+cpuworkers_rotate_keyinfo(void)
{
- log_warn(LD_GENERAL,"Read eof. CPU worker died unexpectedly.");
- if (conn->state != CPUWORKER_STATE_IDLE) {
- /* the circ associated with this cpuworker will have to wait until
- * it gets culled in run_connection_housekeeping(), since we have
- * no way to find out which circ it was. */
- log_warn(LD_GENERAL,"...and it left a circuit queued; abandoning circ.");
- num_cpuworkers_busy--;
+ if (threadpool_queue_update(threadpool,
+ worker_state_new,
+ update_state_threadfn,
+ worker_state_free,
+ NULL)) {
+ log_warn(LD_OR, "Failed to queue key update for worker threads.");
}
- num_cpuworkers--;
- spawn_enough_cpuworkers(); /* try to regrow. hope we don't end up
- spinning. */
- connection_mark_for_close(conn);
- return 0;
}
/** Indexed by handshake type: how many onionskins have we processed and
@@ -197,8 +203,6 @@ static uint64_t onionskins_usec_roundtrip[MAX_ONION_HANDSHAKE_TYPE+1];
* time. (microseconds) */
#define MAX_BELIEVABLE_ONIONSKIN_DELAY (2*1000*1000)
-static tor_weak_rng_t request_sample_rng = TOR_WEAK_RNG_INIT;
-
/** Return true iff we'd like to measure a handshake of type
* <b>onionskin_type</b>. Call only from the main thread. */
static int
@@ -286,428 +290,271 @@ cpuworker_log_onionskin_overhead(int severity, int onionskin_type,
onionskin_type_name, (unsigned)overhead, relative_overhead*100);
}
-/** Called when we get data from a cpuworker. If the answer is not complete,
- * wait for a complete answer. If the answer is complete,
- * process it as appropriate.
- */
-int
-connection_cpu_process_inbuf(connection_t *conn)
-{
- uint64_t chan_id;
- circid_t circ_id;
- channel_t *p_chan = NULL;
- circuit_t *circ;
-
- tor_assert(conn);
- tor_assert(conn->type == CONN_TYPE_CPUWORKER);
-
- if (!connection_get_inbuf_len(conn))
- return 0;
-
- if (conn->state == CPUWORKER_STATE_BUSY_ONION) {
- cpuworker_reply_t rpl;
- if (connection_get_inbuf_len(conn) < sizeof(cpuworker_reply_t))
- return 0; /* not yet */
- tor_assert(connection_get_inbuf_len(conn) == sizeof(cpuworker_reply_t));
-
- connection_fetch_from_buf((void*)&rpl,sizeof(cpuworker_reply_t),conn);
-
- tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC);
-
- if (rpl.timed && rpl.success &&
- rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) {
- /* Time how long this request took. The handshake_type check should be
- needless, but let's leave it in to be safe. */
- struct timeval tv_end, tv_diff;
- int64_t usec_roundtrip;
- tor_gettimeofday(&tv_end);
- timersub(&tv_end, &rpl.started_at, &tv_diff);
- usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec;
- if (usec_roundtrip >= 0 &&
- usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) {
- ++onionskins_n_processed[rpl.handshake_type];
- onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec;
- onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip;
- if (onionskins_n_processed[rpl.handshake_type] >= 500000) {
- /* Scale down every 500000 handshakes. On a busy server, that's
- * less impressive than it sounds. */
- onionskins_n_processed[rpl.handshake_type] /= 2;
- onionskins_usec_internal[rpl.handshake_type] /= 2;
- onionskins_usec_roundtrip[rpl.handshake_type] /= 2;
- }
- }
- }
- /* parse out the circ it was talking about */
- tag_unpack(rpl.tag, &chan_id, &circ_id);
- circ = NULL;
- log_debug(LD_OR,
- "Unpacking cpuworker reply, chan_id is " U64_FORMAT
- ", circ_id is %u",
- U64_PRINTF_ARG(chan_id), (unsigned)circ_id);
- p_chan = channel_find_by_global_id(chan_id);
-
- if (p_chan)
- circ = circuit_get_by_circid_channel(circ_id, p_chan);
-
- if (rpl.success == 0) {
- log_debug(LD_OR,
- "decoding onionskin failed. "
- "(Old key or bad software.) Closing.");
- if (circ)
- circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL);
- goto done_processing;
- }
- if (!circ) {
- /* This happens because somebody sends us a destroy cell and the
- * circuit goes away, while the cpuworker is working. This is also
- * why our tag doesn't include a pointer to the circ, because we'd
- * never know if it's still valid.
- */
- log_debug(LD_OR,"processed onion for a circ that's gone. Dropping.");
- goto done_processing;
- }
- tor_assert(! CIRCUIT_IS_ORIGIN(circ));
- if (onionskin_answer(TO_OR_CIRCUIT(circ),
- &rpl.created_cell,
- (const char*)rpl.keys,
- rpl.rend_auth_material) < 0) {
- log_warn(LD_OR,"onionskin_answer failed. Closing.");
- circuit_mark_for_close(circ, END_CIRC_REASON_INTERNAL);
- goto done_processing;
- }
- log_debug(LD_OR,"onionskin_answer succeeded. Yay.");
- } else {
- tor_assert(0); /* don't ask me to do handshakes yet */
- }
-
- done_processing:
- conn->state = CPUWORKER_STATE_IDLE;
- num_cpuworkers_busy--;
- if (conn->timestamp_created < last_rotation_time) {
- connection_mark_for_close(conn);
- num_cpuworkers--;
- spawn_enough_cpuworkers();
- } else {
- process_pending_task(conn);
- }
- return 0;
-}
-
-/** Implement a cpuworker. 'data' is an fdarray as returned by socketpair.
- * Read and writes from fdarray[1]. Reads requests, writes answers.
- *
- * Request format:
- * cpuworker_request_t.
- * Response format:
- * cpuworker_reply_t
- */
+/** Handle a reply from the worker threads. */
static void
-cpuworker_main(void *data)
+cpuworker_onion_handshake_replyfn(void *work_)
{
- /* For talking to the parent thread/process */
- tor_socket_t *fdarray = data;
- tor_socket_t fd;
-
- /* variables for onion processing */
- server_onion_keys_t onion_keys;
- cpuworker_request_t req;
+ cpuworker_job_t *job = work_;
cpuworker_reply_t rpl;
-
- fd = fdarray[1]; /* this side is ours */
- tor_free(data);
-
- setup_server_onion_keys(&onion_keys);
-
- for (;;) {
- if (read_all(fd, (void *)&req, sizeof(req), 1) != sizeof(req)) {
- log_info(LD_OR, "read request failed. Exiting.");
- goto end;
- }
- tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC);
-
- memset(&rpl, 0, sizeof(rpl));
-
- if (req.task == CPUWORKER_TASK_ONION) {
- const create_cell_t *cc = &req.create_cell;
- created_cell_t *cell_out = &rpl.created_cell;
- struct timeval tv_start = {0,0}, tv_end;
- int n;
- rpl.timed = req.timed;
- rpl.started_at = req.started_at;
- rpl.handshake_type = cc->handshake_type;
- if (req.timed)
- tor_gettimeofday(&tv_start);
- n = onion_skin_server_handshake(cc->handshake_type,
- cc->onionskin, cc->handshake_len,
- &onion_keys,
- cell_out->reply,
- rpl.keys, CPATH_KEY_MATERIAL_LEN,
- rpl.rend_auth_material);
- if (n < 0) {
- /* failure */
- log_debug(LD_OR,"onion_skin_server_handshake failed.");
- memset(&rpl, 0, sizeof(rpl));
- memcpy(rpl.tag, req.tag, TAG_LEN);
- rpl.success = 0;
- } else {
- /* success */
- log_debug(LD_OR,"onion_skin_server_handshake succeeded.");
- memcpy(rpl.tag, req.tag, TAG_LEN);
- cell_out->handshake_len = n;
- switch (cc->cell_type) {
- case CELL_CREATE:
- cell_out->cell_type = CELL_CREATED; break;
- case CELL_CREATE2:
- cell_out->cell_type = CELL_CREATED2; break;
- case CELL_CREATE_FAST:
- cell_out->cell_type = CELL_CREATED_FAST; break;
- default:
- tor_assert(0);
- goto end;
- }
- rpl.success = 1;
- }
- rpl.magic = CPUWORKER_REPLY_MAGIC;
- if (req.timed) {
- struct timeval tv_diff;
- int64_t usec;
- tor_gettimeofday(&tv_end);
- timersub(&tv_end, &tv_start, &tv_diff);
- usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec;
- if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY)
- rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY;
- else
- rpl.n_usec = (uint32_t) usec;
+ or_circuit_t *circ = NULL;
+
+ --total_pending_tasks;
+
+ /* Could avoid this, but doesn't matter. */
+ memcpy(&rpl, &job->u.reply, sizeof(rpl));
+
+ tor_assert(rpl.magic == CPUWORKER_REPLY_MAGIC);
+
+ if (rpl.timed && rpl.success &&
+ rpl.handshake_type <= MAX_ONION_HANDSHAKE_TYPE) {
+ /* Time how long this request took. The handshake_type check should be
+ needless, but let's leave it in to be safe. */
+ struct timeval tv_end, tv_diff;
+ int64_t usec_roundtrip;
+ tor_gettimeofday(&tv_end);
+ timersub(&tv_end, &rpl.started_at, &tv_diff);
+ usec_roundtrip = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec;
+ if (usec_roundtrip >= 0 &&
+ usec_roundtrip < MAX_BELIEVABLE_ONIONSKIN_DELAY) {
+ ++onionskins_n_processed[rpl.handshake_type];
+ onionskins_usec_internal[rpl.handshake_type] += rpl.n_usec;
+ onionskins_usec_roundtrip[rpl.handshake_type] += usec_roundtrip;
+ if (onionskins_n_processed[rpl.handshake_type] >= 500000) {
+ /* Scale down every 500000 handshakes. On a busy server, that's
+ * less impressive than it sounds. */
+ onionskins_n_processed[rpl.handshake_type] /= 2;
+ onionskins_usec_internal[rpl.handshake_type] /= 2;
+ onionskins_usec_roundtrip[rpl.handshake_type] /= 2;
}
- if (write_all(fd, (void*)&rpl, sizeof(rpl), 1) != sizeof(rpl)) {
- log_err(LD_BUG,"writing response buf failed. Exiting.");
- goto end;
- }
- log_debug(LD_OR,"finished writing response.");
- } else if (req.task == CPUWORKER_TASK_SHUTDOWN) {
- log_info(LD_OR,"Clean shutdown: exiting");
- goto end;
}
- memwipe(&req, 0, sizeof(req));
- memwipe(&rpl, 0, sizeof(req));
}
- end:
- memwipe(&req, 0, sizeof(req));
- memwipe(&rpl, 0, sizeof(req));
- release_server_onion_keys(&onion_keys);
- tor_close_socket(fd);
- crypto_thread_cleanup();
- spawn_exit();
-}
-/** Launch a new cpuworker. Return 0 if we're happy, -1 if we failed.
- */
-static int
-spawn_cpuworker(void)
-{
- tor_socket_t *fdarray;
- tor_socket_t fd;
- connection_t *conn;
- int err;
-
- fdarray = tor_calloc(2, sizeof(tor_socket_t));
- if ((err = tor_socketpair(AF_UNIX, SOCK_STREAM, 0, fdarray)) < 0) {
- log_warn(LD_NET, "Couldn't construct socketpair for cpuworker: %s",
- tor_socket_strerror(-err));
- tor_free(fdarray);
- return -1;
- }
+ circ = job->circ;
- tor_assert(SOCKET_OK(fdarray[0]));
- tor_assert(SOCKET_OK(fdarray[1]));
+ log_debug(LD_OR,
+ "Unpacking cpuworker reply %p, circ=%p, success=%d",
+ job, circ, rpl.success);
- fd = fdarray[0];
- if (spawn_func(cpuworker_main, (void*)fdarray) < 0) {
- tor_close_socket(fdarray[0]);
- tor_close_socket(fdarray[1]);
- tor_free(fdarray);
- return -1;
+ if (circ->base_.magic == DEAD_CIRCUIT_MAGIC) {
+ /* The circuit was supposed to get freed while the reply was
+ * pending. Instead, it got left for us to free so that we wouldn't freak
+ * out when the job->circ field wound up pointing to nothing. */
+ log_debug(LD_OR, "Circuit died while reply was pending. Freeing memory.");
+ circ->base_.magic = 0;
+ tor_free(circ);
+ goto done_processing;
}
- log_debug(LD_OR,"just spawned a cpu worker.");
- conn = connection_new(CONN_TYPE_CPUWORKER, AF_UNIX);
+ circ->workqueue_entry = NULL;
- /* set up conn so it's got all the data we need to remember */
- conn->s = fd;
- conn->address = tor_strdup("localhost");
- tor_addr_make_unspec(&conn->addr);
-
- if (set_socket_nonblocking(fd) == -1) {
- connection_free(conn); /* this closes fd */
- return -1;
+ if (TO_CIRCUIT(circ)->marked_for_close) {
+ /* We already marked this circuit; we can't call it open. */
+ log_debug(LD_OR,"circuit is already marked.");
+ goto done_processing;
}
- if (connection_add(conn) < 0) { /* no space, forget it */
- log_warn(LD_NET,"connection_add for cpuworker failed. Giving up.");
- connection_free(conn); /* this closes fd */
- return -1;
+ if (rpl.success == 0) {
+ log_debug(LD_OR,
+ "decoding onionskin failed. "
+ "(Old key or bad software.) Closing.");
+ if (circ)
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_TORPROTOCOL);
+ goto done_processing;
}
- conn->state = CPUWORKER_STATE_IDLE;
- connection_start_reading(conn);
+ if (onionskin_answer(circ,
+ &rpl.created_cell,
+ (const char*)rpl.keys,
+ rpl.rend_auth_material) < 0) {
+ log_warn(LD_OR,"onionskin_answer failed. Closing.");
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
+ goto done_processing;
+ }
+ log_debug(LD_OR,"onionskin_answer succeeded. Yay.");
- return 0; /* success */
+ done_processing:
+ memwipe(&rpl, 0, sizeof(rpl));
+ memwipe(job, 0, sizeof(*job));
+ tor_free(job);
+ queue_pending_tasks();
}
-/** If we have too few or too many active cpuworkers, try to spawn new ones
- * or kill idle ones.
- */
-static void
-spawn_enough_cpuworkers(void)
+/** Implementation function for onion handshake requests. */
+static int
+cpuworker_onion_handshake_threadfn(void *state_, void *work_)
{
- int num_cpuworkers_needed = get_num_cpus(get_options());
- int reseed = 0;
+ worker_state_t *state = state_;
+ cpuworker_job_t *job = work_;
- if (num_cpuworkers_needed < MIN_CPUWORKERS)
- num_cpuworkers_needed = MIN_CPUWORKERS;
- if (num_cpuworkers_needed > MAX_CPUWORKERS)
- num_cpuworkers_needed = MAX_CPUWORKERS;
+ /* variables for onion processing */
+ server_onion_keys_t *onion_keys = state->onion_keys;
+ cpuworker_request_t req;
+ cpuworker_reply_t rpl;
- while (num_cpuworkers < num_cpuworkers_needed) {
- if (spawn_cpuworker() < 0) {
- log_warn(LD_GENERAL,"Cpuworker spawn failed. Will try again later.");
- return;
+ memcpy(&req, &job->u.request, sizeof(req));
+
+ tor_assert(req.magic == CPUWORKER_REQUEST_MAGIC);
+ memset(&rpl, 0, sizeof(rpl));
+
+ const create_cell_t *cc = &req.create_cell;
+ created_cell_t *cell_out = &rpl.created_cell;
+ struct timeval tv_start = {0,0}, tv_end;
+ int n;
+ rpl.timed = req.timed;
+ rpl.started_at = req.started_at;
+ rpl.handshake_type = cc->handshake_type;
+ if (req.timed)
+ tor_gettimeofday(&tv_start);
+ n = onion_skin_server_handshake(cc->handshake_type,
+ cc->onionskin, cc->handshake_len,
+ onion_keys,
+ cell_out->reply,
+ rpl.keys, CPATH_KEY_MATERIAL_LEN,
+ rpl.rend_auth_material);
+ if (n < 0) {
+ /* failure */
+ log_debug(LD_OR,"onion_skin_server_handshake failed.");
+ memset(&rpl, 0, sizeof(rpl));
+ rpl.success = 0;
+ } else {
+ /* success */
+ log_debug(LD_OR,"onion_skin_server_handshake succeeded.");
+ cell_out->handshake_len = n;
+ switch (cc->cell_type) {
+ case CELL_CREATE:
+ cell_out->cell_type = CELL_CREATED; break;
+ case CELL_CREATE2:
+ cell_out->cell_type = CELL_CREATED2; break;
+ case CELL_CREATE_FAST:
+ cell_out->cell_type = CELL_CREATED_FAST; break;
+ default:
+ tor_assert(0);
+ return WQ_RPL_SHUTDOWN;
}
- num_cpuworkers++;
- reseed++;
+ rpl.success = 1;
}
+ rpl.magic = CPUWORKER_REPLY_MAGIC;
+ if (req.timed) {
+ struct timeval tv_diff;
+ int64_t usec;
+ tor_gettimeofday(&tv_end);
+ timersub(&tv_end, &tv_start, &tv_diff);
+ usec = ((int64_t)tv_diff.tv_sec)*1000000 + tv_diff.tv_usec;
+ if (usec < 0 || usec > MAX_BELIEVABLE_ONIONSKIN_DELAY)
+ rpl.n_usec = MAX_BELIEVABLE_ONIONSKIN_DELAY;
+ else
+ rpl.n_usec = (uint32_t) usec;
+ }
+
+ memcpy(&job->u.reply, &rpl, sizeof(rpl));
- if (reseed)
- crypto_seed_weak_rng(&request_sample_rng);
+ memwipe(&req, 0, sizeof(req));
+ memwipe(&rpl, 0, sizeof(req));
+ return WQ_RPL_REPLY;
}
-/** Take a pending task from the queue and assign it to 'cpuworker'. */
+/** Take pending tasks from the queue and assign them to cpuworkers. */
static void
-process_pending_task(connection_t *cpuworker)
+queue_pending_tasks(void)
{
or_circuit_t *circ;
create_cell_t *onionskin = NULL;
- tor_assert(cpuworker);
+ while (total_pending_tasks < max_pending_tasks) {
+ circ = onion_next_task(&onionskin);
- /* for now only process onion tasks */
-
- circ = onion_next_task(&onionskin);
- if (!circ)
- return;
- if (assign_onionskin_to_cpuworker(cpuworker, circ, onionskin))
- log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring.");
-}
-
-/** How long should we let a cpuworker stay busy before we give
- * up on it and decide that we have a bug or infinite loop?
- * This value is high because some servers with low memory/cpu
- * sometimes spend an hour or more swapping, and Tor starves. */
-#define CPUWORKER_BUSY_TIMEOUT (60*60*12)
+ if (!circ)
+ return;
-/** We have a bug that I can't find. Sometimes, very rarely, cpuworkers get
- * stuck in the 'busy' state, even though the cpuworker process thinks of
- * itself as idle. I don't know why. But here's a workaround to kill any
- * cpuworker that's been busy for more than CPUWORKER_BUSY_TIMEOUT.
- */
-static void
-cull_wedged_cpuworkers(void)
-{
- time_t now = time(NULL);
- smartlist_t *conns = get_connection_array();
- SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
- if (!conn->marked_for_close &&
- conn->type == CONN_TYPE_CPUWORKER &&
- conn->state == CPUWORKER_STATE_BUSY_ONION &&
- conn->timestamp_lastwritten + CPUWORKER_BUSY_TIMEOUT < now) {
- log_notice(LD_BUG,
- "closing wedged cpuworker. Can somebody find the bug?");
- num_cpuworkers_busy--;
- num_cpuworkers--;
- connection_mark_for_close(conn);
- }
- } SMARTLIST_FOREACH_END(conn);
+ if (assign_onionskin_to_cpuworker(circ, onionskin))
+ log_warn(LD_OR,"assign_to_cpuworker failed. Ignoring.");
+ }
}
/** Try to tell a cpuworker to perform the public key operations necessary to
* respond to <b>onionskin</b> for the circuit <b>circ</b>.
*
- * If <b>cpuworker</b> is defined, assert that he's idle, and use him. Else,
- * look for an idle cpuworker and use him. If none idle, queue task onto the
- * pending onion list and return. Return 0 if we successfully assign the
- * task, or -1 on failure.
+ * Return 0 if we successfully assign the task, or -1 on failure.
*/
int
-assign_onionskin_to_cpuworker(connection_t *cpuworker,
- or_circuit_t *circ,
+assign_onionskin_to_cpuworker(or_circuit_t *circ,
create_cell_t *onionskin)
{
+ workqueue_entry_t *queue_entry;
+ cpuworker_job_t *job;
cpuworker_request_t req;
- time_t now = approx_time();
- static time_t last_culled_cpuworkers = 0;
int should_time;
- /* Checking for wedged cpuworkers requires a linear search over all
- * connections, so let's do it only once a minute.
- */
-#define CULL_CPUWORKERS_INTERVAL 60
-
- if (last_culled_cpuworkers + CULL_CPUWORKERS_INTERVAL <= now) {
- cull_wedged_cpuworkers();
- spawn_enough_cpuworkers();
- last_culled_cpuworkers = now;
+ if (!circ->p_chan) {
+ log_info(LD_OR,"circ->p_chan gone. Failing circ.");
+ tor_free(onionskin);
+ return -1;
}
- if (1) {
- if (num_cpuworkers_busy == num_cpuworkers) {
- log_debug(LD_OR,"No idle cpuworkers. Queuing.");
- if (onion_pending_add(circ, onionskin) < 0) {
- tor_free(onionskin);
- return -1;
- }
- return 0;
- }
-
- if (!cpuworker)
- cpuworker = connection_get_by_type_state(CONN_TYPE_CPUWORKER,
- CPUWORKER_STATE_IDLE);
-
- tor_assert(cpuworker);
-
- if (!circ->p_chan) {
- log_info(LD_OR,"circ->p_chan gone. Failing circ.");
+ if (total_pending_tasks >= max_pending_tasks) {
+ log_debug(LD_OR,"No idle cpuworkers. Queuing.");
+ if (onion_pending_add(circ, onionskin) < 0) {
tor_free(onionskin);
return -1;
}
+ return 0;
+ }
- if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest))
- rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type);
+ if (connection_or_digest_is_known_relay(circ->p_chan->identity_digest))
+ rep_hist_note_circuit_handshake_assigned(onionskin->handshake_type);
- should_time = should_time_request(onionskin->handshake_type);
- memset(&req, 0, sizeof(req));
- req.magic = CPUWORKER_REQUEST_MAGIC;
- tag_pack(req.tag, circ->p_chan->global_identifier,
- circ->p_circ_id);
- req.timed = should_time;
+ should_time = should_time_request(onionskin->handshake_type);
+ memset(&req, 0, sizeof(req));
+ req.magic = CPUWORKER_REQUEST_MAGIC;
+ req.timed = should_time;
- cpuworker->state = CPUWORKER_STATE_BUSY_ONION;
- /* touch the lastwritten timestamp, since that's how we check to
- * see how long it's been since we asked the question, and sometimes
- * we check before the first call to connection_handle_write(). */
- cpuworker->timestamp_lastwritten = now;
- num_cpuworkers_busy++;
+ memcpy(&req.create_cell, onionskin, sizeof(create_cell_t));
- req.task = CPUWORKER_TASK_ONION;
- memcpy(&req.create_cell, onionskin, sizeof(create_cell_t));
+ tor_free(onionskin);
- tor_free(onionskin);
+ if (should_time)
+ tor_gettimeofday(&req.started_at);
- if (should_time)
- tor_gettimeofday(&req.started_at);
+ job = tor_malloc_zero(sizeof(cpuworker_job_t));
+ job->circ = circ;
+ memcpy(&job->u.request, &req, sizeof(req));
+ memwipe(&req, 0, sizeof(req));
- connection_write_to_buf((void*)&req, sizeof(req), cpuworker);
- memwipe(&req, 0, sizeof(req));
+ ++total_pending_tasks;
+ queue_entry = threadpool_queue_work(threadpool,
+ cpuworker_onion_handshake_threadfn,
+ cpuworker_onion_handshake_replyfn,
+ job);
+ if (!queue_entry) {
+ log_warn(LD_BUG, "Couldn't queue work on threadpool");
+ tor_free(job);
+ return -1;
}
+
+ log_debug(LD_OR, "Queued task %p (qe=%p, circ=%p)",
+ job, queue_entry, job->circ);
+
+ circ->workqueue_entry = queue_entry;
+
return 0;
}
+/** If <b>circ</b> has a pending handshake that hasn't been processed yet,
+ * remove it from the worker queue. */
+void
+cpuworker_cancel_circ_handshake(or_circuit_t *circ)
+{
+ cpuworker_job_t *job;
+ if (circ->workqueue_entry == NULL)
+ return;
+
+ job = workqueue_entry_cancel(circ->workqueue_entry);
+ if (job) {
+ /* It successfully cancelled. */
+ memwipe(job, 0xe0, sizeof(*job));
+ tor_free(job);
+ }
+
+ circ->workqueue_entry = NULL;
+}
+
diff --git a/src/or/cpuworker.h b/src/or/cpuworker.h
index f7f1d8346b..70a595e472 100644
--- a/src/or/cpuworker.h
+++ b/src/or/cpuworker.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -13,19 +13,17 @@
#define TOR_CPUWORKER_H
void cpu_init(void);
-void cpuworkers_rotate(void);
-int connection_cpu_finished_flushing(connection_t *conn);
-int connection_cpu_reached_eof(connection_t *conn);
-int connection_cpu_process_inbuf(connection_t *conn);
+void cpuworkers_rotate_keyinfo(void);
+
struct create_cell_t;
-int assign_onionskin_to_cpuworker(connection_t *cpuworker,
- or_circuit_t *circ,
+int assign_onionskin_to_cpuworker(or_circuit_t *circ,
struct create_cell_t *onionskin);
uint64_t estimated_usec_for_onionskins(uint32_t n_requests,
uint16_t onionskin_type);
void cpuworker_log_onionskin_overhead(int severity, int onionskin_type,
const char *onionskin_type_name);
+void cpuworker_cancel_circ_handshake(or_circuit_t *circ);
#endif
diff --git a/src/or/directory.c b/src/or/directory.c
index df9e7f8ad3..d2b6b86f6d 100644
--- a/src/or/directory.c
+++ b/src/or/directory.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -20,6 +20,7 @@
#include "networkstatus.h"
#include "nodelist.h"
#include "policies.h"
+#include "relay.h"
#include "rendclient.h"
#include "rendcommon.h"
#include "rephist.h"
@@ -63,8 +64,6 @@ static void directory_send_command(dir_connection_t *conn,
time_t if_modified_since);
static int directory_handle_command(dir_connection_t *conn);
static int body_is_plausible(const char *body, size_t body_len, int purpose);
-static int purpose_needs_anonymity(uint8_t dir_purpose,
- uint8_t router_purpose);
static char *http_get_header(const char *headers, const char *which);
static void http_set_address_origin(const char *headers, connection_t *conn);
static void connection_dir_download_routerdesc_failed(dir_connection_t *conn);
@@ -119,7 +118,7 @@ static void directory_initiate_command_rend(const tor_addr_t *addr,
/** Return true iff the directory purpose <b>dir_purpose</b> (and if it's
* fetching descriptors, it's fetching them for <b>router_purpose</b>)
* must use an anonymous connection to a directory. */
-static int
+STATIC int
purpose_needs_anonymity(uint8_t dir_purpose, uint8_t router_purpose)
{
if (get_options()->AllDirActionsPrivate)
@@ -197,6 +196,46 @@ dir_conn_purpose_to_string(int purpose)
return "(unknown)";
}
+/** Return the requisite directory information types. */
+STATIC dirinfo_type_t
+dir_fetch_type(int dir_purpose, int router_purpose, const char *resource)
+{
+ dirinfo_type_t type;
+ switch (dir_purpose) {
+ case DIR_PURPOSE_FETCH_EXTRAINFO:
+ type = EXTRAINFO_DIRINFO;
+ if (router_purpose == ROUTER_PURPOSE_BRIDGE)
+ type |= BRIDGE_DIRINFO;
+ else
+ type |= V3_DIRINFO;
+ break;
+ case DIR_PURPOSE_FETCH_SERVERDESC:
+ if (router_purpose == ROUTER_PURPOSE_BRIDGE)
+ type = BRIDGE_DIRINFO;
+ else
+ type = V3_DIRINFO;
+ break;
+ case DIR_PURPOSE_FETCH_STATUS_VOTE:
+ case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
+ case DIR_PURPOSE_FETCH_CERTIFICATE:
+ type = V3_DIRINFO;
+ break;
+ case DIR_PURPOSE_FETCH_CONSENSUS:
+ type = V3_DIRINFO;
+ if (resource && !strcmp(resource, "microdesc"))
+ type |= MICRODESC_DIRINFO;
+ break;
+ case DIR_PURPOSE_FETCH_MICRODESC:
+ type = MICRODESC_DIRINFO;
+ break;
+ default:
+ log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose);
+ type = NO_DIRINFO;
+ break;
+ }
+ return type;
+}
+
/** Return true iff <b>identity_digest</b> is the digest of a router which
* says that it caches extrainfos. (If <b>is_authority</b> we always
* believe that to be true.) */
@@ -385,47 +424,21 @@ directory_pick_generic_dirserver(dirinfo_type_t type, int pds_flags,
* Use <b>pds_flags</b> as arguments to router_pick_directory_server()
* or router_pick_trusteddirserver().
*/
-void
-directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
- const char *resource, int pds_flags)
+MOCK_IMPL(void, directory_get_from_dirserver, (uint8_t dir_purpose,
+ uint8_t router_purpose,
+ const char *resource,
+ int pds_flags))
{
const routerstatus_t *rs = NULL;
const or_options_t *options = get_options();
int prefer_authority = directory_fetches_from_authorities(options);
int require_authority = 0;
int get_via_tor = purpose_needs_anonymity(dir_purpose, router_purpose);
- dirinfo_type_t type;
+ dirinfo_type_t type = dir_fetch_type(dir_purpose, router_purpose, resource);
time_t if_modified_since = 0;
- /* FFFF we could break this switch into its own function, and call
- * it elsewhere in directory.c. -RD */
- switch (dir_purpose) {
- case DIR_PURPOSE_FETCH_EXTRAINFO:
- type = EXTRAINFO_DIRINFO |
- (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
- V3_DIRINFO);
- break;
- case DIR_PURPOSE_FETCH_SERVERDESC:
- type = (router_purpose == ROUTER_PURPOSE_BRIDGE ? BRIDGE_DIRINFO :
- V3_DIRINFO);
- break;
- case DIR_PURPOSE_FETCH_STATUS_VOTE:
- case DIR_PURPOSE_FETCH_DETACHED_SIGNATURES:
- case DIR_PURPOSE_FETCH_CERTIFICATE:
- type = V3_DIRINFO;
- break;
- case DIR_PURPOSE_FETCH_CONSENSUS:
- type = V3_DIRINFO;
- if (resource && !strcmp(resource,"microdesc"))
- type |= MICRODESC_DIRINFO;
- break;
- case DIR_PURPOSE_FETCH_MICRODESC:
- type = MICRODESC_DIRINFO;
- break;
- default:
- log_warn(LD_BUG, "Unexpected purpose %d", (int)dir_purpose);
- return;
- }
+ if (type == NO_DIRINFO)
+ return;
if (dir_purpose == DIR_PURPOSE_FETCH_CONSENSUS) {
int flav = FLAV_NS;
@@ -433,18 +446,33 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
if (resource)
flav = networkstatus_parse_flavor_name(resource);
+ /* DEFAULT_IF_MODIFIED_SINCE_DELAY is 1/20 of the default consensus
+ * period of 1 hour.
+ */
+#define DEFAULT_IF_MODIFIED_SINCE_DELAY (180)
if (flav != -1) {
/* IF we have a parsed consensus of this type, we can do an
* if-modified-time based on it. */
v = networkstatus_get_latest_consensus_by_flavor(flav);
- if (v)
- if_modified_since = v->valid_after + 180;
+ if (v) {
+ /* In networks with particularly short V3AuthVotingIntervals,
+ * ask for the consensus if it's been modified since half the
+ * V3AuthVotingInterval of the most recent consensus. */
+ time_t ims_delay = DEFAULT_IF_MODIFIED_SINCE_DELAY;
+ if (v->fresh_until > v->valid_after
+ && ims_delay > (v->fresh_until - v->valid_after)/2) {
+ ims_delay = (v->fresh_until - v->valid_after)/2;
+ }
+ if_modified_since = v->valid_after + ims_delay;
+ }
} else {
/* Otherwise it might be a consensus we don't parse, but which we
* do cache. Look at the cached copy, perhaps. */
cached_dir_t *cd = dirserv_get_consensus(resource);
+ /* We have no method of determining the voting interval from an
+ * unparsed consensus, so we use the default. */
if (cd)
- if_modified_since = cd->published + 180;
+ if_modified_since = cd->published + DEFAULT_IF_MODIFIED_SINCE_DELAY;
}
}
@@ -510,20 +538,16 @@ directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
/* */
rs = directory_pick_generic_dirserver(type, pds_flags,
dir_purpose);
- if (!rs) {
- /*XXXX024 I'm pretty sure this can never do any good, since
- * rs isn't set. */
+ if (!rs)
get_via_tor = 1; /* last resort: try routing it via Tor */
- }
}
}
- } else { /* get_via_tor */
+ }
+
+ if (get_via_tor) {
/* Never use fascistfirewall; we're going via Tor. */
- if (1) {
- /* anybody with a non-zero dirport will do. Disregard firewalls. */
- pds_flags |= PDS_IGNORE_FASCISTFIREWALL;
- rs = router_pick_directory_server(type, pds_flags);
- }
+ pds_flags |= PDS_IGNORE_FASCISTFIREWALL;
+ rs = router_pick_directory_server(type, pds_flags);
}
/* If we have any hope of building an indirect conn, we know some router
@@ -1255,7 +1279,8 @@ directory_send_command(dir_connection_t *conn,
return;
}
- if (strlen(proxystring) + strlen(url) >= 4096) {
+ /* warn in the non-tunneled case */
+ if (direct && (strlen(proxystring) + strlen(url) >= 4096)) {
log_warn(LD_BUG,
"Squid does not like URLs longer than 4095 bytes, and this "
"one is %d bytes long: %s%s",
@@ -2073,9 +2098,10 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
}
if (conn->base_.purpose == DIR_PURPOSE_FETCH_RENDDESC_V2) {
- #define SEND_HS_DESC_FAILED_EVENT() ( \
+ #define SEND_HS_DESC_FAILED_EVENT(reason) ( \
control_event_hs_descriptor_failed(conn->rend_data, \
- conn->identity_digest) )
+ conn->identity_digest, \
+ reason) )
tor_assert(conn->rend_data);
log_info(LD_REND,"Received rendezvous descriptor (size %d, status %d "
"(%s))",
@@ -2090,7 +2116,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
"Retrying at another directory.");
/* We'll retry when connection_about_to_close_connection()
* cleans this dir conn up. */
- SEND_HS_DESC_FAILED_EVENT();
+ SEND_HS_DESC_FAILED_EVENT("BAD_DESC");
break;
case RCS_OKAY:
default:
@@ -2109,14 +2135,14 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
* connection_about_to_close_connection() cleans this conn up. */
log_info(LD_REND,"Fetching v2 rendezvous descriptor failed: "
"Retrying at another directory.");
- SEND_HS_DESC_FAILED_EVENT();
+ SEND_HS_DESC_FAILED_EVENT("NOT_FOUND");
break;
case 400:
log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
"http status 400 (%s). Dirserver didn't like our "
"v2 rendezvous query? Retrying at another directory.",
escaped(reason));
- SEND_HS_DESC_FAILED_EVENT();
+ SEND_HS_DESC_FAILED_EVENT("QUERY_REJECTED");
break;
default:
log_warn(LD_REND, "Fetching v2 rendezvous descriptor failed: "
@@ -2125,7 +2151,7 @@ connection_dir_client_reached_eof(dir_connection_t *conn)
"Retrying at another directory.",
status_code, escaped(reason), conn->base_.address,
conn->base_.port);
- SEND_HS_DESC_FAILED_EVENT();
+ SEND_HS_DESC_FAILED_EVENT("UNEXPECTED");
break;
}
}
@@ -2184,12 +2210,15 @@ connection_dir_reached_eof(dir_connection_t *conn)
*/
#define MAX_DIRECTORY_OBJECT_SIZE (10*(1<<20))
+#define MAX_VOTE_DL_SIZE (MAX_DIRECTORY_OBJECT_SIZE * 5)
+
/** Read handler for directory connections. (That's connections <em>to</em>
* directory servers and connections <em>at</em> directory servers.)
*/
int
connection_dir_process_inbuf(dir_connection_t *conn)
{
+ size_t max_size;
tor_assert(conn);
tor_assert(conn->base_.type == CONN_TYPE_DIR);
@@ -2208,9 +2237,15 @@ connection_dir_process_inbuf(dir_connection_t *conn)
return 0;
}
- if (connection_get_inbuf_len(TO_CONN(conn)) > MAX_DIRECTORY_OBJECT_SIZE) {
- log_warn(LD_HTTP, "Too much data received from directory connection: "
- "denial of service attempt, or you need to upgrade?");
+ max_size =
+ (TO_CONN(conn)->purpose == DIR_PURPOSE_FETCH_STATUS_VOTE) ?
+ MAX_VOTE_DL_SIZE : MAX_DIRECTORY_OBJECT_SIZE;
+
+ if (connection_get_inbuf_len(TO_CONN(conn)) > max_size) {
+ log_warn(LD_HTTP,
+ "Too much data received from directory connection (%s): "
+ "denial of service attempt, or you need to upgrade?",
+ conn->base_.address);
connection_mark_for_close(TO_CONN(conn));
return -1;
}
@@ -2255,6 +2290,7 @@ write_http_status_line(dir_connection_t *conn, int status,
log_warn(LD_BUG,"status line too long.");
return;
}
+ log_debug(LD_DIRSERV,"Wrote status 'HTTP/1.0 %d %s'", status, reason_phrase);
connection_write_to_buf(buf, strlen(buf), TO_CONN(conn));
}
@@ -2520,6 +2556,24 @@ client_likes_consensus(networkstatus_t *v, const char *want_url)
return (have >= need_at_least);
}
+/** Return the compression level we should use for sending a compressed
+ * response of size <b>n_bytes</b>. */
+static zlib_compression_level_t
+choose_compression_level(ssize_t n_bytes)
+{
+ if (! have_been_under_memory_pressure()) {
+ return HIGH_COMPRESSION; /* we have plenty of RAM. */
+ } else if (n_bytes < 0) {
+ return HIGH_COMPRESSION; /* unknown; might be big. */
+ } else if (n_bytes < 1024) {
+ return LOW_COMPRESSION;
+ } else if (n_bytes < 2048) {
+ return MEDIUM_COMPRESSION;
+ } else {
+ return HIGH_COMPRESSION;
+ }
+}
+
/** Helper function: called when a dirserver gets a complete HTTP GET
* request. Look for a request for a directory or for a rendezvous
* service descriptor. On finding one, write a response into
@@ -2551,8 +2605,11 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
if ((header = http_get_header(headers, "If-Modified-Since: "))) {
struct tm tm;
if (parse_http_time(header, &tm) == 0) {
- if (tor_timegm(&tm, &if_modified_since)<0)
+ if (tor_timegm(&tm, &if_modified_since)<0) {
if_modified_since = 0;
+ } else {
+ log_debug(LD_DIRSERV, "If-Modified-Since is '%s'.", escaped(header));
+ }
}
/* The correct behavior on a malformed If-Modified-Since header is to
* act as if no If-Modified-Since header had been given. */
@@ -2702,7 +2759,7 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
smartlist_len(dir_fps) == 1 ? lifetime : 0);
conn->fingerprint_stack = dir_fps;
if (! compressed)
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
/* Prime the connection with some data. */
conn->dir_spool_src = DIR_SPOOL_NETWORKSTATUS;
@@ -2790,7 +2847,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
if (smartlist_len(items)) {
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ choose_compression_level(estimated_len));
SMARTLIST_FOREACH(items, const char *, c,
connection_write_to_buf_zlib(c, strlen(c), conn, 0));
connection_write_to_buf_zlib("", 0, conn, 1);
@@ -2839,7 +2897,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
conn->fingerprint_stack = fps;
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ choose_compression_level(dlen));
connection_dirserv_flushed_some(conn);
goto done;
@@ -2907,7 +2966,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
}
write_http_response_header(conn, -1, compressed, cache_lifetime);
if (compressed)
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ choose_compression_level(dlen));
/* Prime the connection with some data. */
connection_dirserv_flushed_some(conn);
}
@@ -2982,7 +3042,8 @@ directory_handle_command_get(dir_connection_t *conn, const char *headers,
write_http_response_header(conn, compressed?-1:len, compressed, 60*60);
if (compressed) {
- conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(1, ZLIB_METHOD,
+ choose_compression_level(len));
SMARTLIST_FOREACH(certs, authority_cert_t *, c,
connection_write_to_buf_zlib(c->cache_info.signed_descriptor_body,
c->cache_info.signed_descriptor_len,
diff --git a/src/or/directory.h b/src/or/directory.h
index d78046912c..4899eb5c8c 100644
--- a/src/or/directory.h
+++ b/src/or/directory.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -16,9 +16,10 @@ int directories_have_accepted_server_descriptor(void);
void directory_post_to_dirservers(uint8_t dir_purpose, uint8_t router_purpose,
dirinfo_type_t type, const char *payload,
size_t payload_len, size_t extrainfo_len);
-void directory_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
- const char *resource,
- int pds_flags);
+MOCK_DECL(void, directory_get_from_dirserver, (uint8_t dir_purpose,
+ uint8_t router_purpose,
+ const char *resource,
+ int pds_flags));
void directory_get_from_all_authorities(uint8_t dir_purpose,
uint8_t router_purpose,
const char *resource);
@@ -120,7 +121,12 @@ int download_status_get_n_failures(const download_status_t *dls);
#ifdef TOR_UNIT_TESTS
/* Used only by directory.c and test_dir.c */
+
STATIC int parse_http_url(const char *headers, char **url);
+STATIC int purpose_needs_anonymity(uint8_t dir_purpose,
+ uint8_t router_purpose);
+STATIC dirinfo_type_t dir_fetch_type(int dir_purpose, int router_purpose,
+ const char *resource);
#endif
#endif
diff --git a/src/or/dirserv.c b/src/or/dirserv.c
index 730f005a96..b694f8af77 100644
--- a/src/or/dirserv.c
+++ b/src/or/dirserv.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRSERV_PRIVATE
@@ -512,7 +512,7 @@ dirserv_add_multiple_descriptors(const char *desc, uint8_t purpose,
if (!n_parsed) {
*msg = "No descriptors found in your POST.";
if (WRA_WAS_ADDED(r))
- r = ROUTER_WAS_NOT_NEW;
+ r = ROUTER_IS_ALREADY_KNOWN;
} else {
*msg = "(no message)";
}
@@ -574,7 +574,7 @@ dirserv_add_descriptor(routerinfo_t *ri, const char **msg, const char *source)
ri->cache_info.signed_descriptor_body,
ri->cache_info.signed_descriptor_len, *msg);
routerinfo_free(ri);
- return ROUTER_WAS_NOT_NEW;
+ return ROUTER_IS_ALREADY_KNOWN;
}
/* Make a copy of desc, since router_add_to_routerlist might free
@@ -646,7 +646,7 @@ dirserv_add_extrainfo(extrainfo_t *ei, const char **msg)
if ((r = routerinfo_incompatible_with_extrainfo(ri, ei, NULL, msg))) {
extrainfo_free(ei);
- return r < 0 ? ROUTER_WAS_NOT_NEW : ROUTER_BAD_EI;
+ return r < 0 ? ROUTER_IS_ALREADY_KNOWN : ROUTER_BAD_EI;
}
router_add_extrainfo_to_routerlist(ei, msg, 0, 0);
return ROUTER_ADDED_SUCCESSFULLY;
@@ -733,7 +733,7 @@ running_long_enough_to_decide_unreachable(void)
}
/** Each server needs to have passed a reachability test no more
- * than this number of seconds ago, or he is listed as down in
+ * than this number of seconds ago, or it is listed as down in
* the directory. */
#define REACHABLE_TIMEOUT (45*60)
@@ -887,12 +887,26 @@ static int
router_is_active(const routerinfo_t *ri, const node_t *node, time_t now)
{
time_t cutoff = now - ROUTER_MAX_AGE_TO_PUBLISH;
- if (ri->cache_info.published_on < cutoff)
+ if (ri->cache_info.published_on < cutoff) {
return 0;
- if (!node->is_running || !node->is_valid || ri->is_hibernating)
+ }
+ if (!node->is_running || !node->is_valid || ri->is_hibernating) {
return 0;
- if (!ri->bandwidthcapacity)
+ }
+ /* Only require bandwith capacity in non-test networks, or
+ * if TestingTorNetwork, and TestingMinExitFlagThreshold is non-zero */
+ if (!ri->bandwidthcapacity) {
+ if (get_options()->TestingTorNetwork) {
+ if (get_options()->TestingMinExitFlagThreshold > 0) {
+ /* If we're in a TestingTorNetwork, and TestingMinExitFlagThreshold is,
+ * then require bandwidthcapacity */
+ return 0;
+ }
+ } else {
+ /* If we're not in a TestingTorNetwork, then require bandwidthcapacity */
return 0;
+ }
+ }
return 1;
}
@@ -1037,7 +1051,7 @@ directory_fetches_dir_info_later(const or_options_t *options)
}
/** Return true iff we want to fetch and keep certificates for authorities
- * that we don't acknowledge as aurthorities ourself.
+ * that we don't acknowledge as authorities ourself.
*/
int
directory_caches_unknown_auth_certs(const or_options_t *options)
@@ -1498,7 +1512,7 @@ dirserv_compute_performance_thresholds(routerlist_t *rl,
(unsigned long)guard_tk,
(unsigned long)guard_bandwidth_including_exits_kb,
(unsigned long)guard_bandwidth_excluding_exits_kb,
- enough_mtbf_info ? "" : " don't ");
+ enough_mtbf_info ? "" : " don't");
tor_free(uptimes);
tor_free(mtbfs);
@@ -2099,9 +2113,10 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs,
rs->ipv6_orport = ri->ipv6_orport;
}
- /* Iff we are in a testing network, use TestingDirAuthVoteExit to
- give out Exit flags, and TestingDirAuthVoteGuard to
- give out Guard flags. */
+ /* Iff we are in a testing network, use TestingDirAuthVoteExit,
+ TestingDirAuthVoteGuard, and TestingDirAuthVoteHSDir to
+ give out the Exit, Guard, and HSDir flags, respectively.
+ But don't set the corresponding node flags. */
if (options->TestingTorNetwork) {
if (routerset_contains_routerstatus(options->TestingDirAuthVoteExit,
rs, 0)) {
@@ -2109,9 +2124,15 @@ set_routerstatus_from_routerinfo(routerstatus_t *rs,
}
if (routerset_contains_routerstatus(options->TestingDirAuthVoteGuard,
- rs, 0)) {
+ rs, 0)) {
rs->is_possible_guard = 1;
}
+
+ if (routerset_contains_routerstatus(options->TestingDirAuthVoteHSDir,
+ rs, 0)) {
+ /* TestingDirAuthVoteHSDir respects VoteOnHidServDirectoriesV2 */
+ rs->is_hs_dir = vote_on_hsdirs;
+ }
}
}
@@ -2246,7 +2267,7 @@ int
dirserv_read_measured_bandwidths(const char *from_file,
smartlist_t *routerstatuses)
{
- char line[256];
+ char line[512];
FILE *fp = tor_fopen_cloexec(from_file, "r");
int applied_lines = 0;
time_t file_time, now;
@@ -3182,7 +3203,7 @@ connection_dirserv_add_networkstatus_bytes_to_outbuf(dir_connection_t *conn)
if (uncompressing && ! conn->zlib_state &&
conn->fingerprint_stack &&
smartlist_len(conn->fingerprint_stack)) {
- conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD);
+ conn->zlib_state = tor_zlib_new(0, ZLIB_METHOD, HIGH_COMPRESSION);
}
}
if (r) return r;
diff --git a/src/or/dirserv.h b/src/or/dirserv.h
index 57cec3401f..d4ce54260c 100644
--- a/src/or/dirserv.h
+++ b/src/or/dirserv.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dirvote.c b/src/or/dirvote.c
index 39505a4f9e..f0dcc88070 100644
--- a/src/or/dirvote.c
+++ b/src/or/dirvote.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define DIRVOTE_PRIVATE
@@ -1107,8 +1107,12 @@ networkstatus_compute_consensus(smartlist_t *votes,
vote_seconds = median_int(votesec_list, n_votes);
dist_seconds = median_int(distsec_list, n_votes);
- tor_assert(valid_after+MIN_VOTE_INTERVAL <= fresh_until);
- tor_assert(fresh_until+MIN_VOTE_INTERVAL <= valid_until);
+ tor_assert(valid_after +
+ (get_options()->TestingTorNetwork ?
+ MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= fresh_until);
+ tor_assert(fresh_until +
+ (get_options()->TestingTorNetwork ?
+ MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) <= valid_until);
tor_assert(vote_seconds >= MIN_VOTE_SECONDS);
tor_assert(dist_seconds >= MIN_DIST_SECONDS);
@@ -2706,7 +2710,7 @@ dirvote_add_vote(const char *vote_body, const char **msg_out, int *status_out)
goto discard;
} else if (v->vote->published < vote->published) {
log_notice(LD_DIR, "Replacing an older pending vote from this "
- "directory.");
+ "directory (%s)", vi->address);
cached_dir_decref(v->vote_body);
networkstatus_vote_free(v->vote);
v->vote_body = new_cached_dir(tor_strndup(vote_body,
diff --git a/src/or/dirvote.h b/src/or/dirvote.h
index 5d44ba4320..8908336fa1 100644
--- a/src/or/dirvote.h
+++ b/src/or/dirvote.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -14,12 +14,42 @@
#include "testsupport.h"
+/*
+ * Ideally, assuming synced clocks, we should only need 1 second for each of:
+ * - Vote
+ * - Distribute
+ * - Consensus Publication
+ * As we can gather descriptors continuously.
+ * (Could we even go as far as publishing the previous consensus,
+ * in the same second that we vote for the next one?)
+ * But we're not there yet: these are the lowest working values at this time.
+ */
+
/** Lowest allowable value for VoteSeconds. */
#define MIN_VOTE_SECONDS 2
+/** Lowest allowable value for VoteSeconds when TestingTorNetwork is 1 */
+#define MIN_VOTE_SECONDS_TESTING 2
+
/** Lowest allowable value for DistSeconds. */
#define MIN_DIST_SECONDS 2
-/** Smallest allowable voting interval. */
+/** Lowest allowable value for DistSeconds when TestingTorNetwork is 1 */
+#define MIN_DIST_SECONDS_TESTING 2
+
+/** Lowest allowable voting interval. */
#define MIN_VOTE_INTERVAL 300
+/** Lowest allowable voting interval when TestingTorNetwork is 1:
+ * Voting Interval can be:
+ * 10, 12, 15, 18, 20, 24, 25, 30, 36, 40, 45, 50, 60, ...
+ * Testing Initial Voting Interval can be:
+ * 5, 6, 8, 9, or any of the possible values for Voting Interval,
+ * as they both need to evenly divide 30 minutes.
+ * If clock desynchronisation is an issue, use an interval of at least:
+ * 18 * drift in seconds, to allow for a clock slop factor */
+#define MIN_VOTE_INTERVAL_TESTING \
+ (((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1)*2)
+
+#define MIN_VOTE_INTERVAL_TESTING_INITIAL \
+ ((MIN_VOTE_SECONDS_TESTING)+(MIN_DIST_SECONDS_TESTING)+1)
/** The lowest consensus method that we currently support. */
#define MIN_SUPPORTED_CONSENSUS_METHOD 13
diff --git a/src/or/dns.c b/src/or/dns.c
index 7bf64dc4ff..cc4a169422 100644
--- a/src/or/dns.c
+++ b/src/or/dns.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -558,6 +558,8 @@ purge_expired_resolves(time_t now)
/* Connections should only be pending if they have no socket. */
tor_assert(!SOCKET_OK(pend->conn->base_.s));
pendconn = pend->conn;
+ /* Prevent double-remove */
+ pendconn->base_.state = EXIT_CONN_STATE_RESOLVEFAILED;
if (!pendconn->base_.marked_for_close) {
connection_edge_end(pendconn, END_STREAM_REASON_TIMEOUT);
circuit_detach_stream(circuit_get_by_edge_conn(pendconn), pendconn);
@@ -1133,7 +1135,9 @@ connection_dns_remove(edge_connection_t *conn)
return; /* more are pending */
}
}
- tor_assert(0); /* not reachable unless onlyconn not in pending list */
+ log_warn(LD_BUG, "Connection (fd "TOR_SOCKET_T_FORMAT") was not waiting "
+ "for a resolve of %s, but we tried to remove it.",
+ conn->base_.s, escaped_safe_str(conn->base_.address));
}
}
diff --git a/src/or/dns.h b/src/or/dns.h
index cabbb9ba09..b13ab0f890 100644
--- a/src/or/dns.h
+++ b/src/or/dns.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/dnsserv.c b/src/or/dnsserv.c
index 3d63874a65..f7710908bd 100644
--- a/src/or/dnsserv.c
+++ b/src/or/dnsserv.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -141,13 +141,13 @@ evdns_server_callback(struct evdns_server_request *req, void *data_)
}
if (q->type == EVDNS_TYPE_A || q->type == EVDNS_QTYPE_ALL) {
- entry_conn->ipv4_traffic_ok = 1;
- entry_conn->ipv6_traffic_ok = 0;
- entry_conn->prefer_ipv6_traffic = 0;
+ entry_conn->entry_cfg.ipv4_traffic = 1;
+ entry_conn->entry_cfg.ipv6_traffic = 0;
+ entry_conn->entry_cfg.prefer_ipv6 = 0;
} else if (q->type == EVDNS_TYPE_AAAA) {
- entry_conn->ipv4_traffic_ok = 0;
- entry_conn->ipv6_traffic_ok = 1;
- entry_conn->prefer_ipv6_traffic = 1;
+ entry_conn->entry_cfg.ipv4_traffic = 0;
+ entry_conn->entry_cfg.ipv6_traffic = 1;
+ entry_conn->entry_cfg.prefer_ipv6 = 1;
}
strlcpy(entry_conn->socks_request->address, q->name,
@@ -155,8 +155,8 @@ evdns_server_callback(struct evdns_server_request *req, void *data_)
entry_conn->socks_request->listener_type = listener->base_.type;
entry_conn->dns_server_request = req;
- entry_conn->isolation_flags = listener->isolation_flags;
- entry_conn->session_group = listener->session_group;
+ entry_conn->entry_cfg.isolation_flags = listener->entry_cfg.isolation_flags;
+ entry_conn->entry_cfg.session_group = listener->entry_cfg.session_group;
entry_conn->nym_epoch = get_signewnym_epoch();
if (connection_add(ENTRY_TO_CONN(entry_conn)) < 0) {
@@ -232,9 +232,9 @@ dnsserv_launch_request(const char *name, int reverse,
entry_conn->socks_request->listener_type = CONN_TYPE_CONTROL_LISTENER;
entry_conn->original_dest_address = tor_strdup(name);
- entry_conn->session_group = SESSION_GROUP_CONTROL_RESOLVE;
+ entry_conn->entry_cfg.session_group = SESSION_GROUP_CONTROL_RESOLVE;
entry_conn->nym_epoch = get_signewnym_epoch();
- entry_conn->isolation_flags = ISO_DEFAULT;
+ entry_conn->entry_cfg.isolation_flags = ISO_DEFAULT;
if (connection_add(TO_CONN(conn))<0) {
log_warn(LD_APP, "Couldn't register dummy connection for RESOLVE request");
diff --git a/src/or/dnsserv.h b/src/or/dnsserv.h
index c8074dfaa0..09ad5d7759 100644
--- a/src/or/dnsserv.h
+++ b/src/or/dnsserv.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/entrynodes.c b/src/or/entrynodes.c
index b18aabe1f4..5b0e342662 100644
--- a/src/or/entrynodes.c
+++ b/src/or/entrynodes.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1319,7 +1319,7 @@ entry_guards_parse_state(or_state_t *state, int set, char **msg)
"EntryGuardDownSince/UnlistedSince without EntryGuard");
break;
}
- if (parse_iso_time(line->value, &when)<0) {
+ if (parse_iso_time_(line->value, &when, 0)<0) {
*msg = tor_strdup("Unable to parse entry nodes: "
"Bad time in EntryGuardDownSince/UnlistedSince");
break;
@@ -1523,6 +1523,13 @@ entry_guards_parse_state(or_state_t *state, int set, char **msg)
return *msg ? -1 : 0;
}
+/** How long will we let a change in our guard nodes stay un-saved
+ * when we are trying to avoid disk writes? */
+#define SLOW_GUARD_STATE_FLUSH_TIME 600
+/** How long will we let a change in our guard nodes stay un-saved
+ * when we are not trying to avoid disk writes? */
+#define FAST_GUARD_STATE_FLUSH_TIME 30
+
/** Our list of entry guards has changed, or some element of one
* of our entry guards has changed. Write the changes to disk within
* the next few minutes.
@@ -1533,8 +1540,12 @@ entry_guards_changed(void)
time_t when;
entry_guards_dirty = 1;
+ if (get_options()->AvoidDiskWrites)
+ when = time(NULL) + SLOW_GUARD_STATE_FLUSH_TIME;
+ else
+ when = time(NULL) + FAST_GUARD_STATE_FLUSH_TIME;
+
/* or_state_save() will call entry_guards_update_state(). */
- when = get_options()->AvoidDiskWrites ? time(NULL) + 3600 : time(NULL)+600;
or_state_mark_dirty(get_or_state(), when);
}
diff --git a/src/or/entrynodes.h b/src/or/entrynodes.h
index 5416398430..7f3a4fb29c 100644
--- a/src/or/entrynodes.h
+++ b/src/or/entrynodes.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/eventdns_tor.h b/src/or/eventdns_tor.h
index b135a534fc..9d51f0960e 100644
--- a/src/or/eventdns_tor.h
+++ b/src/or/eventdns_tor.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_EVENTDNS_TOR_H
diff --git a/src/or/ext_orport.c b/src/or/ext_orport.c
index 9b550ee90e..e8c8aa60a4 100644
--- a/src/or/ext_orport.c
+++ b/src/or/ext_orport.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/ext_orport.h b/src/or/ext_orport.h
index 277bbfdbcf..8b2542f937 100644
--- a/src/or/ext_orport.h
+++ b/src/or/ext_orport.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef EXT_ORPORT_H
diff --git a/src/or/fp_pair.c b/src/or/fp_pair.c
index fc7d107ba7..42bebcd847 100644
--- a/src/or/fp_pair.c
+++ b/src/or/fp_pair.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/or/fp_pair.h b/src/or/fp_pair.h
index 67b94fb6b4..0830ab1f36 100644
--- a/src/or/fp_pair.h
+++ b/src/or/fp_pair.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/geoip.c b/src/or/geoip.c
index c02343d489..5564b72a04 100644
--- a/src/or/geoip.c
+++ b/src/or/geoip.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/geoip.h b/src/or/geoip.h
index cec19ea564..683ec073b2 100644
--- a/src/or/geoip.h
+++ b/src/or/geoip.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index 4f0660c2dc..356e11f6ec 100644
--- a/src/or/hibernate.c
+++ b/src/or/hibernate.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/hibernate.h b/src/or/hibernate.h
index 0616e11c57..b9e619c5ad 100644
--- a/src/or/hibernate.h
+++ b/src/or/hibernate.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/include.am b/src/or/include.am
index 0f53f007f0..b44e1099dc 100644
--- a/src/or/include.am
+++ b/src/or/include.am
@@ -74,6 +74,7 @@ LIBTOR_A_SOURCES = \
src/or/routerlist.c \
src/or/routerparse.c \
src/or/routerset.c \
+ src/or/scheduler.c \
src/or/statefile.c \
src/or/status.c \
src/or/onion_ntor.c \
@@ -110,7 +111,7 @@ src_or_tor_LDADD = src/or/libtor.a src/common/libor.a \
src/common/libor-crypto.a $(LIBDONNA) \
src/common/libor-event.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@
if COVERAGE_ENABLED
src_or_tor_cov_SOURCES = src/or/tor_main.c
@@ -121,7 +122,10 @@ src_or_tor_cov_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
src/common/libor-crypto-testing.a $(LIBDONNA) \
src/common/libor-event-testing.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ @TOR_OPENSSL_LIBS@ \
- @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ @TOR_SYSTEMD_LIBS@
+TESTING_TOR_BINARY = ./src/or/tor-cov
+else
+TESTING_TOR_BINARY = ./src/or/tor
endif
ORHEADERS = \
@@ -179,6 +183,7 @@ ORHEADERS = \
src/or/routerlist.h \
src/or/routerset.h \
src/or/routerparse.h \
+ src/or/scheduler.h \
src/or/statefile.h \
src/or/status.h
diff --git a/src/or/main.c b/src/or/main.c
index 5a4e0a3e2d..136043c117 100644
--- a/src/or/main.c
+++ b/src/or/main.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -53,6 +53,7 @@
#include "router.h"
#include "routerlist.h"
#include "routerparse.h"
+#include "scheduler.h"
#include "statefile.h"
#include "status.h"
#include "util_process.h"
@@ -74,6 +75,16 @@
#include <event2/bufferevent.h>
#endif
+#ifdef HAVE_SYSTEMD
+# if defined(__COVERITY__) && !defined(__INCLUDE_LEVEL__)
+/* Systemd's use of gcc's __INCLUDE_LEVEL__ extension macro appears to confuse
+ * Coverity. Here's a kludge to unconfuse it.
+ */
+# define __INCLUDE_LEVEL__ 2
+# endif
+#include <systemd/sd-daemon.h>
+#endif
+
void evdns_shutdown(int);
/********* PROTOTYPES **********/
@@ -150,7 +161,7 @@ static int called_loop_once = 0;
* any longer (a big time jump happened, when we notice our directory is
* heinously out-of-date, etc.
*/
-int can_complete_circuit=0;
+static int can_complete_circuits = 0;
/** How often do we check for router descriptors that we should download
* when we have too little directory info? */
@@ -171,11 +182,11 @@ int quiet_level = 0;
/********* END VARIABLES ************/
/****************************************************************************
-*
-* This section contains accessors and other methods on the connection_array
-* variables (which are global within this file and unavailable outside it).
-*
-****************************************************************************/
+ *
+ * This section contains accessors and other methods on the connection_array
+ * variables (which are global within this file and unavailable outside it).
+ *
+ ****************************************************************************/
#if 0 && defined(USE_BUFFEREVENTS)
static void
@@ -223,6 +234,31 @@ set_buffer_lengths_to_zero(tor_socket_t s)
}
#endif
+/** Return 1 if we have successfully built a circuit, and nothing has changed
+ * to make us think that maybe we can't.
+ */
+int
+have_completed_a_circuit(void)
+{
+ return can_complete_circuits;
+}
+
+/** Note that we have successfully built a circuit, so that reachability
+ * testing and introduction points and so on may be attempted. */
+void
+note_that_we_completed_a_circuit(void)
+{
+ can_complete_circuits = 1;
+}
+
+/** Note that something has happened (like a clock jump, or DisableNetwork) to
+ * make us think that maybe we can't complete circuits. */
+void
+note_that_we_maybe_cant_complete_circuits(void)
+{
+ can_complete_circuits = 0;
+}
+
/** Add <b>conn</b> to the array of connections that we can poll on. The
* connection's socket must be set; the connection starts out
* non-reading and non-writing.
@@ -355,6 +391,10 @@ connection_remove(connection_t *conn)
(int)conn->s, conn_type_to_string(conn->type),
smartlist_len(connection_array));
+ if (conn->type == CONN_TYPE_AP && conn->socket_family == AF_UNIX) {
+ log_info(LD_NET, "Closing SOCKS SocksSocket connection");
+ }
+
control_event_conn_bandwidth(conn);
tor_assert(conn->conn_array_index >= 0);
@@ -999,7 +1039,7 @@ directory_info_has_arrived(time_t now, int from_cache)
}
if (server_mode(options) && !net_is_disabled() && !from_cache &&
- (can_complete_circuit || !any_predicted_circuits(now)))
+ (have_completed_a_circuit() || !any_predicted_circuits(now)))
consider_testing_reachability(1, 1);
}
@@ -1231,7 +1271,7 @@ run_scheduled_events(time_t now)
get_onion_key_set_at()+MIN_ONION_KEY_LIFETIME < now) {
log_info(LD_GENERAL,"Rotating onion key.");
rotate_onion_key();
- cpuworkers_rotate();
+ cpuworkers_rotate_keyinfo();
if (router_rebuild_descriptor(1)<0) {
log_info(LD_CONFIG, "Couldn't rebuild router descriptor");
}
@@ -1358,6 +1398,11 @@ run_scheduled_events(time_t now)
if (next_write && next_write < next_time_to_write_stats_files)
next_time_to_write_stats_files = next_write;
}
+ if (options->HiddenServiceStatistics) {
+ time_t next_write = rep_hist_hs_stats_write(time_to_write_stats_files);
+ if (next_write && next_write < next_time_to_write_stats_files)
+ next_time_to_write_stats_files = next_write;
+ }
if (options->ExitPortStatistics) {
time_t next_write = rep_hist_exit_stats_write(time_to_write_stats_files);
if (next_write && next_write < next_time_to_write_stats_files)
@@ -1402,7 +1447,7 @@ run_scheduled_events(time_t now)
if (time_to_clean_caches < now) {
rep_history_clean(now - options->RephistTrackTime);
rend_cache_clean(now);
- rend_cache_clean_v2_descs_as_dir(now);
+ rend_cache_clean_v2_descs_as_dir(now, 0);
microdesc_cache_rebuild(NULL, 0);
#define CLEAN_CACHES_INTERVAL (30*60)
time_to_clean_caches = now + CLEAN_CACHES_INTERVAL;
@@ -1436,7 +1481,7 @@ run_scheduled_events(time_t now)
/* also, check religiously for reachability, if it's within the first
* 20 minutes of our uptime. */
if (is_server &&
- (can_complete_circuit || !any_predicted_circuits(now)) &&
+ (have_completed_a_circuit() || !any_predicted_circuits(now)) &&
!we_are_hibernating()) {
if (stats_n_seconds_working < TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) {
consider_testing_reachability(1, dirport_reachability_count==0);
@@ -1549,7 +1594,7 @@ run_scheduled_events(time_t now)
circuit_close_all_marked();
/* 7. And upload service descriptors if necessary. */
- if (can_complete_circuit && !net_is_disabled()) {
+ if (have_completed_a_circuit() && !net_is_disabled()) {
rend_consider_services_upload(now);
rend_consider_descriptor_republication();
}
@@ -1680,7 +1725,7 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
if (server_mode(options) &&
!net_is_disabled() &&
seconds_elapsed > 0 &&
- can_complete_circuit &&
+ have_completed_a_circuit() &&
stats_n_seconds_working / TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT !=
(stats_n_seconds_working+seconds_elapsed) /
TIMEOUT_UNTIL_UNREACHABILITY_COMPLAINT) {
@@ -1728,6 +1773,19 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
current_second = now; /* remember which second it is, for next time */
}
+#ifdef HAVE_SYSTEMD_209
+static periodic_timer_t *systemd_watchdog_timer = NULL;
+
+/** Libevent callback: invoked to reset systemd watchdog. */
+static void
+systemd_watchdog_callback(periodic_timer_t *timer, void *arg)
+{
+ (void)timer;
+ (void)arg;
+ sd_notify(0, "WATCHDOG=1");
+}
+#endif
+
#ifndef USE_BUFFEREVENTS
/** Timer: used to invoke refill_callback(). */
static periodic_timer_t *refill_timer = NULL;
@@ -1902,9 +1960,9 @@ do_hup(void)
* force a retry there. */
if (server_mode(options)) {
- /* Restart cpuworker and dnsworker processes, so they get up-to-date
+ /* Update cpuworker and dnsworker processes, so they get up-to-date
* configuration options. */
- cpuworkers_rotate();
+ cpuworkers_rotate_keyinfo();
dns_reset();
}
return 0;
@@ -1996,6 +2054,28 @@ do_main_loop(void)
tor_assert(second_timer);
}
+#ifdef HAVE_SYSTEMD_209
+ uint64_t watchdog_delay;
+ /* set up systemd watchdog notification. */
+ if (sd_watchdog_enabled(1, &watchdog_delay) > 0) {
+ if (! systemd_watchdog_timer) {
+ struct timeval watchdog;
+ /* The manager will "act on" us if we don't send them a notification
+ * every 'watchdog_delay' microseconds. So, send notifications twice
+ * that often. */
+ watchdog_delay /= 2;
+ watchdog.tv_sec = watchdog_delay / 1000000;
+ watchdog.tv_usec = watchdog_delay % 1000000;
+
+ systemd_watchdog_timer = periodic_timer_new(tor_libevent_get_base(),
+ &watchdog,
+ systemd_watchdog_callback,
+ NULL);
+ tor_assert(systemd_watchdog_timer);
+ }
+ }
+#endif
+
#ifndef USE_BUFFEREVENTS
if (!refill_timer) {
struct timeval refill_interval;
@@ -2012,6 +2092,11 @@ do_main_loop(void)
}
#endif
+#ifdef HAVE_SYSTEMD
+ log_notice(LD_GENERAL, "Signaling readiness to systemd");
+ sd_notify(0, "READY=1");
+#endif
+
for (;;) {
if (nt_service_is_stopping())
return 0;
@@ -2090,6 +2175,9 @@ process_signal(uintptr_t sig)
tor_cleanup();
exit(0);
}
+#ifdef HAVE_SYSTEMD
+ sd_notify(0, "STOPPING=1");
+#endif
hibernate_begin_shutdown();
break;
#ifdef SIGPIPE
@@ -2109,11 +2197,17 @@ process_signal(uintptr_t sig)
control_event_signal(sig);
break;
case SIGHUP:
+#ifdef HAVE_SYSTEMD
+ sd_notify(0, "RELOADING=1");
+#endif
if (do_hup() < 0) {
log_warn(LD_CONFIG,"Restart failed (config error?). Exiting.");
tor_cleanup();
exit(1);
}
+#ifdef HAVE_SYSTEMD
+ sd_notify(0, "READY=1");
+#endif
control_event_signal(sig);
break;
#ifdef SIGCHLD
@@ -2137,6 +2231,10 @@ process_signal(uintptr_t sig)
addressmap_clear_transient();
control_event_signal(sig);
break;
+ case SIGHEARTBEAT:
+ log_heartbeat(time(NULL));
+ control_event_signal(sig);
+ break;
}
}
@@ -2553,6 +2651,7 @@ tor_free_all(int postfork)
channel_tls_free_all();
channel_free_all();
connection_free_all();
+ scheduler_free_all();
buf_shrink_freelists(1);
memarea_clear_freelist();
nodelist_free_all();
diff --git a/src/or/main.h b/src/or/main.h
index e918517b82..f77b4711c5 100644
--- a/src/or/main.h
+++ b/src/or/main.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -12,7 +12,9 @@
#ifndef TOR_MAIN_H
#define TOR_MAIN_H
-extern int can_complete_circuit;
+int have_completed_a_circuit(void);
+void note_that_we_completed_a_circuit(void);
+void note_that_we_maybe_cant_complete_circuits(void);
int connection_add_impl(connection_t *conn, int is_connecting);
#define connection_add(conn) connection_add_impl((conn), 0)
diff --git a/src/or/microdesc.c b/src/or/microdesc.c
index 7b826008b5..0511e870d1 100644
--- a/src/or/microdesc.c
+++ b/src/or/microdesc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2009-2014, The Tor Project, Inc. */
+/* Copyright (c) 2009-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/or/microdesc.h b/src/or/microdesc.h
index fdfe8922ab..08571e4bd5 100644
--- a/src/or/microdesc.h
+++ b/src/or/microdesc.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/networkstatus.c b/src/or/networkstatus.c
index 21efdd129d..59ba1e6cb7 100644
--- a/src/or/networkstatus.c
+++ b/src/or/networkstatus.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -832,6 +832,10 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
a crazy-fast voting interval, though, 2 minutes may be too
much. */
min_sec_before_caching = interval/16;
+ /* make sure we always delay by at least a second before caching */
+ if (min_sec_before_caching == 0) {
+ min_sec_before_caching = 1;
+ }
}
if (directory_fetches_dir_info_early(options)) {
@@ -863,8 +867,17 @@ update_consensus_networkstatus_fetch_time_impl(time_t now, int flav)
dl_interval = (c->valid_until - start) - min_sec_before_caching;
}
}
+ /* catch low dl_interval in crazy-fast networks */
if (dl_interval < 1)
dl_interval = 1;
+ /* catch late start in crazy-fast networks */
+ if (start+dl_interval >= c->valid_until)
+ start = c->valid_until - dl_interval - 1;
+ log_debug(LD_DIR,
+ "fresh_until: %ld start: %ld "
+ "dl_interval: %ld valid_until: %ld ",
+ (long)c->fresh_until, (long)start, dl_interval,
+ (long)c->valid_until);
/* We must not try to replace c while it's still fresh: */
tor_assert(c->fresh_until < start);
/* We must download the next one before c is invalid: */
diff --git a/src/or/networkstatus.h b/src/or/networkstatus.h
index a087a79ac3..d6e9e37013 100644
--- a/src/or/networkstatus.h
+++ b/src/or/networkstatus.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/nodelist.c b/src/or/nodelist.c
index 53abc820f5..249c198214 100644
--- a/src/or/nodelist.c
+++ b/src/or/nodelist.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -24,6 +24,23 @@
static void nodelist_drop_node(node_t *node, int remove_from_ht);
static void node_free(node_t *node);
+
+/** count_usable_descriptors counts descriptors with these flag(s)
+ */
+typedef enum {
+ /* All descriptors regardless of flags */
+ USABLE_DESCRIPTOR_ALL = 0,
+ /* Only descriptors with the Exit flag */
+ USABLE_DESCRIPTOR_EXIT_ONLY = 1
+} usable_descriptor_t;
+static void count_usable_descriptors(int *num_present,
+ int *num_usable,
+ smartlist_t *descs_out,
+ const networkstatus_t *consensus,
+ const or_options_t *options,
+ time_t now,
+ routerset_t *in_set,
+ usable_descriptor_t exit_only);
static void update_router_have_minimum_dir_info(void);
static double get_frac_paths_needed_for_circs(const or_options_t *options,
const networkstatus_t *ns);
@@ -1256,20 +1273,28 @@ router_set_status(const char *digest, int up)
}
/** True iff, the last time we checked whether we had enough directory info
- * to build circuits, the answer was "yes". */
+ * to build circuits, the answer was "yes". If there are no exits in the
+ * consensus, we act as if we have 100% of the exit directory info. */
static int have_min_dir_info = 0;
+
+/** Does the consensus contain nodes that can exit? */
+static consensus_path_type_t have_consensus_path = CONSENSUS_PATH_UNKNOWN;
+
/** True iff enough has changed since the last time we checked whether we had
* enough directory info to build circuits that our old answer can no longer
* be trusted. */
static int need_to_update_have_min_dir_info = 1;
/** String describing what we're missing before we have enough directory
* info. */
-static char dir_info_status[256] = "";
-
-/** Return true iff we have enough networkstatus and router information to
- * start building circuits. Right now, this means "more than half the
- * networkstatus documents, and at least 1/4 of expected routers." */
-//XXX should consider whether we have enough exiting nodes here.
+static char dir_info_status[512] = "";
+
+/** Return true iff we have enough consensus information to
+ * start building circuits. Right now, this means "a consensus that's
+ * less than a day old, and at least 60% of router descriptors (configurable),
+ * weighted by bandwidth. Treat the exit fraction as 100% if there are
+ * no exits in the consensus."
+ * To obtain the final weighted bandwidth, we multiply the
+ * weighted bandwidth fraction for each position (guard, middle, exit). */
int
router_have_minimum_dir_info(void)
{
@@ -1291,6 +1316,24 @@ router_have_minimum_dir_info(void)
return have_min_dir_info;
}
+/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node
+ * in the consensus. We update this flag in compute_frac_paths_available if
+ * there is at least one relay that has an Exit flag in the consensus.
+ * Used to avoid building exit circuits when they will almost certainly fail.
+ * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus.
+ * (This situation typically occurs during bootstrap of a test network.)
+ * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have
+ * reason to believe our last known value was invalid or has expired.
+ * If we're in a network with TestingDirAuthVoteExit set,
+ * this can cause router_have_consensus_path() to be set to
+ * CONSENSUS_PATH_EXIT, even if there are no nodes with accept exit policies.
+ */
+consensus_path_type_t
+router_have_consensus_path(void)
+{
+ return have_consensus_path;
+}
+
/** Called when our internal view of the directory has changed. This can be
* when the authorities change, networkstatuses change, the list of routerdescs
* changes, or number of running routers changes.
@@ -1313,20 +1356,23 @@ get_dir_info_status_string(void)
/** Iterate over the servers listed in <b>consensus</b>, and count how many of
* them seem like ones we'd use, and how many of <em>those</em> we have
* descriptors for. Store the former in *<b>num_usable</b> and the latter in
- * *<b>num_present</b>. If <b>in_set</b> is non-NULL, only consider those
- * routers in <b>in_set</b>. If <b>exit_only</b> is true, only consider nodes
- * with the Exit flag. If *descs_out is present, add a node_t for each
- * usable descriptor to it.
+ * *<b>num_present</b>.
+ * If <b>in_set</b> is non-NULL, only consider those routers in <b>in_set</b>.
+ * If <b>exit_only</b> is USABLE_DESCRIPTOR_EXIT_ONLY, only consider nodes
+ * with the Exit flag.
+ * If *<b>descs_out</b> is present, add a node_t for each usable descriptor
+ * to it.
*/
static void
count_usable_descriptors(int *num_present, int *num_usable,
smartlist_t *descs_out,
const networkstatus_t *consensus,
const or_options_t *options, time_t now,
- routerset_t *in_set, int exit_only)
+ routerset_t *in_set,
+ usable_descriptor_t exit_only)
{
const int md = (consensus->flavor == FLAV_MICRODESC);
- *num_present = 0, *num_usable=0;
+ *num_present = 0, *num_usable = 0;
SMARTLIST_FOREACH_BEGIN(consensus->routerstatus_list, routerstatus_t *, rs)
{
@@ -1334,7 +1380,7 @@ count_usable_descriptors(int *num_present, int *num_usable,
if (!node)
continue; /* This would be a bug: every entry in the consensus is
* supposed to have a node. */
- if (exit_only && ! rs->is_exit)
+ if (exit_only == USABLE_DESCRIPTOR_EXIT_ONLY && ! rs->is_exit)
continue;
if (in_set && ! routerset_contains_routerstatus(in_set, rs, -1))
continue;
@@ -1358,11 +1404,21 @@ count_usable_descriptors(int *num_present, int *num_usable,
log_debug(LD_DIR, "%d usable, %d present (%s%s).",
*num_usable, *num_present,
- md ? "microdesc" : "desc", exit_only ? " exits" : "s");
+ md ? "microdesc" : "desc",
+ exit_only == USABLE_DESCRIPTOR_EXIT_ONLY ? " exits" : "s");
}
/** Return an estimate of which fraction of usable paths through the Tor
- * network we have available for use. */
+ * network we have available for use.
+ * Count how many routers seem like ones we'd use, and how many of
+ * <em>those</em> we have descriptors for. Store the former in
+ * *<b>num_usable_out</b> and the latter in *<b>num_present_out</b>.
+ * If **<b>status_out</b> is present, allocate a new string and print the
+ * available percentages of guard, middle, and exit nodes to it, noting
+ * whether there are exits in the consensus.
+ * If there are no guards in the consensus,
+ * we treat the exit fraction as 100%.
+ */
static double
compute_frac_paths_available(const networkstatus_t *consensus,
const or_options_t *options, time_t now,
@@ -1375,14 +1431,19 @@ compute_frac_paths_available(const networkstatus_t *consensus,
smartlist_t *myexits= smartlist_new();
smartlist_t *myexits_unflagged = smartlist_new();
double f_guard, f_mid, f_exit, f_myexit, f_myexit_unflagged;
- int np, nu; /* Ignored */
+ double f_path = 0.0;
+ /* Used to determine whether there are any exits in the consensus */
+ int np = 0;
+ /* Used to determine whether there are any exits with descriptors */
+ int nu = 0;
const int authdir = authdir_mode_v3(options);
count_usable_descriptors(num_present_out, num_usable_out,
- mid, consensus, options, now, NULL, 0);
+ mid, consensus, options, now, NULL,
+ USABLE_DESCRIPTOR_ALL);
if (options->EntryNodes) {
count_usable_descriptors(&np, &nu, guards, consensus, options, now,
- options->EntryNodes, 0);
+ options->EntryNodes, USABLE_DESCRIPTOR_ALL);
} else {
SMARTLIST_FOREACH(mid, const node_t *, node, {
if (authdir) {
@@ -1395,22 +1456,78 @@ compute_frac_paths_available(const networkstatus_t *consensus,
});
}
- /* All nodes with exit flag */
+ /* All nodes with exit flag
+ * If we're in a network with TestingDirAuthVoteExit set,
+ * this can cause false positives on have_consensus_path,
+ * incorrectly setting it to CONSENSUS_PATH_EXIT. This is
+ * an unavoidable feature of forcing authorities to declare
+ * certain nodes as exits.
+ */
count_usable_descriptors(&np, &nu, exits, consensus, options, now,
- NULL, 1);
+ NULL, USABLE_DESCRIPTOR_EXIT_ONLY);
+ log_debug(LD_NET,
+ "%s: %d present, %d usable",
+ "exits",
+ np,
+ nu);
+
+ /* We need at least 1 exit present in the consensus to consider
+ * building exit paths */
+ /* Update our understanding of whether the consensus has exits */
+ consensus_path_type_t old_have_consensus_path = have_consensus_path;
+ have_consensus_path = ((np > 0) ?
+ CONSENSUS_PATH_EXIT :
+ CONSENSUS_PATH_INTERNAL);
+
+ if (have_consensus_path == CONSENSUS_PATH_INTERNAL
+ && old_have_consensus_path != have_consensus_path) {
+ log_notice(LD_NET,
+ "The current consensus has no exit nodes. "
+ "Tor can only build internal paths, "
+ "such as paths to hidden services.");
+
+ /* However, exit nodes can reachability self-test using this consensus,
+ * join the network, and appear in a later consensus. This will allow
+ * the network to build exit paths, such as paths for world wide web
+ * browsing (as distinct from hidden service web browsing). */
+ }
+
/* All nodes with exit flag in ExitNodes option */
count_usable_descriptors(&np, &nu, myexits, consensus, options, now,
- options->ExitNodes, 1);
+ options->ExitNodes, USABLE_DESCRIPTOR_EXIT_ONLY);
+ log_debug(LD_NET,
+ "%s: %d present, %d usable",
+ "myexits",
+ np,
+ nu);
+
/* Now compute the nodes in the ExitNodes option where which we don't know
* what their exit policy is, or we know it permits something. */
count_usable_descriptors(&np, &nu, myexits_unflagged,
consensus, options, now,
- options->ExitNodes, 0);
+ options->ExitNodes, USABLE_DESCRIPTOR_ALL);
+ log_debug(LD_NET,
+ "%s: %d present, %d usable",
+ "myexits_unflagged (initial)",
+ np,
+ nu);
+
SMARTLIST_FOREACH_BEGIN(myexits_unflagged, const node_t *, node) {
- if (node_has_descriptor(node) && node_exit_policy_rejects_all(node))
+ if (node_has_descriptor(node) && node_exit_policy_rejects_all(node)) {
SMARTLIST_DEL_CURRENT(myexits_unflagged, node);
+ /* this node is not actually an exit */
+ np--;
+ /* this node is unusable as an exit */
+ nu--;
+ }
} SMARTLIST_FOREACH_END(node);
+ log_debug(LD_NET,
+ "%s: %d present, %d usable",
+ "myexits_unflagged (final)",
+ np,
+ nu);
+
f_guard = frac_nodes_with_descriptors(guards, WEIGHT_FOR_GUARD);
f_mid = frac_nodes_with_descriptors(mid, WEIGHT_FOR_MID);
f_exit = frac_nodes_with_descriptors(exits, WEIGHT_FOR_EXIT);
@@ -1418,6 +1535,12 @@ compute_frac_paths_available(const networkstatus_t *consensus,
f_myexit_unflagged=
frac_nodes_with_descriptors(myexits_unflagged,WEIGHT_FOR_EXIT);
+ log_debug(LD_NET,
+ "f_exit: %.2f, f_myexit: %.2f, f_myexit_unflagged: %.2f",
+ f_exit,
+ f_myexit,
+ f_myexit_unflagged);
+
/* If our ExitNodes list has eliminated every possible Exit node, and there
* were some possible Exit nodes, then instead consider nodes that permit
* exiting to some ports. */
@@ -1439,16 +1562,28 @@ compute_frac_paths_available(const networkstatus_t *consensus,
if (f_myexit < f_exit)
f_exit = f_myexit;
+ /* if the consensus has no exits, treat the exit fraction as 100% */
+ if (router_have_consensus_path() != CONSENSUS_PATH_EXIT) {
+ f_exit = 1.0;
+ }
+
+ f_path = f_guard * f_mid * f_exit;
+
if (status_out)
tor_asprintf(status_out,
"%d%% of guards bw, "
"%d%% of midpoint bw, and "
- "%d%% of exit bw",
+ "%d%% of exit bw%s = "
+ "%d%% of path bw",
(int)(f_guard*100),
(int)(f_mid*100),
- (int)(f_exit*100));
+ (int)(f_exit*100),
+ (router_have_consensus_path() == CONSENSUS_PATH_EXIT ?
+ "" :
+ " (no exits in consensus)"),
+ (int)(f_path*100));
- return f_guard * f_mid * f_exit;
+ return f_path;
}
/** We just fetched a new set of descriptors. Compute how far through
@@ -1521,6 +1656,9 @@ update_router_have_minimum_dir_info(void)
using_md = consensus->flavor == FLAV_MICRODESC;
+#define NOTICE_DIR_INFO_STATUS_INTERVAL (60)
+
+ /* Check fraction of available paths */
{
char *status = NULL;
int num_present=0, num_usable=0;
@@ -1529,16 +1667,37 @@ update_router_have_minimum_dir_info(void)
&status);
if (paths < get_frac_paths_needed_for_circs(options,consensus)) {
- tor_snprintf(dir_info_status, sizeof(dir_info_status),
- "We need more %sdescriptors: we have %d/%d, and "
- "can only build %d%% of likely paths. (We have %s.)",
- using_md?"micro":"", num_present, num_usable,
- (int)(paths*100), status);
- /* log_notice(LD_NET, "%s", dir_info_status); */
+ /* these messages can be excessive in testing networks */
+ static ratelim_t last_warned =
+ RATELIM_INIT(NOTICE_DIR_INFO_STATUS_INTERVAL);
+ char *suppression_msg = NULL;
+ if ((suppression_msg = rate_limit_log(&last_warned, time(NULL)))) {
+ tor_snprintf(dir_info_status, sizeof(dir_info_status),
+ "We need more %sdescriptors: we have %d/%d, and "
+ "can only build %d%% of likely paths. (We have %s.)",
+ using_md?"micro":"", num_present, num_usable,
+ (int)(paths*100), status);
+ log_warn(LD_NET, "%s%s", dir_info_status, suppression_msg);
+ tor_free(suppression_msg);
+ }
tor_free(status);
res = 0;
control_event_bootstrap(BOOTSTRAP_STATUS_REQUESTING_DESCRIPTORS, 0);
goto done;
+ } else {
+ /* these messages can be excessive in testing networks */
+ static ratelim_t last_warned =
+ RATELIM_INIT(NOTICE_DIR_INFO_STATUS_INTERVAL);
+ char *suppression_msg = NULL;
+ if ((suppression_msg = rate_limit_log(&last_warned, time(NULL)))) {
+ tor_snprintf(dir_info_status, sizeof(dir_info_status),
+ "We have enough %sdescriptors: we have %d/%d, and "
+ "can build %d%% of likely paths. (We have %s.)",
+ using_md?"micro":"", num_present, num_usable,
+ (int)(paths*100), status);
+ log_info(LD_NET, "%s%s", dir_info_status, suppression_msg);
+ tor_free(suppression_msg);
+ }
}
tor_free(status);
@@ -1546,12 +1705,16 @@ update_router_have_minimum_dir_info(void)
}
done:
+
+ /* If paths have just become available in this update. */
if (res && !have_min_dir_info) {
log_notice(LD_DIR,
"We now have enough directory information to build circuits.");
control_event_client_status(LOG_NOTICE, "ENOUGH_DIR_INFO");
control_event_bootstrap(BOOTSTRAP_STATUS_CONN_OR, 0);
}
+
+ /* If paths have just become unavailable in this update. */
if (!res && have_min_dir_info) {
int quiet = directory_too_idle_to_fetch_descriptors(options, now);
tor_log(quiet ? LOG_INFO : LOG_NOTICE, LD_DIR,
@@ -1562,8 +1725,8 @@ update_router_have_minimum_dir_info(void)
* is back up and usable, and b) disable some activities that Tor
* should only do while circuits are working, like reachability tests
* and fetching bridge descriptors only over circuits. */
- can_complete_circuit = 0;
-
+ note_that_we_maybe_cant_complete_circuits();
+ have_consensus_path = CONSENSUS_PATH_UNKNOWN;
control_event_client_status(LOG_NOTICE, "NOT_ENOUGH_DIR_INFO");
}
have_min_dir_info = res;
diff --git a/src/or/nodelist.h b/src/or/nodelist.h
index 48b0e94be0..a131e0dd4e 100644
--- a/src/or/nodelist.h
+++ b/src/or/nodelist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -79,7 +79,37 @@ int node_is_unreliable(const node_t *router, int need_uptime,
int router_exit_policy_all_nodes_reject(const tor_addr_t *addr, uint16_t port,
int need_uptime);
void router_set_status(const char *digest, int up);
+
+/** router_have_minimum_dir_info tests to see if we have enough
+ * descriptor information to create circuits.
+ * If there are exits in the consensus, we wait until we have enough
+ * info to create exit paths before creating any circuits. If there are
+ * no exits in the consensus, we wait for enough info to create internal
+ * paths, and should avoid creating exit paths, as they will simply fail.
+ * We make sure we create all available circuit types at the same time. */
int router_have_minimum_dir_info(void);
+
+/** Set to CONSENSUS_PATH_EXIT if there is at least one exit node
+ * in the consensus. We update this flag in compute_frac_paths_available if
+ * there is at least one relay that has an Exit flag in the consensus.
+ * Used to avoid building exit circuits when they will almost certainly fail.
+ * Set to CONSENSUS_PATH_INTERNAL if there are no exits in the consensus.
+ * (This situation typically occurs during bootstrap of a test network.)
+ * Set to CONSENSUS_PATH_UNKNOWN if we have never checked, or have
+ * reason to believe our last known value was invalid or has expired.
+ */
+typedef enum {
+ /* we haven't checked yet, or we have invalidated our previous check */
+ CONSENSUS_PATH_UNKNOWN = -1,
+ /* The consensus only has internal relays, and we should only
+ * create internal paths, circuits, streams, ... */
+ CONSENSUS_PATH_INTERNAL = 0,
+ /* The consensus has at least one exit, and can therefore (potentially)
+ * create exit and internal paths, circuits, streams, ... */
+ CONSENSUS_PATH_EXIT = 1
+} consensus_path_type_t;
+consensus_path_type_t router_have_consensus_path(void);
+
void router_dir_info_changed(void);
const char *get_dir_info_status_string(void);
int count_loading_descriptors_progress(void);
diff --git a/src/or/ntmain.c b/src/or/ntmain.c
index ea6ec3b03e..833d870041 100644
--- a/src/or/ntmain.c
+++ b/src/or/ntmain.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
diff --git a/src/or/ntmain.h b/src/or/ntmain.h
index 68565e17ca..eb55a296f6 100644
--- a/src/or/ntmain.h
+++ b/src/or/ntmain.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion.c b/src/or/onion.c
index b8f85f9194..43fb63c832 100644
--- a/src/or/onion.c
+++ b/src/or/onion.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -295,6 +295,8 @@ onion_pending_remove(or_circuit_t *circ)
victim = circ->onionqueue_entry;
if (victim)
onion_queue_entry_remove(victim);
+
+ cpuworker_cancel_circ_handshake(circ);
}
/** Remove a queue entry <b>victim</b> from the queue, unlinking it from
@@ -339,25 +341,25 @@ clear_pending_onions(void)
/* ============================================================ */
-/** Fill in a server_onion_keys_t object at <b>keys</b> with all of the keys
+/** Return a new server_onion_keys_t object with all of the keys
* and other info we might need to do onion handshakes. (We make a copy of
* our keys for each cpuworker to avoid race conditions with the main thread,
* and to avoid locking) */
-void
-setup_server_onion_keys(server_onion_keys_t *keys)
+server_onion_keys_t *
+server_onion_keys_new(void)
{
- memset(keys, 0, sizeof(server_onion_keys_t));
+ server_onion_keys_t *keys = tor_malloc_zero(sizeof(server_onion_keys_t));
memcpy(keys->my_identity, router_get_my_id_digest(), DIGEST_LEN);
dup_onion_keys(&keys->onion_key, &keys->last_onion_key);
keys->curve25519_key_map = construct_ntor_key_map();
keys->junk_keypair = tor_malloc_zero(sizeof(curve25519_keypair_t));
curve25519_keypair_generate(keys->junk_keypair, 0);
+ return keys;
}
-/** Release all storage held in <b>keys</b>, but do not free <b>keys</b>
- * itself (as it's likely to be stack-allocated.) */
+/** Release all storage held in <b>keys</b>. */
void
-release_server_onion_keys(server_onion_keys_t *keys)
+server_onion_keys_free(server_onion_keys_t *keys)
{
if (! keys)
return;
@@ -366,7 +368,8 @@ release_server_onion_keys(server_onion_keys_t *keys)
crypto_pk_free(keys->last_onion_key);
ntor_key_map_free(keys->curve25519_key_map);
tor_free(keys->junk_keypair);
- memset(keys, 0, sizeof(server_onion_keys_t));
+ memwipe(keys, 0, sizeof(server_onion_keys_t));
+ tor_free(keys);
}
/** Release whatever storage is held in <b>state</b>, depending on its
diff --git a/src/or/onion.h b/src/or/onion.h
index 2fd86206e4..96050083f8 100644
--- a/src/or/onion.h
+++ b/src/or/onion.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -30,8 +30,8 @@ typedef struct server_onion_keys_t {
#define MAX_ONIONSKIN_CHALLENGE_LEN 255
#define MAX_ONIONSKIN_REPLY_LEN 255
-void setup_server_onion_keys(server_onion_keys_t *keys);
-void release_server_onion_keys(server_onion_keys_t *keys);
+server_onion_keys_t *server_onion_keys_new(void);
+void server_onion_keys_free(server_onion_keys_t *keys);
void onion_handshake_state_release(onion_handshake_state_t *state);
diff --git a/src/or/onion_fast.c b/src/or/onion_fast.c
index 0ca3e3a5a0..a52a11357c 100644
--- a/src/or/onion_fast.c
+++ b/src/or/onion_fast.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_fast.h b/src/or/onion_fast.h
index 2fc605fc42..da3c217ae9 100644
--- a/src/or/onion_fast.h
+++ b/src/or/onion_fast.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_ntor.c b/src/or/onion_ntor.c
index c028ed0ff9..7f58f4d758 100644
--- a/src/or/onion_ntor.c
+++ b/src/or/onion_ntor.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/or/onion_ntor.h b/src/or/onion_ntor.h
index 29178e942d..230941c3c5 100644
--- a/src/or/onion_ntor.h
+++ b/src/or/onion_ntor.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_ONION_NTOR_H
diff --git a/src/or/onion_tap.c b/src/or/onion_tap.c
index b3b2a008bc..8879a22ca2 100644
--- a/src/or/onion_tap.c
+++ b/src/or/onion_tap.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/onion_tap.h b/src/or/onion_tap.h
index 36fb649d60..f02a4f6f51 100644
--- a/src/or/onion_tap.h
+++ b/src/or/onion_tap.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/or.h b/src/or/or.h
index b95bfb15a9..49068784f9 100644
--- a/src/or/or.h
+++ b/src/or/or.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -119,6 +119,7 @@
* conflict with system-defined signals. */
#define SIGNEWNYM 129
#define SIGCLEARDNSCACHE 130
+#define SIGHEARTBEAT 131
#if (SIZEOF_CELL_T != 0)
/* On Irix, stdlib.h defines a cell_t type, so we need to make sure
@@ -212,8 +213,7 @@ typedef enum {
#define CONN_TYPE_DIR_LISTENER 8
/** Type for HTTP connections to the directory server. */
#define CONN_TYPE_DIR 9
-/** Connection from the main process to a CPU worker process. */
-#define CONN_TYPE_CPUWORKER 10
+/* Type 10 is unused. */
/** Type for listening for connections from user interface process. */
#define CONN_TYPE_CONTROL_LISTENER 11
/** Type for connections from user interface process. */
@@ -275,17 +275,6 @@ typedef enum {
/** State for any listener connection. */
#define LISTENER_STATE_READY 0
-#define CPUWORKER_STATE_MIN_ 1
-/** State for a connection to a cpuworker process that's idle. */
-#define CPUWORKER_STATE_IDLE 1
-/** State for a connection to a cpuworker process that's processing a
- * handshake. */
-#define CPUWORKER_STATE_BUSY_ONION 2
-#define CPUWORKER_STATE_MAX_ 2
-
-#define CPUWORKER_TASK_ONION CPUWORKER_STATE_BUSY_ONION
-#define CPUWORKER_TASK_SHUTDOWN 255
-
#define OR_CONN_STATE_MIN_ 1
/** State for a connection to an OR: waiting for connect() to finish. */
#define OR_CONN_STATE_CONNECTING 1
@@ -676,6 +665,10 @@ typedef enum {
/* Negative reasons are internal: we never send them in a DESTROY or TRUNCATE
* call; they only go to the controller for tracking */
+
+/* Closing introduction point that were opened in parallel. */
+#define END_CIRC_REASON_IP_NOW_REDUNDANT -4
+
/** Our post-timeout circuit time measurement period expired.
* We must give up now */
#define END_CIRC_REASON_MEASUREMENT_EXPIRED -3
@@ -1138,6 +1131,51 @@ typedef struct socks_request_t socks_request_t;
#define generic_buffer_t buf_t
#endif
+typedef struct entry_port_cfg_t {
+ /* Client port types (socks, dns, trans, natd) only: */
+ uint8_t isolation_flags; /**< Zero or more isolation flags */
+ int session_group; /**< A session group, or -1 if this port is not in a
+ * session group. */
+
+ /* Socks only: */
+ /** When both no-auth and user/pass are advertised by a SOCKS client, select
+ * no-auth. */
+ unsigned int socks_prefer_no_auth : 1;
+
+ /* Client port types only: */
+ unsigned int ipv4_traffic : 1;
+ unsigned int ipv6_traffic : 1;
+ unsigned int prefer_ipv6 : 1;
+
+ /** For a socks listener: should we cache IPv4/IPv6 DNS information that
+ * exit nodes tell us?
+ *
+ * @{ */
+ unsigned int cache_ipv4_answers : 1;
+ unsigned int cache_ipv6_answers : 1;
+ /** @} */
+ /** For a socks listeners: if we find an answer in our client-side DNS cache,
+ * should we use it?
+ *
+ * @{ */
+ unsigned int use_cached_ipv4_answers : 1;
+ unsigned int use_cached_ipv6_answers : 1;
+ /** @} */
+ /** For socks listeners: When we can automap an address to IPv4 or IPv6,
+ * do we prefer IPv6? */
+ unsigned int prefer_ipv6_virtaddr : 1;
+
+} entry_port_cfg_t;
+
+typedef struct server_port_cfg_t {
+ /* Server port types (or, dir) only: */
+ unsigned int no_advertise : 1;
+ unsigned int no_listen : 1;
+ unsigned int all_addrs : 1;
+ unsigned int bind_ipv4_only : 1;
+ unsigned int bind_ipv6_only : 1;
+} server_port_cfg_t;
+
/* Values for connection_t.magic: used to make sure that downcasts (casts from
* connection_t to foo_connection_t) are safe. */
#define BASE_CONNECTION_MAGIC 0x7C3C304Eu
@@ -1273,52 +1311,7 @@ typedef struct listener_connection_t {
* to the evdns_server_port it uses to listen to and answer connections. */
struct evdns_server_port *dns_server_port;
- /** @name Isolation parameters
- *
- * For an AP listener, these fields describe how to isolate streams that
- * arrive on the listener.
- *
- * @{
- */
- /** The session group for this listener. */
- int session_group;
- /** One or more ISO_ flags to describe how to isolate streams. */
- uint8_t isolation_flags;
- /**@}*/
- /** For SOCKS connections only: If this is set, we will choose "no
- * authentication" instead of "username/password" authentication if both
- * are offered. Used as input to parse_socks. */
- unsigned int socks_prefer_no_auth : 1;
-
- /** For a SOCKS listeners, these fields describe whether we should
- * allow IPv4 and IPv6 addresses from our exit nodes, respectively.
- *
- * @{
- */
- unsigned int socks_ipv4_traffic : 1;
- unsigned int socks_ipv6_traffic : 1;
- /** @} */
- /** For a socks listener: should we tell the exit that we prefer IPv6
- * addresses? */
- unsigned int socks_prefer_ipv6 : 1;
-
- /** For a socks listener: should we cache IPv4/IPv6 DNS information that
- * exit nodes tell us?
- *
- * @{ */
- unsigned int cache_ipv4_answers : 1;
- unsigned int cache_ipv6_answers : 1;
- /** @} */
- /** For a socks listeners: if we find an answer in our client-side DNS cache,
- * should we use it?
- *
- * @{ */
- unsigned int use_cached_ipv4_answers : 1;
- unsigned int use_cached_ipv6_answers : 1;
- /** @} */
- /** For socks listeners: When we can automap an address to IPv4 or IPv6,
- * do we prefer IPv6? */
- unsigned int prefer_ipv6_virtaddr : 1;
+ entry_port_cfg_t entry_cfg;
} listener_connection_t;
@@ -1426,6 +1419,18 @@ typedef struct or_handshake_state_t {
/** Length of Extended ORPort connection identifier. */
#define EXT_OR_CONN_ID_LEN DIGEST_LEN /* 20 */
+/*
+ * OR_CONN_HIGHWATER and OR_CONN_LOWWATER moved from connection_or.c so
+ * channeltls.c can see them too.
+ */
+
+/** When adding cells to an OR connection's outbuf, keep adding until the
+ * outbuf is at least this long, or we run out of cells. */
+#define OR_CONN_HIGHWATER (32*1024)
+
+/** Add cells to an OR connection's outbuf whenever the outbuf's data length
+ * drops below this size. */
+#define OR_CONN_LOWWATER (16*1024)
/** Subtype of connection_t for an "OR connection" -- that is, one that speaks
* cells over TLS. */
@@ -1517,6 +1522,12 @@ typedef struct or_connection_t {
/** Last emptied write token bucket in msec since midnight; only used if
* TB_EMPTY events are enabled. */
uint32_t write_emptied_time;
+
+ /*
+ * Count the number of bytes flushed out on this orconn, and the number of
+ * bytes TLS actually sent - used for overhead estimation for scheduling.
+ */
+ uint64_t bytes_xmitted, bytes_xmitted_by_tls;
} or_connection_t;
/** Subtype of connection_t for an "edge connection" -- that is, an entry (ap)
@@ -1588,12 +1599,10 @@ typedef struct entry_connection_t {
* only.) */
/* === Isolation related, AP only. === */
- /** AP only: based on which factors do we isolate this stream? */
- uint8_t isolation_flags;
- /** AP only: what session group is this stream in? */
- int session_group;
+ entry_port_cfg_t entry_cfg;
/** AP only: The newnym epoch in which we created this connection. */
unsigned nym_epoch;
+
/** AP only: The original requested address before we rewrote it. */
char *original_dest_address;
/* Other fields to isolate on already exist. The ClientAddr is addr. The
@@ -1652,33 +1661,8 @@ typedef struct entry_connection_t {
*/
unsigned int may_use_optimistic_data : 1;
- /** Should we permit IPv4 and IPv6 traffic to use this connection?
- *
- * @{ */
- unsigned int ipv4_traffic_ok : 1;
- unsigned int ipv6_traffic_ok : 1;
- /** @} */
- /** Should we say we prefer IPv6 traffic? */
- unsigned int prefer_ipv6_traffic : 1;
-
- /** For a socks listener: should we cache IPv4/IPv6 DNS information that
- * exit nodes tell us?
- *
- * @{ */
- unsigned int cache_ipv4_answers : 1;
- unsigned int cache_ipv6_answers : 1;
- /** @} */
- /** For a socks listeners: if we find an answer in our client-side DNS cache,
- * should we use it?
- *
- * @{ */
- unsigned int use_cached_ipv4_answers : 1;
- unsigned int use_cached_ipv6_answers : 1;
- /** @} */
- /** For socks listeners: When we can automap an address to IPv4 or IPv6,
- * do we prefer IPv6? */
- unsigned int prefer_ipv6_virtaddr : 1;
-
+ /** Are we a socks SocksSocket listener? */
+ unsigned int is_socks_socket:1;
} entry_connection_t;
typedef enum {
@@ -2711,8 +2695,14 @@ typedef struct {
time_t expiry_time;
} cpath_build_state_t;
+/** "magic" value for an origin_circuit_t */
#define ORIGIN_CIRCUIT_MAGIC 0x35315243u
+/** "magic" value for an or_circuit_t */
#define OR_CIRCUIT_MAGIC 0x98ABC04Fu
+/** "magic" value for a circuit that would have been freed by circuit_free,
+ * but which we're keeping around until a cpuworker reply arrives. See
+ * circuit_free() for more documentation. */
+#define DEAD_CIRCUIT_MAGIC 0xdeadc14c
struct create_cell_t;
@@ -3132,6 +3122,9 @@ typedef struct or_circuit_t {
/** Pointer to an entry on the onion queue, if this circuit is waiting for a
* chance to give an onionskin to a cpuworker. Used only in onion.c */
struct onion_queue_t *onionqueue_entry;
+ /** Pointer to a workqueue entry, if this circuit has given an onionskin to
+ * a cpuworker and is waiting for a response. Used only in cpuworker.c */
+ struct workqueue_entry_s *workqueue_entry;
/** The circuit_id used in the previous (backward) hop of this circuit. */
circid_t p_circ_id;
@@ -3181,6 +3174,10 @@ typedef struct or_circuit_t {
/** True iff this circuit was made with a CREATE_FAST cell. */
unsigned int is_first_hop : 1;
+ /** If set, this circuit carries HS traffic. Consider it in any HS
+ * statistics. */
+ unsigned int circuit_carries_hs_traffic_stats : 1;
+
/** Number of cells that were removed from circuit queue; reset every
* time when writing buffer stats to disk. */
uint32_t processed_cells;
@@ -3315,44 +3312,9 @@ typedef struct port_cfg_t {
uint8_t type; /**< One of CONN_TYPE_*_LISTENER */
unsigned is_unix_addr : 1; /**< True iff this is an AF_UNIX address. */
- /* Client port types (socks, dns, trans, natd) only: */
- uint8_t isolation_flags; /**< Zero or more isolation flags */
- int session_group; /**< A session group, or -1 if this port is not in a
- * session group. */
- /* Socks only: */
- /** When both no-auth and user/pass are advertised by a SOCKS client, select
- * no-auth. */
- unsigned int socks_prefer_no_auth : 1;
+ entry_port_cfg_t entry_cfg;
- /* Server port types (or, dir) only: */
- unsigned int no_advertise : 1;
- unsigned int no_listen : 1;
- unsigned int all_addrs : 1;
- unsigned int bind_ipv4_only : 1;
- unsigned int bind_ipv6_only : 1;
-
- /* Client port types only: */
- unsigned int ipv4_traffic : 1;
- unsigned int ipv6_traffic : 1;
- unsigned int prefer_ipv6 : 1;
-
- /** For a socks listener: should we cache IPv4/IPv6 DNS information that
- * exit nodes tell us?
- *
- * @{ */
- unsigned int cache_ipv4_answers : 1;
- unsigned int cache_ipv6_answers : 1;
- /** @} */
- /** For a socks listeners: if we find an answer in our client-side DNS cache,
- * should we use it?
- *
- * @{ */
- unsigned int use_cached_ipv4_answers : 1;
- unsigned int use_cached_ipv6_answers : 1;
- /** @} */
- /** For socks listeners: When we can automap an address to IPv4 or IPv6,
- * do we prefer IPv6? */
- unsigned int prefer_ipv6_virtaddr : 1;
+ server_port_cfg_t server_cfg;
/* Unix sockets only: */
/** Path for an AF_UNIX address */
@@ -3501,6 +3463,10 @@ typedef struct {
* for control connections. */
int ControlSocketsGroupWritable; /**< Boolean: Are control sockets g+rw? */
+ config_line_t *SocksSocket; /**< List of Unix Domain Sockets to listen on
+ * for SOCKS connections. */
+
+ int SocksSocketsGroupWritable; /**< Boolean: Are SOCKS sockets g+rw? */
/** Ports to listen on for directory connections. */
config_line_t *DirPort_lines;
config_line_t *DNSPort_lines; /**< Ports to listen on for DNS requests. */
@@ -3510,6 +3476,8 @@ typedef struct {
uint64_t MaxMemInQueues_raw;
uint64_t MaxMemInQueues;/**< If we have more memory than this allocated
* for queues and buffers, run the OOM handler */
+ /** Above this value, consider ourselves low on RAM. */
+ uint64_t MaxMemInQueues_low_threshold;
/** @name port booleans
*
@@ -3521,6 +3489,7 @@ typedef struct {
*/
unsigned int ORPort_set : 1;
unsigned int SocksPort_set : 1;
+ unsigned int SocksSocket_set : 1;
unsigned int TransPort_set : 1;
unsigned int NATDPort_set : 1;
unsigned int ControlPort_set : 1;
@@ -3646,8 +3615,9 @@ typedef struct {
* hostname ending with one of the suffixes in
* <b>AutomapHostsSuffixes</b>, map it to a
* virtual address. */
- smartlist_t *AutomapHostsSuffixes; /**< List of suffixes for
- * <b>AutomapHostsOnResolve</b>. */
+ /** List of suffixes for <b>AutomapHostsOnResolve</b>. The special value
+ * "." means "match everything." */
+ smartlist_t *AutomapHostsSuffixes;
int RendPostPeriod; /**< How often do we post each rendezvous service
* descriptor? Remember to publish them independently. */
int KeepalivePeriod; /**< How often do we send padding cells to keep
@@ -3938,6 +3908,10 @@ typedef struct {
/** If true, the user wants us to collect statistics as entry node. */
int EntryStatistics;
+ /** If true, the user wants us to collect statistics as hidden service
+ * directory, introduction point, or rendezvous point. */
+ int HiddenServiceStatistics;
+
/** If true, include statistics file contents in extra-info documents. */
int ExtraInfoStatistics;
@@ -4071,6 +4045,11 @@ typedef struct {
* regardless of uptime and bandwidth. */
routerset_t *TestingDirAuthVoteGuard;
+ /** Relays in a testing network which should be voted HSDir
+ * regardless of uptime and ORPort connectivity.
+ * Respects VoteOnHidServDirectoriesV2. */
+ routerset_t *TestingDirAuthVoteHSDir;
+
/** Enable CONN_BW events. Only altered on testing networks. */
int TestingEnableConnBwEvent;
@@ -4225,8 +4204,25 @@ typedef struct {
/** How long (seconds) do we keep a guard before picking a new one? */
int GuardLifetime;
- /** Should we send the timestamps that pre-023 hidden services want? */
- int Support022HiddenServices;
+ /** Low-water mark for global scheduler - start sending when estimated
+ * queued size falls below this threshold.
+ */
+ uint64_t SchedulerLowWaterMark__;
+ /** High-water mark for global scheduler - stop sending when estimated
+ * queued size exceeds this threshold.
+ */
+ uint64_t SchedulerHighWaterMark__;
+ /** Flush size for global scheduler - flush this many cells at a time
+ * when sending.
+ */
+ int SchedulerMaxFlushCells__;
+
+ /** Is this an exit node? This is a tristate, where "1" means "yes, and use
+ * the default exit policy if none is given" and "0" means "no; exit policy
+ * is 'reject *'" and "auto" (-1) means "same as 1, but warn the user."
+ *
+ * XXXX Eventually, the default will be 0. */
+ int ExitRelay;
} or_options_t;
@@ -4898,7 +4894,8 @@ typedef struct rend_service_descriptor_t {
/** A cached rendezvous descriptor. */
typedef struct rend_cache_entry_t {
size_t len; /**< Length of <b>desc</b> */
- time_t received; /**< When was the descriptor received? */
+ time_t last_served; /**< When did we last write this one to somebody?
+ * (HSDir only) */
char *desc; /**< Service descriptor */
rend_service_descriptor_t *parsed; /**< Parsed value of 'desc' */
} rend_cache_entry_t;
@@ -4964,14 +4961,13 @@ typedef struct dir_server_t {
* or extrainfo documents.
*
* Passed to router_pick_directory_server (et al)
- *
- * [XXXX NOTE: This option is only implemented for pick_trusteddirserver,
- * not pick_directory_server. If we make it work on pick_directory_server
- * too, we could conservatively make it only prevent multiple fetches to
- * the same authority, or we could aggressively make it prevent multiple
- * fetches to _any_ single directory server.]
*/
#define PDS_NO_EXISTING_SERVERDESC_FETCH (1<<3)
+/** Flag to indicate that we should not use any directory authority to which
+ * we have an existing directory connection for downloading microdescs.
+ *
+ * Passed to router_pick_directory_server (et al)
+ */
#define PDS_NO_EXISTING_MICRODESC_FETCH (1<<4)
/** This node is to be chosen as a directory guard, so don't choose any
@@ -4999,15 +4995,31 @@ typedef enum {
/** Return value for router_add_to_routerlist() and dirserv_add_descriptor() */
typedef enum was_router_added_t {
+ /* Router was added successfully. */
ROUTER_ADDED_SUCCESSFULLY = 1,
+ /* Router descriptor was added with warnings to submitter. */
ROUTER_ADDED_NOTIFY_GENERATOR = 0,
+ /* Extrainfo document was rejected because no corresponding router
+ * descriptor was found OR router descriptor was rejected because
+ * it was incompatible with its extrainfo document. */
ROUTER_BAD_EI = -1,
- ROUTER_WAS_NOT_NEW = -2,
+ /* Router descriptor was rejected because it is already known. */
+ ROUTER_IS_ALREADY_KNOWN = -2,
+ /* General purpose router was rejected, because it was not listed
+ * in consensus. */
ROUTER_NOT_IN_CONSENSUS = -3,
+ /* Router was neither in directory consensus nor in any of
+ * networkstatus documents. Caching it to access later.
+ * (Applies to fetched descriptors only.) */
ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS = -4,
+ /* Router was rejected by directory authority. */
ROUTER_AUTHDIR_REJECTS = -5,
+ /* Bridge descriptor was rejected because such bridge was not one
+ * of the bridges we have listed in our configuration. */
ROUTER_WAS_NOT_WANTED = -6,
- ROUTER_WAS_TOO_OLD = -7,
+ /* Router descriptor was rejected because it was older than
+ * OLD_ROUTER_DESC_MAX_AGE. */
+ ROUTER_WAS_TOO_OLD = -7, /* note contrast with 'NOT_NEW' */
} was_router_added_t;
/********************************* routerparse.c ************************/
diff --git a/src/or/policies.c b/src/or/policies.c
index d10bebd79a..560b8cb4c3 100644
--- a/src/or/policies.c
+++ b/src/or/policies.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -434,6 +434,33 @@ validate_addr_policies(const or_options_t *options, char **msg)
REJECT("Error in ExitPolicy entry.");
}
+ static int warned_about_exitrelay = 0;
+
+ const int exitrelay_setting_is_auto = options->ExitRelay == -1;
+ const int policy_accepts_something =
+ ! (policy_is_reject_star(addr_policy, AF_INET) &&
+ policy_is_reject_star(addr_policy, AF_INET6));
+
+ if (server_mode(options) &&
+ ! warned_about_exitrelay &&
+ exitrelay_setting_is_auto &&
+ policy_accepts_something) {
+ /* Policy accepts something */
+ warned_about_exitrelay = 1;
+ log_warn(LD_CONFIG,
+ "Tor is running as an exit relay%s. If you did not want this "
+ "behavior, please set the ExitRelay option to 0. If you do "
+ "want to run an exit Relay, please set the ExitRelay option "
+ "to 1 to disable this warning, and for forward compatibility.",
+ options->ExitPolicy == NULL ?
+ " with the default exit policy" : "");
+ if (options->ExitPolicy == NULL) {
+ log_warn(LD_CONFIG,
+ "In a future version of Tor, ExitRelay 0 may become the "
+ "default when no ExitPolicy is given.");
+ }
+ }
+
/* The rest of these calls *append* to addr_policy. So don't actually
* use the results for anything other than checking if they parse! */
if (parse_addr_policy(options->DirPolicy, &addr_policy, -1))
@@ -1022,6 +1049,9 @@ policies_parse_exit_policy(config_line_t *cfg, smartlist_t **dest,
*
* If <b>or_options->BridgeRelay</b> is false, add entries of default
* Tor exit policy into <b>result</b> smartlist.
+ *
+ * If or_options->ExitRelay is false, then make our exit policy into
+ * "reject *:*" regardless.
*/
int
policies_parse_exit_policy_from_options(const or_options_t *or_options,
@@ -1030,6 +1060,12 @@ policies_parse_exit_policy_from_options(const or_options_t *or_options,
{
exit_policy_parser_cfg_t parser_cfg = 0;
+ if (or_options->ExitRelay == 0) {
+ append_exit_policy_string(result, "reject *4:*");
+ append_exit_policy_string(result, "reject *6:*");
+ return 0;
+ }
+
if (or_options->IPv6Exit) {
parser_cfg |= EXIT_POLICY_IPV6_ENABLED;
}
diff --git a/src/or/policies.h b/src/or/policies.h
index 90d94190dd..0225b57a2c 100644
--- a/src/or/policies.h
+++ b/src/or/policies.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/reasons.c b/src/or/reasons.c
index b0f1b65131..23ab6041a6 100644
--- a/src/or/reasons.c
+++ b/src/or/reasons.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -350,6 +350,8 @@ circuit_end_reason_to_control_string(int reason)
return "NOSUCHSERVICE";
case END_CIRC_REASON_MEASUREMENT_EXPIRED:
return "MEASUREMENT_EXPIRED";
+ case END_CIRC_REASON_IP_NOW_REDUNDANT:
+ return "IP_NOW_REDUNDANT";
default:
if (is_remote) {
/*
diff --git a/src/or/reasons.h b/src/or/reasons.h
index 8b3694b05a..00a099061b 100644
--- a/src/or/reasons.h
+++ b/src/or/reasons.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/relay.c b/src/or/relay.c
index 05c7b3c955..8653d8c461 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -39,6 +39,7 @@
#include "router.h"
#include "routerlist.h"
#include "routerparse.h"
+#include "scheduler.h"
static edge_connection_t *relay_lookup_conn(circuit_t *circ, cell_t *cell,
cell_direction_t cell_direction,
@@ -803,8 +804,10 @@ connection_ap_process_end_not_open(
return 0;
}
- if ((tor_addr_family(&addr) == AF_INET && !conn->ipv4_traffic_ok) ||
- (tor_addr_family(&addr) == AF_INET6 && !conn->ipv6_traffic_ok)) {
+ if ((tor_addr_family(&addr) == AF_INET &&
+ !conn->entry_cfg.ipv4_traffic) ||
+ (tor_addr_family(&addr) == AF_INET6 &&
+ !conn->entry_cfg.ipv6_traffic)) {
log_fn(LOG_PROTOCOL_WARN, LD_APP,
"Got an EXITPOLICY failure on a connection with a "
"mismatched family. Closing.");
@@ -1155,11 +1158,11 @@ connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn,
addr_hostname = addr;
}
} else if (tor_addr_family(&addr->addr) == AF_INET) {
- if (!addr_ipv4 && conn->ipv4_traffic_ok) {
+ if (!addr_ipv4 && conn->entry_cfg.ipv4_traffic) {
addr_ipv4 = addr;
}
} else if (tor_addr_family(&addr->addr) == AF_INET6) {
- if (!addr_ipv6 && conn->ipv6_traffic_ok) {
+ if (!addr_ipv6 && conn->entry_cfg.ipv6_traffic) {
addr_ipv6 = addr;
}
}
@@ -1180,7 +1183,7 @@ connection_ap_handshake_socks_got_resolved_cell(entry_connection_t *conn,
return;
}
- if (conn->prefer_ipv6_traffic) {
+ if (conn->entry_cfg.prefer_ipv6) {
addr_best = addr_ipv6 ? addr_ipv6 : addr_ipv4;
} else {
addr_best = addr_ipv4 ? addr_ipv4 : addr_ipv6;
@@ -1326,8 +1329,8 @@ connection_edge_process_relay_cell_not_open(
return 0;
}
- if ((family == AF_INET && ! entry_conn->ipv4_traffic_ok) ||
- (family == AF_INET6 && ! entry_conn->ipv6_traffic_ok)) {
+ if ((family == AF_INET && ! entry_conn->entry_cfg.ipv4_traffic) ||
+ (family == AF_INET6 && ! entry_conn->entry_cfg.ipv6_traffic)) {
log_fn(LOG_PROTOCOL_WARN, LD_APP,
"Got a connected cell to %s with unsupported address family."
" Closing.", fmt_addr(&addr));
@@ -2432,6 +2435,12 @@ cell_queues_get_total_allocation(void)
return total_cells_allocated * packed_cell_mem_cost();
}
+/** How long after we've been low on memory should we try to conserve it? */
+#define MEMORY_PRESSURE_INTERVAL (30*60)
+
+/** The time at which we were last low on memory. */
+static time_t last_time_under_memory_pressure = 0;
+
/** Check whether we've got too much space used for cells. If so,
* call the OOM handler and return 1. Otherwise, return 0. */
STATIC int
@@ -2440,13 +2449,37 @@ cell_queues_check_size(void)
size_t alloc = cell_queues_get_total_allocation();
alloc += buf_get_total_allocation();
alloc += tor_zlib_get_total_allocation();
- if (alloc >= get_options()->MaxMemInQueues) {
- circuits_handle_oom(alloc);
- return 1;
+ const size_t rend_cache_total = rend_cache_get_total_allocation();
+ alloc += rend_cache_total;
+ if (alloc >= get_options()->MaxMemInQueues_low_threshold) {
+ last_time_under_memory_pressure = approx_time();
+ if (alloc >= get_options()->MaxMemInQueues) {
+ /* If we're spending over 20% of the memory limit on hidden service
+ * descriptors, free them until we're down to 10%.
+ */
+ if (rend_cache_total > get_options()->MaxMemInQueues / 5) {
+ const size_t bytes_to_remove =
+ rend_cache_total - (size_t)(get_options()->MaxMemInQueues / 10);
+ rend_cache_clean_v2_descs_as_dir(time(NULL), bytes_to_remove);
+ alloc -= rend_cache_total;
+ alloc += rend_cache_get_total_allocation();
+ }
+ circuits_handle_oom(alloc);
+ return 1;
+ }
}
return 0;
}
+/** Return true if we've been under memory pressure in the last
+ * MEMORY_PRESSURE_INTERVAL seconds. */
+int
+have_been_under_memory_pressure(void)
+{
+ return last_time_under_memory_pressure + MEMORY_PRESSURE_INTERVAL
+ < approx_time();
+}
+
/**
* Update the number of cells available on the circuit's n_chan or p_chan's
* circuit mux.
@@ -2591,8 +2624,8 @@ packed_cell_get_circid(const packed_cell_t *cell, int wide_circ_ids)
* queue of the first active circuit on <b>chan</b>, and write them to
* <b>chan</b>-&gt;outbuf. Return the number of cells written. Advance
* the active circuit pointer to the next active circuit in the ring. */
-int
-channel_flush_from_first_active_circuit(channel_t *chan, int max)
+MOCK_IMPL(int,
+channel_flush_from_first_active_circuit, (channel_t *chan, int max))
{
circuitmux_t *cmux = NULL;
int n_flushed = 0;
@@ -2868,14 +2901,8 @@ append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
log_debug(LD_GENERAL, "Made a circuit active.");
}
- if (!channel_has_queued_writes(chan)) {
- /* There is no data at all waiting to be sent on the outbuf. Add a
- * cell, so that we can notice when it gets flushed, flushed_some can
- * get called, and we can start putting more data onto the buffer then.
- */
- log_debug(LD_GENERAL, "Primed a buffer.");
- channel_flush_from_first_active_circuit(chan, 1);
- }
+ /* New way: mark this as having waiting cells for the scheduler */
+ scheduler_channel_has_waiting_cells(chan);
}
/** Append an encoded value of <b>addr</b> to <b>payload_out</b>, which must
diff --git a/src/or/relay.h b/src/or/relay.h
index 73c399154d..cdc2a9ae19 100644
--- a/src/or/relay.h
+++ b/src/or/relay.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -50,6 +50,8 @@ void clean_cell_pool(void);
void dump_cell_pool_usage(int severity);
size_t packed_cell_mem_cost(void);
+int have_been_under_memory_pressure(void);
+
/* For channeltls.c */
void packed_cell_free(packed_cell_t *cell);
@@ -64,7 +66,8 @@ void append_cell_to_circuit_queue(circuit_t *circ, channel_t *chan,
cell_t *cell, cell_direction_t direction,
streamid_t fromstream);
void channel_unlink_all_circuits(channel_t *chan, smartlist_t *detached_out);
-int channel_flush_from_first_active_circuit(channel_t *chan, int max);
+MOCK_DECL(int, channel_flush_from_first_active_circuit,
+ (channel_t *chan, int max));
void assert_circuit_mux_okay(channel_t *chan);
void update_circuit_on_cmux_(circuit_t *circ, cell_direction_t direction,
const char *file, int lineno);
diff --git a/src/or/rendclient.c b/src/or/rendclient.c
index 10d13a37bb..0c02243828 100644
--- a/src/or/rendclient.c
+++ b/src/or/rendclient.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -130,16 +130,6 @@ rend_client_reextend_intro_circuit(origin_circuit_t *circ)
return result;
}
-/** Return true iff we should send timestamps in our INTRODUCE1 cells */
-static int
-rend_client_should_send_timestamp(void)
-{
- if (get_options()->Support022HiddenServices >= 0)
- return get_options()->Support022HiddenServices;
-
- return networkstatus_get_param(NULL, "Support022HiddenServices", 1, 0, 1);
-}
-
/** Called when we're trying to connect an ap conn; sends an INTRODUCE1 cell
* down introcirc if possible.
*/
@@ -251,14 +241,8 @@ rend_client_send_introduction(origin_circuit_t *introcirc,
REND_DESC_COOKIE_LEN);
v3_shift += 2+REND_DESC_COOKIE_LEN;
}
- if (rend_client_should_send_timestamp()) {
- uint32_t now = (uint32_t)time(NULL);
- now += 300;
- now -= now % 600;
- set_uint32(tmp+v3_shift+1, htonl(now));
- } else {
- set_uint32(tmp+v3_shift+1, 0);
- }
+ /* Once this held a timestamp. */
+ set_uint32(tmp+v3_shift+1, 0);
v3_shift += 4;
} /* if version 2 only write version number */
else if (entry->parsed->protocols & (1<<2)) {
@@ -370,8 +354,7 @@ rend_client_rendcirc_has_opened(origin_circuit_t *circ)
}
/**
- * Called to close other intro circuits we launched in parallel
- * due to timeout.
+ * Called to close other intro circuits we launched in parallel.
*/
static void
rend_client_close_other_intros(const char *onion_address)
@@ -388,7 +371,7 @@ rend_client_close_other_intros(const char *onion_address)
log_info(LD_REND|LD_CIRC, "Closing introduction circuit %d that we "
"built in parallel (Purpose %d).", oc->global_identifier,
c->purpose);
- circuit_mark_for_close(c, END_CIRC_REASON_TIMEOUT);
+ circuit_mark_for_close(c, END_CIRC_REASON_IP_NOW_REDUNDANT);
}
}
}
@@ -468,6 +451,13 @@ rend_client_introduction_acked(origin_circuit_t *circ,
/* XXXX If that call failed, should we close the rend circuit,
* too? */
return result;
+ } else {
+ /* Close circuit because no more intro points are usable thus not
+ * useful anymore. Change it's purpose before so we don't report an
+ * intro point failure again triggering an extra descriptor fetch. */
+ circuit_change_purpose(TO_CIRCUIT(circ),
+ CIRCUIT_PURPOSE_C_INTRODUCE_ACKED);
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_FINISHED);
}
}
return 0;
@@ -564,7 +554,12 @@ directory_clean_last_hid_serv_requests(time_t now)
/** Remove all requests related to the hidden service named
* <b>onion_address</b> from the history of times of requests to
- * hidden service directories. */
+ * hidden service directories.
+ *
+ * This is called from rend_client_note_connection_attempt_ended(), which
+ * must be idempotent, so any future changes to this function must leave
+ * it idempotent too.
+ */
static void
purge_hid_serv_from_last_hid_serv_requests(const char *onion_address)
{
@@ -1093,8 +1088,11 @@ rend_client_desc_trynow(const char *query)
/** Clear temporary state used only during an attempt to connect to
* the hidden service named <b>onion_address</b>. Called when a
- * connection attempt has ended; may be called occasionally at other
- * times, and should be reasonably harmless. */
+ * connection attempt has ended; it is possible for this to be called
+ * multiple times while handling an ended connection attempt, and
+ * any future changes to this function must ensure it remains
+ * idempotent.
+ */
void
rend_client_note_connection_attempt_ended(const char *onion_address)
{
diff --git a/src/or/rendclient.h b/src/or/rendclient.h
index 40d388c489..098c61d0a1 100644
--- a/src/or/rendclient.h
+++ b/src/or/rendclient.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendcommon.c b/src/or/rendcommon.c
index df74b745a2..866f4fb026 100644
--- a/src/or/rendcommon.c
+++ b/src/or/rendcommon.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -411,7 +411,7 @@ rend_desc_v2_is_parsable(rend_encoded_v2_service_descriptor_t *desc)
&test_intro_content,
&test_intro_size,
&test_encoded_size,
- &test_next, desc->desc_str);
+ &test_next, desc->desc_str, 1);
rend_service_descriptor_free(test_parsed);
tor_free(test_intro_content);
return (res >= 0);
@@ -704,6 +704,9 @@ static strmap_t *rend_cache = NULL;
* directories. */
static digestmap_t *rend_cache_v2_dir = NULL;
+/** DOCDOC */
+static size_t rend_cache_total_allocation = 0;
+
/** Initializes the service descriptor cache.
*/
void
@@ -713,12 +716,64 @@ rend_cache_init(void)
rend_cache_v2_dir = digestmap_new();
}
+/** Return the approximate number of bytes needed to hold <b>e</b>. */
+static size_t
+rend_cache_entry_allocation(const rend_cache_entry_t *e)
+{
+ if (!e)
+ return 0;
+
+ /* This doesn't count intro_nodes or key size */
+ return sizeof(*e) + e->len + sizeof(*e->parsed);
+}
+
+/** DOCDOC */
+size_t
+rend_cache_get_total_allocation(void)
+{
+ return rend_cache_total_allocation;
+}
+
+/** Decrement the total bytes attributed to the rendezvous cache by n. */
+static void
+rend_cache_decrement_allocation(size_t n)
+{
+ static int have_underflowed = 0;
+
+ if (rend_cache_total_allocation >= n) {
+ rend_cache_total_allocation -= n;
+ } else {
+ rend_cache_total_allocation = 0;
+ if (! have_underflowed) {
+ have_underflowed = 1;
+ log_warn(LD_BUG, "Underflow in rend_cache_decrement_allocation");
+ }
+ }
+}
+
+/** Increase the total bytes attributed to the rendezvous cache by n. */
+static void
+rend_cache_increment_allocation(size_t n)
+{
+ static int have_overflowed = 0;
+ if (rend_cache_total_allocation <= SIZE_MAX - n) {
+ rend_cache_total_allocation += n;
+ } else {
+ rend_cache_total_allocation = SIZE_MAX;
+ if (! have_overflowed) {
+ have_overflowed = 1;
+ log_warn(LD_BUG, "Overflow in rend_cache_increment_allocation");
+ }
+ }
+}
+
/** Helper: free storage held by a single service descriptor cache entry. */
static void
rend_cache_entry_free(rend_cache_entry_t *e)
{
if (!e)
return;
+ rend_cache_decrement_allocation(rend_cache_entry_allocation(e));
rend_service_descriptor_free(e->parsed);
tor_free(e->desc);
tor_free(e);
@@ -740,6 +795,7 @@ rend_cache_free_all(void)
digestmap_free(rend_cache_v2_dir, rend_cache_entry_free_);
rend_cache = NULL;
rend_cache_v2_dir = NULL;
+ rend_cache_total_allocation = 0;
}
/** Removes all old entries from the service descriptor cache.
@@ -777,31 +833,46 @@ rend_cache_purge(void)
}
/** Remove all old v2 descriptors and those for which this hidden service
- * directory is not responsible for any more. */
+ * directory is not responsible for any more.
+ *
+ * If at all possible, remove at least <b>force_remove</b> bytes of data.
+ */
void
-rend_cache_clean_v2_descs_as_dir(time_t now)
+rend_cache_clean_v2_descs_as_dir(time_t now, size_t force_remove)
{
digestmap_iter_t *iter;
time_t cutoff = now - REND_CACHE_MAX_AGE - REND_CACHE_MAX_SKEW;
- for (iter = digestmap_iter_init(rend_cache_v2_dir);
- !digestmap_iter_done(iter); ) {
- const char *key;
- void *val;
- rend_cache_entry_t *ent;
- digestmap_iter_get(iter, &key, &val);
- ent = val;
- if (ent->parsed->timestamp < cutoff ||
- !hid_serv_responsible_for_desc_id(key)) {
- char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
- base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN);
- log_info(LD_REND, "Removing descriptor with ID '%s' from cache",
- safe_str_client(key_base32));
- iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter);
- rend_cache_entry_free(ent);
- } else {
- iter = digestmap_iter_next(rend_cache_v2_dir, iter);
+ const int LAST_SERVED_CUTOFF_STEP = 1800;
+ time_t last_served_cutoff = cutoff;
+ size_t bytes_removed = 0;
+ do {
+ for (iter = digestmap_iter_init(rend_cache_v2_dir);
+ !digestmap_iter_done(iter); ) {
+ const char *key;
+ void *val;
+ rend_cache_entry_t *ent;
+ digestmap_iter_get(iter, &key, &val);
+ ent = val;
+ if (ent->parsed->timestamp < cutoff ||
+ ent->last_served < last_served_cutoff ||
+ !hid_serv_responsible_for_desc_id(key)) {
+ char key_base32[REND_DESC_ID_V2_LEN_BASE32 + 1];
+ base32_encode(key_base32, sizeof(key_base32), key, DIGEST_LEN);
+ log_info(LD_REND, "Removing descriptor with ID '%s' from cache",
+ safe_str_client(key_base32));
+ bytes_removed += rend_cache_entry_allocation(ent);
+ iter = digestmap_iter_next_rmv(rend_cache_v2_dir, iter);
+ rend_cache_entry_free(ent);
+ } else {
+ iter = digestmap_iter_next(rend_cache_v2_dir, iter);
+ }
}
- }
+
+ /* In case we didn't remove enough bytes, advance the cutoff a little. */
+ last_served_cutoff += LAST_SERVED_CUTOFF_STEP;
+ if (last_served_cutoff > now)
+ break;
+ } while (bytes_removed < force_remove);
}
/** Determines whether <b>a</b> is in the interval of <b>b</b> (excluded) and
@@ -903,6 +974,7 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc)
e = digestmap_get(rend_cache_v2_dir, desc_id_digest);
if (e) {
*desc = e->desc;
+ e->last_served = approx_time();
return 1;
}
return 0;
@@ -924,6 +996,7 @@ rend_cache_lookup_v2_desc_as_dir(const char *desc_id, const char **desc)
rend_cache_store_status_t
rend_cache_store_v2_desc_as_dir(const char *desc)
{
+ const or_options_t *options = get_options();
rend_service_descriptor_t *parsed;
char desc_id[DIGEST_LEN];
char *intro_content;
@@ -945,7 +1018,7 @@ rend_cache_store_v2_desc_as_dir(const char *desc)
}
while (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content,
&intro_size, &encoded_size,
- &next_desc, current_desc) >= 0) {
+ &next_desc, current_desc, 1) >= 0) {
number_parsed++;
/* We don't care about the introduction points. */
tor_free(intro_content);
@@ -985,24 +1058,35 @@ rend_cache_store_v2_desc_as_dir(const char *desc)
if (e && !strcmp(desc, e->desc)) {
log_info(LD_REND, "We already have this service descriptor with desc "
"ID %s.", safe_str(desc_id_base32));
- e->received = time(NULL);
goto skip;
}
/* Store received descriptor. */
if (!e) {
e = tor_malloc_zero(sizeof(rend_cache_entry_t));
digestmap_set(rend_cache_v2_dir, desc_id, e);
+ /* Treat something just uploaded as having been served a little
+ * while ago, so that flooding with new descriptors doesn't help
+ * too much.
+ */
+ e->last_served = approx_time() - 3600;
} else {
+ rend_cache_decrement_allocation(rend_cache_entry_allocation(e));
rend_service_descriptor_free(e->parsed);
tor_free(e->desc);
}
- e->received = time(NULL);
e->parsed = parsed;
e->desc = tor_strndup(current_desc, encoded_size);
e->len = encoded_size;
+ rend_cache_increment_allocation(rend_cache_entry_allocation(e));
log_info(LD_REND, "Successfully stored service descriptor with desc ID "
"'%s' and len %d.",
safe_str(desc_id_base32), (int)encoded_size);
+
+ /* Statistics: Note down this potentially new HS. */
+ if (options->HiddenServiceStatistics) {
+ rep_hist_stored_maybe_new_hs(e->parsed->pk);
+ }
+
number_stored++;
goto advance;
skip:
@@ -1084,7 +1168,7 @@ rend_cache_store_v2_desc_as_client(const char *desc,
/* Parse the descriptor. */
if (rend_parse_v2_service_descriptor(&parsed, desc_id, &intro_content,
&intro_size, &encoded_size,
- &next_desc, desc) < 0) {
+ &next_desc, desc, 0) < 0) {
log_warn(LD_REND, "Could not parse descriptor.");
goto err;
}
@@ -1165,31 +1249,25 @@ rend_cache_store_v2_desc_as_client(const char *desc,
/* Do we already have a newer descriptor? */
tor_snprintf(key, sizeof(key), "2%s", service_id);
e = (rend_cache_entry_t*) strmap_get_lc(rend_cache, key);
- if (e && e->parsed->timestamp > parsed->timestamp) {
- log_info(LD_REND, "We already have a newer service descriptor for "
+ if (e && e->parsed->timestamp >= parsed->timestamp) {
+ log_info(LD_REND, "We already have a new enough service descriptor for "
"service ID %s with the same desc ID and version.",
safe_str_client(service_id));
goto okay;
}
- /* Do we already have this descriptor? */
- if (e && !strcmp(desc, e->desc)) {
- log_info(LD_REND,"We already have this service descriptor %s.",
- safe_str_client(service_id));
- e->received = time(NULL);
- goto okay;
- }
if (!e) {
e = tor_malloc_zero(sizeof(rend_cache_entry_t));
strmap_set_lc(rend_cache, key, e);
} else {
+ rend_cache_decrement_allocation(rend_cache_entry_allocation(e));
rend_service_descriptor_free(e->parsed);
tor_free(e->desc);
}
- e->received = time(NULL);
e->parsed = parsed;
e->desc = tor_malloc_zero(encoded_size + 1);
strlcpy(e->desc, desc, encoded_size + 1);
e->len = encoded_size;
+ rend_cache_increment_allocation(rend_cache_entry_allocation(e));
log_debug(LD_REND,"Successfully stored rend desc '%s', len %d.",
safe_str_client(service_id), (int)encoded_size);
return RCS_OKAY;
diff --git a/src/or/rendcommon.h b/src/or/rendcommon.h
index 186326a0c1..8396cc3551 100644
--- a/src/or/rendcommon.h
+++ b/src/or/rendcommon.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -33,7 +33,7 @@ void rend_intro_point_free(rend_intro_point_t *intro);
void rend_cache_init(void);
void rend_cache_clean(time_t now);
-void rend_cache_clean_v2_descs_as_dir(time_t now);
+void rend_cache_clean_v2_descs_as_dir(time_t now, size_t min_to_remove);
void rend_cache_purge(void);
void rend_cache_free_all(void);
int rend_valid_service_id(const char *query);
@@ -51,7 +51,6 @@ rend_cache_store_status_t rend_cache_store_v2_desc_as_dir(const char *desc);
rend_cache_store_status_t rend_cache_store_v2_desc_as_client(const char *desc,
const char *desc_id_base32,
const rend_data_t *rend_query);
-
int rend_encode_v2_descriptors(smartlist_t *descs_out,
rend_service_descriptor_t *desc, time_t now,
uint8_t period, rend_auth_type_t auth_type,
@@ -64,6 +63,7 @@ int rend_id_is_in_interval(const char *a, const char *b, const char *c);
void rend_get_descriptor_id_bytes(char *descriptor_id_out,
const char *service_id,
const char *secret_id_part);
+size_t rend_cache_get_total_allocation(void);
#endif
diff --git a/src/or/rendmid.c b/src/or/rendmid.c
index 6a701e7a77..9f6ff86c47 100644
--- a/src/or/rendmid.c
+++ b/src/or/rendmid.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -281,6 +281,7 @@ int
rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
size_t request_len)
{
+ const or_options_t *options = get_options();
or_circuit_t *rend_circ;
char hexid[9];
int reason = END_CIRC_REASON_INTERNAL;
@@ -316,6 +317,12 @@ rend_mid_rendezvous(or_circuit_t *circ, const uint8_t *request,
goto err;
}
+ /* Statistics: Mark this circuit as an RP circuit so that we collect
+ stats from it. */
+ if (options->HiddenServiceStatistics) {
+ circ->circuit_carries_hs_traffic_stats = 1;
+ }
+
/* Send the RENDEZVOUS2 cell to Alice. */
if (relay_send_command_from_edge(0, TO_CIRCUIT(rend_circ),
RELAY_COMMAND_RENDEZVOUS2,
diff --git a/src/or/rendmid.h b/src/or/rendmid.h
index 25c711fa7b..6bd691a740 100644
--- a/src/or/rendmid.h
+++ b/src/or/rendmid.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index 3fed540e84..8d3f041759 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -16,6 +16,7 @@
#include "circuituse.h"
#include "config.h"
#include "directory.h"
+#include "main.h"
#include "networkstatus.h"
#include "nodelist.h"
#include "rendclient.h"
@@ -65,9 +66,16 @@ static ssize_t rend_service_parse_intro_for_v3(
* a real port on some IP.
*/
typedef struct rend_service_port_config_t {
+ /* The incoming HS virtual port we're mapping */
uint16_t virtual_port;
+ /* Is this an AF_UNIX port? */
+ unsigned int is_unix_addr:1;
+ /* The outgoing TCP port to use, if !is_unix_addr */
uint16_t real_port;
+ /* The outgoing IPv4 or IPv6 address to use, if !is_unix_addr */
tor_addr_t real_addr;
+ /* The socket path to connect to, if is_unix_addr */
+ char unix_addr[FLEXIBLE_ARRAY_MEMBER];
} rend_service_port_config_t;
/** Try to maintain this many intro points per service by default. */
@@ -128,6 +136,9 @@ typedef struct rend_service_t {
* when they do, this keeps us from launching multiple simultaneous attempts
* to connect to the same rend point. */
replaycache_t *accepted_intro_dh_parts;
+ /** If true, we don't close circuits for making requests to unsupported
+ * ports. */
+ int allow_unknown_ports;
} rend_service_t;
/** A list of rend_service_t's for services run on this OP.
@@ -275,16 +286,48 @@ rend_add_service(rend_service_t *service)
service->directory);
for (i = 0; i < smartlist_len(service->ports); ++i) {
p = smartlist_get(service->ports, i);
- log_debug(LD_REND,"Service maps port %d to %s",
- p->virtual_port, fmt_addrport(&p->real_addr, p->real_port));
+ if (!(p->is_unix_addr)) {
+ log_debug(LD_REND,
+ "Service maps port %d to %s",
+ p->virtual_port,
+ fmt_addrport(&p->real_addr, p->real_port));
+ } else {
+#ifdef HAVE_SYS_UN_H
+ log_debug(LD_REND,
+ "Service maps port %d to socket at \"%s\"",
+ p->virtual_port, p->unix_addr);
+#else
+ log_debug(LD_REND,
+ "Service maps port %d to an AF_UNIX socket, but we "
+ "have no AF_UNIX support on this platform. This is "
+ "probably a bug.",
+ p->virtual_port);
+#endif /* defined(HAVE_SYS_UN_H) */
+ }
}
}
}
+/** Return a new rend_service_port_config_t with its path set to
+ * <b>socket_path</b> or empty if <b>socket_path</b> is NULL */
+static rend_service_port_config_t *
+rend_service_port_config_new(const char *socket_path)
+{
+ if (!socket_path)
+ return tor_malloc_zero(sizeof(rend_service_port_config_t));
+
+ const size_t pathlen = strlen(socket_path) + 1;
+ rend_service_port_config_t *conf =
+ tor_malloc_zero(sizeof(rend_service_port_config_t) + pathlen);
+ memcpy(conf->unix_addr, socket_path, pathlen);
+ conf->is_unix_addr = 1;
+ return conf;
+}
+
/** Parses a real-port to virtual-port mapping and returns a new
* rend_service_port_config_t.
*
- * The format is: VirtualPort (IP|RealPort|IP:RealPort)?
+ * The format is: VirtualPort (IP|RealPort|IP:RealPort|'socket':path)?
*
* IP defaults to 127.0.0.1; RealPort defaults to VirtualPort.
*/
@@ -298,6 +341,9 @@ parse_port_config(const char *string)
tor_addr_t addr;
const char *addrport;
rend_service_port_config_t *result = NULL;
+ const char *socket_prefix = "socket:";
+ unsigned int is_unix_addr = 0;
+ char *socket_path = NULL;
sl = smartlist_new();
smartlist_split_string(sl, string, " ",
@@ -320,7 +366,26 @@ parse_port_config(const char *string)
tor_addr_from_ipv4h(&addr, 0x7F000001u); /* 127.0.0.1 */
} else {
addrport = smartlist_get(sl,1);
- if (strchr(addrport, ':') || strchr(addrport, '.')) {
+ /* If it starts with socket:, try to parse it as a socket path */
+ if (!strcmpstart(addrport, socket_prefix)) {
+ if (strlen(addrport + strlen(socket_prefix)) > 0) {
+#ifdef HAVE_SYS_UN_H
+ is_unix_addr = 1;
+ socket_path = tor_strdup(addrport + strlen(socket_prefix));
+#else
+ log_warn(LD_CONFIG,
+ "Hidden service port configuration %s is for an AF_UNIX "
+ "socket, but we have no support available on this platform",
+ escaped(addrport));
+ goto err;
+#endif /* defined(HAVE_SYS_UN_H) */
+ } else {
+ log_warn(LD_CONFIG,
+ "Empty socket path in hidden service port configuration.");
+ goto err;
+ }
+ } else if (strchr(addrport, ':') || strchr(addrport, '.')) {
+ /* else try it as an IP:port pair if it has a : or . in it */
if (tor_addr_port_lookup(addrport, &addr, &p)<0) {
log_warn(LD_CONFIG,"Unparseable address in hidden service port "
"configuration.");
@@ -339,13 +404,21 @@ parse_port_config(const char *string)
}
}
- result = tor_malloc(sizeof(rend_service_port_config_t));
+ /* Allow room for unix_addr */
+ result = rend_service_port_config_new(socket_path);
result->virtual_port = virtport;
- result->real_port = realport;
- tor_addr_copy(&result->real_addr, &addr);
+ result->is_unix_addr = is_unix_addr;
+ if (!is_unix_addr) {
+ result->real_port = realport;
+ tor_addr_copy(&result->real_addr, &addr);
+ result->unix_addr[0] = '\0';
+ }
+
err:
SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
smartlist_free(sl);
+ if (socket_path) tor_free(socket_path);
+
return result;
}
@@ -372,101 +445,114 @@ rend_config_services(const or_options_t *options, int validate_only)
if (!strcasecmp(line->key, "HiddenServiceDir")) {
if (service) { /* register the one we just finished parsing */
if (validate_only)
- rend_service_free(service);
- else
- rend_add_service(service);
- }
- service = tor_malloc_zero(sizeof(rend_service_t));
- service->directory = tor_strdup(line->value);
- service->ports = smartlist_new();
- service->intro_period_started = time(NULL);
- service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT;
- continue;
- }
- if (!service) {
- log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive",
- line->key);
- rend_service_free(service);
- return -1;
- }
- if (!strcasecmp(line->key, "HiddenServicePort")) {
- portcfg = parse_port_config(line->value);
- if (!portcfg) {
- rend_service_free(service);
- return -1;
- }
- smartlist_add(service->ports, portcfg);
- } else if (!strcasecmp(line->key,
- "HiddenServiceDirGroupReadable")) {
- service->dir_group_readable = (int)tor_parse_long(line->value,
- 10, 0, 1, &ok, NULL);
- if (!ok) {
- log_warn(LD_CONFIG,
- "HiddenServiceDirGroupReadable should be 0 or 1, not %s",
- line->value);
- rend_service_free(service);
- return -1;
- }
- log_info(LD_CONFIG,
- "HiddenServiceDirGroupReadable=%d for %s",
- service->dir_group_readable, service->directory);
- } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) {
- /* Parse auth type and comma-separated list of client names and add a
- * rend_authorized_client_t for each client to the service's list
- * of authorized clients. */
- smartlist_t *type_names_split, *clients;
- const char *authname;
- int num_clients;
- if (service->auth_type != REND_NO_AUTH) {
- log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient "
- "lines for a single service.");
- rend_service_free(service);
- return -1;
- }
- type_names_split = smartlist_new();
- smartlist_split_string(type_names_split, line->value, " ", 0, 2);
- if (smartlist_len(type_names_split) < 1) {
- log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This "
- "should have been prevented when parsing the "
- "configuration.");
- smartlist_free(type_names_split);
- rend_service_free(service);
- return -1;
- }
- authname = smartlist_get(type_names_split, 0);
- if (!strcasecmp(authname, "basic")) {
- service->auth_type = REND_BASIC_AUTH;
- } else if (!strcasecmp(authname, "stealth")) {
- service->auth_type = REND_STEALTH_AUTH;
- } else {
- log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains "
- "unrecognized auth-type '%s'. Only 'basic' or 'stealth' "
- "are recognized.",
- (char *) smartlist_get(type_names_split, 0));
- SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
- smartlist_free(type_names_split);
- rend_service_free(service);
- return -1;
- }
- service->clients = smartlist_new();
- if (smartlist_len(type_names_split) < 2) {
- log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains "
- "auth-type '%s', but no client names.",
- service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth");
- SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
- smartlist_free(type_names_split);
- continue;
- }
- clients = smartlist_new();
- smartlist_split_string(clients, smartlist_get(type_names_split, 1),
- ",", SPLIT_SKIP_SPACE, 0);
- SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
- smartlist_free(type_names_split);
- /* Remove duplicate client names. */
- num_clients = smartlist_len(clients);
- smartlist_sort_strings(clients);
- smartlist_uniq_strings(clients);
- if (smartlist_len(clients) < num_clients) {
+ rend_service_free(service);
+ else
+ rend_add_service(service);
+ }
+ service = tor_malloc_zero(sizeof(rend_service_t));
+ service->directory = tor_strdup(line->value);
+ service->ports = smartlist_new();
+ service->intro_period_started = time(NULL);
+ service->n_intro_points_wanted = NUM_INTRO_POINTS_DEFAULT;
+ continue;
+ }
+ if (!service) {
+ log_warn(LD_CONFIG, "%s with no preceding HiddenServiceDir directive",
+ line->key);
+ rend_service_free(service);
+ return -1;
+ }
+ if (!strcasecmp(line->key, "HiddenServicePort")) {
+ portcfg = parse_port_config(line->value);
+ if (!portcfg) {
+ rend_service_free(service);
+ return -1;
+ }
+ smartlist_add(service->ports, portcfg);
+ } else if (!strcasecmp(line->key, "HiddenServiceAllowUnknownPorts")) {
+ service->allow_unknown_ports = (int)tor_parse_long(line->value,
+ 10, 0, 1, &ok, NULL);
+ if (!ok) {
+ log_warn(LD_CONFIG,
+ "HiddenServiceAllowUnknownPorts should be 0 or 1, not %s",
+ line->value);
+ rend_service_free(service);
+ return -1;
+ }
+ log_info(LD_CONFIG,
+ "HiddenServiceAllowUnknownPorts=%d for %s",
+ (int)service->allow_unknown_ports, service->directory);
+ } else if (!strcasecmp(line->key,
+ "HiddenServiceDirGroupReadable")) {
+ service->dir_group_readable = (int)tor_parse_long(line->value,
+ 10, 0, 1, &ok, NULL);
+ if (!ok) {
+ log_warn(LD_CONFIG,
+ "HiddenServiceDirGroupReadable should be 0 or 1, not %s",
+ line->value);
+ rend_service_free(service);
+ return -1;
+ }
+ log_info(LD_CONFIG,
+ "HiddenServiceDirGroupReadable=%d for %s",
+ service->dir_group_readable, service->directory);
+ } else if (!strcasecmp(line->key, "HiddenServiceAuthorizeClient")) {
+ /* Parse auth type and comma-separated list of client names and add a
+ * rend_authorized_client_t for each client to the service's list
+ * of authorized clients. */
+ smartlist_t *type_names_split, *clients;
+ const char *authname;
+ int num_clients;
+ if (service->auth_type != REND_NO_AUTH) {
+ log_warn(LD_CONFIG, "Got multiple HiddenServiceAuthorizeClient "
+ "lines for a single service.");
+ rend_service_free(service);
+ return -1;
+ }
+ type_names_split = smartlist_new();
+ smartlist_split_string(type_names_split, line->value, " ", 0, 2);
+ if (smartlist_len(type_names_split) < 1) {
+ log_warn(LD_BUG, "HiddenServiceAuthorizeClient has no value. This "
+ "should have been prevented when parsing the "
+ "configuration.");
+ smartlist_free(type_names_split);
+ rend_service_free(service);
+ return -1;
+ }
+ authname = smartlist_get(type_names_split, 0);
+ if (!strcasecmp(authname, "basic")) {
+ service->auth_type = REND_BASIC_AUTH;
+ } else if (!strcasecmp(authname, "stealth")) {
+ service->auth_type = REND_STEALTH_AUTH;
+ } else {
+ log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains "
+ "unrecognized auth-type '%s'. Only 'basic' or 'stealth' "
+ "are recognized.",
+ (char *) smartlist_get(type_names_split, 0));
+ SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
+ smartlist_free(type_names_split);
+ rend_service_free(service);
+ return -1;
+ }
+ service->clients = smartlist_new();
+ if (smartlist_len(type_names_split) < 2) {
+ log_warn(LD_CONFIG, "HiddenServiceAuthorizeClient contains "
+ "auth-type '%s', but no client names.",
+ service->auth_type == REND_BASIC_AUTH ? "basic" : "stealth");
+ SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
+ smartlist_free(type_names_split);
+ continue;
+ }
+ clients = smartlist_new();
+ smartlist_split_string(clients, smartlist_get(type_names_split, 1),
+ ",", SPLIT_SKIP_SPACE, 0);
+ SMARTLIST_FOREACH(type_names_split, char *, cp, tor_free(cp));
+ smartlist_free(type_names_split);
+ /* Remove duplicate client names. */
+ num_clients = smartlist_len(clients);
+ smartlist_sort_strings(clients);
+ smartlist_uniq_strings(clients);
+ if (smartlist_len(clients) < num_clients) {
log_info(LD_CONFIG, "HiddenServiceAuthorizeClient contains %d "
"duplicate client name(s); removing.",
num_clients - smartlist_len(clients));
@@ -530,6 +616,16 @@ rend_config_services(const or_options_t *options, int validate_only)
}
}
if (service) {
+ cpd_check_t check_opts = CPD_CHECK_MODE_ONLY|CPD_CHECK;
+ if (service->dir_group_readable) {
+ check_opts |= CPD_GROUP_READ;
+ }
+
+ if (check_private_dir(service->directory, check_opts, options->User) < 0) {
+ rend_service_free(service);
+ return -1;
+ }
+
if (validate_only) {
rend_service_free(service);
} else {
@@ -737,7 +833,7 @@ rend_service_load_keys(rend_service_t *s)
s->directory);
return -1;
}
- s->private_key = init_key_from_file(fname, 1, LOG_ERR);
+ s->private_key = init_key_from_file(fname, 1, LOG_ERR, 0);
if (!s->private_key)
return -1;
@@ -1043,8 +1139,8 @@ rend_check_authorization(rend_service_t *service,
}
/* Allow the request. */
- log_debug(LD_REND, "Client %s authorized for service %s.",
- auth_client->client_name, service->service_id);
+ log_info(LD_REND, "Client %s authorized for service %s.",
+ auth_client->client_name, service->service_id);
return 1;
}
@@ -1516,8 +1612,7 @@ find_rp_for_intro(const rend_intro_cell_t *intro,
}
if (intro->version == 0 || intro->version == 1) {
- if (intro->version == 1) rp_nickname = (const char *)(intro->u.v1.rp);
- else rp_nickname = (const char *)(intro->u.v0.rp);
+ rp_nickname = (const char *)(intro->u.v0_v1.rp);
node = node_get_by_nickname(rp_nickname, 0);
if (!node) {
@@ -1766,11 +1861,7 @@ rend_service_parse_intro_for_v0_or_v1(
goto err;
}
- if (intro->version == 1) {
- memcpy(intro->u.v1.rp, rp_nickname, endptr - rp_nickname + 1);
- } else {
- memcpy(intro->u.v0.rp, rp_nickname, endptr - rp_nickname + 1);
- }
+ memcpy(intro->u.v0_v1.rp, rp_nickname, endptr - rp_nickname + 1);
return ver_specific_len;
@@ -3072,8 +3163,12 @@ rend_services_introduce(void)
const or_options_t *options = get_options();
/* List of nodes we need to _exclude_ when choosing a new node to establish
* an intro point to. */
- smartlist_t *exclude_nodes = smartlist_new();
+ smartlist_t *exclude_nodes;
+ if (!have_completed_a_circuit())
+ return;
+
+ exclude_nodes = smartlist_new();
now = time(NULL);
for (i=0; i < smartlist_len(rend_service_list); ++i) {
@@ -3260,6 +3355,9 @@ rend_services_introduce(void)
smartlist_free(exclude_nodes);
}
+#define MIN_REND_INITIAL_POST_DELAY (30)
+#define MIN_REND_INITIAL_POST_DELAY_TESTING (5)
+
/** Regenerate and upload rendezvous service descriptors for all
* services, if necessary. If the descriptor has been dirty enough
* for long enough, definitely upload; else only upload when the
@@ -3274,6 +3372,9 @@ rend_consider_services_upload(time_t now)
int i;
rend_service_t *service;
int rendpostperiod = get_options()->RendPostPeriod;
+ int rendinitialpostdelay = (get_options()->TestingTorNetwork ?
+ MIN_REND_INITIAL_POST_DELAY_TESTING :
+ MIN_REND_INITIAL_POST_DELAY);
if (!get_options()->PublishHidServDescriptors)
return;
@@ -3281,17 +3382,17 @@ rend_consider_services_upload(time_t now)
for (i=0; i < smartlist_len(rend_service_list); ++i) {
service = smartlist_get(rend_service_list, i);
if (!service->next_upload_time) { /* never been uploaded yet */
- /* The fixed lower bound of 30 seconds ensures that the descriptor
- * is stable before being published. See comment below. */
+ /* The fixed lower bound of rendinitialpostdelay seconds ensures that
+ * the descriptor is stable before being published. See comment below. */
service->next_upload_time =
- now + 30 + crypto_rand_int(2*rendpostperiod);
+ now + rendinitialpostdelay + crypto_rand_int(2*rendpostperiod);
}
if (service->next_upload_time < now ||
(service->desc_is_dirty &&
- service->desc_is_dirty < now-30)) {
+ service->desc_is_dirty < now-rendinitialpostdelay)) {
/* if it's time, or if the directory servers have a wrong service
- * descriptor and ours has been stable for 30 seconds, upload a
- * new one of each format. */
+ * descriptor and ours has been stable for rendinitialpostdelay seconds,
+ * upload a new one of each format. */
rend_service_update_descriptor(service);
upload_service_descriptor(service);
}
@@ -3370,9 +3471,60 @@ rend_service_dump_stats(int severity)
}
}
+#ifdef HAVE_SYS_UN_H
+
+/** Given <b>ports</b>, a smarlist containing rend_service_port_config_t,
+ * add the given <b>p</b>, a AF_UNIX port to the list. Return 0 on success
+ * else return -ENOSYS if AF_UNIX is not supported (see function in the
+ * #else statement below). */
+static int
+add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
+{
+ tor_assert(ports);
+ tor_assert(p);
+ tor_assert(p->is_unix_addr);
+
+ smartlist_add(ports, p);
+ return 0;
+}
+
+/** Given <b>conn</b> set it to use the given port <b>p</b> values. Return 0
+ * on success else return -ENOSYS if AF_UNIX is not supported (see function
+ * in the #else statement below). */
+static int
+set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
+{
+ tor_assert(conn);
+ tor_assert(p);
+ tor_assert(p->is_unix_addr);
+
+ conn->base_.socket_family = AF_UNIX;
+ tor_addr_make_unspec(&conn->base_.addr);
+ conn->base_.port = 1;
+ conn->base_.address = tor_strdup(p->unix_addr);
+ return 0;
+}
+
+#else /* defined(HAVE_SYS_UN_H) */
+
+static int
+set_unix_port(edge_connection_t *conn, rend_service_port_config_t *p)
+{
+ return -ENOSYS;
+}
+
+static int
+add_unix_port(smartlist_t *ports, rend_service_port_config_t *p)
+{
+ return -ENOSYS;
+}
+
+#endif /* HAVE_SYS_UN_H */
+
/** Given <b>conn</b>, a rendezvous exit stream, look up the hidden service for
* 'circ', and look up the port and address based on conn-\>port.
- * Assign the actual conn-\>addr and conn-\>port. Return -1 if failure,
+ * Assign the actual conn-\>addr and conn-\>port. Return -2 on failure
+ * for which the circuit should be closed, -1 on other failure,
* or 0 for success.
*/
int
@@ -3383,6 +3535,7 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
char serviceid[REND_SERVICE_ID_LEN_BASE32+1];
smartlist_t *matching_ports;
rend_service_port_config_t *chosen_port;
+ unsigned int warn_once = 0;
tor_assert(circ->base_.purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
tor_assert(circ->rend_data);
@@ -3395,24 +3548,53 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
log_warn(LD_REND, "Couldn't find any service associated with pk %s on "
"rendezvous circuit %u; closing.",
serviceid, (unsigned)circ->base_.n_circ_id);
- return -1;
+ return -2;
}
matching_ports = smartlist_new();
SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p,
{
- if (conn->base_.port == p->virtual_port) {
+ if (conn->base_.port != p->virtual_port) {
+ continue;
+ }
+ if (!(p->is_unix_addr)) {
smartlist_add(matching_ports, p);
+ } else {
+ if (add_unix_port(matching_ports, p)) {
+ if (!warn_once) {
+ /* Unix port not supported so warn only once. */
+ log_warn(LD_REND,
+ "Saw AF_UNIX virtual port mapping for port %d on service "
+ "%s, which is unsupported on this platform. Ignoring it.",
+ conn->base_.port, serviceid);
+ }
+ warn_once++;
+ }
}
});
chosen_port = smartlist_choose(matching_ports);
smartlist_free(matching_ports);
if (chosen_port) {
- tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr);
- conn->base_.port = chosen_port->real_port;
+ if (!(chosen_port->is_unix_addr)) {
+ /* Get a non-AF_UNIX connection ready for connection_exit_connect() */
+ tor_addr_copy(&conn->base_.addr, &chosen_port->real_addr);
+ conn->base_.port = chosen_port->real_port;
+ } else {
+ if (set_unix_port(conn, chosen_port)) {
+ /* Simply impossible to end up here else we were able to add a Unix
+ * port without AF_UNIX support... ? */
+ tor_assert(0);
+ }
+ }
return 0;
}
- log_info(LD_REND, "No virtual port mapping exists for port %d on service %s",
- conn->base_.port,serviceid);
- return -1;
+
+ log_info(LD_REND,
+ "No virtual port mapping exists for port %d on service %s",
+ conn->base_.port, serviceid);
+
+ if (service->allow_unknown_ports)
+ return -1;
+ else
+ return -2;
}
diff --git a/src/or/rendservice.h b/src/or/rendservice.h
index c2342ef573..754f7c358c 100644
--- a/src/or/rendservice.h
+++ b/src/or/rendservice.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -38,13 +38,9 @@ struct rend_intro_cell_s {
/* Version-specific parts */
union {
struct {
- /* Rendezvous point nickname */
- uint8_t rp[20];
- } v0;
- struct {
/* Rendezvous point nickname or hex-encoded key digest */
uint8_t rp[42];
- } v1;
+ } v0_v1;
struct {
/* The extend_info_t struct has everything v2 uses */
extend_info_t *extend_info;
diff --git a/src/or/rephist.c b/src/or/rephist.c
index f1e882729b..34908828a5 100644
--- a/src/or/rephist.c
+++ b/src/or/rephist.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -1131,9 +1131,7 @@ rep_hist_load_mtbf_data(time_t now)
* totals? */
#define NUM_SECS_ROLLING_MEASURE 10
/** How large are the intervals for which we track and report bandwidth use? */
-/* XXXX Watch out! Before Tor 0.2.2.21-alpha, using any other value here would
- * generate an unparseable state file. */
-#define NUM_SECS_BW_SUM_INTERVAL (15*60)
+#define NUM_SECS_BW_SUM_INTERVAL (4*60*60)
/** How far in the past do we remember and publish bandwidth use? */
#define NUM_SECS_BW_SUM_IS_VALID (24*60*60)
/** How many bandwidth usage intervals do we remember? (derived) */
@@ -2908,11 +2906,227 @@ rep_hist_log_circuit_handshake_stats(time_t now)
memset(onion_handshakes_requested, 0, sizeof(onion_handshakes_requested));
}
+/* Hidden service statistics section */
+
+/** Start of the current hidden service stats interval or 0 if we're
+ * not collecting hidden service statistics. */
+static time_t start_of_hs_stats_interval;
+
+/** Carries the various hidden service statistics, and any other
+ * information needed. */
+typedef struct hs_stats_t {
+ /** How many relay cells have we seen as rendezvous points? */
+ int64_t rp_relay_cells_seen;
+
+ /** Set of unique public key digests we've seen this stat period
+ * (could also be implemented as sorted smartlist). */
+ digestmap_t *onions_seen_this_period;
+} hs_stats_t;
+
+/** Our statistics structure singleton. */
+static hs_stats_t *hs_stats = NULL;
+
+/** Allocate, initialize and return an hs_stats_t structure. */
+static hs_stats_t *
+hs_stats_new(void)
+{
+ hs_stats_t * hs_stats = tor_malloc_zero(sizeof(hs_stats_t));
+ hs_stats->onions_seen_this_period = digestmap_new();
+
+ return hs_stats;
+}
+
+/** Free an hs_stats_t structure. */
+static void
+hs_stats_free(hs_stats_t *hs_stats)
+{
+ if (!hs_stats) {
+ return;
+ }
+
+ digestmap_free(hs_stats->onions_seen_this_period, NULL);
+ tor_free(hs_stats);
+}
+
+/** Initialize hidden service statistics. */
+void
+rep_hist_hs_stats_init(time_t now)
+{
+ if (!hs_stats) {
+ hs_stats = hs_stats_new();
+ }
+
+ start_of_hs_stats_interval = now;
+}
+
+/** Clear history of hidden service statistics and set the measurement
+ * interval start to <b>now</b>. */
+static void
+rep_hist_reset_hs_stats(time_t now)
+{
+ if (!hs_stats) {
+ hs_stats = hs_stats_new();
+ }
+
+ hs_stats->rp_relay_cells_seen = 0;
+
+ digestmap_free(hs_stats->onions_seen_this_period, NULL);
+ hs_stats->onions_seen_this_period = digestmap_new();
+
+ start_of_hs_stats_interval = now;
+}
+
+/** Stop collecting hidden service stats in a way that we can re-start
+ * doing so in rep_hist_buffer_stats_init(). */
+void
+rep_hist_hs_stats_term(void)
+{
+ rep_hist_reset_hs_stats(0);
+}
+
+/** We saw a new HS relay cell, Count it! */
+void
+rep_hist_seen_new_rp_cell(void)
+{
+ if (!hs_stats) {
+ return; // We're not collecting stats
+ }
+
+ hs_stats->rp_relay_cells_seen++;
+}
+
+/** As HSDirs, we saw another hidden service with public key
+ * <b>pubkey</b>. Check whether we have counted it before, if not
+ * count it now! */
+void
+rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey)
+{
+ char pubkey_hash[DIGEST_LEN];
+
+ if (!hs_stats) {
+ return; // We're not collecting stats
+ }
+
+ /* Get the digest of the pubkey which will be used to detect whether
+ we've seen this hidden service before or not. */
+ if (crypto_pk_get_digest(pubkey, pubkey_hash) < 0) {
+ /* This fail should not happen; key has been validated by
+ descriptor parsing code first. */
+ return;
+ }
+
+ /* Check if this is the first time we've seen this hidden
+ service. If it is, count it as new. */
+ if (!digestmap_get(hs_stats->onions_seen_this_period,
+ pubkey_hash)) {
+ digestmap_set(hs_stats->onions_seen_this_period,
+ pubkey_hash, (void*)(uintptr_t)1);
+ }
+}
+
+/* The number of cells that are supposed to be hidden from the adversary
+ * by adding noise from the Laplace distribution. This value, divided by
+ * EPSILON, is Laplace parameter b. */
+#define REND_CELLS_DELTA_F 2048
+/* Security parameter for obfuscating number of cells with a value between
+ * 0 and 1. Smaller values obfuscate observations more, but at the same
+ * time make statistics less usable. */
+#define REND_CELLS_EPSILON 0.3
+/* The number of cells that are supposed to be hidden from the adversary
+ * by rounding up to the next multiple of this number. */
+#define REND_CELLS_BIN_SIZE 1024
+/* The number of service identities that are supposed to be hidden from
+ * the adversary by adding noise from the Laplace distribution. This
+ * value, divided by EPSILON, is Laplace parameter b. */
+#define ONIONS_SEEN_DELTA_F 8
+/* Security parameter for obfuscating number of service identities with a
+ * value between 0 and 1. Smaller values obfuscate observations more, but
+ * at the same time make statistics less usable. */
+#define ONIONS_SEEN_EPSILON 0.3
+/* The number of service identities that are supposed to be hidden from
+ * the adversary by rounding up to the next multiple of this number. */
+#define ONIONS_SEEN_BIN_SIZE 8
+
+/** Allocate and return a string containing hidden service stats that
+ * are meant to be placed in the extra-info descriptor. */
+static char *
+rep_hist_format_hs_stats(time_t now)
+{
+ char t[ISO_TIME_LEN+1];
+ char *hs_stats_string;
+ int64_t obfuscated_cells_seen;
+ int64_t obfuscated_onions_seen;
+
+ obfuscated_cells_seen = round_int64_to_next_multiple_of(
+ hs_stats->rp_relay_cells_seen,
+ REND_CELLS_BIN_SIZE);
+ obfuscated_cells_seen = add_laplace_noise(obfuscated_cells_seen,
+ crypto_rand_double(),
+ REND_CELLS_DELTA_F, REND_CELLS_EPSILON);
+ obfuscated_onions_seen = round_int64_to_next_multiple_of(digestmap_size(
+ hs_stats->onions_seen_this_period),
+ ONIONS_SEEN_BIN_SIZE);
+ obfuscated_onions_seen = add_laplace_noise(obfuscated_onions_seen,
+ crypto_rand_double(), ONIONS_SEEN_DELTA_F,
+ ONIONS_SEEN_EPSILON);
+
+ format_iso_time(t, now);
+ tor_asprintf(&hs_stats_string, "hidserv-stats-end %s (%d s)\n"
+ "hidserv-rend-relayed-cells "I64_FORMAT" delta_f=%d "
+ "epsilon=%.2f bin_size=%d\n"
+ "hidserv-dir-onions-seen "I64_FORMAT" delta_f=%d "
+ "epsilon=%.2f bin_size=%d\n",
+ t, (unsigned) (now - start_of_hs_stats_interval),
+ I64_PRINTF_ARG(obfuscated_cells_seen), REND_CELLS_DELTA_F,
+ REND_CELLS_EPSILON, REND_CELLS_BIN_SIZE,
+ I64_PRINTF_ARG(obfuscated_onions_seen),
+ ONIONS_SEEN_DELTA_F,
+ ONIONS_SEEN_EPSILON, ONIONS_SEEN_BIN_SIZE);
+
+ return hs_stats_string;
+}
+
+/** If 24 hours have passed since the beginning of the current HS
+ * stats period, write buffer stats to $DATADIR/stats/hidserv-stats
+ * (possibly overwriting an existing file) and reset counters. Return
+ * when we would next want to write buffer stats or 0 if we never want to
+ * write. */
+time_t
+rep_hist_hs_stats_write(time_t now)
+{
+ char *str = NULL;
+
+ if (!start_of_hs_stats_interval) {
+ return 0; /* Not initialized. */
+ }
+
+ if (start_of_hs_stats_interval + WRITE_STATS_INTERVAL > now) {
+ goto done; /* Not ready to write */
+ }
+
+ /* Generate history string. */
+ str = rep_hist_format_hs_stats(now);
+
+ /* Reset HS history. */
+ rep_hist_reset_hs_stats(now);
+
+ /* Try to write to disk. */
+ if (!check_or_create_data_subdir("stats")) {
+ write_to_data_subdir("stats", "hidserv-stats", str,
+ "hidden service stats");
+ }
+
+ done:
+ tor_free(str);
+ return start_of_hs_stats_interval + WRITE_STATS_INTERVAL;
+}
+
/** Free all storage held by the OR/link history caches, by the
* bandwidth history arrays, by the port history, or by statistics . */
void
rep_hist_free_all(void)
{
+ hs_stats_free(hs_stats);
digestmap_free(history_map, free_or_history);
tor_free(read_array);
tor_free(write_array);
diff --git a/src/or/rephist.h b/src/or/rephist.h
index d853fe2e00..42710c4ed6 100644
--- a/src/or/rephist.h
+++ b/src/or/rephist.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -99,6 +99,13 @@ void rep_hist_note_circuit_handshake_requested(uint16_t type);
void rep_hist_note_circuit_handshake_assigned(uint16_t type);
void rep_hist_log_circuit_handshake_stats(time_t now);
+void rep_hist_hs_stats_init(time_t now);
+void rep_hist_hs_stats_term(void);
+time_t rep_hist_hs_stats_write(time_t now);
+char *rep_hist_get_hs_stats_string(void);
+void rep_hist_seen_new_rp_cell(void);
+void rep_hist_stored_maybe_new_hs(const crypto_pk_t *pubkey);
+
void rep_hist_free_all(void);
#endif
diff --git a/src/or/replaycache.c b/src/or/replaycache.c
index 6d1b59101d..569e0736cb 100644
--- a/src/or/replaycache.c
+++ b/src/or/replaycache.c
@@ -1,4 +1,4 @@
- /* Copyright (c) 2012-2014, The Tor Project, Inc. */
+ /* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/*
diff --git a/src/or/replaycache.h b/src/or/replaycache.h
index 904fd45ff1..9b9daf3831 100644
--- a/src/or/replaycache.h
+++ b/src/or/replaycache.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/router.c b/src/or/router.c
index 01838b4b3e..2ddaa895fc 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTER_PRIVATE
@@ -313,6 +313,7 @@ rotate_onion_key(void)
time_t now;
fname = get_datadir_fname2("keys", "secret_onion_key");
fname_prev = get_datadir_fname2("keys", "secret_onion_key.old");
+ /* There isn't much point replacing an old key with an empty file */
if (file_status(fname) == FN_FILE) {
if (replace_file(fname, fname_prev))
goto error;
@@ -335,6 +336,7 @@ rotate_onion_key(void)
fname_prev = get_datadir_fname2("keys", "secret_onion_key_ntor.old");
if (curve25519_keypair_generate(&new_curve25519_keypair, 1) < 0)
goto error;
+ /* There isn't much point replacing an old key with an empty file */
if (file_status(fname) == FN_FILE) {
if (replace_file(fname, fname_prev))
goto error;
@@ -392,10 +394,12 @@ log_new_relay_greeting(void)
/** Try to read an RSA key from <b>fname</b>. If <b>fname</b> doesn't exist
* and <b>generate</b> is true, create a new RSA key and save it in
* <b>fname</b>. Return the read/created key, or NULL on error. Log all
- * errors at level <b>severity</b>.
+ * errors at level <b>severity</b>. If <b>log_greeting</b> is non-zero and a
+ * new key was created, log_new_relay_greeting() is called.
*/
crypto_pk_t *
-init_key_from_file(const char *fname, int generate, int severity)
+init_key_from_file(const char *fname, int generate, int severity,
+ int log_greeting)
{
crypto_pk_t *prkey = NULL;
@@ -409,7 +413,11 @@ init_key_from_file(const char *fname, int generate, int severity)
case FN_ERROR:
tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname);
goto error;
+ /* treat empty key files as if the file doesn't exist, and,
+ * if generate is set, replace the empty file in
+ * crypto_pk_write_private_key_to_filename() */
case FN_NOENT:
+ case FN_EMPTY:
if (generate) {
if (!have_lockfile()) {
if (try_locking(get_options(), 0)<0) {
@@ -433,7 +441,9 @@ init_key_from_file(const char *fname, int generate, int severity)
goto error;
}
log_info(LD_GENERAL, "Generated key seems valid");
- log_new_relay_greeting();
+ if (log_greeting) {
+ log_new_relay_greeting();
+ }
if (crypto_pk_write_private_key_to_filename(prkey, fname)) {
tor_log(severity, LD_FS,
"Couldn't write generated key to \"%s\".", fname);
@@ -460,10 +470,10 @@ init_key_from_file(const char *fname, int generate, int severity)
}
/** Load a curve25519 keypair from the file <b>fname</b>, writing it into
- * <b>keys_out</b>. If the file isn't found and <b>generate</b> is true,
- * create a new keypair and write it into the file. If there are errors, log
- * them at level <b>severity</b>. Generate files using <b>tag</b> in their
- * ASCII wrapper. */
+ * <b>keys_out</b>. If the file isn't found, or is empty, and <b>generate</b>
+ * is true, create a new keypair and write it into the file. If there are
+ * errors, log them at level <b>severity</b>. Generate files using <b>tag</b>
+ * in their ASCII wrapper. */
static int
init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out,
const char *fname,
@@ -476,7 +486,10 @@ init_curve25519_keypair_from_file(curve25519_keypair_t *keys_out,
case FN_ERROR:
tor_log(severity, LD_FS,"Can't read key from \"%s\"", fname);
goto error;
+ /* treat empty key files as if the file doesn't exist, and, if generate
+ * is set, replace the empty file in curve25519_keypair_write_to_file() */
case FN_NOENT:
+ case FN_EMPTY:
if (generate) {
if (!have_lockfile()) {
if (try_locking(get_options(), 0)<0) {
@@ -545,7 +558,7 @@ load_authority_keyset(int legacy, crypto_pk_t **key_out,
fname = get_datadir_fname2("keys",
legacy ? "legacy_signing_key" : "authority_signing_key");
- signing_key = init_key_from_file(fname, 0, LOG_INFO);
+ signing_key = init_key_from_file(fname, 0, LOG_INFO, 0);
if (!signing_key) {
log_warn(LD_DIR, "No version 3 directory key found in %s", fname);
goto done;
@@ -828,7 +841,7 @@ init_keys(void)
/* 1b. Read identity key. Make it if none is found. */
keydir = get_datadir_fname2("keys", "secret_id_key");
log_info(LD_GENERAL,"Reading/making identity key \"%s\"...",keydir);
- prkey = init_key_from_file(keydir, 1, LOG_ERR);
+ prkey = init_key_from_file(keydir, 1, LOG_ERR, 1);
tor_free(keydir);
if (!prkey) return -1;
set_server_identity_key(prkey);
@@ -851,7 +864,7 @@ init_keys(void)
/* 2. Read onion key. Make it if none is found. */
keydir = get_datadir_fname2("keys", "secret_onion_key");
log_info(LD_GENERAL,"Reading/making onion key \"%s\"...",keydir);
- prkey = init_key_from_file(keydir, 1, LOG_ERR);
+ prkey = init_key_from_file(keydir, 1, LOG_ERR, 1);
tor_free(keydir);
if (!prkey) return -1;
set_onion_key(prkey);
@@ -876,7 +889,9 @@ init_keys(void)
keydir = get_datadir_fname2("keys", "secret_onion_key.old");
if (!lastonionkey && file_status(keydir) == FN_FILE) {
- prkey = init_key_from_file(keydir, 1, LOG_ERR); /* XXXX Why 1? */
+ /* Load keys from non-empty files only.
+ * Missing old keys won't be replaced with freshly generated keys. */
+ prkey = init_key_from_file(keydir, 0, LOG_ERR, 0);
if (prkey)
lastonionkey = prkey;
}
@@ -897,6 +912,8 @@ init_keys(void)
last_curve25519_onion_key.pubkey.public_key,
CURVE25519_PUBKEY_LEN) &&
file_status(keydir) == FN_FILE) {
+ /* Load keys from non-empty files only.
+ * Missing old keys won't be replaced with freshly generated keys. */
init_curve25519_keypair_from_file(&last_curve25519_onion_key,
keydir, 0, LOG_ERR, "onion");
}
@@ -1219,6 +1236,11 @@ router_orport_found_reachable(void)
" Publishing server descriptor." : "");
can_reach_or_port = 1;
mark_my_descriptor_dirty("ORPort found reachable");
+ /* This is a significant enough change to upload immediately,
+ * at least in a test network */
+ if (get_options()->TestingTorNetwork == 1) {
+ reschedule_descriptor_update_check();
+ }
control_event_server_status(LOG_NOTICE,
"REACHABILITY_SUCCEEDED ORADDRESS=%s:%d",
address, me->or_port);
@@ -1236,8 +1258,14 @@ router_dirport_found_reachable(void)
log_notice(LD_DIRSERV,"Self-testing indicates your DirPort is reachable "
"from the outside. Excellent.");
can_reach_dir_port = 1;
- if (decide_to_advertise_dirport(get_options(), me->dir_port))
+ if (decide_to_advertise_dirport(get_options(), me->dir_port)) {
mark_my_descriptor_dirty("DirPort found reachable");
+ /* This is a significant enough change to upload immediately,
+ * at least in a test network */
+ if (get_options()->TestingTorNetwork == 1) {
+ reschedule_descriptor_update_check();
+ }
+ }
control_event_server_status(LOG_NOTICE,
"REACHABILITY_SUCCEEDED DIRADDRESS=%s:%d",
address, me->dir_port);
@@ -1820,8 +1848,8 @@ router_rebuild_descriptor(int force)
const port_cfg_t *ipv6_orport = NULL;
SMARTLIST_FOREACH_BEGIN(get_configured_ports(), const port_cfg_t *, p) {
if (p->type == CONN_TYPE_OR_LISTENER &&
- ! p->no_advertise &&
- ! p->bind_ipv4_only &&
+ ! p->server_cfg.no_advertise &&
+ ! p->server_cfg.bind_ipv4_only &&
tor_addr_family(&p->addr) == AF_INET6) {
if (! tor_addr_is_internal(&p->addr, 0)) {
ipv6_orport = p;
@@ -2562,8 +2590,9 @@ router_has_orport(const routerinfo_t *router, const tor_addr_port_t *orport)
* <b>end_line</b>, ensure that its timestamp is not more than 25 hours in
* the past or more than 1 hour in the future with respect to <b>now</b>,
* and write the file contents starting with that line to *<b>out</b>.
- * Return 1 for success, 0 if the file does not exist, or -1 if the file
- * does not contain a line matching these criteria or other failure. */
+ * Return 1 for success, 0 if the file does not exist or is empty, or -1
+ * if the file does not contain a line matching these criteria or other
+ * failure. */
static int
load_stats_file(const char *filename, const char *end_line, time_t now,
char **out)
@@ -2597,7 +2626,9 @@ load_stats_file(const char *filename, const char *end_line, time_t now,
notfound:
tor_free(contents);
break;
+ /* treat empty stats files as if the file doesn't exist */
case FN_NOENT:
+ case FN_EMPTY:
r = 0;
break;
case FN_ERROR:
@@ -2654,6 +2685,11 @@ extrainfo_dump_to_string(char **s_out, extrainfo_t *extrainfo,
"dirreq-stats-end", now, &contents) > 0) {
smartlist_add(chunks, contents);
}
+ if (options->HiddenServiceStatistics &&
+ load_stats_file("stats"PATH_SEPARATOR"hidserv-stats",
+ "hidserv-stats-end", now, &contents) > 0) {
+ smartlist_add(chunks, contents);
+ }
if (options->EntryStatistics &&
load_stats_file("stats"PATH_SEPARATOR"entry-stats",
"entry-stats-end", now, &contents) > 0) {
diff --git a/src/or/router.h b/src/or/router.h
index 16d3845be1..8108ffb22f 100644
--- a/src/or/router.h
+++ b/src/or/router.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -29,7 +29,7 @@ crypto_pk_t *get_my_v3_legacy_signing_key(void);
void dup_onion_keys(crypto_pk_t **key, crypto_pk_t **last);
void rotate_onion_key(void);
crypto_pk_t *init_key_from_file(const char *fname, int generate,
- int severity);
+ int severity, int log_greeting);
void v3_authority_check_key_expiry(void);
di_digest256_map_t *construct_ntor_key_map(void);
diff --git a/src/or/routerlist.c b/src/or/routerlist.c
index d81dae4676..fe92ac0050 100644
--- a/src/or/routerlist.c
+++ b/src/or/routerlist.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -65,7 +65,7 @@ static int compute_weighted_bandwidths(const smartlist_t *sl,
bandwidth_weight_rule_t rule,
u64_dbl_t **bandwidths_out);
static const routerstatus_t *router_pick_directory_server_impl(
- dirinfo_type_t auth, int flags);
+ dirinfo_type_t auth, int flags, int *n_busy_out);
static const routerstatus_t *router_pick_trusteddirserver_impl(
const smartlist_t *sourcelist, dirinfo_type_t auth,
int flags, int *n_busy_out);
@@ -1206,6 +1206,7 @@ router_reload_router_list_impl(desc_store_t *store)
tor_free(fname);
fname = get_datadir_fname_suffix(store->fname_base, ".new");
+ /* don't load empty files - we wouldn't get any data, even if we tried */
if (file_status(fname) == FN_FILE)
contents = read_file_to_str(fname, RFTS_BIN|RFTS_IGNORE_MISSING, &st);
if (contents) {
@@ -1287,22 +1288,32 @@ router_get_fallback_dir_servers(void)
const routerstatus_t *
router_pick_directory_server(dirinfo_type_t type, int flags)
{
+ int busy = 0;
const routerstatus_t *choice;
if (!routerlist)
return NULL;
- choice = router_pick_directory_server_impl(type, flags);
+ choice = router_pick_directory_server_impl(type, flags, &busy);
if (choice || !(flags & PDS_RETRY_IF_NO_SERVERS))
return choice;
+ if (busy) {
+ /* If the reason that we got no server is that servers are "busy",
+ * we must be excluding good servers because we already have serverdesc
+ * fetches with them. Do not mark down servers up because of this. */
+ tor_assert((flags & (PDS_NO_EXISTING_SERVERDESC_FETCH|
+ PDS_NO_EXISTING_MICRODESC_FETCH)));
+ return NULL;
+ }
+
log_info(LD_DIR,
"No reachable router entries for dirservers. "
"Trying them all again.");
/* mark all authdirservers as up again */
mark_all_dirservers_up(fallback_dir_servers);
/* try again */
- choice = router_pick_directory_server_impl(type, flags);
+ choice = router_pick_directory_server_impl(type, flags, NULL);
return choice;
}
@@ -1412,11 +1423,15 @@ router_pick_dirserver_generic(smartlist_t *sourcelist,
#define DIR_503_TIMEOUT (60*60)
/** Pick a random running valid directory server/mirror from our
- * routerlist. Arguments are as for router_pick_directory_server(), except
- * that RETRY_IF_NO_SERVERS is ignored.
+ * routerlist. Arguments are as for router_pick_directory_server(), except:
+ *
+ * If <b>n_busy_out</b> is provided, set *<b>n_busy_out</b> to the number of
+ * directories that we excluded for no other reason than
+ * PDS_NO_EXISTING_SERVERDESC_FETCH or PDS_NO_EXISTING_MICRODESC_FETCH.
*/
static const routerstatus_t *
-router_pick_directory_server_impl(dirinfo_type_t type, int flags)
+router_pick_directory_server_impl(dirinfo_type_t type, int flags,
+ int *n_busy_out)
{
const or_options_t *options = get_options();
const node_t *result;
@@ -1425,10 +1440,12 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
smartlist_t *overloaded_direct, *overloaded_tunnel;
time_t now = time(NULL);
const networkstatus_t *consensus = networkstatus_get_latest_consensus();
- int requireother = ! (flags & PDS_ALLOW_SELF);
- int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL);
- int for_guard = (flags & PDS_FOR_GUARD);
- int try_excluding = 1, n_excluded = 0;
+ const int requireother = ! (flags & PDS_ALLOW_SELF);
+ const int fascistfirewall = ! (flags & PDS_IGNORE_FASCISTFIREWALL);
+ const int no_serverdesc_fetching =(flags & PDS_NO_EXISTING_SERVERDESC_FETCH);
+ const int no_microdesc_fetching = (flags & PDS_NO_EXISTING_MICRODESC_FETCH);
+ const int for_guard = (flags & PDS_FOR_GUARD);
+ int try_excluding = 1, n_excluded = 0, n_busy = 0;
if (!consensus)
return NULL;
@@ -1475,7 +1492,24 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
}
/* XXXX IP6 proposal 118 */
- tor_addr_from_ipv4h(&addr, node->rs->addr);
+ tor_addr_from_ipv4h(&addr, status->addr);
+
+ if (no_serverdesc_fetching && (
+ connection_get_by_type_addr_port_purpose(
+ CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_SERVERDESC)
+ || connection_get_by_type_addr_port_purpose(
+ CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_EXTRAINFO)
+ )) {
+ ++n_busy;
+ continue;
+ }
+
+ if (no_microdesc_fetching && connection_get_by_type_addr_port_purpose(
+ CONN_TYPE_DIR, &addr, status->dir_port, DIR_PURPOSE_FETCH_MICRODESC)
+ ) {
+ ++n_busy;
+ continue;
+ }
is_overloaded = status->last_dir_503_at + DIR_503_TIMEOUT > now;
@@ -1515,14 +1549,19 @@ router_pick_directory_server_impl(dirinfo_type_t type, int flags)
smartlist_free(overloaded_direct);
smartlist_free(overloaded_tunnel);
- if (result == NULL && try_excluding && !options->StrictNodes && n_excluded) {
+ if (result == NULL && try_excluding && !options->StrictNodes && n_excluded
+ && !n_busy) {
/* If we got no result, and we are excluding nodes, and StrictNodes is
* not set, try again without excluding nodes. */
try_excluding = 0;
n_excluded = 0;
+ n_busy = 0;
goto retry_without_exclude;
}
+ if (n_busy_out)
+ *n_busy_out = n_busy;
+
return result ? result->rs : NULL;
}
@@ -2030,9 +2069,10 @@ compute_weighted_bandwidths(const smartlist_t *sl,
if (Wg < 0 || Wm < 0 || We < 0 || Wd < 0 || Wgb < 0 || Wmb < 0 || Wdb < 0
|| Web < 0) {
log_debug(LD_CIRC,
- "Got negative bandwidth weights. Defaulting to old selection"
+ "Got negative bandwidth weights. Defaulting to naive selection"
" algorithm.");
- return -1; // Use old algorithm.
+ Wg = Wm = We = Wd = weight_scale;
+ Wgb = Wmb = Web = Wdb = weight_scale;
}
Wg /= weight_scale;
@@ -2048,6 +2088,7 @@ compute_weighted_bandwidths(const smartlist_t *sl,
bandwidths = tor_calloc(smartlist_len(sl), sizeof(u64_dbl_t));
// Cycle through smartlist and total the bandwidth.
+ static int warned_missing_bw = 0;
SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) {
int is_exit = 0, is_guard = 0, is_dir = 0, this_bw = 0;
double weight = 1;
@@ -2056,15 +2097,18 @@ compute_weighted_bandwidths(const smartlist_t *sl,
is_dir = node_is_dir(node);
if (node->rs) {
if (!node->rs->has_bandwidth) {
- tor_free(bandwidths);
/* This should never happen, unless all the authorites downgrade
* to 0.2.0 or rogue routerstatuses get inserted into our consensus. */
- log_warn(LD_BUG,
- "Consensus is not listing bandwidths. Defaulting back to "
- "old router selection algorithm.");
- return -1;
+ if (! warned_missing_bw) {
+ log_warn(LD_BUG,
+ "Consensus is missing some bandwidths. Using a naive "
+ "router selection algorithm");
+ warned_missing_bw = 1;
+ }
+ this_bw = 30000; /* Chosen arbitrarily */
+ } else {
+ this_bw = kb_to_bytes(node->rs->bandwidth_kb);
}
- this_bw = kb_to_bytes(node->rs->bandwidth_kb);
} else if (node->ri) {
/* bridge or other descriptor not in our consensus */
this_bw = bridge_get_advertised_bandwidth_bounded(node->ri);
@@ -2141,226 +2185,13 @@ frac_nodes_with_descriptors(const smartlist_t *sl,
return present / total;
}
-/** Helper function:
- * choose a random node_t element of smartlist <b>sl</b>, weighted by
- * the advertised bandwidth of each element.
- *
- * If <b>rule</b>==WEIGHT_FOR_EXIT. we're picking an exit node: consider all
- * nodes' bandwidth equally regardless of their Exit status, since there may
- * be some in the list because they exit to obscure ports. If
- * <b>rule</b>==NO_WEIGHTING, we're picking a non-exit node: weight
- * exit-node's bandwidth less depending on the smallness of the fraction of
- * Exit-to-total bandwidth. If <b>rule</b>==WEIGHT_FOR_GUARD, we're picking a
- * guard node: consider all guard's bandwidth equally. Otherwise, weight
- * guards proportionally less.
- */
-static const node_t *
-smartlist_choose_node_by_bandwidth(const smartlist_t *sl,
- bandwidth_weight_rule_t rule)
-{
- unsigned int i;
- u64_dbl_t *bandwidths;
- int is_exit;
- int is_guard;
- int is_fast;
- double total_nonexit_bw = 0, total_exit_bw = 0;
- double total_nonguard_bw = 0, total_guard_bw = 0;
- double exit_weight;
- double guard_weight;
- int n_unknown = 0;
- bitarray_t *fast_bits;
- bitarray_t *exit_bits;
- bitarray_t *guard_bits;
-
- // This function does not support WEIGHT_FOR_DIR
- // or WEIGHT_FOR_MID
- if (rule == WEIGHT_FOR_DIR || rule == WEIGHT_FOR_MID) {
- rule = NO_WEIGHTING;
- }
-
- /* Can't choose exit and guard at same time */
- tor_assert(rule == NO_WEIGHTING ||
- rule == WEIGHT_FOR_EXIT ||
- rule == WEIGHT_FOR_GUARD);
-
- if (smartlist_len(sl) == 0) {
- log_info(LD_CIRC,
- "Empty routerlist passed in to old node selection for rule %s",
- bandwidth_weight_rule_to_string(rule));
- return NULL;
- }
-
- /* First count the total bandwidth weight, and make a list
- * of each value. We use UINT64_MAX to indicate "unknown". */
- bandwidths = tor_calloc(smartlist_len(sl), sizeof(u64_dbl_t));
- fast_bits = bitarray_init_zero(smartlist_len(sl));
- exit_bits = bitarray_init_zero(smartlist_len(sl));
- guard_bits = bitarray_init_zero(smartlist_len(sl));
-
- /* Iterate over all the routerinfo_t or routerstatus_t, and */
- SMARTLIST_FOREACH_BEGIN(sl, const node_t *, node) {
- /* first, learn what bandwidth we think i has */
- int is_known = 1;
- uint32_t this_bw = 0;
- i = node_sl_idx;
-
- is_exit = node_is_good_exit(node);
- is_guard = node->is_possible_guard;
- if (node->rs) {
- if (node->rs->has_bandwidth) {
- this_bw = kb_to_bytes(node->rs->bandwidth_kb);
- } else { /* guess */
- is_known = 0;
- }
- } else if (node->ri) {
- /* Must be a bridge if we're willing to use it */
- this_bw = bridge_get_advertised_bandwidth_bounded(node->ri);
- }
-
- if (is_exit)
- bitarray_set(exit_bits, i);
- if (is_guard)
- bitarray_set(guard_bits, i);
- if (node->is_fast)
- bitarray_set(fast_bits, i);
-
- if (is_known) {
- bandwidths[i].dbl = this_bw;
- if (is_guard)
- total_guard_bw += this_bw;
- else
- total_nonguard_bw += this_bw;
- if (is_exit)
- total_exit_bw += this_bw;
- else
- total_nonexit_bw += this_bw;
- } else {
- ++n_unknown;
- bandwidths[i].dbl = -1.0;
- }
- } SMARTLIST_FOREACH_END(node);
-
-#define EPSILON .1
-
- /* Now, fill in the unknown values. */
- if (n_unknown) {
- int32_t avg_fast, avg_slow;
- if (total_exit_bw+total_nonexit_bw < EPSILON) {
- /* if there's some bandwidth, there's at least one known router,
- * so no worries about div by 0 here */
- int n_known = smartlist_len(sl)-n_unknown;
- avg_fast = avg_slow = (int32_t)
- ((total_exit_bw+total_nonexit_bw)/((uint64_t) n_known));
- } else {
- avg_fast = 40000;
- avg_slow = 20000;
- }
- for (i=0; i<(unsigned)smartlist_len(sl); ++i) {
- if (bandwidths[i].dbl >= 0.0)
- continue;
- is_fast = bitarray_is_set(fast_bits, i);
- is_exit = bitarray_is_set(exit_bits, i);
- is_guard = bitarray_is_set(guard_bits, i);
- bandwidths[i].dbl = is_fast ? avg_fast : avg_slow;
- if (is_exit)
- total_exit_bw += bandwidths[i].dbl;
- else
- total_nonexit_bw += bandwidths[i].dbl;
- if (is_guard)
- total_guard_bw += bandwidths[i].dbl;
- else
- total_nonguard_bw += bandwidths[i].dbl;
- }
- }
-
- /* If there's no bandwidth at all, pick at random. */
- if (total_exit_bw+total_nonexit_bw < EPSILON) {
- tor_free(bandwidths);
- tor_free(fast_bits);
- tor_free(exit_bits);
- tor_free(guard_bits);
- return smartlist_choose(sl);
- }
-
- /* Figure out how to weight exits and guards */
- {
- double all_bw = U64_TO_DBL(total_exit_bw+total_nonexit_bw);
- double exit_bw = U64_TO_DBL(total_exit_bw);
- double guard_bw = U64_TO_DBL(total_guard_bw);
- /*
- * For detailed derivation of this formula, see
- * http://archives.seul.org/or/dev/Jul-2007/msg00056.html
- */
- if (rule == WEIGHT_FOR_EXIT || total_exit_bw<EPSILON)
- exit_weight = 1.0;
- else
- exit_weight = 1.0 - all_bw/(3.0*exit_bw);
-
- if (rule == WEIGHT_FOR_GUARD || total_guard_bw<EPSILON)
- guard_weight = 1.0;
- else
- guard_weight = 1.0 - all_bw/(3.0*guard_bw);
-
- if (exit_weight <= 0.0)
- exit_weight = 0.0;
-
- if (guard_weight <= 0.0)
- guard_weight = 0.0;
-
- for (i=0; i < (unsigned)smartlist_len(sl); i++) {
- tor_assert(bandwidths[i].dbl >= 0.0);
-
- is_exit = bitarray_is_set(exit_bits, i);
- is_guard = bitarray_is_set(guard_bits, i);
- if (is_exit && is_guard)
- bandwidths[i].dbl *= exit_weight * guard_weight;
- else if (is_guard)
- bandwidths[i].dbl *= guard_weight;
- else if (is_exit)
- bandwidths[i].dbl *= exit_weight;
- }
- }
-
-#if 0
- log_debug(LD_CIRC, "Total weighted bw = "U64_FORMAT
- ", exit bw = "U64_FORMAT
- ", nonexit bw = "U64_FORMAT", exit weight = %f "
- "(for exit == %d)"
- ", guard bw = "U64_FORMAT
- ", nonguard bw = "U64_FORMAT", guard weight = %f "
- "(for guard == %d)",
- U64_PRINTF_ARG(total_bw),
- U64_PRINTF_ARG(total_exit_bw), U64_PRINTF_ARG(total_nonexit_bw),
- exit_weight, (int)(rule == WEIGHT_FOR_EXIT),
- U64_PRINTF_ARG(total_guard_bw), U64_PRINTF_ARG(total_nonguard_bw),
- guard_weight, (int)(rule == WEIGHT_FOR_GUARD));
-#endif
-
- scale_array_elements_to_u64(bandwidths, smartlist_len(sl), NULL);
-
- {
- int idx = choose_array_element_by_weight(bandwidths,
- smartlist_len(sl));
- tor_free(bandwidths);
- tor_free(fast_bits);
- tor_free(exit_bits);
- tor_free(guard_bits);
- return idx < 0 ? NULL : smartlist_get(sl, idx);
- }
-}
-
/** Choose a random element of status list <b>sl</b>, weighted by
* the advertised bandwidth of each node */
const node_t *
node_sl_choose_by_bandwidth(const smartlist_t *sl,
bandwidth_weight_rule_t rule)
{ /*XXXX MOVE */
- const node_t *ret;
- if ((ret = smartlist_choose_node_by_bandwidth_weights(sl, rule))) {
- return ret;
- } else {
- return smartlist_choose_node_by_bandwidth(sl, rule);
- }
+ return smartlist_choose_node_by_bandwidth_weights(sl, rule);
}
/** Return a random running node from the nodelist. Never
@@ -2418,11 +2249,29 @@ router_choose_random_node(smartlist_t *excludedsmartlist,
router_add_running_nodes_to_smartlist(sl, allow_invalid,
need_uptime, need_capacity,
need_guard, need_desc);
+ log_debug(LD_CIRC,
+ "We found %d running nodes.",
+ smartlist_len(sl));
+
smartlist_subtract(sl,excludednodes);
- if (excludedsmartlist)
+ log_debug(LD_CIRC,
+ "We removed %d excludednodes, leaving %d nodes.",
+ smartlist_len(excludednodes),
+ smartlist_len(sl));
+
+ if (excludedsmartlist) {
smartlist_subtract(sl,excludedsmartlist);
- if (excludedset)
+ log_debug(LD_CIRC,
+ "We removed %d excludedsmartlist, leaving %d nodes.",
+ smartlist_len(excludedsmartlist),
+ smartlist_len(sl));
+ }
+ if (excludedset) {
routerset_subtract_nodes(sl,excludedset);
+ log_debug(LD_CIRC,
+ "We removed excludedset, leaving %d nodes.",
+ smartlist_len(sl));
+ }
// Always weight by bandwidth
choice = node_sl_choose_by_bandwidth(sl, rule);
@@ -2942,9 +2791,10 @@ routerlist_insert(routerlist_t *rl, routerinfo_t *ri)
* corresponding router in rl-\>routers or rl-\>old_routers. Return the status
* of inserting <b>ei</b>. Free <b>ei</b> if it isn't inserted. */
MOCK_IMPL(STATIC was_router_added_t,
-extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei))
+extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible))
{
was_router_added_t r;
+ const char *compatibility_error_msg;
routerinfo_t *ri = rimap_get(rl->identity_map,
ei->cache_info.identity_digest);
signed_descriptor_t *sd =
@@ -2961,9 +2811,16 @@ extrainfo_insert,(routerlist_t *rl, extrainfo_t *ei))
r = ROUTER_NOT_IN_CONSENSUS;
goto done;
}
- if (routerinfo_incompatible_with_extrainfo(ri, ei, sd, NULL)) {
+ if (routerinfo_incompatible_with_extrainfo(ri, ei, sd,
+ &compatibility_error_msg)) {
+ const int severity = warn_if_incompatible ? LOG_WARN : LOG_INFO;
r = (ri->cache_info.extrainfo_is_bogus) ?
ROUTER_BAD_EI : ROUTER_NOT_IN_CONSENSUS;
+
+ log_fn(severity,LD_DIR,
+ "router info incompatible with extra info (reason: %s)",
+ compatibility_error_msg);
+
goto done;
}
@@ -3376,7 +3233,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
router_describe(router));
*msg = "Router descriptor was not new.";
routerinfo_free(router);
- return ROUTER_WAS_NOT_NEW;
+ return ROUTER_IS_ALREADY_KNOWN;
}
}
@@ -3461,7 +3318,7 @@ router_add_to_routerlist(routerinfo_t *router, const char **msg,
&routerlist->desc_store);
routerlist_insert_old(routerlist, router);
*msg = "Router descriptor was not new.";
- return ROUTER_WAS_NOT_NEW;
+ return ROUTER_IS_ALREADY_KNOWN;
} else {
/* Same key, and either new, or listed in the consensus. */
log_debug(LD_DIR, "Replacing entry for router %s",
@@ -3508,7 +3365,7 @@ router_add_extrainfo_to_routerlist(extrainfo_t *ei, const char **msg,
if (msg) *msg = NULL;
/*XXXX023 Do something with msg */
- inserted = extrainfo_insert(router_get_routerlist(), ei);
+ inserted = extrainfo_insert(router_get_routerlist(), ei, !from_cache);
if (WRA_WAS_ADDED(inserted) && !from_cache)
signed_desc_append_to_journal(&ei->cache_info,
@@ -4369,51 +4226,57 @@ list_pending_fpsk_downloads(fp_pair_map_t *result)
* range.) If <b>source</b> is given, download from <b>source</b>;
* otherwise, download from an appropriate random directory server.
*/
-static void
-initiate_descriptor_downloads(const routerstatus_t *source,
- int purpose,
- smartlist_t *digests,
- int lo, int hi, int pds_flags)
+MOCK_IMPL(STATIC void, initiate_descriptor_downloads,
+ (const routerstatus_t *source, int purpose, smartlist_t *digests,
+ int lo, int hi, int pds_flags))
{
- int i, n = hi-lo;
char *resource, *cp;
- size_t r_len;
-
- int digest_len = DIGEST_LEN, enc_digest_len = HEX_DIGEST_LEN;
- char sep = '+';
- int b64_256 = 0;
+ int digest_len, enc_digest_len;
+ const char *sep;
+ int b64_256;
+ smartlist_t *tmp;
if (purpose == DIR_PURPOSE_FETCH_MICRODESC) {
/* Microdescriptors are downloaded by "-"-separated base64-encoded
* 256-bit digests. */
digest_len = DIGEST256_LEN;
- enc_digest_len = BASE64_DIGEST256_LEN;
- sep = '-';
+ enc_digest_len = BASE64_DIGEST256_LEN + 1;
+ sep = "-";
b64_256 = 1;
+ } else {
+ digest_len = DIGEST_LEN;
+ enc_digest_len = HEX_DIGEST_LEN + 1;
+ sep = "+";
+ b64_256 = 0;
}
- if (n <= 0)
- return;
if (lo < 0)
lo = 0;
if (hi > smartlist_len(digests))
hi = smartlist_len(digests);
- r_len = 8 + (enc_digest_len+1)*n;
- cp = resource = tor_malloc(r_len);
- memcpy(cp, "d/", 2);
- cp += 2;
- for (i = lo; i < hi; ++i) {
+ if (hi-lo <= 0)
+ return;
+
+ tmp = smartlist_new();
+
+ for (; lo < hi; ++lo) {
+ cp = tor_malloc(enc_digest_len);
if (b64_256) {
- digest256_to_base64(cp, smartlist_get(digests, i));
+ digest256_to_base64(cp, smartlist_get(digests, lo));
} else {
- base16_encode(cp, r_len-(cp-resource),
- smartlist_get(digests,i), digest_len);
+ base16_encode(cp, enc_digest_len, smartlist_get(digests, lo),
+ digest_len);
}
- cp += enc_digest_len;
- *cp++ = sep;
+ smartlist_add(tmp, cp);
}
- memcpy(cp-1, ".z", 3);
+
+ cp = smartlist_join_strings(tmp, sep, 0, NULL);
+ tor_asprintf(&resource, "d/%s.z", cp);
+
+ SMARTLIST_FOREACH(tmp, char *, cp1, tor_free(cp1));
+ smartlist_free(tmp);
+ tor_free(cp);
if (source) {
/* We know which authority we want. */
@@ -4428,14 +4291,28 @@ initiate_descriptor_downloads(const routerstatus_t *source,
tor_free(resource);
}
-/** Max amount of hashes to download per request.
- * Since squid does not like URLs >= 4096 bytes we limit it to 96.
- * 4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058
- * 4058/41 (40 for the hash and 1 for the + that separates them) => 98
- * So use 96 because it's a nice number.
+/** Return the max number of hashes to put in a URL for a given request.
*/
-#define MAX_DL_PER_REQUEST 96
-#define MAX_MICRODESC_DL_PER_REQUEST 92
+static int
+max_dl_per_request(const or_options_t *options, int purpose)
+{
+ /* Since squid does not like URLs >= 4096 bytes we limit it to 96.
+ * 4096 - strlen(http://255.255.255.255/tor/server/d/.z) == 4058
+ * 4058/41 (40 for the hash and 1 for the + that separates them) => 98
+ * So use 96 because it's a nice number.
+ */
+ int max = 96;
+ if (purpose == DIR_PURPOSE_FETCH_MICRODESC) {
+ max = 92;
+ }
+ /* If we're going to tunnel our connections, we can ask for a lot more
+ * in a request. */
+ if (!directory_fetches_from_authorities(options)) {
+ max = 500;
+ }
+ return max;
+}
+
/** Don't split our requests so finely that we are requesting fewer than
* this number per server. */
#define MIN_DL_PER_REQUEST 4
@@ -4457,92 +4334,89 @@ launch_descriptor_downloads(int purpose,
smartlist_t *downloadable,
const routerstatus_t *source, time_t now)
{
- int should_delay = 0, n_downloadable;
const or_options_t *options = get_options();
const char *descname;
+ const int fetch_microdesc = (purpose == DIR_PURPOSE_FETCH_MICRODESC);
+ int n_downloadable = smartlist_len(downloadable);
- tor_assert(purpose == DIR_PURPOSE_FETCH_SERVERDESC ||
- purpose == DIR_PURPOSE_FETCH_MICRODESC);
+ int i, n_per_request, max_dl_per_req;
+ const char *req_plural = "", *rtr_plural = "";
+ int pds_flags = PDS_RETRY_IF_NO_SERVERS;
- descname = (purpose == DIR_PURPOSE_FETCH_SERVERDESC) ?
- "routerdesc" : "microdesc";
+ tor_assert(fetch_microdesc || purpose == DIR_PURPOSE_FETCH_SERVERDESC);
+ descname = fetch_microdesc ? "microdesc" : "routerdesc";
+
+ if (!n_downloadable)
+ return;
- n_downloadable = smartlist_len(downloadable);
if (!directory_fetches_dir_info_early(options)) {
if (n_downloadable >= MAX_DL_TO_DELAY) {
log_debug(LD_DIR,
"There are enough downloadable %ss to launch requests.",
descname);
- should_delay = 0;
} else {
- should_delay = (last_descriptor_download_attempted +
- options->TestingClientMaxIntervalWithoutRequest) > now;
- if (!should_delay && n_downloadable) {
- if (last_descriptor_download_attempted) {
- log_info(LD_DIR,
- "There are not many downloadable %ss, but we've "
- "been waiting long enough (%d seconds). Downloading.",
- descname,
- (int)(now-last_descriptor_download_attempted));
- } else {
- log_info(LD_DIR,
- "There are not many downloadable %ss, but we haven't "
- "tried downloading descriptors recently. Downloading.",
- descname);
- }
+
+ /* should delay */
+ if ((last_descriptor_download_attempted +
+ options->TestingClientMaxIntervalWithoutRequest) > now)
+ return;
+
+ if (last_descriptor_download_attempted) {
+ log_info(LD_DIR,
+ "There are not many downloadable %ss, but we've "
+ "been waiting long enough (%d seconds). Downloading.",
+ descname,
+ (int)(now-last_descriptor_download_attempted));
+ } else {
+ log_info(LD_DIR,
+ "There are not many downloadable %ss, but we haven't "
+ "tried downloading descriptors recently. Downloading.",
+ descname);
}
}
}
- if (! should_delay && n_downloadable) {
- int i, n_per_request;
- const char *req_plural = "", *rtr_plural = "";
- int pds_flags = PDS_RETRY_IF_NO_SERVERS;
- if (! authdir_mode_any_nonhidserv(options)) {
- /* If we wind up going to the authorities, we want to only open one
- * connection to each authority at a time, so that we don't overload
- * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH
- * regardless of whether we're a cache or not; it gets ignored if we're
- * not calling router_pick_trusteddirserver.
- *
- * Setting this flag can make initiate_descriptor_downloads() ignore
- * requests. We need to make sure that we do in fact call
- * update_router_descriptor_downloads() later on, once the connections
- * have succeeded or failed.
- */
- pds_flags |= (purpose == DIR_PURPOSE_FETCH_MICRODESC) ?
- PDS_NO_EXISTING_MICRODESC_FETCH :
- PDS_NO_EXISTING_SERVERDESC_FETCH;
- }
+ if (!authdir_mode_any_nonhidserv(options)) {
+ /* If we wind up going to the authorities, we want to only open one
+ * connection to each authority at a time, so that we don't overload
+ * them. We do this by setting PDS_NO_EXISTING_SERVERDESC_FETCH
+ * regardless of whether we're a cache or not.
+ *
+ * Setting this flag can make initiate_descriptor_downloads() ignore
+ * requests. We need to make sure that we do in fact call
+ * update_router_descriptor_downloads() later on, once the connections
+ * have succeeded or failed.
+ */
+ pds_flags |= fetch_microdesc ?
+ PDS_NO_EXISTING_MICRODESC_FETCH :
+ PDS_NO_EXISTING_SERVERDESC_FETCH;
+ }
- n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS);
- if (purpose == DIR_PURPOSE_FETCH_MICRODESC) {
- if (n_per_request > MAX_MICRODESC_DL_PER_REQUEST)
- n_per_request = MAX_MICRODESC_DL_PER_REQUEST;
- } else {
- if (n_per_request > MAX_DL_PER_REQUEST)
- n_per_request = MAX_DL_PER_REQUEST;
- }
- if (n_per_request < MIN_DL_PER_REQUEST)
- n_per_request = MIN_DL_PER_REQUEST;
-
- if (n_downloadable > n_per_request)
- req_plural = rtr_plural = "s";
- else if (n_downloadable > 1)
- rtr_plural = "s";
-
- log_info(LD_DIR,
- "Launching %d request%s for %d %s%s, %d at a time",
- CEIL_DIV(n_downloadable, n_per_request), req_plural,
- n_downloadable, descname, rtr_plural, n_per_request);
- smartlist_sort_digests(downloadable);
- for (i=0; i < n_downloadable; i += n_per_request) {
- initiate_descriptor_downloads(source, purpose,
- downloadable, i, i+n_per_request,
- pds_flags);
- }
- last_descriptor_download_attempted = now;
+ n_per_request = CEIL_DIV(n_downloadable, MIN_REQUESTS);
+ max_dl_per_req = max_dl_per_request(options, purpose);
+
+ if (n_per_request > max_dl_per_req)
+ n_per_request = max_dl_per_req;
+
+ if (n_per_request < MIN_DL_PER_REQUEST)
+ n_per_request = MIN_DL_PER_REQUEST;
+
+ if (n_downloadable > n_per_request)
+ req_plural = rtr_plural = "s";
+ else if (n_downloadable > 1)
+ rtr_plural = "s";
+
+ log_info(LD_DIR,
+ "Launching %d request%s for %d %s%s, %d at a time",
+ CEIL_DIV(n_downloadable, n_per_request), req_plural,
+ n_downloadable, descname, rtr_plural, n_per_request);
+ smartlist_sort_digests(downloadable);
+ for (i=0; i < n_downloadable; i += n_per_request) {
+ initiate_descriptor_downloads(source, purpose,
+ downloadable, i, i+n_per_request,
+ pds_flags);
}
+ last_descriptor_download_attempted = now;
}
/** For any descriptor that we want that's currently listed in
@@ -4722,7 +4596,7 @@ update_extrainfo_downloads(time_t now)
routerlist_t *rl;
smartlist_t *wanted;
digestmap_t *pending;
- int old_routers, i;
+ int old_routers, i, max_dl_per_req;
int n_no_ei = 0, n_pending = 0, n_have = 0, n_delay = 0;
if (! options->DownloadExtraInfo)
return;
@@ -4778,9 +4652,11 @@ update_extrainfo_downloads(time_t now)
n_no_ei, n_have, n_delay, n_pending, smartlist_len(wanted));
smartlist_shuffle(wanted);
- for (i = 0; i < smartlist_len(wanted); i += MAX_DL_PER_REQUEST) {
+
+ max_dl_per_req = max_dl_per_request(options, DIR_PURPOSE_FETCH_EXTRAINFO);
+ for (i = 0; i < smartlist_len(wanted); i += max_dl_per_req) {
initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_EXTRAINFO,
- wanted, i, i + MAX_DL_PER_REQUEST,
+ wanted, i, i+max_dl_per_req,
PDS_RETRY_IF_NO_SERVERS|PDS_NO_EXISTING_SERVERDESC_FETCH);
}
diff --git a/src/or/routerlist.h b/src/or/routerlist.h
index c6151deb49..f106ca2316 100644
--- a/src/or/routerlist.h
+++ b/src/or/routerlist.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -118,7 +118,7 @@ WRA_WAS_ADDED(was_router_added_t s) {
static INLINE int WRA_WAS_OUTDATED(was_router_added_t s)
{
return (s == ROUTER_WAS_TOO_OLD ||
- s == ROUTER_WAS_NOT_NEW ||
+ s == ROUTER_IS_ALREADY_KNOWN ||
s == ROUTER_NOT_IN_CONSENSUS ||
s == ROUTER_NOT_IN_CONSENSUS_OR_NETWORKSTATUS);
}
@@ -227,7 +227,11 @@ STATIC void scale_array_elements_to_u64(u64_dbl_t *entries, int n_entries,
MOCK_DECL(int, router_descriptor_is_older_than, (const routerinfo_t *router,
int seconds));
MOCK_DECL(STATIC was_router_added_t, extrainfo_insert,
- (routerlist_t *rl, extrainfo_t *ei));
+ (routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible));
+
+MOCK_DECL(STATIC void, initiate_descriptor_downloads,
+ (const routerstatus_t *source, int purpose, smartlist_t *digests,
+ int lo, int hi, int pds_flags));
#endif
diff --git a/src/or/routerparse.c b/src/or/routerparse.c
index bc3b00226a..a2bc8fbb93 100644
--- a/src/or/routerparse.c
+++ b/src/or/routerparse.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -2598,11 +2598,15 @@ networkstatus_parse_vote_from_string(const char *s, const char **eos_out,
(int) tor_parse_long(tok->args[1], 10, 0, INT_MAX, &ok, NULL);
if (!ok)
goto err;
- if (ns->valid_after + MIN_VOTE_INTERVAL > ns->fresh_until) {
+ if (ns->valid_after +
+ (get_options()->TestingTorNetwork ?
+ MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL) > ns->fresh_until) {
log_warn(LD_DIR, "Vote/consensus freshness interval is too short");
goto err;
}
- if (ns->valid_after + MIN_VOTE_INTERVAL*2 > ns->valid_until) {
+ if (ns->valid_after +
+ (get_options()->TestingTorNetwork ?
+ MIN_VOTE_INTERVAL_TESTING : MIN_VOTE_INTERVAL)*2 > ns->valid_until) {
log_warn(LD_DIR, "Vote/consensus liveness interval is too short");
goto err;
}
@@ -4246,40 +4250,50 @@ tor_version_parse(const char *s, tor_version_t *out)
char *eos=NULL;
const char *cp=NULL;
/* Format is:
- * "Tor " ? NUM dot NUM dot NUM [ ( pre | rc | dot ) NUM [ - tag ] ]
+ * "Tor " ? NUM dot NUM [ dot NUM [ ( pre | rc | dot ) NUM ] ] [ - tag ]
*/
tor_assert(s);
tor_assert(out);
memset(out, 0, sizeof(tor_version_t));
-
+ out->status = VER_RELEASE;
if (!strcasecmpstart(s, "Tor "))
s += 4;
- /* Get major. */
- out->major = (int)strtol(s,&eos,10);
- if (!eos || eos==s || *eos != '.') return -1;
- cp = eos+1;
-
- /* Get minor */
- out->minor = (int) strtol(cp,&eos,10);
- if (!eos || eos==cp || *eos != '.') return -1;
- cp = eos+1;
-
- /* Get micro */
- out->micro = (int) strtol(cp,&eos,10);
- if (!eos || eos==cp) return -1;
- if (!*eos) {
- out->status = VER_RELEASE;
- out->patchlevel = 0;
+ cp = s;
+
+#define NUMBER(m) \
+ do { \
+ out->m = (int)strtol(cp, &eos, 10); \
+ if (!eos || eos == cp) \
+ return -1; \
+ cp = eos; \
+ } while (0)
+
+#define DOT() \
+ do { \
+ if (*cp != '.') \
+ return -1; \
+ ++cp; \
+ } while (0)
+
+ NUMBER(major);
+ DOT();
+ NUMBER(minor);
+ if (*cp == 0)
return 0;
- }
- cp = eos;
+ else if (*cp == '-')
+ goto status_tag;
+ DOT();
+ NUMBER(micro);
/* Get status */
- if (*cp == '.') {
- out->status = VER_RELEASE;
+ if (*cp == 0) {
+ return 0;
+ } else if (*cp == '.') {
++cp;
+ } else if (*cp == '-') {
+ goto status_tag;
} else if (0==strncmp(cp, "pre", 3)) {
out->status = VER_PRE;
cp += 3;
@@ -4290,11 +4304,9 @@ tor_version_parse(const char *s, tor_version_t *out)
return -1;
}
- /* Get patchlevel */
- out->patchlevel = (int) strtol(cp,&eos,10);
- if (!eos || eos==cp) return -1;
- cp = eos;
+ NUMBER(patchlevel);
+ status_tag:
/* Get status tag. */
if (*cp == '-' || *cp == '.')
++cp;
@@ -4330,6 +4342,8 @@ tor_version_parse(const char *s, tor_version_t *out)
}
return 0;
+#undef NUMBER
+#undef DOT
}
/** Compare two tor versions; Return <0 if a < b; 0 if a ==b, >0 if a >
@@ -4417,6 +4431,9 @@ sort_version_list(smartlist_t *versions, int remove_duplicates)
* to *<b>encoded_size_out</b>, and a pointer to the possibly next
* descriptor to *<b>next_out</b>; return 0 for success (including validation)
* and -1 for failure.
+ *
+ * If <b>as_hsdir</b> is 1, we're parsing this as an HSDir, and we should
+ * be strict about time formats.
*/
int
rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
@@ -4424,7 +4441,8 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
char **intro_points_encrypted_out,
size_t *intro_points_encrypted_size_out,
size_t *encoded_size_out,
- const char **next_out, const char *desc)
+ const char **next_out, const char *desc,
+ int as_hsdir)
{
rend_service_descriptor_t *result =
tor_malloc_zero(sizeof(rend_service_descriptor_t));
@@ -4438,6 +4456,8 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
char public_key_hash[DIGEST_LEN];
char test_desc_id[DIGEST_LEN];
memarea_t *area = NULL;
+ const int strict_time_fmt = as_hsdir;
+
tor_assert(desc);
/* Check if desc starts correctly. */
if (strncmp(desc, "rendezvous-service-descriptor ",
@@ -4532,7 +4552,7 @@ rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
* descriptor. */
tok = find_by_keyword(tokens, R_PUBLICATION_TIME);
tor_assert(tok->n_args == 1);
- if (parse_iso_time(tok->args[0], &result->timestamp) < 0) {
+ if (parse_iso_time_(tok->args[0], &result->timestamp, strict_time_fmt) < 0) {
log_warn(LD_REND, "Invalid publication time: '%s'", tok->args[0]);
goto err;
}
diff --git a/src/or/routerparse.h b/src/or/routerparse.h
index e950548f8c..18a7d2563c 100644
--- a/src/or/routerparse.h
+++ b/src/or/routerparse.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -73,7 +73,8 @@ int rend_parse_v2_service_descriptor(rend_service_descriptor_t **parsed_out,
char **intro_points_encrypted_out,
size_t *intro_points_encrypted_size_out,
size_t *encoded_size_out,
- const char **next_out, const char *desc);
+ const char **next_out, const char *desc,
+ int as_hsdir);
int rend_decrypt_introduction_points(char **ipos_decrypted,
size_t *ipos_decrypted_size,
const char *descriptor_cookie,
diff --git a/src/or/routerset.c b/src/or/routerset.c
index 38aed77ee9..99de11ed5e 100644
--- a/src/or/routerset.c
+++ b/src/or/routerset.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ROUTERSET_PRIVATE
diff --git a/src/or/routerset.h b/src/or/routerset.h
index a741eb5fda..8d41de8b6b 100644
--- a/src/or/routerset.h
+++ b/src/or/routerset.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/scheduler.c b/src/or/scheduler.c
new file mode 100644
index 0000000000..f3fbc4ad4e
--- /dev/null
+++ b/src/or/scheduler.c
@@ -0,0 +1,711 @@
+/* * Copyright (c) 2013-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file scheduler.c
+ * \brief Relay scheduling system
+ **/
+
+#include "or.h"
+
+#define TOR_CHANNEL_INTERNAL_ /* For channel_flush_some_cells() */
+#include "channel.h"
+
+#include "compat_libevent.h"
+#define SCHEDULER_PRIVATE_
+#include "scheduler.h"
+
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
+
+/*
+ * Scheduler high/low watermarks
+ */
+
+static uint32_t sched_q_low_water = 16384;
+static uint32_t sched_q_high_water = 32768;
+
+/*
+ * Maximum cells to flush in a single call to channel_flush_some_cells();
+ * setting this low means more calls, but too high and we could overshoot
+ * sched_q_high_water.
+ */
+
+static uint32_t sched_max_flush_cells = 16;
+
+/*
+ * Write scheduling works by keeping track of which channels can
+ * accept cells, and have cells to write. From the scheduler's perspective,
+ * a channel can be in four possible states:
+ *
+ * 1.) Not open for writes, no cells to send
+ * - Not much to do here, and the channel will have scheduler_state ==
+ * SCHED_CHAN_IDLE
+ * - Transitions from:
+ * - Open for writes/has cells by simultaneously draining all circuit
+ * queues and filling the output buffer.
+ * - Transitions to:
+ * - Not open for writes/has cells by arrival of cells on an attached
+ * circuit (this would be driven from append_cell_to_circuit_queue())
+ * - Open for writes/no cells by a channel type specific path;
+ * driven from connection_or_flushed_some() for channel_tls_t.
+ *
+ * 2.) Open for writes, no cells to send
+ * - Not much here either; this will be the state an idle but open channel
+ * can be expected to settle in. It will have scheduler_state ==
+ * SCHED_CHAN_WAITING_FOR_CELLS
+ * - Transitions from:
+ * - Not open for writes/no cells by flushing some of the output
+ * buffer.
+ * - Open for writes/has cells by the scheduler moving cells from
+ * circuit queues to channel output queue, but not having enough
+ * to fill the output queue.
+ * - Transitions to:
+ * - Open for writes/has cells by arrival of new cells on an attached
+ * circuit, in append_cell_to_circuit_queue()
+ *
+ * 3.) Not open for writes, cells to send
+ * - This is the state of a busy circuit limited by output bandwidth;
+ * cells have piled up in the circuit queues waiting to be relayed.
+ * The channel will have scheduler_state == SCHED_CHAN_WAITING_TO_WRITE.
+ * - Transitions from:
+ * - Not open for writes/no cells by arrival of cells on an attached
+ * circuit
+ * - Open for writes/has cells by filling an output buffer without
+ * draining all cells from attached circuits
+ * - Transitions to:
+ * - Opens for writes/has cells by draining some of the output buffer
+ * via the connection_or_flushed_some() path (for channel_tls_t).
+ *
+ * 4.) Open for writes, cells to send
+ * - This connection is ready to relay some cells and waiting for
+ * the scheduler to choose it. The channel will have scheduler_state ==
+ * SCHED_CHAN_PENDING.
+ * - Transitions from:
+ * - Not open for writes/has cells by the connection_or_flushed_some()
+ * path
+ * - Open for writes/no cells by the append_cell_to_circuit_queue()
+ * path
+ * - Transitions to:
+ * - Not open for writes/no cells by draining all circuit queues and
+ * simultaneously filling the output buffer.
+ * - Not open for writes/has cells by writing enough cells to fill the
+ * output buffer
+ * - Open for writes/no cells by draining all attached circuit queues
+ * without also filling the output buffer
+ *
+ * Other event-driven parts of the code move channels between these scheduling
+ * states by calling scheduler functions; the scheduler only runs on open-for-
+ * writes/has-cells channels and is the only path for those to transition to
+ * other states. The scheduler_run() function gives us the opportunity to do
+ * scheduling work, and is called from other scheduler functions whenever a
+ * state transition occurs, and periodically from the main event loop.
+ */
+
+/* Scheduler global data structures */
+
+/*
+ * We keep a list of channels that are pending - i.e, have cells to write
+ * and can accept them to send. The enum scheduler_state in channel_t
+ * is reserved for our use.
+ */
+
+/* Pqueue of channels that can write and have cells (pending work) */
+STATIC smartlist_t *channels_pending = NULL;
+
+/*
+ * This event runs the scheduler from its callback, and is manually
+ * activated whenever a channel enters open for writes/cells to send.
+ */
+
+STATIC struct event *run_sched_ev = NULL;
+
+/*
+ * Queue heuristic; this is not the queue size, but an 'effective queuesize'
+ * that ages out contributions from stalled channels.
+ */
+
+STATIC uint64_t queue_heuristic = 0;
+
+/*
+ * Timestamp for last queue heuristic update
+ */
+
+STATIC time_t queue_heuristic_timestamp = 0;
+
+/* Scheduler static function declarations */
+
+static void scheduler_evt_callback(evutil_socket_t fd,
+ short events, void *arg);
+static int scheduler_more_work(void);
+static void scheduler_retrigger(void);
+#if 0
+static void scheduler_trigger(void);
+#endif
+
+/* Scheduler function implementations */
+
+/** Free everything and shut down the scheduling system */
+
+void
+scheduler_free_all(void)
+{
+ log_debug(LD_SCHED, "Shutting down scheduler");
+
+ if (run_sched_ev) {
+ if (event_del(run_sched_ev) < 0) {
+ log_warn(LD_BUG, "Problem deleting run_sched_ev");
+ }
+ tor_event_free(run_sched_ev);
+ run_sched_ev = NULL;
+ }
+
+ if (channels_pending) {
+ smartlist_free(channels_pending);
+ channels_pending = NULL;
+ }
+}
+
+/**
+ * Comparison function to use when sorting pending channels
+ */
+
+MOCK_IMPL(STATIC int,
+scheduler_compare_channels, (const void *c1_v, const void *c2_v))
+{
+ channel_t *c1 = NULL, *c2 = NULL;
+ /* These are a workaround for -Wbad-function-cast throwing a fit */
+ const circuitmux_policy_t *p1, *p2;
+ uintptr_t p1_i, p2_i;
+
+ tor_assert(c1_v);
+ tor_assert(c2_v);
+
+ c1 = (channel_t *)(c1_v);
+ c2 = (channel_t *)(c2_v);
+
+ tor_assert(c1);
+ tor_assert(c2);
+
+ if (c1 != c2) {
+ if (circuitmux_get_policy(c1->cmux) ==
+ circuitmux_get_policy(c2->cmux)) {
+ /* Same cmux policy, so use the mux comparison */
+ return circuitmux_compare_muxes(c1->cmux, c2->cmux);
+ } else {
+ /*
+ * Different policies; not important to get this edge case perfect
+ * because the current code never actually gives different channels
+ * different cmux policies anyway. Just use this arbitrary but
+ * definite choice.
+ */
+ p1 = circuitmux_get_policy(c1->cmux);
+ p2 = circuitmux_get_policy(c2->cmux);
+ p1_i = (uintptr_t)p1;
+ p2_i = (uintptr_t)p2;
+
+ return (p1_i < p2_i) ? -1 : 1;
+ }
+ } else {
+ /* c1 == c2, so always equal */
+ return 0;
+ }
+}
+
+/*
+ * Scheduler event callback; this should get triggered once per event loop
+ * if any scheduling work was created during the event loop.
+ */
+
+static void
+scheduler_evt_callback(evutil_socket_t fd, short events, void *arg)
+{
+ (void)fd;
+ (void)events;
+ (void)arg;
+ log_debug(LD_SCHED, "Scheduler event callback called");
+
+ tor_assert(run_sched_ev);
+
+ /* Run the scheduler */
+ scheduler_run();
+
+ /* Do we have more work to do? */
+ if (scheduler_more_work()) scheduler_retrigger();
+}
+
+/** Mark a channel as no longer ready to accept writes */
+
+MOCK_IMPL(void,
+scheduler_channel_doesnt_want_writes,(channel_t *chan))
+{
+ tor_assert(chan);
+
+ tor_assert(channels_pending);
+
+ /* If it's already in pending, we can put it in waiting_to_write */
+ if (chan->scheduler_state == SCHED_CHAN_PENDING) {
+ /*
+ * It's in channels_pending, so it shouldn't be in any of
+ * the other lists. It can't write any more, so it goes to
+ * channels_waiting_to_write.
+ */
+ smartlist_pqueue_remove(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p went from pending "
+ "to waiting_to_write",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ } else {
+ /*
+ * It's not in pending, so it can't become waiting_to_write; it's
+ * either not in any of the lists (nothing to do) or it's already in
+ * waiting_for_cells (remove it, can't write any more).
+ */
+ if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) {
+ chan->scheduler_state = SCHED_CHAN_IDLE;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p left waiting_for_cells",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ }
+ }
+}
+
+/** Mark a channel as having waiting cells */
+
+MOCK_IMPL(void,
+scheduler_channel_has_waiting_cells,(channel_t *chan))
+{
+ int became_pending = 0;
+
+ tor_assert(chan);
+ tor_assert(channels_pending);
+
+ /* First, check if this one also writeable */
+ if (chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS) {
+ /*
+ * It's in channels_waiting_for_cells, so it shouldn't be in any of
+ * the other lists. It has waiting cells now, so it goes to
+ * channels_pending.
+ */
+ chan->scheduler_state = SCHED_CHAN_PENDING;
+ smartlist_pqueue_add(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p went from waiting_for_cells "
+ "to pending",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ became_pending = 1;
+ } else {
+ /*
+ * It's not in waiting_for_cells, so it can't become pending; it's
+ * either not in any of the lists (we add it to waiting_to_write)
+ * or it's already in waiting_to_write or pending (we do nothing)
+ */
+ if (!(chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE ||
+ chan->scheduler_state == SCHED_CHAN_PENDING)) {
+ chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p entered waiting_to_write",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ }
+ }
+
+ /*
+ * If we made a channel pending, we potentially have scheduling work
+ * to do.
+ */
+ if (became_pending) scheduler_retrigger();
+}
+
+/** Set up the scheduling system */
+
+void
+scheduler_init(void)
+{
+ log_debug(LD_SCHED, "Initting scheduler");
+
+ tor_assert(!run_sched_ev);
+ run_sched_ev = tor_event_new(tor_libevent_get_base(), -1,
+ 0, scheduler_evt_callback, NULL);
+
+ channels_pending = smartlist_new();
+ queue_heuristic = 0;
+ queue_heuristic_timestamp = approx_time();
+}
+
+/** Check if there's more scheduling work */
+
+static int
+scheduler_more_work(void)
+{
+ tor_assert(channels_pending);
+
+ return ((scheduler_get_queue_heuristic() < sched_q_low_water) &&
+ ((smartlist_len(channels_pending) > 0))) ? 1 : 0;
+}
+
+/** Retrigger the scheduler in a way safe to use from the callback */
+
+static void
+scheduler_retrigger(void)
+{
+ tor_assert(run_sched_ev);
+ event_active(run_sched_ev, EV_TIMEOUT, 1);
+}
+
+/** Notify the scheduler of a channel being closed */
+
+MOCK_IMPL(void,
+scheduler_release_channel,(channel_t *chan))
+{
+ tor_assert(chan);
+ tor_assert(channels_pending);
+
+ if (chan->scheduler_state == SCHED_CHAN_PENDING) {
+ smartlist_pqueue_remove(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ }
+
+ chan->scheduler_state = SCHED_CHAN_IDLE;
+}
+
+/** Run the scheduling algorithm if necessary */
+
+MOCK_IMPL(void,
+scheduler_run, (void))
+{
+ int n_cells, n_chans_before, n_chans_after;
+ uint64_t q_len_before, q_heur_before, q_len_after, q_heur_after;
+ ssize_t flushed, flushed_this_time;
+ smartlist_t *to_readd = NULL;
+ channel_t *chan = NULL;
+
+ log_debug(LD_SCHED, "We have a chance to run the scheduler");
+
+ if (scheduler_get_queue_heuristic() < sched_q_low_water) {
+ n_chans_before = smartlist_len(channels_pending);
+ q_len_before = channel_get_global_queue_estimate();
+ q_heur_before = scheduler_get_queue_heuristic();
+
+ while (scheduler_get_queue_heuristic() <= sched_q_high_water &&
+ smartlist_len(channels_pending) > 0) {
+ /* Pop off a channel */
+ chan = smartlist_pqueue_pop(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx));
+ tor_assert(chan);
+
+ /* Figure out how many cells we can write */
+ n_cells = channel_num_cells_writeable(chan);
+ if (n_cells > 0) {
+ log_debug(LD_SCHED,
+ "Scheduler saw pending channel " U64_FORMAT " at %p with "
+ "%d cells writeable",
+ U64_PRINTF_ARG(chan->global_identifier), chan, n_cells);
+
+ flushed = 0;
+ while (flushed < n_cells &&
+ scheduler_get_queue_heuristic() <= sched_q_high_water) {
+ flushed_this_time =
+ channel_flush_some_cells(chan,
+ MIN(sched_max_flush_cells,
+ (size_t) n_cells - flushed));
+ if (flushed_this_time <= 0) break;
+ flushed += flushed_this_time;
+ }
+
+ if (flushed < n_cells) {
+ /* We ran out of cells to flush */
+ chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p "
+ "entered waiting_for_cells from pending",
+ U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ } else {
+ /* The channel may still have some cells */
+ if (channel_more_to_flush(chan)) {
+ /* The channel goes to either pending or waiting_to_write */
+ if (channel_num_cells_writeable(chan) > 0) {
+ /* Add it back to pending later */
+ if (!to_readd) to_readd = smartlist_new();
+ smartlist_add(to_readd, chan);
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p "
+ "is still pending",
+ U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ } else {
+ /* It's waiting to be able to write more */
+ chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p "
+ "entered waiting_to_write from pending",
+ U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ }
+ } else {
+ /* No cells left; it can go to idle or waiting_for_cells */
+ if (channel_num_cells_writeable(chan) > 0) {
+ /*
+ * It can still accept writes, so it goes to
+ * waiting_for_cells
+ */
+ chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p "
+ "entered waiting_for_cells from pending",
+ U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ } else {
+ /*
+ * We exactly filled up the output queue with all available
+ * cells; go to idle.
+ */
+ chan->scheduler_state = SCHED_CHAN_IDLE;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p "
+ "become idle from pending",
+ U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ }
+ }
+ }
+
+ log_debug(LD_SCHED,
+ "Scheduler flushed %d cells onto pending channel "
+ U64_FORMAT " at %p",
+ (int)flushed, U64_PRINTF_ARG(chan->global_identifier),
+ chan);
+ } else {
+ log_info(LD_SCHED,
+ "Scheduler saw pending channel " U64_FORMAT " at %p with "
+ "no cells writeable",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ /* Put it back to WAITING_TO_WRITE */
+ chan->scheduler_state = SCHED_CHAN_WAITING_TO_WRITE;
+ }
+ }
+
+ /* Readd any channels we need to */
+ if (to_readd) {
+ SMARTLIST_FOREACH_BEGIN(to_readd, channel_t *, chan) {
+ chan->scheduler_state = SCHED_CHAN_PENDING;
+ smartlist_pqueue_add(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ } SMARTLIST_FOREACH_END(chan);
+ smartlist_free(to_readd);
+ }
+
+ n_chans_after = smartlist_len(channels_pending);
+ q_len_after = channel_get_global_queue_estimate();
+ q_heur_after = scheduler_get_queue_heuristic();
+ log_debug(LD_SCHED,
+ "Scheduler handled %d of %d pending channels, queue size from "
+ U64_FORMAT " to " U64_FORMAT ", queue heuristic from "
+ U64_FORMAT " to " U64_FORMAT,
+ n_chans_before - n_chans_after, n_chans_before,
+ U64_PRINTF_ARG(q_len_before), U64_PRINTF_ARG(q_len_after),
+ U64_PRINTF_ARG(q_heur_before), U64_PRINTF_ARG(q_heur_after));
+ }
+}
+
+/** Trigger the scheduling event so we run the scheduler later */
+
+#if 0
+static void
+scheduler_trigger(void)
+{
+ log_debug(LD_SCHED, "Triggering scheduler event");
+
+ tor_assert(run_sched_ev);
+
+ event_add(run_sched_ev, EV_TIMEOUT, 1);
+}
+#endif
+
+/** Mark a channel as ready to accept writes */
+
+void
+scheduler_channel_wants_writes(channel_t *chan)
+{
+ int became_pending = 0;
+
+ tor_assert(chan);
+ tor_assert(channels_pending);
+
+ /* If it's already in waiting_to_write, we can put it in pending */
+ if (chan->scheduler_state == SCHED_CHAN_WAITING_TO_WRITE) {
+ /*
+ * It can write now, so it goes to channels_pending.
+ */
+ smartlist_pqueue_add(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ chan->scheduler_state = SCHED_CHAN_PENDING;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p went from waiting_to_write "
+ "to pending",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ became_pending = 1;
+ } else {
+ /*
+ * It's not in SCHED_CHAN_WAITING_TO_WRITE, so it can't become pending;
+ * it's either idle and goes to WAITING_FOR_CELLS, or it's a no-op.
+ */
+ if (!(chan->scheduler_state == SCHED_CHAN_WAITING_FOR_CELLS ||
+ chan->scheduler_state == SCHED_CHAN_PENDING)) {
+ chan->scheduler_state = SCHED_CHAN_WAITING_FOR_CELLS;
+ log_debug(LD_SCHED,
+ "Channel " U64_FORMAT " at %p entered waiting_for_cells",
+ U64_PRINTF_ARG(chan->global_identifier), chan);
+ }
+ }
+
+ /*
+ * If we made a channel pending, we potentially have scheduling work
+ * to do.
+ */
+ if (became_pending) scheduler_retrigger();
+}
+
+/**
+ * Notify the scheduler that a channel's position in the pqueue may have
+ * changed
+ */
+
+void
+scheduler_touch_channel(channel_t *chan)
+{
+ tor_assert(chan);
+
+ if (chan->scheduler_state == SCHED_CHAN_PENDING) {
+ /* Remove and re-add it */
+ smartlist_pqueue_remove(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ smartlist_pqueue_add(channels_pending,
+ scheduler_compare_channels,
+ STRUCT_OFFSET(channel_t, sched_heap_idx),
+ chan);
+ }
+ /* else no-op, since it isn't in the queue */
+}
+
+/**
+ * Notify the scheduler of a queue size adjustment, to recalculate the
+ * queue heuristic.
+ */
+
+void
+scheduler_adjust_queue_size(channel_t *chan, char dir, uint64_t adj)
+{
+ time_t now = approx_time();
+
+ log_debug(LD_SCHED,
+ "Queue size adjustment by %s" U64_FORMAT " for channel "
+ U64_FORMAT,
+ (dir >= 0) ? "+" : "-",
+ U64_PRINTF_ARG(adj),
+ U64_PRINTF_ARG(chan->global_identifier));
+
+ /* Get the queue heuristic up to date */
+ scheduler_update_queue_heuristic(now);
+
+ /* Adjust as appropriate */
+ if (dir >= 0) {
+ /* Increasing it */
+ queue_heuristic += adj;
+ } else {
+ /* Decreasing it */
+ if (queue_heuristic > adj) queue_heuristic -= adj;
+ else queue_heuristic = 0;
+ }
+
+ log_debug(LD_SCHED,
+ "Queue heuristic is now " U64_FORMAT,
+ U64_PRINTF_ARG(queue_heuristic));
+}
+
+/**
+ * Query the current value of the queue heuristic
+ */
+
+STATIC uint64_t
+scheduler_get_queue_heuristic(void)
+{
+ time_t now = approx_time();
+
+ scheduler_update_queue_heuristic(now);
+
+ return queue_heuristic;
+}
+
+/**
+ * Adjust the queue heuristic value to the present time
+ */
+
+STATIC void
+scheduler_update_queue_heuristic(time_t now)
+{
+ time_t diff;
+
+ if (queue_heuristic_timestamp == 0) {
+ /*
+ * Nothing we can sensibly do; must not have been initted properly.
+ * Oh well.
+ */
+ queue_heuristic_timestamp = now;
+ } else if (queue_heuristic_timestamp < now) {
+ diff = now - queue_heuristic_timestamp;
+ /*
+ * This is a simple exponential age-out; the other proposed alternative
+ * was a linear age-out using the bandwidth history in rephist.c; I'm
+ * going with this out of concern that if an adversary can jam the
+ * scheduler long enough, it would cause the bandwidth to drop to
+ * zero and render the aging mechanism ineffective thereafter.
+ */
+ if (0 <= diff && diff < 64) queue_heuristic >>= diff;
+ else queue_heuristic = 0;
+
+ queue_heuristic_timestamp = now;
+
+ log_debug(LD_SCHED,
+ "Queue heuristic is now " U64_FORMAT,
+ U64_PRINTF_ARG(queue_heuristic));
+ }
+ /* else no update needed, or time went backward */
+}
+
+/**
+ * Set scheduler watermarks and flush size
+ */
+
+void
+scheduler_set_watermarks(uint32_t lo, uint32_t hi, uint32_t max_flush)
+{
+ /* Sanity assertions - caller should ensure these are true */
+ tor_assert(lo > 0);
+ tor_assert(hi > lo);
+ tor_assert(max_flush > 0);
+
+ sched_q_low_water = lo;
+ sched_q_high_water = hi;
+ sched_max_flush_cells = max_flush;
+}
+
diff --git a/src/or/scheduler.h b/src/or/scheduler.h
new file mode 100644
index 0000000000..70f6a39d4c
--- /dev/null
+++ b/src/or/scheduler.h
@@ -0,0 +1,50 @@
+/* * Copyright (c) 2013-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file scheduler.h
+ * \brief Header file for scheduler.c
+ **/
+
+#ifndef TOR_SCHEDULER_H
+#define TOR_SCHEDULER_H
+
+#include "or.h"
+#include "channel.h"
+#include "testsupport.h"
+
+/* Global-visibility scheduler functions */
+
+/* Set up and shut down the scheduler from main.c */
+void scheduler_free_all(void);
+void scheduler_init(void);
+MOCK_DECL(void, scheduler_run, (void));
+
+/* Mark channels as having cells or wanting/not wanting writes */
+MOCK_DECL(void,scheduler_channel_doesnt_want_writes,(channel_t *chan));
+MOCK_DECL(void,scheduler_channel_has_waiting_cells,(channel_t *chan));
+void scheduler_channel_wants_writes(channel_t *chan);
+
+/* Notify the scheduler of a channel being closed */
+MOCK_DECL(void,scheduler_release_channel,(channel_t *chan));
+
+/* Notify scheduler of queue size adjustments */
+void scheduler_adjust_queue_size(channel_t *chan, char dir, uint64_t adj);
+
+/* Notify scheduler that a channel's queue position may have changed */
+void scheduler_touch_channel(channel_t *chan);
+
+/* Adjust the watermarks from config file*/
+void scheduler_set_watermarks(uint32_t lo, uint32_t hi, uint32_t max_flush);
+
+/* Things only scheduler.c and its test suite should see */
+
+#ifdef SCHEDULER_PRIVATE_
+MOCK_DECL(STATIC int, scheduler_compare_channels,
+ (const void *c1_v, const void *c2_v));
+STATIC uint64_t scheduler_get_queue_heuristic(void);
+STATIC void scheduler_update_queue_heuristic(time_t now);
+#endif
+
+#endif /* !defined(TOR_SCHEDULER_H) */
+
diff --git a/src/or/statefile.c b/src/or/statefile.c
index 2ce53fdfca..dd1894beb7 100644
--- a/src/or/statefile.c
+++ b/src/or/statefile.c
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define STATEFILE_PRIVATE
@@ -323,7 +323,10 @@ or_state_load(void)
goto done;
}
break;
+ /* treat empty state files as if the file doesn't exist, and generate
+ * a new state file, overwriting the empty file in or_state_save() */
case FN_NOENT:
+ case FN_EMPTY:
break;
case FN_ERROR:
case FN_DIR:
diff --git a/src/or/statefile.h b/src/or/statefile.h
index 1f3aebee4f..8c790ea206 100644
--- a/src/or/statefile.h
+++ b/src/or/statefile.h
@@ -1,7 +1,7 @@
/* Copyright (c) 2001 Matej Pfajfar.
* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_STATEFILE_H
diff --git a/src/or/status.c b/src/or/status.c
index c11d99ba7f..0717070a05 100644
--- a/src/or/status.c
+++ b/src/or/status.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2014, The Tor Project, Inc. */
+/* Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/or/status.h b/src/or/status.h
index 451f343963..3dd8206e0f 100644
--- a/src/or/status.h
+++ b/src/or/status.h
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2014, The Tor Project, Inc. */
+/* Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_STATUS_H
diff --git a/src/or/tor_main.c b/src/or/tor_main.c
index 9489cdca7f..af03b8c06a 100644
--- a/src/or/tor_main.c
+++ b/src/or/tor_main.c
@@ -1,6 +1,6 @@
/* Copyright 2001-2004 Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/** String describing which Tor Git repository version the source was
diff --git a/src/or/transports.c b/src/or/transports.c
index 2623f807d0..6f07054ea8 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -112,8 +112,6 @@ static void parse_method_error(const char *line, int is_server_method);
#define parse_server_method_error(l) parse_method_error(l, 1)
#define parse_client_method_error(l) parse_method_error(l, 0)
-static INLINE void free_execve_args(char **arg);
-
/** Managed proxy protocol strings */
#define PROTO_ENV_ERROR "ENV-ERROR"
#define PROTO_NEG_SUCCESS "VERSION"
@@ -1502,7 +1500,7 @@ pt_kickstart_proxy, (const smartlist_t *transport_list,
/** Frees the array of pointers in <b>arg</b> used as arguments to
execve(2). */
-static INLINE void
+STATIC void
free_execve_args(char **arg)
{
char **tmp = arg;
diff --git a/src/or/transports.h b/src/or/transports.h
index 2958d5e187..7c69941496 100644
--- a/src/or/transports.h
+++ b/src/or/transports.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2003-2004, Roger Dingledine
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -131,6 +131,8 @@ STATIC int configure_proxy(managed_proxy_t *mp);
STATIC char* get_pt_proxy_uri(void);
+STATIC void free_execve_args(char **arg);
+
#endif
#endif
diff --git a/src/test/Makefile.nmake b/src/test/Makefile.nmake
index f6ee7f3f53..0435617683 100644
--- a/src/test/Makefile.nmake
+++ b/src/test/Makefile.nmake
@@ -11,11 +11,12 @@ LIBS = ..\..\..\build-alpha\lib\libevent.lib \
ws2_32.lib advapi32.lib shell32.lib \
crypt32.lib gdi32.lib user32.lib
-TEST_OBJECTS = test.obj test_addr.obj test_containers.obj \
+TEST_OBJECTS = test.obj test_addr.obj test_channel.obj test_channeltls.obj \
+ test_containers.obj \
test_controller_events.obj test_crypto.obj test_data.obj test_dir.obj \
test_checkdir.obj test_microdesc.obj test_pt.obj test_util.obj test_config.obj \
- test_cell_formats.obj test_replay.obj test_introduce.obj tinytest.obj \
- test_hs.obj
+ test_cell_formats.obj test_relay.obj test_replay.obj \
+ test_scheduler.obj test_introduce.obj test_hs.obj tinytest.obj
tinytest.obj: ..\ext\tinytest.c
$(CC) $(CFLAGS) /D snprintf=_snprintf /c ..\ext\tinytest.c
diff --git a/src/test/bench.c b/src/test/bench.c
index 74af06c6e6..68870f8657 100644
--- a/src/test/bench.c
+++ b/src/test/bench.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Ordinarily defined in tor_main.c; this bit is just here to provide one
diff --git a/src/test/bt_test.py b/src/test/bt_test.py
index 8290509fa7..0afe797a6d 100755
--- a/src/test/bt_test.py
+++ b/src/test/bt_test.py
@@ -1,4 +1,4 @@
-# Copyright 2013, The Tor Project, Inc
+# Copyright 2013-2015, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/ed25519_exts_ref.py b/src/test/ed25519_exts_ref.py
index 93dc49ee93..d5a3a79910 100644
--- a/src/test/ed25519_exts_ref.py
+++ b/src/test/ed25519_exts_ref.py
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright 2014, The Tor Project, Inc
+# Copyright 2014-2015, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/fakechans.h b/src/test/fakechans.h
new file mode 100644
index 0000000000..8fb8f420a8
--- /dev/null
+++ b/src/test/fakechans.h
@@ -0,0 +1,26 @@
+ /* Copyright (c) 2014-2015, The Tor Project, Inc. */
+ /* See LICENSE for licensing information */
+
+#ifndef TOR_FAKECHANS_H
+#define TOR_FAKECHANS_H
+
+/**
+ * \file fakechans.h
+ * \brief Declarations for fake channels for test suite use
+ */
+
+void make_fake_cell(cell_t *c);
+void make_fake_var_cell(var_cell_t *c);
+channel_t * new_fake_channel(void);
+void free_fake_channel(channel_t *c);
+
+/* Also exposes some a mock used by both test_channel.c and test_relay.c */
+void scheduler_channel_has_waiting_cells_mock(channel_t *ch);
+void scheduler_release_channel_mock(channel_t *ch);
+
+/* Query some counters used by the exposed mocks */
+int get_mock_scheduler_has_waiting_cells_count(void);
+int get_mock_scheduler_release_channel_count(void);
+
+#endif /* !defined(TOR_FAKECHANS_H) */
+
diff --git a/src/test/include.am b/src/test/include.am
index 9abf3094eb..595be0b7c2 100644
--- a/src/test/include.am
+++ b/src/test/include.am
@@ -1,8 +1,12 @@
-TESTS += src/test/test
+TESTS += src/test/test src/test/test-slow
noinst_PROGRAMS+= src/test/bench
if UNITTESTS_ENABLED
-noinst_PROGRAMS+= src/test/test src/test/test-child
+noinst_PROGRAMS+= \
+ src/test/test \
+ src/test/test-slow \
+ src/test/test-child \
+ src/test/test_workqueue
endif
src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
@@ -17,40 +21,57 @@ src_test_AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
src_test_test_SOURCES = \
src/test/test.c \
+ src/test/test_accounting.c \
src/test/test_addr.c \
+ src/test/test_address.c \
src/test/test_buffers.c \
src/test/test_cell_formats.c \
+ src/test/test_cell_queue.c \
+ src/test/test_channel.c \
+ src/test/test_channeltls.c \
+ src/test/test_checkdir.c \
src/test/test_circuitlist.c \
src/test/test_circuitmux.c \
+ src/test/test_config.c \
src/test/test_containers.c \
src/test/test_controller_events.c \
src/test/test_crypto.c \
- src/test/test_cell_queue.c \
src/test/test_data.c \
src/test/test_dir.c \
- src/test/test_checkdir.c \
+ src/test/test_entryconn.c \
src/test/test_entrynodes.c \
src/test/test_extorport.c \
+ src/test/test_hs.c \
src/test/test_introduce.c \
src/test/test_logging.c \
src/test/test_microdesc.c \
+ src/test/test_nodelist.c \
src/test/test_oom.c \
- src/test/test_accounting.c \
src/test/test_options.c \
+ src/test/test_policy.c \
src/test/test_pt.c \
+ src/test/test_relay.c \
src/test/test_relaycell.c \
src/test/test_replay.c \
src/test/test_routerkeys.c \
+ src/test/test_routerlist.c \
+ src/test/test_routerset.c \
+ src/test/test_scheduler.c \
src/test/test_socks.c \
- src/test/test_util.c \
- src/test/test_config.c \
- src/test/test_hs.c \
- src/test/test_nodelist.c \
- src/test/test_policy.c \
src/test/test_status.c \
- src/test/test_routerset.c \
+ src/test/test_threads.c \
+ src/test/test_util.c \
+ src/test/testing_common.c \
src/ext/tinytest.c
+src_test_test_slow_SOURCES = \
+ src/test/test_slow.c \
+ src/test/test_crypto_slow.c \
+ src/test/test_util_slow.c \
+ src/test/testing_common.c \
+ src/ext/tinytest.c
+
+
src_test_test_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS)
@@ -58,13 +79,24 @@ src_test_test_CPPFLAGS= $(src_test_AM_CPPFLAGS)
src_test_bench_SOURCES = \
src/test/bench.c
+src_test_test_workqueue_SOURCES = \
+ src/test/test_workqueue.c
+src_test_test_workqueue_CPPFLAGS= $(src_test_AM_CPPFLAGS)
+src_test_test_workqueue_CFLAGS = $(AM_CFLAGS) $(TEST_CFLAGS)
+
src_test_test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
src_test_test_LDADD = src/or/libtor-testing.a src/common/libor-testing.a \
src/common/libor-crypto-testing.a $(LIBDONNA) \
src/common/libor-event-testing.a src/trunnel/libor-trunnel-testing.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
- @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
+ @TOR_SYSTEMD_LIBS@
+
+src_test_test_slow_CPPFLAGS = $(src_test_test_CPPFLAGS)
+src_test_test_slow_CFLAGS = $(src_test_test_CFLAGS)
+src_test_test_slow_LDADD = $(src_test_test_LDADD)
+src_test_test_slow_LDFLAGS = $(src_test_test_LDFLAGS)
src_test_bench_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
@TOR_LDFLAGS_libevent@
@@ -72,9 +104,20 @@ src_test_bench_LDADD = src/or/libtor.a src/common/libor.a \
src/common/libor-crypto.a $(LIBDONNA) \
src/common/libor-event.a \
@TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
+ @TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@ \
+ @TOR_SYSTEMD_LIBS@
+
+src_test_test_workqueue_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
+ @TOR_LDFLAGS_libevent@
+src_test_test_workqueue_LDADD = src/or/libtor-testing.a \
+ src/common/libor-testing.a \
+ src/common/libor-crypto-testing.a $(LIBDONNA) \
+ src/common/libor-event-testing.a \
+ @TOR_ZLIB_LIBS@ @TOR_LIB_MATH@ @TOR_LIBEVENT_LIBS@ \
@TOR_OPENSSL_LIBS@ @TOR_LIB_WS32@ @TOR_LIB_GDI@ @CURVE25519_LIBS@
noinst_HEADERS+= \
+ src/test/fakechans.h \
src/test/test.h \
src/test/test_descriptors.inc \
src/test/example_extrainfo.inc \
@@ -115,9 +158,11 @@ if USEPYTHON
./src/test/test-bt-cl assert | $(PYTHON) $(top_srcdir)/src/test/bt_test.py
./src/test/test-bt-cl crash | $(PYTHON) $(top_srcdir)/src/test/bt_test.py
endif
+ $(top_srcdir)/src/test/zero_length_keys.sh
EXTRA_DIST += \
src/test/bt_test.py \
src/test/ntor_ref.py \
src/test/slownacl_curve25519.py \
- src/test/test_cmdline_args.py
+ src/test/test_cmdline_args.py \
+ src/test/zero_length_keys.sh
diff --git a/src/test/ntor_ref.py b/src/test/ntor_ref.py
index 7d6e43e716..e37637d92a 100755
--- a/src/test/ntor_ref.py
+++ b/src/test/ntor_ref.py
@@ -1,5 +1,5 @@
#!/usr/bin/python
-# Copyright 2012-2013, The Tor Project, Inc
+# Copyright 2012-2015, The Tor Project, Inc
# See LICENSE for licensing information
"""
diff --git a/src/test/test-child.c b/src/test/test-child.c
index 91ae5a66a5..2ce01ea9bb 100644
--- a/src/test/test-child.c
+++ b/src/test/test-child.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2011-2014, The Tor Project, Inc. */
+/* Copyright (c) 2011-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include <stdio.h>
diff --git a/src/test/test-network.sh b/src/test/test-network.sh
index d28fbde80f..be57cafb7f 100755
--- a/src/test/test-network.sh
+++ b/src/test/test-network.sh
@@ -45,7 +45,7 @@ PATH="$TOR_DIR/src/or:$TOR_DIR/src/tools:$PATH"
# Sleep some, waiting for the network to bootstrap.
# TODO: Add chutney command 'bootstrap-status' and use that instead.
-BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-18}
+BOOTSTRAP_TIME=${BOOTSTRAP_TIME:-25}
$ECHO_N "$myname: sleeping for $BOOTSTRAP_TIME seconds"
n=$BOOTSTRAP_TIME; while [ $n -gt 0 ]; do
sleep 1; n=$(expr $n - 1); $ECHO_N .
diff --git a/src/test/test.c b/src/test/test.c
index 8b74c0a87a..ff4f517ac5 100644
--- a/src/test/test.c
+++ b/src/test/test.c
@@ -1,12 +1,8 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
-/* Ordinarily defined in tor_main.c; this bit is just here to provide one
- * since we're not linking to tor_main.c */
-const char tor_git_revision[] = "";
-
/**
* \file test.c
* \brief Unit tests for many pieces of the lower level Tor modules.
@@ -67,171 +63,6 @@ double fabs(double x);
#include "crypto_curve25519.h"
#include "onion_ntor.h"
-#ifdef USE_DMALLOC
-#include <dmalloc.h>
-#include <openssl/crypto.h>
-#include "main.h"
-#endif
-
-/** Set to true if any unit test has failed. Mostly, this is set by the macros
- * in test.h */
-int have_failed = 0;
-
-/** Temporary directory (set up by setup_directory) under which we store all
- * our files during testing. */
-static char temp_dir[256];
-#ifdef _WIN32
-#define pid_t int
-#endif
-static pid_t temp_dir_setup_in_pid = 0;
-
-/** Select and create the temporary directory we'll use to run our unit tests.
- * Store it in <b>temp_dir</b>. Exit immediately if we can't create it.
- * idempotent. */
-static void
-setup_directory(void)
-{
- static int is_setup = 0;
- int r;
- char rnd[256], rnd32[256];
- if (is_setup) return;
-
-/* Due to base32 limitation needs to be a multiple of 5. */
-#define RAND_PATH_BYTES 5
- crypto_rand(rnd, RAND_PATH_BYTES);
- base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES);
-
-#ifdef _WIN32
- {
- char buf[MAX_PATH];
- const char *tmp = buf;
- const char *extra_backslash = "";
- /* If this fails, we're probably screwed anyway */
- if (!GetTempPathA(sizeof(buf),buf))
- tmp = "c:\\windows\\temp\\";
- if (strcmpend(tmp, "\\")) {
- /* According to MSDN, it should be impossible for GetTempPath to give us
- * an answer that doesn't end with \. But let's make sure. */
- extra_backslash = "\\";
- }
- tor_snprintf(temp_dir, sizeof(temp_dir),
- "%s%stor_test_%d_%s", tmp, extra_backslash,
- (int)getpid(), rnd32);
- r = mkdir(temp_dir);
- }
-#else
- tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s",
- (int) getpid(), rnd32);
- r = mkdir(temp_dir, 0700);
- if (!r) {
- /* undo sticky bit so tests don't get confused. */
- r = chown(temp_dir, getuid(), getgid());
- }
-#endif
- if (r) {
- fprintf(stderr, "Can't create directory %s:", temp_dir);
- perror("");
- exit(1);
- }
- is_setup = 1;
- temp_dir_setup_in_pid = getpid();
-}
-
-/** Return a filename relative to our testing temporary directory */
-const char *
-get_fname(const char *name)
-{
- static char buf[1024];
- setup_directory();
- if (!name)
- return temp_dir;
- tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name);
- return buf;
-}
-
-/* Remove a directory and all of its subdirectories */
-static void
-rm_rf(const char *dir)
-{
- struct stat st;
- smartlist_t *elements;
-
- elements = tor_listdir(dir);
- if (elements) {
- SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) {
- char *tmp = NULL;
- tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp);
- if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) {
- rm_rf(tmp);
- } else {
- if (unlink(tmp)) {
- fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno));
- }
- }
- tor_free(tmp);
- } SMARTLIST_FOREACH_END(cp);
- SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp));
- smartlist_free(elements);
- }
- if (rmdir(dir))
- fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno));
-}
-
-/** Remove all files stored under the temporary directory, and the directory
- * itself. Called by atexit(). */
-static void
-remove_directory(void)
-{
- if (getpid() != temp_dir_setup_in_pid) {
- /* Only clean out the tempdir when the main process is exiting. */
- return;
- }
-
- rm_rf(temp_dir);
-}
-
-/** Define this if unit tests spend too much time generating public keys*/
-#undef CACHE_GENERATED_KEYS
-
-static crypto_pk_t *pregen_keys[5] = {NULL, NULL, NULL, NULL, NULL};
-#define N_PREGEN_KEYS ARRAY_LENGTH(pregen_keys)
-
-/** Generate and return a new keypair for use in unit tests. If we're using
- * the key cache optimization, we might reuse keys: we only guarantee that
- * keys made with distinct values for <b>idx</b> are different. The value of
- * <b>idx</b> must be at least 0, and less than N_PREGEN_KEYS. */
-crypto_pk_t *
-pk_generate(int idx)
-{
-#ifdef CACHE_GENERATED_KEYS
- tor_assert(idx < N_PREGEN_KEYS);
- if (! pregen_keys[idx]) {
- pregen_keys[idx] = crypto_pk_new();
- tor_assert(!crypto_pk_generate_key(pregen_keys[idx]));
- }
- return crypto_pk_dup_key(pregen_keys[idx]);
-#else
- crypto_pk_t *result;
- (void) idx;
- result = crypto_pk_new();
- tor_assert(!crypto_pk_generate_key(result));
- return result;
-#endif
-}
-
-/** Free all storage used for the cached key optimization. */
-static void
-free_pregenerated_keys(void)
-{
- unsigned idx;
- for (idx = 0; idx < N_PREGEN_KEYS; ++idx) {
- if (pregen_keys[idx]) {
- crypto_pk_free(pregen_keys[idx]);
- pregen_keys[idx] = NULL;
- }
- }
-}
-
/** Run unit tests for the onion handshake code. */
static void
test_onion_handshake(void *arg)
@@ -277,9 +108,9 @@ test_onion_handshake(void *arg)
memset(c_keys, 0, 40);
tt_assert(! onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
- tt_mem_op(c_keys,==, s_keys, 40);
+ tt_mem_op(c_keys,OP_EQ, s_keys, 40);
memset(s_buf, 0, 40);
- tt_mem_op(c_keys,!=, s_buf, 40);
+ tt_mem_op(c_keys,OP_NE, s_buf, 40);
}
done:
crypto_dh_free(c_dh);
@@ -311,7 +142,7 @@ test_bad_onion_handshake(void *arg)
memset(junk_buf, 0, sizeof(junk_buf));
crypto_pk_public_hybrid_encrypt(pk, junk_buf2, TAP_ONIONSKIN_CHALLENGE_LEN,
junk_buf, DH_KEY_LEN, PK_PKCS1_OAEP_PADDING, 1);
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_server_handshake(junk_buf2, pk, NULL,
s_buf, s_keys, 40));
@@ -320,7 +151,7 @@ test_bad_onion_handshake(void *arg)
memset(junk_buf2, 0, sizeof(junk_buf2));
crypto_pk_public_encrypt(pk, junk_buf2, sizeof(junk_buf2),
junk_buf, 48, PK_PKCS1_OAEP_PADDING);
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_server_handshake(junk_buf2, pk, NULL,
s_buf, s_keys, 40));
@@ -329,36 +160,36 @@ test_bad_onion_handshake(void *arg)
tt_assert(! onion_skin_TAP_create(pk, &c_dh, c_buf));
/* Server: Case 3: we just don't have the right key. */
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_server_handshake(c_buf, pk2, NULL,
s_buf, s_keys, 40));
/* Server: Case 4: The RSA-encrypted portion is corrupt. */
c_buf[64] ^= 33;
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_server_handshake(c_buf, pk, NULL,
s_buf, s_keys, 40));
c_buf[64] ^= 33;
/* (Let the server procede) */
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
onion_skin_TAP_server_handshake(c_buf, pk, NULL,
s_buf, s_keys, 40));
/* Client: Case 1: The server sent back junk. */
s_buf[64] ^= 33;
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
s_buf[64] ^= 33;
/* Let the client finish; make sure it can. */
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
- tt_mem_op(s_keys,==, c_keys, 40);
+ tt_mem_op(s_keys,OP_EQ, c_keys, 40);
/* Client: Case 2: The server sent back a degenerate DH. */
memset(s_buf, 0, sizeof(s_buf));
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
onion_skin_TAP_client_handshake(c_dh, s_buf, c_keys, 40));
done:
@@ -395,24 +226,24 @@ test_ntor_handshake(void *arg)
/* client handshake 1. */
memset(c_buf, 0, NTOR_ONIONSKIN_LEN);
- tt_int_op(0, ==, onion_skin_ntor_create(node_id, server_pubkey,
+ tt_int_op(0, OP_EQ, onion_skin_ntor_create(node_id, server_pubkey,
&c_state, c_buf));
/* server handshake */
memset(s_buf, 0, NTOR_REPLY_LEN);
memset(s_keys, 0, 40);
- tt_int_op(0, ==, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL,
+ tt_int_op(0, OP_EQ, onion_skin_ntor_server_handshake(c_buf, s_keymap, NULL,
node_id,
s_buf, s_keys, 400));
/* client handshake 2 */
memset(c_keys, 0, 40);
- tt_int_op(0, ==, onion_skin_ntor_client_handshake(c_state, s_buf,
+ tt_int_op(0, OP_EQ, onion_skin_ntor_client_handshake(c_state, s_buf,
c_keys, 400));
- tt_mem_op(c_keys,==, s_keys, 400);
+ tt_mem_op(c_keys,OP_EQ, s_keys, 400);
memset(s_buf, 0, 40);
- tt_mem_op(c_keys,!=, s_buf, 40);
+ tt_mem_op(c_keys,OP_NE, s_buf, 40);
done:
ntor_handshake_state_free(c_state);
@@ -440,24 +271,24 @@ test_onion_queues(void *arg)
create_cell_init(create2, CELL_CREATE, ONION_HANDSHAKE_TYPE_NTOR,
NTOR_ONIONSKIN_LEN, buf2);
- tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
- tt_int_op(0,==, onion_pending_add(circ1, create1));
+ tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ tt_int_op(0,OP_EQ, onion_pending_add(circ1, create1));
create1 = NULL;
- tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
- tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
- tt_int_op(0,==, onion_pending_add(circ2, create2));
+ tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ tt_int_op(0,OP_EQ, onion_pending_add(circ2, create2));
create2 = NULL;
- tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
- tt_ptr_op(circ2,==, onion_next_task(&onionskin));
- tt_int_op(1,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
- tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
- tt_ptr_op(onionskin, ==, create2_ptr);
+ tt_ptr_op(circ2,OP_EQ, onion_next_task(&onionskin));
+ tt_int_op(1,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ tt_ptr_op(onionskin, OP_EQ, create2_ptr);
clear_pending_onions();
- tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
- tt_int_op(0,==, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
+ tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_TAP));
+ tt_int_op(0,OP_EQ, onion_num_pending(ONION_HANDSHAKE_TYPE_NTOR));
done:
circuit_free(TO_CIRCUIT(circ1));
@@ -648,13 +479,13 @@ test_rend_fns(void *arg)
(void)arg;
tt_assert(BAD_HOSTNAME == parse_extended_hostname(address1));
tt_assert(ONION_HOSTNAME == parse_extended_hostname(address2));
- tt_str_op(address2,==, "aaaaaaaaaaaaaaaa");
+ tt_str_op(address2,OP_EQ, "aaaaaaaaaaaaaaaa");
tt_assert(EXIT_HOSTNAME == parse_extended_hostname(address3));
tt_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4));
tt_assert(ONION_HOSTNAME == parse_extended_hostname(address5));
- tt_str_op(address5,==, "abcdefghijklmnop");
+ tt_str_op(address5,OP_EQ, "abcdefghijklmnop");
tt_assert(ONION_HOSTNAME == parse_extended_hostname(address6));
- tt_str_op(address6,==, "abcdefghijklmnop");
+ tt_str_op(address6,OP_EQ, "abcdefghijklmnop");
tt_assert(BAD_HOSTNAME == parse_extended_hostname(address7));
pk1 = pk_generate(0);
@@ -693,36 +524,36 @@ test_rend_fns(void *arg)
tt_assert(rend_compute_v2_desc_id(computed_desc_id, service_id_base32,
NULL, now, 0) == 0);
tt_mem_op(((rend_encoded_v2_service_descriptor_t *)
- smartlist_get(descs, 0))->desc_id, ==,
+ smartlist_get(descs, 0))->desc_id, OP_EQ,
computed_desc_id, DIGEST_LEN);
tt_assert(rend_parse_v2_service_descriptor(&parsed, parsed_desc_id,
- &intro_points_encrypted,
- &intro_points_size,
- &encoded_size,
- &next_desc,
- ((rend_encoded_v2_service_descriptor_t *)
- smartlist_get(descs, 0))->desc_str) == 0);
+ &intro_points_encrypted,
+ &intro_points_size,
+ &encoded_size,
+ &next_desc,
+ ((rend_encoded_v2_service_descriptor_t *)
+ smartlist_get(descs, 0))->desc_str, 1) == 0);
tt_assert(parsed);
tt_mem_op(((rend_encoded_v2_service_descriptor_t *)
- smartlist_get(descs, 0))->desc_id,==, parsed_desc_id, DIGEST_LEN);
+ smartlist_get(descs, 0))->desc_id,OP_EQ, parsed_desc_id, DIGEST_LEN);
tt_int_op(rend_parse_introduction_points(parsed, intro_points_encrypted,
- intro_points_size),==, 3);
+ intro_points_size),OP_EQ, 3);
tt_assert(!crypto_pk_cmp_keys(generated->pk, parsed->pk));
- tt_int_op(parsed->timestamp,==, now);
- tt_int_op(parsed->version,==, 2);
- tt_int_op(parsed->protocols,==, 42);
- tt_int_op(smartlist_len(parsed->intro_nodes),==, 3);
+ tt_int_op(parsed->timestamp,OP_EQ, now);
+ tt_int_op(parsed->version,OP_EQ, 2);
+ tt_int_op(parsed->protocols,OP_EQ, 42);
+ tt_int_op(smartlist_len(parsed->intro_nodes),OP_EQ, 3);
for (i = 0; i < smartlist_len(parsed->intro_nodes); i++) {
rend_intro_point_t *par_intro = smartlist_get(parsed->intro_nodes, i),
*gen_intro = smartlist_get(generated->intro_nodes, i);
extend_info_t *par_info = par_intro->extend_info;
extend_info_t *gen_info = gen_intro->extend_info;
tt_assert(!crypto_pk_cmp_keys(gen_info->onion_key, par_info->onion_key));
- tt_mem_op(gen_info->identity_digest,==, par_info->identity_digest,
+ tt_mem_op(gen_info->identity_digest,OP_EQ, par_info->identity_digest,
DIGEST_LEN);
- tt_str_op(gen_info->nickname,==, par_info->nickname);
+ tt_str_op(gen_info->nickname,OP_EQ, par_info->nickname);
tt_assert(tor_addr_eq(&gen_info->addr, &par_info->addr));
- tt_int_op(gen_info->port,==, par_info->port);
+ tt_int_op(gen_info->port,OP_EQ, par_info->port);
}
rend_service_descriptor_free(parsed);
@@ -766,11 +597,11 @@ test_rend_fns(void *arg)
} while (0)
#define CHECK_COUNTRY(country, val) do { \
/* test ipv4 country lookup */ \
- tt_str_op(country, ==, \
+ tt_str_op(country, OP_EQ, \
geoip_get_country_name(geoip_get_country_by_ipv4(val))); \
/* test ipv6 country lookup */ \
SET_TEST_IPV6(val); \
- tt_str_op(country, ==, \
+ tt_str_op(country, OP_EQ, \
geoip_get_country_name(geoip_get_country_by_ipv6(&in6))); \
} while (0)
@@ -831,23 +662,23 @@ test_geoip(void *arg)
* 'sort' step. These aren't very good IP addresses, but they're perfectly
* fine uint32_t values. */
(void)arg;
- tt_int_op(0,==, geoip_parse_entry("10,50,AB", AF_INET));
- tt_int_op(0,==, geoip_parse_entry("52,90,XY", AF_INET));
- tt_int_op(0,==, geoip_parse_entry("95,100,AB", AF_INET));
- tt_int_op(0,==, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET));
- tt_int_op(0,==, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET));
- tt_int_op(0,==, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("10,50,AB", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("52,90,XY", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("95,100,AB", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("\"105\",\"140\",\"ZZ\"", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("\"150\",\"190\",\"XY\"", AF_INET));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("\"200\",\"250\",\"AB\"", AF_INET));
/* Populate the IPv6 DB equivalently with fake IPs in the same range */
- tt_int_op(0,==, geoip_parse_entry("::a,::32,AB", AF_INET6));
- tt_int_op(0,==, geoip_parse_entry("::34,::5a,XY", AF_INET6));
- tt_int_op(0,==, geoip_parse_entry("::5f,::64,AB", AF_INET6));
- tt_int_op(0,==, geoip_parse_entry("::69,::8c,ZZ", AF_INET6));
- tt_int_op(0,==, geoip_parse_entry("::96,::be,XY", AF_INET6));
- tt_int_op(0,==, geoip_parse_entry("::c8,::fa,AB", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::a,::32,AB", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::34,::5a,XY", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::5f,::64,AB", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::69,::8c,ZZ", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::96,::be,XY", AF_INET6));
+ tt_int_op(0,OP_EQ, geoip_parse_entry("::c8,::fa,AB", AF_INET6));
/* We should have 4 countries: ??, ab, xy, zz. */
- tt_int_op(4,==, geoip_get_n_countries());
+ tt_int_op(4,OP_EQ, geoip_get_n_countries());
memset(&in6, 0, sizeof(in6));
CHECK_COUNTRY("??", 3);
@@ -858,9 +689,9 @@ test_geoip(void *arg)
CHECK_COUNTRY("xy", 190);
CHECK_COUNTRY("??", 2000);
- tt_int_op(0,==, geoip_get_country_by_ipv4(3));
+ tt_int_op(0,OP_EQ, geoip_get_country_by_ipv4(3));
SET_TEST_IPV6(3);
- tt_int_op(0,==, geoip_get_country_by_ipv6(&in6));
+ tt_int_op(0,OP_EQ, geoip_get_country_by_ipv6(&in6));
get_options_mutable()->BridgeRelay = 1;
get_options_mutable()->BridgeRecordUsageByCountry = 1;
@@ -885,8 +716,8 @@ test_geoip(void *arg)
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v);
tt_assert(s);
tt_assert(v);
- tt_str_op("zz=24,ab=16,xy=8",==, s);
- tt_str_op("v4=16,v6=16",==, v);
+ tt_str_op("zz=24,ab=16,xy=8",OP_EQ, s);
+ tt_str_op("v4=16,v6=16",OP_EQ, v);
tor_free(s);
tor_free(v);
@@ -895,8 +726,8 @@ test_geoip(void *arg)
geoip_get_client_history(GEOIP_CLIENT_CONNECT, &s, &v);
tt_assert(s);
tt_assert(v);
- tt_str_op("zz=24,xy=8",==, s);
- tt_str_op("v4=16,v6=16",==, v);
+ tt_str_op("zz=24,xy=8",OP_EQ, s);
+ tt_str_op("v4=16,v6=16",OP_EQ, v);
tor_free(s);
tor_free(v);
@@ -910,7 +741,7 @@ test_geoip(void *arg)
geoip_bridge_stats_init(now);
s = geoip_format_bridge_stats(now + 86400);
tt_assert(s);
- tt_str_op(bridge_stats_1,==, s);
+ tt_str_op(bridge_stats_1,OP_EQ, s);
tor_free(s);
/* Stop collecting bridge stats and make sure we don't write a history
@@ -939,7 +770,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(100);
geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
s = geoip_format_dirreq_stats(now + 86400);
- tt_str_op(dirreq_stats_1,==, s);
+ tt_str_op(dirreq_stats_1,OP_EQ, s);
tor_free(s);
/* Stop collecting stats, add another connecting client, and ensure we
@@ -957,20 +788,20 @@ test_geoip(void *arg)
geoip_note_client_seen(GEOIP_CLIENT_NETWORKSTATUS, &addr, NULL, now);
geoip_reset_dirreq_stats(now);
s = geoip_format_dirreq_stats(now + 86400);
- tt_str_op(dirreq_stats_2,==, s);
+ tt_str_op(dirreq_stats_2,OP_EQ, s);
tor_free(s);
/* Note a successful network status response and make sure that it
* appears in the history string. */
geoip_note_ns_response(GEOIP_SUCCESS);
s = geoip_format_dirreq_stats(now + 86400);
- tt_str_op(dirreq_stats_3,==, s);
+ tt_str_op(dirreq_stats_3,OP_EQ, s);
tor_free(s);
/* Start a tunneled directory request. */
geoip_start_dirreq((uint64_t) 1, 1024, DIRREQ_TUNNELED);
s = geoip_format_dirreq_stats(now + 86400);
- tt_str_op(dirreq_stats_4,==, s);
+ tt_str_op(dirreq_stats_4,OP_EQ, s);
tor_free(s);
/* Stop collecting directory request statistics and start gathering
@@ -992,7 +823,7 @@ test_geoip(void *arg)
SET_TEST_ADDRESS(100);
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
s = geoip_format_entry_stats(now + 86400);
- tt_str_op(entry_stats_1,==, s);
+ tt_str_op(entry_stats_1,OP_EQ, s);
tor_free(s);
/* Stop collecting stats, add another connecting client, and ensure we
@@ -1010,7 +841,7 @@ test_geoip(void *arg)
geoip_note_client_seen(GEOIP_CLIENT_CONNECT, &addr, NULL, now);
geoip_reset_entry_stats(now);
s = geoip_format_entry_stats(now + 86400);
- tt_str_op(entry_stats_2,==, s);
+ tt_str_op(entry_stats_2,OP_EQ, s);
tor_free(s);
/* Stop collecting entry statistics. */
@@ -1083,7 +914,7 @@ test_geoip_with_pt(void *arg)
/* Test the transport history string. */
s = geoip_get_transport_history();
tor_assert(s);
- tt_str_op(s,==, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,"
+ tt_str_op(s,OP_EQ, "<OR>=8,alpha=16,beta=8,charlie=16,ddr=136,"
"entropy=8,fire=8,google=8");
/* Stop collecting entry statistics. */
@@ -1126,7 +957,7 @@ test_stats(void *arg)
tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"exit-kibibytes-written 80=1,443=1,other=0\n"
"exit-kibibytes-read 80=10,443=20,other=0\n"
- "exit-streams-opened 80=4,443=4,other=0\n",==, s);
+ "exit-streams-opened 80=4,443=4,other=0\n",OP_EQ, s);
tor_free(s);
/* Add a few bytes on 10 more ports and ensure that only the top 10
@@ -1142,7 +973,7 @@ test_stats(void *arg)
"exit-kibibytes-read 52=1,53=1,54=1,55=1,56=1,57=1,58=1,"
"59=1,80=10,443=20,other=1\n"
"exit-streams-opened 52=4,53=4,54=4,55=4,56=4,57=4,58=4,"
- "59=4,80=4,443=4,other=4\n",==, s);
+ "59=4,80=4,443=4,other=4\n",OP_EQ, s);
tor_free(s);
/* Stop collecting stats, add some bytes, and ensure we don't generate
@@ -1162,7 +993,7 @@ test_stats(void *arg)
tt_str_op("exit-stats-end 2010-08-12 13:27:30 (86400 s)\n"
"exit-kibibytes-written other=0\n"
"exit-kibibytes-read other=0\n"
- "exit-streams-opened other=0\n",==, s);
+ "exit-streams-opened other=0\n",OP_EQ, s);
tor_free(s);
/* Continue with testing connection statistics; we shouldn't collect
@@ -1178,7 +1009,7 @@ test_stats(void *arg)
rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 10);
rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15);
s = rep_hist_format_conn_stats(now + 86400);
- tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",==, s);
+ tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,1,0\n",OP_EQ, s);
tor_free(s);
/* Stop collecting stats, add some bytes, and ensure we don't generate
@@ -1197,7 +1028,7 @@ test_stats(void *arg)
rep_hist_note_or_conn_bytes(2, 400000, 30000, now + 15);
rep_hist_reset_conn_stats(now);
s = rep_hist_format_conn_stats(now + 86400);
- tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",==, s);
+ tt_str_op("conn-bi-direct 2010-08-12 13:27:30 (86400 s) 0,0,0,0\n",OP_EQ, s);
tor_free(s);
/* Continue with testing buffer statistics; we shouldn't collect buffer
@@ -1216,7 +1047,7 @@ test_stats(void *arg)
"cell-queued-cells 2.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,"
"0.00,0.00\n"
"cell-time-in-queue 2,0,0,0,0,0,0,0,0,0\n"
- "cell-circuits-per-decile 1\n",==, s);
+ "cell-circuits-per-decile 1\n",OP_EQ, s);
tor_free(s);
/* Add nineteen more circuit statistics to the one that's already in the
@@ -1231,7 +1062,7 @@ test_stats(void *arg)
"cell-queued-cells 2.75,2.75,2.75,2.75,2.75,2.75,2.75,2.75,"
"2.75,2.75\n"
"cell-time-in-queue 3,3,3,3,3,3,3,3,3,3\n"
- "cell-circuits-per-decile 2\n",==, s);
+ "cell-circuits-per-decile 2\n",OP_EQ, s);
tor_free(s);
/* Stop collecting stats, add statistics for one circuit, and ensure we
@@ -1252,7 +1083,7 @@ test_stats(void *arg)
"cell-queued-cells 0.00,0.00,0.00,0.00,0.00,0.00,0.00,0.00,"
"0.00,0.00\n"
"cell-time-in-queue 0,0,0,0,0,0,0,0,0,0\n"
- "cell-circuits-per-decile 0\n",==, s);
+ "cell-circuits-per-decile 0\n",OP_EQ, s);
done:
tor_free(s);
@@ -1277,154 +1108,88 @@ static struct testcase_t test_array[] = {
END_OF_TESTCASES
};
+extern struct testcase_t accounting_tests[];
extern struct testcase_t addr_tests[];
+extern struct testcase_t address_tests[];
extern struct testcase_t buffer_tests[];
-extern struct testcase_t crypto_tests[];
-extern struct testcase_t container_tests[];
-extern struct testcase_t util_tests[];
-extern struct testcase_t dir_tests[];
-extern struct testcase_t checkdir_tests[];
-extern struct testcase_t microdesc_tests[];
-extern struct testcase_t pt_tests[];
-extern struct testcase_t config_tests[];
-extern struct testcase_t introduce_tests[];
-extern struct testcase_t replaycache_tests[];
-extern struct testcase_t relaycell_tests[];
extern struct testcase_t cell_format_tests[];
+extern struct testcase_t cell_queue_tests[];
+extern struct testcase_t channel_tests[];
+extern struct testcase_t channeltls_tests[];
+extern struct testcase_t checkdir_tests[];
extern struct testcase_t circuitlist_tests[];
extern struct testcase_t circuitmux_tests[];
-extern struct testcase_t cell_queue_tests[];
-extern struct testcase_t options_tests[];
-extern struct testcase_t socks_tests[];
+extern struct testcase_t config_tests[];
+extern struct testcase_t container_tests[];
+extern struct testcase_t controller_event_tests[];
+extern struct testcase_t crypto_tests[];
+extern struct testcase_t dir_tests[];
+extern struct testcase_t entryconn_tests[];
extern struct testcase_t entrynodes_tests[];
extern struct testcase_t extorport_tests[];
-extern struct testcase_t controller_event_tests[];
-extern struct testcase_t logging_tests[];
extern struct testcase_t hs_tests[];
+extern struct testcase_t introduce_tests[];
+extern struct testcase_t logging_tests[];
+extern struct testcase_t microdesc_tests[];
extern struct testcase_t nodelist_tests[];
-extern struct testcase_t routerkeys_tests[];
extern struct testcase_t oom_tests[];
-extern struct testcase_t accounting_tests[];
+extern struct testcase_t options_tests[];
extern struct testcase_t policy_tests[];
-extern struct testcase_t status_tests[];
+extern struct testcase_t pt_tests[];
+extern struct testcase_t relay_tests[];
+extern struct testcase_t relaycell_tests[];
+extern struct testcase_t replaycache_tests[];
+extern struct testcase_t router_tests[];
+extern struct testcase_t routerkeys_tests[];
+extern struct testcase_t routerlist_tests[];
extern struct testcase_t routerset_tests[];
+extern struct testcase_t scheduler_tests[];
+extern struct testcase_t socks_tests[];
+extern struct testcase_t status_tests[];
+extern struct testcase_t thread_tests[];
+extern struct testcase_t util_tests[];
-static struct testgroup_t testgroups[] = {
+struct testgroup_t testgroups[] = {
{ "", test_array },
- { "buffer/", buffer_tests },
- { "socks/", socks_tests },
+ { "accounting/", accounting_tests },
{ "addr/", addr_tests },
- { "crypto/", crypto_tests },
- { "container/", container_tests },
- { "util/", util_tests },
- { "util/logging/", logging_tests },
+ { "address/", address_tests },
+ { "buffer/", buffer_tests },
{ "cellfmt/", cell_format_tests },
{ "cellqueue/", cell_queue_tests },
- { "dir/", dir_tests },
+ { "channel/", channel_tests },
+ { "channeltls/", channeltls_tests },
{ "checkdir/", checkdir_tests },
- { "dir/md/", microdesc_tests },
- { "pt/", pt_tests },
- { "config/", config_tests },
- { "replaycache/", replaycache_tests },
- { "relaycell/", relaycell_tests },
- { "introduce/", introduce_tests },
{ "circuitlist/", circuitlist_tests },
{ "circuitmux/", circuitmux_tests },
- { "options/", options_tests },
+ { "config/", config_tests },
+ { "container/", container_tests },
+ { "control/", controller_event_tests },
+ { "crypto/", crypto_tests },
+ { "dir/", dir_tests },
+ { "dir/md/", microdesc_tests },
+ { "entryconn/", entryconn_tests },
{ "entrynodes/", entrynodes_tests },
{ "extorport/", extorport_tests },
- { "control/", controller_event_tests },
{ "hs/", hs_tests },
+ { "introduce/", introduce_tests },
{ "nodelist/", nodelist_tests },
- { "routerkeys/", routerkeys_tests },
{ "oom/", oom_tests },
- { "accounting/", accounting_tests },
+ { "options/", options_tests },
{ "policy/" , policy_tests },
- { "status/" , status_tests },
+ { "pt/", pt_tests },
+ { "relay/" , relay_tests },
+ { "relaycell/", relaycell_tests },
+ { "replaycache/", replaycache_tests },
+ { "routerkeys/", routerkeys_tests },
+ { "routerlist/", routerlist_tests },
{ "routerset/" , routerset_tests },
+ { "scheduler/", scheduler_tests },
+ { "socks/", socks_tests },
+ { "status/" , status_tests },
+ { "util/", util_tests },
+ { "util/logging/", logging_tests },
+ { "util/thread/", thread_tests },
END_OF_GROUPS
};
-/** Main entry point for unit test code: parse the command line, and run
- * some unit tests. */
-int
-main(int c, const char **v)
-{
- or_options_t *options;
- char *errmsg = NULL;
- int i, i_out;
- int loglevel = LOG_ERR;
- int accel_crypto = 0;
-
-#ifdef USE_DMALLOC
- {
- int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_);
- tor_assert(r);
- }
-#endif
-
- update_approx_time(time(NULL));
- options = options_new();
- tor_threads_init();
- init_logging(1);
- configure_backtrace_handler(get_version());
-
- for (i_out = i = 1; i < c; ++i) {
- if (!strcmp(v[i], "--warn")) {
- loglevel = LOG_WARN;
- } else if (!strcmp(v[i], "--notice")) {
- loglevel = LOG_NOTICE;
- } else if (!strcmp(v[i], "--info")) {
- loglevel = LOG_INFO;
- } else if (!strcmp(v[i], "--debug")) {
- loglevel = LOG_DEBUG;
- } else if (!strcmp(v[i], "--accel")) {
- accel_crypto = 1;
- } else {
- v[i_out++] = v[i];
- }
- }
- c = i_out;
-
- {
- log_severity_list_t s;
- memset(&s, 0, sizeof(s));
- set_log_severity_config(loglevel, LOG_ERR, &s);
- add_stream_log(&s, "", fileno(stdout));
- }
-
- options->command = CMD_RUN_UNITTESTS;
- if (crypto_global_init(accel_crypto, NULL, NULL)) {
- printf("Can't initialize crypto subsystem; exiting.\n");
- return 1;
- }
- crypto_set_tls_dh_prime(NULL);
- crypto_seed_rng(1);
- rep_hist_init();
- network_init();
- setup_directory();
- options_init(options);
- options->DataDirectory = tor_strdup(temp_dir);
- options->EntryStatistics = 1;
- if (set_options(options, &errmsg) < 0) {
- printf("Failed to set initial options: %s\n", errmsg);
- tor_free(errmsg);
- return 1;
- }
-
- atexit(remove_directory);
-
- have_failed = (tinytest_main(c, v, testgroups) != 0);
-
- free_pregenerated_keys();
-#ifdef USE_DMALLOC
- tor_free_all(0);
- dmalloc_log_unfreed();
-#endif
-
- if (have_failed)
- return 1;
- else
- return 0;
-}
-
diff --git a/src/test/test.h b/src/test/test.h
index db07e4b706..b8057c59bf 100644
--- a/src/test/test.h
+++ b/src/test/test.h
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2003, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#ifndef TOR_TEST_H
@@ -34,7 +34,7 @@
tt_mem_op(expr1, op, mem_op_hex_tmp, length/2); \
STMT_END
-#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, ==, hex)
+#define test_memeq_hex(expr1, hex) test_mem_op_hex(expr1, OP_EQ, hex)
#define tt_double_op(a,op,b) \
tt_assert_test_type(a,b,#a" "#op" "#b,double,(val1_ op val2_),"%f", \
@@ -158,5 +158,7 @@ crypto_pk_t *pk_generate(int idx);
#define NS_MOCK(name) MOCK(name, NS(name))
#define NS_UNMOCK(name) UNMOCK(name)
+extern const struct testcase_setup_t passthrough_setup;
+
#endif
diff --git a/src/test/test_addr.c b/src/test/test_addr.c
index e9fe3038b8..2c25c1ef7d 100644
--- a/src/test/test_addr.c
+++ b/src/test/test_addr.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define ADDRESSMAP_PRIVATE
@@ -20,40 +20,40 @@ test_addr_basic(void *arg)
(void)arg;
cp = NULL; u32 = 3; u16 = 3;
tt_assert(!addr_port_lookup(LOG_WARN, "1.2.3.4", &cp, &u32, &u16));
- tt_str_op(cp,==, "1.2.3.4");
- tt_int_op(u32,==, 0x01020304u);
- tt_int_op(u16,==, 0);
+ tt_str_op(cp,OP_EQ, "1.2.3.4");
+ tt_int_op(u32,OP_EQ, 0x01020304u);
+ tt_int_op(u16,OP_EQ, 0);
tor_free(cp);
tt_assert(!addr_port_lookup(LOG_WARN, "4.3.2.1:99", &cp, &u32, &u16));
- tt_str_op(cp,==, "4.3.2.1");
- tt_int_op(u32,==, 0x04030201u);
- tt_int_op(u16,==, 99);
+ tt_str_op(cp,OP_EQ, "4.3.2.1");
+ tt_int_op(u32,OP_EQ, 0x04030201u);
+ tt_int_op(u16,OP_EQ, 99);
tor_free(cp);
tt_assert(!addr_port_lookup(LOG_WARN, "nonexistent.address:4040",
&cp, NULL, &u16));
- tt_str_op(cp,==, "nonexistent.address");
- tt_int_op(u16,==, 4040);
+ tt_str_op(cp,OP_EQ, "nonexistent.address");
+ tt_int_op(u16,OP_EQ, 4040);
tor_free(cp);
tt_assert(!addr_port_lookup(LOG_WARN, "localhost:9999", &cp, &u32, &u16));
- tt_str_op(cp,==, "localhost");
- tt_int_op(u32,==, 0x7f000001u);
- tt_int_op(u16,==, 9999);
+ tt_str_op(cp,OP_EQ, "localhost");
+ tt_int_op(u32,OP_EQ, 0x7f000001u);
+ tt_int_op(u16,OP_EQ, 9999);
tor_free(cp);
u32 = 3;
tt_assert(!addr_port_lookup(LOG_WARN, "localhost", NULL, &u32, &u16));
- tt_ptr_op(cp,==, NULL);
- tt_int_op(u32,==, 0x7f000001u);
- tt_int_op(u16,==, 0);
+ tt_ptr_op(cp,OP_EQ, NULL);
+ tt_int_op(u32,OP_EQ, 0x7f000001u);
+ tt_int_op(u16,OP_EQ, 0);
tor_free(cp);
tt_assert(addr_port_lookup(LOG_WARN, "localhost:3", &cp, &u32, NULL));
tor_free(cp);
- tt_int_op(0,==, addr_mask_get_bits(0x0u));
- tt_int_op(32,==, addr_mask_get_bits(0xFFFFFFFFu));
- tt_int_op(16,==, addr_mask_get_bits(0xFFFF0000u));
- tt_int_op(31,==, addr_mask_get_bits(0xFFFFFFFEu));
- tt_int_op(1,==, addr_mask_get_bits(0x80000000u));
+ tt_int_op(0,OP_EQ, addr_mask_get_bits(0x0u));
+ tt_int_op(32,OP_EQ, addr_mask_get_bits(0xFFFFFFFFu));
+ tt_int_op(16,OP_EQ, addr_mask_get_bits(0xFFFF0000u));
+ tt_int_op(31,OP_EQ, addr_mask_get_bits(0xFFFFFFFEu));
+ tt_int_op(1,OP_EQ, addr_mask_get_bits(0x80000000u));
/* Test inet_ntop */
{
@@ -62,15 +62,16 @@ test_addr_basic(void *arg)
struct in_addr in;
/* good round trip */
- tt_int_op(tor_inet_pton(AF_INET, ip, &in),==, 1);
- tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)),==, &tmpbuf);
- tt_str_op(tmpbuf,==, ip);
+ tt_int_op(tor_inet_pton(AF_INET, ip, &in), OP_EQ, 1);
+ tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, sizeof(tmpbuf)),
+ OP_EQ, &tmpbuf);
+ tt_str_op(tmpbuf,OP_EQ, ip);
/* just enough buffer length */
- tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1),==, ip);
+ tt_str_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip) + 1), OP_EQ, ip);
/* too short buffer */
- tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),==, NULL);
+ tt_ptr_op(tor_inet_ntop(AF_INET, &in, tmpbuf, strlen(ip)),OP_EQ, NULL);
}
done:
@@ -98,30 +99,30 @@ test_addr_basic(void *arg)
/** Helper: Assert that two strings both decode as IPv6 addresses with
* tor_inet_pton(), and both decode to the same address. */
#define test_pton6_same(a,b) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &a1), ==, 1); \
- tt_int_op(tor_inet_pton(AF_INET6, b, &a2), ==, 1); \
- test_op_ip6_(&a1,==,&a2,#a,#b); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \
+ test_op_ip6_(&a1,OP_EQ,&a2,#a,#b); \
STMT_END
/** Helper: Assert that <b>a</b> is recognized as a bad IPv6 address by
* tor_inet_pton(). */
#define test_pton6_bad(a) \
- tt_int_op(0, ==, tor_inet_pton(AF_INET6, a, &a1))
+ tt_int_op(0, OP_EQ, tor_inet_pton(AF_INET6, a, &a1))
/** Helper: assert that <b>a</b>, when parsed by tor_inet_pton() and displayed
* with tor_inet_ntop(), yields <b>b</b>. Also assert that <b>b</b> parses to
* the same value as <b>a</b>. */
#define test_ntop6_reduces(a,b) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &a1), ==, 1); \
- tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), ==, b); \
- tt_int_op(tor_inet_pton(AF_INET6, b, &a2), ==, 1); \
- test_op_ip6_(&a1, ==, &a2, a, b); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &a1), OP_EQ, 1); \
+ tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)), OP_EQ, b); \
+ tt_int_op(tor_inet_pton(AF_INET6, b, &a2), OP_EQ, 1); \
+ test_op_ip6_(&a1, OP_EQ, &a2, a, b); \
STMT_END
/** Helper: assert that <b>a</b> parses by tor_inet_pton() into a address that
* passes tor_addr_is_internal() with <b>for_listening</b>. */
#define test_internal_ip(a,for_listening) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \
t1.family = AF_INET6; \
if (!tor_addr_is_internal(&t1, for_listening)) \
TT_DIE(("%s was not internal", a)); \
@@ -130,7 +131,7 @@ test_addr_basic(void *arg)
/** Helper: assert that <b>a</b> parses by tor_inet_pton() into a address that
* does not pass tor_addr_is_internal() with <b>for_listening</b>. */
#define test_external_ip(a,for_listening) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \
t1.family = AF_INET6; \
if (tor_addr_is_internal(&t1, for_listening)) \
TT_DIE(("%s was not internal", a)); \
@@ -140,8 +141,8 @@ test_addr_basic(void *arg)
* tor_inet_pton(), give addresses that compare in the order defined by
* <b>op</b> with tor_addr_compare(). */
#define test_addr_compare(a, op, b) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \
- tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), ==, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \
t1.family = t2.family = AF_INET6; \
r = tor_addr_compare(&t1,&t2,CMP_SEMANTIC); \
if (!(r op 0)) \
@@ -152,8 +153,8 @@ test_addr_basic(void *arg)
* tor_inet_pton(), give addresses that compare in the order defined by
* <b>op</b> with tor_addr_compare_masked() with <b>m</b> masked. */
#define test_addr_compare_masked(a, op, b, m) STMT_BEGIN \
- tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), ==, 1); \
- tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), ==, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, a, &t1.addr.in6_addr), OP_EQ, 1); \
+ tt_int_op(tor_inet_pton(AF_INET6, b, &t2.addr.in6_addr), OP_EQ, 1); \
t1.family = t2.family = AF_INET6; \
r = tor_addr_compare_masked(&t1,&t2,m,CMP_SEMANTIC); \
if (!(r op 0)) \
@@ -168,15 +169,15 @@ test_addr_basic(void *arg)
#define test_addr_mask_ports_parse(xx, f, ip1, ip2, ip3, ip4, mm, pt1, pt2) \
STMT_BEGIN \
tt_int_op(tor_addr_parse_mask_ports(xx, 0, &t1, &mask, &port1, &port2), \
- ==, f); \
+ OP_EQ, f); \
p1=tor_inet_ntop(AF_INET6, &t1.addr.in6_addr, bug, sizeof(bug)); \
- tt_int_op(htonl(ip1), ==, tor_addr_to_in6_addr32(&t1)[0]); \
- tt_int_op(htonl(ip2), ==, tor_addr_to_in6_addr32(&t1)[1]); \
- tt_int_op(htonl(ip3), ==, tor_addr_to_in6_addr32(&t1)[2]); \
- tt_int_op(htonl(ip4), ==, tor_addr_to_in6_addr32(&t1)[3]); \
- tt_int_op(mask, ==, mm); \
- tt_uint_op(port1, ==, pt1); \
- tt_uint_op(port2, ==, pt2); \
+ tt_int_op(htonl(ip1), OP_EQ, tor_addr_to_in6_addr32(&t1)[0]); \
+ tt_int_op(htonl(ip2), OP_EQ, tor_addr_to_in6_addr32(&t1)[1]); \
+ tt_int_op(htonl(ip3), OP_EQ, tor_addr_to_in6_addr32(&t1)[2]); \
+ tt_int_op(htonl(ip4), OP_EQ, tor_addr_to_in6_addr32(&t1)[3]); \
+ tt_int_op(mask, OP_EQ, mm); \
+ tt_uint_op(port1, OP_EQ, pt1); \
+ tt_uint_op(port2, OP_EQ, pt2); \
STMT_END
/** Run unit tests for IPv6 encoding/decoding/manipulation functions. */
@@ -202,23 +203,23 @@ test_addr_ip6_helpers(void *arg)
const char *ip_ffff = "::ffff:192.168.1.2";
/* good round trip */
- tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),==, 1);
- tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),==, &buf);
- tt_str_op(buf,==, ip);
+ tt_int_op(tor_inet_pton(AF_INET6, ip, &a1),OP_EQ, 1);
+ tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, sizeof(buf)),OP_EQ, &buf);
+ tt_str_op(buf,OP_EQ, ip);
/* good round trip - ::ffff:0:0 style */
- tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),==, 1);
- tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),==, &buf);
- tt_str_op(buf,==, ip_ffff);
+ tt_int_op(tor_inet_pton(AF_INET6, ip_ffff, &a2),OP_EQ, 1);
+ tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, sizeof(buf)),OP_EQ, &buf);
+ tt_str_op(buf,OP_EQ, ip_ffff);
/* just long enough buffer (remember \0) */
- tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),==, ip);
- tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),==,
+ tt_str_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)+1),OP_EQ, ip);
+ tt_str_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)+1),OP_EQ,
ip_ffff);
/* too short buffer (remember \0) */
- tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),==, NULL);
- tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),==, NULL);
+ tt_ptr_op(tor_inet_ntop(AF_INET6, &a1, buf, strlen(ip)),OP_EQ, NULL);
+ tt_ptr_op(tor_inet_ntop(AF_INET6, &a2, buf, strlen(ip_ffff)),OP_EQ, NULL);
}
/* ==== Converting to and from sockaddr_t. */
@@ -227,16 +228,16 @@ test_addr_ip6_helpers(void *arg)
sin->sin_port = htons(9090);
sin->sin_addr.s_addr = htonl(0x7f7f0102); /*127.127.1.2*/
tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, &port1);
- tt_int_op(tor_addr_family(&t1),==, AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==, 0x7f7f0102);
- tt_int_op(port1, ==, 9090);
+ tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f7f0102);
+ tt_int_op(port1, OP_EQ, 9090);
memset(&sa_storage, 0, sizeof(sa_storage));
- tt_int_op(sizeof(struct sockaddr_in),==,
+ tt_int_op(sizeof(struct sockaddr_in),OP_EQ,
tor_addr_to_sockaddr(&t1, 1234, (struct sockaddr *)&sa_storage,
sizeof(sa_storage)));
- tt_int_op(1234,==, ntohs(sin->sin_port));
- tt_int_op(0x7f7f0102,==, ntohl(sin->sin_addr.s_addr));
+ tt_int_op(1234,OP_EQ, ntohs(sin->sin_port));
+ tt_int_op(0x7f7f0102,OP_EQ, ntohl(sin->sin_addr.s_addr));
memset(&sa_storage, 0, sizeof(sa_storage));
sin6 = (struct sockaddr_in6 *)&sa_storage;
@@ -244,37 +245,37 @@ test_addr_ip6_helpers(void *arg)
sin6->sin6_port = htons(7070);
sin6->sin6_addr.s6_addr[0] = 128;
tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin6, &port1);
- tt_int_op(tor_addr_family(&t1),==, AF_INET6);
- tt_int_op(port1, ==, 7070);
+ tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET6);
+ tt_int_op(port1, OP_EQ, 7070);
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0);
- tt_str_op(p1,==, "8000::");
+ tt_str_op(p1,OP_EQ, "8000::");
memset(&sa_storage, 0, sizeof(sa_storage));
- tt_int_op(sizeof(struct sockaddr_in6),==,
+ tt_int_op(sizeof(struct sockaddr_in6),OP_EQ,
tor_addr_to_sockaddr(&t1, 9999, (struct sockaddr *)&sa_storage,
sizeof(sa_storage)));
- tt_int_op(AF_INET6,==, sin6->sin6_family);
- tt_int_op(9999,==, ntohs(sin6->sin6_port));
- tt_int_op(0x80000000,==, ntohl(S6_ADDR32(sin6->sin6_addr)[0]));
+ tt_int_op(AF_INET6,OP_EQ, sin6->sin6_family);
+ tt_int_op(9999,OP_EQ, ntohs(sin6->sin6_port));
+ tt_int_op(0x80000000,OP_EQ, ntohl(S6_ADDR32(sin6->sin6_addr)[0]));
/* ==== tor_addr_lookup: static cases. (Can't test dns without knowing we
* have a good resolver. */
- tt_int_op(0,==, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1));
- tt_int_op(AF_INET,==, tor_addr_family(&t1));
- tt_int_op(tor_addr_to_ipv4h(&t1),==, 0x7f808182);
+ tt_int_op(0,OP_EQ, tor_addr_lookup("127.128.129.130", AF_UNSPEC, &t1));
+ tt_int_op(AF_INET,OP_EQ, tor_addr_family(&t1));
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ, 0x7f808182);
- tt_int_op(0,==, tor_addr_lookup("9000::5", AF_UNSPEC, &t1));
- tt_int_op(AF_INET6,==, tor_addr_family(&t1));
- tt_int_op(0x90,==, tor_addr_to_in6_addr8(&t1)[0]);
+ tt_int_op(0,OP_EQ, tor_addr_lookup("9000::5", AF_UNSPEC, &t1));
+ tt_int_op(AF_INET6,OP_EQ, tor_addr_family(&t1));
+ tt_int_op(0x90,OP_EQ, tor_addr_to_in6_addr8(&t1)[0]);
tt_assert(tor_mem_is_zero((char*)tor_addr_to_in6_addr8(&t1)+1, 14));
- tt_int_op(0x05,==, tor_addr_to_in6_addr8(&t1)[15]);
+ tt_int_op(0x05,OP_EQ, tor_addr_to_in6_addr8(&t1)[15]);
/* === Test pton: valid af_inet6 */
/* Simple, valid parsing. */
r = tor_inet_pton(AF_INET6,
"0102:0304:0506:0708:090A:0B0C:0D0E:0F10", &a1);
- tt_int_op(r, ==, 1);
- for (i=0;i<16;++i) { tt_int_op(i+1,==, (int)a1.s6_addr[i]); }
+ tt_int_op(r, OP_EQ, 1);
+ for (i=0;i<16;++i) { tt_int_op(i+1,OP_EQ, (int)a1.s6_addr[i]); }
/* ipv4 ending. */
test_pton6_same("0102:0304:0506:0708:090A:0B0C:0D0E:0F10",
"0102:0304:0506:0708:090A:0B0C:13.14.15.16");
@@ -314,7 +315,7 @@ test_addr_ip6_helpers(void *arg)
"1000:1:0:7::");
/* Bad af param */
- tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),==, -1);
+ tt_int_op(tor_inet_pton(AF_UNSPEC, 0, 0),OP_EQ, -1);
/* === Test pton: invalid in6. */
test_pton6_bad("foobar.");
@@ -410,11 +411,12 @@ test_addr_ip6_helpers(void *arg)
test_external_ip("::ffff:169.255.0.0", 0);
/* tor_addr_compare(tor_addr_t x2) */
- test_addr_compare("ffff::", ==, "ffff::0");
- test_addr_compare("0::3:2:1", <, "0::ffff:0.3.2.1");
- test_addr_compare("0::2:2:1", <, "0::ffff:0.3.2.1");
- test_addr_compare("0::ffff:0.3.2.1", >, "0::0:0:0");
- test_addr_compare("0::ffff:5.2.2.1", <, "::ffff:6.0.0.0"); /* XXXX wrong. */
+ test_addr_compare("ffff::", OP_EQ, "ffff::0");
+ test_addr_compare("0::3:2:1", OP_LT, "0::ffff:0.3.2.1");
+ test_addr_compare("0::2:2:1", OP_LT, "0::ffff:0.3.2.1");
+ test_addr_compare("0::ffff:0.3.2.1", OP_GT, "0::0:0:0");
+ test_addr_compare("0::ffff:5.2.2.1", OP_LT,
+ "::ffff:6.0.0.0"); /* XXXX wrong. */
tor_addr_parse_mask_ports("[::ffff:2.3.4.5]", 0, &t1, NULL, NULL, NULL);
tor_addr_parse_mask_ports("2.3.4.5", 0, &t2, NULL, NULL, NULL);
tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) == 0);
@@ -423,119 +425,120 @@ test_addr_ip6_helpers(void *arg)
tt_assert(tor_addr_compare(&t1, &t2, CMP_SEMANTIC) < 0);
/* test compare_masked */
- test_addr_compare_masked("ffff::", ==, "ffff::0", 128);
- test_addr_compare_masked("ffff::", ==, "ffff::0", 64);
- test_addr_compare_masked("0::2:2:1", <, "0::8000:2:1", 81);
- test_addr_compare_masked("0::2:2:1", ==, "0::8000:2:1", 80);
+ test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 128);
+ test_addr_compare_masked("ffff::", OP_EQ, "ffff::0", 64);
+ test_addr_compare_masked("0::2:2:1", OP_LT, "0::8000:2:1", 81);
+ test_addr_compare_masked("0::2:2:1", OP_EQ, "0::8000:2:1", 80);
/* Test undecorated tor_addr_to_str */
- tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "[123:45:6789::5005:11]"));
+ tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]"));
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0);
- tt_str_op(p1,==, "123:45:6789::5005:11");
- tt_int_op(AF_INET,==, tor_addr_parse(&t1, "18.0.0.1"));
+ tt_str_op(p1,OP_EQ, "123:45:6789::5005:11");
+ tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1"));
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 0);
- tt_str_op(p1,==, "18.0.0.1");
+ tt_str_op(p1,OP_EQ, "18.0.0.1");
/* Test decorated tor_addr_to_str */
- tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "[123:45:6789::5005:11]"));
+ tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "[123:45:6789::5005:11]"));
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1);
- tt_str_op(p1,==, "[123:45:6789::5005:11]");
- tt_int_op(AF_INET,==, tor_addr_parse(&t1, "18.0.0.1"));
+ tt_str_op(p1,OP_EQ, "[123:45:6789::5005:11]");
+ tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "18.0.0.1"));
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1);
- tt_str_op(p1,==, "18.0.0.1");
+ tt_str_op(p1,OP_EQ, "18.0.0.1");
/* Test buffer bounds checking of tor_addr_to_str */
- tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "::")); /* 2 + \0 */
- tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),==, "::");
- tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),==, "[::]");
-
- tt_int_op(AF_INET6,==, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */
- tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),==, "2000::1337");
- tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),==, "[2000::1337]");
-
- tt_int_op(AF_INET,==, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */
- tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),==, "1.2.3.4");
-
- tt_int_op(AF_INET,==, tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */
- tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),==, "255.255.255.255");
- tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),==, NULL); /* too short buf */
- tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),==, "255.255.255.255");
+ tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "::")); /* 2 + \0 */
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 2, 0),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 3, 0),OP_EQ, "::");
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 4, 1),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 5, 1),OP_EQ, "[::]");
+
+ tt_int_op(AF_INET6,OP_EQ, tor_addr_parse(&t1, "2000::1337")); /* 10 + \0 */
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 10, 0),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 11, 0),OP_EQ, "2000::1337");
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 12, 1),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 13, 1),OP_EQ, "[2000::1337]");
+
+ tt_int_op(AF_INET,OP_EQ, tor_addr_parse(&t1, "1.2.3.4")); /* 7 + \0 */
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 7, 0),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 8, 0),OP_EQ, "1.2.3.4");
+
+ tt_int_op(AF_INET, OP_EQ,
+ tor_addr_parse(&t1, "255.255.255.255")); /* 15 + \0 */
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 0),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 16, 0),OP_EQ, "255.255.255.255");
+ tt_ptr_op(tor_addr_to_str(buf, &t1, 15, 1),OP_EQ, NULL); /* too short buf */
+ tt_str_op(tor_addr_to_str(buf, &t1, 16, 1),OP_EQ, "255.255.255.255");
t1.family = AF_UNSPEC;
- tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),==, NULL);
+ tt_ptr_op(tor_addr_to_str(buf, &t1, sizeof(buf), 0),OP_EQ, NULL);
/* Test tor_addr_parse_PTR_name */
i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 0);
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
i = tor_addr_parse_PTR_name(&t1, "Foobar.baz", AF_UNSPEC, 1);
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
i = tor_addr_parse_PTR_name(&t1, "9999999999999999999999999999.in-addr.arpa",
AF_UNSPEC, 1);
- tt_int_op(-1,==, i);
+ tt_int_op(-1,OP_EQ, i);
i = tor_addr_parse_PTR_name(&t1, "1.0.168.192.in-addr.arpa",
AF_UNSPEC, 1);
- tt_int_op(1,==, i);
- tt_int_op(tor_addr_family(&t1),==, AF_INET);
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(tor_addr_family(&t1),OP_EQ, AF_INET);
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1);
- tt_str_op(p1,==, "192.168.0.1");
+ tt_str_op(p1,OP_EQ, "192.168.0.1");
i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 0);
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
i = tor_addr_parse_PTR_name(&t1, "192.168.0.99", AF_UNSPEC, 1);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1);
- tt_str_op(p1,==, "192.168.0.99");
+ tt_str_op(p1,OP_EQ, "192.168.0.99");
memset(&t1, 0, sizeof(t1));
i = tor_addr_parse_PTR_name(&t1,
"0.1.2.3.4.5.6.7.8.9.a.b.c.d.e.f."
"f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9."
"ip6.ARPA",
AF_UNSPEC, 0);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
p1 = tor_addr_to_str(buf, &t1, sizeof(buf), 1);
- tt_str_op(p1,==, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]");
+ tt_str_op(p1,OP_EQ, "[9dee:effe:ebe1:beef:fedc:ba98:7654:3210]");
/* Failing cases. */
i = tor_addr_parse_PTR_name(&t1,
"6.7.8.9.a.b.c.d.e.f."
"f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9."
"ip6.ARPA",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1,
"6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.f.0."
"f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9."
"ip6.ARPA",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1,
"6.7.8.9.a.b.c.d.e.f.X.0.0.0.0.9."
"f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9."
"ip6.ARPA",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1, "32.1.1.in-addr.arpa",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1, ".in-addr.arpa",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa",
AF_UNSPEC, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1, "1.2.3.4.5.in-addr.arpa",
AF_INET6, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
i = tor_addr_parse_PTR_name(&t1,
"6.7.8.9.a.b.c.d.e.f.a.b.c.d.e.0."
"f.e.e.b.1.e.b.e.e.f.f.e.e.e.d.9."
"ip6.ARPA",
AF_INET, 0);
- tt_int_op(i,==, -1);
+ tt_int_op(i,OP_EQ, -1);
/* === Test tor_addr_to_PTR_name */
@@ -547,19 +550,19 @@ test_addr_ip6_helpers(void *arg)
tor_addr_from_sockaddr(&t1, (struct sockaddr *)sin, NULL);
/* Check IPv4 PTR - too short buffer */
- tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),==, -1);
+ tt_int_op(tor_addr_to_PTR_name(rbuf, 1, &t1),OP_EQ, -1);
tt_int_op(tor_addr_to_PTR_name(rbuf,
strlen("3.2.1.127.in-addr.arpa") - 1,
- &t1),==, -1);
+ &t1),OP_EQ, -1);
/* Check IPv4 PTR - valid addr */
- tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==,
+ tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ,
strlen("3.2.1.127.in-addr.arpa"));
- tt_str_op(rbuf,==, "3.2.1.127.in-addr.arpa");
+ tt_str_op(rbuf,OP_EQ, "3.2.1.127.in-addr.arpa");
/* Invalid addr family */
t1.family = AF_UNSPEC;
- tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==, -1);
+ tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ, -1);
/* Stage IPv6 addr */
memset(&sa_storage, 0, sizeof(sa_storage));
@@ -576,82 +579,82 @@ test_addr_ip6_helpers(void *arg)
"0.0.0.0.0.0.0.0.0.0.0.0.0.0.0.8.ip6.arpa";
/* Check IPv6 PTR - too short buffer */
- tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),==, -1);
- tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),==, -1);
+ tt_int_op(tor_addr_to_PTR_name(rbuf, 0, &t1),OP_EQ, -1);
+ tt_int_op(tor_addr_to_PTR_name(rbuf, strlen(addr_PTR) - 1, &t1),OP_EQ, -1);
/* Check IPv6 PTR - valid addr */
- tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),==,
+ tt_int_op(tor_addr_to_PTR_name(rbuf, sizeof(rbuf), &t1),OP_EQ,
strlen(addr_PTR));
- tt_str_op(rbuf,==, addr_PTR);
+ tt_str_op(rbuf,OP_EQ, addr_PTR);
}
/* XXXX turn this into a separate function; it's not all IPv6. */
/* test tor_addr_parse_mask_ports */
test_addr_mask_ports_parse("[::f]/17:47-95", AF_INET6,
0, 0, 0, 0x0000000f, 17, 47, 95);
- tt_str_op(p1,==, "::f");
+ tt_str_op(p1,OP_EQ, "::f");
//test_addr_parse("[::fefe:4.1.1.7/120]:999-1000");
//test_addr_parse_check("::fefe:401:107", 120, 999, 1000);
test_addr_mask_ports_parse("[::ffff:4.1.1.7]/120:443", AF_INET6,
0, 0, 0x0000ffff, 0x04010107, 120, 443, 443);
- tt_str_op(p1,==, "::ffff:4.1.1.7");
+ tt_str_op(p1,OP_EQ, "::ffff:4.1.1.7");
test_addr_mask_ports_parse("[abcd:2::44a:0]:2-65000", AF_INET6,
0xabcd0002, 0, 0, 0x044a0000, 128, 2, 65000);
- tt_str_op(p1,==, "abcd:2::44a:0");
+ tt_str_op(p1,OP_EQ, "abcd:2::44a:0");
/* Try some long addresses. */
r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111]",
0, &t1, NULL, NULL, NULL);
tt_assert(r == AF_INET6);
r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:11111]",
0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[ffff:1111:1111:1111:1111:1111:1111:1111:1]",
0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports(
"[ffff:1111:1111:1111:1111:1111:1111:ffff:"
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:"
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:"
"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff]",
0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Try some failing cases. */
r=tor_addr_parse_mask_ports("[fefef::]/112", 0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[fefe::/112", 0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[fefe::", 0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[fefe::X]", 0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("efef::/112", 0, &t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f::]",0,&t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[::f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[f:f:f:f:f:f:f:f:f]",0,&t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/fred",0,&t1,&mask, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("[f:f:f:f:f::]/255.255.0.0",
0,&t1, NULL, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* This one will get rejected because it isn't a pure prefix. */
r=tor_addr_parse_mask_ports("1.1.2.3/255.255.64.0",0,&t1, &mask,NULL,NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Test for V4-mapped address with mask < 96. (arguably not valid) */
r=tor_addr_parse_mask_ports("[::ffff:1.1.2.2/33]",0,&t1, &mask, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("1.1.2.2/33",0,&t1, &mask, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Try extended wildcard addresses with out TAPMP_EXTENDED_STAR*/
r=tor_addr_parse_mask_ports("*4",0,&t1, &mask, NULL, NULL);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r=tor_addr_parse_mask_ports("*6",0,&t1, &mask, NULL, NULL);
- tt_int_op(r, ==, -1);
-#if 0
+ tt_int_op(r, OP_EQ, -1);
+ tt_assert(r == -1);
/* Try a mask with a wildcard. */
r=tor_addr_parse_mask_ports("*/16",0,&t1, &mask, NULL, NULL);
tt_assert(r == -1);
@@ -661,61 +664,60 @@ test_addr_ip6_helpers(void *arg)
r=tor_addr_parse_mask_ports("*6/30",TAPMP_EXTENDED_STAR,
&t1, &mask, NULL, NULL);
tt_assert(r == -1);
-#endif
/* Basic mask tests*/
r=tor_addr_parse_mask_ports("1.1.2.2/31",0,&t1, &mask, NULL, NULL);
tt_assert(r == AF_INET);
- tt_int_op(mask,==,31);
- tt_int_op(tor_addr_family(&t1),==,AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==,0x01010202);
+ tt_int_op(mask,OP_EQ,31);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010202);
r=tor_addr_parse_mask_ports("3.4.16.032:1-2",0,&t1, &mask, &port1, &port2);
tt_assert(r == AF_INET);
- tt_int_op(mask,==,32);
- tt_int_op(tor_addr_family(&t1),==,AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==,0x03041020);
+ tt_int_op(mask,OP_EQ,32);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x03041020);
tt_assert(port1 == 1);
tt_assert(port2 == 2);
r=tor_addr_parse_mask_ports("1.1.2.3/255.255.128.0",0,&t1, &mask,NULL,NULL);
tt_assert(r == AF_INET);
- tt_int_op(mask,==,17);
- tt_int_op(tor_addr_family(&t1),==,AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==,0x01010203);
+ tt_int_op(mask,OP_EQ,17);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0x01010203);
r=tor_addr_parse_mask_ports("[efef::]/112",0,&t1, &mask, &port1, &port2);
tt_assert(r == AF_INET6);
tt_assert(port1 == 1);
tt_assert(port2 == 65535);
/* Try regular wildcard behavior without TAPMP_EXTENDED_STAR */
r=tor_addr_parse_mask_ports("*:80-443",0,&t1,&mask,&port1,&port2);
- tt_int_op(r,==,AF_INET); /* Old users of this always get inet */
- tt_int_op(tor_addr_family(&t1),==,AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==,0);
- tt_int_op(mask,==,0);
- tt_int_op(port1,==,80);
- tt_int_op(port2,==,443);
+ tt_int_op(r,OP_EQ,AF_INET); /* Old users of this always get inet */
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0);
+ tt_int_op(mask,OP_EQ,0);
+ tt_int_op(port1,OP_EQ,80);
+ tt_int_op(port2,OP_EQ,443);
/* Now try wildcards *with* TAPMP_EXTENDED_STAR */
r=tor_addr_parse_mask_ports("*:8000-9000",TAPMP_EXTENDED_STAR,
&t1,&mask,&port1,&port2);
- tt_int_op(r,==,AF_UNSPEC);
- tt_int_op(tor_addr_family(&t1),==,AF_UNSPEC);
- tt_int_op(mask,==,0);
- tt_int_op(port1,==,8000);
- tt_int_op(port2,==,9000);
+ tt_int_op(r,OP_EQ,AF_UNSPEC);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_UNSPEC);
+ tt_int_op(mask,OP_EQ,0);
+ tt_int_op(port1,OP_EQ,8000);
+ tt_int_op(port2,OP_EQ,9000);
r=tor_addr_parse_mask_ports("*4:6667",TAPMP_EXTENDED_STAR,
&t1,&mask,&port1,&port2);
- tt_int_op(r,==,AF_INET);
- tt_int_op(tor_addr_family(&t1),==,AF_INET);
- tt_int_op(tor_addr_to_ipv4h(&t1),==,0);
- tt_int_op(mask,==,0);
- tt_int_op(port1,==,6667);
- tt_int_op(port2,==,6667);
+ tt_int_op(r,OP_EQ,AF_INET);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET);
+ tt_int_op(tor_addr_to_ipv4h(&t1),OP_EQ,0);
+ tt_int_op(mask,OP_EQ,0);
+ tt_int_op(port1,OP_EQ,6667);
+ tt_int_op(port2,OP_EQ,6667);
r=tor_addr_parse_mask_ports("*6",TAPMP_EXTENDED_STAR,
&t1,&mask,&port1,&port2);
- tt_int_op(r,==,AF_INET6);
- tt_int_op(tor_addr_family(&t1),==,AF_INET6);
+ tt_int_op(r,OP_EQ,AF_INET6);
+ tt_int_op(tor_addr_family(&t1),OP_EQ,AF_INET6);
tt_assert(tor_mem_is_zero((const char*)tor_addr_to_in6_addr32(&t1), 16));
- tt_int_op(mask,==,0);
- tt_int_op(port1,==,1);
- tt_int_op(port2,==,65535);
+ tt_int_op(mask,OP_EQ,0);
+ tt_int_op(port1,OP_EQ,1);
+ tt_int_op(port2,OP_EQ,65535);
/* make sure inet address lengths >= max */
tt_assert(INET_NTOA_BUF_LEN >= sizeof("255.255.255.255"));
@@ -751,87 +753,87 @@ test_addr_parse(void *arg)
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.1:1234",
&addr, &port, -1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
tor_addr_to_str(buf, &addr, sizeof(buf), 0);
- tt_str_op(buf,==, "192.0.2.1");
- tt_int_op(port,==, 1234);
+ tt_str_op(buf,OP_EQ, "192.0.2.1");
+ tt_int_op(port,OP_EQ, 1234);
r= tor_addr_port_parse(LOG_DEBUG,
"[::1]:1234",
&addr, &port, -1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
tor_addr_to_str(buf, &addr, sizeof(buf), 0);
- tt_str_op(buf,==, "::1");
- tt_int_op(port,==, 1234);
+ tt_str_op(buf,OP_EQ, "::1");
+ tt_int_op(port,OP_EQ, 1234);
/* Domain name. */
r= tor_addr_port_parse(LOG_DEBUG,
"torproject.org:1234",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Only IP. */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2",
&addr, &port, 200);
- tt_int_op(r, ==, 0);
- tt_int_op(port,==,200);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(port,OP_EQ,200);
r= tor_addr_port_parse(LOG_DEBUG,
"[::1]",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r= tor_addr_port_parse(LOG_DEBUG,
"[::1]",
&addr, &port, 400);
- tt_int_op(r, ==, 0);
- tt_int_op(port,==,400);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(port,OP_EQ,400);
/* Bad port. */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2:66666",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2:66666",
&addr, &port, 200);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Only domain name */
r= tor_addr_port_parse(LOG_DEBUG,
"torproject.org",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
r= tor_addr_port_parse(LOG_DEBUG,
"torproject.org",
&addr, &port, 200);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Bad IP address */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2:1234",
&addr, &port, -1);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Make sure that the default port has lower priority than the real
one */
r= tor_addr_port_parse(LOG_DEBUG,
"192.0.2.2:1337",
&addr, &port, 200);
- tt_int_op(r, ==, 0);
- tt_int_op(port,==,1337);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(port,OP_EQ,1337);
r= tor_addr_port_parse(LOG_DEBUG,
"[::1]:1369",
&addr, &port, 200);
- tt_int_op(r, ==, 0);
- tt_int_op(port,==,1369);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(port,OP_EQ,1369);
done:
;
@@ -886,7 +888,7 @@ test_virtaddrmap(void *data)
get_random_virtual_addr(&cfg[ipv6], &a);
//printf("%s\n", fmt_addr(&a));
/* Make sure that the first b bits match the configured network */
- tt_int_op(0, ==, tor_addr_compare_masked(&a, &cfg[ipv6].addr,
+ tt_int_op(0, OP_EQ, tor_addr_compare_masked(&a, &cfg[ipv6].addr,
bits, CMP_EXACT));
/* And track which bits have been different between pairs of
@@ -930,7 +932,7 @@ test_addr_dup_ip(void *arg)
(void)arg;
#define CHECK(ip, s) do { \
v = tor_dup_ip(ip); \
- tt_str_op(v,==,(s)); \
+ tt_str_op(v,OP_EQ,(s)); \
tor_free(v); \
} while (0)
@@ -956,7 +958,7 @@ test_addr_sockaddr_to_str(void *arg)
#endif
#define CHECK(sa, s) do { \
v = tor_sockaddr_to_str((const struct sockaddr*) &(sa)); \
- tt_str_op(v,==,(s)); \
+ tt_str_op(v,OP_EQ,(s)); \
tor_free(v); \
} while (0)
(void)arg;
@@ -1013,12 +1015,13 @@ test_addr_is_loopback(void *data)
(void)data;
for (i=0; loopback_items[i].name; ++i) {
- tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), >=, 0);
- tt_int_op(tor_addr_is_loopback(&addr), ==, loopback_items[i].is_loopback);
+ tt_int_op(tor_addr_parse(&addr, loopback_items[i].name), OP_GE, 0);
+ tt_int_op(tor_addr_is_loopback(&addr), OP_EQ,
+ loopback_items[i].is_loopback);
}
tor_addr_make_unspec(&addr);
- tt_int_op(tor_addr_is_loopback(&addr), ==, 0);
+ tt_int_op(tor_addr_is_loopback(&addr), OP_EQ, 0);
done:
;
@@ -1033,18 +1036,18 @@ test_addr_make_null(void *data)
(void) data;
/* Ensure that before tor_addr_make_null, addr != 0's */
memset(addr, 1, sizeof(*addr));
- tt_int_op(memcmp(addr, zeros, sizeof(*addr)), !=, 0);
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_NE, 0);
/* Test with AF == AF_INET */
zeros->family = AF_INET;
tor_addr_make_null(addr, AF_INET);
- tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0);
- tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "0.0.0.0");
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0);
+ tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "0.0.0.0");
/* Test with AF == AF_INET6 */
memset(addr, 1, sizeof(*addr));
zeros->family = AF_INET6;
tor_addr_make_null(addr, AF_INET6);
- tt_int_op(memcmp(addr, zeros, sizeof(*addr)), ==, 0);
- tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), ==, "::");
+ tt_int_op(memcmp(addr, zeros, sizeof(*addr)), OP_EQ, 0);
+ tt_str_op(tor_addr_to_str(buf, addr, sizeof(buf), 0), OP_EQ, "::");
done:
tor_free(addr);
tor_free(zeros);
diff --git a/src/test/test_address.c b/src/test/test_address.c
new file mode 100644
index 0000000000..f98cc12b62
--- /dev/null
+++ b/src/test/test_address.c
@@ -0,0 +1,470 @@
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define ADDRESS_PRIVATE
+
+#ifdef _WIN32
+#include <winsock2.h>
+/* For access to structs needed by GetAdaptersAddresses */
+#undef _WIN32_WINNT
+#define _WIN32_WINNT 0x0501
+#include <iphlpapi.h>
+#endif
+
+#ifdef HAVE_IFADDRS_TO_SMARTLIST
+#include <net/if.h>
+#include <ifaddrs.h>
+#endif
+
+#ifdef HAVE_IFCONF_TO_SMARTLIST
+#ifdef HAVE_SYS_IOCTL_H
+#include <sys/ioctl.h>
+#endif
+#include <net/if.h>
+#endif
+
+#include "or.h"
+#include "address.h"
+#include "test.h"
+
+/** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent
+ * the same IP address and port combination. Otherwise, return 0.
+ */
+static uint8_t
+sockaddr_in_are_equal(struct sockaddr_in *sockaddr1,
+ struct sockaddr_in *sockaddr2)
+{
+ return ((sockaddr1->sin_family == sockaddr2->sin_family) &&
+ (sockaddr1->sin_port == sockaddr2->sin_port) &&
+ (sockaddr1->sin_addr.s_addr == sockaddr2->sin_addr.s_addr));
+}
+
+/** Return 1 iff <b>sockaddr1</b> and <b>sockaddr2</b> represent
+ * the same IP address and port combination. Otherwise, return 0.
+ */
+static uint8_t
+sockaddr_in6_are_equal(struct sockaddr_in6 *sockaddr1,
+ struct sockaddr_in6 *sockaddr2)
+{
+ return ((sockaddr1->sin6_family == sockaddr2->sin6_family) &&
+ (sockaddr1->sin6_port == sockaddr2->sin6_port) &&
+ (tor_memeq(sockaddr1->sin6_addr.s6_addr,
+ sockaddr2->sin6_addr.s6_addr,16)));
+}
+
+/** Create a sockaddr_in structure from IP address string <b>ip_str</b>.
+ *
+ * If <b>out</b> is not NULL, write the result
+ * to the memory address in <b>out</b>. Otherwise, allocate the memory
+ * for result. On success, return pointer to result. Otherwise, return
+ * NULL.
+ */
+static struct sockaddr_in *
+sockaddr_in_from_string(const char *ip_str, struct sockaddr_in *out)
+{
+ // [FIXME: add some error checking?]
+ if (!out)
+ out = tor_malloc_zero(sizeof(struct sockaddr_in));
+
+ out->sin_family = AF_INET;
+ out->sin_port = 0;
+ tor_inet_pton(AF_INET,ip_str,&(out->sin_addr));
+
+ return out;
+}
+
+/** Return 1 iff <b>smartlist</b> contains a tor_addr_t structure
+ * that points to 127.0.0.1. Otherwise, return 0.
+ */
+static int
+smartlist_contains_localhost_tor_addr(smartlist_t *smartlist)
+{
+ int found_localhost = 0;
+
+ struct sockaddr_in *sockaddr_localhost;
+ struct sockaddr_storage *sockaddr_to_check;
+
+ sockaddr_localhost = sockaddr_in_from_string("127.0.0.1",NULL);
+
+ sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in));
+
+ SMARTLIST_FOREACH_BEGIN(smartlist, tor_addr_t *, tor_addr) {
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ if (sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
+ sockaddr_localhost)) {
+ found_localhost = 1;
+ break;
+ }
+ } SMARTLIST_FOREACH_END(tor_addr);
+
+ tor_free(sockaddr_localhost);
+ tor_free(sockaddr_to_check);
+
+ return found_localhost;
+}
+
+#ifdef HAVE_IFADDRS_TO_SMARTLIST
+static void
+test_address_ifaddrs_to_smartlist(void *arg)
+{
+ struct ifaddrs *ifa = NULL;
+ struct ifaddrs *ifa_ipv4 = NULL;
+ struct ifaddrs *ifa_ipv6 = NULL;
+ struct sockaddr_in *ipv4_sockaddr_local = NULL;
+ struct sockaddr_in *netmask_slash8 = NULL;
+ struct sockaddr_in *ipv4_sockaddr_remote = NULL;
+ struct sockaddr_in6 *ipv6_sockaddr = NULL;
+ smartlist_t *smartlist = NULL;
+ tor_addr_t *tor_addr = NULL;
+ struct sockaddr *sockaddr_to_check = NULL;
+ socklen_t addr_len;
+
+ (void)arg;
+
+ netmask_slash8 = sockaddr_in_from_string("255.0.0.0",NULL);
+ ipv4_sockaddr_local = sockaddr_in_from_string("127.0.0.1",NULL);
+ ipv4_sockaddr_remote = sockaddr_in_from_string("128.52.160.20",NULL);
+
+ ipv6_sockaddr = tor_malloc(sizeof(struct sockaddr_in6));
+ ipv6_sockaddr->sin6_family = AF_INET6;
+ ipv6_sockaddr->sin6_port = 0;
+ inet_pton(AF_INET6, "2001:db8:8714:3a90::12",
+ &(ipv6_sockaddr->sin6_addr));
+
+ ifa = tor_malloc(sizeof(struct ifaddrs));
+ ifa_ipv4 = tor_malloc(sizeof(struct ifaddrs));
+ ifa_ipv6 = tor_malloc(sizeof(struct ifaddrs));
+
+ ifa->ifa_next = ifa_ipv4;
+ ifa->ifa_name = tor_strdup("eth0");
+ ifa->ifa_flags = IFF_UP | IFF_RUNNING;
+ ifa->ifa_addr = (struct sockaddr *)ipv4_sockaddr_local;
+ ifa->ifa_netmask = (struct sockaddr *)netmask_slash8;
+ ifa->ifa_dstaddr = NULL;
+ ifa->ifa_data = NULL;
+
+ ifa_ipv4->ifa_next = ifa_ipv6;
+ ifa_ipv4->ifa_name = tor_strdup("eth1");
+ ifa_ipv4->ifa_flags = IFF_UP | IFF_RUNNING;
+ ifa_ipv4->ifa_addr = (struct sockaddr *)ipv4_sockaddr_remote;
+ ifa_ipv4->ifa_netmask = (struct sockaddr *)netmask_slash8;
+ ifa_ipv4->ifa_dstaddr = NULL;
+ ifa_ipv4->ifa_data = NULL;
+
+ ifa_ipv6->ifa_next = NULL;
+ ifa_ipv6->ifa_name = tor_strdup("eth2");
+ ifa_ipv6->ifa_flags = IFF_UP | IFF_RUNNING;
+ ifa_ipv6->ifa_addr = (struct sockaddr *)ipv6_sockaddr;
+ ifa_ipv6->ifa_netmask = NULL;
+ ifa_ipv6->ifa_dstaddr = NULL;
+ ifa_ipv6->ifa_data = NULL;
+
+ smartlist = ifaddrs_to_smartlist(ifa);
+
+ tt_assert(smartlist);
+ tt_assert(smartlist_len(smartlist) == 3);
+
+ sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in6));
+
+ tor_addr = smartlist_get(smartlist,0);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
+ ipv4_sockaddr_local));
+
+ tor_addr = smartlist_get(smartlist,1);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_assert(sockaddr_in_are_equal((struct sockaddr_in *)sockaddr_to_check,
+ ipv4_sockaddr_remote));
+
+ tor_addr = smartlist_get(smartlist,2);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,sockaddr_to_check,
+ sizeof(struct sockaddr_in6));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in6));
+ tt_assert(sockaddr_in6_are_equal((struct sockaddr_in6*)sockaddr_to_check,
+ ipv6_sockaddr));
+
+ done:
+ tor_free(netmask_slash8);
+ tor_free(ipv4_sockaddr_local);
+ tor_free(ipv4_sockaddr_remote);
+ tor_free(ipv6_sockaddr);
+ tor_free(ifa->ifa_name);
+ tor_free(ifa_ipv4->ifa_name);
+ tor_free(ifa_ipv6->ifa_name);
+ tor_free(ifa);
+ tor_free(ifa_ipv4);
+ tor_free(ifa_ipv6);
+ tor_free(sockaddr_to_check);
+ SMARTLIST_FOREACH(smartlist, tor_addr_t *, t, tor_free(t));
+ smartlist_free(smartlist);
+
+ return;
+}
+
+static void
+test_address_get_if_addrs_ifaddrs(void *arg)
+{
+
+ smartlist_t *results = NULL;
+
+ (void)arg;
+
+ results = get_interface_addresses_ifaddrs(0);
+
+ tt_int_op(smartlist_len(results),>=,1);
+ tt_assert(smartlist_contains_localhost_tor_addr(results));
+
+ done:
+ SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
+ smartlist_free(results);
+ return;
+}
+
+#endif
+
+#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
+
+static void
+test_address_get_if_addrs_win32(void *arg)
+{
+
+ smartlist_t *results = NULL;
+
+ (void)arg;
+
+ results = get_interface_addresses_win32(0);
+
+ tt_int_op(smartlist_len(results),>=,1);
+ tt_assert(smartlist_contains_localhost_tor_addr(results));
+
+ done:
+ SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
+ tor_free(results);
+ return;
+}
+
+static void
+test_address_ip_adapter_addresses_to_smartlist(void *arg)
+{
+
+ IP_ADAPTER_ADDRESSES *addrs1;
+ IP_ADAPTER_ADDRESSES *addrs2;
+
+ IP_ADAPTER_UNICAST_ADDRESS *unicast11;
+ IP_ADAPTER_UNICAST_ADDRESS *unicast12;
+ IP_ADAPTER_UNICAST_ADDRESS *unicast21;
+
+ smartlist_t *result = NULL;
+
+ struct sockaddr_in *sockaddr_test1;
+ struct sockaddr_in *sockaddr_test2;
+ struct sockaddr_in *sockaddr_localhost;
+ struct sockaddr_in *sockaddr_to_check;
+
+ tor_addr_t *tor_addr;
+
+ (void)arg;
+ (void)sockaddr_in6_are_equal;
+
+ sockaddr_to_check = tor_malloc_zero(sizeof(struct sockaddr_in));
+
+ addrs1 =
+ tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES));
+
+ addrs1->FirstUnicastAddress =
+ unicast11 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
+ sockaddr_test1 = sockaddr_in_from_string("86.59.30.40",NULL);
+ unicast11->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test1;
+
+ unicast11->Next = unicast12 =
+ tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
+ sockaddr_test2 = sockaddr_in_from_string("93.95.227.222", NULL);
+ unicast12->Address.lpSockaddr = (LPSOCKADDR)sockaddr_test2;
+
+ addrs1->Next = addrs2 =
+ tor_malloc_zero(sizeof(IP_ADAPTER_ADDRESSES));
+
+ addrs2->FirstUnicastAddress =
+ unicast21 = tor_malloc_zero(sizeof(IP_ADAPTER_UNICAST_ADDRESS));
+ sockaddr_localhost = sockaddr_in_from_string("127.0.0.1", NULL);
+ unicast21->Address.lpSockaddr = (LPSOCKADDR)sockaddr_localhost;
+
+ result = ip_adapter_addresses_to_smartlist(addrs1);
+
+ tt_assert(result);
+ tt_assert(smartlist_len(result) == 3);
+
+ tor_addr = smartlist_get(result,0);
+
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_assert(sockaddr_in_are_equal(sockaddr_test1,sockaddr_to_check));
+
+ tor_addr = smartlist_get(result,1);
+
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_assert(sockaddr_in_are_equal(sockaddr_test2,sockaddr_to_check));
+
+ tor_addr = smartlist_get(result,2);
+
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_assert(sockaddr_in_are_equal(sockaddr_localhost,sockaddr_to_check));
+
+ done:
+ SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t));
+ smartlist_free(result);
+ tor_free(addrs1);
+ tor_free(addrs2);
+ tor_free(unicast11->Address.lpSockaddr);
+ tor_free(unicast11);
+ tor_free(unicast12->Address.lpSockaddr);
+ tor_free(unicast12);
+ tor_free(unicast21->Address.lpSockaddr);
+ tor_free(unicast21);
+ tor_free(sockaddr_to_check);
+ return;
+}
+#endif
+
+#ifdef HAVE_IFCONF_TO_SMARTLIST
+
+static void
+test_address_ifreq_to_smartlist(void *arg)
+{
+ smartlist_t *results = NULL;
+ const tor_addr_t *tor_addr = NULL;
+ struct sockaddr_in *sockaddr = NULL;
+ struct sockaddr_in *sockaddr_eth1 = NULL;
+ struct sockaddr_in *sockaddr_to_check = NULL;
+
+ struct ifconf *ifc;
+ struct ifreq *ifr;
+ struct ifreq *ifr_next;
+
+ socklen_t addr_len;
+
+ (void)arg;
+
+ sockaddr_to_check = tor_malloc(sizeof(struct sockaddr_in));
+
+ ifr = tor_malloc(sizeof(struct ifreq));
+ memset(ifr,0,sizeof(struct ifreq));
+ strlcpy(ifr->ifr_name,"lo",3);
+ sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr);
+ sockaddr_in_from_string("127.0.0.1",sockaddr);
+
+ ifc = tor_malloc(sizeof(struct ifconf));
+ memset(ifc,0,sizeof(struct ifconf));
+ ifc->ifc_len = sizeof(struct ifreq);
+ ifc->ifc_ifcu.ifcu_req = ifr;
+
+ results = ifreq_to_smartlist((struct ifreq *)ifc->ifc_buf,ifc->ifc_len);
+ tt_int_op(smartlist_len(results),==,1);
+
+ tor_addr = smartlist_get(results, 0);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
+
+ ifr = tor_realloc(ifr,2*sizeof(struct ifreq));
+ ifr_next = ifr+1;
+ strlcpy(ifr_next->ifr_name,"eth1",5);
+ ifc->ifc_len = 2*sizeof(struct ifreq);
+ ifc->ifc_ifcu.ifcu_req = ifr;
+ sockaddr = (struct sockaddr_in *) &(ifr->ifr_ifru.ifru_addr);
+
+ sockaddr_eth1 = (struct sockaddr_in *) &(ifr_next->ifr_ifru.ifru_addr);
+ sockaddr_in_from_string("192.168.10.55",sockaddr_eth1);
+ SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
+ smartlist_free(results);
+
+ results = ifreq_to_smartlist((struct ifreq *)ifc->ifc_buf,ifc->ifc_len);
+ tt_int_op(smartlist_len(results),==,2);
+
+ tor_addr = smartlist_get(results, 0);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_assert(sockaddr_in_are_equal(sockaddr,sockaddr_to_check));
+
+ tor_addr = smartlist_get(results, 1);
+ addr_len =
+ tor_addr_to_sockaddr(tor_addr,0,(struct sockaddr *)sockaddr_to_check,
+ sizeof(struct sockaddr_in));
+
+ tt_int_op(addr_len,==,sizeof(struct sockaddr_in));
+ tt_assert(sockaddr_in_are_equal(sockaddr_eth1,sockaddr_to_check));
+
+ done:
+ tor_free(sockaddr_to_check);
+ SMARTLIST_FOREACH(results, tor_addr_t *, t, tor_free(t));
+ smartlist_free(results);
+ tor_free(ifc);
+ tor_free(ifr);
+ return;
+}
+
+static void
+test_address_get_if_addrs_ioctl(void *arg)
+{
+
+ smartlist_t *result = NULL;
+
+ (void)arg;
+
+ result = get_interface_addresses_ioctl(LOG_ERR);
+
+ tt_assert(result);
+ tt_int_op(smartlist_len(result),>=,1);
+
+ tt_assert(smartlist_contains_localhost_tor_addr(result));
+
+ done:
+ SMARTLIST_FOREACH(result, tor_addr_t *, t, tor_free(t));
+ smartlist_free(result);
+ return;
+}
+
+#endif
+
+#define ADDRESS_TEST(name, flags) \
+ { #name, test_address_ ## name, flags, NULL, NULL }
+
+struct testcase_t address_tests[] = {
+#ifdef HAVE_IFADDRS_TO_SMARTLIST
+ ADDRESS_TEST(get_if_addrs_ifaddrs, TT_FORK),
+ ADDRESS_TEST(ifaddrs_to_smartlist, 0),
+#endif
+#ifdef HAVE_IP_ADAPTER_TO_SMARTLIST
+ ADDRESS_TEST(get_if_addrs_win32, TT_FORK),
+ ADDRESS_TEST(ip_adapter_addresses_to_smartlist, 0),
+#endif
+#ifdef HAVE_IFCONF_TO_SMARTLIST
+ ADDRESS_TEST(get_if_addrs_ioctl, TT_FORK),
+ ADDRESS_TEST(ifreq_to_smartlist, 0),
+#endif
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_bt_cl.c b/src/test/test_bt_cl.c
index c0c334656d..0fa0cd5c0a 100644
--- a/src/test/test_bt_cl.c
+++ b/src/test/test_bt_cl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_buffers.c b/src/test/test_buffers.c
index cea719077c..101f448472 100644
--- a/src/test/test_buffers.c
+++ b/src/test/test_buffers.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define BUFFERS_PRIVATE
@@ -30,7 +30,7 @@ test_buffers_basic(void *arg)
TT_DIE(("Assertion failed."));
//test_eq(buf_capacity(buf), 4096);
- tt_int_op(buf_datalen(buf),==, 0);
+ tt_int_op(buf_datalen(buf),OP_EQ, 0);
/****
* General pointer frobbing
@@ -40,16 +40,16 @@ test_buffers_basic(void *arg)
}
write_to_buf(str, 256, buf);
write_to_buf(str, 256, buf);
- tt_int_op(buf_datalen(buf),==, 512);
+ tt_int_op(buf_datalen(buf),OP_EQ, 512);
fetch_from_buf(str2, 200, buf);
- tt_mem_op(str,==, str2, 200);
- tt_int_op(buf_datalen(buf),==, 312);
+ tt_mem_op(str,OP_EQ, str2, 200);
+ tt_int_op(buf_datalen(buf),OP_EQ, 312);
memset(str2, 0, sizeof(str2));
fetch_from_buf(str2, 256, buf);
- tt_mem_op(str+200,==, str2, 56);
- tt_mem_op(str,==, str2+56, 200);
- tt_int_op(buf_datalen(buf),==, 56);
+ tt_mem_op(str+200,OP_EQ, str2, 56);
+ tt_mem_op(str,OP_EQ, str2+56, 200);
+ tt_int_op(buf_datalen(buf),OP_EQ, 56);
memset(str2, 0, sizeof(str2));
/* Okay, now we should be 512 bytes into the 4096-byte buffer. If we add
* another 3584 bytes, we hit the end. */
@@ -57,16 +57,16 @@ test_buffers_basic(void *arg)
write_to_buf(str, 256, buf);
}
assert_buf_ok(buf);
- tt_int_op(buf_datalen(buf),==, 3896);
+ tt_int_op(buf_datalen(buf),OP_EQ, 3896);
fetch_from_buf(str2, 56, buf);
- tt_int_op(buf_datalen(buf),==, 3840);
- tt_mem_op(str+200,==, str2, 56);
+ tt_int_op(buf_datalen(buf),OP_EQ, 3840);
+ tt_mem_op(str+200,OP_EQ, str2, 56);
for (j=0;j<15;++j) {
memset(str2, 0, sizeof(str2));
fetch_from_buf(str2, 256, buf);
- tt_mem_op(str,==, str2, 256);
+ tt_mem_op(str,OP_EQ, str2, 256);
}
- tt_int_op(buf_datalen(buf),==, 0);
+ tt_int_op(buf_datalen(buf),OP_EQ, 0);
buf_free(buf);
buf = NULL;
@@ -76,7 +76,7 @@ test_buffers_basic(void *arg)
write_to_buf(str+1, 255, buf);
//test_eq(buf_capacity(buf), 256);
fetch_from_buf(str2, 254, buf);
- tt_mem_op(str+1,==, str2, 254);
+ tt_mem_op(str+1,OP_EQ, str2, 254);
//test_eq(buf_capacity(buf), 256);
assert_buf_ok(buf);
write_to_buf(str, 32, buf);
@@ -85,15 +85,15 @@ test_buffers_basic(void *arg)
write_to_buf(str, 256, buf);
assert_buf_ok(buf);
//test_eq(buf_capacity(buf), 512);
- tt_int_op(buf_datalen(buf),==, 33+256);
+ tt_int_op(buf_datalen(buf),OP_EQ, 33+256);
fetch_from_buf(str2, 33, buf);
- tt_int_op(*str2,==, str[255]);
+ tt_int_op(*str2,OP_EQ, str[255]);
- tt_mem_op(str2+1,==, str, 32);
+ tt_mem_op(str2+1,OP_EQ, str, 32);
//test_eq(buf_capacity(buf), 512);
- tt_int_op(buf_datalen(buf),==, 256);
+ tt_int_op(buf_datalen(buf),OP_EQ, 256);
fetch_from_buf(str2, 256, buf);
- tt_mem_op(str,==, str2, 256);
+ tt_mem_op(str,OP_EQ, str2, 256);
/* now try shrinking: case 1. */
buf_free(buf);
@@ -102,10 +102,10 @@ test_buffers_basic(void *arg)
write_to_buf(str,255, buf);
}
//test_eq(buf_capacity(buf), 33668);
- tt_int_op(buf_datalen(buf),==, 17085);
+ tt_int_op(buf_datalen(buf),OP_EQ, 17085);
for (j=0; j < 40; ++j) {
fetch_from_buf(str2, 255,buf);
- tt_mem_op(str2,==, str, 255);
+ tt_mem_op(str2,OP_EQ, str, 255);
}
/* now try shrinking: case 2. */
@@ -116,7 +116,7 @@ test_buffers_basic(void *arg)
}
for (j=0; j < 20; ++j) {
fetch_from_buf(str2, 255,buf);
- tt_mem_op(str2,==, str, 255);
+ tt_mem_op(str2,OP_EQ, str, 255);
}
for (j=0;j<80;++j) {
write_to_buf(str,255, buf);
@@ -124,7 +124,7 @@ test_buffers_basic(void *arg)
//test_eq(buf_capacity(buf),33668);
for (j=0; j < 120; ++j) {
fetch_from_buf(str2, 255,buf);
- tt_mem_op(str2,==, str, 255);
+ tt_mem_op(str2,OP_EQ, str, 255);
}
/* Move from buf to buf. */
@@ -133,27 +133,27 @@ test_buffers_basic(void *arg)
buf2 = buf_new_with_capacity(4096);
for (j=0;j<100;++j)
write_to_buf(str, 255, buf);
- tt_int_op(buf_datalen(buf),==, 25500);
+ tt_int_op(buf_datalen(buf),OP_EQ, 25500);
for (j=0;j<100;++j) {
r = 10;
move_buf_to_buf(buf2, buf, &r);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
}
- tt_int_op(buf_datalen(buf),==, 24500);
- tt_int_op(buf_datalen(buf2),==, 1000);
+ tt_int_op(buf_datalen(buf),OP_EQ, 24500);
+ tt_int_op(buf_datalen(buf2),OP_EQ, 1000);
for (j=0;j<3;++j) {
fetch_from_buf(str2, 255, buf2);
- tt_mem_op(str2,==, str, 255);
+ tt_mem_op(str2,OP_EQ, str, 255);
}
r = 8192; /*big move*/
move_buf_to_buf(buf2, buf, &r);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = 30000; /* incomplete move */
move_buf_to_buf(buf2, buf, &r);
- tt_int_op(r,==, 13692);
+ tt_int_op(r,OP_EQ, 13692);
for (j=0;j<97;++j) {
fetch_from_buf(str2, 255, buf2);
- tt_mem_op(str2,==, str, 255);
+ tt_mem_op(str2,OP_EQ, str, 255);
}
buf_free(buf);
buf_free(buf2);
@@ -163,16 +163,16 @@ test_buffers_basic(void *arg)
cp = "Testing. This is a moderately long Testing string.";
for (j = 0; cp[j]; j++)
write_to_buf(cp+j, 1, buf);
- tt_int_op(0,==, buf_find_string_offset(buf, "Testing", 7));
- tt_int_op(1,==, buf_find_string_offset(buf, "esting", 6));
- tt_int_op(1,==, buf_find_string_offset(buf, "est", 3));
- tt_int_op(39,==, buf_find_string_offset(buf, "ing str", 7));
- tt_int_op(35,==, buf_find_string_offset(buf, "Testing str", 11));
- tt_int_op(32,==, buf_find_string_offset(buf, "ng ", 3));
- tt_int_op(43,==, buf_find_string_offset(buf, "string.", 7));
- tt_int_op(-1,==, buf_find_string_offset(buf, "shrdlu", 6));
- tt_int_op(-1,==, buf_find_string_offset(buf, "Testing thing", 13));
- tt_int_op(-1,==, buf_find_string_offset(buf, "ngx", 3));
+ tt_int_op(0,OP_EQ, buf_find_string_offset(buf, "Testing", 7));
+ tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "esting", 6));
+ tt_int_op(1,OP_EQ, buf_find_string_offset(buf, "est", 3));
+ tt_int_op(39,OP_EQ, buf_find_string_offset(buf, "ing str", 7));
+ tt_int_op(35,OP_EQ, buf_find_string_offset(buf, "Testing str", 11));
+ tt_int_op(32,OP_EQ, buf_find_string_offset(buf, "ng ", 3));
+ tt_int_op(43,OP_EQ, buf_find_string_offset(buf, "string.", 7));
+ tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "shrdlu", 6));
+ tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "Testing thing", 13));
+ tt_int_op(-1,OP_EQ, buf_find_string_offset(buf, "ngx", 3));
buf_free(buf);
buf = NULL;
@@ -183,7 +183,7 @@ test_buffers_basic(void *arg)
write_to_buf(cp, 65536, buf);
tor_free(cp);
- tt_int_op(buf_datalen(buf), ==, 65536);
+ tt_int_op(buf_datalen(buf), OP_EQ, 65536);
buf_free(buf);
buf = NULL;
}
@@ -213,19 +213,19 @@ test_buffer_pullup(void *arg)
buf = buf_new_with_capacity(3000); /* rounds up to next power of 2. */
tt_assert(buf);
- tt_int_op(buf_get_default_chunk_size(buf), ==, 4096);
+ tt_int_op(buf_get_default_chunk_size(buf), OP_EQ, 4096);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
/* There are a bunch of cases for pullup. One is the trivial case. Let's
mess around with an empty buffer. */
buf_pullup(buf, 16, 1);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, ==, NULL);
- tt_uint_op(sz, ==, 0);
+ tt_ptr_op(cp, OP_EQ, NULL);
+ tt_uint_op(sz, OP_EQ, 0);
/* Let's make sure nothing got allocated */
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
/* Case 1: everything puts into the first chunk with some moving. */
@@ -234,22 +234,22 @@ test_buffer_pullup(void *arg)
write_to_buf(stuff, 3000, buf);
write_to_buf(stuff+3000, 3000, buf);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, !=, NULL);
- tt_int_op(sz, <=, 4096);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_int_op(sz, OP_LE, 4096);
/* Make room for 3000 bytes in the first chunk, so that the pullup-move code
* can get tested. */
- tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 3000);
- tt_mem_op(tmp,==, stuff, 3000);
+ tt_int_op(fetch_from_buf(tmp, 3000, buf), OP_EQ, 3000);
+ tt_mem_op(tmp,OP_EQ, stuff, 3000);
buf_pullup(buf, 2048, 0);
assert_buf_ok(buf);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, !=, NULL);
- tt_int_op(sz, >=, 2048);
- tt_mem_op(cp,==, stuff+3000, 2048);
- tt_int_op(3000, ==, buf_datalen(buf));
- tt_int_op(fetch_from_buf(tmp, 3000, buf), ==, 0);
- tt_mem_op(tmp,==, stuff+3000, 2048);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_int_op(sz, OP_GE, 2048);
+ tt_mem_op(cp,OP_EQ, stuff+3000, 2048);
+ tt_int_op(3000, OP_EQ, buf_datalen(buf));
+ tt_int_op(fetch_from_buf(tmp, 3000, buf), OP_EQ, 0);
+ tt_mem_op(tmp,OP_EQ, stuff+3000, 2048);
buf_free(buf);
@@ -259,26 +259,26 @@ test_buffer_pullup(void *arg)
write_to_buf(stuff+4000, 4000, buf);
write_to_buf(stuff+8000, 4000, buf);
write_to_buf(stuff+12000, 4000, buf);
- tt_int_op(buf_datalen(buf), ==, 16000);
+ tt_int_op(buf_datalen(buf), OP_EQ, 16000);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, !=, NULL);
- tt_int_op(sz, <=, 4096);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_int_op(sz, OP_LE, 4096);
buf_pullup(buf, 12500, 0);
assert_buf_ok(buf);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, !=, NULL);
- tt_int_op(sz, >=, 12500);
- tt_mem_op(cp,==, stuff, 12500);
- tt_int_op(buf_datalen(buf), ==, 16000);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_int_op(sz, OP_GE, 12500);
+ tt_mem_op(cp,OP_EQ, stuff, 12500);
+ tt_int_op(buf_datalen(buf), OP_EQ, 16000);
fetch_from_buf(tmp, 12400, buf);
- tt_mem_op(tmp,==, stuff, 12400);
- tt_int_op(buf_datalen(buf), ==, 3600);
+ tt_mem_op(tmp,OP_EQ, stuff, 12400);
+ tt_int_op(buf_datalen(buf), OP_EQ, 3600);
fetch_from_buf(tmp, 3500, buf);
- tt_mem_op(tmp,==, stuff+12400, 3500);
+ tt_mem_op(tmp,OP_EQ, stuff+12400, 3500);
fetch_from_buf(tmp, 100, buf);
- tt_mem_op(tmp,==, stuff+15900, 10);
+ tt_mem_op(tmp,OP_EQ, stuff+15900, 10);
buf_free(buf);
@@ -290,16 +290,16 @@ test_buffer_pullup(void *arg)
buf_pullup(buf, 16000, 0); /* Way too much. */
assert_buf_ok(buf);
buf_get_first_chunk_data(buf, &cp, &sz);
- tt_ptr_op(cp, !=, NULL);
- tt_int_op(sz, ==, 7900);
- tt_mem_op(cp,==, stuff+100, 7900);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_int_op(sz, OP_EQ, 7900);
+ tt_mem_op(cp,OP_EQ, stuff+100, 7900);
buf_free(buf);
buf = NULL;
buf_shrink_freelists(1);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
done:
buf_free(buf);
buf_shrink_freelists(1);
@@ -321,31 +321,31 @@ test_buffer_copy(void *arg)
tt_assert(buf);
/* Copy an empty buffer. */
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf));
tt_assert(buf2);
- tt_int_op(0, ==, generic_buffer_len(buf2));
+ tt_int_op(0, OP_EQ, generic_buffer_len(buf2));
/* Now try with a short buffer. */
s = "And now comes an act of enormous enormance!";
len = strlen(s);
generic_buffer_add(buf, s, len);
- tt_int_op(len, ==, generic_buffer_len(buf));
+ tt_int_op(len, OP_EQ, generic_buffer_len(buf));
/* Add junk to buf2 so we can test replacing.*/
generic_buffer_add(buf2, "BLARG", 5);
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
+ tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, OP_EQ, generic_buffer_len(buf2));
generic_buffer_get(buf2, b, len);
- tt_mem_op(b, ==, s, len);
+ tt_mem_op(b, OP_EQ, s, len);
/* Now free buf2 and retry so we can test allocating */
generic_buffer_free(buf2);
buf2 = NULL;
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(len, ==, generic_buffer_len(buf2));
+ tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(len, OP_EQ, generic_buffer_len(buf2));
generic_buffer_get(buf2, b, len);
- tt_mem_op(b, ==, s, len);
+ tt_mem_op(b, OP_EQ, s, len);
/* Clear buf for next test */
generic_buffer_get(buf, b, len);
- tt_int_op(generic_buffer_len(buf),==,0);
+ tt_int_op(generic_buffer_len(buf),OP_EQ,0);
/* Okay, now let's try a bigger buffer. */
s = "Quis autem vel eum iure reprehenderit qui in ea voluptate velit "
@@ -357,12 +357,12 @@ test_buffer_copy(void *arg)
generic_buffer_add(buf, b, 1);
generic_buffer_add(buf, s, len);
}
- tt_int_op(0, ==, generic_buffer_set_to_copy(&buf2, buf));
- tt_int_op(generic_buffer_len(buf2), ==, generic_buffer_len(buf));
+ tt_int_op(0, OP_EQ, generic_buffer_set_to_copy(&buf2, buf));
+ tt_int_op(generic_buffer_len(buf2), OP_EQ, generic_buffer_len(buf));
for (i = 0; i < 256; ++i) {
generic_buffer_get(buf2, b, len+1);
- tt_int_op((unsigned char)b[0],==,i);
- tt_mem_op(b+1, ==, s, len);
+ tt_int_op((unsigned char)b[0],OP_EQ,i);
+ tt_mem_op(b+1, OP_EQ, s, len);
}
done:
@@ -382,62 +382,62 @@ test_buffer_ext_or_cmd(void *arg)
(void) arg;
/* Empty -- should give "not there. */
- tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, ==, cmd);
+ tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_EQ, cmd);
/* Three bytes: shouldn't work. */
generic_buffer_add(buf, "\x00\x20\x00", 3);
- tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, ==, cmd);
- tt_int_op(3, ==, generic_buffer_len(buf));
+ tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_EQ, cmd);
+ tt_int_op(3, OP_EQ, generic_buffer_len(buf));
/* 0020 0000: That's a nil command. It should work. */
generic_buffer_add(buf, "\x00", 1);
- tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, !=, cmd);
- tt_int_op(0x20, ==, cmd->cmd);
- tt_int_op(0, ==, cmd->len);
- tt_int_op(0, ==, generic_buffer_len(buf));
+ tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_NE, cmd);
+ tt_int_op(0x20, OP_EQ, cmd->cmd);
+ tt_int_op(0, OP_EQ, cmd->len);
+ tt_int_op(0, OP_EQ, generic_buffer_len(buf));
ext_or_cmd_free(cmd);
cmd = NULL;
/* Now try a length-6 command with one byte missing. */
generic_buffer_add(buf, "\x10\x21\x00\x06""abcde", 9);
- tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, ==, cmd);
+ tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_EQ, cmd);
generic_buffer_add(buf, "f", 1);
- tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, !=, cmd);
- tt_int_op(0x1021, ==, cmd->cmd);
- tt_int_op(6, ==, cmd->len);
- tt_mem_op("abcdef", ==, cmd->body, 6);
- tt_int_op(0, ==, generic_buffer_len(buf));
+ tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_NE, cmd);
+ tt_int_op(0x1021, OP_EQ, cmd->cmd);
+ tt_int_op(6, OP_EQ, cmd->len);
+ tt_mem_op("abcdef", OP_EQ, cmd->body, 6);
+ tt_int_op(0, OP_EQ, generic_buffer_len(buf));
ext_or_cmd_free(cmd);
cmd = NULL;
/* Now try a length-10 command with 4 extra bytes. */
generic_buffer_add(buf, "\xff\xff\x00\x0a"
"loremipsum\x10\x00\xff\xff", 18);
- tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, !=, cmd);
- tt_int_op(0xffff, ==, cmd->cmd);
- tt_int_op(10, ==, cmd->len);
- tt_mem_op("loremipsum", ==, cmd->body, 10);
- tt_int_op(4, ==, generic_buffer_len(buf));
+ tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_NE, cmd);
+ tt_int_op(0xffff, OP_EQ, cmd->cmd);
+ tt_int_op(10, OP_EQ, cmd->len);
+ tt_mem_op("loremipsum", OP_EQ, cmd->body, 10);
+ tt_int_op(4, OP_EQ, generic_buffer_len(buf));
ext_or_cmd_free(cmd);
cmd = NULL;
/* Finally, let's try a maximum-length command. We already have the header
* waiting. */
- tt_int_op(0, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_int_op(0, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
tmp = tor_malloc_zero(65535);
generic_buffer_add(buf, tmp, 65535);
- tt_int_op(1, ==, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
- tt_ptr_op(NULL, !=, cmd);
- tt_int_op(0x1000, ==, cmd->cmd);
- tt_int_op(0xffff, ==, cmd->len);
- tt_mem_op(tmp, ==, cmd->body, 65535);
- tt_int_op(0, ==, generic_buffer_len(buf));
+ tt_int_op(1, OP_EQ, generic_buffer_fetch_ext_or_cmd(buf, &cmd));
+ tt_ptr_op(NULL, OP_NE, cmd);
+ tt_int_op(0x1000, OP_EQ, cmd->cmd);
+ tt_int_op(0xffff, OP_EQ, cmd->len);
+ tt_mem_op(tmp, OP_EQ, cmd->body, 65535);
+ tt_int_op(0, OP_EQ, generic_buffer_len(buf));
ext_or_cmd_free(cmd);
cmd = NULL;
@@ -458,65 +458,66 @@ test_buffer_allocation_tracking(void *arg)
(void)arg;
crypto_rand(junk, 16384);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
buf1 = buf_new();
tt_assert(buf1);
buf2 = buf_new();
tt_assert(buf2);
- tt_int_op(buf_allocation(buf1), ==, 0);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_allocation(buf1), OP_EQ, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
write_to_buf(junk, 4000, buf1);
write_to_buf(junk, 4000, buf1);
write_to_buf(junk, 4000, buf1);
write_to_buf(junk, 4000, buf1);
- tt_int_op(buf_allocation(buf1), ==, 16384);
+ tt_int_op(buf_allocation(buf1), OP_EQ, 16384);
fetch_from_buf(junk, 100, buf1);
- tt_int_op(buf_allocation(buf1), ==, 16384); /* still 4 4k chunks */
+ tt_int_op(buf_allocation(buf1), OP_EQ, 16384); /* still 4 4k chunks */
- tt_int_op(buf_get_total_allocation(), ==, 16384);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 16384);
fetch_from_buf(junk, 4096, buf1); /* drop a 1k chunk... */
- tt_int_op(buf_allocation(buf1), ==, 3*4096); /* now 3 4k chunks */
+ tt_int_op(buf_allocation(buf1), OP_EQ, 3*4096); /* now 3 4k chunks */
#ifdef ENABLE_BUF_FREELISTS
- tt_int_op(buf_get_total_allocation(), ==, 16384); /* that chunk went onto
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 16384); /* that chunk went onto
the freelist. */
#else
- tt_int_op(buf_get_total_allocation(), ==, 12288); /* that chunk was really
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 12288); /* that chunk was really
freed. */
#endif
write_to_buf(junk, 4000, buf2);
- tt_int_op(buf_allocation(buf2), ==, 4096); /* another 4k chunk. */
+ tt_int_op(buf_allocation(buf2), OP_EQ, 4096); /* another 4k chunk. */
/*
* If we're using freelists, size stays at 16384 because we just pulled a
* chunk from the freelist. If we aren't, we bounce back up to 16384 by
* allocating a new chunk.
*/
- tt_int_op(buf_get_total_allocation(), ==, 16384);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 16384);
write_to_buf(junk, 4000, buf2);
- tt_int_op(buf_allocation(buf2), ==, 8192); /* another 4k chunk. */
- tt_int_op(buf_get_total_allocation(), ==, 5*4096); /* that chunk was new. */
+ tt_int_op(buf_allocation(buf2), OP_EQ, 8192); /* another 4k chunk. */
+ tt_int_op(buf_get_total_allocation(),
+ OP_EQ, 5*4096); /* that chunk was new. */
/* Make a really huge buffer */
for (i = 0; i < 1000; ++i) {
write_to_buf(junk, 4000, buf2);
}
- tt_int_op(buf_allocation(buf2), >=, 4008000);
- tt_int_op(buf_get_total_allocation(), >=, 4008000);
+ tt_int_op(buf_allocation(buf2), OP_GE, 4008000);
+ tt_int_op(buf_get_total_allocation(), OP_GE, 4008000);
buf_free(buf2);
buf2 = NULL;
- tt_int_op(buf_get_total_allocation(), <, 4008000);
+ tt_int_op(buf_get_total_allocation(), OP_LT, 4008000);
buf_shrink_freelists(1);
- tt_int_op(buf_get_total_allocation(), ==, buf_allocation(buf1));
+ tt_int_op(buf_get_total_allocation(), OP_EQ, buf_allocation(buf1));
buf_free(buf1);
buf1 = NULL;
buf_shrink_freelists(1);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
done:
buf_free(buf1);
@@ -545,37 +546,38 @@ test_buffer_time_tracking(void *arg)
tt_assert(buf);
/* Empty buffer means the timestamp is 0. */
- tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC));
- tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
+ tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC));
+ tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
tor_gettimeofday_cache_set(&tv0);
write_to_buf("ABCDEFG", 7, buf);
- tt_int_op(1000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
+ tt_int_op(1000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+1000));
buf2 = buf_copy(buf);
tt_assert(buf2);
- tt_int_op(1234, ==, buf_get_oldest_chunk_timestamp(buf2, START_MSEC+1234));
+ tt_int_op(1234, OP_EQ,
+ buf_get_oldest_chunk_timestamp(buf2, START_MSEC+1234));
/* Now add more bytes; enough to overflow the first chunk. */
tv0.tv_usec += 123 * 1000;
tor_gettimeofday_cache_set(&tv0);
for (i = 0; i < 600; ++i)
write_to_buf("ABCDEFG", 7, buf);
- tt_int_op(4207, ==, buf_datalen(buf));
+ tt_int_op(4207, OP_EQ, buf_datalen(buf));
/* The oldest bytes are still in the front. */
- tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
+ tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
/* Once those bytes are dropped, the chunk is still on the first
* timestamp. */
fetch_from_buf(tmp, 100, buf);
- tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
+ tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2000));
/* But once we discard the whole first chunk, we get the data in the second
* chunk. */
fetch_from_buf(tmp, 4000, buf);
- tt_int_op(107, ==, buf_datalen(buf));
- tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
+ tt_int_op(107, OP_EQ, buf_datalen(buf));
+ tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
/* This time we'll be grabbing a chunk from the freelist, and making sure
its time gets updated */
@@ -584,13 +586,13 @@ test_buffer_time_tracking(void *arg)
tor_gettimeofday_cache_set(&tv0);
for (i = 0; i < 600; ++i)
write_to_buf("ABCDEFG", 7, buf);
- tt_int_op(4307, ==, buf_datalen(buf));
+ tt_int_op(4307, OP_EQ, buf_datalen(buf));
- tt_int_op(2000, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
+ tt_int_op(2000, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+2123));
fetch_from_buf(tmp, 4000, buf);
fetch_from_buf(tmp, 306, buf);
- tt_int_op(0, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+5617));
- tt_int_op(383, ==, buf_get_oldest_chunk_timestamp(buf, START_MSEC+6000));
+ tt_int_op(0, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+5617));
+ tt_int_op(383, OP_EQ, buf_get_oldest_chunk_timestamp(buf, START_MSEC+6000));
done:
buf_free(buf);
@@ -609,35 +611,35 @@ test_buffers_zlib_impl(int finalize_with_nil)
int done;
buf = buf_new_with_capacity(128); /* will round up */
- zlib_state = tor_zlib_new(1, ZLIB_METHOD);
+ zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
msg = tor_malloc(512);
crypto_rand(msg, 512);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), ==, 0);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), ==, 0);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), ==, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg, 128, 0), OP_EQ, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+128, 128, 0), OP_EQ, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, msg+256, 256, 0), OP_EQ, 0);
done = !finalize_with_nil;
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), ==, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "all done", 9, done), OP_EQ, 0);
if (finalize_with_nil) {
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0);
}
in_len = buf_datalen(buf);
contents = tor_malloc(in_len);
- tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0);
+ tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
- tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len,
+ tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len,
contents, in_len,
ZLIB_METHOD, 1,
LOG_WARN));
- tt_int_op(out_len, >=, 128);
- tt_mem_op(msg, ==, expanded, 128);
- tt_int_op(out_len, >=, 512);
- tt_mem_op(msg, ==, expanded, 512);
- tt_int_op(out_len, ==, 512+9);
- tt_mem_op("all done", ==, expanded+512, 9);
+ tt_int_op(out_len, OP_GE, 128);
+ tt_mem_op(msg, OP_EQ, expanded, 128);
+ tt_int_op(out_len, OP_GE, 512);
+ tt_mem_op(msg, OP_EQ, expanded, 512);
+ tt_int_op(out_len, OP_EQ, 512+9);
+ tt_mem_op("all done", OP_EQ, expanded+512, 9);
done:
buf_free(buf);
@@ -680,28 +682,28 @@ test_buffers_zlib_fin_at_chunk_end(void *arg)
tt_assert(buf->head);
/* Fill up the chunk so the zlib stuff won't fit in one chunk. */
- tt_uint_op(buf->head->memlen, <, sz);
+ tt_uint_op(buf->head->memlen, OP_LT, sz);
headerjunk = buf->head->memlen - 7;
write_to_buf(msg, headerjunk-1, buf);
- tt_uint_op(buf->head->datalen, ==, headerjunk);
- tt_uint_op(buf_datalen(buf), ==, headerjunk);
+ tt_uint_op(buf->head->datalen, OP_EQ, headerjunk);
+ tt_uint_op(buf_datalen(buf), OP_EQ, headerjunk);
/* Write an empty string, with finalization on. */
- zlib_state = tor_zlib_new(1, ZLIB_METHOD);
- tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), ==, 0);
+ zlib_state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
+ tt_int_op(write_to_buf_zlib(buf, zlib_state, "", 0, 1), OP_EQ, 0);
in_len = buf_datalen(buf);
contents = tor_malloc(in_len);
- tt_int_op(fetch_from_buf(contents, in_len, buf), ==, 0);
+ tt_int_op(fetch_from_buf(contents, in_len, buf), OP_EQ, 0);
- tt_uint_op(in_len, >, headerjunk);
+ tt_uint_op(in_len, OP_GT, headerjunk);
- tt_int_op(0, ==, tor_gzip_uncompress(&expanded, &out_len,
+ tt_int_op(0, OP_EQ, tor_gzip_uncompress(&expanded, &out_len,
contents + headerjunk, in_len - headerjunk,
ZLIB_METHOD, 1,
LOG_WARN));
- tt_int_op(out_len, ==, 0);
+ tt_int_op(out_len, OP_EQ, 0);
tt_assert(expanded);
done:
diff --git a/src/test/test_cell_formats.c b/src/test/test_cell_formats.c
index 19ecedc8ac..e86dc0934f 100644
--- a/src/test/test_cell_formats.c
+++ b/src/test/test_cell_formats.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -30,16 +30,16 @@ test_cfmt_relay_header(void *arg)
uint8_t hdr_out[RELAY_HEADER_SIZE];
(void)arg;
- tt_int_op(sizeof(hdr_1), ==, RELAY_HEADER_SIZE);
+ tt_int_op(sizeof(hdr_1), OP_EQ, RELAY_HEADER_SIZE);
relay_header_unpack(&rh, hdr_1);
- tt_int_op(rh.command, ==, 3);
- tt_int_op(rh.recognized, ==, 0);
- tt_int_op(rh.stream_id, ==, 0x2122);
- tt_mem_op(rh.integrity, ==, "ABCD", 4);
- tt_int_op(rh.length, ==, 0x103);
+ tt_int_op(rh.command, OP_EQ, 3);
+ tt_int_op(rh.recognized, OP_EQ, 0);
+ tt_int_op(rh.stream_id, OP_EQ, 0x2122);
+ tt_mem_op(rh.integrity, OP_EQ, "ABCD", 4);
+ tt_int_op(rh.length, OP_EQ, 0x103);
relay_header_pack(hdr_out, &rh);
- tt_mem_op(hdr_out, ==, hdr_1, RELAY_HEADER_SIZE);
+ tt_mem_op(hdr_out, OP_EQ, hdr_1, RELAY_HEADER_SIZE);
done:
;
@@ -74,32 +74,32 @@ test_cfmt_begin_cells(void *arg)
/* Try begindir. */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "", 0);
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_ptr_op(NULL, ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(0, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(1, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_ptr_op(NULL, OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(0, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(1, OP_EQ, bcell.is_begindir);
/* A Begindir with extra stuff. */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN_DIR, "12345", 5);
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_ptr_op(NULL, ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(0, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(1, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_ptr_op(NULL, OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(0, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(1, OP_EQ, bcell.is_begindir);
/* A short but valid begin cell */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:9", 6);
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("a.b", ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(9, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("a.b", OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(9, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* A significantly loner begin cell */
@@ -108,35 +108,35 @@ test_cfmt_begin_cells(void *arg)
const char c[] = "here-is-a-nice-long.hostname.com:65535";
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, strlen(c)+1);
}
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("here-is-a-nice-long.hostname.com", ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(65535, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("here-is-a-nice-long.hostname.com", OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(65535, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* An IPv4 begin cell. */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "18.9.22.169:80", 15);
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("18.9.22.169", ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(80, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("18.9.22.169", OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(80, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* An IPv6 begin cell. Let's make sure we handle colons*/
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN,
"[2620::6b0:b:1a1a:0:26e5:480e]:80", 34);
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(80, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("[2620::6b0:b:1a1a:0:26e5:480e]", OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(80, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* a begin cell with extra junk but not enough for flags. */
@@ -145,12 +145,12 @@ test_cfmt_begin_cells(void *arg)
const char c[] = "another.example.com:80\x00\x01\x02";
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1);
}
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("another.example.com", ==, bcell.address);
- tt_int_op(0, ==, bcell.flags);
- tt_int_op(80, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("another.example.com", OP_EQ, bcell.address);
+ tt_int_op(0, OP_EQ, bcell.flags);
+ tt_int_op(80, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* a begin cell with flags. */
@@ -159,12 +159,12 @@ test_cfmt_begin_cells(void *arg)
const char c[] = "another.example.com:443\x00\x01\x02\x03\x04";
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1);
}
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("another.example.com", ==, bcell.address);
- tt_int_op(0x1020304, ==, bcell.flags);
- tt_int_op(443, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("another.example.com", OP_EQ, bcell.address);
+ tt_int_op(0x1020304, OP_EQ, bcell.flags);
+ tt_int_op(443, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* a begin cell with flags and even more cruft after that. */
@@ -173,12 +173,12 @@ test_cfmt_begin_cells(void *arg)
const char c[] = "a-further.example.com:22\x00\xee\xaa\x00\xffHi mom";
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, c, sizeof(c)-1);
}
- tt_int_op(0, ==, begin_cell_parse(&cell, &bcell, &end_reason));
- tt_str_op("a-further.example.com", ==, bcell.address);
- tt_int_op(0xeeaa00ff, ==, bcell.flags);
- tt_int_op(22, ==, bcell.port);
- tt_int_op(5, ==, bcell.stream_id);
- tt_int_op(0, ==, bcell.is_begindir);
+ tt_int_op(0, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_str_op("a-further.example.com", OP_EQ, bcell.address);
+ tt_int_op(0xeeaa00ff, OP_EQ, bcell.flags);
+ tt_int_op(22, OP_EQ, bcell.port);
+ tt_int_op(5, OP_EQ, bcell.stream_id);
+ tt_int_op(0, OP_EQ, bcell.is_begindir);
tor_free(bcell.address);
/* bad begin cell: impossible length. */
@@ -189,42 +189,42 @@ test_cfmt_begin_cells(void *arg)
{
relay_header_t rh;
relay_header_unpack(&rh, cell.payload);
- tt_int_op(rh.length, ==, 510);
+ tt_int_op(rh.length, OP_EQ, 510);
}
- tt_int_op(-2, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-2, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* Bad begin cell: no body. */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* bad begin cell: no body. */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "", 0);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* bad begin cell: no colon */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b", 4);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* bad begin cell: no ports */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:", 5);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* bad begin cell: bad port */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:xyz", 8);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:100000", 11);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
/* bad begin cell: no nul */
memset(&bcell, 0x7f, sizeof(bcell));
make_relay_cell(&cell, RELAY_COMMAND_BEGIN, "a.b:80", 6);
- tt_int_op(-1, ==, begin_cell_parse(&cell, &bcell, &end_reason));
+ tt_int_op(-1, OP_EQ, begin_cell_parse(&cell, &bcell, &end_reason));
done:
tor_free(bcell.address);
@@ -244,47 +244,47 @@ test_cfmt_connected_cells(void *arg)
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "", 0);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_UNSPEC);
- tt_int_op(ttl, ==, -1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_UNSPEC);
+ tt_int_op(ttl, OP_EQ, -1);
/* A slightly less oldschool one: only an IPv4 address */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x20\x30\x40\x50", 4);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET);
- tt_str_op(fmt_addr(&addr), ==, "32.48.64.80");
- tt_int_op(ttl, ==, -1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "32.48.64.80");
+ tt_int_op(ttl, OP_EQ, -1);
/* Bogus but understandable: truncated TTL */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED, "\x11\x12\x13\x14\x15", 5);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET);
- tt_str_op(fmt_addr(&addr), ==, "17.18.19.20");
- tt_int_op(ttl, ==, -1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "17.18.19.20");
+ tt_int_op(ttl, OP_EQ, -1);
/* Regular IPv4 one: address and TTL */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
"\x02\x03\x04\x05\x00\x00\x0e\x10", 8);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET);
- tt_str_op(fmt_addr(&addr), ==, "2.3.4.5");
- tt_int_op(ttl, ==, 3600);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5");
+ tt_int_op(ttl, OP_EQ, 3600);
/* IPv4 with too-big TTL */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
"\x02\x03\x04\x05\xf0\x00\x00\x00", 8);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET);
- tt_str_op(fmt_addr(&addr), ==, "2.3.4.5");
- tt_int_op(ttl, ==, -1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "2.3.4.5");
+ tt_int_op(ttl, OP_EQ, -1);
/* IPv6 (ttl is mandatory) */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
@@ -294,10 +294,10 @@ test_cfmt_connected_cells(void *arg)
"\x00\x00\x02\x58", 25);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET6);
- tt_str_op(fmt_addr(&addr), ==, "2607:f8b0:400c:c02::68");
- tt_int_op(ttl, ==, 600);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68");
+ tt_int_op(ttl, OP_EQ, 600);
/* IPv6 (ttl too big) */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
@@ -307,17 +307,17 @@ test_cfmt_connected_cells(void *arg)
"\x90\x00\x02\x58", 25);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET6);
- tt_str_op(fmt_addr(&addr), ==, "2607:f8b0:400c:c02::68");
- tt_int_op(ttl, ==, -1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "2607:f8b0:400c:c02::68");
+ tt_int_op(ttl, OP_EQ, -1);
/* Bogus size: 3. */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
"\x00\x01\x02", 3);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Bogus family: 7. */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
@@ -327,7 +327,7 @@ test_cfmt_connected_cells(void *arg)
"\x90\x00\x02\x58", 25);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Truncated IPv6. */
make_relay_cell(&cell, RELAY_COMMAND_CONNECTED,
@@ -337,7 +337,7 @@ test_cfmt_connected_cells(void *arg)
"\x00\x00\x02", 24);
relay_header_unpack(&rh, cell.payload);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
/* Now make sure we can generate connected cells correctly. */
/* Try an IPv4 address */
@@ -346,16 +346,16 @@ test_cfmt_connected_cells(void *arg)
tor_addr_parse(&addr, "30.40.50.60");
rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE,
&addr, 128);
- tt_int_op(rh.length, ==, 8);
+ tt_int_op(rh.length, OP_EQ, 8);
test_memeq_hex(cell.payload+RELAY_HEADER_SIZE, "1e28323c" "00000080");
/* Try parsing it. */
tor_addr_make_unspec(&addr);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET);
- tt_str_op(fmt_addr(&addr), ==, "30.40.50.60");
- tt_int_op(ttl, ==, 128);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "30.40.50.60");
+ tt_int_op(ttl, OP_EQ, 128);
/* Try an IPv6 address */
memset(&rh, 0, sizeof(rh));
@@ -363,7 +363,7 @@ test_cfmt_connected_cells(void *arg)
tor_addr_parse(&addr, "2620::6b0:b:1a1a:0:26e5:480e");
rh.length = connected_cell_format_payload(cell.payload+RELAY_HEADER_SIZE,
&addr, 3600);
- tt_int_op(rh.length, ==, 25);
+ tt_int_op(rh.length, OP_EQ, 25);
test_memeq_hex(cell.payload + RELAY_HEADER_SIZE,
"00000000" "06"
"2620000006b0000b1a1a000026e5480e" "00000e10");
@@ -371,10 +371,10 @@ test_cfmt_connected_cells(void *arg)
/* Try parsing it. */
tor_addr_make_unspec(&addr);
r = connected_cell_parse(&rh, &cell, &addr, &ttl);
- tt_int_op(r, ==, 0);
- tt_int_op(tor_addr_family(&addr), ==, AF_INET6);
- tt_str_op(fmt_addr(&addr), ==, "2620:0:6b0:b:1a1a:0:26e5:480e");
- tt_int_op(ttl, ==, 3600);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(tor_addr_family(&addr), OP_EQ, AF_INET6);
+ tt_str_op(fmt_addr(&addr), OP_EQ, "2620:0:6b0:b:1a1a:0:26e5:480e");
+ tt_int_op(ttl, OP_EQ, 3600);
done:
tor_free(mem_op_hex_tmp);
@@ -398,14 +398,14 @@ test_cfmt_create_cells(void *arg)
crypto_rand((char*)b, TAP_ONIONSKIN_CHALLENGE_LEN);
cell.command = CELL_CREATE;
memcpy(cell.payload, b, TAP_ONIONSKIN_CHALLENGE_LEN);
- tt_int_op(0, ==, create_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATE, ==, cc.cell_type);
- tt_int_op(ONION_HANDSHAKE_TYPE_TAP, ==, cc.handshake_type);
- tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10);
- tt_int_op(0, ==, create_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type);
+ tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type);
+ tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10);
+ tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A valid create_fast cell. */
memset(&cell, 0, sizeof(cell));
@@ -413,14 +413,14 @@ test_cfmt_create_cells(void *arg)
crypto_rand((char*)b, CREATE_FAST_LEN);
cell.command = CELL_CREATE_FAST;
memcpy(cell.payload, b, CREATE_FAST_LEN);
- tt_int_op(0, ==, create_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATE_FAST, ==, cc.cell_type);
- tt_int_op(ONION_HANDSHAKE_TYPE_FAST, ==, cc.handshake_type);
- tt_int_op(CREATE_FAST_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.onionskin,==, b, CREATE_FAST_LEN + 10);
- tt_int_op(0, ==, create_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATE_FAST, OP_EQ, cc.cell_type);
+ tt_int_op(ONION_HANDSHAKE_TYPE_FAST, OP_EQ, cc.handshake_type);
+ tt_int_op(CREATE_FAST_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.onionskin,OP_EQ, b, CREATE_FAST_LEN + 10);
+ tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A valid create2 cell with a TAP payload */
memset(&cell, 0, sizeof(cell));
@@ -429,14 +429,14 @@ test_cfmt_create_cells(void *arg)
cell.command = CELL_CREATE2;
memcpy(cell.payload, "\x00\x00\x00\xBA", 4); /* TAP, 186 bytes long */
memcpy(cell.payload+4, b, TAP_ONIONSKIN_CHALLENGE_LEN);
- tt_int_op(0, ==, create_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATE2, ==, cc.cell_type);
- tt_int_op(ONION_HANDSHAKE_TYPE_TAP, ==, cc.handshake_type);
- tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10);
- tt_int_op(0, ==, create_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type);
+ tt_int_op(ONION_HANDSHAKE_TYPE_TAP, OP_EQ, cc.handshake_type);
+ tt_int_op(TAP_ONIONSKIN_CHALLENGE_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN + 10);
+ tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A valid create2 cell with an ntor payload */
memset(&cell, 0, sizeof(cell));
@@ -445,14 +445,14 @@ test_cfmt_create_cells(void *arg)
cell.command = CELL_CREATE2;
memcpy(cell.payload, "\x00\x02\x00\x54", 4); /* ntor, 84 bytes long */
memcpy(cell.payload+4, b, NTOR_ONIONSKIN_LEN);
- tt_int_op(0, ==, create_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATE2, ==, cc.cell_type);
- tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, ==, cc.handshake_type);
- tt_int_op(NTOR_ONIONSKIN_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.onionskin,==, b, NTOR_ONIONSKIN_LEN + 10);
- tt_int_op(0, ==, create_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATE2, OP_EQ, cc.cell_type);
+ tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type);
+ tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10);
+ tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A valid create cell with an ntor payload, in legacy format. */
memset(&cell, 0, sizeof(cell));
@@ -461,38 +461,38 @@ test_cfmt_create_cells(void *arg)
cell.command = CELL_CREATE;
memcpy(cell.payload, "ntorNTORntorNTOR", 16);
memcpy(cell.payload+16, b, NTOR_ONIONSKIN_LEN);
- tt_int_op(0, ==, create_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATE, ==, cc.cell_type);
- tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, ==, cc.handshake_type);
- tt_int_op(NTOR_ONIONSKIN_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.onionskin,==, b, NTOR_ONIONSKIN_LEN + 10);
- tt_int_op(0, ==, create_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATE, OP_EQ, cc.cell_type);
+ tt_int_op(ONION_HANDSHAKE_TYPE_NTOR, OP_EQ, cc.handshake_type);
+ tt_int_op(NTOR_ONIONSKIN_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN + 10);
+ tt_int_op(0, OP_EQ, create_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* == Okay, now let's try to parse some impossible stuff. */
/* It has to be some kind of a create cell! */
cell.command = CELL_CREATED;
- tt_int_op(-1, ==, create_cell_parse(&cc, &cell));
+ tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell));
/* You can't acutally make an unparseable CREATE or CREATE_FAST cell. */
/* Try some CREATE2 cells. First with a bad type. */
cell.command = CELL_CREATE2;
memcpy(cell.payload, "\x00\x50\x00\x99", 4); /* Type 0x50???? */
- tt_int_op(-1, ==, create_cell_parse(&cc, &cell));
+ tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell));
/* Now a good type with an incorrect length. */
memcpy(cell.payload, "\x00\x00\x00\xBC", 4); /* TAP, 187 bytes.*/
- tt_int_op(-1, ==, create_cell_parse(&cc, &cell));
+ tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell));
/* Now a good type with a ridiculous length. */
memcpy(cell.payload, "\x00\x00\x02\x00", 4); /* TAP, 512 bytes.*/
- tt_int_op(-1, ==, create_cell_parse(&cc, &cell));
+ tt_int_op(-1, OP_EQ, create_cell_parse(&cc, &cell));
/* == Time to try formatting bad cells. The important thing is that
we reject big lengths, so just check that for now. */
cc.handshake_len = 512;
- tt_int_op(-1, ==, create_cell_format(&cell2, &cc));
+ tt_int_op(-1, OP_EQ, create_cell_format(&cell2, &cc));
/* == Try formatting a create2 cell we don't understand. XXXX */
@@ -516,13 +516,13 @@ test_cfmt_created_cells(void *arg)
crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN);
cell.command = CELL_CREATED;
memcpy(cell.payload, b, TAP_ONIONSKIN_REPLY_LEN);
- tt_int_op(0, ==, created_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATED, ==, cc.cell_type);
- tt_int_op(TAP_ONIONSKIN_REPLY_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.reply,==, b, TAP_ONIONSKIN_REPLY_LEN + 10);
- tt_int_op(0, ==, created_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATED, OP_EQ, cc.cell_type);
+ tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN + 10);
+ tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A good CREATED_FAST cell */
memset(&cell, 0, sizeof(cell));
@@ -530,13 +530,13 @@ test_cfmt_created_cells(void *arg)
crypto_rand((char*)b, CREATED_FAST_LEN);
cell.command = CELL_CREATED_FAST;
memcpy(cell.payload, b, CREATED_FAST_LEN);
- tt_int_op(0, ==, created_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATED_FAST, ==, cc.cell_type);
- tt_int_op(CREATED_FAST_LEN, ==, cc.handshake_len);
- tt_mem_op(cc.reply,==, b, CREATED_FAST_LEN + 10);
- tt_int_op(0, ==, created_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATED_FAST, OP_EQ, cc.cell_type);
+ tt_int_op(CREATED_FAST_LEN, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.reply,OP_EQ, b, CREATED_FAST_LEN + 10);
+ tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A good CREATED2 cell with short reply */
memset(&cell, 0, sizeof(cell));
@@ -545,13 +545,13 @@ test_cfmt_created_cells(void *arg)
cell.command = CELL_CREATED2;
memcpy(cell.payload, "\x00\x40", 2);
memcpy(cell.payload+2, b, 64);
- tt_int_op(0, ==, created_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATED2, ==, cc.cell_type);
- tt_int_op(64, ==, cc.handshake_len);
- tt_mem_op(cc.reply,==, b, 80);
- tt_int_op(0, ==, created_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type);
+ tt_int_op(64, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.reply,OP_EQ, b, 80);
+ tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* A good CREATED2 cell with maximal reply */
memset(&cell, 0, sizeof(cell));
@@ -560,13 +560,13 @@ test_cfmt_created_cells(void *arg)
cell.command = CELL_CREATED2;
memcpy(cell.payload, "\x01\xF0", 2);
memcpy(cell.payload+2, b, 496);
- tt_int_op(0, ==, created_cell_parse(&cc, &cell));
- tt_int_op(CELL_CREATED2, ==, cc.cell_type);
- tt_int_op(496, ==, cc.handshake_len);
- tt_mem_op(cc.reply,==, b, 496);
- tt_int_op(0, ==, created_cell_format(&cell2, &cc));
- tt_int_op(cell.command, ==, cell2.command);
- tt_mem_op(cell.payload,==, cell2.payload, CELL_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, created_cell_parse(&cc, &cell));
+ tt_int_op(CELL_CREATED2, OP_EQ, cc.cell_type);
+ tt_int_op(496, OP_EQ, cc.handshake_len);
+ tt_mem_op(cc.reply,OP_EQ, b, 496);
+ tt_int_op(0, OP_EQ, created_cell_format(&cell2, &cc));
+ tt_int_op(cell.command, OP_EQ, cell2.command);
+ tt_mem_op(cell.payload,OP_EQ, cell2.payload, CELL_PAYLOAD_SIZE);
/* Bogus CREATED2 cell: too long! */
memset(&cell, 0, sizeof(cell));
@@ -574,11 +574,11 @@ test_cfmt_created_cells(void *arg)
crypto_rand((char*)b, 496);
cell.command = CELL_CREATED2;
memcpy(cell.payload, "\x01\xF1", 2);
- tt_int_op(-1, ==, created_cell_parse(&cc, &cell));
+ tt_int_op(-1, OP_EQ, created_cell_parse(&cc, &cell));
/* Unformattable CREATED2 cell: too long! */
cc.handshake_len = 497;
- tt_int_op(-1, ==, created_cell_format(&cell2, &cc));
+ tt_int_op(-1, OP_EQ, created_cell_format(&cell2, &cc));
done:
;
@@ -606,21 +606,21 @@ test_cfmt_extend_cells(void *arg)
memcpy(p, "\x12\xf4\x00\x01\x01\x02", 6); /* 18 244 0 1 : 258 */
memcpy(p+6,b,TAP_ONIONSKIN_CHALLENGE_LEN);
memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20);
- tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND,
+ tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND,
p, 26+TAP_ONIONSKIN_CHALLENGE_LEN));
- tt_int_op(RELAY_COMMAND_EXTEND, ==, ec.cell_type);
- tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr));
- tt_int_op(258, ==, ec.orport_ipv4.port);
- tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr));
- tt_mem_op(ec.node_id,==, "electroencephalogram", 20);
- tt_int_op(cc->cell_type, ==, CELL_CREATE);
- tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_TAP);
- tt_int_op(cc->handshake_len, ==, TAP_ONIONSKIN_CHALLENGE_LEN);
- tt_mem_op(cc->onionskin,==, b, TAP_ONIONSKIN_CHALLENGE_LEN+20);
- tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND);
- tt_int_op(p2_len, ==, 26+TAP_ONIONSKIN_CHALLENGE_LEN);
- tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE);
+ tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type);
+ tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr));
+ tt_int_op(258, OP_EQ, ec.orport_ipv4.port);
+ tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr));
+ tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE);
+ tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_TAP);
+ tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_CHALLENGE_LEN);
+ tt_mem_op(cc->onionskin,OP_EQ, b, TAP_ONIONSKIN_CHALLENGE_LEN+20);
+ tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND);
+ tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN);
+ tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE);
/* Let's do an ntor stuffed in a legacy EXTEND cell */
memset(p, 0, sizeof(p));
@@ -630,22 +630,22 @@ test_cfmt_extend_cells(void *arg)
memcpy(p+6,"ntorNTORntorNTOR", 16);
memcpy(p+22, b, NTOR_ONIONSKIN_LEN);
memcpy(p+6+TAP_ONIONSKIN_CHALLENGE_LEN, "electroencephalogram", 20);
- tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND,
+ tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND,
p, 26+TAP_ONIONSKIN_CHALLENGE_LEN));
- tt_int_op(RELAY_COMMAND_EXTEND, ==, ec.cell_type);
- tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr));
- tt_int_op(258, ==, ec.orport_ipv4.port);
- tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr));
- tt_mem_op(ec.node_id,==, "electroencephalogram", 20);
- tt_int_op(cc->cell_type, ==, CELL_CREATE2);
- tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_NTOR);
- tt_int_op(cc->handshake_len, ==, NTOR_ONIONSKIN_LEN);
- tt_mem_op(cc->onionskin,==, b, NTOR_ONIONSKIN_LEN+20);
- tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND);
- tt_int_op(p2_len, ==, 26+TAP_ONIONSKIN_CHALLENGE_LEN);
- tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE);
- tt_int_op(0, ==, create_cell_format_relayed(&cell, cc));
+ tt_int_op(RELAY_COMMAND_EXTEND, OP_EQ, ec.cell_type);
+ tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr));
+ tt_int_op(258, OP_EQ, ec.orport_ipv4.port);
+ tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr));
+ tt_mem_op(ec.node_id,OP_EQ, "electroencephalogram", 20);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2);
+ tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR);
+ tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN);
+ tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20);
+ tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND);
+ tt_int_op(p2_len, OP_EQ, 26+TAP_ONIONSKIN_CHALLENGE_LEN);
+ tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE);
+ tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc));
/* Now let's do a minimal ntor EXTEND2 cell. */
memset(&ec, 0xff, sizeof(ec));
@@ -659,21 +659,21 @@ test_cfmt_extend_cells(void *arg)
/* Prep for the handshake: type and length */
memcpy(p+31, "\x00\x02\x00\x54", 4);
memcpy(p+35, b, NTOR_ONIONSKIN_LEN);
- tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, 35+NTOR_ONIONSKIN_LEN));
- tt_int_op(RELAY_COMMAND_EXTEND2, ==, ec.cell_type);
- tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr));
- tt_int_op(61681, ==, ec.orport_ipv4.port);
- tt_int_op(AF_UNSPEC, ==, tor_addr_family(&ec.orport_ipv6.addr));
- tt_mem_op(ec.node_id,==, "anarchoindividualist", 20);
- tt_int_op(cc->cell_type, ==, CELL_CREATE2);
- tt_int_op(cc->handshake_type, ==, ONION_HANDSHAKE_TYPE_NTOR);
- tt_int_op(cc->handshake_len, ==, NTOR_ONIONSKIN_LEN);
- tt_mem_op(cc->onionskin,==, b, NTOR_ONIONSKIN_LEN+20);
- tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND2);
- tt_int_op(p2_len, ==, 35+NTOR_ONIONSKIN_LEN);
- tt_mem_op(p2,==, p, RELAY_PAYLOAD_SIZE);
+ tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type);
+ tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr));
+ tt_int_op(61681, OP_EQ, ec.orport_ipv4.port);
+ tt_int_op(AF_UNSPEC, OP_EQ, tor_addr_family(&ec.orport_ipv6.addr));
+ tt_mem_op(ec.node_id,OP_EQ, "anarchoindividualist", 20);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2);
+ tt_int_op(cc->handshake_type, OP_EQ, ONION_HANDSHAKE_TYPE_NTOR);
+ tt_int_op(cc->handshake_len, OP_EQ, NTOR_ONIONSKIN_LEN);
+ tt_mem_op(cc->onionskin,OP_EQ, b, NTOR_ONIONSKIN_LEN+20);
+ tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2);
+ tt_int_op(p2_len, OP_EQ, 35+NTOR_ONIONSKIN_LEN);
+ tt_mem_op(p2,OP_EQ, p, RELAY_PAYLOAD_SIZE);
/* Now let's do a fanciful EXTEND2 cell. */
memset(&ec, 0xff, sizeof(ec));
@@ -692,21 +692,21 @@ test_cfmt_extend_cells(void *arg)
/* Prep for the handshake: weird type and length */
memcpy(p+85, "\x01\x05\x00\x63", 4);
memcpy(p+89, b, 99);
- tt_int_op(0, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99));
- tt_int_op(RELAY_COMMAND_EXTEND2, ==, ec.cell_type);
- tt_str_op("18.244.0.1", ==, fmt_addr(&ec.orport_ipv4.addr));
- tt_int_op(61681, ==, ec.orport_ipv4.port);
- tt_str_op("2002::f0:c51e", ==, fmt_addr(&ec.orport_ipv6.addr));
- tt_int_op(4370, ==, ec.orport_ipv6.port);
- tt_mem_op(ec.node_id,==, "anthropomorphization", 20);
- tt_int_op(cc->cell_type, ==, CELL_CREATE2);
- tt_int_op(cc->handshake_type, ==, 0x105);
- tt_int_op(cc->handshake_len, ==, 99);
- tt_mem_op(cc->onionskin,==, b, 99+20);
- tt_int_op(0, ==, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(p2_cmd, ==, RELAY_COMMAND_EXTEND2);
+ tt_int_op(0, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2, p, 89+99));
+ tt_int_op(RELAY_COMMAND_EXTEND2, OP_EQ, ec.cell_type);
+ tt_str_op("18.244.0.1", OP_EQ, fmt_addr(&ec.orport_ipv4.addr));
+ tt_int_op(61681, OP_EQ, ec.orport_ipv4.port);
+ tt_str_op("2002::f0:c51e", OP_EQ, fmt_addr(&ec.orport_ipv6.addr));
+ tt_int_op(4370, OP_EQ, ec.orport_ipv6.port);
+ tt_mem_op(ec.node_id,OP_EQ, "anthropomorphization", 20);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATE2);
+ tt_int_op(cc->handshake_type, OP_EQ, 0x105);
+ tt_int_op(cc->handshake_len, OP_EQ, 99);
+ tt_mem_op(cc->onionskin,OP_EQ, b, 99+20);
+ tt_int_op(0, OP_EQ, extend_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(p2_cmd, OP_EQ, RELAY_COMMAND_EXTEND2);
/* We'll generate it minus the IPv6 address and minus the konami code */
- tt_int_op(p2_len, ==, 89+99-34-20);
+ tt_int_op(p2_len, OP_EQ, 89+99-34-20);
test_memeq_hex(p2,
/* Two items: one that same darn IP address. */
"02000612F40001F0F1"
@@ -714,8 +714,8 @@ test_cfmt_extend_cells(void *arg)
"0214616e7468726f706f6d6f727068697a6174696f6e"
/* Now the handshake prologue */
"01050063");
- tt_mem_op(p2+1+8+22+4,==, b, 99+20);
- tt_int_op(0, ==, create_cell_format_relayed(&cell, cc));
+ tt_mem_op(p2+1+8+22+4,OP_EQ, b, 99+20);
+ tt_int_op(0, OP_EQ, create_cell_format_relayed(&cell, cc));
/* == Now try parsing some junk */
@@ -724,7 +724,7 @@ test_cfmt_extend_cells(void *arg)
memcpy(p, "\x02\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9);
memcpy(p+9, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+31, "\xff\xff\x01\xd0", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* Try two identities. */
@@ -733,14 +733,14 @@ test_cfmt_extend_cells(void *arg)
memcpy(p+9, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+31, "\x02\x14" "autodepolymerization", 22);
memcpy(p+53, "\xff\xff\x00\x10", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* No identities. */
memset(p, 0, sizeof(p));
memcpy(p, "\x01\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9);
memcpy(p+53, "\xff\xff\x00\x10", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* Try a bad IPv4 address (too long, too short)*/
@@ -748,13 +748,13 @@ test_cfmt_extend_cells(void *arg)
memcpy(p, "\x02\x00\x07\x12\xf4\x00\x01\xf0\xf1\xff", 10);
memcpy(p+10, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+32, "\xff\xff\x00\x10", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
memset(p, 0, sizeof(p));
memcpy(p, "\x02\x00\x05\x12\xf4\x00\x01\xf0", 8);
memcpy(p+8, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+30, "\xff\xff\x00\x10", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* IPv6 address (too long, too short, no IPv4)*/
@@ -763,28 +763,28 @@ test_cfmt_extend_cells(void *arg)
memcpy(p+9, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+31, "\x01\x13" "xxxxxxxxxxxxxxxxYYZ", 19);
memcpy(p+50, "\xff\xff\x00\x20", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
memset(p, 0, sizeof(p));
memcpy(p, "\x03\x00\x06\x12\xf4\x00\x01\xf0\xf1", 9);
memcpy(p+9, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+31, "\x01\x11" "xxxxxxxxxxxxxxxxY", 17);
memcpy(p+48, "\xff\xff\x00\x20", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
memset(p, 0, sizeof(p));
memcpy(p, "\x02", 1);
memcpy(p+1, "\x02\x14" "anarchoindividualist", 22);
memcpy(p+23, "\x01\x12" "xxxxxxxxxxxxxxxxYY", 18);
memcpy(p+41, "\xff\xff\x00\x20", 4);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* Running out of space in specifiers */
memset(p,0,sizeof(p));
memcpy(p, "\x05\x0a\xff", 3);
memcpy(p+3+255, "\x0a\xff", 2);
- tt_int_op(-1, ==, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
+ tt_int_op(-1, OP_EQ, extend_cell_parse(&ec, RELAY_COMMAND_EXTEND2,
p, sizeof(p)));
/* Fuzz, because why not. */
@@ -823,16 +823,16 @@ test_cfmt_extended_cells(void *arg)
memset(b, 0, sizeof(b));
crypto_rand((char*)b, TAP_ONIONSKIN_REPLY_LEN);
memcpy(p,b,TAP_ONIONSKIN_REPLY_LEN);
- tt_int_op(0, ==, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p,
+ tt_int_op(0, OP_EQ, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED, p,
TAP_ONIONSKIN_REPLY_LEN));
- tt_int_op(RELAY_COMMAND_EXTENDED, ==, ec.cell_type);
- tt_int_op(cc->cell_type, ==, CELL_CREATED);
- tt_int_op(cc->handshake_len, ==, TAP_ONIONSKIN_REPLY_LEN);
- tt_mem_op(cc->reply,==, b, TAP_ONIONSKIN_REPLY_LEN);
- tt_int_op(0, ==, extended_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(RELAY_COMMAND_EXTENDED, ==, p2_cmd);
- tt_int_op(TAP_ONIONSKIN_REPLY_LEN, ==, p2_len);
- tt_mem_op(p2,==, p, sizeof(p2));
+ tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, ec.cell_type);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED);
+ tt_int_op(cc->handshake_len, OP_EQ, TAP_ONIONSKIN_REPLY_LEN);
+ tt_mem_op(cc->reply,OP_EQ, b, TAP_ONIONSKIN_REPLY_LEN);
+ tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(RELAY_COMMAND_EXTENDED, OP_EQ, p2_cmd);
+ tt_int_op(TAP_ONIONSKIN_REPLY_LEN, OP_EQ, p2_len);
+ tt_mem_op(p2,OP_EQ, p, sizeof(p2));
/* Try an EXTENDED2 cell */
memset(&ec, 0xff, sizeof(ec));
@@ -841,25 +841,26 @@ test_cfmt_extended_cells(void *arg)
crypto_rand((char*)b, 42);
memcpy(p,"\x00\x2a",2);
memcpy(p+2,b,42);
- tt_int_op(0, ==, extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42));
- tt_int_op(RELAY_COMMAND_EXTENDED2, ==, ec.cell_type);
- tt_int_op(cc->cell_type, ==, CELL_CREATED2);
- tt_int_op(cc->handshake_len, ==, 42);
- tt_mem_op(cc->reply,==, b, 42+10);
- tt_int_op(0, ==, extended_cell_format(&p2_cmd, &p2_len, p2, &ec));
- tt_int_op(RELAY_COMMAND_EXTENDED2, ==, p2_cmd);
- tt_int_op(2+42, ==, p2_len);
- tt_mem_op(p2,==, p, sizeof(p2));
+ tt_int_op(0, OP_EQ,
+ extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, 2+42));
+ tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, ec.cell_type);
+ tt_int_op(cc->cell_type, OP_EQ, CELL_CREATED2);
+ tt_int_op(cc->handshake_len, OP_EQ, 42);
+ tt_mem_op(cc->reply,OP_EQ, b, 42+10);
+ tt_int_op(0, OP_EQ, extended_cell_format(&p2_cmd, &p2_len, p2, &ec));
+ tt_int_op(RELAY_COMMAND_EXTENDED2, OP_EQ, p2_cmd);
+ tt_int_op(2+42, OP_EQ, p2_len);
+ tt_mem_op(p2,OP_EQ, p, sizeof(p2));
/* Try an almost-too-long EXTENDED2 cell */
memcpy(p, "\x01\xf0", 2);
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p)));
/* Now try a too-long extended2 cell. That's the only misparse I can think
* of. */
memcpy(p, "\x01\xf1", 2);
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
extended_cell_parse(&ec, RELAY_COMMAND_EXTENDED2, p, sizeof(p)));
done:
@@ -903,22 +904,22 @@ test_cfmt_resolved_cells(void *arg)
/* Let's try an empty cell */
SET_CELL("");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
CLEAR_ADDRS(); /* redundant but let's be consistent */
/* Cell with one ipv4 addr */
SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00");
- tt_int_op(rh.length, ==, 10);
+ tt_int_op(rh.length, OP_EQ, 10);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 1);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 1);
a = smartlist_get(addrs, 0);
- tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 256);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 256);
CLEAR_ADDRS();
/* Cell with one ipv6 addr */
@@ -926,30 +927,30 @@ test_cfmt_resolved_cells(void *arg)
"\x20\x02\x90\x90\x00\x00\x00\x00"
"\x00\x00\x00\x00\xf0\xf0\xab\xcd"
"\x02\00\x00\x01");
- tt_int_op(rh.length, ==, 22);
+ tt_int_op(rh.length, OP_EQ, 22);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 1);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 1);
a = smartlist_get(addrs, 0);
- tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 0x2000001);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 0x2000001);
CLEAR_ADDRS();
/* Cell with one hostname */
SET_CELL("\x00\x11"
"motherbrain.zebes"
"\x00\00\x00\x00");
- tt_int_op(rh.length, ==, 23);
+ tt_int_op(rh.length, OP_EQ, 23);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 1);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 1);
a = smartlist_get(addrs, 0);
tt_assert(tor_addr_is_null(&a->addr));
- tt_str_op(a->hostname, ==, "motherbrain.zebes");
- tt_int_op(a->ttl, ==, 0);
+ tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes");
+ tt_int_op(a->ttl, OP_EQ, 0);
CLEAR_ADDRS();
#define LONG_NAME \
@@ -958,51 +959,51 @@ test_cfmt_resolved_cells(void *arg)
"function-is-already-very-full.of-copy-and-pasted-stuff.having-this-app" \
"ear-more-than-once-would-bother-me-somehow.is"
- tt_int_op(strlen(LONG_NAME), ==, 255);
+ tt_int_op(strlen(LONG_NAME), OP_EQ, 255);
SET_CELL("\x00\xff"
LONG_NAME
"\x00\01\x00\x00");
- tt_int_op(rh.length, ==, 261);
+ tt_int_op(rh.length, OP_EQ, 261);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 1);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 1);
a = smartlist_get(addrs, 0);
tt_assert(tor_addr_is_null(&a->addr));
- tt_str_op(a->hostname, ==, LONG_NAME);
- tt_int_op(a->ttl, ==, 65536);
+ tt_str_op(a->hostname, OP_EQ, LONG_NAME);
+ tt_int_op(a->ttl, OP_EQ, 65536);
CLEAR_ADDRS();
/* Cells with an error */
SET_CELL("\xf0\x2b"
"I'm sorry, Dave. I'm afraid I can't do that"
"\x00\x11\x22\x33");
- tt_int_op(rh.length, ==, 49);
+ tt_int_op(rh.length, OP_EQ, 49);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR_TRANSIENT);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR_TRANSIENT);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
CLEAR_ADDRS();
SET_CELL("\xf1\x40"
"This hostname is too important for me to allow you to resolve it"
"\x00\x00\x00\x00");
- tt_int_op(rh.length, ==, 70);
+ tt_int_op(rh.length, OP_EQ, 70);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, RESOLVED_TYPE_ERROR);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, RESOLVED_TYPE_ERROR);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
CLEAR_ADDRS();
/* Cell with an unrecognized type */
SET_CELL("\xee\x16"
"fault in the AE35 unit"
"\x09\x09\x01\x01");
- tt_int_op(rh.length, ==, 28);
+ tt_int_op(rh.length, OP_EQ, 28);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
CLEAR_ADDRS();
/* Cell with one of each */
@@ -1027,21 +1028,21 @@ test_cfmt_resolved_cells(void *arg)
"\x00\00\x00\x00"
);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0); /* no error reported; we got answers */
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 3);
+ tt_int_op(errcode, OP_EQ, 0); /* no error reported; we got answers */
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 3);
a = smartlist_get(addrs, 0);
- tt_str_op(fmt_addr(&a->addr), ==, "2002:9090::f0f0:abcd");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 0x2000001);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9090::f0f0:abcd");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 0x2000001);
a = smartlist_get(addrs, 1);
- tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 256);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 256);
a = smartlist_get(addrs, 2);
tt_assert(tor_addr_is_null(&a->addr));
- tt_str_op(a->hostname, ==, "motherbrain.zebes");
- tt_int_op(a->ttl, ==, 0);
+ tt_str_op(a->hostname, OP_EQ, "motherbrain.zebes");
+ tt_int_op(a->ttl, OP_EQ, 0);
CLEAR_ADDRS();
/* Cell with several of similar type */
@@ -1059,29 +1060,29 @@ test_cfmt_resolved_cells(void *arg)
"\x00\x00\x00\x00\x00\xfa\xca\xde"
"\x00\00\x00\x03");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 5);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 5);
a = smartlist_get(addrs, 0);
- tt_str_op(fmt_addr(&a->addr), ==, "127.0.2.10");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 256);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.0.2.10");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 256);
a = smartlist_get(addrs, 1);
- tt_str_op(fmt_addr(&a->addr), ==, "8.8.8.8");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 261);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "8.8.8.8");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 261);
a = smartlist_get(addrs, 2);
- tt_str_op(fmt_addr(&a->addr), ==, "127.176.2.176");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 131071);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "127.176.2.176");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 131071);
a = smartlist_get(addrs, 3);
- tt_str_op(fmt_addr(&a->addr), ==, "2002:9000::cafe:f00d");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 1);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9000::cafe:f00d");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 1);
a = smartlist_get(addrs, 4);
- tt_str_op(fmt_addr(&a->addr), ==, "2002:9001::fa:cade");
- tt_ptr_op(a->hostname, ==, NULL);
- tt_int_op(a->ttl, ==, 3);
+ tt_str_op(fmt_addr(&a->addr), OP_EQ, "2002:9001::fa:cade");
+ tt_ptr_op(a->hostname, OP_EQ, NULL);
+ tt_int_op(a->ttl, OP_EQ, 3);
CLEAR_ADDRS();
/* Full cell */
@@ -1091,22 +1092,22 @@ test_cfmt_resolved_cells(void *arg)
"g-case.to-avoid-off-by-one-errors.where-full-things-are-misreported-as" \
".overflowing-by-one.z"
- tt_int_op(strlen(LONG_NAME2), ==, 231);
+ tt_int_op(strlen(LONG_NAME2), OP_EQ, 231);
SET_CELL("\x00\xff"
LONG_NAME
"\x00\01\x00\x00"
"\x00\xe7"
LONG_NAME2
"\x00\01\x00\x00");
- tt_int_op(rh.length, ==, RELAY_PAYLOAD_SIZE);
+ tt_int_op(rh.length, OP_EQ, RELAY_PAYLOAD_SIZE);
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(addrs), ==, 2);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 2);
a = smartlist_get(addrs, 0);
- tt_str_op(a->hostname, ==, LONG_NAME);
+ tt_str_op(a->hostname, OP_EQ, LONG_NAME);
a = smartlist_get(addrs, 1);
- tt_str_op(a->hostname, ==, LONG_NAME2);
+ tt_str_op(a->hostname, OP_EQ, LONG_NAME2);
CLEAR_ADDRS();
/* BAD CELLS */
@@ -1114,49 +1115,49 @@ test_cfmt_resolved_cells(void *arg)
/* Invalid length on an IPv4 */
SET_CELL("\x04\x03zzz1234");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
"\x04\x05zzzzz1234");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
/* Invalid length on an IPv6 */
SET_CELL("\x06\x03zzz1234");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
"\x06\x17wwwwwwwwwwwwwwwww1234");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00"
"\x06\x10xxxx");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
/* Empty hostname */
SET_CELL("\x00\x00xxxx");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
/* rh.length out of range */
CLEAR_CELL();
rh.length = 499;
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(errcode, ==, 0);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(errcode, OP_EQ, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
/* Item length extends beyond rh.length */
CLEAR_CELL();
@@ -1165,18 +1166,18 @@ test_cfmt_resolved_cells(void *arg)
"\x00\01\x00\x00");
rh.length -= 1;
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
rh.length -= 5;
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\x04\x04" "\x7f\x00\x02\x0a" "\x00\00\x01\x00");
rh.length -= 1;
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\xee\x10"
"\x20\x02\x90\x01\x00\x00\x00\x00"
@@ -1184,19 +1185,19 @@ test_cfmt_resolved_cells(void *arg)
"\x00\00\x00\x03");
rh.length -= 1;
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
/* Truncated item after first character */
SET_CELL("\x04");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
SET_CELL("\xee");
r = resolved_cell_parse(&cell, &rh, addrs, &errcode);
- tt_int_op(r, ==, -1);
- tt_int_op(smartlist_len(addrs), ==, 0);
+ tt_int_op(r, OP_EQ, -1);
+ tt_int_op(smartlist_len(addrs), OP_EQ, 0);
done:
CLEAR_ADDRS();
@@ -1224,19 +1225,19 @@ test_cfmt_is_destroy(void *arg)
cell_pack(&packed, &cell, 0);
chan->wide_circ_ids = 0;
tt_assert(! packed_cell_is_destroy(chan, &packed, &circid));
- tt_int_op(circid, ==, 0);
+ tt_int_op(circid, OP_EQ, 0);
cell_pack(&packed, &cell, 1);
chan->wide_circ_ids = 1;
tt_assert(! packed_cell_is_destroy(chan, &packed, &circid));
- tt_int_op(circid, ==, 0);
+ tt_int_op(circid, OP_EQ, 0);
cell.command = CELL_DESTROY;
cell_pack(&packed, &cell, 0);
chan->wide_circ_ids = 0;
tt_assert(packed_cell_is_destroy(chan, &packed, &circid));
- tt_int_op(circid, ==, 3003);
+ tt_int_op(circid, OP_EQ, 3003);
circid = 0;
cell_pack(&packed, &cell, 1);
diff --git a/src/test/test_cell_queue.c b/src/test/test_cell_queue.c
index e43c100f17..effd316f34 100644
--- a/src/test/test_cell_queue.c
+++ b/src/test/test_cell_queue.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CIRCUITLIST_PRIVATE
@@ -21,7 +21,7 @@ test_cq_manip(void *arg)
#endif /* ENABLE_MEMPOOLS */
cell_queue_init(&cq);
- tt_int_op(cq.n, ==, 0);
+ tt_int_op(cq.n, OP_EQ, 0);
pc1 = packed_cell_new();
pc2 = packed_cell_new();
@@ -29,26 +29,26 @@ test_cq_manip(void *arg)
pc4 = packed_cell_new();
tt_assert(pc1 && pc2 && pc3 && pc4);
- tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+ tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq));
/* Add and remove a singleton. */
cell_queue_append(&cq, pc1);
- tt_int_op(cq.n, ==, 1);
- tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
- tt_int_op(cq.n, ==, 0);
+ tt_int_op(cq.n, OP_EQ, 1);
+ tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq));
+ tt_int_op(cq.n, OP_EQ, 0);
/* Add and remove four items */
cell_queue_append(&cq, pc4);
cell_queue_append(&cq, pc3);
cell_queue_append(&cq, pc2);
cell_queue_append(&cq, pc1);
- tt_int_op(cq.n, ==, 4);
- tt_ptr_op(pc4, ==, cell_queue_pop(&cq));
- tt_ptr_op(pc3, ==, cell_queue_pop(&cq));
- tt_ptr_op(pc2, ==, cell_queue_pop(&cq));
- tt_ptr_op(pc1, ==, cell_queue_pop(&cq));
- tt_int_op(cq.n, ==, 0);
- tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+ tt_int_op(cq.n, OP_EQ, 4);
+ tt_ptr_op(pc4, OP_EQ, cell_queue_pop(&cq));
+ tt_ptr_op(pc3, OP_EQ, cell_queue_pop(&cq));
+ tt_ptr_op(pc2, OP_EQ, cell_queue_pop(&cq));
+ tt_ptr_op(pc1, OP_EQ, cell_queue_pop(&cq));
+ tt_int_op(cq.n, OP_EQ, 0);
+ tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq));
/* Try a packed copy (wide, then narrow, which is a bit of a cheat, since a
* real cell queue has only one type.) */
@@ -64,32 +64,32 @@ test_cq_manip(void *arg)
cell.circ_id = 0x2013;
cell_queue_append_packed_copy(NULL /*circ*/, &cq, 0 /*exitward*/, &cell,
0 /*wide*/, 0 /*stats*/);
- tt_int_op(cq.n, ==, 2);
+ tt_int_op(cq.n, OP_EQ, 2);
pc_tmp = cell_queue_pop(&cq);
- tt_int_op(cq.n, ==, 1);
- tt_ptr_op(pc_tmp, !=, NULL);
- tt_mem_op(pc_tmp->body, ==, "\x12\x34\x56\x78\x0a", 5);
- tt_mem_op(pc_tmp->body+5, ==, cell.payload, sizeof(cell.payload));
+ tt_int_op(cq.n, OP_EQ, 1);
+ tt_ptr_op(pc_tmp, OP_NE, NULL);
+ tt_mem_op(pc_tmp->body, OP_EQ, "\x12\x34\x56\x78\x0a", 5);
+ tt_mem_op(pc_tmp->body+5, OP_EQ, cell.payload, sizeof(cell.payload));
packed_cell_free(pc_tmp);
pc_tmp = cell_queue_pop(&cq);
- tt_int_op(cq.n, ==, 0);
- tt_ptr_op(pc_tmp, !=, NULL);
- tt_mem_op(pc_tmp->body, ==, "\x20\x13\x0a", 3);
- tt_mem_op(pc_tmp->body+3, ==, cell.payload, sizeof(cell.payload));
+ tt_int_op(cq.n, OP_EQ, 0);
+ tt_ptr_op(pc_tmp, OP_NE, NULL);
+ tt_mem_op(pc_tmp->body, OP_EQ, "\x20\x13\x0a", 3);
+ tt_mem_op(pc_tmp->body+3, OP_EQ, cell.payload, sizeof(cell.payload));
packed_cell_free(pc_tmp);
pc_tmp = NULL;
- tt_ptr_op(NULL, ==, cell_queue_pop(&cq));
+ tt_ptr_op(NULL, OP_EQ, cell_queue_pop(&cq));
/* Now make sure cell_queue_clear works. */
cell_queue_append(&cq, pc2);
cell_queue_append(&cq, pc1);
- tt_int_op(cq.n, ==, 2);
+ tt_int_op(cq.n, OP_EQ, 2);
cell_queue_clear(&cq);
pc2 = pc1 = NULL; /* prevent double-free */
- tt_int_op(cq.n, ==, 0);
+ tt_int_op(cq.n, OP_EQ, 0);
done:
packed_cell_free(pc1);
@@ -129,17 +129,17 @@ test_circuit_n_cells(void *arg)
origin_c = origin_circuit_new();
origin_c->base_.purpose = CIRCUIT_PURPOSE_C_GENERAL;
- tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 0);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 0);
cell_queue_append(&or_c->p_chan_cells, pc1);
- tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 1);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 1);
cell_queue_append(&or_c->base_.n_chan_cells, pc2);
cell_queue_append(&or_c->base_.n_chan_cells, pc3);
- tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), ==, 3);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(or_c)), OP_EQ, 3);
- tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 0);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 0);
cell_queue_append(&origin_c->base_.n_chan_cells, pc4);
cell_queue_append(&origin_c->base_.n_chan_cells, pc5);
- tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), ==, 2);
+ tt_int_op(n_cells_in_circ_queues(TO_CIRCUIT(origin_c)), OP_EQ, 2);
done:
circuit_free(TO_CIRCUIT(or_c));
diff --git a/src/test/test_channel.c b/src/test/test_channel.c
new file mode 100644
index 0000000000..99633a4026
--- /dev/null
+++ b/src/test/test_channel.c
@@ -0,0 +1,1703 @@
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define TOR_CHANNEL_INTERNAL_
+#define CHANNEL_PRIVATE_
+#include "or.h"
+#include "channel.h"
+/* For channel_note_destroy_not_pending */
+#include "circuitlist.h"
+#include "circuitmux.h"
+/* For var_cell_free */
+#include "connection_or.h"
+/* For packed_cell stuff */
+#define RELAY_PRIVATE
+#include "relay.h"
+/* For init/free stuff */
+#include "scheduler.h"
+
+/* Test suite stuff */
+#include "test.h"
+#include "fakechans.h"
+
+/* This comes from channel.c */
+extern uint64_t estimated_total_queue_size;
+
+static int test_chan_accept_cells = 0;
+static int test_chan_fixed_cells_recved = 0;
+static int test_chan_var_cells_recved = 0;
+static int test_cells_written = 0;
+static int test_destroy_not_pending_calls = 0;
+static int test_doesnt_want_writes_count = 0;
+static int test_dumpstats_calls = 0;
+static int test_has_waiting_cells_count = 0;
+static double test_overhead_estimate = 1.0f;
+static int test_releases_count = 0;
+static circuitmux_t *test_target_cmux = NULL;
+static unsigned int test_cmux_cells = 0;
+static channel_t *dump_statistics_mock_target = NULL;
+static int dump_statistics_mock_matches = 0;
+
+static void chan_test_channel_dump_statistics_mock(
+ channel_t *chan, int severity);
+static int chan_test_channel_flush_from_first_active_circuit_mock(
+ channel_t *chan, int max);
+static unsigned int chan_test_circuitmux_num_cells_mock(circuitmux_t *cmux);
+static void channel_note_destroy_not_pending_mock(channel_t *ch,
+ circid_t circid);
+static void chan_test_cell_handler(channel_t *ch,
+ cell_t *cell);
+static const char * chan_test_describe_transport(channel_t *ch);
+static void chan_test_dumpstats(channel_t *ch, int severity);
+static void chan_test_var_cell_handler(channel_t *ch,
+ var_cell_t *var_cell);
+static void chan_test_close(channel_t *ch);
+static void chan_test_error(channel_t *ch);
+static void chan_test_finish_close(channel_t *ch);
+static const char * chan_test_get_remote_descr(channel_t *ch, int flags);
+static int chan_test_is_canonical(channel_t *ch, int req);
+static size_t chan_test_num_bytes_queued(channel_t *ch);
+static int chan_test_num_cells_writeable(channel_t *ch);
+static int chan_test_write_cell(channel_t *ch, cell_t *cell);
+static int chan_test_write_packed_cell(channel_t *ch,
+ packed_cell_t *packed_cell);
+static int chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell);
+static void scheduler_channel_doesnt_want_writes_mock(channel_t *ch);
+
+static void test_channel_dumpstats(void *arg);
+static void test_channel_flush(void *arg);
+static void test_channel_flushmux(void *arg);
+static void test_channel_incoming(void *arg);
+static void test_channel_lifecycle(void *arg);
+static void test_channel_multi(void *arg);
+static void test_channel_queue_size(void *arg);
+static void test_channel_write(void *arg);
+
+static void
+channel_note_destroy_not_pending_mock(channel_t *ch,
+ circid_t circid)
+{
+ (void)ch;
+ (void)circid;
+
+ ++test_destroy_not_pending_calls;
+}
+
+static const char *
+chan_test_describe_transport(channel_t *ch)
+{
+ tt_assert(ch != NULL);
+
+ done:
+ return "Fake channel for unit tests";
+}
+
+/**
+ * Mock for channel_dump_statistics(); if the channel matches the
+ * target, bump a counter - otherwise ignore.
+ */
+
+static void
+chan_test_channel_dump_statistics_mock(channel_t *chan, int severity)
+{
+ tt_assert(chan != NULL);
+
+ (void)severity;
+
+ if (chan != NULL && chan == dump_statistics_mock_target) {
+ ++dump_statistics_mock_matches;
+ }
+
+ done:
+ return;
+}
+
+/**
+ * If the target cmux is the cmux for chan, make fake cells up to the
+ * target number of cells and write them to chan. Otherwise, invoke
+ * the real channel_flush_from_first_active_circuit().
+ */
+
+static int
+chan_test_channel_flush_from_first_active_circuit_mock(channel_t *chan,
+ int max)
+{
+ int result = 0, c = 0;
+ packed_cell_t *cell = NULL;
+
+ tt_assert(chan != NULL);
+ if (test_target_cmux != NULL &&
+ test_target_cmux == chan->cmux) {
+ while (c <= max && test_cmux_cells > 0) {
+ cell = packed_cell_new();
+ channel_write_packed_cell(chan, cell);
+ ++c;
+ --test_cmux_cells;
+ }
+ result = c;
+ } else {
+ result = channel_flush_from_first_active_circuit__real(chan, max);
+ }
+
+ done:
+ return result;
+}
+
+/**
+ * If we have a target cmux set and this matches it, lie about how
+ * many cells we have according to the number indicated; otherwise
+ * pass to the real circuitmux_num_cells().
+ */
+
+static unsigned int
+chan_test_circuitmux_num_cells_mock(circuitmux_t *cmux)
+{
+ unsigned int result = 0;
+
+ tt_assert(cmux != NULL);
+ if (cmux != NULL) {
+ if (cmux == test_target_cmux) {
+ result = test_cmux_cells;
+ } else {
+ result = circuitmux_num_cells__real(cmux);
+ }
+ }
+
+ done:
+
+ return result;
+}
+
+/*
+ * Handle an incoming fixed-size cell for unit tests
+ */
+
+static void
+chan_test_cell_handler(channel_t *ch,
+ cell_t *cell)
+{
+ tt_assert(ch);
+ tt_assert(cell);
+
+ tor_free(cell);
+ ++test_chan_fixed_cells_recved;
+
+ done:
+ return;
+}
+
+/*
+ * Fake transport-specific stats call
+ */
+
+static void
+chan_test_dumpstats(channel_t *ch, int severity)
+{
+ tt_assert(ch != NULL);
+
+ (void)severity;
+
+ ++test_dumpstats_calls;
+
+ done:
+ return;
+}
+
+/*
+ * Handle an incoming variable-size cell for unit tests
+ */
+
+static void
+chan_test_var_cell_handler(channel_t *ch,
+ var_cell_t *var_cell)
+{
+ tt_assert(ch);
+ tt_assert(var_cell);
+
+ tor_free(var_cell);
+ ++test_chan_var_cells_recved;
+
+ done:
+ return;
+}
+
+static void
+chan_test_close(channel_t *ch)
+{
+ tt_assert(ch);
+
+ done:
+ return;
+}
+
+/*
+ * Close a channel through the error path
+ */
+
+static void
+chan_test_error(channel_t *ch)
+{
+ tt_assert(ch);
+ tt_assert(!(ch->state == CHANNEL_STATE_CLOSING ||
+ ch->state == CHANNEL_STATE_ERROR ||
+ ch->state == CHANNEL_STATE_CLOSED));
+
+ channel_close_for_error(ch);
+
+ done:
+ return;
+}
+
+/*
+ * Finish closing a channel from CHANNEL_STATE_CLOSING
+ */
+
+static void
+chan_test_finish_close(channel_t *ch)
+{
+ tt_assert(ch);
+ tt_assert(ch->state == CHANNEL_STATE_CLOSING);
+
+ channel_closed(ch);
+
+ done:
+ return;
+}
+
+static const char *
+chan_test_get_remote_descr(channel_t *ch, int flags)
+{
+ tt_assert(ch);
+ tt_int_op(flags & ~(GRD_FLAG_ORIGINAL | GRD_FLAG_ADDR_ONLY), ==, 0);
+
+ done:
+ return "Fake channel for unit tests; no real endpoint";
+}
+
+static double
+chan_test_get_overhead_estimate(channel_t *ch)
+{
+ tt_assert(ch);
+
+ done:
+ return test_overhead_estimate;
+}
+
+static int
+chan_test_is_canonical(channel_t *ch, int req)
+{
+ tt_assert(ch != NULL);
+ tt_assert(req == 0 || req == 1);
+
+ done:
+ /* Fake channels are always canonical */
+ return 1;
+}
+
+static size_t
+chan_test_num_bytes_queued(channel_t *ch)
+{
+ tt_assert(ch);
+
+ done:
+ return 0;
+}
+
+static int
+chan_test_num_cells_writeable(channel_t *ch)
+{
+ tt_assert(ch);
+
+ done:
+ return 32;
+}
+
+static int
+chan_test_write_cell(channel_t *ch, cell_t *cell)
+{
+ int rv = 0;
+
+ tt_assert(ch);
+ tt_assert(cell);
+
+ if (test_chan_accept_cells) {
+ /* Free the cell and bump the counter */
+ tor_free(cell);
+ ++test_cells_written;
+ rv = 1;
+ }
+ /* else return 0, we didn't accept it */
+
+ done:
+ return rv;
+}
+
+static int
+chan_test_write_packed_cell(channel_t *ch,
+ packed_cell_t *packed_cell)
+{
+ int rv = 0;
+
+ tt_assert(ch);
+ tt_assert(packed_cell);
+
+ if (test_chan_accept_cells) {
+ /* Free the cell and bump the counter */
+ packed_cell_free(packed_cell);
+ ++test_cells_written;
+ rv = 1;
+ }
+ /* else return 0, we didn't accept it */
+
+ done:
+ return rv;
+}
+
+static int
+chan_test_write_var_cell(channel_t *ch, var_cell_t *var_cell)
+{
+ int rv = 0;
+
+ tt_assert(ch);
+ tt_assert(var_cell);
+
+ if (test_chan_accept_cells) {
+ /* Free the cell and bump the counter */
+ var_cell_free(var_cell);
+ ++test_cells_written;
+ rv = 1;
+ }
+ /* else return 0, we didn't accept it */
+
+ done:
+ return rv;
+}
+
+/**
+ * Fill out c with a new fake cell for test suite use
+ */
+
+void
+make_fake_cell(cell_t *c)
+{
+ tt_assert(c != NULL);
+
+ c->circ_id = 1;
+ c->command = CELL_RELAY;
+ memset(c->payload, 0, CELL_PAYLOAD_SIZE);
+
+ done:
+ return;
+}
+
+/**
+ * Fill out c with a new fake var_cell for test suite use
+ */
+
+void
+make_fake_var_cell(var_cell_t *c)
+{
+ tt_assert(c != NULL);
+
+ c->circ_id = 1;
+ c->command = CELL_VERSIONS;
+ c->payload_len = CELL_PAYLOAD_SIZE / 2;
+ memset(c->payload, 0, c->payload_len);
+
+ done:
+ return;
+}
+
+/**
+ * Set up a new fake channel for the test suite
+ */
+
+channel_t *
+new_fake_channel(void)
+{
+ channel_t *chan = tor_malloc_zero(sizeof(channel_t));
+ channel_init(chan);
+
+ chan->close = chan_test_close;
+ chan->get_overhead_estimate = chan_test_get_overhead_estimate;
+ chan->num_bytes_queued = chan_test_num_bytes_queued;
+ chan->num_cells_writeable = chan_test_num_cells_writeable;
+ chan->write_cell = chan_test_write_cell;
+ chan->write_packed_cell = chan_test_write_packed_cell;
+ chan->write_var_cell = chan_test_write_var_cell;
+ chan->state = CHANNEL_STATE_OPEN;
+
+ return chan;
+}
+
+void
+free_fake_channel(channel_t *chan)
+{
+ cell_queue_entry_t *cell, *cell_tmp;
+
+ if (! chan)
+ return;
+
+ if (chan->cmux)
+ circuitmux_free(chan->cmux);
+
+ TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->incoming_queue, next, cell_tmp) {
+ cell_queue_entry_free(cell, 0);
+ }
+ TOR_SIMPLEQ_FOREACH_SAFE(cell, &chan->outgoing_queue, next, cell_tmp) {
+ cell_queue_entry_free(cell, 0);
+ }
+
+ tor_free(chan);
+}
+
+/**
+ * Counter query for scheduler_channel_has_waiting_cells_mock()
+ */
+
+int
+get_mock_scheduler_has_waiting_cells_count(void)
+{
+ return test_has_waiting_cells_count;
+}
+
+/**
+ * Mock for scheduler_channel_has_waiting_cells()
+ */
+
+void
+scheduler_channel_has_waiting_cells_mock(channel_t *ch)
+{
+ (void)ch;
+
+ /* Increment counter */
+ ++test_has_waiting_cells_count;
+
+ return;
+}
+
+static void
+scheduler_channel_doesnt_want_writes_mock(channel_t *ch)
+{
+ (void)ch;
+
+ /* Increment counter */
+ ++test_doesnt_want_writes_count;
+
+ return;
+}
+
+/**
+ * Counter query for scheduler_release_channel_mock()
+ */
+
+int
+get_mock_scheduler_release_channel_count(void)
+{
+ return test_releases_count;
+}
+
+/**
+ * Mock for scheduler_release_channel()
+ */
+
+void
+scheduler_release_channel_mock(channel_t *ch)
+{
+ (void)ch;
+
+ /* Increment counter */
+ ++test_releases_count;
+
+ return;
+}
+
+/**
+ * Test for channel_dumpstats() and limited test for
+ * channel_dump_statistics()
+ */
+
+static void
+test_channel_dumpstats(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = NULL;
+ int old_count;
+
+ (void)arg;
+
+ /* Mock these for duration of the test */
+ MOCK(scheduler_channel_doesnt_want_writes,
+ scheduler_channel_doesnt_want_writes_mock);
+ MOCK(scheduler_release_channel,
+ scheduler_release_channel_mock);
+
+ /* Set up a new fake channel */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->cmux = circuitmux_alloc();
+
+ /* Try to register it */
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Set up mock */
+ dump_statistics_mock_target = ch;
+ dump_statistics_mock_matches = 0;
+ MOCK(channel_dump_statistics,
+ chan_test_channel_dump_statistics_mock);
+
+ /* Call channel_dumpstats() */
+ channel_dumpstats(LOG_DEBUG);
+
+ /* Assert that we hit the mock */
+ tt_int_op(dump_statistics_mock_matches, ==, 1);
+
+ /* Close the channel */
+ channel_mark_for_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+
+ /* Try again and hit the finished channel */
+ channel_dumpstats(LOG_DEBUG);
+ tt_int_op(dump_statistics_mock_matches, ==, 2);
+
+ channel_run_cleanup();
+ ch = NULL;
+
+ /* Now we should hit nothing */
+ channel_dumpstats(LOG_DEBUG);
+ tt_int_op(dump_statistics_mock_matches, ==, 2);
+
+ /* Unmock */
+ UNMOCK(channel_dump_statistics);
+ dump_statistics_mock_target = NULL;
+ dump_statistics_mock_matches = 0;
+
+ /* Now make another channel */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->cmux = circuitmux_alloc();
+ channel_register(ch);
+ tt_assert(ch->registered);
+ /* Lie about its age so dumpstats gets coverage for rate calculations */
+ ch->timestamp_created = time(NULL) - 30;
+ tt_assert(ch->timestamp_created > 0);
+ tt_assert(time(NULL) > ch->timestamp_created);
+
+ /* Put cells through it both ways to make the counters non-zero */
+ cell = tor_malloc_zero(sizeof(*cell));
+ make_fake_cell(cell);
+ test_chan_accept_cells = 1;
+ old_count = test_cells_written;
+ channel_write_cell(ch, cell);
+ cell = NULL;
+ tt_int_op(test_cells_written, ==, old_count + 1);
+ tt_assert(ch->n_bytes_xmitted > 0);
+ tt_assert(ch->n_cells_xmitted > 0);
+
+ /* Receive path */
+ channel_set_cell_handlers(ch,
+ chan_test_cell_handler,
+ chan_test_var_cell_handler);
+ tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler);
+ tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler);
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ old_count = test_chan_fixed_cells_recved;
+ channel_queue_cell(ch, cell);
+ cell = NULL;
+ tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1);
+ tt_assert(ch->n_bytes_recved > 0);
+ tt_assert(ch->n_cells_recved > 0);
+
+ /* Test channel_dump_statistics */
+ ch->describe_transport = chan_test_describe_transport;
+ ch->dumpstats = chan_test_dumpstats;
+ ch->get_remote_descr = chan_test_get_remote_descr;
+ ch->is_canonical = chan_test_is_canonical;
+ old_count = test_dumpstats_calls;
+ channel_dump_statistics(ch, LOG_DEBUG);
+ tt_int_op(test_dumpstats_calls, ==, old_count + 1);
+
+ /* Close the channel */
+ channel_mark_for_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ channel_run_cleanup();
+ ch = NULL;
+
+ done:
+ tor_free(cell);
+ free_fake_channel(ch);
+
+ UNMOCK(scheduler_channel_doesnt_want_writes);
+ UNMOCK(scheduler_release_channel);
+
+ return;
+}
+
+static void
+test_channel_flush(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = NULL;
+ packed_cell_t *p_cell = NULL;
+ var_cell_t *v_cell = NULL;
+ int init_count;
+
+ (void)arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+
+ /* Cache the original count */
+ init_count = test_cells_written;
+
+ /* Stop accepting so we can queue some */
+ test_chan_accept_cells = 0;
+
+ /* Queue a regular cell */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch, cell);
+ /* It should be queued, so assert that we didn't write it */
+ tt_int_op(test_cells_written, ==, init_count);
+
+ /* Queue a var cell */
+ v_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
+ make_fake_var_cell(v_cell);
+ channel_write_var_cell(ch, v_cell);
+ /* It should be queued, so assert that we didn't write it */
+ tt_int_op(test_cells_written, ==, init_count);
+
+ /* Try a packed cell now */
+ p_cell = packed_cell_new();
+ tt_assert(p_cell);
+ channel_write_packed_cell(ch, p_cell);
+ /* It should be queued, so assert that we didn't write it */
+ tt_int_op(test_cells_written, ==, init_count);
+
+ /* Now allow writes through again */
+ test_chan_accept_cells = 1;
+
+ /* ...and flush */
+ channel_flush_cells(ch);
+
+ /* All three should have gone through */
+ tt_int_op(test_cells_written, ==, init_count + 3);
+
+ done:
+ tor_free(ch);
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ return;
+}
+
+/**
+ * Channel flush tests that require cmux mocking
+ */
+
+static void
+test_channel_flushmux(void *arg)
+{
+ channel_t *ch = NULL;
+ int old_count, q_len_before, q_len_after;
+ ssize_t result;
+
+ (void)arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ /* Install mocks we need for this test */
+ MOCK(channel_flush_from_first_active_circuit,
+ chan_test_channel_flush_from_first_active_circuit_mock);
+ MOCK(circuitmux_num_cells,
+ chan_test_circuitmux_num_cells_mock);
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->cmux = circuitmux_alloc();
+
+ old_count = test_cells_written;
+
+ test_target_cmux = ch->cmux;
+ test_cmux_cells = 1;
+
+ /* Enable cell acceptance */
+ test_chan_accept_cells = 1;
+
+ result = channel_flush_some_cells(ch, 1);
+
+ tt_int_op(result, ==, 1);
+ tt_int_op(test_cells_written, ==, old_count + 1);
+ tt_int_op(test_cmux_cells, ==, 0);
+
+ /* Now try it without accepting to force them into the queue */
+ test_chan_accept_cells = 0;
+ test_cmux_cells = 1;
+ q_len_before = chan_cell_queue_len(&(ch->outgoing_queue));
+
+ result = channel_flush_some_cells(ch, 1);
+
+ /* We should not have actually flushed any */
+ tt_int_op(result, ==, 0);
+ tt_int_op(test_cells_written, ==, old_count + 1);
+ /* But we should have gotten to the fake cellgen loop */
+ tt_int_op(test_cmux_cells, ==, 0);
+ /* ...and we should have a queued cell */
+ q_len_after = chan_cell_queue_len(&(ch->outgoing_queue));
+ tt_int_op(q_len_after, ==, q_len_before + 1);
+
+ /* Now accept cells again and drain the queue */
+ test_chan_accept_cells = 1;
+ channel_flush_cells(ch);
+ tt_int_op(test_cells_written, ==, old_count + 2);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ test_target_cmux = NULL;
+ test_cmux_cells = 0;
+
+ done:
+ if (ch)
+ circuitmux_free(ch->cmux);
+ tor_free(ch);
+
+ UNMOCK(channel_flush_from_first_active_circuit);
+ UNMOCK(circuitmux_num_cells);
+
+ test_chan_accept_cells = 0;
+
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ return;
+}
+
+static void
+test_channel_incoming(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = NULL;
+ var_cell_t *var_cell = NULL;
+ int old_count;
+
+ (void)arg;
+
+ /* Mock these for duration of the test */
+ MOCK(scheduler_channel_doesnt_want_writes,
+ scheduler_channel_doesnt_want_writes_mock);
+ MOCK(scheduler_release_channel,
+ scheduler_release_channel_mock);
+
+ /* Accept cells to lower layer */
+ test_chan_accept_cells = 1;
+ /* Use default overhead factor */
+ test_overhead_estimate = 1.0f;
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+ /* Start it off in OPENING */
+ ch->state = CHANNEL_STATE_OPENING;
+ /* We'll need a cmux */
+ ch->cmux = circuitmux_alloc();
+
+ /* Install incoming cell handlers */
+ channel_set_cell_handlers(ch,
+ chan_test_cell_handler,
+ chan_test_var_cell_handler);
+ /* Test cell handler getters */
+ tt_ptr_op(channel_get_cell_handler(ch), ==, chan_test_cell_handler);
+ tt_ptr_op(channel_get_var_cell_handler(ch), ==, chan_test_var_cell_handler);
+
+ /* Try to register it */
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Open it */
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+
+ /* Receive a fixed cell */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ old_count = test_chan_fixed_cells_recved;
+ channel_queue_cell(ch, cell);
+ cell = NULL;
+ tt_int_op(test_chan_fixed_cells_recved, ==, old_count + 1);
+
+ /* Receive a variable-size cell */
+ var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
+ make_fake_var_cell(var_cell);
+ old_count = test_chan_var_cells_recved;
+ channel_queue_var_cell(ch, var_cell);
+ var_cell = NULL;
+ tt_int_op(test_chan_var_cells_recved, ==, old_count + 1);
+
+ /* Close it */
+ channel_mark_for_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ channel_run_cleanup();
+ ch = NULL;
+
+ done:
+ free_fake_channel(ch);
+ tor_free(cell);
+ tor_free(var_cell);
+
+ UNMOCK(scheduler_channel_doesnt_want_writes);
+ UNMOCK(scheduler_release_channel);
+
+ return;
+}
+
+/**
+ * Normal channel lifecycle test:
+ *
+ * OPENING->OPEN->MAINT->OPEN->CLOSING->CLOSED
+ */
+
+static void
+test_channel_lifecycle(void *arg)
+{
+ channel_t *ch1 = NULL, *ch2 = NULL;
+ cell_t *cell = NULL;
+ int old_count, init_doesnt_want_writes_count;
+ int init_releases_count;
+
+ (void)arg;
+
+ /* Mock these for the whole lifecycle test */
+ MOCK(scheduler_channel_doesnt_want_writes,
+ scheduler_channel_doesnt_want_writes_mock);
+ MOCK(scheduler_release_channel,
+ scheduler_release_channel_mock);
+
+ /* Cache some initial counter values */
+ init_doesnt_want_writes_count = test_doesnt_want_writes_count;
+ init_releases_count = test_releases_count;
+
+ /* Accept cells to lower layer */
+ test_chan_accept_cells = 1;
+ /* Use default overhead factor */
+ test_overhead_estimate = 1.0f;
+
+ ch1 = new_fake_channel();
+ tt_assert(ch1);
+ /* Start it off in OPENING */
+ ch1->state = CHANNEL_STATE_OPENING;
+ /* We'll need a cmux */
+ ch1->cmux = circuitmux_alloc();
+
+ /* Try to register it */
+ channel_register(ch1);
+ tt_assert(ch1->registered);
+
+ /* Try to write a cell through (should queue) */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ old_count = test_cells_written;
+ channel_write_cell(ch1, cell);
+ tt_int_op(old_count, ==, test_cells_written);
+
+ /* Move it to OPEN and flush */
+ channel_change_state(ch1, CHANNEL_STATE_OPEN);
+
+ /* Queue should drain */
+ tt_int_op(old_count + 1, ==, test_cells_written);
+
+ /* Get another one */
+ ch2 = new_fake_channel();
+ tt_assert(ch2);
+ ch2->state = CHANNEL_STATE_OPENING;
+ ch2->cmux = circuitmux_alloc();
+
+ /* Register */
+ channel_register(ch2);
+ tt_assert(ch2->registered);
+
+ /* Check counters */
+ tt_int_op(test_doesnt_want_writes_count, ==, init_doesnt_want_writes_count);
+ tt_int_op(test_releases_count, ==, init_releases_count);
+
+ /* Move ch1 to MAINT */
+ channel_change_state(ch1, CHANNEL_STATE_MAINT);
+ tt_int_op(test_doesnt_want_writes_count, ==,
+ init_doesnt_want_writes_count + 1);
+ tt_int_op(test_releases_count, ==, init_releases_count);
+
+ /* Move ch2 to OPEN */
+ channel_change_state(ch2, CHANNEL_STATE_OPEN);
+ tt_int_op(test_doesnt_want_writes_count, ==,
+ init_doesnt_want_writes_count + 1);
+ tt_int_op(test_releases_count, ==, init_releases_count);
+
+ /* Move ch1 back to OPEN */
+ channel_change_state(ch1, CHANNEL_STATE_OPEN);
+ tt_int_op(test_doesnt_want_writes_count, ==,
+ init_doesnt_want_writes_count + 1);
+ tt_int_op(test_releases_count, ==, init_releases_count);
+
+ /* Mark ch2 for close */
+ channel_mark_for_close(ch2);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
+ tt_int_op(test_doesnt_want_writes_count, ==,
+ init_doesnt_want_writes_count + 1);
+ tt_int_op(test_releases_count, ==, init_releases_count + 1);
+
+ /* Shut down channels */
+ channel_free_all();
+ ch1 = ch2 = NULL;
+ tt_int_op(test_doesnt_want_writes_count, ==,
+ init_doesnt_want_writes_count + 1);
+ /* channel_free() calls scheduler_release_channel() */
+ tt_int_op(test_releases_count, ==, init_releases_count + 4);
+
+ done:
+ free_fake_channel(ch1);
+ free_fake_channel(ch2);
+
+ UNMOCK(scheduler_channel_doesnt_want_writes);
+ UNMOCK(scheduler_release_channel);
+
+ return;
+}
+
+/**
+ * Weird channel lifecycle test:
+ *
+ * OPENING->CLOSING->CLOSED
+ * OPENING->OPEN->CLOSING->ERROR
+ * OPENING->OPEN->MAINT->CLOSING->CLOSED
+ * OPENING->OPEN->MAINT->CLOSING->ERROR
+ */
+
+static void
+test_channel_lifecycle_2(void *arg)
+{
+ channel_t *ch = NULL;
+
+ (void)arg;
+
+ /* Mock these for the whole lifecycle test */
+ MOCK(scheduler_channel_doesnt_want_writes,
+ scheduler_channel_doesnt_want_writes_mock);
+ MOCK(scheduler_release_channel,
+ scheduler_release_channel_mock);
+
+ /* Accept cells to lower layer */
+ test_chan_accept_cells = 1;
+ /* Use default overhead factor */
+ test_overhead_estimate = 1.0f;
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+ /* Start it off in OPENING */
+ ch->state = CHANNEL_STATE_OPENING;
+ /* The full lifecycle test needs a cmux */
+ ch->cmux = circuitmux_alloc();
+
+ /* Try to register it */
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Try to close it */
+ channel_mark_for_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+
+ /* Finish closing it */
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ channel_run_cleanup();
+ ch = NULL;
+
+ /* Now try OPENING->OPEN->CLOSING->ERROR */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->state = CHANNEL_STATE_OPENING;
+ ch->cmux = circuitmux_alloc();
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Finish opening it */
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+
+ /* Error exit from lower layer */
+ chan_test_error(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR);
+ channel_run_cleanup();
+ ch = NULL;
+
+ /* OPENING->OPEN->MAINT->CLOSING->CLOSED close from maintenance state */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->state = CHANNEL_STATE_OPENING;
+ ch->cmux = circuitmux_alloc();
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Finish opening it */
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+
+ /* Go to maintenance state */
+ channel_change_state(ch, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+
+ /* Lower layer close */
+ channel_mark_for_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+
+ /* Finish */
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ channel_run_cleanup();
+ ch = NULL;
+
+ /*
+ * OPENING->OPEN->MAINT->CLOSING->CLOSED lower-layer close during
+ * maintenance state
+ */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->state = CHANNEL_STATE_OPENING;
+ ch->cmux = circuitmux_alloc();
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Finish opening it */
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+
+ /* Go to maintenance state */
+ channel_change_state(ch, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+
+ /* Lower layer close */
+ channel_close_from_lower_layer(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+
+ /* Finish */
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSED);
+ channel_run_cleanup();
+ ch = NULL;
+
+ /* OPENING->OPEN->MAINT->CLOSING->ERROR */
+ ch = new_fake_channel();
+ tt_assert(ch);
+ ch->state = CHANNEL_STATE_OPENING;
+ ch->cmux = circuitmux_alloc();
+ channel_register(ch);
+ tt_assert(ch->registered);
+
+ /* Finish opening it */
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_OPEN);
+
+ /* Go to maintenance state */
+ channel_change_state(ch, CHANNEL_STATE_MAINT);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_MAINT);
+
+ /* Lower layer close */
+ chan_test_error(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_CLOSING);
+
+ /* Finish */
+ chan_test_finish_close(ch);
+ tt_int_op(ch->state, ==, CHANNEL_STATE_ERROR);
+ channel_run_cleanup();
+ ch = NULL;
+
+ /* Shut down channels */
+ channel_free_all();
+
+ done:
+ tor_free(ch);
+
+ UNMOCK(scheduler_channel_doesnt_want_writes);
+ UNMOCK(scheduler_release_channel);
+
+ return;
+}
+
+static void
+test_channel_multi(void *arg)
+{
+ channel_t *ch1 = NULL, *ch2 = NULL;
+ uint64_t global_queue_estimate;
+ cell_t *cell = NULL;
+
+ (void)arg;
+
+ /* Accept cells to lower layer */
+ test_chan_accept_cells = 1;
+ /* Use default overhead factor */
+ test_overhead_estimate = 1.0f;
+
+ ch1 = new_fake_channel();
+ tt_assert(ch1);
+ ch2 = new_fake_channel();
+ tt_assert(ch2);
+
+ /* Initial queue size update */
+ channel_update_xmit_queue_size(ch1);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Queue some cells, check queue estimates */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch1, cell);
+
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch2, cell);
+
+ channel_update_xmit_queue_size(ch1);
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Stop accepting cells at lower layer */
+ test_chan_accept_cells = 0;
+
+ /* Queue some cells and check queue estimates */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch1, cell);
+
+ channel_update_xmit_queue_size(ch1);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 512);
+
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch2, cell);
+
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 1024);
+
+ /* Allow cells through again */
+ test_chan_accept_cells = 1;
+
+ /* Flush chan 2 */
+ channel_flush_cells(ch2);
+
+ /* Update and check queue sizes */
+ channel_update_xmit_queue_size(ch1);
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 512);
+
+ /* Flush chan 1 */
+ channel_flush_cells(ch1);
+
+ /* Update and check queue sizes */
+ channel_update_xmit_queue_size(ch1);
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 0);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Now block again */
+ test_chan_accept_cells = 0;
+
+ /* Queue some cells */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch1, cell);
+
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch2, cell);
+ cell = NULL;
+
+ /* Check the estimates */
+ channel_update_xmit_queue_size(ch1);
+ channel_update_xmit_queue_size(ch2);
+ tt_u64_op(ch1->bytes_queued_for_xmit, ==, 512);
+ tt_u64_op(ch2->bytes_queued_for_xmit, ==, 512);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 1024);
+
+ /* Now close channel 2; it should be subtracted from the global queue */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_mark_for_close(ch2);
+ UNMOCK(scheduler_release_channel);
+
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 512);
+
+ /*
+ * Since the fake channels aren't registered, channel_free_all() can't
+ * see them properly.
+ */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_mark_for_close(ch1);
+ UNMOCK(scheduler_release_channel);
+
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Now free everything */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_free_all();
+ UNMOCK(scheduler_release_channel);
+
+ done:
+ free_fake_channel(ch1);
+ free_fake_channel(ch2);
+
+ return;
+}
+
+/**
+ * Check some hopefully-impossible edge cases in the channel queue we
+ * can only trigger by doing evil things to the queue directly.
+ */
+
+static void
+test_channel_queue_impossible(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = NULL;
+ packed_cell_t *packed_cell = NULL;
+ var_cell_t *var_cell = NULL;
+ int old_count;
+ cell_queue_entry_t *q = NULL;
+ uint64_t global_queue_estimate;
+ uintptr_t cellintptr;
+
+ /* Cache the global queue size (see below) */
+ global_queue_estimate = channel_get_global_queue_estimate();
+
+ (void)arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+
+ /* We test queueing here; tell it not to accept cells */
+ test_chan_accept_cells = 0;
+ /* ...and keep it from trying to flush the queue */
+ ch->state = CHANNEL_STATE_MAINT;
+
+ /* Cache the cell written count */
+ old_count = test_cells_written;
+
+ /* Assert that the queue is initially empty */
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ /* Get a fresh cell and write it to the channel*/
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ cellintptr = (uintptr_t)(void*)cell;
+ channel_write_cell(ch, cell);
+
+ /* Now it should be queued */
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
+ tt_assert(q);
+ if (q) {
+ tt_int_op(q->type, ==, CELL_QUEUE_FIXED);
+ tt_assert((uintptr_t)q->u.fixed.cell == cellintptr);
+ }
+ /* Do perverse things to it */
+ tor_free(q->u.fixed.cell);
+ q->u.fixed.cell = NULL;
+
+ /*
+ * Now change back to open with channel_change_state() and assert that it
+ * gets thrown away properly.
+ */
+ test_chan_accept_cells = 1;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_assert(test_cells_written == old_count);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ /* Same thing but for a var_cell */
+
+ test_chan_accept_cells = 0;
+ ch->state = CHANNEL_STATE_MAINT;
+ var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
+ make_fake_var_cell(var_cell);
+ cellintptr = (uintptr_t)(void*)var_cell;
+ channel_write_var_cell(ch, var_cell);
+
+ /* Check that it's queued */
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
+ tt_assert(q);
+ if (q) {
+ tt_int_op(q->type, ==, CELL_QUEUE_VAR);
+ tt_assert((uintptr_t)q->u.var.var_cell == cellintptr);
+ }
+
+ /* Remove the cell from the queue entry */
+ tor_free(q->u.var.var_cell);
+ q->u.var.var_cell = NULL;
+
+ /* Let it drain and check that the bad entry is discarded */
+ test_chan_accept_cells = 1;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_assert(test_cells_written == old_count);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ /* Same thing with a packed_cell */
+
+ test_chan_accept_cells = 0;
+ ch->state = CHANNEL_STATE_MAINT;
+ packed_cell = packed_cell_new();
+ tt_assert(packed_cell);
+ cellintptr = (uintptr_t)(void*)packed_cell;
+ channel_write_packed_cell(ch, packed_cell);
+
+ /* Check that it's queued */
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
+ tt_assert(q);
+ if (q) {
+ tt_int_op(q->type, ==, CELL_QUEUE_PACKED);
+ tt_assert((uintptr_t)q->u.packed.packed_cell == cellintptr);
+ }
+
+ /* Remove the cell from the queue entry */
+ packed_cell_free(q->u.packed.packed_cell);
+ q->u.packed.packed_cell = NULL;
+
+ /* Let it drain and check that the bad entry is discarded */
+ test_chan_accept_cells = 1;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_assert(test_cells_written == old_count);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ /* Unknown cell type case */
+ test_chan_accept_cells = 0;
+ ch->state = CHANNEL_STATE_MAINT;
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ cellintptr = (uintptr_t)(void*)cell;
+ channel_write_cell(ch, cell);
+
+ /* Check that it's queued */
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 1);
+ q = TOR_SIMPLEQ_FIRST(&(ch->outgoing_queue));
+ tt_assert(q);
+ if (q) {
+ tt_int_op(q->type, ==, CELL_QUEUE_FIXED);
+ tt_assert((uintptr_t)q->u.fixed.cell == cellintptr);
+ }
+ /* Clobber it, including the queue entry type */
+ tor_free(q->u.fixed.cell);
+ q->u.fixed.cell = NULL;
+ q->type = CELL_QUEUE_PACKED + 1;
+
+ /* Let it drain and check that the bad entry is discarded */
+ test_chan_accept_cells = 1;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_assert(test_cells_written == old_count);
+ tt_int_op(chan_cell_queue_len(&(ch->outgoing_queue)), ==, 0);
+
+ done:
+ free_fake_channel(ch);
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ /*
+ * Doing that meant that we couldn't correctly adjust the queue size
+ * for the var cell, so manually reset the global queue size estimate
+ * so the next test doesn't break if we run with --no-fork.
+ */
+ estimated_total_queue_size = global_queue_estimate;
+
+ return;
+}
+
+static void
+test_channel_queue_size(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = NULL;
+ int n, old_count;
+ uint64_t global_queue_estimate;
+
+ (void)arg;
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+
+ /* Initial queue size update */
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Test the call-through to our fake lower layer */
+ n = channel_num_cells_writeable(ch);
+ /* chan_test_num_cells_writeable() always returns 32 */
+ tt_int_op(n, ==, 32);
+
+ /*
+ * Now we queue some cells and check that channel_num_cells_writeable()
+ * adjusts properly
+ */
+
+ /* tell it not to accept cells */
+ test_chan_accept_cells = 0;
+ /* ...and keep it from trying to flush the queue */
+ ch->state = CHANNEL_STATE_MAINT;
+
+ /* Get a fresh cell */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+
+ old_count = test_cells_written;
+ channel_write_cell(ch, cell);
+ /* Assert that it got queued, not written through, correctly */
+ tt_int_op(test_cells_written, ==, old_count);
+
+ /* Now check chan_test_num_cells_writeable() again */
+ n = channel_num_cells_writeable(ch);
+ tt_int_op(n, ==, 0); /* Should return 0 since we're in CHANNEL_STATE_MAINT */
+
+ /* Update queue size estimates */
+ channel_update_xmit_queue_size(ch);
+ /* One cell, times an overhead factor of 1.0 */
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ /* Try a different overhead factor */
+ test_overhead_estimate = 0.5f;
+ /* This one should be ignored since it's below 1.0 */
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ /* Now try a larger one */
+ test_overhead_estimate = 2.0f;
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 1024);
+ /* Go back to 1.0 */
+ test_overhead_estimate = 1.0f;
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ /* Check the global estimate too */
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 512);
+
+ /* Go to open */
+ old_count = test_cells_written;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+
+ /*
+ * It should try to write, but we aren't accepting cells right now, so
+ * it'll requeue
+ */
+ tt_int_op(test_cells_written, ==, old_count);
+
+ /* Check the queue size again */
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 512);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 512);
+
+ /*
+ * Now the cell is in the queue, and we're open, so we should get 31
+ * writeable cells.
+ */
+ n = channel_num_cells_writeable(ch);
+ tt_int_op(n, ==, 31);
+
+ /* Accept cells again */
+ test_chan_accept_cells = 1;
+ /* ...and re-process the queue */
+ old_count = test_cells_written;
+ channel_flush_cells(ch);
+ tt_int_op(test_cells_written, ==, old_count + 1);
+
+ /* Should have 32 writeable now */
+ n = channel_num_cells_writeable(ch);
+ tt_int_op(n, ==, 32);
+
+ /* Should have queue size estimate of zero */
+ channel_update_xmit_queue_size(ch);
+ tt_u64_op(ch->bytes_queued_for_xmit, ==, 0);
+ global_queue_estimate = channel_get_global_queue_estimate();
+ tt_u64_op(global_queue_estimate, ==, 0);
+
+ /* Okay, now we're done with this one */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_mark_for_close(ch);
+ UNMOCK(scheduler_release_channel);
+
+ done:
+ free_fake_channel(ch);
+
+ return;
+}
+
+static void
+test_channel_write(void *arg)
+{
+ channel_t *ch = NULL;
+ cell_t *cell = tor_malloc_zero(sizeof(cell_t));
+ packed_cell_t *packed_cell = NULL;
+ var_cell_t *var_cell =
+ tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
+ int old_count;
+
+ (void)arg;
+
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ packed_cell = packed_cell_new();
+ tt_assert(packed_cell);
+
+ ch = new_fake_channel();
+ tt_assert(ch);
+ make_fake_cell(cell);
+ make_fake_var_cell(var_cell);
+
+ /* Tell it to accept cells */
+ test_chan_accept_cells = 1;
+
+ old_count = test_cells_written;
+ channel_write_cell(ch, cell);
+ cell = NULL;
+ tt_assert(test_cells_written == old_count + 1);
+
+ channel_write_var_cell(ch, var_cell);
+ var_cell = NULL;
+ tt_assert(test_cells_written == old_count + 2);
+
+ channel_write_packed_cell(ch, packed_cell);
+ packed_cell = NULL;
+ tt_assert(test_cells_written == old_count + 3);
+
+ /* Now we test queueing; tell it not to accept cells */
+ test_chan_accept_cells = 0;
+ /* ...and keep it from trying to flush the queue */
+ ch->state = CHANNEL_STATE_MAINT;
+
+ /* Get a fresh cell */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+
+ old_count = test_cells_written;
+ channel_write_cell(ch, cell);
+ tt_assert(test_cells_written == old_count);
+
+ /*
+ * Now change back to open with channel_change_state() and assert that it
+ * gets drained from the queue.
+ */
+ test_chan_accept_cells = 1;
+ channel_change_state(ch, CHANNEL_STATE_OPEN);
+ tt_assert(test_cells_written == old_count + 1);
+
+ /*
+ * Check the note destroy case
+ */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ cell->command = CELL_DESTROY;
+
+ /* Set up the mock */
+ MOCK(channel_note_destroy_not_pending,
+ channel_note_destroy_not_pending_mock);
+
+ old_count = test_destroy_not_pending_calls;
+ channel_write_cell(ch, cell);
+ tt_assert(test_destroy_not_pending_calls == old_count + 1);
+
+ /* Now send a non-destroy and check we don't call it */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch, cell);
+ tt_assert(test_destroy_not_pending_calls == old_count + 1);
+
+ UNMOCK(channel_note_destroy_not_pending);
+
+ /*
+ * Now switch it to CLOSING so we can test the discard-cells case
+ * in the channel_write_*() functions.
+ */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_mark_for_close(ch);
+ UNMOCK(scheduler_release_channel);
+
+ /* Send cells that will drop in the closing state */
+ old_count = test_cells_written;
+
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+ channel_write_cell(ch, cell);
+ cell = NULL;
+ tt_assert(test_cells_written == old_count);
+
+ var_cell = tor_malloc_zero(sizeof(var_cell_t) + CELL_PAYLOAD_SIZE);
+ make_fake_var_cell(var_cell);
+ channel_write_var_cell(ch, var_cell);
+ var_cell = NULL;
+ tt_assert(test_cells_written == old_count);
+
+ packed_cell = packed_cell_new();
+ channel_write_packed_cell(ch, packed_cell);
+ packed_cell = NULL;
+ tt_assert(test_cells_written == old_count);
+
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ done:
+ free_fake_channel(ch);
+ tor_free(var_cell);
+ tor_free(cell);
+ packed_cell_free(packed_cell);
+ return;
+}
+
+struct testcase_t channel_tests[] = {
+ { "dumpstats", test_channel_dumpstats, TT_FORK, NULL, NULL },
+ { "flush", test_channel_flush, TT_FORK, NULL, NULL },
+ { "flushmux", test_channel_flushmux, TT_FORK, NULL, NULL },
+ { "incoming", test_channel_incoming, TT_FORK, NULL, NULL },
+ { "lifecycle", test_channel_lifecycle, TT_FORK, NULL, NULL },
+ { "lifecycle_2", test_channel_lifecycle_2, TT_FORK, NULL, NULL },
+ { "multi", test_channel_multi, TT_FORK, NULL, NULL },
+ { "queue_impossible", test_channel_queue_impossible, TT_FORK, NULL, NULL },
+ { "queue_size", test_channel_queue_size, TT_FORK, NULL, NULL },
+ { "write", test_channel_write, TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_channeltls.c b/src/test/test_channeltls.c
new file mode 100644
index 0000000000..016e504ab3
--- /dev/null
+++ b/src/test/test_channeltls.c
@@ -0,0 +1,333 @@
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include <math.h>
+
+#define TOR_CHANNEL_INTERNAL_
+#include "or.h"
+#include "address.h"
+#include "buffers.h"
+#include "channel.h"
+#include "channeltls.h"
+#include "connection_or.h"
+#include "config.h"
+/* For init/free stuff */
+#include "scheduler.h"
+#include "tortls.h"
+
+/* Test suite stuff */
+#include "test.h"
+#include "fakechans.h"
+
+/* The channeltls unit tests */
+static void test_channeltls_create(void *arg);
+static void test_channeltls_num_bytes_queued(void *arg);
+static void test_channeltls_overhead_estimate(void *arg);
+
+/* Mocks used by channeltls unit tests */
+static size_t tlschan_buf_datalen_mock(const buf_t *buf);
+static or_connection_t * tlschan_connection_or_connect_mock(
+ const tor_addr_t *addr,
+ uint16_t port,
+ const char *digest,
+ channel_tls_t *tlschan);
+static int tlschan_is_local_addr_mock(const tor_addr_t *addr);
+
+/* Fake close method */
+static void tlschan_fake_close_method(channel_t *chan);
+
+/* Flags controlling behavior of channeltls unit test mocks */
+static int tlschan_local = 0;
+static const buf_t * tlschan_buf_datalen_mock_target = NULL;
+static size_t tlschan_buf_datalen_mock_size = 0;
+
+/* Thing to cast to fake tor_tls_t * to appease assert_connection_ok() */
+static int fake_tortls = 0; /* Bleh... */
+
+static void
+test_channeltls_create(void *arg)
+{
+ tor_addr_t test_addr;
+ channel_t *ch = NULL;
+ const char test_digest[DIGEST_LEN] = {
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 };
+
+ (void)arg;
+
+ /* Set up a fake address to fake-connect to */
+ test_addr.family = AF_INET;
+ test_addr.addr.in_addr.s_addr = htonl(0x01020304);
+
+ /* For this test we always want the address to be treated as non-local */
+ tlschan_local = 0;
+ /* Install is_local_addr() mock */
+ MOCK(is_local_addr, tlschan_is_local_addr_mock);
+
+ /* Install mock for connection_or_connect() */
+ MOCK(connection_or_connect, tlschan_connection_or_connect_mock);
+
+ /* Try connecting */
+ ch = channel_tls_connect(&test_addr, 567, test_digest);
+ tt_assert(ch != NULL);
+
+ done:
+ if (ch) {
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ /*
+ * Use fake close method that doesn't try to do too much to fake
+ * orconn
+ */
+ ch->close = tlschan_fake_close_method;
+ channel_mark_for_close(ch);
+ free_fake_channel(ch);
+ UNMOCK(scheduler_release_channel);
+ }
+
+ UNMOCK(connection_or_connect);
+ UNMOCK(is_local_addr);
+
+ return;
+}
+
+static void
+test_channeltls_num_bytes_queued(void *arg)
+{
+ tor_addr_t test_addr;
+ channel_t *ch = NULL;
+ const char test_digest[DIGEST_LEN] = {
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 };
+ channel_tls_t *tlschan = NULL;
+ size_t len;
+ int fake_outbuf = 0, n;
+
+ (void)arg;
+
+ /* Set up a fake address to fake-connect to */
+ test_addr.family = AF_INET;
+ test_addr.addr.in_addr.s_addr = htonl(0x01020304);
+
+ /* For this test we always want the address to be treated as non-local */
+ tlschan_local = 0;
+ /* Install is_local_addr() mock */
+ MOCK(is_local_addr, tlschan_is_local_addr_mock);
+
+ /* Install mock for connection_or_connect() */
+ MOCK(connection_or_connect, tlschan_connection_or_connect_mock);
+
+ /* Try connecting */
+ ch = channel_tls_connect(&test_addr, 567, test_digest);
+ tt_assert(ch != NULL);
+
+ /*
+ * Next, we have to test ch->num_bytes_queued, which is
+ * channel_tls_num_bytes_queued_method. We can't mock
+ * connection_get_outbuf_len() directly because it's static INLINE
+ * in connection.h, but we can mock buf_datalen(). Note that
+ * if bufferevents ever work, this will break with them enabled.
+ */
+
+ tt_assert(ch->num_bytes_queued != NULL);
+ tlschan = BASE_CHAN_TO_TLS(ch);
+ tt_assert(tlschan != NULL);
+ if (TO_CONN(tlschan->conn)->outbuf == NULL) {
+ /* We need an outbuf to make sure buf_datalen() gets called */
+ fake_outbuf = 1;
+ TO_CONN(tlschan->conn)->outbuf = buf_new();
+ }
+ tlschan_buf_datalen_mock_target = TO_CONN(tlschan->conn)->outbuf;
+ tlschan_buf_datalen_mock_size = 1024;
+ MOCK(buf_datalen, tlschan_buf_datalen_mock);
+ len = ch->num_bytes_queued(ch);
+ tt_int_op(len, ==, tlschan_buf_datalen_mock_size);
+ /*
+ * We also cover num_cells_writeable here; since wide_circ_ids = 0 on
+ * the fake tlschans, cell_network_size returns 512, and so with
+ * tlschan_buf_datalen_mock_size == 1024, we should be able to write
+ * ceil((OR_CONN_HIGHWATER - 1024) / 512) = ceil(OR_CONN_HIGHWATER / 512)
+ * - 2 cells.
+ */
+ n = ch->num_cells_writeable(ch);
+ tt_int_op(n, ==, CEIL_DIV(OR_CONN_HIGHWATER, 512) - 2);
+ UNMOCK(buf_datalen);
+ tlschan_buf_datalen_mock_target = NULL;
+ tlschan_buf_datalen_mock_size = 0;
+ if (fake_outbuf) {
+ buf_free(TO_CONN(tlschan->conn)->outbuf);
+ TO_CONN(tlschan->conn)->outbuf = NULL;
+ }
+
+ done:
+ if (ch) {
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ /*
+ * Use fake close method that doesn't try to do too much to fake
+ * orconn
+ */
+ ch->close = tlschan_fake_close_method;
+ channel_mark_for_close(ch);
+ free_fake_channel(ch);
+ UNMOCK(scheduler_release_channel);
+ }
+
+ UNMOCK(connection_or_connect);
+ UNMOCK(is_local_addr);
+
+ return;
+}
+
+static void
+test_channeltls_overhead_estimate(void *arg)
+{
+ tor_addr_t test_addr;
+ channel_t *ch = NULL;
+ const char test_digest[DIGEST_LEN] = {
+ 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a,
+ 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14 };
+ float r;
+ channel_tls_t *tlschan = NULL;
+
+ (void)arg;
+
+ /* Set up a fake address to fake-connect to */
+ test_addr.family = AF_INET;
+ test_addr.addr.in_addr.s_addr = htonl(0x01020304);
+
+ /* For this test we always want the address to be treated as non-local */
+ tlschan_local = 0;
+ /* Install is_local_addr() mock */
+ MOCK(is_local_addr, tlschan_is_local_addr_mock);
+
+ /* Install mock for connection_or_connect() */
+ MOCK(connection_or_connect, tlschan_connection_or_connect_mock);
+
+ /* Try connecting */
+ ch = channel_tls_connect(&test_addr, 567, test_digest);
+ tt_assert(ch != NULL);
+
+ /* First case: silly low ratios should get clamped to 1.0f */
+ tlschan = BASE_CHAN_TO_TLS(ch);
+ tt_assert(tlschan != NULL);
+ tlschan->conn->bytes_xmitted = 128;
+ tlschan->conn->bytes_xmitted_by_tls = 64;
+ r = ch->get_overhead_estimate(ch);
+ tt_assert(fabsf(r - 1.0f) < 1E-12);
+
+ tlschan->conn->bytes_xmitted_by_tls = 127;
+ r = ch->get_overhead_estimate(ch);
+ tt_assert(fabsf(r - 1.0f) < 1E-12);
+
+ /* Now middle of the range */
+ tlschan->conn->bytes_xmitted_by_tls = 192;
+ r = ch->get_overhead_estimate(ch);
+ tt_assert(fabsf(r - 1.5f) < 1E-12);
+
+ /* Now above the 2.0f clamp */
+ tlschan->conn->bytes_xmitted_by_tls = 257;
+ r = ch->get_overhead_estimate(ch);
+ tt_assert(fabsf(r - 2.0f) < 1E-12);
+
+ tlschan->conn->bytes_xmitted_by_tls = 512;
+ r = ch->get_overhead_estimate(ch);
+ tt_assert(fabsf(r - 2.0f) < 1E-12);
+
+ done:
+ if (ch) {
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ /*
+ * Use fake close method that doesn't try to do too much to fake
+ * orconn
+ */
+ ch->close = tlschan_fake_close_method;
+ channel_mark_for_close(ch);
+ free_fake_channel(ch);
+ UNMOCK(scheduler_release_channel);
+ }
+
+ UNMOCK(connection_or_connect);
+ UNMOCK(is_local_addr);
+
+ return;
+}
+
+static size_t
+tlschan_buf_datalen_mock(const buf_t *buf)
+{
+ if (buf != NULL && buf == tlschan_buf_datalen_mock_target) {
+ return tlschan_buf_datalen_mock_size;
+ } else {
+ return buf_datalen__real(buf);
+ }
+}
+
+static or_connection_t *
+tlschan_connection_or_connect_mock(const tor_addr_t *addr,
+ uint16_t port,
+ const char *digest,
+ channel_tls_t *tlschan)
+{
+ or_connection_t *result = NULL;
+
+ tt_assert(addr != NULL);
+ tt_assert(port != 0);
+ tt_assert(digest != NULL);
+ tt_assert(tlschan != NULL);
+
+ /* Make a fake orconn */
+ result = tor_malloc_zero(sizeof(*result));
+ result->base_.magic = OR_CONNECTION_MAGIC;
+ result->base_.state = OR_CONN_STATE_OPEN;
+ result->base_.type = CONN_TYPE_OR;
+ result->base_.socket_family = addr->family;
+ result->base_.address = tor_strdup("<fake>");
+ memcpy(&(result->base_.addr), addr, sizeof(tor_addr_t));
+ result->base_.port = port;
+ memcpy(result->identity_digest, digest, DIGEST_LEN);
+ result->chan = tlschan;
+ memcpy(&(result->real_addr), addr, sizeof(tor_addr_t));
+ result->tls = (tor_tls_t *)((void *)(&fake_tortls));
+
+ done:
+ return result;
+}
+
+static void
+tlschan_fake_close_method(channel_t *chan)
+{
+ channel_tls_t *tlschan = NULL;
+
+ tt_assert(chan != NULL);
+ tt_int_op(chan->magic, ==, TLS_CHAN_MAGIC);
+
+ tlschan = BASE_CHAN_TO_TLS(chan);
+ tt_assert(tlschan != NULL);
+
+ /* Just free the fake orconn */
+ tor_free(tlschan->conn->base_.address);
+ tor_free(tlschan->conn);
+
+ channel_closed(chan);
+
+ done:
+ return;
+}
+
+static int
+tlschan_is_local_addr_mock(const tor_addr_t *addr)
+{
+ tt_assert(addr != NULL);
+
+ done:
+ return tlschan_local;
+}
+
+struct testcase_t channeltls_tests[] = {
+ { "create", test_channeltls_create, TT_FORK, NULL, NULL },
+ { "num_bytes_queued", test_channeltls_num_bytes_queued,
+ TT_FORK, NULL, NULL },
+ { "overhead_estimate", test_channeltls_overhead_estimate,
+ TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_checkdir.c b/src/test/test_checkdir.c
index 185e5fbef1..ae859449cb 100644
--- a/src/test/test_checkdir.c
+++ b/src/test/test_checkdir.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Tor Project, Inc. */
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -10,6 +10,10 @@
#ifdef _WIN32
#define mkdir(a,b) mkdir(a)
+#define tt_int_op_nowin(a,op,b) do { (void)(a); (void)(b); } while (0)
+#define umask(mask) ((void)0)
+#else
+#define tt_int_op_nowin(a,op,b) tt_int_op((a),op,(b))
#endif
/** Run unit tests for private dir permission enforcement logic. */
@@ -19,50 +23,52 @@ test_checkdir_perms(void *testdata)
(void)testdata;
or_options_t *options = get_options_mutable();
const char *subdir = "test_checkdir";
- char *testdir;
+ char *testdir = NULL;
cpd_check_t cpd_chkopts;
cpd_check_t unix_create_opts;
cpd_check_t unix_verify_optsmask;
struct stat st;
+ umask(022);
+
/* setup data directory before tests. */
tor_free(options->DataDirectory);
options->DataDirectory = tor_strdup(get_fname(subdir));
- tt_int_op(mkdir(options->DataDirectory, 0750), ==, 0);
+ tt_int_op(mkdir(options->DataDirectory, 0750), OP_EQ, 0);
/* test: create new dir, no flags. */
testdir = get_datadir_fname("checkdir_new_none");
cpd_chkopts = CPD_CREATE;
unix_verify_optsmask = 0077;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: create new dir, CPD_GROUP_OK option set. */
testdir = get_datadir_fname("checkdir_new_groupok");
cpd_chkopts = CPD_CREATE|CPD_GROUP_OK;
unix_verify_optsmask = 0077;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: should get an error on existing dir with
wrong perms */
testdir = get_datadir_fname("checkdir_new_groupok_err");
- tt_int_op(0, ==, mkdir(testdir, 027));
+ tt_int_op(0, OP_EQ, mkdir(testdir, 027));
cpd_chkopts = CPD_CHECK_MODE_ONLY|CPD_CREATE|CPD_GROUP_OK;
- tt_int_op(-1, ==, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op_nowin(-1, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
tor_free(testdir);
/* test: create new dir, CPD_GROUP_READ option set. */
testdir = get_datadir_fname("checkdir_new_groupread");
cpd_chkopts = CPD_CREATE|CPD_GROUP_READ;
unix_verify_optsmask = 0027;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: check existing dir created with defaults,
@@ -72,10 +78,10 @@ test_checkdir_perms(void *testdata)
unix_create_opts = 0700;
(void)unix_create_opts;
unix_verify_optsmask = 0077;
- tt_int_op(0, ==, mkdir(testdir, unix_create_opts));
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, mkdir(testdir, unix_create_opts));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: check existing dir created with defaults,
@@ -83,11 +89,11 @@ test_checkdir_perms(void *testdata)
testdir = get_datadir_fname("checkdir_exists_groupok");
cpd_chkopts = CPD_CREATE;
unix_verify_optsmask = 0077;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
cpd_chkopts = CPD_GROUP_OK;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: check existing dir created with defaults,
@@ -95,11 +101,11 @@ test_checkdir_perms(void *testdata)
testdir = get_datadir_fname("checkdir_exists_groupread");
cpd_chkopts = CPD_CREATE;
unix_verify_optsmask = 0027;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
cpd_chkopts = CPD_GROUP_READ;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: check existing dir created with CPD_GROUP_READ,
@@ -107,11 +113,11 @@ test_checkdir_perms(void *testdata)
testdir = get_datadir_fname("checkdir_existsread_groupok");
cpd_chkopts = CPD_CREATE|CPD_GROUP_READ;
unix_verify_optsmask = 0027;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
cpd_chkopts = CPD_GROUP_OK;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
tor_free(testdir);
/* test: check existing dir created with CPD_GROUP_READ,
@@ -119,20 +125,19 @@ test_checkdir_perms(void *testdata)
testdir = get_datadir_fname("checkdir_existsread_groupread");
cpd_chkopts = CPD_CREATE|CPD_GROUP_READ;
unix_verify_optsmask = 0027;
- tt_int_op(0, ==, check_private_dir(testdir, cpd_chkopts, NULL));
- tt_int_op(0, ==, stat(testdir, &st));
- tt_int_op(0, ==, (st.st_mode & unix_verify_optsmask));
- tor_free(testdir);
+ tt_int_op(0, OP_EQ, check_private_dir(testdir, cpd_chkopts, NULL));
+ tt_int_op(0, OP_EQ, stat(testdir, &st));
+ tt_int_op_nowin(0, OP_EQ, (st.st_mode & unix_verify_optsmask));
- done:
- ;
+ done:
+ tor_free(testdir);
}
#define CHECKDIR(name,flags) \
{ #name, test_checkdir_##name, (flags), NULL, NULL }
struct testcase_t checkdir_tests[] = {
- CHECKDIR(perms, 0),
+ CHECKDIR(perms, TT_FORK),
END_OF_TESTCASES
};
diff --git a/src/test/test_circuitlist.c b/src/test/test_circuitlist.c
index fb5488b627..0760accfc1 100644
--- a/src/test/test_circuitlist.c
+++ b/src/test/test_circuitlist.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define TOR_CHANNEL_INTERNAL_
@@ -50,17 +50,17 @@ circuitmux_detach_mock(circuitmux_t *cmux, circuit_t *circ)
}
#define GOT_CMUX_ATTACH(mux_, circ_, dir_) do { \
- tt_int_op(cam.ncalls, ==, 1); \
- tt_ptr_op(cam.cmux, ==, (mux_)); \
- tt_ptr_op(cam.circ, ==, (circ_)); \
- tt_int_op(cam.dir, ==, (dir_)); \
+ tt_int_op(cam.ncalls, OP_EQ, 1); \
+ tt_ptr_op(cam.cmux, OP_EQ, (mux_)); \
+ tt_ptr_op(cam.circ, OP_EQ, (circ_)); \
+ tt_int_op(cam.dir, OP_EQ, (dir_)); \
memset(&cam, 0, sizeof(cam)); \
} while (0)
#define GOT_CMUX_DETACH(mux_, circ_) do { \
- tt_int_op(cdm.ncalls, ==, 1); \
- tt_ptr_op(cdm.cmux, ==, (mux_)); \
- tt_ptr_op(cdm.circ, ==, (circ_)); \
+ tt_int_op(cdm.ncalls, OP_EQ, 1); \
+ tt_ptr_op(cdm.cmux, OP_EQ, (mux_)); \
+ tt_ptr_op(cdm.circ, OP_EQ, (circ_)); \
memset(&cdm, 0, sizeof(cdm)); \
} while (0)
@@ -90,14 +90,14 @@ test_clist_maps(void *arg)
or_c1 = or_circuit_new(100, ch2);
tt_assert(or_c1);
GOT_CMUX_ATTACH(ch2->cmux, or_c1, CELL_DIRECTION_IN);
- tt_int_op(or_c1->p_circ_id, ==, 100);
- tt_ptr_op(or_c1->p_chan, ==, ch2);
+ tt_int_op(or_c1->p_circ_id, OP_EQ, 100);
+ tt_ptr_op(or_c1->p_chan, OP_EQ, ch2);
or_c2 = or_circuit_new(100, ch1);
tt_assert(or_c2);
GOT_CMUX_ATTACH(ch1->cmux, or_c2, CELL_DIRECTION_IN);
- tt_int_op(or_c2->p_circ_id, ==, 100);
- tt_ptr_op(or_c2->p_chan, ==, ch1);
+ tt_int_op(or_c2->p_circ_id, OP_EQ, 100);
+ tt_ptr_op(or_c2->p_chan, OP_EQ, ch1);
circuit_set_n_circid_chan(TO_CIRCUIT(or_c1), 200, ch1);
GOT_CMUX_ATTACH(ch1->cmux, or_c1, CELL_DIRECTION_OUT);
@@ -105,11 +105,11 @@ test_clist_maps(void *arg)
circuit_set_n_circid_chan(TO_CIRCUIT(or_c2), 200, ch2);
GOT_CMUX_ATTACH(ch2->cmux, or_c2, CELL_DIRECTION_OUT);
- tt_ptr_op(circuit_get_by_circid_channel(200, ch1), ==, TO_CIRCUIT(or_c1));
- tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
- tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch1), OP_EQ, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1));
/* Try the same thing again, to test the "fast" path. */
- tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, TO_CIRCUIT(or_c1));
tt_assert(circuit_id_in_use_on_channel(100, ch2));
tt_assert(! circuit_id_in_use_on_channel(101, ch2));
@@ -117,9 +117,9 @@ test_clist_maps(void *arg)
circuit_set_p_circid_chan(or_c1, 500, ch3);
GOT_CMUX_DETACH(ch2->cmux, TO_CIRCUIT(or_c1));
GOT_CMUX_ATTACH(ch3->cmux, TO_CIRCUIT(or_c1), CELL_DIRECTION_IN);
- tt_ptr_op(circuit_get_by_circid_channel(100, ch2), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch2), OP_EQ, NULL);
tt_assert(! circuit_id_in_use_on_channel(100, ch2));
- tt_ptr_op(circuit_get_by_circid_channel(500, ch3), ==, TO_CIRCUIT(or_c1));
+ tt_ptr_op(circuit_get_by_circid_channel(500, ch3), OP_EQ, TO_CIRCUIT(or_c1));
/* Now let's see about destroy handling. */
tt_assert(! circuit_id_in_use_on_channel(205, ch2));
@@ -132,26 +132,26 @@ test_clist_maps(void *arg)
tt_assert(circuit_id_in_use_on_channel(100, ch1));
tt_assert(TO_CIRCUIT(or_c2)->n_delete_pending != 0);
- tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, TO_CIRCUIT(or_c2));
- tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, TO_CIRCUIT(or_c2));
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, TO_CIRCUIT(or_c2));
/* Okay, now free ch2 and make sure that the circuit ID is STILL not
* usable, because we haven't declared the destroy to be nonpending */
- tt_int_op(cdm.ncalls, ==, 0);
+ tt_int_op(cdm.ncalls, OP_EQ, 0);
circuit_free(TO_CIRCUIT(or_c2));
or_c2 = NULL; /* prevent free */
- tt_int_op(cdm.ncalls, ==, 2);
+ tt_int_op(cdm.ncalls, OP_EQ, 2);
memset(&cdm, 0, sizeof(cdm));
tt_assert(circuit_id_in_use_on_channel(200, ch2));
tt_assert(circuit_id_in_use_on_channel(100, ch1));
- tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
- tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL);
/* Now say that the destroy is nonpending */
channel_note_destroy_not_pending(ch2, 200);
- tt_ptr_op(circuit_get_by_circid_channel(200, ch2), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(200, ch2), OP_EQ, NULL);
channel_note_destroy_not_pending(ch1, 100);
- tt_ptr_op(circuit_get_by_circid_channel(100, ch1), ==, NULL);
+ tt_ptr_op(circuit_get_by_circid_channel(100, ch1), OP_EQ, NULL);
tt_assert(! circuit_id_in_use_on_channel(200, ch2));
tt_assert(! circuit_id_in_use_on_channel(100, ch1));
@@ -190,73 +190,73 @@ test_rend_token_maps(void *arg)
c4 = or_circuit_new(0, NULL);
/* Make sure we really filled up the tok* variables */
- tt_int_op(tok1[REND_TOKEN_LEN-1], ==, 'y');
- tt_int_op(tok2[REND_TOKEN_LEN-1], ==, ' ');
- tt_int_op(tok3[REND_TOKEN_LEN-1], ==, '.');
+ tt_int_op(tok1[REND_TOKEN_LEN-1], OP_EQ, 'y');
+ tt_int_op(tok2[REND_TOKEN_LEN-1], OP_EQ, ' ');
+ tt_int_op(tok3[REND_TOKEN_LEN-1], OP_EQ, '.');
/* No maps; nothing there. */
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok1));
circuit_set_rendezvous_cookie(c1, tok1);
circuit_set_intro_point_digest(c2, tok2);
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok3));
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3));
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2));
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok1));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok3));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok3));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok2));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok1));
/* Without purpose set, we don't get the circuits */
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok2));
c1->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
c2->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
/* Okay, make sure they show up now. */
- tt_ptr_op(c1, ==, circuit_get_rendezvous(tok1));
- tt_ptr_op(c2, ==, circuit_get_intro_point(tok2));
+ tt_ptr_op(c1, OP_EQ, circuit_get_rendezvous(tok1));
+ tt_ptr_op(c2, OP_EQ, circuit_get_intro_point(tok2));
/* Two items at the same place with the same token. */
c3->base_.purpose = CIRCUIT_PURPOSE_REND_POINT_WAITING;
circuit_set_rendezvous_cookie(c3, tok2);
- tt_ptr_op(c2, ==, circuit_get_intro_point(tok2));
- tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2));
+ tt_ptr_op(c2, OP_EQ, circuit_get_intro_point(tok2));
+ tt_ptr_op(c3, OP_EQ, circuit_get_rendezvous(tok2));
/* Marking a circuit makes it not get returned any more */
circuit_mark_for_close(TO_CIRCUIT(c1), END_CIRC_REASON_FINISHED);
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok1));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok1));
circuit_free(TO_CIRCUIT(c1));
c1 = NULL;
/* Freeing a circuit makes it not get returned any more. */
circuit_free(TO_CIRCUIT(c2));
c2 = NULL;
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok2));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok2));
/* c3 -- are you still there? */
- tt_ptr_op(c3, ==, circuit_get_rendezvous(tok2));
+ tt_ptr_op(c3, OP_EQ, circuit_get_rendezvous(tok2));
/* Change its cookie. This never happens in Tor per se, but hey. */
c3->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
circuit_set_intro_point_digest(c3, tok3);
- tt_ptr_op(NULL, ==, circuit_get_rendezvous(tok2));
- tt_ptr_op(c3, ==, circuit_get_intro_point(tok3));
+ tt_ptr_op(NULL, OP_EQ, circuit_get_rendezvous(tok2));
+ tt_ptr_op(c3, OP_EQ, circuit_get_intro_point(tok3));
/* Now replace c3 with c4. */
c4->base_.purpose = CIRCUIT_PURPOSE_INTRO_POINT;
circuit_set_intro_point_digest(c4, tok3);
- tt_ptr_op(c4, ==, circuit_get_intro_point(tok3));
+ tt_ptr_op(c4, OP_EQ, circuit_get_intro_point(tok3));
- tt_ptr_op(c3->rendinfo, ==, NULL);
- tt_ptr_op(c4->rendinfo, !=, NULL);
- tt_mem_op(c4->rendinfo, ==, tok3, REND_TOKEN_LEN);
+ tt_ptr_op(c3->rendinfo, OP_EQ, NULL);
+ tt_ptr_op(c4->rendinfo, OP_NE, NULL);
+ tt_mem_op(c4->rendinfo, OP_EQ, tok3, REND_TOKEN_LEN);
/* Now clear c4's cookie. */
circuit_set_intro_point_digest(c4, NULL);
- tt_ptr_op(c4->rendinfo, ==, NULL);
- tt_ptr_op(NULL, ==, circuit_get_intro_point(tok3));
+ tt_ptr_op(c4->rendinfo, OP_EQ, NULL);
+ tt_ptr_op(NULL, OP_EQ, circuit_get_intro_point(tok3));
done:
if (c1)
@@ -283,32 +283,32 @@ test_pick_circid(void *arg)
chan2->wide_circ_ids = 1;
chan1->circ_id_type = CIRC_ID_TYPE_NEITHER;
- tt_int_op(0, ==, get_unique_circ_id_by_chan(chan1));
+ tt_int_op(0, OP_EQ, get_unique_circ_id_by_chan(chan1));
/* Basic tests, with no collisions */
chan1->circ_id_type = CIRC_ID_TYPE_LOWER;
for (i = 0; i < 50; ++i) {
circid = get_unique_circ_id_by_chan(chan1);
- tt_uint_op(0, <, circid);
- tt_uint_op(circid, <, (1<<15));
+ tt_uint_op(0, OP_LT, circid);
+ tt_uint_op(circid, OP_LT, (1<<15));
}
chan1->circ_id_type = CIRC_ID_TYPE_HIGHER;
for (i = 0; i < 50; ++i) {
circid = get_unique_circ_id_by_chan(chan1);
- tt_uint_op((1<<15), <, circid);
- tt_uint_op(circid, <, (1<<16));
+ tt_uint_op((1<<15), OP_LT, circid);
+ tt_uint_op(circid, OP_LT, (1<<16));
}
chan2->circ_id_type = CIRC_ID_TYPE_LOWER;
for (i = 0; i < 50; ++i) {
circid = get_unique_circ_id_by_chan(chan2);
- tt_uint_op(0, <, circid);
- tt_uint_op(circid, <, (1u<<31));
+ tt_uint_op(0, OP_LT, circid);
+ tt_uint_op(circid, OP_LT, (1u<<31));
}
chan2->circ_id_type = CIRC_ID_TYPE_HIGHER;
for (i = 0; i < 50; ++i) {
circid = get_unique_circ_id_by_chan(chan2);
- tt_uint_op((1u<<31), <, circid);
+ tt_uint_op((1u<<31), OP_LT, circid);
}
/* Now make sure that we can behave well when we are full up on circuits */
@@ -319,20 +319,20 @@ test_pick_circid(void *arg)
for (i = 0; i < (1<<15); ++i) {
circid = get_unique_circ_id_by_chan(chan1);
if (circid == 0) {
- tt_int_op(i, >, (1<<14));
+ tt_int_op(i, OP_GT, (1<<14));
break;
}
- tt_uint_op(circid, <, (1<<15));
+ tt_uint_op(circid, OP_LT, (1<<15));
tt_assert(! bitarray_is_set(ba, circid));
bitarray_set(ba, circid);
channel_mark_circid_unusable(chan1, circid);
}
- tt_int_op(i, <, (1<<15));
+ tt_int_op(i, OP_LT, (1<<15));
/* Make sure that being full on chan1 does not interfere with chan2 */
for (i = 0; i < 100; ++i) {
circid = get_unique_circ_id_by_chan(chan2);
- tt_uint_op(circid, >, 0);
- tt_uint_op(circid, <, (1<<15));
+ tt_uint_op(circid, OP_GT, 0);
+ tt_uint_op(circid, OP_LT, (1<<15));
channel_mark_circid_unusable(chan2, circid);
}
diff --git a/src/test/test_circuitmux.c b/src/test/test_circuitmux.c
index 446fc88b3c..2a2a7ba145 100644
--- a/src/test/test_circuitmux.c
+++ b/src/test/test_circuitmux.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define TOR_CHANNEL_INTERNAL_
@@ -8,6 +8,7 @@
#include "channel.h"
#include "circuitmux.h"
#include "relay.h"
+#include "scheduler.h"
#include "test.h"
/* XXXX duplicated function from test_circuitlist.c */
@@ -35,6 +36,12 @@ test_cmux_destroy_cell_queue(void *arg)
circuit_t *circ = NULL;
cell_queue_t *cq = NULL;
packed_cell_t *pc = NULL;
+ tor_libevent_cfg cfg;
+
+ memset(&cfg, 0, sizeof(cfg));
+
+ tor_libevent_initialize(&cfg);
+ scheduler_init();
#ifdef ENABLE_MEMPOOLS
init_cell_pool();
@@ -55,21 +62,21 @@ test_cmux_destroy_cell_queue(void *arg)
circuitmux_append_destroy_cell(ch, cmux, 190, 6);
circuitmux_append_destroy_cell(ch, cmux, 30, 1);
- tt_int_op(circuitmux_num_cells(cmux), ==, 3);
+ tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 3);
circ = circuitmux_get_first_active_circuit(cmux, &cq);
tt_assert(!circ);
tt_assert(cq);
- tt_int_op(cq->n, ==, 3);
+ tt_int_op(cq->n, OP_EQ, 3);
pc = cell_queue_pop(cq);
tt_assert(pc);
- tt_mem_op(pc->body, ==, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9);
+ tt_mem_op(pc->body, OP_EQ, "\x00\x00\x00\x64\x04\x0a\x00\x00\x00", 9);
packed_cell_free(pc);
pc = NULL;
- tt_int_op(circuitmux_num_cells(cmux), ==, 2);
+ tt_int_op(circuitmux_num_cells(cmux), OP_EQ, 2);
done:
circuitmux_free(cmux);
diff --git a/src/test/test_cmdline_args.py b/src/test/test_cmdline_args.py
index 55d1cdb805..c8e68e8240 100755
--- a/src/test/test_cmdline_args.py
+++ b/src/test/test_cmdline_args.py
@@ -57,14 +57,14 @@ def run_tor(args, failure=False):
raise UnexpectedFailure()
elif not result and failure:
raise UnexpectedSuccess()
- return b2s(output)
+ return b2s(output.replace('\r\n','\n'))
def spaceify_fp(fp):
for i in range(0, len(fp), 4):
yield fp[i:i+4]
def lines(s):
- out = s.split("\n")
+ out = s.splitlines()
if out and out[-1] == '':
del out[-1]
return out
@@ -151,7 +151,7 @@ class CmdlineTests(unittest.TestCase):
if os.stat(TOR).st_mtime < os.stat(main_c).st_mtime:
self.skipTest(TOR+" not up to date")
out = run_tor(["--digests"])
- main_line = [ l for l in lines(out) if l.endswith("/main.c") ]
+ main_line = [ l for l in lines(out) if l.endswith("/main.c") or l.endswith(" main.c") ]
digest, name = main_line[0].split()
f = open(main_c, 'rb')
actual = hashlib.sha1(f.read()).hexdigest()
diff --git a/src/test/test_config.c b/src/test/test_config.c
index 71c338e5f8..b63b78e386 100644
--- a/src/test/test_config.c
+++ b/src/test/test_config.c
@@ -1,11 +1,12 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
#define CONFIG_PRIVATE
+#define PT_PRIVATE
#include "or.h"
#include "addressmap.h"
#include "config.h"
@@ -50,8 +51,7 @@ test_config_addressmap(void *arg)
/* Use old interface for now, so we don't need to rewrite the unit tests */
#define addressmap_rewrite(a,s,eo,ao) \
- addressmap_rewrite((a),(s),AMR_FLAG_USE_IPV4_DNS|AMR_FLAG_USE_IPV6_DNS, \
- (eo),(ao))
+ addressmap_rewrite((a),(s), ~0, (eo),(ao))
/* MapAddress .invalidwildcard.com .torserver.exit - no match */
strlcpy(address, "www.invalidwildcard.com", sizeof(address));
@@ -65,22 +65,22 @@ test_config_addressmap(void *arg)
/* MapAddress .google.com .torserver.exit */
strlcpy(address, "reader.google.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "reader.torserver.exit");
+ tt_str_op(address,OP_EQ, "reader.torserver.exit");
/* MapAddress *.yahoo.com *.google.com.torserver.exit */
strlcpy(address, "reader.yahoo.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "reader.google.com.torserver.exit");
+ tt_str_op(address,OP_EQ, "reader.google.com.torserver.exit");
/*MapAddress *.cnn.com www.cnn.com */
strlcpy(address, "cnn.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "www.cnn.com");
+ tt_str_op(address,OP_EQ, "www.cnn.com");
/* MapAddress .cn.com www.cnn.com */
strlcpy(address, "www.cn.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "www.cnn.com");
+ tt_str_op(address,OP_EQ, "www.cnn.com");
/* MapAddress ex.com www.cnn.com - no match */
strlcpy(address, "www.ex.com", sizeof(address));
@@ -93,19 +93,19 @@ test_config_addressmap(void *arg)
/* Where mapping for FQDN match on FQDN */
strlcpy(address, "www.google.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "3.3.3.3");
+ tt_str_op(address,OP_EQ, "3.3.3.3");
strlcpy(address, "www.torproject.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "1.1.1.1");
+ tt_str_op(address,OP_EQ, "1.1.1.1");
strlcpy(address, "other.torproject.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "this.torproject.org.otherserver.exit");
+ tt_str_op(address,OP_EQ, "this.torproject.org.otherserver.exit");
strlcpy(address, "test.torproject.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "2.2.2.2");
+ tt_str_op(address,OP_EQ, "2.2.2.2");
/* Test a chain of address mappings and the order in which they were added:
"MapAddress www.example.org 4.4.4.4"
@@ -114,12 +114,12 @@ test_config_addressmap(void *arg)
*/
strlcpy(address, "www.example.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "5.5.5.5");
+ tt_str_op(address,OP_EQ, "5.5.5.5");
/* Test infinite address mapping results in no change */
strlcpy(address, "www.infiniteloop.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "www.infiniteloop.org");
+ tt_str_op(address,OP_EQ, "www.infiniteloop.org");
/* Test we don't find false positives */
strlcpy(address, "www.example.com", sizeof(address));
@@ -137,23 +137,23 @@ test_config_addressmap(void *arg)
strlcpy(address, "www.abc.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "www.abc.torserver.exit");
+ tt_str_op(address,OP_EQ, "www.abc.torserver.exit");
strlcpy(address, "www.def.com", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "www.def.torserver.exit");
+ tt_str_op(address,OP_EQ, "www.def.torserver.exit");
strlcpy(address, "www.torproject.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "1.1.1.1");
+ tt_str_op(address,OP_EQ, "1.1.1.1");
strlcpy(address, "test.torproject.org", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "1.1.1.1");
+ tt_str_op(address,OP_EQ, "1.1.1.1");
strlcpy(address, "torproject.net", sizeof(address));
tt_assert(addressmap_rewrite(address, sizeof(address), &expires, NULL));
- tt_str_op(address,==, "2.2.2.2");
+ tt_str_op(address,OP_EQ, "2.2.2.2");
/* We don't support '*' as a mapping directive */
config_free_lines(get_options_mutable()->AddressMap);
@@ -176,6 +176,7 @@ test_config_addressmap(void *arg)
done:
config_free_lines(get_options_mutable()->AddressMap);
get_options_mutable()->AddressMap = NULL;
+ addressmap_free_all();
}
static int
@@ -213,9 +214,9 @@ test_config_check_or_create_data_subdir(void *arg)
subpath = get_datadir_fname(subdir);
#if defined (_WIN32)
- tt_int_op(mkdir(options->DataDirectory), ==, 0);
+ tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0);
#else
- tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0);
+ tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0);
#endif
r = stat(subpath, &st);
@@ -287,9 +288,9 @@ test_config_write_to_data_subdir(void *arg)
filepath = get_datadir_fname2(subdir, fname);
#if defined (_WIN32)
- tt_int_op(mkdir(options->DataDirectory), ==, 0);
+ tt_int_op(mkdir(options->DataDirectory), OP_EQ, 0);
#else
- tt_int_op(mkdir(options->DataDirectory, 0700), ==, 0);
+ tt_int_op(mkdir(options->DataDirectory, 0700), OP_EQ, 0);
#endif
// Write attempt shoudl fail, if subdirectory doesn't exist.
@@ -300,13 +301,13 @@ test_config_write_to_data_subdir(void *arg)
// equal to the original string.
tt_assert(!write_to_data_subdir(subdir, fname, str, NULL));
cp = read_file_to_str(filepath, 0, NULL);
- tt_str_op(cp,==, str);
+ tt_str_op(cp,OP_EQ, str);
tor_free(cp);
// A second write operation should overwrite the old content.
tt_assert(!write_to_data_subdir(subdir, fname, str, NULL));
cp = read_file_to_str(filepath, 0, NULL);
- tt_str_op(cp,==, str);
+ tt_str_op(cp,OP_EQ, str);
tor_free(cp);
done:
@@ -331,7 +332,7 @@ good_bridge_line_test(const char *string, const char *test_addrport,
/* test addrport */
tmp = tor_strdup(fmt_addrport(&bridge_line->addr, bridge_line->port));
- tt_str_op(test_addrport,==, tmp);
+ tt_str_op(test_addrport,OP_EQ, tmp);
tor_free(tmp);
/* If we were asked to validate a digest, but we did not get a
@@ -349,7 +350,7 @@ good_bridge_line_test(const char *string, const char *test_addrport,
if (test_digest) {
tmp = tor_strdup(hex_str(bridge_line->digest, DIGEST_LEN));
tor_strlower(tmp);
- tt_str_op(test_digest,==, tmp);
+ tt_str_op(test_digest,OP_EQ, tmp);
tor_free(tmp);
}
@@ -360,7 +361,7 @@ good_bridge_line_test(const char *string, const char *test_addrport,
if (!test_transport && bridge_line->transport_name)
tt_assert(0);
if (test_transport)
- tt_str_op(test_transport,==, bridge_line->transport_name);
+ tt_str_op(test_transport,OP_EQ, bridge_line->transport_name);
/* Validate the SOCKS argument smartlist. */
if (test_socks_args && !bridge_line->socks_args)
@@ -578,6 +579,8 @@ pt_kickstart_proxy_mock(const smartlist_t *transport_list,
/* XXXX check that args are as expected. */
++pt_kickstart_proxy_mock_call_count;
+
+ free_execve_args(proxy_argv);
}
static int
@@ -839,7 +842,8 @@ test_config_fix_my_family(void *arg)
TT_FAIL(("options_validate failed: %s", err));
}
- tt_str_op(options->MyFamily,==, "$1111111111111111111111111111111111111111, "
+ tt_str_op(options->MyFamily,OP_EQ,
+ "$1111111111111111111111111111111111111111, "
"$1111111111111111111111111111111111111112, "
"$1111111111111111111111111111111111111113");
@@ -852,10 +856,598 @@ test_config_fix_my_family(void *arg)
or_options_free(defaults);
}
+static int n_hostname_01010101 = 0;
+
+/** This mock function is meant to replace tor_lookup_hostname().
+ * It answers with 1.1.1.1 as IP adddress that resulted from lookup.
+ * This function increments <b>n_hostname_01010101</b> counter by one
+ * every time it is called.
+ */
+static int
+tor_lookup_hostname_01010101(const char *name, uint32_t *addr)
+{
+ n_hostname_01010101++;
+
+ if (name && addr) {
+ *addr = ntohl(0x01010101);
+ }
+
+ return 0;
+}
+
+static int n_hostname_localhost = 0;
+
+/** This mock function is meant to replace tor_lookup_hostname().
+ * It answers with 127.0.0.1 as IP adddress that resulted from lookup.
+ * This function increments <b>n_hostname_localhost</b> counter by one
+ * every time it is called.
+ */
+static int
+tor_lookup_hostname_localhost(const char *name, uint32_t *addr)
+{
+ n_hostname_localhost++;
+
+ if (name && addr) {
+ *addr = 0x7f000001;
+ }
+
+ return 0;
+}
+
+static int n_hostname_failure = 0;
+
+/** This mock function is meant to replace tor_lookup_hostname().
+ * It pretends to fail by returning -1 to caller. Also, this function
+ * increments <b>n_hostname_failure</b> every time it is called.
+ */
+static int
+tor_lookup_hostname_failure(const char *name, uint32_t *addr)
+{
+ (void)name;
+ (void)addr;
+
+ n_hostname_failure++;
+
+ return -1;
+}
+
+static int n_gethostname_replacement = 0;
+
+/** This mock function is meant to replace tor_gethostname(). It
+ * responds with string "onionrouter!" as hostname. This function
+ * increments <b>n_gethostname_replacement</b> by one every time
+ * it is called.
+ */
+static int
+tor_gethostname_replacement(char *name, size_t namelen)
+{
+ n_gethostname_replacement++;
+
+ if (name && namelen) {
+ strlcpy(name,"onionrouter!",namelen);
+ }
+
+ return 0;
+}
+
+static int n_gethostname_localhost = 0;
+
+/** This mock function is meant to replace tor_gethostname(). It
+ * responds with string "127.0.0.1" as hostname. This function
+ * increments <b>n_gethostname_localhost</b> by one every time
+ * it is called.
+ */
+static int
+tor_gethostname_localhost(char *name, size_t namelen)
+{
+ n_gethostname_localhost++;
+
+ if (name && namelen) {
+ strlcpy(name,"127.0.0.1",namelen);
+ }
+
+ return 0;
+}
+
+static int n_gethostname_failure = 0;
+
+/** This mock function is meant to replace tor_gethostname.
+ * It pretends to fail by returning -1. This function increments
+ * <b>n_gethostname_failure</b> by one every time it is called.
+ */
+static int
+tor_gethostname_failure(char *name, size_t namelen)
+{
+ (void)name;
+ (void)namelen;
+ n_gethostname_failure++;
+
+ return -1;
+}
+
+static int n_get_interface_address = 0;
+
+/** This mock function is meant to replace get_interface_address().
+ * It answers with address 8.8.8.8. This function increments
+ * <b>n_get_interface_address</b> by one every time it is called.
+ */
+static int
+get_interface_address_08080808(int severity, uint32_t *addr)
+{
+ (void)severity;
+
+ n_get_interface_address++;
+
+ if (addr) {
+ *addr = ntohl(0x08080808);
+ }
+
+ return 0;
+}
+
+static int n_get_interface_address6 = 0;
+static sa_family_t last_address6_family;
+
+/** This mock function is meant to replace get_interface_address6().
+ * It answers with IP address 9.9.9.9 iff both of the following are true:
+ * - <b>family</b> is AF_INET
+ * - <b>addr</b> pointer is not NULL.
+ * This function increments <b>n_get_interface_address6</b> by one every
+ * time it is called.
+ */
+static int
+get_interface_address6_replacement(int severity, sa_family_t family,
+ tor_addr_t *addr)
+{
+ (void)severity;
+
+ last_address6_family = family;
+ n_get_interface_address6++;
+
+ if ((family != AF_INET) || !addr) {
+ return -1;
+ }
+
+ tor_addr_from_ipv4h(addr,0x09090909);
+
+ return 0;
+}
+
+static int n_get_interface_address_failure = 0;
+
+/**
+ * This mock function is meant to replace get_interface_address().
+ * It pretends to fail getting interface address by returning -1.
+ * <b>n_get_interface_address_failure</b> is incremented by one
+ * every time this function is called.
+ */
+static int
+get_interface_address_failure(int severity, uint32_t *addr)
+{
+ (void)severity;
+ (void)addr;
+
+ n_get_interface_address_failure++;
+
+ return -1;
+}
+
+static int n_get_interface_address6_failure = 0;
+
+/**
+ * This mock function is meant to replace get_interface_addres6().
+ * It will pretent to fail by return -1.
+ * <b>n_get_interface_address6_failure</b> is incremented by one
+ * every time this function is called and <b>last_address6_family</b>
+ * is assigned the value of <b>family</b> argument.
+ */
+static int
+get_interface_address6_failure(int severity, sa_family_t family,
+ tor_addr_t *addr)
+{
+ (void)severity;
+ (void)addr;
+ n_get_interface_address6_failure++;
+ last_address6_family = family;
+
+ return -1;
+}
+
+static void
+test_config_resolve_my_address(void *arg)
+{
+ or_options_t *options;
+ uint32_t resolved_addr;
+ const char *method_used;
+ char *hostname_out = NULL;
+ int retval;
+ int prev_n_hostname_01010101;
+ int prev_n_hostname_localhost;
+ int prev_n_hostname_failure;
+ int prev_n_gethostname_replacement;
+ int prev_n_gethostname_failure;
+ int prev_n_gethostname_localhost;
+ int prev_n_get_interface_address;
+ int prev_n_get_interface_address_failure;
+ int prev_n_get_interface_address6;
+ int prev_n_get_interface_address6_failure;
+
+ (void)arg;
+
+ options = options_new();
+
+ options_init(options);
+
+ /*
+ * CASE 1:
+ * If options->Address is a valid IPv4 address string, we want
+ * the corresponding address to be parsed and returned.
+ */
+
+ options->Address = tor_strdup("128.52.128.105");
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(retval == 0);
+ tt_want_str_op(method_used,==,"CONFIGURED");
+ tt_want(hostname_out == NULL);
+ tt_assert(htonl(resolved_addr) == 0x69803480);
+
+ tor_free(options->Address);
+
+/*
+ * CASE 2:
+ * If options->Address is a valid DNS address, we want resolve_my_address()
+ * function to ask tor_lookup_hostname() for help with resolving it
+ * and return the address that was resolved (in host order).
+ */
+
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101);
+
+ tor_free(options->Address);
+ options->Address = tor_strdup("www.torproject.org");
+
+ prev_n_hostname_01010101 = n_hostname_01010101;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(retval == 0);
+ tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1);
+ tt_want_str_op(method_used,==,"RESOLVED");
+ tt_want_str_op(hostname_out,==,"www.torproject.org");
+ tt_assert(htonl(resolved_addr) == 0x01010101);
+
+ UNMOCK(tor_lookup_hostname);
+
+ tor_free(options->Address);
+ tor_free(hostname_out);
+
+/*
+ * CASE 3:
+ * Given that options->Address is NULL, we want resolve_my_address()
+ * to try and use tor_gethostname() to get hostname AND use
+ * tor_lookup_hostname() to get IP address.
+ */
+
+ resolved_addr = 0;
+ tor_free(options->Address);
+ options->Address = NULL;
+
+ MOCK(tor_gethostname,tor_gethostname_replacement);
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_01010101);
+
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+ prev_n_hostname_01010101 = n_hostname_01010101;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(retval == 0);
+ tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
+ tt_want(n_hostname_01010101 == prev_n_hostname_01010101 + 1);
+ tt_want_str_op(method_used,==,"GETHOSTNAME");
+ tt_want_str_op(hostname_out,==,"onionrouter!");
+ tt_assert(htonl(resolved_addr) == 0x01010101);
+
+ UNMOCK(tor_gethostname);
+ UNMOCK(tor_lookup_hostname);
+
+ tor_free(hostname_out);
+
+/*
+ * CASE 4:
+ * Given that options->Address is a local host address, we want
+ * resolve_my_address() function to fail.
+ */
+
+ resolved_addr = 0;
+ tor_free(options->Address);
+ options->Address = tor_strdup("127.0.0.1");
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(resolved_addr == 0);
+ tt_assert(retval == -1);
+
+ tor_free(options->Address);
+ tor_free(hostname_out);
+
+/*
+ * CASE 5:
+ * We want resolve_my_address() to fail if DNS address in options->Address
+ * cannot be resolved.
+ */
+
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_failure);
+
+ prev_n_hostname_failure = n_hostname_failure;
+
+ tor_free(options->Address);
+ options->Address = tor_strdup("www.tor-project.org");
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
+ tt_assert(retval == -1);
+
+ UNMOCK(tor_lookup_hostname);
+
+ tor_free(options->Address);
+ tor_free(hostname_out);
+
+/*
+ * CASE 6:
+ * If options->Address is NULL AND gettting local hostname fails, we want
+ * resolve_my_address() to fail as well.
+ */
+
+ MOCK(tor_gethostname,tor_gethostname_failure);
+
+ prev_n_gethostname_failure = n_gethostname_failure;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_gethostname_failure == prev_n_gethostname_failure + 1);
+ tt_assert(retval == -1);
+
+ UNMOCK(tor_gethostname);
+ tor_free(hostname_out);
+
+/*
+ * CASE 7:
+ * We want resolve_my_address() to try and get network interface address via
+ * get_interface_address() if hostname returned by tor_gethostname() cannot be
+ * resolved into IP address.
+ */
+
+ MOCK(tor_gethostname,tor_gethostname_replacement);
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_failure);
+ MOCK(get_interface_address,get_interface_address_08080808);
+
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+ prev_n_get_interface_address = n_get_interface_address;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(retval == 0);
+ tt_want_int_op(n_gethostname_replacement, ==,
+ prev_n_gethostname_replacement + 1);
+ tt_want_int_op(n_get_interface_address, ==,
+ prev_n_get_interface_address + 1);
+ tt_want_str_op(method_used,==,"INTERFACE");
+ tt_want(hostname_out == NULL);
+ tt_assert(resolved_addr == ntohl(0x08080808));
+
+ UNMOCK(get_interface_address);
+ tor_free(hostname_out);
+
+/*
+ * CASE 8:
+ * Suppose options->Address is NULL AND hostname returned by tor_gethostname()
+ * is unresolvable. We want resolve_my_address to fail if
+ * get_interface_address() fails.
+ */
+
+ MOCK(get_interface_address,get_interface_address_failure);
+
+ prev_n_get_interface_address_failure = n_get_interface_address_failure;
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_get_interface_address_failure ==
+ prev_n_get_interface_address_failure + 1);
+ tt_want(n_gethostname_replacement ==
+ prev_n_gethostname_replacement + 1);
+ tt_assert(retval == -1);
+
+ UNMOCK(get_interface_address);
+ tor_free(hostname_out);
+
+/*
+ * CASE 9:
+ * Given that options->Address is NULL AND tor_lookup_hostname()
+ * fails AND hostname returned by gethostname() resolves
+ * to local IP address, we want resolve_my_address() function to
+ * call get_interface_address6(.,AF_INET,.) and return IP address
+ * the latter function has found.
+ */
+
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_failure);
+ MOCK(tor_gethostname,tor_gethostname_replacement);
+ MOCK(get_interface_address6,get_interface_address6_replacement);
+
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+ prev_n_hostname_failure = n_hostname_failure;
+ prev_n_get_interface_address6 = n_get_interface_address6;
+
+ retval = resolve_my_address(LOG_NOTICE,options,&resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(last_address6_family == AF_INET);
+ tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1);
+ tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
+ tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
+ tt_want(retval == 0);
+ tt_want_str_op(method_used,==,"INTERFACE");
+ tt_assert(htonl(resolved_addr) == 0x09090909);
+
+ UNMOCK(tor_lookup_hostname);
+ UNMOCK(tor_gethostname);
+ UNMOCK(get_interface_address6);
+
+ tor_free(hostname_out);
+
+ /*
+ * CASE 10: We want resolve_my_address() to fail if all of the following
+ * are true:
+ * 1. options->Address is not NULL
+ * 2. ... but it cannot be converted to struct in_addr by
+ * tor_inet_aton()
+ * 3. ... and tor_lookup_hostname() fails to resolve the
+ * options->Address
+ */
+
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_failure);
+
+ prev_n_hostname_failure = n_hostname_failure;
+
+ tor_free(options->Address);
+ options->Address = tor_strdup("some_hostname");
+
+ retval = resolve_my_address(LOG_NOTICE, options, &resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_hostname_failure == prev_n_hostname_failure + 1);
+ tt_assert(retval == -1);
+
+ UNMOCK(tor_gethostname);
+ UNMOCK(tor_lookup_hostname);
+
+ tor_free(hostname_out);
+
+ /*
+ * CASE 11:
+ * Suppose the following sequence of events:
+ * 1. options->Address is NULL
+ * 2. tor_gethostname() succeeds to get hostname of machine Tor
+ * if running on.
+ * 3. Hostname from previous step cannot be converted to
+ * address by using tor_inet_aton() function.
+ * 4. However, tor_lookup_hostname() succeds in resolving the
+ * hostname from step 2.
+ * 5. Unfortunately, tor_addr_is_internal() deems this address
+ * to be internal.
+ * 6. get_interface_address6(.,AF_INET,.) returns non-internal
+ * IPv4
+ *
+ * We want resolve_my_addr() to succeed with method "INTERFACE"
+ * and address from step 6.
+ */
+
+ tor_free(options->Address);
+ options->Address = NULL;
+
+ MOCK(tor_gethostname,tor_gethostname_replacement);
+ MOCK(tor_lookup_hostname,tor_lookup_hostname_localhost);
+ MOCK(get_interface_address6,get_interface_address6_replacement);
+
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+ prev_n_hostname_localhost = n_hostname_localhost;
+ prev_n_get_interface_address6 = n_get_interface_address6;
+
+ retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
+ tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1);
+ tt_want(n_get_interface_address6 == prev_n_get_interface_address6 + 1);
+
+ tt_str_op(method_used,==,"INTERFACE");
+ tt_assert(!hostname_out);
+ tt_assert(retval == 0);
+
+ /*
+ * CASE 11b:
+ * 1-5 as above.
+ * 6. get_interface_address6() fails.
+ *
+ * In this subcase, we want resolve_my_address() to fail.
+ */
+
+ UNMOCK(get_interface_address6);
+ MOCK(get_interface_address6,get_interface_address6_failure);
+
+ prev_n_gethostname_replacement = n_gethostname_replacement;
+ prev_n_hostname_localhost = n_hostname_localhost;
+ prev_n_get_interface_address6_failure = n_get_interface_address6_failure;
+
+ retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_gethostname_replacement == prev_n_gethostname_replacement + 1);
+ tt_want(n_hostname_localhost == prev_n_hostname_localhost + 1);
+ tt_want(n_get_interface_address6_failure ==
+ prev_n_get_interface_address6_failure + 1);
+
+ tt_assert(retval == -1);
+
+ UNMOCK(tor_gethostname);
+ UNMOCK(tor_lookup_hostname);
+ UNMOCK(get_interface_address6);
+
+ /* CASE 12:
+ * Suppose the following happens:
+ * 1. options->Address is NULL AND options->DirAuthorities is 1.
+ * 2. tor_gethostname() succeeds in getting hostname of a machine ...
+ * 3. ... which is successfully parsed by tor_inet_aton() ...
+ * 4. into IPv4 address that tor_addr_is_inernal() considers to be
+ * internal.
+ *
+ * In this case, we want resolve_my_address() to fail.
+ */
+
+ tor_free(options->Address);
+ options->Address = NULL;
+ options->DirAuthorities = tor_malloc_zero(sizeof(config_line_t));
+
+ MOCK(tor_gethostname,tor_gethostname_localhost);
+
+ prev_n_gethostname_localhost = n_gethostname_localhost;
+
+ retval = resolve_my_address(LOG_DEBUG, options, &resolved_addr,
+ &method_used,&hostname_out);
+
+ tt_want(n_gethostname_localhost == prev_n_gethostname_localhost + 1);
+ tt_assert(retval == -1);
+
+ UNMOCK(tor_gethostname);
+
+ done:
+ tor_free(options->Address);
+ tor_free(options->DirAuthorities);
+ or_options_free(options);
+ tor_free(hostname_out);
+
+ UNMOCK(tor_gethostname);
+ UNMOCK(tor_lookup_hostname);
+ UNMOCK(get_interface_address);
+ UNMOCK(get_interface_address6);
+ UNMOCK(tor_gethostname);
+}
+
#define CONFIG_TEST(name, flags) \
{ #name, test_config_ ## name, flags, NULL, NULL }
struct testcase_t config_tests[] = {
+ CONFIG_TEST(resolve_my_address, TT_FORK),
CONFIG_TEST(addressmap, 0),
CONFIG_TEST(parse_bridge_line, 0),
CONFIG_TEST(parse_transport_options_line, 0),
diff --git a/src/test/test_containers.c b/src/test/test_containers.c
index d0972dd126..79085a748e 100644
--- a/src/test/test_containers.c
+++ b/src/test/test_containers.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -62,18 +62,18 @@ test_container_smartlist_basic(void *arg)
smartlist_insert(sl, 1, v22);
smartlist_insert(sl, 0, v0);
smartlist_insert(sl, 5, v555);
- tt_ptr_op(v0,==, smartlist_get(sl,0));
- tt_ptr_op(v1,==, smartlist_get(sl,1));
- tt_ptr_op(v22,==, smartlist_get(sl,2));
- tt_ptr_op(v3,==, smartlist_get(sl,3));
- tt_ptr_op(v4,==, smartlist_get(sl,4));
- tt_ptr_op(v555,==, smartlist_get(sl,5));
+ tt_ptr_op(v0,OP_EQ, smartlist_get(sl,0));
+ tt_ptr_op(v1,OP_EQ, smartlist_get(sl,1));
+ tt_ptr_op(v22,OP_EQ, smartlist_get(sl,2));
+ tt_ptr_op(v3,OP_EQ, smartlist_get(sl,3));
+ tt_ptr_op(v4,OP_EQ, smartlist_get(sl,4));
+ tt_ptr_op(v555,OP_EQ, smartlist_get(sl,5));
/* Try deleting in the middle. */
smartlist_del(sl, 1);
- tt_ptr_op(v555,==, smartlist_get(sl, 1));
+ tt_ptr_op(v555,OP_EQ, smartlist_get(sl, 1));
/* Try deleting at the end. */
smartlist_del(sl, 4);
- tt_int_op(4,==, smartlist_len(sl));
+ tt_int_op(4,OP_EQ, smartlist_len(sl));
/* test isin. */
tt_assert(smartlist_contains(sl, v3));
@@ -101,119 +101,119 @@ test_container_smartlist_strings(void *arg)
/* Test split and join */
(void)arg;
- tt_int_op(0,==, smartlist_len(sl));
+ tt_int_op(0,OP_EQ, smartlist_len(sl));
smartlist_split_string(sl, "abc", ":", 0, 0);
- tt_int_op(1,==, smartlist_len(sl));
- tt_str_op("abc",==, smartlist_get(sl, 0));
+ tt_int_op(1,OP_EQ, smartlist_len(sl));
+ tt_str_op("abc",OP_EQ, smartlist_get(sl, 0));
smartlist_split_string(sl, "a::bc::", "::", 0, 0);
- tt_int_op(4,==, smartlist_len(sl));
- tt_str_op("a",==, smartlist_get(sl, 1));
- tt_str_op("bc",==, smartlist_get(sl, 2));
- tt_str_op("",==, smartlist_get(sl, 3));
+ tt_int_op(4,OP_EQ, smartlist_len(sl));
+ tt_str_op("a",OP_EQ, smartlist_get(sl, 1));
+ tt_str_op("bc",OP_EQ, smartlist_get(sl, 2));
+ tt_str_op("",OP_EQ, smartlist_get(sl, 3));
cp_alloc = smartlist_join_strings(sl, "", 0, NULL);
- tt_str_op(cp_alloc,==, "abcabc");
+ tt_str_op(cp_alloc,OP_EQ, "abcabc");
tor_free(cp_alloc);
cp_alloc = smartlist_join_strings(sl, "!", 0, NULL);
- tt_str_op(cp_alloc,==, "abc!a!bc!");
+ tt_str_op(cp_alloc,OP_EQ, "abc!a!bc!");
tor_free(cp_alloc);
cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL);
- tt_str_op(cp_alloc,==, "abcXYaXYbcXY");
+ tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXY");
tor_free(cp_alloc);
cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL);
- tt_str_op(cp_alloc,==, "abcXYaXYbcXYXY");
+ tt_str_op(cp_alloc,OP_EQ, "abcXYaXYbcXYXY");
tor_free(cp_alloc);
cp_alloc = smartlist_join_strings(sl, "", 1, NULL);
- tt_str_op(cp_alloc,==, "abcabc");
+ tt_str_op(cp_alloc,OP_EQ, "abcabc");
tor_free(cp_alloc);
smartlist_split_string(sl, "/def/ /ghijk", "/", 0, 0);
- tt_int_op(8,==, smartlist_len(sl));
- tt_str_op("",==, smartlist_get(sl, 4));
- tt_str_op("def",==, smartlist_get(sl, 5));
- tt_str_op(" ",==, smartlist_get(sl, 6));
- tt_str_op("ghijk",==, smartlist_get(sl, 7));
+ tt_int_op(8,OP_EQ, smartlist_len(sl));
+ tt_str_op("",OP_EQ, smartlist_get(sl, 4));
+ tt_str_op("def",OP_EQ, smartlist_get(sl, 5));
+ tt_str_op(" ",OP_EQ, smartlist_get(sl, 6));
+ tt_str_op("ghijk",OP_EQ, smartlist_get(sl, 7));
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
smartlist_split_string(sl, "a,bbd,cdef", ",", SPLIT_SKIP_SPACE, 0);
- tt_int_op(3,==, smartlist_len(sl));
- tt_str_op("a",==, smartlist_get(sl,0));
- tt_str_op("bbd",==, smartlist_get(sl,1));
- tt_str_op("cdef",==, smartlist_get(sl,2));
+ tt_int_op(3,OP_EQ, smartlist_len(sl));
+ tt_str_op("a",OP_EQ, smartlist_get(sl,0));
+ tt_str_op("bbd",OP_EQ, smartlist_get(sl,1));
+ tt_str_op("cdef",OP_EQ, smartlist_get(sl,2));
smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>",
SPLIT_SKIP_SPACE, 0);
- tt_int_op(8,==, smartlist_len(sl));
- tt_str_op("z",==, smartlist_get(sl,3));
- tt_str_op("zhasd",==, smartlist_get(sl,4));
- tt_str_op("",==, smartlist_get(sl,5));
- tt_str_op("bnud",==, smartlist_get(sl,6));
- tt_str_op("",==, smartlist_get(sl,7));
+ tt_int_op(8,OP_EQ, smartlist_len(sl));
+ tt_str_op("z",OP_EQ, smartlist_get(sl,3));
+ tt_str_op("zhasd",OP_EQ, smartlist_get(sl,4));
+ tt_str_op("",OP_EQ, smartlist_get(sl,5));
+ tt_str_op("bnud",OP_EQ, smartlist_get(sl,6));
+ tt_str_op("",OP_EQ, smartlist_get(sl,7));
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
smartlist_split_string(sl, " ab\tc \td ef ", NULL,
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tt_int_op(4,==, smartlist_len(sl));
- tt_str_op("ab",==, smartlist_get(sl,0));
- tt_str_op("c",==, smartlist_get(sl,1));
- tt_str_op("d",==, smartlist_get(sl,2));
- tt_str_op("ef",==, smartlist_get(sl,3));
+ tt_int_op(4,OP_EQ, smartlist_len(sl));
+ tt_str_op("ab",OP_EQ, smartlist_get(sl,0));
+ tt_str_op("c",OP_EQ, smartlist_get(sl,1));
+ tt_str_op("d",OP_EQ, smartlist_get(sl,2));
+ tt_str_op("ef",OP_EQ, smartlist_get(sl,3));
smartlist_split_string(sl, "ghi\tj", NULL,
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tt_int_op(6,==, smartlist_len(sl));
- tt_str_op("ghi",==, smartlist_get(sl,4));
- tt_str_op("j",==, smartlist_get(sl,5));
+ tt_int_op(6,OP_EQ, smartlist_len(sl));
+ tt_str_op("ghi",OP_EQ, smartlist_get(sl,4));
+ tt_str_op("j",OP_EQ, smartlist_get(sl,5));
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
cp_alloc = smartlist_join_strings(sl, "XY", 0, NULL);
- tt_str_op(cp_alloc,==, "");
+ tt_str_op(cp_alloc,OP_EQ, "");
tor_free(cp_alloc);
cp_alloc = smartlist_join_strings(sl, "XY", 1, NULL);
- tt_str_op(cp_alloc,==, "XY");
+ tt_str_op(cp_alloc,OP_EQ, "XY");
tor_free(cp_alloc);
smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tt_int_op(3,==, smartlist_len(sl));
- tt_str_op("z",==, smartlist_get(sl, 0));
- tt_str_op("zhasd",==, smartlist_get(sl, 1));
- tt_str_op("bnud",==, smartlist_get(sl, 2));
+ tt_int_op(3,OP_EQ, smartlist_len(sl));
+ tt_str_op("z",OP_EQ, smartlist_get(sl, 0));
+ tt_str_op("zhasd",OP_EQ, smartlist_get(sl, 1));
+ tt_str_op("bnud",OP_EQ, smartlist_get(sl, 2));
smartlist_split_string(sl, " z <> zhasd <> <> bnud<> ", "<>",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
- tt_int_op(5,==, smartlist_len(sl));
- tt_str_op("z",==, smartlist_get(sl, 3));
- tt_str_op("zhasd <> <> bnud<>",==, smartlist_get(sl, 4));
+ tt_int_op(5,OP_EQ, smartlist_len(sl));
+ tt_str_op("z",OP_EQ, smartlist_get(sl, 3));
+ tt_str_op("zhasd <> <> bnud<>",OP_EQ, smartlist_get(sl, 4));
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
smartlist_split_string(sl, "abcd\n", "\n",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tt_int_op(1,==, smartlist_len(sl));
- tt_str_op("abcd",==, smartlist_get(sl, 0));
+ tt_int_op(1,OP_EQ, smartlist_len(sl));
+ tt_str_op("abcd",OP_EQ, smartlist_get(sl, 0));
smartlist_split_string(sl, "efgh", "\n",
SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
- tt_int_op(2,==, smartlist_len(sl));
- tt_str_op("efgh",==, smartlist_get(sl, 1));
+ tt_int_op(2,OP_EQ, smartlist_len(sl));
+ tt_str_op("efgh",OP_EQ, smartlist_get(sl, 1));
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Test swapping, shuffling, and sorting. */
smartlist_split_string(sl, "the,onion,router,by,arma,and,nickm", ",", 0, 0);
- tt_int_op(7,==, smartlist_len(sl));
+ tt_int_op(7,OP_EQ, smartlist_len(sl));
smartlist_sort(sl, compare_strs_);
cp_alloc = smartlist_join_strings(sl, ",", 0, NULL);
- tt_str_op(cp_alloc,==, "and,arma,by,nickm,onion,router,the");
+ tt_str_op(cp_alloc,OP_EQ, "and,arma,by,nickm,onion,router,the");
tor_free(cp_alloc);
smartlist_swap(sl, 1, 5);
cp_alloc = smartlist_join_strings(sl, ",", 0, NULL);
- tt_str_op(cp_alloc,==, "and,router,by,nickm,onion,arma,the");
+ tt_str_op(cp_alloc,OP_EQ, "and,router,by,nickm,onion,arma,the");
tor_free(cp_alloc);
smartlist_shuffle(sl);
- tt_int_op(7,==, smartlist_len(sl));
+ tt_int_op(7,OP_EQ, smartlist_len(sl));
tt_assert(smartlist_contains_string(sl, "and"));
tt_assert(smartlist_contains_string(sl, "router"));
tt_assert(smartlist_contains_string(sl, "by"));
@@ -224,69 +224,72 @@ test_container_smartlist_strings(void *arg)
/* Test bsearch. */
smartlist_sort(sl, compare_strs_);
- tt_str_op("nickm",==, smartlist_bsearch(sl, "zNicKM",
+ tt_str_op("nickm",OP_EQ, smartlist_bsearch(sl, "zNicKM",
cmp_without_first_));
- tt_str_op("and",==,
+ tt_str_op("and",OP_EQ,
smartlist_bsearch(sl, " AND", cmp_without_first_));
- tt_ptr_op(NULL,==, smartlist_bsearch(sl, " ANz", cmp_without_first_));
+ tt_ptr_op(NULL,OP_EQ, smartlist_bsearch(sl, " ANz", cmp_without_first_));
/* Test bsearch_idx */
{
int f;
smartlist_t *tmp = NULL;
- tt_int_op(0,==,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f));
- tt_int_op(f,==, 0);
- tt_int_op(0,==, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f));
- tt_int_op(f,==, 1);
- tt_int_op(1,==, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f));
- tt_int_op(f,==, 0);
- tt_int_op(1,==, smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f));
- tt_int_op(f,==, 1);
- tt_int_op(2,==, smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f));
- tt_int_op(f,==, 0);
- tt_int_op(7,==, smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f));
- tt_int_op(f,==, 0);
+ tt_int_op(0,OP_EQ,smartlist_bsearch_idx(sl," aaa",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 0);
+ tt_int_op(0,OP_EQ, smartlist_bsearch_idx(sl," and",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 1);
+ tt_int_op(1,OP_EQ, smartlist_bsearch_idx(sl," arm",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 0);
+ tt_int_op(1,OP_EQ,
+ smartlist_bsearch_idx(sl," arma",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 1);
+ tt_int_op(2,OP_EQ,
+ smartlist_bsearch_idx(sl," armb",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 0);
+ tt_int_op(7,OP_EQ,
+ smartlist_bsearch_idx(sl," zzzz",cmp_without_first_,&f));
+ tt_int_op(f,OP_EQ, 0);
/* Test trivial cases for list of length 0 or 1 */
tmp = smartlist_new();
- tt_int_op(0,==, smartlist_bsearch_idx(tmp, "foo",
+ tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "foo",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 0);
+ tt_int_op(f,OP_EQ, 0);
smartlist_insert(tmp, 0, (void *)("bar"));
- tt_int_op(1,==, smartlist_bsearch_idx(tmp, "foo",
+ tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 0);
- tt_int_op(0,==, smartlist_bsearch_idx(tmp, "aaa",
+ tt_int_op(f,OP_EQ, 0);
+ tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "aaa",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 0);
- tt_int_op(0,==, smartlist_bsearch_idx(tmp, "bar",
+ tt_int_op(f,OP_EQ, 0);
+ tt_int_op(0,OP_EQ, smartlist_bsearch_idx(tmp, "bar",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 1);
+ tt_int_op(f,OP_EQ, 1);
/* ... and one for length 2 */
smartlist_insert(tmp, 1, (void *)("foo"));
- tt_int_op(1,==, smartlist_bsearch_idx(tmp, "foo",
+ tt_int_op(1,OP_EQ, smartlist_bsearch_idx(tmp, "foo",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 1);
- tt_int_op(2,==, smartlist_bsearch_idx(tmp, "goo",
+ tt_int_op(f,OP_EQ, 1);
+ tt_int_op(2,OP_EQ, smartlist_bsearch_idx(tmp, "goo",
compare_strs_for_bsearch_, &f));
- tt_int_op(f,==, 0);
+ tt_int_op(f,OP_EQ, 0);
smartlist_free(tmp);
}
/* Test reverse() and pop_last() */
smartlist_reverse(sl);
cp_alloc = smartlist_join_strings(sl, ",", 0, NULL);
- tt_str_op(cp_alloc,==, "the,router,onion,nickm,by,arma,and");
+ tt_str_op(cp_alloc,OP_EQ, "the,router,onion,nickm,by,arma,and");
tor_free(cp_alloc);
cp_alloc = smartlist_pop_last(sl);
- tt_str_op(cp_alloc,==, "and");
+ tt_str_op(cp_alloc,OP_EQ, "and");
tor_free(cp_alloc);
- tt_int_op(smartlist_len(sl),==, 6);
+ tt_int_op(smartlist_len(sl),OP_EQ, 6);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
cp_alloc = smartlist_pop_last(sl);
- tt_ptr_op(cp_alloc,==, NULL);
+ tt_ptr_op(cp_alloc,OP_EQ, NULL);
/* Test uniq() */
smartlist_split_string(sl,
@@ -295,7 +298,7 @@ test_container_smartlist_strings(void *arg)
smartlist_sort(sl, compare_strs_);
smartlist_uniq(sl, compare_strs_, tor_free_);
cp_alloc = smartlist_join_strings(sl, ",", 0, NULL);
- tt_str_op(cp_alloc,==, "50,a,canal,man,noon,panama,plan,radar");
+ tt_str_op(cp_alloc,OP_EQ, "50,a,canal,man,noon,panama,plan,radar");
tor_free(cp_alloc);
/* Test contains_string, contains_string_case and contains_int_as_string */
@@ -331,17 +334,17 @@ test_container_smartlist_strings(void *arg)
"Some say the Earth will end in ice and some in fire",
" ", 0, 0);
cp = smartlist_get(sl, 4);
- tt_str_op(cp,==, "will");
+ tt_str_op(cp,OP_EQ, "will");
smartlist_add(sl, cp);
smartlist_remove(sl, cp);
tor_free(cp);
cp_alloc = smartlist_join_strings(sl, ",", 0, NULL);
- tt_str_op(cp_alloc,==, "Some,say,the,Earth,fire,end,in,ice,and,some,in");
+ tt_str_op(cp_alloc,OP_EQ, "Some,say,the,Earth,fire,end,in,ice,and,some,in");
tor_free(cp_alloc);
smartlist_string_remove(sl, "in");
cp_alloc = smartlist_join_strings2(sl, "+XX", 1, 0, &sz);
- tt_str_op(cp_alloc,==, "Some+say+the+Earth+fire+end+some+ice+and");
- tt_int_op((int)sz,==, 40);
+ tt_str_op(cp_alloc,OP_EQ, "Some+say+the+Earth+fire+end+some+ice+and");
+ tt_int_op((int)sz,OP_EQ, 40);
done:
@@ -369,7 +372,7 @@ test_container_smartlist_overlap(void *arg)
/* add_all */
smartlist_add_all(ints, odds);
smartlist_add_all(ints, evens);
- tt_int_op(smartlist_len(ints),==, 10);
+ tt_int_op(smartlist_len(ints),OP_EQ, 10);
smartlist_add(primes, (void*)2);
smartlist_add(primes, (void*)3);
@@ -385,7 +388,7 @@ test_container_smartlist_overlap(void *arg)
/* intersect */
smartlist_add_all(sl, odds);
smartlist_intersect(sl, primes);
- tt_int_op(smartlist_len(sl),==, 3);
+ tt_int_op(smartlist_len(sl),OP_EQ, 3);
tt_assert(smartlist_contains(sl, (void*)3));
tt_assert(smartlist_contains(sl, (void*)5));
tt_assert(smartlist_contains(sl, (void*)7));
@@ -393,7 +396,7 @@ test_container_smartlist_overlap(void *arg)
/* subtract */
smartlist_add_all(sl, primes);
smartlist_subtract(sl, odds);
- tt_int_op(smartlist_len(sl),==, 1);
+ tt_int_op(smartlist_len(sl),OP_EQ, 1);
tt_assert(smartlist_contains(sl, (void*)2));
done:
@@ -415,23 +418,23 @@ test_container_smartlist_digests(void *arg)
smartlist_add(sl, tor_memdup("AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN));
smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN));
smartlist_add(sl, tor_memdup("\00090AAB2AAAAaasdAAAAA", DIGEST_LEN));
- tt_int_op(0,==, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA"));
+ tt_int_op(0,OP_EQ, smartlist_contains_digest(NULL, "AAAAAAAAAAAAAAAAAAAA"));
tt_assert(smartlist_contains_digest(sl, "AAAAAAAAAAAAAAAAAAAA"));
tt_assert(smartlist_contains_digest(sl, "\00090AAB2AAAAaasdAAAAA"));
- tt_int_op(0,==, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA"));
+ tt_int_op(0,OP_EQ, smartlist_contains_digest(sl, "\00090AAB2AAABaasdAAAAA"));
/* sort digests */
smartlist_sort_digests(sl);
- tt_mem_op(smartlist_get(sl, 0),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
- tt_mem_op(smartlist_get(sl, 1),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
- tt_mem_op(smartlist_get(sl, 2),==, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN);
- tt_int_op(3,==, smartlist_len(sl));
+ tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
+ tt_mem_op(smartlist_get(sl, 1),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
+ tt_mem_op(smartlist_get(sl, 2),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN);
+ tt_int_op(3,OP_EQ, smartlist_len(sl));
/* uniq_digests */
smartlist_uniq_digests(sl);
- tt_int_op(2,==, smartlist_len(sl));
- tt_mem_op(smartlist_get(sl, 0),==, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
- tt_mem_op(smartlist_get(sl, 1),==, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN);
+ tt_int_op(2,OP_EQ, smartlist_len(sl));
+ tt_mem_op(smartlist_get(sl, 0),OP_EQ, "\00090AAB2AAAAaasdAAAAA", DIGEST_LEN);
+ tt_mem_op(smartlist_get(sl, 1),OP_EQ, "AAAAAAAAAAAAAAAAAAAA", DIGEST_LEN);
done:
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
@@ -463,7 +466,7 @@ test_container_smartlist_join(void *arg)
sl2, char *, cp2,
strcmp(cp1,cp2),
smartlist_add(sl3, cp2)) {
- tt_str_op(cp1,==, cp2);
+ tt_str_op(cp1,OP_EQ, cp2);
smartlist_add(sl4, cp1);
} SMARTLIST_FOREACH_JOIN_END(cp1, cp2);
@@ -474,10 +477,11 @@ test_container_smartlist_join(void *arg)
tt_assert(smartlist_contains(sl, cp) &&
smartlist_contains_string(sl2, cp)));
joined = smartlist_join_strings(sl3, ",", 0, NULL);
- tt_str_op(joined,==, "Anemias,Anemias,Crossbowmen,Work");
+ tt_str_op(joined,OP_EQ, "Anemias,Anemias,Crossbowmen,Work");
tor_free(joined);
joined = smartlist_join_strings(sl4, ",", 0, NULL);
- tt_str_op(joined,==, "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance,"
+ tt_str_op(joined,OP_EQ,
+ "Ambush,Anchorman,Anchorman,Bacon,Inhumane,Insurance,"
"Knish,Know,Manners,Manners,Maraschinos,Wombats,Wombats");
tor_free(joined);
@@ -612,7 +616,7 @@ test_container_digestset(void *arg)
if (digestset_contains(set, d))
++false_positives;
}
- tt_int_op(50, >, false_positives); /* Should be far lower. */
+ tt_int_op(50, OP_GT, false_positives); /* Should be far lower. */
done:
if (set)
@@ -675,31 +679,31 @@ test_container_pqueue(void *arg)
OK();
- tt_int_op(smartlist_len(sl),==, 11);
- tt_ptr_op(smartlist_get(sl, 0),==, &apples);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &apples);
- tt_int_op(smartlist_len(sl),==, 10);
+ tt_int_op(smartlist_len(sl),OP_EQ, 11);
+ tt_ptr_op(smartlist_get(sl, 0),OP_EQ, &apples);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &apples);
+ tt_int_op(smartlist_len(sl),OP_EQ, 10);
OK();
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &cows);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &daschunds);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &cows);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &daschunds);
smartlist_pqueue_add(sl, cmp, offset, &chinchillas);
OK();
smartlist_pqueue_add(sl, cmp, offset, &fireflies);
OK();
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &chinchillas);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &eggplants);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fireflies);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &chinchillas);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &eggplants);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fireflies);
OK();
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fish);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &frogs);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &lobsters);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &roquefort);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &lobsters);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &roquefort);
OK();
- tt_int_op(smartlist_len(sl),==, 3);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &squid);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &weissbier);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &zebras);
- tt_int_op(smartlist_len(sl),==, 0);
+ tt_int_op(smartlist_len(sl),OP_EQ, 3);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &weissbier);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &zebras);
+ tt_int_op(smartlist_len(sl),OP_EQ, 0);
OK();
/* Now test remove. */
@@ -709,21 +713,21 @@ test_container_pqueue(void *arg)
smartlist_pqueue_add(sl, cmp, offset, &apples);
smartlist_pqueue_add(sl, cmp, offset, &squid);
smartlist_pqueue_add(sl, cmp, offset, &zebras);
- tt_int_op(smartlist_len(sl),==, 6);
+ tt_int_op(smartlist_len(sl),OP_EQ, 6);
OK();
smartlist_pqueue_remove(sl, cmp, offset, &zebras);
- tt_int_op(smartlist_len(sl),==, 5);
+ tt_int_op(smartlist_len(sl),OP_EQ, 5);
OK();
smartlist_pqueue_remove(sl, cmp, offset, &cows);
- tt_int_op(smartlist_len(sl),==, 4);
+ tt_int_op(smartlist_len(sl),OP_EQ, 4);
OK();
smartlist_pqueue_remove(sl, cmp, offset, &apples);
- tt_int_op(smartlist_len(sl),==, 3);
+ tt_int_op(smartlist_len(sl),OP_EQ, 3);
OK();
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &fish);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &frogs);
- tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),==, &squid);
- tt_int_op(smartlist_len(sl),==, 0);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &fish);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &frogs);
+ tt_ptr_op(smartlist_pqueue_pop(sl, cmp, offset),OP_EQ, &squid);
+ tt_int_op(smartlist_len(sl),OP_EQ, 0);
OK();
#undef OK
@@ -755,30 +759,30 @@ test_container_strmap(void *arg)
(void)arg;
map = strmap_new();
tt_assert(map);
- tt_int_op(strmap_size(map),==, 0);
+ tt_int_op(strmap_size(map),OP_EQ, 0);
tt_assert(strmap_isempty(map));
v = strmap_set(map, "K1", v99);
- tt_ptr_op(v,==, NULL);
+ tt_ptr_op(v,OP_EQ, NULL);
tt_assert(!strmap_isempty(map));
v = strmap_set(map, "K2", v101);
- tt_ptr_op(v,==, NULL);
+ tt_ptr_op(v,OP_EQ, NULL);
v = strmap_set(map, "K1", v100);
- tt_ptr_op(v,==, v99);
- tt_ptr_op(strmap_get(map,"K1"),==, v100);
- tt_ptr_op(strmap_get(map,"K2"),==, v101);
- tt_ptr_op(strmap_get(map,"K-not-there"),==, NULL);
+ tt_ptr_op(v,OP_EQ, v99);
+ tt_ptr_op(strmap_get(map,"K1"),OP_EQ, v100);
+ tt_ptr_op(strmap_get(map,"K2"),OP_EQ, v101);
+ tt_ptr_op(strmap_get(map,"K-not-there"),OP_EQ, NULL);
strmap_assert_ok(map);
v = strmap_remove(map,"K2");
strmap_assert_ok(map);
- tt_ptr_op(v,==, v101);
- tt_ptr_op(strmap_get(map,"K2"),==, NULL);
- tt_ptr_op(strmap_remove(map,"K2"),==, NULL);
+ tt_ptr_op(v,OP_EQ, v101);
+ tt_ptr_op(strmap_get(map,"K2"),OP_EQ, NULL);
+ tt_ptr_op(strmap_remove(map,"K2"),OP_EQ, NULL);
strmap_set(map, "K2", v101);
strmap_set(map, "K3", v102);
strmap_set(map, "K4", v103);
- tt_int_op(strmap_size(map),==, 4);
+ tt_int_op(strmap_size(map),OP_EQ, 4);
strmap_assert_ok(map);
strmap_set(map, "K5", v104);
strmap_set(map, "K6", v105);
@@ -790,7 +794,7 @@ test_container_strmap(void *arg)
while (!strmap_iter_done(iter)) {
strmap_iter_get(iter,&k,&v);
smartlist_add(found_keys, tor_strdup(k));
- tt_ptr_op(v,==, strmap_get(map, k));
+ tt_ptr_op(v,OP_EQ, strmap_get(map, k));
if (!strcmp(k, "K2")) {
iter = strmap_iter_next_rmv(map,iter);
@@ -800,12 +804,12 @@ test_container_strmap(void *arg)
}
/* Make sure we removed K2, but not the others. */
- tt_ptr_op(strmap_get(map, "K2"),==, NULL);
- tt_ptr_op(strmap_get(map, "K5"),==, v104);
+ tt_ptr_op(strmap_get(map, "K2"),OP_EQ, NULL);
+ tt_ptr_op(strmap_get(map, "K5"),OP_EQ, v104);
/* Make sure we visited everyone once */
smartlist_sort_strings(found_keys);
visited = smartlist_join_strings(found_keys, ":", 0, NULL);
- tt_str_op(visited,==, "K1:K2:K3:K4:K5:K6");
+ tt_str_op(visited,OP_EQ, "K1:K2:K3:K4:K5:K6");
strmap_assert_ok(map);
/* Clean up after ourselves. */
@@ -815,13 +819,13 @@ test_container_strmap(void *arg)
/* Now try some lc functions. */
map = strmap_new();
strmap_set_lc(map,"Ab.C", v1);
- tt_ptr_op(strmap_get(map,"ab.c"),==, v1);
+ tt_ptr_op(strmap_get(map,"ab.c"),OP_EQ, v1);
strmap_assert_ok(map);
- tt_ptr_op(strmap_get_lc(map,"AB.C"),==, v1);
- tt_ptr_op(strmap_get(map,"AB.C"),==, NULL);
- tt_ptr_op(strmap_remove_lc(map,"aB.C"),==, v1);
+ tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, v1);
+ tt_ptr_op(strmap_get(map,"AB.C"),OP_EQ, NULL);
+ tt_ptr_op(strmap_remove_lc(map,"aB.C"),OP_EQ, v1);
strmap_assert_ok(map);
- tt_ptr_op(strmap_get_lc(map,"AB.C"),==, NULL);
+ tt_ptr_op(strmap_get_lc(map,"AB.C"),OP_EQ, NULL);
done:
if (map)
@@ -853,41 +857,42 @@ test_container_order_functions(void *arg)
(void)arg;
lst[n++] = 12;
- tt_int_op(12,==, median()); /* 12 */
+ tt_int_op(12,OP_EQ, median()); /* 12 */
lst[n++] = 77;
//smartlist_shuffle(sl);
- tt_int_op(12,==, median()); /* 12, 77 */
+ tt_int_op(12,OP_EQ, median()); /* 12, 77 */
lst[n++] = 77;
//smartlist_shuffle(sl);
- tt_int_op(77,==, median()); /* 12, 77, 77 */
+ tt_int_op(77,OP_EQ, median()); /* 12, 77, 77 */
lst[n++] = 24;
- tt_int_op(24,==, median()); /* 12,24,77,77 */
+ tt_int_op(24,OP_EQ, median()); /* 12,24,77,77 */
lst[n++] = 60;
lst[n++] = 12;
lst[n++] = 25;
//smartlist_shuffle(sl);
- tt_int_op(25,==, median()); /* 12,12,24,25,60,77,77 */
+ tt_int_op(25,OP_EQ, median()); /* 12,12,24,25,60,77,77 */
#undef median
#define third_quartile() third_quartile_uint32(lst2, n)
n = 0;
lst2[n++] = 1;
- tt_int_op(1,==, third_quartile()); /* ~1~ */
+ tt_int_op(1,OP_EQ, third_quartile()); /* ~1~ */
lst2[n++] = 2;
- tt_int_op(2,==, third_quartile()); /* 1, ~2~ */
+ tt_int_op(2,OP_EQ, third_quartile()); /* 1, ~2~ */
lst2[n++] = 3;
lst2[n++] = 4;
lst2[n++] = 5;
- tt_int_op(4,==, third_quartile()); /* 1, 2, 3, ~4~, 5 */
+ tt_int_op(4,OP_EQ, third_quartile()); /* 1, 2, 3, ~4~, 5 */
lst2[n++] = 6;
lst2[n++] = 7;
lst2[n++] = 8;
lst2[n++] = 9;
- tt_int_op(7,==, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */
+ tt_int_op(7,OP_EQ, third_quartile()); /* 1, 2, 3, 4, 5, 6, ~7~, 8, 9 */
lst2[n++] = 10;
lst2[n++] = 11;
- tt_int_op(9,==, third_quartile()); /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */
+ /* 1, 2, 3, 4, 5, 6, 7, 8, ~9~, 10, 11 */
+ tt_int_op(9,OP_EQ, third_quartile());
#undef third_quartile
@@ -911,26 +916,26 @@ test_container_di_map(void *arg)
(void)arg;
/* Try searching on an empty map. */
- tt_ptr_op(NULL, ==, dimap_search(map, key1, NULL));
- tt_ptr_op(NULL, ==, dimap_search(map, key2, NULL));
- tt_ptr_op(v3, ==, dimap_search(map, key2, v3));
+ tt_ptr_op(NULL, OP_EQ, dimap_search(map, key1, NULL));
+ tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL));
+ tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3));
dimap_free(map, NULL);
map = NULL;
/* Add a single entry. */
dimap_add_entry(&map, key1, v1);
- tt_ptr_op(NULL, ==, dimap_search(map, key2, NULL));
- tt_ptr_op(v3, ==, dimap_search(map, key2, v3));
- tt_ptr_op(v1, ==, dimap_search(map, key1, NULL));
+ tt_ptr_op(NULL, OP_EQ, dimap_search(map, key2, NULL));
+ tt_ptr_op(v3, OP_EQ, dimap_search(map, key2, v3));
+ tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL));
/* Now try it with three entries in the map. */
dimap_add_entry(&map, key2, v2);
dimap_add_entry(&map, key3, v3);
- tt_ptr_op(v1, ==, dimap_search(map, key1, NULL));
- tt_ptr_op(v2, ==, dimap_search(map, key2, NULL));
- tt_ptr_op(v3, ==, dimap_search(map, key3, NULL));
- tt_ptr_op(NULL, ==, dimap_search(map, key4, NULL));
- tt_ptr_op(v1, ==, dimap_search(map, key4, v1));
+ tt_ptr_op(v1, OP_EQ, dimap_search(map, key1, NULL));
+ tt_ptr_op(v2, OP_EQ, dimap_search(map, key2, NULL));
+ tt_ptr_op(v3, OP_EQ, dimap_search(map, key3, NULL));
+ tt_ptr_op(NULL, OP_EQ, dimap_search(map, key4, NULL));
+ tt_ptr_op(v1, OP_EQ, dimap_search(map, key4, v1));
done:
tor_free(v1);
@@ -959,7 +964,7 @@ test_container_fp_pair_map(void *arg)
(void)arg;
map = fp_pair_map_new();
tt_assert(map);
- tt_int_op(fp_pair_map_size(map),==, 0);
+ tt_int_op(fp_pair_map_size(map),OP_EQ, 0);
tt_assert(fp_pair_map_isempty(map));
memset(fp1.first, 0x11, DIGEST_LEN);
@@ -976,27 +981,27 @@ test_container_fp_pair_map(void *arg)
memset(fp6.second, 0x62, DIGEST_LEN);
v = fp_pair_map_set(map, &fp1, v99);
- tt_ptr_op(v, ==, NULL);
+ tt_ptr_op(v, OP_EQ, NULL);
tt_assert(!fp_pair_map_isempty(map));
v = fp_pair_map_set(map, &fp2, v101);
- tt_ptr_op(v, ==, NULL);
+ tt_ptr_op(v, OP_EQ, NULL);
v = fp_pair_map_set(map, &fp1, v100);
- tt_ptr_op(v, ==, v99);
- tt_ptr_op(fp_pair_map_get(map, &fp1),==, v100);
- tt_ptr_op(fp_pair_map_get(map, &fp2),==, v101);
- tt_ptr_op(fp_pair_map_get(map, &fp3),==, NULL);
+ tt_ptr_op(v, OP_EQ, v99);
+ tt_ptr_op(fp_pair_map_get(map, &fp1),OP_EQ, v100);
+ tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, v101);
+ tt_ptr_op(fp_pair_map_get(map, &fp3),OP_EQ, NULL);
fp_pair_map_assert_ok(map);
v = fp_pair_map_remove(map, &fp2);
fp_pair_map_assert_ok(map);
- tt_ptr_op(v,==, v101);
- tt_ptr_op(fp_pair_map_get(map, &fp2),==, NULL);
- tt_ptr_op(fp_pair_map_remove(map, &fp2),==, NULL);
+ tt_ptr_op(v,OP_EQ, v101);
+ tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL);
+ tt_ptr_op(fp_pair_map_remove(map, &fp2),OP_EQ, NULL);
fp_pair_map_set(map, &fp2, v101);
fp_pair_map_set(map, &fp3, v102);
fp_pair_map_set(map, &fp4, v103);
- tt_int_op(fp_pair_map_size(map),==, 4);
+ tt_int_op(fp_pair_map_size(map),OP_EQ, 4);
fp_pair_map_assert_ok(map);
fp_pair_map_set(map, &fp5, v104);
fp_pair_map_set(map, &fp6, v105);
@@ -1006,7 +1011,7 @@ test_container_fp_pair_map(void *arg)
iter = fp_pair_map_iter_init(map);
while (!fp_pair_map_iter_done(iter)) {
fp_pair_map_iter_get(iter, &k, &v);
- tt_ptr_op(v,==, fp_pair_map_get(map, &k));
+ tt_ptr_op(v,OP_EQ, fp_pair_map_get(map, &k));
if (tor_memeq(&fp2, &k, sizeof(fp2))) {
iter = fp_pair_map_iter_next_rmv(map, iter);
@@ -1016,8 +1021,8 @@ test_container_fp_pair_map(void *arg)
}
/* Make sure we removed fp2, but not the others. */
- tt_ptr_op(fp_pair_map_get(map, &fp2),==, NULL);
- tt_ptr_op(fp_pair_map_get(map, &fp5),==, v104);
+ tt_ptr_op(fp_pair_map_get(map, &fp2),OP_EQ, NULL);
+ tt_ptr_op(fp_pair_map_get(map, &fp5),OP_EQ, v104);
fp_pair_map_assert_ok(map);
/* Clean up after ourselves. */
diff --git a/src/test/test_controller_events.c b/src/test/test_controller_events.c
index 4d6077b641..e36314da45 100644
--- a/src/test/test_controller_events.c
+++ b/src/test/test_controller_events.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONNECTION_PRIVATE
@@ -22,7 +22,7 @@ help_test_bucket_note_empty(uint32_t expected_msec_since_midnight,
tvnow.tv_usec = (msec_since_epoch % 1000) * 1000;
connection_buckets_note_empty_ts(&timestamp_var, tokens_before,
tokens_removed, &tvnow);
- tt_int_op(expected_msec_since_midnight, ==, timestamp_var);
+ tt_int_op(expected_msec_since_midnight, OP_EQ, timestamp_var);
done:
;
@@ -57,20 +57,20 @@ test_cntev_bucket_millis_empty(void *arg)
tvnow.tv_usec = 200000;
/* Bucket has not been refilled. */
- tt_int_op(0, ==, bucket_millis_empty(0, 42120, 0, 100, &tvnow));
- tt_int_op(0, ==, bucket_millis_empty(-10, 42120, -10, 100, &tvnow));
+ tt_int_op(0, OP_EQ, bucket_millis_empty(0, 42120, 0, 100, &tvnow));
+ tt_int_op(0, OP_EQ, bucket_millis_empty(-10, 42120, -10, 100, &tvnow));
/* Bucket was not empty. */
- tt_int_op(0, ==, bucket_millis_empty(10, 42120, 20, 100, &tvnow));
+ tt_int_op(0, OP_EQ, bucket_millis_empty(10, 42120, 20, 100, &tvnow));
/* Bucket has been emptied 80 msec ago and has just been refilled. */
- tt_int_op(80, ==, bucket_millis_empty(-20, 42120, -10, 100, &tvnow));
- tt_int_op(80, ==, bucket_millis_empty(-10, 42120, 0, 100, &tvnow));
- tt_int_op(80, ==, bucket_millis_empty(0, 42120, 10, 100, &tvnow));
+ tt_int_op(80, OP_EQ, bucket_millis_empty(-20, 42120, -10, 100, &tvnow));
+ tt_int_op(80, OP_EQ, bucket_millis_empty(-10, 42120, 0, 100, &tvnow));
+ tt_int_op(80, OP_EQ, bucket_millis_empty(0, 42120, 10, 100, &tvnow));
/* Bucket has been emptied 180 msec ago, last refill was 100 msec ago
* which was insufficient to make it positive, so cap msec at 100. */
- tt_int_op(100, ==, bucket_millis_empty(0, 42020, 1, 100, &tvnow));
+ tt_int_op(100, OP_EQ, bucket_millis_empty(0, 42020, 1, 100, &tvnow));
/* 1970-01-02 00:00:00:050000 */
tvnow.tv_sec = 86400;
@@ -78,7 +78,7 @@ test_cntev_bucket_millis_empty(void *arg)
/* Last emptied 30 msec before midnight, tvnow is 50 msec after
* midnight, that's 80 msec in total. */
- tt_int_op(80, ==, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow));
+ tt_int_op(80, OP_EQ, bucket_millis_empty(0, 86400000 - 30, 1, 100, &tvnow));
done:
;
@@ -118,26 +118,26 @@ test_cntev_sum_up_cell_stats(void *arg)
cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 0);
sum_up_cell_stats_by_command(circ, cell_stats);
- tt_u64_op(1, ==, cell_stats->added_cells_appward[CELL_RELAY]);
+ tt_u64_op(1, OP_EQ, cell_stats->added_cells_appward[CELL_RELAY]);
/* A single RELAY cell was added to the exitward queue. */
add_testing_cell_stats_entry(circ, CELL_RELAY, 0, 0, 1);
sum_up_cell_stats_by_command(circ, cell_stats);
- tt_u64_op(1, ==, cell_stats->added_cells_exitward[CELL_RELAY]);
+ tt_u64_op(1, OP_EQ, cell_stats->added_cells_exitward[CELL_RELAY]);
/* A single RELAY cell was removed from the appward queue where it spent
* 20 msec. */
add_testing_cell_stats_entry(circ, CELL_RELAY, 2, 1, 0);
sum_up_cell_stats_by_command(circ, cell_stats);
- tt_u64_op(20, ==, cell_stats->total_time_appward[CELL_RELAY]);
- tt_u64_op(1, ==, cell_stats->removed_cells_appward[CELL_RELAY]);
+ tt_u64_op(20, OP_EQ, cell_stats->total_time_appward[CELL_RELAY]);
+ tt_u64_op(1, OP_EQ, cell_stats->removed_cells_appward[CELL_RELAY]);
/* A single RELAY cell was removed from the exitward queue where it
* spent 30 msec. */
add_testing_cell_stats_entry(circ, CELL_RELAY, 3, 1, 1);
sum_up_cell_stats_by_command(circ, cell_stats);
- tt_u64_op(30, ==, cell_stats->total_time_exitward[CELL_RELAY]);
- tt_u64_op(1, ==, cell_stats->removed_cells_exitward[CELL_RELAY]);
+ tt_u64_op(30, OP_EQ, cell_stats->total_time_exitward[CELL_RELAY]);
+ tt_u64_op(1, OP_EQ, cell_stats->removed_cells_exitward[CELL_RELAY]);
done:
tor_free(cell_stats);
@@ -164,7 +164,7 @@ test_cntev_append_cell_stats(void *arg)
append_cell_stats_by_command(event_parts, key,
include_if_non_zero,
number_to_include);
- tt_int_op(0, ==, smartlist_len(event_parts));
+ tt_int_op(0, OP_EQ, smartlist_len(event_parts));
/* There's a RELAY cell to include, but the corresponding field in
* include_if_non_zero is still zero. */
@@ -172,7 +172,7 @@ test_cntev_append_cell_stats(void *arg)
append_cell_stats_by_command(event_parts, key,
include_if_non_zero,
number_to_include);
- tt_int_op(0, ==, smartlist_len(event_parts));
+ tt_int_op(0, OP_EQ, smartlist_len(event_parts));
/* Now include single RELAY cell. */
include_if_non_zero[CELL_RELAY] = 2;
@@ -180,7 +180,7 @@ test_cntev_append_cell_stats(void *arg)
include_if_non_zero,
number_to_include);
cp = smartlist_pop_last(event_parts);
- tt_str_op("Z=relay:1", ==, cp);
+ tt_str_op("Z=relay:1", OP_EQ, cp);
tor_free(cp);
/* Add four CREATE cells. */
@@ -190,7 +190,7 @@ test_cntev_append_cell_stats(void *arg)
include_if_non_zero,
number_to_include);
cp = smartlist_pop_last(event_parts);
- tt_str_op("Z=create:4,relay:1", ==, cp);
+ tt_str_op("Z=create:4,relay:1", OP_EQ, cp);
done:
tor_free(cp);
@@ -220,14 +220,14 @@ test_cntev_format_cell_stats(void *arg)
/* Origin circuit was completely idle. */
cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
- tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", ==, event_string);
+ tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1", OP_EQ, event_string);
tor_free(event_string);
/* Origin circuit had 4 RELAY cells added to its exitward queue. */
cell_stats->added_cells_exitward[CELL_RELAY] = 4;
format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4",
- ==, event_string);
+ OP_EQ, event_string);
tor_free(event_string);
/* Origin circuit also had 5 CREATE2 cells added to its exitward
@@ -235,7 +235,7 @@ test_cntev_format_cell_stats(void *arg)
cell_stats->added_cells_exitward[CELL_CREATE2] = 5;
format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4,"
- "create2:5", ==, event_string);
+ "create2:5", OP_EQ, event_string);
tor_free(event_string);
/* Origin circuit also had 7 RELAY cells removed from its exitward queue
@@ -245,7 +245,7 @@ test_cntev_format_cell_stats(void *arg)
format_cell_stats(&event_string, TO_CIRCUIT(ocirc), cell_stats);
tt_str_op("ID=2 OutboundQueue=3 OutboundConn=1 OutboundAdded=relay:4,"
"create2:5 OutboundRemoved=relay:7 OutboundTime=relay:6",
- ==, event_string);
+ OP_EQ, event_string);
tor_free(event_string);
p_chan = tor_malloc_zero(sizeof(channel_tls_t));
@@ -265,14 +265,14 @@ test_cntev_format_cell_stats(void *arg)
cell_stats = tor_malloc_zero(sizeof(cell_stats_t));
format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
tt_str_op("InboundQueue=8 InboundConn=2 OutboundQueue=9 OutboundConn=1",
- ==, event_string);
+ OP_EQ, event_string);
tor_free(event_string);
/* OR circuit had 3 RELAY cells added to its appward queue. */
cell_stats->added_cells_appward[CELL_RELAY] = 3;
format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 "
- "OutboundQueue=9 OutboundConn=1", ==, event_string);
+ "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string);
tor_free(event_string);
/* OR circuit had 7 RELAY cells removed from its appward queue which
@@ -282,7 +282,7 @@ test_cntev_format_cell_stats(void *arg)
format_cell_stats(&event_string, TO_CIRCUIT(or_circ), cell_stats);
tt_str_op("InboundQueue=8 InboundConn=2 InboundAdded=relay:3 "
"InboundRemoved=relay:7 InboundTime=relay:6 "
- "OutboundQueue=9 OutboundConn=1", ==, event_string);
+ "OutboundQueue=9 OutboundConn=1", OP_EQ, event_string);
done:
tor_free(cell_stats);
diff --git a/src/test/test_crypto.c b/src/test/test_crypto.c
index 4416134ac4..e9fb8bf084 100644
--- a/src/test/test_crypto.c
+++ b/src/test/test_crypto.c
@@ -1,11 +1,10 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
#define CRYPTO_CURVE25519_PRIVATE
-#define CRYPTO_S2K_PRIVATE
#include "or.h"
#include "test.h"
#include "aes.h"
@@ -14,8 +13,6 @@
#include "crypto_curve25519.h"
#include "crypto_ed25519.h"
#include "ed25519_vectors.inc"
-#include "crypto_s2k.h"
-#include "crypto_pwbox.h"
extern const char AUTHORITY_SIGNKEY_3[];
extern const char AUTHORITY_SIGNKEY_A_DIGEST[];
@@ -34,24 +31,24 @@ test_crypto_dh(void *arg)
ssize_t s1len, s2len;
(void)arg;
- tt_int_op(crypto_dh_get_bytes(dh1),==, DH_BYTES);
- tt_int_op(crypto_dh_get_bytes(dh2),==, DH_BYTES);
+ tt_int_op(crypto_dh_get_bytes(dh1),OP_EQ, DH_BYTES);
+ tt_int_op(crypto_dh_get_bytes(dh2),OP_EQ, DH_BYTES);
memset(p1, 0, DH_BYTES);
memset(p2, 0, DH_BYTES);
- tt_mem_op(p1,==, p2, DH_BYTES);
+ tt_mem_op(p1,OP_EQ, p2, DH_BYTES);
tt_assert(! crypto_dh_get_public(dh1, p1, DH_BYTES));
- tt_mem_op(p1,!=, p2, DH_BYTES);
+ tt_mem_op(p1,OP_NE, p2, DH_BYTES);
tt_assert(! crypto_dh_get_public(dh2, p2, DH_BYTES));
- tt_mem_op(p1,!=, p2, DH_BYTES);
+ tt_mem_op(p1,OP_NE, p2, DH_BYTES);
memset(s1, 0, DH_BYTES);
memset(s2, 0xFF, DH_BYTES);
s1len = crypto_dh_compute_secret(LOG_WARN, dh1, p2, DH_BYTES, s1, 50);
s2len = crypto_dh_compute_secret(LOG_WARN, dh2, p1, DH_BYTES, s2, 50);
tt_assert(s1len > 0);
- tt_int_op(s1len,==, s2len);
- tt_mem_op(s1,==, s2, s1len);
+ tt_int_op(s1len,OP_EQ, s2len);
+ tt_mem_op(s1,OP_EQ, s2, s1len);
{
/* XXXX Now fabricate some bad values and make sure they get caught,
@@ -78,7 +75,7 @@ test_crypto_rng(void *arg)
tt_assert(! crypto_seed_rng(0));
crypto_rand(data1, 100);
crypto_rand(data2, 100);
- tt_mem_op(data1,!=, data2,100);
+ tt_mem_op(data1,OP_NE, data2,100);
allok = 1;
for (i = 0; i < 100; ++i) {
uint64_t big;
@@ -133,15 +130,15 @@ test_crypto_aes(void *arg)
memset(data2, 0, 1024);
memset(data3, 0, 1024);
env1 = crypto_cipher_new(NULL);
- tt_ptr_op(env1, !=, NULL);
+ tt_ptr_op(env1, OP_NE, NULL);
env2 = crypto_cipher_new(crypto_cipher_get_key(env1));
- tt_ptr_op(env2, !=, NULL);
+ tt_ptr_op(env2, OP_NE, NULL);
/* Try encrypting 512 chars. */
crypto_cipher_encrypt(env1, data2, data1, 512);
crypto_cipher_decrypt(env2, data3, data2, 512);
- tt_mem_op(data1,==, data3, 512);
- tt_mem_op(data1,!=, data2, 512);
+ tt_mem_op(data1,OP_EQ, data3, 512);
+ tt_mem_op(data1,OP_NE, data2, 512);
/* Now encrypt 1 at a time, and get 1 at a time. */
for (j = 512; j < 560; ++j) {
@@ -150,7 +147,7 @@ test_crypto_aes(void *arg)
for (j = 512; j < 560; ++j) {
crypto_cipher_decrypt(env2, data3+j, data2+j, 1);
}
- tt_mem_op(data1,==, data3, 560);
+ tt_mem_op(data1,OP_EQ, data3, 560);
/* Now encrypt 3 at a time, and get 5 at a time. */
for (j = 560; j < 1024-5; j += 3) {
crypto_cipher_encrypt(env1, data2+j, data1+j, 3);
@@ -158,7 +155,7 @@ test_crypto_aes(void *arg)
for (j = 560; j < 1024-5; j += 5) {
crypto_cipher_decrypt(env2, data3+j, data2+j, 5);
}
- tt_mem_op(data1,==, data3, 1024-5);
+ tt_mem_op(data1,OP_EQ, data3, 1024-5);
/* Now make sure that when we encrypt with different chunk sizes, we get
the same results. */
crypto_cipher_free(env2);
@@ -166,7 +163,7 @@ test_crypto_aes(void *arg)
memset(data3, 0, 1024);
env2 = crypto_cipher_new(crypto_cipher_get_key(env1));
- tt_ptr_op(env2, !=, NULL);
+ tt_ptr_op(env2, OP_NE, NULL);
for (j = 0; j < 1024-16; j += 17) {
crypto_cipher_encrypt(env2, data3+j, data1+j, 17);
}
@@ -175,7 +172,7 @@ test_crypto_aes(void *arg)
printf("%d: %d\t%d\n", j, (int) data2[j], (int) data3[j]);
}
}
- tt_mem_op(data2,==, data3, 1024-16);
+ tt_mem_op(data2,OP_EQ, data3, 1024-16);
crypto_cipher_free(env1);
env1 = NULL;
crypto_cipher_free(env2);
@@ -271,25 +268,25 @@ test_crypto_sha(void *arg)
(void)arg;
i = crypto_digest(data, "abc", 3);
test_memeq_hex(data, "A9993E364706816ABA3E25717850C26C9CD0D89D");
- tt_int_op(i, ==, 0);
+ tt_int_op(i, OP_EQ, 0);
/* Test SHA-256 with a test vector from the specification. */
i = crypto_digest256(data, "abc", 3, DIGEST_SHA256);
test_memeq_hex(data, "BA7816BF8F01CFEA414140DE5DAE2223B00361A3"
"96177A9CB410FF61F20015AD");
- tt_int_op(i, ==, 0);
+ tt_int_op(i, OP_EQ, 0);
/* Test HMAC-SHA256 with test cases from wikipedia and RFC 4231 */
/* Case empty (wikipedia) */
crypto_hmac_sha256(digest, "", 0, "", 0);
- tt_str_op(hex_str(digest, 32),==,
+ tt_str_op(hex_str(digest, 32),OP_EQ,
"B613679A0814D9EC772F95D778C35FC5FF1697C493715653C6C712144292C5AD");
/* Case quick-brown (wikipedia) */
crypto_hmac_sha256(digest, "key", 3,
"The quick brown fox jumps over the lazy dog", 43);
- tt_str_op(hex_str(digest, 32),==,
+ tt_str_op(hex_str(digest, 32),OP_EQ,
"F7BC83F430538424B13298E6AA6FB143EF4D59A14946175997479DBC2D1A3CD8");
/* "Test Case 1" from RFC 4231 */
@@ -357,15 +354,15 @@ test_crypto_sha(void *arg)
crypto_digest_add_bytes(d2, "ghijkl", 6);
crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
crypto_digest(d_out2, "abcdefghijkl", 12);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
crypto_digest_assign(d2, d1);
crypto_digest_add_bytes(d2, "mno", 3);
crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
crypto_digest(d_out2, "abcdefmno", 9);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
crypto_digest_get_digest(d1, d_out1, sizeof(d_out1));
crypto_digest(d_out2, "abcdef", 6);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
crypto_digest_free(d1);
crypto_digest_free(d2);
@@ -378,15 +375,15 @@ test_crypto_sha(void *arg)
crypto_digest_add_bytes(d2, "ghijkl", 6);
crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
crypto_digest256(d_out2, "abcdefghijkl", 12, DIGEST_SHA256);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
crypto_digest_assign(d2, d1);
crypto_digest_add_bytes(d2, "mno", 3);
crypto_digest_get_digest(d2, d_out1, sizeof(d_out1));
crypto_digest256(d_out2, "abcdefmno", 9, DIGEST_SHA256);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
crypto_digest_get_digest(d1, d_out1, sizeof(d_out1));
crypto_digest256(d_out2, "abcdef", 6, DIGEST_SHA256);
- tt_mem_op(d_out1,==, d_out2, DIGEST_LEN);
+ tt_mem_op(d_out1,OP_EQ, d_out2, DIGEST_LEN);
done:
if (d1)
@@ -413,42 +410,42 @@ test_crypto_pk(void *arg)
tt_assert(pk1 && pk2);
tt_assert(! crypto_pk_write_public_key_to_string(pk1, &encoded, &size));
tt_assert(! crypto_pk_read_public_key_from_string(pk2, encoded, size));
- tt_int_op(0,==, crypto_pk_cmp_keys(pk1, pk2));
+ tt_int_op(0,OP_EQ, crypto_pk_cmp_keys(pk1, pk2));
/* comparison between keys and NULL */
- tt_int_op(crypto_pk_cmp_keys(NULL, pk1), <, 0);
- tt_int_op(crypto_pk_cmp_keys(NULL, NULL), ==, 0);
- tt_int_op(crypto_pk_cmp_keys(pk1, NULL), >, 0);
+ tt_int_op(crypto_pk_cmp_keys(NULL, pk1), OP_LT, 0);
+ tt_int_op(crypto_pk_cmp_keys(NULL, NULL), OP_EQ, 0);
+ tt_int_op(crypto_pk_cmp_keys(pk1, NULL), OP_GT, 0);
- tt_int_op(128,==, crypto_pk_keysize(pk1));
- tt_int_op(1024,==, crypto_pk_num_bits(pk1));
- tt_int_op(128,==, crypto_pk_keysize(pk2));
- tt_int_op(1024,==, crypto_pk_num_bits(pk2));
+ tt_int_op(128,OP_EQ, crypto_pk_keysize(pk1));
+ tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk1));
+ tt_int_op(128,OP_EQ, crypto_pk_keysize(pk2));
+ tt_int_op(1024,OP_EQ, crypto_pk_num_bits(pk2));
- tt_int_op(128,==, crypto_pk_public_encrypt(pk2, data1, sizeof(data1),
+ tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk2, data1, sizeof(data1),
"Hello whirled.", 15,
PK_PKCS1_OAEP_PADDING));
- tt_int_op(128,==, crypto_pk_public_encrypt(pk1, data2, sizeof(data1),
+ tt_int_op(128,OP_EQ, crypto_pk_public_encrypt(pk1, data2, sizeof(data1),
"Hello whirled.", 15,
PK_PKCS1_OAEP_PADDING));
/* oaep padding should make encryption not match */
- tt_mem_op(data1,!=, data2, 128);
- tt_int_op(15,==,
+ tt_mem_op(data1,OP_NE, data2, 128);
+ tt_int_op(15,OP_EQ,
crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data1, 128,
PK_PKCS1_OAEP_PADDING,1));
- tt_str_op(data3,==, "Hello whirled.");
+ tt_str_op(data3,OP_EQ, "Hello whirled.");
memset(data3, 0, 1024);
- tt_int_op(15,==,
+ tt_int_op(15,OP_EQ,
crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128,
PK_PKCS1_OAEP_PADDING,1));
- tt_str_op(data3,==, "Hello whirled.");
+ tt_str_op(data3,OP_EQ, "Hello whirled.");
/* Can't decrypt with public key. */
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data2, 128,
PK_PKCS1_OAEP_PADDING,1));
/* Try again with bad padding */
memcpy(data2+1, "XYZZY", 5); /* This has fails ~ once-in-2^40 */
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
crypto_pk_private_decrypt(pk1, data3, sizeof(data3), data2, 128,
PK_PKCS1_OAEP_PADDING,1));
@@ -464,25 +461,25 @@ test_crypto_pk(void *arg)
get_fname("xyzzy")) < 0);
tt_assert(! crypto_pk_read_private_key_from_filename(pk2,
get_fname("pkey1")));
- tt_int_op(15,==,
+ tt_int_op(15,OP_EQ,
crypto_pk_private_decrypt(pk2, data3, sizeof(data3), data1, 128,
PK_PKCS1_OAEP_PADDING,1));
/* Now try signing. */
strlcpy(data1, "Ossifrage", 1024);
- tt_int_op(128,==,
+ tt_int_op(128,OP_EQ,
crypto_pk_private_sign(pk1, data2, sizeof(data2), data1, 10));
- tt_int_op(10,==,
+ tt_int_op(10,OP_EQ,
crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128));
- tt_str_op(data3,==, "Ossifrage");
+ tt_str_op(data3,OP_EQ, "Ossifrage");
/* Try signing digests. */
- tt_int_op(128,==, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2),
+ tt_int_op(128,OP_EQ, crypto_pk_private_sign_digest(pk1, data2, sizeof(data2),
data1, 10));
- tt_int_op(20,==,
+ tt_int_op(20,OP_EQ,
crypto_pk_public_checksig(pk1, data3, sizeof(data3), data2, 128));
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
crypto_pk_public_checksig_digest(pk1, data1, 10, data2, 128));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
crypto_pk_public_checksig_digest(pk1, data1, 11, data2, 128));
/*XXXX test failed signing*/
@@ -491,7 +488,7 @@ test_crypto_pk(void *arg)
crypto_pk_free(pk2);
pk2 = NULL;
i = crypto_pk_asn1_encode(pk1, data1, 1024);
- tt_int_op(i, >, 0);
+ tt_int_op(i, OP_GT, 0);
pk2 = crypto_pk_asn1_decode(data1, i);
tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0);
@@ -502,18 +499,18 @@ test_crypto_pk(void *arg)
memset(data3,0,1024);
len = crypto_pk_public_hybrid_encrypt(pk1,data2,sizeof(data2),
data1,i,PK_PKCS1_OAEP_PADDING,0);
- tt_int_op(len, >=, 0);
+ tt_int_op(len, OP_GE, 0);
len = crypto_pk_private_hybrid_decrypt(pk1,data3,sizeof(data3),
data2,len,PK_PKCS1_OAEP_PADDING,1);
- tt_int_op(len,==, i);
- tt_mem_op(data1,==, data3,i);
+ tt_int_op(len,OP_EQ, i);
+ tt_mem_op(data1,OP_EQ, data3,i);
}
/* Try copy_full */
crypto_pk_free(pk2);
pk2 = crypto_pk_copy_full(pk1);
tt_assert(pk2 != NULL);
- tt_ptr_op(pk1, !=, pk2);
+ tt_ptr_op(pk1, OP_NE, pk2);
tt_assert(crypto_pk_cmp_keys(pk1,pk2) == 0);
done:
@@ -540,33 +537,33 @@ test_crypto_pk_fingerprints(void *arg)
pk = pk_generate(1);
tt_assert(pk);
n = crypto_pk_asn1_encode(pk, encoded, sizeof(encoded));
- tt_int_op(n, >, 0);
- tt_int_op(n, >, 128);
- tt_int_op(n, <, 256);
+ tt_int_op(n, OP_GT, 0);
+ tt_int_op(n, OP_GT, 128);
+ tt_int_op(n, OP_LT, 256);
/* Is digest as expected? */
crypto_digest(d, encoded, n);
- tt_int_op(0, ==, crypto_pk_get_digest(pk, d2));
- tt_mem_op(d,==, d2, DIGEST_LEN);
+ tt_int_op(0, OP_EQ, crypto_pk_get_digest(pk, d2));
+ tt_mem_op(d,OP_EQ, d2, DIGEST_LEN);
/* Is fingerprint right? */
- tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 0));
- tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 0));
+ tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2);
test_memeq_hex(d, fingerprint);
/* Are spaces right? */
- tt_int_op(0, ==, crypto_pk_get_fingerprint(pk, fingerprint, 1));
+ tt_int_op(0, OP_EQ, crypto_pk_get_fingerprint(pk, fingerprint, 1));
for (i = 4; i < strlen(fingerprint); i += 5) {
- tt_int_op(fingerprint[i], ==, ' ');
+ tt_int_op(fingerprint[i], OP_EQ, ' ');
}
tor_strstrip(fingerprint, " ");
- tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2);
test_memeq_hex(d, fingerprint);
/* Now hash again and check crypto_pk_get_hashed_fingerprint. */
crypto_digest(d2, d, sizeof(d));
- tt_int_op(0, ==, crypto_pk_get_hashed_fingerprint(pk, fingerprint));
- tt_int_op(strlen(fingerprint), ==, DIGEST_LEN * 2);
+ tt_int_op(0, OP_EQ, crypto_pk_get_hashed_fingerprint(pk, fingerprint));
+ tt_int_op(strlen(fingerprint), OP_EQ, DIGEST_LEN * 2);
test_memeq_hex(d2, fingerprint);
done:
@@ -591,14 +588,14 @@ test_crypto_digests(void *arg)
r = crypto_pk_get_digest(k, digest);
tt_assert(r == 0);
- tt_mem_op(hex_str(digest, DIGEST_LEN),==,
+ tt_mem_op(hex_str(digest, DIGEST_LEN),OP_EQ,
AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN);
r = crypto_pk_get_all_digests(k, &pkey_digests);
- tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),==,
+ tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA1], DIGEST_LEN),OP_EQ,
AUTHORITY_SIGNKEY_A_DIGEST, HEX_DIGEST_LEN);
- tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),==,
+ tt_mem_op(hex_str(pkey_digests.d[DIGEST_SHA256], DIGEST256_LEN),OP_EQ,
AUTHORITY_SIGNKEY_A_DIGEST256, HEX_DIGEST256_LEN);
done:
crypto_pk_free(k);
@@ -622,31 +619,31 @@ test_crypto_formats(void *arg)
memset(data1, 6, 1024);
for (idx = 0; idx < 10; ++idx) {
i = base64_encode(data2, 1024, data1, idx);
- tt_int_op(i, >=, 0);
+ tt_int_op(i, OP_GE, 0);
j = base64_decode(data3, 1024, data2, i);
- tt_int_op(j,==, idx);
- tt_mem_op(data3,==, data1, idx);
+ tt_int_op(j,OP_EQ, idx);
+ tt_mem_op(data3,OP_EQ, data1, idx);
}
strlcpy(data1, "Test string that contains 35 chars.", 1024);
strlcat(data1, " 2nd string that contains 35 chars.", 1024);
i = base64_encode(data2, 1024, data1, 71);
- tt_int_op(i, >=, 0);
+ tt_int_op(i, OP_GE, 0);
j = base64_decode(data3, 1024, data2, i);
- tt_int_op(j,==, 71);
- tt_str_op(data3,==, data1);
- tt_int_op(data2[i], ==, '\0');
+ tt_int_op(j,OP_EQ, 71);
+ tt_str_op(data3,OP_EQ, data1);
+ tt_int_op(data2[i], OP_EQ, '\0');
crypto_rand(data1, DIGEST_LEN);
memset(data2, 100, 1024);
digest_to_base64(data2, data1);
- tt_int_op(BASE64_DIGEST_LEN,==, strlen(data2));
- tt_int_op(100,==, data2[BASE64_DIGEST_LEN+2]);
+ tt_int_op(BASE64_DIGEST_LEN,OP_EQ, strlen(data2));
+ tt_int_op(100,OP_EQ, data2[BASE64_DIGEST_LEN+2]);
memset(data3, 99, 1024);
- tt_int_op(digest_from_base64(data3, data2),==, 0);
- tt_mem_op(data1,==, data3, DIGEST_LEN);
- tt_int_op(99,==, data3[DIGEST_LEN+1]);
+ tt_int_op(digest_from_base64(data3, data2),OP_EQ, 0);
+ tt_mem_op(data1,OP_EQ, data3, DIGEST_LEN);
+ tt_int_op(99,OP_EQ, data3[DIGEST_LEN+1]);
tt_assert(digest_from_base64(data3, "###") < 0);
@@ -654,12 +651,12 @@ test_crypto_formats(void *arg)
crypto_rand(data2, DIGEST256_LEN);
memset(data2, 100, 1024);
digest256_to_base64(data2, data1);
- tt_int_op(BASE64_DIGEST256_LEN,==, strlen(data2));
- tt_int_op(100,==, data2[BASE64_DIGEST256_LEN+2]);
+ tt_int_op(BASE64_DIGEST256_LEN,OP_EQ, strlen(data2));
+ tt_int_op(100,OP_EQ, data2[BASE64_DIGEST256_LEN+2]);
memset(data3, 99, 1024);
- tt_int_op(digest256_from_base64(data3, data2),==, 0);
- tt_mem_op(data1,==, data3, DIGEST256_LEN);
- tt_int_op(99,==, data3[DIGEST256_LEN+1]);
+ tt_int_op(digest256_from_base64(data3, data2),OP_EQ, 0);
+ tt_mem_op(data1,OP_EQ, data3, DIGEST256_LEN);
+ tt_int_op(99,OP_EQ, data3[DIGEST256_LEN+1]);
/* Base32 tests */
strlcpy(data1, "5chrs", 1024);
@@ -668,27 +665,27 @@ test_crypto_formats(void *arg)
* By 5s: [00110 10101 10001 10110 10000 11100 10011 10011]
*/
base32_encode(data2, 9, data1, 5);
- tt_str_op(data2,==, "gvrwq4tt");
+ tt_str_op(data2,OP_EQ, "gvrwq4tt");
strlcpy(data1, "\xFF\xF5\x6D\x44\xAE\x0D\x5C\xC9\x62\xC4", 1024);
base32_encode(data2, 30, data1, 10);
- tt_str_op(data2,==, "772w2rfobvomsywe");
+ tt_str_op(data2,OP_EQ, "772w2rfobvomsywe");
/* Base16 tests */
strlcpy(data1, "6chrs\xff", 1024);
base16_encode(data2, 13, data1, 6);
- tt_str_op(data2,==, "3663687273FF");
+ tt_str_op(data2,OP_EQ, "3663687273FF");
strlcpy(data1, "f0d678affc000100", 1024);
i = base16_decode(data2, 8, data1, 16);
- tt_int_op(i,==, 0);
- tt_mem_op(data2,==, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8);
+ tt_int_op(i,OP_EQ, 0);
+ tt_mem_op(data2,OP_EQ, "\xf0\xd6\x78\xaf\xfc\x00\x01\x00",8);
/* now try some failing base16 decodes */
- tt_int_op(-1,==, base16_decode(data2, 8, data1, 15)); /* odd input len */
- tt_int_op(-1,==, base16_decode(data2, 7, data1, 16)); /* dest too short */
+ tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 15)); /* odd input len */
+ tt_int_op(-1,OP_EQ, base16_decode(data2, 7, data1, 16)); /* dest too short */
strlcpy(data1, "f0dz!8affc000100", 1024);
- tt_int_op(-1,==, base16_decode(data2, 8, data1, 16));
+ tt_int_op(-1,OP_EQ, base16_decode(data2, 8, data1, 16));
tor_free(data1);
tor_free(data2);
@@ -697,10 +694,11 @@ test_crypto_formats(void *arg)
/* Add spaces to fingerprint */
{
data1 = tor_strdup("ABCD1234ABCD56780000ABCD1234ABCD56780000");
- tt_int_op(strlen(data1),==, 40);
+ tt_int_op(strlen(data1),OP_EQ, 40);
data2 = tor_malloc(FINGERPRINT_LEN+1);
crypto_add_spaces_to_fp(data2, FINGERPRINT_LEN+1, data1);
- tt_str_op(data2,==, "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000");
+ tt_str_op(data2, OP_EQ,
+ "ABCD 1234 ABCD 5678 0000 ABCD 1234 ABCD 5678 0000");
tor_free(data1);
tor_free(data2);
}
@@ -711,379 +709,6 @@ test_crypto_formats(void *arg)
tor_free(data3);
}
-/** Run unit tests for our secret-to-key passphrase hashing functionality. */
-static void
-test_crypto_s2k_rfc2440(void *arg)
-{
- char buf[29];
- char buf2[29];
- char *buf3 = NULL;
- int i;
-
- (void)arg;
- memset(buf, 0, sizeof(buf));
- memset(buf2, 0, sizeof(buf2));
- buf3 = tor_malloc(65536);
- memset(buf3, 0, 65536);
-
- secret_to_key_rfc2440(buf+9, 20, "", 0, buf);
- crypto_digest(buf2+9, buf3, 1024);
- tt_mem_op(buf,==, buf2, 29);
-
- memcpy(buf,"vrbacrda",8);
- memcpy(buf2,"vrbacrda",8);
- buf[8] = 96;
- buf2[8] = 96;
- secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf);
- for (i = 0; i < 65536; i += 16) {
- memcpy(buf3+i, "vrbacrda12345678", 16);
- }
- crypto_digest(buf2+9, buf3, 65536);
- tt_mem_op(buf,==, buf2, 29);
-
- done:
- tor_free(buf3);
-}
-
-static void
-run_s2k_tests(const unsigned flags, const unsigned type,
- int speclen, const int keylen, int legacy)
-{
- uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN];
- int r;
- size_t sz;
- const char pw1[] = "You can't come in here unless you say swordfish!";
- const char pw2[] = "Now, I give you one more guess.";
-
- r = secret_to_key_new(buf, sizeof(buf), &sz,
- pw1, strlen(pw1), flags);
- tt_int_op(r, ==, S2K_OKAY);
- tt_int_op(buf[0], ==, type);
-
- tt_int_op(sz, ==, keylen + speclen);
-
- if (legacy) {
- memmove(buf, buf+1, sz-1);
- --sz;
- --speclen;
- }
-
- tt_int_op(S2K_OKAY, ==,
- secret_to_key_check(buf, sz, pw1, strlen(pw1)));
-
- tt_int_op(S2K_BAD_SECRET, ==,
- secret_to_key_check(buf, sz, pw2, strlen(pw2)));
-
- /* Move key to buf2, and clear it. */
- memset(buf3, 0, sizeof(buf3));
- memcpy(buf2, buf+speclen, keylen);
- memset(buf+speclen, 0, sz - speclen);
-
- /* Derivekey should produce the same results. */
- tt_int_op(S2K_OKAY, ==,
- secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1)));
-
- tt_mem_op(buf2, ==, buf3, keylen);
-
- /* Derivekey with a longer output should fill the output. */
- memset(buf2, 0, sizeof(buf2));
- tt_int_op(S2K_OKAY, ==,
- secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen,
- pw1, strlen(pw1)));
-
- tt_mem_op(buf2, !=, buf3, sizeof(buf2));
-
- memset(buf3, 0, sizeof(buf3));
- tt_int_op(S2K_OKAY, ==,
- secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen,
- pw1, strlen(pw1)));
- tt_mem_op(buf2, ==, buf3, sizeof(buf3));
- tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen));
-
- done:
- ;
-}
-
-static void
-test_crypto_s2k_general(void *arg)
-{
- const char *which = arg;
-
- if (!strcmp(which, "scrypt")) {
- run_s2k_tests(0, 2, 19, 32, 0);
- } else if (!strcmp(which, "scrypt-low")) {
- run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0);
- } else if (!strcmp(which, "pbkdf2")) {
- run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0);
- } else if (!strcmp(which, "rfc2440")) {
- run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0);
- } else if (!strcmp(which, "rfc2440-legacy")) {
- run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1);
- } else {
- tt_fail();
- }
-}
-
-static void
-test_crypto_s2k_errors(void *arg)
-{
- uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN];
- size_t sz;
-
- (void)arg;
-
- /* Bogus specifiers: simple */
- tt_int_op(S2K_BAD_LEN, ==,
- secret_to_key_derivekey(buf, sizeof(buf),
- (const uint8_t*)"", 0, "ABC", 3));
- tt_int_op(S2K_BAD_ALGORITHM, ==,
- secret_to_key_derivekey(buf, sizeof(buf),
- (const uint8_t*)"\x10", 1, "ABC", 3));
- tt_int_op(S2K_BAD_LEN, ==,
- secret_to_key_derivekey(buf, sizeof(buf),
- (const uint8_t*)"\x01\x02", 2, "ABC", 3));
-
- tt_int_op(S2K_BAD_LEN, ==,
- secret_to_key_check((const uint8_t*)"", 0, "ABC", 3));
- tt_int_op(S2K_BAD_ALGORITHM, ==,
- secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3));
- tt_int_op(S2K_BAD_LEN, ==,
- secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3));
-
- /* too long gets "BAD_LEN" too */
- memset(buf, 0, sizeof(buf));
- buf[0] = 2;
- tt_int_op(S2K_BAD_LEN, ==,
- secret_to_key_derivekey(buf2, sizeof(buf2),
- buf, sizeof(buf), "ABC", 3));
-
- /* Truncated output */
-#ifdef HAVE_LIBSCRYPT_H
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz,
- "ABC", 3, 0));
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 50, &sz,
- "ABC", 3, S2K_FLAG_LOW_MEM));
-#endif
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 37, &sz,
- "ABC", 3, S2K_FLAG_USE_PBKDF2));
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_new(buf, 29, &sz,
- "ABC", 3, S2K_FLAG_NO_SCRYPT));
-
-#ifdef HAVE_LIBSCRYPT_H
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18, 0));
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 18,
- S2K_FLAG_LOW_MEM));
-#endif
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 17,
- S2K_FLAG_USE_PBKDF2));
- tt_int_op(S2K_TRUNCATED, ==, secret_to_key_make_specifier(buf, 9,
- S2K_FLAG_NO_SCRYPT));
-
- /* Now try using type-specific bogus specifiers. */
-
- /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow
- * int32_t. */
- memset(buf, 0, sizeof(buf));
- buf[0] = 1; /* pbkdf2 */
- buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */
- tt_int_op(S2K_BAD_PARAMS, ==,
- secret_to_key_derivekey(buf2, sizeof(buf2),
- buf, 18, "ABC", 3));
-
-#ifdef HAVE_LIBSCRYPT_H
- /* It's a bad scrypt buffer if N would overflow uint64 */
- memset(buf, 0, sizeof(buf));
- buf[0] = 2; /* scrypt */
- buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */
- tt_int_op(S2K_BAD_PARAMS, ==,
- secret_to_key_derivekey(buf2, sizeof(buf2),
- buf, 19, "ABC", 3));
-#endif
-
- done:
- ;
-}
-
-static void
-test_crypto_scrypt_vectors(void *arg)
-{
- char *mem_op_hex_tmp = NULL;
- uint8_t spec[64], out[64];
-
- (void)arg;
-#ifndef HAVE_LIBSCRYPT_H
- if (1)
- tt_skip();
-#endif
-
- /* Test vectors from
- http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11.
-
- Note that the names of 'r' and 'N' are switched in that section. Or
- possibly in libscrypt.
- */
-
- base16_decode((char*)spec, sizeof(spec),
- "0400", 4);
- memset(out, 0x00, sizeof(out));
- tt_int_op(64, ==,
- secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2));
- test_memeq_hex(out,
- "77d6576238657b203b19ca42c18a0497"
- "f16b4844e3074ae8dfdffa3fede21442"
- "fcd0069ded0948f8326a753a0fc81f17"
- "e8d3e0fb2e0d3628cf35e20c38d18906");
-
- base16_decode((char*)spec, sizeof(spec),
- "4e61436c" "0A34", 12);
- memset(out, 0x00, sizeof(out));
- tt_int_op(64, ==,
- secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2));
- test_memeq_hex(out,
- "fdbabe1c9d3472007856e7190d01e9fe"
- "7c6ad7cbc8237830e77376634b373162"
- "2eaf30d92e22a3886ff109279d9830da"
- "c727afb94a83ee6d8360cbdfa2cc0640");
-
- base16_decode((char*)spec, sizeof(spec),
- "536f6469756d43686c6f72696465" "0e30", 32);
- memset(out, 0x00, sizeof(out));
- tt_int_op(64, ==,
- secret_to_key_compute_key(out, 64, spec, 16,
- "pleaseletmein", 13, 2));
- test_memeq_hex(out,
- "7023bdcb3afd7348461c06cd81fd38eb"
- "fda8fbba904f8e3ea9b543f6545da1f2"
- "d5432955613f0fcf62d49705242a9af9"
- "e61e85dc0d651e40dfcf017b45575887");
-
- base16_decode((char*)spec, sizeof(spec),
- "536f6469756d43686c6f72696465" "1430", 32);
- memset(out, 0x00, sizeof(out));
- tt_int_op(64, ==,
- secret_to_key_compute_key(out, 64, spec, 16,
- "pleaseletmein", 13, 2));
- test_memeq_hex(out,
- "2101cb9b6a511aaeaddbbe09cf70f881"
- "ec568d574a2ffd4dabe5ee9820adaa47"
- "8e56fd8f4ba5d09ffa1c6d927c40f4c3"
- "37304049e8a952fbcbf45c6fa77a41a4");
-
- done:
- tor_free(mem_op_hex_tmp);
-}
-
-static void
-test_crypto_pbkdf2_vectors(void *arg)
-{
- char *mem_op_hex_tmp = NULL;
- uint8_t spec[64], out[64];
- (void)arg;
-
- /* Test vectors from RFC6070, section 2 */
- base16_decode((char*)spec, sizeof(spec),
- "73616c74" "00" , 10);
- memset(out, 0x00, sizeof(out));
- tt_int_op(20, ==,
- secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
- test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6");
-
- base16_decode((char*)spec, sizeof(spec),
- "73616c74" "01" , 10);
- memset(out, 0x00, sizeof(out));
- tt_int_op(20, ==,
- secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
- test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957");
-
- base16_decode((char*)spec, sizeof(spec),
- "73616c74" "0C" , 10);
- memset(out, 0x00, sizeof(out));
- tt_int_op(20, ==,
- secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
- test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1");
-
- base16_decode((char*)spec, sizeof(spec),
- "73616c74" "18" , 10);
- memset(out, 0x00, sizeof(out));
- tt_int_op(20, ==,
- secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
- test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984");
-
- base16_decode((char*)spec, sizeof(spec),
- "73616c7453414c5473616c7453414c5473616c745"
- "3414c5473616c7453414c5473616c74" "0C" , 74);
- memset(out, 0x00, sizeof(out));
- tt_int_op(25, ==,
- secret_to_key_compute_key(out, 25, spec, 37,
- "passwordPASSWORDpassword", 24, 1));
- test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038");
-
- base16_decode((char*)spec, sizeof(spec),
- "7361006c74" "0c" , 12);
- memset(out, 0x00, sizeof(out));
- tt_int_op(16, ==,
- secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1));
- test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3");
-
- done:
- tor_free(mem_op_hex_tmp);
-}
-
-static void
-test_crypto_pwbox(void *arg)
-{
- uint8_t *boxed=NULL, *decoded=NULL;
- size_t len, dlen;
- unsigned i;
- const char msg[] = "This bunny reminds you that you still have a "
- "salamander in your sylladex. She is holding the bunny Dave got you. "
- "It’s sort of uncanny how similar they are, aside from the knitted "
- "enhancements. Seriously, what are the odds?? So weird.";
- const char pw[] = "I'm a night owl and a wise bird too";
-
- const unsigned flags[] = { 0,
- S2K_FLAG_NO_SCRYPT,
- S2K_FLAG_LOW_MEM,
- S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM,
- S2K_FLAG_USE_PBKDF2 };
- (void)arg;
-
- for (i = 0; i < ARRAY_LENGTH(flags); ++i) {
- tt_int_op(0, ==, crypto_pwbox(&boxed, &len,
- (const uint8_t*)msg, strlen(msg),
- pw, strlen(pw), flags[i]));
- tt_assert(boxed);
- tt_assert(len > 128+32);
-
- tt_int_op(0, ==, crypto_unpwbox(&decoded, &dlen, boxed, len,
- pw, strlen(pw)));
-
- tt_assert(decoded);
- tt_uint_op(dlen, ==, strlen(msg));
- tt_mem_op(decoded, ==, msg, dlen);
-
- tor_free(decoded);
-
- tt_int_op(UNPWBOX_BAD_SECRET, ==, crypto_unpwbox(&decoded, &dlen,
- boxed, len,
- pw, strlen(pw)-1));
- boxed[len-1] ^= 1;
- tt_int_op(UNPWBOX_BAD_SECRET, ==, crypto_unpwbox(&decoded, &dlen,
- boxed, len,
- pw, strlen(pw)));
- boxed[0] = 255;
- tt_int_op(UNPWBOX_CORRUPTED, ==, crypto_unpwbox(&decoded, &dlen,
- boxed, len,
- pw, strlen(pw)));
-
- tor_free(boxed);
- }
-
- done:
- tor_free(boxed);
- tor_free(decoded);
-}
-
/** Test AES-CTR encryption and decryption with IV. */
static void
test_crypto_aes_iv(void *arg)
@@ -1114,79 +739,79 @@ test_crypto_aes_iv(void *arg)
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 4095,
plain, 4095);
- tt_int_op(encrypted_size,==, 16 + 4095);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 4095);
tt_assert(encrypted_size > 0); /* This is obviously true, since 4111 is
* greater than 0, but its truth is not
* obvious to all analysis tools. */
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 4095);
+ tt_int_op(decrypted_size,OP_EQ, 4095);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain,==, decrypted1, 4095);
+ tt_mem_op(plain,OP_EQ, decrypted1, 4095);
/* Encrypt a second time (with a new random initialization vector). */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted2, 16 + 4095,
plain, 4095);
- tt_int_op(encrypted_size,==, 16 + 4095);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 4095);
tt_assert(encrypted_size > 0);
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted2, 4095,
encrypted2, encrypted_size);
- tt_int_op(decrypted_size,==, 4095);
+ tt_int_op(decrypted_size,OP_EQ, 4095);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain,==, decrypted2, 4095);
- tt_mem_op(encrypted1,!=, encrypted2, encrypted_size);
+ tt_mem_op(plain,OP_EQ, decrypted2, 4095);
+ tt_mem_op(encrypted1,OP_NE, encrypted2, encrypted_size);
/* Decrypt with the wrong key. */
decrypted_size = crypto_cipher_decrypt_with_iv(key2, decrypted2, 4095,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 4095);
- tt_mem_op(plain,!=, decrypted2, decrypted_size);
+ tt_int_op(decrypted_size,OP_EQ, 4095);
+ tt_mem_op(plain,OP_NE, decrypted2, decrypted_size);
/* Alter the initialization vector. */
encrypted1[0] += 42;
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 4095,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 4095);
- tt_mem_op(plain,!=, decrypted2, 4095);
+ tt_int_op(decrypted_size,OP_EQ, 4095);
+ tt_mem_op(plain,OP_NE, decrypted2, 4095);
/* Special length case: 1. */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 1,
plain_1, 1);
- tt_int_op(encrypted_size,==, 16 + 1);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 1);
tt_assert(encrypted_size > 0);
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 1,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 1);
+ tt_int_op(decrypted_size,OP_EQ, 1);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain_1,==, decrypted1, 1);
+ tt_mem_op(plain_1,OP_EQ, decrypted1, 1);
/* Special length case: 15. */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 15,
plain_15, 15);
- tt_int_op(encrypted_size,==, 16 + 15);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 15);
tt_assert(encrypted_size > 0);
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 15,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 15);
+ tt_int_op(decrypted_size,OP_EQ, 15);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain_15,==, decrypted1, 15);
+ tt_mem_op(plain_15,OP_EQ, decrypted1, 15);
/* Special length case: 16. */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 16,
plain_16, 16);
- tt_int_op(encrypted_size,==, 16 + 16);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 16);
tt_assert(encrypted_size > 0);
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 16,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 16);
+ tt_int_op(decrypted_size,OP_EQ, 16);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain_16,==, decrypted1, 16);
+ tt_mem_op(plain_16,OP_EQ, decrypted1, 16);
/* Special length case: 17. */
encrypted_size = crypto_cipher_encrypt_with_iv(key1, encrypted1, 16 + 17,
plain_17, 17);
- tt_int_op(encrypted_size,==, 16 + 17);
+ tt_int_op(encrypted_size,OP_EQ, 16 + 17);
tt_assert(encrypted_size > 0);
decrypted_size = crypto_cipher_decrypt_with_iv(key1, decrypted1, 17,
encrypted1, encrypted_size);
- tt_int_op(decrypted_size,==, 17);
+ tt_int_op(decrypted_size,OP_EQ, 17);
tt_assert(decrypted_size > 0);
- tt_mem_op(plain_17,==, decrypted1, 17);
+ tt_mem_op(plain_17,OP_EQ, decrypted1, 17);
done:
/* Free memory. */
@@ -1208,26 +833,26 @@ test_crypto_base32_decode(void *arg)
/* Encode and decode a random string. */
base32_encode(encoded, 96 + 1, plain, 60);
res = base32_decode(decoded, 60, encoded, 96);
- tt_int_op(res,==, 0);
- tt_mem_op(plain,==, decoded, 60);
+ tt_int_op(res,OP_EQ, 0);
+ tt_mem_op(plain,OP_EQ, decoded, 60);
/* Encode, uppercase, and decode a random string. */
base32_encode(encoded, 96 + 1, plain, 60);
tor_strupper(encoded);
res = base32_decode(decoded, 60, encoded, 96);
- tt_int_op(res,==, 0);
- tt_mem_op(plain,==, decoded, 60);
+ tt_int_op(res,OP_EQ, 0);
+ tt_mem_op(plain,OP_EQ, decoded, 60);
/* Change encoded string and decode. */
if (encoded[0] == 'A' || encoded[0] == 'a')
encoded[0] = 'B';
else
encoded[0] = 'A';
res = base32_decode(decoded, 60, encoded, 96);
- tt_int_op(res,==, 0);
- tt_mem_op(plain,!=, decoded, 60);
+ tt_int_op(res,OP_EQ, 0);
+ tt_mem_op(plain,OP_NE, decoded, 60);
/* Bad encodings. */
encoded[0] = '!';
res = base32_decode(decoded, 60, encoded, 96);
- tt_int_op(0, >, res);
+ tt_int_op(0, OP_GT, res);
done:
;
@@ -1250,7 +875,7 @@ test_crypto_kdf_TAP(void *arg)
* your own. */
memset(key_material, 0, sizeof(key_material));
EXPAND("");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"5ba93c9db0cff93f52b521d7420e43f6eda2784fbf8b4530d8"
"d246dd74ac53a13471bba17941dff7c4ea21bb365bbeeaf5f2"
@@ -1258,7 +883,7 @@ test_crypto_kdf_TAP(void *arg)
"f07b01e13da42c6cf1de3abfdea9b95f34687cbbe92b9a7383");
EXPAND("Tor");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"776c6214fc647aaa5f683c737ee66ec44f03d0372e1cce6922"
"7950f236ddf1e329a7ce7c227903303f525a8c6662426e8034"
@@ -1266,7 +891,7 @@ test_crypto_kdf_TAP(void *arg)
"3f45dfda1a80bdc8b80de01b23e3e0ffae099b3e4ccf28dc28");
EXPAND("AN ALARMING ITEM TO FIND ON A MONTHLY AUTO-DEBIT NOTICE");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"a340b5d126086c3ab29c2af4179196dbf95e1c72431419d331"
"4844bf8f6afb6098db952b95581fb6c33625709d6f4400b8e7"
@@ -1302,7 +927,7 @@ test_crypto_hkdf_sha256(void *arg)
/* Test vectors generated with ntor_ref.py */
memset(key_material, 0, sizeof(key_material));
EXPAND("");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"d3490ed48b12a48f9547861583573fe3f19aafe3f81dc7fc75"
"eeed96d741b3290f941576c1f9f0b2d463d1ec7ab2c6bf71cd"
@@ -1310,7 +935,7 @@ test_crypto_hkdf_sha256(void *arg)
"dcf6abe0d20c77cf363e8ffe358927817a3d3e73712cee28d8");
EXPAND("Tor");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"5521492a85139a8d9107a2d5c0d9c91610d0f95989975ebee6"
"c02a4f8d622a6cfdf9b7c7edd3832e2760ded1eac309b76f8d"
@@ -1318,7 +943,7 @@ test_crypto_hkdf_sha256(void *arg)
"961be9fdb9f93197ea8e5977180801926d3321fa21513e59ac");
EXPAND("AN ALARMING ITEM TO FIND ON YOUR CREDIT-RATING STATEMENT");
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
test_memeq_hex(key_material,
"a2aa9b50da7e481d30463adb8f233ff06e9571a0ca6ab6df0f"
"b206fa34e5bc78d063fc291501beec53b36e5a0e434561200c"
@@ -1381,7 +1006,7 @@ test_crypto_curve25519_impl(void *arg)
e2k[31] |= (byte & 0x80);
}
curve25519_impl(e1e2k,e1,e2k);
- tt_mem_op(e1e2k,==, e2e1k, 32);
+ tt_mem_op(e1e2k,OP_EQ, e2e1k, 32);
if (loop == loop_max-1) {
break;
}
@@ -1417,7 +1042,7 @@ test_crypto_curve25519_wrappers(void *arg)
tt_assert(curve25519_public_key_is_ok(&pubkey2));
curve25519_handshake(output1, &seckey1, &pubkey2);
curve25519_handshake(output2, &seckey2, &pubkey1);
- tt_mem_op(output1,==, output2, sizeof(output1));
+ tt_mem_op(output1,OP_EQ, output2, sizeof(output1));
done:
;
@@ -1434,26 +1059,26 @@ test_crypto_curve25519_encode(void *arg)
curve25519_secret_key_generate(&seckey, 0);
curve25519_public_key_generate(&key1, &seckey);
- tt_int_op(0, ==, curve25519_public_to_base64(buf, &key1));
- tt_int_op(CURVE25519_BASE64_PADDED_LEN, ==, strlen(buf));
+ tt_int_op(0, OP_EQ, curve25519_public_to_base64(buf, &key1));
+ tt_int_op(CURVE25519_BASE64_PADDED_LEN, OP_EQ, strlen(buf));
- tt_int_op(0, ==, curve25519_public_from_base64(&key2, buf));
- tt_mem_op(key1.public_key,==, key2.public_key, CURVE25519_PUBKEY_LEN);
+ tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key2, buf));
+ tt_mem_op(key1.public_key,OP_EQ, key2.public_key, CURVE25519_PUBKEY_LEN);
buf[CURVE25519_BASE64_PADDED_LEN - 1] = '\0';
- tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, ==, strlen(buf));
- tt_int_op(0, ==, curve25519_public_from_base64(&key3, buf));
- tt_mem_op(key1.public_key,==, key3.public_key, CURVE25519_PUBKEY_LEN);
+ tt_int_op(CURVE25519_BASE64_PADDED_LEN-1, OP_EQ, strlen(buf));
+ tt_int_op(0, OP_EQ, curve25519_public_from_base64(&key3, buf));
+ tt_mem_op(key1.public_key,OP_EQ, key3.public_key, CURVE25519_PUBKEY_LEN);
/* Now try bogus parses. */
strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$=", sizeof(buf));
- tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf));
+ tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf));
strlcpy(buf, "$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$", sizeof(buf));
- tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf));
+ tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf));
strlcpy(buf, "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", sizeof(buf));
- tt_int_op(-1, ==, curve25519_public_from_base64(&key3, buf));
+ tt_int_op(-1, OP_EQ, curve25519_public_from_base64(&key3, buf));
done:
;
@@ -1472,45 +1097,49 @@ test_crypto_curve25519_persist(void *arg)
(void)arg;
- tt_int_op(0,==,curve25519_keypair_generate(&keypair, 0));
+ tt_int_op(0,OP_EQ,curve25519_keypair_generate(&keypair, 0));
- tt_int_op(0,==,curve25519_keypair_write_to_file(&keypair, fname, "testing"));
- tt_int_op(0,==,curve25519_keypair_read_from_file(&keypair2, &tag, fname));
- tt_str_op(tag,==,"testing");
+ tt_int_op(0,OP_EQ,
+ curve25519_keypair_write_to_file(&keypair, fname, "testing"));
+ tt_int_op(0,OP_EQ,curve25519_keypair_read_from_file(&keypair2, &tag, fname));
+ tt_str_op(tag,OP_EQ,"testing");
tor_free(tag);
- tt_mem_op(keypair.pubkey.public_key,==,
+ tt_mem_op(keypair.pubkey.public_key,OP_EQ,
keypair2.pubkey.public_key,
CURVE25519_PUBKEY_LEN);
- tt_mem_op(keypair.seckey.secret_key,==,
+ tt_mem_op(keypair.seckey.secret_key,OP_EQ,
keypair2.seckey.secret_key,
CURVE25519_SECKEY_LEN);
content = read_file_to_str(fname, RFTS_BIN, &st);
tt_assert(content);
taglen = strlen("== c25519v1: testing ==");
- tt_u64_op((uint64_t)st.st_size, ==,
+ tt_u64_op((uint64_t)st.st_size, OP_EQ,
32+CURVE25519_PUBKEY_LEN+CURVE25519_SECKEY_LEN);
tt_assert(fast_memeq(content, "== c25519v1: testing ==", taglen));
tt_assert(tor_mem_is_zero(content+taglen, 32-taglen));
cp = content + 32;
- tt_mem_op(keypair.seckey.secret_key,==,
+ tt_mem_op(keypair.seckey.secret_key,OP_EQ,
cp,
CURVE25519_SECKEY_LEN);
cp += CURVE25519_SECKEY_LEN;
- tt_mem_op(keypair.pubkey.public_key,==,
+ tt_mem_op(keypair.pubkey.public_key,OP_EQ,
cp,
CURVE25519_SECKEY_LEN);
tor_free(fname);
fname = tor_strdup(get_fname("bogus_keypair"));
- tt_int_op(-1, ==, curve25519_keypair_read_from_file(&keypair2, &tag, fname));
+ tt_int_op(-1, OP_EQ,
+ curve25519_keypair_read_from_file(&keypair2, &tag, fname));
tor_free(tag);
content[69] ^= 0xff;
- tt_int_op(0, ==, write_bytes_to_file(fname, content, (size_t)st.st_size, 1));
- tt_int_op(-1, ==, curve25519_keypair_read_from_file(&keypair2, &tag, fname));
+ tt_int_op(0, OP_EQ,
+ write_bytes_to_file(fname, content, (size_t)st.st_size, 1));
+ tt_int_op(-1, OP_EQ,
+ curve25519_keypair_read_from_file(&keypair2, &tag, fname));
done:
tor_free(fname);
@@ -1536,41 +1165,41 @@ test_crypto_ed25519_simple(void *arg)
(void)arg;
- tt_int_op(0, ==, ed25519_secret_key_generate(&sec1, 0));
- tt_int_op(0, ==, ed25519_secret_key_generate(&sec2, 1));
+ tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec1, 0));
+ tt_int_op(0, OP_EQ, ed25519_secret_key_generate(&sec2, 1));
- tt_int_op(0, ==, ed25519_public_key_generate(&pub1, &sec1));
- tt_int_op(0, ==, ed25519_public_key_generate(&pub2, &sec1));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub1, &sec1));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec1));
- tt_mem_op(pub1.pubkey, ==, pub2.pubkey, sizeof(pub1.pubkey));
+ tt_mem_op(pub1.pubkey, OP_EQ, pub2.pubkey, sizeof(pub1.pubkey));
memcpy(&kp1.pubkey, &pub1, sizeof(pub1));
memcpy(&kp1.seckey, &sec1, sizeof(sec1));
- tt_int_op(0, ==, ed25519_sign(&sig1, msg, msg_len, &kp1));
- tt_int_op(0, ==, ed25519_sign(&sig2, msg, msg_len, &kp1));
+ tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp1));
+ tt_int_op(0, OP_EQ, ed25519_sign(&sig2, msg, msg_len, &kp1));
/* Ed25519 signatures are deterministic */
- tt_mem_op(sig1.sig, ==, sig2.sig, sizeof(sig1.sig));
+ tt_mem_op(sig1.sig, OP_EQ, sig2.sig, sizeof(sig1.sig));
/* Basic signature is valid. */
- tt_int_op(0, ==, ed25519_checksig(&sig1, msg, msg_len, &pub1));
+ tt_int_op(0, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1));
/* Altered signature doesn't work. */
sig1.sig[0] ^= 3;
- tt_int_op(-1, ==, ed25519_checksig(&sig1, msg, msg_len, &pub1));
+ tt_int_op(-1, OP_EQ, ed25519_checksig(&sig1, msg, msg_len, &pub1));
/* Wrong public key doesn't work. */
- tt_int_op(0, ==, ed25519_public_key_generate(&pub2, &sec2));
- tt_int_op(-1, ==, ed25519_checksig(&sig2, msg, msg_len, &pub2));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pub2, &sec2));
+ tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub2));
/* Wrong message doesn't work. */
- tt_int_op(0, ==, ed25519_checksig(&sig2, msg, msg_len, &pub1));
- tt_int_op(-1, ==, ed25519_checksig(&sig2, msg, msg_len-1, &pub1));
- tt_int_op(-1, ==, ed25519_checksig(&sig2, msg2, msg2_len, &pub1));
+ tt_int_op(0, OP_EQ, ed25519_checksig(&sig2, msg, msg_len, &pub1));
+ tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg, msg_len-1, &pub1));
+ tt_int_op(-1, OP_EQ, ed25519_checksig(&sig2, msg2, msg2_len, &pub1));
/* Batch signature checking works with some bad. */
- tt_int_op(0, ==, ed25519_keypair_generate(&kp2, 0));
- tt_int_op(0, ==, ed25519_sign(&sig1, msg, msg_len, &kp2));
+ tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp2, 0));
+ tt_int_op(0, OP_EQ, ed25519_sign(&sig1, msg, msg_len, &kp2));
{
ed25519_checkable_t ch[] = {
{ &pub1, sig2, msg, msg_len }, /*ok*/
@@ -1579,12 +1208,12 @@ test_crypto_ed25519_simple(void *arg)
{ &kp2.pubkey, sig1, msg, msg_len }, /*ok*/
};
int okay[4];
- tt_int_op(-2, ==, ed25519_checksig_batch(okay, ch, 4));
- tt_int_op(okay[0], ==, 1);
- tt_int_op(okay[1], ==, 0);
- tt_int_op(okay[2], ==, 0);
- tt_int_op(okay[3], ==, 1);
- tt_int_op(-2, ==, ed25519_checksig_batch(NULL, ch, 4));
+ tt_int_op(-2, OP_EQ, ed25519_checksig_batch(okay, ch, 4));
+ tt_int_op(okay[0], OP_EQ, 1);
+ tt_int_op(okay[1], OP_EQ, 0);
+ tt_int_op(okay[2], OP_EQ, 0);
+ tt_int_op(okay[3], OP_EQ, 1);
+ tt_int_op(-2, OP_EQ, ed25519_checksig_batch(NULL, ch, 4));
}
/* Batch signature checking works with all good. */
@@ -1594,10 +1223,10 @@ test_crypto_ed25519_simple(void *arg)
{ &kp2.pubkey, sig1, msg, msg_len }, /*ok*/
};
int okay[2];
- tt_int_op(0, ==, ed25519_checksig_batch(okay, ch, 2));
- tt_int_op(okay[0], ==, 1);
- tt_int_op(okay[1], ==, 1);
- tt_int_op(0, ==, ed25519_checksig_batch(NULL, ch, 2));
+ tt_int_op(0, OP_EQ, ed25519_checksig_batch(okay, ch, 2));
+ tt_int_op(okay[0], OP_EQ, 1);
+ tt_int_op(okay[1], OP_EQ, 1);
+ tt_int_op(0, OP_EQ, ed25519_checksig_batch(NULL, ch, 2));
}
done:
@@ -1680,14 +1309,14 @@ test_crypto_ed25519_test_vectors(void *arg)
base16_decode((char*)sk_seed, sizeof(sk_seed),
items[i].sk, 64);
ed25519_secret_key_from_seed(&kp.seckey, sk_seed);
- tt_int_op(0, ==, ed25519_public_key_generate(&kp.pubkey, &kp.seckey));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&kp.pubkey, &kp.seckey));
test_memeq_hex(kp.pubkey.pubkey, items[i].pk);
msg_len = strlen(items[i].msg) / 2;
msg = tor_malloc(msg_len);
base16_decode((char*)msg, msg_len, items[i].msg, strlen(items[i].msg));
- tt_int_op(0, ==, ed25519_sign(&sig, msg, msg_len, &kp));
+ tt_int_op(0, OP_EQ, ed25519_sign(&sig, msg, msg_len, &kp));
test_memeq_hex(sig.sig, items[i].sig);
tor_free(msg);
@@ -1707,14 +1336,14 @@ test_crypto_ed25519_encode(void *arg)
(void) arg;
/* Test roundtrip. */
- tt_int_op(0, ==, ed25519_keypair_generate(&kp, 0));
- tt_int_op(0, ==, ed25519_public_to_base64(buf, &kp.pubkey));
- tt_int_op(ED25519_BASE64_LEN, ==, strlen(buf));
- tt_int_op(0, ==, ed25519_public_from_base64(&pk, buf));
- tt_mem_op(kp.pubkey.pubkey, ==, pk.pubkey, ED25519_PUBKEY_LEN);
+ tt_int_op(0, OP_EQ, ed25519_keypair_generate(&kp, 0));
+ tt_int_op(0, OP_EQ, ed25519_public_to_base64(buf, &kp.pubkey));
+ tt_int_op(ED25519_BASE64_LEN, OP_EQ, strlen(buf));
+ tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk, buf));
+ tt_mem_op(kp.pubkey.pubkey, OP_EQ, pk.pubkey, ED25519_PUBKEY_LEN);
/* Test known value. */
- tt_int_op(0, ==, ed25519_public_from_base64(&pk,
+ tt_int_op(0, OP_EQ, ed25519_public_from_base64(&pk,
"lVIuIctLjbGZGU5wKMNXxXlSE3cW4kaqkqm04u6pxvM"));
test_memeq_hex(pk.pubkey,
"95522e21cb4b8db199194e7028c357c57952137716e246aa92a9b4e2eea9c6f3");
@@ -1740,21 +1369,21 @@ test_crypto_ed25519_convert(void *arg)
int bit=0;
ed25519_signature_t sig;
- tt_int_op(0,==,curve25519_keypair_generate(&curve25519_keypair, i&1));
- tt_int_op(0,==,ed25519_keypair_from_curve25519_keypair(
+ tt_int_op(0,OP_EQ,curve25519_keypair_generate(&curve25519_keypair, i&1));
+ tt_int_op(0,OP_EQ,ed25519_keypair_from_curve25519_keypair(
&ed25519_keypair, &bit, &curve25519_keypair));
- tt_int_op(0,==,ed25519_public_key_from_curve25519_public_key(
+ tt_int_op(0,OP_EQ,ed25519_public_key_from_curve25519_public_key(
&ed25519_pubkey, &curve25519_keypair.pubkey, bit));
- tt_mem_op(ed25519_pubkey.pubkey, ==, ed25519_keypair.pubkey.pubkey, 32);
+ tt_mem_op(ed25519_pubkey.pubkey, OP_EQ, ed25519_keypair.pubkey.pubkey, 32);
- tt_int_op(0,==,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair));
- tt_int_op(0,==,ed25519_checksig(&sig, msg, sizeof(msg),
+ tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg), &ed25519_keypair));
+ tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg),
&ed25519_pubkey));
- tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg)-1,
+ tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1,
&ed25519_pubkey));
sig.sig[0] ^= 15;
- tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg),
+ tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg),
&ed25519_pubkey));
}
@@ -1782,26 +1411,26 @@ test_crypto_ed25519_blinding(void *arg)
crypto_rand((char*) blinding, sizeof(blinding));
- tt_int_op(0,==,ed25519_keypair_generate(&ed25519_keypair, 0));
- tt_int_op(0,==,ed25519_keypair_blind(&ed25519_keypair_blinded,
+ tt_int_op(0,OP_EQ,ed25519_keypair_generate(&ed25519_keypair, 0));
+ tt_int_op(0,OP_EQ,ed25519_keypair_blind(&ed25519_keypair_blinded,
&ed25519_keypair, blinding));
- tt_int_op(0,==,ed25519_public_blind(&ed25519_pubkey_blinded,
+ tt_int_op(0,OP_EQ,ed25519_public_blind(&ed25519_pubkey_blinded,
&ed25519_keypair.pubkey, blinding));
- tt_mem_op(ed25519_pubkey_blinded.pubkey, ==,
+ tt_mem_op(ed25519_pubkey_blinded.pubkey, OP_EQ,
ed25519_keypair_blinded.pubkey.pubkey, 32);
- tt_int_op(0,==,ed25519_sign(&sig, msg, sizeof(msg),
+ tt_int_op(0,OP_EQ,ed25519_sign(&sig, msg, sizeof(msg),
&ed25519_keypair_blinded));
- tt_int_op(0,==,ed25519_checksig(&sig, msg, sizeof(msg),
+ tt_int_op(0,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg),
&ed25519_pubkey_blinded));
- tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg)-1,
+ tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg)-1,
&ed25519_pubkey_blinded));
sig.sig[0] ^= 15;
- tt_int_op(-1,==,ed25519_checksig(&sig, msg, sizeof(msg),
+ tt_int_op(-1,OP_EQ,ed25519_checksig(&sig, msg, sizeof(msg),
&ed25519_pubkey_blinded));
}
@@ -1829,43 +1458,43 @@ test_crypto_ed25519_testvectors(void *arg)
#define DECODE(p,s) base16_decode((char*)(p),sizeof(p),(s),strlen(s))
#define EQ(a,h) test_memeq_hex((const char*)(a), (h))
- tt_int_op(0, ==, DECODE(sk, ED25519_SECRET_KEYS[i]));
- tt_int_op(0, ==, DECODE(blinding_param, ED25519_BLINDING_PARAMS[i]));
+ tt_int_op(0, OP_EQ, DECODE(sk, ED25519_SECRET_KEYS[i]));
+ tt_int_op(0, OP_EQ, DECODE(blinding_param, ED25519_BLINDING_PARAMS[i]));
- tt_int_op(0, ==, ed25519_secret_key_from_seed(&esk, sk));
+ tt_int_op(0, OP_EQ, ed25519_secret_key_from_seed(&esk, sk));
EQ(esk.seckey, ED25519_EXPANDED_SECRET_KEYS[i]);
- tt_int_op(0, ==, ed25519_public_key_generate(&pk, &esk));
+ tt_int_op(0, OP_EQ, ed25519_public_key_generate(&pk, &esk));
EQ(pk.pubkey, ED25519_PUBLIC_KEYS[i]);
memcpy(&curvekp.seckey.secret_key, esk.seckey, 32);
curve25519_public_key_generate(&curvekp.pubkey, &curvekp.seckey);
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
ed25519_keypair_from_curve25519_keypair(&keypair, &sign, &curvekp));
- tt_int_op(0, ==, ed25519_public_key_from_curve25519_public_key(
+ tt_int_op(0, OP_EQ, ed25519_public_key_from_curve25519_public_key(
&pkfromcurve, &curvekp.pubkey, sign));
- tt_mem_op(keypair.pubkey.pubkey, ==, pkfromcurve.pubkey, 32);
+ tt_mem_op(keypair.pubkey.pubkey, OP_EQ, pkfromcurve.pubkey, 32);
EQ(curvekp.pubkey.public_key, ED25519_CURVE25519_PUBLIC_KEYS[i]);
/* Self-signing */
memcpy(&keypair.seckey, &esk, sizeof(esk));
memcpy(&keypair.pubkey, &pk, sizeof(pk));
- tt_int_op(0, ==, ed25519_sign(&sig, pk.pubkey, 32, &keypair));
+ tt_int_op(0, OP_EQ, ed25519_sign(&sig, pk.pubkey, 32, &keypair));
EQ(sig.sig, ED25519_SELF_SIGNATURES[i]);
/* Blinding */
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
ed25519_keypair_blind(&blind_keypair, &keypair, blinding_param));
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
ed25519_public_blind(&blind_pk, &pk, blinding_param));
EQ(blind_keypair.seckey.seckey, ED25519_BLINDED_SECRET_KEYS[i]);
EQ(blind_pk.pubkey, ED25519_BLINDED_PUBLIC_KEYS[i]);
- tt_mem_op(blind_pk.pubkey, ==, blind_keypair.pubkey.pubkey, 32);
+ tt_mem_op(blind_pk.pubkey, OP_EQ, blind_keypair.pubkey.pubkey, 32);
#undef DECODE
#undef EQ
@@ -1962,7 +1591,7 @@ test_crypto_siphash(void *arg)
for (i = 0; i < 64; ++i) {
uint64_t r = siphash24(input, i, &K);
for (j = 0; j < 8; ++j) {
- tt_int_op( (r >> (j*8)) & 0xff, ==, VECTORS[i][j]);
+ tt_int_op( (r >> (j*8)) & 0xff, OP_EQ, VECTORS[i][j]);
}
}
@@ -1970,54 +1599,23 @@ test_crypto_siphash(void *arg)
;
}
-static void *
-pass_data_setup_fn(const struct testcase_t *testcase)
-{
- return testcase->setup_data;
-}
-static int
-pass_data_cleanup_fn(const struct testcase_t *testcase, void *ptr)
-{
- (void)ptr;
- (void)testcase;
- return 1;
-}
-static const struct testcase_setup_t pass_data = {
- pass_data_setup_fn, pass_data_cleanup_fn
-};
-
#define CRYPTO_LEGACY(name) \
{ #name, test_crypto_ ## name , 0, NULL, NULL }
struct testcase_t crypto_tests[] = {
CRYPTO_LEGACY(formats),
CRYPTO_LEGACY(rng),
- { "aes_AES", test_crypto_aes, TT_FORK, &pass_data, (void*)"aes" },
- { "aes_EVP", test_crypto_aes, TT_FORK, &pass_data, (void*)"evp" },
+ { "aes_AES", test_crypto_aes, TT_FORK, &passthrough_setup, (void*)"aes" },
+ { "aes_EVP", test_crypto_aes, TT_FORK, &passthrough_setup, (void*)"evp" },
CRYPTO_LEGACY(sha),
CRYPTO_LEGACY(pk),
{ "pk_fingerprints", test_crypto_pk_fingerprints, TT_FORK, NULL, NULL },
CRYPTO_LEGACY(digests),
CRYPTO_LEGACY(dh),
- CRYPTO_LEGACY(s2k_rfc2440),
-#ifdef HAVE_LIBSCRYPT_H
- { "s2k_scrypt", test_crypto_s2k_general, 0, &pass_data,
- (void*)"scrypt" },
- { "s2k_scrypt_low", test_crypto_s2k_general, 0, &pass_data,
- (void*)"scrypt-low" },
-#endif
- { "s2k_pbkdf2", test_crypto_s2k_general, 0, &pass_data,
- (void*)"pbkdf2" },
- { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &pass_data,
- (void*)"rfc2440" },
- { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &pass_data,
- (void*)"rfc2440-legacy" },
- { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL },
- { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL },
- { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL },
- { "pwbox", test_crypto_pwbox, 0, NULL, NULL },
- { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"aes" },
- { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &pass_data, (void*)"evp" },
+ { "aes_iv_AES", test_crypto_aes_iv, TT_FORK, &passthrough_setup,
+ (void*)"aes" },
+ { "aes_iv_EVP", test_crypto_aes_iv, TT_FORK, &passthrough_setup,
+ (void*)"evp" },
CRYPTO_LEGACY(base32_decode),
{ "kdf_TAP", test_crypto_kdf_TAP, 0, NULL, NULL },
{ "hkdf_sha256", test_crypto_hkdf_sha256, 0, NULL, NULL },
diff --git a/src/test/test_crypto_slow.c b/src/test/test_crypto_slow.c
new file mode 100644
index 0000000000..a0f6cdc116
--- /dev/null
+++ b/src/test/test_crypto_slow.c
@@ -0,0 +1,409 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#define CRYPTO_S2K_PRIVATE
+#include "or.h"
+#include "test.h"
+#include "crypto_s2k.h"
+#include "crypto_pwbox.h"
+
+/** Run unit tests for our secret-to-key passphrase hashing functionality. */
+static void
+test_crypto_s2k_rfc2440(void *arg)
+{
+ char buf[29];
+ char buf2[29];
+ char *buf3 = NULL;
+ int i;
+
+ (void)arg;
+ memset(buf, 0, sizeof(buf));
+ memset(buf2, 0, sizeof(buf2));
+ buf3 = tor_malloc(65536);
+ memset(buf3, 0, 65536);
+
+ secret_to_key_rfc2440(buf+9, 20, "", 0, buf);
+ crypto_digest(buf2+9, buf3, 1024);
+ tt_mem_op(buf,OP_EQ, buf2, 29);
+
+ memcpy(buf,"vrbacrda",8);
+ memcpy(buf2,"vrbacrda",8);
+ buf[8] = 96;
+ buf2[8] = 96;
+ secret_to_key_rfc2440(buf+9, 20, "12345678", 8, buf);
+ for (i = 0; i < 65536; i += 16) {
+ memcpy(buf3+i, "vrbacrda12345678", 16);
+ }
+ crypto_digest(buf2+9, buf3, 65536);
+ tt_mem_op(buf,OP_EQ, buf2, 29);
+
+ done:
+ tor_free(buf3);
+}
+
+static void
+run_s2k_tests(const unsigned flags, const unsigned type,
+ int speclen, const int keylen, int legacy)
+{
+ uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN], buf3[S2K_MAXLEN];
+ int r;
+ size_t sz;
+ const char pw1[] = "You can't come in here unless you say swordfish!";
+ const char pw2[] = "Now, I give you one more guess.";
+
+ r = secret_to_key_new(buf, sizeof(buf), &sz,
+ pw1, strlen(pw1), flags);
+ tt_int_op(r, OP_EQ, S2K_OKAY);
+ tt_int_op(buf[0], OP_EQ, type);
+
+ tt_int_op(sz, OP_EQ, keylen + speclen);
+
+ if (legacy) {
+ memmove(buf, buf+1, sz-1);
+ --sz;
+ --speclen;
+ }
+
+ tt_int_op(S2K_OKAY, OP_EQ,
+ secret_to_key_check(buf, sz, pw1, strlen(pw1)));
+
+ tt_int_op(S2K_BAD_SECRET, OP_EQ,
+ secret_to_key_check(buf, sz, pw2, strlen(pw2)));
+
+ /* Move key to buf2, and clear it. */
+ memset(buf3, 0, sizeof(buf3));
+ memcpy(buf2, buf+speclen, keylen);
+ memset(buf+speclen, 0, sz - speclen);
+
+ /* Derivekey should produce the same results. */
+ tt_int_op(S2K_OKAY, OP_EQ,
+ secret_to_key_derivekey(buf3, keylen, buf, speclen, pw1, strlen(pw1)));
+
+ tt_mem_op(buf2, OP_EQ, buf3, keylen);
+
+ /* Derivekey with a longer output should fill the output. */
+ memset(buf2, 0, sizeof(buf2));
+ tt_int_op(S2K_OKAY, OP_EQ,
+ secret_to_key_derivekey(buf2, sizeof(buf2), buf, speclen,
+ pw1, strlen(pw1)));
+
+ tt_mem_op(buf2, OP_NE, buf3, sizeof(buf2));
+
+ memset(buf3, 0, sizeof(buf3));
+ tt_int_op(S2K_OKAY, OP_EQ,
+ secret_to_key_derivekey(buf3, sizeof(buf3), buf, speclen,
+ pw1, strlen(pw1)));
+ tt_mem_op(buf2, OP_EQ, buf3, sizeof(buf3));
+ tt_assert(!tor_mem_is_zero((char*)buf2+keylen, sizeof(buf2)-keylen));
+
+ done:
+ ;
+}
+
+static void
+test_crypto_s2k_general(void *arg)
+{
+ const char *which = arg;
+
+ if (!strcmp(which, "scrypt")) {
+ run_s2k_tests(0, 2, 19, 32, 0);
+ } else if (!strcmp(which, "scrypt-low")) {
+ run_s2k_tests(S2K_FLAG_LOW_MEM, 2, 19, 32, 0);
+ } else if (!strcmp(which, "pbkdf2")) {
+ run_s2k_tests(S2K_FLAG_USE_PBKDF2, 1, 18, 20, 0);
+ } else if (!strcmp(which, "rfc2440")) {
+ run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 0);
+ } else if (!strcmp(which, "rfc2440-legacy")) {
+ run_s2k_tests(S2K_FLAG_NO_SCRYPT, 0, 10, 20, 1);
+ } else {
+ tt_fail();
+ }
+}
+
+static void
+test_crypto_s2k_errors(void *arg)
+{
+ uint8_t buf[S2K_MAXLEN], buf2[S2K_MAXLEN];
+ size_t sz;
+
+ (void)arg;
+
+ /* Bogus specifiers: simple */
+ tt_int_op(S2K_BAD_LEN, OP_EQ,
+ secret_to_key_derivekey(buf, sizeof(buf),
+ (const uint8_t*)"", 0, "ABC", 3));
+ tt_int_op(S2K_BAD_ALGORITHM, OP_EQ,
+ secret_to_key_derivekey(buf, sizeof(buf),
+ (const uint8_t*)"\x10", 1, "ABC", 3));
+ tt_int_op(S2K_BAD_LEN, OP_EQ,
+ secret_to_key_derivekey(buf, sizeof(buf),
+ (const uint8_t*)"\x01\x02", 2, "ABC", 3));
+
+ tt_int_op(S2K_BAD_LEN, OP_EQ,
+ secret_to_key_check((const uint8_t*)"", 0, "ABC", 3));
+ tt_int_op(S2K_BAD_ALGORITHM, OP_EQ,
+ secret_to_key_check((const uint8_t*)"\x10", 1, "ABC", 3));
+ tt_int_op(S2K_BAD_LEN, OP_EQ,
+ secret_to_key_check((const uint8_t*)"\x01\x02", 2, "ABC", 3));
+
+ /* too long gets "BAD_LEN" too */
+ memset(buf, 0, sizeof(buf));
+ buf[0] = 2;
+ tt_int_op(S2K_BAD_LEN, OP_EQ,
+ secret_to_key_derivekey(buf2, sizeof(buf2),
+ buf, sizeof(buf), "ABC", 3));
+
+ /* Truncated output */
+#ifdef HAVE_LIBSCRYPT_H
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz,
+ "ABC", 3, 0));
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 50, &sz,
+ "ABC", 3, S2K_FLAG_LOW_MEM));
+#endif
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 37, &sz,
+ "ABC", 3, S2K_FLAG_USE_PBKDF2));
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_new(buf, 29, &sz,
+ "ABC", 3, S2K_FLAG_NO_SCRYPT));
+
+#ifdef HAVE_LIBSCRYPT_H
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18, 0));
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 18,
+ S2K_FLAG_LOW_MEM));
+#endif
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 17,
+ S2K_FLAG_USE_PBKDF2));
+ tt_int_op(S2K_TRUNCATED, OP_EQ, secret_to_key_make_specifier(buf, 9,
+ S2K_FLAG_NO_SCRYPT));
+
+ /* Now try using type-specific bogus specifiers. */
+
+ /* It's a bad pbkdf2 buffer if it has an iteration count that would overflow
+ * int32_t. */
+ memset(buf, 0, sizeof(buf));
+ buf[0] = 1; /* pbkdf2 */
+ buf[17] = 100; /* 1<<100 is much bigger than INT32_MAX */
+ tt_int_op(S2K_BAD_PARAMS, OP_EQ,
+ secret_to_key_derivekey(buf2, sizeof(buf2),
+ buf, 18, "ABC", 3));
+
+#ifdef HAVE_LIBSCRYPT_H
+ /* It's a bad scrypt buffer if N would overflow uint64 */
+ memset(buf, 0, sizeof(buf));
+ buf[0] = 2; /* scrypt */
+ buf[17] = 100; /* 1<<100 is much bigger than UINT64_MAX */
+ tt_int_op(S2K_BAD_PARAMS, OP_EQ,
+ secret_to_key_derivekey(buf2, sizeof(buf2),
+ buf, 19, "ABC", 3));
+#endif
+
+ done:
+ ;
+}
+
+static void
+test_crypto_scrypt_vectors(void *arg)
+{
+ char *mem_op_hex_tmp = NULL;
+ uint8_t spec[64], out[64];
+
+ (void)arg;
+#ifndef HAVE_LIBSCRYPT_H
+ if (1)
+ tt_skip();
+#endif
+
+ /* Test vectors from
+ http://tools.ietf.org/html/draft-josefsson-scrypt-kdf-00 section 11.
+
+ Note that the names of 'r' and 'N' are switched in that section. Or
+ possibly in libscrypt.
+ */
+
+ base16_decode((char*)spec, sizeof(spec),
+ "0400", 4);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(64, OP_EQ,
+ secret_to_key_compute_key(out, 64, spec, 2, "", 0, 2));
+ test_memeq_hex(out,
+ "77d6576238657b203b19ca42c18a0497"
+ "f16b4844e3074ae8dfdffa3fede21442"
+ "fcd0069ded0948f8326a753a0fc81f17"
+ "e8d3e0fb2e0d3628cf35e20c38d18906");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "4e61436c" "0A34", 12);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(64, OP_EQ,
+ secret_to_key_compute_key(out, 64, spec, 6, "password", 8, 2));
+ test_memeq_hex(out,
+ "fdbabe1c9d3472007856e7190d01e9fe"
+ "7c6ad7cbc8237830e77376634b373162"
+ "2eaf30d92e22a3886ff109279d9830da"
+ "c727afb94a83ee6d8360cbdfa2cc0640");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "536f6469756d43686c6f72696465" "0e30", 32);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(64, OP_EQ,
+ secret_to_key_compute_key(out, 64, spec, 16,
+ "pleaseletmein", 13, 2));
+ test_memeq_hex(out,
+ "7023bdcb3afd7348461c06cd81fd38eb"
+ "fda8fbba904f8e3ea9b543f6545da1f2"
+ "d5432955613f0fcf62d49705242a9af9"
+ "e61e85dc0d651e40dfcf017b45575887");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "536f6469756d43686c6f72696465" "1430", 32);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(64, OP_EQ,
+ secret_to_key_compute_key(out, 64, spec, 16,
+ "pleaseletmein", 13, 2));
+ test_memeq_hex(out,
+ "2101cb9b6a511aaeaddbbe09cf70f881"
+ "ec568d574a2ffd4dabe5ee9820adaa47"
+ "8e56fd8f4ba5d09ffa1c6d927c40f4c3"
+ "37304049e8a952fbcbf45c6fa77a41a4");
+
+ done:
+ tor_free(mem_op_hex_tmp);
+}
+
+static void
+test_crypto_pbkdf2_vectors(void *arg)
+{
+ char *mem_op_hex_tmp = NULL;
+ uint8_t spec[64], out[64];
+ (void)arg;
+
+ /* Test vectors from RFC6070, section 2 */
+ base16_decode((char*)spec, sizeof(spec),
+ "73616c74" "00" , 10);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(20, OP_EQ,
+ secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
+ test_memeq_hex(out, "0c60c80f961f0e71f3a9b524af6012062fe037a6");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "73616c74" "01" , 10);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(20, OP_EQ,
+ secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
+ test_memeq_hex(out, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "73616c74" "0C" , 10);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(20, OP_EQ,
+ secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
+ test_memeq_hex(out, "4b007901b765489abead49d926f721d065a429c1");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "73616c74" "18" , 10);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(20, OP_EQ,
+ secret_to_key_compute_key(out, 20, spec, 5, "password", 8, 1));
+ test_memeq_hex(out, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "73616c7453414c5473616c7453414c5473616c745"
+ "3414c5473616c7453414c5473616c74" "0C" , 74);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(25, OP_EQ,
+ secret_to_key_compute_key(out, 25, spec, 37,
+ "passwordPASSWORDpassword", 24, 1));
+ test_memeq_hex(out, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038");
+
+ base16_decode((char*)spec, sizeof(spec),
+ "7361006c74" "0c" , 12);
+ memset(out, 0x00, sizeof(out));
+ tt_int_op(16, OP_EQ,
+ secret_to_key_compute_key(out, 16, spec, 6, "pass\0word", 9, 1));
+ test_memeq_hex(out, "56fa6aa75548099dcc37d7f03425e0c3");
+
+ done:
+ tor_free(mem_op_hex_tmp);
+}
+
+static void
+test_crypto_pwbox(void *arg)
+{
+ uint8_t *boxed=NULL, *decoded=NULL;
+ size_t len, dlen;
+ unsigned i;
+ const char msg[] = "This bunny reminds you that you still have a "
+ "salamander in your sylladex. She is holding the bunny Dave got you. "
+ "It’s sort of uncanny how similar they are, aside from the knitted "
+ "enhancements. Seriously, what are the odds?? So weird.";
+ const char pw[] = "I'm a night owl and a wise bird too";
+
+ const unsigned flags[] = { 0,
+ S2K_FLAG_NO_SCRYPT,
+ S2K_FLAG_LOW_MEM,
+ S2K_FLAG_NO_SCRYPT|S2K_FLAG_LOW_MEM,
+ S2K_FLAG_USE_PBKDF2 };
+ (void)arg;
+
+ for (i = 0; i < ARRAY_LENGTH(flags); ++i) {
+ tt_int_op(0, OP_EQ, crypto_pwbox(&boxed, &len,
+ (const uint8_t*)msg, strlen(msg),
+ pw, strlen(pw), flags[i]));
+ tt_assert(boxed);
+ tt_assert(len > 128+32);
+
+ tt_int_op(0, OP_EQ, crypto_unpwbox(&decoded, &dlen, boxed, len,
+ pw, strlen(pw)));
+
+ tt_assert(decoded);
+ tt_uint_op(dlen, OP_EQ, strlen(msg));
+ tt_mem_op(decoded, OP_EQ, msg, dlen);
+
+ tor_free(decoded);
+
+ tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen,
+ boxed, len,
+ pw, strlen(pw)-1));
+ boxed[len-1] ^= 1;
+ tt_int_op(UNPWBOX_BAD_SECRET, OP_EQ, crypto_unpwbox(&decoded, &dlen,
+ boxed, len,
+ pw, strlen(pw)));
+ boxed[0] = 255;
+ tt_int_op(UNPWBOX_CORRUPTED, OP_EQ, crypto_unpwbox(&decoded, &dlen,
+ boxed, len,
+ pw, strlen(pw)));
+
+ tor_free(boxed);
+ }
+
+ done:
+ tor_free(boxed);
+ tor_free(decoded);
+}
+
+#define CRYPTO_LEGACY(name) \
+ { #name, test_crypto_ ## name , 0, NULL, NULL }
+
+struct testcase_t slow_crypto_tests[] = {
+ CRYPTO_LEGACY(s2k_rfc2440),
+#ifdef HAVE_LIBSCRYPT_H
+ { "s2k_scrypt", test_crypto_s2k_general, 0, &passthrough_setup,
+ (void*)"scrypt" },
+ { "s2k_scrypt_low", test_crypto_s2k_general, 0, &passthrough_setup,
+ (void*)"scrypt-low" },
+#endif
+ { "s2k_pbkdf2", test_crypto_s2k_general, 0, &passthrough_setup,
+ (void*)"pbkdf2" },
+ { "s2k_rfc2440_general", test_crypto_s2k_general, 0, &passthrough_setup,
+ (void*)"rfc2440" },
+ { "s2k_rfc2440_legacy", test_crypto_s2k_general, 0, &passthrough_setup,
+ (void*)"rfc2440-legacy" },
+ { "s2k_errors", test_crypto_s2k_errors, 0, NULL, NULL },
+ { "scrypt_vectors", test_crypto_scrypt_vectors, 0, NULL, NULL },
+ { "pbkdf2_vectors", test_crypto_pbkdf2_vectors, 0, NULL, NULL },
+ { "pwbox", test_crypto_pwbox, 0, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_data.c b/src/test/test_data.c
index 0e6f79f33c..6afba65757 100644
--- a/src/test/test_data.c
+++ b/src/test/test_data.c
@@ -1,6 +1,6 @@
/* Copyright 2001-2004 Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Our unit test expect that the AUTHORITY_CERT_* public keys will sort
diff --git a/src/test/test_dir.c b/src/test/test_dir.c
index c7e22d8cec..991e613cb6 100644
--- a/src/test/test_dir.c
+++ b/src/test/test_dir.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -180,7 +180,7 @@ test_dir_formats(void *arg)
buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same
* twice */
- tt_str_op(buf,==, buf2);
+ tt_str_op(buf,OP_EQ, buf2);
tor_free(buf);
buf = router_dump_router_to_string(r1, pk2);
@@ -188,12 +188,12 @@ test_dir_formats(void *arg)
cp = buf;
rp1 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL);
tt_assert(rp1);
- tt_int_op(rp1->addr,==, r1->addr);
- tt_int_op(rp1->or_port,==, r1->or_port);
+ tt_int_op(rp1->addr,OP_EQ, r1->addr);
+ tt_int_op(rp1->or_port,OP_EQ, r1->or_port);
//test_eq(rp1->dir_port, r1->dir_port);
- tt_int_op(rp1->bandwidthrate,==, r1->bandwidthrate);
- tt_int_op(rp1->bandwidthburst,==, r1->bandwidthburst);
- tt_int_op(rp1->bandwidthcapacity,==, r1->bandwidthcapacity);
+ tt_int_op(rp1->bandwidthrate,OP_EQ, r1->bandwidthrate);
+ tt_int_op(rp1->bandwidthburst,OP_EQ, r1->bandwidthburst);
+ tt_int_op(rp1->bandwidthcapacity,OP_EQ, r1->bandwidthcapacity);
tt_assert(crypto_pk_cmp_keys(rp1->onion_pkey, pk1) == 0);
tt_assert(crypto_pk_cmp_keys(rp1->identity_pkey, pk2) == 0);
//tt_assert(rp1->exit_policy == NULL);
@@ -224,40 +224,40 @@ test_dir_formats(void *arg)
buf = router_dump_router_to_string(r2, pk1);
buf[strlen(buf2)] = '\0'; /* Don't compare the sig; it's never the same
* twice */
- tt_str_op(buf,==, buf2);
+ tt_str_op(buf,OP_EQ, buf2);
tor_free(buf);
buf = router_dump_router_to_string(r2, pk1);
cp = buf;
rp2 = router_parse_entry_from_string((const char*)cp,NULL,1,0,NULL,NULL);
tt_assert(rp2);
- tt_int_op(rp2->addr,==, r2->addr);
- tt_int_op(rp2->or_port,==, r2->or_port);
- tt_int_op(rp2->dir_port,==, r2->dir_port);
- tt_int_op(rp2->bandwidthrate,==, r2->bandwidthrate);
- tt_int_op(rp2->bandwidthburst,==, r2->bandwidthburst);
- tt_int_op(rp2->bandwidthcapacity,==, r2->bandwidthcapacity);
- tt_mem_op(rp2->onion_curve25519_pkey->public_key,==,
+ tt_int_op(rp2->addr,OP_EQ, r2->addr);
+ tt_int_op(rp2->or_port,OP_EQ, r2->or_port);
+ tt_int_op(rp2->dir_port,OP_EQ, r2->dir_port);
+ tt_int_op(rp2->bandwidthrate,OP_EQ, r2->bandwidthrate);
+ tt_int_op(rp2->bandwidthburst,OP_EQ, r2->bandwidthburst);
+ tt_int_op(rp2->bandwidthcapacity,OP_EQ, r2->bandwidthcapacity);
+ tt_mem_op(rp2->onion_curve25519_pkey->public_key,OP_EQ,
r2->onion_curve25519_pkey->public_key,
CURVE25519_PUBKEY_LEN);
tt_assert(crypto_pk_cmp_keys(rp2->onion_pkey, pk2) == 0);
tt_assert(crypto_pk_cmp_keys(rp2->identity_pkey, pk1) == 0);
- tt_int_op(smartlist_len(rp2->exit_policy),==, 2);
+ tt_int_op(smartlist_len(rp2->exit_policy),OP_EQ, 2);
p = smartlist_get(rp2->exit_policy, 0);
- tt_int_op(p->policy_type,==, ADDR_POLICY_ACCEPT);
+ tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_ACCEPT);
tt_assert(tor_addr_is_null(&p->addr));
- tt_int_op(p->maskbits,==, 0);
- tt_int_op(p->prt_min,==, 80);
- tt_int_op(p->prt_max,==, 80);
+ tt_int_op(p->maskbits,OP_EQ, 0);
+ tt_int_op(p->prt_min,OP_EQ, 80);
+ tt_int_op(p->prt_max,OP_EQ, 80);
p = smartlist_get(rp2->exit_policy, 1);
- tt_int_op(p->policy_type,==, ADDR_POLICY_REJECT);
+ tt_int_op(p->policy_type,OP_EQ, ADDR_POLICY_REJECT);
tt_assert(tor_addr_eq(&p->addr, &ex2->addr));
- tt_int_op(p->maskbits,==, 8);
- tt_int_op(p->prt_min,==, 24);
- tt_int_op(p->prt_max,==, 24);
+ tt_int_op(p->maskbits,OP_EQ, 8);
+ tt_int_op(p->prt_min,OP_EQ, 24);
+ tt_int_op(p->prt_max,OP_EQ, 24);
#if 0
/* Okay, now for the directories. */
@@ -312,7 +312,7 @@ test_dir_routerparse_bad(void *arg)
again = 999; \
ri = router_parse_entry_from_string((s), NULL, 0, 0, NULL, &again); \
tt_assert(ri == NULL); \
- tt_int_op(again, ==, (againval)); \
+ tt_int_op(again, OP_EQ, (againval)); \
} while (0)
CHECK_OK(EX_RI_MINIMAL);
@@ -388,6 +388,12 @@ test_dir_routerparse_bad(void *arg)
#include "example_extrainfo.inc"
static void
+routerinfo_free_wrapper_(void *arg)
+{
+ routerinfo_free(arg);
+}
+
+static void
test_dir_extrainfo_parsing(void *arg)
{
(void) arg;
@@ -404,7 +410,7 @@ test_dir_extrainfo_parsing(void *arg)
again = 999; \
ei = extrainfo_parse_entry_from_string((s), NULL, 0, map, &again); \
tt_assert(ei == NULL); \
- tt_int_op(again, ==, (againval)); \
+ tt_int_op(again, OP_EQ, (againval)); \
} while (0)
#define ADD(name) \
do { \
@@ -412,7 +418,7 @@ test_dir_extrainfo_parsing(void *arg)
crypto_pk_t *pk = ri->identity_pkey = crypto_pk_new(); \
tt_assert(! crypto_pk_read_public_key_from_string(pk, \
name##_KEY, strlen(name##_KEY))); \
- tt_int_op(0,==,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \
+ tt_int_op(0,OP_EQ,base16_decode(d, 20, name##_FP, strlen(name##_FP))); \
digestmap_set((digestmap_t*)map, d, ri); \
ri = NULL; \
} while (0)
@@ -455,9 +461,9 @@ test_dir_extrainfo_parsing(void *arg)
#undef CHECK_FAIL
done:
+ extrainfo_free(ei);
routerinfo_free(ri);
- /* XXXX elements should get freed too */
- digestmap_free((digestmap_t*)map, NULL);
+ digestmap_free((digestmap_t*)map, routerinfo_free_wrapper_);
}
static void
@@ -490,20 +496,20 @@ test_dir_parse_router_list(void *arg)
/* First, parse the routers. */
cp = list;
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE,
0, 0, NULL, invalid));
- tt_int_op(2, ==, smartlist_len(dest));
- tt_ptr_op(cp, ==, list + strlen(list));
+ tt_int_op(2, OP_EQ, smartlist_len(dest));
+ tt_ptr_op(cp, OP_EQ, list + strlen(list));
routerinfo_t *r = smartlist_get(dest, 0);
- tt_mem_op(r->cache_info.signed_descriptor_body, ==,
+ tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ,
EX_RI_MINIMAL, strlen(EX_RI_MINIMAL));
r = smartlist_get(dest, 1);
- tt_mem_op(r->cache_info.signed_descriptor_body, ==,
+ tt_mem_op(r->cache_info.signed_descriptor_body, OP_EQ,
EX_RI_MAXIMAL, strlen(EX_RI_MAXIMAL));
- tt_int_op(2, ==, smartlist_len(invalid));
+ tt_int_op(2, OP_EQ, smartlist_len(invalid));
test_memeq_hex(smartlist_get(invalid, 0),
"ab9eeaa95e7d45740185b4e519c76ead756277a9");
test_memeq_hex(smartlist_get(invalid, 1),
@@ -523,18 +529,18 @@ test_dir_parse_router_list(void *arg)
ADD(EX_EI_BAD_NICKNAME);
ADD(EX_EI_BAD_PUBLISHED);
cp = list;
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
router_parse_list_from_string(&cp, NULL, dest, SAVED_NOWHERE,
1, 0, NULL, invalid));
- tt_int_op(2, ==, smartlist_len(dest));
+ tt_int_op(2, OP_EQ, smartlist_len(dest));
extrainfo_t *e = smartlist_get(dest, 0);
- tt_mem_op(e->cache_info.signed_descriptor_body, ==,
+ tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ,
EX_EI_MAXIMAL, strlen(EX_EI_MAXIMAL));
e = smartlist_get(dest, 1);
- tt_mem_op(e->cache_info.signed_descriptor_body, ==,
+ tt_mem_op(e->cache_info.signed_descriptor_body, OP_EQ,
EX_EI_MINIMAL, strlen(EX_EI_MINIMAL));
- tt_int_op(2, ==, smartlist_len(invalid));
+ tt_int_op(2, OP_EQ, smartlist_len(invalid));
test_memeq_hex(smartlist_get(invalid, 0),
"d5df4aa62ee9ffc9543d41150c9864908e0390af");
test_memeq_hex(smartlist_get(invalid, 1),
@@ -552,9 +558,8 @@ test_dir_parse_router_list(void *arg)
SMARTLIST_FOREACH(chunks, char *, cp, tor_free(cp));
smartlist_free(chunks);
routerinfo_free(ri);
- /* XXXX this leaks: */
if (map) {
- digestmap_free((digestmap_t*)map, NULL);
+ digestmap_free((digestmap_t*)map, routerinfo_free_wrapper_);
router_get_routerlist()->identity_map =
(struct digest_ri_map_t*)digestmap_new();
}
@@ -605,10 +610,11 @@ test_dir_load_routers(void *arg)
smartlist_t *wanted = smartlist_new();
char buf[DIGEST_LEN];
char *mem_op_hex_tmp = NULL;
+ char *list = NULL;
#define ADD(str) \
do { \
- tt_int_op(0,==,router_get_router_hash(str, strlen(str), buf)); \
+ tt_int_op(0,OP_EQ,router_get_router_hash(str, strlen(str), buf)); \
smartlist_add(wanted, tor_strdup(hex_str(buf, DIGEST_LEN))); \
} while (0)
@@ -630,35 +636,35 @@ test_dir_load_routers(void *arg)
/* Not ADDing BAD_PORTS */
ADD(EX_RI_BAD_TOKENS);
- char *list = smartlist_join_strings(chunks, "", 0, NULL);
- tt_int_op(1, ==,
+ list = smartlist_join_strings(chunks, "", 0, NULL);
+ tt_int_op(1, OP_EQ,
router_load_routers_from_string(list, NULL, SAVED_IN_JOURNAL,
wanted, 1, NULL));
/* The "maximal" router was added. */
/* "minimal" was not. */
- tt_int_op(smartlist_len(router_get_routerlist()->routers),==,1);
+ tt_int_op(smartlist_len(router_get_routerlist()->routers),OP_EQ,1);
routerinfo_t *r = smartlist_get(router_get_routerlist()->routers, 0);
test_memeq_hex(r->cache_info.signed_descriptor_digest,
"581D8A368A0FA854ECDBFAB841D88B3F1B004038");
- tt_int_op(dls_minimal.n_download_failures, ==, 0);
- tt_int_op(dls_maximal.n_download_failures, ==, 0);
+ tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0);
+ tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0);
/* "Bad fingerprint" and "Bad tokens" should have gotten marked
* non-retriable. */
- tt_want_int_op(mock_router_get_dl_status_calls, ==, 2);
- tt_want_int_op(mock_router_get_dl_status_unrecognized, ==, 0);
- tt_int_op(dls_bad_fingerprint.n_download_failures, ==, 255);
- tt_int_op(dls_bad_tokens.n_download_failures, ==, 255);
+ tt_want_int_op(mock_router_get_dl_status_calls, OP_EQ, 2);
+ tt_want_int_op(mock_router_get_dl_status_unrecognized, OP_EQ, 0);
+ tt_int_op(dls_bad_fingerprint.n_download_failures, OP_EQ, 255);
+ tt_int_op(dls_bad_tokens.n_download_failures, OP_EQ, 255);
/* bad_sig2 and bad ports" are retriable -- one since only the signature
* was bad, and one because we didn't ask for it. */
- tt_int_op(dls_bad_sig2.n_download_failures, ==, 0);
- tt_int_op(dls_bad_ports.n_download_failures, ==, 0);
+ tt_int_op(dls_bad_sig2.n_download_failures, OP_EQ, 0);
+ tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0);
/* Wanted still contains "BAD_SIG2" */
- tt_int_op(smartlist_len(wanted), ==, 1);
- tt_str_op(smartlist_get(wanted, 0), ==,
+ tt_int_op(smartlist_len(wanted), OP_EQ, 1);
+ tt_str_op(smartlist_get(wanted, 0), OP_EQ,
"E0A3753CEFD54128EAB239F294954121DB23D2EF");
#undef ADD
@@ -670,6 +676,7 @@ test_dir_load_routers(void *arg)
smartlist_free(chunks);
SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp));
smartlist_free(wanted);
+ tor_free(list);
}
static int mock_get_by_ei_dd_calls = 0;
@@ -707,9 +714,10 @@ mock_get_by_ei_desc_digest(const char *d)
static smartlist_t *mock_ei_insert_list = NULL;
static was_router_added_t
-mock_ei_insert(routerlist_t *rl, extrainfo_t *ei)
+mock_ei_insert(routerlist_t *rl, extrainfo_t *ei, int warn_if_incompatible)
{
(void) rl;
+ (void) warn_if_incompatible;
smartlist_add(mock_ei_insert_list, ei);
return ROUTER_ADDED_SUCCESSFULLY;
}
@@ -722,10 +730,11 @@ test_dir_load_extrainfo(void *arg)
smartlist_t *wanted = smartlist_new();
char buf[DIGEST_LEN];
char *mem_op_hex_tmp = NULL;
+ char *list = NULL;
#define ADD(str) \
do { \
- tt_int_op(0,==,router_get_extrainfo_hash(str, strlen(str), buf)); \
+ tt_int_op(0,OP_EQ,router_get_extrainfo_hash(str, strlen(str), buf)); \
smartlist_add(wanted, tor_strdup(hex_str(buf, DIGEST_LEN))); \
} while (0)
@@ -746,13 +755,13 @@ test_dir_load_extrainfo(void *arg)
ADD(EX_EI_BAD_TOKENS);
ADD(EX_EI_BAD_SIG2);
- char *list = smartlist_join_strings(chunks, "", 0, NULL);
+ list = smartlist_join_strings(chunks, "", 0, NULL);
router_load_extrainfo_from_string(list, NULL, SAVED_IN_JOURNAL, wanted, 1);
/* The "maximal" router was added. */
/* "minimal" was also added, even though we didn't ask for it, since
* that's what we do with extrainfos. */
- tt_int_op(smartlist_len(mock_ei_insert_list),==,2);
+ tt_int_op(smartlist_len(mock_ei_insert_list),OP_EQ,2);
extrainfo_t *e = smartlist_get(mock_ei_insert_list, 0);
test_memeq_hex(e->cache_info.signed_descriptor_digest,
@@ -761,22 +770,22 @@ test_dir_load_extrainfo(void *arg)
e = smartlist_get(mock_ei_insert_list, 1);
test_memeq_hex(e->cache_info.signed_descriptor_digest,
"47803B02A0E70E9E8BDA226CB1D74DE354D67DFF");
- tt_int_op(dls_minimal.n_download_failures, ==, 0);
- tt_int_op(dls_maximal.n_download_failures, ==, 0);
+ tt_int_op(dls_minimal.n_download_failures, OP_EQ, 0);
+ tt_int_op(dls_maximal.n_download_failures, OP_EQ, 0);
/* "Bad nickname" and "Bad tokens" should have gotten marked
* non-retriable. */
- tt_want_int_op(mock_get_by_ei_dd_calls, ==, 2);
- tt_want_int_op(mock_get_by_ei_dd_unrecognized, ==, 0);
- tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, ==, 255);
- tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, ==, 255);
+ tt_want_int_op(mock_get_by_ei_dd_calls, OP_EQ, 2);
+ tt_want_int_op(mock_get_by_ei_dd_unrecognized, OP_EQ, 0);
+ tt_int_op(sd_ei_bad_nickname.ei_dl_status.n_download_failures, OP_EQ, 255);
+ tt_int_op(sd_ei_bad_tokens.ei_dl_status.n_download_failures, OP_EQ, 255);
/* bad_ports is retriable -- because we didn't ask for it. */
- tt_int_op(dls_bad_ports.n_download_failures, ==, 0);
+ tt_int_op(dls_bad_ports.n_download_failures, OP_EQ, 0);
/* Wanted still contains "BAD_SIG2" */
- tt_int_op(smartlist_len(wanted), ==, 1);
- tt_str_op(smartlist_get(wanted, 0), ==,
+ tt_int_op(smartlist_len(wanted), OP_EQ, 1);
+ tt_str_op(smartlist_get(wanted, 0), OP_EQ,
"16D387D3A58F7DB3CF46638F8D0B90C45C7D769C");
#undef ADD
@@ -788,6 +797,7 @@ test_dir_load_extrainfo(void *arg)
smartlist_free(chunks);
SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp));
smartlist_free(wanted);
+ tor_free(list);
}
static void
@@ -797,50 +807,86 @@ test_dir_versions(void *arg)
/* Try out version parsing functionality */
(void)arg;
- tt_int_op(0,==, tor_version_parse("0.3.4pre2-cvs", &ver1));
- tt_int_op(0,==, ver1.major);
- tt_int_op(3,==, ver1.minor);
- tt_int_op(4,==, ver1.micro);
- tt_int_op(VER_PRE,==, ver1.status);
- tt_int_op(2,==, ver1.patchlevel);
- tt_int_op(0,==, tor_version_parse("0.3.4rc1", &ver1));
- tt_int_op(0,==, ver1.major);
- tt_int_op(3,==, ver1.minor);
- tt_int_op(4,==, ver1.micro);
- tt_int_op(VER_RC,==, ver1.status);
- tt_int_op(1,==, ver1.patchlevel);
- tt_int_op(0,==, tor_version_parse("1.3.4", &ver1));
- tt_int_op(1,==, ver1.major);
- tt_int_op(3,==, ver1.minor);
- tt_int_op(4,==, ver1.micro);
- tt_int_op(VER_RELEASE,==, ver1.status);
- tt_int_op(0,==, ver1.patchlevel);
- tt_int_op(0,==, tor_version_parse("1.3.4.999", &ver1));
- tt_int_op(1,==, ver1.major);
- tt_int_op(3,==, ver1.minor);
- tt_int_op(4,==, ver1.micro);
- tt_int_op(VER_RELEASE,==, ver1.status);
- tt_int_op(999,==, ver1.patchlevel);
- tt_int_op(0,==, tor_version_parse("0.1.2.4-alpha", &ver1));
- tt_int_op(0,==, ver1.major);
- tt_int_op(1,==, ver1.minor);
- tt_int_op(2,==, ver1.micro);
- tt_int_op(4,==, ver1.patchlevel);
- tt_int_op(VER_RELEASE,==, ver1.status);
- tt_str_op("alpha",==, ver1.status_tag);
- tt_int_op(0,==, tor_version_parse("0.1.2.4", &ver1));
- tt_int_op(0,==, ver1.major);
- tt_int_op(1,==, ver1.minor);
- tt_int_op(2,==, ver1.micro);
- tt_int_op(4,==, ver1.patchlevel);
- tt_int_op(VER_RELEASE,==, ver1.status);
- tt_str_op("",==, ver1.status_tag);
+ tt_int_op(0,OP_EQ, tor_version_parse("0.3.4pre2-cvs", &ver1));
+ tt_int_op(0,OP_EQ, ver1.major);
+ tt_int_op(3,OP_EQ, ver1.minor);
+ tt_int_op(4,OP_EQ, ver1.micro);
+ tt_int_op(VER_PRE,OP_EQ, ver1.status);
+ tt_int_op(2,OP_EQ, ver1.patchlevel);
+ tt_int_op(0,OP_EQ, tor_version_parse("0.3.4rc1", &ver1));
+ tt_int_op(0,OP_EQ, ver1.major);
+ tt_int_op(3,OP_EQ, ver1.minor);
+ tt_int_op(4,OP_EQ, ver1.micro);
+ tt_int_op(VER_RC,OP_EQ, ver1.status);
+ tt_int_op(1,OP_EQ, ver1.patchlevel);
+ tt_int_op(0,OP_EQ, tor_version_parse("1.3.4", &ver1));
+ tt_int_op(1,OP_EQ, ver1.major);
+ tt_int_op(3,OP_EQ, ver1.minor);
+ tt_int_op(4,OP_EQ, ver1.micro);
+ tt_int_op(VER_RELEASE,OP_EQ, ver1.status);
+ tt_int_op(0,OP_EQ, ver1.patchlevel);
+ tt_int_op(0,OP_EQ, tor_version_parse("1.3.4.999", &ver1));
+ tt_int_op(1,OP_EQ, ver1.major);
+ tt_int_op(3,OP_EQ, ver1.minor);
+ tt_int_op(4,OP_EQ, ver1.micro);
+ tt_int_op(VER_RELEASE,OP_EQ, ver1.status);
+ tt_int_op(999,OP_EQ, ver1.patchlevel);
+ tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4-alpha", &ver1));
+ tt_int_op(0,OP_EQ, ver1.major);
+ tt_int_op(1,OP_EQ, ver1.minor);
+ tt_int_op(2,OP_EQ, ver1.micro);
+ tt_int_op(4,OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE,OP_EQ, ver1.status);
+ tt_str_op("alpha",OP_EQ, ver1.status_tag);
+ tt_int_op(0,OP_EQ, tor_version_parse("0.1.2.4", &ver1));
+ tt_int_op(0,OP_EQ, ver1.major);
+ tt_int_op(1,OP_EQ, ver1.minor);
+ tt_int_op(2,OP_EQ, ver1.micro);
+ tt_int_op(4,OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE,OP_EQ, ver1.status);
+ tt_str_op("",OP_EQ, ver1.status_tag);
+
+ tt_int_op(0, OP_EQ, tor_version_parse("10.1", &ver1));
+ tt_int_op(10, OP_EQ, ver1.major);
+ tt_int_op(1, OP_EQ, ver1.minor);
+ tt_int_op(0, OP_EQ, ver1.micro);
+ tt_int_op(0, OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE, OP_EQ, ver1.status);
+ tt_str_op("", OP_EQ, ver1.status_tag);
+ tt_int_op(0, OP_EQ, tor_version_parse("5.99.999", &ver1));
+ tt_int_op(5, OP_EQ, ver1.major);
+ tt_int_op(99, OP_EQ, ver1.minor);
+ tt_int_op(999, OP_EQ, ver1.micro);
+ tt_int_op(0, OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE, OP_EQ, ver1.status);
+ tt_str_op("", OP_EQ, ver1.status_tag);
+ tt_int_op(0, OP_EQ, tor_version_parse("10.1-alpha", &ver1));
+ tt_int_op(10, OP_EQ, ver1.major);
+ tt_int_op(1, OP_EQ, ver1.minor);
+ tt_int_op(0, OP_EQ, ver1.micro);
+ tt_int_op(0, OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE, OP_EQ, ver1.status);
+ tt_str_op("alpha", OP_EQ, ver1.status_tag);
+ tt_int_op(0, OP_EQ, tor_version_parse("2.1.700-alpha", &ver1));
+ tt_int_op(2, OP_EQ, ver1.major);
+ tt_int_op(1, OP_EQ, ver1.minor);
+ tt_int_op(700, OP_EQ, ver1.micro);
+ tt_int_op(0, OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE, OP_EQ, ver1.status);
+ tt_str_op("alpha", OP_EQ, ver1.status_tag);
+ tt_int_op(0, OP_EQ, tor_version_parse("1.6.8-alpha-dev", &ver1));
+ tt_int_op(1, OP_EQ, ver1.major);
+ tt_int_op(6, OP_EQ, ver1.minor);
+ tt_int_op(8, OP_EQ, ver1.micro);
+ tt_int_op(0, OP_EQ, ver1.patchlevel);
+ tt_int_op(VER_RELEASE, OP_EQ, ver1.status);
+ tt_str_op("alpha-dev", OP_EQ, ver1.status_tag);
#define tt_versionstatus_op(vs1, op, vs2) \
tt_assert_test_type(vs1,vs2,#vs1" "#op" "#vs2,version_status_t, \
(val1_ op val2_),"%d",TT_EXIT_TEST_FUNCTION)
#define test_v_i_o(val, ver, lst) \
- tt_versionstatus_op(val, ==, tor_version_is_obsolete(ver, lst))
+ tt_versionstatus_op(val, OP_EQ, tor_version_is_obsolete(ver, lst))
/* make sure tor_version_is_obsolete() works */
test_v_i_o(VS_OLD, "0.0.1", "Tor 0.0.2");
@@ -867,42 +913,43 @@ test_dir_versions(void *arg)
/* On list, not newer than any on same series. */
test_v_i_o(VS_UNRECOMMENDED,
"0.1.0.1", "Tor 0.1.0.2,Tor 0.0.9.5,Tor 0.1.1.0");
- tt_int_op(0,==, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
- tt_int_op(1,==, tor_version_as_new_as(
+ tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.0.5", "0.0.9pre1-cvs"));
+ tt_int_op(1,OP_EQ, tor_version_as_new_as(
"Tor 0.0.8 on Darwin 64-121-192-100.c3-0."
"sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh",
"0.0.8rc2"));
- tt_int_op(0,==, tor_version_as_new_as(
+ tt_int_op(0,OP_EQ, tor_version_as_new_as(
"Tor 0.0.8 on Darwin 64-121-192-100.c3-0."
"sfpo-ubr1.sfrn-sfpo.ca.cable.rcn.com Power Macintosh", "0.0.8.2"));
/* Now try svn revisions. */
- tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
+ tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
"Tor 0.2.1.0-dev (r99)"));
- tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100) on Banana Jr",
+ tt_int_op(1,OP_EQ, tor_version_as_new_as(
+ "Tor 0.2.1.0-dev (r100) on Banana Jr",
"Tor 0.2.1.0-dev (r99) on Hal 9000"));
- tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
+ tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r100)",
"Tor 0.2.1.0-dev on Colossus"));
- tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)",
+ tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99)",
"Tor 0.2.1.0-dev (r100)"));
- tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP",
+ tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev (r99) on MCP",
"Tor 0.2.1.0-dev (r100) on AM"));
- tt_int_op(0,==, tor_version_as_new_as("Tor 0.2.1.0-dev",
+ tt_int_op(0,OP_EQ, tor_version_as_new_as("Tor 0.2.1.0-dev",
"Tor 0.2.1.0-dev (r99)"));
- tt_int_op(1,==, tor_version_as_new_as("Tor 0.2.1.1",
+ tt_int_op(1,OP_EQ, tor_version_as_new_as("Tor 0.2.1.1",
"Tor 0.2.1.0-dev (r99)"));
/* Now try git revisions */
- tt_int_op(0,==, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1));
- tt_int_op(0,==, ver1.major);
- tt_int_op(5,==, ver1.minor);
- tt_int_op(6,==, ver1.micro);
- tt_int_op(7,==, ver1.patchlevel);
- tt_int_op(3,==, ver1.git_tag_len);
- tt_mem_op(ver1.git_tag,==, "\xff\x00\xff", 3);
- tt_int_op(-1,==, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1));
- tt_int_op(-1,==, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1));
- tt_int_op(0,==, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1));
+ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00ff)", &ver1));
+ tt_int_op(0,OP_EQ, ver1.major);
+ tt_int_op(5,OP_EQ, ver1.minor);
+ tt_int_op(6,OP_EQ, ver1.micro);
+ tt_int_op(7,OP_EQ, ver1.patchlevel);
+ tt_int_op(3,OP_EQ, ver1.git_tag_len);
+ tt_mem_op(ver1.git_tag,OP_EQ, "\xff\x00\xff", 3);
+ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00xx)", &ver1));
+ tt_int_op(-1,OP_EQ, tor_version_parse("0.5.6.7 (git-ff00fff)", &ver1));
+ tt_int_op(0,OP_EQ, tor_version_parse("0.5.6.7 (git ff00fff)", &ver1));
done:
;
}
@@ -924,13 +971,14 @@ test_dir_fp_pairs(void *arg)
"48657861646563696d616c2069736e277420736f-"
"676f6f6420666f7220686964696e6720796f7572.z", sl);
- tt_int_op(smartlist_len(sl),==, 2);
+ tt_int_op(smartlist_len(sl),OP_EQ, 2);
pair = smartlist_get(sl, 0);
- tt_mem_op(pair->first,==, "Hexadecimal isn't so", DIGEST_LEN);
- tt_mem_op(pair->second,==, "good for hiding your", DIGEST_LEN);
+ tt_mem_op(pair->first,OP_EQ, "Hexadecimal isn't so", DIGEST_LEN);
+ tt_mem_op(pair->second,OP_EQ, "good for hiding your", DIGEST_LEN);
pair = smartlist_get(sl, 1);
- tt_mem_op(pair->first,==, "secret data.\0\0\0\0\0\xff\xff\xff", DIGEST_LEN);
- tt_mem_op(pair->second,==, "Use AES-256 instead.", DIGEST_LEN);
+ tt_mem_op(pair->first,OP_EQ, "secret data.\0\0\0\0\0\xff\xff\xff",
+ DIGEST_LEN);
+ tt_mem_op(pair->second,OP_EQ, "Use AES-256 instead.", DIGEST_LEN);
done:
SMARTLIST_FOREACH(sl, fp_pair_t *, pair, tor_free(pair));
@@ -961,56 +1009,56 @@ test_dir_split_fps(void *testdata)
/* no flags set */
dir_split_resource_into_fingerprints("A+C+B", sl, NULL, 0);
- tt_int_op(smartlist_len(sl), ==, 3);
- tt_str_op(smartlist_get(sl, 0), ==, "A");
- tt_str_op(smartlist_get(sl, 1), ==, "C");
- tt_str_op(smartlist_get(sl, 2), ==, "B");
+ tt_int_op(smartlist_len(sl), OP_EQ, 3);
+ tt_str_op(smartlist_get(sl, 0), OP_EQ, "A");
+ tt_str_op(smartlist_get(sl, 1), OP_EQ, "C");
+ tt_str_op(smartlist_get(sl, 2), OP_EQ, "B");
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* uniq strings. */
dir_split_resource_into_fingerprints("A+C+B+A+B+B", sl, NULL, DSR_SORT_UNIQ);
- tt_int_op(smartlist_len(sl), ==, 3);
- tt_str_op(smartlist_get(sl, 0), ==, "A");
- tt_str_op(smartlist_get(sl, 1), ==, "B");
- tt_str_op(smartlist_get(sl, 2), ==, "C");
+ tt_int_op(smartlist_len(sl), OP_EQ, 3);
+ tt_str_op(smartlist_get(sl, 0), OP_EQ, "A");
+ tt_str_op(smartlist_get(sl, 1), OP_EQ, "B");
+ tt_str_op(smartlist_get(sl, 2), OP_EQ, "C");
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Decode hex. */
dir_split_resource_into_fingerprints(HEX1"+"HEX2, sl, NULL, DSR_HEX);
- tt_int_op(smartlist_len(sl), ==, 2);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2);
+ tt_int_op(smartlist_len(sl), OP_EQ, 2);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* decode hex and drop weirdness. */
dir_split_resource_into_fingerprints(HEX1"+bogus+"HEX2"+"HEX256_1,
sl, NULL, DSR_HEX);
- tt_int_op(smartlist_len(sl), ==, 2);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2);
+ tt_int_op(smartlist_len(sl), OP_EQ, 2);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Decode long hex */
dir_split_resource_into_fingerprints(HEX256_1"+"HEX256_2"+"HEX2"+"HEX256_3,
sl, NULL, DSR_HEX|DSR_DIGEST256);
- tt_int_op(smartlist_len(sl), ==, 3);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2);
- test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_3);
+ tt_int_op(smartlist_len(sl), OP_EQ, 3);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2);
+ test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_3);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Decode hex and sort. */
dir_split_resource_into_fingerprints(HEX1"+"HEX2"+"HEX3"+"HEX2,
sl, NULL, DSR_HEX|DSR_SORT_UNIQ);
- tt_int_op(smartlist_len(sl), ==, 3);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX3);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2);
- test_mem_op_hex(smartlist_get(sl, 2), ==, HEX1);
+ tt_int_op(smartlist_len(sl), OP_EQ, 3);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX3);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2);
+ test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX1);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
@@ -1019,34 +1067,34 @@ test_dir_split_fps(void *testdata)
"+"HEX256_1,
sl, NULL,
DSR_HEX|DSR_DIGEST256|DSR_SORT_UNIQ);
- tt_int_op(smartlist_len(sl), ==, 3);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_3);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2);
- test_mem_op_hex(smartlist_get(sl, 2), ==, HEX256_1);
+ tt_int_op(smartlist_len(sl), OP_EQ, 3);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_3);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2);
+ test_mem_op_hex(smartlist_get(sl, 2), OP_EQ, HEX256_1);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Decode base64 */
dir_split_resource_into_fingerprints(B64_1"-"B64_2, sl, NULL, DSR_BASE64);
- tt_int_op(smartlist_len(sl), ==, 2);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX1);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX2);
+ tt_int_op(smartlist_len(sl), OP_EQ, 2);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX1);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX2);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
/* Decode long base64 */
dir_split_resource_into_fingerprints(B64_256_1"-"B64_256_2,
sl, NULL, DSR_BASE64|DSR_DIGEST256);
- tt_int_op(smartlist_len(sl), ==, 2);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1);
- test_mem_op_hex(smartlist_get(sl, 1), ==, HEX256_2);
+ tt_int_op(smartlist_len(sl), OP_EQ, 2);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1);
+ test_mem_op_hex(smartlist_get(sl, 1), OP_EQ, HEX256_2);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
dir_split_resource_into_fingerprints(B64_256_1,
sl, NULL, DSR_BASE64|DSR_DIGEST256);
- tt_int_op(smartlist_len(sl), ==, 1);
- test_mem_op_hex(smartlist_get(sl, 0), ==, HEX256_1);
+ tt_int_op(smartlist_len(sl), OP_EQ, 1);
+ test_mem_op_hex(smartlist_get(sl, 0), OP_EQ, HEX256_1);
SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
smartlist_clear(sl);
@@ -1140,7 +1188,7 @@ test_dir_measured_bw_kb_cache(void *arg)
/* First, clear the cache and assert that it's empty */
(void)arg;
dirserv_clear_measured_bw_cache();
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0);
/*
* Set up test mbwls; none of the dirserv_cache_*() functions care about
* the node_hex field.
@@ -1153,49 +1201,49 @@ test_dir_measured_bw_kb_cache(void *arg)
mbwl[2].bw_kb = 80;
/* Try caching something */
dirserv_cache_measured_bw(&(mbwl[0]), curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1);
/* Okay, let's see if we can retrieve it */
tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, &as_of));
- tt_int_op(bw,==, 20);
- tt_int_op(as_of,==, MBWC_INIT_TIME);
+ tt_int_op(bw,OP_EQ, 20);
+ tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME);
/* Try retrieving it without some outputs */
tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL, NULL));
tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,&bw, NULL));
- tt_int_op(bw,==, 20);
+ tt_int_op(bw,OP_EQ, 20);
tt_assert(dirserv_query_measured_bw_cache_kb(mbwl[0].node_id,NULL,&as_of));
- tt_int_op(as_of,==, MBWC_INIT_TIME);
+ tt_int_op(as_of,OP_EQ, MBWC_INIT_TIME);
/* Now expire it */
curr += MAX_MEASUREMENT_AGE + 1;
dirserv_expire_measured_bw_cache(curr);
/* Check that the cache is empty */
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0);
/* Check that we can't retrieve it */
tt_assert(!dirserv_query_measured_bw_cache_kb(mbwl[0].node_id, NULL,NULL));
/* Try caching a few things now */
dirserv_cache_measured_bw(&(mbwl[0]), curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1);
curr += MAX_MEASUREMENT_AGE / 4;
dirserv_cache_measured_bw(&(mbwl[1]), curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 2);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2);
curr += MAX_MEASUREMENT_AGE / 4;
dirserv_cache_measured_bw(&(mbwl[2]), curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 3);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3);
curr += MAX_MEASUREMENT_AGE / 4 + 1;
/* Do an expire that's too soon to get any of them */
dirserv_expire_measured_bw_cache(curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 3);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 3);
/* Push the oldest one off the cliff */
curr += MAX_MEASUREMENT_AGE / 4;
dirserv_expire_measured_bw_cache(curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 2);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 2);
/* And another... */
curr += MAX_MEASUREMENT_AGE / 4;
dirserv_expire_measured_bw_cache(curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 1);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 1);
/* This should empty it out again */
curr += MAX_MEASUREMENT_AGE / 4;
dirserv_expire_measured_bw_cache(curr);
- tt_int_op(dirserv_get_measured_bw_cache_size(),==, 0);
+ tt_int_op(dirserv_get_measured_bw_cache_size(),OP_EQ, 0);
done:
return;
@@ -1228,11 +1276,11 @@ test_dir_param_voting(void *arg)
"abcd=20 c=60 cw=500 x-yz=-9 zzzzz=101", NULL, 0, 0);
smartlist_split_string(vote4.net_params,
"ab=900 abcd=200 c=1 cw=51 x-yz=100", NULL, 0, 0);
- tt_int_op(100,==, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300));
- tt_int_op(222,==, networkstatus_get_param(&vote4, "foobar", 222, 0, 300));
- tt_int_op(80,==, networkstatus_get_param(&vote4, "ab", 12, 0, 80));
- tt_int_op(-8,==, networkstatus_get_param(&vote4, "ab", -12, -100, -8));
- tt_int_op(0,==, networkstatus_get_param(&vote4, "foobar", 0, -100, 8));
+ tt_int_op(100,OP_EQ, networkstatus_get_param(&vote4, "x-yz", 50, 0, 300));
+ tt_int_op(222,OP_EQ, networkstatus_get_param(&vote4, "foobar", 222, 0, 300));
+ tt_int_op(80,OP_EQ, networkstatus_get_param(&vote4, "ab", 12, 0, 80));
+ tt_int_op(-8,OP_EQ, networkstatus_get_param(&vote4, "ab", -12, -100, -8));
+ tt_int_op(0,OP_EQ, networkstatus_get_param(&vote4, "foobar", 0, -100, 8));
smartlist_add(votes, &vote1);
@@ -1240,59 +1288,59 @@ test_dir_param_voting(void *arg)
* networks without many dirauths. */
res = dirvote_compute_params(votes, 12, 2);
- tt_str_op(res,==, "");
+ tt_str_op(res,OP_EQ, "");
tor_free(res);
res = dirvote_compute_params(votes, 12, 1);
- tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-99");
+ tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-99");
tor_free(res);
smartlist_add(votes, &vote2);
res = dirvote_compute_params(votes, 12, 2);
- tt_str_op(res,==, "ab=27 cw=5 x-yz=-99");
+ tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99");
tor_free(res);
res = dirvote_compute_params(votes, 12, 3);
- tt_str_op(res,==, "ab=27 cw=5 x-yz=-99");
+ tt_str_op(res,OP_EQ, "ab=27 cw=5 x-yz=-99");
tor_free(res);
res = dirvote_compute_params(votes, 12, 6);
- tt_str_op(res,==, "");
+ tt_str_op(res,OP_EQ, "");
tor_free(res);
smartlist_add(votes, &vote3);
res = dirvote_compute_params(votes, 12, 3);
- tt_str_op(res,==, "ab=27 abcd=20 cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "ab=27 abcd=20 cw=50 x-yz=-9");
tor_free(res);
res = dirvote_compute_params(votes, 12, 5);
- tt_str_op(res,==, "cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "cw=50 x-yz=-9");
tor_free(res);
res = dirvote_compute_params(votes, 12, 9);
- tt_str_op(res,==, "cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "cw=50 x-yz=-9");
tor_free(res);
smartlist_add(votes, &vote4);
res = dirvote_compute_params(votes, 12, 4);
- tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9");
tor_free(res);
res = dirvote_compute_params(votes, 12, 5);
- tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9");
tor_free(res);
/* Test that the special-cased "at least three dirauths voted for
* this param" logic works as expected. */
res = dirvote_compute_params(votes, 12, 6);
- tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9");
tor_free(res);
res = dirvote_compute_params(votes, 12, 10);
- tt_str_op(res,==, "ab=90 abcd=20 cw=50 x-yz=-9");
+ tt_str_op(res,OP_EQ, "ab=90 abcd=20 cw=50 x-yz=-9");
tor_free(res);
done:
@@ -1324,14 +1372,14 @@ static void
test_same_voter(networkstatus_voter_info_t *v1,
networkstatus_voter_info_t *v2)
{
- tt_str_op(v1->nickname,==, v2->nickname);
- tt_mem_op(v1->identity_digest,==, v2->identity_digest, DIGEST_LEN);
- tt_str_op(v1->address,==, v2->address);
- tt_int_op(v1->addr,==, v2->addr);
- tt_int_op(v1->dir_port,==, v2->dir_port);
- tt_int_op(v1->or_port,==, v2->or_port);
- tt_str_op(v1->contact,==, v2->contact);
- tt_mem_op(v1->vote_digest,==, v2->vote_digest, DIGEST_LEN);
+ tt_str_op(v1->nickname,OP_EQ, v2->nickname);
+ tt_mem_op(v1->identity_digest,OP_EQ, v2->identity_digest, DIGEST_LEN);
+ tt_str_op(v1->address,OP_EQ, v2->address);
+ tt_int_op(v1->addr,OP_EQ, v2->addr);
+ tt_int_op(v1->dir_port,OP_EQ, v2->dir_port);
+ tt_int_op(v1->or_port,OP_EQ, v2->or_port);
+ tt_str_op(v1->contact,OP_EQ, v2->contact);
+ tt_mem_op(v1->vote_digest,OP_EQ, v2->vote_digest, DIGEST_LEN);
done:
;
}
@@ -1541,48 +1589,48 @@ test_vrs_for_v3ns(vote_routerstatus_t *vrs, int voter, time_t now)
DIGEST_LEN) &&
(voter == 1)) {
/* Check the first routerstatus. */
- tt_str_op(vrs->version,==, "0.1.2.14");
- tt_int_op(rs->published_on,==, now-1500);
- tt_str_op(rs->nickname,==, "router2");
- tt_mem_op(rs->identity_digest,==,
+ tt_str_op(vrs->version,OP_EQ, "0.1.2.14");
+ tt_int_op(rs->published_on,OP_EQ, now-1500);
+ tt_str_op(rs->nickname,OP_EQ, "router2");
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"
"\x3\x3\x3\x3",
DIGEST_LEN);
- tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
- tt_int_op(rs->addr,==, 0x99008801);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 8000);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
+ tt_int_op(rs->addr,OP_EQ, 0x99008801);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 8000);
/* no flags except "running" (16) and "v2dir" (64) */
- tt_u64_op(vrs->flags, ==, U64_LITERAL(80));
+ tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(80));
} else if (tor_memeq(rs->identity_digest,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5",
DIGEST_LEN) &&
(voter == 1 || voter == 2)) {
- tt_mem_op(rs->identity_digest,==,
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5",
DIGEST_LEN);
if (voter == 1) {
/* Check the second routerstatus. */
- tt_str_op(vrs->version,==, "0.2.0.5");
- tt_int_op(rs->published_on,==, now-1000);
- tt_str_op(rs->nickname,==, "router1");
+ tt_str_op(vrs->version,OP_EQ, "0.2.0.5");
+ tt_int_op(rs->published_on,OP_EQ, now-1000);
+ tt_str_op(rs->nickname,OP_EQ, "router1");
}
- tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
- tt_int_op(rs->addr,==, 0x99009901);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 0);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
+ tt_int_op(rs->addr,OP_EQ, 0x99009901);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 0);
tor_addr_parse(&addr_ipv6, "[1:2:3::4]");
tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6));
- tt_int_op(rs->ipv6_orport,==, 4711);
+ tt_int_op(rs->ipv6_orport,OP_EQ, 4711);
if (voter == 1) {
/* all except "authority" (1) and "v2dir" (64) */
- tt_u64_op(vrs->flags, ==, U64_LITERAL(190));
+ tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(190));
} else {
/* 1023 - authority(1) - madeofcheese(16) - madeoftin(32) - v2dir(256) */
- tt_u64_op(vrs->flags, ==, U64_LITERAL(718));
+ tt_u64_op(vrs->flags, OP_EQ, U64_LITERAL(718));
}
} else if (tor_memeq(rs->identity_digest,
"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"
@@ -1614,7 +1662,7 @@ test_consensus_for_v3ns(networkstatus_t *con, time_t now)
tt_assert(con);
tt_assert(!con->cert);
- tt_int_op(2,==, smartlist_len(con->routerstatus_list));
+ tt_int_op(2,OP_EQ, smartlist_len(con->routerstatus_list));
/* There should be two listed routers: one with identity 3, one with
* identity 5. */
@@ -1639,10 +1687,10 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now)
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"
"\x3\x3",
DIGEST_LEN)) {
- tt_mem_op(rs->identity_digest,==,
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3",
DIGEST_LEN);
- tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
tt_assert(!rs->is_authority);
tt_assert(!rs->is_exit);
tt_assert(!rs->is_fast);
@@ -1658,18 +1706,18 @@ test_routerstatus_for_v3ns(routerstatus_t *rs, time_t now)
"\x5\x5\x5\x5",
DIGEST_LEN)) {
/* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */
- tt_mem_op(rs->identity_digest,==,
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5",
DIGEST_LEN);
- tt_str_op(rs->nickname,==, "router1");
- tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
- tt_int_op(rs->published_on,==, now-1000);
- tt_int_op(rs->addr,==, 0x99009901);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 0);
+ tt_str_op(rs->nickname,OP_EQ, "router1");
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
+ tt_int_op(rs->published_on,OP_EQ, now-1000);
+ tt_int_op(rs->addr,OP_EQ, 0x99009901);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 0);
tor_addr_parse(&addr_ipv6, "[1:2:3::4]");
tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6));
- tt_int_op(rs->ipv6_orport,==, 4711);
+ tt_int_op(rs->ipv6_orport,OP_EQ, 4711);
tt_assert(!rs->is_authority);
tt_assert(rs->is_exit);
tt_assert(rs->is_fast);
@@ -1809,29 +1857,29 @@ test_a_networkstatus(
tt_assert(v1);
/* Make sure the parsed thing was right. */
- tt_int_op(v1->type,==, NS_TYPE_VOTE);
- tt_int_op(v1->published,==, vote->published);
- tt_int_op(v1->valid_after,==, vote->valid_after);
- tt_int_op(v1->fresh_until,==, vote->fresh_until);
- tt_int_op(v1->valid_until,==, vote->valid_until);
- tt_int_op(v1->vote_seconds,==, vote->vote_seconds);
- tt_int_op(v1->dist_seconds,==, vote->dist_seconds);
- tt_str_op(v1->client_versions,==, vote->client_versions);
- tt_str_op(v1->server_versions,==, vote->server_versions);
+ tt_int_op(v1->type,OP_EQ, NS_TYPE_VOTE);
+ tt_int_op(v1->published,OP_EQ, vote->published);
+ tt_int_op(v1->valid_after,OP_EQ, vote->valid_after);
+ tt_int_op(v1->fresh_until,OP_EQ, vote->fresh_until);
+ tt_int_op(v1->valid_until,OP_EQ, vote->valid_until);
+ tt_int_op(v1->vote_seconds,OP_EQ, vote->vote_seconds);
+ tt_int_op(v1->dist_seconds,OP_EQ, vote->dist_seconds);
+ tt_str_op(v1->client_versions,OP_EQ, vote->client_versions);
+ tt_str_op(v1->server_versions,OP_EQ, vote->server_versions);
tt_assert(v1->voters && smartlist_len(v1->voters));
voter = smartlist_get(v1->voters, 0);
- tt_str_op(voter->nickname,==, "Voter1");
- tt_str_op(voter->address,==, "1.2.3.4");
- tt_int_op(voter->addr,==, 0x01020304);
- tt_int_op(voter->dir_port,==, 80);
- tt_int_op(voter->or_port,==, 9000);
- tt_str_op(voter->contact,==, "voter@example.com");
+ tt_str_op(voter->nickname,OP_EQ, "Voter1");
+ tt_str_op(voter->address,OP_EQ, "1.2.3.4");
+ tt_int_op(voter->addr,OP_EQ, 0x01020304);
+ tt_int_op(voter->dir_port,OP_EQ, 80);
+ tt_int_op(voter->or_port,OP_EQ, 9000);
+ tt_str_op(voter->contact,OP_EQ, "voter@example.com");
tt_assert(v1->cert);
tt_assert(!crypto_pk_cmp_keys(sign_skey_1, v1->cert->signing_key));
cp = smartlist_join_strings(v1->known_flags, ":", 0, NULL);
- tt_str_op(cp,==, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid");
+ tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:Running:Stable:V2Dir:Valid");
tor_free(cp);
- tt_int_op(smartlist_len(v1->routerstatus_list),==, n_vrs);
+ tt_int_op(smartlist_len(v1->routerstatus_list),OP_EQ, n_vrs);
if (vote_tweaks) params_tweaked += vote_tweaks(v1, 1, now);
@@ -1876,7 +1924,7 @@ test_a_networkstatus(
/* Check that flags come out right.*/
cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
- tt_str_op(cp,==, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
+ tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
"Running:Stable:V2Dir:Valid");
tor_free(cp);
@@ -1945,30 +1993,30 @@ test_a_networkstatus(
con_md = networkstatus_parse_vote_from_string(consensus_text_md, NULL,
NS_TYPE_CONSENSUS);
tt_assert(con_md);
- tt_int_op(con_md->flavor,==, FLAV_MICRODESC);
+ tt_int_op(con_md->flavor,OP_EQ, FLAV_MICRODESC);
/* Check consensus contents. */
tt_assert(con->type == NS_TYPE_CONSENSUS);
- tt_int_op(con->published,==, 0); /* this field only appears in votes. */
- tt_int_op(con->valid_after,==, now+1000);
- tt_int_op(con->fresh_until,==, now+2003); /* median */
- tt_int_op(con->valid_until,==, now+3000);
- tt_int_op(con->vote_seconds,==, 100);
- tt_int_op(con->dist_seconds,==, 250); /* median */
- tt_str_op(con->client_versions,==, "0.1.2.14");
- tt_str_op(con->server_versions,==, "0.1.2.15,0.1.2.16");
+ tt_int_op(con->published,OP_EQ, 0); /* this field only appears in votes. */
+ tt_int_op(con->valid_after,OP_EQ, now+1000);
+ tt_int_op(con->fresh_until,OP_EQ, now+2003); /* median */
+ tt_int_op(con->valid_until,OP_EQ, now+3000);
+ tt_int_op(con->vote_seconds,OP_EQ, 100);
+ tt_int_op(con->dist_seconds,OP_EQ, 250); /* median */
+ tt_str_op(con->client_versions,OP_EQ, "0.1.2.14");
+ tt_str_op(con->server_versions,OP_EQ, "0.1.2.15,0.1.2.16");
cp = smartlist_join_strings(v2->known_flags, ":", 0, NULL);
- tt_str_op(cp,==, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
+ tt_str_op(cp,OP_EQ, "Authority:Exit:Fast:Guard:MadeOfCheese:MadeOfTin:"
"Running:Stable:V2Dir:Valid");
tor_free(cp);
if (!params_tweaked) {
/* Skip this one if vote_tweaks() messed with the param lists */
cp = smartlist_join_strings(con->net_params, ":", 0, NULL);
- tt_str_op(cp,==, "circuitwindow=80:foo=660");
+ tt_str_op(cp,OP_EQ, "circuitwindow=80:foo=660");
tor_free(cp);
}
- tt_int_op(4,==, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/
+ tt_int_op(4,OP_EQ, smartlist_len(con->voters)); /*3 voters, 1 legacy key.*/
/* The voter id digests should be in this order. */
tt_assert(memcmp(cert2->cache_info.identity_digest,
cert1->cache_info.identity_digest,DIGEST_LEN)<0);
@@ -1994,10 +2042,10 @@ test_a_networkstatus(
/* Check signatures. the first voter is a pseudo-entry with a legacy key.
* The second one hasn't signed. The fourth one has signed: validate it. */
voter = smartlist_get(con->voters, 1);
- tt_int_op(smartlist_len(voter->sigs),==, 0);
+ tt_int_op(smartlist_len(voter->sigs),OP_EQ, 0);
voter = smartlist_get(con->voters, 3);
- tt_int_op(smartlist_len(voter->sigs),==, 1);
+ tt_int_op(smartlist_len(voter->sigs),OP_EQ, 1);
sig = smartlist_get(voter->sigs, 0);
tt_assert(sig->signature);
tt_assert(!sig->good_signature);
@@ -2047,11 +2095,11 @@ test_a_networkstatus(
tt_assert(con_md3);
/* All three should have the same digest. */
- tt_mem_op(&con->digests,==, &con2->digests, sizeof(digests_t));
- tt_mem_op(&con->digests,==, &con3->digests, sizeof(digests_t));
+ tt_mem_op(&con->digests,OP_EQ, &con2->digests, sizeof(digests_t));
+ tt_mem_op(&con->digests,OP_EQ, &con3->digests, sizeof(digests_t));
- tt_mem_op(&con_md->digests,==, &con_md2->digests, sizeof(digests_t));
- tt_mem_op(&con_md->digests,==, &con_md3->digests, sizeof(digests_t));
+ tt_mem_op(&con_md->digests,OP_EQ, &con_md2->digests, sizeof(digests_t));
+ tt_mem_op(&con_md->digests,OP_EQ, &con_md3->digests, sizeof(digests_t));
/* Extract a detached signature from con3. */
detached_text1 = get_detached_sigs(con3, con_md3);
@@ -2061,44 +2109,44 @@ test_a_networkstatus(
tt_assert(dsig1);
/* Are parsed values as expected? */
- tt_int_op(dsig1->valid_after,==, con3->valid_after);
- tt_int_op(dsig1->fresh_until,==, con3->fresh_until);
- tt_int_op(dsig1->valid_until,==, con3->valid_until);
+ tt_int_op(dsig1->valid_after,OP_EQ, con3->valid_after);
+ tt_int_op(dsig1->fresh_until,OP_EQ, con3->fresh_until);
+ tt_int_op(dsig1->valid_until,OP_EQ, con3->valid_until);
{
digests_t *dsig_digests = strmap_get(dsig1->digests, "ns");
tt_assert(dsig_digests);
- tt_mem_op(dsig_digests->d[DIGEST_SHA1],==, con3->digests.d[DIGEST_SHA1],
- DIGEST_LEN);
+ tt_mem_op(dsig_digests->d[DIGEST_SHA1], OP_EQ,
+ con3->digests.d[DIGEST_SHA1], DIGEST_LEN);
dsig_digests = strmap_get(dsig1->digests, "microdesc");
tt_assert(dsig_digests);
- tt_mem_op(dsig_digests->d[DIGEST_SHA256],==,
+ tt_mem_op(dsig_digests->d[DIGEST_SHA256],OP_EQ,
con_md3->digests.d[DIGEST_SHA256],
DIGEST256_LEN);
}
{
smartlist_t *dsig_signatures = strmap_get(dsig1->signatures, "ns");
tt_assert(dsig_signatures);
- tt_int_op(1,==, smartlist_len(dsig_signatures));
+ tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures));
sig = smartlist_get(dsig_signatures, 0);
- tt_mem_op(sig->identity_digest,==, cert1->cache_info.identity_digest,
+ tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest,
DIGEST_LEN);
- tt_int_op(sig->alg,==, DIGEST_SHA1);
+ tt_int_op(sig->alg,OP_EQ, DIGEST_SHA1);
dsig_signatures = strmap_get(dsig1->signatures, "microdesc");
tt_assert(dsig_signatures);
- tt_int_op(1,==, smartlist_len(dsig_signatures));
+ tt_int_op(1,OP_EQ, smartlist_len(dsig_signatures));
sig = smartlist_get(dsig_signatures, 0);
- tt_mem_op(sig->identity_digest,==, cert1->cache_info.identity_digest,
+ tt_mem_op(sig->identity_digest,OP_EQ, cert1->cache_info.identity_digest,
DIGEST_LEN);
- tt_int_op(sig->alg,==, DIGEST_SHA256);
+ tt_int_op(sig->alg,OP_EQ, DIGEST_SHA256);
}
/* Try adding it to con2. */
detached_text2 = get_detached_sigs(con2,con_md2);
- tt_int_op(1,==, networkstatus_add_detached_signatures(con2, dsig1, "test",
- LOG_INFO, &msg));
+ tt_int_op(1,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1,
+ "test", LOG_INFO, &msg));
tor_free(detached_text2);
- tt_int_op(1,==,
+ tt_int_op(1,OP_EQ,
networkstatus_add_detached_signatures(con_md2, dsig1, "test",
LOG_INFO, &msg));
tor_free(detached_text2);
@@ -2114,19 +2162,19 @@ test_a_networkstatus(
printf("%s\n", hd);
});
*/
- tt_int_op(2,==,
+ tt_int_op(2,OP_EQ,
smartlist_len((smartlist_t*)strmap_get(dsig2->signatures, "ns")));
- tt_int_op(2,==,
+ tt_int_op(2,OP_EQ,
smartlist_len((smartlist_t*)strmap_get(dsig2->signatures,
"microdesc")));
/* Try adding to con2 twice; verify that nothing changes. */
- tt_int_op(0,==, networkstatus_add_detached_signatures(con2, dsig1, "test",
- LOG_INFO, &msg));
+ tt_int_op(0,OP_EQ, networkstatus_add_detached_signatures(con2, dsig1,
+ "test", LOG_INFO, &msg));
/* Add to con. */
- tt_int_op(2,==, networkstatus_add_detached_signatures(con, dsig2, "test",
- LOG_INFO, &msg));
+ tt_int_op(2,OP_EQ, networkstatus_add_detached_signatures(con, dsig2,
+ "test", LOG_INFO, &msg));
/* Check signatures */
voter = smartlist_get(con->voters, 1);
sig = smartlist_get(voter->sigs, 0);
@@ -2229,7 +2277,7 @@ test_dir_scale_bw(void *testdata)
scale_array_elements_to_u64(vals, 8, &total);
- tt_int_op((int)total, ==, 48);
+ tt_int_op((int)total, OP_EQ, 48);
total = 0;
for (i=0; i<8; ++i) {
total += vals[i].u64;
@@ -2240,7 +2288,7 @@ test_dir_scale_bw(void *testdata)
for (i=0; i<8; ++i) {
/* vals[2].u64 is the scaled value of 1.0 */
double ratio = ((double)vals[i].u64) / vals[2].u64;
- tt_double_op(fabs(ratio - v[i]), <, .00001);
+ tt_double_op(fabs(ratio - v[i]), OP_LT, .00001);
}
/* test handling of no entries */
@@ -2291,11 +2339,11 @@ test_dir_random_weighted(void *testdata)
inp[i].u64 = vals[i];
total += vals[i];
}
- tt_u64_op(total, ==, 45);
+ tt_u64_op(total, OP_EQ, 45);
for (i=0; i<n; ++i) {
choice = choose_array_element_by_weight(inp, 10);
- tt_int_op(choice, >=, 0);
- tt_int_op(choice, <, 10);
+ tt_int_op(choice, OP_GE, 0);
+ tt_int_op(choice, OP_LT, 10);
histogram[choice]++;
}
@@ -2308,7 +2356,7 @@ test_dir_random_weighted(void *testdata)
if (expected)
frac_diff = (histogram[i] - expected) / ((double)expected);
else
- tt_int_op(histogram[i], ==, 0);
+ tt_int_op(histogram[i], OP_EQ, 0);
sq = frac_diff * frac_diff;
if (sq > max_sq_error)
@@ -2316,12 +2364,12 @@ test_dir_random_weighted(void *testdata)
}
/* It should almost always be much much less than this. If you want to
* figure out the odds, please feel free. */
- tt_double_op(max_sq_error, <, .05);
+ tt_double_op(max_sq_error, OP_LT, .05);
/* Now try a singleton; do we choose it? */
for (i = 0; i < 100; ++i) {
choice = choose_array_element_by_weight(inp, 1);
- tt_int_op(choice, ==, 0);
+ tt_int_op(choice, OP_EQ, 0);
}
/* Now try an array of zeros. We should choose randomly. */
@@ -2330,8 +2378,8 @@ test_dir_random_weighted(void *testdata)
inp[i].u64 = 0;
for (i = 0; i < n; ++i) {
choice = choose_array_element_by_weight(inp, 5);
- tt_int_op(choice, >=, 0);
- tt_int_op(choice, <, 5);
+ tt_int_op(choice, OP_GE, 0);
+ tt_int_op(choice, OP_LT, 5);
histogram[choice]++;
}
/* Now see if we chose things about frequently enough. */
@@ -2347,7 +2395,7 @@ test_dir_random_weighted(void *testdata)
}
/* It should almost always be much much less than this. If you want to
* figure out the odds, please feel free. */
- tt_double_op(max_sq_error, <, .05);
+ tt_double_op(max_sq_error, OP_LT, .05);
done:
;
}
@@ -2546,21 +2594,21 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now)
* Check the first routerstatus - measured bandwidth below the clip
* cutoff.
*/
- tt_str_op(vrs->version,==, "0.1.2.14");
- tt_int_op(rs->published_on,==, now-1500);
- tt_str_op(rs->nickname,==, "router2");
- tt_mem_op(rs->identity_digest,==,
+ tt_str_op(vrs->version,OP_EQ, "0.1.2.14");
+ tt_int_op(rs->published_on,OP_EQ, now-1500);
+ tt_str_op(rs->nickname,OP_EQ, "router2");
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3",
DIGEST_LEN);
- tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
- tt_int_op(rs->addr,==, 0x99008801);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 8000);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
+ tt_int_op(rs->addr,OP_EQ, 0x99008801);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 8000);
tt_assert(rs->has_bandwidth);
tt_assert(vrs->has_measured_bw);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2);
- tt_int_op(vrs->measured_bw_kb,==, max_unmeasured_bw_kb / 2);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2);
+ tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb / 2);
} else if (tor_memeq(rs->identity_digest,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5",
@@ -2570,24 +2618,24 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now)
* Check the second routerstatus - measured bandwidth above the clip
* cutoff.
*/
- tt_str_op(vrs->version,==, "0.2.0.5");
- tt_int_op(rs->published_on,==, now-1000);
- tt_str_op(rs->nickname,==, "router1");
- tt_mem_op(rs->identity_digest,==,
+ tt_str_op(vrs->version,OP_EQ, "0.2.0.5");
+ tt_int_op(rs->published_on,OP_EQ, now-1000);
+ tt_str_op(rs->nickname,OP_EQ, "router1");
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5",
DIGEST_LEN);
- tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
- tt_int_op(rs->addr,==, 0x99009901);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 0);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
+ tt_int_op(rs->addr,OP_EQ, 0x99009901);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 0);
tor_addr_parse(&addr_ipv6, "[1:2:3::4]");
tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6));
- tt_int_op(rs->ipv6_orport,==, 4711);
+ tt_int_op(rs->ipv6_orport,OP_EQ, 4711);
tt_assert(rs->has_bandwidth);
tt_assert(vrs->has_measured_bw);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2);
- tt_int_op(vrs->measured_bw_kb,==, max_unmeasured_bw_kb * 2);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2);
+ tt_int_op(vrs->measured_bw_kb,OP_EQ, max_unmeasured_bw_kb * 2);
} else if (tor_memeq(rs->identity_digest,
"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"
"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33",
@@ -2599,8 +2647,8 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now)
*/
tt_assert(rs->has_bandwidth);
tt_assert(!(vrs->has_measured_bw));
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2);
- tt_int_op(vrs->measured_bw_kb,==, 0);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2);
+ tt_int_op(vrs->measured_bw_kb,OP_EQ, 0);
} else if (tor_memeq(rs->identity_digest,
"\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34"
"\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34",
@@ -2611,8 +2659,8 @@ test_vrs_for_umbw(vote_routerstatus_t *vrs, int voter, time_t now)
*/
tt_assert(rs->has_bandwidth);
tt_assert(!(vrs->has_measured_bw));
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2);
- tt_int_op(vrs->measured_bw_kb,==, 0);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2);
+ tt_int_op(vrs->measured_bw_kb,OP_EQ, 0);
} else {
tt_assert(0);
}
@@ -2633,7 +2681,7 @@ test_consensus_for_umbw(networkstatus_t *con, time_t now)
tt_assert(!con->cert);
// tt_assert(con->consensus_method >= MIN_METHOD_TO_CLIP_UNMEASURED_BW_KB);
tt_assert(con->consensus_method >= 16);
- tt_int_op(4,==, smartlist_len(con->routerstatus_list));
+ tt_int_op(4,OP_EQ, smartlist_len(con->routerstatus_list));
/* There should be four listed routers; all voters saw the same in this */
done:
@@ -2657,11 +2705,11 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3",
DIGEST_LEN)) {
- tt_mem_op(rs->identity_digest,==,
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3"
"\x3\x3\x3\x3\x3\x3\x3\x3\x3\x3",
DIGEST_LEN);
- tt_mem_op(rs->descriptor_digest,==, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "NNNNNNNNNNNNNNNNNNNN", DIGEST_LEN);
tt_assert(!rs->is_authority);
tt_assert(!rs->is_exit);
tt_assert(!rs->is_fast);
@@ -2673,26 +2721,26 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
tt_assert(!rs->is_named);
/* This one should have measured bandwidth below the clip cutoff */
tt_assert(rs->has_bandwidth);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2);
tt_assert(!(rs->bw_is_unmeasured));
} else if (tor_memeq(rs->identity_digest,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5",
DIGEST_LEN)) {
/* This one showed up in 3 digests. Twice with ID 'M', once with 'Z'. */
- tt_mem_op(rs->identity_digest,==,
+ tt_mem_op(rs->identity_digest,OP_EQ,
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5"
"\x5\x5\x5\x5\x5\x5\x5\x5\x5\x5",
DIGEST_LEN);
- tt_str_op(rs->nickname,==, "router1");
- tt_mem_op(rs->descriptor_digest,==, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
- tt_int_op(rs->published_on,==, now-1000);
- tt_int_op(rs->addr,==, 0x99009901);
- tt_int_op(rs->or_port,==, 443);
- tt_int_op(rs->dir_port,==, 0);
+ tt_str_op(rs->nickname,OP_EQ, "router1");
+ tt_mem_op(rs->descriptor_digest,OP_EQ, "MMMMMMMMMMMMMMMMMMMM", DIGEST_LEN);
+ tt_int_op(rs->published_on,OP_EQ, now-1000);
+ tt_int_op(rs->addr,OP_EQ, 0x99009901);
+ tt_int_op(rs->or_port,OP_EQ, 443);
+ tt_int_op(rs->dir_port,OP_EQ, 0);
tor_addr_parse(&addr_ipv6, "[1:2:3::4]");
tt_assert(tor_addr_eq(&rs->ipv6_addr, &addr_ipv6));
- tt_int_op(rs->ipv6_orport,==, 4711);
+ tt_int_op(rs->ipv6_orport,OP_EQ, 4711);
tt_assert(!rs->is_authority);
tt_assert(rs->is_exit);
tt_assert(rs->is_fast);
@@ -2703,7 +2751,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
tt_assert(!rs->is_named);
/* This one should have measured bandwidth above the clip cutoff */
tt_assert(rs->has_bandwidth);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb * 2);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb * 2);
tt_assert(!(rs->bw_is_unmeasured));
} else if (tor_memeq(rs->identity_digest,
"\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33"
@@ -2714,7 +2762,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
* and so should be clipped
*/
tt_assert(rs->has_bandwidth);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb);
tt_assert(rs->bw_is_unmeasured);
} else if (tor_memeq(rs->identity_digest,
"\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34"
@@ -2725,7 +2773,7 @@ test_routerstatus_for_umbw(routerstatus_t *rs, time_t now)
* and so should not be clipped
*/
tt_assert(rs->has_bandwidth);
- tt_int_op(rs->bandwidth_kb,==, max_unmeasured_bw_kb / 2);
+ tt_int_op(rs->bandwidth_kb,OP_EQ, max_unmeasured_bw_kb / 2);
tt_assert(rs->bw_is_unmeasured);
} else {
/* Weren't expecting this... */
@@ -2801,7 +2849,7 @@ test_dir_fmt_control_ns(void *arg)
s = networkstatus_getinfo_helper_single(&rs);
tt_assert(s);
- tt_str_op(s, ==,
+ tt_str_op(s, OP_EQ,
"r TetsuoMilk U3RhdGVseSwgcGx1bXAgQnVjayA "
"TXVsbGlnYW4gY2FtZSB1cCBmcm8 2013-04-02 17:53:18 "
"32.48.64.80 9001 9002\n"
@@ -2824,16 +2872,17 @@ test_dir_http_handling(void *args)
"Host: example.com\r\n"
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
- &url),==, 0);
- tt_str_op(url,==, "/tor/a/b/c.txt");
+ &url),OP_EQ, 0);
+ tt_str_op(url,OP_EQ, "/tor/a/b/c.txt");
tor_free(url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),==, 0);
- tt_str_op(url,==, "/tor/a/b/c.txt");
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.0\r\n", &url),OP_EQ, 0);
+ tt_str_op(url,OP_EQ, "/tor/a/b/c.txt");
tor_free(url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url),==, 0);
- tt_str_op(url,==, "/tor/a/b/c.txt");
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.600\r\n", &url),
+ OP_EQ, 0);
+ tt_str_op(url,OP_EQ, "/tor/a/b/c.txt");
tor_free(url);
/* Should prepend '/tor/' to url if required */
@@ -2841,8 +2890,8 @@ test_dir_http_handling(void *args)
"Host: example.com\r\n"
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
- &url),==, 0);
- tt_str_op(url,==, "/tor/a/b/c.txt");
+ &url),OP_EQ, 0);
+ tt_str_op(url,OP_EQ, "/tor/a/b/c.txt");
tor_free(url);
/* Bad headers -- no HTTP/1.x*/
@@ -2850,7 +2899,7 @@ test_dir_http_handling(void *args)
"Host: example.com\r\n"
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
- &url),==, -1);
+ &url),OP_EQ, -1);
tt_assert(!url);
/* Bad headers */
@@ -2858,28 +2907,53 @@ test_dir_http_handling(void *args)
"Host: example.com\r\n"
"User-Agent: Mozilla/5.0 (Windows;"
" U; Windows NT 6.1; en-US; rv:1.9.1.5)\r\n",
- &url),==, -1);
+ &url),OP_EQ, -1);
tt_assert(!url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),==, -1);
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt", &url),OP_EQ, -1);
tt_assert(!url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),==, -1);
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1", &url),OP_EQ, -1);
tt_assert(!url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url),==, -1);
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.1x\r\n", &url),
+ OP_EQ, -1);
tt_assert(!url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),==, -1);
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.", &url),OP_EQ, -1);
tt_assert(!url);
- tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),==, -1);
+ tt_int_op(parse_http_url("GET /tor/a/b/c.txt HTTP/1.\r", &url),OP_EQ, -1);
tt_assert(!url);
done:
tor_free(url);
}
+static void
+test_dir_purpose_needs_anonymity(void *arg)
+{
+ (void)arg;
+ tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_BRIDGE));
+ tt_int_op(1, ==, purpose_needs_anonymity(0, ROUTER_PURPOSE_GENERAL));
+ tt_int_op(0, ==, purpose_needs_anonymity(DIR_PURPOSE_FETCH_MICRODESC,
+ ROUTER_PURPOSE_GENERAL));
+ done: ;
+}
+
+static void
+test_dir_fetch_type(void *arg)
+{
+ (void)arg;
+ tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_MICRODESC, ROUTER_PURPOSE_GENERAL,
+ NULL) == MICRODESC_DIRINFO);
+ tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_SERVERDESC, ROUTER_PURPOSE_BRIDGE,
+ NULL) == BRIDGE_DIRINFO);
+ tt_assert(dir_fetch_type(DIR_PURPOSE_FETCH_CONSENSUS, ROUTER_PURPOSE_GENERAL,
+ "microdesc") == (V3_DIRINFO | MICRODESC_DIRINFO));
+ done: ;
+}
+
#define DIR_LEGACY(name) \
{ #name, test_dir_ ## name , TT_FORK, NULL, NULL }
@@ -2907,6 +2981,8 @@ struct testcase_t dir_tests[] = {
DIR_LEGACY(clip_unmeasured_bw_kb_alt),
DIR(fmt_control_ns, 0),
DIR(http_handling, 0),
+ DIR(purpose_needs_anonymity, 0),
+ DIR(fetch_type, 0),
END_OF_TESTCASES
};
diff --git a/src/test/test_entryconn.c b/src/test/test_entryconn.c
new file mode 100644
index 0000000000..6edc166743
--- /dev/null
+++ b/src/test/test_entryconn.c
@@ -0,0 +1,769 @@
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+
+#define CONNECTION_PRIVATE
+#define CONNECTION_EDGE_PRIVATE
+
+#include "or.h"
+#include "test.h"
+
+#include "addressmap.h"
+#include "config.h"
+#include "confparse.h"
+#include "connection.h"
+#include "connection_edge.h"
+
+static void *
+entryconn_rewrite_setup(const struct testcase_t *tc)
+{
+ (void)tc;
+ entry_connection_t *ec = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ addressmap_init();
+ return ec;
+}
+
+static int
+entryconn_rewrite_teardown(const struct testcase_t *tc, void *arg)
+{
+ (void)tc;
+ entry_connection_t *ec = arg;
+ if (ec)
+ connection_free_(ENTRY_TO_CONN(ec));
+ addressmap_free_all();
+ return 1;
+}
+
+static struct testcase_setup_t test_rewrite_setup = {
+ entryconn_rewrite_setup, entryconn_rewrite_teardown
+};
+
+/* Simple rewrite: no changes needed */
+static void
+test_entryconn_rewrite_basic(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+
+ tt_assert(ec->socks_request);
+ strlcpy(ec->socks_request->address, "www.TORproject.org",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.torproject.org");
+ tt_str_op(ec->socks_request->address, OP_EQ, "www.torproject.org");
+ tt_str_op(ec->original_dest_address, OP_EQ, "www.torproject.org");
+
+ done:
+ ;
+}
+
+/* Rewrite but reject because of disallowed .exit */
+static void
+test_entryconn_rewrite_bad_dotexit(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+
+ get_options_mutable()->AllowDotExit = 0;
+ tt_assert(ec->socks_request);
+ strlcpy(ec->socks_request->address, "www.TORproject.org.foo.exit",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 1);
+ tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_TORPROTOCOL);
+
+ done:
+ ;
+}
+
+/* Automap on resolve, connect to automapped address, resolve again and get
+ * same answer. (IPv4) */
+static void
+test_entryconn_rewrite_automap_ipv4(void *arg)
+{
+ entry_connection_t *ec = arg;
+ entry_connection_t *ec2=NULL, *ec3=NULL;
+ rewrite_result_t rr;
+ char *msg = NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes, tor_strdup("."));
+ parse_virtual_addr_network("127.202.0.0/16", AF_INET, 0, &msg);
+
+ /* Automap this on resolve. */
+ strlcpy(ec->socks_request->address, "WWW.MIT.EDU",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu");
+ tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu");
+
+ tt_assert(!strcmpstart(ec->socks_request->address,"127.202."));
+
+ /* Connect to it and make sure we get the original address back. */
+ strlcpy(ec2->socks_request->address, ec->socks_request->address,
+ sizeof(ec2->socks_request->address));
+
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu");
+
+ /* Resolve it again, make sure the answer is the same. */
+ strlcpy(ec3->socks_request->address, "www.MIT.EDU",
+ sizeof(ec3->socks_request->address));
+ ec3->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec3, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu");
+ tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu");
+
+ tt_str_op(ec3->socks_request->address, OP_EQ,
+ ec->socks_request->address);
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+ connection_free_(ENTRY_TO_CONN(ec3));
+}
+
+/* Automap on resolve, connect to automapped address, resolve again and get
+ * same answer. (IPv6) */
+static void
+test_entryconn_rewrite_automap_ipv6(void *arg)
+{
+ (void)arg;
+ entry_connection_t *ec =NULL;
+ entry_connection_t *ec2=NULL, *ec3=NULL;
+ rewrite_result_t rr;
+ char *msg = NULL;
+
+ ec = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+ ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes, tor_strdup("."));
+ parse_virtual_addr_network("FE80::/32", AF_INET6, 0, &msg);
+
+ /* Automap this on resolve. */
+ strlcpy(ec->socks_request->address, "WWW.MIT.EDU",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu");
+ tt_str_op(ec->original_dest_address, OP_EQ, "www.mit.edu");
+
+ /* Yes, this [ should be here. */
+ tt_assert(!strcmpstart(ec->socks_request->address,"[fe80:"));
+
+ /* Connect to it and make sure we get the original address back. */
+ strlcpy(ec2->socks_request->address, ec->socks_request->address,
+ sizeof(ec2->socks_request->address));
+
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->socks_request->address, OP_EQ, "www.mit.edu");
+
+ /* Resolve it again, make sure the answer is the same. */
+ strlcpy(ec3->socks_request->address, "www.MIT.EDU",
+ sizeof(ec3->socks_request->address));
+ ec3->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec3, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.mit.edu");
+ tt_str_op(ec3->original_dest_address, OP_EQ, "www.mit.edu");
+
+ tt_str_op(ec3->socks_request->address, OP_EQ,
+ ec->socks_request->address);
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec));
+ connection_free_(ENTRY_TO_CONN(ec2));
+ connection_free_(ENTRY_TO_CONN(ec3));
+}
+
+#if 0
+/* FFFF not actually supported. */
+/* automap on resolve, reverse lookup. */
+static void
+test_entryconn_rewrite_automap_reverse(void *arg)
+{
+ entry_connection_t *ec = arg;
+ entry_connection_t *ec2=NULL;
+ rewrite_result_t rr;
+ char *msg = NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ get_options_mutable()->SafeLogging_ = SAFELOG_SCRUB_NONE;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes,
+ tor_strdup(".bloom"));
+ parse_virtual_addr_network("127.80.0.0/16", AF_INET, 0, &msg);
+
+ /* Automap this on resolve. */
+ strlcpy(ec->socks_request->address, "www.poldy.BLOOM",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.poldy.bloom");
+ tt_str_op(ec->original_dest_address, OP_EQ, "www.poldy.bloom");
+
+ tt_assert(!strcmpstart(ec->socks_request->address,"127.80."));
+
+ strlcpy(ec2->socks_request->address, ec->socks_request->address,
+ sizeof(ec2->socks_request->address));
+ ec2->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 1);
+ tt_int_op(rr.end_reason, OP_EQ,
+ END_STREAM_REASON_DONE|END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+}
+#endif
+
+/* Rewrite because of cached DNS entry. */
+static void
+test_entryconn_rewrite_cached_dns_ipv4(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+ time_t expires = time(NULL) + 3600;
+ entry_connection_t *ec2=NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ addressmap_register("www.friendly.example.com",
+ tor_strdup("240.240.241.241"),
+ expires,
+ ADDRMAPSRC_DNS,
+ 0, 0);
+
+ strlcpy(ec->socks_request->address, "www.friendly.example.com",
+ sizeof(ec->socks_request->address));
+ strlcpy(ec2->socks_request->address, "www.friendly.example.com",
+ sizeof(ec2->socks_request->address));
+
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+
+ ec2->entry_cfg.use_cached_ipv4_answers = 1; /* only ec2 gets this flag */
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com");
+ tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com");
+
+ connection_ap_handshake_rewrite(ec2, &rr);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, expires);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com");
+ tt_str_op(ec2->socks_request->address, OP_EQ, "240.240.241.241");
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+}
+
+/* Rewrite because of cached DNS entry. */
+static void
+test_entryconn_rewrite_cached_dns_ipv6(void *arg)
+{
+ entry_connection_t *ec = NULL;
+ rewrite_result_t rr;
+ time_t expires = time(NULL) + 3600;
+ entry_connection_t *ec2=NULL;
+
+ (void)arg;
+
+ ec = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+
+ addressmap_register("www.friendly.example.com",
+ tor_strdup("[::f00f]"),
+ expires,
+ ADDRMAPSRC_DNS,
+ 0, 0);
+
+ strlcpy(ec->socks_request->address, "www.friendly.example.com",
+ sizeof(ec->socks_request->address));
+ strlcpy(ec2->socks_request->address, "www.friendly.example.com",
+ sizeof(ec2->socks_request->address));
+
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+
+ ec2->entry_cfg.use_cached_ipv6_answers = 1; /* only ec2 gets this flag */
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com");
+ tt_str_op(ec->socks_request->address, OP_EQ, "www.friendly.example.com");
+
+ connection_ap_handshake_rewrite(ec2, &rr);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, expires);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "www.friendly.example.com");
+ tt_str_op(ec2->socks_request->address, OP_EQ, "[::f00f]");
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec));
+ connection_free_(ENTRY_TO_CONN(ec2));
+}
+
+/* Fail to connect to unmapped address in virtual range. */
+static void
+test_entryconn_rewrite_unmapped_virtual(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+ entry_connection_t *ec2 = NULL;
+ char *msg = NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET6);
+
+ parse_virtual_addr_network("18.202.0.0/16", AF_INET, 0, &msg);
+ parse_virtual_addr_network("[ABCD::]/16", AF_INET6, 0, &msg);
+
+ strlcpy(ec->socks_request->address, "18.202.5.5",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 1);
+ tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+
+ strlcpy(ec2->socks_request->address, "[ABCD:9::5314:9543]",
+ sizeof(ec2->socks_request->address));
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 1);
+ tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_INTERNAL);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+}
+
+/* Rewrite because of mapaddress option */
+static void
+test_entryconn_rewrite_mapaddress(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+
+ config_line_append(&get_options_mutable()->AddressMap,
+ "MapAddress", "meta metaobjects.example");
+ config_register_addressmaps(get_options());
+
+ strlcpy(ec->socks_request->address, "meta",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(ec->socks_request->address, OP_EQ, "metaobjects.example");
+
+ done:
+ ;
+}
+
+/* Reject reverse lookups of internal address. */
+static void
+test_entryconn_rewrite_reject_internal_reverse(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+
+ strlcpy(ec->socks_request->address, "10.0.0.1",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.should_close, OP_EQ, 1);
+ tt_int_op(rr.end_reason, OP_EQ, END_STREAM_REASON_SOCKSPROTOCOL |
+ END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+
+ done:
+ ;
+}
+
+/* Rewrite into .exit because of virtual address mapping */
+static void
+test_entryconn_rewrite_automap_exit(void *arg)
+{
+ entry_connection_t *ec = arg;
+ entry_connection_t *ec2=NULL;
+ rewrite_result_t rr;
+ char *msg = NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ get_options_mutable()->AllowDotExit = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes,
+ tor_strdup(".EXIT"));
+ parse_virtual_addr_network("127.1.0.0/16", AF_INET, 0, &msg);
+
+ /* Automap this on resolve. */
+ strlcpy(ec->socks_request->address, "website.example.exit",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "website.example.exit");
+ tt_str_op(ec->original_dest_address, OP_EQ, "website.example.exit");
+
+ tt_assert(!strcmpstart(ec->socks_request->address,"127.1."));
+
+ /* Connect to it and make sure we get the original address back. */
+ strlcpy(ec2->socks_request->address, ec->socks_request->address,
+ sizeof(ec2->socks_request->address));
+
+ ec2->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_AUTOMAP);
+ tt_str_op(rr.orig_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->original_dest_address, OP_EQ, ec->socks_request->address);
+ tt_str_op(ec2->socks_request->address, OP_EQ, "website.example.exit");
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+}
+
+/* Rewrite into .exit because of mapaddress */
+static void
+test_entryconn_rewrite_mapaddress_exit(void *arg)
+{
+ entry_connection_t *ec = arg;
+ rewrite_result_t rr;
+
+ config_line_append(&get_options_mutable()->AddressMap,
+ "MapAddress", "*.example.com *.example.com.abc.exit");
+ config_register_addressmaps(get_options());
+
+ /* Automap this on resolve. */
+ strlcpy(ec->socks_request->address, "abc.example.com",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_TORRC);
+ tt_str_op(rr.orig_address, OP_EQ, "abc.example.com");
+ tt_str_op(ec->socks_request->address, OP_EQ, "abc.example.com.abc.exit");
+ done:
+ ;
+}
+
+/* Map foo.onion to longthing.onion, and also automap. */
+static void
+test_entryconn_rewrite_mapaddress_automap_onion(void *arg)
+{
+ entry_connection_t *ec = arg;
+ entry_connection_t *ec2 = NULL;
+ entry_connection_t *ec3 = NULL;
+ entry_connection_t *ec4 = NULL;
+ rewrite_result_t rr;
+ char *msg = NULL;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ ec4 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ get_options_mutable()->AllowDotExit = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes,
+ tor_strdup(".onion"));
+ parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg);
+ config_line_append(&get_options_mutable()->AddressMap,
+ "MapAddress", "foo.onion abcdefghijklmnop.onion");
+ config_register_addressmaps(get_options());
+
+ /* Connect to foo.onion. */
+ strlcpy(ec->socks_request->address, "foo.onion",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "foo.onion");
+ tt_str_op(ec->socks_request->address, OP_EQ, "abcdefghijklmnop.onion");
+
+ /* Okay, resolve foo.onion */
+ strlcpy(ec2->socks_request->address, "foo.onion",
+ sizeof(ec2->socks_request->address));
+ ec2->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "foo.onion");
+ tt_assert(!strcmpstart(ec2->socks_request->address, "192.168."));
+
+ /* Now connect */
+ strlcpy(ec3->socks_request->address, ec2->socks_request->address,
+ sizeof(ec3->socks_request->address));
+ ec3->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec3, &rr);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_assert(!strcmpstart(ec3->socks_request->address,
+ "abcdefghijklmnop.onion"));
+
+ /* Now resolve abcefghijklmnop.onion. */
+ strlcpy(ec4->socks_request->address, "abcdefghijklmnop.onion",
+ sizeof(ec4->socks_request->address));
+ ec4->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec4, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 1);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "abcdefghijklmnop.onion");
+ tt_assert(!strcmpstart(ec4->socks_request->address, "192.168."));
+ /* XXXX doesn't work
+ tt_str_op(ec4->socks_request->address, OP_EQ, ec2->socks_request->address);
+ */
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+ connection_free_(ENTRY_TO_CONN(ec3));
+ connection_free_(ENTRY_TO_CONN(ec4));
+}
+
+static void
+test_entryconn_rewrite_mapaddress_automap_onion_common(entry_connection_t *ec,
+ int map_to_onion,
+ int map_to_address)
+{
+ entry_connection_t *ec2 = NULL;
+ entry_connection_t *ec3 = NULL;
+ rewrite_result_t rr;
+
+ ec2 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+ ec3 = entry_connection_new(CONN_TYPE_AP, AF_INET);
+
+ /* Connect to irc.example.com */
+ strlcpy(ec->socks_request->address, "irc.example.com",
+ sizeof(ec->socks_request->address));
+ ec->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "irc.example.com");
+ tt_str_op(ec->socks_request->address, OP_EQ,
+ map_to_onion ? "abcdefghijklmnop.onion" : "irc.example.com");
+
+ /* Okay, resolve irc.example.com */
+ strlcpy(ec2->socks_request->address, "irc.example.com",
+ sizeof(ec2->socks_request->address));
+ ec2->socks_request->command = SOCKS_COMMAND_RESOLVE;
+ connection_ap_handshake_rewrite(ec2, &rr);
+
+ tt_int_op(rr.automap, OP_EQ, map_to_onion && map_to_address);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ tt_i64_op(rr.map_expires, OP_EQ, TIME_MAX);
+ tt_int_op(rr.exit_source, OP_EQ, ADDRMAPSRC_NONE);
+ tt_str_op(rr.orig_address, OP_EQ, "irc.example.com");
+ if (map_to_onion && map_to_address)
+ tt_assert(!strcmpstart(ec2->socks_request->address, "192.168."));
+
+ /* Now connect */
+ strlcpy(ec3->socks_request->address, ec2->socks_request->address,
+ sizeof(ec3->socks_request->address));
+ ec3->socks_request->command = SOCKS_COMMAND_CONNECT;
+ connection_ap_handshake_rewrite(ec3, &rr);
+ tt_int_op(rr.automap, OP_EQ, 0);
+ tt_int_op(rr.should_close, OP_EQ, 0);
+ tt_int_op(rr.end_reason, OP_EQ, 0);
+ if (map_to_onion)
+ tt_assert(!strcmpstart(ec3->socks_request->address,
+ "abcdefghijklmnop.onion"));
+
+ done:
+ connection_free_(ENTRY_TO_CONN(ec2));
+ connection_free_(ENTRY_TO_CONN(ec3));
+}
+
+/* This time is the same, but we start with a mapping from a non-onion
+ * address. */
+static void
+test_entryconn_rewrite_mapaddress_automap_onion2(void *arg)
+{
+ char *msg = NULL;
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes,
+ tor_strdup(".onion"));
+ parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg);
+ config_line_append(&get_options_mutable()->AddressMap,
+ "MapAddress", "irc.example.com abcdefghijklmnop.onion");
+ config_register_addressmaps(get_options());
+
+ test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 1);
+}
+
+/* Same as above, with automapped turned off */
+static void
+test_entryconn_rewrite_mapaddress_automap_onion3(void *arg)
+{
+ config_line_append(&get_options_mutable()->AddressMap,
+ "MapAddress", "irc.example.com abcdefghijklmnop.onion");
+ config_register_addressmaps(get_options());
+
+ test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 1, 0);
+}
+
+/* As above, with no mapping. */
+static void
+test_entryconn_rewrite_mapaddress_automap_onion4(void *arg)
+{
+ char *msg = NULL;
+ get_options_mutable()->AutomapHostsOnResolve = 1;
+ smartlist_add(get_options_mutable()->AutomapHostsSuffixes,
+ tor_strdup(".onion"));
+ parse_virtual_addr_network("192.168.0.0/16", AF_INET, 0, &msg);
+
+ test_entryconn_rewrite_mapaddress_automap_onion_common(arg, 0, 1);
+}
+
+#define REWRITE(name) \
+ { #name, test_entryconn_##name, TT_FORK, &test_rewrite_setup, NULL }
+
+struct testcase_t entryconn_tests[] = {
+ REWRITE(rewrite_basic),
+ REWRITE(rewrite_bad_dotexit),
+ REWRITE(rewrite_automap_ipv4),
+ REWRITE(rewrite_automap_ipv6),
+ // REWRITE(rewrite_automap_reverse),
+ REWRITE(rewrite_cached_dns_ipv4),
+ REWRITE(rewrite_cached_dns_ipv6),
+ REWRITE(rewrite_unmapped_virtual),
+ REWRITE(rewrite_mapaddress),
+ REWRITE(rewrite_reject_internal_reverse),
+ REWRITE(rewrite_automap_exit),
+ REWRITE(rewrite_mapaddress_exit),
+ REWRITE(rewrite_mapaddress_automap_onion),
+ REWRITE(rewrite_mapaddress_automap_onion2),
+ REWRITE(rewrite_mapaddress_automap_onion3),
+ REWRITE(rewrite_mapaddress_automap_onion4),
+
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_entrynodes.c b/src/test/test_entrynodes.c
index bddc0f11e0..19071a1550 100644
--- a/src/test/test_entrynodes.c
+++ b/src/test/test_entrynodes.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Tor Project, Inc. */
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -71,15 +71,16 @@ setup_fake_routerlist(void)
retval = router_load_routers_from_string(TEST_DESCRIPTORS,
NULL, SAVED_IN_JOURNAL,
NULL, 0, NULL);
- tt_int_op(retval, ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(retval, OP_EQ, NUMBER_OF_DESCRIPTORS);
/* Sanity checking of routerlist and nodelist. */
our_routerlist = router_get_routerlist();
- tt_int_op(smartlist_len(our_routerlist->routers), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(our_routerlist->routers), OP_EQ,
+ NUMBER_OF_DESCRIPTORS);
routerlist_assert_ok(our_routerlist);
our_nodelist = nodelist_get_list();
- tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS);
/* Mark all routers as non-guards but up and running! */
SMARTLIST_FOREACH_BEGIN(our_nodelist, node_t *, node) {
@@ -163,7 +164,7 @@ test_choose_random_entry_one_possible_guard(void *arg)
/* Pick an entry. Make sure we pick the node we marked as guard. */
chosen_entry = choose_random_entry(NULL);
- tt_ptr_op(chosen_entry, ==, the_guard);
+ tt_ptr_op(chosen_entry, OP_EQ, the_guard);
done:
;
@@ -189,14 +190,14 @@ populate_live_entry_guards_test_helper(int num_needed)
/* Set NumEntryGuards to the provided number. */
options->NumEntryGuards = num_needed;
- tt_int_op(num_needed, ==, decide_num_guards(options, 0));
+ tt_int_op(num_needed, OP_EQ, decide_num_guards(options, 0));
/* The global entry guards smartlist should be empty now. */
- tt_int_op(smartlist_len(all_entry_guards), ==, 0);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0);
/* Walk the nodelist and add all nodes as entry guards. */
our_nodelist = nodelist_get_list();
- tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS);
SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) {
const node_t *node_tmp;
@@ -205,20 +206,20 @@ populate_live_entry_guards_test_helper(int num_needed)
} SMARTLIST_FOREACH_END(node);
/* Make sure the nodes were added as entry guards. */
- tt_int_op(smartlist_len(all_entry_guards), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, NUMBER_OF_DESCRIPTORS);
/* Ensure that all the possible entry guards are enough to satisfy us. */
- tt_int_op(smartlist_len(all_entry_guards), >=, num_needed);
+ tt_int_op(smartlist_len(all_entry_guards), OP_GE, num_needed);
/* Walk the entry guard list for some sanity checking */
SMARTLIST_FOREACH_BEGIN(all_entry_guards, const entry_guard_t *, entry) {
/* Since we called add_an_entry_guard() with 'for_discovery' being
False, all guards should have made_contact enabled. */
- tt_int_op(entry->made_contact, ==, 1);
+ tt_int_op(entry->made_contact, OP_EQ, 1);
/* Since we don't have a routerstatus, all of the entry guards are
not directory servers. */
- tt_int_op(entry->is_dir_cache, ==, 0);
+ tt_int_op(entry->is_dir_cache, OP_EQ, 0);
} SMARTLIST_FOREACH_END(entry);
/* First, try to get some fast guards. This should fail. */
@@ -228,8 +229,8 @@ populate_live_entry_guards_test_helper(int num_needed)
NO_DIRINFO, /* Don't care about DIRINFO*/
0, 0,
1); /* We want fast guard! */
- tt_int_op(retval, ==, 0);
- tt_int_op(smartlist_len(live_entry_guards), ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0);
/* Now try to get some stable guards. This should fail too. */
retval = populate_live_entry_guards(live_entry_guards,
@@ -239,8 +240,8 @@ populate_live_entry_guards_test_helper(int num_needed)
0,
1, /* We want stable guard! */
0);
- tt_int_op(retval, ==, 0);
- tt_int_op(smartlist_len(live_entry_guards), ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
+ tt_int_op(smartlist_len(live_entry_guards), OP_EQ, 0);
/* Now try to get any guard we can find. This should succeed. */
retval = populate_live_entry_guards(live_entry_guards,
@@ -253,8 +254,8 @@ populate_live_entry_guards_test_helper(int num_needed)
should have added 'num_needed' of them to live_entry_guards.
'retval' should be 1 since we now have enough live entry guards
to pick one. */
- tt_int_op(retval, ==, 1);
- tt_int_op(smartlist_len(live_entry_guards), ==, num_needed);
+ tt_int_op(retval, OP_EQ, 1);
+ tt_int_op(smartlist_len(live_entry_guards), OP_EQ, num_needed);
done:
smartlist_free(live_entry_guards);
@@ -361,7 +362,7 @@ test_entry_guards_parse_state_simple(void *arg)
(void) arg;
/* The global entry guards smartlist should be empty now. */
- tt_int_op(smartlist_len(all_entry_guards), ==, 0);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0);
{ /* Prepare the state entry */
@@ -387,34 +388,34 @@ test_entry_guards_parse_state_simple(void *arg)
/* Parse state */
retval = entry_guards_parse_state(state, 1, &msg);
- tt_int_op(retval, >=, 0);
+ tt_int_op(retval, OP_GE, 0);
/* Test that the guard was registered.
We need to re-get the entry guard list since its pointer was
overwritten in entry_guards_parse_state(). */
all_entry_guards = get_entry_guards();
- tt_int_op(smartlist_len(all_entry_guards), ==, 1);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1);
{ /* Test the entry guard structure */
char hex_digest[1024];
char str_time[1024];
const entry_guard_t *e = smartlist_get(all_entry_guards, 0);
- tt_str_op(e->nickname, ==, nickname); /* Verify nickname */
+ tt_str_op(e->nickname, OP_EQ, nickname); /* Verify nickname */
base16_encode(hex_digest, sizeof(hex_digest),
e->identity, DIGEST_LEN);
- tt_str_op(hex_digest, ==, fpr); /* Verify fingerprint */
+ tt_str_op(hex_digest, OP_EQ, fpr); /* Verify fingerprint */
tt_assert(e->is_dir_cache); /* Verify dirness */
- tt_str_op(e->chosen_by_version, ==, tor_version); /* Verify tor version */
+ tt_str_op(e->chosen_by_version, OP_EQ, tor_version); /* Verify version */
tt_assert(e->made_contact); /* All saved guards have been contacted */
tt_assert(e->bad_since); /* Verify bad_since timestamp */
format_iso_time(str_time, e->bad_since);
- tt_str_op(str_time, ==, unlisted_since);
+ tt_str_op(str_time, OP_EQ, unlisted_since);
/* The rest should be unset */
tt_assert(!e->unreachable_since);
@@ -456,7 +457,7 @@ test_entry_guards_parse_state_pathbias(void *arg)
(void) arg;
/* The global entry guards smartlist should be empty now. */
- tt_int_op(smartlist_len(all_entry_guards), ==, 0);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0);
{ /* Prepare the state entry */
@@ -492,11 +493,11 @@ test_entry_guards_parse_state_pathbias(void *arg)
/* Parse state */
retval = entry_guards_parse_state(state, 1, &msg);
- tt_int_op(retval, >=, 0);
+ tt_int_op(retval, OP_GE, 0);
/* Test that the guard was registered */
all_entry_guards = get_entry_guards();
- tt_int_op(smartlist_len(all_entry_guards), ==, 1);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1);
{ /* Test the path bias of this guard */
const entry_guard_t *e = smartlist_get(all_entry_guards, 0);
@@ -505,12 +506,13 @@ test_entry_guards_parse_state_pathbias(void *arg)
tt_assert(!e->can_retry);
/* XXX tt_double_op doesn't support equality. Cast to int for now. */
- tt_int_op((int)e->circ_attempts, ==, (int)circ_attempts);
- tt_int_op((int)e->circ_successes, ==, (int)circ_successes);
- tt_int_op((int)e->successful_circuits_closed, ==, (int)successful_closed);
- tt_int_op((int)e->timeouts, ==, (int)timeouts);
- tt_int_op((int)e->collapsed_circuits, ==, (int)collapsed);
- tt_int_op((int)e->unusable_circuits, ==, (int)unusable);
+ tt_int_op((int)e->circ_attempts, OP_EQ, (int)circ_attempts);
+ tt_int_op((int)e->circ_successes, OP_EQ, (int)circ_successes);
+ tt_int_op((int)e->successful_circuits_closed, OP_EQ,
+ (int)successful_closed);
+ tt_int_op((int)e->timeouts, OP_EQ, (int)timeouts);
+ tt_int_op((int)e->collapsed_circuits, OP_EQ, (int)collapsed);
+ tt_int_op((int)e->unusable_circuits, OP_EQ, (int)unusable);
}
done:
@@ -537,17 +539,17 @@ test_entry_guards_set_from_config(void *arg)
retval = routerset_parse(options->EntryNodes,
entrynodes_str,
"test_entrynodes");
- tt_int_op(retval, >=, 0);
+ tt_int_op(retval, OP_GE, 0);
/* Read nodes from EntryNodes */
entry_guards_set_from_config(options);
/* Test that only one guard was added. */
- tt_int_op(smartlist_len(all_entry_guards), ==, 1);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 1);
/* Make sure it was the guard we specified. */
chosen_entry = choose_random_entry(NULL);
- tt_str_op(chosen_entry->ri->nickname, ==, entrynodes_str);
+ tt_str_op(chosen_entry->ri->nickname, OP_EQ, entrynodes_str);
done:
routerset_free(options->EntryNodes);
@@ -569,59 +571,59 @@ test_entry_is_time_to_retry(void *arg)
test_guard->unreachable_since = now - 1;
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->unreachable_since = now - (6*60*60 - 1);
test_guard->last_attempted = now - (60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->last_attempted = now - (60*60 - 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,0);
+ tt_int_op(retval,OP_EQ,0);
test_guard->unreachable_since = now - (6*60*60 + 1);
test_guard->last_attempted = now - (4*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->unreachable_since = now - (3*24*60*60 - 1);
test_guard->last_attempted = now - (4*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->unreachable_since = now - (3*24*60*60 + 1);
test_guard->last_attempted = now - (18*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->unreachable_since = now - (7*24*60*60 - 1);
test_guard->last_attempted = now - (18*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->last_attempted = now - (18*60*60 - 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,0);
+ tt_int_op(retval,OP_EQ,0);
test_guard->unreachable_since = now - (7*24*60*60 + 1);
test_guard->last_attempted = now - (36*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
test_guard->unreachable_since = now - (7*24*60*60 + 1);
test_guard->last_attempted = now - (36*60*60 + 1);
retval = entry_is_time_to_retry(test_guard,now);
- tt_int_op(retval,==,1);
+ tt_int_op(retval,OP_EQ,1);
done:
tor_free(test_guard);
@@ -641,23 +643,23 @@ test_entry_is_live(void *arg)
(void) arg;
/* The global entry guards smartlist should be empty now. */
- tt_int_op(smartlist_len(all_entry_guards), ==, 0);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, 0);
/* Walk the nodelist and add all nodes as entry guards. */
our_nodelist = nodelist_get_list();
- tt_int_op(smartlist_len(our_nodelist), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(our_nodelist), OP_EQ, NUMBER_OF_DESCRIPTORS);
SMARTLIST_FOREACH_BEGIN(our_nodelist, const node_t *, node) {
const node_t *node_tmp;
node_tmp = add_an_entry_guard(node, 0, 1, 0, 0);
tt_assert(node_tmp);
- tt_int_op(node->is_stable, ==, 0);
- tt_int_op(node->is_fast, ==, 0);
+ tt_int_op(node->is_stable, OP_EQ, 0);
+ tt_int_op(node->is_fast, OP_EQ, 0);
} SMARTLIST_FOREACH_END(node);
/* Make sure the nodes were added as entry guards. */
- tt_int_op(smartlist_len(all_entry_guards), ==, NUMBER_OF_DESCRIPTORS);
+ tt_int_op(smartlist_len(all_entry_guards), OP_EQ, NUMBER_OF_DESCRIPTORS);
/* Now get a random test entry that we will use for this unit test. */
which_node = 3; /* (chosen by fair dice roll) */
@@ -681,12 +683,12 @@ test_entry_is_live(void *arg)
/* Don't impose any restrictions on the node. Should succeed. */
test_node = entry_is_live(test_entry, 0, &msg);
tt_assert(test_node);
- tt_ptr_op(test_node, ==, node_get_by_id(test_entry->identity));
+ tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity));
/* Require descriptor for this node. It has one so it should succeed. */
test_node = entry_is_live(test_entry, ENTRY_NEED_DESCRIPTOR, &msg);
tt_assert(test_node);
- tt_ptr_op(test_node, ==, node_get_by_id(test_entry->identity));
+ tt_ptr_op(test_node, OP_EQ, node_get_by_id(test_entry->identity));
done:
; /* XXX */
diff --git a/src/test/test_extorport.c b/src/test/test_extorport.c
index 4049d6d5e0..2e5a32eef3 100644
--- a/src/test/test_extorport.c
+++ b/src/test/test_extorport.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONNECTION_PRIVATE
@@ -24,35 +24,37 @@ test_ext_or_id_map(void *arg)
(void)arg;
/* pre-initialization */
- tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+ tt_ptr_op(NULL, OP_EQ,
+ connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
c1 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
c2 = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
c3 = or_connection_new(CONN_TYPE_OR, AF_INET);
- tt_ptr_op(c1->ext_or_conn_id, !=, NULL);
- tt_ptr_op(c2->ext_or_conn_id, !=, NULL);
- tt_ptr_op(c3->ext_or_conn_id, ==, NULL);
+ tt_ptr_op(c1->ext_or_conn_id, OP_NE, NULL);
+ tt_ptr_op(c2->ext_or_conn_id, OP_NE, NULL);
+ tt_ptr_op(c3->ext_or_conn_id, OP_EQ, NULL);
- tt_ptr_op(c1, ==, connection_or_get_by_ext_or_id(c1->ext_or_conn_id));
- tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(c2->ext_or_conn_id));
- tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
+ tt_ptr_op(c1, OP_EQ, connection_or_get_by_ext_or_id(c1->ext_or_conn_id));
+ tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(c2->ext_or_conn_id));
+ tt_ptr_op(NULL, OP_EQ,
+ connection_or_get_by_ext_or_id("xxxxxxxxxxxxxxxxxxxx"));
idp = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
/* Give c2 a new ID. */
connection_or_set_ext_or_identifier(c2);
- tt_mem_op(idp, !=, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
+ tt_mem_op(idp, OP_NE, c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
idp2 = tor_memdup(c2->ext_or_conn_id, EXT_OR_CONN_ID_LEN);
tt_assert(!tor_digest_is_zero(idp2));
- tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
- tt_ptr_op(c2, ==, connection_or_get_by_ext_or_id(idp2));
+ tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(c2, OP_EQ, connection_or_get_by_ext_or_id(idp2));
/* Now remove it. */
connection_or_remove_from_ext_or_id_map(c2);
- tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp));
- tt_ptr_op(NULL, ==, connection_or_get_by_ext_or_id(idp2));
+ tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp));
+ tt_ptr_op(NULL, OP_EQ, connection_or_get_by_ext_or_id(idp2));
done:
if (c1)
@@ -112,33 +114,33 @@ test_ext_or_write_command(void *arg)
/* Length too long */
tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 100, "X", 100000),
- <, 0);
+ OP_LT, 0);
/* Empty command */
tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99, NULL, 0),
- ==, 0);
+ OP_EQ, 0);
cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
- tt_int_op(sz, ==, 4);
- tt_mem_op(cp, ==, "\x00\x99\x00\x00", 4);
+ tt_int_op(sz, OP_EQ, 4);
+ tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x00", 4);
tor_free(cp);
/* Medium command. */
tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0x99,
- "Wai\0Hello", 9), ==, 0);
+ "Wai\0Hello", 9), OP_EQ, 0);
cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
- tt_int_op(sz, ==, 13);
- tt_mem_op(cp, ==, "\x00\x99\x00\x09Wai\x00Hello", 13);
+ tt_int_op(sz, OP_EQ, 13);
+ tt_mem_op(cp, OP_EQ, "\x00\x99\x00\x09Wai\x00Hello", 13);
tor_free(cp);
/* Long command */
buf = tor_malloc(65535);
memset(buf, 'x', 65535);
tt_int_op(connection_write_ext_or_command(TO_CONN(c1), 0xf00d,
- buf, 65535), ==, 0);
+ buf, 65535), OP_EQ, 0);
cp = buf_get_contents(TO_CONN(c1)->outbuf, &sz);
- tt_int_op(sz, ==, 65539);
- tt_mem_op(cp, ==, "\xf0\x0d\xff\xff", 4);
- tt_mem_op(cp+4, ==, buf, 65535);
+ tt_int_op(sz, OP_EQ, 65539);
+ tt_mem_op(cp, OP_EQ, "\xf0\x0d\xff\xff", 4);
+ tt_mem_op(cp+4, OP_EQ, buf, 65535);
tor_free(cp);
done:
@@ -175,7 +177,7 @@ test_ext_or_init_auth(void *arg)
tor_free(options->DataDirectory);
options->DataDirectory = tor_strdup("foo");
cp = get_ext_or_auth_cookie_file_name();
- tt_str_op(cp, ==, "foo"PATH_SEPARATOR"extended_orport_auth_cookie");
+ tt_str_op(cp, OP_EQ, "foo"PATH_SEPARATOR"extended_orport_auth_cookie");
tor_free(cp);
/* Shouldn't be initialized already, or our tests will be a bit
@@ -187,30 +189,30 @@ test_ext_or_init_auth(void *arg)
fn = get_fname("ext_cookie_file");
options->ExtORPortCookieAuthFile = tor_strdup(fn);
cp = get_ext_or_auth_cookie_file_name();
- tt_str_op(cp, ==, fn);
+ tt_str_op(cp, OP_EQ, fn);
tor_free(cp);
/* Test the initialization function with a broken
write_bytes_to_file(). See if the problem is handled properly. */
MOCK(write_bytes_to_file, write_bytes_to_file_fail);
- tt_int_op(-1, ==, init_ext_or_cookie_authentication(1));
- tt_int_op(ext_or_auth_cookie_is_set, ==, 0);
+ tt_int_op(-1, OP_EQ, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 0);
UNMOCK(write_bytes_to_file);
/* Now do the actual initialization. */
- tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
- tt_int_op(ext_or_auth_cookie_is_set, ==, 1);
+ tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1));
+ tt_int_op(ext_or_auth_cookie_is_set, OP_EQ, 1);
cp = read_file_to_str(fn, RFTS_BIN, &st);
- tt_ptr_op(cp, !=, NULL);
- tt_u64_op((uint64_t)st.st_size, ==, 64);
- tt_mem_op(cp,==, "! Extended ORPort Auth Cookie !\x0a", 32);
- tt_mem_op(cp+32,==, ext_or_auth_cookie, 32);
+ tt_ptr_op(cp, OP_NE, NULL);
+ tt_u64_op((uint64_t)st.st_size, OP_EQ, 64);
+ tt_mem_op(cp,OP_EQ, "! Extended ORPort Auth Cookie !\x0a", 32);
+ tt_mem_op(cp+32,OP_EQ, ext_or_auth_cookie, 32);
memcpy(cookie0, ext_or_auth_cookie, 32);
tt_assert(!tor_mem_is_zero((char*)ext_or_auth_cookie, 32));
/* Operation should be idempotent. */
- tt_int_op(0, ==, init_ext_or_cookie_authentication(1));
- tt_mem_op(cookie0,==, ext_or_auth_cookie, 32);
+ tt_int_op(0, OP_EQ, init_ext_or_cookie_authentication(1));
+ tt_mem_op(cookie0,OP_EQ, ext_or_auth_cookie, 32);
done:
tor_free(cp);
@@ -237,8 +239,8 @@ test_ext_or_cookie_auth(void *arg)
(void)arg;
- tt_int_op(strlen(client_hash_input), ==, 46+32+32);
- tt_int_op(strlen(server_hash_input), ==, 46+32+32);
+ tt_int_op(strlen(client_hash_input), OP_EQ, 46+32+32);
+ tt_int_op(strlen(server_hash_input), OP_EQ, 46+32+32);
ext_or_auth_cookie = tor_malloc_zero(32);
memcpy(ext_or_auth_cookie, "s beside you? When I count, ther", 32);
@@ -258,20 +260,20 @@ test_ext_or_cookie_auth(void *arg)
*/
/* Wrong length */
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
handle_client_auth_nonce(client_nonce, 33, &client_hash, &reply,
&reply_len));
- tt_int_op(-1, ==,
+ tt_int_op(-1, OP_EQ,
handle_client_auth_nonce(client_nonce, 31, &client_hash, &reply,
&reply_len));
/* Now let's try this for real! */
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
&reply_len));
- tt_int_op(reply_len, ==, 64);
- tt_ptr_op(reply, !=, NULL);
- tt_ptr_op(client_hash, !=, NULL);
+ tt_int_op(reply_len, OP_EQ, 64);
+ tt_ptr_op(reply, OP_NE, NULL);
+ tt_ptr_op(client_hash, OP_NE, NULL);
/* Fill in the server nonce into the hash inputs... */
memcpy(server_hash_input+46+32, reply+32, 32);
memcpy(client_hash_input+46+32, reply+32, 32);
@@ -280,15 +282,15 @@ test_ext_or_cookie_auth(void *arg)
46+32+32);
crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
46+32+32);
- tt_mem_op(hmac1,==, reply, 32);
- tt_mem_op(hmac2,==, client_hash, 32);
+ tt_mem_op(hmac1,OP_EQ, reply, 32);
+ tt_mem_op(hmac2,OP_EQ, client_hash, 32);
/* Now do it again and make sure that the results are *different* */
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
handle_client_auth_nonce(client_nonce, 32, &client_hash2, &reply2,
&reply_len));
- tt_mem_op(reply2,!=, reply, reply_len);
- tt_mem_op(client_hash2,!=, client_hash, 32);
+ tt_mem_op(reply2,OP_NE, reply, reply_len);
+ tt_mem_op(client_hash2,OP_NE, client_hash, 32);
/* But that this one checks out too. */
memcpy(server_hash_input+46+32, reply2+32, 32);
memcpy(client_hash_input+46+32, reply2+32, 32);
@@ -297,8 +299,8 @@ test_ext_or_cookie_auth(void *arg)
46+32+32);
crypto_hmac_sha256(hmac2, (char*)ext_or_auth_cookie, 32, client_hash_input,
46+32+32);
- tt_mem_op(hmac1,==, reply2, 32);
- tt_mem_op(hmac2,==, client_hash2, 32);
+ tt_mem_op(hmac1,OP_EQ, reply2, 32);
+ tt_mem_op(hmac2,OP_EQ, client_hash2, 32);
done:
tor_free(reply);
@@ -334,12 +336,12 @@ test_ext_or_cookie_auth_testvec(void *arg)
MOCK(crypto_rand, crypto_rand_return_tse_str);
- tt_int_op(0, ==,
+ tt_int_op(0, OP_EQ,
handle_client_auth_nonce(client_nonce, 32, &client_hash, &reply,
&reply_len));
- tt_ptr_op(reply, !=, NULL );
- tt_uint_op(reply_len, ==, 64);
- tt_mem_op(reply+32,==, "te road There is always another ", 32);
+ tt_ptr_op(reply, OP_NE, NULL );
+ tt_uint_op(reply_len, OP_EQ, 64);
+ tt_mem_op(reply+32,OP_EQ, "te road There is always another ", 32);
/* HMACSHA256("Gliding wrapt in a brown mantle,"
* "ExtORPort authentication server-to-client hash"
* "But when I look ahead up the write road There is always another ");
@@ -402,11 +404,11 @@ handshake_start(or_connection_t *conn, int receiving)
} while (0)
#define CONTAINS(s,n) \
do { \
- tt_int_op((n), <=, sizeof(b)); \
- tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), ==, (n)); \
+ tt_int_op((n), OP_LE, sizeof(b)); \
+ tt_int_op(buf_datalen(TO_CONN(conn)->outbuf), OP_EQ, (n)); \
if ((n)) { \
fetch_from_buf(b, (n), TO_CONN(conn)->outbuf); \
- tt_mem_op(b, ==, (s), (n)); \
+ tt_mem_op(b, OP_EQ, (s), (n)); \
} \
} while (0)
@@ -416,14 +418,15 @@ do_ext_or_handshake(or_connection_t *conn)
{
char b[256];
- tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn));
CONTAINS("\x01\x00", 2);
WRITE("\x01", 1);
WRITE("But when I look ahead up the whi", 32);
MOCK(crypto_rand, crypto_rand_return_tse_str);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
UNMOCK(crypto_rand);
- tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH);
+ tt_int_op(TO_CONN(conn)->state, OP_EQ,
+ EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_HASH);
CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
"\x02\x9f\x1a\xde\x76\x10\xd9\x10\x87\x8b\x62\xee\xb7\x40\x38\x21"
"te road There is always another ", 64);
@@ -431,10 +434,10 @@ do_ext_or_handshake(or_connection_t *conn)
WRITE("\xab\x39\x17\x32\xdd\x2e\xd9\x68\xcd\x40\xc0\x87\xd1\xb1\xf2\x5b"
"\x33\xb3\xcd\x77\xff\x79\xbd\x80\xc2\x07\x4b\xbf\x43\x81\x19\xa2",
32);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("\x01", 1);
tt_assert(! TO_CONN(conn)->marked_for_close);
- tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+ tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN);
done: ;
}
@@ -456,14 +459,14 @@ test_ext_or_handshake(void *arg)
init_connection_lists();
conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
- tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn));
/* The server starts by telling us about the one supported authtype. */
CONTAINS("\x01\x00", 2);
/* Say the client hasn't responded yet. */
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
/* Let's say the client replies badly. */
WRITE("\x99", 1);
- tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
tt_assert(TO_CONN(conn)->marked_for_close);
close_closeable_connections();
@@ -471,23 +474,23 @@ test_ext_or_handshake(void *arg)
/* Okay, try again. */
conn = or_connection_new(CONN_TYPE_EXT_OR, AF_INET);
- tt_int_op(0, ==, connection_ext_or_start_auth(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_start_auth(conn));
CONTAINS("\x01\x00", 2);
/* Let's say the client replies sensibly this time. "Yes, AUTHTYPE_COOKIE
* sounds delicious. Let's have some of that!" */
WRITE("\x01", 1);
/* Let's say that the client also sends part of a nonce. */
WRITE("But when I look ", 16);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
- tt_int_op(TO_CONN(conn)->state, ==,
+ tt_int_op(TO_CONN(conn)->state, OP_EQ,
EXT_OR_CONN_STATE_AUTH_WAIT_CLIENT_NONCE);
/* Pump it again. Nothing should happen. */
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
/* send the rest of the nonce. */
WRITE("ahead up the whi", 16);
MOCK(crypto_rand, crypto_rand_return_tse_str);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
UNMOCK(crypto_rand);
/* We should get the right reply from the server. */
CONTAINS("\xec\x80\xed\x6e\x54\x6d\x3b\x36\xfd\xfc\x22\xfe\x13\x15\x41\x6b"
@@ -496,7 +499,7 @@ test_ext_or_handshake(void *arg)
/* Send the wrong response. */
WRITE("not with a bang but a whimper...", 32);
MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
- tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("\x00", 1);
tt_assert(TO_CONN(conn)->marked_for_close);
/* XXXX Hold-open-until-flushed. */
@@ -515,32 +518,32 @@ test_ext_or_handshake(void *arg)
/* Now let's run through some messages. */
/* First let's send some junk and make sure it's ignored. */
WRITE("\xff\xf0\x00\x03""ABC", 7);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
/* Now let's send a USERADDR command. */
WRITE("\x00\x01\x00\x0c""1.2.3.4:5678", 16);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
- tt_int_op(TO_CONN(conn)->port, ==, 5678);
- tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), ==, 0x01020304);
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->port, OP_EQ, 5678);
+ tt_int_op(tor_addr_to_ipv4h(&TO_CONN(conn)->addr), OP_EQ, 0x01020304);
/* Now let's send a TRANSPORT command. */
WRITE("\x00\x02\x00\x07""rfc1149", 11);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
- tt_ptr_op(NULL, !=, conn->ext_or_transport);
- tt_str_op("rfc1149", ==, conn->ext_or_transport);
- tt_int_op(is_reading,==,1);
- tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_OPEN);
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
+ tt_ptr_op(NULL, OP_NE, conn->ext_or_transport);
+ tt_str_op("rfc1149", OP_EQ, conn->ext_or_transport);
+ tt_int_op(is_reading,OP_EQ,1);
+ tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_OPEN);
/* DONE */
WRITE("\x00\x00\x00\x00", 4);
- tt_int_op(0, ==, connection_ext_or_process_inbuf(conn));
- tt_int_op(TO_CONN(conn)->state, ==, EXT_OR_CONN_STATE_FLUSHING);
- tt_int_op(is_reading,==,0);
+ tt_int_op(0, OP_EQ, connection_ext_or_process_inbuf(conn));
+ tt_int_op(TO_CONN(conn)->state, OP_EQ, EXT_OR_CONN_STATE_FLUSHING);
+ tt_int_op(is_reading,OP_EQ,0);
CONTAINS("\x10\x00\x00\x00", 4);
- tt_int_op(handshake_start_called,==,0);
- tt_int_op(0, ==, connection_ext_or_finished_flushing(conn));
- tt_int_op(is_reading,==,1);
- tt_int_op(handshake_start_called,==,1);
- tt_int_op(TO_CONN(conn)->type, ==, CONN_TYPE_OR);
- tt_int_op(TO_CONN(conn)->state, ==, 0);
+ tt_int_op(handshake_start_called,OP_EQ,0);
+ tt_int_op(0, OP_EQ, connection_ext_or_finished_flushing(conn));
+ tt_int_op(is_reading,OP_EQ,1);
+ tt_int_op(handshake_start_called,OP_EQ,1);
+ tt_int_op(TO_CONN(conn)->type, OP_EQ, CONN_TYPE_OR);
+ tt_int_op(TO_CONN(conn)->state, OP_EQ, 0);
close_closeable_connections();
conn = NULL;
@@ -551,7 +554,7 @@ test_ext_or_handshake(void *arg)
/* USERADDR command with an extra NUL byte */
WRITE("\x00\x01\x00\x0d""1.2.3.4:5678\x00", 17);
MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
- tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
tt_assert(TO_CONN(conn)->marked_for_close);
close_closeable_connections();
@@ -564,7 +567,7 @@ test_ext_or_handshake(void *arg)
/* TRANSPORT command with an extra NUL byte */
WRITE("\x00\x02\x00\x08""rfc1149\x00", 12);
MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
- tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
tt_assert(TO_CONN(conn)->marked_for_close);
close_closeable_connections();
@@ -578,7 +581,7 @@ test_ext_or_handshake(void *arg)
C-identifier) */
WRITE("\x00\x02\x00\x07""rf*1149", 11);
MOCK(control_event_bootstrap_problem, ignore_bootstrap_problem);
- tt_int_op(-1, ==, connection_ext_or_process_inbuf(conn));
+ tt_int_op(-1, OP_EQ, connection_ext_or_process_inbuf(conn));
CONTAINS("", 0);
tt_assert(TO_CONN(conn)->marked_for_close);
close_closeable_connections();
diff --git a/src/test/test_hs.c b/src/test/test_hs.c
index c4820014c7..0246eaf648 100644
--- a/src/test/test_hs.c
+++ b/src/test/test_hs.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -85,7 +85,7 @@ test_hs_desc_event(void *arg)
expected_msg = "650 HS_DESC REQUESTED "STR_HS_ADDR" NO_AUTH "\
STR_HSDIR_EXIST_LONGNAME" "STR_HS_ID"\r\n";
tt_assert(received_msg);
- tt_str_op(received_msg,==, expected_msg);
+ tt_str_op(received_msg,OP_EQ, expected_msg);
tor_free(received_msg);
/* test received event */
@@ -94,25 +94,27 @@ test_hs_desc_event(void *arg)
expected_msg = "650 HS_DESC RECEIVED "STR_HS_ADDR" BASIC_AUTH "\
STR_HSDIR_EXIST_LONGNAME"\r\n";
tt_assert(received_msg);
- tt_str_op(received_msg,==, expected_msg);
+ tt_str_op(received_msg,OP_EQ, expected_msg);
tor_free(received_msg);
/* test failed event */
rend_query.auth_type = 2;
- control_event_hs_descriptor_failed(&rend_query, HSDIR_NONE_EXIST_ID);
+ control_event_hs_descriptor_failed(&rend_query, HSDIR_NONE_EXIST_ID,
+ "QUERY_REJECTED");
expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" STEALTH_AUTH "\
- STR_HSDIR_NONE_EXIST_LONGNAME"\r\n";
+ STR_HSDIR_NONE_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n";
tt_assert(received_msg);
- tt_str_op(received_msg,==, expected_msg);
+ tt_str_op(received_msg,OP_EQ, expected_msg);
tor_free(received_msg);
/* test invalid auth type */
rend_query.auth_type = 999;
- control_event_hs_descriptor_failed(&rend_query, HSDIR_EXIST_ID);
+ control_event_hs_descriptor_failed(&rend_query, HSDIR_EXIST_ID,
+ "QUERY_REJECTED");
expected_msg = "650 HS_DESC FAILED "STR_HS_ADDR" UNKNOWN "\
- STR_HSDIR_EXIST_LONGNAME"\r\n";
+ STR_HSDIR_EXIST_LONGNAME" REASON=QUERY_REJECTED\r\n";
tt_assert(received_msg);
- tt_str_op(received_msg,==, expected_msg);
+ tt_str_op(received_msg,OP_EQ, expected_msg);
tor_free(received_msg);
done:
diff --git a/src/test/test_introduce.c b/src/test/test_introduce.c
index 0febd59276..0cab8ef4cc 100644
--- a/src/test/test_introduce.c
+++ b/src/test/test_introduce.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -310,7 +310,7 @@ do_parse_test(uint8_t *plaintext, size_t plaintext_len, int phase)
parsed_req = rend_service_begin_parse_intro(cell, cell_len, 2, &err_msg);
tt_assert(parsed_req);
tt_assert(!err_msg);
- tt_mem_op(parsed_req->pk,==, digest, DIGEST_LEN);
+ tt_mem_op(parsed_req->pk,OP_EQ, digest, DIGEST_LEN);
tt_assert(parsed_req->ciphertext);
tt_assert(parsed_req->ciphertext_len > 0);
diff --git a/src/test/test_logging.c b/src/test/test_logging.c
index 9d9cbae6a8..6205b3bdc5 100644
--- a/src/test/test_logging.c
+++ b/src/test/test_logging.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -22,8 +22,8 @@ test_get_sigsafe_err_fds(void *arg)
init_logging(1);
n = tor_log_get_sigsafe_err_fds(&fds);
- tt_int_op(n, ==, 1);
- tt_int_op(fds[0], ==, STDERR_FILENO);
+ tt_int_op(n, OP_EQ, 1);
+ tt_int_op(fds[0], OP_EQ, STDERR_FILENO);
set_log_severity_config(LOG_WARN, LOG_ERR, &include_bug);
set_log_severity_config(LOG_WARN, LOG_ERR, &no_bug);
@@ -40,26 +40,26 @@ test_get_sigsafe_err_fds(void *arg)
tor_log_update_sigsafe_err_fds();
n = tor_log_get_sigsafe_err_fds(&fds);
- tt_int_op(n, ==, 2);
- tt_int_op(fds[0], ==, STDERR_FILENO);
- tt_int_op(fds[1], ==, 3);
+ tt_int_op(n, OP_EQ, 2);
+ tt_int_op(fds[0], OP_EQ, STDERR_FILENO);
+ tt_int_op(fds[1], OP_EQ, 3);
/* Allow STDOUT to replace STDERR. */
add_stream_log(&include_bug, "dummy-4", STDOUT_FILENO);
tor_log_update_sigsafe_err_fds();
n = tor_log_get_sigsafe_err_fds(&fds);
- tt_int_op(n, ==, 2);
- tt_int_op(fds[0], ==, 3);
- tt_int_op(fds[1], ==, STDOUT_FILENO);
+ tt_int_op(n, OP_EQ, 2);
+ tt_int_op(fds[0], OP_EQ, 3);
+ tt_int_op(fds[1], OP_EQ, STDOUT_FILENO);
/* But don't allow it to replace explicit STDERR. */
add_stream_log(&include_bug, "dummy-5", STDERR_FILENO);
tor_log_update_sigsafe_err_fds();
n = tor_log_get_sigsafe_err_fds(&fds);
- tt_int_op(n, ==, 3);
- tt_int_op(fds[0], ==, STDERR_FILENO);
- tt_int_op(fds[1], ==, STDOUT_FILENO);
- tt_int_op(fds[2], ==, 3);
+ tt_int_op(n, OP_EQ, 3);
+ tt_int_op(fds[0], OP_EQ, STDERR_FILENO);
+ tt_int_op(fds[1], OP_EQ, STDOUT_FILENO);
+ tt_int_op(fds[2], OP_EQ, 3);
/* Don't overflow the array. */
{
@@ -70,7 +70,7 @@ test_get_sigsafe_err_fds(void *arg)
}
tor_log_update_sigsafe_err_fds();
n = tor_log_get_sigsafe_err_fds(&fds);
- tt_int_op(n, ==, 8);
+ tt_int_op(n, OP_EQ, 8);
done:
;
@@ -109,7 +109,7 @@ test_sigsafe_err(void *arg)
tt_assert(content != NULL);
tor_split_lines(lines, content, (int)strlen(content));
- tt_int_op(smartlist_len(lines), >=, 5);
+ tt_int_op(smartlist_len(lines), OP_GE, 5);
if (strstr(smartlist_get(lines, 0), "opening new log file"))
smartlist_del_keeporder(lines, 0);
@@ -119,7 +119,7 @@ test_sigsafe_err(void *arg)
tt_assert(!strcmpstart(smartlist_get(lines, 2), "Minimal."));
/* Next line is blank. */
tt_assert(!strcmpstart(smartlist_get(lines, 3), "=============="));
- tt_str_op(smartlist_get(lines, 4), ==,
+ tt_str_op(smartlist_get(lines, 4), OP_EQ,
"Testing any attempt to manually log from a signal.");
done:
diff --git a/src/test/test_microdesc.c b/src/test/test_microdesc.c
index aa4bdf2ae8..fb3df77edc 100644
--- a/src/test/test_microdesc.c
+++ b/src/test/test_microdesc.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2010-2014, The Tor Project, Inc. */
+/* Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -75,9 +75,9 @@ test_md_cache(void *data)
tor_free(options->DataDirectory);
options->DataDirectory = tor_strdup(get_fname("md_datadir_test"));
#ifdef _WIN32
- tt_int_op(0, ==, mkdir(options->DataDirectory));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory));
#else
- tt_int_op(0, ==, mkdir(options->DataDirectory, 0700));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700));
#endif
tt_assert(!strcmpstart(test_md3_noannotation, "onion-key"));
@@ -91,7 +91,7 @@ test_md_cache(void *data)
added = microdescs_add_to_cache(mc, test_md1, NULL, SAVED_NOWHERE, 0,
time1, NULL);
- tt_int_op(1, ==, smartlist_len(added));
+ tt_int_op(1, OP_EQ, smartlist_len(added));
md1 = smartlist_get(added, 0);
smartlist_free(added);
added = NULL;
@@ -100,7 +100,7 @@ test_md_cache(void *data)
added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0,
time2, wanted);
/* Should fail, since we didn't list test_md2's digest in wanted */
- tt_int_op(0, ==, smartlist_len(added));
+ tt_int_op(0, OP_EQ, smartlist_len(added));
smartlist_free(added);
added = NULL;
@@ -109,75 +109,75 @@ test_md_cache(void *data)
added = microdescs_add_to_cache(mc, test_md2, NULL, SAVED_NOWHERE, 0,
time2, wanted);
/* Now it can work. md2 should have been added */
- tt_int_op(1, ==, smartlist_len(added));
+ tt_int_op(1, OP_EQ, smartlist_len(added));
md2 = smartlist_get(added, 0);
/* And it should have gotten removed from 'wanted' */
- tt_int_op(smartlist_len(wanted), ==, 1);
- tt_mem_op(smartlist_get(wanted, 0), ==, d3, DIGEST256_LEN);
+ tt_int_op(smartlist_len(wanted), OP_EQ, 1);
+ tt_mem_op(smartlist_get(wanted, 0), OP_EQ, d3, DIGEST256_LEN);
smartlist_free(added);
added = NULL;
added = microdescs_add_to_cache(mc, test_md3, NULL,
SAVED_NOWHERE, 0, -1, NULL);
/* Must fail, since SAVED_NOWHERE precludes annotations */
- tt_int_op(0, ==, smartlist_len(added));
+ tt_int_op(0, OP_EQ, smartlist_len(added));
smartlist_free(added);
added = NULL;
added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL,
SAVED_NOWHERE, 0, time3, NULL);
/* Now it can work */
- tt_int_op(1, ==, smartlist_len(added));
+ tt_int_op(1, OP_EQ, smartlist_len(added));
md3 = smartlist_get(added, 0);
smartlist_free(added);
added = NULL;
/* Okay. We added 1...3. Let's poke them to see how they look, and make
* sure they're really in the journal. */
- tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1));
- tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2));
- tt_ptr_op(md3, ==, microdesc_cache_lookup_by_digest256(mc, d3));
-
- tt_int_op(md1->last_listed, ==, time1);
- tt_int_op(md2->last_listed, ==, time2);
- tt_int_op(md3->last_listed, ==, time3);
-
- tt_int_op(md1->saved_location, ==, SAVED_IN_JOURNAL);
- tt_int_op(md2->saved_location, ==, SAVED_IN_JOURNAL);
- tt_int_op(md3->saved_location, ==, SAVED_IN_JOURNAL);
-
- tt_int_op(md1->bodylen, ==, strlen(test_md1));
- tt_int_op(md2->bodylen, ==, strlen(test_md2));
- tt_int_op(md3->bodylen, ==, strlen(test_md3_noannotation));
- tt_mem_op(md1->body, ==, test_md1, strlen(test_md1));
- tt_mem_op(md2->body, ==, test_md2, strlen(test_md2));
- tt_mem_op(md3->body, ==, test_md3_noannotation,
+ tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1));
+ tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2));
+ tt_ptr_op(md3, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3));
+
+ tt_int_op(md1->last_listed, OP_EQ, time1);
+ tt_int_op(md2->last_listed, OP_EQ, time2);
+ tt_int_op(md3->last_listed, OP_EQ, time3);
+
+ tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_JOURNAL);
+ tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_JOURNAL);
+ tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL);
+
+ tt_int_op(md1->bodylen, OP_EQ, strlen(test_md1));
+ tt_int_op(md2->bodylen, OP_EQ, strlen(test_md2));
+ tt_int_op(md3->bodylen, OP_EQ, strlen(test_md3_noannotation));
+ tt_mem_op(md1->body, OP_EQ, test_md1, strlen(test_md1));
+ tt_mem_op(md2->body, OP_EQ, test_md2, strlen(test_md2));
+ tt_mem_op(md3->body, OP_EQ, test_md3_noannotation,
strlen(test_md3_noannotation));
tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs.new",
options->DataDirectory);
s = read_file_to_str(fn, RFTS_BIN, NULL);
tt_assert(s);
- tt_mem_op(md1->body, ==, s + md1->off, md1->bodylen);
- tt_mem_op(md2->body, ==, s + md2->off, md2->bodylen);
- tt_mem_op(md3->body, ==, s + md3->off, md3->bodylen);
+ tt_mem_op(md1->body, OP_EQ, s + md1->off, md1->bodylen);
+ tt_mem_op(md2->body, OP_EQ, s + md2->off, md2->bodylen);
+ tt_mem_op(md3->body, OP_EQ, s + md3->off, md3->bodylen);
- tt_ptr_op(md1->family, ==, NULL);
- tt_ptr_op(md3->family, !=, NULL);
- tt_int_op(smartlist_len(md3->family), ==, 3);
- tt_str_op(smartlist_get(md3->family, 0), ==, "nodeX");
+ tt_ptr_op(md1->family, OP_EQ, NULL);
+ tt_ptr_op(md3->family, OP_NE, NULL);
+ tt_int_op(smartlist_len(md3->family), OP_EQ, 3);
+ tt_str_op(smartlist_get(md3->family, 0), OP_EQ, "nodeX");
/* Now rebuild the cache! */
- tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0);
+ tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0);
- tt_int_op(md1->saved_location, ==, SAVED_IN_CACHE);
- tt_int_op(md2->saved_location, ==, SAVED_IN_CACHE);
- tt_int_op(md3->saved_location, ==, SAVED_IN_CACHE);
+ tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE);
+ tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE);
+ tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE);
/* The journal should be empty now */
tor_free(s);
s = read_file_to_str(fn, RFTS_BIN, NULL);
- tt_str_op(s, ==, "");
+ tt_str_op(s, OP_EQ, "");
tor_free(s);
tor_free(fn);
@@ -185,9 +185,9 @@ test_md_cache(void *data)
tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs",
options->DataDirectory);
s = read_file_to_str(fn, RFTS_BIN, NULL);
- tt_mem_op(md1->body, ==, s + md1->off, strlen(test_md1));
- tt_mem_op(md2->body, ==, s + md2->off, strlen(test_md2));
- tt_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation));
+ tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1));
+ tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2));
+ tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation));
/* Okay, now we are going to forget about the cache entirely, and reload it
* from the disk. */
@@ -199,41 +199,41 @@ test_md_cache(void *data)
tt_assert(md1);
tt_assert(md2);
tt_assert(md3);
- tt_mem_op(md1->body, ==, s + md1->off, strlen(test_md1));
- tt_mem_op(md2->body, ==, s + md2->off, strlen(test_md2));
- tt_mem_op(md3->body, ==, s + md3->off, strlen(test_md3_noannotation));
+ tt_mem_op(md1->body, OP_EQ, s + md1->off, strlen(test_md1));
+ tt_mem_op(md2->body, OP_EQ, s + md2->off, strlen(test_md2));
+ tt_mem_op(md3->body, OP_EQ, s + md3->off, strlen(test_md3_noannotation));
- tt_int_op(md1->last_listed, ==, time1);
- tt_int_op(md2->last_listed, ==, time2);
- tt_int_op(md3->last_listed, ==, time3);
+ tt_int_op(md1->last_listed, OP_EQ, time1);
+ tt_int_op(md2->last_listed, OP_EQ, time2);
+ tt_int_op(md3->last_listed, OP_EQ, time3);
/* Okay, now we are going to clear out everything older than a week old.
* In practice, that means md3 */
microdesc_cache_clean(mc, time(NULL)-7*24*60*60, 1/*force*/);
- tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1));
- tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2));
- tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3));
+ tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1));
+ tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2));
+ tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3));
md3 = NULL; /* it's history now! */
/* rebuild again, make sure it stays gone. */
- tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0);
- tt_ptr_op(md1, ==, microdesc_cache_lookup_by_digest256(mc, d1));
- tt_ptr_op(md2, ==, microdesc_cache_lookup_by_digest256(mc, d2));
- tt_ptr_op(NULL, ==, microdesc_cache_lookup_by_digest256(mc, d3));
+ tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0);
+ tt_ptr_op(md1, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d1));
+ tt_ptr_op(md2, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d2));
+ tt_ptr_op(NULL, OP_EQ, microdesc_cache_lookup_by_digest256(mc, d3));
/* Re-add md3, and make sure we can rebuild the cache. */
added = microdescs_add_to_cache(mc, test_md3_noannotation, NULL,
SAVED_NOWHERE, 0, time3, NULL);
- tt_int_op(1, ==, smartlist_len(added));
+ tt_int_op(1, OP_EQ, smartlist_len(added));
md3 = smartlist_get(added, 0);
smartlist_free(added);
added = NULL;
- tt_int_op(md1->saved_location, ==, SAVED_IN_CACHE);
- tt_int_op(md2->saved_location, ==, SAVED_IN_CACHE);
- tt_int_op(md3->saved_location, ==, SAVED_IN_JOURNAL);
+ tt_int_op(md1->saved_location, OP_EQ, SAVED_IN_CACHE);
+ tt_int_op(md2->saved_location, OP_EQ, SAVED_IN_CACHE);
+ tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_JOURNAL);
- tt_int_op(microdesc_cache_rebuild(mc, 1), ==, 0);
- tt_int_op(md3->saved_location, ==, SAVED_IN_CACHE);
+ tt_int_op(microdesc_cache_rebuild(mc, 1), OP_EQ, 0);
+ tt_int_op(md3->saved_location, OP_EQ, SAVED_IN_CACHE);
done:
if (options)
@@ -273,9 +273,9 @@ test_md_cache_broken(void *data)
options->DataDirectory = tor_strdup(get_fname("md_datadir_test2"));
#ifdef _WIN32
- tt_int_op(0, ==, mkdir(options->DataDirectory));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory));
#else
- tt_int_op(0, ==, mkdir(options->DataDirectory, 0700));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700));
#endif
tor_asprintf(&fn, "%s"PATH_SEPARATOR"cached-microdescs",
@@ -375,7 +375,7 @@ test_md_generate(void *arg)
ri = router_parse_entry_from_string(test_ri, NULL, 0, 0, NULL, NULL);
tt_assert(ri);
md = dirvote_create_microdescriptor(ri, 8);
- tt_str_op(md->body, ==, test_md_8);
+ tt_str_op(md->body, OP_EQ, test_md_8);
/* XXXX test family lines. */
/* XXXX test method 14 for A lines. */
@@ -384,12 +384,12 @@ test_md_generate(void *arg)
microdesc_free(md);
md = NULL;
md = dirvote_create_microdescriptor(ri, 16);
- tt_str_op(md->body, ==, test_md_16);
+ tt_str_op(md->body, OP_EQ, test_md_16);
microdesc_free(md);
md = NULL;
md = dirvote_create_microdescriptor(ri, 18);
- tt_str_op(md->body, ==, test_md_18);
+ tt_str_op(md->body, OP_EQ, test_md_18);
done:
microdesc_free(md);
@@ -564,8 +564,8 @@ test_md_parse(void *arg)
smartlist_t *mds = microdescs_parse_from_string(MD_PARSE_TEST_DATA,
NULL, 1, SAVED_NOWHERE,
invalid);
- tt_int_op(smartlist_len(mds), ==, 11);
- tt_int_op(smartlist_len(invalid), ==, 4);
+ tt_int_op(smartlist_len(mds), OP_EQ, 11);
+ tt_int_op(smartlist_len(invalid), OP_EQ, 4);
test_memeq_hex(smartlist_get(invalid,0),
"5d76bf1c6614e885614a1e0ad074e1ab"
@@ -585,11 +585,11 @@ test_md_parse(void *arg)
test_memeq_hex(md->digest,
"54bb6d733ddeb375d2456c79ae103961"
"da0cae29620375ac4cf13d54da4d92b3");
- tt_int_op(md->last_listed, ==, 0);
- tt_int_op(md->saved_location, ==, SAVED_NOWHERE);
- tt_int_op(md->no_save, ==, 0);
- tt_uint_op(md->held_in_map, ==, 0);
- tt_uint_op(md->held_by_nodes, ==, 0);
+ tt_int_op(md->last_listed, OP_EQ, 0);
+ tt_int_op(md->saved_location, OP_EQ, SAVED_NOWHERE);
+ tt_int_op(md->no_save, OP_EQ, 0);
+ tt_uint_op(md->held_in_map, OP_EQ, 0);
+ tt_uint_op(md->held_by_nodes, OP_EQ, 0);
tt_assert(md->onion_curve25519_pkey);
md = smartlist_get(mds, 6);
@@ -609,7 +609,7 @@ test_md_parse(void *arg)
"409ebd87d23925a2732bd467a92813c9"
"21ca378fcb9ca193d354c51550b6d5e9");
tt_assert(tor_addr_family(&md->ipv6_addr) == AF_INET6);
- tt_int_op(md->ipv6_orport, ==, 9090);
+ tt_int_op(md->ipv6_orport, OP_EQ, 9090);
done:
SMARTLIST_FOREACH(mds, microdesc_t *, md, microdesc_free(md));
@@ -667,9 +667,9 @@ test_md_reject_cache(void *arg)
mock_ns_val->flavor = FLAV_MICRODESC;
#ifdef _WIN32
- tt_int_op(0, ==, mkdir(options->DataDirectory));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory));
#else
- tt_int_op(0, ==, mkdir(options->DataDirectory, 0700));
+ tt_int_op(0, OP_EQ, mkdir(options->DataDirectory, 0700));
#endif
MOCK(router_get_mutable_consensus_status_by_descriptor_digest,
@@ -679,7 +679,7 @@ test_md_reject_cache(void *arg)
mc = get_microdesc_cache();
#define ADD(hex) \
do { \
- tt_int_op(0,==,base16_decode(buf,sizeof(buf),hex,strlen(hex))); \
+ tt_int_op(0,OP_EQ,base16_decode(buf,sizeof(buf),hex,strlen(hex))); \
smartlist_add(wanted, tor_memdup(buf, DIGEST256_LEN)); \
} while (0)
@@ -695,16 +695,15 @@ test_md_reject_cache(void *arg)
added = microdescs_add_to_cache(mc, MD_PARSE_TEST_DATA, NULL,
SAVED_NOWHERE, 0, time(NULL), wanted);
- tt_int_op(smartlist_len(added), ==, 2);
- tt_int_op(mock_rgsbd_called, ==, 2);
- tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, ==, 255);
- tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, ==, 255);
+ tt_int_op(smartlist_len(added), OP_EQ, 2);
+ tt_int_op(mock_rgsbd_called, OP_EQ, 2);
+ tt_int_op(mock_rgsbd_val_a->dl_status.n_download_failures, OP_EQ, 255);
+ tt_int_op(mock_rgsbd_val_b->dl_status.n_download_failures, OP_EQ, 255);
done:
UNMOCK(networkstatus_get_latest_consensus_by_flavor);
UNMOCK(router_get_mutable_consensus_status_by_descriptor_digest);
- if (options)
- tor_free(options->DataDirectory);
+ tor_free(options->DataDirectory);
microdesc_free_all();
smartlist_free(added);
SMARTLIST_FOREACH(wanted, char *, cp, tor_free(cp));
diff --git a/src/test/test_nodelist.c b/src/test/test_nodelist.c
index 7c94084a02..a8693ec9b5 100644
--- a/src/test/test_nodelist.c
+++ b/src/test/test_nodelist.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
@@ -10,7 +10,7 @@
#include "nodelist.h"
#include "test.h"
-/** Tese the case when node_get_by_id() returns NULL,
+/** Test the case when node_get_by_id() returns NULL,
* node_get_verbose_nickname_by_id should return the base 16 encoding
* of the id.
*/
@@ -25,7 +25,7 @@ test_nodelist_node_get_verbose_nickname_by_id_null_node(void *arg)
/* make sure node_get_by_id returns NULL */
tt_assert(!node_get_by_id(ID));
node_get_verbose_nickname_by_id(ID, vname);
- tt_str_op(vname,==, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
+ tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA");
done:
return;
}
@@ -54,7 +54,7 @@ test_nodelist_node_get_verbose_nickname_not_named(void *arg)
"\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA\xAA",
DIGEST_LEN);
node_get_verbose_nickname(&mock_node, vname);
- tt_str_op(vname,==, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR");
+ tt_str_op(vname,OP_EQ, "$AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA~TestOR");
done:
return;
diff --git a/src/test/test_ntor_cl.c b/src/test/test_ntor_cl.c
index 2899ad6710..955b508ef0 100644
--- a/src/test/test_ntor_cl.c
+++ b/src/test/test_ntor_cl.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/test/test_oom.c b/src/test/test_oom.c
index 2726056b80..28b4c0435a 100644
--- a/src/test/test_oom.c
+++ b/src/test/test_oom.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Tor Project, Inc. */
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Unit tests for OOM handling logic */
@@ -151,9 +151,9 @@ test_oom_circbuf(void *arg)
options->MaxMemInQueues = 256*packed_cell_mem_cost();
options->CellStatistics = 0;
- tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */
- tt_int_op(cell_queues_get_total_allocation(), ==, 0);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
/* Now we're going to fake up some circuits and get them added to the global
circuit list. */
@@ -165,21 +165,21 @@ test_oom_circbuf(void *arg)
c2 = dummy_or_circuit_new(20, 20);
#ifdef ENABLE_MEMPOOLS
- tt_int_op(packed_cell_mem_cost(), ==,
+ tt_int_op(packed_cell_mem_cost(), OP_EQ,
sizeof(packed_cell_t) + MP_POOL_ITEM_OVERHEAD);
#else
- tt_int_op(packed_cell_mem_cost(), ==,
+ tt_int_op(packed_cell_mem_cost(), OP_EQ,
sizeof(packed_cell_t));
#endif /* ENABLE_MEMPOOLS */
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 70);
- tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */
+ tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */
tv.tv_usec = 20*1000;
tor_gettimeofday_cache_set(&tv);
c3 = dummy_or_circuit_new(100, 85);
- tt_int_op(cell_queues_check_size(), ==, 0); /* We are still not OOM */
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We are still not OOM */
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 255);
tv.tv_usec = 30*1000;
@@ -187,17 +187,17 @@ test_oom_circbuf(void *arg)
/* Adding this cell will trigger our OOM handler. */
c4 = dummy_or_circuit_new(2, 0);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 257);
- tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+ tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */
tt_assert(c1->marked_for_close);
tt_assert(! c2->marked_for_close);
tt_assert(! c3->marked_for_close);
tt_assert(! c4->marked_for_close);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * (257 - 30));
circuit_free(c1);
@@ -208,14 +208,14 @@ test_oom_circbuf(void *arg)
tv.tv_usec = 40*1000; /* go back to the future */
tor_gettimeofday_cache_set(&tv);
- tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+ tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */
tt_assert(c1->marked_for_close);
tt_assert(! c2->marked_for_close);
tt_assert(! c3->marked_for_close);
tt_assert(! c4->marked_for_close);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * (257 - 30));
done:
@@ -250,9 +250,9 @@ test_oom_streambuf(void *arg)
options->MaxMemInQueues = 81*packed_cell_mem_cost() + 4096 * 34;
options->CellStatistics = 0;
- tt_int_op(cell_queues_check_size(), ==, 0); /* We don't start out OOM. */
- tt_int_op(cell_queues_get_total_allocation(), ==, 0);
- tt_int_op(buf_get_total_allocation(), ==, 0);
+ tt_int_op(cell_queues_check_size(), OP_EQ, 0); /* We don't start out OOM. */
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ, 0);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 0);
/* Start all circuits with a bit of data queued in cells */
tv.tv_usec = 500*1000; /* go halfway into the second. */
@@ -267,7 +267,7 @@ test_oom_streambuf(void *arg)
tv.tv_usec = 530*1000;
tor_gettimeofday_cache_set(&tv);
c4 = dummy_or_circuit_new(0,0);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 80);
tv.tv_usec = 600*1000;
@@ -303,24 +303,24 @@ test_oom_streambuf(void *arg)
tv.tv_usec = 0;
tvms = (uint32_t) tv_to_msec(&tv);
- tt_int_op(circuit_max_queued_cell_age(c1, tvms), ==, 500);
- tt_int_op(circuit_max_queued_cell_age(c2, tvms), ==, 490);
- tt_int_op(circuit_max_queued_cell_age(c3, tvms), ==, 480);
- tt_int_op(circuit_max_queued_cell_age(c4, tvms), ==, 0);
+ tt_int_op(circuit_max_queued_cell_age(c1, tvms), OP_EQ, 500);
+ tt_int_op(circuit_max_queued_cell_age(c2, tvms), OP_EQ, 490);
+ tt_int_op(circuit_max_queued_cell_age(c3, tvms), OP_EQ, 480);
+ tt_int_op(circuit_max_queued_cell_age(c4, tvms), OP_EQ, 0);
- tt_int_op(circuit_max_queued_data_age(c1, tvms), ==, 390);
- tt_int_op(circuit_max_queued_data_age(c2, tvms), ==, 380);
- tt_int_op(circuit_max_queued_data_age(c3, tvms), ==, 0);
- tt_int_op(circuit_max_queued_data_age(c4, tvms), ==, 370);
+ tt_int_op(circuit_max_queued_data_age(c1, tvms), OP_EQ, 390);
+ tt_int_op(circuit_max_queued_data_age(c2, tvms), OP_EQ, 380);
+ tt_int_op(circuit_max_queued_data_age(c3, tvms), OP_EQ, 0);
+ tt_int_op(circuit_max_queued_data_age(c4, tvms), OP_EQ, 370);
- tt_int_op(circuit_max_queued_item_age(c1, tvms), ==, 500);
- tt_int_op(circuit_max_queued_item_age(c2, tvms), ==, 490);
- tt_int_op(circuit_max_queued_item_age(c3, tvms), ==, 480);
- tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 370);
+ tt_int_op(circuit_max_queued_item_age(c1, tvms), OP_EQ, 500);
+ tt_int_op(circuit_max_queued_item_age(c2, tvms), OP_EQ, 490);
+ tt_int_op(circuit_max_queued_item_age(c3, tvms), OP_EQ, 480);
+ tt_int_op(circuit_max_queued_item_age(c4, tvms), OP_EQ, 370);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 80);
- tt_int_op(buf_get_total_allocation(), ==, 4096*16*2);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*16*2);
/* Now give c4 a very old buffer of modest size */
{
@@ -332,21 +332,21 @@ test_oom_streambuf(void *arg)
tt_assert(ec);
smartlist_add(edgeconns, ec);
}
- tt_int_op(buf_get_total_allocation(), ==, 4096*17*2);
- tt_int_op(circuit_max_queued_item_age(c4, tvms), ==, 1000);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2);
+ tt_int_op(circuit_max_queued_item_age(c4, tvms), OP_EQ, 1000);
- tt_int_op(cell_queues_check_size(), ==, 0);
+ tt_int_op(cell_queues_check_size(), OP_EQ, 0);
/* And run over the limit. */
tv.tv_usec = 800*1000;
tor_gettimeofday_cache_set(&tv);
c5 = dummy_or_circuit_new(0,5);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 85);
- tt_int_op(buf_get_total_allocation(), ==, 4096*17*2);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*17*2);
- tt_int_op(cell_queues_check_size(), ==, 1); /* We are now OOM */
+ tt_int_op(cell_queues_check_size(), OP_EQ, 1); /* We are now OOM */
/* C4 should have died. */
tt_assert(! c1->marked_for_close);
@@ -355,9 +355,9 @@ test_oom_streambuf(void *arg)
tt_assert(c4->marked_for_close);
tt_assert(! c5->marked_for_close);
- tt_int_op(cell_queues_get_total_allocation(), ==,
+ tt_int_op(cell_queues_get_total_allocation(), OP_EQ,
packed_cell_mem_cost() * 85);
- tt_int_op(buf_get_total_allocation(), ==, 4096*8*2);
+ tt_int_op(buf_get_total_allocation(), OP_EQ, 4096*8*2);
done:
circuit_free(c1);
diff --git a/src/test/test_options.c b/src/test/test_options.c
index 57ab38c027..a8ebadb14b 100644
--- a/src/test/test_options.c
+++ b/src/test/test_options.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define CONFIG_PRIVATE
@@ -87,10 +87,10 @@ test_options_validate_impl(const char *configuration,
clear_log_messages();
r = config_get_lines(configuration, &cl, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
r = config_assign(&options_format, opt, cl, 0, 0, &msg);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
r = options_validate(NULL, opt, dflt, 0, &msg);
if (expect_errmsg && !msg) {
@@ -103,7 +103,7 @@ test_options_validate_impl(const char *configuration,
TT_DIE(("Expected no error message from <%s> but got <%s>.",
configuration, msg));
}
- tt_int_op((r == 0), ==, (msg == NULL));
+ tt_int_op((r == 0), OP_EQ, (msg == NULL));
if (expect_log) {
int found = 0;
diff --git a/src/test/test_policy.c b/src/test/test_policy.c
index c043ac6e3a..33f90c7da5 100644
--- a/src/test/test_policy.c
+++ b/src/test/test_policy.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2013-2014, The Tor Project, Inc. */
+/* Copyright (c) 2013-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -22,7 +22,7 @@ test_short_policy_parse(const char *input,
short_policy = parse_short_policy(input);
tt_assert(short_policy);
out = write_short_policy(short_policy);
- tt_str_op(out, ==, expected);
+ tt_str_op(out, OP_EQ, expected);
done:
tor_free(out);
@@ -50,17 +50,17 @@ test_policy_summary_helper(const char *policy_str,
r = policies_parse_exit_policy(&line, &policy,
EXIT_POLICY_IPV6_ENABLED |
EXIT_POLICY_ADD_DEFAULT ,0);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
summary = policy_summarize(policy, AF_INET);
tt_assert(summary != NULL);
- tt_str_op(summary,==, expected_summary);
+ tt_str_op(summary,OP_EQ, expected_summary);
short_policy = parse_short_policy(summary);
tt_assert(short_policy);
summary_after = write_short_policy(short_policy);
- tt_str_op(summary,==, summary_after);
+ tt_str_op(summary,OP_EQ, summary_after);
done:
tor_free(summary_after);
@@ -90,12 +90,12 @@ test_policies_general(void *arg)
p = router_parse_addr_policy_item_from_string("reject 192.168.0.0/16:*",-1);
tt_assert(p != NULL);
- tt_int_op(ADDR_POLICY_REJECT,==, p->policy_type);
+ tt_int_op(ADDR_POLICY_REJECT,OP_EQ, p->policy_type);
tor_addr_from_ipv4h(&tar, 0xc0a80000u);
- tt_int_op(0,==, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
- tt_int_op(16,==, p->maskbits);
- tt_int_op(1,==, p->prt_min);
- tt_int_op(65535,==, p->prt_max);
+ tt_int_op(0,OP_EQ, tor_addr_compare(&p->addr, &tar, CMP_EXACT));
+ tt_int_op(16,OP_EQ, p->maskbits);
+ tt_int_op(1,OP_EQ, p->prt_min);
+ tt_int_op(65535,OP_EQ, p->prt_max);
smartlist_add(policy, p);
@@ -109,7 +109,7 @@ test_policies_general(void *arg)
tt_assert(ADDR_POLICY_REJECTED ==
compare_tor_addr_to_addr_policy(&tar, 2, policy));
- tt_int_op(0, ==, policies_parse_exit_policy(NULL, &policy2,
+ tt_int_op(0, OP_EQ, policies_parse_exit_policy(NULL, &policy2,
EXIT_POLICY_IPV6_ENABLED |
EXIT_POLICY_REJECT_PRIVATE |
EXIT_POLICY_ADD_DEFAULT, 0));
@@ -200,14 +200,14 @@ test_policies_general(void *arg)
line.key = (char*)"foo";
line.value = (char*)"accept *:80,reject private:*,reject *:*";
line.next = NULL;
- tt_int_op(0, ==, policies_parse_exit_policy(&line,&policy,
+ tt_int_op(0, OP_EQ, policies_parse_exit_policy(&line,&policy,
EXIT_POLICY_IPV6_ENABLED |
EXIT_POLICY_ADD_DEFAULT,0));
tt_assert(policy);
//test_streq(policy->string, "accept *:80");
//test_streq(policy->next->string, "reject *:*");
- tt_int_op(smartlist_len(policy),==, 4);
+ tt_int_op(smartlist_len(policy),OP_EQ, 4);
/* test policy summaries */
/* check if we properly ignore private IP addresses */
@@ -281,7 +281,7 @@ test_policies_general(void *arg)
/* Try parsing various broken short policies */
#define TT_BAD_SHORT_POLICY(s) \
do { \
- tt_ptr_op(NULL, ==, (short_parsed = parse_short_policy((s)))); \
+ tt_ptr_op(NULL, OP_EQ, (short_parsed = parse_short_policy((s)))); \
} while (0)
TT_BAD_SHORT_POLICY("accept 200-199");
TT_BAD_SHORT_POLICY("");
@@ -311,7 +311,7 @@ test_policies_general(void *arg)
smartlist_free(chunks);
short_parsed = parse_short_policy(policy);/* shouldn't be accepted */
tor_free(policy);
- tt_ptr_op(NULL, ==, short_parsed);
+ tt_ptr_op(NULL, OP_EQ, short_parsed);
}
/* truncation ports */
@@ -369,7 +369,7 @@ test_dump_exit_policy_to_string(void *arg)
ri->exit_policy = NULL; // expecting "reject *:*"
ep = router_dump_exit_policy_to_string(ri,1,1);
- tt_str_op("reject *:*",==, ep);
+ tt_str_op("reject *:*",OP_EQ, ep);
tor_free(ep);
@@ -382,7 +382,7 @@ test_dump_exit_policy_to_string(void *arg)
ep = router_dump_exit_policy_to_string(ri,1,1);
- tt_str_op("accept *:*",==, ep);
+ tt_str_op("accept *:*",OP_EQ, ep);
tor_free(ep);
@@ -392,7 +392,7 @@ test_dump_exit_policy_to_string(void *arg)
ep = router_dump_exit_policy_to_string(ri,1,1);
- tt_str_op("accept *:*\nreject *:25",==, ep);
+ tt_str_op("accept *:*\nreject *:25",OP_EQ, ep);
tor_free(ep);
@@ -403,7 +403,7 @@ test_dump_exit_policy_to_string(void *arg)
ep = router_dump_exit_policy_to_string(ri,1,1);
- tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",==, ep);
+ tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*",OP_EQ, ep);
tor_free(ep);
policy_entry =
@@ -414,7 +414,7 @@ test_dump_exit_policy_to_string(void *arg)
ep = router_dump_exit_policy_to_string(ri,1,1);
tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
- "reject6 [fc00::]/7:*",==, ep);
+ "reject6 [fc00::]/7:*",OP_EQ, ep);
tor_free(ep);
policy_entry =
@@ -425,7 +425,7 @@ test_dump_exit_policy_to_string(void *arg)
ep = router_dump_exit_policy_to_string(ri,1,1);
tt_str_op("accept *:*\nreject *:25\nreject 8.8.8.8:*\n"
- "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",==, ep);
+ "reject6 [fc00::]/7:*\naccept6 [c000::]/3:*",OP_EQ, ep);
done:
diff --git a/src/test/test_pt.c b/src/test/test_pt.c
index 1be52ee5bd..996ef8666b 100644
--- a/src/test/test_pt.c
+++ b/src/test/test_pt.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -69,7 +69,7 @@ test_pt_parsing(void *arg)
/* test registered SOCKS version of transport */
tt_assert(transport->socks_version == PROXY_SOCKS5);
/* test registered name of transport */
- tt_str_op(transport->name,==, "trebuchet");
+ tt_str_op(transport->name,OP_EQ, "trebuchet");
reset_mp(mp);
@@ -96,7 +96,7 @@ test_pt_parsing(void *arg)
/* test registered port of transport */
tt_assert(transport->port == 2999);
/* test registered name of transport */
- tt_str_op(transport->name,==, "trebuchy");
+ tt_str_op(transport->name,OP_EQ, "trebuchy");
reset_mp(mp);
@@ -105,14 +105,14 @@ test_pt_parsing(void *arg)
"ARGS:counterweight=3,sling=snappy",
sizeof(line));
tt_assert(parse_smethod_line(line, mp) == 0);
- tt_int_op(1, ==, smartlist_len(mp->transports));
+ tt_int_op(1, OP_EQ, smartlist_len(mp->transports));
{
const transport_t *transport = smartlist_get(mp->transports, 0);
tt_assert(transport);
- tt_str_op(transport->name, ==, "trebuchet");
- tt_int_op(transport->port, ==, 9999);
- tt_str_op(fmt_addr(&transport->addr), ==, "127.0.0.1");
- tt_str_op(transport->extra_info_args, ==,
+ tt_str_op(transport->name, OP_EQ, "trebuchet");
+ tt_int_op(transport->port, OP_EQ, 9999);
+ tt_str_op(fmt_addr(&transport->addr), OP_EQ, "127.0.0.1");
+ tt_str_op(transport->extra_info_args, OP_EQ,
"counterweight=3,sling=snappy");
}
reset_mp(mp);
@@ -151,9 +151,9 @@ test_pt_get_transport_options(void *arg)
execve_args[1] = NULL;
mp = managed_proxy_create(transport_list, execve_args, 1);
- tt_ptr_op(mp, !=, NULL);
+ tt_ptr_op(mp, OP_NE, NULL);
opt_str = get_transport_options_for_server_proxy(mp);
- tt_ptr_op(opt_str, ==, NULL);
+ tt_ptr_op(opt_str, OP_EQ, NULL);
smartlist_add(mp->transports_to_launch, tor_strdup("gruyere"));
smartlist_add(mp->transports_to_launch, tor_strdup("roquefort"));
@@ -176,7 +176,7 @@ test_pt_get_transport_options(void *arg)
options->ServerTransportOptions = cl;
opt_str = get_transport_options_for_server_proxy(mp);
- tt_str_op(opt_str, ==,
+ tt_str_op(opt_str, OP_EQ,
"gruyere:melty=10;gruyere:hardness=se\\;ven;"
"stnectaire:melty=4;stnectaire:hardness=three");
@@ -262,17 +262,17 @@ test_pt_get_extrainfo_string(void *arg)
mp2 = managed_proxy_create(t2, argv2, 1);
r = parse_smethod_line("SMETHOD hagbard 127.0.0.1:5555", mp1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
r = parse_smethod_line("SMETHOD celine 127.0.0.1:1723 ARGS:card=no-enemy",
mp2);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
/* Force these proxies to look "completed" or they won't generate output. */
mp1->conf_state = mp2->conf_state = PT_PROTO_COMPLETED;
s = pt_get_extra_info_descriptor_string();
tt_assert(s);
- tt_str_op(s, ==,
+ tt_str_op(s, OP_EQ,
"transport hagbard 127.0.0.1:5555\n"
"transport celine 127.0.0.1:1723 card=no-enemy\n");
@@ -380,7 +380,7 @@ test_pt_configure_proxy(void *arg)
for (i = 0 ; i < 5 ; i++) {
retval = configure_proxy(mp);
/* retval should be zero because proxy hasn't finished configuring yet */
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
/* check the number of registered transports */
tt_assert(smartlist_len(mp->transports) == i+1);
/* check that the mp is still waiting for transports */
@@ -390,23 +390,23 @@ test_pt_configure_proxy(void *arg)
/* this last configure_proxy() should finalize the proxy configuration. */
retval = configure_proxy(mp);
/* retval should be 1 since the proxy finished configuring */
- tt_int_op(retval, ==, 1);
+ tt_int_op(retval, OP_EQ, 1);
/* check the mp state */
tt_assert(mp->conf_state == PT_PROTO_COMPLETED);
- tt_int_op(controlevent_n, ==, 5);
- tt_int_op(controlevent_event, ==, EVENT_TRANSPORT_LAUNCHED);
- tt_int_op(smartlist_len(controlevent_msgs), ==, 5);
+ tt_int_op(controlevent_n, OP_EQ, 5);
+ tt_int_op(controlevent_event, OP_EQ, EVENT_TRANSPORT_LAUNCHED);
+ tt_int_op(smartlist_len(controlevent_msgs), OP_EQ, 5);
smartlist_sort_strings(controlevent_msgs);
- tt_str_op(smartlist_get(controlevent_msgs, 0), ==,
+ tt_str_op(smartlist_get(controlevent_msgs, 0), OP_EQ,
"650 TRANSPORT_LAUNCHED server mock1 127.0.0.1 5551\r\n");
- tt_str_op(smartlist_get(controlevent_msgs, 1), ==,
+ tt_str_op(smartlist_get(controlevent_msgs, 1), OP_EQ,
"650 TRANSPORT_LAUNCHED server mock2 127.0.0.1 5552\r\n");
- tt_str_op(smartlist_get(controlevent_msgs, 2), ==,
+ tt_str_op(smartlist_get(controlevent_msgs, 2), OP_EQ,
"650 TRANSPORT_LAUNCHED server mock3 127.0.0.1 5553\r\n");
- tt_str_op(smartlist_get(controlevent_msgs, 3), ==,
+ tt_str_op(smartlist_get(controlevent_msgs, 3), OP_EQ,
"650 TRANSPORT_LAUNCHED server mock4 127.0.0.1 5554\r\n");
- tt_str_op(smartlist_get(controlevent_msgs, 4), ==,
+ tt_str_op(smartlist_get(controlevent_msgs, 4), OP_EQ,
"650 TRANSPORT_LAUNCHED server mock5 127.0.0.1 5555\r\n");
{ /* check that the transport info were saved properly in the tor state */
@@ -423,8 +423,8 @@ test_pt_configure_proxy(void *arg)
NULL, 0, 0);
name_of_transport = smartlist_get(transport_info_sl, 0);
bindaddr = smartlist_get(transport_info_sl, 1);
- tt_str_op(name_of_transport, ==, "mock1");
- tt_str_op(bindaddr, ==, "127.0.0.1:5551");
+ tt_str_op(name_of_transport, OP_EQ, "mock1");
+ tt_str_op(bindaddr, OP_EQ, "127.0.0.1:5551");
SMARTLIST_FOREACH(transport_info_sl, char *, cp, tor_free(cp));
smartlist_free(transport_info_sl);
@@ -470,9 +470,9 @@ test_get_pt_proxy_uri(void *arg)
ret = tor_addr_port_lookup(options->Socks4Proxy,
&options->Socks4ProxyAddr,
&options->Socks4ProxyPort);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://192.0.2.1:1080");
+ tt_str_op(uri, OP_EQ, "socks4a://192.0.2.1:1080");
tor_free(uri);
tor_free(options->Socks4Proxy);
@@ -481,16 +481,16 @@ test_get_pt_proxy_uri(void *arg)
ret = tor_addr_port_lookup(options->Socks5Proxy,
&options->Socks5ProxyAddr,
&options->Socks5ProxyPort);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks5://192.0.2.1:1080");
+ tt_str_op(uri, OP_EQ, "socks5://192.0.2.1:1080");
tor_free(uri);
/* Test with a SOCKS5 proxy, with username/password. */
options->Socks5ProxyUsername = tor_strdup("hwest");
options->Socks5ProxyPassword = tor_strdup("r34n1m470r");
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
+ tt_str_op(uri, OP_EQ, "socks5://hwest:r34n1m470r@192.0.2.1:1080");
tor_free(uri);
tor_free(options->Socks5Proxy);
tor_free(options->Socks5ProxyUsername);
@@ -501,15 +501,15 @@ test_get_pt_proxy_uri(void *arg)
ret = tor_addr_port_lookup(options->HTTPSProxy,
&options->HTTPSProxyAddr,
&options->HTTPSProxyPort);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "http://192.0.2.1:80");
+ tt_str_op(uri, OP_EQ, "http://192.0.2.1:80");
tor_free(uri);
/* Test with a HTTPS proxy, with authenticator. */
options->HTTPSProxyAuthenticator = tor_strdup("hwest:r34n1m470r");
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "http://hwest:r34n1m470r@192.0.2.1:80");
+ tt_str_op(uri, OP_EQ, "http://hwest:r34n1m470r@192.0.2.1:80");
tor_free(uri);
tor_free(options->HTTPSProxy);
tor_free(options->HTTPSProxyAuthenticator);
@@ -519,9 +519,9 @@ test_get_pt_proxy_uri(void *arg)
ret = tor_addr_port_lookup(options->Socks4Proxy,
&options->Socks4ProxyAddr,
&options->Socks4ProxyPort);
- tt_int_op(ret, ==, 0);
+ tt_int_op(ret, OP_EQ, 0);
uri = get_pt_proxy_uri();
- tt_str_op(uri, ==, "socks4a://[2001:db8::1]:1080");
+ tt_str_op(uri, OP_EQ, "socks4a://[2001:db8::1]:1080");
tor_free(uri);
tor_free(options->Socks4Proxy);
diff --git a/src/test/test_relay.c b/src/test/test_relay.c
new file mode 100644
index 0000000000..2144ef335e
--- /dev/null
+++ b/src/test/test_relay.c
@@ -0,0 +1,134 @@
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#define CIRCUITBUILD_PRIVATE
+#include "circuitbuild.h"
+#define RELAY_PRIVATE
+#include "relay.h"
+/* For init/free stuff */
+#include "scheduler.h"
+
+/* Test suite stuff */
+#include "test.h"
+#include "fakechans.h"
+
+static or_circuit_t * new_fake_orcirc(channel_t *nchan, channel_t *pchan);
+
+static void test_relay_append_cell_to_circuit_queue(void *arg);
+
+static or_circuit_t *
+new_fake_orcirc(channel_t *nchan, channel_t *pchan)
+{
+ or_circuit_t *orcirc = NULL;
+ circuit_t *circ = NULL;
+
+ orcirc = tor_malloc_zero(sizeof(*orcirc));
+ circ = &(orcirc->base_);
+ circ->magic = OR_CIRCUIT_MAGIC;
+
+ circ->n_chan = nchan;
+ circ->n_circ_id = get_unique_circ_id_by_chan(nchan);
+ circ->n_mux = NULL; /* ?? */
+ cell_queue_init(&(circ->n_chan_cells));
+ circ->n_hop = NULL;
+ circ->streams_blocked_on_n_chan = 0;
+ circ->streams_blocked_on_p_chan = 0;
+ circ->n_delete_pending = 0;
+ circ->p_delete_pending = 0;
+ circ->received_destroy = 0;
+ circ->state = CIRCUIT_STATE_OPEN;
+ circ->purpose = CIRCUIT_PURPOSE_OR;
+ circ->package_window = CIRCWINDOW_START_MAX;
+ circ->deliver_window = CIRCWINDOW_START_MAX;
+ circ->n_chan_create_cell = NULL;
+
+ orcirc->p_chan = pchan;
+ orcirc->p_circ_id = get_unique_circ_id_by_chan(pchan);
+ cell_queue_init(&(orcirc->p_chan_cells));
+
+ return orcirc;
+}
+
+static void
+test_relay_append_cell_to_circuit_queue(void *arg)
+{
+ channel_t *nchan = NULL, *pchan = NULL;
+ or_circuit_t *orcirc = NULL;
+ cell_t *cell = NULL;
+ int old_count, new_count;
+
+ (void)arg;
+
+ /* We'll need the cell pool for append_cell_to_circuit_queue() to work */
+#ifdef ENABLE_MEMPOOLS
+ init_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ /* Make fake channels to be nchan and pchan for the circuit */
+ nchan = new_fake_channel();
+ tt_assert(nchan);
+
+ pchan = new_fake_channel();
+ tt_assert(pchan);
+
+ /* We'll need chans with working cmuxes */
+ nchan->cmux = circuitmux_alloc();
+ pchan->cmux = circuitmux_alloc();
+
+ /* Make a fake orcirc */
+ orcirc = new_fake_orcirc(nchan, pchan);
+ tt_assert(orcirc);
+
+ /* Make a cell */
+ cell = tor_malloc_zero(sizeof(cell_t));
+ make_fake_cell(cell);
+
+ MOCK(scheduler_channel_has_waiting_cells,
+ scheduler_channel_has_waiting_cells_mock);
+
+ /* Append it */
+ old_count = get_mock_scheduler_has_waiting_cells_count();
+ append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), nchan, cell,
+ CELL_DIRECTION_OUT, 0);
+ new_count = get_mock_scheduler_has_waiting_cells_count();
+ tt_int_op(new_count, ==, old_count + 1);
+
+ /* Now try the reverse direction */
+ old_count = get_mock_scheduler_has_waiting_cells_count();
+ append_cell_to_circuit_queue(TO_CIRCUIT(orcirc), pchan, cell,
+ CELL_DIRECTION_IN, 0);
+ new_count = get_mock_scheduler_has_waiting_cells_count();
+ tt_int_op(new_count, ==, old_count + 1);
+
+ UNMOCK(scheduler_channel_has_waiting_cells);
+
+ /* Get rid of the fake channels */
+ MOCK(scheduler_release_channel, scheduler_release_channel_mock);
+ channel_mark_for_close(nchan);
+ channel_mark_for_close(pchan);
+ UNMOCK(scheduler_release_channel);
+
+ /* Shut down channels */
+ channel_free_all();
+
+ done:
+ tor_free(cell);
+ cell_queue_clear(&orcirc->base_.n_chan_cells);
+ cell_queue_clear(&orcirc->p_chan_cells);
+ tor_free(orcirc);
+ free_fake_channel(nchan);
+ free_fake_channel(pchan);
+#ifdef ENABLE_MEMPOOLS
+ free_cell_pool();
+#endif /* ENABLE_MEMPOOLS */
+
+ return;
+}
+
+struct testcase_t relay_tests[] = {
+ { "append_cell_to_circuit_queue", test_relay_append_cell_to_circuit_queue,
+ TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_relaycell.c b/src/test/test_relaycell.c
index 5deb36260f..0a6fef729c 100644
--- a/src/test/test_relaycell.c
+++ b/src/test/test_relaycell.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2014, The Tor Project, Inc. */
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/* Unit tests for handling different kinds of relay cell */
@@ -87,24 +87,24 @@ test_relaycell_resolved(void *arg)
srm_ncalls = mum_ncalls = 0; \
} while (0)
#define ASSERT_MARK_CALLED(reason) do { \
- tt_int_op(mum_ncalls, ==, 1); \
- tt_ptr_op(mum_conn, ==, entryconn); \
- tt_int_op(mum_endreason, ==, (reason)); \
+ tt_int_op(mum_ncalls, OP_EQ, 1); \
+ tt_ptr_op(mum_conn, OP_EQ, entryconn); \
+ tt_int_op(mum_endreason, OP_EQ, (reason)); \
} while (0)
#define ASSERT_RESOLVED_CALLED(atype, answer, ttl, expires) do { \
- tt_int_op(srm_ncalls, ==, 1); \
- tt_ptr_op(srm_conn, ==, entryconn); \
- tt_int_op(srm_atype, ==, (atype)); \
+ tt_int_op(srm_ncalls, OP_EQ, 1); \
+ tt_ptr_op(srm_conn, OP_EQ, entryconn); \
+ tt_int_op(srm_atype, OP_EQ, (atype)); \
if (answer) { \
- tt_int_op(srm_alen, ==, sizeof(answer)-1); \
- tt_int_op(srm_alen, <, 512); \
- tt_int_op(srm_answer_is_set, ==, 1); \
- tt_mem_op(srm_answer, ==, answer, sizeof(answer)-1); \
+ tt_int_op(srm_alen, OP_EQ, sizeof(answer)-1); \
+ tt_int_op(srm_alen, OP_LT, 512); \
+ tt_int_op(srm_answer_is_set, OP_EQ, 1); \
+ tt_mem_op(srm_answer, OP_EQ, answer, sizeof(answer)-1); \
} else { \
- tt_int_op(srm_answer_is_set, ==, 0); \
+ tt_int_op(srm_answer_is_set, OP_EQ, 0); \
} \
- tt_int_op(srm_ttl, ==, ttl); \
- tt_int_op(srm_expires, ==, expires); \
+ tt_int_op(srm_ttl, OP_EQ, ttl); \
+ tt_i64_op(srm_expires, OP_EQ, expires); \
} while (0)
(void)arg;
@@ -130,21 +130,21 @@ test_relaycell_resolved(void *arg)
/* Try with connection in non-RESOLVE_WAIT state: cell gets ignored */
MOCK_RESET();
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
- tt_int_op(srm_ncalls, ==, 0);
- tt_int_op(mum_ncalls, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(srm_ncalls, OP_EQ, 0);
+ tt_int_op(mum_ncalls, OP_EQ, 0);
/* Now put it in the right state. */
ENTRY_TO_CONN(entryconn)->state = AP_CONN_STATE_RESOLVE_WAIT;
entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE;
- entryconn->ipv4_traffic_ok = 1;
- entryconn->ipv6_traffic_ok = 1;
- entryconn->prefer_ipv6_traffic = 0;
+ entryconn->entry_cfg.ipv4_traffic = 1;
+ entryconn->entry_cfg.ipv6_traffic = 1;
+ entryconn->entry_cfg.prefer_ipv6 = 0;
/* We prefer ipv4, so we should get the first ipv4 answer */
MOCK_RESET();
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x7f\x00\x01\x02", 256, -1);
@@ -153,16 +153,16 @@ test_relaycell_resolved(void *arg)
MOCK_RESET();
options->ClientDNSRejectInternalAddresses = 1;
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1);
/* now prefer ipv6, and get the first ipv6 answer */
- entryconn->prefer_ipv6_traffic = 1;
+ entryconn->entry_cfg.prefer_ipv6 = 1;
MOCK_RESET();
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV6,
@@ -174,7 +174,7 @@ test_relaycell_resolved(void *arg)
MOCK_RESET();
SET_CELL("\x04\x04\x12\x00\x00\x01\x00\x00\x02\x00");
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_IPV4, "\x12\x00\x00\x01", 512, -1);
@@ -182,19 +182,19 @@ test_relaycell_resolved(void *arg)
/* But if we don't allow IPv4, we report nothing if the cell contains only
* ipv4 */
MOCK_RESET();
- entryconn->ipv4_traffic_ok = 0;
+ entryconn->entry_cfg.ipv4_traffic = 0;
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1);
/* If we wanted hostnames, we report nothing, since we only had IPs. */
MOCK_RESET();
- entryconn->ipv4_traffic_ok = 1;
+ entryconn->entry_cfg.ipv4_traffic = 1;
entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE_PTR;
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR, NULL, -1, -1);
@@ -203,7 +203,7 @@ test_relaycell_resolved(void *arg)
MOCK_RESET();
SET_CELL("\x00\x0fwww.example.com\x00\x01\x00\x00");
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_HOSTNAME, "www.example.com", 65536, -1);
@@ -213,9 +213,9 @@ test_relaycell_resolved(void *arg)
entryconn->socks_request->command = SOCKS_COMMAND_RESOLVE;
SET_CELL("\x04\x04\x01\x02\x03\x04"); /* no ttl */
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL);
- tt_int_op(srm_ncalls, ==, 0);
+ tt_int_op(srm_ncalls, OP_EQ, 0);
/* error on all addresses private */
MOCK_RESET();
@@ -224,7 +224,7 @@ test_relaycell_resolved(void *arg)
/* IPv4: 192.168.1.1, ttl 256 */
"\x04\x04\xc0\xa8\x01\x01\x00\x00\x01\x00");
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_TORPROTOCOL);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, 0, TIME_MAX);
@@ -232,7 +232,7 @@ test_relaycell_resolved(void *arg)
MOCK_RESET();
SET_CELL("\xf0\x15" "quiet and meaningless" "\x00\x00\x0f\xff");
r = connection_edge_process_resolved_cell(edgeconn, &cell, &rh);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
ASSERT_MARK_CALLED(END_STREAM_REASON_DONE|
END_STREAM_REASON_FLAG_ALREADY_SOCKS_REPLIED);
ASSERT_RESOLVED_CALLED(RESOLVED_TYPE_ERROR_TRANSIENT, NULL, -1, -1);
diff --git a/src/test/test_replay.c b/src/test/test_replay.c
index bb8017d261..a02c160365 100644
--- a/src/test/test_replay.c
+++ b/src/test/test_replay.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2012-2014, The Tor Project, Inc. */
+/* Copyright (c) 2012-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#define REPLAYCACHE_PRIVATE
@@ -44,7 +44,7 @@ test_replaycache_badalloc(void *arg)
/* Negative interval should get adjusted to zero */
r = replaycache_new(600, -300);
tt_assert(r != NULL);
- tt_int_op(r->scrub_interval,==, 0);
+ tt_int_op(r->scrub_interval,OP_EQ, 0);
replaycache_free(r);
/* Negative horizon and negative interval should still fail */
r = replaycache_new(-600, -300);
@@ -81,13 +81,13 @@ test_replaycache_miss(void *arg)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
/* poke the bad-parameter error case too */
result =
replaycache_add_and_test_internal(1200, NULL, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
done:
if (r) replaycache_free(r);
@@ -108,12 +108,12 @@ test_replaycache_hit(void *arg)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
done:
if (r) replaycache_free(r);
@@ -134,17 +134,17 @@ test_replaycache_age(void *arg)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
done:
if (r) replaycache_free(r);
@@ -166,13 +166,13 @@ test_replaycache_elapsed(void *arg)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
strlen(test_buffer), &elapsed);
- tt_int_op(result,==, 1);
- tt_int_op(elapsed,==, 100);
+ tt_int_op(result,OP_EQ, 1);
+ tt_int_op(elapsed,OP_EQ, 100);
done:
if (r) replaycache_free(r);
@@ -193,17 +193,17 @@ test_replaycache_noexpire(void *arg)
result =
replaycache_add_and_test_internal(1200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
result =
replaycache_add_and_test_internal(1300, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
result =
replaycache_add_and_test_internal(3000, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
done:
if (r) replaycache_free(r);
@@ -225,12 +225,12 @@ test_replaycache_scrub(void *arg)
result =
replaycache_add_and_test_internal(100, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
result =
replaycache_add_and_test_internal(200, r, test_buffer,
strlen(test_buffer), NULL);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
/*
* Poke a few replaycache_scrub_if_needed_internal() error cases that
@@ -245,7 +245,7 @@ test_replaycache_scrub(void *arg)
/* Make sure we hit the aging-out case too */
replaycache_scrub_if_needed_internal(1500, r);
/* Assert that we aged it */
- tt_int_op(digestmap_size(r->digests_seen),==, 0);
+ tt_int_op(digestmap_size(r->digests_seen),OP_EQ, 0);
done:
if (r) replaycache_free(r);
@@ -268,16 +268,16 @@ test_replaycache_future(void *arg)
result =
replaycache_add_and_test_internal(100, r, test_buffer,
strlen(test_buffer), &elapsed);
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
/* elapsed should still be 0, since it wasn't written */
- tt_int_op(elapsed,==, 0);
+ tt_int_op(elapsed,OP_EQ, 0);
result =
replaycache_add_and_test_internal(200, r, test_buffer,
strlen(test_buffer), &elapsed);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
/* elapsed should be the time since the last hit */
- tt_int_op(elapsed,==, 100);
+ tt_int_op(elapsed,OP_EQ, 100);
/*
* Now let's turn the clock back to get coverage on the cache entry from the
@@ -287,9 +287,9 @@ test_replaycache_future(void *arg)
replaycache_add_and_test_internal(150, r, test_buffer,
strlen(test_buffer), &elapsed);
/* We should still get a hit */
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
/* ...but it shouldn't let us see a negative elapsed time */
- tt_int_op(elapsed,==, 0);
+ tt_int_op(elapsed,OP_EQ, 0);
done:
if (r) replaycache_free(r);
@@ -316,18 +316,18 @@ test_replaycache_realtime(void *arg)
/* This should miss */
result =
replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
- tt_int_op(result,==, 0);
+ tt_int_op(result,OP_EQ, 0);
/* This should hit */
result =
replaycache_add_and_test(r, test_buffer, strlen(test_buffer));
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
/* This should hit and return a small elapsed time */
result =
replaycache_add_test_and_elapsed(r, test_buffer,
strlen(test_buffer), &elapsed);
- tt_int_op(result,==, 1);
+ tt_int_op(result,OP_EQ, 1);
tt_assert(elapsed >= 0);
tt_assert(elapsed <= 5);
diff --git a/src/test/test_routerkeys.c b/src/test/test_routerkeys.c
index 652d7d6c52..60b6bb5a72 100644
--- a/src/test/test_routerkeys.c
+++ b/src/test/test_routerkeys.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -33,38 +33,38 @@ test_routerkeys_write_fingerprint(void *arg)
set_server_identity_key(key);
set_client_identity_key(crypto_pk_dup_key(key));
- tt_int_op(0, ==, check_private_dir(ddir, CPD_CREATE, NULL));
- tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),==,0);
+ tt_int_op(0, OP_EQ, check_private_dir(ddir, CPD_CREATE, NULL));
+ tt_int_op(crypto_pk_cmp_keys(get_server_identity_key(),key),OP_EQ,0);
/* Write fingerprint file */
- tt_int_op(0, ==, router_write_fingerprint(0));
+ tt_int_op(0, OP_EQ, router_write_fingerprint(0));
cp = read_file_to_str(get_fname("write_fingerprint/fingerprint"),
0, NULL);
crypto_pk_get_fingerprint(key, fp, 0);
tor_asprintf(&cp2, "haflinger %s\n", fp);
- tt_str_op(cp, ==, cp2);
+ tt_str_op(cp, OP_EQ, cp2);
tor_free(cp);
tor_free(cp2);
/* Write hashed-fingerprint file */
- tt_int_op(0, ==, router_write_fingerprint(1));
+ tt_int_op(0, OP_EQ, router_write_fingerprint(1));
cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"),
0, NULL);
crypto_pk_get_hashed_fingerprint(key, fp);
tor_asprintf(&cp2, "haflinger %s\n", fp);
- tt_str_op(cp, ==, cp2);
+ tt_str_op(cp, OP_EQ, cp2);
tor_free(cp);
tor_free(cp2);
/* Replace outdated file */
write_str_to_file(get_fname("write_fingerprint/hashed-fingerprint"),
"junk goes here", 0);
- tt_int_op(0, ==, router_write_fingerprint(1));
+ tt_int_op(0, OP_EQ, router_write_fingerprint(1));
cp = read_file_to_str(get_fname("write_fingerprint/hashed-fingerprint"),
0, NULL);
crypto_pk_get_hashed_fingerprint(key, fp);
tor_asprintf(&cp2, "haflinger %s\n", fp);
- tt_str_op(cp, ==, cp2);
+ tt_str_op(cp, OP_EQ, cp2);
tor_free(cp);
tor_free(cp2);
diff --git a/src/test/test_routerlist.c b/src/test/test_routerlist.c
new file mode 100644
index 0000000000..381a592c5b
--- /dev/null
+++ b/src/test/test_routerlist.c
@@ -0,0 +1,103 @@
+/* Copyright (c) 2014, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#define ROUTERLIST_PRIVATE
+#include "or.h"
+#include "routerlist.h"
+#include "directory.h"
+#include "test.h"
+
+/* 4 digests + 3 sep + pre + post + NULL */
+static char output[4*BASE64_DIGEST256_LEN+3+2+2+1];
+
+static void
+mock_get_from_dirserver(uint8_t dir_purpose, uint8_t router_purpose,
+ const char *resource, int pds_flags)
+{
+ (void)dir_purpose;
+ (void)router_purpose;
+ (void)pds_flags;
+ tt_assert(resource);
+ strlcpy(output, resource, sizeof(output));
+ done:
+ ;
+}
+
+static void
+test_routerlist_initiate_descriptor_downloads(void *arg)
+{
+ const char *prose = "unhurried and wise, we perceive.";
+ smartlist_t *digests = smartlist_new();
+ (void)arg;
+
+ for (int i = 0; i < 20; i++) {
+ smartlist_add(digests, (char*)prose);
+ }
+
+ MOCK(directory_get_from_dirserver, mock_get_from_dirserver);
+ initiate_descriptor_downloads(NULL, DIR_PURPOSE_FETCH_MICRODESC,
+ digests, 3, 7, 0);
+ UNMOCK(directory_get_from_dirserver);
+
+ tt_str_op(output, OP_EQ, "d/"
+ "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
+ "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
+ "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4-"
+ "dW5odXJyaWVkIGFuZCB3aXNlLCB3ZSBwZXJjZWl2ZS4"
+ ".z");
+
+ done:
+ smartlist_free(digests);
+}
+
+static int count = 0;
+
+static void
+mock_initiate_descriptor_downloads(const routerstatus_t *source,
+ int purpose, smartlist_t *digests,
+ int lo, int hi, int pds_flags)
+{
+ (void)source;
+ (void)purpose;
+ (void)digests;
+ (void)pds_flags;
+ (void)hi;
+ (void)lo;
+ count += 1;
+}
+
+static void
+test_routerlist_launch_descriptor_downloads(void *arg)
+{
+ smartlist_t *downloadable = smartlist_new();
+ time_t now = time(NULL);
+ char *cp;
+ (void)arg;
+
+ for (int i = 0; i < 100; i++) {
+ cp = tor_malloc(DIGEST256_LEN);
+ tt_assert(cp);
+ crypto_rand(cp, DIGEST256_LEN);
+ smartlist_add(downloadable, cp);
+ }
+
+ MOCK(initiate_descriptor_downloads, mock_initiate_descriptor_downloads);
+ launch_descriptor_downloads(DIR_PURPOSE_FETCH_MICRODESC, downloadable,
+ NULL, now);
+ tt_int_op(3, ==, count);
+ UNMOCK(initiate_descriptor_downloads);
+
+ done:
+ SMARTLIST_FOREACH(downloadable, char *, cp1, tor_free(cp1));
+ smartlist_free(downloadable);
+}
+
+#define NODE(name, flags) \
+ { #name, test_routerlist_##name, (flags), NULL, NULL }
+
+struct testcase_t routerlist_tests[] = {
+ NODE(initiate_descriptor_downloads, 0),
+ NODE(launch_descriptor_downloads, 0),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_routerset.c b/src/test/test_routerset.c
index 81e4dbb1eb..9bd0c125c3 100644
--- a/src/test/test_routerset.c
+++ b/src/test/test_routerset.c
@@ -25,12 +25,12 @@ NS(test_main)(void *arg)
rs = routerset_new();
- tt_ptr_op(rs, !=, NULL);
- tt_ptr_op(rs->list, !=, NULL);
- tt_ptr_op(rs->names, !=, NULL);
- tt_ptr_op(rs->digests, !=, NULL);
- tt_ptr_op(rs->policies, !=, NULL);
- tt_ptr_op(rs->country_names, !=, NULL);
+ tt_ptr_op(rs, OP_NE, NULL);
+ tt_ptr_op(rs->list, OP_NE, NULL);
+ tt_ptr_op(rs->names, OP_NE, NULL);
+ tt_ptr_op(rs->digests, OP_NE, NULL);
+ tt_ptr_op(rs->policies, OP_NE, NULL);
+ tt_ptr_op(rs->country_names, OP_NE, NULL);
done:
routerset_free(rs);
@@ -53,30 +53,30 @@ NS(test_main)(void *arg)
/* strlen(c) < 4 */
input = "xxx";
name = routerset_get_countryname(input);
- tt_ptr_op(name, ==, NULL);
+ tt_ptr_op(name, OP_EQ, NULL);
tor_free(name);
/* c[0] != '{' */
input = "xxx}";
name = routerset_get_countryname(input);
- tt_ptr_op(name, ==, NULL);
+ tt_ptr_op(name, OP_EQ, NULL);
tor_free(name);
/* c[3] != '}' */
input = "{xxx";
name = routerset_get_countryname(input);
- tt_ptr_op(name, ==, NULL);
+ tt_ptr_op(name, OP_EQ, NULL);
tor_free(name);
/* tor_strlower */
input = "{XX}";
name = routerset_get_countryname(input);
- tt_str_op(name, ==, "xx");
+ tt_str_op(name, OP_EQ, "xx");
tor_free(name);
input = "{xx}";
name = routerset_get_countryname(input);
- tt_str_op(name, ==, "xx");
+ tt_str_op(name, OP_EQ, "xx");
done:
tor_free(name);
}
@@ -103,10 +103,10 @@ NS(test_main)(void *arg)
routerset_refresh_countries(set);
- tt_ptr_op(set->countries, ==, NULL);
- tt_int_op(set->n_countries, ==, 0);
- tt_int_op(CALLED(geoip_is_loaded), ==, 1);
- tt_int_op(CALLED(geoip_get_n_countries), ==, 0);
+ tt_ptr_op(set->countries, OP_EQ, NULL);
+ tt_int_op(set->n_countries, OP_EQ, 0);
+ tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 0);
done:
NS_UNMOCK(geoip_is_loaded);
@@ -154,12 +154,12 @@ NS(test_main)(void *arg)
routerset_refresh_countries(set);
- tt_ptr_op(set->countries, !=, NULL);
- tt_int_op(set->n_countries, ==, 1);
- tt_int_op((unsigned int)(*set->countries), ==, 0);
- tt_int_op(CALLED(geoip_is_loaded), ==, 1);
- tt_int_op(CALLED(geoip_get_n_countries), ==, 1);
- tt_int_op(CALLED(geoip_get_country), ==, 0);
+ tt_ptr_op(set->countries, OP_NE, NULL);
+ tt_int_op(set->n_countries, OP_EQ, 1);
+ tt_int_op((unsigned int)(*set->countries), OP_EQ, 0);
+ tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_country), OP_EQ, 0);
done:
NS_UNMOCK(geoip_is_loaded);
@@ -218,12 +218,12 @@ NS(test_main)(void *arg)
routerset_refresh_countries(set);
- tt_ptr_op(set->countries, !=, NULL);
- tt_int_op(set->n_countries, ==, 2);
- tt_int_op(CALLED(geoip_is_loaded), ==, 1);
- tt_int_op(CALLED(geoip_get_n_countries), ==, 1);
- tt_int_op(CALLED(geoip_get_country), ==, 1);
- tt_int_op((unsigned int)(*set->countries), !=, 0);
+ tt_ptr_op(set->countries, OP_NE, NULL);
+ tt_int_op(set->n_countries, OP_EQ, 2);
+ tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_country), OP_EQ, 1);
+ tt_int_op((unsigned int)(*set->countries), OP_NE, 0);
done:
NS_UNMOCK(geoip_is_loaded);
@@ -283,12 +283,12 @@ NS(test_main)(void *arg)
routerset_refresh_countries(set);
- tt_ptr_op(set->countries, !=, NULL);
- tt_int_op(set->n_countries, ==, 2);
- tt_int_op(CALLED(geoip_is_loaded), ==, 1);
- tt_int_op(CALLED(geoip_get_n_countries), ==, 1);
- tt_int_op(CALLED(geoip_get_country), ==, 1);
- tt_int_op((unsigned int)(*set->countries), ==, 0);
+ tt_ptr_op(set->countries, OP_NE, NULL);
+ tt_int_op(set->n_countries, OP_EQ, 2);
+ tt_int_op(CALLED(geoip_is_loaded), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_n_countries), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_country), OP_EQ, 1);
+ tt_int_op((unsigned int)(*set->countries), OP_EQ, 0);
done:
NS_UNMOCK(geoip_is_loaded);
@@ -340,7 +340,7 @@ NS(test_main)(void *arg)
r = routerset_parse(set, s, "");
- tt_int_op(r, ==, -1);
+ tt_int_op(r, OP_EQ, -1);
done:
routerset_free(set);
@@ -365,8 +365,8 @@ NS(test_main)(void *arg)
set = routerset_new();
s = "$0000000000000000000000000000000000000000";
r = routerset_parse(set, s, "");
- tt_int_op(r, ==, 0);
- tt_int_op(digestmap_isempty(set->digests), !=, 1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(digestmap_isempty(set->digests), OP_NE, 1);
done:
routerset_free(set);
@@ -390,8 +390,8 @@ NS(test_main)(void *arg)
set = routerset_new();
s = "fred";
r = routerset_parse(set, s, "");
- tt_int_op(r, ==, 0);
- tt_int_op(strmap_isempty(set->names), !=, 1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(strmap_isempty(set->names), OP_NE, 1);
done:
routerset_free(set);
@@ -415,8 +415,8 @@ NS(test_main)(void *arg)
set = routerset_new();
s = "{cc}";
r = routerset_parse(set, s, "");
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(set->country_names), !=, 0);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(set->country_names), OP_NE, 0);
done:
routerset_free(set);
@@ -448,9 +448,9 @@ NS(test_main)(void *arg)
set = routerset_new();
s = "*";
r = routerset_parse(set, s, "");
- tt_int_op(r, ==, 0);
- tt_int_op(smartlist_len(set->policies), !=, 0);
- tt_int_op(CALLED(router_parse_addr_policy_item_from_string), ==, 1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(smartlist_len(set->policies), OP_NE, 0);
+ tt_int_op(CALLED(router_parse_addr_policy_item_from_string), OP_EQ, 1);
done:
routerset_free(set);
@@ -489,10 +489,10 @@ NS(test_main)(void *arg)
NS_MOCK(smartlist_new);
routerset_union(set, NULL);
- tt_int_op(CALLED(smartlist_new), ==, 0);
+ tt_int_op(CALLED(smartlist_new), OP_EQ, 0);
routerset_union(set, bad_set);
- tt_int_op(CALLED(smartlist_new), ==, 0);
+ tt_int_op(CALLED(smartlist_new), OP_EQ, 0);
done:
NS_UNMOCK(smartlist_new);
@@ -529,7 +529,7 @@ NS(test_main)(void *arg)
smartlist_add(src->list, tor_strdup("{xx}"));
routerset_union(tgt, src);
- tt_int_op(smartlist_len(tgt->list), !=, 0);
+ tt_int_op(smartlist_len(tgt->list), OP_NE, 0);
done:
routerset_free(src);
@@ -556,7 +556,7 @@ NS(test_main)(void *arg)
is_list = routerset_is_list(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_list, !=, 0);
+ tt_int_op(is_list, OP_NE, 0);
/* len(set->country_names) != 0, len(set->policies) == 0 */
set = routerset_new();
@@ -564,7 +564,7 @@ NS(test_main)(void *arg)
is_list = routerset_is_list(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_list, ==, 0);
+ tt_int_op(is_list, OP_EQ, 0);
/* len(set->country_names) == 0, len(set->policies) != 0 */
set = routerset_new();
@@ -573,7 +573,7 @@ NS(test_main)(void *arg)
is_list = routerset_is_list(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_list, ==, 0);
+ tt_int_op(is_list, OP_EQ, 0);
/* len(set->country_names) != 0, len(set->policies) != 0 */
set = routerset_new();
@@ -583,7 +583,7 @@ NS(test_main)(void *arg)
is_list = routerset_is_list(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_list, ==, 0);
+ tt_int_op(is_list, OP_EQ, 0);
done:
;
@@ -605,12 +605,12 @@ NS(test_main)(void *arg)
set = NULL;
needs_geoip = routerset_needs_geoip(set);
- tt_int_op(needs_geoip, ==, 0);
+ tt_int_op(needs_geoip, OP_EQ, 0);
set = routerset_new();
needs_geoip = routerset_needs_geoip(set);
routerset_free((routerset_t *)set);
- tt_int_op(needs_geoip, ==, 0);
+ tt_int_op(needs_geoip, OP_EQ, 0);
set = NULL;
set = routerset_new();
@@ -618,7 +618,7 @@ NS(test_main)(void *arg)
needs_geoip = routerset_needs_geoip(set);
routerset_free((routerset_t *)set);
set = NULL;
- tt_int_op(needs_geoip, !=, 0);
+ tt_int_op(needs_geoip, OP_NE, 0);
done:
;
@@ -639,20 +639,20 @@ NS(test_main)(void *arg)
(void)arg;
is_empty = routerset_is_empty(set);
- tt_int_op(is_empty, !=, 0);
+ tt_int_op(is_empty, OP_NE, 0);
set = routerset_new();
is_empty = routerset_is_empty(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_empty, !=, 0);
+ tt_int_op(is_empty, OP_NE, 0);
set = routerset_new();
smartlist_add(set->list, tor_strdup("{xx}"));
is_empty = routerset_is_empty(set);
routerset_free(set);
set = NULL;
- tt_int_op(is_empty, ==, 0);
+ tt_int_op(is_empty, OP_EQ, 0);
done:
;
@@ -675,13 +675,13 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, NULL, NULL, 0);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
set = tor_malloc_zero(sizeof(routerset_t));
set->list = NULL;
contains = routerset_contains(set, NULL, 0, NULL, NULL, 0);
tor_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
@@ -706,7 +706,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, nickname, NULL, 0);
routerset_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
@@ -733,7 +733,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, nickname, NULL, 0);
routerset_free(set);
- tt_int_op(contains, ==, 4);
+ tt_int_op(contains, OP_EQ, 4);
done:
;
}
@@ -757,7 +757,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, "foo", NULL, 0);
routerset_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
}
@@ -782,7 +782,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0);
routerset_free(set);
- tt_int_op(contains, ==, 4);
+ tt_int_op(contains, OP_EQ, 4);
done:
;
}
@@ -808,7 +808,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, NULL, (const char*)foo, 0);
routerset_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
}
@@ -833,7 +833,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, NULL, NULL, 0);
routerset_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
}
@@ -865,8 +865,8 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, addr, 0, NULL, NULL, 0);
routerset_free(set);
- tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1);
- tt_int_op(contains, ==, 3);
+ tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1);
+ tt_int_op(contains, OP_EQ, 3);
done:
;
@@ -879,7 +879,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port,
(void)port;
(void)policy;
CALLED(compare_tor_addr_to_addr_policy)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
return ADDR_POLICY_REJECTED;
done:
@@ -910,8 +910,8 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, addr, 0, NULL, NULL, 0);
routerset_free(set);
- tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1);
- tt_int_op(contains, ==, 0);
+ tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
@@ -924,7 +924,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port,
(void)port;
(void)policy;
CALLED(compare_tor_addr_to_addr_policy)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
return ADDR_POLICY_ACCEPTED;
@@ -955,7 +955,7 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, NULL, 0, NULL, NULL, 0);
routerset_free(set);
- tt_int_op(contains, ==, 0);
+ tt_int_op(contains, OP_EQ, 0);
done:
;
@@ -968,7 +968,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port,
(void)port;
(void)policy;
CALLED(compare_tor_addr_to_addr_policy)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
return ADDR_POLICY_ACCEPTED;
@@ -1003,9 +1003,9 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1);
routerset_free(set);
- tt_int_op(contains, ==, 0);
- tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1);
- tt_int_op(CALLED(geoip_get_country_by_addr), ==, 1);
+ tt_int_op(contains, OP_EQ, 0);
+ tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1);
done:
;
@@ -1018,7 +1018,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port,
(void)port;
(void)policy;
CALLED(compare_tor_addr_to_addr_policy)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
done:
return ADDR_POLICY_ACCEPTED;
@@ -1028,7 +1028,7 @@ int
NS(geoip_get_country_by_addr)(const tor_addr_t *addr)
{
CALLED(geoip_get_country_by_addr)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
done:
return -1;
@@ -1062,9 +1062,9 @@ NS(test_main)(void *arg)
contains = routerset_contains(set, MOCK_TOR_ADDR_PTR, 0, NULL, NULL, -1);
routerset_free(set);
- tt_int_op(contains, ==, 2);
- tt_int_op(CALLED(compare_tor_addr_to_addr_policy), ==, 1);
- tt_int_op(CALLED(geoip_get_country_by_addr), ==, 1);
+ tt_int_op(contains, OP_EQ, 2);
+ tt_int_op(CALLED(compare_tor_addr_to_addr_policy), OP_EQ, 1);
+ tt_int_op(CALLED(geoip_get_country_by_addr), OP_EQ, 1);
done:
;
@@ -1077,7 +1077,7 @@ NS(compare_tor_addr_to_addr_policy)(const tor_addr_t *addr, uint16_t port,
(void)port;
(void)policy;
CALLED(compare_tor_addr_to_addr_policy)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
done:
return ADDR_POLICY_ACCEPTED;
@@ -1087,7 +1087,7 @@ int
NS(geoip_get_country_by_addr)(const tor_addr_t *addr)
{
CALLED(geoip_get_country_by_addr)++;
- tt_ptr_op(addr, ==, MOCK_TOR_ADDR_PTR);
+ tt_ptr_op(addr, OP_EQ, MOCK_TOR_ADDR_PTR);
done:
return 1;
@@ -1111,7 +1111,7 @@ NS(test_main)(void *arg)
r = routerset_add_unknown_ccs(setp, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
done:
routerset_free(set);
@@ -1140,8 +1140,8 @@ NS(test_main)(void *arg)
r = routerset_add_unknown_ccs(setp, 0);
- tt_ptr_op(*setp, !=, NULL);
- tt_int_op(r, ==, 0);
+ tt_ptr_op(*setp, OP_NE, NULL);
+ tt_int_op(r, OP_EQ, 0);
done:
if (set != NULL)
@@ -1181,9 +1181,9 @@ NS(test_main)(void *arg)
r = routerset_add_unknown_ccs(setp, 0);
- tt_int_op(r, ==, 1);
- tt_int_op(smartlist_contains_string(set->country_names, "??"), ==, 1);
- tt_int_op(smartlist_contains_string(set->list, "{??}"), ==, 1);
+ tt_int_op(r, OP_EQ, 1);
+ tt_int_op(smartlist_contains_string(set->country_names, "??"), OP_EQ, 1);
+ tt_int_op(smartlist_contains_string(set->list, "{??}"), OP_EQ, 1);
done:
if (set != NULL)
@@ -1200,7 +1200,7 @@ NS(geoip_get_country)(const char *country)
arg_is_qq = !strcmp(country, "??");
arg_is_a1 = !strcmp(country, "A1");
- tt_int_op(arg_is_qq || arg_is_a1, ==, 1);
+ tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1);
if (arg_is_qq)
return 1;
@@ -1214,7 +1214,7 @@ NS(geoip_is_loaded)(sa_family_t family)
{
CALLED(geoip_is_loaded)++;
- tt_int_op(family, ==, AF_INET);
+ tt_int_op(family, OP_EQ, AF_INET);
done:
return 0;
@@ -1244,9 +1244,9 @@ NS(test_main)(void *arg)
r = routerset_add_unknown_ccs(setp, 0);
- tt_int_op(r, ==, 1);
- tt_int_op(smartlist_contains_string(set->country_names, "a1"), ==, 1);
- tt_int_op(smartlist_contains_string(set->list, "{a1}"), ==, 1);
+ tt_int_op(r, OP_EQ, 1);
+ tt_int_op(smartlist_contains_string(set->country_names, "a1"), OP_EQ, 1);
+ tt_int_op(smartlist_contains_string(set->list, "{a1}"), OP_EQ, 1);
done:
if (set != NULL)
@@ -1263,7 +1263,7 @@ NS(geoip_get_country)(const char *country)
arg_is_qq = !strcmp(country, "??");
arg_is_a1 = !strcmp(country, "A1");
- tt_int_op(arg_is_qq || arg_is_a1, ==, 1);
+ tt_int_op(arg_is_qq || arg_is_a1, OP_EQ, 1);
if (arg_is_a1)
return 1;
@@ -1277,7 +1277,7 @@ NS(geoip_is_loaded)(sa_family_t family)
{
CALLED(geoip_is_loaded)++;
- tt_int_op(family, ==, AF_INET);
+ tt_int_op(family, OP_EQ, AF_INET);
done:
return 0;
@@ -1306,7 +1306,7 @@ NS(test_main)(void *arg)
r = routerset_contains_extendinfo(set, &ei);
- tt_int_op(r, ==, 4);
+ tt_int_op(r, OP_EQ, 4);
done:
routerset_free(set);
}
@@ -1334,7 +1334,7 @@ NS(test_main)(void *arg)
r = routerset_contains_router(set, &ri, country);
- tt_int_op(r, ==, 4);
+ tt_int_op(r, OP_EQ, 4);
done:
routerset_free(set);
}
@@ -1367,7 +1367,7 @@ NS(test_main)(void *arg)
r = routerset_contains_routerstatus(set, &rs, country);
- tt_int_op(r, ==, 4);
+ tt_int_op(r, OP_EQ, 4);
done:
routerset_free(set);
}
@@ -1393,7 +1393,7 @@ NS(test_main)(void *arg)
NS(mock_node).rs = NULL;
r = routerset_contains_node(set, &NS(mock_node));
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
done:
routerset_free(set);
@@ -1427,7 +1427,7 @@ NS(test_main)(void *arg)
r = routerset_contains_node(set, &NS(mock_node));
- tt_int_op(r, ==, 4);
+ tt_int_op(r, OP_EQ, 4);
done:
routerset_free(set);
}
@@ -1458,7 +1458,7 @@ NS(test_main)(void *arg)
r = routerset_contains_node(set, &mock_node);
- tt_int_op(r, ==, 4);
+ tt_int_op(r, OP_EQ, 4);
done:
routerset_free(set);
}
@@ -1478,15 +1478,15 @@ NS(test_main)(void *arg)
routerset_t *set = NULL;
(void)arg;
- tt_int_op(smartlist_len(out), ==, 0);
+ tt_int_op(smartlist_len(out), OP_EQ, 0);
routerset_get_all_nodes(out, NULL, NULL, 0);
- tt_int_op(smartlist_len(out), ==, 0);
+ tt_int_op(smartlist_len(out), OP_EQ, 0);
set = routerset_new();
smartlist_free(set->list);
routerset_get_all_nodes(out, NULL, NULL, 0);
- tt_int_op(smartlist_len(out), ==, 0);
+ tt_int_op(smartlist_len(out), OP_EQ, 0);
/* Just recreate list, so we can simply use routerset_free. */
set->list = smartlist_new();
@@ -1527,8 +1527,8 @@ NS(test_main)(void *arg)
smartlist_free(out);
routerset_free(set);
- tt_int_op(out_len, ==, 0);
- tt_int_op(CALLED(node_get_by_nickname), ==, 1);
+ tt_int_op(out_len, OP_EQ, 0);
+ tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1);
done:
;
@@ -1538,8 +1538,8 @@ const node_t *
NS(node_get_by_nickname)(const char *nickname, int warn_if_unused)
{
CALLED(node_get_by_nickname)++;
- tt_str_op(nickname, ==, NS(mock_nickname));
- tt_int_op(warn_if_unused, ==, 1);
+ tt_str_op(nickname, OP_EQ, NS(mock_nickname));
+ tt_int_op(warn_if_unused, OP_EQ, 1);
done:
return NULL;
@@ -1578,8 +1578,8 @@ NS(test_main)(void *arg)
smartlist_free(out);
routerset_free(set);
- tt_int_op(out_len, ==, 0);
- tt_int_op(CALLED(node_get_by_nickname), ==, 1);
+ tt_int_op(out_len, OP_EQ, 0);
+ tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1);
done:
;
@@ -1589,8 +1589,8 @@ const node_t *
NS(node_get_by_nickname)(const char *nickname, int warn_if_unused)
{
CALLED(node_get_by_nickname)++;
- tt_str_op(nickname, ==, NS(mock_nickname));
- tt_int_op(warn_if_unused, ==, 1);
+ tt_str_op(nickname, OP_EQ, NS(mock_nickname));
+ tt_int_op(warn_if_unused, OP_EQ, 1);
done:
return &NS(mock_node);
@@ -1629,9 +1629,9 @@ NS(test_main)(void *arg)
smartlist_free(out);
routerset_free(set);
- tt_int_op(out_len, ==, 1);
- tt_ptr_op(ent, ==, &NS(mock_node));
- tt_int_op(CALLED(node_get_by_nickname), ==, 1);
+ tt_int_op(out_len, OP_EQ, 1);
+ tt_ptr_op(ent, OP_EQ, &NS(mock_node));
+ tt_int_op(CALLED(node_get_by_nickname), OP_EQ, 1);
done:
;
@@ -1641,8 +1641,8 @@ const node_t *
NS(node_get_by_nickname)(const char *nickname, int warn_if_unused)
{
CALLED(node_get_by_nickname)++;
- tt_str_op(nickname, ==, NS(mock_nickname));
- tt_int_op(warn_if_unused, ==, 1);
+ tt_str_op(nickname, OP_EQ, NS(mock_nickname));
+ tt_int_op(warn_if_unused, OP_EQ, 1);
done:
return &NS(mock_node);
@@ -1678,8 +1678,8 @@ NS(test_main)(void *arg)
smartlist_free(out);
smartlist_free(NS(mock_smartlist));
- tt_int_op(r, ==, 0);
- tt_int_op(CALLED(nodelist_get_list), ==, 1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1);
done:
;
@@ -1727,8 +1727,8 @@ NS(test_main)(void *arg)
smartlist_free(out);
smartlist_free(NS(mock_smartlist));
- tt_int_op(r, ==, 0);
- tt_int_op(CALLED(nodelist_get_list), ==, 1);
+ tt_int_op(r, OP_EQ, 0);
+ tt_int_op(CALLED(nodelist_get_list), OP_EQ, 1);
done:
;
@@ -1766,10 +1766,10 @@ NS(test_main)(void *arg)
mock_node.ri = &ri;
smartlist_add(list, (void *)&mock_node);
- tt_int_op(smartlist_len(list), !=, 0);
+ tt_int_op(smartlist_len(list), OP_NE, 0);
routerset_subtract_nodes(list, set);
- tt_int_op(smartlist_len(list), ==, 0);
+ tt_int_op(smartlist_len(list), OP_EQ, 0);
done:
routerset_free(set);
smartlist_free(list);
@@ -1796,10 +1796,10 @@ NS(test_main)(void *arg)
mock_node.ri = &ri;
smartlist_add(list, (void *)&mock_node);
- tt_int_op(smartlist_len(list), !=, 0);
+ tt_int_op(smartlist_len(list), OP_NE, 0);
routerset_subtract_nodes(list, set);
- tt_int_op(smartlist_len(list), !=, 0);
+ tt_int_op(smartlist_len(list), OP_NE, 0);
done:
routerset_free(set);
smartlist_free(list);
@@ -1821,19 +1821,19 @@ NS(test_main)(void *arg)
set = NULL;
s = routerset_to_string(set);
- tt_str_op(s, ==, "");
+ tt_str_op(s, OP_EQ, "");
tor_free(s);
set = routerset_new();
s = routerset_to_string(set);
- tt_str_op(s, ==, "");
+ tt_str_op(s, OP_EQ, "");
tor_free(s);
routerset_free(set); set = NULL;
set = routerset_new();
smartlist_add(set->list, tor_strndup("a", 1));
s = routerset_to_string(set);
- tt_str_op(s, ==, "a");
+ tt_str_op(s, OP_EQ, "a");
tor_free(s);
routerset_free(set); set = NULL;
@@ -1841,7 +1841,7 @@ NS(test_main)(void *arg)
smartlist_add(set->list, tor_strndup("a", 1));
smartlist_add(set->list, tor_strndup("b", 1));
s = routerset_to_string(set);
- tt_str_op(s, ==, "a,b");
+ tt_str_op(s, OP_EQ, "a,b");
tor_free(s);
routerset_free(set); set = NULL;
@@ -1868,7 +1868,7 @@ NS(test_main)(void *arg)
routerset_free(a);
routerset_free(b);
- tt_int_op(r, ==, 1);
+ tt_int_op(r, OP_EQ, 1);
done:
;
@@ -1893,7 +1893,7 @@ NS(test_main)(void *arg)
routerset_free(a);
routerset_free(b);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
done:
;
}
@@ -1920,7 +1920,7 @@ NS(test_main)(void *arg)
routerset_free(a);
routerset_free(b);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
done:
;
}
@@ -1946,7 +1946,7 @@ NS(test_main)(void *arg)
routerset_free(a);
routerset_free(b);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
done:
;
}
@@ -1972,7 +1972,7 @@ NS(test_main)(void *arg)
routerset_free(a);
routerset_free(b);
- tt_int_op(r, ==, 1);
+ tt_int_op(r, OP_EQ, 1);
done:
;
}
@@ -1995,7 +1995,7 @@ NS(test_main)(void *arg)
routerset_free(NULL);
- tt_int_op(CALLED(smartlist_free), ==, 0);
+ tt_int_op(CALLED(smartlist_free), OP_EQ, 0);
done:
;
@@ -2031,9 +2031,9 @@ NS(test_main)(void *arg)
routerset_free(routerset);
- tt_int_op(CALLED(smartlist_free), !=, 0);
- tt_int_op(CALLED(strmap_free), !=, 0);
- tt_int_op(CALLED(digestmap_free), !=, 0);
+ tt_int_op(CALLED(smartlist_free), OP_NE, 0);
+ tt_int_op(CALLED(strmap_free), OP_NE, 0);
+ tt_int_op(CALLED(digestmap_free), OP_NE, 0);
done:
;
diff --git a/src/test/test_scheduler.c b/src/test/test_scheduler.c
new file mode 100644
index 0000000000..73a422088f
--- /dev/null
+++ b/src/test/test_scheduler.c
@@ -0,0 +1,763 @@
+/* Copyright (c) 2014-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include <math.h>
+
+#include "orconfig.h"
+
+/* Libevent stuff */
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
+
+#define TOR_CHANNEL_INTERNAL_
+#define CHANNEL_PRIVATE_
+#include "or.h"
+#include "compat_libevent.h"
+#include "channel.h"
+#define SCHEDULER_PRIVATE_
+#include "scheduler.h"
+
+/* Test suite stuff */
+#include "test.h"
+#include "fakechans.h"
+
+/* Statics in scheduler.c exposed to the test suite */
+extern smartlist_t *channels_pending;
+extern struct event *run_sched_ev;
+extern uint64_t queue_heuristic;
+extern time_t queue_heuristic_timestamp;
+
+/* Event base for scheduelr tests */
+static struct event_base *mock_event_base = NULL;
+
+/* Statics controlling mocks */
+static circuitmux_t *mock_ccm_tgt_1 = NULL;
+static circuitmux_t *mock_ccm_tgt_2 = NULL;
+
+static circuitmux_t *mock_cgp_tgt_1 = NULL;
+static const circuitmux_policy_t *mock_cgp_val_1 = NULL;
+static circuitmux_t *mock_cgp_tgt_2 = NULL;
+static const circuitmux_policy_t *mock_cgp_val_2 = NULL;
+static int scheduler_compare_channels_mock_ctr = 0;
+static int scheduler_run_mock_ctr = 0;
+
+static void channel_flush_some_cells_mock_free_all(void);
+static void channel_flush_some_cells_mock_set(channel_t *chan,
+ ssize_t num_cells);
+
+/* Setup for mock event stuff */
+static void mock_event_free_all(void);
+static void mock_event_init(void);
+
+/* Mocks used by scheduler tests */
+static ssize_t channel_flush_some_cells_mock(channel_t *chan,
+ ssize_t num_cells);
+static int circuitmux_compare_muxes_mock(circuitmux_t *cmux_1,
+ circuitmux_t *cmux_2);
+static const circuitmux_policy_t * circuitmux_get_policy_mock(
+ circuitmux_t *cmux);
+static int scheduler_compare_channels_mock(const void *c1_v,
+ const void *c2_v);
+static void scheduler_run_noop_mock(void);
+static struct event_base * tor_libevent_get_base_mock(void);
+
+/* Scheduler test cases */
+static void test_scheduler_channel_states(void *arg);
+static void test_scheduler_compare_channels(void *arg);
+static void test_scheduler_initfree(void *arg);
+static void test_scheduler_loop(void *arg);
+static void test_scheduler_queue_heuristic(void *arg);
+
+/* Mock event init/free */
+
+/* Shamelessly stolen from compat_libevent.c */
+#define V(major, minor, patch) \
+ (((major) << 24) | ((minor) << 16) | ((patch) << 8))
+
+static void
+mock_event_free_all(void)
+{
+ tt_assert(mock_event_base != NULL);
+
+ if (mock_event_base) {
+ event_base_free(mock_event_base);
+ mock_event_base = NULL;
+ }
+
+ tt_ptr_op(mock_event_base, ==, NULL);
+
+ done:
+ return;
+}
+
+static void
+mock_event_init(void)
+{
+#ifdef HAVE_EVENT2_EVENT_H
+ struct event_config *cfg = NULL;
+#endif
+
+ tt_ptr_op(mock_event_base, ==, NULL);
+
+ /*
+ * Really cut down from tor_libevent_initialize of
+ * src/common/compat_libevent.c to kill config dependencies
+ */
+
+ if (!mock_event_base) {
+#ifdef HAVE_EVENT2_EVENT_H
+ cfg = event_config_new();
+#if LIBEVENT_VERSION_NUMBER >= V(2,0,9)
+ /* We can enable changelist support with epoll, since we don't give
+ * Libevent any dup'd fds. This lets us avoid some syscalls. */
+ event_config_set_flag(cfg, EVENT_BASE_FLAG_EPOLL_USE_CHANGELIST);
+#endif
+ mock_event_base = event_base_new_with_config(cfg);
+ event_config_free(cfg);
+#else
+ mock_event_base = event_init();
+#endif
+ }
+
+ tt_assert(mock_event_base != NULL);
+
+ done:
+ return;
+}
+
+/* Mocks */
+
+typedef struct {
+ const channel_t *chan;
+ ssize_t cells;
+} flush_mock_channel_t;
+
+static smartlist_t *chans_for_flush_mock = NULL;
+
+static void
+channel_flush_some_cells_mock_free_all(void)
+{
+ if (chans_for_flush_mock) {
+ SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock,
+ flush_mock_channel_t *,
+ flush_mock_ch) {
+ SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch);
+ tor_free(flush_mock_ch);
+ } SMARTLIST_FOREACH_END(flush_mock_ch);
+
+ smartlist_free(chans_for_flush_mock);
+ chans_for_flush_mock = NULL;
+ }
+}
+
+static void
+channel_flush_some_cells_mock_set(channel_t *chan, ssize_t num_cells)
+{
+ flush_mock_channel_t *flush_mock_ch = NULL;
+
+ if (!chan) return;
+ if (num_cells <= 0) return;
+
+ if (!chans_for_flush_mock) {
+ chans_for_flush_mock = smartlist_new();
+ }
+
+ SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock,
+ flush_mock_channel_t *,
+ flush_mock_ch) {
+ if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) {
+ if (flush_mock_ch->chan == chan) {
+ /* Found it */
+ flush_mock_ch->cells = num_cells;
+ break;
+ }
+ } else {
+ /* That shouldn't be there... */
+ SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch);
+ tor_free(flush_mock_ch);
+ }
+ } SMARTLIST_FOREACH_END(flush_mock_ch);
+
+ if (!flush_mock_ch) {
+ /* The loop didn't find it */
+ flush_mock_ch = tor_malloc_zero(sizeof(*flush_mock_ch));
+ flush_mock_ch->chan = chan;
+ flush_mock_ch->cells = num_cells;
+ smartlist_add(chans_for_flush_mock, flush_mock_ch);
+ }
+}
+
+static ssize_t
+channel_flush_some_cells_mock(channel_t *chan, ssize_t num_cells)
+{
+ ssize_t flushed = 0, max;
+ char unlimited = 0;
+ flush_mock_channel_t *found = NULL;
+
+ tt_assert(chan != NULL);
+ if (chan) {
+ if (num_cells < 0) {
+ num_cells = 0;
+ unlimited = 1;
+ }
+
+ /* Check if we have it */
+ if (chans_for_flush_mock != NULL) {
+ SMARTLIST_FOREACH_BEGIN(chans_for_flush_mock,
+ flush_mock_channel_t *,
+ flush_mock_ch) {
+ if (flush_mock_ch != NULL && flush_mock_ch->chan != NULL) {
+ if (flush_mock_ch->chan == chan) {
+ /* Found it */
+ found = flush_mock_ch;
+ break;
+ }
+ } else {
+ /* That shouldn't be there... */
+ SMARTLIST_DEL_CURRENT(chans_for_flush_mock, flush_mock_ch);
+ tor_free(flush_mock_ch);
+ }
+ } SMARTLIST_FOREACH_END(flush_mock_ch);
+
+ if (found) {
+ /* We found one */
+ if (found->cells < 0) found->cells = 0;
+
+ if (unlimited) max = found->cells;
+ else max = MIN(found->cells, num_cells);
+
+ flushed += max;
+ found->cells -= max;
+
+ if (found->cells <= 0) {
+ smartlist_remove(chans_for_flush_mock, found);
+ tor_free(found);
+ }
+ }
+ }
+ }
+
+ done:
+ return flushed;
+}
+
+static int
+circuitmux_compare_muxes_mock(circuitmux_t *cmux_1,
+ circuitmux_t *cmux_2)
+{
+ int result = 0;
+
+ tt_assert(cmux_1 != NULL);
+ tt_assert(cmux_2 != NULL);
+
+ if (cmux_1 != cmux_2) {
+ if (cmux_1 == mock_ccm_tgt_1 && cmux_2 == mock_ccm_tgt_2) result = -1;
+ else if (cmux_1 == mock_ccm_tgt_2 && cmux_2 == mock_ccm_tgt_1) {
+ result = 1;
+ } else {
+ if (cmux_1 == mock_ccm_tgt_1 || cmux_1 == mock_ccm_tgt_2) result = -1;
+ else if (cmux_2 == mock_ccm_tgt_1 || cmux_2 == mock_ccm_tgt_2) {
+ result = 1;
+ } else {
+ result = circuitmux_compare_muxes__real(cmux_1, cmux_2);
+ }
+ }
+ }
+ /* else result = 0 always */
+
+ done:
+ return result;
+}
+
+static const circuitmux_policy_t *
+circuitmux_get_policy_mock(circuitmux_t *cmux)
+{
+ const circuitmux_policy_t *result = NULL;
+
+ tt_assert(cmux != NULL);
+ if (cmux) {
+ if (cmux == mock_cgp_tgt_1) result = mock_cgp_val_1;
+ else if (cmux == mock_cgp_tgt_2) result = mock_cgp_val_2;
+ else result = circuitmux_get_policy__real(cmux);
+ }
+
+ done:
+ return result;
+}
+
+static int
+scheduler_compare_channels_mock(const void *c1_v,
+ const void *c2_v)
+{
+ uintptr_t p1, p2;
+
+ p1 = (uintptr_t)(c1_v);
+ p2 = (uintptr_t)(c2_v);
+
+ ++scheduler_compare_channels_mock_ctr;
+
+ if (p1 == p2) return 0;
+ else if (p1 < p2) return 1;
+ else return -1;
+}
+
+static void
+scheduler_run_noop_mock(void)
+{
+ ++scheduler_run_mock_ctr;
+}
+
+static struct event_base *
+tor_libevent_get_base_mock(void)
+{
+ return mock_event_base;
+}
+
+/* Test cases */
+
+static void
+test_scheduler_channel_states(void *arg)
+{
+ channel_t *ch1 = NULL, *ch2 = NULL;
+ int old_count;
+
+ (void)arg;
+
+ /* Set up libevent and scheduler */
+
+ mock_event_init();
+ MOCK(tor_libevent_get_base, tor_libevent_get_base_mock);
+ scheduler_init();
+ /*
+ * Install the compare channels mock so we can test
+ * scheduler_touch_channel().
+ */
+ MOCK(scheduler_compare_channels, scheduler_compare_channels_mock);
+ /*
+ * Disable scheduler_run so we can just check the state transitions
+ * without having to make everything it might call work too.
+ */
+ MOCK(scheduler_run, scheduler_run_noop_mock);
+
+ tt_int_op(smartlist_len(channels_pending), ==, 0);
+
+ /* Set up a fake channel */
+ ch1 = new_fake_channel();
+ tt_assert(ch1);
+
+ /* Start it off in OPENING */
+ ch1->state = CHANNEL_STATE_OPENING;
+ /* We'll need a cmux */
+ ch1->cmux = circuitmux_alloc();
+ /* Try to register it */
+ channel_register(ch1);
+ tt_assert(ch1->registered);
+
+ /* It should start off in SCHED_CHAN_IDLE */
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE);
+
+ /* Now get another one */
+ ch2 = new_fake_channel();
+ tt_assert(ch2);
+ ch2->state = CHANNEL_STATE_OPENING;
+ ch2->cmux = circuitmux_alloc();
+ channel_register(ch2);
+ tt_assert(ch2->registered);
+
+ /* Send it to SCHED_CHAN_WAITING_TO_WRITE */
+ scheduler_channel_has_waiting_cells(ch1);
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
+
+ /* This should send it to SCHED_CHAN_PENDING */
+ scheduler_channel_wants_writes(ch1);
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 1);
+
+ /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */
+ scheduler_channel_wants_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+
+ /* Drop ch2 back to idle */
+ scheduler_channel_doesnt_want_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE);
+
+ /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */
+ scheduler_channel_wants_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+
+ /* ...and this should kick ch2 into SCHED_CHAN_PENDING */
+ scheduler_channel_has_waiting_cells(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 2);
+
+ /* This should send ch2 to SCHED_CHAN_WAITING_TO_WRITE */
+ scheduler_channel_doesnt_want_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
+ tt_int_op(smartlist_len(channels_pending), ==, 1);
+
+ /* ...and back to SCHED_CHAN_PENDING */
+ scheduler_channel_wants_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 2);
+
+ /* Now we exercise scheduler_touch_channel */
+ old_count = scheduler_compare_channels_mock_ctr;
+ scheduler_touch_channel(ch1);
+ tt_assert(scheduler_compare_channels_mock_ctr > old_count);
+
+ /* Close */
+ channel_mark_for_close(ch1);
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING);
+ channel_mark_for_close(ch2);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
+ channel_closed(ch1);
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED);
+ ch1 = NULL;
+ channel_closed(ch2);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED);
+ ch2 = NULL;
+
+ /* Shut things down */
+
+ channel_free_all();
+ scheduler_free_all();
+ mock_event_free_all();
+
+ done:
+ tor_free(ch1);
+ tor_free(ch2);
+
+ UNMOCK(scheduler_compare_channels);
+ UNMOCK(scheduler_run);
+ UNMOCK(tor_libevent_get_base);
+
+ return;
+}
+
+static void
+test_scheduler_compare_channels(void *arg)
+{
+ /* We don't actually need whole fake channels... */
+ channel_t c1, c2;
+ /* ...and some dummy circuitmuxes too */
+ circuitmux_t *cm1 = NULL, *cm2 = NULL;
+ int result;
+
+ (void)arg;
+
+ /* We can't actually see sizeof(circuitmux_t) from here */
+ cm1 = tor_malloc_zero(sizeof(void *));
+ cm2 = tor_malloc_zero(sizeof(void *));
+
+ c1.cmux = cm1;
+ c2.cmux = cm2;
+
+ /* Configure circuitmux_get_policy() mock */
+ mock_cgp_tgt_1 = cm1;
+ /*
+ * This is to test the different-policies case, which uses the policy
+ * cast to an intptr_t as an arbitrary but definite thing to compare.
+ */
+ mock_cgp_val_1 = (const circuitmux_policy_t *)(1);
+ mock_cgp_tgt_2 = cm2;
+ mock_cgp_val_2 = (const circuitmux_policy_t *)(2);
+
+ MOCK(circuitmux_get_policy, circuitmux_get_policy_mock);
+
+ /* Now set up circuitmux_compare_muxes() mock using cm1/cm2 */
+ mock_ccm_tgt_1 = cm1;
+ mock_ccm_tgt_2 = cm2;
+ MOCK(circuitmux_compare_muxes, circuitmux_compare_muxes_mock);
+
+ /* Equal-channel case */
+ result = scheduler_compare_channels(&c1, &c1);
+ tt_int_op(result, ==, 0);
+
+ /* Distinct channels, distinct policies */
+ result = scheduler_compare_channels(&c1, &c2);
+ tt_int_op(result, ==, -1);
+ result = scheduler_compare_channels(&c2, &c1);
+ tt_int_op(result, ==, 1);
+
+ /* Distinct channels, same policy */
+ mock_cgp_val_2 = mock_cgp_val_1;
+ result = scheduler_compare_channels(&c1, &c2);
+ tt_int_op(result, ==, -1);
+ result = scheduler_compare_channels(&c2, &c1);
+ tt_int_op(result, ==, 1);
+
+ done:
+
+ UNMOCK(circuitmux_compare_muxes);
+ mock_ccm_tgt_1 = NULL;
+ mock_ccm_tgt_2 = NULL;
+
+ UNMOCK(circuitmux_get_policy);
+ mock_cgp_tgt_1 = NULL;
+ mock_cgp_val_1 = NULL;
+ mock_cgp_tgt_2 = NULL;
+ mock_cgp_val_2 = NULL;
+
+ tor_free(cm1);
+ tor_free(cm2);
+
+ return;
+}
+
+static void
+test_scheduler_initfree(void *arg)
+{
+ (void)arg;
+
+ tt_ptr_op(channels_pending, ==, NULL);
+ tt_ptr_op(run_sched_ev, ==, NULL);
+
+ mock_event_init();
+ MOCK(tor_libevent_get_base, tor_libevent_get_base_mock);
+
+ scheduler_init();
+
+ tt_assert(channels_pending != NULL);
+ tt_assert(run_sched_ev != NULL);
+
+ scheduler_free_all();
+
+ UNMOCK(tor_libevent_get_base);
+ mock_event_free_all();
+
+ tt_ptr_op(channels_pending, ==, NULL);
+ tt_ptr_op(run_sched_ev, ==, NULL);
+
+ done:
+ return;
+}
+
+static void
+test_scheduler_loop(void *arg)
+{
+ channel_t *ch1 = NULL, *ch2 = NULL;
+
+ (void)arg;
+
+ /* Set up libevent and scheduler */
+
+ mock_event_init();
+ MOCK(tor_libevent_get_base, tor_libevent_get_base_mock);
+ scheduler_init();
+ /*
+ * Install the compare channels mock so we can test
+ * scheduler_touch_channel().
+ */
+ MOCK(scheduler_compare_channels, scheduler_compare_channels_mock);
+ /*
+ * Disable scheduler_run so we can just check the state transitions
+ * without having to make everything it might call work too.
+ */
+ MOCK(scheduler_run, scheduler_run_noop_mock);
+
+ tt_int_op(smartlist_len(channels_pending), ==, 0);
+
+ /* Set up a fake channel */
+ ch1 = new_fake_channel();
+ tt_assert(ch1);
+
+ /* Start it off in OPENING */
+ ch1->state = CHANNEL_STATE_OPENING;
+ /* We'll need a cmux */
+ ch1->cmux = circuitmux_alloc();
+ /* Try to register it */
+ channel_register(ch1);
+ tt_assert(ch1->registered);
+ /* Finish opening it */
+ channel_change_state(ch1, CHANNEL_STATE_OPEN);
+
+ /* It should start off in SCHED_CHAN_IDLE */
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_IDLE);
+
+ /* Now get another one */
+ ch2 = new_fake_channel();
+ tt_assert(ch2);
+ ch2->state = CHANNEL_STATE_OPENING;
+ ch2->cmux = circuitmux_alloc();
+ channel_register(ch2);
+ tt_assert(ch2->registered);
+ /*
+ * Don't open ch2; then channel_num_cells_writeable() will return
+ * zero and we'll get coverage of that exception case in scheduler_run()
+ */
+
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING);
+
+ /* Send it to SCHED_CHAN_WAITING_TO_WRITE */
+ scheduler_channel_has_waiting_cells(ch1);
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_TO_WRITE);
+
+ /* This should send it to SCHED_CHAN_PENDING */
+ scheduler_channel_wants_writes(ch1);
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 1);
+
+ /* Now send ch2 to SCHED_CHAN_WAITING_FOR_CELLS */
+ scheduler_channel_wants_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+
+ /* Drop ch2 back to idle */
+ scheduler_channel_doesnt_want_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_IDLE);
+
+ /* ...and back to SCHED_CHAN_WAITING_FOR_CELLS */
+ scheduler_channel_wants_writes(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+
+ /* ...and this should kick ch2 into SCHED_CHAN_PENDING */
+ scheduler_channel_has_waiting_cells(ch2);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 2);
+
+ /*
+ * Now we've got two pending channels and need to fire off
+ * scheduler_run(); first, unmock it.
+ */
+
+ UNMOCK(scheduler_run);
+
+ scheduler_run();
+
+ /* Now re-mock it */
+ MOCK(scheduler_run, scheduler_run_noop_mock);
+
+ /*
+ * Assert that they're still in the states we left and aren't still
+ * pending
+ */
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_OPENING);
+ tt_assert(ch1->scheduler_state != SCHED_CHAN_PENDING);
+ tt_assert(ch2->scheduler_state != SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 0);
+
+ /* Now, finish opening ch2, and get both back to pending */
+ channel_change_state(ch2, CHANNEL_STATE_OPEN);
+ scheduler_channel_wants_writes(ch1);
+ scheduler_channel_wants_writes(ch2);
+ scheduler_channel_has_waiting_cells(ch1);
+ scheduler_channel_has_waiting_cells(ch2);
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_OPEN);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_OPEN);
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_PENDING);
+ tt_int_op(smartlist_len(channels_pending), ==, 2);
+
+ /* Now, set up the channel_flush_some_cells() mock */
+ MOCK(channel_flush_some_cells, channel_flush_some_cells_mock);
+ /*
+ * 16 cells on ch1 means it'll completely drain into the 32 cells
+ * fakechan's num_cells_writeable() returns.
+ */
+ channel_flush_some_cells_mock_set(ch1, 16);
+ /*
+ * This one should get sent back to pending, since num_cells_writeable()
+ * will still return non-zero.
+ */
+ channel_flush_some_cells_mock_set(ch2, 48);
+
+ /*
+ * And re-run the scheduler_run() loop with non-zero returns from
+ * channel_flush_some_cells() this time.
+ */
+ UNMOCK(scheduler_run);
+
+ scheduler_run();
+
+ /* Now re-mock it */
+ MOCK(scheduler_run, scheduler_run_noop_mock);
+
+ /*
+ * ch1 should have gone to SCHED_CHAN_WAITING_FOR_CELLS, with 16 flushed
+ * and 32 writeable.
+ */
+ tt_int_op(ch1->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+ /*
+ * ...ch2 should also have gone to SCHED_CHAN_WAITING_FOR_CELLS, with
+ * channel_more_to_flush() returning false and channel_num_cells_writeable()
+ * > 0/
+ */
+ tt_int_op(ch2->scheduler_state, ==, SCHED_CHAN_WAITING_FOR_CELLS);
+
+ /* Close */
+ channel_mark_for_close(ch1);
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSING);
+ channel_mark_for_close(ch2);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSING);
+ channel_closed(ch1);
+ tt_int_op(ch1->state, ==, CHANNEL_STATE_CLOSED);
+ ch1 = NULL;
+ channel_closed(ch2);
+ tt_int_op(ch2->state, ==, CHANNEL_STATE_CLOSED);
+ ch2 = NULL;
+
+ /* Shut things down */
+ channel_flush_some_cells_mock_free_all();
+ channel_free_all();
+ scheduler_free_all();
+ mock_event_free_all();
+
+ done:
+ tor_free(ch1);
+ tor_free(ch2);
+
+ UNMOCK(channel_flush_some_cells);
+ UNMOCK(scheduler_compare_channels);
+ UNMOCK(scheduler_run);
+ UNMOCK(tor_libevent_get_base);
+}
+
+static void
+test_scheduler_queue_heuristic(void *arg)
+{
+ time_t now = approx_time();
+ uint64_t qh;
+
+ (void)arg;
+
+ queue_heuristic = 0;
+ queue_heuristic_timestamp = 0;
+
+ /* Not yet inited case */
+ scheduler_update_queue_heuristic(now - 180);
+ tt_u64_op(queue_heuristic, ==, 0);
+ tt_int_op(queue_heuristic_timestamp, ==, now - 180);
+
+ queue_heuristic = 1000000000L;
+ queue_heuristic_timestamp = now - 120;
+
+ scheduler_update_queue_heuristic(now - 119);
+ tt_u64_op(queue_heuristic, ==, 500000000L);
+ tt_int_op(queue_heuristic_timestamp, ==, now - 119);
+
+ scheduler_update_queue_heuristic(now - 116);
+ tt_u64_op(queue_heuristic, ==, 62500000L);
+ tt_int_op(queue_heuristic_timestamp, ==, now - 116);
+
+ qh = scheduler_get_queue_heuristic();
+ tt_u64_op(qh, ==, 0);
+
+ done:
+ return;
+}
+
+struct testcase_t scheduler_tests[] = {
+ { "channel_states", test_scheduler_channel_states, TT_FORK, NULL, NULL },
+ { "compare_channels", test_scheduler_compare_channels,
+ TT_FORK, NULL, NULL },
+ { "initfree", test_scheduler_initfree, TT_FORK, NULL, NULL },
+ { "loop", test_scheduler_loop, TT_FORK, NULL, NULL },
+ { "queue_heuristic", test_scheduler_queue_heuristic,
+ TT_FORK, NULL, NULL },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_slow.c b/src/test/test_slow.c
new file mode 100644
index 0000000000..32386b485e
--- /dev/null
+++ b/src/test/test_slow.c
@@ -0,0 +1,29 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file test_slow.c
+ * \brief Slower unit tests for many pieces of the lower level Tor modules.
+ **/
+
+#include "orconfig.h"
+
+#include <stdio.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#include "or.h"
+#include "test.h"
+
+extern struct testcase_t slow_crypto_tests[];
+extern struct testcase_t slow_util_tests[];
+
+struct testgroup_t testgroups[] = {
+ { "slow/crypto/", slow_crypto_tests },
+ { "slow/util/", slow_util_tests },
+ END_OF_GROUPS
+};
+
diff --git a/src/test/test_socks.c b/src/test/test_socks.c
index 29faa69fb8..465e427930 100644
--- a/src/test/test_socks.c
+++ b/src/test/test_socks.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "or.h"
@@ -63,8 +63,8 @@ test_socks_4_unsupported_commands(void *ptr)
ADD_DATA(buf, "\x04\x02\x11\x11\x02\x02\x02\x02\x00");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == -1);
- tt_int_op(4,==, socks->socks_version);
- tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */
+ tt_int_op(4,OP_EQ, socks->socks_version);
+ tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
done:
;
@@ -76,49 +76,49 @@ test_socks_4_supported_commands(void *ptr)
{
SOCKS_TEST_INIT();
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
/* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4370 */
ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x03\x00");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(4,==, socks->socks_version);
- tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */
- tt_int_op(SOCKS_COMMAND_CONNECT,==, socks->command);
- tt_str_op("2.2.2.3",==, socks->address);
- tt_int_op(4370,==, socks->port);
+ tt_int_op(4,OP_EQ, socks->socks_version);
+ tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
+ tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
+ tt_str_op("2.2.2.3",OP_EQ, socks->address);
+ tt_int_op(4370,OP_EQ, socks->port);
tt_assert(socks->got_auth == 0);
tt_assert(! socks->username);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 4 Send CONNECT [01] to IP address 2.2.2.2:4369 with userid*/
ADD_DATA(buf, "\x04\x01\x11\x12\x02\x02\x02\x04me\x00");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(4,==, socks->socks_version);
- tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */
- tt_int_op(SOCKS_COMMAND_CONNECT,==, socks->command);
- tt_str_op("2.2.2.4",==, socks->address);
- tt_int_op(4370,==, socks->port);
+ tt_int_op(4,OP_EQ, socks->socks_version);
+ tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
+ tt_int_op(SOCKS_COMMAND_CONNECT,OP_EQ, socks->command);
+ tt_str_op("2.2.2.4",OP_EQ, socks->address);
+ tt_int_op(4370,OP_EQ, socks->port);
tt_assert(socks->got_auth == 1);
tt_assert(socks->username);
- tt_int_op(2,==, socks->usernamelen);
- tt_mem_op("me",==, socks->username, 2);
+ tt_int_op(2,OP_EQ, socks->usernamelen);
+ tt_mem_op("me",OP_EQ, socks->username, 2);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 4a Send RESOLVE [F0] request for torproject.org */
ADD_DATA(buf, "\x04\xF0\x01\x01\x00\x00\x00\x02me\x00torproject.org\x00");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(4,==, socks->socks_version);
- tt_int_op(0,==, socks->replylen); /* XXX: shouldn't tor reply? */
- tt_str_op("torproject.org",==, socks->address);
+ tt_int_op(4,OP_EQ, socks->socks_version);
+ tt_int_op(0,OP_EQ, socks->replylen); /* XXX: shouldn't tor reply? */
+ tt_str_op("torproject.org",OP_EQ, socks->address);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
done:
;
@@ -134,21 +134,21 @@ test_socks_5_unsupported_commands(void *ptr)
ADD_DATA(buf, "\x05\x02\x00\x01");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, 0);
- tt_int_op(0,==, buf_datalen(buf));
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ get_options()->SafeSocks),OP_EQ, 0);
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
ADD_DATA(buf, "\x05\x02\x00\x01\x02\x02\x02\x01\x01\x01");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, -1);
+ get_options()->SafeSocks),OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
buf_clear(buf);
socks_request_clear(socks);
@@ -156,20 +156,20 @@ test_socks_5_unsupported_commands(void *ptr)
/* SOCKS 5 Send unsupported UDP_ASSOCIATE [03] command */
ADD_DATA(buf, "\x05\x02\x00\x01");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, 0);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ get_options()->SafeSocks),OP_EQ, 0);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
ADD_DATA(buf, "\x05\x03\x00\x01\x02\x02\x02\x01\x01\x01");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, -1);
+ get_options()->SafeSocks),OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_COMMAND_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
done:
;
@@ -184,35 +184,35 @@ test_socks_5_supported_commands(void *ptr)
/* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
ADD_DATA(buf, "\x05\x01\x00");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, 0);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ get_options()->SafeSocks),OP_EQ, 0);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, 1);
- tt_str_op("2.2.2.2",==, socks->address);
- tt_int_op(4369,==, socks->port);
+ get_options()->SafeSocks),OP_EQ, 1);
+ tt_str_op("2.2.2.2",OP_EQ, socks->address);
+ tt_int_op(4369,OP_EQ, socks->port);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 5 Send CONNECT [01] to FQDN torproject.org:4369 */
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\x01\x00\x03\x0Etorproject.org\x11\x11");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, 1);
+ get_options()->SafeSocks),OP_EQ, 1);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
- tt_str_op("torproject.org",==, socks->address);
- tt_int_op(4369,==, socks->port);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
+ tt_str_op("torproject.org",OP_EQ, socks->address);
+ tt_int_op(4369,OP_EQ, socks->port);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 5 Send RESOLVE [F0] request for torproject.org:4369 */
@@ -220,13 +220,13 @@ test_socks_5_supported_commands(void *ptr)
ADD_DATA(buf, "\x05\xF0\x00\x03\x0Etorproject.org\x01\x02");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
- tt_str_op("torproject.org",==, socks->address);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
+ tt_str_op("torproject.org",OP_EQ, socks->address);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
socks_request_clear(socks);
/* SOCKS 5 Should reject RESOLVE [F0] request for IPv4 address
@@ -239,11 +239,11 @@ test_socks_5_supported_commands(void *ptr)
tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1)
== -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
socks_request_clear(socks);
@@ -257,11 +257,11 @@ test_socks_5_supported_commands(void *ptr)
tt_assert(fetch_from_buf_socks(buf,socks,get_options()->TestSocks,1)
== -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
socks_request_clear(socks);
@@ -270,13 +270,13 @@ test_socks_5_supported_commands(void *ptr)
ADD_DATA(buf, "\x05\xF1\x00\x01\x02\x02\x02\x05\x01\x03");
tt_assert(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
- tt_str_op("2.2.2.5",==, socks->address);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
+ tt_str_op("2.2.2.5",OP_EQ, socks->address);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
done:
;
@@ -293,27 +293,27 @@ test_socks_5_no_authenticate(void *ptr)
tt_assert(!fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks));
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(SOCKS_NO_AUTH,==, socks->reply[1]);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(SOCKS_NO_AUTH,OP_EQ, socks->reply[1]);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
/*SOCKS 5 Send username/password anyway - pretend to be broken */
ADD_DATA(buf,"\x01\x02\x01\x01\x02\x01\x01");
tt_assert(!fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks));
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(1,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(1,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
- tt_int_op(2,==, socks->usernamelen);
- tt_int_op(2,==, socks->passwordlen);
+ tt_int_op(2,OP_EQ, socks->usernamelen);
+ tt_int_op(2,OP_EQ, socks->passwordlen);
- tt_mem_op("\x01\x01",==, socks->username, 2);
- tt_mem_op("\x01\x01",==, socks->password, 2);
+ tt_mem_op("\x01\x01",OP_EQ, socks->username, 2);
+ tt_mem_op("\x01\x01",OP_EQ, socks->password, 2);
done:
;
@@ -331,28 +331,28 @@ test_socks_5_authenticate(void *ptr)
tt_assert(!fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks));
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(SOCKS_USER_PASS,==, socks->reply[1]);
- tt_int_op(5,==, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
/* SOCKS 5 Send username/password */
ADD_DATA(buf, "\x01\x02me\x08mypasswd");
tt_assert(!fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks));
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(1,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(1,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
- tt_int_op(2,==, socks->usernamelen);
- tt_int_op(8,==, socks->passwordlen);
+ tt_int_op(2,OP_EQ, socks->usernamelen);
+ tt_int_op(8,OP_EQ, socks->passwordlen);
- tt_mem_op("me",==, socks->username, 2);
- tt_mem_op("mypasswd",==, socks->password, 8);
+ tt_mem_op("me",OP_EQ, socks->username, 2);
+ tt_mem_op("mypasswd",OP_EQ, socks->password, 8);
done:
;
@@ -370,12 +370,12 @@ test_socks_5_authenticate_with_data(void *ptr)
tt_assert(!fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks));
- tt_int_op(2,==, socks->replylen);
- tt_int_op(5,==, socks->reply[0]);
- tt_int_op(SOCKS_USER_PASS,==, socks->reply[1]);
- tt_int_op(5,==, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(5,OP_EQ, socks->reply[0]);
+ tt_int_op(SOCKS_USER_PASS,OP_EQ, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
- tt_int_op(0,==, buf_datalen(buf));
+ tt_int_op(0,OP_EQ, buf_datalen(buf));
/* SOCKS 5 Send username/password */
/* SOCKS 5 Send CONNECT [01] to IP address 2.2.2.2:4369 */
@@ -383,18 +383,18 @@ test_socks_5_authenticate_with_data(void *ptr)
tt_assert(fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks) == 1);
- tt_int_op(5,==, socks->socks_version);
- tt_int_op(2,==, socks->replylen);
- tt_int_op(1,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ tt_int_op(5,OP_EQ, socks->socks_version);
+ tt_int_op(2,OP_EQ, socks->replylen);
+ tt_int_op(1,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
- tt_str_op("2.2.2.2",==, socks->address);
- tt_int_op(4369,==, socks->port);
+ tt_str_op("2.2.2.2",OP_EQ, socks->address);
+ tt_int_op(4369,OP_EQ, socks->port);
- tt_int_op(2,==, socks->usernamelen);
- tt_int_op(3,==, socks->passwordlen);
- tt_mem_op("me",==, socks->username, 2);
- tt_mem_op("you",==, socks->password, 3);
+ tt_int_op(2,OP_EQ, socks->usernamelen);
+ tt_int_op(3,OP_EQ, socks->passwordlen);
+ tt_mem_op("me",OP_EQ, socks->username, 2);
+ tt_mem_op("you",OP_EQ, socks->password, 3);
done:
;
@@ -411,10 +411,10 @@ test_socks_5_auth_before_negotiation(void *ptr)
tt_assert(fetch_from_buf_socks(buf, socks,
get_options()->TestSocks,
get_options()->SafeSocks) == -1);
- tt_int_op(0,==, socks->socks_version);
- tt_int_op(0,==, socks->replylen);
- tt_int_op(0,==, socks->reply[0]);
- tt_int_op(0,==, socks->reply[1]);
+ tt_int_op(0,OP_EQ, socks->socks_version);
+ tt_int_op(0,OP_EQ, socks->replylen);
+ tt_int_op(0,OP_EQ, socks->reply[0]);
+ tt_int_op(0,OP_EQ, socks->reply[1]);
done:
;
@@ -432,14 +432,14 @@ test_socks_5_malformed_commands(void *ptr)
*/
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\x01\x00\x01\x02\x02\x02\x02\x11\x11");
- tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),==,
- -1);
+ tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks, 1),
+ OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_NOT_ALLOWED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_NOT_ALLOWED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
buf_clear(buf);
socks_request_clear(socks);
@@ -448,13 +448,13 @@ test_socks_5_malformed_commands(void *ptr)
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\xF1\x00\x03\x0Etorproject.org\x11\x11");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, -1);
+ get_options()->SafeSocks),OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
buf_clear(buf);
socks_request_clear(socks);
@@ -465,13 +465,13 @@ test_socks_5_malformed_commands(void *ptr)
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\x01\x00\x03\x09\"\"\"\"\".com\x11\x11");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, -1);
+ get_options()->SafeSocks),OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_GENERAL_ERROR,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_GENERAL_ERROR,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
buf_clear(buf);
socks_request_clear(socks);
@@ -480,13 +480,13 @@ test_socks_5_malformed_commands(void *ptr)
ADD_DATA(buf, "\x05\x01\x00");
ADD_DATA(buf, "\x05\x01\x00\x23\x02\x02\x02\x02\x11\x11");
tt_int_op(fetch_from_buf_socks(buf, socks, get_options()->TestSocks,
- get_options()->SafeSocks),==, -1);
+ get_options()->SafeSocks),OP_EQ, -1);
- tt_int_op(5,==,socks->socks_version);
- tt_int_op(10,==,socks->replylen);
- tt_int_op(5,==,socks->reply[0]);
- tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,==,socks->reply[1]);
- tt_int_op(1,==,socks->reply[3]);
+ tt_int_op(5,OP_EQ,socks->socks_version);
+ tt_int_op(10,OP_EQ,socks->replylen);
+ tt_int_op(5,OP_EQ,socks->reply[0]);
+ tt_int_op(SOCKS5_ADDRESS_TYPE_NOT_SUPPORTED,OP_EQ,socks->reply[1]);
+ tt_int_op(1,OP_EQ,socks->reply[3]);
done:
;
diff --git a/src/test/test_status.c b/src/test/test_status.c
index 8bc0152ffb..aa71aa6a9b 100644
--- a/src/test/test_status.c
+++ b/src/test/test_status.c
@@ -86,62 +86,62 @@ NS(test_main)(void *arg)
expected = "0:00 hours";
actual = secs_to_uptime(0);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "0:00 hours";
actual = secs_to_uptime(1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "0:01 hours";
actual = secs_to_uptime(60);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "0:59 hours";
actual = secs_to_uptime(60 * 59);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1:00 hours";
actual = secs_to_uptime(60 * 60);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "23:59 hours";
actual = secs_to_uptime(60 * 60 * 23 + 60 * 59);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1 day 0:00 hours";
actual = secs_to_uptime(60 * 60 * 23 + 60 * 60);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1 day 0:00 hours";
actual = secs_to_uptime(86400 + 1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1 day 0:01 hours";
actual = secs_to_uptime(86400 + 60);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "10 days 0:00 hours";
actual = secs_to_uptime(86400 * 10);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "10 days 0:00 hours";
actual = secs_to_uptime(864000 + 1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "10 days 0:01 hours";
actual = secs_to_uptime(864000 + 60);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
done:
@@ -167,62 +167,62 @@ NS(test_main)(void *arg)
expected = "0 kB";
actual = bytes_to_usage(0);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "0 kB";
actual = bytes_to_usage(1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1 kB";
actual = bytes_to_usage(1024);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1023 kB";
actual = bytes_to_usage((1 << 20) - 1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.00 MB";
actual = bytes_to_usage((1 << 20));
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.00 MB";
actual = bytes_to_usage((1 << 20) + 5242);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.01 MB";
actual = bytes_to_usage((1 << 20) + 5243);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1024.00 MB";
actual = bytes_to_usage((1 << 30) - 1);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.00 GB";
actual = bytes_to_usage((1 << 30));
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.00 GB";
actual = bytes_to_usage((1 << 30) + 5368709);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "1.01 GB";
actual = bytes_to_usage((1 << 30) + 5368710);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
expected = "10.00 GB";
actual = bytes_to_usage((U64_LITERAL(1) << 30) * 10L);
- tt_str_op(actual, ==, expected);
+ tt_str_op(actual, OP_EQ, expected);
tor_free(actual);
done:
@@ -259,7 +259,7 @@ NS(test_main)(void *arg)
expected = -1;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
+ tt_int_op(actual, OP_EQ, expected);
done:
NS_UNMOCK(tls_get_write_overhead_ratio);
@@ -347,8 +347,8 @@ NS(test_main)(void *arg)
expected = 0;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
- tt_int_op(CALLED(logv), ==, 3);
+ tt_int_op(actual, OP_EQ, expected);
+ tt_int_op(CALLED(logv), OP_EQ, 3);
done:
NS_UNMOCK(tls_get_write_overhead_ratio);
@@ -411,39 +411,39 @@ NS(logv)(int severity, log_domain_mask_t domain,
switch (CALLED(logv))
{
case 0:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: It seems like we are not in the cached consensus.");
break;
case 1:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Tor's uptime is %s, with %d circuits open. "
"I've sent %s and received %s.%s");
- tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
- tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
- tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */
break;
case 2:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(
- strstr(funcname, "rep_hist_log_circuit_handshake_stats"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "rep_hist_log_circuit_handshake_stats"),
+ OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Circuit handshake stats since last time: %d/%d TAP, %d/%d NTor.");
- tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (TAP) */
- tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (TAP) */
- tt_int_op(va_arg(ap, int), ==, 1); /* handshakes assigned (NTOR) */
- tt_int_op(va_arg(ap, int), ==, 1); /* handshakes requested (NTOR) */
+ tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (TAP) */
+ tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (TAP) */
+ tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes assigned (NTOR) */
+ tt_int_op(va_arg(ap, int), OP_EQ, 1); /* handshakes requested (NTOR) */
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
@@ -502,7 +502,7 @@ NS(test_main)(void *arg)
expected = 0;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
+ tt_int_op(actual, OP_EQ, expected);
done:
NS_UNMOCK(tls_get_write_overhead_ratio);
@@ -564,18 +564,18 @@ static void
NS(logv)(int severity, log_domain_mask_t domain, const char *funcname,
const char *suffix, const char *format, va_list ap)
{
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Tor's uptime is %s, with %d circuits open. "
"I've sent %s and received %s.%s");
- tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
- tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
- tt_str_op(va_arg(ap, char *), ==, " We are currently hibernating.");
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, " We are currently hibernating.");
done:
;
@@ -638,8 +638,8 @@ NS(test_main)(void *arg)
expected = 0;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
- tt_int_op(CALLED(logv), ==, 2);
+ tt_int_op(actual, OP_EQ, expected);
+ tt_int_op(CALLED(logv), OP_EQ, 2);
done:
NS_UNMOCK(tls_get_write_overhead_ratio);
@@ -711,34 +711,35 @@ NS(logv)(int severity, log_domain_mask_t domain,
switch (CALLED(logv))
{
case 0:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Tor's uptime is %s, with %d circuits open. "
"I've sent %s and received %s.%s");
- tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
- tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
- tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */
break;
case 1:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_accounting"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_accounting"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Accounting enabled. Sent: %s / %s, Received: %s / %s. "
"The current accounting interval ends on %s, in %s.");
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_rcvd */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* acc_max */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* acc_max */
/* format_local_iso_time uses local tz, just check mins and secs. */
- tt_ptr_op(strstr(va_arg(ap, char *), ":01:00"), !=, NULL); /* end_buf */
- tt_str_op(va_arg(ap, char *), ==, "0:01 hours"); /* remaining */
+ tt_ptr_op(strstr(va_arg(ap, char *), ":01:00"),
+ OP_NE, NULL); /* end_buf */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:01 hours"); /* remaining */
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
@@ -824,8 +825,8 @@ NS(test_main)(void *arg)
expected = 0;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
- tt_int_op(CALLED(logv), ==, 2);
+ tt_int_op(actual, OP_EQ, expected);
+ tt_int_op(CALLED(logv), OP_EQ, 2);
done:
stats_n_data_bytes_packaged = 0;
@@ -893,27 +894,27 @@ NS(logv)(int severity, log_domain_mask_t domain, const char *funcname,
switch (CALLED(logv))
{
case 0:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Tor's uptime is %s, with %d circuits open. "
"I've sent %s and received %s.%s");
- tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
- tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
- tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */
break;
case 1:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Average packaged cell fullness: %2.3f%%");
- tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1);
+ tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1);
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
@@ -982,8 +983,8 @@ NS(test_main)(void *arg)
expected = 0;
actual = log_heartbeat(0);
- tt_int_op(actual, ==, expected);
- tt_int_op(CALLED(logv), ==, 2);
+ tt_int_op(actual, OP_EQ, expected);
+ tt_int_op(CALLED(logv), OP_EQ, 2);
done:
NS_UNMOCK(tls_get_write_overhead_ratio);
@@ -1049,26 +1050,26 @@ NS(logv)(int severity, log_domain_mask_t domain,
switch (CALLED(logv))
{
case 0:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==,
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ,
"Heartbeat: Tor's uptime is %s, with %d circuits open. "
"I've sent %s and received %s.%s");
- tt_str_op(va_arg(ap, char *), ==, "0:00 hours"); /* uptime */
- tt_int_op(va_arg(ap, int), ==, 0); /* count_circuits() */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_sent */
- tt_str_op(va_arg(ap, char *), ==, "0 kB"); /* bw_rcvd */
- tt_str_op(va_arg(ap, char *), ==, ""); /* hibernating */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0:00 hours"); /* uptime */
+ tt_int_op(va_arg(ap, int), OP_EQ, 0); /* count_circuits() */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_sent */
+ tt_str_op(va_arg(ap, char *), OP_EQ, "0 kB"); /* bw_rcvd */
+ tt_str_op(va_arg(ap, char *), OP_EQ, ""); /* hibernating */
break;
case 1:
- tt_int_op(severity, ==, LOG_NOTICE);
- tt_int_op(domain, ==, LD_HEARTBEAT);
- tt_ptr_op(strstr(funcname, "log_heartbeat"), !=, NULL);
- tt_ptr_op(suffix, ==, NULL);
- tt_str_op(format, ==, "TLS write overhead: %.f%%");
- tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, ==, 1);
+ tt_int_op(severity, OP_EQ, LOG_NOTICE);
+ tt_int_op(domain, OP_EQ, LD_HEARTBEAT);
+ tt_ptr_op(strstr(funcname, "log_heartbeat"), OP_NE, NULL);
+ tt_ptr_op(suffix, OP_EQ, NULL);
+ tt_str_op(format, OP_EQ, "TLS write overhead: %.f%%");
+ tt_int_op(fabs(va_arg(ap, double) - 100.0) <= DBL_EPSILON, OP_EQ, 1);
break;
default:
tt_abort_msg("unexpected call to logv()"); // TODO: prettyprint args
diff --git a/src/test/test_threads.c b/src/test/test_threads.c
new file mode 100644
index 0000000000..2ac08d4d28
--- /dev/null
+++ b/src/test/test_threads.c
@@ -0,0 +1,316 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#include "or.h"
+#include "compat_threads.h"
+#include "test.h"
+
+/** mutex for thread test to stop the threads hitting data at the same time. */
+static tor_mutex_t *thread_test_mutex_ = NULL;
+/** mutexes for the thread test to make sure that the threads have to
+ * interleave somewhat. */
+static tor_mutex_t *thread_test_start1_ = NULL,
+ *thread_test_start2_ = NULL;
+/** Shared strmap for the thread test. */
+static strmap_t *thread_test_strmap_ = NULL;
+/** The name of thread1 for the thread test */
+static char *thread1_name_ = NULL;
+/** The name of thread2 for the thread test */
+static char *thread2_name_ = NULL;
+
+static int thread_fns_failed = 0;
+
+static unsigned long thread_fn_tid1, thread_fn_tid2;
+
+static void thread_test_func_(void* _s) ATTR_NORETURN;
+
+/** How many iterations have the threads in the unit test run? */
+static int t1_count = 0, t2_count = 0;
+
+/** Helper function for threading unit tests: This function runs in a
+ * subthread. It grabs its own mutex (start1 or start2) to make sure that it
+ * should start, then it repeatedly alters _test_thread_strmap protected by
+ * thread_test_mutex_. */
+static void
+thread_test_func_(void* _s)
+{
+ char *s = _s;
+ int i, *count;
+ tor_mutex_t *m;
+ char buf[64];
+ char **cp;
+ if (!strcmp(s, "thread 1")) {
+ m = thread_test_start1_;
+ cp = &thread1_name_;
+ count = &t1_count;
+ thread_fn_tid1 = tor_get_thread_id();
+ } else {
+ m = thread_test_start2_;
+ cp = &thread2_name_;
+ count = &t2_count;
+ thread_fn_tid2 = tor_get_thread_id();
+ }
+
+ tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id());
+ *cp = tor_strdup(buf);
+
+ tor_mutex_acquire(m);
+
+ for (i=0; i<10000; ++i) {
+ tor_mutex_acquire(thread_test_mutex_);
+ strmap_set(thread_test_strmap_, "last to run", *cp);
+ ++*count;
+ tor_mutex_release(thread_test_mutex_);
+ }
+ tor_mutex_acquire(thread_test_mutex_);
+ strmap_set(thread_test_strmap_, s, *cp);
+ if (in_main_thread())
+ ++thread_fns_failed;
+ tor_mutex_release(thread_test_mutex_);
+
+ tor_mutex_release(m);
+
+ spawn_exit();
+}
+
+/** Run unit tests for threading logic. */
+static void
+test_threads_basic(void *arg)
+{
+ char *s1 = NULL, *s2 = NULL;
+ int done = 0, timedout = 0;
+ time_t started;
+#ifndef _WIN32
+ struct timeval tv;
+ tv.tv_sec=0;
+ tv.tv_usec=100*1000;
+#endif
+ (void) arg;
+
+ set_main_thread();
+
+ thread_test_mutex_ = tor_mutex_new();
+ thread_test_start1_ = tor_mutex_new();
+ thread_test_start2_ = tor_mutex_new();
+ thread_test_strmap_ = strmap_new();
+ s1 = tor_strdup("thread 1");
+ s2 = tor_strdup("thread 2");
+ tor_mutex_acquire(thread_test_start1_);
+ tor_mutex_acquire(thread_test_start2_);
+ spawn_func(thread_test_func_, s1);
+ spawn_func(thread_test_func_, s2);
+ tor_mutex_release(thread_test_start2_);
+ tor_mutex_release(thread_test_start1_);
+ started = time(NULL);
+ while (!done) {
+ tor_mutex_acquire(thread_test_mutex_);
+ strmap_assert_ok(thread_test_strmap_);
+ if (strmap_get(thread_test_strmap_, "thread 1") &&
+ strmap_get(thread_test_strmap_, "thread 2")) {
+ done = 1;
+ } else if (time(NULL) > started + 150) {
+ timedout = done = 1;
+ }
+ tor_mutex_release(thread_test_mutex_);
+#ifndef _WIN32
+ /* Prevent the main thread from starving the worker threads. */
+ select(0, NULL, NULL, NULL, &tv);
+#endif
+ }
+ tor_mutex_acquire(thread_test_start1_);
+ tor_mutex_release(thread_test_start1_);
+ tor_mutex_acquire(thread_test_start2_);
+ tor_mutex_release(thread_test_start2_);
+
+ tor_mutex_free(thread_test_mutex_);
+
+ if (timedout) {
+ printf("\nTimed out: %d %d", t1_count, t2_count);
+ tt_assert(strmap_get(thread_test_strmap_, "thread 1"));
+ tt_assert(strmap_get(thread_test_strmap_, "thread 2"));
+ tt_assert(!timedout);
+ }
+
+ /* different thread IDs. */
+ tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"),
+ strmap_get(thread_test_strmap_, "thread 2")));
+ tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"),
+ strmap_get(thread_test_strmap_, "last to run")) ||
+ !strcmp(strmap_get(thread_test_strmap_, "thread 2"),
+ strmap_get(thread_test_strmap_, "last to run")));
+
+ tt_int_op(thread_fns_failed, ==, 0);
+ tt_int_op(thread_fn_tid1, !=, thread_fn_tid2);
+
+ done:
+ tor_free(s1);
+ tor_free(s2);
+ tor_free(thread1_name_);
+ tor_free(thread2_name_);
+ if (thread_test_strmap_)
+ strmap_free(thread_test_strmap_, NULL);
+ if (thread_test_start1_)
+ tor_mutex_free(thread_test_start1_);
+ if (thread_test_start2_)
+ tor_mutex_free(thread_test_start2_);
+}
+
+typedef struct cv_testinfo_s {
+ tor_cond_t *cond;
+ tor_mutex_t *mutex;
+ int value;
+ int addend;
+ int shutdown;
+ int n_shutdown;
+ int n_wakeups;
+ int n_timeouts;
+ int n_threads;
+ const struct timeval *tv;
+} cv_testinfo_t;
+
+static cv_testinfo_t *
+cv_testinfo_new(void)
+{
+ cv_testinfo_t *i = tor_malloc_zero(sizeof(*i));
+ i->cond = tor_cond_new();
+ i->mutex = tor_mutex_new_nonrecursive();
+ return i;
+}
+
+static void
+cv_testinfo_free(cv_testinfo_t *i)
+{
+ if (!i)
+ return;
+ tor_cond_free(i->cond);
+ tor_mutex_free(i->mutex);
+ tor_free(i);
+}
+
+static void cv_test_thr_fn_(void *arg) ATTR_NORETURN;
+
+static void
+cv_test_thr_fn_(void *arg)
+{
+ cv_testinfo_t *i = arg;
+ int tid, r;
+
+ tor_mutex_acquire(i->mutex);
+ tid = i->n_threads++;
+ tor_mutex_release(i->mutex);
+ (void) tid;
+
+ tor_mutex_acquire(i->mutex);
+ while (1) {
+ if (i->addend) {
+ i->value += i->addend;
+ i->addend = 0;
+ }
+
+ if (i->shutdown) {
+ ++i->n_shutdown;
+ i->shutdown = 0;
+ tor_mutex_release(i->mutex);
+ spawn_exit();
+ }
+ r = tor_cond_wait(i->cond, i->mutex, i->tv);
+ ++i->n_wakeups;
+ if (r == 1) {
+ ++i->n_timeouts;
+ tor_mutex_release(i->mutex);
+ spawn_exit();
+ }
+ }
+}
+
+static void
+test_threads_conditionvar(void *arg)
+{
+ cv_testinfo_t *ti=NULL;
+ const struct timeval msec100 = { 0, 100*1000 };
+ const int timeout = !strcmp(arg, "tv");
+
+ ti = cv_testinfo_new();
+ if (timeout) {
+ ti->tv = &msec100;
+ }
+ spawn_func(cv_test_thr_fn_, ti);
+ spawn_func(cv_test_thr_fn_, ti);
+ spawn_func(cv_test_thr_fn_, ti);
+ spawn_func(cv_test_thr_fn_, ti);
+
+ tor_mutex_acquire(ti->mutex);
+ ti->addend = 7;
+ ti->shutdown = 1;
+ tor_cond_signal_one(ti->cond);
+ tor_mutex_release(ti->mutex);
+
+#define SPIN() \
+ while (1) { \
+ tor_mutex_acquire(ti->mutex); \
+ if (ti->addend == 0) { \
+ break; \
+ } \
+ tor_mutex_release(ti->mutex); \
+ }
+
+ SPIN();
+
+ ti->addend = 30;
+ ti->shutdown = 1;
+ tor_cond_signal_all(ti->cond);
+ tor_mutex_release(ti->mutex);
+ SPIN();
+
+ ti->addend = 1000;
+ if (! timeout) ti->shutdown = 1;
+ tor_cond_signal_one(ti->cond);
+ tor_mutex_release(ti->mutex);
+ SPIN();
+ ti->addend = 300;
+ if (! timeout) ti->shutdown = 1;
+ tor_cond_signal_all(ti->cond);
+ tor_mutex_release(ti->mutex);
+
+ SPIN();
+ tor_mutex_release(ti->mutex);
+
+ tt_int_op(ti->value, ==, 1337);
+ if (!timeout) {
+ tt_int_op(ti->n_shutdown, ==, 4);
+ } else {
+#ifdef _WIN32
+ Sleep(500); /* msec */
+#elif defined(HAVE_USLEEP)
+ usleep(500*1000); /* usec */
+#else
+ {
+ struct tv = { 0, 500*1000 };
+ select(0, NULL, NULL, NULL, &tv);
+ }
+#endif
+ tor_mutex_acquire(ti->mutex);
+ tt_int_op(ti->n_shutdown, ==, 2);
+ tt_int_op(ti->n_timeouts, ==, 2);
+ tor_mutex_release(ti->mutex);
+ }
+
+ done:
+ cv_testinfo_free(ti);
+}
+
+#define THREAD_TEST(name) \
+ { #name, test_threads_##name, TT_FORK, NULL, NULL }
+
+struct testcase_t thread_tests[] = {
+ THREAD_TEST(basic),
+ { "conditionvar", test_threads_conditionvar, TT_FORK,
+ &passthrough_setup, (void*)"no-tv" },
+ { "conditionvar_timeout", test_threads_conditionvar, TT_FORK,
+ &passthrough_setup, (void*)"tv" },
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_util.c b/src/test/test_util.c
index 04dfe64f5a..e5df5b4494 100644
--- a/src/test/test_util.c
+++ b/src/test/test_util.c
@@ -1,6 +1,6 @@
/* Copyright (c) 2001-2004, Roger Dingledine.
* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2014, The Tor Project, Inc. */
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
@@ -53,20 +53,20 @@ test_util_read_until_eof_impl(const char *fname, size_t file_len,
crypto_rand(test_str, file_len);
r = write_bytes_to_file(fifo_name, test_str, file_len, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
fd = open(fifo_name, O_RDONLY|O_BINARY);
- tt_int_op(fd, >=, 0);
+ tt_int_op(fd, OP_GE, 0);
str = read_file_to_str_until_eof(fd, read_limit, &sz);
tt_assert(str != NULL);
if (read_limit < file_len)
- tt_int_op(sz, ==, read_limit);
+ tt_int_op(sz, OP_EQ, read_limit);
else
- tt_int_op(sz, ==, file_len);
+ tt_int_op(sz, OP_EQ, file_len);
- tt_mem_op(test_str, ==, str, sz);
- tt_int_op(str[sz], ==, '\0');
+ tt_mem_op(test_str, OP_EQ, str, sz);
+ tt_int_op(str[sz], OP_EQ, '\0');
done:
unlink(fifo_name);
@@ -168,17 +168,17 @@ test_util_write_chunks_to_file(void *arg)
// write a known string to a file where the tempfile will be
r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
// call write_chunks_to_file
r = write_chunks_to_file(fname, chunks, 1, 0);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
// assert the file has been written (expected size)
str = read_file_to_str(fname, RFTS_BIN, &st);
tt_assert(str != NULL);
- tt_u64_op((uint64_t)st.st_size, ==, data_str_len);
- tt_mem_op(data_str, ==, str, data_str_len);
+ tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len);
+ tt_mem_op(data_str, OP_EQ, str, data_str_len);
tor_free(str);
// assert that the tempfile is removed (should not leave artifacts)
@@ -187,7 +187,7 @@ test_util_write_chunks_to_file(void *arg)
// Remove old testfile for second test
r = unlink(fname);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
tor_free(fname);
tor_free(tempname);
@@ -199,24 +199,24 @@ test_util_write_chunks_to_file(void *arg)
// write a known string to a file where the tempfile will be
r = write_bytes_to_file(tempname, temp_str, temp_str_len, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
// call write_chunks_to_file with no_tempfile = true
r = write_chunks_to_file(fname, chunks, 1, 1);
- tt_int_op(r, ==, 0);
+ tt_int_op(r, OP_EQ, 0);
// assert the file has been written (expected size)
str = read_file_to_str(fname, RFTS_BIN, &st);
tt_assert(str != NULL);
- tt_u64_op((uint64_t)st.st_size, ==, data_str_len);
- tt_mem_op(data_str, ==, str, data_str_len);
+ tt_u64_op((uint64_t)st.st_size, OP_EQ, data_str_len);
+ tt_mem_op(data_str, OP_EQ, str, data_str_len);
tor_free(str);
// assert the tempfile still contains the known string
str = read_file_to_str(tempname, RFTS_BIN, &st);
tt_assert(str != NULL);
- tt_u64_op((uint64_t)st.st_size, ==, temp_str_len);
- tt_mem_op(temp_str, ==, str, temp_str_len);
+ tt_u64_op((uint64_t)st.st_size, OP_EQ, temp_str_len);
+ tt_mem_op(temp_str, OP_EQ, str, temp_str_len);
done:
unlink(fname);
@@ -229,7 +229,7 @@ test_util_write_chunks_to_file(void *arg)
tor_free(temp_str);
}
-#define _TFE(a, b, f) tt_int_op((a).f, ==, (b).f)
+#define _TFE(a, b, f) tt_int_op((a).f, OP_EQ, (b).f)
/** test the minimum set of struct tm fields needed for a unique epoch value
* this is also the set we use to test tor_timegm */
#define TM_EQUAL(a, b) \
@@ -261,23 +261,23 @@ test_util_time(void *arg)
end.tv_sec = 5;
end.tv_usec = 5000;
- tt_int_op(0L,==, tv_udiff(&start, &end));
+ tt_int_op(0L,OP_EQ, tv_udiff(&start, &end));
end.tv_usec = 7000;
- tt_int_op(2000L,==, tv_udiff(&start, &end));
+ tt_int_op(2000L,OP_EQ, tv_udiff(&start, &end));
end.tv_sec = 6;
- tt_int_op(1002000L,==, tv_udiff(&start, &end));
+ tt_int_op(1002000L,OP_EQ, tv_udiff(&start, &end));
end.tv_usec = 0;
- tt_int_op(995000L,==, tv_udiff(&start, &end));
+ tt_int_op(995000L,OP_EQ, tv_udiff(&start, &end));
end.tv_sec = 4;
- tt_int_op(-1005000L,==, tv_udiff(&start, &end));
+ tt_int_op(-1005000L,OP_EQ, tv_udiff(&start, &end));
/* Test tor_timegm & tor_gmtime_r */
@@ -299,26 +299,26 @@ test_util_time(void *arg)
a_time.tm_min = 14;
a_time.tm_sec = 55;
t_res = 1062224095UL;
- tt_int_op(t_res, ==, tor_timegm(&a_time));
+ tt_int_op(t_res, OP_EQ, tor_timegm(&a_time));
tor_gmtime_r(&t_res, &b_time);
TM_EQUAL(a_time, b_time);
a_time.tm_year = 2004-1900; /* Try a leap year, after feb. */
t_res = 1093846495UL;
- tt_int_op(t_res, ==, tor_timegm(&a_time));
+ tt_int_op(t_res, OP_EQ, tor_timegm(&a_time));
tor_gmtime_r(&t_res, &b_time);
TM_EQUAL(a_time, b_time);
a_time.tm_mon = 1; /* Try a leap year, in feb. */
a_time.tm_mday = 10;
t_res = 1076393695UL;
- tt_int_op(t_res, ==, tor_timegm(&a_time));
+ tt_int_op(t_res, OP_EQ, tor_timegm(&a_time));
tor_gmtime_r(&t_res, &b_time);
TM_EQUAL(a_time, b_time);
a_time.tm_mon = 0;
t_res = 1073715295UL;
- tt_int_op(t_res, ==, tor_timegm(&a_time));
+ tt_int_op(t_res, OP_EQ, tor_timegm(&a_time));
tor_gmtime_r(&t_res, &b_time);
TM_EQUAL(a_time, b_time);
@@ -328,27 +328,27 @@ test_util_time(void *arg)
/* Wrong year < 1970 */
a_time.tm_year = 1969-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = -1-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
#if SIZEOF_INT == 4 || SIZEOF_INT == 8
a_time.tm_year = -1*(1 << 16);
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* one of the smallest tm_year values my 64 bit system supports:
* t_res = -9223372036854775LL without clamping */
a_time.tm_year = -292275055-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = INT32_MIN;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
#endif
#if SIZEOF_INT == 8
a_time.tm_year = -1*(1 << 48);
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* while unlikely, the system's gmtime(_r) could return
* a "correct" retrospective gregorian negative year value,
@@ -356,25 +356,25 @@ test_util_time(void *arg)
* -1*(2^63)/60/60/24*2000/730485 + 1970 = -292277022657
* 730485 is the number of days in two millenia, including leap days */
a_time.tm_year = -292277022657-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = INT64_MIN;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
#endif
/* Wrong year >= INT32_MAX - 1900 */
#if SIZEOF_INT == 4 || SIZEOF_INT == 8
a_time.tm_year = INT32_MAX-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = INT32_MAX;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
#endif
#if SIZEOF_INT == 8
/* one of the largest tm_year values my 64 bit system supports */
a_time.tm_year = 292278994-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* while unlikely, the system's gmtime(_r) could return
* a "correct" proleptic gregorian year value,
@@ -382,72 +382,72 @@ test_util_time(void *arg)
* (2^63-1)/60/60/24*2000/730485 + 1970 = 292277026596
* 730485 is the number of days in two millenia, including leap days */
a_time.tm_year = 292277026596-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = INT64_MAX-1900;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = INT64_MAX;
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
#endif
/* month */
a_time.tm_year = 2007-1900; /* restore valid year */
a_time.tm_mon = 12; /* Wrong month, it's 0-based */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_mon = -1; /* Wrong month */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* day */
a_time.tm_mon = 6; /* Try July */
a_time.tm_mday = 32; /* Wrong day */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_mon = 5; /* Try June */
a_time.tm_mday = 31; /* Wrong day */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = 2008-1900; /* Try a leap year */
a_time.tm_mon = 1; /* in feb. */
a_time.tm_mday = 30; /* Wrong day */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_year = 2011-1900; /* Try a non-leap year */
a_time.tm_mon = 1; /* in feb. */
a_time.tm_mday = 29; /* Wrong day */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_mday = 0; /* Wrong day, it's 1-based (to be different) */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* hour */
a_time.tm_mday = 3; /* restore valid month day */
a_time.tm_hour = 24; /* Wrong hour, it's 0-based */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_hour = -1; /* Wrong hour */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* minute */
a_time.tm_hour = 22; /* restore valid hour */
a_time.tm_min = 60; /* Wrong minute, it's 0-based */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_min = -1; /* Wrong minute */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* second */
a_time.tm_min = 37; /* restore valid minute */
a_time.tm_sec = 61; /* Wrong second: 0-based with leap seconds */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
a_time.tm_sec = -1; /* Wrong second */
- tt_int_op((time_t) -1,==, tor_timegm(&a_time));
+ tt_int_op((time_t) -1,OP_EQ, tor_timegm(&a_time));
/* Test tor_gmtime_r out of range */
@@ -534,69 +534,72 @@ test_util_time(void *arg)
/* Test {format,parse}_rfc1123_time */
format_rfc1123_time(timestr, 0);
- tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",==, timestr);
+ tt_str_op("Thu, 01 Jan 1970 00:00:00 GMT",OP_EQ, timestr);
format_rfc1123_time(timestr, (time_t)1091580502UL);
- tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",==, timestr);
+ tt_str_op("Wed, 04 Aug 2004 00:48:22 GMT",OP_EQ, timestr);
t_res = 0;
i = parse_rfc1123_time(timestr, &t_res);
- tt_int_op(0,==, i);
- tt_int_op(t_res,==, (time_t)1091580502UL);
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(t_res,OP_EQ, (time_t)1091580502UL);
/* The timezone doesn't matter */
t_res = 0;
- tt_int_op(0,==, parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res));
- tt_int_op(t_res,==, (time_t)1091580502UL);
- tt_int_op(-1,==,
+ tt_int_op(0,OP_EQ,
+ parse_rfc1123_time("Wed, 04 Aug 2004 00:48:22 ZUL", &t_res));
+ tt_int_op(t_res,OP_EQ, (time_t)1091580502UL);
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, zz Aug 2004 99-99x99 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 32 Mar 2011 00:00:00 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 2011 24:00:00 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 2011 23:60:00 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 2011 23:59:62 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 1969 23:59:59 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Ene 2011 23:59:59 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 2011 23:59:59 GM", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 29 Feb 2011 16:00:00 GMT", &t_res));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_rfc1123_time("Wed, 30 Mar 2011 23:59:61 GMT", &t_res));
/* Test parse_iso_time */
t_res = 0;
i = parse_iso_time("", &t_res);
- tt_int_op(-1,==, i);
+ tt_int_op(-1,OP_EQ, i);
t_res = 0;
i = parse_iso_time("2004-08-32 00:48:22", &t_res);
- tt_int_op(-1,==, i);
+ tt_int_op(-1,OP_EQ, i);
t_res = 0;
i = parse_iso_time("1969-08-03 00:48:22", &t_res);
- tt_int_op(-1,==, i);
+ tt_int_op(-1,OP_EQ, i);
t_res = 0;
i = parse_iso_time("2004-08-04 00:48:22", &t_res);
- tt_int_op(0,==, i);
- tt_int_op(t_res,==, (time_t)1091580502UL);
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(t_res,OP_EQ, (time_t)1091580502UL);
t_res = 0;
i = parse_iso_time("2004-8-4 0:48:22", &t_res);
- tt_int_op(0,==, i);
- tt_int_op(t_res,==, (time_t)1091580502UL);
- tt_int_op(-1,==, parse_iso_time("2004-08-zz 99-99x99 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-03-32 00:00:00 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-03-30 24:00:00 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-03-30 23:60:00 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-03-30 23:59:62 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("1969-03-30 23:59:59 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-00-30 23:59:59 GMT", &t_res));
- tt_int_op(-1,==, parse_iso_time("2147483647-08-29 14:00:00", &t_res));
- tt_int_op(-1,==, parse_iso_time("2011-03-30 23:59", &t_res));
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(t_res,OP_EQ, (time_t)1091580502UL);
+ tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-zz 99-99x99", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-32 00:00:00", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 24:00:00", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:60:00", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59:62", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("1969-03-30 23:59:59", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-00-30 23:59:59", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2147483647-08-29 14:00:00", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2011-03-30 23:59", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22.100", &t_res));
+ tt_int_op(-1,OP_EQ, parse_iso_time("2004-08-04 00:48:22XYZ", &t_res));
/* Test tor_gettimeofday */
@@ -609,14 +612,14 @@ test_util_time(void *arg)
/* now make sure time works. */
tor_gettimeofday(&end);
/* We might've timewarped a little. */
- tt_int_op(tv_udiff(&start, &end), >=, -5000);
+ tt_int_op(tv_udiff(&start, &end), OP_GE, -5000);
/* Test format_iso_time */
tv.tv_sec = (time_t)1326296338;
tv.tv_usec = 3060;
format_iso_time(timestr, (time_t)tv.tv_sec);
- tt_str_op("2012-01-11 15:38:58",==, timestr);
+ tt_str_op("2012-01-11 15:38:58",OP_EQ, timestr);
/* The output of format_local_iso_time will vary by timezone, and setting
our timezone for testing purposes would be a nontrivial flaky pain.
Skip this test for now.
@@ -624,11 +627,11 @@ test_util_time(void *arg)
test_streq("2012-01-11 10:38:58", timestr);
*/
format_iso_time_nospace(timestr, (time_t)tv.tv_sec);
- tt_str_op("2012-01-11T15:38:58",==, timestr);
- tt_int_op(strlen(timestr),==, ISO_TIME_LEN);
+ tt_str_op("2012-01-11T15:38:58",OP_EQ, timestr);
+ tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_LEN);
format_iso_time_nospace_usec(timestr, &tv);
- tt_str_op("2012-01-11T15:38:58.003060",==, timestr);
- tt_int_op(strlen(timestr),==, ISO_TIME_USEC_LEN);
+ tt_str_op("2012-01-11T15:38:58.003060",OP_EQ, timestr);
+ tt_int_op(strlen(timestr),OP_EQ, ISO_TIME_USEC_LEN);
done:
;
@@ -643,72 +646,74 @@ test_util_parse_http_time(void *arg)
#define T(s) do { \
format_iso_time(b, tor_timegm(&a_time)); \
- tt_str_op(b, ==, (s)); \
+ tt_str_op(b, OP_EQ, (s)); \
b[0]='\0'; \
} while (0)
/* Test parse_http_time */
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Sunday, 32 Aug 2004 00:48:22 GMT", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Sunday, 3 Aug 1869 00:48:22 GMT", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Sunday, 32-Aug-94 00:48:22 GMT", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Sunday, 3-Ago-04 00:48:22", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Sunday, August the third", &a_time));
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ,
parse_http_time("Wednesday,,04 Aug 1994 00:48:22 GMT", &a_time));
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
parse_http_time("Wednesday, 04 Aug 1994 00:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
parse_http_time("Wednesday, 4 Aug 1994 0:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
parse_http_time("Miercoles, 4 Aug 1994 0:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
parse_http_time("Wednesday, 04-Aug-94 00:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ,
+ parse_http_time("Wednesday, 4-Aug-94 0:48:22 GMT", &a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ,
+ parse_http_time("Miercoles, 4-Aug-94 0:48:22 GMT", &a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 04 00:48:22 1994", &a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ, parse_http_time("Wed Aug 4 0:48:22 1994", &a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time));
- tt_int_op((time_t)775961302UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ, parse_http_time("Mie Aug 4 0:48:22 1994", &a_time));
+ tt_int_op((time_t)775961302UL,OP_EQ, tor_timegm(&a_time));
T("1994-08-04 00:48:22");
- tt_int_op(0,==, parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time));
- tt_int_op((time_t)1325376000UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ,parse_http_time("Sun, 1 Jan 2012 00:00:00 GMT", &a_time));
+ tt_int_op((time_t)1325376000UL,OP_EQ, tor_timegm(&a_time));
T("2012-01-01 00:00:00");
- tt_int_op(0,==, parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time));
- tt_int_op((time_t)1356912000UL,==, tor_timegm(&a_time));
+ tt_int_op(0,OP_EQ,parse_http_time("Mon, 31 Dec 2012 00:00:00 GMT", &a_time));
+ tt_int_op((time_t)1356912000UL,OP_EQ, tor_timegm(&a_time));
T("2012-12-31 00:00:00");
- tt_int_op(-1,==, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-03-32 00:00:00 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-03-30 24:00:00 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-03-30 23:60:00 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-03-30 23:59:62 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("1969-03-30 23:59:59 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-00-30 23:59:59 GMT", &a_time));
- tt_int_op(-1,==, parse_http_time("2011-03-30 23:59", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2004-08-zz 99-99x99 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-03-32 00:00:00 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 24:00:00 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:60:00 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59:62 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("1969-03-30 23:59:59 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-00-30 23:59:59 GMT", &a_time));
+ tt_int_op(-1,OP_EQ, parse_http_time("2011-03-30 23:59", &a_time));
#undef T
done:
@@ -743,110 +748,110 @@ test_util_config_line(void *arg)
str = buf;
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k");
- tt_str_op(v,==, "v");
+ tt_str_op(k,OP_EQ, "k");
+ tt_str_op(v,OP_EQ, "v");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "key value with"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "key");
- tt_str_op(v,==, "value with spaces");
+ tt_str_op(k,OP_EQ, "key");
+ tt_str_op(v,OP_EQ, "value with spaces");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "keykey"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "keykey");
- tt_str_op(v,==, "val");
+ tt_str_op(k,OP_EQ, "keykey");
+ tt_str_op(v,OP_EQ, "val");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "k2\n"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k2");
- tt_str_op(v,==, "");
+ tt_str_op(k,OP_EQ, "k2");
+ tt_str_op(v,OP_EQ, "");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "k3 \n"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k3");
- tt_str_op(v,==, "");
+ tt_str_op(k,OP_EQ, "k3");
+ tt_str_op(v,OP_EQ, "");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "#comment"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k4");
- tt_str_op(v,==, "");
+ tt_str_op(k,OP_EQ, "k4");
+ tt_str_op(v,OP_EQ, "");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "k5#abc"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k5");
- tt_str_op(v,==, "");
+ tt_str_op(k,OP_EQ, "k5");
+ tt_str_op(v,OP_EQ, "");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "k6"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k6");
- tt_str_op(v,==, "val");
+ tt_str_op(k,OP_EQ, "k6");
+ tt_str_op(v,OP_EQ, "val");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "kseven"));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "kseven");
- tt_str_op(v,==, "a quoted \'string");
+ tt_str_op(k,OP_EQ, "kseven");
+ tt_str_op(v,OP_EQ, "a quoted \'string");
tor_free(k); tor_free(v);
tt_assert(!strcmpstart(str, "k8 "));
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k8");
- tt_str_op(v,==, "a quoted\n\"str\\ing\t\x01\x01\x01\"");
+ tt_str_op(k,OP_EQ, "k8");
+ tt_str_op(v,OP_EQ, "a quoted\n\"str\\ing\t\x01\x01\x01\"");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k9");
- tt_str_op(v,==, "a line that spans two lines.");
+ tt_str_op(k,OP_EQ, "k9");
+ tt_str_op(v,OP_EQ, "a line that spans two lines.");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k10");
- tt_str_op(v,==, "more than one continuation");
+ tt_str_op(k,OP_EQ, "k10");
+ tt_str_op(v,OP_EQ, "more than one continuation");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k11");
- tt_str_op(v,==, "continuation at the start");
+ tt_str_op(k,OP_EQ, "k11");
+ tt_str_op(v,OP_EQ, "continuation at the start");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k12");
- tt_str_op(v,==, "line with a embedded");
+ tt_str_op(k,OP_EQ, "k12");
+ tt_str_op(v,OP_EQ, "line with a embedded");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k13");
- tt_str_op(v,==, "continuation at the very start");
+ tt_str_op(k,OP_EQ, "k13");
+ tt_str_op(v,OP_EQ, "continuation at the very start");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k14");
- tt_str_op(v,==, "a line that has a comment and" );
+ tt_str_op(k,OP_EQ, "k14");
+ tt_str_op(v,OP_EQ, "a line that has a comment and" );
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k15");
- tt_str_op(v,==, "this should be the next new line");
+ tt_str_op(k,OP_EQ, "k15");
+ tt_str_op(v,OP_EQ, "this should be the next new line");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k16");
- tt_str_op(v,==, "a line that has a comment and" );
+ tt_str_op(k,OP_EQ, "k16");
+ tt_str_op(v,OP_EQ, "a line that has a comment and" );
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k17");
- tt_str_op(v,==, "this should be the next new line");
+ tt_str_op(k,OP_EQ, "k17");
+ tt_str_op(v,OP_EQ, "this should be the next new line");
tor_free(k); tor_free(v);
- tt_str_op(str,==, "");
+ tt_str_op(str,OP_EQ, "");
done:
tor_free(k);
@@ -877,30 +882,30 @@ test_util_config_line_quotes(void *arg)
str = buf1;
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "kTrailingSpace");
- tt_str_op(v,==, "quoted value");
+ tt_str_op(k,OP_EQ, "kTrailingSpace");
+ tt_str_op(v,OP_EQ, "quoted value");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
str = buf2;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
str = buf3;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
str = buf4;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
done:
@@ -924,16 +929,16 @@ test_util_config_line_comment_character(void *arg)
str = buf;
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k1");
- tt_str_op(v,==, "# in quotes");
+ tt_str_op(k,OP_EQ, "k1");
+ tt_str_op(v,OP_EQ, "# in quotes");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "k2");
- tt_str_op(v,==, "some value");
+ tt_str_op(k,OP_EQ, "k2");
+ tt_str_op(v,OP_EQ, "some value");
tor_free(k); tor_free(v);
- tt_str_op(str,==, "k3 /home/user/myTorNetwork#2\n");
+ tt_str_op(str,OP_EQ, "k3 /home/user/myTorNetwork#2\n");
#if 0
str = parse_config_line_from_str(str, &k, &v);
@@ -994,91 +999,91 @@ test_util_config_line_escaped_content(void *arg)
str = buf1;
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "HexadecimalLower");
- tt_str_op(v,==, "*");
+ tt_str_op(k,OP_EQ, "HexadecimalLower");
+ tt_str_op(v,OP_EQ, "*");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "HexadecimalUpper");
- tt_str_op(v,==, "*");
+ tt_str_op(k,OP_EQ, "HexadecimalUpper");
+ tt_str_op(v,OP_EQ, "*");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "HexadecimalUpperX");
- tt_str_op(v,==, "*");
+ tt_str_op(k,OP_EQ, "HexadecimalUpperX");
+ tt_str_op(v,OP_EQ, "*");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "Octal");
- tt_str_op(v,==, "*");
+ tt_str_op(k,OP_EQ, "Octal");
+ tt_str_op(v,OP_EQ, "*");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "Newline");
- tt_str_op(v,==, "\n");
+ tt_str_op(k,OP_EQ, "Newline");
+ tt_str_op(v,OP_EQ, "\n");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "Tab");
- tt_str_op(v,==, "\t");
+ tt_str_op(k,OP_EQ, "Tab");
+ tt_str_op(v,OP_EQ, "\t");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "CarriageReturn");
- tt_str_op(v,==, "\r");
+ tt_str_op(k,OP_EQ, "CarriageReturn");
+ tt_str_op(v,OP_EQ, "\r");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "DoubleQuote");
- tt_str_op(v,==, "\"");
+ tt_str_op(k,OP_EQ, "DoubleQuote");
+ tt_str_op(v,OP_EQ, "\"");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "SimpleQuote");
- tt_str_op(v,==, "'");
+ tt_str_op(k,OP_EQ, "SimpleQuote");
+ tt_str_op(v,OP_EQ, "'");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "Backslash");
- tt_str_op(v,==, "\\");
+ tt_str_op(k,OP_EQ, "Backslash");
+ tt_str_op(v,OP_EQ, "\\");
tor_free(k); tor_free(v);
str = parse_config_line_from_str(str, &k, &v);
- tt_str_op(k,==, "Mix");
- tt_str_op(v,==, "This is a \"star\":\t'*'\nAnd second line");
+ tt_str_op(k,OP_EQ, "Mix");
+ tt_str_op(v,OP_EQ, "This is a \"star\":\t'*'\nAnd second line");
tor_free(k); tor_free(v);
- tt_str_op(str,==, "");
+ tt_str_op(str,OP_EQ, "");
str = buf2;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
str = buf3;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
str = buf4;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
#if 0
str = buf5;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str, ==, NULL);
+ tt_ptr_op(str, OP_EQ, NULL);
tor_free(k); tor_free(v);
#endif
str = buf6;
str = parse_config_line_from_str(str, &k, &v);
- tt_ptr_op(str,==, NULL);
+ tt_ptr_op(str,OP_EQ, NULL);
tor_free(k); tor_free(v);
done:
@@ -1096,39 +1101,39 @@ test_util_expand_filename(void *arg)
setenv("HOME", "/home/itv", 1); /* For "internal test value" */
str = expand_filename("");
- tt_str_op("",==, str);
+ tt_str_op("",OP_EQ, str);
tor_free(str);
str = expand_filename("/normal/path");
- tt_str_op("/normal/path",==, str);
+ tt_str_op("/normal/path",OP_EQ, str);
tor_free(str);
str = expand_filename("/normal/trailing/path/");
- tt_str_op("/normal/trailing/path/",==, str);
+ tt_str_op("/normal/trailing/path/",OP_EQ, str);
tor_free(str);
str = expand_filename("~");
- tt_str_op("/home/itv/",==, str);
+ tt_str_op("/home/itv/",OP_EQ, str);
tor_free(str);
str = expand_filename("$HOME/nodice");
- tt_str_op("$HOME/nodice",==, str);
+ tt_str_op("$HOME/nodice",OP_EQ, str);
tor_free(str);
str = expand_filename("~/");
- tt_str_op("/home/itv/",==, str);
+ tt_str_op("/home/itv/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/foobarqux");
- tt_str_op("/home/itv/foobarqux",==, str);
+ tt_str_op("/home/itv/foobarqux",OP_EQ, str);
tor_free(str);
str = expand_filename("~/../../etc/passwd");
- tt_str_op("/home/itv/../../etc/passwd",==, str);
+ tt_str_op("/home/itv/../../etc/passwd",OP_EQ, str);
tor_free(str);
str = expand_filename("~/trailing/");
- tt_str_op("/home/itv/trailing/",==, str);
+ tt_str_op("/home/itv/trailing/",OP_EQ, str);
tor_free(str);
/* Ideally we'd test ~anotheruser, but that's shady to test (we'd
have to somehow inject/fake the get_user_homedir call) */
@@ -1137,15 +1142,15 @@ test_util_expand_filename(void *arg)
setenv("HOME", "/home/itv/", 1);
str = expand_filename("~");
- tt_str_op("/home/itv/",==, str);
+ tt_str_op("/home/itv/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/");
- tt_str_op("/home/itv/",==, str);
+ tt_str_op("/home/itv/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/foo");
- tt_str_op("/home/itv/foo",==, str);
+ tt_str_op("/home/itv/foo",OP_EQ, str);
tor_free(str);
/* Try with empty $HOME */
@@ -1153,15 +1158,15 @@ test_util_expand_filename(void *arg)
setenv("HOME", "", 1);
str = expand_filename("~");
- tt_str_op("/",==, str);
+ tt_str_op("/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/");
- tt_str_op("/",==, str);
+ tt_str_op("/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/foobar");
- tt_str_op("/foobar",==, str);
+ tt_str_op("/foobar",OP_EQ, str);
tor_free(str);
/* Try with $HOME unset */
@@ -1169,15 +1174,15 @@ test_util_expand_filename(void *arg)
unsetenv("HOME");
str = expand_filename("~");
- tt_str_op("/",==, str);
+ tt_str_op("/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/");
- tt_str_op("/",==, str);
+ tt_str_op("/",OP_EQ, str);
tor_free(str);
str = expand_filename("~/foobar");
- tt_str_op("/foobar",==, str);
+ tt_str_op("/foobar",OP_EQ, str);
tor_free(str);
done:
@@ -1195,30 +1200,30 @@ test_util_escape_string_socks(void *arg)
(void)arg;
escaped_string = tor_escape_str_for_pt_args("This is a backslash: \\",";\\");
tt_assert(escaped_string);
- tt_str_op(escaped_string,==, "This is a backslash: \\\\");
+ tt_str_op(escaped_string,OP_EQ, "This is a backslash: \\\\");
tor_free(escaped_string);
/** Simple semicolon escape. */
escaped_string = tor_escape_str_for_pt_args("First rule:Do not use ;",";\\");
tt_assert(escaped_string);
- tt_str_op(escaped_string,==, "First rule:Do not use \\;");
+ tt_str_op(escaped_string,OP_EQ, "First rule:Do not use \\;");
tor_free(escaped_string);
/** Empty string. */
escaped_string = tor_escape_str_for_pt_args("", ";\\");
tt_assert(escaped_string);
- tt_str_op(escaped_string,==, "");
+ tt_str_op(escaped_string,OP_EQ, "");
tor_free(escaped_string);
/** Escape all characters. */
escaped_string = tor_escape_str_for_pt_args(";\\;\\", ";\\");
tt_assert(escaped_string);
- tt_str_op(escaped_string,==, "\\;\\\\\\;\\\\");
+ tt_str_op(escaped_string,OP_EQ, "\\;\\\\\\;\\\\");
tor_free(escaped_string);
escaped_string = tor_escape_str_for_pt_args(";", ";\\");
tt_assert(escaped_string);
- tt_str_op(escaped_string,==, "\\;");
+ tt_str_op(escaped_string,OP_EQ, "\\;");
tor_free(escaped_string);
done:
@@ -1254,152 +1259,153 @@ test_util_strmisc(void *arg)
/* Test strl operations */
(void)arg;
- tt_int_op(5,==, strlcpy(buf, "Hello", 0));
- tt_int_op(5,==, strlcpy(buf, "Hello", 10));
- tt_str_op(buf,==, "Hello");
- tt_int_op(5,==, strlcpy(buf, "Hello", 6));
- tt_str_op(buf,==, "Hello");
- tt_int_op(5,==, strlcpy(buf, "Hello", 5));
- tt_str_op(buf,==, "Hell");
+ tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 0));
+ tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 10));
+ tt_str_op(buf,OP_EQ, "Hello");
+ tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 6));
+ tt_str_op(buf,OP_EQ, "Hello");
+ tt_int_op(5,OP_EQ, strlcpy(buf, "Hello", 5));
+ tt_str_op(buf,OP_EQ, "Hell");
strlcpy(buf, "Hello", sizeof(buf));
- tt_int_op(10,==, strlcat(buf, "Hello", 5));
+ tt_int_op(10,OP_EQ, strlcat(buf, "Hello", 5));
/* Test strstrip() */
strlcpy(buf, "Testing 1 2 3", sizeof(buf));
tor_strstrip(buf, ",!");
- tt_str_op(buf,==, "Testing 1 2 3");
+ tt_str_op(buf,OP_EQ, "Testing 1 2 3");
strlcpy(buf, "!Testing 1 2 3?", sizeof(buf));
tor_strstrip(buf, "!? ");
- tt_str_op(buf,==, "Testing123");
+ tt_str_op(buf,OP_EQ, "Testing123");
strlcpy(buf, "!!!Testing 1 2 3??", sizeof(buf));
tor_strstrip(buf, "!? ");
- tt_str_op(buf,==, "Testing123");
+ tt_str_op(buf,OP_EQ, "Testing123");
/* Test parse_long */
/* Empty/zero input */
- tt_int_op(0L,==, tor_parse_long("",10,0,100,&i,NULL));
- tt_int_op(0,==, i);
- tt_int_op(0L,==, tor_parse_long("0",10,0,100,&i,NULL));
- tt_int_op(1,==, i);
+ tt_int_op(0L,OP_EQ, tor_parse_long("",10,0,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(0L,OP_EQ, tor_parse_long("0",10,0,100,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
/* Normal cases */
- tt_int_op(10L,==, tor_parse_long("10",10,0,100,&i,NULL));
- tt_int_op(1,==, i);
- tt_int_op(10L,==, tor_parse_long("10",10,0,10,&i,NULL));
- tt_int_op(1,==, i);
- tt_int_op(10L,==, tor_parse_long("10",10,10,100,&i,NULL));
- tt_int_op(1,==, i);
- tt_int_op(-50L,==, tor_parse_long("-50",10,-100,100,&i,NULL));
- tt_int_op(1,==, i);
- tt_int_op(-50L,==, tor_parse_long("-50",10,-100,0,&i,NULL));
- tt_int_op(1,==, i);
- tt_int_op(-50L,==, tor_parse_long("-50",10,-50,0,&i,NULL));
- tt_int_op(1,==, i);
+ tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,100,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(10L,OP_EQ, tor_parse_long("10",10,0,10,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(10L,OP_EQ, tor_parse_long("10",10,10,100,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,100,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-100,0,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(-50L,OP_EQ, tor_parse_long("-50",10,-50,0,&i,NULL));
+ tt_int_op(1,OP_EQ, i);
/* Extra garbage */
- tt_int_op(0L,==, tor_parse_long("10m",10,0,100,&i,NULL));
- tt_int_op(0,==, i);
- tt_int_op(0L,==, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL));
- tt_int_op(0,==, i);
- tt_int_op(10L,==, tor_parse_long("10m",10,0,100,&i,&cp));
- tt_int_op(1,==, i);
- tt_str_op(cp,==, "m");
- tt_int_op(-50L,==, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp));
- tt_int_op(1,==, i);
- tt_str_op(cp,==, " plus garbage");
+ tt_int_op(0L,OP_EQ, tor_parse_long("10m",10,0,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(0L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(10L,OP_EQ, tor_parse_long("10m",10,0,100,&i,&cp));
+ tt_int_op(1,OP_EQ, i);
+ tt_str_op(cp,OP_EQ, "m");
+ tt_int_op(-50L,OP_EQ, tor_parse_long("-50 plus garbage",10,-100,100,&i,&cp));
+ tt_int_op(1,OP_EQ, i);
+ tt_str_op(cp,OP_EQ, " plus garbage");
/* Out of bounds */
- tt_int_op(0L,==, tor_parse_long("10",10,50,100,&i,NULL));
- tt_int_op(0,==, i);
- tt_int_op(0L,==, tor_parse_long("-50",10,0,100,&i,NULL));
- tt_int_op(0,==, i);
+ tt_int_op(0L,OP_EQ, tor_parse_long("10",10,50,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
+ tt_int_op(0L,OP_EQ, tor_parse_long("-50",10,0,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
/* Base different than 10 */
- tt_int_op(2L,==, tor_parse_long("10",2,0,100,NULL,NULL));
- tt_int_op(0L,==, tor_parse_long("2",2,0,100,NULL,NULL));
- tt_int_op(0L,==, tor_parse_long("10",-2,0,100,NULL,NULL));
- tt_int_op(68284L,==, tor_parse_long("10abc",16,0,70000,NULL,NULL));
- tt_int_op(68284L,==, tor_parse_long("10ABC",16,0,70000,NULL,NULL));
- tt_int_op(0,==, tor_parse_long("10ABC",-1,0,70000,&i,NULL));
- tt_int_op(i,==, 0);
+ tt_int_op(2L,OP_EQ, tor_parse_long("10",2,0,100,NULL,NULL));
+ tt_int_op(0L,OP_EQ, tor_parse_long("2",2,0,100,NULL,NULL));
+ tt_int_op(0L,OP_EQ, tor_parse_long("10",-2,0,100,NULL,NULL));
+ tt_int_op(68284L,OP_EQ, tor_parse_long("10abc",16,0,70000,NULL,NULL));
+ tt_int_op(68284L,OP_EQ, tor_parse_long("10ABC",16,0,70000,NULL,NULL));
+ tt_int_op(0,OP_EQ, tor_parse_long("10ABC",-1,0,70000,&i,NULL));
+ tt_int_op(i,OP_EQ, 0);
/* Test parse_ulong */
- tt_int_op(0UL,==, tor_parse_ulong("",10,0,100,NULL,NULL));
- tt_int_op(0UL,==, tor_parse_ulong("0",10,0,100,NULL,NULL));
- tt_int_op(10UL,==, tor_parse_ulong("10",10,0,100,NULL,NULL));
- tt_int_op(0UL,==, tor_parse_ulong("10",10,50,100,NULL,NULL));
- tt_int_op(10UL,==, tor_parse_ulong("10",10,0,10,NULL,NULL));
- tt_int_op(10UL,==, tor_parse_ulong("10",10,10,100,NULL,NULL));
- tt_int_op(0UL,==, tor_parse_ulong("8",8,0,100,NULL,NULL));
- tt_int_op(50UL,==, tor_parse_ulong("50",10,50,100,NULL,NULL));
- tt_int_op(0UL,==, tor_parse_ulong("-50",10,-100,100,NULL,NULL));
- tt_int_op(0UL,==, tor_parse_ulong("50",-1,50,100,&i,NULL));
- tt_int_op(0,==, i);
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("",10,0,100,NULL,NULL));
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("0",10,0,100,NULL,NULL));
+ tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,100,NULL,NULL));
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("10",10,50,100,NULL,NULL));
+ tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,0,10,NULL,NULL));
+ tt_int_op(10UL,OP_EQ, tor_parse_ulong("10",10,10,100,NULL,NULL));
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("8",8,0,100,NULL,NULL));
+ tt_int_op(50UL,OP_EQ, tor_parse_ulong("50",10,50,100,NULL,NULL));
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("-50",10,-100,100,NULL,NULL));
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong("50",-1,50,100,&i,NULL));
+ tt_int_op(0,OP_EQ, i);
/* Test parse_uint64 */
tt_assert(U64_LITERAL(10) == tor_parse_uint64("10 x",10,0,100, &i, &cp));
- tt_int_op(1,==, i);
- tt_str_op(cp,==, " x");
+ tt_int_op(1,OP_EQ, i);
+ tt_str_op(cp,OP_EQ, " x");
tt_assert(U64_LITERAL(12345678901) ==
tor_parse_uint64("12345678901",10,0,UINT64_MAX, &i, &cp));
- tt_int_op(1,==, i);
- tt_str_op(cp,==, "");
+ tt_int_op(1,OP_EQ, i);
+ tt_str_op(cp,OP_EQ, "");
tt_assert(U64_LITERAL(0) ==
tor_parse_uint64("12345678901",10,500,INT32_MAX, &i, &cp));
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
tt_assert(U64_LITERAL(0) ==
tor_parse_uint64("123",-1,0,INT32_MAX, &i, &cp));
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
{
/* Test parse_double */
double d = tor_parse_double("10", 0, UINT64_MAX,&i,NULL);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
tt_assert(DBL_TO_U64(d) == 10);
d = tor_parse_double("0", 0, UINT64_MAX,&i,NULL);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
tt_assert(DBL_TO_U64(d) == 0);
d = tor_parse_double(" ", 0, UINT64_MAX,&i,NULL);
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
d = tor_parse_double(".0a", 0, UINT64_MAX,&i,NULL);
- tt_int_op(0,==, i);
+ tt_int_op(0,OP_EQ, i);
d = tor_parse_double(".0a", 0, UINT64_MAX,&i,&cp);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
d = tor_parse_double("-.0", 0, UINT64_MAX,&i,NULL);
- tt_int_op(1,==, i);
+ tt_int_op(1,OP_EQ, i);
tt_assert(DBL_TO_U64(d) == 0);
d = tor_parse_double("-10", -100.0, 100.0,&i,NULL);
- tt_int_op(1,==, i);
- tt_int_op(-10.0,==, d);
+ tt_int_op(1,OP_EQ, i);
+ tt_int_op(-10.0,OP_EQ, d);
}
{
/* Test tor_parse_* where we overflow/underflow the underlying type. */
/* This string should overflow 64-bit ints. */
#define TOOBIG "100000000000000000000000000"
- tt_int_op(0L,==, tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL));
- tt_int_op(i,==, 0);
- tt_int_op(0L,==,
+ tt_int_op(0L, OP_EQ,
+ tor_parse_long(TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL));
+ tt_int_op(i,OP_EQ, 0);
+ tt_int_op(0L,OP_EQ,
tor_parse_long("-"TOOBIG, 10, LONG_MIN, LONG_MAX, &i, NULL));
- tt_int_op(i,==, 0);
- tt_int_op(0UL,==, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL));
- tt_int_op(i,==, 0);
- tt_u64_op(U64_LITERAL(0), ==, tor_parse_uint64(TOOBIG, 10,
+ tt_int_op(i,OP_EQ, 0);
+ tt_int_op(0UL,OP_EQ, tor_parse_ulong(TOOBIG, 10, 0, ULONG_MAX, &i, NULL));
+ tt_int_op(i,OP_EQ, 0);
+ tt_u64_op(U64_LITERAL(0), OP_EQ, tor_parse_uint64(TOOBIG, 10,
0, UINT64_MAX, &i, NULL));
- tt_int_op(i,==, 0);
+ tt_int_op(i,OP_EQ, 0);
}
/* Test snprintf */
/* Returning -1 when there's not enough room in the output buffer */
- tt_int_op(-1,==, tor_snprintf(buf, 0, "Foo"));
- tt_int_op(-1,==, tor_snprintf(buf, 2, "Foo"));
- tt_int_op(-1,==, tor_snprintf(buf, 3, "Foo"));
- tt_int_op(-1,!=, tor_snprintf(buf, 4, "Foo"));
+ tt_int_op(-1,OP_EQ, tor_snprintf(buf, 0, "Foo"));
+ tt_int_op(-1,OP_EQ, tor_snprintf(buf, 2, "Foo"));
+ tt_int_op(-1,OP_EQ, tor_snprintf(buf, 3, "Foo"));
+ tt_int_op(-1,OP_NE, tor_snprintf(buf, 4, "Foo"));
/* Always NUL-terminate the output */
tor_snprintf(buf, 5, "abcdef");
- tt_int_op(0,==, buf[4]);
+ tt_int_op(0,OP_EQ, buf[4]);
tor_snprintf(buf, 10, "abcdef");
- tt_int_op(0,==, buf[6]);
+ tt_int_op(0,OP_EQ, buf[6]);
/* uint64 */
tor_snprintf(buf, sizeof(buf), "x!"U64_FORMAT"!x",
U64_PRINTF_ARG(U64_LITERAL(12345678901)));
- tt_str_op("x!12345678901!x",==, buf);
+ tt_str_op("x!12345678901!x",OP_EQ, buf);
/* Test str{,case}cmpstart */
tt_assert(strcmpstart("abcdef", "abcdef")==0);
@@ -1450,31 +1456,31 @@ test_util_strmisc(void *arg)
/* Test 'escaped' */
tt_assert(NULL == escaped(NULL));
- tt_str_op("\"\"",==, escaped(""));
- tt_str_op("\"abcd\"",==, escaped("abcd"));
- tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",==, escaped("\\ \n\r\t\"'"));
- tt_str_op("\"unnecessary \\'backslashes\\'\"",==,
+ tt_str_op("\"\"",OP_EQ, escaped(""));
+ tt_str_op("\"abcd\"",OP_EQ, escaped("abcd"));
+ tt_str_op("\"\\\\ \\n\\r\\t\\\"\\'\"",OP_EQ, escaped("\\ \n\r\t\"'"));
+ tt_str_op("\"unnecessary \\'backslashes\\'\"",OP_EQ,
escaped("unnecessary \'backslashes\'"));
/* Non-printable characters appear as octal */
- tt_str_op("\"z\\001abc\\277d\"",==, escaped("z\001abc\277d"));
- tt_str_op("\"z\\336\\255 ;foo\"",==, escaped("z\xde\xad\x20;foo"));
+ tt_str_op("\"z\\001abc\\277d\"",OP_EQ, escaped("z\001abc\277d"));
+ tt_str_op("\"z\\336\\255 ;foo\"",OP_EQ, escaped("z\xde\xad\x20;foo"));
/* Test strndup and memdup */
{
const char *s = "abcdefghijklmnopqrstuvwxyz";
cp_tmp = tor_strndup(s, 30);
- tt_str_op(cp_tmp,==, s); /* same string, */
- tt_ptr_op(cp_tmp,!=,s); /* but different pointers. */
+ tt_str_op(cp_tmp,OP_EQ, s); /* same string, */
+ tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */
tor_free(cp_tmp);
cp_tmp = tor_strndup(s, 5);
- tt_str_op(cp_tmp,==, "abcde");
+ tt_str_op(cp_tmp,OP_EQ, "abcde");
tor_free(cp_tmp);
s = "a\0b\0c\0d\0e\0";
cp_tmp = tor_memdup(s,10);
- tt_mem_op(cp_tmp,==, s, 10); /* same ram, */
- tt_ptr_op(cp_tmp,!=,s); /* but different pointers. */
+ tt_mem_op(cp_tmp,OP_EQ, s, 10); /* same ram, */
+ tt_ptr_op(cp_tmp,OP_NE,s); /* but different pointers. */
tor_free(cp_tmp);
}
@@ -1484,9 +1490,9 @@ test_util_strmisc(void *arg)
cp_tmp[3] = 'D';
tt_assert(!tor_strisnonupper(cp_tmp));
tor_strupper(cp_tmp);
- tt_str_op(cp_tmp,==, "ABCDEF");
+ tt_str_op(cp_tmp,OP_EQ, "ABCDEF");
tor_strlower(cp_tmp);
- tt_str_op(cp_tmp,==, "abcdef");
+ tt_str_op(cp_tmp,OP_EQ, "abcdef");
tt_assert(tor_strisnonupper(cp_tmp));
tt_assert(tor_strisprint(cp_tmp));
cp_tmp[3] = 3;
@@ -1497,18 +1503,18 @@ test_util_strmisc(void *arg)
{
const char *haystack = "abcde";
tt_assert(!tor_memmem(haystack, 5, "ef", 2));
- tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),==, haystack + 2);
- tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),==, haystack + 2);
+ tt_ptr_op(tor_memmem(haystack, 5, "cd", 2),OP_EQ, haystack + 2);
+ tt_ptr_op(tor_memmem(haystack, 5, "cde", 3),OP_EQ, haystack + 2);
tt_assert(!tor_memmem(haystack, 4, "cde", 3));
haystack = "ababcad";
- tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),==, haystack + 2);
- tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),==, haystack + 5);
- tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),==, haystack + 4);
+ tt_ptr_op(tor_memmem(haystack, 7, "abc", 3),OP_EQ, haystack + 2);
+ tt_ptr_op(tor_memmem(haystack, 7, "ad", 2),OP_EQ, haystack + 5);
+ tt_ptr_op(tor_memmem(haystack, 7, "cad", 3),OP_EQ, haystack + 4);
tt_assert(!tor_memmem(haystack, 7, "dadad", 5));
tt_assert(!tor_memmem(haystack, 7, "abcdefghij", 10));
/* memstr */
- tt_ptr_op(tor_memstr(haystack, 7, "abc"),==, haystack + 2);
- tt_ptr_op(tor_memstr(haystack, 7, "cad"),==, haystack + 4);
+ tt_ptr_op(tor_memstr(haystack, 7, "abc"),OP_EQ, haystack + 2);
+ tt_ptr_op(tor_memstr(haystack, 7, "cad"),OP_EQ, haystack + 4);
tt_assert(!tor_memstr(haystack, 6, "cad"));
tt_assert(!tor_memstr(haystack, 7, "cadd"));
tt_assert(!tor_memstr(haystack, 7, "fe"));
@@ -1521,42 +1527,42 @@ test_util_strmisc(void *arg)
size_t i;
for (i = 0; i < sizeof(binary_data); ++i)
binary_data[i] = i;
- tt_str_op(hex_str(binary_data, 0),==, "");
- tt_str_op(hex_str(binary_data, 1),==, "00");
- tt_str_op(hex_str(binary_data, 17),==,
+ tt_str_op(hex_str(binary_data, 0),OP_EQ, "");
+ tt_str_op(hex_str(binary_data, 1),OP_EQ, "00");
+ tt_str_op(hex_str(binary_data, 17),OP_EQ,
"000102030405060708090A0B0C0D0E0F10");
- tt_str_op(hex_str(binary_data, 32),==,
+ tt_str_op(hex_str(binary_data, 32),OP_EQ,
"000102030405060708090A0B0C0D0E0F"
"101112131415161718191A1B1C1D1E1F");
- tt_str_op(hex_str(binary_data, 34),==,
+ tt_str_op(hex_str(binary_data, 34),OP_EQ,
"000102030405060708090A0B0C0D0E0F"
"101112131415161718191A1B1C1D1E1F");
/* Repeat these tests for shorter strings after longer strings
have been tried, to make sure we're correctly terminating strings */
- tt_str_op(hex_str(binary_data, 1),==, "00");
- tt_str_op(hex_str(binary_data, 0),==, "");
+ tt_str_op(hex_str(binary_data, 1),OP_EQ, "00");
+ tt_str_op(hex_str(binary_data, 0),OP_EQ, "");
}
/* Test strcmp_opt */
- tt_int_op(strcmp_opt("", "foo"), <, 0);
- tt_int_op(strcmp_opt("", ""), ==, 0);
- tt_int_op(strcmp_opt("foo", ""), >, 0);
+ tt_int_op(strcmp_opt("", "foo"), OP_LT, 0);
+ tt_int_op(strcmp_opt("", ""), OP_EQ, 0);
+ tt_int_op(strcmp_opt("foo", ""), OP_GT, 0);
- tt_int_op(strcmp_opt(NULL, ""), <, 0);
- tt_int_op(strcmp_opt(NULL, NULL), ==, 0);
- tt_int_op(strcmp_opt("", NULL), >, 0);
+ tt_int_op(strcmp_opt(NULL, ""), OP_LT, 0);
+ tt_int_op(strcmp_opt(NULL, NULL), OP_EQ, 0);
+ tt_int_op(strcmp_opt("", NULL), OP_GT, 0);
- tt_int_op(strcmp_opt(NULL, "foo"), <, 0);
- tt_int_op(strcmp_opt("foo", NULL), >, 0);
+ tt_int_op(strcmp_opt(NULL, "foo"), OP_LT, 0);
+ tt_int_op(strcmp_opt("foo", NULL), OP_GT, 0);
/* Test strcmp_len */
- tt_int_op(strcmp_len("foo", "bar", 3), >, 0);
- tt_int_op(strcmp_len("foo", "bar", 2), <, 0); /* First len, then lexical */
- tt_int_op(strcmp_len("foo2", "foo1", 4), >, 0);
- tt_int_op(strcmp_len("foo2", "foo1", 3), <, 0); /* Really stop at len */
- tt_int_op(strcmp_len("foo2", "foo", 3), ==, 0); /* Really stop at len */
- tt_int_op(strcmp_len("blah", "", 4), >, 0);
- tt_int_op(strcmp_len("blah", "", 0), ==, 0);
+ tt_int_op(strcmp_len("foo", "bar", 3), OP_GT, 0);
+ tt_int_op(strcmp_len("foo", "bar", 2), OP_LT, 0);
+ tt_int_op(strcmp_len("foo2", "foo1", 4), OP_GT, 0);
+ tt_int_op(strcmp_len("foo2", "foo1", 3), OP_LT, 0); /* Really stop at len */
+ tt_int_op(strcmp_len("foo2", "foo", 3), OP_EQ, 0); /* Really stop at len */
+ tt_int_op(strcmp_len("blah", "", 4), OP_GT, 0);
+ tt_int_op(strcmp_len("blah", "", 0), OP_EQ, 0);
done:
tor_free(cp_tmp);
@@ -1567,175 +1573,40 @@ test_util_pow2(void *arg)
{
/* Test tor_log2(). */
(void)arg;
- tt_int_op(tor_log2(64),==, 6);
- tt_int_op(tor_log2(65),==, 6);
- tt_int_op(tor_log2(63),==, 5);
- tt_int_op(tor_log2(0),==, 0);/* incorrect mathematically, but as specified */
- tt_int_op(tor_log2(1),==, 0);
- tt_int_op(tor_log2(2),==, 1);
- tt_int_op(tor_log2(3),==, 1);
- tt_int_op(tor_log2(4),==, 2);
- tt_int_op(tor_log2(5),==, 2);
- tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),==, 55);
- tt_int_op(tor_log2(UINT64_MAX),==, 63);
+ tt_int_op(tor_log2(64),OP_EQ, 6);
+ tt_int_op(tor_log2(65),OP_EQ, 6);
+ tt_int_op(tor_log2(63),OP_EQ, 5);
+ /* incorrect mathematically, but as specified: */
+ tt_int_op(tor_log2(0),OP_EQ, 0);
+ tt_int_op(tor_log2(1),OP_EQ, 0);
+ tt_int_op(tor_log2(2),OP_EQ, 1);
+ tt_int_op(tor_log2(3),OP_EQ, 1);
+ tt_int_op(tor_log2(4),OP_EQ, 2);
+ tt_int_op(tor_log2(5),OP_EQ, 2);
+ tt_int_op(tor_log2(U64_LITERAL(40000000000000000)),OP_EQ, 55);
+ tt_int_op(tor_log2(UINT64_MAX),OP_EQ, 63);
/* Test round_to_power_of_2 */
- tt_u64_op(round_to_power_of_2(120), ==, 128);
- tt_u64_op(round_to_power_of_2(128), ==, 128);
- tt_u64_op(round_to_power_of_2(130), ==, 128);
- tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), ==,
+ tt_u64_op(round_to_power_of_2(120), OP_EQ, 128);
+ tt_u64_op(round_to_power_of_2(128), OP_EQ, 128);
+ tt_u64_op(round_to_power_of_2(130), OP_EQ, 128);
+ tt_u64_op(round_to_power_of_2(U64_LITERAL(40000000000000000)), OP_EQ,
U64_LITERAL(1)<<55);
- tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), ==,
+ tt_u64_op(round_to_power_of_2(U64_LITERAL(0xffffffffffffffff)), OP_EQ,
U64_LITERAL(1)<<63);
- tt_u64_op(round_to_power_of_2(0), ==, 1);
- tt_u64_op(round_to_power_of_2(1), ==, 1);
- tt_u64_op(round_to_power_of_2(2), ==, 2);
- tt_u64_op(round_to_power_of_2(3), ==, 2);
- tt_u64_op(round_to_power_of_2(4), ==, 4);
- tt_u64_op(round_to_power_of_2(5), ==, 4);
- tt_u64_op(round_to_power_of_2(6), ==, 4);
- tt_u64_op(round_to_power_of_2(7), ==, 8);
+ tt_u64_op(round_to_power_of_2(0), OP_EQ, 1);
+ tt_u64_op(round_to_power_of_2(1), OP_EQ, 1);
+ tt_u64_op(round_to_power_of_2(2), OP_EQ, 2);
+ tt_u64_op(round_to_power_of_2(3), OP_EQ, 2);
+ tt_u64_op(round_to_power_of_2(4), OP_EQ, 4);
+ tt_u64_op(round_to_power_of_2(5), OP_EQ, 4);
+ tt_u64_op(round_to_power_of_2(6), OP_EQ, 4);
+ tt_u64_op(round_to_power_of_2(7), OP_EQ, 8);
done:
;
}
-/** mutex for thread test to stop the threads hitting data at the same time. */
-static tor_mutex_t *thread_test_mutex_ = NULL;
-/** mutexes for the thread test to make sure that the threads have to
- * interleave somewhat. */
-static tor_mutex_t *thread_test_start1_ = NULL,
- *thread_test_start2_ = NULL;
-/** Shared strmap for the thread test. */
-static strmap_t *thread_test_strmap_ = NULL;
-/** The name of thread1 for the thread test */
-static char *thread1_name_ = NULL;
-/** The name of thread2 for the thread test */
-static char *thread2_name_ = NULL;
-
-static void thread_test_func_(void* _s) ATTR_NORETURN;
-
-/** How many iterations have the threads in the unit test run? */
-static int t1_count = 0, t2_count = 0;
-
-/** Helper function for threading unit tests: This function runs in a
- * subthread. It grabs its own mutex (start1 or start2) to make sure that it
- * should start, then it repeatedly alters _test_thread_strmap protected by
- * thread_test_mutex_. */
-static void
-thread_test_func_(void* _s)
-{
- char *s = _s;
- int i, *count;
- tor_mutex_t *m;
- char buf[64];
- char **cp;
- if (!strcmp(s, "thread 1")) {
- m = thread_test_start1_;
- cp = &thread1_name_;
- count = &t1_count;
- } else {
- m = thread_test_start2_;
- cp = &thread2_name_;
- count = &t2_count;
- }
-
- tor_snprintf(buf, sizeof(buf), "%lu", tor_get_thread_id());
- *cp = tor_strdup(buf);
-
- tor_mutex_acquire(m);
-
- for (i=0; i<10000; ++i) {
- tor_mutex_acquire(thread_test_mutex_);
- strmap_set(thread_test_strmap_, "last to run", *cp);
- ++*count;
- tor_mutex_release(thread_test_mutex_);
- }
- tor_mutex_acquire(thread_test_mutex_);
- strmap_set(thread_test_strmap_, s, *cp);
- tor_mutex_release(thread_test_mutex_);
-
- tor_mutex_release(m);
-
- spawn_exit();
-}
-
-/** Run unit tests for threading logic. */
-static void
-test_util_threads(void *arg)
-{
- char *s1 = NULL, *s2 = NULL;
- int done = 0, timedout = 0;
- time_t started;
-#ifndef _WIN32
- struct timeval tv;
- tv.tv_sec=0;
- tv.tv_usec=100*1000;
-#endif
- (void)arg;
- thread_test_mutex_ = tor_mutex_new();
- thread_test_start1_ = tor_mutex_new();
- thread_test_start2_ = tor_mutex_new();
- thread_test_strmap_ = strmap_new();
- s1 = tor_strdup("thread 1");
- s2 = tor_strdup("thread 2");
- tor_mutex_acquire(thread_test_start1_);
- tor_mutex_acquire(thread_test_start2_);
- spawn_func(thread_test_func_, s1);
- spawn_func(thread_test_func_, s2);
- tor_mutex_release(thread_test_start2_);
- tor_mutex_release(thread_test_start1_);
- started = time(NULL);
- while (!done) {
- tor_mutex_acquire(thread_test_mutex_);
- strmap_assert_ok(thread_test_strmap_);
- if (strmap_get(thread_test_strmap_, "thread 1") &&
- strmap_get(thread_test_strmap_, "thread 2")) {
- done = 1;
- } else if (time(NULL) > started + 150) {
- timedout = done = 1;
- }
- tor_mutex_release(thread_test_mutex_);
-#ifndef _WIN32
- /* Prevent the main thread from starving the worker threads. */
- select(0, NULL, NULL, NULL, &tv);
-#endif
- }
- tor_mutex_acquire(thread_test_start1_);
- tor_mutex_release(thread_test_start1_);
- tor_mutex_acquire(thread_test_start2_);
- tor_mutex_release(thread_test_start2_);
-
- tor_mutex_free(thread_test_mutex_);
-
- if (timedout) {
- printf("\nTimed out: %d %d", t1_count, t2_count);
- tt_assert(strmap_get(thread_test_strmap_, "thread 1"));
- tt_assert(strmap_get(thread_test_strmap_, "thread 2"));
- tt_assert(!timedout);
- }
-
- /* different thread IDs. */
- tt_assert(strcmp(strmap_get(thread_test_strmap_, "thread 1"),
- strmap_get(thread_test_strmap_, "thread 2")));
- tt_assert(!strcmp(strmap_get(thread_test_strmap_, "thread 1"),
- strmap_get(thread_test_strmap_, "last to run")) ||
- !strcmp(strmap_get(thread_test_strmap_, "thread 2"),
- strmap_get(thread_test_strmap_, "last to run")));
-
- done:
- tor_free(s1);
- tor_free(s2);
- tor_free(thread1_name_);
- tor_free(thread2_name_);
- if (thread_test_strmap_)
- strmap_free(thread_test_strmap_, NULL);
- if (thread_test_start1_)
- tor_mutex_free(thread_test_start1_);
- if (thread_test_start2_)
- tor_mutex_free(thread_test_start2_);
-}
-
/** Run unit tests for compression functions */
static void
test_util_gzip(void *arg)
@@ -1758,8 +1629,8 @@ test_util_gzip(void *arg)
tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1,
GZIP_METHOD, 1, LOG_INFO));
tt_assert(buf3);
- tt_int_op(strlen(buf1) + 1,==, len2);
- tt_str_op(buf1,==, buf3);
+ tt_int_op(strlen(buf1) + 1,OP_EQ, len2);
+ tt_str_op(buf1,OP_EQ, buf3);
tor_free(buf2);
tor_free(buf3);
@@ -1773,8 +1644,8 @@ test_util_gzip(void *arg)
tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1,
ZLIB_METHOD, 1, LOG_INFO));
tt_assert(buf3);
- tt_int_op(strlen(buf1) + 1,==, len2);
- tt_str_op(buf1,==, buf3);
+ tt_int_op(strlen(buf1) + 1,OP_EQ, len2);
+ tt_str_op(buf1,OP_EQ, buf3);
/* Check whether we can uncompress concatenated, compressed strings. */
tor_free(buf3);
@@ -1782,8 +1653,8 @@ test_util_gzip(void *arg)
memcpy(buf2+len1, buf2, len1);
tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1*2,
ZLIB_METHOD, 1, LOG_INFO));
- tt_int_op((strlen(buf1)+1)*2,==, len2);
- tt_mem_op(buf3,==,
+ tt_int_op((strlen(buf1)+1)*2,OP_EQ, len2);
+ tt_mem_op(buf3,OP_EQ,
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0"
"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAZAAAAAAAAAAAAAAAAAAAZ\0",
(strlen(buf1)+1)*2);
@@ -1815,7 +1686,7 @@ test_util_gzip(void *arg)
tor_free(buf1);
tor_free(buf2);
tor_free(buf3);
- state = tor_zlib_new(1, ZLIB_METHOD);
+ state = tor_zlib_new(1, ZLIB_METHOD, HIGH_COMPRESSION);
tt_assert(state);
cp1 = buf1 = tor_malloc(1024);
len1 = 1024;
@@ -1823,20 +1694,21 @@ test_util_gzip(void *arg)
len2 = 21;
tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 0)
== TOR_ZLIB_OK);
- tt_int_op(0,==, len2); /* Make sure we compressed it all. */
+ tt_int_op(0,OP_EQ, len2); /* Make sure we compressed it all. */
tt_assert(cp1 > buf1);
len2 = 0;
cp2 = cp1;
tt_assert(tor_zlib_process(state, &cp1, &len1, &ccp2, &len2, 1)
== TOR_ZLIB_DONE);
- tt_int_op(0,==, len2);
+ tt_int_op(0,OP_EQ, len2);
tt_assert(cp1 > cp2); /* Make sure we really added something. */
tt_assert(!tor_gzip_uncompress(&buf3, &len2, buf1, 1024-len1,
ZLIB_METHOD, 1, LOG_WARN));
- tt_str_op(buf3,==,"ABCDEFGHIJABCDEFGHIJ"); /*Make sure it compressed right.*/
- tt_int_op(21,==, len2);
+ /* Make sure it compressed right. */
+ tt_str_op(buf3, OP_EQ, "ABCDEFGHIJABCDEFGHIJ");
+ tt_int_op(21,OP_EQ, len2);
done:
if (state)
@@ -1867,25 +1739,25 @@ test_util_mmap(void *arg)
mapping = tor_mmap_file(fname1);
tt_assert(mapping);
- tt_int_op(mapping->size,==, strlen("Short file."));
- tt_str_op(mapping->data,==, "Short file.");
+ tt_int_op(mapping->size,OP_EQ, strlen("Short file."));
+ tt_str_op(mapping->data,OP_EQ, "Short file.");
#ifdef _WIN32
- tt_int_op(0, ==, tor_munmap_file(mapping));
+ tt_int_op(0, OP_EQ, tor_munmap_file(mapping));
mapping = NULL;
tt_assert(unlink(fname1) == 0);
#else
/* make sure we can unlink. */
tt_assert(unlink(fname1) == 0);
- tt_str_op(mapping->data,==, "Short file.");
- tt_int_op(0, ==, tor_munmap_file(mapping));
+ tt_str_op(mapping->data,OP_EQ, "Short file.");
+ tt_int_op(0, OP_EQ, tor_munmap_file(mapping));
mapping = NULL;
#endif
/* Now a zero-length file. */
write_str_to_file(fname1, "", 1);
mapping = tor_mmap_file(fname1);
- tt_ptr_op(mapping,==, NULL);
- tt_int_op(ERANGE,==, errno);
+ tt_ptr_op(mapping,OP_EQ, NULL);
+ tt_int_op(ERANGE,OP_EQ, errno);
unlink(fname1);
/* Make sure that we fail to map a no-longer-existent file. */
@@ -1896,18 +1768,18 @@ test_util_mmap(void *arg)
write_bytes_to_file(fname2, buf, buflen, 1);
mapping = tor_mmap_file(fname2);
tt_assert(mapping);
- tt_int_op(mapping->size,==, buflen);
- tt_mem_op(mapping->data,==, buf, buflen);
- tt_int_op(0, ==, tor_munmap_file(mapping));
+ tt_int_op(mapping->size,OP_EQ, buflen);
+ tt_mem_op(mapping->data,OP_EQ, buf, buflen);
+ tt_int_op(0, OP_EQ, tor_munmap_file(mapping));
mapping = NULL;
/* Now try a big aligned file. */
write_bytes_to_file(fname3, buf, 16384, 1);
mapping = tor_mmap_file(fname3);
tt_assert(mapping);
- tt_int_op(mapping->size,==, 16384);
- tt_mem_op(mapping->data,==, buf, 16384);
- tt_int_op(0, ==, tor_munmap_file(mapping));
+ tt_int_op(mapping->size,OP_EQ, 16384);
+ tt_mem_op(mapping->data,OP_EQ, buf, 16384);
+ tt_int_op(0, OP_EQ, tor_munmap_file(mapping));
mapping = NULL;
done:
@@ -1934,9 +1806,9 @@ test_util_control_formats(void *arg)
(void)arg;
sz = read_escaped_data(inp, strlen(inp), &out);
- tt_str_op(out,==,
+ tt_str_op(out,OP_EQ,
".This is a test\nof the emergency \n.system.\n\rZ.\n");
- tt_int_op(sz,==, strlen(out));
+ tt_int_op(sz,OP_EQ, strlen(out));
done:
tor_free(out);
@@ -1968,334 +1840,335 @@ test_util_sscanf(void *arg)
/* Simple tests (malformed patterns, literal matching, ...) */
(void)arg;
- tt_int_op(-1,==, tor_sscanf("123", "%i", &r)); /* %i is not supported */
- tt_int_op(-1,==,
+ tt_int_op(-1,OP_EQ, tor_sscanf("123", "%i", &r)); /* %i is not supported */
+ tt_int_op(-1,OP_EQ,
tor_sscanf("wrong", "%5c", s1)); /* %c cannot have a number. */
- tt_int_op(-1,==, tor_sscanf("hello", "%s", s1)); /* %s needs a number. */
- tt_int_op(-1,==, tor_sscanf("prettylongstring", "%999999s", s1));
+ tt_int_op(-1,OP_EQ, tor_sscanf("hello", "%s", s1)); /* %s needs a number. */
+ tt_int_op(-1,OP_EQ, tor_sscanf("prettylongstring", "%999999s", s1));
#if 0
/* GCC thinks these two are illegal. */
test_eq(-1, tor_sscanf("prettylongstring", "%0s", s1));
test_eq(0, tor_sscanf("prettylongstring", "%10s", NULL));
#endif
/* No '%'-strings: always "success" */
- tt_int_op(0,==, tor_sscanf("hello world", "hello world"));
- tt_int_op(0,==, tor_sscanf("hello world", "good bye"));
+ tt_int_op(0,OP_EQ, tor_sscanf("hello world", "hello world"));
+ tt_int_op(0,OP_EQ, tor_sscanf("hello world", "good bye"));
/* Excess data */
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
tor_sscanf("hello 3", "%u", &u1)); /* have to match the start */
- tt_int_op(0,==, tor_sscanf(" 3 hello", "%u", &u1));
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ, tor_sscanf(" 3 hello", "%u", &u1));
+ tt_int_op(0,OP_EQ,
tor_sscanf(" 3 hello", "%2u", &u1)); /* not even in this case */
- tt_int_op(1,==,
+ tt_int_op(1,OP_EQ,
tor_sscanf("3 hello", "%u", &u1)); /* but trailing is alright */
/* Numbers (ie. %u) */
- tt_int_op(0,==,
+ tt_int_op(0,OP_EQ,
tor_sscanf("hello world 3", "hello worlb %u", &u1)); /* d vs b */
- tt_int_op(1,==, tor_sscanf("12345", "%u", &u1));
- tt_int_op(12345u,==, u1);
- tt_int_op(1,==, tor_sscanf("12346 ", "%u", &u1));
- tt_int_op(12346u,==, u1);
- tt_int_op(0,==, tor_sscanf(" 12347", "%u", &u1));
- tt_int_op(1,==, tor_sscanf(" 12348", " %u", &u1));
- tt_int_op(12348u,==, u1);
- tt_int_op(1,==, tor_sscanf("0", "%u", &u1));
- tt_int_op(0u,==, u1);
- tt_int_op(1,==, tor_sscanf("0000", "%u", &u2));
- tt_int_op(0u,==, u2);
- tt_int_op(0,==, tor_sscanf("", "%u", &u1)); /* absent number */
- tt_int_op(0,==, tor_sscanf("A", "%u", &u1)); /* bogus number */
- tt_int_op(0,==, tor_sscanf("-1", "%u", &u1)); /* negative number */
+ tt_int_op(1,OP_EQ, tor_sscanf("12345", "%u", &u1));
+ tt_int_op(12345u,OP_EQ, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("12346 ", "%u", &u1));
+ tt_int_op(12346u,OP_EQ, u1);
+ tt_int_op(0,OP_EQ, tor_sscanf(" 12347", "%u", &u1));
+ tt_int_op(1,OP_EQ, tor_sscanf(" 12348", " %u", &u1));
+ tt_int_op(12348u,OP_EQ, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("0", "%u", &u1));
+ tt_int_op(0u,OP_EQ, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("0000", "%u", &u2));
+ tt_int_op(0u,OP_EQ, u2);
+ tt_int_op(0,OP_EQ, tor_sscanf("", "%u", &u1)); /* absent number */
+ tt_int_op(0,OP_EQ, tor_sscanf("A", "%u", &u1)); /* bogus number */
+ tt_int_op(0,OP_EQ, tor_sscanf("-1", "%u", &u1)); /* negative number */
/* Numbers with size (eg. %2u) */
- tt_int_op(0,==, tor_sscanf("-1", "%2u", &u1));
- tt_int_op(2,==, tor_sscanf("123456", "%2u%u", &u1, &u2));
- tt_int_op(12u,==, u1);
- tt_int_op(3456u,==, u2);
- tt_int_op(1,==, tor_sscanf("123456", "%8u", &u1));
- tt_int_op(123456u,==, u1);
- tt_int_op(1,==, tor_sscanf("123457 ", "%8u", &u1));
- tt_int_op(123457u,==, u1);
- tt_int_op(0,==, tor_sscanf(" 123456", "%8u", &u1));
- tt_int_op(3,==, tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3));
- tt_int_op(12u,==, u1);
- tt_int_op(3u,==, u2);
- tt_int_op(456u,==, u3);
- tt_int_op(3,==,
+ tt_int_op(0,OP_EQ, tor_sscanf("-1", "%2u", &u1));
+ tt_int_op(2,OP_EQ, tor_sscanf("123456", "%2u%u", &u1, &u2));
+ tt_int_op(12u,OP_EQ, u1);
+ tt_int_op(3456u,OP_EQ, u2);
+ tt_int_op(1,OP_EQ, tor_sscanf("123456", "%8u", &u1));
+ tt_int_op(123456u,OP_EQ, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("123457 ", "%8u", &u1));
+ tt_int_op(123457u,OP_EQ, u1);
+ tt_int_op(0,OP_EQ, tor_sscanf(" 123456", "%8u", &u1));
+ tt_int_op(3,OP_EQ, tor_sscanf("!12:3:456", "!%2u:%2u:%3u", &u1, &u2, &u3));
+ tt_int_op(12u,OP_EQ, u1);
+ tt_int_op(3u,OP_EQ, u2);
+ tt_int_op(456u,OP_EQ, u3);
+ tt_int_op(3,OP_EQ,
tor_sscanf("67:8:099", "%2u:%2u:%3u", &u1, &u2, &u3)); /* 0s */
- tt_int_op(67u,==, u1);
- tt_int_op(8u,==, u2);
- tt_int_op(99u,==, u3);
+ tt_int_op(67u,OP_EQ, u1);
+ tt_int_op(8u,OP_EQ, u2);
+ tt_int_op(99u,OP_EQ, u3);
/* %u does not match space.*/
- tt_int_op(2,==, tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3));
- tt_int_op(12u,==, u1);
- tt_int_op(3u,==, u2);
+ tt_int_op(2,OP_EQ, tor_sscanf("12:3: 45", "%2u:%2u:%3u", &u1, &u2, &u3));
+ tt_int_op(12u,OP_EQ, u1);
+ tt_int_op(3u,OP_EQ, u2);
/* %u does not match negative numbers. */
- tt_int_op(2,==, tor_sscanf("67:8:-9", "%2u:%2u:%3u", &u1, &u2, &u3));
- tt_int_op(67u,==, u1);
- tt_int_op(8u,==, u2);
+ tt_int_op(2,OP_EQ, tor_sscanf("67:8:-9", "%2u:%2u:%3u", &u1, &u2, &u3));
+ tt_int_op(67u,OP_EQ, u1);
+ tt_int_op(8u,OP_EQ, u2);
/* Arbitrary amounts of 0-padding are okay */
- tt_int_op(3,==, tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u",
+ tt_int_op(3,OP_EQ, tor_sscanf("12:03:000000000000000099", "%2u:%2u:%u",
&u1, &u2, &u3));
- tt_int_op(12u,==, u1);
- tt_int_op(3u,==, u2);
- tt_int_op(99u,==, u3);
+ tt_int_op(12u,OP_EQ, u1);
+ tt_int_op(3u,OP_EQ, u2);
+ tt_int_op(99u,OP_EQ, u3);
/* Hex (ie. %x) */
- tt_int_op(3,==, tor_sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3));
- tt_int_op(0x1234,==, u1);
- tt_int_op(0x2ABCDEF,==, u2);
- tt_int_op(0xFF,==, u3);
+ tt_int_op(3,OP_EQ,
+ tor_sscanf("1234 02aBcdEf ff", "%x %x %x", &u1, &u2, &u3));
+ tt_int_op(0x1234,OP_EQ, u1);
+ tt_int_op(0x2ABCDEF,OP_EQ, u2);
+ tt_int_op(0xFF,OP_EQ, u3);
/* Width works on %x */
- tt_int_op(3,==, tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3));
- tt_int_op(0xf00d,==, u1);
- tt_int_op(0xcafe,==, u2);
- tt_int_op(444,==, u3);
+ tt_int_op(3,OP_EQ, tor_sscanf("f00dcafe444", "%4x%4x%u", &u1, &u2, &u3));
+ tt_int_op(0xf00d,OP_EQ, u1);
+ tt_int_op(0xcafe,OP_EQ, u2);
+ tt_int_op(444,OP_EQ, u3);
/* Literal '%' (ie. '%%') */
- tt_int_op(1,==, tor_sscanf("99% fresh", "%3u%% fresh", &u1));
- tt_int_op(99,==, u1);
- tt_int_op(0,==, tor_sscanf("99 fresh", "%% %3u %s", &u1, s1));
- tt_int_op(1,==, tor_sscanf("99 fresh", "%3u%% %s", &u1, s1));
- tt_int_op(2,==, tor_sscanf("99 fresh", "%3u %5s %%", &u1, s1));
- tt_int_op(99,==, u1);
- tt_str_op(s1,==, "fresh");
- tt_int_op(1,==, tor_sscanf("% boo", "%% %3s", s1));
- tt_str_op("boo",==, s1);
+ tt_int_op(1,OP_EQ, tor_sscanf("99% fresh", "%3u%% fresh", &u1));
+ tt_int_op(99,OP_EQ, u1);
+ tt_int_op(0,OP_EQ, tor_sscanf("99 fresh", "%% %3u %s", &u1, s1));
+ tt_int_op(1,OP_EQ, tor_sscanf("99 fresh", "%3u%% %s", &u1, s1));
+ tt_int_op(2,OP_EQ, tor_sscanf("99 fresh", "%3u %5s %%", &u1, s1));
+ tt_int_op(99,OP_EQ, u1);
+ tt_str_op(s1,OP_EQ, "fresh");
+ tt_int_op(1,OP_EQ, tor_sscanf("% boo", "%% %3s", s1));
+ tt_str_op("boo",OP_EQ, s1);
/* Strings (ie. %s) */
- tt_int_op(2,==, tor_sscanf("hello", "%3s%7s", s1, s2));
- tt_str_op(s1,==, "hel");
- tt_str_op(s2,==, "lo");
- tt_int_op(2,==, tor_sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */
- tt_str_op(s3,==, "WD");
- tt_int_op(40,==, u1);
- tt_int_op(2,==, tor_sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */
- tt_str_op(s3,==, "WD4");
- tt_int_op(0,==, u1);
- tt_int_op(2,==, tor_sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */
- tt_int_op(76,==, u1);
- tt_str_op(s1,==, "trombones");
- tt_int_op(1,==, tor_sscanf("prettylongstring", "%999s", s1));
- tt_str_op(s1,==, "prettylongstring");
+ tt_int_op(2,OP_EQ, tor_sscanf("hello", "%3s%7s", s1, s2));
+ tt_str_op(s1,OP_EQ, "hel");
+ tt_str_op(s2,OP_EQ, "lo");
+ tt_int_op(2,OP_EQ, tor_sscanf("WD40", "%2s%u", s3, &u1)); /* %s%u */
+ tt_str_op(s3,OP_EQ, "WD");
+ tt_int_op(40,OP_EQ, u1);
+ tt_int_op(2,OP_EQ, tor_sscanf("WD40", "%3s%u", s3, &u1)); /* %s%u */
+ tt_str_op(s3,OP_EQ, "WD4");
+ tt_int_op(0,OP_EQ, u1);
+ tt_int_op(2,OP_EQ, tor_sscanf("76trombones", "%6u%9s", &u1, s1)); /* %u%s */
+ tt_int_op(76,OP_EQ, u1);
+ tt_str_op(s1,OP_EQ, "trombones");
+ tt_int_op(1,OP_EQ, tor_sscanf("prettylongstring", "%999s", s1));
+ tt_str_op(s1,OP_EQ, "prettylongstring");
/* %s doesn't eat spaces */
- tt_int_op(2,==, tor_sscanf("hello world", "%9s %9s", s1, s2));
- tt_str_op(s1,==, "hello");
- tt_str_op(s2,==, "world");
- tt_int_op(2,==, tor_sscanf("bye world?", "%9s %9s", s1, s2));
- tt_str_op(s1,==, "bye");
- tt_str_op(s2,==, "");
- tt_int_op(3,==,
+ tt_int_op(2,OP_EQ, tor_sscanf("hello world", "%9s %9s", s1, s2));
+ tt_str_op(s1,OP_EQ, "hello");
+ tt_str_op(s2,OP_EQ, "world");
+ tt_int_op(2,OP_EQ, tor_sscanf("bye world?", "%9s %9s", s1, s2));
+ tt_str_op(s1,OP_EQ, "bye");
+ tt_str_op(s2,OP_EQ, "");
+ tt_int_op(3,OP_EQ,
tor_sscanf("hi", "%9s%9s%3s", s1, s2, s3)); /* %s can be empty. */
- tt_str_op(s1,==, "hi");
- tt_str_op(s2,==, "");
- tt_str_op(s3,==, "");
+ tt_str_op(s1,OP_EQ, "hi");
+ tt_str_op(s2,OP_EQ, "");
+ tt_str_op(s3,OP_EQ, "");
- tt_int_op(3,==, tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch));
- tt_int_op(4,==,
+ tt_int_op(3,OP_EQ, tor_sscanf("1.2.3", "%u.%u.%u%c", &u1, &u2, &u3, &ch));
+ tt_int_op(4,OP_EQ,
tor_sscanf("1.2.3 foobar", "%u.%u.%u%c", &u1, &u2, &u3, &ch));
- tt_int_op(' ',==, ch);
+ tt_int_op(' ',OP_EQ, ch);
r = tor_sscanf("12345 -67890 -1", "%d %ld %d", &int1, &lng1, &int2);
- tt_int_op(r,==, 3);
- tt_int_op(int1,==, 12345);
- tt_int_op(lng1,==, -67890);
- tt_int_op(int2,==, -1);
+ tt_int_op(r,OP_EQ, 3);
+ tt_int_op(int1,OP_EQ, 12345);
+ tt_int_op(lng1,OP_EQ, -67890);
+ tt_int_op(int2,OP_EQ, -1);
#if SIZEOF_INT == 4
/* %u */
/* UINT32_MAX should work */
- tt_int_op(1,==, tor_sscanf("4294967295", "%u", &u1));
- tt_int_op(4294967295U,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("4294967295", "%u", &u1));
+ tt_int_op(4294967295U,OP_EQ, u1);
/* But UINT32_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("4294967296", "%u", &u1));
+ tt_int_op(0,OP_EQ, tor_sscanf("4294967296", "%u", &u1));
/* but parsing only 9... */
- tt_int_op(1,==, tor_sscanf("4294967296", "%9u", &u1));
- tt_int_op(429496729U,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("4294967296", "%9u", &u1));
+ tt_int_op(429496729U,OP_EQ, u1);
/* %x */
/* UINT32_MAX should work */
- tt_int_op(1,==, tor_sscanf("FFFFFFFF", "%x", &u1));
- tt_int_op(0xFFFFFFFF,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFF", "%x", &u1));
+ tt_int_op(0xFFFFFFFF,OP_EQ, u1);
/* But UINT32_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("100000000", "%x", &u1));
+ tt_int_op(0,OP_EQ, tor_sscanf("100000000", "%x", &u1));
/* %d */
/* INT32_MIN and INT32_MAX should work */
r = tor_sscanf("-2147483648. 2147483647.", "%d. %d.", &int1, &int2);
- tt_int_op(r,==, 2);
- tt_int_op(int1,==, -2147483647 - 1);
- tt_int_op(int2,==, 2147483647);
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(int1,OP_EQ, -2147483647 - 1);
+ tt_int_op(int2,OP_EQ, 2147483647);
/* But INT32_MIN - 1 and INT32_MAX + 1 shouldn't work */
r = tor_sscanf("-2147483649.", "%d.", &int1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("2147483648.", "%d.", &int1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
/* and the first failure stops further processing */
r = tor_sscanf("-2147483648. 2147483648.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 1);
+ tt_int_op(r,OP_EQ, 1);
r = tor_sscanf("-2147483649. 2147483647.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("2147483648. -2147483649.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
#elif SIZEOF_INT == 8
/* %u */
/* UINT64_MAX should work */
- tt_int_op(1,==, tor_sscanf("18446744073709551615", "%u", &u1));
- tt_int_op(18446744073709551615U,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551615", "%u", &u1));
+ tt_int_op(18446744073709551615U,OP_EQ, u1);
/* But UINT64_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("18446744073709551616", "%u", &u1));
+ tt_int_op(0,OP_EQ, tor_sscanf("18446744073709551616", "%u", &u1));
/* but parsing only 19... */
- tt_int_op(1,==, tor_sscanf("18446744073709551616", "%19u", &u1));
- tt_int_op(1844674407370955161U,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551616", "%19u", &u1));
+ tt_int_op(1844674407370955161U,OP_EQ, u1);
/* %x */
/* UINT64_MAX should work */
- tt_int_op(1,==, tor_sscanf("FFFFFFFFFFFFFFFF", "%x", &u1));
- tt_int_op(0xFFFFFFFFFFFFFFFF,==, u1);
+ tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFFFFFFFFFF", "%x", &u1));
+ tt_int_op(0xFFFFFFFFFFFFFFFF,OP_EQ, u1);
/* But UINT64_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("10000000000000000", "%x", &u1));
+ tt_int_op(0,OP_EQ, tor_sscanf("10000000000000000", "%x", &u1));
/* %d */
/* INT64_MIN and INT64_MAX should work */
r = tor_sscanf("-9223372036854775808. 9223372036854775807.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 2);
- tt_int_op(int1,==, -9223372036854775807 - 1);
- tt_int_op(int2,==, 9223372036854775807);
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(int1,OP_EQ, -9223372036854775807 - 1);
+ tt_int_op(int2,OP_EQ, 9223372036854775807);
/* But INT64_MIN - 1 and INT64_MAX + 1 shouldn't work */
r = tor_sscanf("-9223372036854775809.", "%d.", &int1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("9223372036854775808.", "%d.", &int1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
/* and the first failure stops further processing */
r = tor_sscanf("-9223372036854775808. 9223372036854775808.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 1);
+ tt_int_op(r,OP_EQ, 1);
r = tor_sscanf("-9223372036854775809. 9223372036854775807.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("9223372036854775808. -9223372036854775809.",
"%d. %d.", &int1, &int2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
#endif
#if SIZEOF_LONG == 4
/* %lu */
/* UINT32_MAX should work */
- tt_int_op(1,==, tor_sscanf("4294967295", "%lu", &ulng));
- tt_int_op(4294967295UL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("4294967295", "%lu", &ulng));
+ tt_int_op(4294967295UL,OP_EQ, ulng);
/* But UINT32_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("4294967296", "%lu", &ulng));
+ tt_int_op(0,OP_EQ, tor_sscanf("4294967296", "%lu", &ulng));
/* but parsing only 9... */
- tt_int_op(1,==, tor_sscanf("4294967296", "%9lu", &ulng));
- tt_int_op(429496729UL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("4294967296", "%9lu", &ulng));
+ tt_int_op(429496729UL,OP_EQ, ulng);
/* %lx */
/* UINT32_MAX should work */
- tt_int_op(1,==, tor_sscanf("FFFFFFFF", "%lx", &ulng));
- tt_int_op(0xFFFFFFFFUL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFF", "%lx", &ulng));
+ tt_int_op(0xFFFFFFFFUL,OP_EQ, ulng);
/* But UINT32_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("100000000", "%lx", &ulng));
+ tt_int_op(0,OP_EQ, tor_sscanf("100000000", "%lx", &ulng));
/* %ld */
/* INT32_MIN and INT32_MAX should work */
r = tor_sscanf("-2147483648. 2147483647.", "%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 2);
- tt_int_op(lng1,==, -2147483647L - 1L);
- tt_int_op(lng2,==, 2147483647L);
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(lng1,OP_EQ, -2147483647L - 1L);
+ tt_int_op(lng2,OP_EQ, 2147483647L);
/* But INT32_MIN - 1 and INT32_MAX + 1 shouldn't work */
r = tor_sscanf("-2147483649.", "%ld.", &lng1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("2147483648.", "%ld.", &lng1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
/* and the first failure stops further processing */
r = tor_sscanf("-2147483648. 2147483648.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 1);
+ tt_int_op(r,OP_EQ, 1);
r = tor_sscanf("-2147483649. 2147483647.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("2147483648. -2147483649.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
#elif SIZEOF_LONG == 8
/* %lu */
/* UINT64_MAX should work */
- tt_int_op(1,==, tor_sscanf("18446744073709551615", "%lu", &ulng));
- tt_int_op(18446744073709551615UL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551615", "%lu", &ulng));
+ tt_int_op(18446744073709551615UL,OP_EQ, ulng);
/* But UINT64_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("18446744073709551616", "%lu", &ulng));
+ tt_int_op(0,OP_EQ, tor_sscanf("18446744073709551616", "%lu", &ulng));
/* but parsing only 19... */
- tt_int_op(1,==, tor_sscanf("18446744073709551616", "%19lu", &ulng));
- tt_int_op(1844674407370955161UL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("18446744073709551616", "%19lu", &ulng));
+ tt_int_op(1844674407370955161UL,OP_EQ, ulng);
/* %lx */
/* UINT64_MAX should work */
- tt_int_op(1,==, tor_sscanf("FFFFFFFFFFFFFFFF", "%lx", &ulng));
- tt_int_op(0xFFFFFFFFFFFFFFFFUL,==, ulng);
+ tt_int_op(1,OP_EQ, tor_sscanf("FFFFFFFFFFFFFFFF", "%lx", &ulng));
+ tt_int_op(0xFFFFFFFFFFFFFFFFUL,OP_EQ, ulng);
/* But UINT64_MAX + 1 shouldn't work */
- tt_int_op(0,==, tor_sscanf("10000000000000000", "%lx", &ulng));
+ tt_int_op(0,OP_EQ, tor_sscanf("10000000000000000", "%lx", &ulng));
/* %ld */
/* INT64_MIN and INT64_MAX should work */
r = tor_sscanf("-9223372036854775808. 9223372036854775807.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 2);
- tt_int_op(lng1,==, -9223372036854775807L - 1L);
- tt_int_op(lng2,==, 9223372036854775807L);
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(lng1,OP_EQ, -9223372036854775807L - 1L);
+ tt_int_op(lng2,OP_EQ, 9223372036854775807L);
/* But INT64_MIN - 1 and INT64_MAX + 1 shouldn't work */
r = tor_sscanf("-9223372036854775809.", "%ld.", &lng1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("9223372036854775808.", "%ld.", &lng1);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
/* and the first failure stops further processing */
r = tor_sscanf("-9223372036854775808. 9223372036854775808.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 1);
+ tt_int_op(r,OP_EQ, 1);
r = tor_sscanf("-9223372036854775809. 9223372036854775807.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
r = tor_sscanf("9223372036854775808. -9223372036854775809.",
"%ld. %ld.", &lng1, &lng2);
- tt_int_op(r,==, 0);
+ tt_int_op(r,OP_EQ, 0);
#endif
r = tor_sscanf("123.456 .000007 -900123123.2000787 00003.2",
"%lf %lf %lf %lf", &d1,&d2,&d3,&d4);
- tt_int_op(r,==, 4);
+ tt_int_op(r,OP_EQ, 4);
test_feq(d1, 123.456);
test_feq(d2, .000007);
test_feq(d3, -900123123.2000787);
@@ -2350,234 +2223,234 @@ test_util_format_time_interval(void *arg)
/* ignore exact spelling of "second(s)"*/
format_time_interval(dbuf, sizeof(dbuf), 0);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 0);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 0);
format_time_interval(dbuf, sizeof(dbuf), 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 1);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 1);
format_time_interval(dbuf, sizeof(dbuf), 10);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 10);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 10);
format_time_interval(dbuf, sizeof(dbuf), 59);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 59);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 59);
/* negative seconds are reported as their absolute value */
format_time_interval(dbuf, sizeof(dbuf), -4);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 4);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 4);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
format_time_interval(dbuf, sizeof(dbuf), -32);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &sec, label_s);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(sec,==, 32);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(sec,OP_EQ, 32);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
/* minutes: 1:00, 1:01, 1:59, 2:00, 2:01, 59:59 */
/* ignore trailing "0 second(s)", if present */
format_time_interval(dbuf, sizeof(dbuf), 60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &min, label_m);
- tt_int_op(r,==, 2);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(min,==, 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(r,OP_EQ, 2);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(min,OP_EQ, 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
/* ignore exact spelling of "minute(s)," and "second(s)" */
format_time_interval(dbuf, sizeof(dbuf), 60 + 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 1);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 1);
- tt_ci_char_op(label_s[0],==, 's');
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 1);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 1);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
format_time_interval(dbuf, sizeof(dbuf), 60*2 - 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 1);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 59);
- tt_ci_char_op(label_s[0],==, 's');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 1);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 59);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
/* ignore trailing "0 second(s)", if present */
format_time_interval(dbuf, sizeof(dbuf), 60*2);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &min, label_m);
- tt_int_op(r,==, 2);
- tt_int_op(min,==, 2);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(min,OP_EQ, 2);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* ignore exact spelling of "minute(s)," and "second(s)" */
format_time_interval(dbuf, sizeof(dbuf), 60*2 + 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 2);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 1);
- tt_ci_char_op(label_s[0],==, 's');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 2);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 1);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
format_time_interval(dbuf, sizeof(dbuf), 60*60 - 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 59);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 59);
- tt_ci_char_op(label_s[0],==, 's');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 59);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 59);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
/* negative minutes are reported as their absolute value */
/* ignore trailing "0 second(s)", if present */
format_time_interval(dbuf, sizeof(dbuf), -3*60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &min, label_m);
- tt_int_op(r,==, 2);
- tt_int_op(min,==, 3);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(min,OP_EQ, 3);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* ignore exact spelling of "minute(s)," and "second(s)" */
format_time_interval(dbuf, sizeof(dbuf), -96);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 1);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 36);
- tt_ci_char_op(label_s[0],==, 's');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 1);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 36);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
format_time_interval(dbuf, sizeof(dbuf), -2815);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&min, label_m, &sec, label_s);
- tt_int_op(r,==, 4);
- tt_int_op(min,==, 46);
- tt_ci_char_op(label_m[0],==, 'm');
- tt_int_op(sec,==, 55);
- tt_ci_char_op(label_s[0],==, 's');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(min,OP_EQ, 46);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
+ tt_int_op(sec,OP_EQ, 55);
+ tt_ci_char_op(label_s[0],OP_EQ, 's');
/* hours: 1:00, 1:00:01, 1:01, 23:59, 23:59:59 */
/* always ignore trailing seconds, if present */
/* ignore trailing "0 minute(s)" etc., if present */
format_time_interval(dbuf, sizeof(dbuf), 60*60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &hour, label_h);
- tt_int_op(r,==, 2);
- tt_int_op(hour,==, 1);
- tt_ci_char_op(label_h[0],==, 'h');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(hour,OP_EQ, 1);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
format_time_interval(dbuf, sizeof(dbuf), 60*60 + 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &hour, label_h);
- tt_int_op(r,==, 2);
- tt_int_op(hour,==, 1);
- tt_ci_char_op(label_h[0],==, 'h');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(hour,OP_EQ, 1);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
/* ignore exact spelling of "hour(s)," etc. */
format_time_interval(dbuf, sizeof(dbuf), 60*60 + 60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&hour, label_h, &min, label_m);
- tt_int_op(r,==, 4);
- tt_int_op(hour,==, 1);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 1);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(hour,OP_EQ, 1);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 1);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
format_time_interval(dbuf, sizeof(dbuf), 24*60*60 - 60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&hour, label_h, &min, label_m);
- tt_int_op(r,==, 4);
- tt_int_op(hour,==, 23);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 59);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(hour,OP_EQ, 23);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 59);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
format_time_interval(dbuf, sizeof(dbuf), 24*60*60 - 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&hour, label_h, &min, label_m);
- tt_int_op(r,==, 4);
- tt_int_op(hour,==, 23);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 59);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(hour,OP_EQ, 23);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 59);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* negative hours are reported as their absolute value */
/* ignore exact spelling of "hour(s)," etc., if present */
format_time_interval(dbuf, sizeof(dbuf), -2*60*60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &hour, label_h);
- tt_int_op(r,==, 2);
- tt_int_op(hour,==, 2);
- tt_ci_char_op(label_h[0],==, 'h');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(hour,OP_EQ, 2);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
format_time_interval(dbuf, sizeof(dbuf), -75804);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&hour, label_h, &min, label_m);
- tt_int_op(r,==, 4);
- tt_int_op(hour,==, 21);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 3);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(hour,OP_EQ, 21);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 3);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* days: 1:00, 1:00:00:01, 1:00:01, 1:01 */
/* always ignore trailing seconds, if present */
/* ignore trailing "0 hours(s)" etc., if present */
format_time_interval(dbuf, sizeof(dbuf), 24*60*60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &day, label_d);
- tt_int_op(r,==, 2);
- tt_int_op(day,==, 1);
- tt_ci_char_op(label_d[0],==, 'd');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(day,OP_EQ, 1);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 1);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_, &day, label_d);
- tt_int_op(r,==, 2);
- tt_int_op(day,==, 1);
- tt_ci_char_op(label_d[0],==, 'd');
+ tt_int_op(r,OP_EQ, 2);
+ tt_int_op(day,OP_EQ, 1);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
/* ignore exact spelling of "days(s)," etc. */
format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
if (r == -1) {
@@ -2586,68 +2459,68 @@ test_util_format_time_interval(void *arg)
&day, label_d, &min, label_m);
}
tt_assert(r == 4 || r == 6);
- tt_int_op(day,==, 1);
- tt_ci_char_op(label_d[0],==, 'd');
+ tt_int_op(day,OP_EQ, 1);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
if (r == 6) {
- tt_int_op(hour,==, 0);
- tt_ci_char_op(label_h[0],==, 'h');
+ tt_int_op(hour,OP_EQ, 0);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
}
- tt_int_op(min,==, 1);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(min,OP_EQ, 1);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* ignore trailing "0 minutes(s)" etc., if present */
format_time_interval(dbuf, sizeof(dbuf), 24*60*60 + 60*60);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_,
&day, label_d, &hour, label_h);
- tt_int_op(r,==, 4);
- tt_int_op(day,==, 1);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 1);
- tt_ci_char_op(label_h[0],==, 'h');
+ tt_int_op(r,OP_EQ, 4);
+ tt_int_op(day,OP_EQ, 1);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 1);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
/* negative days are reported as their absolute value */
format_time_interval(dbuf, sizeof(dbuf), -21936184);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 253);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 21);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 23);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 253);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 21);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 23);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* periods > 1 year are reported in days (warn?) */
/* ignore exact spelling of "days(s)," etc., if present */
format_time_interval(dbuf, sizeof(dbuf), 758635154);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 8780);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 11);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 59);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 8780);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 11);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 59);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* negative periods > 1 year are reported in days (warn?) */
format_time_interval(dbuf, sizeof(dbuf), -1427014922);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 16516);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 9);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 2);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 16516);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 9);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 2);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
#if SIZEOF_LONG == 4 || SIZEOF_LONG == 8
@@ -2656,32 +2529,32 @@ test_util_format_time_interval(void *arg)
/* INT32_MAX */
format_time_interval(dbuf, sizeof(dbuf), 2147483647);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 24855);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 3);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 14);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 24855);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 3);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 14);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* and 7 seconds - ignored */
/* INT32_MIN: check that we get the absolute value of interval,
* which doesn't actually fit in int32_t.
* We expect INT32_MAX or INT32_MAX + 1 with 64 bit longs */
format_time_interval(dbuf, sizeof(dbuf), -2147483647L - 1L);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 24855);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 3);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 14);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 24855);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 3);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 14);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* and 7 or 8 seconds - ignored */
#endif
@@ -2693,16 +2566,16 @@ test_util_format_time_interval(void *arg)
/* INT64_MAX */
format_time_interval(dbuf, sizeof(dbuf), 9223372036854775807L);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 106751991167300L);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 15);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 30);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 106751991167300L);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 15);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 30);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* and 7 seconds - ignored */
/* INT64_MIN: check that we get the absolute value of interval,
@@ -2710,16 +2583,16 @@ test_util_format_time_interval(void *arg)
* We expect INT64_MAX */
format_time_interval(dbuf, sizeof(dbuf),
-9223372036854775807L - 1L);
- tt_int_op(strnlen(dbuf, DBUF_SIZE),<=, DBUF_SIZE - 1);
+ tt_int_op(strnlen(dbuf, DBUF_SIZE),OP_LE, DBUF_SIZE - 1);
r = tor_sscanf(dbuf, TL_ " " TL_ " " TL_,
&day, label_d, &hour, label_h, &min, label_m);
- tt_int_op(r,==, 6);
- tt_int_op(day,==, 106751991167300L);
- tt_ci_char_op(label_d[0],==, 'd');
- tt_int_op(hour,==, 15);
- tt_ci_char_op(label_h[0],==, 'h');
- tt_int_op(min,==, 30);
- tt_ci_char_op(label_m[0],==, 'm');
+ tt_int_op(r,OP_EQ, 6);
+ tt_int_op(day,OP_EQ, 106751991167300L);
+ tt_ci_char_op(label_d[0],OP_EQ, 'd');
+ tt_int_op(hour,OP_EQ, 15);
+ tt_ci_char_op(label_h[0],OP_EQ, 'h');
+ tt_int_op(min,OP_EQ, 30);
+ tt_ci_char_op(label_m[0],OP_EQ, 'm');
/* and 7 or 8 seconds - ignored */
#endif
@@ -2741,30 +2614,30 @@ test_util_path_is_relative(void *arg)
{
/* OS-independent tests */
(void)arg;
- tt_int_op(1,==, path_is_relative(""));
- tt_int_op(1,==, path_is_relative("dir"));
- tt_int_op(1,==, path_is_relative("dir/"));
- tt_int_op(1,==, path_is_relative("./dir"));
- tt_int_op(1,==, path_is_relative("../dir"));
+ tt_int_op(1,OP_EQ, path_is_relative(""));
+ tt_int_op(1,OP_EQ, path_is_relative("dir"));
+ tt_int_op(1,OP_EQ, path_is_relative("dir/"));
+ tt_int_op(1,OP_EQ, path_is_relative("./dir"));
+ tt_int_op(1,OP_EQ, path_is_relative("../dir"));
- tt_int_op(0,==, path_is_relative("/"));
- tt_int_op(0,==, path_is_relative("/dir"));
- tt_int_op(0,==, path_is_relative("/dir/"));
+ tt_int_op(0,OP_EQ, path_is_relative("/"));
+ tt_int_op(0,OP_EQ, path_is_relative("/dir"));
+ tt_int_op(0,OP_EQ, path_is_relative("/dir/"));
/* Windows */
#ifdef _WIN32
/* I don't have Windows so I can't test this, hence the "#ifdef
0". These are tests that look useful, so please try to get them
running and uncomment if it all works as it should */
- tt_int_op(1,==, path_is_relative("dir"));
- tt_int_op(1,==, path_is_relative("dir\\"));
- tt_int_op(1,==, path_is_relative("dir\\a:"));
- tt_int_op(1,==, path_is_relative("dir\\a:\\"));
- tt_int_op(1,==, path_is_relative("http:\\dir"));
-
- tt_int_op(0,==, path_is_relative("\\dir"));
- tt_int_op(0,==, path_is_relative("a:\\dir"));
- tt_int_op(0,==, path_is_relative("z:\\dir"));
+ tt_int_op(1,OP_EQ, path_is_relative("dir"));
+ tt_int_op(1,OP_EQ, path_is_relative("dir\\"));
+ tt_int_op(1,OP_EQ, path_is_relative("dir\\a:"));
+ tt_int_op(1,OP_EQ, path_is_relative("dir\\a:\\"));
+ tt_int_op(1,OP_EQ, path_is_relative("http:\\dir"));
+
+ tt_int_op(0,OP_EQ, path_is_relative("\\dir"));
+ tt_int_op(0,OP_EQ, path_is_relative("a:\\dir"));
+ tt_int_op(0,OP_EQ, path_is_relative("z:\\dir"));
#endif
done:
@@ -2793,7 +2666,7 @@ test_util_mempool(void *arg)
tt_assert(pool);
tt_assert(pool->new_chunk_capacity >= 10);
tt_assert(pool->item_alloc_size >= sizeof(void*)+241);
- tt_int_op(pool->item_alloc_size & 0x03,==, 0);
+ tt_int_op(pool->item_alloc_size & 0x03,OP_EQ, 0);
tt_assert(pool->new_chunk_capacity < 60);
allocated = smartlist_new();
@@ -2857,16 +2730,16 @@ test_util_memarea(void *arg)
tt_assert(p1+64 <= p2);
tt_assert(p2+52 <= p3);
/* Make sure we aligned. */
- tt_int_op(((uintptr_t)p1) % sizeof(void*),==, 0);
- tt_int_op(((uintptr_t)p2) % sizeof(void*),==, 0);
- tt_int_op(((uintptr_t)p3) % sizeof(void*),==, 0);
+ tt_int_op(((uintptr_t)p1) % sizeof(void*),OP_EQ, 0);
+ tt_int_op(((uintptr_t)p2) % sizeof(void*),OP_EQ, 0);
+ tt_int_op(((uintptr_t)p3) % sizeof(void*),OP_EQ, 0);
tt_assert(!memarea_owns_ptr(area, p3+8192));
tt_assert(!memarea_owns_ptr(area, p3+30));
tt_assert(tor_mem_is_zero(p2, 52));
/* Make sure we don't overalign. */
p1 = memarea_alloc(area, 1);
p2 = memarea_alloc(area, 1);
- tt_ptr_op(p1+sizeof(void*),==, p2);
+ tt_ptr_op(p1+sizeof(void*),OP_EQ, p2);
{
malloced_ptr = tor_malloc(64);
tt_assert(!memarea_owns_ptr(area, malloced_ptr));
@@ -2879,7 +2752,7 @@ test_util_memarea(void *arg)
crypto_rand((char*)malloced_ptr, 64);
p1 = memarea_memdup(area, malloced_ptr, 64);
tt_assert(p1 != malloced_ptr);
- tt_mem_op(p1,==, malloced_ptr, 64);
+ tt_mem_op(p1,OP_EQ, malloced_ptr, 64);
tor_free(malloced_ptr);
}
@@ -2888,8 +2761,8 @@ test_util_memarea(void *arg)
p2 = memarea_strdup(area, "abcd");
tt_assert(p1);
tt_assert(p2);
- tt_str_op(p1,==, "");
- tt_str_op(p2,==, "abcd");
+ tt_str_op(p1,OP_EQ, "");
+ tt_str_op(p2,OP_EQ, "abcd");
/* memarea_strndup. */
{
@@ -2898,20 +2771,20 @@ test_util_memarea(void *arg)
size_t len = strlen(s);
p1 = memarea_strndup(area, s, 1000);
p2 = memarea_strndup(area, s, 10);
- tt_str_op(p1,==, s);
+ tt_str_op(p1,OP_EQ, s);
tt_assert(p2 >= p1 + len + 1);
- tt_mem_op(s,==, p2, 10);
- tt_int_op(p2[10],==, '\0');
+ tt_mem_op(s,OP_EQ, p2, 10);
+ tt_int_op(p2[10],OP_EQ, '\0');
p3 = memarea_strndup(area, s, len);
- tt_str_op(p3,==, s);
+ tt_str_op(p3,OP_EQ, s);
p3 = memarea_strndup(area, s, len-1);
- tt_mem_op(s,==, p3, len-1);
- tt_int_op(p3[len-1],==, '\0');
+ tt_mem_op(s,OP_EQ, p3, len-1);
+ tt_int_op(p3[len-1],OP_EQ, '\0');
}
memarea_clear(area);
p1 = memarea_alloc(area, 1);
- tt_ptr_op(p1,==, p1_orig);
+ tt_ptr_op(p1,OP_EQ, p1_orig);
memarea_clear(area);
/* Check for running over an area's size. */
@@ -2944,22 +2817,22 @@ test_util_datadir(void *arg)
temp_dir = get_datadir_fname(NULL);
f = get_datadir_fname("state");
tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"state", temp_dir);
- tt_str_op(f,==, buf);
+ tt_str_op(f,OP_EQ, buf);
tor_free(f);
f = get_datadir_fname2("cache", "thingy");
tor_snprintf(buf, sizeof(buf),
"%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy", temp_dir);
- tt_str_op(f,==, buf);
+ tt_str_op(f,OP_EQ, buf);
tor_free(f);
f = get_datadir_fname2_suffix("cache", "thingy", ".foo");
tor_snprintf(buf, sizeof(buf),
"%s"PATH_SEPARATOR"cache"PATH_SEPARATOR"thingy.foo", temp_dir);
- tt_str_op(f,==, buf);
+ tt_str_op(f,OP_EQ, buf);
tor_free(f);
f = get_datadir_fname_suffix("cache", ".foo");
tor_snprintf(buf, sizeof(buf), "%s"PATH_SEPARATOR"cache.foo",
temp_dir);
- tt_str_op(f,==, buf);
+ tt_str_op(f,OP_EQ, buf);
done:
tor_free(f);
@@ -3000,43 +2873,43 @@ test_util_strtok(void *arg)
"%sthey.seemed;;their!.own;most.perfect;monument%s",pad2,pad2);
/* -- "Year's End", Richard Wilbur */
- tt_str_op("Graved",==, tor_strtok_r_impl(buf, " ", &cp1));
- tt_str_op("they",==, tor_strtok_r_impl(buf2, ".!..;!", &cp2));
+ tt_str_op("Graved",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1));
+ tt_str_op("they",OP_EQ, tor_strtok_r_impl(buf2, ".!..;!", &cp2));
#define S1() tor_strtok_r_impl(NULL, " ", &cp1)
#define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2)
- tt_str_op("on",==, S1());
- tt_str_op("the",==, S1());
- tt_str_op("dark",==, S1());
- tt_str_op("seemed",==, S2());
- tt_str_op("their",==, S2());
- tt_str_op("own",==, S2());
- tt_str_op("in",==, S1());
- tt_str_op("gestures",==, S1());
- tt_str_op("of",==, S1());
- tt_str_op("most",==, S2());
- tt_str_op("perfect",==, S2());
- tt_str_op("descent",==, S1());
- tt_str_op("monument",==, S2());
- tt_ptr_op(NULL,==, S1());
- tt_ptr_op(NULL,==, S2());
+ tt_str_op("on",OP_EQ, S1());
+ tt_str_op("the",OP_EQ, S1());
+ tt_str_op("dark",OP_EQ, S1());
+ tt_str_op("seemed",OP_EQ, S2());
+ tt_str_op("their",OP_EQ, S2());
+ tt_str_op("own",OP_EQ, S2());
+ tt_str_op("in",OP_EQ, S1());
+ tt_str_op("gestures",OP_EQ, S1());
+ tt_str_op("of",OP_EQ, S1());
+ tt_str_op("most",OP_EQ, S2());
+ tt_str_op("perfect",OP_EQ, S2());
+ tt_str_op("descent",OP_EQ, S1());
+ tt_str_op("monument",OP_EQ, S2());
+ tt_ptr_op(NULL,OP_EQ, S1());
+ tt_ptr_op(NULL,OP_EQ, S2());
}
buf[0] = 0;
- tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1));
- tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, "!", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, "!", &cp1));
strlcpy(buf, "Howdy!", sizeof(buf));
- tt_str_op("Howdy",==, tor_strtok_r_impl(buf, "!", &cp1));
- tt_ptr_op(NULL,==, tor_strtok_r_impl(NULL, "!", &cp1));
+ tt_str_op("Howdy",OP_EQ, tor_strtok_r_impl(buf, "!", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, "!", &cp1));
strlcpy(buf, " ", sizeof(buf));
- tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1));
strlcpy(buf, " ", sizeof(buf));
- tt_ptr_op(NULL,==, tor_strtok_r_impl(buf, " ", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(buf, " ", &cp1));
strlcpy(buf, "something ", sizeof(buf));
- tt_str_op("something",==, tor_strtok_r_impl(buf, " ", &cp1));
- tt_ptr_op(NULL,==, tor_strtok_r_impl(NULL, ";", &cp1));
+ tt_str_op("something",OP_EQ, tor_strtok_r_impl(buf, " ", &cp1));
+ tt_ptr_op(NULL,OP_EQ, tor_strtok_r_impl(NULL, ";", &cp1));
done:
;
}
@@ -3056,24 +2929,26 @@ test_util_find_str_at_start_of_line(void *ptr)
(void)ptr;
- tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, ""));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(short_string, "nonsense"));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "nonsense"));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "\n"));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "how "));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "kitty"));
- tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, "h"));
- tt_ptr_op(long_string,==, find_str_at_start_of_line(long_string, "how"));
- tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "he"));
- tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hell"));
- tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hello k"));
- tt_ptr_op(line2,==, find_str_at_start_of_line(long_string, "hello kitty\n"));
- tt_ptr_op(line2,==,
+ tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, ""));
+ tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(short_string, "nonsense"));
+ tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "nonsense"));
+ tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "\n"));
+ tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "how "));
+ tt_ptr_op(NULL,OP_EQ, find_str_at_start_of_line(long_string, "kitty"));
+ tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "h"));
+ tt_ptr_op(long_string,OP_EQ, find_str_at_start_of_line(long_string, "how"));
+ tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "he"));
+ tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hell"));
+ tt_ptr_op(line2,OP_EQ, find_str_at_start_of_line(long_string, "hello k"));
+ tt_ptr_op(line2,OP_EQ,
+ find_str_at_start_of_line(long_string, "hello kitty\n"));
+ tt_ptr_op(line2,OP_EQ,
find_str_at_start_of_line(long_string, "hello kitty\nt"));
- tt_ptr_op(line3,==, find_str_at_start_of_line(long_string, "third"));
- tt_ptr_op(line3,==, find_str_at_start_of_line(long_string, "third line"));
- tt_ptr_op(NULL,==, find_str_at_start_of_line(long_string, "third line\n"));
- tt_ptr_op(short_line2,==, find_str_at_start_of_line(short_string,
+ tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third"));
+ tt_ptr_op(line3,OP_EQ, find_str_at_start_of_line(long_string, "third line"));
+ tt_ptr_op(NULL, OP_EQ,
+ find_str_at_start_of_line(long_string, "third line\n"));
+ tt_ptr_op(short_line2,OP_EQ, find_str_at_start_of_line(short_string,
"second line\n"));
done:
;
@@ -3084,25 +2959,25 @@ test_util_string_is_C_identifier(void *ptr)
{
(void)ptr;
- tt_int_op(1,==, string_is_C_identifier("string_is_C_identifier"));
- tt_int_op(1,==, string_is_C_identifier("_string_is_C_identifier"));
- tt_int_op(1,==, string_is_C_identifier("_"));
- tt_int_op(1,==, string_is_C_identifier("i"));
- tt_int_op(1,==, string_is_C_identifier("_____"));
- tt_int_op(1,==, string_is_C_identifier("__00__"));
- tt_int_op(1,==, string_is_C_identifier("__init__"));
- tt_int_op(1,==, string_is_C_identifier("_0"));
- tt_int_op(1,==, string_is_C_identifier("_0string_is_C_identifier"));
- tt_int_op(1,==, string_is_C_identifier("_0"));
-
- tt_int_op(0,==, string_is_C_identifier("0_string_is_C_identifier"));
- tt_int_op(0,==, string_is_C_identifier("0"));
- tt_int_op(0,==, string_is_C_identifier(""));
- tt_int_op(0,==, string_is_C_identifier(";"));
- tt_int_op(0,==, string_is_C_identifier("i;"));
- tt_int_op(0,==, string_is_C_identifier("_;"));
- tt_int_op(0,==, string_is_C_identifier("í"));
- tt_int_op(0,==, string_is_C_identifier("ñ"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("string_is_C_identifier"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_string_is_C_identifier"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("i"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_____"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("__00__"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("__init__"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_0"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_0string_is_C_identifier"));
+ tt_int_op(1,OP_EQ, string_is_C_identifier("_0"));
+
+ tt_int_op(0,OP_EQ, string_is_C_identifier("0_string_is_C_identifier"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier("0"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier(""));
+ tt_int_op(0,OP_EQ, string_is_C_identifier(";"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier("i;"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier("_;"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier("í"));
+ tt_int_op(0,OP_EQ, string_is_C_identifier("ñ"));
done:
;
@@ -3120,29 +2995,29 @@ test_util_asprintf(void *ptr)
/* simple string */
r = tor_asprintf(&cp, "simple string 100%% safe");
tt_assert(cp);
- tt_str_op("simple string 100% safe",==, cp);
- tt_int_op(strlen(cp),==, r);
+ tt_str_op("simple string 100% safe",OP_EQ, cp);
+ tt_int_op(strlen(cp),OP_EQ, r);
tor_free(cp);
/* empty string */
r = tor_asprintf(&cp, "%s", "");
tt_assert(cp);
- tt_str_op("",==, cp);
- tt_int_op(strlen(cp),==, r);
+ tt_str_op("",OP_EQ, cp);
+ tt_int_op(strlen(cp),OP_EQ, r);
tor_free(cp);
/* numbers (%i) */
r = tor_asprintf(&cp, "I like numbers-%2i, %i, etc.", -1, 2);
tt_assert(cp);
- tt_str_op("I like numbers--1, 2, etc.",==, cp);
- tt_int_op(strlen(cp),==, r);
+ tt_str_op("I like numbers--1, 2, etc.",OP_EQ, cp);
+ tt_int_op(strlen(cp),OP_EQ, r);
/* don't free cp; next test uses it. */
/* numbers (%d) */
r = tor_asprintf(&cp2, "First=%d, Second=%d", 101, 202);
tt_assert(cp2);
- tt_int_op(strlen(cp2),==, r);
- tt_str_op("First=101, Second=202",==, cp2);
+ tt_int_op(strlen(cp2),OP_EQ, r);
+ tt_str_op("First=101, Second=202",OP_EQ, cp2);
tt_assert(cp != cp2);
tor_free(cp);
tor_free(cp2);
@@ -3150,17 +3025,17 @@ test_util_asprintf(void *ptr)
/* Glass-box test: a string exactly 128 characters long. */
r = tor_asprintf(&cp, "Lorem1: %sLorem2: %s", LOREMIPSUM, LOREMIPSUM);
tt_assert(cp);
- tt_int_op(128,==, r);
- tt_int_op(cp[128], ==, '\0');
- tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,==, cp);
+ tt_int_op(128,OP_EQ, r);
+ tt_int_op(cp[128], OP_EQ, '\0');
+ tt_str_op("Lorem1: "LOREMIPSUM"Lorem2: "LOREMIPSUM,OP_EQ, cp);
tor_free(cp);
/* String longer than 128 characters */
r = tor_asprintf(&cp, "1: %s 2: %s 3: %s",
LOREMIPSUM, LOREMIPSUM, LOREMIPSUM);
tt_assert(cp);
- tt_int_op(strlen(cp),==, r);
- tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,==, cp);
+ tt_int_op(strlen(cp),OP_EQ, r);
+ tt_str_op("1: "LOREMIPSUM" 2: "LOREMIPSUM" 3: "LOREMIPSUM,OP_EQ, cp);
done:
tor_free(cp);
@@ -3181,9 +3056,9 @@ test_util_listdir(void *ptr)
dir1 = tor_strdup(get_fname("some-directory"));
dirname = tor_strdup(get_fname(NULL));
- tt_int_op(0,==, write_str_to_file(fname1, "X\n", 0));
- tt_int_op(0,==, write_str_to_file(fname2, "Y\n", 0));
- tt_int_op(0,==, write_str_to_file(fname3, "Z\n", 0));
+ tt_int_op(0,OP_EQ, write_str_to_file(fname1, "X\n", 0));
+ tt_int_op(0,OP_EQ, write_str_to_file(fname2, "Y\n", 0));
+ tt_int_op(0,OP_EQ, write_str_to_file(fname3, "Z\n", 0));
#ifdef _WIN32
r = mkdir(dir1);
#else
@@ -3229,9 +3104,9 @@ test_util_parent_dir(void *ptr)
int ok; \
cp = tor_strdup(input); \
ok = get_parent_directory(cp); \
- tt_int_op(expect_ok, ==, ok); \
+ tt_int_op(expect_ok, OP_EQ, ok); \
if (ok==0) \
- tt_str_op(output, ==, cp); \
+ tt_str_op(output, OP_EQ, cp); \
tor_free(cp); \
} while (0);
@@ -3280,32 +3155,32 @@ test_util_ftruncate(void *ptr)
fname = get_fname("ftruncate");
fd = tor_open_cloexec(fname, O_WRONLY|O_CREAT, 0600);
- tt_int_op(fd, >=, 0);
+ tt_int_op(fd, OP_GE, 0);
/* Make the file be there. */
- tt_int_op(strlen(message), ==, write_all(fd, message, strlen(message), 0));
- tt_int_op((int)tor_fd_getpos(fd), ==, strlen(message));
- tt_int_op(0, ==, fstat(fd, &st));
- tt_int_op((int)st.st_size, ==, strlen(message));
+ tt_int_op(strlen(message), OP_EQ, write_all(fd, message, strlen(message),0));
+ tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message));
+ tt_int_op(0, OP_EQ, fstat(fd, &st));
+ tt_int_op((int)st.st_size, OP_EQ, strlen(message));
/* Truncate and see if it got truncated */
- tt_int_op(0, ==, tor_ftruncate(fd));
- tt_int_op((int)tor_fd_getpos(fd), ==, 0);
- tt_int_op(0, ==, fstat(fd, &st));
- tt_int_op((int)st.st_size, ==, 0);
+ tt_int_op(0, OP_EQ, tor_ftruncate(fd));
+ tt_int_op((int)tor_fd_getpos(fd), OP_EQ, 0);
+ tt_int_op(0, OP_EQ, fstat(fd, &st));
+ tt_int_op((int)st.st_size, OP_EQ, 0);
/* Replace, and see if it got replaced */
- tt_int_op(strlen(message2), ==,
+ tt_int_op(strlen(message2), OP_EQ,
write_all(fd, message2, strlen(message2), 0));
- tt_int_op((int)tor_fd_getpos(fd), ==, strlen(message2));
- tt_int_op(0, ==, fstat(fd, &st));
- tt_int_op((int)st.st_size, ==, strlen(message2));
+ tt_int_op((int)tor_fd_getpos(fd), OP_EQ, strlen(message2));
+ tt_int_op(0, OP_EQ, fstat(fd, &st));
+ tt_int_op((int)st.st_size, OP_EQ, strlen(message2));
close(fd);
fd = -1;
buf = read_file_to_str(fname, 0, NULL);
- tt_str_op(message2, ==, buf);
+ tt_str_op(message2, OP_EQ, buf);
done:
if (fd >= 0)
@@ -3344,53 +3219,53 @@ test_util_exit_status(void *ptr)
(void)ptr;
clear_hex_errno(hex_errno);
- tt_str_op("",==, hex_errno);
+ tt_str_op("",OP_EQ, hex_errno);
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0, 0, hex_errno);
- tt_str_op("0/0\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
+ tt_str_op("0/0\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
#if SIZEOF_INT == 4
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0, 0x7FFFFFFF, hex_errno);
- tt_str_op("0/7FFFFFFF\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
+ tt_str_op("0/7FFFFFFF\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0xFF, -0x80000000, hex_errno);
- tt_str_op("FF/-80000000\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
- tt_int_op(n,==, HEX_ERRNO_SIZE);
+ tt_str_op("FF/-80000000\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
+ tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE);
#elif SIZEOF_INT == 8
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0, 0x7FFFFFFFFFFFFFFF, hex_errno);
- tt_str_op("0/7FFFFFFFFFFFFFFF\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
+ tt_str_op("0/7FFFFFFFFFFFFFFF\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0xFF, -0x8000000000000000, hex_errno);
- tt_str_op("FF/-8000000000000000\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
- tt_int_op(n,==, HEX_ERRNO_SIZE);
+ tt_str_op("FF/-8000000000000000\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
+ tt_int_op(n,OP_EQ, HEX_ERRNO_SIZE);
#endif
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0x7F, 0, hex_errno);
- tt_str_op("7F/0\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
+ tt_str_op("7F/0\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
clear_hex_errno(hex_errno);
n = format_helper_exit_status(0x08, -0x242, hex_errno);
- tt_str_op("8/-242\n",==, hex_errno);
- tt_int_op(n,==, strlen(hex_errno));
+ tt_str_op("8/-242\n",OP_EQ, hex_errno);
+ tt_int_op(n,OP_EQ, strlen(hex_errno));
clear_hex_errno(hex_errno);
- tt_str_op("",==, hex_errno);
+ tt_str_op("",OP_EQ, hex_errno);
done:
;
@@ -3417,83 +3292,83 @@ test_util_fgets_eagain(void *ptr)
/* Set up a pipe to test on */
retval = pipe(test_pipe);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
/* Set up the read-end to be non-blocking */
retval = fcntl(test_pipe[0], F_SETFL, O_NONBLOCK);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
/* Open it as a stdio stream */
test_stream = fdopen(test_pipe[0], "r");
- tt_ptr_op(test_stream, !=, NULL);
+ tt_ptr_op(test_stream, OP_NE, NULL);
/* Send in a partial line */
retlen = write(test_pipe[1], "A", 1);
- tt_int_op(retlen, ==, 1);
+ tt_int_op(retlen, OP_EQ, 1);
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, EAGAIN);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "A");
+ tt_int_op(errno, OP_EQ, EAGAIN);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "A");
errno = 0;
/* Send in the rest */
retlen = write(test_pipe[1], "B\n", 2);
- tt_int_op(retlen, ==, 2);
+ tt_int_op(retlen, OP_EQ, 2);
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, 0);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "B\n");
+ tt_int_op(errno, OP_EQ, 0);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "B\n");
errno = 0;
/* Send in a full line */
retlen = write(test_pipe[1], "CD\n", 3);
- tt_int_op(retlen, ==, 3);
+ tt_int_op(retlen, OP_EQ, 3);
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, 0);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "CD\n");
+ tt_int_op(errno, OP_EQ, 0);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "CD\n");
errno = 0;
/* Send in a partial line */
retlen = write(test_pipe[1], "E", 1);
- tt_int_op(retlen, ==, 1);
+ tt_int_op(retlen, OP_EQ, 1);
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, EAGAIN);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "E");
+ tt_int_op(errno, OP_EQ, EAGAIN);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "E");
errno = 0;
/* Send in the rest */
retlen = write(test_pipe[1], "F\n", 2);
- tt_int_op(retlen, ==, 2);
+ tt_int_op(retlen, OP_EQ, 2);
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, 0);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "F\n");
+ tt_int_op(errno, OP_EQ, 0);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "F\n");
errno = 0;
/* Send in a full line and close */
retlen = write(test_pipe[1], "GH", 2);
- tt_int_op(retlen, ==, 2);
+ tt_int_op(retlen, OP_EQ, 2);
retval = close(test_pipe[1]);
- tt_int_op(retval, ==, 0);
+ tt_int_op(retval, OP_EQ, 0);
test_pipe[1] = -1;
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, 0);
- tt_ptr_op(retptr, ==, buf);
- tt_str_op(buf, ==, "GH");
+ tt_int_op(errno, OP_EQ, 0);
+ tt_ptr_op(retptr, OP_EQ, buf);
+ tt_str_op(buf, OP_EQ, "GH");
errno = 0;
/* Check for EOF */
retptr = fgets(buf, sizeof(buf), test_stream);
- tt_int_op(errno, ==, 0);
- tt_ptr_op(retptr, ==, NULL);
+ tt_int_op(errno, OP_EQ, 0);
+ tt_ptr_op(retptr, OP_EQ, NULL);
retval = feof(test_stream);
- tt_int_op(retval, !=, 0);
+ tt_int_op(retval, OP_NE, 0);
errno = 0;
/* Check that buf is unchanged according to C99 and C11 */
- tt_str_op(buf, ==, "GH");
+ tt_str_op(buf, OP_EQ, "GH");
done:
if (test_stream != NULL)
@@ -3505,370 +3380,6 @@ test_util_fgets_eagain(void *ptr)
}
#endif
-#ifndef BUILDDIR
-#define BUILDDIR "."
-#endif
-
-#ifdef _WIN32
-#define notify_pending_waitpid_callbacks() STMT_NIL
-#define TEST_CHILD "test-child.exe"
-#define EOL "\r\n"
-#else
-#define TEST_CHILD (BUILDDIR "/src/test/test-child")
-#define EOL "\n"
-#endif
-
-#ifdef _WIN32
-/* I've assumed Windows doesn't have the gap between fork and exec
- * that causes the race condition on unix-like platforms */
-#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2))
-
-#else
-/* work around a race condition of the timing of SIGCHLD handler updates
- * to the process_handle's fields, and checks of those fields
- *
- * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to
- * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */
-#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1)
-#define IS_RUNNING_OR_NOTRUNNING(s) \
- ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING)
-/* well, this is ugly */
-#define MATCH_PROCESS_STATUS(s1,s2) \
- ( (s1) == (s2) \
- ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \
- && IS_RUNNING_OR_NOTRUNNING(s2)) \
- ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \
- && IS_RUNNING_OR_NOTRUNNING(s1)))
-
-#endif // _WIN32
-
-/** Helper function for testing tor_spawn_background */
-static void
-run_util_spawn_background(const char *argv[], const char *expected_out,
- const char *expected_err, int expected_exit,
- int expected_status)
-{
- int retval, exit_code;
- ssize_t pos;
- process_handle_t *process_handle=NULL;
- char stdout_buf[100], stderr_buf[100];
- int status;
-
- /* Start the program */
-#ifdef _WIN32
- status = tor_spawn_background(NULL, argv, NULL, &process_handle);
-#else
- status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
-#endif
-
- notify_pending_waitpid_callbacks();
-
- /* the race condition doesn't affect status,
- * because status isn't updated by the SIGCHLD handler,
- * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */
- tt_assert(MATCH_PROCESS_STATUS(expected_status, status));
- if (status == PROCESS_STATUS_ERROR) {
- tt_ptr_op(process_handle, ==, NULL);
- return;
- }
-
- tt_assert(process_handle != NULL);
-
- /* When a spawned process forks, fails, then exits very quickly,
- * (this typically occurs when exec fails)
- * there is a race condition between the SIGCHLD handler
- * updating the process_handle's fields, and this test
- * checking the process status in those fields.
- * The SIGCHLD update can occur before or after the code below executes.
- * This causes intermittent failures in spawn_background_fail(),
- * typically when the machine is under load.
- * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */
-
- /* the race condition affects the change in
- * process_handle->status from RUNNING to NOTRUNNING */
- tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status));
-
-#ifndef _WIN32
- notify_pending_waitpid_callbacks();
- /* the race condition affects the change in
- * process_handle->waitpid_cb to NULL,
- * so we skip the check if expected_status is ambiguous,
- * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */
- tt_assert(process_handle->waitpid_cb != NULL
- || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING);
-#endif
-
-#ifdef _WIN32
- tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE);
- tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE);
-#else
- tt_assert(process_handle->stdout_pipe >= 0);
- tt_assert(process_handle->stderr_pipe >= 0);
-#endif
-
- /* Check stdout */
- pos = tor_read_all_from_process_stdout(process_handle, stdout_buf,
- sizeof(stdout_buf) - 1);
- tt_assert(pos >= 0);
- stdout_buf[pos] = '\0';
- tt_int_op(strlen(expected_out),==, pos);
- tt_str_op(expected_out,==, stdout_buf);
-
- notify_pending_waitpid_callbacks();
-
- /* Check it terminated correctly */
- retval = tor_get_exit_code(process_handle, 1, &exit_code);
- tt_int_op(PROCESS_EXIT_EXITED,==, retval);
- tt_int_op(expected_exit,==, exit_code);
- // TODO: Make test-child exit with something other than 0
-
-#ifndef _WIN32
- notify_pending_waitpid_callbacks();
- tt_ptr_op(process_handle->waitpid_cb, ==, NULL);
-#endif
-
- /* Check stderr */
- pos = tor_read_all_from_process_stderr(process_handle, stderr_buf,
- sizeof(stderr_buf) - 1);
- tt_assert(pos >= 0);
- stderr_buf[pos] = '\0';
- tt_str_op(expected_err,==, stderr_buf);
- tt_int_op(strlen(expected_err),==, pos);
-
- notify_pending_waitpid_callbacks();
-
- done:
- if (process_handle)
- tor_process_handle_destroy(process_handle, 1);
-}
-
-/** Check that we can launch a process and read the output */
-static void
-test_util_spawn_background_ok(void *ptr)
-{
- const char *argv[] = {TEST_CHILD, "--test", NULL};
- const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL;
- const char *expected_err = "ERR"EOL;
-
- (void)ptr;
-
- run_util_spawn_background(argv, expected_out, expected_err, 0,
- PROCESS_STATUS_RUNNING);
-}
-
-/** Check that failing to find the executable works as expected */
-static void
-test_util_spawn_background_fail(void *ptr)
-{
- const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL};
- const char *expected_err = "";
- char expected_out[1024];
- char code[32];
-#ifdef _WIN32
- const int expected_status = PROCESS_STATUS_ERROR;
-#else
- /* TODO: Once we can signal failure to exec, set this to be
- * PROCESS_STATUS_RUNNING_OR_ERROR */
- const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING;
-#endif
-
- memset(expected_out, 0xf0, sizeof(expected_out));
- memset(code, 0xf0, sizeof(code));
-
- (void)ptr;
-
- tor_snprintf(code, sizeof(code), "%x/%x",
- 9 /* CHILD_STATE_FAILEXEC */ , ENOENT);
- tor_snprintf(expected_out, sizeof(expected_out),
- "ERR: Failed to spawn background process - code %s\n", code);
-
- run_util_spawn_background(argv, expected_out, expected_err, 255,
- expected_status);
-}
-
-/** Test that reading from a handle returns a partial read rather than
- * blocking */
-static void
-test_util_spawn_background_partial_read_impl(int exit_early)
-{
- const int expected_exit = 0;
- const int expected_status = PROCESS_STATUS_RUNNING;
-
- int retval, exit_code;
- ssize_t pos = -1;
- process_handle_t *process_handle=NULL;
- int status;
- char stdout_buf[100], stderr_buf[100];
-
- const char *argv[] = {TEST_CHILD, "--test", NULL};
- const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL,
- "DONE" EOL,
- NULL };
- const char *expected_err = "ERR" EOL;
-
-#ifndef _WIN32
- int eof = 0;
-#endif
- int expected_out_ctr;
-
- if (exit_early) {
- argv[1] = "--hang";
- expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL;
- }
-
- /* Start the program */
-#ifdef _WIN32
- status = tor_spawn_background(NULL, argv, NULL, &process_handle);
-#else
- status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
-#endif
- tt_int_op(expected_status,==, status);
- tt_assert(process_handle);
- tt_int_op(expected_status,==, process_handle->status);
-
- /* Check stdout */
- for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) {
-#ifdef _WIN32
- pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf,
- sizeof(stdout_buf) - 1, NULL);
-#else
- /* Check that we didn't read the end of file last time */
- tt_assert(!eof);
- pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
- sizeof(stdout_buf) - 1, NULL, &eof);
-#endif
- log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos);
-
- /* We would have blocked, keep on trying */
- if (0 == pos)
- continue;
-
- tt_assert(pos > 0);
- stdout_buf[pos] = '\0';
- tt_str_op(expected_out[expected_out_ctr],==, stdout_buf);
- tt_int_op(strlen(expected_out[expected_out_ctr]),==, pos);
- expected_out_ctr++;
- }
-
- if (exit_early) {
- tor_process_handle_destroy(process_handle, 1);
- process_handle = NULL;
- goto done;
- }
-
- /* The process should have exited without writing more */
-#ifdef _WIN32
- pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf,
- sizeof(stdout_buf) - 1,
- process_handle);
- tt_int_op(0,==, pos);
-#else
- if (!eof) {
- /* We should have got all the data, but maybe not the EOF flag */
- pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
- sizeof(stdout_buf) - 1,
- process_handle, &eof);
- tt_int_op(0,==, pos);
- tt_assert(eof);
- }
- /* Otherwise, we got the EOF on the last read */
-#endif
-
- /* Check it terminated correctly */
- retval = tor_get_exit_code(process_handle, 1, &exit_code);
- tt_int_op(PROCESS_EXIT_EXITED,==, retval);
- tt_int_op(expected_exit,==, exit_code);
-
- // TODO: Make test-child exit with something other than 0
-
- /* Check stderr */
- pos = tor_read_all_from_process_stderr(process_handle, stderr_buf,
- sizeof(stderr_buf) - 1);
- tt_assert(pos >= 0);
- stderr_buf[pos] = '\0';
- tt_str_op(expected_err,==, stderr_buf);
- tt_int_op(strlen(expected_err),==, pos);
-
- done:
- tor_process_handle_destroy(process_handle, 1);
-}
-
-static void
-test_util_spawn_background_partial_read(void *arg)
-{
- (void)arg;
- test_util_spawn_background_partial_read_impl(0);
-}
-
-static void
-test_util_spawn_background_exit_early(void *arg)
-{
- (void)arg;
- test_util_spawn_background_partial_read_impl(1);
-}
-
-static void
-test_util_spawn_background_waitpid_notify(void *arg)
-{
- int retval, exit_code;
- process_handle_t *process_handle=NULL;
- int status;
- int ms_timer;
-
- const char *argv[] = {TEST_CHILD, "--fast", NULL};
-
- (void) arg;
-
-#ifdef _WIN32
- status = tor_spawn_background(NULL, argv, NULL, &process_handle);
-#else
- status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
-#endif
-
- tt_int_op(status, ==, PROCESS_STATUS_RUNNING);
- tt_ptr_op(process_handle, !=, NULL);
-
- /* We're not going to look at the stdout/stderr output this time. Instead,
- * we're testing whether notify_pending_waitpid_calbacks() can report the
- * process exit (on unix) and/or whether tor_get_exit_code() can notice it
- * (on windows) */
-
-#ifndef _WIN32
- ms_timer = 30*1000;
- tt_ptr_op(process_handle->waitpid_cb, !=, NULL);
- while (process_handle->waitpid_cb && ms_timer > 0) {
- tor_sleep_msec(100);
- ms_timer -= 100;
- notify_pending_waitpid_callbacks();
- }
- tt_int_op(ms_timer, >, 0);
- tt_ptr_op(process_handle->waitpid_cb, ==, NULL);
-#endif
-
- ms_timer = 30*1000;
- while (((retval = tor_get_exit_code(process_handle, 0, &exit_code))
- == PROCESS_EXIT_RUNNING) && ms_timer > 0) {
- tor_sleep_msec(100);
- ms_timer -= 100;
- }
- tt_int_op(ms_timer, >, 0);
-
- tt_int_op(retval, ==, PROCESS_EXIT_EXITED);
-
- done:
- tor_process_handle_destroy(process_handle, 1);
-}
-
-#undef TEST_CHILD
-#undef EOL
-
-#undef MATCH_PROCESS_STATUS
-
-#ifndef _WIN32
-#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING
-#undef IS_RUNNING_OR_NOTRUNNING
-#endif
-
/**
* Test for format_hex_number_sigsafe()
*/
@@ -3899,15 +3410,15 @@ test_util_format_hex_number(void *ptr)
for (i = 0; test_data[i].str != NULL; ++i) {
len = format_hex_number_sigsafe(test_data[i].x, buf, sizeof(buf));
- tt_int_op(len,!=, 0);
- tt_int_op(len,==, strlen(buf));
- tt_str_op(buf,==, test_data[i].str);
+ tt_int_op(len,OP_NE, 0);
+ tt_int_op(len,OP_EQ, strlen(buf));
+ tt_str_op(buf,OP_EQ, test_data[i].str);
}
- tt_int_op(4,==, format_hex_number_sigsafe(0xffff, buf, 5));
- tt_str_op(buf,==, "FFFF");
- tt_int_op(0,==, format_hex_number_sigsafe(0xffff, buf, 4));
- tt_int_op(0,==, format_hex_number_sigsafe(0, buf, 1));
+ tt_int_op(4,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 5));
+ tt_str_op(buf,OP_EQ, "FFFF");
+ tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0xffff, buf, 4));
+ tt_int_op(0,OP_EQ, format_hex_number_sigsafe(0, buf, 1));
done:
return;
@@ -3943,21 +3454,21 @@ test_util_format_dec_number(void *ptr)
for (i = 0; test_data[i].str != NULL; ++i) {
len = format_dec_number_sigsafe(test_data[i].x, buf, sizeof(buf));
- tt_int_op(len,!=, 0);
- tt_int_op(len,==, strlen(buf));
- tt_str_op(buf,==, test_data[i].str);
+ tt_int_op(len,OP_NE, 0);
+ tt_int_op(len,OP_EQ, strlen(buf));
+ tt_str_op(buf,OP_EQ, test_data[i].str);
len = format_dec_number_sigsafe(test_data[i].x, buf,
(int)(strlen(test_data[i].str) + 1));
- tt_int_op(len,==, strlen(buf));
- tt_str_op(buf,==, test_data[i].str);
+ tt_int_op(len,OP_EQ, strlen(buf));
+ tt_str_op(buf,OP_EQ, test_data[i].str);
}
- tt_int_op(4,==, format_dec_number_sigsafe(7331, buf, 5));
- tt_str_op(buf,==, "7331");
- tt_int_op(0,==, format_dec_number_sigsafe(7331, buf, 4));
- tt_int_op(1,==, format_dec_number_sigsafe(0, buf, 2));
- tt_int_op(0,==, format_dec_number_sigsafe(0, buf, 1));
+ tt_int_op(4,OP_EQ, format_dec_number_sigsafe(7331, buf, 5));
+ tt_str_op(buf,OP_EQ, "7331");
+ tt_int_op(0,OP_EQ, format_dec_number_sigsafe(7331, buf, 4));
+ tt_int_op(1,OP_EQ, format_dec_number_sigsafe(0, buf, 2));
+ tt_int_op(0,OP_EQ, format_dec_number_sigsafe(0, buf, 1));
done:
return;
@@ -4006,7 +3517,7 @@ test_util_join_win_cmdline(void *ptr)
for (i=0; cmdlines[i]!=NULL; i++) {
log_info(LD_GENERAL, "Joining argvs[%d], expecting <%s>", i, cmdlines[i]);
joined_argv = tor_join_win_cmdline(argvs[i]);
- tt_str_op(cmdlines[i],==, joined_argv);
+ tt_str_op(cmdlines[i],OP_EQ, joined_argv);
tor_free(joined_argv);
}
@@ -4061,17 +3572,17 @@ test_util_split_lines(void *ptr)
i, tests[i].orig_length);
SMARTLIST_FOREACH_BEGIN(sl, const char *, line) {
/* Check we have not got too many lines */
- tt_int_op(MAX_SPLIT_LINE_COUNT, >, j);
+ tt_int_op(MAX_SPLIT_LINE_COUNT, OP_GT, j);
/* Check that there actually should be a line here */
tt_assert(tests[i].split_line[j] != NULL);
log_info(LD_GENERAL, "Line %d of test %d, should be <%s>",
j, i, tests[i].split_line[j]);
/* Check that the line is as expected */
- tt_str_op(line,==, tests[i].split_line[j]);
+ tt_str_op(line,OP_EQ, tests[i].split_line[j]);
j++;
} SMARTLIST_FOREACH_END(line);
/* Check that we didn't miss some lines */
- tt_ptr_op(NULL,==, tests[i].split_line[j]);
+ tt_ptr_op(NULL,OP_EQ, tests[i].split_line[j]);
tor_free(orig_line);
smartlist_free(sl);
sl = NULL;
@@ -4107,7 +3618,7 @@ test_util_di_ops(void *arg)
for (i = 0; examples[i].a; ++i) {
size_t len = strlen(examples[i].a);
int eq1, eq2, neq1, neq2, cmp1, cmp2;
- tt_int_op(len,==, strlen(examples[i].b));
+ tt_int_op(len,OP_EQ, strlen(examples[i].b));
/* We do all of the operations, with operands in both orders. */
eq1 = tor_memeq(examples[i].a, examples[i].b, len);
eq2 = tor_memeq(examples[i].b, examples[i].a, len);
@@ -4125,11 +3636,11 @@ test_util_di_ops(void *arg)
TT_DIE(("Assertion failed."));
/* Check for consistency of everything else with cmp1 */
- tt_int_op(eq1,==, eq2);
- tt_int_op(neq1,==, neq2);
- tt_int_op(cmp1,==, -cmp2);
- tt_int_op(eq1,==, cmp1 == 0);
- tt_int_op(neq1,==, !eq1);
+ tt_int_op(eq1,OP_EQ, eq2);
+ tt_int_op(neq1,OP_EQ, neq2);
+ tt_int_op(cmp1,OP_EQ, -cmp2);
+ tt_int_op(eq1,OP_EQ, cmp1 == 0);
+ tt_int_op(neq1,OP_EQ, !eq1);
}
{
@@ -4144,22 +3655,24 @@ test_util_di_ops(void *arg)
for (i = 0; i < 256; i++) {
ii = (uint8_t)i;
zz = (uint8_t)z;
- tt_int_op(tor_memeq(&zz, &ii, 1),==, zz == ii);
- tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,==, zz > ii ? GT : EQ);
- tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,==, ii < zz ? LT : EQ);
+ tt_int_op(tor_memeq(&zz, &ii, 1),OP_EQ, zz == ii);
+ tt_int_op(tor_memcmp(&zz, &ii, 1) > 0 ? GT : EQ,OP_EQ,
+ zz > ii ? GT : EQ);
+ tt_int_op(tor_memcmp(&ii, &zz, 1) < 0 ? LT : EQ,OP_EQ,
+ ii < zz ? LT : EQ);
}
}
}
- tt_int_op(1, ==, safe_mem_is_zero("", 0));
- tt_int_op(1, ==, safe_mem_is_zero("", 1));
- tt_int_op(0, ==, safe_mem_is_zero("a", 1));
- tt_int_op(0, ==, safe_mem_is_zero("a", 2));
- tt_int_op(0, ==, safe_mem_is_zero("\0a", 2));
- tt_int_op(1, ==, safe_mem_is_zero("\0\0a", 2));
- tt_int_op(1, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8));
- tt_int_op(1, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8));
- tt_int_op(0, ==, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9));
+ tt_int_op(1, OP_EQ, safe_mem_is_zero("", 0));
+ tt_int_op(1, OP_EQ, safe_mem_is_zero("", 1));
+ tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 1));
+ tt_int_op(0, OP_EQ, safe_mem_is_zero("a", 2));
+ tt_int_op(0, OP_EQ, safe_mem_is_zero("\0a", 2));
+ tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0a", 2));
+ tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0", 8));
+ tt_int_op(1, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 8));
+ tt_int_op(0, OP_EQ, safe_mem_is_zero("\0\0\0\0\0\0\0\0a", 9));
done:
;
@@ -4172,12 +3685,12 @@ static void
test_util_n_bits_set(void *ptr)
{
(void)ptr;
- tt_int_op(0,==, n_bits_set_u8(0));
- tt_int_op(1,==, n_bits_set_u8(1));
- tt_int_op(3,==, n_bits_set_u8(7));
- tt_int_op(1,==, n_bits_set_u8(8));
- tt_int_op(2,==, n_bits_set_u8(129));
- tt_int_op(8,==, n_bits_set_u8(255));
+ tt_int_op(0,OP_EQ, n_bits_set_u8(0));
+ tt_int_op(1,OP_EQ, n_bits_set_u8(1));
+ tt_int_op(3,OP_EQ, n_bits_set_u8(7));
+ tt_int_op(1,OP_EQ, n_bits_set_u8(8));
+ tt_int_op(2,OP_EQ, n_bits_set_u8(129));
+ tt_int_op(8,OP_EQ, n_bits_set_u8(255));
done:
;
}
@@ -4198,78 +3711,82 @@ test_util_eat_whitespace(void *ptr)
strlcpy(str, "fuubaar", sizeof(str));
for (i = 0; i < sizeof(ws); ++i) {
str[0] = ws[i];
- tt_ptr_op(str + 1,==, eat_whitespace(str));
- tt_ptr_op(str + 1,==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + 1,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str + 1,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
}
str[0] = '\n';
- tt_ptr_op(str + 1,==, eat_whitespace(str));
- tt_ptr_op(str + 1,==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Empty string */
strlcpy(str, "", sizeof(str));
- tt_ptr_op(str,==, eat_whitespace(str));
- tt_ptr_op(str,==, eat_whitespace_eos(str, str));
- tt_ptr_op(str,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_eos(str, str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str));
/* Only ws */
strlcpy(str, " \t\r\n", sizeof(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + strlen(str) - 1,==,
+ tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + strlen(str),OP_EQ,
+ eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str + strlen(str) - 1,OP_EQ,
eat_whitespace_no_nl(str));
- tt_ptr_op(str + strlen(str) - 1,==,
+ tt_ptr_op(str + strlen(str) - 1,OP_EQ,
eat_whitespace_eos_no_nl(str, str + strlen(str)));
strlcpy(str, " \t\r ", sizeof(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace(str));
- tt_ptr_op(str + strlen(str),==,
+ tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + strlen(str),OP_EQ,
eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + strlen(str),==, eat_whitespace_no_nl(str));
- tt_ptr_op(str + strlen(str),==,
+ tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str + strlen(str),OP_EQ,
eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Multiple ws */
strlcpy(str, "fuubaar", sizeof(str));
for (i = 0; i < sizeof(ws); ++i)
str[i] = ws[i];
- tt_ptr_op(str + sizeof(ws),==, eat_whitespace(str));
- tt_ptr_op(str + sizeof(ws),==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + sizeof(ws),==, eat_whitespace_no_nl(str));
- tt_ptr_op(str + sizeof(ws),==,
+ tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + sizeof(ws),OP_EQ,
+ eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str + sizeof(ws),OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str + sizeof(ws),OP_EQ,
eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat comment */
strlcpy(str, "# Comment \n No Comment", sizeof(str));
- tt_str_op("No Comment",==, eat_whitespace(str));
- tt_str_op("No Comment",==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_str_op("No Comment",OP_EQ, eat_whitespace(str));
+ tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat comment & ws mix */
strlcpy(str, " # \t Comment \n\t\nNo Comment", sizeof(str));
- tt_str_op("No Comment",==, eat_whitespace(str));
- tt_str_op("No Comment",==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + 1,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str + 1,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_str_op("No Comment",OP_EQ, eat_whitespace(str));
+ tt_str_op("No Comment",OP_EQ, eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str + 1,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Eat entire comment */
strlcpy(str, "#Comment", sizeof(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + strlen(str),OP_EQ,
+ eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
/* Blank line, then comment */
strlcpy(str, " \t\n # Comment", sizeof(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace(str));
- tt_ptr_op(str + strlen(str),==, eat_whitespace_eos(str, str + strlen(str)));
- tt_ptr_op(str + 2,==, eat_whitespace_no_nl(str));
- tt_ptr_op(str + 2,==, eat_whitespace_eos_no_nl(str, str + strlen(str)));
+ tt_ptr_op(str + strlen(str),OP_EQ, eat_whitespace(str));
+ tt_ptr_op(str + strlen(str),OP_EQ,
+ eat_whitespace_eos(str, str + strlen(str)));
+ tt_ptr_op(str + 2,OP_EQ, eat_whitespace_no_nl(str));
+ tt_ptr_op(str + 2,OP_EQ, eat_whitespace_eos_no_nl(str, str + strlen(str)));
done:
;
@@ -4308,11 +3825,11 @@ test_util_sl_new_from_text_lines(void *ptr)
smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz\n");
int sl_len = smartlist_len(sl);
- tt_want_int_op(sl_len, ==, 3);
+ tt_want_int_op(sl_len, OP_EQ, 3);
- if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo");
- if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), ==, "bar");
- if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), ==, "baz");
+ if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo");
+ if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar");
+ if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz");
SMARTLIST_FOREACH(sl, void *, x, tor_free(x));
smartlist_free(sl);
@@ -4322,11 +3839,11 @@ test_util_sl_new_from_text_lines(void *ptr)
smartlist_t *sl = smartlist_new_from_text_lines("foo\nbar\nbaz");
int sl_len = smartlist_len(sl);
- tt_want_int_op(sl_len, ==, 3);
+ tt_want_int_op(sl_len, OP_EQ, 3);
- if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo");
- if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), ==, "bar");
- if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), ==, "baz");
+ if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo");
+ if (sl_len > 1) tt_want_str_op(smartlist_get(sl, 1), OP_EQ, "bar");
+ if (sl_len > 2) tt_want_str_op(smartlist_get(sl, 2), OP_EQ, "baz");
SMARTLIST_FOREACH(sl, void *, x, tor_free(x));
smartlist_free(sl);
@@ -4336,9 +3853,9 @@ test_util_sl_new_from_text_lines(void *ptr)
smartlist_t *sl = smartlist_new_from_text_lines("foo");
int sl_len = smartlist_len(sl);
- tt_want_int_op(sl_len, ==, 1);
+ tt_want_int_op(sl_len, OP_EQ, 1);
- if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), ==, "foo");
+ if (sl_len > 0) tt_want_str_op(smartlist_get(sl, 0), OP_EQ, "foo");
SMARTLIST_FOREACH(sl, void *, x, tor_free(x));
smartlist_free(sl);
@@ -4348,7 +3865,7 @@ test_util_sl_new_from_text_lines(void *ptr)
smartlist_t *sl = smartlist_new_from_text_lines("");
int sl_len = smartlist_len(sl);
- tt_want_int_op(sl_len, ==, 0);
+ tt_want_int_op(sl_len, OP_EQ, 0);
SMARTLIST_FOREACH(sl, void *, x, tor_free(x));
smartlist_free(sl);
@@ -4431,7 +3948,7 @@ test_util_make_environment(void *ptr)
smartlist_sort_strings(env_vars_sorted);
smartlist_sort_strings(env_vars_in_unixoid_env_block_sorted);
- tt_want_int_op(smartlist_len(env_vars_sorted), ==,
+ tt_want_int_op(smartlist_len(env_vars_sorted), OP_EQ,
smartlist_len(env_vars_in_unixoid_env_block_sorted));
{
int len = smartlist_len(env_vars_sorted);
@@ -4442,7 +3959,7 @@ test_util_make_environment(void *ptr)
}
for (i = 0; i < len; ++i) {
- tt_want_str_op(smartlist_get(env_vars_sorted, i), ==,
+ tt_want_str_op(smartlist_get(env_vars_sorted, i), OP_EQ,
smartlist_get(env_vars_in_unixoid_env_block_sorted, i));
}
}
@@ -4524,7 +4041,7 @@ test_util_set_env_var_in_sl(void *ptr)
smartlist_sort_strings(merged_env_vars);
smartlist_sort_strings(expected_resulting_env_vars);
- tt_want_int_op(smartlist_len(merged_env_vars), ==,
+ tt_want_int_op(smartlist_len(merged_env_vars), OP_EQ,
smartlist_len(expected_resulting_env_vars));
{
int len = smartlist_len(merged_env_vars);
@@ -4535,7 +4052,7 @@ test_util_set_env_var_in_sl(void *ptr)
}
for (i = 0; i < len; ++i) {
- tt_want_str_op(smartlist_get(merged_env_vars, i), ==,
+ tt_want_str_op(smartlist_get(merged_env_vars, i), OP_EQ,
smartlist_get(expected_resulting_env_vars, i));
}
}
@@ -4562,8 +4079,8 @@ test_util_weak_random(void *arg)
for (i = 1; i <= 256; ++i) {
for (j=0;j<100;++j) {
int r = tor_weak_random_range(&rng, i);
- tt_int_op(0, <=, r);
- tt_int_op(r, <, i);
+ tt_int_op(0, OP_LE, r);
+ tt_int_op(r, OP_LT, i);
}
}
@@ -4573,7 +4090,7 @@ test_util_weak_random(void *arg)
}
for (i=0;i<16;++i)
- tt_int_op(n[i], >, 0);
+ tt_int_op(n[i], OP_GT, 0);
done:
;
}
@@ -4585,9 +4102,9 @@ test_util_mathlog(void *arg)
(void) arg;
d = tor_mathlog(2.718281828);
- tt_double_op(fabs(d - 1.0), <, .000001);
+ tt_double_op(fabs(d - 1.0), OP_LT, .000001);
d = tor_mathlog(10);
- tt_double_op(fabs(d - 2.30258509), <, .000001);
+ tt_double_op(fabs(d - 2.30258509), OP_LT, .000001);
done:
;
}
@@ -4597,12 +4114,65 @@ test_util_round_to_next_multiple_of(void *arg)
{
(void)arg;
- tt_assert(round_uint64_to_next_multiple_of(0,1) == 0);
- tt_assert(round_uint64_to_next_multiple_of(0,7) == 0);
+ tt_u64_op(round_uint64_to_next_multiple_of(0,1), ==, 0);
+ tt_u64_op(round_uint64_to_next_multiple_of(0,7), ==, 0);
- tt_assert(round_uint64_to_next_multiple_of(99,1) == 99);
- tt_assert(round_uint64_to_next_multiple_of(99,7) == 105);
- tt_assert(round_uint64_to_next_multiple_of(99,9) == 99);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,1), ==, 99);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,7), ==, 105);
+ tt_u64_op(round_uint64_to_next_multiple_of(99,9), ==, 99);
+
+ tt_i64_op(round_int64_to_next_multiple_of(0,1), ==, 0);
+ tt_i64_op(round_int64_to_next_multiple_of(0,7), ==, 0);
+
+ tt_i64_op(round_int64_to_next_multiple_of(99,1), ==, 99);
+ tt_i64_op(round_int64_to_next_multiple_of(99,7), ==, 105);
+ tt_i64_op(round_int64_to_next_multiple_of(99,9), ==, 99);
+
+ tt_i64_op(round_int64_to_next_multiple_of(-99,1), ==, -99);
+ tt_i64_op(round_int64_to_next_multiple_of(-99,7), ==, -98);
+ tt_i64_op(round_int64_to_next_multiple_of(-99,9), ==, -99);
+
+ tt_i64_op(round_int64_to_next_multiple_of(INT64_MIN,2), ==, INT64_MIN);
+ tt_i64_op(round_int64_to_next_multiple_of(INT64_MAX,2), ==,
+ INT64_MAX-INT64_MAX%2);
+ done:
+ ;
+}
+
+static void
+test_util_laplace(void *arg)
+{
+ /* Sample values produced using Python's SciPy:
+ *
+ * >>> from scipy.stats import laplace
+ * >>> laplace.ppf([-0.01, 0.0, 0.01, 0.5, 0.51, 0.99, 1.0, 1.01],
+ ... loc = 24, scale = 24)
+ * array([ nan, -inf, -69.88855213, 24. ,
+ * 24.48486498, 117.88855213, inf, nan])
+ */
+ const double mu = 24.0, b = 24.0;
+ const double delta_f = 15.0, epsilon = 0.3; /* b = 15.0 / 0.3 = 50.0 */
+ (void)arg;
+
+ tt_i64_op(INT64_MIN, ==, sample_laplace_distribution(mu, b, 0.0));
+ tt_i64_op(-69, ==, sample_laplace_distribution(mu, b, 0.01));
+ tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.5));
+ tt_i64_op(24, ==, sample_laplace_distribution(mu, b, 0.51));
+ tt_i64_op(117, ==, sample_laplace_distribution(mu, b, 0.99));
+
+ /* >>> laplace.ppf([0.0, 0.1, 0.25, 0.5, 0.75, 0.9, 0.99],
+ * ... loc = 0, scale = 50)
+ * array([ -inf, -80.47189562, -34.65735903, 0. ,
+ * 34.65735903, 80.47189562, 195.60115027])
+ */
+ tt_i64_op(INT64_MIN + 20, ==,
+ add_laplace_noise(20, 0.0, delta_f, epsilon));
+ tt_i64_op(-60, ==, add_laplace_noise(20, 0.1, delta_f, epsilon));
+ tt_i64_op(-14, ==, add_laplace_noise(20, 0.25, delta_f, epsilon));
+ tt_i64_op(20, ==, add_laplace_noise(20, 0.5, delta_f, epsilon));
+ tt_i64_op(54, ==, add_laplace_noise(20, 0.75, delta_f, epsilon));
+ tt_i64_op(100, ==, add_laplace_noise(20, 0.9, delta_f, epsilon));
+ tt_i64_op(215, ==, add_laplace_noise(20, 0.99, delta_f, epsilon));
done:
;
@@ -4671,36 +4241,36 @@ test_util_socket(void *arg)
fd2 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 0, 1);
tt_assert(SOCKET_OK(fd1));
tt_assert(SOCKET_OK(fd2));
- tt_int_op(get_n_open_sockets(), ==, n + 2);
+ tt_int_op(get_n_open_sockets(), OP_EQ, n + 2);
//fd3 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 0);
//fd4 = tor_open_socket_with_extensions(AF_INET, SOCK_STREAM, 0, 1, 1);
fd3 = tor_open_socket(AF_INET, SOCK_STREAM, 0);
fd4 = tor_open_socket_nonblocking(AF_INET, SOCK_STREAM, 0);
tt_assert(SOCKET_OK(fd3));
tt_assert(SOCKET_OK(fd4));
- tt_int_op(get_n_open_sockets(), ==, n + 4);
+ tt_int_op(get_n_open_sockets(), OP_EQ, n + 4);
#ifdef CAN_CHECK_CLOEXEC
- tt_int_op(fd_is_cloexec(fd1), ==, 0);
- tt_int_op(fd_is_cloexec(fd2), ==, 0);
- tt_int_op(fd_is_cloexec(fd3), ==, 1);
- tt_int_op(fd_is_cloexec(fd4), ==, 1);
+ tt_int_op(fd_is_cloexec(fd1), OP_EQ, 0);
+ tt_int_op(fd_is_cloexec(fd2), OP_EQ, 0);
+ tt_int_op(fd_is_cloexec(fd3), OP_EQ, 1);
+ tt_int_op(fd_is_cloexec(fd4), OP_EQ, 1);
#endif
#ifdef CAN_CHECK_NONBLOCK
- tt_int_op(fd_is_nonblocking(fd1), ==, 0);
- tt_int_op(fd_is_nonblocking(fd2), ==, 1);
- tt_int_op(fd_is_nonblocking(fd3), ==, 0);
- tt_int_op(fd_is_nonblocking(fd4), ==, 1);
+ tt_int_op(fd_is_nonblocking(fd1), OP_EQ, 0);
+ tt_int_op(fd_is_nonblocking(fd2), OP_EQ, 1);
+ tt_int_op(fd_is_nonblocking(fd3), OP_EQ, 0);
+ tt_int_op(fd_is_nonblocking(fd4), OP_EQ, 1);
#endif
tor_close_socket(fd1);
tor_close_socket(fd2);
fd1 = fd2 = TOR_INVALID_SOCKET;
- tt_int_op(get_n_open_sockets(), ==, n + 2);
+ tt_int_op(get_n_open_sockets(), OP_EQ, n + 2);
tor_close_socket(fd3);
tor_close_socket(fd4);
fd3 = fd4 = TOR_INVALID_SOCKET;
- tt_int_op(get_n_open_sockets(), ==, n);
+ tt_int_op(get_n_open_sockets(), OP_EQ, n);
done:
if (SOCKET_OK(fd1))
@@ -4713,23 +4283,6 @@ test_util_socket(void *arg)
tor_close_socket(fd4);
}
-static void *
-socketpair_test_setup(const struct testcase_t *testcase)
-{
- return testcase->setup_data;
-}
-static int
-socketpair_test_cleanup(const struct testcase_t *testcase, void *ptr)
-{
- (void)testcase;
- (void)ptr;
- return 1;
-}
-
-static const struct testcase_setup_t socketpair_setup = {
- socketpair_test_setup, socketpair_test_cleanup
-};
-
/* Test for socketpair and ersatz_socketpair(). We test them both, since
* the latter is a tolerably good way to exersize tor_accept_socket(). */
static void
@@ -4742,17 +4295,17 @@ test_util_socketpair(void *arg)
tor_socket_t fds[2] = {TOR_INVALID_SOCKET, TOR_INVALID_SOCKET};
const int family = AF_UNIX;
- tt_int_op(0, ==, tor_socketpair_fn(family, SOCK_STREAM, 0, fds));
+ tt_int_op(0, OP_EQ, tor_socketpair_fn(family, SOCK_STREAM, 0, fds));
tt_assert(SOCKET_OK(fds[0]));
tt_assert(SOCKET_OK(fds[1]));
- tt_int_op(get_n_open_sockets(), ==, n + 2);
+ tt_int_op(get_n_open_sockets(), OP_EQ, n + 2);
#ifdef CAN_CHECK_CLOEXEC
- tt_int_op(fd_is_cloexec(fds[0]), ==, 1);
- tt_int_op(fd_is_cloexec(fds[1]), ==, 1);
+ tt_int_op(fd_is_cloexec(fds[0]), OP_EQ, 1);
+ tt_int_op(fd_is_cloexec(fds[1]), OP_EQ, 1);
#endif
#ifdef CAN_CHECK_NONBLOCK
- tt_int_op(fd_is_nonblocking(fds[0]), ==, 0);
- tt_int_op(fd_is_nonblocking(fds[1]), ==, 0);
+ tt_int_op(fd_is_nonblocking(fds[0]), OP_EQ, 0);
+ tt_int_op(fd_is_nonblocking(fds[1]), OP_EQ, 0);
#endif
done:
@@ -4771,18 +4324,18 @@ test_util_max_mem(void *arg)
r = get_total_system_memory(&memory1);
r2 = get_total_system_memory(&memory2);
- tt_int_op(r, ==, r2);
- tt_uint_op(memory2, ==, memory1);
+ tt_int_op(r, OP_EQ, r2);
+ tt_uint_op(memory2, OP_EQ, memory1);
TT_BLATHER(("System memory: "U64_FORMAT, U64_PRINTF_ARG(memory1)));
if (r==0) {
/* You have at least a megabyte. */
- tt_uint_op(memory1, >, (1<<20));
+ tt_uint_op(memory1, OP_GT, (1<<20));
} else {
/* You do not have a petabyte. */
#if SIZEOF_SIZE_T == SIZEOF_UINT64_T
- tt_uint_op(memory1, <, (U64_LITERAL(1)<<50));
+ tt_u64_op(memory1, OP_LT, (U64_LITERAL(1)<<50));
#endif
}
@@ -4858,13 +4411,13 @@ struct testcase_t util_tests[] = {
UTIL_LEGACY(memarea),
UTIL_LEGACY(control_formats),
UTIL_LEGACY(mmap),
- UTIL_LEGACY(threads),
UTIL_LEGACY(sscanf),
UTIL_LEGACY(format_time_interval),
UTIL_LEGACY(path_is_relative),
UTIL_LEGACY(strtok),
UTIL_LEGACY(di_ops),
UTIL_TEST(round_to_next_multiple_of, 0),
+ UTIL_TEST(laplace, 0),
UTIL_TEST(strclear, 0),
UTIL_TEST(find_str_at_start_of_line, 0),
UTIL_TEST(string_is_C_identifier, 0),
@@ -4879,11 +4432,6 @@ struct testcase_t util_tests[] = {
UTIL_TEST(exit_status, 0),
UTIL_TEST(fgets_eagain, 0),
#endif
- UTIL_TEST(spawn_background_ok, 0),
- UTIL_TEST(spawn_background_fail, 0),
- UTIL_TEST(spawn_background_partial_read, 0),
- UTIL_TEST(spawn_background_exit_early, 0),
- UTIL_TEST(spawn_background_waitpid_notify, 0),
UTIL_TEST(format_hex_number, 0),
UTIL_TEST(format_dec_number, 0),
UTIL_TEST(join_win_cmdline, 0),
@@ -4904,10 +4452,10 @@ struct testcase_t util_tests[] = {
UTIL_TEST(mathlog, 0),
UTIL_TEST(weak_random, 0),
UTIL_TEST(socket, TT_FORK),
- { "socketpair", test_util_socketpair, TT_FORK, &socketpair_setup,
+ { "socketpair", test_util_socketpair, TT_FORK, &passthrough_setup,
(void*)"0" },
{ "socketpair_ersatz", test_util_socketpair, TT_FORK,
- &socketpair_setup, (void*)"1" },
+ &passthrough_setup, (void*)"1" },
UTIL_TEST(max_mem, 0),
UTIL_TEST(hostname_validation, 0),
UTIL_TEST(ipv4_validation, 0),
diff --git a/src/test/test_util_slow.c b/src/test/test_util_slow.c
new file mode 100644
index 0000000000..a597ef3cbc
--- /dev/null
+++ b/src/test/test_util_slow.c
@@ -0,0 +1,389 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "orconfig.h"
+#define UTIL_PRIVATE
+#include "util.h"
+#include "util_process.h"
+#include "crypto.h"
+#include "torlog.h"
+#include "test.h"
+
+#ifndef BUILDDIR
+#define BUILDDIR "."
+#endif
+
+#ifdef _WIN32
+#define notify_pending_waitpid_callbacks() STMT_NIL
+#define TEST_CHILD "test-child.exe"
+#define EOL "\r\n"
+#else
+#define TEST_CHILD (BUILDDIR "/src/test/test-child")
+#define EOL "\n"
+#endif
+
+#ifdef _WIN32
+/* I've assumed Windows doesn't have the gap between fork and exec
+ * that causes the race condition on unix-like platforms */
+#define MATCH_PROCESS_STATUS(s1,s2) ((s1) == (s2))
+
+#else
+/* work around a race condition of the timing of SIGCHLD handler updates
+ * to the process_handle's fields, and checks of those fields
+ *
+ * TODO: Once we can signal failure to exec, change PROCESS_STATUS_RUNNING to
+ * PROCESS_STATUS_ERROR (and similarly with *_OR_NOTRUNNING) */
+#define PROCESS_STATUS_RUNNING_OR_NOTRUNNING (PROCESS_STATUS_RUNNING+1)
+#define IS_RUNNING_OR_NOTRUNNING(s) \
+ ((s) == PROCESS_STATUS_RUNNING || (s) == PROCESS_STATUS_NOTRUNNING)
+/* well, this is ugly */
+#define MATCH_PROCESS_STATUS(s1,s2) \
+ ( (s1) == (s2) \
+ ||((s1) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \
+ && IS_RUNNING_OR_NOTRUNNING(s2)) \
+ ||((s2) == PROCESS_STATUS_RUNNING_OR_NOTRUNNING \
+ && IS_RUNNING_OR_NOTRUNNING(s1)))
+
+#endif // _WIN32
+
+/** Helper function for testing tor_spawn_background */
+static void
+run_util_spawn_background(const char *argv[], const char *expected_out,
+ const char *expected_err, int expected_exit,
+ int expected_status)
+{
+ int retval, exit_code;
+ ssize_t pos;
+ process_handle_t *process_handle=NULL;
+ char stdout_buf[100], stderr_buf[100];
+ int status;
+
+ /* Start the program */
+#ifdef _WIN32
+ status = tor_spawn_background(NULL, argv, NULL, &process_handle);
+#else
+ status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
+#endif
+
+ notify_pending_waitpid_callbacks();
+
+ /* the race condition doesn't affect status,
+ * because status isn't updated by the SIGCHLD handler,
+ * but we still need to handle PROCESS_STATUS_RUNNING_OR_NOTRUNNING */
+ tt_assert(MATCH_PROCESS_STATUS(expected_status, status));
+ if (status == PROCESS_STATUS_ERROR) {
+ tt_ptr_op(process_handle, OP_EQ, NULL);
+ return;
+ }
+
+ tt_assert(process_handle != NULL);
+
+ /* When a spawned process forks, fails, then exits very quickly,
+ * (this typically occurs when exec fails)
+ * there is a race condition between the SIGCHLD handler
+ * updating the process_handle's fields, and this test
+ * checking the process status in those fields.
+ * The SIGCHLD update can occur before or after the code below executes.
+ * This causes intermittent failures in spawn_background_fail(),
+ * typically when the machine is under load.
+ * We use PROCESS_STATUS_RUNNING_OR_NOTRUNNING to avoid this issue. */
+
+ /* the race condition affects the change in
+ * process_handle->status from RUNNING to NOTRUNNING */
+ tt_assert(MATCH_PROCESS_STATUS(expected_status, process_handle->status));
+
+#ifndef _WIN32
+ notify_pending_waitpid_callbacks();
+ /* the race condition affects the change in
+ * process_handle->waitpid_cb to NULL,
+ * so we skip the check if expected_status is ambiguous,
+ * that is, PROCESS_STATUS_RUNNING_OR_NOTRUNNING */
+ tt_assert(process_handle->waitpid_cb != NULL
+ || expected_status == PROCESS_STATUS_RUNNING_OR_NOTRUNNING);
+#endif
+
+#ifdef _WIN32
+ tt_assert(process_handle->stdout_pipe != INVALID_HANDLE_VALUE);
+ tt_assert(process_handle->stderr_pipe != INVALID_HANDLE_VALUE);
+#else
+ tt_assert(process_handle->stdout_pipe >= 0);
+ tt_assert(process_handle->stderr_pipe >= 0);
+#endif
+
+ /* Check stdout */
+ pos = tor_read_all_from_process_stdout(process_handle, stdout_buf,
+ sizeof(stdout_buf) - 1);
+ tt_assert(pos >= 0);
+ stdout_buf[pos] = '\0';
+ tt_int_op(strlen(expected_out),OP_EQ, pos);
+ tt_str_op(expected_out,OP_EQ, stdout_buf);
+
+ notify_pending_waitpid_callbacks();
+
+ /* Check it terminated correctly */
+ retval = tor_get_exit_code(process_handle, 1, &exit_code);
+ tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval);
+ tt_int_op(expected_exit,OP_EQ, exit_code);
+ // TODO: Make test-child exit with something other than 0
+
+#ifndef _WIN32
+ notify_pending_waitpid_callbacks();
+ tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL);
+#endif
+
+ /* Check stderr */
+ pos = tor_read_all_from_process_stderr(process_handle, stderr_buf,
+ sizeof(stderr_buf) - 1);
+ tt_assert(pos >= 0);
+ stderr_buf[pos] = '\0';
+ tt_str_op(expected_err,OP_EQ, stderr_buf);
+ tt_int_op(strlen(expected_err),OP_EQ, pos);
+
+ notify_pending_waitpid_callbacks();
+
+ done:
+ if (process_handle)
+ tor_process_handle_destroy(process_handle, 1);
+}
+
+/** Check that we can launch a process and read the output */
+static void
+test_util_spawn_background_ok(void *ptr)
+{
+ const char *argv[] = {TEST_CHILD, "--test", NULL};
+ const char *expected_out = "OUT"EOL "--test"EOL "SLEEPING"EOL "DONE" EOL;
+ const char *expected_err = "ERR"EOL;
+
+ (void)ptr;
+
+ run_util_spawn_background(argv, expected_out, expected_err, 0,
+ PROCESS_STATUS_RUNNING);
+}
+
+/** Check that failing to find the executable works as expected */
+static void
+test_util_spawn_background_fail(void *ptr)
+{
+ const char *argv[] = {BUILDDIR "/src/test/no-such-file", "--test", NULL};
+ const char *expected_err = "";
+ char expected_out[1024];
+ char code[32];
+#ifdef _WIN32
+ const int expected_status = PROCESS_STATUS_ERROR;
+#else
+ /* TODO: Once we can signal failure to exec, set this to be
+ * PROCESS_STATUS_RUNNING_OR_ERROR */
+ const int expected_status = PROCESS_STATUS_RUNNING_OR_NOTRUNNING;
+#endif
+
+ memset(expected_out, 0xf0, sizeof(expected_out));
+ memset(code, 0xf0, sizeof(code));
+
+ (void)ptr;
+
+ tor_snprintf(code, sizeof(code), "%x/%x",
+ 9 /* CHILD_STATE_FAILEXEC */ , ENOENT);
+ tor_snprintf(expected_out, sizeof(expected_out),
+ "ERR: Failed to spawn background process - code %s\n", code);
+
+ run_util_spawn_background(argv, expected_out, expected_err, 255,
+ expected_status);
+}
+
+/** Test that reading from a handle returns a partial read rather than
+ * blocking */
+static void
+test_util_spawn_background_partial_read_impl(int exit_early)
+{
+ const int expected_exit = 0;
+ const int expected_status = PROCESS_STATUS_RUNNING;
+
+ int retval, exit_code;
+ ssize_t pos = -1;
+ process_handle_t *process_handle=NULL;
+ int status;
+ char stdout_buf[100], stderr_buf[100];
+
+ const char *argv[] = {TEST_CHILD, "--test", NULL};
+ const char *expected_out[] = { "OUT" EOL "--test" EOL "SLEEPING" EOL,
+ "DONE" EOL,
+ NULL };
+ const char *expected_err = "ERR" EOL;
+
+#ifndef _WIN32
+ int eof = 0;
+#endif
+ int expected_out_ctr;
+
+ if (exit_early) {
+ argv[1] = "--hang";
+ expected_out[0] = "OUT"EOL "--hang"EOL "SLEEPING" EOL;
+ }
+
+ /* Start the program */
+#ifdef _WIN32
+ status = tor_spawn_background(NULL, argv, NULL, &process_handle);
+#else
+ status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
+#endif
+ tt_int_op(expected_status,OP_EQ, status);
+ tt_assert(process_handle);
+ tt_int_op(expected_status,OP_EQ, process_handle->status);
+
+ /* Check stdout */
+ for (expected_out_ctr = 0; expected_out[expected_out_ctr] != NULL;) {
+#ifdef _WIN32
+ pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf,
+ sizeof(stdout_buf) - 1, NULL);
+#else
+ /* Check that we didn't read the end of file last time */
+ tt_assert(!eof);
+ pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
+ sizeof(stdout_buf) - 1, NULL, &eof);
+#endif
+ log_info(LD_GENERAL, "tor_read_all_handle() returned %d", (int)pos);
+
+ /* We would have blocked, keep on trying */
+ if (0 == pos)
+ continue;
+
+ tt_assert(pos > 0);
+ stdout_buf[pos] = '\0';
+ tt_str_op(expected_out[expected_out_ctr],OP_EQ, stdout_buf);
+ tt_int_op(strlen(expected_out[expected_out_ctr]),OP_EQ, pos);
+ expected_out_ctr++;
+ }
+
+ if (exit_early) {
+ tor_process_handle_destroy(process_handle, 1);
+ process_handle = NULL;
+ goto done;
+ }
+
+ /* The process should have exited without writing more */
+#ifdef _WIN32
+ pos = tor_read_all_handle(process_handle->stdout_pipe, stdout_buf,
+ sizeof(stdout_buf) - 1,
+ process_handle);
+ tt_int_op(0,OP_EQ, pos);
+#else
+ if (!eof) {
+ /* We should have got all the data, but maybe not the EOF flag */
+ pos = tor_read_all_handle(process_handle->stdout_handle, stdout_buf,
+ sizeof(stdout_buf) - 1,
+ process_handle, &eof);
+ tt_int_op(0,OP_EQ, pos);
+ tt_assert(eof);
+ }
+ /* Otherwise, we got the EOF on the last read */
+#endif
+
+ /* Check it terminated correctly */
+ retval = tor_get_exit_code(process_handle, 1, &exit_code);
+ tt_int_op(PROCESS_EXIT_EXITED,OP_EQ, retval);
+ tt_int_op(expected_exit,OP_EQ, exit_code);
+
+ // TODO: Make test-child exit with something other than 0
+
+ /* Check stderr */
+ pos = tor_read_all_from_process_stderr(process_handle, stderr_buf,
+ sizeof(stderr_buf) - 1);
+ tt_assert(pos >= 0);
+ stderr_buf[pos] = '\0';
+ tt_str_op(expected_err,OP_EQ, stderr_buf);
+ tt_int_op(strlen(expected_err),OP_EQ, pos);
+
+ done:
+ tor_process_handle_destroy(process_handle, 1);
+}
+
+static void
+test_util_spawn_background_partial_read(void *arg)
+{
+ (void)arg;
+ test_util_spawn_background_partial_read_impl(0);
+}
+
+static void
+test_util_spawn_background_exit_early(void *arg)
+{
+ (void)arg;
+ test_util_spawn_background_partial_read_impl(1);
+}
+
+static void
+test_util_spawn_background_waitpid_notify(void *arg)
+{
+ int retval, exit_code;
+ process_handle_t *process_handle=NULL;
+ int status;
+ int ms_timer;
+
+ const char *argv[] = {TEST_CHILD, "--fast", NULL};
+
+ (void) arg;
+
+#ifdef _WIN32
+ status = tor_spawn_background(NULL, argv, NULL, &process_handle);
+#else
+ status = tor_spawn_background(argv[0], argv, NULL, &process_handle);
+#endif
+
+ tt_int_op(status, OP_EQ, PROCESS_STATUS_RUNNING);
+ tt_ptr_op(process_handle, OP_NE, NULL);
+
+ /* We're not going to look at the stdout/stderr output this time. Instead,
+ * we're testing whether notify_pending_waitpid_calbacks() can report the
+ * process exit (on unix) and/or whether tor_get_exit_code() can notice it
+ * (on windows) */
+
+#ifndef _WIN32
+ ms_timer = 30*1000;
+ tt_ptr_op(process_handle->waitpid_cb, OP_NE, NULL);
+ while (process_handle->waitpid_cb && ms_timer > 0) {
+ tor_sleep_msec(100);
+ ms_timer -= 100;
+ notify_pending_waitpid_callbacks();
+ }
+ tt_int_op(ms_timer, OP_GT, 0);
+ tt_ptr_op(process_handle->waitpid_cb, OP_EQ, NULL);
+#endif
+
+ ms_timer = 30*1000;
+ while (((retval = tor_get_exit_code(process_handle, 0, &exit_code))
+ == PROCESS_EXIT_RUNNING) && ms_timer > 0) {
+ tor_sleep_msec(100);
+ ms_timer -= 100;
+ }
+ tt_int_op(ms_timer, OP_GT, 0);
+
+ tt_int_op(retval, OP_EQ, PROCESS_EXIT_EXITED);
+
+ done:
+ tor_process_handle_destroy(process_handle, 1);
+}
+
+#undef TEST_CHILD
+#undef EOL
+
+#undef MATCH_PROCESS_STATUS
+
+#ifndef _WIN32
+#undef PROCESS_STATUS_RUNNING_OR_NOTRUNNING
+#undef IS_RUNNING_OR_NOTRUNNING
+#endif
+
+#define UTIL_TEST(name, flags) \
+ { #name, test_util_ ## name, flags, NULL, NULL }
+
+struct testcase_t slow_util_tests[] = {
+ UTIL_TEST(spawn_background_ok, 0),
+ UTIL_TEST(spawn_background_fail, 0),
+ UTIL_TEST(spawn_background_partial_read, 0),
+ UTIL_TEST(spawn_background_exit_early, 0),
+ UTIL_TEST(spawn_background_waitpid_notify, 0),
+ END_OF_TESTCASES
+};
+
diff --git a/src/test/test_workqueue.c b/src/test/test_workqueue.c
new file mode 100644
index 0000000000..aaff5069be
--- /dev/null
+++ b/src/test/test_workqueue.c
@@ -0,0 +1,409 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#include "or.h"
+#include "compat_threads.h"
+#include "onion.h"
+#include "workqueue.h"
+#include "crypto.h"
+#include "crypto_curve25519.h"
+#include "compat_libevent.h"
+
+#include <stdio.h>
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
+
+static int opt_verbose = 0;
+static int opt_n_threads = 8;
+static int opt_n_items = 10000;
+static int opt_n_inflight = 1000;
+static int opt_n_lowwater = 250;
+static int opt_n_cancel = 0;
+static int opt_ratio_rsa = 5;
+
+#ifdef TRACK_RESPONSES
+tor_mutex_t bitmap_mutex;
+int handled_len;
+bitarray_t *handled;
+#endif
+
+typedef struct state_s {
+ int magic;
+ int n_handled;
+ crypto_pk_t *rsa;
+ curve25519_secret_key_t ecdh;
+ int is_shutdown;
+} state_t;
+
+typedef struct rsa_work_s {
+ int serial;
+ uint8_t msg[128];
+ uint8_t msglen;
+} rsa_work_t;
+
+typedef struct ecdh_work_s {
+ int serial;
+ union {
+ curve25519_public_key_t pk;
+ uint8_t msg[32];
+ } u;
+} ecdh_work_t;
+
+static void
+mark_handled(int serial)
+{
+#ifdef TRACK_RESPONSES
+ tor_mutex_acquire(&bitmap_mutex);
+ tor_assert(serial < handled_len);
+ tor_assert(! bitarray_is_set(handled, serial));
+ bitarray_set(handled, serial);
+ tor_mutex_release(&bitmap_mutex);
+#else
+ (void)serial;
+#endif
+}
+
+static int
+workqueue_do_rsa(void *state, void *work)
+{
+ rsa_work_t *rw = work;
+ state_t *st = state;
+ crypto_pk_t *rsa = st->rsa;
+ uint8_t sig[256];
+ int len;
+
+ tor_assert(st->magic == 13371337);
+
+ len = crypto_pk_private_sign(rsa, (char*)sig, 256,
+ (char*)rw->msg, rw->msglen);
+ if (len < 0) {
+ rw->msglen = 0;
+ return WQ_RPL_ERROR;
+ }
+
+ memset(rw->msg, 0, sizeof(rw->msg));
+ rw->msglen = len;
+ memcpy(rw->msg, sig, len);
+ ++st->n_handled;
+
+ mark_handled(rw->serial);
+
+ return WQ_RPL_REPLY;
+}
+
+static int
+workqueue_do_shutdown(void *state, void *work)
+{
+ (void)state;
+ (void)work;
+ crypto_pk_free(((state_t*)state)->rsa);
+ tor_free(state);
+ return WQ_RPL_SHUTDOWN;
+}
+
+static int
+workqueue_do_ecdh(void *state, void *work)
+{
+ ecdh_work_t *ew = work;
+ uint8_t output[CURVE25519_OUTPUT_LEN];
+ state_t *st = state;
+
+ tor_assert(st->magic == 13371337);
+
+ curve25519_handshake(output, &st->ecdh, &ew->u.pk);
+ memcpy(ew->u.msg, output, CURVE25519_OUTPUT_LEN);
+ ++st->n_handled;
+ mark_handled(ew->serial);
+ return WQ_RPL_REPLY;
+}
+
+static void *
+new_state(void *arg)
+{
+ state_t *st;
+ (void)arg;
+
+ st = tor_malloc(sizeof(*st));
+ /* Every thread gets its own keys. not a problem for benchmarking */
+ st->rsa = crypto_pk_new();
+ if (crypto_pk_generate_key_with_bits(st->rsa, 1024) < 0) {
+ crypto_pk_free(st->rsa);
+ tor_free(st);
+ return NULL;
+ }
+ curve25519_secret_key_generate(&st->ecdh, 0);
+ st->magic = 13371337;
+ return st;
+}
+
+static void
+free_state(void *arg)
+{
+ state_t *st = arg;
+ crypto_pk_free(st->rsa);
+ tor_free(st);
+}
+
+static tor_weak_rng_t weak_rng;
+static int n_sent = 0;
+static int rsa_sent = 0;
+static int ecdh_sent = 0;
+static int n_received = 0;
+
+#ifdef TRACK_RESPONSES
+bitarray_t *received;
+#endif
+
+static void
+handle_reply(void *arg)
+{
+#ifdef TRACK_RESPONSES
+ rsa_work_t *rw = arg; /* Naughty cast, but only looking at serial. */
+ tor_assert(! bitarray_is_set(received, rw->serial));
+ bitarray_set(received,rw->serial);
+#endif
+
+ tor_free(arg);
+ ++n_received;
+}
+
+static workqueue_entry_t *
+add_work(threadpool_t *tp)
+{
+ int add_rsa =
+ opt_ratio_rsa == 0 ||
+ tor_weak_random_range(&weak_rng, opt_ratio_rsa) == 0;
+
+ if (add_rsa) {
+ rsa_work_t *w = tor_malloc_zero(sizeof(*w));
+ w->serial = n_sent++;
+ crypto_rand((char*)w->msg, 20);
+ w->msglen = 20;
+ ++rsa_sent;
+ return threadpool_queue_work(tp, workqueue_do_rsa, handle_reply, w);
+ } else {
+ ecdh_work_t *w = tor_malloc_zero(sizeof(*w));
+ w->serial = n_sent++;
+ /* Not strictly right, but this is just for benchmarks. */
+ crypto_rand((char*)w->u.pk.public_key, 32);
+ ++ecdh_sent;
+ return threadpool_queue_work(tp, workqueue_do_ecdh, handle_reply, w);
+ }
+}
+
+static int n_failed_cancel = 0;
+static int n_successful_cancel = 0;
+
+static int
+add_n_work_items(threadpool_t *tp, int n)
+{
+ int n_queued = 0;
+ int n_try_cancel = 0, i;
+ workqueue_entry_t **to_cancel;
+ workqueue_entry_t *ent;
+
+ to_cancel = tor_malloc(sizeof(workqueue_entry_t*) * opt_n_cancel);
+
+ while (n_queued++ < n) {
+ ent = add_work(tp);
+ if (! ent) {
+ tor_event_base_loopexit(tor_libevent_get_base(), NULL);
+ return -1;
+ }
+ if (n_try_cancel < opt_n_cancel &&
+ tor_weak_random_range(&weak_rng, n) < opt_n_cancel) {
+ to_cancel[n_try_cancel++] = ent;
+ }
+ }
+
+ for (i = 0; i < n_try_cancel; ++i) {
+ void *work = workqueue_entry_cancel(to_cancel[i]);
+ if (! work) {
+ n_failed_cancel++;
+ } else {
+ n_successful_cancel++;
+ tor_free(work);
+ }
+ }
+
+ tor_free(to_cancel);
+ return 0;
+}
+
+static int shutting_down = 0;
+
+static void
+replysock_readable_cb(tor_socket_t sock, short what, void *arg)
+{
+ threadpool_t *tp = arg;
+ replyqueue_t *rq = threadpool_get_replyqueue(tp);
+
+ int old_r = n_received;
+ (void) sock;
+ (void) what;
+
+ replyqueue_process(rq);
+ if (old_r == n_received)
+ return;
+
+ if (opt_verbose) {
+ printf("%d / %d", n_received, n_sent);
+ if (opt_n_cancel)
+ printf(" (%d cancelled, %d uncancellable)",
+ n_successful_cancel, n_failed_cancel);
+ puts("");
+ }
+#ifdef TRACK_RESPONSES
+ tor_mutex_acquire(&bitmap_mutex);
+ for (i = 0; i < opt_n_items; ++i) {
+ if (bitarray_is_set(received, i))
+ putc('o', stdout);
+ else if (bitarray_is_set(handled, i))
+ putc('!', stdout);
+ else
+ putc('.', stdout);
+ }
+ puts("");
+ tor_mutex_release(&bitmap_mutex);
+#endif
+
+ if (n_sent - (n_received+n_successful_cancel) < opt_n_lowwater) {
+ int n_to_send = n_received + opt_n_inflight - n_sent;
+ if (n_to_send > opt_n_items - n_sent)
+ n_to_send = opt_n_items - n_sent;
+ add_n_work_items(tp, n_to_send);
+ }
+
+ if (shutting_down == 0 &&
+ n_received+n_successful_cancel == n_sent &&
+ n_sent >= opt_n_items) {
+ shutting_down = 1;
+ threadpool_queue_update(tp, NULL,
+ workqueue_do_shutdown, NULL, NULL);
+ }
+}
+
+static void
+help(void)
+{
+ puts(
+ "Options:\n"
+ " -N <items> Run this many items of work\n"
+ " -T <threads> Use this many threads\n"
+ " -I <inflight> Have no more than this many requests queued at once\n"
+ " -L <lowwater> Add items whenever fewer than this many are pending\n"
+ " -C <cancel> Try to cancel N items of every batch that we add\n"
+ " -R <ratio> Make one out of this many items be a slow (RSA) one\n"
+ " --no-{eventfd2,eventfd,pipe2,pipe,socketpair}\n"
+ " Disable one of the alert_socket backends.");
+}
+
+int
+main(int argc, char **argv)
+{
+ replyqueue_t *rq;
+ threadpool_t *tp;
+ int i;
+ tor_libevent_cfg evcfg;
+ struct event *ev;
+ uint32_t as_flags = 0;
+
+ for (i = 1; i < argc; ++i) {
+ if (!strcmp(argv[i], "-v")) {
+ opt_verbose = 1;
+ } else if (!strcmp(argv[i], "-T") && i+1<argc) {
+ opt_n_threads = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-N") && i+1<argc) {
+ opt_n_items = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-I") && i+1<argc) {
+ opt_n_inflight = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-L") && i+1<argc) {
+ opt_n_lowwater = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-R") && i+1<argc) {
+ opt_ratio_rsa = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "-C") && i+1<argc) {
+ opt_n_cancel = atoi(argv[++i]);
+ } else if (!strcmp(argv[i], "--no-eventfd2")) {
+ as_flags |= ASOCKS_NOEVENTFD2;
+ } else if (!strcmp(argv[i], "--no-eventfd")) {
+ as_flags |= ASOCKS_NOEVENTFD;
+ } else if (!strcmp(argv[i], "--no-pipe2")) {
+ as_flags |= ASOCKS_NOPIPE2;
+ } else if (!strcmp(argv[i], "--no-pipe")) {
+ as_flags |= ASOCKS_NOPIPE;
+ } else if (!strcmp(argv[i], "--no-socketpair")) {
+ as_flags |= ASOCKS_NOSOCKETPAIR;
+ } else if (!strcmp(argv[i], "-h")) {
+ help();
+ return 0;
+ } else {
+ help();
+ return 1;
+ }
+ }
+ if (opt_n_threads < 1 ||
+ opt_n_items < 1 || opt_n_inflight < 1 || opt_n_lowwater < 0 ||
+ opt_n_cancel > opt_n_inflight ||
+ opt_ratio_rsa < 0) {
+ help();
+ return 1;
+ }
+
+ init_logging(1);
+ crypto_global_init(1, NULL, NULL);
+ crypto_seed_rng(1);
+
+ rq = replyqueue_new(as_flags);
+ tor_assert(rq);
+ tp = threadpool_new(opt_n_threads,
+ rq, new_state, free_state, NULL);
+ tor_assert(tp);
+
+ crypto_seed_weak_rng(&weak_rng);
+
+ memset(&evcfg, 0, sizeof(evcfg));
+ tor_libevent_initialize(&evcfg);
+
+ ev = tor_event_new(tor_libevent_get_base(),
+ replyqueue_get_socket(rq), EV_READ|EV_PERSIST,
+ replysock_readable_cb, tp);
+
+ event_add(ev, NULL);
+
+#ifdef TRACK_RESPONSES
+ handled = bitarray_init_zero(opt_n_items);
+ received = bitarray_init_zero(opt_n_items);
+ tor_mutex_init(&bitmap_mutex);
+ handled_len = opt_n_items;
+#endif
+
+ for (i = 0; i < opt_n_inflight; ++i) {
+ if (! add_work(tp)) {
+ puts("Couldn't add work.");
+ return 1;
+ }
+ }
+
+ {
+ struct timeval limit = { 30, 0 };
+ tor_event_base_loopexit(tor_libevent_get_base(), &limit);
+ }
+
+ event_base_loop(tor_libevent_get_base(), 0);
+
+ if (n_sent != opt_n_items || n_received+n_successful_cancel != n_sent) {
+ printf("%d vs %d\n", n_sent, opt_n_items);
+ printf("%d+%d vs %d\n", n_received, n_successful_cancel, n_sent);
+ puts("FAIL");
+ return 1;
+ } else {
+ puts("OK");
+ return 0;
+ }
+}
+
diff --git a/src/test/testing_common.c b/src/test/testing_common.c
new file mode 100644
index 0000000000..d7d6dacee6
--- /dev/null
+++ b/src/test/testing_common.c
@@ -0,0 +1,298 @@
+/* Copyright (c) 2001-2004, Roger Dingledine.
+ * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
+ * Copyright (c) 2007-2015, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/* Ordinarily defined in tor_main.c; this bit is just here to provide one
+ * since we're not linking to tor_main.c */
+const char tor_git_revision[] = "";
+
+/**
+ * \file test_common.c
+ * \brief Common pieces to implement unit tests.
+ **/
+
+#include "orconfig.h"
+#include "or.h"
+#include "config.h"
+#include "rephist.h"
+#include "backtrace.h"
+#include "test.h"
+
+#include <stdio.h>
+#ifdef HAVE_FCNTL_H
+#include <fcntl.h>
+#endif
+
+#ifdef _WIN32
+/* For mkdir() */
+#include <direct.h>
+#else
+#include <dirent.h>
+#endif
+
+#include "or.h"
+
+#ifdef USE_DMALLOC
+#include <dmalloc.h>
+#include <openssl/crypto.h>
+#include "main.h"
+#endif
+
+/** Temporary directory (set up by setup_directory) under which we store all
+ * our files during testing. */
+static char temp_dir[256];
+#ifdef _WIN32
+#define pid_t int
+#endif
+static pid_t temp_dir_setup_in_pid = 0;
+
+/** Select and create the temporary directory we'll use to run our unit tests.
+ * Store it in <b>temp_dir</b>. Exit immediately if we can't create it.
+ * idempotent. */
+static void
+setup_directory(void)
+{
+ static int is_setup = 0;
+ int r;
+ char rnd[256], rnd32[256];
+ if (is_setup) return;
+
+/* Due to base32 limitation needs to be a multiple of 5. */
+#define RAND_PATH_BYTES 5
+ crypto_rand(rnd, RAND_PATH_BYTES);
+ base32_encode(rnd32, sizeof(rnd32), rnd, RAND_PATH_BYTES);
+
+#ifdef _WIN32
+ {
+ char buf[MAX_PATH];
+ const char *tmp = buf;
+ const char *extra_backslash = "";
+ /* If this fails, we're probably screwed anyway */
+ if (!GetTempPathA(sizeof(buf),buf))
+ tmp = "c:\\windows\\temp\\";
+ if (strcmpend(tmp, "\\")) {
+ /* According to MSDN, it should be impossible for GetTempPath to give us
+ * an answer that doesn't end with \. But let's make sure. */
+ extra_backslash = "\\";
+ }
+ tor_snprintf(temp_dir, sizeof(temp_dir),
+ "%s%stor_test_%d_%s", tmp, extra_backslash,
+ (int)getpid(), rnd32);
+ r = mkdir(temp_dir);
+ }
+#else
+ tor_snprintf(temp_dir, sizeof(temp_dir), "/tmp/tor_test_%d_%s",
+ (int) getpid(), rnd32);
+ r = mkdir(temp_dir, 0700);
+ if (!r) {
+ /* undo sticky bit so tests don't get confused. */
+ r = chown(temp_dir, getuid(), getgid());
+ }
+#endif
+ if (r) {
+ fprintf(stderr, "Can't create directory %s:", temp_dir);
+ perror("");
+ exit(1);
+ }
+ is_setup = 1;
+ temp_dir_setup_in_pid = getpid();
+}
+
+/** Return a filename relative to our testing temporary directory */
+const char *
+get_fname(const char *name)
+{
+ static char buf[1024];
+ setup_directory();
+ if (!name)
+ return temp_dir;
+ tor_snprintf(buf,sizeof(buf),"%s/%s",temp_dir,name);
+ return buf;
+}
+
+/* Remove a directory and all of its subdirectories */
+static void
+rm_rf(const char *dir)
+{
+ struct stat st;
+ smartlist_t *elements;
+
+ elements = tor_listdir(dir);
+ if (elements) {
+ SMARTLIST_FOREACH_BEGIN(elements, const char *, cp) {
+ char *tmp = NULL;
+ tor_asprintf(&tmp, "%s"PATH_SEPARATOR"%s", dir, cp);
+ if (0 == stat(tmp,&st) && (st.st_mode & S_IFDIR)) {
+ rm_rf(tmp);
+ } else {
+ if (unlink(tmp)) {
+ fprintf(stderr, "Error removing %s: %s\n", tmp, strerror(errno));
+ }
+ }
+ tor_free(tmp);
+ } SMARTLIST_FOREACH_END(cp);
+ SMARTLIST_FOREACH(elements, char *, cp, tor_free(cp));
+ smartlist_free(elements);
+ }
+ if (rmdir(dir))
+ fprintf(stderr, "Error removing directory %s: %s\n", dir, strerror(errno));
+}
+
+/** Remove all files stored under the temporary directory, and the directory
+ * itself. Called by atexit(). */
+static void
+remove_directory(void)
+{
+ if (getpid() != temp_dir_setup_in_pid) {
+ /* Only clean out the tempdir when the main process is exiting. */
+ return;
+ }
+
+ rm_rf(temp_dir);
+}
+
+/** Define this if unit tests spend too much time generating public keys*/
+#undef CACHE_GENERATED_KEYS
+
+static crypto_pk_t *pregen_keys[5] = {NULL, NULL, NULL, NULL, NULL};
+#define N_PREGEN_KEYS ARRAY_LENGTH(pregen_keys)
+
+/** Generate and return a new keypair for use in unit tests. If we're using
+ * the key cache optimization, we might reuse keys: we only guarantee that
+ * keys made with distinct values for <b>idx</b> are different. The value of
+ * <b>idx</b> must be at least 0, and less than N_PREGEN_KEYS. */
+crypto_pk_t *
+pk_generate(int idx)
+{
+#ifdef CACHE_GENERATED_KEYS
+ tor_assert(idx < N_PREGEN_KEYS);
+ if (! pregen_keys[idx]) {
+ pregen_keys[idx] = crypto_pk_new();
+ tor_assert(!crypto_pk_generate_key(pregen_keys[idx]));
+ }
+ return crypto_pk_dup_key(pregen_keys[idx]);
+#else
+ crypto_pk_t *result;
+ (void) idx;
+ result = crypto_pk_new();
+ tor_assert(!crypto_pk_generate_key(result));
+ return result;
+#endif
+}
+
+/** Free all storage used for the cached key optimization. */
+static void
+free_pregenerated_keys(void)
+{
+ unsigned idx;
+ for (idx = 0; idx < N_PREGEN_KEYS; ++idx) {
+ if (pregen_keys[idx]) {
+ crypto_pk_free(pregen_keys[idx]);
+ pregen_keys[idx] = NULL;
+ }
+ }
+}
+
+static void *
+passthrough_test_setup(const struct testcase_t *testcase)
+{
+ return testcase->setup_data;
+}
+static int
+passthrough_test_cleanup(const struct testcase_t *testcase, void *ptr)
+{
+ (void)testcase;
+ (void)ptr;
+ return 1;
+}
+
+const struct testcase_setup_t passthrough_setup = {
+ passthrough_test_setup, passthrough_test_cleanup
+};
+
+extern struct testgroup_t testgroups[];
+
+/** Main entry point for unit test code: parse the command line, and run
+ * some unit tests. */
+int
+main(int c, const char **v)
+{
+ or_options_t *options;
+ char *errmsg = NULL;
+ int i, i_out;
+ int loglevel = LOG_ERR;
+ int accel_crypto = 0;
+
+#ifdef USE_DMALLOC
+ {
+ int r = CRYPTO_set_mem_ex_functions(tor_malloc_, tor_realloc_, tor_free_);
+ tor_assert(r);
+ }
+#endif
+
+ update_approx_time(time(NULL));
+ options = options_new();
+ tor_threads_init();
+ init_logging(1);
+ configure_backtrace_handler(get_version());
+
+ for (i_out = i = 1; i < c; ++i) {
+ if (!strcmp(v[i], "--warn")) {
+ loglevel = LOG_WARN;
+ } else if (!strcmp(v[i], "--notice")) {
+ loglevel = LOG_NOTICE;
+ } else if (!strcmp(v[i], "--info")) {
+ loglevel = LOG_INFO;
+ } else if (!strcmp(v[i], "--debug")) {
+ loglevel = LOG_DEBUG;
+ } else if (!strcmp(v[i], "--accel")) {
+ accel_crypto = 1;
+ } else {
+ v[i_out++] = v[i];
+ }
+ }
+ c = i_out;
+
+ {
+ log_severity_list_t s;
+ memset(&s, 0, sizeof(s));
+ set_log_severity_config(loglevel, LOG_ERR, &s);
+ add_stream_log(&s, "", fileno(stdout));
+ }
+
+ options->command = CMD_RUN_UNITTESTS;
+ if (crypto_global_init(accel_crypto, NULL, NULL)) {
+ printf("Can't initialize crypto subsystem; exiting.\n");
+ return 1;
+ }
+ crypto_set_tls_dh_prime(NULL);
+ crypto_seed_rng(1);
+ rep_hist_init();
+ network_init();
+ setup_directory();
+ options_init(options);
+ options->DataDirectory = tor_strdup(temp_dir);
+ options->EntryStatistics = 1;
+ if (set_options(options, &errmsg) < 0) {
+ printf("Failed to set initial options: %s\n", errmsg);
+ tor_free(errmsg);
+ return 1;
+ }
+
+ atexit(remove_directory);
+
+ int have_failed = (tinytest_main(c, v, testgroups) != 0);
+
+ free_pregenerated_keys();
+#ifdef USE_DMALLOC
+ tor_free_all(0);
+ dmalloc_log_unfreed();
+#endif
+
+ if (have_failed)
+ return 1;
+ else
+ return 0;
+}
+
diff --git a/src/test/zero_length_keys.sh b/src/test/zero_length_keys.sh
new file mode 100755
index 0000000000..3a99ca1f1d
--- /dev/null
+++ b/src/test/zero_length_keys.sh
@@ -0,0 +1,115 @@
+#!/bin/sh
+# Check that tor regenerates keys when key files are zero-length
+# Test for bug #13111 - Tor fails to start if onion keys are zero length
+#
+# Usage:
+# ./zero_length_keys.sh
+# Run all the tests below
+# ./zero_length_keys.sh -z
+# Check tor will launch and regenerate zero-length keys
+# ./zero_length_keys.sh -d
+# Check tor regenerates deleted keys (existing behaviour)
+# ./zero_length_keys.sh -e
+# Check tor does not overwrite existing keys (existing behaviour)
+#
+# Exit Statuses:
+# -2: test failed - tor did not generate the key files on first run
+# -1: a command failed - the test could not be completed
+# 0: test succeeded - tor regenerated/kept the files
+# 1: test failed - tor did not regenerate/keep the files
+#
+
+if [ $# -lt 1 ]; then
+ echo "Testing that tor correctly handles zero-length keys"
+ "$0" -z && "$0" -d && "$0" -e
+ exit $?
+fi
+
+export DATA_DIR=`mktemp -d -t tor_zero_length_keys.XXXXXX`
+# DisableNetwork means that the ORPort won't actually be opened.
+# 'ExitRelay 0' suppresses a warning.
+TOR="./src/or/tor --hush --DisableNetwork 1 --ShutdownWaitLength 0 --ORPort 12345 --ExitRelay 0"
+
+if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then
+ echo "Failure: Previous tor keys present in tor data directory"
+ exit -1
+else
+ echo "Generating initial tor keys"
+ $TOR --DataDirectory "$DATA_DIR" --PidFile "$DATA_DIR"/pid &
+ TOR_PID=$!
+ # generate SIGTERM, hopefully after the keys have been regenerated
+ sleep 5
+ kill $TOR_PID
+ wait $TOR_PID
+
+ # tor must successfully generate non-zero-length key files
+ if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then
+ true #echo "tor generated the initial key files"
+ else
+ echo "Failure: tor failed to generate the initial key files"
+ exit -2
+ fi
+fi
+
+#ls -lh "$DATA_DIR"/keys/ || exit -1
+
+# backup and keep/delete/create zero-length files for the keys
+
+FILE_DESC="keeps existing"
+# make a backup
+cp -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old
+
+# delete keys for -d or -z
+if [ "$1" != "-e" ]; then
+ FILE_DESC="regenerates deleted"
+ rm "$DATA_DIR"/keys/secret_id_key || exit -1
+ rm "$DATA_DIR"/keys/secret_onion_key || exit -1
+ rm "$DATA_DIR"/keys/secret_onion_key_ntor || exit -1
+fi
+
+# create empty files for -z
+if [ "$1" = "-z" ]; then
+ FILE_DESC="regenerates zero-length"
+ touch "$DATA_DIR"/keys/secret_id_key || exit -1
+ touch "$DATA_DIR"/keys/secret_onion_key || exit -1
+ touch "$DATA_DIR"/keys/secret_onion_key_ntor || exit -1
+fi
+
+echo "Running tor again to check if it $FILE_DESC keys"
+$TOR --DataDirectory "$DATA_DIR" --PidFile "$DATA_DIR"/pid &
+TOR_PID=$!
+# generate SIGTERM, hopefully after the keys have been regenerated
+sleep 5
+kill $TOR_PID
+wait $TOR_PID
+
+#ls -lh "$DATA_DIR"/keys/ || exit -1
+
+# tor must always have non-zero-length key files
+if [ -s "$DATA_DIR"/keys/secret_id_key -a -s "$DATA_DIR"/keys/secret_onion_key -a -s "$DATA_DIR"/keys/secret_onion_key_ntor ]; then
+ # check if the keys are different to the old ones
+ diff -q -r "$DATA_DIR"/keys "$DATA_DIR"/keys.old > /dev/null
+ SAME_KEYS=$?
+ # if we're not testing existing keys,
+ # the current keys should be different to the old ones
+ if [ "$1" != "-e" ]; then
+ if [ $SAME_KEYS -ne 0 ]; then
+ echo "Success: test that tor $FILE_DESC key files: different keys"
+ exit 0
+ else
+ echo "Failure: test that tor $FILE_DESC key files: same keys"
+ exit 1
+ fi
+ else #[ "$1" == "-e" ]; then
+ if [ $SAME_KEYS -eq 0 ]; then
+ echo "Success: test that tor $FILE_DESC key files: same keys"
+ exit 0
+ else
+ echo "Failure: test that tor $FILE_DESC key files: different keys"
+ exit 1
+ fi
+ fi
+else
+ echo "Failure: test that tor $FILE_DESC key files: no key files"
+ exit 1
+fi
diff --git a/src/tools/tor-checkkey.c b/src/tools/tor-checkkey.c
index f6c6508c33..e404b682cf 100644
--- a/src/tools/tor-checkkey.c
+++ b/src/tools/tor-checkkey.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008-2014, The Tor Project, Inc. */
+/* Copyright (c) 2008-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
index 74485f9803..6369966869 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
+++ b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h
index 1bfebd91f9..abc5e11857 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h
+++ b/src/tools/tor-fw-helper/tor-fw-helper-natpmp.h
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-fw-helper/tor-fw-helper-upnp.c b/src/tools/tor-fw-helper/tor-fw-helper-upnp.c
index 59bc232dd3..e5495c906e 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper-upnp.c
+++ b/src/tools/tor-fw-helper/tor-fw-helper-upnp.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-fw-helper/tor-fw-helper-upnp.h b/src/tools/tor-fw-helper/tor-fw-helper-upnp.h
index 9a5123e09f..bc9476eb98 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper-upnp.h
+++ b/src/tools/tor-fw-helper/tor-fw-helper-upnp.h
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-fw-helper/tor-fw-helper.c b/src/tools/tor-fw-helper/tor-fw-helper.c
index 9a32b0cbe2..fdc0e1adea 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper.c
+++ b/src/tools/tor-fw-helper/tor-fw-helper.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-fw-helper/tor-fw-helper.h b/src/tools/tor-fw-helper/tor-fw-helper.h
index 71bc11e168..4ebc75d8f7 100644
--- a/src/tools/tor-fw-helper/tor-fw-helper.h
+++ b/src/tools/tor-fw-helper/tor-fw-helper.h
@@ -1,5 +1,5 @@
/* Copyright (c) 2010, Jacob Appelbaum, Steven J. Murdoch.
- * Copyright (c) 2010-2014, The Tor Project, Inc. */
+ * Copyright (c) 2010-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
/**
diff --git a/src/tools/tor-gencert.c b/src/tools/tor-gencert.c
index f6805c1193..c599822e07 100644
--- a/src/tools/tor-gencert.c
+++ b/src/tools/tor-gencert.c
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2014, The Tor Project, Inc. */
+/* Copyright (c) 2007-2015, The Tor Project, Inc. */
/* See LICENSE for licensing information */
#include "orconfig.h"
diff --git a/src/tools/tor-resolve.c b/src/tools/tor-resolve.c
index 6ee155ade5..04815a63f7 100644
--- a/src/tools/tor-resolve.c
+++ b/src/tools/tor-resolve.c
@@ -1,5 +1,5 @@
/* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
- * Copyright (c) 2007-2014, The Tor Project, Inc.
+ * Copyright (c) 2007-2015, The Tor Project, Inc.
*/
/* See LICENSE for licensing information */
@@ -108,6 +108,18 @@ build_socks_resolve_request(char **out,
return len;
}
+static void
+onion_warning(const char *hostname)
+{
+ log_warn(LD_NET,
+ "%s is a hidden service; those don't have IP addresses. "
+ "You can use the AutomapHostsOnResolve option to have Tor return a "
+ "fake address for hidden services. Or you can have your "
+ "application send the address to Tor directly; we recommend an "
+ "application that uses SOCKS 5 with hostnames.",
+ hostname);
+}
+
/** Given a <b>len</b>-byte SOCKS4a response in <b>response</b>, set
* *<b>addr_out</b> to the address it contains (in host order).
* Return 0 on success, -1 on error.
@@ -137,10 +149,7 @@ parse_socks4a_resolve_response(const char *hostname,
if (status != 90) {
log_warn(LD_NET,"Got status response '%d': socks request failed.", status);
if (!strcasecmpend(hostname, ".onion")) {
- log_warn(LD_NET,
- "%s is a hidden service; those don't have IP addresses. "
- "To connect to a hidden service, you need to send the hostname "
- "to Tor; we suggest an application that uses SOCKS 4a.",hostname);
+ onion_warning(hostname);
return -1;
}
return -1;
@@ -276,11 +285,7 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
(unsigned)reply_buf[1],
socks5_reason_to_string(reply_buf[1]));
if (reply_buf[1] == 4 && !strcasecmpend(hostname, ".onion")) {
- log_warn(LD_NET,
- "%s is a hidden service; those don't have IP addresses. "
- "To connect to a hidden service, you need to send the hostname "
- "to Tor; we suggest an application that uses SOCKS 4a.",
- hostname);
+ onion_warning(hostname);
}
goto err;
}
@@ -326,8 +331,8 @@ do_resolve(const char *hostname, uint32_t sockshost, uint16_t socksport,
static void
usage(void)
{
- puts("Syntax: tor-resolve [-4] [-v] [-x] [-F] [-p port] "
- "hostname [sockshost:socksport]");
+ puts("Syntax: tor-resolve [-4] [-5] [-v] [-x] [-F] [-p port] "
+ "hostname [sockshost[:socksport]]");
exit(1);
}
diff --git a/src/win32/orconfig.h b/src/win32/orconfig.h
index cee81b31eb..d1a5b4b3e2 100644
--- a/src/win32/orconfig.h
+++ b/src/win32/orconfig.h
@@ -232,7 +232,7 @@
#define USING_TWOS_COMPLEMENT
/* Version number of package */
-#define VERSION "0.2.6.1-alpha-dev"
+#define VERSION "0.2.6.2-alpha-dev"