diff options
329 files changed, 37893 insertions, 15868 deletions
diff --git a/.gitignore b/.gitignore index 9ddd0c5385..0cdf2c4e61 100644 --- a/.gitignore +++ b/.gitignore @@ -160,13 +160,17 @@ cscope.* /src/test/bench /src/test/bench.exe /src/test/test +/src/test/test-slow /src/test/test-bt-cl /src/test/test-child /src/test/test-ntor-cl +/src/test/test_workqueue /src/test/test.exe +/src/test/test-slow.exe /src/test/test-bt-cl.exe /src/test/test-child.exe /src/test/test-ntor-cl.exe +/src/test/test_workqueue.exe # /src/tools/ /src/tools/tor-checkkey @@ -1,4 +1,270 @@ -Changes in version 0.2.6.2-alpha - 2014-1?-?? +Changes in version 0.2.6.2-alpha - 2014-12-31 + Tor 0.2.6.2-alpha is the second alpha release in the 0.2.6.x series. + It introduces a major new backend for deciding when to send cells on + channels, which should lead down the road to big performance + increases. It contains security and statistics features for better + work on hidden services, and numerous bugfixes. + + This release contains many new unit tests, along with major + performance improvements for running testing networks using Chutney. + Thanks to a series of patches contributed by "teor", testing networks + should now bootstrap in seconds, rather than minutes. + + o Major features (relay, infrastructure): + - Complete revision of the code that relays use to decide which cell + to send next. Formerly, we selected the best circuit to write on + each channel, but we didn't select among channels in any + sophisticated way. Now, we choose the best circuits globally from + among those whose channels are ready to deliver traffic. + + This patch implements a new inter-cmux comparison API, a global + high/low watermark mechanism and a global scheduler loop for + transmission prioritization across all channels as well as among + circuits on one channel. This schedule is currently tuned to + (tolerantly) avoid making changes in network performance, but it + should form the basis for major circuit performance increases in + the future. Code by Andrea; tuning by Rob Jansen; implements + ticket 9262. + + o Major features (hidden services): + - Make HS port scanning more difficult by immediately closing the + circuit when a user attempts to connect to a nonexistent port. + Closes ticket 13667. + - Add a HiddenServiceStatistics option that allows Tor relays to + gather and publish statistics about the overall size and volume of + hidden service usage. Specifically, when this option is turned on, + an HSDir will publish an approximate number of hidden services + that have published descriptors to it the past 24 hours. Also, if + a relay has acted as a hidden service rendezvous point, it will + publish the approximate amount of rendezvous cells it has relayed + the past 24 hours. The statistics themselves are obfuscated so + that the exact values cannot be derived. For more details see + proposal 238, "Better hidden service stats from Tor relays". This + feature is currently disabled by default. Implements feature 13192. + + o Major bugfixes (client, automap): + - Repair automapping with IPv6 addresses. This automapping should + have worked previously, but one piece of debugging code that we + inserted to detect a regression actually caused the regression to + manifest itself again. Fixes bug 13811 and bug 12831; bugfix on + 0.2.4.7-alpha. Diagnosed and fixed by Francisco Blas + Izquierdo Riera. + + o Major bugfixes (hidden services): + - When closing an introduction circuit that was opened in parallel + with others, don't mark the introduction point as unreachable. + Previously, the first successful connection to an introduction + point would make the other introduction points get marked as + having timed out. Fixes bug 13698; bugfix on 0.0.6rc2. + + o Directory authority changes: + - Remove turtles as a directory authority. + - Add longclaw as a new (v3) directory authority. This implements + ticket 13296. This keeps the directory authority count at 9. + + o Major removed features: + - Tor clients no longer support connecting to hidden services + running on Tor 0.2.2.x and earlier; the Support022HiddenServices + option has been removed. (There shouldn't be any hidden services + running these versions on the network.) Closes ticket 7803. + + o Minor features (client): + - Validate hostnames in SOCKS5 requests more strictly. If SafeSocks + is enabled, reject requests with IP addresses as hostnames. + Resolves ticket 13315. + + o Minor features (controller): + - Add a "SIGNAL HEARTBEAT" controller command that tells Tor to + write an unscheduled heartbeat message to the log. Implements + feature 9503. + + o Minor features (geoip): + - Update geoip and geoip6 to the November 15 2014 Maxmind GeoLite2 + Country database. + + o Minor features (hidden services): + - When re-enabling the network, don't try to build introduction + circuits until we have successfully built a circuit. This makes + hidden services come up faster when the network is re-enabled. + Patch from "akwizgran". Closes ticket 13447. + - When we fail to a retrieve hidden service descriptor, send the + controller an "HS_DESC FAILED" controller event. Implements + feature 13212. + - New HiddenServiceDirGroupReadable option to cause hidden service + directories and hostname files to be created group-readable. Patch + from "anon", David Stainton, and "meejah". Closes ticket 11291. + + o Minor features (systemd): + - Where supported, when running with systemd, report successful + startup to systemd. Part of ticket 11016. Patch by Michael Scherer. + - When running with systemd, support systemd watchdog messages. Part + of ticket 11016. Patch by Michael Scherer. + + o Minor features (transparent proxy): + - Update the transparent proxy option checks to allow for both ipfw + and pf on OS X. Closes ticket 14002. + - Use the correct option when using IPv6 with transparent proxy + support on Linux. Resolves 13808. Patch by Francisco Blas + Izquierdo Riera. + + o Minor bugfixes (preventative security, C safety): + - When reading a hexadecimal, base-32, or base-64 encoded value from + a string, always overwrite the whole output buffer. This prevents + some bugs where we would look at (but fortunately, not reveal) + uninitialized memory on the stack. Fixes bug 14013; bugfix on all + versions of Tor. + - Clear all memory targetted by tor_addr_{to,from}_sockaddr(), not + just the part that's used. This makes it harder for data leak bugs + to occur in the event of other programming failures. Resolves + ticket 14041. + + o Minor bugfixes (client, microdescriptors): + - Use a full 256 bits of the SHA256 digest of a microdescriptor when + computing which microdescriptors to download. This keeps us from + erroneous download behavior if two microdescriptor digests ever + have the same first 160 bits. Fixes part of bug 13399; bugfix + on 0.2.3.1-alpha. + - Reset a router's status if its microdescriptor digest changes, + even if the first 160 bits remain the same. Fixes part of bug + 13399; bugfix on 0.2.3.1-alpha. + + o Minor bugfixes (compilation): + - Silence clang warnings under --enable-expensive-hardening, + including implicit truncation of 64 bit values to 32 bit, const + char assignment to self, tautological compare, and additional + parentheses around equality tests. Fixes bug 13577; bugfix + on 0.2.5.4-alpha. + - Fix a clang warning about checking whether an address in the + middle of a structure is NULL. Fixes bug 14001; bugfix + on 0.2.1.2-alpha. + + o Minor bugfixes (hidden services): + - Correctly send a controller event when we find that a rendezvous + circuit has finished. Fixes bug 13936; bugfix on 0.1.1.5-alpha. + - Pre-check directory permissions for new hidden-services to avoid + at least one case of "Bug: Acting on config options left us in a + broken state. Dying." Fixes bug 13942; bugfix on 0.0.6pre1. + - When adding a new hidden service (for example, via SETCONF), Tor + no longer congratulates the user for running a relay. Fixes bug + 13941; bugfix on 0.2.6.1-alpha. + - When fetching hidden service descriptors, we now check not only + for whether we got the hidden service we had in mind, but also + whether we got the particular descriptors we wanted. This prevents + a class of inefficient but annoying DoS attacks by hidden service + directories. Fixes bug 13214; bugfix on 0.2.1.6-alpha. Reported + by "special". + + o Minor bugfixes (Linux seccomp2 sandbox): + - Make transparent proxy support work along with the seccomp2 + sandbox. Fixes part of bug 13808; bugfix on 0.2.5.1-alpha. Patch + by Francisco Blas Izquierdo Riera. + - Fix a memory leak in tor-resolve when running with the sandbox + enabled. Fixes bug 14050; bugfix on 0.2.5.9-rc. + + o Minor bugfixes (logging): + - Downgrade warnings about RSA signature failures to info log level. + Emit a warning when an extra info document is found incompatible + with a corresponding router descriptor. Fixes bug 9812; bugfix + on 0.0.6rc3. + - Make connection_ap_handshake_attach_circuit() log the circuit ID + correctly. Fixes bug 13701; bugfix on 0.0.6. + + o Minor bugfixes (misc): + - Stop allowing invalid address patterns like "*/24" that contain + both a wildcard address and a bit prefix length. This affects all + our address-range parsing code. Fixes bug 7484; bugfix + on 0.0.2pre14. + + o Minor bugfixes (testing networks, fast startup): + - Allow Tor to build circuits using a consensus with no exits. If + the consensus has no exits (typical of a bootstrapping test + network), allow Tor to build circuits once enough descriptors have + been downloaded. This assists in bootstrapping a testing Tor + network. Fixes bug 13718; bugfix on 0.2.4.10-alpha. Patch + by "teor". + - When V3AuthVotingInterval is low, give a lower If-Modified-Since + header to directory servers. This allows us to obtain consensuses + promptly when the consensus interval is very short. This assists + in bootstrapping a testing Tor network. Fixes parts of bugs 13718 + and 13963; bugfix on 0.2.0.3-alpha. Patch by "teor". + - Stop assuming that private addresses are local when checking + reachability in a TestingTorNetwork. Instead, when testing, assume + all OR connections are remote. (This is necessary due to many test + scenarios running all relays on localhost.) This assists in + bootstrapping a testing Tor network. Fixes bug 13924; bugfix on + 0.1.0.1-rc. Patch by "teor". + - Avoid building exit circuits from a consensus with no exits. Now + thanks to our fix for 13718, we accept a no-exit network as not + wholly lost, but we need to remember not to try to build exit + circuits on it. Closes ticket 13814; patch by "teor". + - Stop requiring exits to have non-zero bandwithcapacity in a + TestingTorNetwork. Instead, when TestingMinExitFlagThreshold is 0, + ignore exit bandwidthcapacity. This assists in bootstrapping a + testing Tor network. Fixes parts of bugs 13718 and 13839; bugfix + on 0.2.0.3-alpha. Patch by "teor". + - Add "internal" to some bootstrap statuses when no exits are + available. If the consensus does not contain Exits, Tor will only + build internal circuits. In this case, relevant statuses will + contain the word "internal" as indicated in the Tor control- + spec.txt. When bootstrap completes, Tor will be ready to build + internal circuits. If a future consensus contains Exits, exit + circuits may become available. Fixes part of bug 13718; bugfix on + 0.2.4.10-alpha. Patch by "teor". + - Decrease minimum consensus interval to 10 seconds when + TestingTorNetwork is set, or 5 seconds for the first consensus. + Fix assumptions throughout the code that assume larger intervals. + Fixes bugs 13718 and 13823; bugfix on 0.2.0.3-alpha. Patch + by "teor". + - Avoid excluding guards from path building in minimal test + networks, when we're in a test network and excluding guards would + exclude all relays. This typically occurs in incredibly small tor + networks, and those using "TestingAuthVoteGuard *". Fixes part of + bug 13718; bugfix on 0.1.1.11-alpha. Patch by "teor". + + o Code simplification and refactoring: + - Stop using can_complete_circuits as a global variable; access it + with a function instead. + - Avoid using operators directly as macro arguments: this lets us + apply coccinelle transformations to our codebase more directly. + Closes ticket 13172. + - Combine the functions used to parse ClientTransportPlugin and + ServerTransportPlugin into a single function. Closes ticket 6456. + - Add inline functions and convenience macros for inspecting channel + state. Refactor the code to use convenience macros instead of + checking channel state directly. Fixes issue 7356. + - Document all members of was_router_added_t and rename + ROUTER_WAS_NOT_NEW to ROUTER_IS_ALREADY_KNOWN to make it less + confusable with ROUTER_WAS_TOO_OLD. Fixes issue 13644. + - In connection_exit_begin_conn(), use END_CIRC_REASON_TORPROTOCOL + constant instead of hardcoded value. Fixes issue 13840. + - Refactor our generic strmap and digestmap types into a single + implementation, so that we can add a new digest256map + type trivially. + + o Documentation: + - Document the bridge-authority-only 'networkstatus-bridges' file. + Closes ticket 13713; patch from "tom". + - Fix typo in PredictedPortsRelevanceTime option description in + manpage. Resolves issue 13707. + - Stop suggesting that users specify relays by nickname: it isn't a + good idea. Also, properly cross-reference how to specify relays in + all parts of manual documenting options that take a list of + relays. Closes ticket 13381. + - Clarify the HiddenServiceDir option description in manpage to make + it clear that relative paths are taken with respect to the current + working directory. Also clarify that this behavior is not + guaranteed to remain indefinitely. Fixes issue 13913. + + o Testing: + - New tests for many parts of channel, relay, and circuitmux + functionality. Code by Andrea; part of 9262. + - New tests for parse_transport_line(). Part of ticket 6456. + - In the unit tests, use chgrp() to change the group of the unit + test temporary directory to the current user, so that the sticky + bit doesn't interfere with tests that check directory groups. + Closes 13678. + - Add unit tests for resolve_my_addr(). Part of ticket 12376; patch + by 'rl1987'. Changes in version 0.2.6.1-alpha - 2014-10-30 @@ -193,7 +459,7 @@ Changes in version 0.2.6.1-alpha - 2014-10-30 Browser users to write "DirReqStatistics 0" in their torrc files as if they had chosen to change the config. Fixes bug 4244; bugfix on 0.2.3.1-alpha. - - When GeoIPExcludeUnkonwn is enabled, do not incorrectly decide + - When GeoIPExcludeUnknown is enabled, do not incorrectly decide that our options have changed every time we SIGHUP. Fixes bug 9801; bugfix on 0.2.4.10-alpha. Patch from "qwerty1". @@ -270,7 +536,7 @@ Changes in version 0.2.6.1-alpha - 2014-10-30 ticket 12202. - Refactor and unit-test entry_is_time_to_retry() in entrynodes.c. Resolves ticket 12205. - - Use calloc and reallocarray functions in preference to multiply- + - Use calloc and reallocarray functions instead of multiply- then-malloc. This makes it less likely for us to fall victim to an integer overflow attack when allocating. Resolves ticket 12855. - Use the standard macro name SIZE_MAX, instead of our @@ -279,7 +545,7 @@ Changes in version 0.2.6.1-alpha - 2014-10-30 functions which take them as arguments. Replace 0 with NO_DIRINFO in a function call for clarity. Seeks to prevent future issues like 13163. - - Avoid 4 null pointer errors under clang shallow analysis by using + - Avoid 4 null pointer errors under clang static analysis by using tor_assert() to prove that the pointers aren't null. Fixes bug 13284. - Rework the API of policies_parse_exit_policy() to use a bitmask to @@ -295,23 +561,23 @@ Changes in version 0.2.6.1-alpha - 2014-10-30 operating system is allowing to use simultaneously. Resolves ticket 9708. - o Removed code: + o Removed features: - We no longer remind the user about configuration options that have been obsolete since 0.2.3.x or earlier. Patch by Adrien Bak. - - o Removed features: + - Remove our old, non-weighted bandwidth-based node selection code. + Previously, we used it as a fallback when we couldn't perform + weighted bandwidth-based node selection. But that would only + happen in the cases where we had no consensus, or when we had a + consensus generated by buggy or ancient directory authorities. In + either case, it's better to use the more modern, better maintained + algorithm, with reasonable defaults for the weights. Closes + ticket 13126. - Remove the --disable-curve25519 configure option. Relays and clients now are required to support curve25519 and the ntor handshake. - The old "StrictEntryNodes" and "StrictExitNodes" options, which used to be deprecated synonyms for "StrictNodes", are now marked obsolete. Resolves ticket 12226. - - The "AuthDirRejectUnlisted" option no longer has any effect, as - the fingerprints file (approved-routers) has been deprecated. - - Directory authorities do not support being Naming dirauths anymore. - The "NamingAuthoritativeDir" config option is now obsolete. - - Directory authorities do not support giving out the BadDirectory - flag anymore. - Clients don't understand the BadDirectory flag in the consensus anymore, and ignore it. @@ -348,6 +614,12 @@ Changes in version 0.2.6.1-alpha - 2014-10-30 affected by CVE-2011-2769 as guards. These relays are already rejected altogether due to the minimum version requirement of 0.2.3.16-alpha. Closes ticket 13152. + - The "AuthDirRejectUnlisted" option no longer has any effect, as + the fingerprints file (approved-routers) has been deprecated. + - Directory authorities do not support being Naming dirauths anymore. + The "NamingAuthoritativeDir" config option is now obsolete. + - Directory authorities do not support giving out the BadDirectory + flag anymore. - Directory authorities no longer advertise or support consensus methods 1 through 12 inclusive. These consensus methods were obsolete and/or insecure: maintaining the ability to support them @@ -13,7 +13,7 @@ Tor is distributed under this license: 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. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are @@ -191,7 +191,7 @@ ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT DATABASE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =============================================================================== m4/pc_from_ucontext.m4 is available under the following license. Note that -it is *not* built into the Tor license. +it is *not* built into the Tor software. Copyright (c) 2005, Google Inc. All rights reserved. @@ -223,6 +223,35 @@ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. =============================================================================== +m4/pkg.m4 is available under the following license. Note that +it is *not* built into the Tor software. + +pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +serial 1 (pkg-config-0.24) + +Copyright © 2004 Scott James Remnant <scott@netsplit.com>. + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, but +WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +As a special exception to the GNU General Public License, if you +distribute this file as part of a program that contains a +configuration script generated by Autoconf, you may include it under +the same distribution terms that you use for the rest of that program. + + +=============================================================================== If you got Tor as a static binary with OpenSSL included, then you should know: "This product includes software developed by the OpenSSL Project for use in the OpenSSL Toolkit (http://www.openssl.org/)" diff --git a/Makefile.am b/Makefile.am index 7125c7701c..67c9cc9d25 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,6 +1,6 @@ # Copyright (c) 2001-2004, Roger Dingledine # Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -# Copyright (c) 2007-2011, The Tor Project, Inc. +# Copyright (c) 2007-2015, The Tor Project, Inc. # See LICENSE for licensing information # "foreign" means we don't follow GNU package layout standards @@ -19,6 +19,7 @@ noinst_PROGRAMS= DISTCLEANFILES= bin_SCRIPTS= AM_CPPFLAGS= +AM_CFLAGS = @TOR_SYSTEMD_CFLAGS@ include src/include.am include doc/include.am include contrib/include.am @@ -70,8 +71,17 @@ test: all test-network: all ./src/test/test-network.sh +test-stem: $(TESTING_TOR_BINARY) + @if test -d "$$STEM_SOURCE_DIR"; then \ + "$$STEM_SOURCE_DIR"/run_tests.py --tor $(TESTING_TOR_BINARY) --all --log notice --target RUN_ALL; \ + else \ + echo '$$STEM_SOURCE_DIR was not set.'; echo; \ + echo "To run these tests, git clone https://git.torproject.org/stem.git/ ; export STEM_SOURCE_DIR=\`pwd\`/stem"; \ + fi + + reset-gcov: - rm -f src/*/*.gcda + rm -f src/*/*.gcda src/*/*/*.gcda HTML_COVER_DIR=./coverage_html coverage-html: all @@ -109,4 +119,4 @@ version: fi mostlyclean-local: - rm -f src/*/*.gc{da,no} + rm -f src/*/*.gc{da,no} src/*/*/*.gc{da,no} diff --git a/acinclude.m4 b/acinclude.m4 index 06f4b19e54..8782a3eeaa 100644 --- a/acinclude.m4 +++ b/acinclude.m4 @@ -2,7 +2,7 @@ dnl Helper macros for Tor configure.ac dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson dnl Copyright (c) 2007-2008, Roger Dingledine, Nick Mathewson -dnl Copyright (c) 2007-2014, The Tor Project, Inc. +dnl Copyright (c) 2007-2015, The Tor Project, Inc. dnl See LICENSE for licensing information AC_DEFUN([TOR_EXTEND_CODEPATH], diff --git a/changes/better_workqueues b/changes/better_workqueues new file mode 100644 index 0000000000..32c984cb71 --- /dev/null +++ b/changes/better_workqueues @@ -0,0 +1,10 @@ + o Major features: + - Refactor the CPU worker implementation for better performance by + avoiding the kernel and lengthening pipelines. The original + implementation used sockets to transfer data from the main thread + to the worker threads, and didn't allow any thread to be assigned + more than a single piece of work at once. The new implementation + avoids communications overhead by making requests in shared + memory, avoiding kernel IO where possible, and keeping more + request in flight at once. Resolves issue #9682. + diff --git a/changes/bug11791 b/changes/bug11791 new file mode 100644 index 0000000000..51a932743b --- /dev/null +++ b/changes/bug11791 @@ -0,0 +1,4 @@ + o Minor features (directory, memory usage): + - When we have recently been under memory pressure (over 3/4 of + MaxMemInQueues is allocated), then allocate smaller zlib objects for + small requests. Closes ticket 11791. diff --git a/changes/bug12485 b/changes/bug12485 new file mode 100644 index 0000000000..53ce33ef7b --- /dev/null +++ b/changes/bug12485 @@ -0,0 +1,4 @@ + o Minor features (Guard nodes): + - Reduce the time delay before saving guard status to disk from 10 + minute to 30 seconds (or from one hour to 10 minutes if + AvoidDiskWrites is set). Closes ticket 12485. diff --git a/changes/bug12509 b/changes/bug12509 new file mode 100644 index 0000000000..bb49bd5d7a --- /dev/null +++ b/changes/bug12509 @@ -0,0 +1,4 @@ + o Minor bugfixes (automapping): + - Prevent changes to other options from removing the wildcard value "." + from "AutomapHostsSuffixes". + Fixes bug 12509; bugfix on 0.2.0.1-alpha. diff --git a/changes/bug12585 b/changes/bug12585 new file mode 100644 index 0000000000..495a2f0d71 --- /dev/null +++ b/changes/bug12585 @@ -0,0 +1,9 @@ + o Major features (security) + - Implementation of SocksSocket option - SocksSocket implements a SOCKS + proxy reachable by Unix Domain Socket. This allows client applications to + communicate with Tor without having the ability to create AF_INET or + AF_INET6 family sockets. If an application has permission to create a socket + with AF_UNIX, it may directly communicate with Tor as if it were an other + SOCKS proxy. This should allow high risk applications to be entirely prevented + from connecting directly with TCP/IP, they will be able to only connect to the + internet through AF_UNIX and only through Tor. Closes ticket 12585. diff --git a/changes/bug12985 b/changes/bug12985 new file mode 100644 index 0000000000..636ae4d564 --- /dev/null +++ b/changes/bug12985 @@ -0,0 +1,5 @@ + o Minor bugfixes (shutdown): + - When shutting down, always call event_del() on lingering read or + write events before freeing them. Otherwise, we risk double-frees + or read-after-frees in event_base_free(). Fixes bug 12985; bugfix on + 0.1.0.2-rc. diff --git a/changes/bug13111-generate-keys-on-empty-file b/changes/bug13111-generate-keys-on-empty-file new file mode 100644 index 0000000000..1d602deb3e --- /dev/null +++ b/changes/bug13111-generate-keys-on-empty-file @@ -0,0 +1,20 @@ + o Minor bugfixes (file handling): + - Stop failing when key files are zero-length. Instead, generate new + keys, and overwrite the empty key files. + Fixes bug 13111; bugfix on all versions of Tor. Patch by "teor". + - Stop generating a fresh .old RSA key file when the .old file is + missing. Fixes part of 13111; bugfix on 0.0.6rc1. + - Avoid overwriting .old key files with empty key files. + + o Minor enhancements (file handling): + - Skip loading zero-length extra info store, router store, stats, state, + and key files. + + o Minor enhancements (testing): + - Test that tor does not fail when key files are zero-length. + Check that tor generates new keys, and overwrites the empty key files. + - Test that tor generates new keys when keys are missing (existing + behaviour). + - Test that tor does not overwrite key files that already contain data + (existing behaviour). + Tests bug 13111. Patch by "teor". diff --git a/changes/bug13214 b/changes/bug13214 deleted file mode 100644 index 5b9758b388..0000000000 --- a/changes/bug13214 +++ /dev/null @@ -1,7 +0,0 @@ - o Minor bugfixes (hidden services): - - When fetching hidden service descriptors, check not only for - whether we got the hidden service we had in mind, but also - whether we got the particular descriptors we wanted. This - prevents a class of inefficient but annoying DoS attacks by - hidden service directories. Fixes bug 13214; bugfix on - 0.2.1.6-alpha. Reported by "special". diff --git a/changes/bug13315 b/changes/bug13315 deleted file mode 100644 index c2ae5ff1f8..0000000000 --- a/changes/bug13315 +++ /dev/null @@ -1,5 +0,0 @@ - o Minor features: - - Validate hostnames in SOCKS5 requests more strictly. If SafeSocks - is enabled, reject requests with IP addresses as hostnames. Resolves - ticket 13315. - diff --git a/changes/bug13397 b/changes/bug13397 new file mode 100644 index 0000000000..502092801f --- /dev/null +++ b/changes/bug13397 @@ -0,0 +1,4 @@ + o Minor bugfixes: + - Avoid crashing when trying to reload a torrc specified as a relative + path with RunAsDaemon turned on. Fixes bug 13397; bugfix on + 0.2.3.11-alpha. diff --git a/changes/bug13399 b/changes/bug13399 deleted file mode 100644 index fcaf58a53c..0000000000 --- a/changes/bug13399 +++ /dev/null @@ -1,12 +0,0 @@ - o Minor bugfixes: - - Use a full 256 bits of the SHA256 digest of a microdescriptor when - computing which microdescriptors to download. This keeps us from - erroneous download behavior if two microdescriptor digests ever have - the same first 160 bits. Fixes part of bug 13399; bugfix on - 0.2.3.1-alpha. - - - Reset a router's status if its microdescriptor digest changes, - even if the first 160 bits remain the same. Fixes part of bug - 13399; bugfix on 0.2.3.1-alpha. - - diff --git a/changes/bug13399_part1 b/changes/bug13399_part1 deleted file mode 100644 index 2ad3f8d77e..0000000000 --- a/changes/bug13399_part1 +++ /dev/null @@ -1,3 +0,0 @@ - o Code simplifications and refactoring: - - Refactor our generic strmap and digestmap types into a single - implementation, so that we can add a new digest256map type trivially. diff --git a/changes/bug13401 b/changes/bug13401 new file mode 100644 index 0000000000..e2834a09d3 --- /dev/null +++ b/changes/bug13401 @@ -0,0 +1,7 @@ + o Minor features (testing networks): + - Drop the minimum RendPostPeriod on a testing network to 5 seconds, + and the default to 2 minutes. Closes ticket 13401. Patch by "nickm". + - Drop the MIN_REND_INITIAL_POST_DELAY on a testing network to 5 seconds, + but keep the default at 30 seconds. This reduces HS bootstrap time to + around 25 seconds. Change src/test/test-network.sh default time to match. + Closes ticket 13401. Patch by "teor". diff --git a/changes/bug13661 b/changes/bug13661 new file mode 100644 index 0000000000..7f0cb5e706 --- /dev/null +++ b/changes/bug13661 @@ -0,0 +1,6 @@ + o Minor bugfixes: + + - Support two-number and three-number version numbers correctly, in + case we change the Tor versioning system in the future. Fixes bug + 13661; bugfix on 0.0.8pre1. + diff --git a/changes/bug13678 b/changes/bug13678 deleted file mode 100644 index d71b88a003..0000000000 --- a/changes/bug13678 +++ /dev/null @@ -1,6 +0,0 @@ - - o Testing: - - In the unit tests, use 'chgrp' to change the group of the unit test - temporary directory to the current user, so that the sticky bit doesn't - interfere with tests that check directory groups. Closes 13678. - diff --git a/changes/bug13805 b/changes/bug13805 new file mode 100644 index 0000000000..321cd58958 --- /dev/null +++ b/changes/bug13805 @@ -0,0 +1,3 @@ + o Minor features (systemd): + - Various improvements and modernizations in systemd hardening support. + Closes ticket 13805. Patch from Craig Andrews. diff --git a/changes/bug13806 b/changes/bug13806 new file mode 100644 index 0000000000..0a6b268c02 --- /dev/null +++ b/changes/bug13806 @@ -0,0 +1,8 @@ + o Minor features (DOS resistance): + - Count the total number of bytes used storing hidden service descriptors + against the value of MaxMemInQueues. If we're low on memory, and more + than 20% of our memory is used holding hidden service descriptors, free + them until no more than 10% of our memory holds hidden service + descriptors. Free the least recently fetched descriptors first. + Resolves ticket 13806. + diff --git a/changes/bug13988 b/changes/bug13988 new file mode 100644 index 0000000000..e816335a3b --- /dev/null +++ b/changes/bug13988 @@ -0,0 +1,3 @@ + o Minor bugfixes (statistics): + - Increase period over which bandwidth observations are aggregated + from 15 minutes to 4 hours. Fixes bug 13988; bugfix on 0.0.8pre1. diff --git a/changes/bug14001-clang-warning b/changes/bug14001-clang-warning new file mode 100644 index 0000000000..5f8deb79b8 --- /dev/null +++ b/changes/bug14001-clang-warning @@ -0,0 +1,7 @@ + o Minor bugfixes: + - The address of an array in the middle of a structure will + always be non-NULL. clang recognises this and complains. + Disable the tautologous and redundant check to silence + this warning. + Fixes bug 14001; bugfix on 0.2.1.2-alpha. + diff --git a/changes/bug14067-TestingDirAuthVoteHSDir b/changes/bug14067-TestingDirAuthVoteHSDir new file mode 100644 index 0000000000..c276e22f49 --- /dev/null +++ b/changes/bug14067-TestingDirAuthVoteHSDir @@ -0,0 +1,6 @@ + o Minor features (authorities, testing): + - Create TestingDirAuthVoteHSDir like TestingDirAuthVoteExit/Guard. + Ensures that authorities vote the HSDir flag for the listed + relays regardless of uptime or ORPort connectivity. + Respects the value of VoteOnHidServDirectoriesV2. + Partial implementation for ticket 14067. Patch by "teor". diff --git a/changes/bug14072 b/changes/bug14072 new file mode 100644 index 0000000000..c810616cc0 --- /dev/null +++ b/changes/bug14072 @@ -0,0 +1,3 @@ + o Minor bugfixes (build): + - Avoid warnings when building with systemd 209 or later. + Fixes bug 14072; bugfix on 0.2.6.2-alpha. Patch from "h.venev". diff --git a/changes/bug14084 b/changes/bug14084 new file mode 100644 index 0000000000..c7f053e16e --- /dev/null +++ b/changes/bug14084 @@ -0,0 +1,6 @@ + o Minor features: + - New option "HiddenServiceAllowUnknownPorts" to allow hidden + services to disable the anti-scanning feature introduced in + 0.2.6.2-alpha. With this option not set, a connection to an + unlisted port closes the circuit. With this option set, only a + RELAY_DONE cell is sent. Closes ticket #14084.
\ No newline at end of file diff --git a/changes/bug14090 b/changes/bug14090 new file mode 100644 index 0000000000..d6a6df4860 --- /dev/null +++ b/changes/bug14090 @@ -0,0 +1,4 @@ + o Minor bugfixes: + - Avoid undefined behavior when sampling huge values from the + Laplace distribution. This made unittests fail on Raspberry Pi. + Bug found by Device. Fixes bug 14090; bugfix on 0.2.6.2-alpha. diff --git a/changes/bug14106 b/changes/bug14106 new file mode 100644 index 0000000000..cf6e568dcc --- /dev/null +++ b/changes/bug14106 @@ -0,0 +1,4 @@ + o Minor bugfixes (hidden services): + - Successfully launch Tor with a nonexistent hidden service directory. + Our fix for bug 13942 didn't catch this case. Fixes bug 14106; + bugfix on 0.2.6.2-alpha. diff --git a/changes/bug14116_025 b/changes/bug14116_025 new file mode 100644 index 0000000000..0859f626a5 --- /dev/null +++ b/changes/bug14116_025 @@ -0,0 +1,3 @@ + o Minor bugfixes (controller): + - Avoid crashing on a malformed EXTENDCIRCUIT command. Fixes bug 14116; + bugfix on 0.2.2.9-alpha. diff --git a/changes/bug14123 b/changes/bug14123 new file mode 100644 index 0000000000..1220a044a6 --- /dev/null +++ b/changes/bug14123 @@ -0,0 +1,4 @@ + o Minor bugfixes (small memory leaks): + - Avoid leaking memory when using IPv6 virtual address mappings. + Fixes bug 14123; bugfix on 0.2.4.7-alpha. Patch by Tom van der + Woerdt.
\ No newline at end of file diff --git a/changes/bug14125 b/changes/bug14125 new file mode 100644 index 0000000000..d8df37d337 --- /dev/null +++ b/changes/bug14125 @@ -0,0 +1,5 @@ + o Minor bugfixes (dirauth): + - Enlarge the buffer to read bw-auth generated files to avoid an + issue when parsing the file in dirserv_read_measured_bandwidths(). + Fixes bug 14125; bugfix on 0.2.2.1-alpha. + diff --git a/changes/bug14129 b/changes/bug14129 new file mode 100644 index 0000000000..6153cd84fd --- /dev/null +++ b/changes/bug14129 @@ -0,0 +1,7 @@ + o Major bugfixes (exit node stability): + + - Fix an assertion failure that could occur under high DNS load. Fixes + bug 14129; bugfix on Tor 0.0.7rc1. Found by "jowr"; diagnosed and fixed + by "cypherpunks". + + diff --git a/changes/bug14141 b/changes/bug14141 new file mode 100644 index 0000000000..75cdcd5f3a --- /dev/null +++ b/changes/bug14141 @@ -0,0 +1,11 @@ + o Minor bugfixes (systemd support): + - Fix detection and operation of systemd watchdog. Fixes part of + bug 14141; bugfix on 0.2.6.2-alpha. Patch from Tomasz Torcz. + + - Run correctly under systemd with the RunAsDaemon option set. + Fixes part of bug 14141; bugfix on 0.2.5.7-rc. Patch from Tomasz + Torcz. + + o Minor featurs (systemd support): + - Inform the systemd supervisor about more changes in the Tor process + status. Implements part of ticket 14141. Patch from Tomasz Torcz.
\ No newline at end of file diff --git a/changes/bug14142-parse-virtual-addr b/changes/bug14142-parse-virtual-addr new file mode 100644 index 0000000000..ee635456ae --- /dev/null +++ b/changes/bug14142-parse-virtual-addr @@ -0,0 +1,7 @@ + o Minor bugfixes (client): + - Check for a missing option value in parse_virtual_addr_network + before asserting on the NULL in tor_addr_parse_mask_ports. + This avoids crashing on torrc lines like + Vi[rtualAddrNetworkIPv[4|6]] when no value follows the option. + Fixes bug 14142; bugfix on 0.2.4.7-alpha. + Patch by "teor". diff --git a/changes/bug14149 b/changes/bug14149 new file mode 100644 index 0000000000..d655a14354 --- /dev/null +++ b/changes/bug14149 @@ -0,0 +1,4 @@ + o Minor features (hidden service parameters): + - Make hidden service Sybil attacks harder by changing the minimum + time required to become an HSDir from 25 hours up to 96 hours. + Addresses ticket #14149.
\ No newline at end of file diff --git a/changes/bug14193 b/changes/bug14193 new file mode 100644 index 0000000000..a7006685f5 --- /dev/null +++ b/changes/bug14193 @@ -0,0 +1,4 @@ + o Minor bugfixes (client DNS): + - Report the correct cached DNS expiration times. Previously, we + would report everything as "never expires." Fixes bug 14193; + bugfix on 0.2.3.17-beta. diff --git a/changes/bug14195 b/changes/bug14195 new file mode 100644 index 0000000000..d2b82f31b0 --- /dev/null +++ b/changes/bug14195 @@ -0,0 +1,3 @@ + o Minor bugfixes (client): + - Fix a memory leak when using AutomapHostsOnResolve. + Fixes bug 14195; bugfix on 0.1.0.1-rc. diff --git a/changes/bug14207 b/changes/bug14207 new file mode 100644 index 0000000000..b382f82519 --- /dev/null +++ b/changes/bug14207 @@ -0,0 +1,3 @@ + o Minor bugfixes (controller): + - Add a code for the END_CIRC_REASON_IP_NOW_REDUNDANT circuit close + reason. Fixes bug 14207; bugfix on 0.2.6.2-alpha. diff --git a/changes/bug14215 b/changes/bug14215 new file mode 100644 index 0000000000..70bcdaaefc --- /dev/null +++ b/changes/bug14215 @@ -0,0 +1,5 @@ + o Minor bugfixes (tests): + - Make the checkdir/perms test complete successfully even if the + global umask is not 022. Fixes bug 14215; bugfix on 0.2.6.2-alpha. + + diff --git a/changes/bug14219 b/changes/bug14219 new file mode 100644 index 0000000000..9d845db94e --- /dev/null +++ b/changes/bug14219 @@ -0,0 +1,6 @@ + o Minor bugfixes (hidden services): + + - When fetching a hidden service descriptor for a down service that we + recently up, do not keep refetching until we try the same replica twice + in a row. Fixes bug 14219; bugfix on 0.2.0.10-alpha. + diff --git a/changes/bug14220 b/changes/bug14220 new file mode 100644 index 0000000000..51cfa502bc --- /dev/null +++ b/changes/bug14220 @@ -0,0 +1,4 @@ + o Minor bugfixes (compilation): + - Build without warnings with the stock OpenSSL srtp.h header, + which has a duplicate declaration of SSL_get_selected_srtp_profile(). + Fixes bug 14220; this is OpenSSL's bug, not ours. diff --git a/changes/bug14224 b/changes/bug14224 new file mode 100644 index 0000000000..031b000520 --- /dev/null +++ b/changes/bug14224 @@ -0,0 +1,7 @@ + o Minor Bugfix + - Close the intro circuit once we don't have any more usable intro + points instead of making it timeout at some point. This also make sure + no extra HS descriptor fetch is triggered. + Fixes bug 14224; bugfix on 0.0.6. + + diff --git a/changes/bug14259 b/changes/bug14259 new file mode 100644 index 0000000000..1b5b9b80b3 --- /dev/null +++ b/changes/bug14259 @@ -0,0 +1,6 @@ + o Minor bugfixes (client): + - Avoid a small memory leak when we find a cached answer for a reverse + DNS lookup in a client-side DNS cache. (Remember, client-side DNS + caching is off by default, and is not recommended.) Fixes bug 14259; + bugfix on 0.2.0.1-alpha. + diff --git a/changes/bug14261 b/changes/bug14261 new file mode 100644 index 0000000000..8ab556c0be --- /dev/null +++ b/changes/bug14261 @@ -0,0 +1,5 @@ + o Minor bugfixes (directory authority): + - Allow directory authorities to fetch more data from one + another if they find themselves missing lots of votes. + Previously, they had been bumping against the 10 MB queued + data limit. Fixes bug 14261; bugfix on 0.1.2.5-alpha. diff --git a/changes/bug14280 b/changes/bug14280 new file mode 100644 index 0000000000..917d40c34c --- /dev/null +++ b/changes/bug14280 @@ -0,0 +1,5 @@ + o Minor bugfixes: + - Reject socks requests to literal IPv6 addresses when IPv6Traffic + flag is not set; and not because the NoIPv4Traffic flag was set. + Previously we'd looked at the NoIPv4Traffic flag for both types + of literal addresses. Fixes bug 14280; bugfix on 0.2.4.7-alpha. diff --git a/changes/bug14350 b/changes/bug14350 new file mode 100644 index 0000000000..8b85798d46 --- /dev/null +++ b/changes/bug14350 @@ -0,0 +1,4 @@ + o Minor bugfixes: + - Cause the "--disable-systemd" option to actually disable systemd + support. Fixes bug 14350; bugfix on 0.2.6.2-alpha. Patch from + "blueness".
\ No newline at end of file diff --git a/changes/bug7555 b/changes/bug7555 new file mode 100644 index 0000000000..a43ff739cb --- /dev/null +++ b/changes/bug7555 @@ -0,0 +1,5 @@ + o Major bugfixes (client): + - Allow MapAddress and AutomapHostsOnResolve to work together when an + address is mapped into another address type that must be + automapped at resolve time. Fixes bug 7555; bugfix on + 0.2.0.1-alpha. diff --git a/changes/bug8546 b/changes/bug8546 new file mode 100644 index 0000000000..9e79b4f50c --- /dev/null +++ b/changes/bug8546 @@ -0,0 +1,6 @@ + o Code simplification and refactoring: + - Move fields related to isolating and configuring client ports + into a shared structure. Previously, they were duplicated across + port_cfg_t, listener_connection_t, and edge_connection_t. + Failure to copy one of them correctly had been the cause of at + least one bug in the past. Closes ticket 8546. diff --git a/changes/bug9286 b/changes/bug9286 new file mode 100644 index 0000000000..062a7a03f3 --- /dev/null +++ b/changes/bug9286 @@ -0,0 +1,4 @@ + o Minor bugfixes (parsing): + - Stop accepting milliseconds (or other junk) at the end of + descriptor publication times. Fixes bug 9286; bugfix on + 0.0.2pre25.
\ No newline at end of file diff --git a/changes/bug9819 b/changes/bug9819 new file mode 100644 index 0000000000..7220d2af1c --- /dev/null +++ b/changes/bug9819 @@ -0,0 +1,8 @@ + o Major bugfixes (mixed relay-client operation): + + - When running as a relay and a client at the same time (not + recommended), if we decide not to use a new guard because we + want to retry older guards, only close the locally-originating + circuits passing through that guard. Previously we would close + all the circuits. Fixes bug 9819; bugfix on + 0.2.1.1-alpha. Reported by "skruffy". diff --git a/changes/doc13381 b/changes/doc13381 deleted file mode 100644 index acc4bb8a0f..0000000000 --- a/changes/doc13381 +++ /dev/null @@ -1,5 +0,0 @@ - o Documentation: - - Stop suggesting that users specify nodes by nickname: it isn't a - good idea. Also, properly cross-reference how to specify nodes - in all parts of the manual for options that take a list of - nodes. Closes ticket 13381. diff --git a/changes/doc13702 b/changes/doc13702 new file mode 100644 index 0000000000..917dca3f57 --- /dev/null +++ b/changes/doc13702 @@ -0,0 +1,4 @@ + o Documentation: + - Adding section on OpenBSD to our TUNING document. Thanks to + mmcc for writing the OpenBSD-specific tips. Resolves ticket + 13702. diff --git a/changes/feature10067 b/changes/feature10067 new file mode 100644 index 0000000000..3a387d0497 --- /dev/null +++ b/changes/feature10067 @@ -0,0 +1,12 @@ + o Major features (changed defaults): + - Prevent relay operators from unintentionally running exits: When + a relay is configured as an exit node, we now warn the user + unless the 'ExitRelay' option is set to 1. We warn even more + loudly if the relay is configured with the default exit policy, + since this tends to indicate accidental misconfiguration. + Setting 'ExitRelay' to 0 stops Tor from running as an exit relay. + Closes ticket 10067. + + o Removed features: + - To avoid confusion with the 'ExitRelay' option, 'ExitNode' is no + longer silently accepted as an alias for 'ExitNodes'. diff --git a/changes/feature14015 b/changes/feature14015 new file mode 100644 index 0000000000..bd09b49008 --- /dev/null +++ b/changes/feature14015 @@ -0,0 +1,3 @@ + o Minor features (logging, hidden services): + - Elevate authorized-client message from DEBUG to INFO. Closes + ticket 14015. diff --git a/changes/feature8405 b/changes/feature8405 new file mode 100644 index 0000000000..ac4a36133b --- /dev/null +++ b/changes/feature8405 @@ -0,0 +1,4 @@ + o Minor features (controller): + - Include SOCKS_USERNAME and SOCKS_PASSWORD values in controller + events to let controllers observe circuit isolation inputs. + Closes ticket 8405. diff --git a/changes/fix-test-cmdline-args b/changes/fix-test-cmdline-args new file mode 100644 index 0000000000..6902d19b27 --- /dev/null +++ b/changes/fix-test-cmdline-args @@ -0,0 +1,4 @@ + o Testing: + - Make the test_cmdline_args.py script work correctly on Windows. + Patch from Gisle Vanem. +
\ No newline at end of file diff --git a/changes/geoip-january2015 b/changes/geoip-january2015 new file mode 100644 index 0000000000..67324f27f2 --- /dev/null +++ b/changes/geoip-january2015 @@ -0,0 +1,3 @@ + o Minor features: + - Update geoip to the January 7 2015 Maxmind GeoLite2 Country database. + diff --git a/changes/geoip6-january2015 b/changes/geoip6-january2015 new file mode 100644 index 0000000000..b86fe2be57 --- /dev/null +++ b/changes/geoip6-january2015 @@ -0,0 +1,2 @@ + o Minor features: + - Update geoip6 to the January 7 2015 Maxmind GeoLite2 Country database. diff --git a/changes/remove-bad-fp b/changes/remove-bad-fp new file mode 100644 index 0000000000..190013dc7d --- /dev/null +++ b/changes/remove-bad-fp @@ -0,0 +1,3 @@ + o Removed features: + - Remove a test for a long-defunct broken version-one directory server. + diff --git a/changes/spurious-clang-warnings b/changes/spurious-clang-warnings deleted file mode 100644 index d039920476..0000000000 --- a/changes/spurious-clang-warnings +++ /dev/null @@ -1,10 +0,0 @@ - o Minor bugfixes: - - Silence clang warnings under --enable-expensive-hardening, including: - + implicit truncation of 64 bit values to 32 bit; - + const char assignment to self; - + tautological compare; and - + additional parentheses around equality tests. (gcc uses these to - silence assignment, so clang warns when they're present in an - equality test. But we need to use extra parentheses in macros to - isolate them from other code). - Fixes bug 13577. diff --git a/changes/ticket-11291 b/changes/ticket-11291 deleted file mode 100644 index 4c19f3cd0e..0000000000 --- a/changes/ticket-11291 +++ /dev/null @@ -1,4 +0,0 @@ - o Minor features (hidden services): - - New HiddenServiceDirGroupReadable option to cause hidden service - directories and hostname files to be created group-readable. - Patch from "anon", David Stainton, and "meejah". diff --git a/changes/ticket11485 b/changes/ticket11485 new file mode 100644 index 0000000000..9d341c57ab --- /dev/null +++ b/changes/ticket11485 @@ -0,0 +1,3 @@ + o Features (hidden services): + - Support mapping hidden service virtual ports to AF_UNIX sockets on + suitable platforms. Resolves ticket #11485. diff --git a/changes/ticket12376_part2 b/changes/ticket12376_part2 new file mode 100644 index 0000000000..13f9bb54dc --- /dev/null +++ b/changes/ticket12376_part2 @@ -0,0 +1,11 @@ + o Major refactoring: + - Refactor the get_interface_addresses_raw() Doom-function into + multiple smaller and easier to understand subfunctions. Cover the + resulting subfunctions with unit-tests. Fixes a significant portion + of issue 12376. + + o Minor bugfixes: + - Fix the ioctl()-based network interface lookup code so that it will + work on systems that have variable-length struct ifreq, for example + Mac OS X. + diff --git a/changes/ticket13037 b/changes/ticket13037 new file mode 100644 index 0000000000..24c4100454 --- /dev/null +++ b/changes/ticket13037 @@ -0,0 +1,4 @@ + o Minor features (build): + - New --disable-system-torrc compile-time option to prevent Tor from + looking for a system-wide torrc or torrc-defaults tile. Resolves + ticket 13037. diff --git a/changes/ticket13243 b/changes/ticket13243 new file mode 100644 index 0000000000..ad6e4de505 --- /dev/null +++ b/changes/ticket13243 @@ -0,0 +1,3 @@ + o Testing: + - Move the slower unit tests into a new "./src/test/test-slow" binary + that can be run independently of the other tests. Closes ticket 13243. diff --git a/changes/ticket13762 b/changes/ticket13762 new file mode 100644 index 0000000000..0c1a568cc3 --- /dev/null +++ b/changes/ticket13762 @@ -0,0 +1,5 @@ + o Minor features: + - Suppress "router info incompatible with extra info" message when + reading extrainfo documents from cache. (This message got loud + around when we closed bug 9812 in 0.2.6.2-alpha.) Closes ticket + 13762. diff --git a/changes/ticket14107 b/changes/ticket14107 new file mode 100644 index 0000000000..e4ba6becb3 --- /dev/null +++ b/changes/ticket14107 @@ -0,0 +1,6 @@ + o Testing: + + - New "make test-stem" target to run stem integration tests. + Requires that the "STEM_SOURCE_DIR" environment variable be set. + Closes ticket 14107. + diff --git a/changes/ticket14128 b/changes/ticket14128 new file mode 100644 index 0000000000..38b25fa7dc --- /dev/null +++ b/changes/ticket14128 @@ -0,0 +1,5 @@ + o Minor features (controller): + - New "GETINFO bw-event-cache" to get information about recent bandwidth + events. Closes ticket 14128. Useful for controllers to get recent + bandwidth history after the fix for 13988. + diff --git a/changes/ticket14325 b/changes/ticket14325 new file mode 100644 index 0000000000..38daa05aab --- /dev/null +++ b/changes/ticket14325 @@ -0,0 +1,5 @@ + o Documentation fixes: + - Make the tor-resolve documentation match its help string and its + options. Resolves part of ticket 14325. + - Log a more useful error message from tor-resolve when failing to + look up a hidden service address. Resolves part of ticket 14325. diff --git a/changes/ticket9969 b/changes/ticket9969 new file mode 100644 index 0000000000..c208e26c1c --- /dev/null +++ b/changes/ticket9969 @@ -0,0 +1,8 @@ + o Minor features (directory client): + - When downloading server- or microdescriptors from a directory server, + we no longer launch multiple simultaneous requests to the same server. + This reduces load on the directory servers, especially when directory + guards are in use. Closes ticket 9969. + - When downloading server- or microdescriptors over a tunneled + connection, do not limit the length of our request to what the Squid + proxy is willing to handle. Part of ticket 9969. diff --git a/changes/tickets6456 b/changes/tickets6456 deleted file mode 100644 index 68ce2c7dd9..0000000000 --- a/changes/tickets6456 +++ /dev/null @@ -1,6 +0,0 @@ - o Code simplification and refactoring: - - Combine the functions used to parse ClientTransportPlugin and - ServerTransportPlugin into a single function. Closes ticket 6456. - - o Testing: - - New tests for parse_transport_line(). Part of ticket 6456. diff --git a/configure.ac b/configure.ac index e7560b2bfc..af16edfe49 100644 --- a/configure.ac +++ b/configure.ac @@ -1,9 +1,9 @@ dnl Copyright (c) 2001-2004, Roger Dingledine dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson -dnl Copyright (c) 2007-2014, The Tor Project, Inc. +dnl Copyright (c) 2007-2015, The Tor Project, Inc. dnl See LICENSE for licensing information -AC_INIT([tor],[0.2.6.1-alpha-dev]) +AC_INIT([tor],[0.2.6.2-alpha-dev]) AC_CONFIG_SRCDIR([src/or/main.c]) AC_CONFIG_MACRO_DIR([m4]) AM_INIT_AUTOMAKE @@ -12,6 +12,8 @@ AC_CONFIG_HEADERS([orconfig.h]) AC_CANONICAL_HOST +PKG_PROG_PKG_CONFIG + if test -f /etc/redhat-release ; then if test -f /usr/kerberos/include ; then CPPFLAGS="$CPPFLAGS -I/usr/kerberos/include" @@ -43,6 +45,8 @@ AC_ARG_ENABLE(unittests, AS_HELP_STRING(--disable-unittests, [Don't build unit tests for Tor. Risky!])) AC_ARG_ENABLE(coverage, AS_HELP_STRING(--enable-coverage, [Enable coverage support in the unit-test build])) +AC_ARG_ENABLE(system-torrc, + AS_HELP_STRING(--disable-system-torrc, [Don't look for a system-wide torrc file])) AM_CONDITIONAL(UNITTESTS_ENABLED, test x$enable_unittests != xno) AM_CONDITIONAL(COVERAGE_ENABLED, test x$enable_coverage = xyes) @@ -54,6 +58,11 @@ if test "$enable_static_tor" = "yes"; then CFLAGS="$CFLAGS -static" fi +if test "$enable_system_torrc" = "no"; then + AC_DEFINE(DISABLE_SYSTEM_TORRC, 1, + [Defined if we're not going to look for a torrc in SYSCONF]) +fi + if test x$enable_buf_freelists = xyes; then AC_DEFINE(ENABLE_BUF_FREELISTS, 1, [Defined if we try to use freelists for buffer RAM chunks]) @@ -105,6 +114,64 @@ AC_ARG_ENABLE(upnp, * ) AC_MSG_ERROR(bad value for --enable-upnp) ;; esac], [upnp=false]) +# systemd notify support +AC_ARG_ENABLE(systemd, + AS_HELP_STRING(--enable-systemd, enable systemd notification support), + [case "${enableval}" in + yes) systemd=true ;; + no) systemd=false ;; + * ) AC_MSG_ERROR(bad value for --enable-systemd) ;; + esac], [systemd=auto]) + + + +# systemd support +if test x$enable_systemd = xno ; then + have_systemd=no; +else + PKG_CHECK_MODULES(SYSTEMD, + [libsystemd-daemon], + have_systemd=yes, + have_systemd=no) + if test x$have_systemd=xno; then + AC_MSG_NOTICE([Okay, checking for systemd a different way...]) + PKG_CHECK_MODULES(SYSTEMD, + [libsystemd], + have_systemd=yes, + have_systemd=no) + fi +fi + +if test x$have_systemd = xyes; then + AC_DEFINE(HAVE_SYSTEMD,1,[Have systemd]) + TOR_SYSTEMD_CFLAGS="${SYSTEMD_CFLAGS}" + TOR_SYSTEMD_LIBS="${SYSTEMD_LIBS}" + PKG_CHECK_MODULES(SYSTEMD209, [systemd >= 209], + [AC_DEFINE(HAVE_SYSTEMD_209,1,[Have systemd v209 or more])], []) +fi +AC_SUBST(TOR_SYSTEMD_CFLAGS) +AC_SUBST(TOR_SYSTEMD_LIBS) + +if test x$enable_systemd = xyes -a x$have_systemd != xyes ; then + AC_MSG_ERROR([Explicitly requested systemd support, but systemd not found]) +fi + +AC_ARG_ENABLE(threads, + AS_HELP_STRING(--disable-threads, disable multi-threading support)) + +if test x$enable_threads = x; then + case $host in + *-*-solaris* ) + # Don't try multithreading on solaris -- cpuworkers seem to lock. + AC_MSG_NOTICE([You are running Solaris; Sometimes threading makes +cpu workers lock up here, so I will disable threads.]) + enable_threads="no";; + *) + enable_threads="yes";; + esac +fi + + case $host in *-*-solaris* ) AC_DEFINE(_REENTRANT, 1, [Define on some platforms to activate x_r() functions in time.h]) @@ -333,6 +400,10 @@ fi AC_SEARCH_LIBS(pthread_create, [pthread]) AC_SEARCH_LIBS(pthread_detach, [pthread]) +AM_CONDITIONAL(THREADS_WIN32, test "$enable_threads" = "yes" && test "$bwin32" = "true") +AM_CONDITIONAL(THREADS_PTHREADS, test "$enable_threads" = "yes" && test "$bwin32" = "false") +AM_CONDITIONAL(THREADS_NONE, test "$enable_threads" != "yes") + dnl ------------------------------------------------------------------- dnl Check for functions before libevent, since libevent-1.2 apparently dnl exports strlcpy without defining it in a header. @@ -343,6 +414,7 @@ AC_CHECK_FUNCS( backtrace \ backtrace_symbols_fd \ clock_gettime \ + eventfd \ flock \ ftime \ getaddrinfo \ @@ -357,6 +429,8 @@ AC_CHECK_FUNCS( localtime_r \ lround \ memmem \ + pipe \ + pipe2 \ prctl \ rint \ sigaction \ @@ -370,7 +444,7 @@ AC_CHECK_FUNCS( sysconf \ sysctl \ uname \ - usleep \ + usleep \ vasprintf \ _vscprintf ) @@ -618,7 +692,7 @@ dnl since sometimes the linker will like an option but not be willing to dnl use it with a build of a library. all_ldflags_for_check="$TOR_LDFLAGS_zlib $TOR_LDFLAGS_openssl $TOR_LDFLAGS_libevent" -all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI" +all_libs_for_check="$TOR_ZLIB_LIBS $TOR_LIB_MATH $TOR_LIBEVENT_LIBS $TOR_OPENSSL_LIBS $TOR_SYSTEMD_LIBS $TOR_LIB_WS32 $TOR_LIB_GDI" AC_COMPILE_IFELSE([AC_LANG_PROGRAM([], [ #if !defined(__clang__) @@ -898,6 +972,7 @@ AC_CHECK_HEADERS( netinet/in6.h \ pwd.h \ stdint.h \ + sys/eventfd.h \ sys/file.h \ sys/ioctl.h \ sys/limits.h \ @@ -937,6 +1012,14 @@ AC_CHECK_HEADERS(net/pfvar.h, net_pfvar_found=1, net_pfvar_found=0, #ifdef HAVE_NET_IF_H #include <net/if.h> #endif]) + +AC_CHECK_HEADERS(linux/if.h,[],[], +[ +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +]) + AC_CHECK_HEADERS(linux/netfilter_ipv4.h, linux_netfilter_ipv4=1, linux_netfilter_ipv4=0, [#ifdef HAVE_SYS_TYPES_H @@ -958,6 +1041,30 @@ AC_CHECK_HEADERS(linux/netfilter_ipv4.h, #include <netinet/in.h> #endif]) +AC_CHECK_HEADERS(linux/netfilter_ipv6/ip6_tables.h, + linux_netfilter_ipv6_ip6_tables=1, linux_netfilter_ipv6_ip6_tables=0, +[#ifdef HAVE_SYS_TYPES_H +#include <sys/types.h> +#endif +#ifdef HAVE_SYS_SOCKET_H +#include <sys/socket.h> +#endif +#ifdef HAVE_LIMITS_H +#include <limits.h> +#endif +#ifdef HAVE_LINUX_TYPES_H +#include <linux/types.h> +#endif +#ifdef HAVE_NETINET_IN6_H +#include <netinet/in6.h> +#endif +#ifdef HAVE_NETINET_IN_H +#include <netinet/in.h> +#endif +#ifdef HAVE_LINUX_IF_H +#include <linux/if.h> +#endif]) + if test x$transparent = xtrue ; then transparent_ok=0 if test x$net_if_found = x1 && test x$net_pfvar_found = x1 ; then @@ -966,6 +1073,9 @@ if test x$transparent = xtrue ; then if test x$linux_netfilter_ipv4 = x1 ; then transparent_ok=1 fi + if test x$linux_netfilter_ipv6_ip6_tables = x1 ; then + transparent_ok=1 + fi if test x$transparent_ok = x1 ; then AC_DEFINE(USE_TRANSPARENT, 1, "Define to enable transparent proxy support") case $host in @@ -1456,8 +1566,7 @@ if test "$GCC" = yes; then # accident waiting to happen. CFLAGS="$CFLAGS -Wall -fno-strict-aliasing" else - # Autoconf sets -g -O2 by default. Override optimization level - # for non-gcc compilers + # Override optimization level for non-gcc compilers CFLAGS="$CFLAGS -O" enable_gcc_warnings=no enable_gcc_warnings_advisory=no diff --git a/contrib/dist/tor.service.in b/contrib/dist/tor.service.in index 57409a7b0a..c251158d9a 100644 --- a/contrib/dist/tor.service.in +++ b/contrib/dist/tor.service.in @@ -3,27 +3,27 @@ Description = Anonymizing overlay network for TCP After = syslog.target network.target nss-lookup.target [Service] -Type = simple +Type = notify +NotifyAccess = all ExecStartPre = @BINDIR@/tor -f @CONFDIR@/torrc --verify-config -# A torrc that has "RunAsDaemon 1" won't work with the "simple" service type; -# let's explicitly override it. -ExecStart = @BINDIR@/tor -f @CONFDIR@/torrc --RunAsDaemon 0 +ExecStart = @BINDIR@/tor -f @CONFDIR@/torrc ExecReload = /bin/kill -HUP ${MAINPID} KillSignal = SIGINT TimeoutSec = 30 Restart = on-failure +WatchdogSec = 1m LimitNOFILE = 32768 # Hardening PrivateTmp = yes -DeviceAllow = /dev/null rw -DeviceAllow = /dev/urandom r -InaccessibleDirectories = /home +PrivateDevices = yes +ProtectHome = yes +ProtectSystem = full ReadOnlyDirectories = / -ReadWriteDirectories = @LOCALSTATEDIR@/lib/tor -ReadWriteDirectories = @LOCALSTATEDIR@/log/tor -ReadWriteDirectories = @LOCALSTATEDIR@/run/tor +ReadWriteDirectories = -@LOCALSTATEDIR@/lib/tor +ReadWriteDirectories = -@LOCALSTATEDIR@/log/tor NoNewPrivileges = yes +CapabilityBoundingSet = CAP_SETUID CAP_SETGID CAP_NET_BIND_SERVICE [Install] WantedBy = multi-user.target diff --git a/contrib/win32build/tor-mingw.nsi.in b/contrib/win32build/tor-mingw.nsi.in index d675c2cc09..df1a46536c 100644 --- a/contrib/win32build/tor-mingw.nsi.in +++ b/contrib/win32build/tor-mingw.nsi.in @@ -8,7 +8,7 @@ !include "LogicLib.nsh" !include "FileFunc.nsh" !insertmacro GetParameters -!define VERSION "0.2.6.1-alpha-dev" +!define VERSION "0.2.6.2-alpha-dev" !define INSTALLER "tor-${VERSION}-win32.exe" !define WEBSITE "https://www.torproject.org/" !define LICENSE "LICENSE" diff --git a/doc/TUNING b/doc/TUNING index a4bf386dd6..90bd120aa1 100644 --- a/doc/TUNING +++ b/doc/TUNING @@ -35,6 +35,66 @@ when it launches tor service (see launchd.plist(5) manpage). Also, kern.ipc.maxsockets is determined dynamically by the system and thus is read-only on OS X. +OpenBSD +------- + +For recent versions of OpenBSD (5.5 and 5.6, and probably older releases +as well), the maximum number of file descriptors that can be opened is +7030: + +http://unix.stackexchange.com/questions/104929/does-openbsd-have-a-limit-to-the-number-of-file-descriptors/104948#104948 + +The maximum number of file descriptors that an OpenBSD machine can have +open is stored in the sysctl variable kern.maxfiles. This value defaults +to 7030 - to verify this, run sysctl kern.maxfiles. + +To immediately change a running system's file descriptor limit to, for +example, 20,000 files, run sudo sysctl kern.maxfiles=20000. All sysctl +variables are reset upon reboot using defaults and /etc/sysctl.conf, so +to make your change permanent you must add the line kern.maxfiles=20000 +to /etc/sysctl.conf. + +One can also change a maximum number of allowed file descriptors for Tor +daemon alone by editing /etc/rc.d/tor and adding the following lines: + +tor:\ + :openfiles-max=8192:\ + :tc=daemon: + +However, there are stricter limits set on users. This is a security +feature intended to prevent one user from choking out others by opening +all possible file descriptors. + +The stricter limits are set in /etc/login.conf. This config file sets +resource access rules for user classes. You should be running +Tor as a non-privileged daemon user '_tor', which belongs to the 'daemon' +class. It will therefore be subject to the 'default' and 'daemon' rules. +There are two relevant rules: openfiles-cur and openfiles-max. The prior +is the initial limit upon login - the soft limit. The latter is the maximum +limit that can be set using 'ulimit -n' or setrlimit() without editing +/etc/login.conf and rebooting. This is known as the hard limit. + +Without editing /etc/login.conf, daemon-owned processes have +soft limit of 512 open files and a hard limit of 1024 open files. +Tor can increase the soft limit as needed, so you will therefore +eventually get warnings about running out of available file descriptors +once Tor reaches ~1024 open files. + +To increase the hard limit, add the following line to the daemon class +rules in /etc/login.conf: + +tor:\ + :openfiles-max=8192:\ + :tc=daemon: + +Upon restarting the machine, Tor will be able to open up to 6500 file +descriptors. + +Be aware that, by doing this, you are bypassing a security and stability +feature of the OS. If you are running your relay on a weak or old system, +watch your system load to ensure that it can handle this many open files. +Also, Tor may interfere with any other programs that open many files. + Disclaimer ---------- diff --git a/doc/tor-resolve.1.txt b/doc/tor-resolve.1.txt index 341d302244..30e16d5daa 100644 --- a/doc/tor-resolve.1.txt +++ b/doc/tor-resolve.1.txt @@ -14,7 +14,7 @@ tor-resolve - resolve a hostname to an IP address via tor SYNOPSIS -------- -**tor-resolve** [-4|-5] [-v] [-x] __hostname__ [__sockshost__[:__socksport__]] +**tor-resolve** [-4|-5] [-v] [-x] [-p __socksport__] __hostname__ [__sockshost__[:__socksport__]] DESCRIPTION ----------- @@ -40,6 +40,9 @@ OPTIONS Use the SOCKS4a protocol rather than the default SOCKS5 protocol. Doesn't support reverse DNS. +**-p** __socksport__:: + Override the default SOCKS port without setting the hostname. + SEE ALSO -------- **tor**(1), **torify**(1). + diff --git a/doc/tor.1.txt b/doc/tor.1.txt index 1c3be8c9c7..5302b33bd1 100644 --- a/doc/tor.1.txt +++ b/doc/tor.1.txt @@ -294,7 +294,7 @@ GENERAL OPTIONS [[ControlSocket]] **ControlSocket** __Path__:: Like ControlPort, but listens on a Unix domain socket, rather than a TCP - socket. (Unix and Unix-like systems only.) + socket. '0' disables ControlSocket (Unix and Unix-like systems only.) [[ControlSocketsGroupWritable]] **ControlSocketsGroupWritable** **0**|**1**:: If this option is set to 0, don't allow the filesystem group to read and @@ -483,6 +483,15 @@ GENERAL OPTIONS in accordance to RFC 1929. Both username and password must be between 1 and 255 characters. +[[SocksSocket]] **SocksSocket** __Path__ [_flags_] [_isolation flags_]:: + Like SocksPort, but listens on a Unix domain socket, rather than a TCP + socket. '0' disables SocksSocket (Unix and Unix-like systems only.) + +[[SocksSocketsGroupWritable]] **SocksSocketsGroupWritable** **0**|**1**:: + If this option is set to 0, don't allow the filesystem group to read and + write unix sockets (e.g. SocksSocket). If the option is set to 1, make + the SocksSocket socket readable and writable by the default GID. (Default: 0) + [[KeepalivePeriod]] **KeepalivePeriod** __NUM__:: To keep firewalls from expiring connections, send a padding keepalive cell every NUM seconds on open connections that are in use. If the connection @@ -550,7 +559,7 @@ GENERAL OPTIONS \'info'. (Default: 0) [[PredictedPortsRelevanceTime]] **PredictedPortsRelevanceTime** __NUM__:: - Set how long, after the client has mad an anonymized connection to a + Set how long, after the client has made an anonymized connection to a given port, we will try to make sure that we build circuits to exits that support that port. The maximum value for this option is 1 hour. (Default: 1 hour) @@ -1426,16 +1435,6 @@ The following options are useful only for clients (that is, if Tor will use a default value chosen by the directory authorities. (Default: -1.) -[[Support022HiddenServices]] **Support022HiddenServices** **0**|**1**|**auto**:: - Tor hidden services running versions before 0.2.3.x required clients to - send timestamps, which can potentially be used to distinguish clients - whose view of the current time is skewed. If this option is set to 0, we - do not send this timestamp, and hidden services on obsolete Tor versions - will not work. If this option is set to 1, we send the timestamp. If - this option is "auto", we take a recommendation from the latest consensus - document. (Default: auto) - - SERVER OPTIONS -------------- @@ -1479,6 +1478,19 @@ is non-zero): that it's an email address and/or generate a new address for this purpose. +[[ExitRelay]] **ExitRelay** **0**|**1**|**auto**:: + Tells Tor whether to run as an exit relay. If Tor is running as a + non-bridge server, and ExitRelay is set to 1, then Tor allows traffic to + exit according to the ExitPolicy option (or the default ExitPolicy if + none is specified). + + + If ExitRelay is set to 0, no traffic is allowed to + exit, and the ExitPolicy option is ignored. + + + + If ExitRelay is set to "auto", then Tor behaves as if it were set to 1, but + warns the user if this would cause traffic to exit. In a future version, + the default value will be 0. (Default: auto) + [[ExitPolicy]] **ExitPolicy** __policy__,__policy__,__...__:: Set an exit policy for this server. Each policy is of the form "**accept**|**reject** __ADDR__[/__MASK__][:__PORT__]". If /__MASK__ is @@ -1774,6 +1786,13 @@ is non-zero): When this option is enabled, Tor writes statistics on the bidirectional use of connections to disk every 24 hours. (Default: 0) +[[HiddenServiceStatistics]] **HiddenServiceStatistics** **0**|**1**:: + When this option is enabled, a Tor relay writes obfuscated + statistics on its role as hidden-service directory, introduction + point, or rendezvous point to disk every 24 hours. If + ExtraInfoStatistics is also enabled, these statistics are further + published to the directory authorities. (Default: 0) + [[ExtraInfoStatistics]] **ExtraInfoStatistics** **0**|**1**:: When this option is enabled, Tor includes previously gathered statistics in its extra-info documents that it uploads to the directory authorities. @@ -2035,6 +2054,11 @@ The following options are used to configure a hidden service. Store data files for a hidden service in DIRECTORY. Every hidden service must have a separate directory. You may use this option multiple times to specify multiple services. DIRECTORY must be an existing directory. + (Note: in current versions of Tor, if DIRECTORY is a relative path, + it will be relative to current + working directory of Tor instance, not to its DataDirectory. Do not + rely on this behavior; it is not guaranteed to remain the same in future + versions.) [[HiddenServicePort]] **HiddenServicePort** __VIRTPORT__ [__TARGET__]:: Configure a virtual port VIRTPORT for a hidden service. You may use this @@ -2042,6 +2066,7 @@ The following options are used to configure a hidden service. recent HiddenServiceDir. By default, this option maps the virtual port to the same port on 127.0.0.1 over TCP. You may override the target port, address, or both by specifying a target of addr, port, or addr:port. + (You can specify an IPv6 target as [addr]:port.) You may also have multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT, one of the TARGETs from those lines will be chosen at random. @@ -2068,6 +2093,12 @@ The following options are used to configure a hidden service. found in the hostname file. Clients need to put this authorization data in their configuration file using **HidServAuth**. +[[HiddenServiceAllowUnknownPorts]] **HiddenServiceAllowUnknownPorts** **0**|**1**:: + If set to 1, then connections to unrecognized ports do not cause the + current hidden service to close rendezvous circuits. (Setting this to 0 is + not an authorization mechanism; it is instead meant to be a mild + inconvenience to port-scanners.) (Default: 0) + [[RendPostPeriod]] **RendPostPeriod** __N__ **seconds**|**minutes**|**hours**|**days**|**weeks**:: Every time the specified period elapses, Tor uploads any rendezvous service descriptors to the directory servers. This information is also @@ -2229,6 +2260,15 @@ The following options are used for running a testing Tor network. In order for this option to have any effect, **TestingTorNetwork** has to be set. +[[TestingDirAuthVoteHSDir]] **TestingDirAuthVoteHSDir** __node__,__node__,__...__:: + A list of identity fingerprints and country codes and + address patterns of nodes to vote HSDir for regardless of their + uptime and ORPort connectivity. See the **ExcludeNodes** option for more + information on how to specify nodes. + + + In order for this option to have any effect, **TestingTorNetwork** + and **VoteOnHidServDirectoriesV2** both have to be set. + [[TestingEnableConnBwEvent]] **TestingEnableConnBwEvent** **0**|**1**:: If this option is set, then Tor controllers may register for CONN_BW events. Changing this requires that **TestingTorNetwork** is set. @@ -2409,6 +2449,11 @@ __DataDirectory__**/stats/conn-stats**:: Only used by servers. This file is used to collect approximate connection history (number of active connections over time). +__DataDirectory__**/networkstatus-bridges**:: + Only used by authoritative bridge directories. Contains information + about bridges that have self-reported themselves to the bridge + authority. + __HiddenServiceDirectory__**/hostname**:: The <base32-encoded-fingerprint>.onion domain name for this hidden service. If the hidden service is restricted to authorized clients only, this file diff --git a/m4/pkg.m4 b/m4/pkg.m4 new file mode 100644 index 0000000000..c5b26b52e6 --- /dev/null +++ b/m4/pkg.m4 @@ -0,0 +1,214 @@ +# pkg.m4 - Macros to locate and utilise pkg-config. -*- Autoconf -*- +# serial 1 (pkg-config-0.24) +# +# Copyright © 2004 Scott James Remnant <scott@netsplit.com>. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# PKG_PROG_PKG_CONFIG([MIN-VERSION]) +# ---------------------------------- +AC_DEFUN([PKG_PROG_PKG_CONFIG], +[m4_pattern_forbid([^_?PKG_[A-Z_]+$]) +m4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$]) +m4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$]) +AC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility]) +AC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path]) +AC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path]) + +if test "x$ac_cv_env_PKG_CONFIG_set" != "xset"; then + AC_PATH_TOOL([PKG_CONFIG], [pkg-config]) +fi +if test -n "$PKG_CONFIG"; then + _pkg_min_version=m4_default([$1], [0.9.0]) + AC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version]) + if $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then + AC_MSG_RESULT([yes]) + else + AC_MSG_RESULT([no]) + PKG_CONFIG="" + fi +fi[]dnl +])# PKG_PROG_PKG_CONFIG + +# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# Check to see whether a particular set of modules exists. Similar +# to PKG_CHECK_MODULES(), but does not set variables or print errors. +# +# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +# only at the first occurence in configure.ac, so if the first place +# it's called might be skipped (such as if it is within an "if", you +# have to call PKG_CHECK_EXISTS manually +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_EXISTS], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +if test -n "$PKG_CONFIG" && \ + AC_RUN_LOG([$PKG_CONFIG --exists --print-errors "$1"]); then + m4_default([$2], [:]) +m4_ifvaln([$3], [else + $3])dnl +fi]) + +# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES]) +# --------------------------------------------- +m4_define([_PKG_CONFIG], +[if test -n "$$1"; then + pkg_cv_[]$1="$$1" + elif test -n "$PKG_CONFIG"; then + PKG_CHECK_EXISTS([$3], + [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 "$3" 2>/dev/null` + test "x$?" != "x0" && pkg_failed=yes ], + [pkg_failed=yes]) + else + pkg_failed=untried +fi[]dnl +])# _PKG_CONFIG + +# _PKG_SHORT_ERRORS_SUPPORTED +# ----------------------------- +AC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG]) +if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then + _pkg_short_errors_supported=yes +else + _pkg_short_errors_supported=no +fi[]dnl +])# _PKG_SHORT_ERRORS_SUPPORTED + + +# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND], +# [ACTION-IF-NOT-FOUND]) +# +# +# Note that if there is a possibility the first call to +# PKG_CHECK_MODULES might not happen, you should be sure to include an +# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac +# +# +# -------------------------------------------------------------- +AC_DEFUN([PKG_CHECK_MODULES], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl +AC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl + +pkg_failed=no +AC_MSG_CHECKING([for $1]) + +_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2]) +_PKG_CONFIG([$1][_LIBS], [libs], [$2]) + +m4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS +and $1[]_LIBS to avoid the need to call pkg-config. +See the pkg-config man page for more details.]) + +if test $pkg_failed = yes; then + AC_MSG_RESULT([no]) + _PKG_SHORT_ERRORS_SUPPORTED + if test $_pkg_short_errors_supported = yes; then + $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs "$2" 2>&1` + else + $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs "$2" 2>&1` + fi + # Put the nasty error message in config.log where it belongs + echo "$$1[]_PKG_ERRORS" >&AS_MESSAGE_LOG_FD + + m4_default([$4], [AC_MSG_ERROR( +[Package requirements ($2) were not met: + +$$1_PKG_ERRORS + +Consider adjusting the PKG_CONFIG_PATH environment variable if you +installed software in a non-standard prefix. + +_PKG_TEXT])[]dnl + ]) +elif test $pkg_failed = untried; then + AC_MSG_RESULT([no]) + m4_default([$4], [AC_MSG_FAILURE( +[The pkg-config script could not be found or is too old. Make sure it +is in your PATH or set the PKG_CONFIG environment variable to the full +path to pkg-config. + +_PKG_TEXT + +To get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl + ]) +else + $1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS + $1[]_LIBS=$pkg_cv_[]$1[]_LIBS + AC_MSG_RESULT([yes]) + $3 +fi[]dnl +])# PKG_CHECK_MODULES + + +# PKG_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable pkgconfigdir as the location where a module +# should install pkg-config .pc files. By default the directory is +# $libdir/pkgconfig, but the default can be changed by passing +# DIRECTORY. The user can override through the --with-pkgconfigdir +# parameter. +AC_DEFUN([PKG_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([pkgconfigdir], + [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],, + [with_pkgconfigdir=]pkg_default) +AC_SUBST([pkgconfigdir], [$with_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_INSTALLDIR + + +# PKG_NOARCH_INSTALLDIR(DIRECTORY) +# ------------------------- +# Substitutes the variable noarch_pkgconfigdir as the location where a +# module should install arch-independent pkg-config .pc files. By +# default the directory is $datadir/pkgconfig, but the default can be +# changed by passing DIRECTORY. The user can override through the +# --with-noarch-pkgconfigdir parameter. +AC_DEFUN([PKG_NOARCH_INSTALLDIR], +[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])]) +m4_pushdef([pkg_description], + [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@]) +AC_ARG_WITH([noarch-pkgconfigdir], + [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],, + [with_noarch_pkgconfigdir=]pkg_default) +AC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir]) +m4_popdef([pkg_default]) +m4_popdef([pkg_description]) +]) dnl PKG_NOARCH_INSTALLDIR + + +# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE, +# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# ------------------------------------------- +# Retrieves the value of the pkg-config variable for the given module. +AC_DEFUN([PKG_CHECK_VAR], +[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl +AC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl + +_PKG_CONFIG([$1], [variable="][$3]["], [$2]) +AS_VAR_COPY([$1], [pkg_cv_][$1]) + +AS_VAR_IF([$1], [""], [$5], [$4])dnl +])# PKG_CHECK_VAR diff --git a/scripts/codegen/gen_server_ciphers.py b/scripts/codegen/gen_server_ciphers.py index 97ed9d0469..0dca8a6734 100755 --- a/scripts/codegen/gen_server_ciphers.py +++ b/scripts/codegen/gen_server_ciphers.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 # This script parses openssl headers to find ciphersuite names, determines diff --git a/scripts/codegen/get_mozilla_ciphers.py b/scripts/codegen/get_mozilla_ciphers.py index 0636eb3658..e0a662bea0 100644 --- a/scripts/codegen/get_mozilla_ciphers.py +++ b/scripts/codegen/get_mozilla_ciphers.py @@ -1,6 +1,6 @@ #!/usr/bin/python # coding=utf-8 -# Copyright 2011, The Tor Project, Inc +# Copyright 2011-2015, The Tor Project, Inc # original version by Arturo Filastò # See LICENSE for licensing information diff --git a/scripts/codegen/makedesc.py b/scripts/codegen/makedesc.py index e0b2aed3f4..833951945b 100644 --- a/scripts/codegen/makedesc.py +++ b/scripts/codegen/makedesc.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright 2014, The Tor Project, Inc. +# Copyright 2014-2015, The Tor Project, Inc. # See LICENSE for license information # This is a kludgey python script that uses ctypes and openssl to sign diff --git a/scripts/maint/checkSpace.pl b/scripts/maint/checkSpace.pl index b529103367..c785d89567 100755 --- a/scripts/maint/checkSpace.pl +++ b/scripts/maint/checkSpace.pl @@ -128,7 +128,8 @@ for $fn (@ARGV) { if ($1 ne "if" and $1 ne "while" and $1 ne "for" and $1 ne "switch" and $1 ne "return" and $1 ne "int" and $1 ne "elsif" and $1 ne "WINAPI" and $2 ne "WINAPI" and - $1 ne "void" and $1 ne "__attribute__" and $1 ne "op") { + $1 ne "void" and $1 ne "__attribute__" and $1 ne "op" and + $1 ne "size_t" and $1 ne "double") { print " fn ():$fn:$.\n"; } } diff --git a/scripts/maint/format_changelog.py b/scripts/maint/format_changelog.py index 3fe5161433..d1b4a3dff3 100755 --- a/scripts/maint/format_changelog.py +++ b/scripts/maint/format_changelog.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2014, The Tor Project, Inc. +# Copyright (c) 2014-2015, The Tor Project, Inc. # See LICENSE for licensing information # # This script reformats a section of the changelog to wrap everything to diff --git a/scripts/maint/lintChanges.py b/scripts/maint/lintChanges.py new file mode 100755 index 0000000000..fcadc5e505 --- /dev/null +++ b/scripts/maint/lintChanges.py @@ -0,0 +1,52 @@ +#!/usr/bin/python + +import sys +import re + + + +def lintfile(fname): + have_warned = [] + def warn(s): + if not have_warned: + have_warned.append(1) + print fname,":" + print "\t",s + + m = re.search(r'(\d{3,})', fname) + if m: + bugnum = m.group(1) + else: + bugnum = None + + with open(fname) as f: + contents = f.read() + + if bugnum and bugnum not in contents: + warn("bug number %s does not appear"%bugnum) + + lines = contents.split("\n") + isBug = ("bug" in lines[0] or "fix" in lines[0]) + + if not re.match(r'^ +o (.*)', contents): + warn("header not in format expected") + + contents = " ".join(contents.split()) + + if isBug and not re.search(r'(\d+)', contents): + warn("bugfix does not mention a number") + elif isBug and not re.search(r'Fixes ([a-z ]*)bug (\d+)', contents): + warn("bugfix does not say 'Fixes bug XXX'") + + if re.search(r'[bB]ug (\d+)', contents): + if not re.search(r'[Bb]ugfix on ', contents): + warn("bugfix does not say 'bugfix on X.Y.Z'") + elif not re.search('[fF]ixes ([a-z ]*)bug (\d+); bugfix on ', contents): + warn("bugfix incant is not semicoloned") + + +if __name__=='__main__': + for fname in sys.argv[1:]: + if fname.endswith("~"): + continue + lintfile(fname) diff --git a/scripts/maint/redox.py b/scripts/maint/redox.py index fa816a7267..5933d49773 100755 --- a/scripts/maint/redox.py +++ b/scripts/maint/redox.py @@ -1,6 +1,6 @@ #!/usr/bin/python # -# Copyright (c) 2008-2013, The Tor Project, Inc. +# Copyright (c) 2008-2015, The Tor Project, Inc. # See LICENSE for licensing information. # # Hi! diff --git a/scripts/maint/sortChanges.py b/scripts/maint/sortChanges.py index 726a723f93..ad28c79d9d 100755 --- a/scripts/maint/sortChanges.py +++ b/scripts/maint/sortChanges.py @@ -1,5 +1,5 @@ #!/usr/bin/python -# Copyright (c) 2014, The Tor Project, Inc. +# Copyright (c) 2014-2015, The Tor Project, Inc. # See LICENSE for licensing information """This script sorts a bunch of changes files listed on its command @@ -18,10 +18,10 @@ def fetch(fn): s = "%s\n" % s.rstrip() return s -def score(s): +def score(s,fname=None): m = re.match(r'^ +o (.*)', s) if not m: - print >>sys.stderr, "Can't score %r"%s + print >>sys.stderr, "Can't score %r from %s"%(s,fname) lw = m.group(1).lower() if lw.startswith("major feature"): score = 0 @@ -41,7 +41,7 @@ def score(s): return (score, lw, s) -changes = [ score(fetch(fn)) for fn in sys.argv[1:] if not fn.endswith('~') ] +changes = [ score(fetch(fn),fn) for fn in sys.argv[1:] if not fn.endswith('~') ] changes.sort() diff --git a/scripts/maint/updateCopyright.pl b/scripts/maint/updateCopyright.pl new file mode 100755 index 0000000000..ec82616a19 --- /dev/null +++ b/scripts/maint/updateCopyright.pl @@ -0,0 +1,7 @@ +#!/usr/bin/perl -i -w -p + +$NEWYEAR=2015; + +s/Copyright(.*) (201[^5]), The Tor Project/Copyright$1 $2-${NEWYEAR}, The Tor Project/; + +s/Copyright(.*)-(20..), The Tor Project/Copyright$1-${NEWYEAR}, The Tor Project/; 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->func(d->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->func(d->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>->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(×tamp_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" |