[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r20335: {tor} Update SVN to match git master, revision 1699082. (in tor/trunk: . contrib contrib/directory-archive contrib/osx contrib/polipo debian debian/patches doc doc/design-paper doc/spec doc/spec/proposals doc/spec/proposals/ideas src/common src/config src/or src/tools src/win32)



Author: nickm
Date: 2009-08-19 17:47:25 -0400 (Wed, 19 Aug 2009)
New Revision: 20335

Added:
   tor/trunk/doc/spec/proposals/160-bandwidth-offset.txt
   tor/trunk/doc/spec/proposals/161-computing-bandwidth-adjustments.txt
   tor/trunk/doc/spec/proposals/162-consensus-flavors.txt
   tor/trunk/doc/spec/proposals/163-detecting-clients.txt
   tor/trunk/doc/spec/proposals/164-reporting-server-status.txt
   tor/trunk/doc/spec/proposals/165-simple-robust-voting.txt
   tor/trunk/doc/spec/proposals/166-statistics-extra-info-docs.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-bwrate-algs.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-encrypted-services.txt
   tor/trunk/src/common/compat_libevent.c
   tor/trunk/src/common/compat_libevent.h
   tor/trunk/src/common/util_codedigest.c
   tor/trunk/src/or/config_codedigest.c
Modified:
   tor/trunk/ChangeLog
   tor/trunk/Doxyfile.in
   tor/trunk/LICENSE
   tor/trunk/Makefile.am
   tor/trunk/ReleaseNotes
   tor/trunk/acinclude.m4
   tor/trunk/configure.in
   tor/trunk/contrib/checkOptionDocs.pl
   tor/trunk/contrib/checkSpace.pl
   tor/trunk/contrib/cross.sh
   tor/trunk/contrib/directory-archive/fetch-all-v3
   tor/trunk/contrib/id_to_fp.c
   tor/trunk/contrib/nagios-check-tor-authority-cert
   tor/trunk/contrib/osx/package.sh
   tor/trunk/contrib/osx/uninstall_tor_bundle.sh
   tor/trunk/contrib/polipo/package.sh
   tor/trunk/contrib/rc.subr
   tor/trunk/contrib/tor-mingw.nsi.in
   tor/trunk/contrib/tor-resolve.py
   tor/trunk/contrib/torify.1
   tor/trunk/contrib/torify.in
   tor/trunk/debian/changelog
   tor/trunk/debian/compat
   tor/trunk/debian/control
   tor/trunk/debian/copyright
   tor/trunk/debian/patches/06_add_compile_time_defaults.dpatch
   tor/trunk/debian/rules
   tor/trunk/debian/tor.dirs
   tor/trunk/debian/tor.init
   tor/trunk/debian/tor.postinst
   tor/trunk/doc/HACKING
   tor/trunk/doc/TODO
   tor/trunk/doc/TODO.021
   tor/trunk/doc/TODO.022
   tor/trunk/doc/TODO.external
   tor/trunk/doc/TODO.future
   tor/trunk/doc/design-paper/latex8.bst
   tor/trunk/doc/design-paper/usenix.sty
   tor/trunk/doc/spec/address-spec.txt
   tor/trunk/doc/spec/bridges-spec.txt
   tor/trunk/doc/spec/control-spec-v0.txt
   tor/trunk/doc/spec/control-spec.txt
   tor/trunk/doc/spec/dir-spec-v1.txt
   tor/trunk/doc/spec/dir-spec-v2.txt
   tor/trunk/doc/spec/dir-spec.txt
   tor/trunk/doc/spec/path-spec.txt
   tor/trunk/doc/spec/proposals/000-index.txt
   tor/trunk/doc/spec/proposals/001-process.txt
   tor/trunk/doc/spec/proposals/098-todo.txt
   tor/trunk/doc/spec/proposals/099-misc.txt
   tor/trunk/doc/spec/proposals/100-tor-spec-udp.txt
   tor/trunk/doc/spec/proposals/101-dir-voting.txt
   tor/trunk/doc/spec/proposals/102-drop-opt.txt
   tor/trunk/doc/spec/proposals/103-multilevel-keys.txt
   tor/trunk/doc/spec/proposals/104-short-descriptors.txt
   tor/trunk/doc/spec/proposals/105-handshake-revision.txt
   tor/trunk/doc/spec/proposals/106-less-tls-constraint.txt
   tor/trunk/doc/spec/proposals/107-uptime-sanity-checking.txt
   tor/trunk/doc/spec/proposals/108-mtbf-based-stability.txt
   tor/trunk/doc/spec/proposals/109-no-sharing-ips.txt
   tor/trunk/doc/spec/proposals/110-avoid-infinite-circuits.txt
   tor/trunk/doc/spec/proposals/111-local-traffic-priority.txt
   tor/trunk/doc/spec/proposals/112-bring-back-pathlencoinweight.txt
   tor/trunk/doc/spec/proposals/113-fast-authority-interface.txt
   tor/trunk/doc/spec/proposals/114-distributed-storage.txt
   tor/trunk/doc/spec/proposals/115-two-hop-paths.txt
   tor/trunk/doc/spec/proposals/116-two-hop-paths-from-guard.txt
   tor/trunk/doc/spec/proposals/117-ipv6-exits.txt
   tor/trunk/doc/spec/proposals/118-multiple-orports.txt
   tor/trunk/doc/spec/proposals/119-controlport-auth.txt
   tor/trunk/doc/spec/proposals/120-shutdown-descriptors.txt
   tor/trunk/doc/spec/proposals/121-hidden-service-authentication.txt
   tor/trunk/doc/spec/proposals/122-unnamed-flag.txt
   tor/trunk/doc/spec/proposals/123-autonaming.txt
   tor/trunk/doc/spec/proposals/124-tls-certificates.txt
   tor/trunk/doc/spec/proposals/125-bridges.txt
   tor/trunk/doc/spec/proposals/126-geoip-reporting.txt
   tor/trunk/doc/spec/proposals/127-dirport-mirrors-downloads.txt
   tor/trunk/doc/spec/proposals/128-bridge-families.txt
   tor/trunk/doc/spec/proposals/129-reject-plaintext-ports.txt
   tor/trunk/doc/spec/proposals/130-v2-conn-protocol.txt
   tor/trunk/doc/spec/proposals/131-verify-tor-usage.txt
   tor/trunk/doc/spec/proposals/132-browser-check-tor-service.txt
   tor/trunk/doc/spec/proposals/134-robust-voting.txt
   tor/trunk/doc/spec/proposals/135-private-tor-networks.txt
   tor/trunk/doc/spec/proposals/137-bootstrap-phases.txt
   tor/trunk/doc/spec/proposals/138-remove-down-routers-from-consensus.txt
   tor/trunk/doc/spec/proposals/140-consensus-diffs.txt
   tor/trunk/doc/spec/proposals/141-jit-sd-downloads.txt
   tor/trunk/doc/spec/proposals/142-combine-intro-and-rend-points.txt
   tor/trunk/doc/spec/proposals/143-distributed-storage-improvements.txt
   tor/trunk/doc/spec/proposals/145-newguard-flag.txt
   tor/trunk/doc/spec/proposals/146-long-term-stability.txt
   tor/trunk/doc/spec/proposals/147-prevoting-opinions.txt
   tor/trunk/doc/spec/proposals/148-uniform-client-end-reason.txt
   tor/trunk/doc/spec/proposals/149-using-netinfo-data.txt
   tor/trunk/doc/spec/proposals/150-exclude-exit-nodes.txt
   tor/trunk/doc/spec/proposals/151-path-selection-improvements.txt
   tor/trunk/doc/spec/proposals/152-single-hop-circuits.txt
   tor/trunk/doc/spec/proposals/153-automatic-software-update-protocol.txt
   tor/trunk/doc/spec/proposals/154-automatic-updates.txt
   tor/trunk/doc/spec/proposals/155-four-hidden-service-improvements.txt
   tor/trunk/doc/spec/proposals/156-tracking-blocked-ports.txt
   tor/trunk/doc/spec/proposals/157-specific-cert-download.txt
   tor/trunk/doc/spec/proposals/158-microdescriptors.txt
   tor/trunk/doc/spec/proposals/159-exit-scanning.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-hide-platform.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-port-knocking.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt
   tor/trunk/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt
   tor/trunk/doc/spec/proposals/reindex.py
   tor/trunk/doc/spec/rend-spec.txt
   tor/trunk/doc/spec/socks-extensions.txt
   tor/trunk/doc/spec/tor-spec.txt
   tor/trunk/doc/spec/version-spec.txt
   tor/trunk/doc/tor-rpm-creation.txt
   tor/trunk/doc/tor.1.in
   tor/trunk/src/common/Makefile.am
   tor/trunk/src/common/address.c
   tor/trunk/src/common/address.h
   tor/trunk/src/common/aes.c
   tor/trunk/src/common/aes.h
   tor/trunk/src/common/compat.c
   tor/trunk/src/common/compat.h
   tor/trunk/src/common/container.c
   tor/trunk/src/common/container.h
   tor/trunk/src/common/crypto.c
   tor/trunk/src/common/crypto.h
   tor/trunk/src/common/ht.h
   tor/trunk/src/common/log.c
   tor/trunk/src/common/log.h
   tor/trunk/src/common/memarea.c
   tor/trunk/src/common/memarea.h
   tor/trunk/src/common/mempool.c
   tor/trunk/src/common/mempool.h
   tor/trunk/src/common/test.h
   tor/trunk/src/common/torgzip.c
   tor/trunk/src/common/torgzip.h
   tor/trunk/src/common/torint.h
   tor/trunk/src/common/tortls.c
   tor/trunk/src/common/tortls.h
   tor/trunk/src/common/util.c
   tor/trunk/src/common/util.h
   tor/trunk/src/config/geoip
   tor/trunk/src/config/torrc.complete.in
   tor/trunk/src/config/torrc.sample.in
   tor/trunk/src/or/Makefile.am
   tor/trunk/src/or/buffers.c
   tor/trunk/src/or/circuitbuild.c
   tor/trunk/src/or/circuitlist.c
   tor/trunk/src/or/circuituse.c
   tor/trunk/src/or/command.c
   tor/trunk/src/or/config.c
   tor/trunk/src/or/connection.c
   tor/trunk/src/or/connection_edge.c
   tor/trunk/src/or/connection_or.c
   tor/trunk/src/or/control.c
   tor/trunk/src/or/cpuworker.c
   tor/trunk/src/or/directory.c
   tor/trunk/src/or/dirserv.c
   tor/trunk/src/or/dirvote.c
   tor/trunk/src/or/dns.c
   tor/trunk/src/or/dnsserv.c
   tor/trunk/src/or/eventdns.c
   tor/trunk/src/or/eventdns_tor.h
   tor/trunk/src/or/geoip.c
   tor/trunk/src/or/hibernate.c
   tor/trunk/src/or/main.c
   tor/trunk/src/or/networkstatus.c
   tor/trunk/src/or/ntmain.c
   tor/trunk/src/or/onion.c
   tor/trunk/src/or/or.h
   tor/trunk/src/or/policies.c
   tor/trunk/src/or/reasons.c
   tor/trunk/src/or/relay.c
   tor/trunk/src/or/rendclient.c
   tor/trunk/src/or/rendcommon.c
   tor/trunk/src/or/rendmid.c
   tor/trunk/src/or/rendservice.c
   tor/trunk/src/or/rephist.c
   tor/trunk/src/or/router.c
   tor/trunk/src/or/routerlist.c
   tor/trunk/src/or/routerparse.c
   tor/trunk/src/or/test.c
   tor/trunk/src/or/test_data.c
   tor/trunk/src/or/tor_main.c
   tor/trunk/src/tools/Makefile.am
   tor/trunk/src/tools/tor-checkkey.c
   tor/trunk/src/tools/tor-gencert.c
   tor/trunk/src/tools/tor-resolve.c
   tor/trunk/src/win32/orconfig.h
   tor/trunk/tor.spec.in
Log:
Update SVN to match git master, revision 1699082.

Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/ChangeLog	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,10 +1,263 @@
-Changes in version 0.2.1.15??? - ????-??-??
+Changes in version 0.2.2.1-alpha - 2009-0?-??
+  o Major features:
+    - Add support for dynamic OpenSSL hardware crypto acceleration engines
+      via new AccelName and AccelDir options.
+
+  o New options for gathering stats safely:
+    - Directories that configure with --enable-dirreq-stats and set
+      "DirReqStatistics 1" write directory request stats to disk every
+      24 hours. As compared to the --enable-geoip-stats flag in 0.2.1.x,
+      there are a few improvements: 1) stats are written to disk exactly
+      every 24 hours; 2) estimated shares of v2 and v3 requests are
+      determined as mean values, not at the end of a measurement period;
+      3) unresolved requests are listed with country code '??';
+      4) directories also measure download times.
+    - Exit nodes that configure with --enable-exit-stats and set
+      "ExitPortStatistics 1" write statistics on the number of exit
+      streams and transferred bytes per port to disk every 24 hours.
+    - Relays that configure with --enable-buffer-stats and set
+      "CellStatistics 1" write statistics to disk every 24 hours on how
+      long cells spend in their circuit queues.
+    - Entry nodes that configure with --enable-entry-stats and set
+      "EntryStatistics 1" write statistics to disk every 24 hours on
+      the rough number and origins of connecting clients.
+
+  o Minor features:
+    - New --digests command-line switch to output the digests of the
+      source files Tor was built with.
+    - The "torify" script now uses torsocks where available.
+    - The memarea code now uses a sentinel value at the end of each area
+      to make sure nothing writes beyond the end of an area.  This might
+      help debug some conceivable causes of bug 930.
+    - Time and memory units in the configuration file can now be set to
+      fractional units.  For example, "2.5 MB" is now a valid value for
+      AccountingMax.
+    - Certain Tor clients (such as those behind check.torproject.org) may
+      want to fetch the consensus in an extra early manner. To enable this
+      a user may now set FetchDirInfoExtraEarly to 1. This also depends on
+      setting FetchDirInfoEarly to 1. Previous behavior will stay the same
+      as only certain clients who must have this information sooner should
+      set this option.
+
+  o Deprecated and removed features:
+    - The controller no longer accepts the old obsolete "addr-mappings/"
+      or "unregistered-servers-" GETINFO values.
+    - Hidden services no longer publish version 0 descriptors, and clients
+      do not request or use version 0 descriptors. However, the authorities
+      still accept and serve version 0 descriptors when contacted by older
+      hidden services/clients.
+    - The EXTENDED_EVENTS and VERBOSE_NAMES controller features are now
+      always on; using them is necessary for correct forward-compatible
+      controllers.
+    - Removal of support for .noconnect style addresses.
+
+
+Changes in version 0.2.1.20 - 2009-??-??
+  o Major bugfixes:
+    - Send circuit or stream sendme cells when our window has decreased
+      by 100 cells, not when it has decreased by 101 cells. Bug uncovered
+      by Karsten when testing the "reduce circuit window" performance
+      patch. Bugfix on the 54th commit on Tor -- from July 2002,
+      before the release of Tor 0.0.0. This is the new winner of the
+      oldest-bug prize.
+
+  o New directory authorities:
+    - Set up urras (run by Jacob Appelbaum) as the seventh v3 directory
+      authority.
+
   o Minor bugfixes:
-    - Actually return -1 in the error case for read_bandwidth_usage. Bug
-      was harmless, we currently don't care for the return value anywhere.
-      Bugfix on 0.2.0.9-alpha.
+    - Fix a signed/unsigned compile warning in 0.2.1.19.
+    - Fix possible segmentation fault on directory authorities. Bugfix on
+      0.2.1.14-rc.
 
+
+Changes in version 0.2.1.19 - 2009-07-28
+  Tor 0.2.1.19 fixes a major bug with accessing and providing hidden
+  services on Tor 0.2.1.3-alpha through 0.2.1.18.
+
+  o Major bugfixes:
+    - Make accessing hidden services on 0.2.1.x work right again.
+      Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and
+      part of patch provided by "optimist".
+
+  o Minor features:
+    - When a relay/bridge is writing out its identity key fingerprint to
+      the "fingerprint" file and to its logs, write it without spaces. Now
+      it will look like the fingerprints in our bridges documentation,
+      and confuse fewer users.
+
+  o Minor bugfixes:
+    - Relays no longer publish a new server descriptor if they change
+      their MaxAdvertisedBandwidth config option but it doesn't end up
+      changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc;
+      fixes bug 1026. Patch from Sebastian.
+    - Avoid leaking memory every time we get a create cell but we have
+      so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha;
+      fixes bug 1034. Reported by BarkerJr.
+
+
+Changes in version 0.2.1.18 - 2009-07-24
+  Tor 0.2.1.18 lays the foundations for performance improvements,
+  adds status events to help users diagnose bootstrap problems, adds
+  optional authentication/authorization for hidden services, fixes a
+  variety of potential anonymity problems, and includes a huge pile of
+  other features and bug fixes.
+
+  o Build fixes:
+    - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent.
+
+
+Changes in version 0.2.1.17-rc - 2009-07-07
+  Tor 0.2.1.17-rc marks the fourth -- and hopefully last -- release
+  candidate for the 0.2.1.x series. It lays the groundwork for further
+  client performance improvements, and also fixes a big bug with directory
+  authorities that were causing them to assign Guard and Stable flags
+  poorly.
+
+  The Windows bundles also finally include the geoip database that we
+  thought we'd been shipping since 0.2.0.x (oops), and the OS X bundles
+  should actually install Torbutton rather than giving you a cryptic
+  failure message (oops).
+
+  o Major features:
+    - Clients now use the bandwidth values in the consensus, rather than
+      the bandwidth values in each relay descriptor. This approach opens
+      the door to more accurate bandwidth estimates once the directory
+      authorities start doing active measurements. Implements more of
+      proposal 141.
+
+  o Major bugfixes:
+    - When Tor clients restart after 1-5 days, they discard all their
+      cached descriptors as too old, but they still use the cached
+      consensus document. This approach is good for robustness, but
+      bad for performance: since they don't know any bandwidths, they
+      end up choosing at random rather than weighting their choice by
+      speed. Fixed by the above feature of putting bandwidths in the
+      consensus. Bugfix on 0.2.0.x.
+    - Directory authorities were neglecting to mark relays down in their
+      internal histories if the relays fall off the routerlist without
+      ever being found unreachable. So there were relays in the histories
+      that haven't been seen for eight months, and are listed as being
+      up for eight months. This wreaked havoc on the "median wfu"
+      and "median mtbf" calculations, in turn making Guard and Stable
+      flags very wrong, hurting network performance. Fixes bugs 696 and
+      969. Bugfix on 0.2.0.6-alpha.
+
+  o Minor bugfixes:
+    - Serve the DirPortFrontPage page even when we have been approaching
+      our quotas recently. Fixes bug 1013; bugfix on 0.2.1.8-alpha.
+    - The control port would close the connection before flushing long
+      replies, such as the network consensus, if a QUIT command was issued
+      before the reply had completed. Now, the control port flushes all
+      pending replies before closing the connection. Also fixed a spurious
+      warning when a QUIT command is issued after a malformed or rejected
+      AUTHENTICATE command, but before the connection was closed. Patch
+      by Marcus Griep. Bugfix on 0.2.0.x; fixes bugs 1015 and 1016.
+    - When we can't find an intro key for a v2 hidden service descriptor,
+      fall back to the v0 hidden service descriptor and log a bug message.
+      Workaround for bug 1024.
+    - Fix a log message that did not respect the SafeLogging option.
+      Resolves bug 1027.
+
+  o Minor features:
+    - If we're a relay and we change our IP address, be more verbose
+      about the reason that made us change. Should help track down
+      further bugs for relays on dynamic IP addresses.
+
+
+Changes in version 0.2.1.16-rc - 2009-06-20
+  Tor 0.2.1.16-rc speeds up performance for fast exit relays, and fixes
+  a bunch of minor bugs.
+
+  o Security fixes:
+    - Fix an edge case where a malicious exit relay could convince a
+      controller that the client's DNS question resolves to an internal IP
+      address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta.
+
+  o Major performance improvements (on 0.2.0.x):
+    - Disable and refactor some debugging checks that forced a linear scan
+      over the whole server-side DNS cache. These accounted for over 50%
+      of CPU time on a relatively busy exit node's gprof profile. Found
+      by Jacob.
+    - Disable some debugging checks that appeared in exit node profile
+      data.
+
+  o Minor features:
+    - Update to the "June 3 2009" ip-to-country file.
+    - Do not have tor-resolve automatically refuse all .onion addresses;
+      if AutomapHostsOnResolve is set in your torrc, this will work fine.
+
+  o Minor bugfixes (on 0.2.0.x):
+    - Log correct error messages for DNS-related network errors on
+      Windows.
+    - Fix a race condition that could cause crashes or memory corruption
+      when running as a server with a controller listening for log
+      messages.
+    - Avoid crashing when we have a policy specified in a DirPolicy or
+      SocksPolicy or ReachableAddresses option with ports set on it,
+      and we re-load the policy. May fix bug 996.
+    - Hidden service clients didn't use a cached service descriptor that
+      was older than 15 minutes, but wouldn't fetch a new one either,
+      because there was already one in the cache. Now, fetch a v2
+      descriptor unless the same descriptor was added to the cache within
+      the last 15 minutes. Fixes bug 997; reported by Marcus Griep.
+
+  o Minor bugfixes (on 0.2.1.x):
+    - Don't warn users about low port and hibernation mix when they
+      provide a *ListenAddress directive to fix that. Bugfix on
+      0.2.1.15-rc.
+    - When switching back and forth between bridge mode, do not start
+      gathering GeoIP data until two hours have passed.
+    - Do not complain that the user has requested an excluded node as
+      an exit when the node is not really an exit. This could happen
+      because the circuit was for testing, or an introduction point.
+      Fix for bug 984.
+
+
+Changes in version 0.2.1.15-rc - 2009-05-25
+  Tor 0.2.1.15-rc marks the second release candidate for the 0.2.1.x
+  series. It fixes a major bug on fast exit relays, as well as a variety
+  of more minor bugs.
+
+  o Major bugfixes (on 0.2.0.x):
+    - Fix a timing-dependent, allocator-dependent, DNS-related crash bug
+      that would occur on some exit nodes when DNS failures and timeouts
+      occurred in certain patterns. Fix for bug 957.
+
+  o Minor bugfixes (on 0.2.0.x):
+    - Actually return -1 in the error case for read_bandwidth_usage().
+      Harmless bug, since we currently don't care about the return value
+      anywhere. Bugfix on 0.2.0.9-alpha.
+    - Provide a more useful log message if bug 977 (related to buffer
+      freelists) ever reappears, and do not crash right away.
+    - Fix an assertion failure on 64-bit platforms when we allocated
+      memory right up to the end of a memarea, then realigned the memory
+      one step beyond the end. Fixes a possible cause of bug 930.
+    - Protect the count of open sockets with a mutex, so we can't
+      corrupt it when two threads are closing or opening sockets at once.
+      Fix for bug 939. Bugfix on 0.2.0.1-alpha.
+    - Don't allow a bridge to publish its router descriptor to a
+      non-bridge directory authority. Fixes part of bug 932.
+    - When we change to or from being a bridge, reset our counts of
+      client usage by country. Fixes bug 932.
+    - Fix a bug that made stream bandwidth get misreported to the
+      controller.
+    - Stop using malloc_usable_size() to use more area than we had
+      actually allocated: it was safe, but made valgrind really unhappy.
+    - Fix a memory leak when v3 directory authorities load their keys
+      and cert from disk. Bugfix on 0.2.0.1-alpha.
+
+  o Minor bugfixes (on 0.2.1.x):
+    - Fix use of freed memory when deciding to mark a non-addable
+      descriptor as never-downloadable. Bugfix on 0.2.1.9-alpha.
+
+
 Changes in version 0.2.1.14-rc - 2009-04-12
+  Tor 0.2.1.14-rc marks the first release candidate for the 0.2.1.x
+  series. It begins fixing some major performance problems, and also
+  finally addresses the bug that was causing relays on dynamic IP
+  addresses to fall out of the directory.
+
   o Major features:
     - Clients replace entry guards that were chosen more than a few months
       ago. This change should significantly improve client performance,

Modified: tor/trunk/Doxyfile.in
===================================================================
--- tor/trunk/Doxyfile.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/Doxyfile.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-# $Id$
 # Doxyfile 1.5.1
 
 # This file describes the settings to be used by the documentation system

Modified: tor/trunk/LICENSE
===================================================================
--- tor/trunk/LICENSE	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/LICENSE	2009-08-19 21:47:25 UTC (rev 20335)
@@ -14,7 +14,7 @@
 
 Copyright (c) 2001-2004, Roger Dingledine
 Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
-Copyright (c) 2007-2008, The Tor Project, Inc.
+Copyright (c) 2007-2009, The Tor Project, Inc.
 
 Redistribution and use in source and binary forms, with or without
 modification, are permitted provided that the following conditions are

Modified: tor/trunk/Makefile.am
===================================================================
--- tor/trunk/Makefile.am	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/Makefile.am	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,6 @@
-# $Id$
 # Copyright (c) 2001-2004, Roger Dingledine
 # Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
-# Copyright (c) 2007-2008, The Tor Project, Inc.
+# Copyright (c) 2007-2009, The Tor Project, Inc.
 # See LICENSE for licensing information
 
 AUTOMAKE_OPTIONS = foreign
@@ -26,16 +25,15 @@
 	    mkdir $$RPM_BUILD_DIR/$$subdir;                     \
 	done;                                                   \
 	mkdir $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION);           \
-        cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/;       \
-        pushd $$RPM_BUILD_DIR/SOURCES/;                         \
-        tar zcf tor-$(VERSION).tar.gz ./;                       \
-        popd;                                                   \
-        rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \
-        mv $$RPM_BUILD_DIR/SRPMS/* .;                           \
-        mv $$RPM_BUILD_DIR/RPMS/* .;                            \
-        rm -rf $$RPM_BUILD_DIR
+	cp -R ./ $$RPM_BUILD_DIR/SOURCES/tor-$(VERSION)/;       \
+	pushd $$RPM_BUILD_DIR/SOURCES/;                         \
+	tar zcf tor-$(VERSION).tar.gz ./;                       \
+	popd;                                                   \
+	LIBS=-lrt rpmbuild -ba --define "_topdir $$RPM_BUILD_DIR" tor.spec; \
+	mv $$RPM_BUILD_DIR/SRPMS/* .;                           \
+	mv $$RPM_BUILD_DIR/RPMS/* .;                            \
+	rm -rf $$RPM_BUILD_DIR
 
-
 dist-osx:
 	@if [ "x$(prefix)" != 'x/Library/Tor' ]; then \
 	  echo "Configure with --prefix=/Library/Tor, please"; \

Modified: tor/trunk/ReleaseNotes
===================================================================
--- tor/trunk/ReleaseNotes	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/ReleaseNotes	2009-08-19 21:47:25 UTC (rev 20335)
@@ -3,6 +3,636 @@
 of Tor. If you want to see more detailed descriptions of the changes in
 each development snapshot, see the ChangeLog file.
 
+Changes in version 0.2.1.19 - 2009-07-28
+  Tor 0.2.1.19 fixes a major bug with accessing and providing hidden
+  services.
+
+  o Major bugfixes:
+    - Make accessing hidden services on 0.2.1.x work right again.
+      Bugfix on 0.2.1.3-alpha; workaround for bug 1038. Diagnosis and
+      part of patch provided by "optimist".
+
+  o Minor features:
+    - When a relay/bridge is writing out its identity key fingerprint to
+      the "fingerprint" file and to its logs, write it without spaces. Now
+      it will look like the fingerprints in our bridges documentation,
+      and confuse fewer users.
+
+  o Minor bugfixes:
+    - Relays no longer publish a new server descriptor if they change
+      their MaxAdvertisedBandwidth config option but it doesn't end up
+      changing their advertised bandwidth numbers. Bugfix on 0.2.0.28-rc;
+      fixes bug 1026. Patch from Sebastian.
+    - Avoid leaking memory every time we get a create cell but we have
+      so many already queued that we refuse it. Bugfix on 0.2.0.19-alpha;
+      fixes bug 1034. Reported by BarkerJr.
+
+
+Changes in version 0.2.1.18 - 2009-07-24
+  Tor 0.2.1.18 lays the foundations for performance improvements,
+  adds status events to help users diagnose bootstrap problems, adds
+  optional authentication/authorization for hidden services, fixes a
+  variety of potential anonymity problems, and includes a huge pile of
+  other features and bug fixes.
+
+  o Major features (clients):
+    - Start sending "bootstrap phase" status events to the controller,
+      so it can keep the user informed of progress fetching directory
+      information and establishing circuits. Also inform the controller
+      if we think we're stuck at a particular bootstrap phase. Implements
+      proposal 137.
+    - Clients replace entry guards that were chosen more than a few months
+      ago. This change should significantly improve client performance,
+      especially once more people upgrade, since relays that have been
+      a guard for a long time are currently overloaded.
+    - Network status consensus documents and votes now contain bandwidth
+      information for each relay. Clients use the bandwidth values
+      in the consensus, rather than the bandwidth values in each
+      relay descriptor. This approach opens the door to more accurate
+      bandwidth estimates once the directory authorities start doing
+      active measurements. Implements part of proposal 141.
+
+  o Major features (relays):
+    - Disable and refactor some debugging checks that forced a linear scan
+      over the whole server-side DNS cache. These accounted for over 50%
+      of CPU time on a relatively busy exit node's gprof profile. Also,
+      disable some debugging checks that appeared in exit node profile
+      data. Found by Jacob.
+    - New DirPortFrontPage option that takes an html file and publishes
+      it as "/" on the DirPort. Now relay operators can provide a
+      disclaimer without needing to set up a separate webserver. There's
+      a sample disclaimer in contrib/tor-exit-notice.html.
+
+  o Major features (hidden services):
+    - Make it possible to build hidden services that only certain clients
+      are allowed to connect to. This is enforced at several points,
+      so that unauthorized clients are unable to send INTRODUCE cells
+      to the service, or even (depending on the type of authentication)
+      to learn introduction points. This feature raises the bar for
+      certain kinds of active attacks against hidden services. Design
+      and code by Karsten Loesing. Implements proposal 121.
+    - Relays now store and serve v2 hidden service descriptors by default,
+      i.e., the new default value for HidServDirectoryV2 is 1. This is
+      the last step in proposal 114, which aims to make hidden service
+      lookups more reliable.
+
+  o Major features (path selection):
+    - ExitNodes and Exclude*Nodes config options now allow you to restrict
+      by country code ("{US}") or IP address or address pattern
+      ("255.128.0.0/16"). Patch from Robert Hogan. It still needs some
+      refinement to decide what config options should take priority if
+      you ask to both use a particular node and exclude it.
+
+  o Major features (misc):
+    - When building a consensus, do not include routers that are down.
+      This cuts down 30% to 40% on consensus size. Implements proposal
+      138.
+    - New TestingTorNetwork config option to allow adjustment of
+      previously constant values that could slow bootstrapping. Implements
+      proposal 135. Patch from Karsten.
+    - Convert many internal address representations to optionally hold
+      IPv6 addresses. Generate and accept IPv6 addresses in many protocol
+      elements. Make resolver code handle nameservers located at IPv6
+      addresses.
+    - More work on making our TLS handshake blend in: modify the list
+      of ciphers advertised by OpenSSL in client mode to even more
+      closely resemble a common web browser. We cheat a little so that
+      we can advertise ciphers that the locally installed OpenSSL doesn't
+      know about.
+    - Use the TLS1 hostname extension to more closely resemble browser
+      behavior.
+
+  o Security fixes (anonymity/entropy):
+    - Never use a connection with a mismatched address to extend a
+      circuit, unless that connection is canonical. A canonical
+      connection is one whose address is authenticated by the router's
+      identity key, either in a NETINFO cell or in a router descriptor.
+    - Implement most of proposal 110: The first K cells to be sent
+      along a circuit are marked as special "early" cells; only K "early"
+      cells will be allowed. Once this code is universal, we can block
+      certain kinds of denial-of-service attack by requiring that EXTEND
+      commands must be sent using an "early" cell.
+    - Resume using OpenSSL's RAND_poll() for better (and more portable)
+      cross-platform entropy collection again. We used to use it, then
+      stopped using it because of a bug that could crash systems that
+      called RAND_poll when they had a lot of fds open. It looks like the
+      bug got fixed in late 2006. Our new behavior is to call RAND_poll()
+      at startup, and to call RAND_poll() when we reseed later only if
+      we have a non-buggy OpenSSL version.
+    - When the client is choosing entry guards, now it selects at most
+      one guard from a given relay family. Otherwise we could end up with
+      all of our entry points into the network run by the same operator.
+      Suggested by Camilo Viecco. Fix on 0.1.1.11-alpha.
+    - Do not use or believe expired v3 authority certificates. Patch
+      from Karsten. Bugfix in 0.2.0.x. Fixes bug 851.
+    - Drop begin cells to a hidden service if they come from the middle
+      of a circuit. Patch from lark.
+    - When we erroneously receive two EXTEND cells for the same circuit
+      ID on the same connection, drop the second. Patch from lark.
+    - Authorities now vote for the Stable flag for any router whose
+      weighted MTBF is at least 5 days, regardless of the mean MTBF.
+    - Clients now never report any stream end reason except 'MISC'.
+      Implements proposal 148.
+
+  o Major bugfixes (crashes):
+    - Parse dates and IPv4 addresses in a locale- and libc-independent
+      manner, to avoid platform-dependent behavior on malformed input.
+    - Fix a crash that occurs on exit nodes when a nameserver request
+      timed out. Bugfix on 0.1.2.1-alpha; our CLEAR debugging code had
+      been suppressing the bug since 0.1.2.10-alpha. Partial fix for
+      bug 929.
+    - Do not assume that a stack-allocated character array will be
+      64-bit aligned on platforms that demand that uint64_t access is
+      aligned. Possible fix for bug 604.
+    - Resolve a very rare crash bug that could occur when the user forced
+      a nameserver reconfiguration during the middle of a nameserver
+      probe. Fixes bug 526. Bugfix on 0.1.2.1-alpha.
+    - Avoid a "0 divided by 0" calculation when calculating router uptime
+      at directory authorities. Bugfix on 0.2.0.8-alpha.
+    - Fix an assertion bug in parsing policy-related options; possible fix
+      for bug 811.
+    - Rate-limit too-many-sockets messages: when they happen, they happen
+      a lot and end up filling up the disk. Resolves bug 748.
+    - Fix a race condition that could cause crashes or memory corruption
+      when running as a server with a controller listening for log
+      messages.
+    - Avoid crashing when we have a policy specified in a DirPolicy or
+      SocksPolicy or ReachableAddresses option with ports set on it,
+      and we re-load the policy. May fix bug 996.
+    - Fix an assertion failure on 64-bit platforms when we allocated
+      memory right up to the end of a memarea, then realigned the memory
+      one step beyond the end. Fixes a possible cause of bug 930.
+    - Protect the count of open sockets with a mutex, so we can't
+      corrupt it when two threads are closing or opening sockets at once.
+      Fix for bug 939. Bugfix on 0.2.0.1-alpha.
+
+  o Major bugfixes (clients):
+    - Discard router descriptors as we load them if they are more than
+      five days old. Otherwise if Tor is off for a long time and then
+      starts with cached descriptors, it will try to use the onion keys
+      in those obsolete descriptors when building circuits. Fixes bug 887.
+    - When we choose to abandon a new entry guard because we think our
+      older ones might be better, close any circuits pending on that
+      new entry guard connection. This fix should make us recover much
+      faster when our network is down and then comes back. Bugfix on
+      0.1.2.8-beta; found by lodger.
+    - When Tor clients restart after 1-5 days, they discard all their
+      cached descriptors as too old, but they still use the cached
+      consensus document. This approach is good for robustness, but
+      bad for performance: since they don't know any bandwidths, they
+      end up choosing at random rather than weighting their choice by
+      speed. Fixed by the above feature of putting bandwidths in the
+      consensus.
+
+  o Major bugfixes (relays):
+    - Relays were falling out of the networkstatus consensus for
+      part of a day if they changed their local config but the
+      authorities discarded their new descriptor as "not sufficiently
+      different". Now directory authorities accept a descriptor as changed
+      if BandwidthRate or BandwidthBurst changed. Partial fix for bug 962;
+      patch by Sebastian.
+    - Ensure that two circuits can never exist on the same connection
+      with the same circuit ID, even if one is marked for close. This
+      is conceivably a bugfix for bug 779; fixes a bug on 0.1.0.4-rc.
+    - Directory authorities were neglecting to mark relays down in their
+      internal histories if the relays fall off the routerlist without
+      ever being found unreachable. So there were relays in the histories
+      that haven't been seen for eight months, and are listed as being
+      up for eight months. This wreaked havoc on the "median wfu" and
+      "median mtbf" calculations, in turn making Guard and Stable flags
+      wrong, hurting network performance. Fixes bugs 696 and 969. Bugfix
+      on 0.2.0.6-alpha.
+
+  o Major bugfixes (hidden services):
+    - When establishing a hidden service, introduction points that
+      originate from cannibalized circuits were completely ignored
+      and not included in rendezvous service descriptors. This might
+      have been another reason for delay in making a hidden service
+      available. Bugfix from long ago (0.0.9.x?)
+
+  o Major bugfixes (memory and resource management):
+    - Fixed some memory leaks -- some quite frequent, some almost
+      impossible to trigger -- based on results from Coverity.
+    - Speed up parsing and cut down on memory fragmentation by using
+      stack-style allocations for parsing directory objects. Previously,
+      this accounted for over 40% of allocations from within Tor's code
+      on a typical directory cache.
+    - Use a Bloom filter rather than a digest-based set to track which
+      descriptors we need to keep around when we're cleaning out old
+      router descriptors. This speeds up the computation significantly,
+      and may reduce fragmentation.
+
+  o New/changed config options:
+    - Now NodeFamily and MyFamily config options allow spaces in
+      identity fingerprints, so it's easier to paste them in.
+      Suggested by Lucky Green.
+    - Allow ports 465 and 587 in the default exit policy again. We had
+      rejected them in 0.1.0.15, because back in 2005 they were commonly
+      misconfigured and ended up as spam targets. We hear they are better
+      locked down these days.
+    - Make TrackHostExit mappings expire a while after their last use, not
+      after their creation. Patch from Robert Hogan.
+    - Add an ExcludeExitNodes option so users can list a set of nodes
+      that should be be excluded from the exit node position, but
+      allowed elsewhere. Implements proposal 151.
+    - New --hush command-line option similar to --quiet. While --quiet
+      disables all logging to the console on startup, --hush limits the
+      output to messages of warning and error severity.
+    - New configure/torrc options (--enable-geoip-stats,
+      DirRecordUsageByCountry) to record how many IPs we've served
+      directory info to in each country code, how many status documents
+      total we've sent to each country code, and what share of the total
+      directory requests we should expect to see.
+    - Make outbound DNS packets respect the OutboundBindAddress setting.
+      Fixes the bug part of bug 798. Bugfix on 0.1.2.2-alpha.
+    - Allow separate log levels to be configured for different logging
+      domains. For example, this allows one to log all notices, warnings,
+      or errors, plus all memory management messages of level debug or
+      higher, with: Log [MM] debug-err [*] notice-err file /var/log/tor.
+    - Update to the "June 3 2009" ip-to-country file.
+
+  o Minor features (relays):
+    - Raise the minimum rate limiting to be a relay from 20000 bytes
+      to 20480 bytes (aka 20KB/s), to match our documentation. Also
+      update directory authorities so they always assign the Fast flag
+      to relays with 20KB/s of capacity. Now people running relays won't
+      suddenly find themselves not seeing any use, if the network gets
+      faster on average.
+    - If we're a relay and we change our IP address, be more verbose
+      about the reason that made us change. Should help track down
+      further bugs for relays on dynamic IP addresses.
+    - Exit servers can now answer resolve requests for ip6.arpa addresses.
+    - Implement most of Proposal 152: allow specialized servers to permit
+      single-hop circuits, and clients to use those servers to build
+      single-hop circuits when using a specialized controller. Patch
+      from Josh Albrecht. Resolves feature request 768.
+    - When relays do their initial bandwidth measurement, don't limit
+      to just our entry guards for the test circuits. Otherwise we tend
+      to have multiple test circuits going through a single entry guard,
+      which makes our bandwidth test less accurate. Fixes part of bug 654;
+      patch contributed by Josh Albrecht.
+
+  o Minor features (directory authorities):
+    - Try not to open more than one descriptor-downloading connection
+      to an authority at once. This should reduce load on directory
+      authorities. Fixes bug 366.
+    - Add cross-certification to newly generated certificates, so that
+      a signing key is enough information to look up a certificate. Start
+      serving certificates by <identity digest, signing key digest>
+      pairs. Implements proposal 157.
+    - When a directory authority downloads a descriptor that it then
+      immediately rejects, do not retry downloading it right away. Should
+      save some bandwidth on authorities. Fix for bug 888. Patch by
+      Sebastian Hahn.
+    - Directory authorities now serve a /tor/dbg-stability.txt URL to
+      help debug WFU and MTBF calculations.
+    - In directory authorities' approved-routers files, allow
+      fingerprints with or without space.
+
+  o Minor features (directory mirrors):
+    - When a download gets us zero good descriptors, do not notify
+      Tor that new directory information has arrived.
+    - Servers support a new URL scheme for consensus downloads that
+      allows the client to specify which authorities are trusted.
+      The server then only sends the consensus if the client will trust
+      it. Otherwise a 404 error is sent back. Clients use this
+      new scheme when the server supports it (meaning it's running
+      0.2.1.1-alpha or later). Implements proposal 134.
+
+  o Minor features (bridges):
+    - If the bridge config line doesn't specify a port, assume 443.
+      This makes bridge lines a bit smaller and easier for users to
+      understand.
+    - If we're using bridges and our network goes away, be more willing
+      to forgive our bridges and try again when we get an application
+      request.
+
+  o Minor features (hidden services):
+    - When the client launches an introduction circuit, retry with a
+      new circuit after 30 seconds rather than 60 seconds.
+    - Launch a second client-side introduction circuit in parallel
+      after a delay of 15 seconds (based on work by Christian Wilms).
+    - Hidden services start out building five intro circuits rather
+      than three, and when the first three finish they publish a service
+      descriptor using those. Now we publish our service descriptor much
+      faster after restart.
+    - Drop the requirement to have an open dir port for storing and
+      serving v2 hidden service descriptors.
+
+  o Minor features (build and packaging):
+    - On Linux, use the prctl call to re-enable core dumps when the User
+      option is set.
+    - Try to make sure that the version of Libevent we're running with
+      is binary-compatible with the one we built with. May address bug
+      897 and others.
+    - Add a new --enable-local-appdata configuration switch to change
+      the default location of the datadir on win32 from APPDATA to
+      LOCAL_APPDATA. In the future, we should migrate to LOCAL_APPDATA
+      entirely. Patch from coderman.
+    - Build correctly against versions of OpenSSL 0.9.8 or later that
+      are built without support for deprecated functions.
+    - On platforms with a maximum syslog string length, truncate syslog
+      messages to that length ourselves, rather than relying on the
+      system to do it for us.
+    - Automatically detect MacOSX versions earlier than 10.4.0, and
+      disable kqueue from inside Tor when running with these versions.
+      We previously did this from the startup script, but that was no
+      help to people who didn't use the startup script. Resolves bug 863.
+    - Build correctly when configured to build outside the main source
+      path. Patch from Michael Gold.
+    - Disable GCC's strict alias optimization by default, to avoid the
+      likelihood of its introducing subtle bugs whenever our code violates
+      the letter of C99's alias rules.
+    - Change the contrib/tor.logrotate script so it makes the new
+      logs as "_tor:_tor" rather than the default, which is generally
+      "root:wheel". Fixes bug 676, reported by Serge Koksharov.
+    - Change our header file guard macros to be less likely to conflict
+      with system headers. Adam Langley noticed that we were conflicting
+      with log.h on Android.
+    - Add a couple of extra warnings to --enable-gcc-warnings for GCC 4.3,
+      and stop using a warning that had become unfixably verbose under
+      GCC 4.3.
+    - Use a lockfile to make sure that two Tor processes are not
+      simultaneously running with the same datadir.
+    - Allow OpenSSL to use dynamic locks if it wants.
+    - Add LIBS=-lrt to Makefile.am so the Tor RPMs use a static libevent.
+
+  o Minor features (controllers):
+    - When generating circuit events with verbose nicknames for
+      controllers, try harder to look up nicknames for routers on a
+      circuit. (Previously, we would look in the router descriptors we had
+      for nicknames, but not in the consensus.) Partial fix for bug 941.
+    - New controller event NEWCONSENSUS that lists the networkstatus
+      lines for every recommended relay. Now controllers like Torflow
+      can keep up-to-date on which relays they should be using.
+    - New controller event "clients_seen" to report a geoip-based summary
+      of which countries we've seen clients from recently. Now controllers
+      like Vidalia can show bridge operators that they're actually making
+      a difference.
+    - Add a 'getinfo status/clients-seen' controller command, in case
+      controllers want to hear clients_seen events but connect late.
+    - New CONSENSUS_ARRIVED event to note when a new consensus has
+      been fetched and validated.
+    - Add an internal-use-only __ReloadTorrcOnSIGHUP option for
+      controllers to prevent SIGHUP from reloading the configuration.
+      Fixes bug 856.
+    - Return circuit purposes in response to GETINFO circuit-status.
+      Fixes bug 858.
+    - Serve the latest v3 networkstatus consensus via the control
+      port. Use "getinfo dir/status-vote/current/consensus" to fetch it.
+    - Add a "GETINFO /status/bootstrap-phase" controller option, so the
+      controller can query our current bootstrap state in case it attaches
+      partway through and wants to catch up.
+    - Provide circuit purposes along with circuit events to the controller.
+
+  o Minor features (tools):
+    - Do not have tor-resolve automatically refuse all .onion addresses;
+      if AutomapHostsOnResolve is set in your torrc, this will work fine.
+    - Add a -p option to tor-resolve for specifying the SOCKS port: some
+      people find host:port too confusing.
+    - Print the SOCKS5 error message string as well as the error code
+      when a tor-resolve request fails. Patch from Jacob.
+
+  o Minor bugfixes (memory and resource management):
+    - Clients no longer cache certificates for authorities they do not
+      recognize. Bugfix on 0.2.0.9-alpha.
+    - Do not use C's stdio library for writing to log files. This will
+      improve logging performance by a minute amount, and will stop
+      leaking fds when our disk is full. Fixes bug 861.
+    - Stop erroneous use of O_APPEND in cases where we did not in fact
+      want to re-seek to the end of a file before every last write().
+    - Fix a small alignment and memory-wasting bug on buffer chunks.
+      Spotted by rovv.
+    - Add a malloc_good_size implementation to OpenBSD_malloc_linux.c,
+      to avoid unused RAM in buffer chunks and memory pools.
+    - Reduce the default smartlist size from 32 to 16; it turns out that
+      most smartlists hold around 8-12 elements tops.
+    - Make dumpstats() log the fullness and size of openssl-internal
+      buffers.
+    - If the user has applied the experimental SSL_MODE_RELEASE_BUFFERS
+      patch to their OpenSSL, turn it on to save memory on servers. This
+      patch will (with any luck) get included in a mainline distribution
+      before too long.
+    - Fix a memory leak when v3 directory authorities load their keys
+      and cert from disk. Bugfix on 0.2.0.1-alpha.
+    - Stop using malloc_usable_size() to use more area than we had
+      actually allocated: it was safe, but made valgrind really unhappy.
+    - Make the assert_circuit_ok() function work correctly on circuits that
+      have already been marked for close.
+    - Fix uninitialized size field for memory area allocation: may improve
+      memory performance during directory parsing.
+
+  o Minor bugfixes (clients):
+    - Stop reloading the router list from disk for no reason when we
+      run out of reachable directory mirrors. Once upon a time reloading
+      it would set the 'is_running' flag back to 1 for them. It hasn't
+      done that for a long time.
+    - When we had picked an exit node for a connection, but marked it as
+      "optional", and it turned out we had no onion key for the exit,
+      stop wanting that exit and try again. This situation may not
+      be possible now, but will probably become feasible with proposal
+      158. Spotted by rovv. Fixes another case of bug 752.
+    - Fix a bug in address parsing that was preventing bridges or hidden
+      service targets from being at IPv6 addresses.
+    - Do not remove routers as too old if we do not have any consensus
+      document. Bugfix on 0.2.0.7-alpha.
+    - When an exit relay resolves a stream address to a local IP address,
+      do not just keep retrying that same exit relay over and
+      over. Instead, just close the stream. Addresses bug 872. Bugfix
+      on 0.2.0.32. Patch from rovv.
+    - Made Tor a little less aggressive about deleting expired
+      certificates. Partial fix for bug 854.
+    - Treat duplicate certificate fetches as failures, so that we do
+      not try to re-fetch an expired certificate over and over and over.
+    - Do not say we're fetching a certificate when we'll in fact skip it
+      because of a pending download.
+    - If we have correct permissions on $datadir, we complain to stdout
+      and fail to start. But dangerous permissions on
+      $datadir/cached-status/ would cause us to open a log and complain
+      there. Now complain to stdout and fail to start in both cases. Fixes
+      bug 820, reported by seeess.
+
+  o Minor bugfixes (bridges):
+    - When we made bridge authorities stop serving bridge descriptors over
+      unencrypted links, we also broke DirPort reachability testing for
+      bridges. So bridges with a non-zero DirPort were printing spurious
+      warns to their logs. Bugfix on 0.2.0.16-alpha. Fixes bug 709.
+    - Don't allow a bridge to publish its router descriptor to a
+      non-bridge directory authority. Fixes part of bug 932.
+    - When we change to or from being a bridge, reset our counts of
+      client usage by country. Fixes bug 932.
+
+  o Minor bugfixes (relays):
+    - Log correct error messages for DNS-related network errors on
+      Windows.
+    - Actually return -1 in the error case for read_bandwidth_usage().
+      Harmless bug, since we currently don't care about the return value
+      anywhere. Bugfix on 0.2.0.9-alpha.
+    - Provide a more useful log message if bug 977 (related to buffer
+      freelists) ever reappears, and do not crash right away.
+    - We were already rejecting relay begin cells with destination port
+      of 0. Now also reject extend cells with destination port or address
+      of 0. Suggested by lark.
+    - When we can't transmit a DNS request due to a network error, retry
+      it after a while, and eventually transmit a failing response to
+      the RESOLVED cell. Bugfix on 0.1.2.5-alpha.
+    - Solve a bug that kept hardware crypto acceleration from getting
+      enabled when accounting was turned on. Fixes bug 907. Bugfix on
+      0.0.9pre6.
+    - When a canonical connection appears later in our internal list
+      than a noncanonical one for a given OR ID, always use the
+      canonical one. Bugfix on 0.2.0.12-alpha. Fixes bug 805.
+      Spotted by rovv.
+    - Avoid some nasty corner cases in the logic for marking connections
+      as too old or obsolete or noncanonical for circuits. Partial
+      bugfix on bug 891.
+    - Fix another interesting corner-case of bug 891 spotted by rovv:
+      Previously, if two hosts had different amounts of clock drift, and
+      one of them created a new connection with just the wrong timing,
+      the other might decide to deprecate the new connection erroneously.
+      Bugfix on 0.1.1.13-alpha.
+    - If one win32 nameserver fails to get added, continue adding the
+      rest, and don't automatically fail.
+    - Fix a bug where an unreachable relay would establish enough
+      reachability testing circuits to do a bandwidth test -- if
+      we already have a connection to the middle hop of the testing
+      circuit, then it could establish the last hop by using the existing
+      connection. Bugfix on 0.1.2.2-alpha, exposed when we made testing
+      circuits no longer use entry guards in 0.2.1.3-alpha.
+
+  o Minor bugfixes (directory authorities):
+    - Limit uploaded directory documents to be 16M rather than 500K.
+      The directory authorities were refusing v3 consensus votes from
+      other authorities, since the votes are now 504K. Fixes bug 959;
+      bugfix on 0.0.2pre17 (where we raised it from 50K to 500K ;).
+    - Directory authorities should never send a 503 "busy" response to
+      requests for votes or keys. Bugfix on 0.2.0.8-alpha; exposed by
+      bug 959.
+    - Fix code so authorities _actually_ send back X-Descriptor-Not-New
+      headers. Bugfix on 0.2.0.10-alpha.
+
+  o Minor bugfixes (hidden services):
+    - When we can't find an intro key for a v2 hidden service descriptor,
+      fall back to the v0 hidden service descriptor and log a bug message.
+      Workaround for bug 1024.
+    - In very rare situations new hidden service descriptors were
+      published earlier than 30 seconds after the last change to the
+      service. (We currently think that a hidden service descriptor
+      that's been stable for 30 seconds is worth publishing.)
+    - If a hidden service sends us an END cell, do not consider
+      retrying the connection; just close it. Patch from rovv.
+    - If we are not using BEGIN_DIR cells, don't attempt to contact hidden
+      service directories if they have no advertised dir port. Bugfix
+      on 0.2.0.10-alpha.
+
+  o Minor bugfixes (tools):
+    - In the torify(1) manpage, mention that tsocks will leak your
+      DNS requests.
+
+  o Minor bugfixes (controllers):
+    - If the controller claimed responsibility for a stream, but that
+      stream never finished making its connection, it would live
+      forever in circuit_wait state. Now we close it after SocksTimeout
+      seconds. Bugfix on 0.1.2.7-alpha; reported by Mike Perry.
+    - Make DNS resolved controller events into "CLOSED", not
+      "FAILED". Bugfix on 0.1.2.5-alpha. Fix by Robert Hogan. Resolves
+      bug 807.
+    - The control port would close the connection before flushing long
+      replies, such as the network consensus, if a QUIT command was issued
+      before the reply had completed. Now, the control port flushes all
+      pending replies before closing the connection. Also fix a spurious
+      warning when a QUIT command is issued after a malformed or rejected
+      AUTHENTICATE command, but before the connection was closed. Patch
+      by Marcus Griep. Fixes bugs 1015 and 1016.
+    - Fix a bug that made stream bandwidth get misreported to the
+      controller.
+
+  o Deprecated and removed features:
+    - The old "tor --version --version" command, which would print out
+      the subversion "Id" of most of the source files, is now removed. It
+      turned out to be less useful than we'd expected, and harder to
+      maintain.
+    - RedirectExits has been removed. It was deprecated since
+      0.2.0.3-alpha.
+    - Finally remove deprecated "EXTENDED_FORMAT" controller feature. It
+      has been called EXTENDED_EVENTS since 0.1.2.4-alpha.
+    - Cell pools are now always enabled; --disable-cell-pools is ignored.
+    - Directory mirrors no longer fetch the v1 directory or
+      running-routers files. They are obsolete, and nobody asks for them
+      anymore. This is the first step to making v1 authorities obsolete.
+    - Take out the TestVia config option, since it was a workaround for
+      a bug that was fixed in Tor 0.1.1.21.
+    - Mark RendNodes, RendExcludeNodes, HiddenServiceNodes, and
+      HiddenServiceExcludeNodes as obsolete: they never worked properly,
+      and nobody seems to be using them. Fixes bug 754. Bugfix on
+      0.1.0.1-rc. Patch from Christian Wilms.
+    - Remove all backward-compatibility code for relays running
+      versions of Tor so old that they no longer work at all on the
+      Tor network.
+
+  o Code simplifications and refactoring:
+    - Tool-assisted documentation cleanup. Nearly every function or
+      static variable in Tor should have its own documentation now.
+    - Rename the confusing or_is_obsolete field to the more appropriate
+      is_bad_for_new_circs, and move it to or_connection_t where it
+      belongs.
+    - Move edge-only flags from connection_t to edge_connection_t: not
+      only is this better coding, but on machines of plausible alignment,
+      it should save 4-8 bytes per connection_t. "Every little bit helps."
+    - Rename ServerDNSAllowBrokenResolvConf to ServerDNSAllowBrokenConfig
+      for consistency; keep old option working for backward compatibility.
+    - Simplify the code for finding connections to use for a circuit.
+    - Revise the connection_new functions so that a more typesafe variant
+      exists. This will work better with Coverity, and let us find any
+      actual mistakes we're making here.
+    - Refactor unit testing logic so that dmalloc can be used sensibly
+      with unit tests to check for memory leaks.
+    - Move all hidden-service related fields from connection and circuit
+      structure to substructures: this way they won't eat so much memory.
+    - Squeeze 2-5% out of client performance (according to oprofile) by
+      improving the implementation of some policy-manipulation functions.
+    - Change the implementation of ExcludeNodes and ExcludeExitNodes to
+      be more efficient. Formerly it was quadratic in the number of
+      servers; now it should be linear. Fixes bug 509.
+    - Save 16-22 bytes per open circuit by moving the n_addr, n_port,
+      and n_conn_id_digest fields into a separate structure that's
+      only needed when the circuit has not yet attached to an n_conn.
+    - Optimize out calls to time(NULL) that occur for every IO operation,
+      or for every cell. On systems like Windows where time() is a
+      slow syscall, this fix will be slightly helpful.
+
+
+Changes in version 0.2.0.35 - 2009-06-24
+  o Security fix:
+    - Avoid crashing in the presence of certain malformed descriptors.
+      Found by lark, and by automated fuzzing.
+    - Fix an edge case where a malicious exit relay could convince a
+      controller that the client's DNS question resolves to an internal IP
+      address. Bug found and fixed by "optimist"; bugfix on 0.1.2.8-beta.
+
+  o Major bugfixes:
+    - Finally fix the bug where dynamic-IP relays disappear when their
+      IP address changes: directory mirrors were mistakenly telling
+      them their old address if they asked via begin_dir, so they
+      never got an accurate answer about their new address, so they
+      just vanished after a day. For belt-and-suspenders, relays that
+      don't set Address in their config now avoid using begin_dir for
+      all direct connections. Should fix bugs 827, 883, and 900.
+    - Fix a timing-dependent, allocator-dependent, DNS-related crash bug
+      that would occur on some exit nodes when DNS failures and timeouts
+      occurred in certain patterns. Fix for bug 957.
+
+  o Minor bugfixes:
+    - When starting with a cache over a few days old, do not leak
+      memory for the obsolete router descriptors in it. Bugfix on
+      0.2.0.33; fixes bug 672.
+    - Hidden service clients didn't use a cached service descriptor that
+      was older than 15 minutes, but wouldn't fetch a new one either,
+      because there was already one in the cache. Now, fetch a v2
+      descriptor unless the same descriptor was added to the cache within
+      the last 15 minutes. Fixes bug 997; reported by Marcus Griep.
+
+
 Changes in version 0.2.0.34 - 2009-02-08
   Tor 0.2.0.34 features several more security-related fixes. You should
   upgrade, especially if you run an exit relay (remote crash) or a

Modified: tor/trunk/acinclude.m4
===================================================================
--- tor/trunk/acinclude.m4	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/acinclude.m4	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-dnl $Id$
 dnl Helper macros for Tor configure.in
 dnl Copyright (c) 2001-2004, Roger Dingledine
 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson

Modified: tor/trunk/configure.in
===================================================================
--- tor/trunk/configure.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/configure.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,11 +1,10 @@
-dnl $Id$
 dnl Copyright (c) 2001-2004, Roger Dingledine
 dnl Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
 dnl Copyright (c) 2007-2008, The Tor Project, Inc.
 dnl See LICENSE for licensing information
 
 AC_INIT
-AM_INIT_AUTOMAKE(tor, 0.2.1.14-rc)
+AM_INIT_AUTOMAKE(tor, 0.2.2.0-alpha-dev)
 AM_CONFIG_HEADER(orconfig.h)
 
 AC_CANONICAL_HOST
@@ -86,13 +85,34 @@
      ;;
 esac
 
-AC_ARG_ENABLE(geoip-stats,
-     AS_HELP_STRING(--enable-geoip-stats, enable code for directories to collect per-country statistics))
+AC_ARG_ENABLE(exit-stats,
+     AS_HELP_STRING(--enable-exit-stats, enable code for exits to collect per-port statistics))
 
-if test "$enable_geoip_stats" = "yes"; then
-  AC_DEFINE(ENABLE_GEOIP_STATS, 1, [Defined if we try to collect per-country statistics])
+if test "$enable_exit_stats" = "yes"; then
+  AC_DEFINE(ENABLE_EXIT_STATS, 1, [Defined if we try to collect per-port statistics on exits])
 fi
 
+AC_ARG_ENABLE(dirreq-stats,
+     AS_HELP_STRING(--enable-dirreq-stats, enable code for directories to collect per-country statistics))
+
+if test "$enable_dirreq_stats" = "yes"; then
+  AC_DEFINE(ENABLE_DIRREQ_STATS, 1, [Defined if we try to collect per-country statistics])
+fi
+
+AC_ARG_ENABLE(buffer-stats,
+     AS_HELP_STRING(--enable-buffer-stats, enable code for relays to collect buffer statistics))
+
+if test "$enable_buffer_stats" = "yes"; then
+  AC_DEFINE(ENABLE_BUFFER_STATS, 1, [Defined if we try to collect buffer statistics])
+fi
+
+AC_ARG_ENABLE(entry-stats,
+     AS_HELP_STRING(--enable-entry-stats, enable code for entry guards to collect per-country statistics))
+
+if test "$enable_entry_stats" = "yes"; then
+  AC_DEFINE(ENABLE_ENTRY_STATS, 1, [Defined if we try to collect per-country statistics])
+fi
+
 AC_ARG_ENABLE(gcc-warnings,
      AS_HELP_STRING(--enable-gcc-warnings, enable verbose warnings))
 
@@ -107,7 +127,11 @@
 AC_PROG_CPP
 AC_PROG_MAKE_SET
 AC_PROG_RANLIB
+AC_PROG_SED
 
+AC_PATH_PROG([SHA1SUM], [sha1sum], none)
+AC_PATH_PROG([OPENSSL], [openssl], none)
+
 TORUSER=_tor
 AC_ARG_WITH(tor-user,
         [  --with-tor-user=NAME    Specify username for tor daemon ],
@@ -270,15 +294,19 @@
 LIBS="-levent $TOR_LIB_WS32 $LIBS"
 LDFLAGS="$TOR_LDFLAGS_libevent $LDFLAGS"
 CPPFLAGS="$TOR_CPPFLAGS_libevent $CPPFLAGS"
-AC_CHECK_FUNCS(event_get_version event_get_method event_set_log_callback)
+AC_CHECK_FUNCS(event_get_version event_get_version_number event_get_method event_set_log_callback evdns_set_outgoing_bind_address event_base_loopexit)
 AC_CHECK_MEMBERS([struct event.min_heap_idx], , ,
 [#include <event.h>
 ])
 
+AC_CHECK_HEADERS(event2/event.h event2/dns.h)
+
 LIBS="$save_LIBS"
 LDFLAGS="$save_LDFLAGS"
 CPPFLAGS="$save_CPPFLAGS"
 
+AM_CONDITIONAL(USE_EXTERNAL_EVDNS, test x$ac_cv_header_event2_dns_h = xyes)
+
 dnl ------------------------------------------------------
 dnl Where do you live, openssl?  And how do we call you?
 

Modified: tor/trunk/contrib/checkOptionDocs.pl
===================================================================
--- tor/trunk/contrib/checkOptionDocs.pl	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/checkOptionDocs.pl	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/usr/bin/perl -w
-# $Id
 use strict;
 
 my %options = ();

Modified: tor/trunk/contrib/checkSpace.pl
===================================================================
--- tor/trunk/contrib/checkSpace.pl	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/checkSpace.pl	2009-08-19 21:47:25 UTC (rev 20335)
@@ -42,9 +42,8 @@
             $lastnil = 0;
         }
         ## Terminals are still 80 columns wide in my world.  I refuse to
-        ## accept double-line lines.  Except, of course, svn Id tags
-        ## can make us go long.
-        if (/^.{80}/ && !/\$Id: /) {
+        ## accept double-line lines.
+        if (/^.{80}/) {
             print "     Wide:$fn:$.\n";
         }
         ### Juju to skip over comments and strings, since the tests

Modified: tor/trunk/contrib/cross.sh
===================================================================
--- tor/trunk/contrib/cross.sh	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/cross.sh	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/bin/bash
-# $Id$
 # Copyright 2006 Michael Mohr with modifications by Roger Dingledine
 # See LICENSE for licensing information.
 

Modified: tor/trunk/contrib/directory-archive/fetch-all-v3
===================================================================
--- tor/trunk/contrib/directory-archive/fetch-all-v3	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/directory-archive/fetch-all-v3	2009-08-19 21:47:25 UTC (rev 20335)
@@ -35,6 +35,7 @@
 DIRSERVERS="$DIRSERVERS 194.109.206.212:80"	# dizum
 #DIRSERVERS="$DIRSERVERS 128.31.0.34:9032"	# moria2
 DIRSERVERS="$DIRSERVERS 213.73.91.31:80"	# dannenberg
+DIRSERVERS="$DIRSERVERS 208.83.223.34:443"	# urras
 TIME=$(date "+%Y%m%d-%H%M%S")
 
 . fetch-all-functions

Modified: tor/trunk/contrib/id_to_fp.c
===================================================================
--- tor/trunk/contrib/id_to_fp.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/id_to_fp.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 /* Copyright 2006 Nick Mathewson; see LICENSE for licensing information */
-/* $Id$ */
 
 /* id_to_fp.c : Helper for directory authority ops.  When somebody sends us
  * a private key, this utility converts the private key into a fingerprint

Modified: tor/trunk/contrib/nagios-check-tor-authority-cert
===================================================================
--- tor/trunk/contrib/nagios-check-tor-authority-cert	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/nagios-check-tor-authority-cert	2009-08-19 21:47:25 UTC (rev 20335)
@@ -8,8 +8,6 @@
 # Usage: nagios-check-tor-authority-cert <authority identity fingerprint>
 # e.g.: nagios-check-tor-authority-cert A9AC67E64B200BBF2FA26DF194AC0469E2A948C6
 
-# $Id$
-
 # Copyright (c) 2008 Peter Palfrader <peter@xxxxxxxxxxxxx>
 #
 # Permission is hereby granted, free of charge, to any person obtaining

Modified: tor/trunk/contrib/osx/package.sh
===================================================================
--- tor/trunk/contrib/osx/package.sh	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/osx/package.sh	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/bin/sh
-# $Id$
 # Copyright 2004-2005 Nick Mathewson. 
 # Copyright 2005-2007 Andrew Lewman
 # Copyright 2008 The Tor Project, Inc.

Modified: tor/trunk/contrib/osx/uninstall_tor_bundle.sh
===================================================================
--- tor/trunk/contrib/osx/uninstall_tor_bundle.sh	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/osx/uninstall_tor_bundle.sh	2009-08-19 21:47:25 UTC (rev 20335)
@@ -134,7 +134,7 @@
 ## clean up
 echo ". Cleaning up"
 rm -rf $TEMP_BOM_CONTENTS
-rm -rf /Library/Privoxy/ /Library/StartupItems/Privoxy/ /Library/Tor/ /Library/StartupItems/Tor/ /Library/Torbutton/ 
+rm -rf /Library/Privoxy/ /Library/StartupItems/Privoxy/ /Library/Tor/ /Library/StartupItems/Tor/ /Library/Torbutton/ /Library/Receipts/Privoxy.pkg /Library/Receipts/torbutton.pkg /Library/Receipts/Tor.pkg /Library/Receipts/Vidalia.pkg /Library/Receipts/TorStartup.pkg
 
 echo ". Finished"
 

Modified: tor/trunk/contrib/polipo/package.sh
===================================================================
--- tor/trunk/contrib/polipo/package.sh	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/polipo/package.sh	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/bin/sh
-# $Id: package.sh 8992 2006-12-23 03:12:09Z phobos $
 # Copyright 2004-2005 Nick Mathewson & Andrew Lewman. 
 # Copyright 2005-2008 Andrew Lewman
 # This is licensed under the Modified BSD License.

Modified: tor/trunk/contrib/rc.subr
===================================================================
--- tor/trunk/contrib/rc.subr	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/rc.subr	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/bin/sh
-# $Id$
 # $FreeBSD: ports/security/tor-devel/files/tor.in,v 1.1 2006/02/17 22:21:25 mnag Exp $
 #
 # (rc.subr written by Peter Thoenen for Net/FreeBSD)

Modified: tor/trunk/contrib/tor-mingw.nsi.in
===================================================================
--- tor/trunk/contrib/tor-mingw.nsi.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/tor-mingw.nsi.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -9,7 +9,7 @@
 !include "FileFunc.nsh"
 !insertmacro GetParameters
   
-!define VERSION "0.2.1.14-rc"
+!define VERSION "0.2.2.0-alpha-dev"
 !define INSTALLER "tor-${VERSION}-win32.exe"
 !define WEBSITE "https://www.torproject.org/";
 !define LICENSE "LICENSE"
@@ -216,6 +216,7 @@
 	Delete "$INSTDIR\tor.ico"
 	Delete "$SMSTARTUP\Tor.lnk"
 	Delete "$INSTDIR\Uninstall.exe"
+    Delete "$INSTDIR\geoip"
 FunctionEnd
 
 Function un.InstallDirectories

Modified: tor/trunk/contrib/tor-resolve.py
===================================================================
--- tor/trunk/contrib/tor-resolve.py	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/tor-resolve.py	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,4 @@
 #!/usr/bin/python
-#$Id$
 
 import socket
 import struct

Modified: tor/trunk/contrib/torify.1
===================================================================
--- tor/trunk/contrib/torify.1	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/torify.1	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,22 +1,27 @@
 .TH torify 1 "" Jan-2009 ""
-.\" manual page by Peter Palfrader
+.\" manual page by Peter Palfrader and Jacob Appelbaum
 .SH NAME
 .LP
-torify \- wrapper for tsocks and tor
+torify \- wrapper for torsocks or tsocks and tor
 
 .SH SYNOPSIS
 \fBtorify\fP\ \fIapplication\fP\ [\fIapplication's\ arguments\fP]
 
 .SH DESCRIPTION
-\fBtorify\fR is a simple wrapper that calls tsocks with a tor specific
+\fBtorify\fR is a simple wrapper that attempts to find the best underlying Tor
+wrapper available on a system. It calls torsocks or tsocks with a tor specific
 configuration file.
 
+torsocks is an improved wrapper that explictly rejects UDP, safely resolves DNS
+lookups and properly socksifies your TCP connections.
+
 tsocks itself is a wrapper between the tsocks library and the application
 that you would like to run socksified.
 
-Please note that since tsocks uses LD_PRELOAD, torify cannot be applied
+Please note that since both method use LD_PRELOAD, torify cannot be applied
 to suid binaries.
 
+.SH WARNING
 You should also be aware that the way tsocks currently works only TCP
 connections are socksified.  Be aware that this will in most circumstances
 not include hostname lookups which would still be routed through your
@@ -25,8 +30,13 @@
 The Tor FAQ at https://wiki.torproject.org/noreply/TheOnionRouter/TorFAQ might
 have further information on this subject.
 
+When used with torsocks, torify should not leak DNS requests or UDP data.
+
+Both will leak ICMP data.
+
 .SH SEE ALSO
 .BR tor (1),
 .BR tor-resolve (1),
+.BR torsocks (1),
 .BR tsocks (1),
 .BR tsocks.conf (5).

Modified: tor/trunk/contrib/torify.in
===================================================================
--- tor/trunk/contrib/torify.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/contrib/torify.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -10,36 +10,67 @@
 
 # Define and ensure we have tsocks
 # XXX: what if we don't have which?
+TORSOCKS="`which torsocks`"
 TSOCKS="`which tsocks`"
+PROG=""
 if [ ! -x "$TSOCKS" ]
 then
-        echo "$0: Can't find tsocks in PATH. Perhaps you haven't installed it?" >&2
-        exit 1
+	echo "$0: Can't find tsocks in PATH. Perhaps you haven't installed it?" >&2
+else
+	PROG=$TSOCKS
 fi
+if [ ! -x "$TORSOCKS" ]
+then
+	echo "$0: Can't find torsocks in PATH. Perhaps you haven't installed it?" >&2
+else
+	PROG=$TORSOCKS
+fi
 
+if [ ! -x "$PROG" ]
+then
+	echo "$0: Can't find the required tor helpers in our PATH. Perhaps you haven't installed them?" >&2
+	exit 1;
+fi
+
 # Check for any argument list
 if [ "$#" = 0 ]
 then
-        echo "Usage: $0 <command> [<options>...]" >&2
-        exit 1
+	echo "Usage: $0 [-hv] <command> [<options>...]" >&2
+	exit 1
 fi
 if [ "$#" = 1 ] && ( [ "$1" = "-h" ] || [ "$1" = "--help" ] )
 then
-        echo "Usage: $0 <command> [<options>...]"
-        exit 0
+	echo "Usage: $0 [-hv] <command> [<options>...]"
+	exit 0
 fi
 
-# Define our tsocks config file
-TSOCKS_CONF_FILE="@CONFDIR@/tor-tsocks.conf"
-export TSOCKS_CONF_FILE
+if [ "$1" = "-v" ] || [ "$1" = "--verbose" ]
+then
+	echo "We're armed with the following tsocks: $TSOCKS"
+	echo "We're armed with the following torsocks: $TORSOCKS"
+	echo "We're attempting to use $PROG for all tor action."
+	shift 1
+fi
 
-# Check that we've got a tsocks config file
-if [ -r "$TSOCKS_CONF_FILE" ]
+if [ "$PROG" = "$TSOCKS" ]
 then
-	exec tsocks "$@"
-	echo "$0: Failed to exec tsocks $@" >&2
-	exit 1
-else
-	echo "$0: Missing tsocks configuration file \"$TSOCKS_CONF_FILE\"." >&2
-	exit 1
+	# Define our tsocks config file
+	TSOCKS_CONF_FILE="/etc/tor/tor-tsocks.conf"
+	export TSOCKS_CONF_FILE
+
+	# Check that we've got a tsocks config file
+	if [ -r "$TSOCKS_CONF_FILE" ]
+	then
+		echo "WARNING: tsocks is known to leak DNS and UDP data." >&2
+		exec tsocks "$@"
+		echo "$0: Failed to exec tsocks $@" >&2
+		exit 1
+	else
+		echo "$0: Missing tsocks configuration file \"$TSOCKS_CONF_FILE\"." >&2
+		exit 1
+	fi
 fi
+if [ "$PROG" = "$TORSOCKS" ]
+then
+	exec torsocks "$@"
+fi

Modified: tor/trunk/debian/changelog
===================================================================
--- tor/trunk/debian/changelog	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/changelog	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,3 +1,52 @@
+tor (0.2.1.19-1) unstable; urgency=low
+
+  * New upstream version.
+    - Make accessing hidden services on 0.2.1.x work right (closes: #538960).
+    [More items are in the upstream changelog.]
+
+ -- Peter Palfrader <weasel@xxxxxxxxxx>  Wed, 29 Jul 2009 12:49:03 +0200
+
+tor (0.2.1.18-1) unstable; urgency=low
+
+  * New upstream version.
+
+ -- Peter Palfrader <weasel@xxxxxxxxxx>  Sat, 25 Jul 2009 11:15:11 +0200
+
+tor (0.2.1.17-rc-1) experimental; urgency=low
+
+  * New upstream version.
+  * Update upstream URL in debian/copyright.
+
+ -- Peter Palfrader <weasel@xxxxxxxxxx>  Mon, 13 Jul 2009 23:37:37 +0200
+
+tor (0.2.1.16-rc-1) experimental; urgency=low
+
+  * New upstream version.
+  * No longer inform the user if/when we re-create the /var/run/tor
+    directory in the init script.  With /var/run on tmpfs this is
+    completely normal now so our message was just noise.
+  * Stop shipping /var/run/tor in the package.
+  * Only clean up permissions of /var/run/tor in postinst if the
+    directory actually exists.
+  * Update Standards-Version from 3.8.0 to 3.8.1.  No real changes
+    required, we already support nocheck in DEB_BUILD_OPTIONS since
+    August 2004, and we already create our var/run directory in the
+    init script (tho we now no longer ship it either - see above).
+  * Change debhelper compatibility version from 4 to 5:
+    - Change dh_strip call from --dbg-package=tor
+      to --dbg-package=tor-dbg.
+    - Update versioned build time dependency on debhelper.
+  * Forward port 06_add_compile_time_defaults.
+
+ -- Peter Palfrader <weasel@xxxxxxxxxx>  Sat, 20 Jun 2009 13:16:02 +0200
+
+tor (0.2.1.15-rc-1) experimental; urgency=low
+
+  * New upstream version.
+  * Change build time dependency on gs to ghostscript.
+
+ -- Peter Palfrader <weasel@xxxxxxxxxx>  Sat, 30 May 2009 21:10:03 +0200
+
 tor (0.2.1.14-rc-1) experimental; urgency=low
 
   * New upstream version.

Modified: tor/trunk/debian/compat
===================================================================
--- tor/trunk/debian/compat	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/compat	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1 +1 @@
-4
+5

Modified: tor/trunk/debian/control
===================================================================
--- tor/trunk/debian/control	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/control	2009-08-19 21:47:25 UTC (rev 20335)
@@ -2,8 +2,8 @@
 Section: comm
 Priority: optional
 Maintainer: Peter Palfrader <weasel@xxxxxxxxxx>
-Build-Depends: debhelper (>= 4.1.65), libssl-dev, dpatch, zlib1g-dev, libevent-dev (>= 1.1), texlive-base-bin, texlive-latex-base, texlive-fonts-recommended, transfig, gs, binutils (>= 2.14.90.0.7)
-Standards-Version: 3.8.0
+Build-Depends: debhelper (>= 5), libssl-dev, dpatch, zlib1g-dev, libevent-dev (>= 1.1), texlive-base-bin, texlive-latex-base, texlive-fonts-recommended, transfig, ghostscript, binutils (>= 2.14.90.0.7)
+Standards-Version: 3.8.1
 Homepage: https://www.torproject.org/
 
 Package: tor

Modified: tor/trunk/debian/copyright
===================================================================
--- tor/trunk/debian/copyright	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/copyright	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,7 @@
 This package was debianized by Peter Palfrader <weasel@xxxxxxxxxx> on
 Sat, 10 Jan 2004 11:20:06 +0100.
 
-It was downloaded from http://tor.eff.org/
+It was downloaded from https://www.torproject.org/
 
 Upstream Authors: Roger Dingledine <arma@xxxxxxxxxxxxx>
                   Nick Mathewson <nickm@xxxxxxxxxxxxx>

Modified: tor/trunk/debian/patches/06_add_compile_time_defaults.dpatch
===================================================================
--- tor/trunk/debian/patches/06_add_compile_time_defaults.dpatch	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/patches/06_add_compile_time_defaults.dpatch	2009-08-19 21:47:25 UTC (rev 20335)
@@ -50,7 +50,7 @@
 +  if (debian_config_fix_defaults() < 0)
 +    goto err;
 +
-   if (argv) { /* first time we're called. save commandline args */
+   if (argv) { /* first time we're called. save command line args */
      backup_argv = argv;
      backup_argc = argc;
 @@ -5307,3 +5313,62 @@

Modified: tor/trunk/debian/rules
===================================================================
--- tor/trunk/debian/rules	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/rules	2009-08-19 21:47:25 UTC (rev 20335)
@@ -189,8 +189,7 @@
 	dh_installinit
 	dh_installman
 	dh_link
-	# Change this for debhelper compatibility level 5 or later!
-	dh_strip --dbg-package=tor
+	dh_strip --dbg-package=tor-dbg
 	dh_compress
 	dh_fixperms
 	dh_installdeb

Modified: tor/trunk/debian/tor.dirs
===================================================================
--- tor/trunk/debian/tor.dirs	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/tor.dirs	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,6 @@
 etc/tor
 var/lib/tor
 var/log/tor
-var/run/tor
 usr/share/lintian/overrides
 usr/bin
 usr/sbin

Modified: tor/trunk/debian/tor.init
===================================================================
--- tor/trunk/debian/tor.init	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/tor.init	2009-08-19 21:47:25 UTC (rev 20335)
@@ -88,7 +88,7 @@
 
 check_torpiddir () {
 	if test ! -d $TORPIDDIR; then
-		echo "There is no $TORPIDDIR directory.  Creating one for you."
+		#echo "There is no $TORPIDDIR directory.  Creating one for you."
 		mkdir -m 02700 "$TORPIDDIR"
 		chown debian-tor:debian-tor "$TORPIDDIR"
 	fi

Modified: tor/trunk/debian/tor.postinst
===================================================================
--- tor/trunk/debian/tor.postinst	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/debian/tor.postinst	2009-08-19 21:47:25 UTC (rev 20335)
@@ -43,9 +43,11 @@
 find /var/lib/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02700
 find /var/lib/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600
 
-find /var/run/tor \( \( ! -user debian-tor \) -o \( ! -group debian-tor \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:debian-tor
-find /var/run/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750
-find /var/run/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600
+if [ -e /var/run/tor ]; then
+	find /var/run/tor \( \( ! -user debian-tor \) -o \( ! -group debian-tor \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:debian-tor
+	find /var/run/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750
+	find /var/run/tor -type f -print0 | xargs -0 --no-run-if-empty chmod 00600
+fi
 
 find /var/log/tor \( \( ! -user debian-tor \) -o \( ! -group adm \) \) -print0 | xargs -0 --no-run-if-empty chown debian-tor:adm
 find /var/log/tor -type d -print0 | xargs -0 --no-run-if-empty chmod 02750

Modified: tor/trunk/doc/HACKING
===================================================================
--- tor/trunk/doc/HACKING	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/HACKING	2009-08-19 21:47:25 UTC (rev 20335)
@@ -11,12 +11,20 @@
 0.1. Useful command-lines that are non-trivial to reproduce but can
 help with tracking bugs or leaks.
 
+0.1.1. Dmalloc
+
 dmalloc -l ~/dmalloc.log
 (run the commands it tells you)
 ./configure --with-dmalloc
 
+0.2.2. Valgrind
+
 valgrind --leak-check=yes --error-limit=no --show-reachable=yes src/or/tor
 
+(Note that if you get a zillion openssl warnings, you will also need to
+ pass --undef-value-errors=no to valgrind, or rebuild your openssl
+ with -DPURIFY.)
+
 0.2. Running gcov for unit test coverage
 
   make clean

Modified: tor/trunk/doc/TODO
===================================================================
--- tor/trunk/doc/TODO	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/TODO	2009-08-19 21:47:25 UTC (rev 20335)
@@ -4,8 +4,8 @@
 TODO.02x is the list of items we're planning to get done in the next
 stable release.
 
-TODO.external is the list of external constraints and deliverables that
-we all need to keep in mind.
+TODO.external lives in svn under /projects/todo/. It's the list of
+external constraints and deliverables that we all need to keep in mind.
 
 TODO.future is the list of other items we plan to get to in later releases.
 

Modified: tor/trunk/doc/TODO.021
===================================================================
--- tor/trunk/doc/TODO.021	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/TODO.021	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 Legend:
 SPEC!!  - Not specified
 SPEC    - Spec not finalized

Modified: tor/trunk/doc/TODO.022
===================================================================
--- tor/trunk/doc/TODO.022	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/TODO.022	2009-08-19 21:47:25 UTC (rev 20335)
@@ -8,14 +8,17 @@
         0.2.2, figure out how long the stuff we want will take, and
         triage accordingly, or vice versa.
 
-- Design
+- Design only
   - Begin design work for UDP transition; identify areas where we need to
     make changes or instrument stuff early.
+    [multiple weeks, ongoing.  Need to do a draft early.]
 
 - Performance, mostly protocol-neutral.
   - Work with Libevent 2.0's bufferevent interface
     - Identify any performance stuff we need to push back into
       libevent to make it as fast as we want.
+    - Get a decent rate-limiting feature into Libevent
+    - Get openssl support into Libevent.
 
   - Revise how we do bandwidth limiting and round-robining between
     circuits on a connection.
@@ -30,22 +33,77 @@
 
   - Figure out good ways to instrument Tor internals so we can tell
     how well our bandwidth and flow-control stuff is actually working.
+    - What ports eat the bandwidth?
+    - How full do queues get?
+    - How much latency do queues get?
 
-- Features
+  - Rate limit at clients:
+    - Give clients an upper bound on how much they're willing to use
+      the network if they're not relaying?
+    - ... or group client circuits by IP at the server and rate-limit
+      like that.
+
+  - Use if-modified-since to download consensuses
+
+
+- Other features
   - Proposals to implement:
-    - 146: reflect long-term stability
+    - 146: reflect long-term stability in consensuses
     - 147: Stop using v2 directories to generate v3 votes.
+      - Start pinging as soon as we learn about a relay, not on a
+        22-minute cycle.  Prioritize new and volatile relays for
+        testing.
 
   - Proposals to improve and implement
     - 158: microdescriptors
+      o Revise proposal
+      - Implement
+    - 160: list bandwidth in consensus
+RNM?  . Finish proposal
+      - and actually set it reasonably
+      - and actually use it.
 
   - Proposals to improve and implement if not broken
-    - IPv6 support.  (Parts of 117, but figure out how to handle DNS
+    D IPv6 support.  (Parts of 117, but figure out how to handle DNS
       requests.)
     - 140: Directory diffs
+      - Need a decent simple C diff implementation.
+      - Need a decent simple C ed patch implementation.
     - 149: learn info from netinfo cells.
-    - 134: handle authority fragmentation (Needs more analysis)
+      o Start discussion
+      - Revise proposal based on discussion.
+    X 134: handle authority fragmentation (Needs more analysis)
+    - 165: Easy migration for voting authority sets
+    - 163: Detect client-status better
+      o Write proposal
+      - Possibly implement, depending on discussion.
+    - 164: Have authorities report relay and voting status better: make it
+      easy to answer, "Why is my server not listed/not Guard/not
+      Running/etc"
+      o Write proposal
+      - Possibly implement, depending on discussion
+    - 162: Have consensuses come in multiple "flavours".
+      o Write proposal
+      - Possibly implement, depending on discussion.
 
+  - Needs a proposal, or at least some design
+    - Weaken the requirements for being a Guard, based on K's
+      measurements.
+K     - Finish measurements
+K?    - Write proposal
+    - Adaptive timeouts for giving up on circuits and streams.
+M     - Revise proposal 151
+    - Downweight guards more sensibly: be more forgiving about using
+      Guard nodes as non-first-hop.
+      - Write proposal.
+    - Lagged weight updates in consensuses: don't just move abruptly.
+M?    - Write proposal
+    d Don't kill a circuit on the first failed extend.
+
+- Installers
+  - Switch to MSI on win32
+  - Use Thandy, perhaps?
+
 - Deprecations
   - Make .exit safe, or make it off-by-default.
 

Modified: tor/trunk/doc/TODO.external
===================================================================
--- tor/trunk/doc/TODO.external	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/TODO.external	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,196 +1,4 @@
-$Id$
-Legend:
-SPEC!!  - Not specified
-SPEC    - Spec not finalized
-N       - nick claims
-R       - arma claims
-P       - phobos claims
-S       - Steven claims
-E       - Matt claims
-M       - Mike claims
-J       - Jeff claims
-I       - ioerror claims
-W       - weasel claims
-K       - Karsten claims
-C       - coderman claims
-        - Not done
-        * Top priority
-        . Partially done
-        o Done
-        d Deferrable
-        D Deferred
-        X Abandoned
 
-=======================================================================
+[This file moved to svn in /projects/todo/. More people can edit
+it more easily there. -RD]
 
-External constraints:
-
-For June/July:
-NR  - Work more on Paul's NRL research problem.
-
-For March 22:
-I   * Email auto-responder
-      * teach gettor how to ask for (and attach) split files.
-
-K   . Metrics.
-      . With Mike's help, use Torflow to start doing monthly rudimentary
-        performance evaluations:
-        . Circuit throughput and latency
-        - Measure via Broadband and dialup
-      . Publish a report addressing key long-term metrics questions:
-        . What metrics should we present?
-        . What data are available for these metrics?
-        . What data are missing, and can collect them safely? Can we
-          publish them safely?
-        . What systems are available to present this data?
-
-E   . Vidalia improvements
-      o Vidalia displays by-country user summary for bridge operators
-?       - write a help page for vidalia, "what is this"
-
-For mid August:
-
-Section 0, items that didn't make it into the original roadmap:
-
-0.1, installers and packaging
-C . i18n for the msi bundle files
-P . more consistent TBB builds
-IC- get a buildbot up again. Have Linux and BSD build machines.
-    (Windows would be nice but realistically will come later.)
-E - Get Tor to work properly on the iPhone.
-
-3.1, performance work. [Section numbers in here are from performance.pdf]
-  - High-priority items from performance.pdf
-RS  - 1.2, new circuit window sizes. make the default package window lower.
-R+  - 2.1, squeeze loud circuits
-      - Evaluate the code to see what stats we can keep about circuit use.
-      - Write proposals for various meddling. Look at the research papers
-        that Juliusz pointed us to. Ask our systems friends. Plan to put
-        a lot of the parameters in the consensus, so we can tune it with
-        short turnaround times.
-E+  - 2.5, Change Vidalia's default exit policy to not click "other
-      protocols". Or choose not to. Think this through first.
-R+  - 2.6, Tell users not to file-share.
-      - Put statement on the Tor front page
-      - Put statement on the download pages too
-      - And the FAQ
-    - 3.1.2, Tor weather
-I     - Implement time-to-notification (immediate, a day, a week)
-I     - Get a relay operator mailing list going, with a plan and supporting
-        scripts and so on.
-R     - Link to them from the Tor relay page
-R     - and the torrc.sample?
-SM  - 4.1, balance traffic better
-      - Steven and Mike should decide if we should do Steven's plan
-        (rejigger the bandwidth numbers at the authorities based on
-        Steven's algorithm), or Mike's plan (relay scanning to identify
-        the unbalanced relays and fix them on the fly), or both.
-      - Figure out how to actually modify bandwidths in the consensus. We
-        may need to change the consensus voting algorithm to decide what
-        bandwidth to advertise based on something other than median:
-        if 7 authorities provide bandwidths, and 2 are doing scanning,
-        then the 5 that aren't scanning will outvote any changes. Should
-        all 7 scan? Should only some vote? Extra points if it doesn't
-        change all the numbers every new consensus, so consensus diffing
-        is still practical.
-?   - 4.5, Older entry guards are overloaded
-      - Pick a conservative timeout like a month, and implement.
-M   - 5.2, better timeouts for giving up on circuits/streams
-      - clients gather data about circuit timeouts, and then abandon
-        circuits that take more than a std dev above that.
-
-4.1, IOCP / libevent / windows / tor
-N - get it working for nick
-N - put out a release so other people can start testing it.
-N - both the libevent buffer abstraction, and the
-    tor-uses-libevent-buffer-abstraction. Unless we think that's
-    unreachable for this milestone?
-
-4.2.1, risks from becoming a relay
-S - Have a clear plan for how users who become relays will be safe,
-    and be confident that we can build this plan.
-    - evaluate all the various attacks that are made possible by relaying.
-      specifically, see "relaying-traffic attacks" in 6.6.
-    - identify and evaluate ways to make them not a big deal
-      - setting a low RelayBandwidth
-      - Nick Hopper's FC08 paper suggesting that we should do a modified
-        round-robin so we leak less about other circuits
-      - instructing clients to disable pings in their firewall, etc
-    - pick the promising ones, improve them so they're even better, and
-      spec them out so we know how to build them and how much effort is
-      involved in building them.
-
-4.5, clients download less directory info
-N * deploy proposal 158.
-N - decide whether to do proposal 140. if so, construct an implementation
-    plan for how we'll do it. if not, explain why not.
-
-5.1, Normalize TLS fingerprint
-N o write a draft list of possible attacks for this section, with
-    estimates about difficulty of attack, difficulty of solution, etc
-N - revisit the list and revise our plans as needed
-NR- put up a blog post about the two contradictory conclusions: we can
-    discuss the theory of arms races, and our quandry, without revealing
-    any specific vulnerabilities. (or decide not to put up a blog post,
-    and explain why not.)
-
-5.5, email autoresponder
-I . maintenance and keeping it running
-
-5.7.2, metrics
-
-XXX.
-
-6.2, Vidalia work
-E - add breakpad support or similar for windows debugging
-E o let vidalia change languages without needing a restart
-E - Implement the status warning event interface started for the
-    phase one deliverables.
-E - Work with Steve Tyree on building a Vidalia plugin API to enable
-    building Herdict and TBB plugins.
-
-6.3, Node scanning
-M - Steps toward automation
-    - Set up email list for results
-    - Map failure types to potential BadExit lines
-M - Improve the ability of SoaT to mimic various real web browsers
-    - randomizing user agents and locale strings
-    - caching, XMLHTTPRequest, form posting, content sniffing
-    - Investigate ideas like running Chrome/xulrunner in parallel
-M - Other protocols
-    - SSH, IMAPS, POPS, SMTPS
-M - Add ability to geolocalize exit selection based on scanner location
-    - Use this to rescan dynamic urls filtered by the URL filter
-
-6.4, Torbutton development
-M - Resolve extension conflicts and other high priority bugs
-M - Fix or hack around ugly firefox bugs, especially Timezone issue.
-    Definitely leaning towards "hack around" unless we see some
-    level of love from Mozilla.
-M - Vidalia New Nym Integration
-    - Implement for Torbutton to pick up on Vidalia's NEWNYM and clear
-      cookies based on FoeBud's source
-    - Do this in such a way that we could adapt polipo to purge cache
-      if we were so inclined
-M - Write up a summary of our options for dealing with the google
-    you-must-solve-a-captcha-to-search problem, and pick one as our
-    favorite option.
-
-6.6, Evaluate new anonymity attacks
-S - relaying-traffic attacks
-    - original murdoch-danezis attack
-    - nick hopper's latency measurement attack
-    - columbia bandwidth measurement attack
-    - christian grothoff's long-circuit attack
-S - client attacks
-    - website fingerprinting
-
-7.1, Tor VM Research, analysis, and prototyping
-C . Get a working package out, meaning other people are testing it.
-
-7.2, Tor Browser Bundle
-I - Port to one of OS X or Linux, and start the port to the other.
-I . Make it the recommended Tor download on Windows
-I - Make sure it's easy to un-brand TBB in case Firefox asks us to
-I - Evaluate CCC's Freedom Stick
-

Modified: tor/trunk/doc/TODO.future
===================================================================
--- tor/trunk/doc/TODO.future	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/TODO.future	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 Legend:
 SPEC!!  - Not specified
 SPEC    - Spec not finalized

Modified: tor/trunk/doc/design-paper/latex8.bst
===================================================================
--- tor/trunk/doc/design-paper/latex8.bst	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/design-paper/latex8.bst	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,8 +1,6 @@
 
 % ---------------------------------------------------------------
 %
-% $Id$
-%
 % by Paolo.Ienne@xxxxxxxxxx
 %
 

Modified: tor/trunk/doc/design-paper/usenix.sty
===================================================================
--- tor/trunk/doc/design-paper/usenix.sty	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/design-paper/usenix.sty	2009-08-19 21:47:25 UTC (rev 20335)
@@ -5,8 +5,6 @@
 %    \usepackage{usenix-2e}
 % and put {\rm ....} around the author names.
 %
-% $Id$
-%
 % The following definitions are modifications of standard article.sty
 % definitions, arranged to do a better job of matching the USENIX
 % guidelines.

Modified: tor/trunk/doc/spec/address-spec.txt
===================================================================
--- tor/trunk/doc/spec/address-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/address-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                           Special Hostnames in Tor
                                Nick Mathewson
@@ -54,15 +53,3 @@
   When Tor sees an address in this format, it tries to look up and connect to
   the specified hidden service.  See rend-spec.txt for full details.
 
-4. .noconnect
-
-  SYNTAX:  [string].noconnect
-
-  When Tor sees an address in this format, it immediately closes the
-  connection without attaching it to any circuit.  This is useful for
-  controllers that want to test whether a given application is indeed using
-  the same instance of Tor that they're controlling.
-
-5. [XXX Is there a ".virtual" address that we expose too, or is that
-just intended to be internal? -RD]
-

Modified: tor/trunk/doc/spec/bridges-spec.txt
===================================================================
--- tor/trunk/doc/spec/bridges-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/bridges-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                           Tor bridges specification
 

Modified: tor/trunk/doc/spec/control-spec-v0.txt
===================================================================
--- tor/trunk/doc/spec/control-spec-v0.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/control-spec-v0.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                    TC: A Tor control protocol (Version 0)
 

Modified: tor/trunk/doc/spec/control-spec.txt
===================================================================
--- tor/trunk/doc/spec/control-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/control-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                    TC: A Tor control protocol (Version 1)
 
@@ -220,7 +219,7 @@
          "INFO" / "NOTICE" / "WARN" / "ERR" / "NEWDESC" / "ADDRMAP" /
          "AUTHDIR_NEWDESCS" / "DESCCHANGED" / "STATUS_GENERAL" /
          "STATUS_CLIENT" / "STATUS_SERVER" / "GUARD" / "NS" / "STREAM_BW" /
-         "CLIENTS_SEEN"
+         "CLIENTS_SEEN" / "NEWCONSENSUS"
 
   Any events *not* listed in the SETEVENTS line are turned off; thus, sending
   SETEVENTS with an empty body turns off all event reporting.
@@ -503,7 +502,7 @@
       start and the rest of the interval respectively.  The 'interval-start'
       and 'interval-end' fields are the borders of the current interval; the
       'interval-wake' field is the time within the current interval (if any)
-      where we plan[ned] to start being active.
+      where we plan[ned] to start being active. The times are GMT.
 
     "config/names"
       A series of lines listing the available configuration options. Each is
@@ -563,14 +562,14 @@
       states. See Section 4.1.10 for explanations. (Only a few of the
       status events are available as getinfo's currently. Let us know if
       you want more exposed.)
-    "status/reachability/or"
+    "status/reachability-succeeded/or"
       0 or 1, depending on whether we've found our ORPort reachable.
-    "status/reachability/dir"
+    "status/reachability-succeeded/dir"
       0 or 1, depending on whether we've found our DirPort reachable.
-    "status/reachability"
+    "status/reachability-succeeded"
       "OR=" ("0"/"1") SP "DIR=" ("0"/"1")
-      Combines status/reachability/*; controllers MUST ignore unrecognized
-      elements in this entry.
+      Combines status/reachability-succeeded/*; controllers MUST ignore
+      unrecognized elements in this entry.
     "status/bootstrap-phase"
       Returns the most recent bootstrap phase status event
       sent. Specifically, it returns a string starting with either
@@ -774,9 +773,8 @@
      Same as passing 'EXTENDED' to SETEVENTS; this is the preferred way to
      request the extended event syntax.
 
-     This will not be always-enabled until at least two stable releases
-     after 0.1.2.3-alpha, the release where it was first used for
-     anything.
+    This feature was first used in 0.1.2.3-alpha.  It is always-on in
+    Tor 0.2.2.1-alpha and later.
 
   VERBOSE_NAMES
 
@@ -787,8 +785,9 @@
      LongName format includes a Fingerprint, an indication of Named status,
      and a Nickname (if one is known).
 
-     This will not be always-enabled until at least two stable releases
-     after 0.1.2.2-alpha, the release where it was first available.
+     This will not be always-enabled until at least two stable
+     releases after 0.1.2.2-alpha, the release where it was first
+     available.  It is always-on in Tor 0.2.2.1-alpha and later.
 
 3.20. RESOLVE
 

Modified: tor/trunk/doc/spec/dir-spec-v1.txt
===================================================================
--- tor/trunk/doc/spec/dir-spec-v1.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/dir-spec-v1.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                          Tor Protocol Specification
 

Modified: tor/trunk/doc/spec/dir-spec-v2.txt
===================================================================
--- tor/trunk/doc/spec/dir-spec-v2.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/dir-spec-v2.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                       Tor directory protocol, version 2
 

Modified: tor/trunk/doc/spec/dir-spec.txt
===================================================================
--- tor/trunk/doc/spec/dir-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/dir-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                       Tor directory protocol, version 3
 
@@ -1030,13 +1029,20 @@
         descriptors if they would cause "v" lines to be over 128 characters
         long.
 
-    "w" SP "Bandwidth=" INT NL
+    "w" SP "Bandwidth=" INT [SP "Measured=" INT] NL
 
         [At most once.]
 
         An estimate of the bandwidth of this server, in an arbitrary
         unit (currently kilobytes per second).  Used to weight router
-        selection.  Other weighting keywords may be added later.
+        selection. 
+
+        Additionally, the Measured= keyword is present in votes by 
+        participating bandwidth measurement authorites to indicate
+        a measured bandwidth currently produced by measuring stream 
+        capacities. 
+
+        Other weighting keywords may be added later.
         Clients MUST ignore keywords they do not recognize.
 
     "p" SP ("accept" / "reject") SP PortList NL
@@ -1179,6 +1185,13 @@
    rate limit from the router descriptor.  It is given in kilobytes
    per second, and capped at some arbitrary value (currently 10 MB/s).
 
+   The Measured= keyword on a "w" line vote is currently computed
+   by multiplying the previous published consensus bandwidth by the 
+   ratio of the measured average node stream capacity to the network 
+   average. If 3 or more authorities provide a Measured= keyword for 
+   a router, the authorites produce a consensus containing a "w" 
+   Bandwidth= keyword equal to the median of the Measured= votes.
+
    The ports listed in a "p" line should be taken as those ports for
    which the router's exit policy permits 'most' addresses, ignoring any
    accept not for all addresses, ignoring all rejects for private
@@ -1261,6 +1274,11 @@
           one, breaking ties in favor of the lexicographically larger
           vote.)  The port list is encoded as specified in 3.4.2.
 
+        * If consensus-method 6 or later is in use and if 3 or more 
+          authorities provide a Measured= keyword in their votes for 
+          a router, the authorities produce a consensus containing a 
+          Bandwidth= keyword equal to the median of the Measured= votes.
+
      The signatures at the end of a consensus document are sorted in
      ascending order by identity digest.
 
@@ -1281,6 +1299,7 @@
      "3" -- Added legacy ID key support to aid in authority ID key rollovers
      "4" -- No longer list routers that are not running in the consensus
      "5" -- adds support for "w" and "p" lines.
+     "6" -- Prefers measured bandwidth values rather than advertised
 
    Before generating a consensus, an authority must decide which consensus
    method to use.  To do this, it looks for the highest version number

Modified: tor/trunk/doc/spec/path-spec.txt
===================================================================
--- tor/trunk/doc/spec/path-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/path-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                            Tor Path Specification
 
@@ -72,6 +71,24 @@
    is unknown (usually its target IP), but we believe the path probably
    supports the request according to the rules given below.
 
+1.1. A server's bandwidth
+
+   Old versions of Tor did not report bandwidths in network status
+   documents, so clients had to learn them from the routers' advertised
+   server descriptors.
+
+   For versions of Tor prior to 0.2.1.17-rc, everywhere below where we
+   refer to a server's "bandwidth", we mean its clipped advertised
+   bandwidth, computed by taking the smaller of the 'rate' and
+   'observed' arguments to the "bandwidth" element in the server's
+   descriptor.  If a router's advertised bandwidth is greater than
+   MAX_BELIEVABLE_BANDWIDTH (currently 10 MB/s), we clipped to that
+   value.
+
+   For more recent versions of Tor, we take the bandwidth value declared
+   in the consensus, and fall back to the clipped advertised bandwidth
+   only if the consensus does not have bandwidths listed.
+
 2. Building circuits
 
 2.1. When we build
@@ -179,16 +196,13 @@
    multiple candidates for a path element, we choose randomly.
 
    For "fast" circuits, we pick a given router as an exit with probability
-   proportional to its advertised bandwidth [the smaller of the 'rate' and
-   'observed' arguments to the "bandwidth" element in its descriptor].  If a
-   router's advertised bandwidth is greater than MAX_BELIEVABLE_BANDWIDTH
-   (currently 10 MB/s), we clip to that value.
+   proportional to its bandwidth.
 
    For non-exit positions on "fast" circuits, we pick routers as above, but
-   we weight the clipped advertised bandwidth of Exit-flagged nodes depending
+   we weight the bandwidth of Exit-flagged nodes depending
    on the fraction of bandwidth available from non-Exit nodes.  Call the
-   total clipped advertised bandwidth for Exit nodes under consideration E,
-   and the total clipped advertised bandwidth for all nodes under
+   total bandwidth for Exit nodes under consideration E,
+   and the total bandwidth for all nodes under
    consideration T.  If E<T/3, we do not consider Exit-flagged nodes.
    Otherwise, we weight their bandwidth with the factor (E-T/3)/E. This 
    ensures that bandwidth is evenly distributed over nodes in 3-hop paths.
@@ -306,7 +320,7 @@
   We use Guard nodes (also called "helper nodes" in the literature) to
   prevent certain profiling attacks.  Here's the risk: if we choose entry and
   exit nodes at random, and an attacker controls C out of N servers
-  (ignoring advertised bandwidth), then the
+  (ignoring bandwidth), then the
   attacker will control the entry and exit node of any given circuit with
   probability (C/N)^2.  But as we make many different circuits over time,
   then the probability that the attacker will see a sample of about (C/N)^2

Modified: tor/trunk/doc/spec/proposals/000-index.txt
===================================================================
--- tor/trunk/doc/spec/proposals/000-index.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/000-index.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 000-index.txt
 Title: Index of Tor Proposals
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 26-Jan-2007
 Status: Meta
@@ -56,7 +54,7 @@
 131  Help users to verify they are using Tor [NEEDS-REVISION]
 132  A Tor Web Service For Verifying Correct Browser Configuration [DRAFT]
 133  Incorporate Unreachable ORs into the Tor Network [DRAFT]
-134  More robust consensus voting with diverse authority sets [ACCEPTED]
+134  More robust consensus voting with diverse authority sets [REJECTED]
 135  Simplify Configuration of Private Tor Networks [CLOSED]
 136  Mass authority migration with legacy keys [CLOSED]
 137  Keep controllers informed as Tor bootstraps [CLOSED]
@@ -82,6 +80,13 @@
 157  Make certificate downloads specific [ACCEPTED]
 158  Clients download consensus + microdescriptors [OPEN]
 159  Exit Scanning [OPEN]
+160  Authorities vote for bandwidth offsets in consensus [OPEN]
+161  Computing Bandwidth Adjustments [OPEN]
+162  Publish the consensus in multiple flavors [OPEN]
+163  Detecting whether a connection comes from a client [OPEN]
+164  Reporting the status of server votes [OPEN]
+165  Easy migration for voting authority sets [OPEN]
+166  Including Network Statistics in Extra-Info Documents [OPEN]
 
 
 Proposals by status:
@@ -103,11 +108,17 @@
    156  Tracking blocked ports on the client side [for 0.2.?]
    158  Clients download consensus + microdescriptors
    159  Exit Scanning
+   160  Authorities vote for bandwidth offsets in consensus [for 0.2.2.x]
+   161  Computing Bandwidth Adjustments [for 0.2.2.x]
+   162  Publish the consensus in multiple flavors [for 0.2.2]
+   163  Detecting whether a connection comes from a client [for 0.2.2]
+   164  Reporting the status of server votes [for 0.2.2]
+   165  Easy migration for voting authority sets
+   166  Including Network Statistics in Extra-Info Documents [for 0.2.2]
  ACCEPTED:
    110  Avoiding infinite length circuits [for 0.2.1.x] [in 0.2.1.3-alpha]
    117  IPv6 exits [for 0.2.1.x]
    118  Advertising multiple ORPorts at once [for 0.2.1.x]
-   134  More robust consensus voting with diverse authority sets [for 0.2.2.x]
    140  Provide diffs between consensuses [for 0.2.2.x]
    147  Eliminate the need for v2 directories in generating v3 directories [for 0.2.1.x]
    157  Make certificate downloads specific [for 0.2.1.x]
@@ -159,3 +170,5 @@
    120  Shutdown descriptors when Tor servers stop
    128  Families of private bridges
    142  Combine Introduction and Rendezvous Points
+ REJECTED:
+   134  More robust consensus voting with diverse authority sets

Modified: tor/trunk/doc/spec/proposals/001-process.txt
===================================================================
--- tor/trunk/doc/spec/proposals/001-process.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/001-process.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 001-process.txt
 Title: The Tor Proposal Process
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 30-Jan-2007
 Status: Meta
@@ -47,7 +45,7 @@
    Like an RFC, every proposal gets a number.  Unlike RFCs, proposals can
    change over time and keep the same number, until they are finally
    accepted or rejected.  The history for each proposal
-   will be stored in the Tor Subversion repository.
+   will be stored in the Tor repository.
 
    Once a proposal is in the repository, we should discuss and improve it
    until we've reached consensus that it's a good idea, and that it's
@@ -82,9 +80,7 @@
 What should go in a proposal:
 
    Every proposal should have a header containing these fields:
-     Filename, Title, Version, Last-Modified, Author, Created, Status.
-   The Version and Last-Modified fields should use the SVN Revision and Date
-   tags respectively.
+     Filename, Title, Author, Created, Status.
 
    These fields are optional but recommended:
      Target, Implemented-In.
@@ -97,7 +93,7 @@
    what the proposal's about, what it does, and about what state it's in.
 
    After the Overview, the proposal becomes more free-form.  Depending on its
-   the length and complexity, the proposal can break into sections as
+   length and complexity, the proposal can break into sections as
    appropriate, or follow a short discursive format.  Every proposal should
    contain at least the following information before it is "ACCEPTED",
    though the information does not need to be in sections with these names.

Modified: tor/trunk/doc/spec/proposals/098-todo.txt
===================================================================
--- tor/trunk/doc/spec/proposals/098-todo.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/098-todo.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 098-todo.txt
 Title: Proposals that should be written
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson, Roger Dingledine
 Created: 26-Jan-2007
 Status: Meta

Modified: tor/trunk/doc/spec/proposals/099-misc.txt
===================================================================
--- tor/trunk/doc/spec/proposals/099-misc.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/099-misc.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 099-misc.txt
 Title: Miscellaneous proposals
-Version: $Revision$
-Last-Modified: $Date$
 Author: Various
 Created: 26-Jan-2007
 Status: Meta

Modified: tor/trunk/doc/spec/proposals/100-tor-spec-udp.txt
===================================================================
--- tor/trunk/doc/spec/proposals/100-tor-spec-udp.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/100-tor-spec-udp.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 100-tor-spec-udp.txt
 Title: Tor Unreliable Datagram Extension Proposal
-Version: $Revision$
-Last-Modified: $Date$
 Author: Marc Liberatore
 Created: 23 Feb 2006
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/101-dir-voting.txt
===================================================================
--- tor/trunk/doc/spec/proposals/101-dir-voting.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/101-dir-voting.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 101-dir-voting.txt
 Title: Voting on the Tor Directory System
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: Nov 2006
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/102-drop-opt.txt
===================================================================
--- tor/trunk/doc/spec/proposals/102-drop-opt.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/102-drop-opt.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 102-drop-opt.txt
 Title: Dropping "opt" from the directory format
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: Jan 2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/103-multilevel-keys.txt
===================================================================
--- tor/trunk/doc/spec/proposals/103-multilevel-keys.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/103-multilevel-keys.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 103-multilevel-keys.txt
 Title: Splitting identity key from regularly used signing key.
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: Jan 2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/104-short-descriptors.txt
===================================================================
--- tor/trunk/doc/spec/proposals/104-short-descriptors.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/104-short-descriptors.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 104-short-descriptors.txt
 Title: Long and Short Router Descriptors
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: Jan 2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/105-handshake-revision.txt
===================================================================
--- tor/trunk/doc/spec/proposals/105-handshake-revision.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/105-handshake-revision.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 105-handshake-revision.txt
 Title: Version negotiation for the Tor protocol.
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson, Roger Dingledine
 Created: Jan 2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/106-less-tls-constraint.txt
===================================================================
--- tor/trunk/doc/spec/proposals/106-less-tls-constraint.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/106-less-tls-constraint.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 106-less-tls-constraint.txt
 Title: Checking fewer things during TLS handshakes
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 9-Feb-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/107-uptime-sanity-checking.txt
===================================================================
--- tor/trunk/doc/spec/proposals/107-uptime-sanity-checking.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/107-uptime-sanity-checking.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 107-uptime-sanity-checking.txt
 Title: Uptime Sanity Checking
-Version: $Revision$
-Last-Modified: $Date$
 Author: Kevin Bauer & Damon McCoy
 Created: 8-March-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/108-mtbf-based-stability.txt
===================================================================
--- tor/trunk/doc/spec/proposals/108-mtbf-based-stability.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/108-mtbf-based-stability.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 108-mtbf-based-stability.txt
 Title: Base "Stable" Flag on Mean Time Between Failures
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 10-Mar-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/109-no-sharing-ips.txt
===================================================================
--- tor/trunk/doc/spec/proposals/109-no-sharing-ips.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/109-no-sharing-ips.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 109-no-sharing-ips.txt
 Title: No more than one server per IP address.
-Version: $Revision$
-Last-Modified: $Date$
 Author: Kevin Bauer & Damon McCoy
 Created: 9-March-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/110-avoid-infinite-circuits.txt
===================================================================
--- tor/trunk/doc/spec/proposals/110-avoid-infinite-circuits.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/110-avoid-infinite-circuits.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 110-avoid-infinite-circuits.txt
 Title: Avoiding infinite length circuits
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 13-Mar-2007
 Status: Accepted

Modified: tor/trunk/doc/spec/proposals/111-local-traffic-priority.txt
===================================================================
--- tor/trunk/doc/spec/proposals/111-local-traffic-priority.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/111-local-traffic-priority.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 111-local-traffic-priority.txt
 Title: Prioritizing local traffic over relayed traffic
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 14-Mar-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/112-bring-back-pathlencoinweight.txt
===================================================================
--- tor/trunk/doc/spec/proposals/112-bring-back-pathlencoinweight.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/112-bring-back-pathlencoinweight.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 112-bring-back-pathlencoinweight.txt
 Title: Bring Back Pathlen Coin Weight
-Version: $Revision$
-Last-Modified: $Date$
 Author: Mike Perry
 Created:
 Status: Superseded

Modified: tor/trunk/doc/spec/proposals/113-fast-authority-interface.txt
===================================================================
--- tor/trunk/doc/spec/proposals/113-fast-authority-interface.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/113-fast-authority-interface.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 113-fast-authority-interface.txt
 Title: Simplifying directory authority administration
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created:
 Status: Superseded

Modified: tor/trunk/doc/spec/proposals/114-distributed-storage.txt
===================================================================
--- tor/trunk/doc/spec/proposals/114-distributed-storage.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/114-distributed-storage.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 114-distributed-storage.txt
 Title: Distributed Storage for Tor Hidden Service Descriptors
-Version: $Revision$
-Last-Modified: $Date$
 Author: Karsten Loesing
 Created: 13-May-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/115-two-hop-paths.txt
===================================================================
--- tor/trunk/doc/spec/proposals/115-two-hop-paths.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/115-two-hop-paths.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 115-two-hop-paths.txt
 Title: Two Hop Paths
-Version: $Revision$
-Last-Modified: $Date$
 Author: Mike Perry
 Created:
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/116-two-hop-paths-from-guard.txt
===================================================================
--- tor/trunk/doc/spec/proposals/116-two-hop-paths-from-guard.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/116-two-hop-paths-from-guard.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 116-two-hop-paths-from-guard.txt
 Title: Two hop paths from entry guards
-Version: $Revision$
-Last-Modified: $Date$
 Author: Michael Lieberman
 Created: 26-Jun-2007
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/117-ipv6-exits.txt
===================================================================
--- tor/trunk/doc/spec/proposals/117-ipv6-exits.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/117-ipv6-exits.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 117-ipv6-exits.txt
 Title: IPv6 exits
-Version: $Revision$
-Last-Modified: $Date$
 Author: coderman
 Created: 10-Jul-2007
 Status: Accepted

Modified: tor/trunk/doc/spec/proposals/118-multiple-orports.txt
===================================================================
--- tor/trunk/doc/spec/proposals/118-multiple-orports.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/118-multiple-orports.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 118-multiple-orports.txt
 Title: Advertising multiple ORPorts at once
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 09-Jul-2007
 Status: Accepted

Modified: tor/trunk/doc/spec/proposals/119-controlport-auth.txt
===================================================================
--- tor/trunk/doc/spec/proposals/119-controlport-auth.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/119-controlport-auth.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 119-controlport-auth.txt
 Title: New PROTOCOLINFO command for controllers
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 14-Aug-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/120-shutdown-descriptors.txt
===================================================================
--- tor/trunk/doc/spec/proposals/120-shutdown-descriptors.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/120-shutdown-descriptors.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 120-shutdown-descriptors.txt
 Title: Shutdown descriptors when Tor servers stop
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 15-Aug-2007
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/121-hidden-service-authentication.txt
===================================================================
--- tor/trunk/doc/spec/proposals/121-hidden-service-authentication.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/121-hidden-service-authentication.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 121-hidden-service-authentication.txt
 Title: Hidden Service Authentication
-Version: $Revision$
-Last-Modified: $Date$
 Author: Tobias Kamm, Thomas Lauterbach, Karsten Loesing, Ferdinand Rieger,
         Christoph Weingarten
 Created: 10-Sep-2007

Modified: tor/trunk/doc/spec/proposals/122-unnamed-flag.txt
===================================================================
--- tor/trunk/doc/spec/proposals/122-unnamed-flag.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/122-unnamed-flag.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 122-unnamed-flag.txt
 Title: Network status entries need a new Unnamed flag
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 04-Oct-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/123-autonaming.txt
===================================================================
--- tor/trunk/doc/spec/proposals/123-autonaming.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/123-autonaming.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 123-autonaming.txt
 Title: Naming authorities automatically create bindings
-Version: $Revision$
-Last-Modified: $Date$
 Author: Peter Palfrader
 Created: 2007-10-11
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/124-tls-certificates.txt
===================================================================
--- tor/trunk/doc/spec/proposals/124-tls-certificates.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/124-tls-certificates.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 124-tls-certificates.txt
 Title: Blocking resistant TLS certificate usage
-Version: $Revision$
-Last-Modified: $Date$
 Author: Steven J. Murdoch
 Created: 2007-10-25
 Status: Superseded

Modified: tor/trunk/doc/spec/proposals/125-bridges.txt
===================================================================
--- tor/trunk/doc/spec/proposals/125-bridges.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/125-bridges.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 125-bridges.txt
 Title: Behavior for bridge users, bridge relays, and bridge authorities
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 11-Nov-2007
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/126-geoip-reporting.txt
===================================================================
--- tor/trunk/doc/spec/proposals/126-geoip-reporting.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/126-geoip-reporting.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 126-geoip-reporting.txt
 Title: Getting GeoIP data and publishing usage summaries
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 2007-11-24
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/127-dirport-mirrors-downloads.txt
===================================================================
--- tor/trunk/doc/spec/proposals/127-dirport-mirrors-downloads.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/127-dirport-mirrors-downloads.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 127-dirport-mirrors-downloads.txt
 Title: Relaying dirport requests to Tor download site / website
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 2007-12-02
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/128-bridge-families.txt
===================================================================
--- tor/trunk/doc/spec/proposals/128-bridge-families.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/128-bridge-families.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 128-bridge-families.txt
 Title: Families of private bridges
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 2007-12-xx
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/129-reject-plaintext-ports.txt
===================================================================
--- tor/trunk/doc/spec/proposals/129-reject-plaintext-ports.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/129-reject-plaintext-ports.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 129-reject-plaintext-ports.txt
 Title: Block Insecure Protocols by Default
-Version: $Revision$
-Last-Modified: $Date$
 Author: Kevin Bauer & Damon McCoy
 Created: 2008-01-15
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/130-v2-conn-protocol.txt
===================================================================
--- tor/trunk/doc/spec/proposals/130-v2-conn-protocol.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/130-v2-conn-protocol.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 130-v2-conn-protocol.txt
 Title: Version 2 Tor connection protocol
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 2007-10-25
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/131-verify-tor-usage.txt
===================================================================
--- tor/trunk/doc/spec/proposals/131-verify-tor-usage.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/131-verify-tor-usage.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 131-verify-tor-usage.txt
 Title: Help users to verify they are using Tor
-Version: $Revision$
-Last-Modified: $Date$
 Author: Steven J. Murdoch
 Created: 2008-01-25
 Status: Needs-Revision

Modified: tor/trunk/doc/spec/proposals/132-browser-check-tor-service.txt
===================================================================
--- tor/trunk/doc/spec/proposals/132-browser-check-tor-service.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/132-browser-check-tor-service.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 132-browser-check-tor-service.txt
 Title: A Tor Web Service For Verifying Correct Browser Configuration
-Version: $Revision$
-Last-Modified: $Date$
 Author: Robert Hogan
 Created: 2008-03-08
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/134-robust-voting.txt
===================================================================
--- tor/trunk/doc/spec/proposals/134-robust-voting.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/134-robust-voting.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -2,9 +2,11 @@
 Title: More robust consensus voting with diverse authority sets
 Author: Peter Palfrader
 Created: 2008-04-01
-Status: Accepted
-Target: 0.2.2.x
+Status: Rejected
 
+History:
+  2009 May 27: Added note on rejecting this proposal -- Nick
+
 Overview:
 
   A means to arrive at a valid directory consensus even when voters
@@ -103,3 +105,19 @@
  Q: Can this ever force us to build a consensus with authorities we do not
     recognize?
  A: No, we can never build a fully connected set with them in step 3.
+
+------------------------------
+
+I'm rejecting this proposal as insecure.
+
+Suppose that we have a clique of size N, and M hostile members in the
+clique.  If these hostile members stop declaring trust for up to M-1
+good members of the clique, the clique with the hostile members will
+in it will be larger than the one without them.
+
+The M hostile members will constitute a majority of this new clique
+when M > (N-(M-1)) / 2, or when M > (N + 1) / 3.  This breaks our
+requirement that an adversary must compromise a majority of authorities
+in order to control the consensus.
+
+-- Nick

Modified: tor/trunk/doc/spec/proposals/135-private-tor-networks.txt
===================================================================
--- tor/trunk/doc/spec/proposals/135-private-tor-networks.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/135-private-tor-networks.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 135-private-tor-networks.txt
 Title: Simplify Configuration of Private Tor Networks
-Version: $Revision$
-Last-Modified: $Date$
 Author: Karsten Loesing
 Created: 29-Apr-2008
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/137-bootstrap-phases.txt
===================================================================
--- tor/trunk/doc/spec/proposals/137-bootstrap-phases.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/137-bootstrap-phases.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 137-bootstrap-phases.txt
 Title: Keep controllers informed as Tor bootstraps
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 07-Jun-2008
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/138-remove-down-routers-from-consensus.txt
===================================================================
--- tor/trunk/doc/spec/proposals/138-remove-down-routers-from-consensus.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/138-remove-down-routers-from-consensus.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 138-remove-down-routers-from-consensus.txt
 Title: Remove routers that are not Running from consensus documents
-Version: $Revision$
-Last-Modified: $Date$
 Author: Peter Palfrader
 Created: 11-Jun-2008
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/140-consensus-diffs.txt
===================================================================
--- tor/trunk/doc/spec/proposals/140-consensus-diffs.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/140-consensus-diffs.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,12 +1,15 @@
 Filename: 140-consensus-diffs.txt
 Title: Provide diffs between consensuses
-Version: $Revision$
-Last-Modified: $Date$
 Author: Peter Palfrader
 Created: 13-Jun-2008
 Status: Accepted
 Target: 0.2.2.x
 
+0. History
+
+  22-May-2009: Restricted the ed format even more strictly for ease of
+  implementation. -nickm
+
 1. Overview.
 
   Tor clients and servers need a list of which relays are on the
@@ -135,6 +138,10 @@
   Note that line numbers always apply to the file after all previous
   commands have already been applied.
 
+  The commands MUST apply to the file from back to front, such that
+  lines are only ever referred to by their position in the original
+  file.
+
   The "current line" is either the first line of the file, if this is
   the first command, the last line of a block we added in an append or
   change command, or the line immediate following a set of lines we just

Modified: tor/trunk/doc/spec/proposals/141-jit-sd-downloads.txt
===================================================================
--- tor/trunk/doc/spec/proposals/141-jit-sd-downloads.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/141-jit-sd-downloads.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 141-jit-sd-downloads.txt
 Title: Download server descriptors on demand
-Version: $Revision$
-Last-Modified: $Date$
 Author: Peter Palfrader
 Created: 15-Jun-2008
 Status: Draft
@@ -63,8 +61,8 @@
   which tries to convey a server's capacity to clients.
 
   Currently we weigh servers differently for different purposes.  There
-  is a weigh for when we use a server as a guard node (our entry to the
-  Tor network), there is one weigh we assign servers for exit duties,
+  is a weight for when we use a server as a guard node (our entry to the
+  Tor network), there is one weight we assign servers for exit duties,
   and a third for when we need intermediate (middle) nodes.
 
 2.2 Exit information
@@ -80,7 +78,7 @@
 
 2.3 Capability information
 
-  Server descriptors contain information about the specific version or
+  Server descriptors contain information about the specific version of
   the Tor protocol they understand [proposal 105].
 
   Furthermore the server descriptor also contains the exact version of

Modified: tor/trunk/doc/spec/proposals/142-combine-intro-and-rend-points.txt
===================================================================
--- tor/trunk/doc/spec/proposals/142-combine-intro-and-rend-points.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/142-combine-intro-and-rend-points.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 142-combine-intro-and-rend-points.txt
 Title: Combine Introduction and Rendezvous Points
-Version: $Revision$
-Last-Modified: $Date$
 Author: Karsten Loesing, Christian Wilms
 Created: 27-Jun-2008
 Status: Dead

Modified: tor/trunk/doc/spec/proposals/143-distributed-storage-improvements.txt
===================================================================
--- tor/trunk/doc/spec/proposals/143-distributed-storage-improvements.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/143-distributed-storage-improvements.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 143-distributed-storage-improvements.txt
 Title: Improvements of Distributed Storage for Tor Hidden Service Descriptors
-Version: $Revision$
-Last-Modified: $Date$
 Author: Karsten Loesing
 Created: 28-Jun-2008
 Status: Open

Modified: tor/trunk/doc/spec/proposals/145-newguard-flag.txt
===================================================================
--- tor/trunk/doc/spec/proposals/145-newguard-flag.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/145-newguard-flag.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 145-newguard-flag.txt
 Title: Separate "suitable as a guard" from "suitable as a new guard"
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 1-Jul-2008
 Status: Open

Modified: tor/trunk/doc/spec/proposals/146-long-term-stability.txt
===================================================================
--- tor/trunk/doc/spec/proposals/146-long-term-stability.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/146-long-term-stability.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 146-long-term-stability.txt
 Title: Add new flag to reflect long-term stability
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 19-Jun-2008
 Status: Open

Modified: tor/trunk/doc/spec/proposals/147-prevoting-opinions.txt
===================================================================
--- tor/trunk/doc/spec/proposals/147-prevoting-opinions.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/147-prevoting-opinions.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 147-prevoting-opinions.txt
 Title: Eliminate the need for v2 directories in generating v3 directories
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 2-Jul-2008
 Status: Accepted

Modified: tor/trunk/doc/spec/proposals/148-uniform-client-end-reason.txt
===================================================================
--- tor/trunk/doc/spec/proposals/148-uniform-client-end-reason.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/148-uniform-client-end-reason.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 148-uniform-client-end-reason.txt
 Title: Stream end reasons from the client side should be uniform
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 2-Jul-2008
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/149-using-netinfo-data.txt
===================================================================
--- tor/trunk/doc/spec/proposals/149-using-netinfo-data.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/149-using-netinfo-data.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 149-using-netinfo-data.txt
 Title: Using data from NETINFO cells
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 2-Jul-2008
 Status: Open
@@ -24,14 +22,14 @@
    idea of their own IP addresses, so they can publish correct
    descriptors.  This is also in NETINFO cells.
 
-Learning the time and IP
+Learning the time and IP address
 
    We need to think about attackers here.  Just because a router tells
    us that we have a given IP or a given clock skew doesn't mean that
    it's true.  We believe this information only if we've heard it from
    a majority of the routers we've connected to recently, including at
    least 3 routers.  Routers only believe this information if the
-   majority inclues at least one authority.
+   majority includes at least one authority.
 
 Avoiding MITM attacks
 

Modified: tor/trunk/doc/spec/proposals/150-exclude-exit-nodes.txt
===================================================================
--- tor/trunk/doc/spec/proposals/150-exclude-exit-nodes.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/150-exclude-exit-nodes.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,5 @@
 Filename: 150-exclude-exit-nodes.txt
 Title: Exclude Exit Nodes from a circuit
-Version: $Revision$
 Author: Mfr
 Created: 2008-06-15
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/151-path-selection-improvements.txt
===================================================================
--- tor/trunk/doc/spec/proposals/151-path-selection-improvements.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/151-path-selection-improvements.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 151-path-selection-improvements.txt
 Title: Improving Tor Path Selection
-Version:
-Last-Modified:
 Author: Fallon Chen, Mike Perry
 Created: 5-Jul-2008
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/152-single-hop-circuits.txt
===================================================================
--- tor/trunk/doc/spec/proposals/152-single-hop-circuits.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/152-single-hop-circuits.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 152-single-hop-circuits.txt
 Title: Optionally allow exit from single-hop circuits 
-Version:
-Last-Modified:
 Author: Geoff Goodell
 Created: 13-Jul-2008
 Status: Closed

Modified: tor/trunk/doc/spec/proposals/153-automatic-software-update-protocol.txt
===================================================================
--- tor/trunk/doc/spec/proposals/153-automatic-software-update-protocol.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/153-automatic-software-update-protocol.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 153-automatic-software-update-protocol.txt
 Title: Automatic software update protocol
-Version: $Revision$
-Last-Modified: $Date$
 Author: Jacob Appelbaum 
 Created: 14-July-2008
 Status: Superseded

Modified: tor/trunk/doc/spec/proposals/154-automatic-updates.txt
===================================================================
--- tor/trunk/doc/spec/proposals/154-automatic-updates.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/154-automatic-updates.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 154-automatic-updates.txt
 Title: Automatic Software Update Protocol
-Version: $Revision$
-Last-Modified: $Date$
 Author: Matt Edman
 Created: 30-July-2008
 Status: Superseded

Modified: tor/trunk/doc/spec/proposals/155-four-hidden-service-improvements.txt
===================================================================
--- tor/trunk/doc/spec/proposals/155-four-hidden-service-improvements.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/155-four-hidden-service-improvements.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 155-four-hidden-service-improvements.txt
 Title: Four Improvements of Hidden Service Performance
-Version: $Revision$
-Last-Modified: $Date$
 Author: Karsten Loesing, Christian Wilms
 Created: 25-Sep-2008
 Status: Finished

Modified: tor/trunk/doc/spec/proposals/156-tracking-blocked-ports.txt
===================================================================
--- tor/trunk/doc/spec/proposals/156-tracking-blocked-ports.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/156-tracking-blocked-ports.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 156-tracking-blocked-ports.txt
 Title: Tracking blocked ports on the client side
-Version: $Revision$
-Last-Modified: $Date$
 Author: Robert Hogan
 Created: 14-Oct-2008
 Status: Open

Modified: tor/trunk/doc/spec/proposals/157-specific-cert-download.txt
===================================================================
--- tor/trunk/doc/spec/proposals/157-specific-cert-download.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/157-specific-cert-download.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 157-specific-cert-download.txt
 Title: Make certificate downloads specific
-Version: $Revision$
-Last-Modified: $Date$
 Author: Nick Mathewson
 Created: 2-Dec-2008
 Status: Accepted

Modified: tor/trunk/doc/spec/proposals/158-microdescriptors.txt
===================================================================
--- tor/trunk/doc/spec/proposals/158-microdescriptors.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/158-microdescriptors.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,11 +1,20 @@
 Filename: 158-microdescriptors.txt
 Title: Clients download consensus + microdescriptors
-Version: $Revision$
-Last-Modified: $Date$
 Author: Roger Dingledine
 Created: 17-Jan-2009
 Status: Open
 
+0. History
+
+  15 May 2009: Substantially revised based on discussions on or-dev
+  from late January.  Removed the notion of voting on how to choose
+  microdescriptors; made it just a function of the consensus method.
+  (This lets us avoid the possibility of "desynchronization.")
+  Added suggestion to use a new consensus flavor.  Specified use of
+  SHA256 for new hashes. -nickm
+
+  15 June 2009: Cleaned up based on comments from Roger. -nickm
+
 1. Overview
 
   This proposal replaces section 3.2 of proposal 141, which was
@@ -13,9 +22,7 @@
   circuit-building protocol to fetch a server descriptor inline at each
   circuit extend, we instead put all of the information that clients need
   either into the consensus itself, or into a new set of data about each
-  relay called a microdescriptor. The microdescriptor is a direct
-  transform from the relay descriptor, so relays don't even need to know
-  this is happening.
+  relay called a microdescriptor.
 
   Descriptor elements that are small and frequently changing should go
   in the consensus itself, and descriptor elements that are small and
@@ -24,6 +31,10 @@
   them, we'll need to resume considering some design like the one in
   proposal 141.
 
+  Note also that any descriptor element which clients need to use to
+  decide which servers to fetch info about, or which servers to fetch
+  info from, needs to stay in the consensus.
+
 2. Motivation
 
   See
@@ -36,125 +47,102 @@
 3. Design
 
   There are three pieces to the proposal. First, authorities will list in
-  their votes (and thus in the consensus) what relay descriptor elements
-  are included in the microdescriptor, and also list the expected hash
-  of microdescriptor for each relay. Second, directory mirrors will serve
-  microdescriptors. Third, clients will ask for them and cache them.
+  their votes (and thus in the consensus) the expected hash of
+  microdescriptor for each relay. Second, authorities will serve
+  microdescriptors, directory mirrors will cache and serve
+  them. Third, clients will ask for them and cache them.
 
 3.1. Consensus changes
 
-  V3 votes should include a new line:
-    microdescriptor-elements bar baz foo
-  listing each descriptor element (sorted alphabetically) that authority
-  included when it calculated its expected microdescriptor hashes.
+  If the authorities choose a consensus method of a given version or
+  later, a microdescriptor format is implicit in that version.
+  A microdescriptor should in every case be a pure function of the
+  router descriptor and the consensus method.
 
-  We also need to include the hash of each expected microdescriptor in
-  the routerstatus section. I suggest a new "m" line for each stanza,
-  with the base64 of the hash of the elements that the authority voted
-  for above.
+  In votes, we need to include the hash of each expected microdescriptor
+  in the routerstatus section. I suggest a new "m" line for each stanza,
+  with the base64 of the SHA256 hash of the router's microdescriptor.
 
+  For every consensus method that an authority supports, it includes a
+  separate "m" line in each router section of its vote, containing:
+    "m" SP methods 1*(SP AlgorithmName "=" digest) NL
+  where methods is a comma-separated list of the consensus methods
+  that the authority believes will produce "digest".
+
+  (As with base64 encoding of SHA1 hashes in consensuses, let's
+  omit the trailing =s)
+
   The consensus microdescriptor-elements and "m" lines are then computed
   as described in Section 3.1.2 below.
 
-  I believe that means we need a new consensus-method "6" that knows
-  how to compute the microdescriptor-elements and add "m" lines.
+  (This means we need a new consensus-method that knows
+  how to compute the microdescriptor-elements and add "m" lines.)
 
-3.1.1. Descriptor elements to include for now
+  The microdescriptor consensus uses the directory-signature format from
+  proposal 162, with the "sha256" algorithm.
 
-  To start, the element list that authorities suggest should be
-    family onion-key
 
-  (Note that the or-dev posts above only mention onion-key, but if
-  we don't also include family then clients will never learn it. It
-  seemed like it should be relatively static, so putting it in the
-  microdescriptor is smarter than trying to fit it into the consensus.)
+3.1.1. Descriptor elements to include for now
 
-  We could imagine a config option "family,onion-key" so authorities
-  could change their voted preferences without needing to upgrade.
+  In the first version, the microdescriptor should contain the
+  onion-key element, and the family element from the router descriptor,
+  and the exit policy summary as currently specified in dir-spec.txt.
 
 3.1.2. Computing consensus for microdescriptor-elements and "m" lines
 
-  One approach is for the consensus microdescriptor-elements line to
-  include every element listed by a majority of authorities, sorted. The
-  problem here is that it will no longer be deterministic what the correct
-  hash for the "m" line should be. We could imagine telling the authority
-  to go look in its descriptor and produce the right hash itself, but
-  we don't want consensus calculation to be based on external data like
-  that. (Plus, the authority may not have the descriptor that everybody
-  else voted to use.)
+  When we are generating a consensus, we use whichever m line
+  unambiguously corresponds to the descriptor digest that will be
+  included in the consensus.
 
-  The better approach is to take the exact set that has the most votes
-  (breaking ties by the set that has the most elements, and breaking
-  ties after that by whichever is alphabetically first). That will
-  increase the odds that we actually get a microdescriptor hash that
-  is both a) for the descriptor we're putting in the consensus, and b)
-  over the elements that we're declaring it should be for.
+  (If different votes have different microdescriptor digests for a
+  single <descriptor-digest, consensus-method> pair, then at least one
+  of the authorities is broken.  If this happens, the consensus should
+  contain whichever microdescriptor digest is most common.  If there is
+  no winner, we break ties in the favor of the lexically earliest.
+  Either way, we should log a warning: there is definitely a bug.)
 
-  Then the "m" line for a given relay is the one that gets the most votes
-  from authorities that both a) voted for the microdescriptor-elements
-  line we're using, and b) voted for the descriptor we're using.
+  The "m" lines in a consensus contain only the digest, not a list of
+  consensus methods.
 
-  (If there's a tie, use the smaller hash. But really, if there are
-  multiple such votes and they differ about a microdescriptor, we caught
-  one of them lying or being buggy. We should log it to track down why.)
+3.1.3. A new flavor of consensus
 
-  If there are no such votes, then we leave out the "m" line for that
-  relay. That means clients should avoid it for this time period. (As
-  an extension it could instead mean that clients should fetch the
-  descriptor and figure out its microdescriptor themselves. But let's
-  not get ahead of ourselves.)
+  Rather than inserting "m" lines in the current consensus format,
+  they should be included in a new consensus flavor (see proposal
+  162).
 
-  It would be nice to have a more foolproof way to agree on what
-  microdescriptor hash each authority should vote for, so we can avoid
-  missing "m" lines. Just switching to a new consensus-method each time
-  we change the set of microdescriptor-elements won't help though, since
-  each authority will still have to decide what hash to vote for before
-  knowing what consensus-method will be used.
+  This flavor can safely omit descriptor digests.
 
-  Here's one way we could do it. Each vote / consensus includes
-  the microdescriptor-elements that were used to compute the hashes,
-  and also a preferred-microdescriptor-elements set. If an authority
-  has a consensus from the previous period, then it should use the
-  consensus preferred-microdescriptor-elements when computing its votes
-  for microdescriptor-elements and the appropriate hashes in the upcoming
-  period. (If it has no previous consensus, then it just writes its
-  own preferences in both lines.)
+  When we implement this voting method, we can remove the exit policy
+  summary from the current "ns" flavor of consensus, since no current
+  clients use them, and they take up about 5% of the compressed
+  consensus.
 
-3.2. Directory mirrors serve microdescriptors
+  This new consensus flavor should be signed with the sha256 signature
+  format as documented in proposal 162.
 
-  Directory mirrors should then read the microdescriptor-elements line
-  from the consensus, and learn how to answer requests. (Directory mirrors
-  continue to serve normal relay descriptors too, a) to serve old clients
-  and b) to be able to construct microdescriptors on the fly.)
+3.2. Directory mirrors fetch, cache, and serve microdescriptors
 
-  The microdescriptors with hashes <D1>,<D2>,<D3> should be available at:
-    http://<hostname>/tor/micro/d/<D1>+<D2>+<D3>.z
+  Directory mirrors should fetch, catch, and serve each microdescriptor
+  from the authorities.  (They need to continue to serve normal relay
+  descriptors too, to handle old clients.)
 
+  The microdescriptors with base64 hashes <D1>,<D2>,<D3> should be
+  available at:
+    http://<hostname>/tor/micro/d/<D1>-<D2>-<D3>.z
+  (We use base64 for size and for consistency with the consensus
+  format. We use -s instead of +s to separate these items, since
+  the + character is used in base64 encoding.)
+
   All the microdescriptors from the current consensus should also be
   available at:
     http://<hostname>/tor/micro/all.z
   so a client that's bootstrapping doesn't need to send a 70KB URL just
   to name every microdescriptor it's looking for.
 
-  The format of a microdescriptor is the header line
-  "microdescriptor-header"
-  followed by each element (keyword and body), alphabetically. There's
-  no need to mention what hash it's for, since it's self-identifying:
-  you can hash the elements to learn this.
-
-  (Do we need a footer line to show that it's over, or is the next
-  microdescriptor line or EOF enough of a hint? A footer line wouldn't
-  hurt much. Also, no fair voting for the microdescriptor-element
-  "microdescriptor-header".)
-
+  Microdescriptors have no header or footer.
   The hash of the microdescriptor is simply the hash of the concatenated
-  elements -- not counting the header line or hypothetical footer line.
-  Unless you prefer that?
+  elements.
 
-  Is there a reasonable way to version these things? We could say that
-  the microdescriptor-header line can contain arguments which clients
-  must ignore if they don't understand them. Any better ways?
-
   Directory mirrors should check to make sure that the microdescriptors
   they're about to serve match the right hashes (either the hashes from
   the fetch URL or the hashes from the consensus, respectively).
@@ -170,10 +158,14 @@
   When a client gets a new consensus, it looks to see if there are any
   microdescriptors it needs to learn. If it needs to learn more than
   some threshold of the microdescriptors (half?), it requests 'all',
-  else it requests only the missing ones.
+  else it requests only the missing ones.  Clients MAY try to
+  determine whether the upload bandwidth for listing the
+  microdescriptors they want is more or less than the download
+  bandwidth for the microdescriptors they do not want.
 
   Clients maintain a cache of microdescriptors along with metadata like
-  when it was last referenced by a consensus. They keep a microdescriptor
+  when it was last referenced by a consensus, and which identity key
+  it corresponds to.  They keep a microdescriptor
   until it hasn't been mentioned in any consensus for a week. Future
   clients might cache them for longer or shorter times.
 
@@ -190,18 +182,17 @@
   Another future option would be to fetch some of the microdescriptors
   anonymously (via a Tor circuit).
 
+  Another crazy option (Roger's phrasing) is to do decoy fetches as
+  well.
+
 4. Transition and deployment
 
   Phase one, the directory authorities should start voting on
-  microdescriptors and microdescriptor elements, and putting them in the
-  consensus. This should happen during the 0.2.1.x series, and should
-  be relatively easy to do.
+  microdescriptors, and putting them in the consensus.
 
   Phase two, directory mirrors should learn how to serve them, and learn
-  how to read the consensus to find out what they should be serving. This
-  phase could be done either in 0.2.1.x or early in 0.2.2.x, depending
-  on how messy it turns out to be and how quickly we get around to it.
+  how to read the consensus to find out what they should be serving.
 
   Phase three, clients should start fetching and caching them instead
-  of normal descriptors. This should happen post 0.2.1.x.
+  of normal descriptors.
 

Modified: tor/trunk/doc/spec/proposals/159-exit-scanning.txt
===================================================================
--- tor/trunk/doc/spec/proposals/159-exit-scanning.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/159-exit-scanning.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: 159-exit-scanning.txt
 Title: Exit Scanning
-Version: $Revision$
-Last-Modified: $Date$
 Author: Mike Perry
 Created: 13-Feb-2009
 Status: Open

Added: tor/trunk/doc/spec/proposals/160-bandwidth-offset.txt
===================================================================
--- tor/trunk/doc/spec/proposals/160-bandwidth-offset.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/160-bandwidth-offset.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,105 @@
+Filename: 160-bandwidth-offset.txt
+Title: Authorities vote for bandwidth offsets in consensus
+Author: Roger Dingledine
+Created: 4-May-2009
+Status: Open
+Target: 0.2.2.x
+
+1. Motivation
+
+  As part of proposal 141, we moved the bandwidth value for each relay
+  into the consensus. Now clients can know how they should load balance
+  even before they've fetched the corresponding relay descriptors.
+
+  Putting the bandwidth in the consensus also lets the directory
+  authorities choose more accurate numbers to advertise, if we come up
+  with a better algorithm for deciding weightings.
+
+  Our original plan was to teach directory authorities how to measure
+  bandwidth themselves; then every authority would vote for the bandwidth
+  it prefers, and we'd take the median of votes as usual.
+
+  The problem comes when we have 7 authorities, and only a few of them
+  have smarter bandwidth allocation algorithms. So long as the majority
+  of them are voting for the number in the relay descriptor, the minority
+  that have better numbers will be ignored.
+
+2. Options
+
+  One fix would be to demand that every authority also run the
+  new bandwidth measurement algorithms: in that case, part of the
+  responsibility of being an authority operator is that you need to run
+  this code too. But in practice we can't really require all current
+  authority operators to do that; and if we want to expand the set of
+  authority operators even further, it will become even more impractical.
+  Also, bandwidth testing adds load to the network, so we don't really
+  want to require that the number of concurrent bandwidth tests match
+  the number of authorities we have.
+
+  The better fix is to allow certain authorities to specify that they are
+  voting on bandwidth measurements: more accurate bandwidth values that
+  have actually been evaluated. In this way, authorities can vote on 
+  the median measured value if sufficient measured votes exist for a router,
+  and otherwise fall back to the median value taken from the published router
+  descriptors.
+
+3. Security implications
+
+  If only some authorities choose to vote on an offset, then a majority of
+  those voting authorities can arbitrarily change the bandwidth weighting
+  for the relay. At the extreme, if there's only one offset-voting
+  authority, then that authority can dictate which relays clients will
+  find attractive.
+
+  This problem isn't entirely new: we already have the worry wrt
+  the subset of authorities that vote for BadExit.
+
+  To make it not so bad, we should deploy at least three offset-voting
+  authorities.
+
+  Also, authorities that know how to vote for offsets should vote for
+  an offset of zero for new nodes, rather than choosing not to vote on
+  any offset in those cases.
+
+4. Design
+
+  First, we need a new consensus method to support this new calculation.
+
+  Now v3 votes can have an additional value on the "w" line:
+    "w Bandwidth=X Measured=" INT.
+
+  Once we're using the new consensus method, the new way to compute the
+  Bandwidth weight is by checking if there are at least 3 "Measured"
+  votes. If so, the median of these is taken. Otherwise, the median
+  of the "Bandwidth=" values are taken, as described in Proposal 141.
+
+  Then the actual consensus looks just the same as it did before,
+  so clients never have to know that this additional calculation is
+  happening.
+
+5. Implementation
+
+  The Measured values will be read from a file provided by the scanners
+  described in proposal 161. Files with a timestamp older than 3 days
+  will be ignored.
+
+  The file will be read in from dirserv_generate_networkstatus_vote_obj()
+  in a location specified by a new config option "V3MeasuredBandwidths".
+  A helper function will be called to populate new 'measured' and
+  'has_measured' fields of the routerstatus_t 'routerstatuses' list with 
+  values read from this file.
+
+  An additional for_vote flag will be passed to 
+  routerstatus_format_entry() from format_networkstatus_vote(), which will 
+  indicate that the "Measured=" string should be appended to the "w Bandwith=" 
+  line with the measured value in the struct.
+
+  routerstatus_parse_entry_from_string() will be modified to parse the
+  "Measured=" lines into routerstatus_t struct fields.
+
+  Finally, networkstatus_compute_consensus() will set rs_out.bandwidth 
+  to the median of the measured values if there are more than 3, otherwise
+  it will use the bandwidth value median as normal.
+
+
+


Property changes on: tor/trunk/doc/spec/proposals/160-bandwidth-offset.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/161-computing-bandwidth-adjustments.txt
===================================================================
--- tor/trunk/doc/spec/proposals/161-computing-bandwidth-adjustments.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/161-computing-bandwidth-adjustments.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,174 @@
+Title: Computing Bandwidth Adjustments
+Filename: 161-computing-bandwidth-adjustments.txt
+Author: Mike Perry
+Created: 12-May-2009
+Target: 0.2.2.x
+Status: Open
+
+
+1. Motivation
+
+  There is high variance in the performance of the Tor network. Despite
+  our efforts to balance load evenly across the Tor nodes, some nodes are
+  significantly slower and more overloaded than others.
+
+  Proposal 160 describes how we can augment the directory authorities to
+  vote on measured bandwidths for routers. This proposal describes what
+  goes into the measuring process.
+
+
+2. Measurement Selection
+
+  The general idea is to determine a load factor representing the ratio
+  of the capacity of measured nodes to the rest of the network. This load
+  factor could be computed from three potentially relevant statistics:
+  circuit failure rates, circuit extend times, or stream capacity.
+
+  Circuit failure rates and circuit extend times appear to be
+  non-linearly proportional to node load. We've observed that the same
+  nodes when scanned at US nighttime hours (when load is presumably
+  lower) exhibit almost no circuit failure, and significantly faster
+  extend times than when scanned during the day.
+
+  Stream capacity, however, is much more uniform, even during US
+  nighttime hours. Moreover, it is a more intuitive representation of
+  node capacity, and also less dependent upon distance and latency
+  if amortized over large stream fetches.
+
+
+3. Average Stream Bandwidth Calculation
+
+  The average stream bandwidths are obtained by dividing the network into
+  slices of 50 nodes each, grouped according to advertised node bandwidth.
+
+  Two hop circuits are built using nodes from the same slice, and a large
+  file is downloaded via these circuits. The file sizes are set based
+  on node percentile rank as follows:
+    
+     0-10: 2M
+     10-20: 1M
+     20-30: 512k
+     30-50: 256k
+     50-100: 128k
+
+  These sizes are based on measurements performed during test scans.
+
+  This process is repeated until each node has been chosen to participate
+  in at least 5 circuits.
+
+
+4. Ratio Calculation
+
+  The ratios are calculated by dividing each measured value by the 
+  network-wide average.
+
+
+5. Ratio Filtering
+
+  After the base ratios are calculated, a second pass is performed
+  to remove any streams with nodes of ratios less than X=0.5 from
+  the results of other nodes. In addition, all outlying streams
+  with capacity of one standard deviation below a node's average
+  are also removed.
+
+  The final ratio result will be greater of the unfiltered ratio
+  and the filtered ratio.
+
+
+6. Pseudocode for Ratio Calculation Algorithm
+
+  Here is the complete pseudocode for the ratio algorithm:
+
+    Slices = {S | S is 50 nodes of similar consensus capacity}
+    for S in Slices:
+      while exists node N in S with circ_chosen(N) < 7:
+        fetch_slice_file(build_2hop_circuit(N, (exit in S)))
+      for N in S:
+        BW_measured(N) = MEAN(b | b is bandwidth of a stream through N)
+        Bw_stddev(N) = STDDEV(b | b is bandwidth of a stream through N)
+      Bw_avg(S) = MEAN(b | b = BW_measured(N) for all N in S)  
+      for N in S:
+        Normal_Streams(N) = {stream via N | bandwidth >= BW_measured(N)} 
+        BW_Norm_measured(N) =  MEAN(b | b is a bandwidth of Normal_Streams(N))
+
+    Bw_net_avg(Slices) = MEAN(BW_measured(N) for all N in Slices)
+    Bw_Norm_net_avg(Slices) = MEAN(BW_Norm_measured(N) for all N in Slices)
+
+    for N in all Slices:
+      Bw_net_ratio(N) = Bw_measured(N)/Bw_net_avg(Slices)
+      Bw_Norm_net_ratio(N) = BW_Norm_measured(N)/Bw_Norm_net_avg(Slices)
+
+      ResultRatio(N) = MAX(Bw_net_ratio(N), Bw_Norm_net_ratio(N))
+
+
+7. Security implications
+
+  The ratio filtering will deal with cases of sabotage by dropping
+  both very slow outliers in stream average calculations, as well
+  as dropping streams that used very slow nodes from the calculation
+  of other nodes.
+
+  This scheme will not address nodes that try to game the system by
+  providing better service to scanners. The scanners can be detected
+  at the entry by IP address, and at the exit by the destination fetch
+  IP.
+
+  Measures can be taken to obfuscate and separate the scanners' source
+  IP address from the directory authority IP address. For instance,
+  scans can happen offsite and the results can be rsynced into the
+  authorities. The destination server IP can also change.
+ 
+  Neither of these methods are foolproof, but such nodes can already
+  lie about their bandwidth to attract more traffic, so this solution
+  does not set us back any in that regard.
+
+
+8. Parallelization
+
+  Because each slice takes as long as 6 hours to complete, we will want
+  to parallelize as much as possible. This will be done by concurrently
+  running multiple scanners from each authority to deal with different
+  segments of the network. Each scanner piece will continually loop 
+  over a portion of the network, outputting files of the form:
+
+   node_id=<idhex> SP strm_bw=<BW_measured(N)> SP 
+         filt_bw=<BW_Norm_measured(N)> ns_bw=<CurrentConsensusBw(N)> NL
+
+  The most recent file from each scanner will be periodically gathered 
+  by another script that uses them to produce network-wide averages 
+  and calculate ratios as per the algorithm in section 6. Because nodes 
+  may shift in capacity, they may appear in more than one slice and/or 
+  appear more than once in the file set. The most recently measured
+  line will be chosen in this case.
+
+
+9. Integration with Proposal 160
+
+  The final results will be produced for the voting mechanism
+  described in Proposal 160 by multiplying the derived ratio by
+  the average published consensus bandwidth during the course of the
+  scan, and taking the weighted average with the previous consensus
+  bandwidth:
+
+     Bw_new = Round((Bw_current * Alpha + Bw_scan_avg*Bw_ratio)/(Alpha + 1))
+
+  The Alpha parameter is a smoothing parameter intended to prevent
+  rapid oscillation between loaded and unloaded conditions. It is
+  currently fixed at 0.333.
+
+  The Round() step consists of rounding to the 3 most significant figures
+  in base10, and then rounding that result to the nearest 1000, with 
+  a minimum value of 1000.
+
+  This will produce a new bandwidth value that will be output into a 
+  file consisting of lines of the form:
+
+     node_id=<idhex> SP bw=<Bw_new> NL
+ 
+  The first line of the file will contain a timestamp in UNIX time()
+  seconds. This will be used by the authority to decide if the 
+  measured values are too old to use.
+ 
+  This file can be either copied or rsynced into a directory readable
+  by the directory authority.
+


Property changes on: tor/trunk/doc/spec/proposals/161-computing-bandwidth-adjustments.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/162-consensus-flavors.txt
===================================================================
--- tor/trunk/doc/spec/proposals/162-consensus-flavors.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/162-consensus-flavors.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,178 @@
+Filename: 162-consensus-flavors.txt
+Title: Publish the consensus in multiple flavors
+Author: Nick Mathewson
+Created: 14-May-2009
+Target: 0.2.2
+Status: Open
+
+Overview:
+
+   This proposal describes a way to publish each consensus in
+   multiple simultaneous formats, or "flavors".  This will reduce the
+   amount of time needed to deploy new consensus-like documents, and
+   reduce the size of consensus documents in the long term.
+
+Motivation:
+
+   In the future, we will almost surely want different fields and
+   data in the network-status document.  Examples include:
+      - Publishing hashes of microdescriptors instead of hashes of
+        full descriptors (Proposal 158).
+      - Including different digests of descriptors, instead of the
+        perhaps-soon-to-be-totally-broken SHA1.
+
+   Note that in both cases, from the client's point of view, this
+   information _replaces_ older information.  If we're using a
+   SHA256 hash, we don't need to see the SHA1.  If clients only want
+   microdescriptors, they don't (necessarily) need to see hashes of
+   other things.
+
+   Our past approach to cases like this has been to shovel all of
+   the data into the consensus document.  But this is rather poor
+   for bandwidth.  Adding a single SHA256 hash to a consensus for
+   each router increases the compressed consensus size by 47%.  In
+   comparison, replacing a single SHA1 hash with a SHA256 hash for
+   each listed router increases the consensus size by only 18%.
+
+Design in brief:
+
+   Let the voting process remain as it is, until a consensus is
+   generated.  With future versions of the voting algorithm, instead
+   of just a single consensus being generated, multiple consensus
+   "flavors" are produced.
+
+   Consensuses (all of them) include a list of which flavors are
+   being generated.  Caches fetch and serve all flavors of consensus
+   that are listed, regardless of whether they can parse or validate
+   them, and serve them to clients.  Thus, once this design is in
+   place, we won't need to deploy more cache changes in order to get
+   new flavors of consensus to be cached.
+
+   Clients download only the consensus flavor they want.
+
+A note on hashes:
+
+   Everything in this document is specified to use SHA256, and to be
+   upgradeable to use better hashes in the future.
+
+Spec modifications:
+
+   1. URLs and changes to the current consensus format.
+
+   Every consensus flavor has a name consisting of a sequence of one
+   or more alphanumeric characters and dashes.  For compatibility
+   current descriptor flavor is called "ns".
+
+   The supported consensus flavors are defined as part of the
+   authorities' consensus method.
+
+   For each supported flavor, every authority calculates another
+   consensus document of as-yet-unspecified format, and exchanges
+   detached signatures for these documents as in the current consensus
+   design.
+
+   In addition to the consensus currently served at
+   /tor/status-vote/(current|next)/consensus.z , authorities serve
+   another consensus of each flavor "F" from the location
+   /tor/status-vote/(current|next)/F/consensus.z.
+
+   When caches serve these documents, they do so from the same
+   locations.
+
+   2. Document format: generic consensus.
+
+   The format of a flavored consensus is as-yet-unspecified, except
+   that the first line is:
+      "network-status-version" SP version SP flavor NL
+
+   where version is 3 or higher, and the flavor is a string
+   consisting of alphanumeric characters and dashes, matching the
+   corresponding flavor listed in the unflavored consensus.
+
+   3. Document format: detached signatures.
+
+   In addition to the current detached signature format, we allow
+   the first line to take the form,
+      "consensus-digest" SP flavor SP 1*(Algname "=" Digest) NL
+
+   The consensus-signatures URL should contain the signatures
+   for _all_ flavors of consensus.
+
+   4. The consensus index:
+
+   Authorities additionally generate and serve a consensus-index
+   document.  Its format is:
+
+       Header ValidAfter ValidUntil Documents Signatures
+
+       Header = "consensus-index" SP version NL
+       ValidAfter = as in a consensus
+       ValidUntil = as in a consensus
+       Documents = Document*
+       Document = "document" SP flavor SP SignedLength
+                                    1*(SP AlgorithmName "=" Digest) NL
+       Signatures = Signature*
+       Signature = "directory-signature" SP algname SP identity
+                           SP signing-key-digest NL signature
+
+    There must be one Document line for each generated consensus flavor.
+    Each Document line describes the length of the signed portion of
+    a consensus (the signatures themselves are not included), along
+    with one or more digests of that signed portion.  Digests are
+    given in hex.  The algorithm "sha256" MUST be included; others
+    are allowed.
+
+    The algname part of a signature describes what algorithm was
+    used to hash the identity and signing keys, and to compute the
+    signature.  The algorithm "sha256" MUST be recognized;
+    signatures with unrecognized algorithms MUST be ignored.
+    (See below).
+
+    The consensus index is made available at
+       /tor/status-vote/(current|next)/consensus-index.z.
+
+    Caches should fetch this document so they can check the
+    correctness of the different consensus documents they fetch.
+    They do not need to check anything about an unrecognized
+    consensus document beyond its digest and length.
+
+    4.1. The "sha256" signature format.
+
+    The 'SHA256' signature format for directory objects is defined as
+    the RSA signature of the OAEP+-padded SHA256 digest of the SHA256
+    digest of the item to be signed.  When checking signatures,
+    the signature MUST be treated as valid if the signature material
+    begins with SHA256(SHA256(document)); this allows us to add other
+    data later.
+
+Considerations:
+
+    - We should not create a new flavor of consensus when adding a
+      field instead wouldn't be too onerous.
+
+    - We should not proliferate flavors lightly: clients will be
+      distinguishable based on which flavor they download.
+
+Migration:
+
+    - Stage one: authorities begin generating and serving
+      consensus-index files.
+
+    - Stage two: Caches begin downloading consensus-index files,
+      validating them, and using them to decide what flavors of
+      consensus documents to cache.  They download all listed
+      documents, and compare them to the digests given in the
+      consensus.
+
+    - Stage three: Once we want to make a significant change to the
+      consensus format, we deploy another flavor of consensus at the
+      authorities.  This will immediately start getting cached by the
+      caches, and clients can start fetching the new flavor without
+      waiting a version or two for enough caches to begin supporting
+      it.
+
+Acknowledgements:
+
+    Aspects of this design and its applications to hash migration were
+    heavily influenced by IRC conversations with Marian.
+


Property changes on: tor/trunk/doc/spec/proposals/162-consensus-flavors.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/163-detecting-clients.txt
===================================================================
--- tor/trunk/doc/spec/proposals/163-detecting-clients.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/163-detecting-clients.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,115 @@
+Filename: 163-detecting-clients.txt
+Title: Detecting whether a connection comes from a client
+Author: Nick Mathewson
+Created: 22-May-2009
+Target: 0.2.2
+Status: Open
+
+
+Overview:
+
+   Some aspects of Tor's design require relays to distinguish
+   connections from clients from connections that come from relays.
+   The existing means for doing this is easy to spoof.  We propose
+   a better approach.
+
+Motivation:
+
+   There are at least two reasons for which Tor servers want to tell
+   which connections come from clients and which come from other
+   servers:
+
+     1) Some exits, proposal 152 notwithstanding, want to disallow
+        their use as single-hop proxies.
+     2) Some performance-related proposals involve prioritizing
+        traffic from relays, or limiting traffic per client (but not
+        per relay).
+
+   Right now, we detect client vs server status based on how the
+   client opens circuits.  (Check out the code that implements the
+   AllowSingleHopExits option if you want all the details.)  This
+   method is depressingly easy to fake, though.  This document
+   proposes better means.
+
+Goals:
+
+   To make grabbing relay privileges at least as difficult as just
+   running a relay.
+
+   In the analysis below, "using server privileges" means taking any
+   action that only servers are supposed to do, like delivering a
+   BEGIN cell to an exit node that doesn't allow single hop exits,
+   or claiming server-like amounts of bandwidth.
+
+Passive detection:
+
+   A connection is definitely a client connection if it takes one of
+   the TLS methods during setup that does not establish an identity
+   key.
+
+   A circuit is definitely a client circuit if it is initiated with
+   a CREATE_FAST cell, though the node could be a client or a server.
+
+   A node that's listed in a recent consensus is probably a server.
+
+   A node to which we have successfully extended circuits from
+   multiple origins is probably a server.
+
+Active detection:
+
+   If a node doesn't try to use server privileges at all, we never
+   need to care whether it's a server.
+
+   When a node or circuit tries to use server privileges, if it is
+   "definitely a client" as per above, we can refuse it immediately.
+
+   If it's "probably a server" as per above, we can accept it.
+
+   Otherwise, we have either a client, or a server that is neither
+   listed in any consensus or used by any other clients -- in other
+   words, a new or private server.
+
+   For these servers, we should attempt to build one or more test
+   circuits through them.  If enough of the circuits succeed, the
+   node is a real relay.  If not, it is probably a client.
+
+   While we are waiting for the test circuits to succeed, we should
+   allow a short grace period in which server privileges are
+   permitted.  When a test is done, we should remember its outcome
+   for a while, so we don't need to do it again.
+
+Why it's hard to do good testing:
+
+   Doing a test circuit starting with an unlisted router requires
+   only that we have an open connection for it.  Doing a test
+   circuit starting elsewhere _through_ an unlisted router--though
+   more reliable-- would require that we have a known address, port,
+   identity key, and onion key for the router.  Only the address and
+   identity key are easily available via the current Tor protocol in
+   all cases.
+
+   We could fix this part by requiring that all servers support
+   BEGIN_DIR and support downloading at least a current descriptor
+   for themselves.
+
+Open questions:
+
+   What are the thresholds for the needed numbers of circuits
+   for us to decide that a node is a relay?
+
+      [Suggested answer: two circuits from two distinct hosts.]
+
+   How do we pick grace periods?  How long do we remember the
+   outcome of a test?
+
+      [Suggested answer: 10 minute grace period; 48 hour memory of
+      test outcomes.]
+
+   If we can build circuits starting at a suspect node, but we don't
+   have enough information to try extending circuits elsewhere
+   through the node, should we conclude that the node is
+   "server-like" or not?
+
+      [Suggested answer: for now, just try making circuits through
+      the node.  Extend this to extending circuits as needed.]
+


Property changes on: tor/trunk/doc/spec/proposals/163-detecting-clients.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/164-reporting-server-status.txt
===================================================================
--- tor/trunk/doc/spec/proposals/164-reporting-server-status.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/164-reporting-server-status.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,91 @@
+Filename: 164-reporting-server-status.txt
+Title: Reporting the status of server votes
+Author: Nick Mathewson
+Created: 22-May-2009
+Target: 0.2.2
+Status: Open
+
+
+Overview:
+
+   When a given node isn't listed in the directory, it isn't always easy
+   to tell why.  This proposal suggest a quick-and-dirty way for
+   authorities to export not only how they voted, but why, and a way to
+   collate the information.
+
+Motivation:
+
+   Right now, if you want to know the reason why your server was listed
+   a certain way in the Tor directory, the following steps are
+   recommended:
+
+       - Look through your log for reports of what the authority said
+         when you tried to upload.
+
+       - Look at the consensus; see if you're listed.
+
+       - Wait a while, see if things get better.
+
+       - Download the votes from all the authorities, and see how they
+         voted.  Try to figure out why.
+
+       - If you think they'll listen to you, ask some authority
+         operators to look you up in their mtbf files and logs to see
+         why they voted as they did.
+
+   This is far too hard.
+
+Solution:
+
+   We should add a new vote-like information-only document that
+   authorities serve on request.  Call it a "vote info".  It is
+   generated at the same time as a vote, but used only for
+   determining why a server voted as it did.  It is served from
+   /tor/status-vote-info/current/authority[.z]
+
+   It differs from a vote in that:
+
+   * Its vote-status field is 'vote-info'.
+
+   * It includes routers that the authority would not include
+     in its vote.
+
+     For these, it includes an "omitted" line with an English
+     message explaining why they were omitted.
+
+   * For each router, it includes a line describing its WFU and
+     MTBF.  The format is:
+
+       "stability <mtbf> up-since='date'"
+       "uptime <wfu> down-since='date'"
+
+   * It describes the WFU and MTBF thresholds it requires to
+     vote for a given router in various roles in the header.
+     The format is:
+
+       "flag-requirement <flag-name> <field> <op> <value>"
+
+     e.g.
+
+       "flag-requirement Guard uptime > 80"
+
+   * It includes info on routers all of whose descriptors that
+     were uploaded but rejected over the past few hours.  The
+     "r" lines for these are the same as for regular routers.
+     The other lines are omitted for these routers, and are
+     replaced with a single "rejected" line, explaining (in
+     English) why the router was rejected.
+
+
+   A status site (like Torweather or Torstatus or another
+   tool) can poll these files when they are generated, collate
+   the data, and make it available to server operators.
+
+Risks:
+
+   This document makes no provisions for caching these "vote
+   info" documents.  If many people wind up fetching them
+   aggressively from the authorities, that would be bad.
+
+
+


Property changes on: tor/trunk/doc/spec/proposals/164-reporting-server-status.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/165-simple-robust-voting.txt
===================================================================
--- tor/trunk/doc/spec/proposals/165-simple-robust-voting.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/165-simple-robust-voting.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,133 @@
+Filename: 165-simple-robust-voting.txt
+Title: Easy migration for voting authority sets
+Author: Nick Mathewson
+Created: 2009-05-28
+Status: Open
+
+Overview:
+
+  This proposal describes any easy-to-implement, easy-to-verify way to
+  change the set of authorities without creating a "flag day" situation.
+
+Motivation:
+
+  From proposal 134 ("More robust consensus voting with diverse
+  authority sets") by Peter Palfrader:
+
+      Right now there are about five authoritative directory servers
+      in the Tor network, tho this number is expected to rise to about
+      15 eventually.
+
+      Adding a new authority requires synchronized action from all
+      operators of directory authorities so that at any time during the
+      update at least half of all authorities are running and agree on
+      who is an authority.  The latter requirement is there so that the
+      authorities can arrive at a common consensus: Each authority
+      builds the consensus based on the votes from all authorities it
+      recognizes, and so a different set of recognized authorities will
+      lead to a different consensus document.
+
+  In response to this problem, proposal 134 suggested that every
+  candidate authority list in its vote whom it believes to be an
+  authority.  These A-says-B-is-an-authority relationships form a
+  directed graph.  Each authority then iteratively finds the largest
+  clique in the graph and remove it, until they find one containing
+  them.  They vote with this clique.
+
+  Proposal 134 had some problems:
+
+    - It had a security problem in that M hostile authorities in a
+      clique could effectively kick out M-1 honest authorities.  This
+      could enable a minority of the original authorities to take over.
+
+    - It was too complex in its implications to analyze well: it took us
+      over a year to realize that it was insecure.
+
+    - It tried to solve a bigger problem: general fragmentation of
+      authority trust.  Really, all we wanted to have was the ability to
+      add and remove authorities without forcing a flag day.
+
+Proposed protocol design:
+
+   A "Voting Set" is a set of authorities.  Each authority has a list of
+   the voting sets it considers acceptable.  These sets are chosen
+   manually by the authority operators. They must always contain the
+   authority itself.  Each authority lists all of these voting sets in
+   its votes.
+
+   Authorities exchange votes with every other authority in any of their
+   voting sets.
+
+   When it is time to calculate a consensus, an authority votes with
+   whichever voting set it lists that is listed by the most members of
+   that set.  In other words, given two sets S1 and S2 that an authority
+   lists, that authority will prefer to vote with S1 over S2 whenever
+   the number of other authorities in S1 that themselves list S1 is
+   higher than the number of other authorities in S2 that themselves
+   list S2.
+
+   For example, suppose authority A recognizes two sets, "A B C D" and
+   "A E F G H".  Suppose that the first set is recognized by all of A,
+   B, C, and D, whereas the second set is recognized only by A, E, and
+   F.  Because the first set is recognize by more of the authorities in
+   it than the other one, A will vote with the first set.
+
+   Ties are broken in favor of some arbitrary function of the identity
+   keys of the authorities in the set.
+
+How to migrate authority sets:
+
+   In steady state, each authority operator should list only the current
+   actual voting set as accepted.
+
+   When we want to add an authority, each authority operator configures
+   his or her server to list two voting sets: one containing all the old
+   authorities, and one containing the old authorities and the new
+   authority too.  Once all authorities are listing the new set of
+   authorities, they will start voting with that set because of its
+   size.
+
+   What if one or two authority operators are slow to list the new set?
+   Then the other operators can stop listing the old set once there are
+   enough authorities listing the new set to make its voting successful.
+   (Note that these authorities not listing the new set will still have
+   their votes counted, since they themselves will be members of the new
+   set.  They will only fail to sign the consensus generated by the
+   other authorities who are using the new set.)
+
+   When we want to remove an authority, the operators list two voting
+   sets: one containing all the authorities, and one omitting the
+   authority we want to remove.  Once enough authorities list the new
+   set as acceptable, we start having authority operators stop listing
+   the old set.  Once there are more listing the new set than the old
+   set, the new set will win.
+
+Data format changes:
+
+   Add a new 'voting-set' line to the vote document format.  Allow it to
+   occur any number of times.  Its format is:
+
+      voting-set SP 'fingerprint' SP 'fingerprint' ... NL
+
+   where each fingerprint is the hex fingerprint of an identity key of
+   an authority.  Sort fingerprints in ascending order.
+
+   When the consensus method is at least 'X' (decide this when we
+   implement the proposal), add this line to the consensus format as
+   well, before the first dir-source line.  [This information is not
+   redundant with the dir-source sections in the consensus: If an
+   authority is recognized but didn't vote, that authority will appear in
+   the voting-set line but not in the dir-source sections.]
+
+   We don't need to list other information about authorities in our
+   vote.
+
+Migration issues:
+
+   We should keep track somewhere of which Tor client versions
+   recognized which authorities.
+
+Acknowledgments:
+
+   The design came out of an IRC conversation with Peter Palfrader.  He
+   had the basic idea first.


Property changes on: tor/trunk/doc/spec/proposals/165-simple-robust-voting.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/166-statistics-extra-info-docs.txt
===================================================================
--- tor/trunk/doc/spec/proposals/166-statistics-extra-info-docs.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/166-statistics-extra-info-docs.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,391 @@
+Filename: 166-statistics-extra-info-docs.txt
+Title: Including Network Statistics in Extra-Info Documents
+Author: Karsten Loesing
+Created: 21-Jul-2009
+Target: 0.2.2
+Status: Open
+
+Change history:
+
+  21-Jul-2009  Initial proposal for or-dev
+
+
+Overview:
+
+  The Tor network has grown to almost two thousand relays and millions
+  of casual users over the past few years. With growth has come
+  increasing performance problems and attempts by some countries to
+  block access to the Tor network. In order to address these problems,
+  we need to learn more about the Tor network. This proposal suggests to
+  measure additional statistics and include them in extra-info documents
+  to help us understand the Tor network better.
+
+
+Introduction:
+
+  As of May 2009, relays, bridges, and directories gather the following
+  data for statistical purposes:
+
+  - Relays and bridges count the number of bytes that they have pushed
+    in 15-minute intervals over the past 24 hours. Relays and bridges
+    include these data in extra-info documents that they send to the
+    directory authorities whenever they publish their server descriptor.
+
+  - Bridges further include a rough number of clients per country that
+    they have seen in the past 48 hours in their extra-info documents.
+
+  - Directories can be configured to count the number of clients they
+    see per country in the past 24 hours and to write them to a local
+    file.
+
+  Since then we extended the network statistics in Tor. These statistics
+  include:
+
+  - Directories now gather more precise statistics about connecting
+    clients. Fixes include measuring in intervals of exactly 24 hours,
+    counting unsuccessful requests, measuring download times, etc. The
+    directories append their statistics to a local file every 24 hours.
+
+  - Entry guards count the number of clients per country per day like
+    bridges do and write them to a local file every 24 hours.
+
+  - Relays measure statistics of the number of cells in their circuit
+    queues and how much time these cells spend waiting there. Relays
+    write these statistics to a local file every 24 hours.
+
+  - Exit nodes count the number of read and written bytes on exit
+    connections per port as well as the number of opened exit streams
+    per port in 24-hour intervals. Exit nodes write their statistics to
+    a local file.
+
+  The following four sections contain descriptions for adding these
+  statistics to the relays' extra-info documents.
+
+
+Directory request statistics:
+
+  The first type of statistics aims at measuring directory requests sent
+  by clients to a directory mirror or directory authority. More
+  precisely, these statistics aim at requests for v2 and v3 network
+  statuses only. These directory requests are sent non-anonymously,
+  either via HTTP-like requests to a directory's Dir port or tunneled
+  over a 1-hop circuit.
+
+  Measuring directory request statistics is useful for several reasons:
+  First, the number of locally seen directory requests can be used to
+  estimate the total number of clients in the Tor network. Second, the
+  country-wise classification of requests using a GeoIP database can
+  help counting the relative and absolute number of users per country.
+  Third, the download times can give hints on the available bandwidth
+  capacity at clients.
+
+  Directory requests do not give any hints on the contents that clients
+  send or receive over the Tor network. Every client requests network
+  statuses from the directories, so that there are no anonymity-related
+  concerns to gather these statistics. It might be, though, that clients
+  wish to hide the fact that they are connecting to the Tor network.
+  Therefore, IP addresses are resolved to country codes in memory,
+  events are accumulated over 24 hours, and numbers are rounded up to
+  multiples of 4 or 8.
+
+   "dirreq-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+      [At most once.]
+
+      YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+      interval of length NSEC seconds (86400 seconds by default).
+
+      A "dirreq-stats-end" line, as well as any other "dirreq-*" line,
+      is only added when the relay has opened its Dir port and after 24
+      hours of measuring directory requests.
+
+   "dirreq-v2-ips" CC=N,CC=N,... NL
+      [At most once.]
+   "dirreq-v3-ips" CC=N,CC=N,... NL
+      [At most once.]
+
+      List of mappings from two-letter country codes to the number of
+      unique IP addresses that have connected from that country to
+      request a v2/v3 network status, rounded up to the nearest multiple
+      of 8. Only those IP addresses are counted that the directory can
+      answer with a 200 OK status code.
+
+   "dirreq-v2-reqs" CC=N,CC=N,... NL
+      [At most once.]
+   "dirreq-v3-reqs" CC=N,CC=N,... NL
+      [At most once.]
+
+      List of mappings from two-letter country codes to the number of
+      requests for v2/v3 network statuses from that country, rounded up
+      to the nearest multiple of 8. Only those requests are counted that
+      the directory can answer with a 200 OK status code.
+
+   "dirreq-v2-share" num% NL
+      [At most once.]
+   "dirreq-v3-share" num% NL
+      [At most once.]
+
+      The share of v2/v3 network status requests that the directory
+      expects to receive from clients based on its advertised bandwidth
+      compared to the overall network bandwidth capacity. Shares are
+      formatted in percent with two decimal places. Shares are
+      calculated as means over the whole 24-hour interval.
+
+   "dirreq-v2-resp" status=num,... NL
+      [At most once.]
+   "dirreq-v3-resp" status=nul,... NL
+      [At most once.]
+
+      List of mappings from response statuses to the number of requests
+      for v2/v3 network statuses that were answered with that response
+      status, rounded up to the nearest multiple of 4. Only response
+      statuses with at least 1 response are reported. New response
+      statuses can be added at any time. The current list of response
+      statuses is as follows:
+
+      "ok": a network status request is answered; this number
+         corresponds to the sum of all requests as reported in
+         "dirreq-v2-reqs" or "dirreq-v3-reqs", respectively, before
+         rounding up.
+      "not-enough-sigs: a version 3 network status is not signed by a
+         sufficient number of requested authorities.
+      "unavailable": a requested network status object is unavailable.
+      "not-found": a requested network status is not found.
+      "not-modified": a network status has not been modified since the
+         If-Modified-Since time that is included in the request.
+      "busy": the directory is busy.
+
+   "dirreq-v2-direct-dl" key=val,... NL
+      [At most once.]
+   "dirreq-v3-direct-dl" key=val,... NL
+      [At most once.]
+   "dirreq-v2-tunneled-dl" key=val,... NL
+      [At most once.]
+   "dirreq-v3-tunneled-dl" key=val,... NL
+      [At most once.]
+
+      List of statistics about possible failures in the download process
+      of v2/v3 network statuses. Requests are either "direct"
+      HTTP-encoded requests over the relay's directory port, or
+      "tunneled" requests using a BEGIN_DIR cell over the relay's OR
+      port. The list of possible statistics can change, and statistics
+      can be left out from reporting. The current list of statistics is
+      as follows:
+
+      Successful downloads and failures:
+
+      "complete": a client has finished the download successfully.
+      "timeout": a download did not finish within 10 minutes after
+         starting to send the response.
+      "running": a download is still running at the end of the
+         measurement period for less than 10 minutes after starting to
+         send the response.
+
+      Download times:
+
+      "min", "max": smallest and largest measured bandwidth in B/s.
+      "d[1-4,6-9]": 1st to 4th and 6th to 9th decile of measured
+         bandwidth in B/s. For a given decile i, i/10 of all downloads
+         had a smaller bandwidth than di, and (10-i)/10 of all downloads
+         had a larger bandwidth than di.
+      "q[1,3]": 1st and 3rd quartile of measured bandwidth in B/s. One
+         fourth of all downloads had a smaller bandwidth than q1, one
+         fourth of all downloads had a larger bandwidth than q3, and the
+         remaining half of all downloads had a bandwidth between q1 and
+         q3.
+      "md": median of measured bandwidth in B/s. Half of the downloads
+         had a smaller bandwidth than md, the other half had a larger
+         bandwidth than md.
+
+
+Entry guard statistics:
+
+  Entry guard statistics include the number of clients per country and
+  per day that are connecting directly to an entry guard.
+
+  Entry guard statistics are important to learn more about the
+  distribution of clients to countries. In the future, this knowledge
+  can be useful to detect if there are or start to be any restrictions
+  for clients connecting from specific countries.
+
+  The information which client connects to a given entry guard is very
+  sensitive. This information must not be combined with the information
+  what contents are leaving the network at the exit nodes. Therefore,
+  entry guard statistics need to be aggregated to prevent them from
+  becoming useful for de-anonymization. Aggregation includes resolving
+  IP addresses to country codes, counting events over 24-hour intervals,
+  and rounding up numbers to the next multiple of 8.
+
+   "entry-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+      [At most once.]
+
+      YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+      interval of length NSEC seconds (86400 seconds by default).
+
+      An "entry-stats-end" line, as well as any other "entry-*"
+      line, is first added after the relay has been running for at least
+      24 hours.
+
+   "entry-ips" CC=N,CC=N,... NL
+      [At most once.]
+
+      List of mappings from two-letter country codes to the number of
+      unique IP addresses that have connected from that country to the
+      relay and which are no known other relays, rounded up to the
+      nearest multiple of 8.
+
+
+Cell statistics:
+
+  The third type of statistics have to do with the time that cells spend
+  in circuit queues. In order to gather these statistics, the relay
+  memorizes when it puts a given cell in a circuit queue and when this
+  cell is flushed. The relay further notes the life time of the circuit.
+  These data are sufficient to determine the mean number of cells in a
+  queue over time and the mean time that cells spend in a queue.
+
+  Cell statistics are necessary to learn more about possible reasons for
+  the poor network performance of the Tor network, especially high
+  latencies. The same statistics are also useful to determine the
+  effects of design changes by comparing today's data with future data.
+
+  There are basically no privacy concerns from measuring cell
+  statistics, regardless of a node being an entry, middle, or exit node.
+
+   "cell-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+      [At most once.]
+
+      YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+      interval of length NSEC seconds (86400 seconds by default).
+
+      A "cell-stats-end" line, as well as any other "cell-*" line,
+      is first added after the relay has been running for at least 24
+      hours.
+
+   "cell-processed-cells" num,...,num NL
+      [At most once.]
+
+      Mean number of processed cells per circuit, subdivided into
+      deciles of circuits by the number of cells they have processed in
+      descending order from loudest to quietest circuits.
+
+   "cell-queued-cells" num,...,num NL
+      [At most once.]
+
+      Mean number of cells contained in queues by circuit decile. These
+      means are calculated by 1) determining the mean number of cells in
+      a single circuit between its creation and its termination and 2)
+      calculating the mean for all circuits in a given decile as
+      determined in "cell-processed-cells". Numbers have a precision of
+      two decimal places.
+
+   "cell-time-in-queue" num,...,num NL
+      [At most once.]
+
+      Mean time cells spend in circuit queues in milliseconds. Times are
+      calculated by 1) determining the mean time cells spend in the
+      queue of a single circuit and 2) calculating the mean for all
+      circuits in a given decile as determined in
+      "cell-processed-cells".
+
+   "cell-circuits-per-decile" num NL
+      [At most once.]
+
+      Mean number of circuits that are included in any of the deciles,
+      rounded up to the next integer.
+
+
+Exit statistics:
+
+  The last type of statistics affects exit nodes counting the number of
+  bytes written and read and the number of streams opened per port and
+  per 24 hours. Exit port statistics can be measured from looking of
+  headers of BEGIN and DATA cells. A BEGIN cell contains the exit port
+  that is required for the exit node to open a new exit stream.
+  Subsequent DATA cells coming from the client or being sent back to the
+  client contain a length field stating how many bytes of application
+  data are contained in the cell.
+
+  Exit port statistics are important to measure in order to identify
+  possible load-balancing problems with respect to exit policies. Exit
+  nodes that permit more ports than others are very likely overloaded
+  with traffic for those ports plus traffic for other ports. Improving
+  load balancing in the Tor network improves the overall utilization of
+  bandwidth capacity.
+
+  Exit traffic is one of the most sensitive parts of network data in the
+  Tor network. Even though these statistics do not require looking at
+  traffic contents, statistics are aggregated so that they are not
+  useful for de-anonymizing users. Only those ports are reported that
+  have seen at least 0.1% of exiting or incoming bytes, numbers of bytes
+  are rounded up to full kibibytes (KiB), and stream numbers are rounded
+  up to the next multiple of 4.
+
+   "exit-stats-end" YYYY-MM-DD HH:MM:SS (NSEC s) NL
+      [At most once.]
+
+      YYYY-MM-DD HH:MM:SS defines the end of the included measurement
+      interval of length NSEC seconds (86400 seconds by default).
+
+      An "exit-stats-end" line, as well as any other "exit-*" line, is
+      first added after the relay has been running for at least 24 hours
+      and only if the relay permits exiting (where exiting to a single
+      port and IP address is sufficient).
+
+   "exit-kibibytes-written" port=N,port=N,... NL
+      [At most once.]
+   "exit-kibibytes-read" port=N,port=N,... NL
+      [At most once.]
+
+      List of mappings from ports to the number of kibibytes that the
+      relay has written to or read from exit connections to that port,
+      rounded up to the next full kibibyte.
+
+   "exit-streams-opened" port=N,port=N,... NL
+      [At most once.]
+
+      List of mappings from ports to the number of opened exit streams
+      to that port, rounded up to the nearest multiple of 4.
+
+
+Implementation notes:
+
+  Right now, relays that are configured accordingly write similar
+  statistics to those described in this proposal to disk every 24 hours.
+  With this proposal being implemented, relays include the contents of
+  these files in extra-info documents.
+
+  The following steps are necessary to implement this proposal:
+
+  1. The current format of [dirreq|entry|buffer|exit]-stats files needs
+     to be adapted to the description in this proposal. This step
+     basically means renaming keywords.
+
+  2. The timing of writing the four *-stats files should be unified, so
+     that they are written exactly after 24 hours after starting the
+     relay. Right now, the measurement intervals for dirreq, entry, and
+     exit stats starts with the first observed request, and files are
+     written when observing the first request that occurs more than 24
+     hours after the beginning of the measurement interval. With this
+     proposal, the measurement intervals should all start at the same
+     time, and files should be written exactly 24 hours later.
+
+  3. It is advantageous to cache statistics in local files in the data
+     directory until they are included in extra-info documents. The
+     reason is that the 24-hour measurement interval can be very
+     different from the 18-hour publication interval of extra-info
+     documents. When a relay crashed after finishing a measurement
+     interval, but before publishing the next extra-info document,
+     statistics would get lost. Therefore, statistics are written to
+     disk when finishing a measurement interval and read from disk when
+     generating an extra-info document. As a result, the *-stats files
+     need to be overwritten after 24 hours, rather than appending new
+     statistics to them. Further, the contents of the *-stats files need
+     to be checked in the process of generating extra-info documents.
+
+  4. With the statistics patches being tested, the ./configure options
+     should be removed and the statistics code be compiled by default.
+     It is still required for relay operators to add configuration
+     options (DirReqStatistics, ExitPortStatistics, etc.) to enable
+     gathering statistics. However, in the near future, statistics shall
+     be enabled gathered by all relays by default, where requiring a
+     ./configure option would be a barrier for many relay operators.


Property changes on: tor/trunk/doc/spec/proposals/166-statistics-extra-info-docs.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/ideas/xxx-bwrate-algs.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-bwrate-algs.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-bwrate-algs.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,106 @@
+# The following two algorithms 
+
+
+# Algorithm 1
+# TODO: Burst and Relay/Regular differentiation
+
+BwRate = Bandwidth Rate in Bytes Per Second
+GlobalWriteBucket = 0
+GlobalReadBucket = 0
+Epoch = Token Fill Rate in seconds: suggest 50ms=.050
+SecondCounter = 0
+MinWriteBytes = Minimum amount bytes per write
+
+Every Epoch Seconds:
+  UseMinWriteBytes = MinWriteBytes
+  WriteCnt = 0
+  ReadCnt = 0
+  BytesRead = 0
+
+  For Each Open OR Conn with pending write data:
+    WriteCnt++  
+  For Each Open OR Conn:
+    ReadCnt++  
+
+  BytesToRead = (BwRate*Epoch + GlobalReadBucket)/ReadCnt
+  BytesToWrite = (BwRate*Epoch + GlobalWriteBucket)/WriteCnt
+
+  if BwRate/WriteCnt < MinWriteBytes:
+    # If we aren't likely to accumulate enough bytes in a second to
+    # send a whole cell for our connections, send partials
+    Log(NOTICE, "Too many ORCons to write full blocks. Sending short packets.")
+    UseMinWriteBytes = 1
+    # Other option: We could switch to plan 2 here
+
+  # Service each writable ORConn. If there are any partial writes, 
+  # return remaining bytes from this epoch to the global pool
+  For Each Open OR Conn with pending write data:
+    ORConn->write_bucket += BytesToWrite
+    if ORConn->write_bucket > UseMinWriteBytes:
+      w = write(ORConn, MIN(len(ORConn->write_data), ORConn->write_bucket))
+      # possible that w < ORConn->write_data here due to TCP pushback.
+      # We should restore the rest of the write_bucket to the global
+      # buffer
+      GlobalWriteBucket += (ORConn->write_bucket - w)
+      ORConn->write_bucket = 0
+ 
+  For Each Open OR Conn:
+    r = read_nonblock(ORConn, BytesToRead)
+    BytesRead += r
+
+  SecondCounter += Epoch
+  if SecondCounter < 1:
+    # Save unused bytes from this epoch to be used later in the second
+    GlobalReadBucket += (BwRate*Epoch - BytesRead)
+  else:
+    SecondCounter = 0
+    GlobalReadBucket = 0
+    GlobalWriteBucket = 0
+    For Each ORConn:
+      ORConn->write_bucket = 0
+
+
+
+# Alternate plan for Writing fairly. Reads would still be covered
+# by plan 1 as there is no additional network overhead for short reads,
+# so we don't need to try to avoid them.
+# 
+# I think this is actually pretty similar to what we do now, but 
+# with the addition that the bytes accumulate up to the second mark
+# and we try to keep track of our position in the write list here
+# (unless libevent is doing that for us already and I just don't see it)
+#
+# TODO: Burst and Relay/Regular differentiation
+
+# XXX: The inability to send single cells will cause us to block
+# on EXTEND cells for low-bandwidth node pairs..
+BwRate = Bandwidth Rate in Bytes Per Second
+WriteBytes = Bytes per write
+Epoch = MAX(MIN(WriteBytes/BwRate, .333s), .050s)
+
+SecondCounter = 0
+GlobalWriteBucket = 0
+
+# New connections are inserted at Head-1 (the 'tail' of this circular list)
+# This is not 100% fifo for all node data, but it is the best we can do
+# without insane amounts of additional queueing complexity.
+WriteConnList = List of Open OR Conns with pending write data > WriteBytes
+WriteConnHead = 0
+
+Every Epoch Seconds:
+  GlobalWriteBucket += BwRate*Epoch
+  WriteListEnd = WriteConnHead
+
+  do
+    ORCONN = WriteConnList[WriteConnHead]
+    w = write(ORConn, WriteBytes)
+    GlobalWriteBucket -= w
+    WriteConnHead += 1
+  while GlobalWriteBucket > 0 and WriteConnHead != WriteListEnd
+
+  SecondCounter += Epoch
+  if SecondCounter >= 1:
+    SecondCounter = 0
+    GlobalWriteBucket = 0
+
+


Property changes on: tor/trunk/doc/spec/proposals/ideas/xxx-bwrate-algs.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,138 @@
+Filename: xxx-choosing-crypto-in-tor-protocol.txt
+Title: Picking cryptographic standards in the Tor wire protocol
+Author: Marian
+Created: 2009-05-16
+Status: Draft
+
+Motivation:
+
+  SHA-1 is horribly outdated and not suited for security critical
+  purposes. SHA-2, RIPEMD-160, Whirlpool and Tigerare good options
+  for a short-term replacement, but in the long run, we will
+  probably want to upgrade to the winner or a semi-finalist of the
+  SHA-3 competition.
+
+  For a 2006 comparison of different hash algorithms, read:
+  http://www.sane.nl/sane2006/program/final-papers/R10.pdf
+
+  Other reading about SHA-1:
+  http://www.schneier.com/blog/archives/2005/02/sha1_broken.html
+  http://www.schneier.com/blog/archives/2005/08/new_cryptanalyt.html
+  http://www.schneier.com/paper-preimages.html
+
+  Additionally, AES has been theoretically broken for years. While
+  the attack is still not efficient enough that the public sector
+  has been able to prove that it works, we should probably consider
+  the time between a theoretical attack and a practical attack as an
+  opportunity to figure out how to upgrade to a better algorithm,
+  such as Twofish.
+
+  See:
+  http://schneier.com/crypto-gram-0209.html#1
+
+Design:
+
+  I suggest that nodes should publish in directories which
+  cryptographic standards, such as hash algorithms and ciphers,
+  they support. Clients communicating with nodes will then
+  pick whichever of those cryptographic standards they prefer
+  the most. In the case that the node does not publish which
+  cryptographic standards it supports, the client should assume
+  that the server supports the older standards, such as SHA-1
+  and AES, until such time as we choose to desupport those
+  standards.
+
+  Node to node communications could work similarly. However, in
+  case they both support a set of algorithms but have different
+  preferences, the disagreement would have to be resolved
+  somehow. Two possibilities include:
+  * the node requesting communications presents which
+    cryptographic standards it supports in the request. The
+    other node picks.
+  * both nodes send each other lists of what they support and
+    what version of Tor they are using. The newer node picks,
+    based on the assumption that the newer node has the most up
+    to date information about which hash algorithm is the best.
+    Of course, the node could lie about its version, but then
+    again, it could also maliciously choose only to support older
+    algorithms.
+
+  Using this method, we could potentially add server side support
+  to hash algorithms and ciphers before we instruct clients to
+  begin preferring those hash algorithms and ciphers. In this way,
+  the clients could upgrade and the servers would already support
+  the newly preferred hash algorithms and ciphers, even if the
+  servers were still using older versions of Tor, so long as the
+  older versions of Tor were at least new enough to have server
+  side support.
+
+  This would make quickly upgrading to new hash algorithms and
+  ciphers easier. This could be very useful when new attacks
+  are published.
+
+  One concern is that client preferences could expose the client
+  to segmentation attacks. To mitigate this, we suggest hardcoding
+  preferences in the client, to prevent the client from choosing
+  to use a new hash algorithm or cipher that no one else is using
+  yet. While offering a preference might be useful in case a client
+  with an older version of Tor wants to start using the newer hash
+  algorithm or cipher that everyone else is using, if the client
+  cares enough, he or she can just upgrade Tor.
+
+  We may also have to worry about nodes which, through laziness or
+  maliciousness, refuse to start supporting new hash algorithms or
+  ciphers. This must be balanced with the need to maintain
+  backward compatibility so the client will have a large selection
+  of nodes to pick from. Adding new hash algorithms and ciphers
+  long before we suggest nodes start using them can help mitigate
+  this. However, eventually, once sufficient nodes support new
+  standards, client side support for older standards should be
+  disabled, particularly if there are practical rather than merely
+  theoretical attacks.
+
+  Server side support for older standards can be kept much longer
+  than client side support, since clients using older hashes and
+  ciphers are really only hurting theirselvse.
+
+  If server side support for a hash algorithm or cipher is added
+  but never preferred before we decide we don't really want it,
+  support can be removed without having to worry about backward
+  compatibility.
+
+Security implications:
+  Improving cryptography will improve Tor's security. However, if
+  clients pick different cryptographic standards, they could be
+  partitioned based on their cryptographic preferences. We also
+  need to worry about nodes refusing to support new standards.
+  These issues are detailed above.
+
+Specification:
+
+  Todo. Need better understanding of how Tor currently works or
+  help from someone who does.
+
+Compatibility:
+
+  This idea is intended to allow easier upgrading of cryptographic
+  hash algorithms and ciphers while maintaining backwards
+  compatibility. However, at some point, backwards compatibility
+  with very old hashes and ciphers should be dropped for security
+  reasons.
+
+Implementation:
+
+  Todo.
+
+Performance and scalability nodes:
+
+  Better hashes and cipher are someimes a little more CPU intensive
+  than weaker ones. For instance, on most computers AES is a little
+  faster than Twofish. However, in that example, I consider Twofish's
+  additional security worth the tradeoff.
+
+Acknowledgements:
+
+  Discussed this on IRC with a few people, mostly Nick Mathewson.
+  Nick was particularly helpful in explaining how Tor works,
+  explaining goals, and  providing various links to Tor
+  specifications.


Property changes on: tor/trunk/doc/spec/proposals/ideas/xxx-choosing-crypto-in-tor-protocol.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/doc/spec/proposals/ideas/xxx-encrypted-services.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-encrypted-services.txt	                        (rev 0)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-encrypted-services.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,18 @@
+
+the basic idea might be to generate a keypair, and sign little statements
+like "this key corresponds to this relay id", and publish them on karsten's
+hs dht.
+
+so if you want to talk to it, you look it up, then go to that exit.
+and by 'go to' i mean 'build a tor circuit like normal except you're sure
+where to exit'
+
+connecting to it is slower than usual, but once you're connected, it's no
+slower than normal tor.
+and you get what wikileaks wants from its hidden service, which is really
+just the UI piece.
+indymedia also wants this.
+
+might be interesting to let an encrypted service list more than one relay,
+too.
+


Property changes on: tor/trunk/doc/spec/proposals/ideas/xxx-encrypted-services.txt
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Modified: tor/trunk/doc/spec/proposals/ideas/xxx-hide-platform.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-hide-platform.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-hide-platform.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: xxx-hide-platform.txt
 Title: Hide Tor Platform Information
-Version: $Revision$
-Last-Modified: $Date$
 Author: Jacob Appelbaum 
 Created: 24-July-2008
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/ideas/xxx-port-knocking.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-port-knocking.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-port-knocking.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: xxx-port-knocking.txt
 Title: Port knocking for bridge scanning resistance
-Version: $Revision$
-Last-Modified: $Date$
 Author: Jacob Appelbaum
 Created: 19-April-2009
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-separate-streams-by-port.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,7 +1,5 @@
 Filename: xxx-separate-streams-by-port.txt
 Title: Separate streams across circuits by destination port
-Version: $Revision$
-Last-Modified: $Date$
 Author: Robert Hogan
 Created: 21-Oct-2008
 Status: Draft

Modified: tor/trunk/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt
===================================================================
--- tor/trunk/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/ideas/xxx-what-uses-sha1.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,8 +1,6 @@
 Filename: xxx-what-uses-sha1.txt
 Title: Where does Tor use SHA-1 today?
-Version: $Revision$
-Last-Modified: $Date$
-Author: Nick Mathewson
+Authors: Nick Mathewson, Marian
 Created: 30-Dec-2008
 Status: Meta
 
@@ -15,10 +13,16 @@
    too long.
 
    According to smart crypto people, the SHA-2 functions (SHA-256, etc)
-   share too much of SHA-1's structure to be very good.  Some people
-   like other hash functions; most of these have not seen enough
-   analysis to be widely regarded as an extra-good idea.
+   share too much of SHA-1's structure to be very good. RIPEMD-160 is
+   also based on flawed past hashes.  Some people think other hash
+   functions (e.g. Whirlpool and Tiger) are not as bad; most of these
+   have not seen enough analysis to be used yet.
 
+   Here is a 2006 paper about hash algorithms.
+   http://www.sane.nl/sane2006/program/final-papers/R10.pdf
+
+   (Todo: Ask smart crypto people.)
+
    By 2012, the NIST SHA-3 competition will be done, and with luck we'll
    have something good to switch too.  But it's probably a bad idea to
    wait until 2012 to figure out _how_ to migrate to a new hash
@@ -54,50 +58,138 @@
          one look silly.
 
 
+Triage
 
+   How severe are these problems?  Let's divide them into these
+   categories, where H(x) is the SHA-1 hash of x:
+      PREIMAGE -- find any x such that a H(x) has a chosen value 
+      -- A SHA-1 usage that only depends on preimage
+           resistance
+           * Also SECOND PREIMAGE. Given x, find a y not equal to 
+             x such that H(x) = H(y)
+      COLLISION<role> -- A SHA-1 usage that depends on collision
+          resistance, but the only party who could mount a
+          collision-based attack is already in a trusted role
+          (like a distribution signer or a directory authority).
+      COLLISION -- find any x and y such that H(x) = H(y) -- A 
+          SHA-1 usage that depends on collision resistance
+          and doesn't need the attacker to have any special keys.
+
+   There is no need to put much effort into fixing PREIMAGE and SECOND
+   PREIMAGE usages in the near-term: while there have been some
+   theoretical results doing these attacks against SHA-1, they don't
+   seem to be close to practical yet.  To fix COLLISION<code-signing>
+   usages is not too important either, since anyone who has the key to
+   sign the code can mount far worse attacks.  It would be good to fix
+   COLLISION<authority> usages, since we try to resist bad authorities
+   to a limited extent.  The COLLISION usages are the most important
+   to fix.
+
+   Kelsey and Schneier published a theoretical second preimage attack 
+   against SHA-1 in 2005, so it would be a good idea to fix PREIMAGE 
+   and SECOND PREIMAGE usages after fixing COLLISION usages or where fixes 
+   require minimal effort. 
+
+   http://www.schneier.com/paper-preimages.html 
+
+   Additionally, we need to consider the impact of a successful attack
+   in each of these cases.  SHA-1 collisions are still expensive even
+   if recent results are verified, and anybody with the resources to
+   compute one also has the resources to mount a decent Sybil attack.
+
+   Let's be pessimistic, and not assume that producing collisions of 
+   a given format is actually any harder than producing collisions at 
+   all.
+
+
 What Tor uses hashes for today:
 
 1. Infrastructure.
 
    A. Our X.509 certificates are signed with SHA-1.
+      COLLSION
    B. TLS uses SHA-1 (and MD5) internally to generate keys.
+      PREIMAGE?
+      * At least breaking SHA-1 and MD5 simultaneously is 
+        much more difficult than breaking either 
+        independently.
    C. Some of the TLS ciphersuites we allow use SHA-1.
+      PREIMAGE?
    D. When we sign our code with GPG, it might be using SHA-1.
+      COLLISION<code-signing>
+      * GPG 1.4 and up have writing support for SHA-2 hashes.
+        This blog has help for converting:
+        http://www.schwer.us/journal/2005/02/19/sha-1-broken-and-gnupg-gpg/
    E. Our GPG keys might be authenticated with SHA-1.
+      COLLISION<code-signing-key-signing>
    F. OpenSSL's random number generator uses SHA-1, I believe.
+      PREIMAGE
 
 2. The Tor protocol
 
    A. Everything we sign, we sign using SHA-1-based OAEP-MGF1.
+      PREIMAGE?
    B. Our CREATE cell format uses SHA-1 for: OAEP padding.
+      PREIMAGE?
    C. Our EXTEND cells use SHA-1 to hash the identity key of the
       target server.
+      COLLISION
    D. Our CREATED cells use SHA-1 to hash the derived key data.
+      ??
    E. The data we use in CREATE_FAST cells to generate a key is the
       length of a SHA-1.
+      NONE
    F. The data we send back in a CREATED/CREATED_FAST cell is the length
       of a SHA-1.
-   G. We use SHA-1 to derive our circuit keys from the negotiated g^xy value.
+      NONE
+   G. We use SHA-1 to derive our circuit keys from the negotiated g^xy
+      value.
+      NONE
    H. We use SHA-1 to derive the digest field of each RELAY cell, but that's
       used more as a checksum than as a strong digest.
+      NONE
 
 3. Directory services
 
+   [All are COLLISION or COLLISION<authority> ]
+
    A. All signatures are generated on the SHA-1 of their corresponding
       documents, using PKCS1 padding.
+      * In dir-spec.txt, section 1.3, it states,
+          "SIGNATURE" Object contains a signature (using the signing key)
+          of the PKCS1-padded digest of the entire document, taken from
+          the beginning of the Initial item, through the newline after
+          the Signature Item's keyword and its arguments."
+        So our attacker, Malcom, could generate a collision for the hash
+        that is signed. Thus, a second pre-image attack is possible.
+        Vulnerable to regular collision attack only if key is stolen.
+        If the key is stolen, Malcom could distribute two different
+        copies of the document which have the same hash. Maybe useful
+        for a partitioning attack?
    B. Router descriptors identify their corresponding extra-info documents
       by their SHA-1 digest.
+      * A third party might use a second pre-image attack to generate a
+        false extra-info document that has the same hash. The router
+        itself might use a regular collision attack to generate multiple
+        extra-info documents with the same hash, which might be useful
+        for a partitioning attack.
    C. Fingerprints in router descriptors are taken using SHA-1.
-   D. Fingerprints in authority certs are taken using SHA-1.
-   E. Fingerprints in dir-source lines of votes and consensuses are taken
+      * The fingerprint must match the public key. Not sure what would
+        happen if two routers had different public keys but the same
+        fingerprint. There could perhaps be unpredictable behaviour.
+   D. In router descriptors, routers in the same "Family" may be listed
+      by server nicknames or hexdigests.
+      * Does not seem critical.
+   E. Fingerprints in authority certs are taken using SHA-1.
+   F. Fingerprints in dir-source lines of votes and consensuses are taken
       using SHA-1.
-   F. Networkstatuses refer to routers identity keys and descriptors by their
+   G. Networkstatuses refer to routers identity keys and descriptors by their
       SHA-1 digests.
-   G. Directory-signature lines identify which key is doing the signing by
+   H. Directory-signature lines identify which key is doing the signing by
       the SHA-1 digests of the authority's signing key and its identity key.
-   H. The following items are downloaded by the SHA-1 of their contents:
+   I. The following items are downloaded by the SHA-1 of their contents:
       XXXX list them
-   I. The following items are downloaded by the SHA-1 of an identity key:
+   J. The following items are downloaded by the SHA-1 of an identity key:
       XXXX list them too.
 
 4. The rendezvous protocol
@@ -107,6 +199,12 @@
       establishment requests.
    B. Hidden servers use SHA-1 in multiple places when generating hidden
       service descriptors.
+      * The permanent-id is the first 80 bits of the SHA-1 hash of the 
+        public key
+      ** time-period performs caclulations using the permanent-id
+      * The secret-id-part is the SHA-1 has of the time period, the 
+        descriptor-cookie, and replica.
+      * Hash of introduction point's identity key.
    C. Hidden servers performing basic-type client authorization for their
       services use SHA-1 when encrypting introduction points contained in
       hidden service descriptors.
@@ -115,26 +213,35 @@
       identifier or not.
    E. Hidden servers use SHA-1 to derive .onion addresses of their
       services.
+      * What's worse, it only uses the first 80 bits of the SHA-1 hash.
+        However, the rend-spec.txt says we aren't worried about arbitrary
+        collisons?
    F. Clients use SHA-1 to generate the current hidden service descriptor
       identifiers for a given .onion address.
    G. Hidden servers use SHA-1 to remember digests of the first parts of
       Diffie-Hellman handshakes contained in introduction requests in order
-      to detect replays.
+      to detect replays. See the RELAY_ESTABLISH_INTRO cell. We seem to be
+      taking a hash of a hash here.
    H. Hidden servers use SHA-1 during the Diffie-Hellman key exchange with
       a connecting client.
 
 5. The bridge protocol
 
    XXXX write me
+   
+   A. Client may attempt to query for bridges where he knows a digest
+      (probably SHA-1) before a direct query.
 
 6. The Tor user interface
 
    A. We log information about servers based on SHA-1 hashes of their
       identity keys.
+      COLLISION
    B. The controller identifies servers based on SHA-1 hashes of their
       identity keys.
+      COLLISION
    C. Nearly all of our configuration options that list servers allow SHA-1
       hashes of their identity keys.
+      COLLISION
    E. The deprecated .exit notation uses SHA-1 hashes of identity keys
-
-
+      COLLISION

Modified: tor/trunk/doc/spec/proposals/reindex.py
===================================================================
--- tor/trunk/doc/spec/proposals/reindex.py	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/proposals/reindex.py	2009-08-19 21:47:25 UTC (rev 20335)
@@ -4,7 +4,7 @@
 class Error(Exception): pass
 
 STATUSES = """DRAFT NEEDS-REVISION NEEDS-RESEARCH OPEN ACCEPTED META FINISHED
-   CLOSED SUPERSEDED DEAD""".split()
+   CLOSED SUPERSEDED DEAD REJECTED""".split()
 REQUIRED_FIELDS = [ "Filename", "Status", "Title" ]
 CONDITIONAL_FIELDS = { "OPEN" : [ "Target" ],
                        "ACCEPTED" : [ "Target "],

Modified: tor/trunk/doc/spec/rend-spec.txt
===================================================================
--- tor/trunk/doc/spec/rend-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/rend-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                     Tor Rendezvous Specification
 
@@ -145,34 +144,11 @@
 1.2. Bob's OP generates service descriptors.
 
    The first time the OP provides an advertised service, it generates
-   a public/private keypair (stored locally).  Periodically, the OP
-   generates and publishes a descriptor of type "V0".
+   a public/private keypair (stored locally).
 
-   The "V0" descriptor contains:
+   Beginning with 0.2.0.10-alpha, Bob's OP encodes "V2" descriptors. The
+   format of a "V2" descriptor is as follows:
 
-         KL    Key length                            [2 octets]
-         PK    Bob's public key                      [KL octets]
-         TS    A timestamp                           [4 octets]
-         NI    Number of introduction points         [2 octets]
-         Ipt   A list of NUL-terminated ORs          [variable]
-         SIG   Signature of above fields             [variable]
-
-   KL is the length of PK, in octets.
-   TS is the number of seconds elapsed since Jan 1, 1970.
-
-   The members of Ipt may be either (a) nicknames, or (b) identity key
-   digests, encoded in hex, and prefixed with a '$'.  Clients must
-   accept both forms. Services must only generate the second form.
-   Once 0.0.9.x is obsoleted, we can drop the first form.
-
-   [It's ok for Bob to advertise 0 introduction points. He might want
-    to do that if he previously advertised some introduction points,
-    and now he doesn't have any. -RD]
-
-   Beginning with 0.2.0.10-alpha, Bob's OP encodes "V2" descriptors in
-   addition to "V0" descriptors. The format of a "V2" descriptor is as
-   follows:
-
      "rendezvous-service-descriptor" descriptor-id NL
 
        [At start, exactly once]
@@ -340,6 +316,10 @@
 
         (This ends the fields in the encrypted portion of the descriptor.)
 
+       [It's ok for Bob to advertise 0 introduction points. He might want
+        to do that if he previously advertised some introduction points,
+        and now he doesn't have any. -RD]
+
      "signature" NL signature-string
 
        [At end, exactly once]
@@ -349,6 +329,21 @@
 
 1.2.1. Other descriptor formats we don't use.
 
+   Support for the V0 descriptor format was dropped in 0.2.2.0-alpha-dev:
+
+         KL    Key length                            [2 octets]
+         PK    Bob's public key                      [KL octets]
+         TS    A timestamp                           [4 octets]
+         NI    Number of introduction points         [2 octets]
+         Ipt   A list of NUL-terminated ORs          [variable]
+         SIG   Signature of above fields             [variable]
+
+   KL is the length of PK, in octets.
+   TS is the number of seconds elapsed since Jan 1, 1970.
+
+   The members of Ipt may be either (a) nicknames, or (b) identity key
+   digests, encoded in hex, and prefixed with a '$'.
+
    The V1 descriptor format was understood and accepted from
    0.1.1.5-alpha-cvs to 0.2.0.6-alpha-dev, but no Tors generated it and
    it was removed:
@@ -409,7 +404,7 @@
    RELAY_ESTABLISH_INTRO cell, containing:
 
         KL   Key length                             [2 octets]
-        PK   Bob's public key                       [KL octets]
+        PK   Introduction public key                [KL octets]
         HS   Hash of session info                   [20 octets]
         SIG  Signature of above information         [variable]
 
@@ -431,16 +426,13 @@
    currently associated with PK.  On success, the OR sends Bob a
    RELAY_INTRO_ESTABLISHED cell with an empty payload.
 
-   If a hidden service is configured to publish only v2 hidden service
-   descriptors, Bob's OP does not include its own public key in the
-   RELAY_ESTABLISH_INTRO cell, but the public key of a freshly generated
-   key pair. The OP also includes these fresh public keys in the v2 hidden
-   service descriptor together with the other introduction point
-   information. The reason is that the introduction point does not need to
-   and therefore should not know for which hidden service it works, so as
-   to prevent it from tracking the hidden service's activity. If the hidden
-   service is configured to publish both, v0 and v2 descriptors, two
-   separate sets of introduction points are established.
+   Bob's OP does not include its own public key in the RELAY_ESTABLISH_INTRO
+   cell, but the public key of a freshly generated introduction key pair.
+   The OP also includes these fresh public keys in the v2 hidden service
+   descriptor together with the other introduction point information. The
+   reason is that the introduction point does not need to and therefore
+   should not know for which hidden service it works, so as to prevent it
+   from tracking the hidden service's activity.
 
 1.4. Bob's OP advertises his service descriptor(s).
 
@@ -464,10 +456,8 @@
    after its timestamp.  At least every 18 hours, Bob's OP uploads a
    fresh descriptor.
 
-   If Bob's OP is configured to publish v2 descriptors instead of or in
-   addition to v0 descriptors, it does so to a changing subset of all v2
-   hidden service directories instead of the authoritative directory
-   servers. Therefore, Bob's OP opens a stream via Tor to each
+   Bob's OP publishes v2 descriptors to a changing subset of all v2 hidden
+   service directories. Therefore, Bob's OP opens a stream via Tor to each
    responsible hidden service directory. (He may re-use old circuits
    for this.) Over this stream, Bob's OP makes an HTTP 'POST' request to a
    URL "/tor/rendezvous2/publish" relative to the hidden service
@@ -520,13 +510,22 @@
 
 1.6. Alice's OP retrieves a service descriptor.
 
-   Alice opens a stream to a directory server via Tor, and makes an HTTP GET
-   request for the document '/tor/rendezvous/<z>', where '<z>' is replaced
-   with the encoding of Bob's public key as described above. (She may re-use
-   old circuits for this.) The directory replies with a 404 HTTP response if
-   it does not recognize <z>, and otherwise returns Bob's most recently
-   uploaded service descriptor.
+   Similarly to the description in section 1.4, Alice's OP fetches a v2
+   descriptor from a randomly chosen hidden service directory out of the
+   changing subset of 6 nodes. If the request is unsuccessful, Alice retries
+   the other remaining responsible hidden service directories in a random
+   order. Alice relies on Bob to care about a potential clock skew between
+   the two by possibly storing two sets of descriptors (see end of section
+   1.4).
 
+   Alice's OP opens a stream via Tor to the chosen v2 hidden service
+   directory. (She may re-use old circuits for this.) Over this stream,
+   Alice's OP makes an HTTP 'GET' request for the document
+   "/tor/rendezvous2/<z>", where z is replaced with the encoding of the
+   descriptor ID. The directory replies with a 404 HTTP response if it does
+   not recognize <z>, and otherwise returns Bob's most recently uploaded
+   service descriptor.
+
    If Alice's OP receives a 404 response, it tries the other directory
    servers, and only fails the lookup if none recognize the public key hash.
 
@@ -541,22 +540,6 @@
    [Caching may make her partitionable, but she fetched it anonymously,
     and we can't very well *not* cache it. -RD]
 
-   Alice's OP fetches v2 descriptors in parallel to v0 descriptors. Similarly
-   to the description in section 1.4, the OP fetches a v2 descriptor from a
-   randomly chosen hidden service directory out of the changing subset of
-   6 nodes. If the request is unsuccessful, Alice retries the other
-   remaining responsible hidden service directories in a random order.
-   Alice relies on Bob to care about a potential clock skew between the two
-   by possibly storing two sets of descriptors (see end of section 1.4).
-
-   Alice's OP opens a stream via Tor to the chosen v2 hidden service
-   directory. (She may re-use old circuits for this.) Over this stream,
-   Alice's OP makes an HTTP 'GET' request for the document
-   "/tor/rendezvous2/<z>", where z is replaced with the encoding of the
-   descriptor ID. The directory replies with a 404 HTTP response if it does
-   not recognize <z>, and otherwise returns Bob's most recently uploaded
-   service descriptor.
-
 1.7. Alice's OP establishes a rendezvous point.
 
    When Alice requests a connection to a given location-hidden service,

Modified: tor/trunk/doc/spec/socks-extensions.txt
===================================================================
--- tor/trunk/doc/spec/socks-extensions.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/socks-extensions.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 Tor's extensions to the SOCKS protocol
 
 1. Overview

Modified: tor/trunk/doc/spec/tor-spec.txt
===================================================================
--- tor/trunk/doc/spec/tor-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/tor-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                          Tor Protocol Specification
 
@@ -661,8 +660,11 @@
    is speaking v2 of the link protocol or later, the OR relays the cell as a
    RELAY_EARLY cell.  Otherwise, it relays it as a RELAY cell.
 
-   If a node ever receives more than 8 RELAY_EARLY cells on a given circuit,
-   it SHOULD close the circuit.
+   If a node ever receives more than 8 RELAY_EARLY cells on a given
+   outbound circuit, it SHOULD close the circuit. (For historical reasons,
+   we don't limit the number of inbound RELAY_EARLY cells; they should
+   be harmless anyway because clients won't accept extend requests. See
+   bug 1038.)
 
    When speaking v2 of the link protocol or later, clients MUST only send
    EXTEND cells inside RELAY_EARLY cells.  Clients SHOULD send the first ~8

Modified: tor/trunk/doc/spec/version-spec.txt
===================================================================
--- tor/trunk/doc/spec/version-spec.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/spec/version-spec.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,3 @@
-$Id$
 
                         HOW TOR VERSION NUMBERS WORK
 

Modified: tor/trunk/doc/tor-rpm-creation.txt
===================================================================
--- tor/trunk/doc/tor-rpm-creation.txt	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/tor-rpm-creation.txt	2009-08-19 21:47:25 UTC (rev 20335)
@@ -2,60 +2,25 @@
 ##
 The process used to create the official rpms is as follows:
 
-Download and Extract the latest tor source code from https://www.torproject.org/.
-In the resulting directory:
-./configure
-make dist-rpm
+Download latest stable libevent from
+http://www.monkey.org/~provos/libevent/
 
-You should have at least two, maybe three, rpms.  There should be the binary
-i386.rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm.
+The first step of compiling libevent is to configure it as follows:
+./configure --enable-static --disable-shared 
 
-## Optional customization
-##
-If you wish to further tune Tor binaries in rpm format beyond this list,
-see the GCC doc page for further options:
-http://gcc.gnu.org/onlinedocs/gcc-4.0.2/gcc/
+Complete the "make" and "make install".  You will need to be root,
+or sudo -s, to complete the "make install".
 
-The tor.spec.in file contains the basic info needed to tune the binaries
-produced in rpm format. The key parameters to tune are located in the
-third section of the tor.spec.in file.  Locate the section similar to
-this:
+Check for a successful universal binary of libevent.a in, by default,
+/usr/local/lib by using the following command:
+	"file /usr/local/lib/libevent.a"
 
-## Target a specific arch and OS
-#
-# default is i386 linux
-%define target gnu
-%define target_cpu i386
-%define target_os linux
+Download and Extract the latest tor source code from
+https://www.torproject.org/download
 
-The three parameters: target, target_cpu, and target_os are used
-throughout the "make dist-rpm" process.  They control the parameters
-passed to "configure" and the final tuning of the binaries produced.
-The default settings, as shown above, create binaries for the widest
-range of Intel x86 or x86-compatible architectures.
+In the resulting directory:
+LIBS=-lrt ./configure
+make dist-rpm
 
-The parameters can be set as follows:
-
-The "target" parameter:
-This should be "gnu", "redhat", or the short name of your linux distribution.
-Other possibilities are "mandrake" or "suse".  This is passed to
-"configure" through the --host, --build, and --target parameters.
-Therefore, this "target" parameter must be a valid OS for "configure" as
-well.
-
-The "target_cpu" parameter:
-This parameter controls the optimization and tuning of your binaries via
-gcc and "configure".  This parameter is passed to gcc via the -mtune= or
--mcpu= options.  The "configure" script will also receive this parameter
-through the --host, --build, and --target parameters.  Therefore, this
-"target_cpu" parameter must be valid for both gcc and "configure".  A
-few common options for this parameter may be "athlon64, i686, pentium4" or
-others.
-
-The "target_os" parameter:
-This parameter controls the target operating system.  Normally, this is
-only "linux".  If you wish to build rpms for a non-linux operating
-system, you can replace "linux" with your operating system.
-
-
-
+You should have at least two, maybe three, rpms.  There should be the binary
+i386.rpm, a src.rpm, and on redhat/centos machines, a debuginfo.rpm.

Modified: tor/trunk/doc/tor.1.in
===================================================================
--- tor/trunk/doc/tor.1.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/doc/tor.1.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -241,10 +241,17 @@
 (Default: 0)
 .LP
 .TP
+\fBFetchDirInfoExtraEarly \fR\fB0\fR|\fB1\fR\fP
+If set to 1, Tor will fetch directory information before other
+directory caches. It will attempt to download directory information closer to
+the start of the consensus period. Normal users should leave it off.
+(Default: 0)
+.LP
+.TP
 \fBFetchHidServDescriptors \fR\fB0\fR|\fB1\fR\fP
 If set to 0, Tor will never fetch any hidden service descriptors from
 the rendezvous directories. This option is only useful if you're using
-a Tor controller that handles hidserv fetches for you.
+a Tor controller that handles hidden service fetches for you.
 (Default: 1)
 .LP
 .TP
@@ -264,31 +271,31 @@
 (Default: 0)
 .LP
 .TP
-\fBHttpProxy\fR \fIhost\fR[:\fIport\fR]\fP
+\fBHTTPProxy\fR \fIhost\fR[:\fIport\fR]\fP
 Tor will make all its directory requests through this host:port
 (or host:80 if port is not specified),
 rather than connecting directly to any directory servers.
 .LP
 .TP
-\fBHttpProxyAuthenticator\fR \fIusername:password\fP
-If defined, Tor will use this username:password for Basic Http proxy
+\fBHTTPProxyAuthenticator\fR \fIusername:password\fP
+If defined, Tor will use this username:password for Basic HTTP proxy
 authentication, as in RFC 2617. This is currently the only form of
-Http proxy authentication that Tor supports; feel free to submit a
+HTTP proxy authentication that Tor supports; feel free to submit a
 patch if you want it to support others.
 .LP
 .TP
-\fBHttpsProxy\fR \fIhost\fR[:\fIport\fR]\fP
+\fBHTTPSProxy\fR \fIhost\fR[:\fIport\fR]\fP
 Tor will make all its OR (SSL) connections through this host:port
 (or host:443 if port is not specified), via HTTP CONNECT rather than
 connecting directly to servers.  You may want to set \fBFascistFirewall\fR
-to restrict the set of ports you might try to connect to, if your Https
+to restrict the set of ports you might try to connect to, if your HTTPS
 proxy only allows connecting to certain ports.
 .LP
 .TP
-\fBHttpsProxyAuthenticator\fR \fIusername:password\fP
-If defined, Tor will use this username:password for Basic Https proxy
+\fBHTTPSProxyAuthenticator\fR \fIusername:password\fP
+If defined, Tor will use this username:password for Basic HTTPS proxy
 authentication, as in RFC 2617. This is currently the only form of
-Https proxy authentication that Tor supports; feel free to submit a
+HTTPS proxy authentication that Tor supports; feel free to submit a
 patch if you want it to support others.
 .LP
 .TP
@@ -350,10 +357,21 @@
 .LP
 .TP
 \fBHardwareAccel \fR\fB0\fR|\fB1\fP
-If non-zero, try to use crypto hardware acceleration when
-available. This is untested and probably buggy. (Default: 0)
+If non-zero, try to use built-in (static) crypto hardware acceleration when
+available. (Default: 0)
 .LP
 .TP
+\fBAccelName \fR\fINAME\fP
+When using OpenSSL hardware crypto acceleration attempt to load the dynamic
+engine of this name. This must be used for any dynamic hardware engine. Names
+can be verified with the openssl engine command.
+.LP
+.TP
+\fBAccelDir \fR\fIDIR\fP
+Specify this option if using dynamic hardware acceleration and the engine
+implementation library resides somewhere other than the OpenSSL default.
+.LP
+.TP
 \fBAvoidDiskWrites \fR\fB0\fR|\fB1\fP
 If non-zero, try to write to disk less frequently than we would otherwise.
 This is useful when running on flash memory or other media that support only
@@ -476,13 +494,15 @@
 ReachableAddresses instead. (Default: 80, 443)
 .LP
 .TP
-\fBHidServAuth \fR\fIonion-address\fR \fIauth-cookie\fP \fIservice-name\fR 
+\fBHidServAuth \fR\fIonion-address\fR \fIauth-cookie\fP [\fIservice-name\fR]
 Client authorization for a hidden service. Valid onion addresses contain 16
 characters in a-z2-7 plus ".onion", and valid auth cookies contain 22
 characters in A-Za-z0-9+/. The service name is only used for internal
 purposes, e.g., for Tor controllers. This option may be used multiple times
 for different hidden services. If a hidden service uses authorization and
-this option is not set, the hidden service is not accessible.
+this option is not set, the hidden service is not accessible. Hidden
+services can be configured to require authorization using the
+\fBHiddenServiceAuthorizeClient\fR option.
 .LP
 .TP
 \fBReachableAddresses \fR\fIADDR\fP[\fB/\fP\fIMASK\fP][:\fIPORT\fP]...\fP
@@ -500,7 +520,7 @@
 Like \fBReachableAddresses\fP, a list of addresses and ports.  Tor will obey
 these restrictions when fetching directory information, using standard HTTP
 GET requests. If not set explicitly then the value of \fBReachableAddresses\fP
-is used.  If \fBHttpProxy\fR is set then these connections will go through that
+is used.  If \fBHTTPProxy\fR is set then these connections will go through that
 proxy.
 .LP
 .TP
@@ -508,11 +528,11 @@
 Like \fBReachableAddresses\fP, a list of addresses and ports.  Tor will obey
 these restrictions when connecting to Onion Routers, using TLS/SSL.  If not set
 explicitly then the value of \fBReachableAddresses\fP is used. If
-\fBHttpsProxy\fR is set then these connections will go through that proxy.
+\fBHTTPSProxy\fR is set then these connections will go through that proxy.
 
 The separation between \fBReachableORAddresses\fP and
 \fBReachableDirAddresses\fP is only interesting when you are connecting through
-proxies (see \fBHttpProxy\fR and \fBHttpsProxy\fR).  Most proxies limit TLS
+proxies (see \fBHTTPProxy\fR and \fBHTTPSProxy\fR).  Most proxies limit TLS
 connections (which Tor uses to connect to Onion Routers) to port 443, and some
 limit HTTP GET requests (which Tor uses for fetching directory information) to
 port 80.
@@ -595,7 +615,7 @@
 reuse the same exit node for each. If the value is prepended with a '.', it is
 treated as matching an entire domain. If one of the values is just a '.', it
 means match everything. This option is useful if you frequently connect to
-sites that will expire all your authentication cookies (ie log you out) if
+sites that will expire all your authentication cookies (i.e. log you out) if
 your IP address changes. Note that this option does have the disadvantage of
 making it more clear that a given history is
 associated with a single user. However, most people who would wish to observe
@@ -672,6 +692,13 @@
 (Default: 0)
 .LP
 .TP
+\fBAllowDotExit \fR\fB0\fR|\fB1\fR\fP
+If enabled, we convert "www.google.com.foo.exit" addresses on the
+SocksPort/TransPort/NatdPort into "www.google.com" addresses that exit
+from the node "foo". Disabled by default since attacking websites and
+exit relays can use it to manipulate your path selection. (Default: 0)
+.LP
+.TP
 \fBFastFirstHopPK \fR\fB0\fR|\fB1\fR\fP
 When this option is disabled, Tor uses the public key step for the first
 hop of creating circuits. Skipping it is generally safe since we have
@@ -784,7 +811,7 @@
 .LP
 .TP
 \fBAddress \fR\fIaddress\fP
-The IP address or fqdn of this server (e.g. moria.mit.edu). You can
+The IP address or fully qualified domain name of this server (e.g. moria.mit.edu). You can
 leave this unset, and Tor will guess your IP address.
 .LP
 .TP
@@ -964,7 +991,7 @@
 \fBServerDNSAllowBrokenConfig \fR\fB0\fR|\fB1\fR\fP
 If this option is false, Tor exits immediately if there are problems
 parsing the system DNS configuration or connecting to nameservers.
-Otherwise, Tor continues to periodically retry the system namesevers
+Otherwise, Tor continues to periodically retry the system nameservers
 until it eventually succeeds.
 (Defaults to "1".)
 .LP
@@ -1045,7 +1072,7 @@
 .LP
 .TP
 \fBDirPortFrontPage \fIFILENAME\fP
-When this option is set, it takes an html file and publishes it as "/" on
+When this option is set, it takes an HTML file and publishes it as "/" on
 the DirPort. Now relay operators can provide a disclaimer without needing
 to set up a separate webserver. There's a sample disclaimer in
 contrib/tor-exit-notice.html.
@@ -1201,14 +1228,14 @@
 \fBAuthDirListBadDirs \fR\fB0\fR|\fB1\fR\fP
 Authoritative directories only.  If set to 1, this directory has
 some opinion about which nodes are unsuitable as directory caches.  (Do not
-set this to 1 unless you plan to list nonfunctioning directories as bad;
+set this to 1 unless you plan to list non-functioning directories as bad;
 otherwise, you are effectively voting in favor of every declared directory.)
 .LP
 .TP
 \fBAuthDirListBadExits \fR\fB0\fR|\fB1\fR\fP
 Authoritative directories only.  If set to 1, this directory has
 some opinion about which nodes are unsuitable as exit nodes.  (Do not
-set this to 1 unless you plan to list nonfunctioning exits as bad;
+set this to 1 unless you plan to list non-functioning exits as bad;
 otherwise, you are effectively voting in favor of every declared exit
 as an exit.)
 .LP
@@ -1217,7 +1244,7 @@
 Authoritative directories only.  If set to 1, the directory server
 rejects all uploaded server descriptors that aren't explicitly listed
 in the fingerprints file. This acts as a "panic button" if we get
-Sybiled. (Default: 0)
+hit with a Sybil attack. (Default: 0)
 .LP
 .TP
 \fBAuthDirMaxServersPerAddr\fR \fINUM\fP
@@ -1305,7 +1332,8 @@
 are 1 to 19 characters long and only use characters in A-Za-z0-9+-_
 (no spaces). If this option is set, the hidden service is not accessible
 for clients without authorization any more. Generated authorization data
-can be found in the hostname file.
+can be found in the hostname file. Clients need to put this authorization
+data in their configuration file using \fBHidServAuth\fR.
 .LP
 .TP
 \fBRendPostPeriod \fR\fIN\fR \fBseconds\fR|\fBminutes\fR|\fBhours\fR|\fBdays\fR|\fBweeks\fP

Modified: tor/trunk/src/common/Makefile.am
===================================================================
--- tor/trunk/src/common/Makefile.am	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/Makefile.am	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,8 @@
 
-noinst_LIBRARIES = libor.a libor-crypto.a
+noinst_LIBRARIES = libor.a libor-crypto.a libor-event.a
 
+EXTRA_DIST = common_sha1.i
+
 #CFLAGS  = -Wall -Wpointer-arith -O2
 
 if USE_OPENBSD_MALLOC
@@ -10,7 +12,20 @@
 endif
 
 libor_a_SOURCES = address.c log.c util.c compat.c container.c mempool.c \
-	memarea.c $(libor_extra_source)
+	memarea.c util_codedigest.c $(libor_extra_source)
 libor_crypto_a_SOURCES = crypto.c aes.c tortls.c torgzip.c
+libor_event_a_SOURCES = compat_libevent.c
 
-noinst_HEADERS = address.h log.h crypto.h test.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h memarea.h ciphers.inc
+noinst_HEADERS = address.h log.h crypto.h test.h util.h compat.h aes.h torint.h tortls.h strlcpy.c strlcat.c torgzip.h container.h ht.h mempool.h memarea.h ciphers.inc compat_libevent.h
+
+common_sha1.i: $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS)
+	if test "@SHA1SUM@" != none; then \
+	  @SHA1SUM@ $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/^\(.*\)$$/"\1\\n"/p' > common_sha1.i; \
+	elif test "@OPENSSL@" != none; then \
+	  @OPENSSL@ sha1 $(libor_SOURCES) $(libor_crypto_a_SOURCES) $(noinst_HEADERS) | @SED@ -n 's/SHA1(\(.*\))= \(.*\)/"\2  \1\\n"/p' > common_sha1.i; \
+	else \
+	  rm common_sha1.i; \
+	  touch common_sha1.i; \
+	fi
+
+util_codedigest.o: common_sha1.i

Modified: tor/trunk/src/common/address.c
===================================================================
--- tor/trunk/src/common/address.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/address.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -465,7 +465,7 @@
       *cp++ = "0123456789abcdef"[byte >> 4];
       *cp++ = '.';
     }
-    memcpy(cp, "ip6.arpa", 9); /* 8 characters plus nul */
+    memcpy(cp, "ip6.arpa", 9); /* 8 characters plus NUL */
     return 0;
   }
   return -1;
@@ -619,7 +619,7 @@
   } else {
     if (mask) {
       log_warn(LD_GENERAL,
-               "Unexpected mask in addrss %s; rejecting", escaped(s));
+               "Unexpected mask in address %s; rejecting", escaped(s));
       goto err;
     }
   }
@@ -642,7 +642,7 @@
   } else {
     if (port) {
       log_warn(LD_GENERAL,
-               "Unexpected ports in addrss %s; rejecting", escaped(s));
+               "Unexpected ports in address %s; rejecting", escaped(s));
       goto err;
     }
   }
@@ -654,9 +654,9 @@
   return -1;
 }
 
-/** Determine whether an address is IPv4, either native or ipv4-mapped ipv6.
+/** Determine whether an address is IPv4, either native or IPv4-mapped IPv6.
  * Note that this is about representation only, as any decent stack will
- * reject ipv4-mapped addresses received on the wire (and won't use them
+ * reject IPv4-mapped addresses received on the wire (and won't use them
  * on the wire either).
  */
 int
@@ -766,11 +766,11 @@
 
 /** Given two addresses <b>addr1</b> and <b>addr2</b>, return 0 if the two
  * addresses are equivalent under the mask mbits, less than 0 if addr1
- * preceeds addr2, and greater than 0 otherwise.
+ * precedes addr2, and greater than 0 otherwise.
  *
  * Different address families (IPv4 vs IPv6) are always considered unequal if
  * <b>how</b> is CMP_EXACT; otherwise, IPv6-mapped IPv4 addresses are
- * cosidered equivalent to their IPv4 equivalents.
+ * considered equivalent to their IPv4 equivalents.
  */
 int
 tor_addr_compare(const tor_addr_t *addr1, const tor_addr_t *addr2,
@@ -1021,7 +1021,7 @@
 }
 
 /** Set *<b>addr</b> to the IP address (if any) of whatever interface
- * connects to the internet.  This address should only be used in checking
+ * 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
@@ -1039,7 +1039,7 @@
   /* Use the "discard" service port */
   ((struct sockaddr_in*)&target_addr)->sin_port = 9;
   /* Don't worry: no packets are sent. We just need to use a real address
-   * on the actual internet. */
+   * on the actual Internet. */
   if (family == AF_INET6) {
     struct sockaddr_in6 *sin6 = (struct sockaddr_in6*)&target_addr;
     sock = tor_open_socket(PF_INET6,SOCK_DGRAM,IPPROTO_UDP);
@@ -1380,7 +1380,7 @@
 
 /**
  * Set *<b>addr</b> to the host-order IPv4 address (if any) of whatever
- * interface connects to the internet.  This address should only be used in
+ * interface connects to the Internet.  This address should only be used in
  * checking whether our address has changed.  Return 0 on success, -1 on
  * failure.
  */

Modified: tor/trunk/src/common/address.h
===================================================================
--- tor/trunk/src/common/address.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/address.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/common/aes.c
===================================================================
--- tor/trunk/src/common/aes.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/aes.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -27,9 +27,9 @@
  * via OpenSSL's EVP_EncryptUpdate function, or via the built-in AES
  * implementation below. */
 
-/** Defined iff we're using openssl's AES functions for AES. */
+/** Defined iff we're using OpenSSL's AES functions for AES. */
 #undef USE_OPENSSL_AES
-/** Defined iff we're using openssl's EVP code for AES. */
+/** Defined iff we're using OpenSSL's EVP code for AES. */
 #undef USE_OPENSSL_EVP
 /** Defined iff we're using Tor's internal AES implementation, defined
  * below. */
@@ -64,13 +64,13 @@
      !defined(USE_OPENSSL_EVP))
 
 /* OpenSSL 0.9.7 was the first to support AES.  It was slower than our
- *    builtin implementation.
+ *    built-in implementation.
  * OpenSSL 0.9.8 added assembly implementations for i386 and ia64.
  *    Either the i386 stuff isn't used for x86-64, or it isn't faster.
  * OpenSSL 0.9.9 (not yet out) has added assembly implementations for
  *    x86_64 (aka amd64), sparc9, and arm
  *
- * Note: the "f" at the end of openssl version numbers below means
+ * Note: the "f" at the end of OpenSSL version numbers below means
  * "release". */
 # if defined(CPU_IS_X86) || defined(CPU_IS_IA64)
 #  if OPENSSL_VERSION_NUMBER >= 0x0090800fL
@@ -84,7 +84,7 @@
 #  endif
 # endif
 
-/* Otherwise, use the builtin implementation below. */
+/* Otherwise, use the built-in implementation below. */
 # ifndef USE_OPENSSL_AES
 #  define USE_BUILTIN_AES
 # endif
@@ -380,7 +380,7 @@
  *
  * @version 3.0 (December 2000)
  *
- * Optimised ANSI C code for the Rijndael cipher (now AES)
+ * Optimized ANSI C code for the Rijndael cipher (now AES)
  *
  * @author Vincent Rijmen <vincent.rijmen@xxxxxxxxxxxxxxxxxxx>
  * @author Antoon Bosselaers <antoon.bosselaers@xxxxxxxxxxxxxxxxxxx>

Modified: tor/trunk/src/common/aes.h
===================================================================
--- tor/trunk/src/common/aes.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/aes.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /* Implements a minimal interface to counter-mode AES. */

Modified: tor/trunk/src/common/compat.c
===================================================================
--- tor/trunk/src/common/compat.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/compat.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -398,12 +398,43 @@
   240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,
 };
 
+/** Implementation of strtok_r for platforms whose coders haven't figured out
+ * how to write one.  Hey guys!  You can use this code here for free! */
+char *
+tor_strtok_r_impl(char *str, const char *sep, char **lasts)
+{
+  char *cp, *start;
+  if (str)
+    start = cp = *lasts = str;
+  else if (!*lasts)
+    return NULL;
+  else
+    start = cp = *lasts;
+
+  tor_assert(*sep);
+  if (sep[1]) {
+    while (*cp && !strchr(sep, *cp))
+      ++cp;
+  } else {
+    tor_assert(strlen(sep) == 1);
+    cp = strchr(cp, *sep);
+  }
+
+  if (!cp || !*cp) {
+    *lasts = NULL;
+  } else {
+    *cp++ = '\0';
+    *lasts = cp;
+  }
+  return start;
+}
+
 #ifdef MS_WINDOWS
 /** Take a filename and return a pointer to its final element.  This
  * function is called on __FILE__ to fix a MSVC nit where __FILE__
  * contains the full path to the file.  This is bad, because it
  * confuses users to find the home directory of the person who
- * compiled the binary in their warrning messages.
+ * compiled the binary in their warning messages.
  */
 const char *
 tor_fix_source_file(const char *fname)
@@ -490,7 +521,7 @@
 }
 
 /**
- * Rename the file <b>from</b> to the file <b>to</b>.  On unix, this is
+ * Rename the file <b>from</b> to the file <b>to</b>.  On Unix, this is
  * the same as rename(2).  On windows, this removes <b>to</b> first if
  * it already exists.
  * Returns 0 on success.  Returns -1 and sets errno on failure.
@@ -632,7 +663,7 @@
   tor_free(lockfile);
 }
 
-/* Some old versions of unix didn't define constants for these values,
+/* Some old versions of Unix didn't define constants for these values,
  * and instead expect you to say 0, 1, or 2. */
 #ifndef SEEK_CUR
 #define SEEK_CUR 1
@@ -676,6 +707,23 @@
  * eventdns and libevent.) */
 static int n_sockets_open = 0;
 
+/** Mutex to protect open_sockets, max_socket, and n_sockets_open. */
+static tor_mutex_t *socket_accounting_mutex = NULL;
+
+static INLINE void
+socket_accounting_lock(void)
+{
+  if (PREDICT_UNLIKELY(!socket_accounting_mutex))
+    socket_accounting_mutex = tor_mutex_new();
+  tor_mutex_acquire(socket_accounting_mutex);
+}
+
+static INLINE void
+socket_accounting_unlock(void)
+{
+  tor_mutex_release(socket_accounting_mutex);
+}
+
 /** As close(), but guaranteed to work for sockets across platforms (including
  * Windows, where close()ing a socket doesn't work.  Returns 0 on success, -1
  * on failure. */
@@ -683,15 +731,7 @@
 tor_close_socket(int s)
 {
   int r = 0;
-#ifdef DEBUG_SOCKET_COUNTING
-  if (s > max_socket || ! bitarray_is_set(open_sockets, s)) {
-    log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_"
-             "socket(), or that was already closed or something.", s);
-  } else {
-    tor_assert(open_sockets && s <= max_socket);
-    bitarray_clear(open_sockets, s);
-  }
-#endif
+
   /* On Windows, you have to call close() on fds returned by open(),
    * and closesocket() on fds returned by socket().  On Unix, everything
    * gets close()'d.  We abstract this difference by always using
@@ -703,6 +743,17 @@
 #else
   r = close(s);
 #endif
+
+  socket_accounting_lock();
+#ifdef DEBUG_SOCKET_COUNTING
+  if (s > max_socket || ! bitarray_is_set(open_sockets, s)) {
+    log_warn(LD_BUG, "Closing a socket (%d) that wasn't returned by tor_open_"
+             "socket(), or that was already closed or something.", s);
+  } else {
+    tor_assert(open_sockets && s <= max_socket);
+    bitarray_clear(open_sockets, s);
+  }
+#endif
   if (r == 0) {
     --n_sockets_open;
   } else {
@@ -717,9 +768,11 @@
 #endif
     r = -1;
   }
+
   if (n_sockets_open < 0)
     log_warn(LD_BUG, "Our socket count is below zero: %d. Please submit a "
              "bug report.", n_sockets_open);
+  socket_accounting_unlock();
   return r;
 }
 
@@ -754,8 +807,10 @@
 {
   int s = socket(domain, type, protocol);
   if (s >= 0) {
+    socket_accounting_lock();
     ++n_sockets_open;
     mark_socket_open(s);
+    socket_accounting_unlock();
   }
   return s;
 }
@@ -766,8 +821,10 @@
 {
   int s = accept(sockfd, addr, len);
   if (s >= 0) {
+    socket_accounting_lock();
     ++n_sockets_open;
     mark_socket_open(s);
+    socket_accounting_unlock();
   }
   return s;
 }
@@ -776,7 +833,11 @@
 int
 get_n_open_sockets(void)
 {
-  return n_sockets_open;
+  int n;
+  socket_accounting_lock();
+  n = n_sockets_open;
+  socket_accounting_unlock();
+  return n;
 }
 
 /** Turn <b>socket</b> into a nonblocking socket.
@@ -817,6 +878,7 @@
   int r;
   r = socketpair(family, type, protocol, fd);
   if (r == 0) {
+    socket_accounting_lock();
     if (fd[0] >= 0) {
       ++n_sockets_open;
       mark_socket_open(fd[0]);
@@ -825,6 +887,7 @@
       ++n_sockets_open;
       mark_socket_open(fd[1]);
     }
+    socket_accounting_unlock();
   }
   return r < 0 ? -errno : r;
 #else
@@ -1536,7 +1599,7 @@
   if (!uname_result_is_set) {
 #ifdef HAVE_UNAME
     if (uname(&u) != -1) {
-      /* (linux says 0 is success, solaris says 1 is success) */
+      /* (Linux says 0 is success, Solaris says 1 is success) */
       tor_snprintf(uname_result, sizeof(uname_result), "%s %s",
                u.sysname, u.machine);
     } else
@@ -1697,7 +1760,7 @@
 #endif
 
 /** Minimalist interface to run a void function in the background.  On
- * unix calls fork, on win32 calls beginthread.  Returns -1 on failure.
+ * 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,
@@ -1771,7 +1834,7 @@
 {
 #ifdef MS_WINDOWS
   /* Epoch bias copied from perl: number of units between windows epoch and
-   * unix epoch. */
+   * Unix epoch. */
 #define EPOCH_BIAS U64_LITERAL(116444736000000000)
 #define UNITS_PER_SEC U64_LITERAL(10000000)
 #define USEC_PER_SEC U64_LITERAL(1000000)
@@ -1904,7 +1967,7 @@
 /** True iff we've called tor_threads_init() */
 static int threads_initialized = 0;
 /** Initialize <b>mutex</b> so it can be locked.  Every mutex must be set
- * up eith tor_mutex_init() or tor_mutex_new(); not both. */
+ * up with tor_mutex_init() or tor_mutex_new(); not both. */
 void
 tor_mutex_init(tor_mutex_t *mutex)
 {
@@ -2044,6 +2107,7 @@
     pthread_mutexattr_init(&attr_reentrant);
     pthread_mutexattr_settype(&attr_reentrant, PTHREAD_MUTEX_RECURSIVE);
     threads_initialized = 1;
+    set_main_thread();
   }
 }
 #elif defined(USE_WIN32_THREADS)
@@ -2136,9 +2200,27 @@
 #if 0
   cond_event_tls_index = TlsAlloc();
 #endif
+  set_main_thread();
 }
 #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
@@ -2227,7 +2309,7 @@
    */
   { -1, NULL },
 };
-/** There does not seem to be a strerror equivalent for winsock errors.
+/** There does not seem to be a strerror equivalent for Winsock errors.
  * Naturally, we have to roll our own.
  */
 const char *
@@ -2269,7 +2351,7 @@
 /** Return a newly allocated string describing the windows system error code
  * <b>err</b>.  Note that error codes are different from errno.  Error codes
  * come from GetLastError() when a winapi call fails.  errno is set only when
- * ansi functions fail.  Whee. */
+ * ANSI functions fail.  Whee. */
 char *
 format_win32_error(DWORD err)
 {

Modified: tor/trunk/src/common/compat.h
===================================================================
--- tor/trunk/src/common/compat.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/compat.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
-/* Copyright (c) 2003-2004, Roger Dingledinex
+/* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #ifndef _TOR_COMPAT_H
@@ -267,6 +267,13 @@
 #define TOR_TOLOWER(c) (TOR_TOLOWER_TABLE[(uint8_t)c])
 #define TOR_TOUPPER(c) (TOR_TOUPPER_TABLE[(uint8_t)c])
 
+char *tor_strtok_r_impl(char *str, const char *sep, char **lasts);
+#ifdef HAVE_STRTOK_R
+#define tor_strtok_r(str, sep, lasts) strtok_r(str, sep, lasts)
+#else
+#define tor_strtok_r(str, sep, lasts) tor_strtok_r_impl(str, sep, lasts)
+#endif
+
 #ifdef MS_WINDOWS
 #define _SHORT_FILE_ (tor_fix_source_file(__FILE__))
 const char *tor_fix_source_file(const char *fname);
@@ -522,6 +529,9 @@
 #define tor_threads_init() STMT_NIL
 #endif
 
+void set_main_thread(void);
+int in_main_thread(void);
+
 #ifdef TOR_IS_MULTITHREADED
 #if 0
 typedef struct tor_cond_t tor_cond_t;

Added: tor/trunk/src/common/compat_libevent.c
===================================================================
--- tor/trunk/src/common/compat_libevent.c	                        (rev 0)
+++ tor/trunk/src/common/compat_libevent.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,471 @@
+/* Copyright (c) 2009, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+/**
+ * \file compat_libevent.c
+ * \brief Wrappers to handle porting between different versions of libevent.
+ *
+ * In an ideal world, we'd just use Libevent 2.0 from now on.  But as of June
+ * 2009, Libevent 2.0 is still in alpha, and we will have old versions of
+ * Libevent for the forseeable future.
+ **/
+
+#include "orconfig.h"
+#include "compat_libevent.h"
+
+#include "compat.h"
+#include "util.h"
+#include "log.h"
+
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
+
+/** A number representing a version of Libevent.
+
+    This is a 4-byte number, with the first three bytes representing the
+    major, minor, and patchlevel respectively of the the library.  The fourth
+    byte is unused.
+
+    This is equivalent to the format of LIBEVENT_VERSION_NUMBER on Libevent
+    2.0.1 or later.  For versions of Libevent before 1.4.0, which followed the
+    format of "1.0, 1.0a, 1.0b", we define 1.0 to be equivalent to 1.0.0, 1.0a
+    to be equivalent to 1.0.1, and so on.
+*/
+typedef uint32_t le_version_t;
+
+/* Macros: returns the number of a libevent version. */
+#define V(major, minor, patch) \
+  (((major) << 24) | ((minor) << 16) | ((patch) << 8))
+#define V_OLD(major, minor, patch) \
+  V((major), (minor), (patch)-'a'+1)
+
+#define LE_OLD V(0,0,0)
+#define LE_OTHER V(0,0,99)
+
+static le_version_t tor_get_libevent_version(const char **v_out);
+
+#ifdef HAVE_EVENT_SET_LOG_CALLBACK
+/** A string which, if it appears in a libevent log, should be ignored. */
+static const char *suppress_msg = NULL;
+/** Callback function passed to event_set_log() so we can intercept
+ * log messages from libevent. */
+static void
+libevent_logging_callback(int severity, const char *msg)
+{
+  char buf[1024];
+  size_t n;
+  if (suppress_msg && strstr(msg, suppress_msg))
+    return;
+  n = strlcpy(buf, msg, sizeof(buf));
+  if (n && n < sizeof(buf) && buf[n-1] == '\n') {
+    buf[n-1] = '\0';
+  }
+  switch (severity) {
+    case _EVENT_LOG_DEBUG:
+      log(LOG_DEBUG, LD_NET, "Message from libevent: %s", buf);
+      break;
+    case _EVENT_LOG_MSG:
+      log(LOG_INFO, LD_NET, "Message from libevent: %s", buf);
+      break;
+    case _EVENT_LOG_WARN:
+      log(LOG_WARN, LD_GENERAL, "Warning from libevent: %s", buf);
+      break;
+    case _EVENT_LOG_ERR:
+      log(LOG_ERR, LD_GENERAL, "Error from libevent: %s", buf);
+      break;
+    default:
+      log(LOG_WARN, LD_GENERAL, "Message [%d] from libevent: %s",
+          severity, buf);
+      break;
+  }
+}
+/** Set hook to intercept log messages from libevent. */
+void
+configure_libevent_logging(void)
+{
+  event_set_log_callback(libevent_logging_callback);
+}
+/** Ignore any libevent log message that contains <b>msg</b>. */
+void
+suppress_libevent_log_msg(const char *msg)
+{
+  suppress_msg = msg;
+}
+#else
+void
+configure_libevent_logging(void)
+{
+}
+void
+suppress_libevent_log_msg(const char *msg)
+{
+  (void)msg;
+}
+#endif
+
+#ifndef HAVE_EVENT2_EVENT_H
+/** Work-alike replacement for event_new() on pre-Libevent-2.0 systems. */
+struct event *
+tor_event_new(struct event_base *base, int sock, short what,
+              void (*cb)(int, short, void *), void *arg)
+{
+  struct event *e = tor_malloc_zero(sizeof(struct event));
+  event_set(e, sock, what, cb, arg);
+  if (! base)
+    base = tor_libevent_get_base();
+  event_base_set(base, e);
+  return e;
+}
+/** Work-alike replacement for evtimer_new() on pre-Libevent-2.0 systems. */
+struct event *
+tor_evtimer_new(struct event_base *base,
+                void (*cb)(int, short, void *), void *arg)
+{
+  return tor_event_new(base, -1, 0, cb, arg);
+}
+/** Work-alike replacement for evsignal_new() on pre-Libevent-2.0 systems. */
+struct event *
+tor_evsignal_new(struct event_base * base, int sig,
+                 void (*cb)(int, short, void *), void *arg)
+{
+  return tor_event_new(base, sig, EV_SIGNAL|EV_PERSIST, cb, arg);
+}
+/** Work-alike replacement for event_free() on pre-Libevent-2.0 systems. */
+void
+tor_event_free(struct event *ev)
+{
+  event_del(ev);
+  tor_free(ev);
+}
+#endif
+
+/** Global event base for use by the main thread. */
+struct event_base *the_event_base = NULL;
+
+/* This is what passes for version detection on OSX.  We set
+ * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before
+ * 10.4.0 (aka 1040). */
+#ifdef __APPLE__
+#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
+#define MACOSX_KQUEUE_IS_BROKEN \
+  (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040)
+#else
+#define MACOSX_KQUEUE_IS_BROKEN 0
+#endif
+#endif
+
+/** Initialize the Libevent library and set up the event base. */
+void
+tor_libevent_initialize(void)
+{
+  tor_assert(the_event_base == NULL);
+
+#ifdef __APPLE__
+  if (MACOSX_KQUEUE_IS_BROKEN ||
+      tor_get_libevent_version(NULL) < V_OLD(1,1,'b')) {
+    setenv("EVENT_NOKQUEUE","1",1);
+  }
+#endif
+
+#ifdef HAVE_EVENT2_EVENT_H
+  the_event_base = event_base_new();
+#else
+  the_event_base = event_init();
+#endif
+
+#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
+  /* Making this a NOTICE for now so we can link bugs to a libevent versions
+   * or methods better. */
+  log(LOG_NOTICE, LD_GENERAL,
+      "Initialized libevent version %s using method %s. Good.",
+      event_get_version(), tor_libevent_get_method());
+#else
+  log(LOG_NOTICE, LD_GENERAL,
+      "Initialized old libevent (version 1.0b or earlier).");
+  log(LOG_WARN, LD_GENERAL,
+      "You have a *VERY* old version of libevent.  It is likely to be buggy; "
+      "please build Tor with a more recent version.");
+#endif
+}
+
+/** Return the current Libevent event base that we're set up to use. */
+struct event_base *
+tor_libevent_get_base(void)
+{
+  return the_event_base;
+}
+
+#ifndef HAVE_EVENT_BASE_LOOPEXIT
+/* Replacement for event_base_loopexit on some very old versions of Libevent
+   that we are not yet brave enough to deprecate. */
+int
+tor_event_base_loopexit(struct event_base *base, struct timeval *tv)
+{
+  tor_assert(base == the_event_base);
+  return event_loopexit(tv);
+}
+#endif
+
+/** Return the name of the Libevent backend we're using. */
+const char *
+tor_libevent_get_method(void)
+{
+#ifdef HAVE_EVENT2_EVENT_H
+  return event_base_get_method(the_event_base);
+#elif defined(HAVE_EVENT_GET_METHOD)
+  return event_get_method();
+#else
+  return "<unknown>";
+#endif
+}
+
+/** Return the le_version_t for the current version of libevent.  If the
+ * version is very new, return LE_OTHER.  If the version is so old that it
+ * doesn't support event_get_version(), return LE_OLD. DOCDOC */
+static le_version_t
+tor_decode_libevent_version(const char *v)
+{
+  unsigned major, minor, patchlevel;
+  char c, extra;
+  int fields;
+
+  /* Try the new preferred "1.4.11-stable" format. */
+  fields = sscanf(v, "%u.%u.%u%c", &major, &minor, &patchlevel, &c);
+  if (fields == 3 ||
+      (fields == 4 && (c == '-' || c == '_'))) {
+    return V(major,minor,patchlevel);
+  }
+
+  /* Try the old "1.3e" format. */
+  fields = sscanf(v, "%u.%u%c%c", &major, &minor, &c, &extra);
+  if (fields == 3 && TOR_ISALPHA(c)) {
+    return V_OLD(major, minor, c);
+  } else if (fields == 2) {
+    return V(major, minor, 0);
+  }
+
+  return LE_OTHER;
+}
+
+/** Return an integer representing the binary interface of a Libevent library.
+ * Two different versions with different numbers are sure not to be binary
+ * compatible.  Two different versions with the same numbers have a decent
+ * chance of binary compatibility.*/
+static int
+le_versions_compatibility(le_version_t v)
+{
+  if (v == LE_OTHER)
+    return 0;
+  if (v < V_OLD(1,0,'c'))
+    return 1;
+  else if (v < V(1,4,0))
+    return 2;
+  else if (v < V(1,4,99))
+    return 3;
+  else if (v < V(2,0,1))
+    return 4;
+  else /* Everything 2.0 and later should be compatible. */
+    return 5;
+}
+
+/** Return the version number of the currently running version of Libevent.
+    See le_version_t for info on the format.
+ */
+static le_version_t
+tor_get_libevent_version(const char **v_out)
+{
+  const char *v;
+  le_version_t r;
+#if defined(HAVE_EVENT_GET_VERSION_NUMBER)
+  v = event_get_version();
+  r = event_get_version_number();
+#elif defined (HAVE_EVENT_GET_VERSION)
+  v = event_get_version();
+  r = tor_decode_libevent_version(v);
+#else
+  v = "pre-1.0c";
+  r = LE_OLD;
+#endif
+  if (v_out)
+    *v_out = v;
+  return r;
+}
+
+/** Return a string representation of the version of the currently running
+ * version of Libevent. */
+const char *
+tor_libevent_get_version_str(void)
+{
+#ifdef HAVE_EVENT_GET_VERSION
+  return event_get_version();
+#else
+  return "pre-1.0c";
+#endif
+}
+
+/**
+ * Compare the current Libevent method and version to a list of versions
+ * which are known not to work.  Warn the user as appropriate.
+ */
+void
+tor_check_libevent_version(const char *m, int server,
+                           const char **badness_out)
+{
+  int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0;
+  le_version_t version;
+  const char *v = NULL;
+  const char *badness = NULL;
+  const char *sad_os = "";
+
+  version = tor_get_libevent_version(&v);
+
+  /* XXX Would it be worthwhile disabling the methods that we know
+   * are buggy, rather than just warning about them and then proceeding
+   * to use them? If so, we should probably not wrap this whole thing
+   * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */
+  /* XXXX The problem is that it's not trivial to get libevent to change it's
+   * method once it's initialized, and it's not trivial to tell what method it
+   * will use without initializing it.  I guess we could preemptively disable
+   * buggy libevent modes based on the version _before_ initializing it,
+   * though, but then there's no good way (afaict) to warn "I would have used
+   * kqueue, but instead I'm using select." -NM */
+  /* XXXX022 revist the above; it is fixable now. */
+  if (!strcmp(m, "kqueue")) {
+    if (version < V_OLD(1,1,'b'))
+      buggy = 1;
+  } else if (!strcmp(m, "epoll")) {
+    if (version < V(1,1,0))
+      iffy = 1;
+  } else if (!strcmp(m, "poll")) {
+    if (version < V_OLD(1,0,'e'))
+      buggy = 1;
+    if (version < V(1,1,0))
+      slow = 1;
+  } else if (!strcmp(m, "select")) {
+    if (version < V(1,1,0))
+      slow = 1;
+  } else if (!strcmp(m, "win32")) {
+    if (version < V_OLD(1,1,'b'))
+      buggy = 1;
+  }
+
+  /* Libevent versions before 1.3b do very badly on operating systems with
+   * user-space threading implementations. */
+#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
+  if (server && version < V_OLD(1,3,'b')) {
+    thread_unsafe = 1;
+    sad_os = "BSD variants";
+  }
+#elif defined(__APPLE__) || defined(__darwin__)
+  if (server && version < V_OLD(1,3,'b')) {
+    thread_unsafe = 1;
+    sad_os = "Mac OS X";
+  }
+#endif
+
+  if (thread_unsafe) {
+    log(LOG_WARN, LD_GENERAL,
+        "Libevent version %s often crashes when running a Tor server with %s. "
+        "Please use the latest version of libevent (1.3b or later)",v,sad_os);
+    badness = "BROKEN";
+  } else if (buggy) {
+    log(LOG_WARN, LD_GENERAL,
+        "There are serious bugs in using %s with libevent %s. "
+        "Please use the latest version of libevent.", m, v);
+    badness = "BROKEN";
+  } else if (iffy) {
+    log(LOG_WARN, LD_GENERAL,
+        "There are minor bugs in using %s with libevent %s. "
+        "You may want to use the latest version of libevent.", m, v);
+    badness = "BUGGY";
+  } else if (slow && server) {
+    log(LOG_WARN, LD_GENERAL,
+        "libevent %s can be very slow with %s. "
+        "When running a server, please use the latest version of libevent.",
+        v,m);
+    badness = "SLOW";
+  }
+
+  *badness_out = badness;
+}
+
+#if defined(LIBEVENT_VERSION)
+#define HEADER_VERSION LIBEVENT_VERSION
+#elif defined(_EVENT_VERSION)
+#define HEADER_VERSION _EVENT_VERSION
+#endif
+
+/** See whether the headers we were built against differ from the library we
+ * linked against so much that we're likely to crash.  If so, warn the
+ * user. */
+void
+tor_check_libevent_header_compatibility(void)
+{
+  (void) le_versions_compatibility;
+  (void) tor_decode_libevent_version;
+
+  /* In libevent versions before 2.0, it's hard to keep binary compatibility
+   * between upgrades, and unpleasant to detect when the version we compiled
+   * against is unlike the version we have linked against. Here's how. */
+#if defined(HEADER_VERSION) && defined(HAVE_EVENT_GET_VERSION)
+  /* We have a header-file version and a function-call version. Easy. */
+  if (strcmp(HEADER_VERSION, event_get_version())) {
+    le_version_t v1, v2;
+    int compat1 = -1, compat2 = -1;
+    int verybad;
+    v1 = tor_decode_libevent_version(HEADER_VERSION);
+    v2 = tor_decode_libevent_version(event_get_version());
+    compat1 = le_versions_compatibility(v1);
+    compat2 = le_versions_compatibility(v2);
+
+    verybad = compat1 != compat2;
+
+    log(verybad ? LOG_WARN : LOG_NOTICE,
+        LD_GENERAL, "We were compiled with headers from version %s "
+        "of Libevent, but we're using a Libevent library that says it's "
+        "version %s.", HEADER_VERSION, event_get_version());
+    if (verybad)
+      log_warn(LD_GENERAL, "This will almost certainly make Tor crash.");
+    else
+      log_info(LD_GENERAL, "I think these versions are binary-compatible.");
+  }
+#elif defined(HAVE_EVENT_GET_VERSION)
+  /* event_get_version but no _EVENT_VERSION.  We might be in 1.4.0-beta or
+     earlier, where that's normal.  To see whether we were compiled with an
+     earlier version, let's see whether the struct event defines MIN_HEAP_IDX.
+  */
+#ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX
+  /* The header files are 1.4.0-beta or later. If the version is not
+   * 1.4.0-beta, we are incompatible. */
+  {
+    if (strcmp(event_get_version(), "1.4.0-beta")) {
+      log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
+               "Libevent 1.4.0-beta header files, whereas you have linked "
+               "against Libevent %s.  This will probably make Tor crash.",
+               event_get_version());
+    }
+  }
+#else
+  /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or
+     later, we're probably fine. */
+  {
+    const char *v = event_get_version();
+    if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') {
+      log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
+               "Libevent header file from 1.3e or earlier, whereas you have "
+               "linked against Libevent %s.  This will probably make Tor "
+               "crash.", event_get_version());
+    }
+  }
+#endif
+
+#elif defined(HEADER_VERSION)
+#warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd."
+#else
+  /* Your libevent is ancient. */
+#endif
+}
+


Property changes on: tor/trunk/src/common/compat_libevent.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Added: tor/trunk/src/common/compat_libevent.h
===================================================================
--- tor/trunk/src/common/compat_libevent.h	                        (rev 0)
+++ tor/trunk/src/common/compat_libevent.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,54 @@
+/* Copyright (c) 2009, The Tor Project, Inc. */
+/* See LICENSE for licensing information */
+
+#ifndef _TOR_COMPAT_LIBEVENT_H
+#define _TOR_COMPAT_LIBEVENT_H
+
+#include "orconfig.h"
+
+struct event;
+struct event_base;
+
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/util.h>
+#else
+#define evutil_socket_t int
+#endif
+
+void configure_libevent_logging(void);
+void suppress_libevent_log_msg(const char *msg);
+
+#ifdef HAVE_EVENT2_EVENT_H
+#define tor_event_new     event_new
+#define tor_evtimer_new   evtimer_new
+#define tor_evsignal_new  evsignal_new
+#define tor_event_free    event_free
+#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);
+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);
+#endif
+
+/* XXXX022 If we can drop support for Libevent before 1.1, we can
+ * do without this wrapper. */
+#ifdef HAVE_EVENT_BASE_LOOPEXIT
+#define tor_event_base_loopexit event_base_loopexit
+#else
+struct timeval;
+int tor_event_base_loopexit(struct event_base *base, struct timeval *tv);
+#endif
+
+void tor_libevent_initialize(void);
+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);
+void tor_check_libevent_header_compatibility(void);
+const char *tor_libevent_get_version_str(void);
+
+#endif
+


Property changes on: tor/trunk/src/common/compat_libevent.h
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Modified: tor/trunk/src/common/container.c
===================================================================
--- tor/trunk/src/common/container.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/container.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -1227,7 +1227,7 @@
 digestset_t *
 digestset_new(int max_elements)
 {
-  /* The probability of false positivies is about P=(1 - exp(-kn/m))^k, where k
+  /* The probability of false positives is about P=(1 - exp(-kn/m))^k, where k
    * is the number of hash functions per entry, m is the bits in the array,
    * and n is the number of elements inserted.  For us, k==4, n<=max_elements,
    * and m==n_bits= approximately max_elements*32.  This gives

Modified: tor/trunk/src/common/container.h
===================================================================
--- tor/trunk/src/common/container.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/container.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #ifndef _TOR_CONTAINER_H
@@ -11,7 +11,7 @@
 /** A resizeable list of pointers, with associated helpful functionality.
  *
  * The members of this struct are exposed only so that macros and inlines can
- * use them; all access to smartlist internals should go throuch the functions
+ * use them; all access to smartlist internals should go through the functions
  * and macros defined here.
  **/
 typedef struct smartlist_t {
@@ -229,7 +229,7 @@
   STMT_END
 
 /* Helper: Given two lists of items, possibly of different types, such that
- * both lists are sorted on some common field (as determened by a comparison
+ * both lists are sorted on some common field (as determined by a comparison
  * expression <b>cmpexpr</b>), and such that one list (<b>sl1</b>) has no
  * duplicates on the common field, loop through the lists in lockstep, and
  * execute <b>unmatched_var2</b> on items in var2 that do not appear in

Modified: tor/trunk/src/common/crypto.c
===================================================================
--- tor/trunk/src/common/crypto.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/crypto.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -18,7 +18,7 @@
 #define WIN32_LEAN_AND_MEAN
 #include <windows.h>
 #include <wincrypt.h>
-/* Windows defines this; so does openssl 0.9.8h and later. We don't actually
+/* Windows defines this; so does OpenSSL 0.9.8h and later. We don't actually
  * use either definition. */
 #undef OCSP_RESPONSE
 #endif
@@ -27,6 +27,7 @@
 #include <openssl/rsa.h>
 #include <openssl/pem.h>
 #include <openssl/evp.h>
+#include <openssl/engine.h>
 #include <openssl/rand.h>
 #include <openssl/opensslv.h>
 #include <openssl/bn.h>
@@ -56,7 +57,7 @@
 #include "compat.h"
 
 #if OPENSSL_VERSION_NUMBER < 0x00907000l
-#error "We require openssl >= 0.9.7"
+#error "We require OpenSSL >= 0.9.7"
 #endif
 
 #include <openssl/engine.h>
@@ -67,13 +68,13 @@
 #define PRIVATE_KEY_OK(k) ((k) && (k)->key && (k)->key->p)
 
 #ifdef TOR_IS_MULTITHREADED
-/** A number of prealloced mutexes for use by openssl. */
+/** A number of preallocated mutexes for use by OpenSSL. */
 static tor_mutex_t **_openssl_mutexes = NULL;
-/** How many mutexes have we allocated for use by openssl? */
+/** How many mutexes have we allocated for use by OpenSSL? */
 static int _n_openssl_mutexes = 0;
 #endif
 
-/** A public key, or a public/private keypair. */
+/** A public key, or a public/private key-pair. */
 struct crypto_pk_env_t
 {
   int refs; /* reference counting so we don't have to copy keys */
@@ -166,36 +167,70 @@
   }
 }
 
+/** Try to load an engine in a shared library via fully qualified path.
+ */
+static ENGINE *
+try_load_engine(const char *path, const char *engine)
+{
+  ENGINE *e = ENGINE_by_id("dynamic");
+  if (e) {
+    if (!ENGINE_ctrl_cmd_string(e, "ID", engine, 0) ||
+        !ENGINE_ctrl_cmd_string(e, "DIR_LOAD", "2", 0) ||
+        !ENGINE_ctrl_cmd_string(e, "DIR_ADD", path, 0) ||
+        !ENGINE_ctrl_cmd_string(e, "LOAD", NULL, 0)) {
+      ENGINE_free(e);
+      e = NULL;
+    }
+  }
+  return e;
+}
+
 /** Initialize the crypto library.  Return 0 on success, -1 on failure.
  */
 int
-crypto_global_init(int useAccel)
+crypto_global_init(int useAccel, const char *accelName, const char *accelDir)
 {
   if (!_crypto_global_initialized) {
     ERR_load_crypto_strings();
     OpenSSL_add_all_algorithms();
     _crypto_global_initialized = 1;
     setup_openssl_threading();
-    /* XXX the below is a bug, since we can't know if we're supposed
-     * to be using hardware acceleration or not. we should arrange
-     * for this function to be called before init_keys. But make it
-     * not complain loudly, at least until we make acceleration work. */
-    if (useAccel < 0) {
-      log_info(LD_CRYPTO, "Initializing OpenSSL via tor_tls_init().");
-    }
     if (useAccel > 0) {
+      ENGINE *e = NULL;
       log_info(LD_CRYPTO, "Initializing OpenSSL engine support.");
       ENGINE_load_builtin_engines();
-      if (!ENGINE_register_all_complete())
-        return -1;
-
-      /* XXXX make sure this isn't leaking. */
+      ENGINE_register_all_complete();
+      if (accelName) {
+        if (accelDir) {
+          log_info(LD_CRYPTO, "Trying to load dynamic OpenSSL engine \"%s\""
+                   " via path \"%s\".", accelName, accelDir);
+          e = try_load_engine(accelName, accelDir);
+        } else {
+          log_info(LD_CRYPTO, "Initializing dynamic OpenSSL engine \"%s\""
+                   " acceleration support.", accelName);
+          e = ENGINE_by_id(accelName);
+        }
+        if (!e) {
+          log_warn(LD_CRYPTO, "Unable to load dynamic OpenSSL engine \"%s\".",
+                   accelName);
+        } else {
+          log_info(LD_CRYPTO, "Loaded dynamic OpenSSL engine \"%s\".",
+                   accelName);
+        }
+      }
+      if (e) {
+        log_info(LD_CRYPTO, "Loaded OpenSSL hardware acceleration engine,"
+                 " setting default ciphers.");
+        ENGINE_set_default(e, ENGINE_METHOD_ALL);
+      }
       log_engine("RSA", ENGINE_get_default_RSA());
       log_engine("DH", ENGINE_get_default_DH());
       log_engine("RAND", ENGINE_get_default_RAND());
       log_engine("SHA1", ENGINE_get_digest_engine(NID_sha1));
       log_engine("3DES", ENGINE_get_cipher_engine(NID_des_ede3_ecb));
       log_engine("AES", ENGINE_get_cipher_engine(NID_aes_128_ecb));
+    } else {
+      log_info(LD_CRYPTO, "NOT using OpenSSL engine support.");
     }
     return crypto_seed_rng(1);
   }
@@ -405,10 +440,10 @@
   if (env->key)
     RSA_free(env->key);
 #if OPENSSL_VERSION_NUMBER < 0x00908000l
-  /* In openssl 0.9.7, RSA_generate_key is all we have. */
+  /* In OpenSSL 0.9.7, RSA_generate_key is all we have. */
   env->key = RSA_generate_key(PK_BYTES*8,65537, NULL, NULL);
 #else
-  /* In openssl 0.9.8, RSA_generate_key is deprecated. */
+  /* In OpenSSL 0.9.8, RSA_generate_key is deprecated. */
   {
     BIGNUM *e = BN_new();
     RSA *r = NULL;
@@ -452,7 +487,7 @@
   tor_assert(env);
   tor_assert(s);
 
-  /* Create a read-only memory BIO, backed by the nul-terminated string 's' */
+  /* Create a read-only memory BIO, backed by the NUL-terminated string 's' */
   b = BIO_new_mem_buf((char*)s, -1);
 
   if (env->key)
@@ -1054,7 +1089,7 @@
   RSA *rsa;
   unsigned char *buf;
   /* This ifdef suppresses a type warning.  Take out the first case once
-   * everybody is using openssl 0.9.7 or later.
+   * everybody is using OpenSSL 0.9.7 or later.
    */
   const unsigned char *cp;
   cp = buf = tor_malloc(len);
@@ -1393,7 +1428,7 @@
   tor_assert(digest);
   tor_assert(data);
   /* Using the SHA1_*() calls directly means we don't support doing
-   * sha1 in hardware. But so far the delay of getting the question
+   * SHA1 in hardware. But so far the delay of getting the question
    * to the hardware, and hearing the answer, is likely higher than
    * just doing it ourselves. Hashes are fast.
    */
@@ -1554,7 +1589,7 @@
   if (tor_check_dh_key(dh->dh->pub_key)<0) {
     log_warn(LD_CRYPTO, "Weird! Our own DH key was invalid.  I guess once-in-"
              "the-universe chances really do happen.  Trying again.");
-    /* Free and clear the keys, so openssl will actually try again. */
+    /* Free and clear the keys, so OpenSSL will actually try again. */
     BN_free(dh->dh->pub_key);
     BN_free(dh->dh->priv_key);
     dh->dh->pub_key = dh->dh->priv_key = NULL;
@@ -1593,7 +1628,7 @@
   return 0;
 }
 
-/** Check for bad diffie-hellman public keys (g^x).  Return 0 if the key is
+/** Check for bad Diffie-Hellman public keys (g^x).  Return 0 if the key is
  * okay (in the subgroup [2,p-2]), or -1 if it's bad.
  * See http://www.cl.cam.ac.uk/ftp/users/rja14/psandqs.ps.gz for some tips.
  */
@@ -1742,11 +1777,11 @@
  * work for us too. */
 #define ADD_ENTROPY 32
 
-/* Use RAND_poll if openssl is 0.9.6 release or later.  (The "f" means
+/* Use RAND_poll if OpenSSL is 0.9.6 release or later.  (The "f" means
    "release".)  */
 #define HAVE_RAND_POLL (OPENSSL_VERSION_NUMBER >= 0x0090600fl)
 
-/* Versions of openssl prior to 0.9.7k and 0.9.8c had a bug where RAND_poll
+/* Versions of OpenSSL prior to 0.9.7k and 0.9.8c had a bug where RAND_poll
  * would allocate an fd_set on the stack, open a new file, and try to FD_SET
  * that fd without checking whether it fit in the fd_set.  Thus, if the
  * system has not just been started up, it is unsafe to call */
@@ -2281,7 +2316,7 @@
 }
 
 #ifdef TOR_IS_MULTITHREADED
-/** Helper: openssl uses this callback to manipulate mutexes. */
+/** Helper: OpenSSL uses this callback to manipulate mutexes. */
 static void
 _openssl_locking_cb(int mode, int n, const char *file, int line)
 {
@@ -2298,12 +2333,13 @@
     tor_mutex_release(_openssl_mutexes[n]);
 }
 
-/** OpenSSL helper type: wraps a Tor mutex so that openssl can  */
+/** OpenSSL helper type: wraps a Tor mutex so that OpenSSL can use it
+ * as a lock. */
 struct CRYPTO_dynlock_value {
   tor_mutex_t *lock;
 };
 
-/** Openssl callback function to allocate a lock: see CRYPTO_set_dynlock_*
+/** OpenSSL callback function to allocate a lock: see CRYPTO_set_dynlock_*
  * documentation in OpenSSL's docs for more info. */
 static struct CRYPTO_dynlock_value *
 _openssl_dynlock_create_cb(const char *file, int line)
@@ -2316,7 +2352,7 @@
   return v;
 }
 
-/** Openssl callback function to acquire or release a lock: see
+/** OpenSSL callback function to acquire or release a lock: see
  * CRYPTO_set_dynlock_* documentation in OpenSSL's docs for more info. */
 static void
 _openssl_dynlock_lock_cb(int mode, struct CRYPTO_dynlock_value *v,
@@ -2330,7 +2366,7 @@
     tor_mutex_release(v->lock);
 }
 
-/** Openssl callback function to free a lock: see CRYPTO_set_dynlock_*
+/** OpenSSL callback function to free a lock: see CRYPTO_set_dynlock_*
  * documentation in OpenSSL's docs for more info. */
 static void
 _openssl_dynlock_destroy_cb(struct CRYPTO_dynlock_value *v,

Modified: tor/trunk/src/common/crypto.h
===================================================================
--- tor/trunk/src/common/crypto.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/crypto.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -55,7 +55,9 @@
 typedef struct crypto_dh_env_t crypto_dh_env_t;
 
 /* global state */
-int crypto_global_init(int hardwareAccel);
+int crypto_global_init(int hardwareAccel,
+                       const char *accelName,
+                       const char *accelPath);
 void crypto_thread_cleanup(void);
 int crypto_global_cleanup(void);
 

Modified: tor/trunk/src/common/ht.h
===================================================================
--- tor/trunk/src/common/ht.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/ht.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,6 @@
-/* Copyright 2002 Christopher Clark */
-/* Copyright 2005 Nick Mathewson */
+/* Copyright (c) 2002, Christopher Clark.
+ * Copyright (c) 2005-2006, Nick Mathewson.
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See license at end. */
 
 /* Based on ideas by Christopher Clark and interfaces from Niels Provos. */
@@ -41,6 +42,10 @@
 #define HT_SIZE(head)                           \
   ((head)->hth_n_entries)
 
+/* Return memory usage for a hashtable (not counting the entries themselves) */
+#define HT_MEM_USAGE(head)                         \
+  (sizeof(*head) + (head)->hth_table_length * sizeof(void*))
+
 #define HT_FIND(name, head, elm)     name##_HT_FIND((head), (elm))
 #define HT_INSERT(name, head, elm)   name##_HT_INSERT((head), (elm))
 #define HT_REPLACE(name, head, elm)  name##_HT_REPLACE((head), (elm))
@@ -425,7 +430,7 @@
 
 /*
  * Copyright 2005, Nick Mathewson.  Implementation logic is adapted from code
- * by Cristopher Clark, retrofit to allow drop-in memory management, and to
+ * by Christopher Clark, retrofit to allow drop-in memory management, and to
  * use the same interface as Niels Provos's HT_H.  I'm not sure whether this
  * is a derived work any more, but whether it is or not, the license below
  * applies.

Modified: tor/trunk/src/common/log.c
===================================================================
--- tor/trunk/src/common/log.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/log.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -36,8 +36,6 @@
 #include "log.h"
 #include "container.h"
 
-#include <event.h>
-
 #define TRUNCATED_STR "[...truncated]"
 #define TRUNCATED_STR_LEN 14
 
@@ -921,65 +919,6 @@
   UNLOCK_LOGS();
 }
 
-#ifdef HAVE_EVENT_SET_LOG_CALLBACK
-/** A string which, if it appears in a libevent log, should be ignored. */
-static const char *suppress_msg = NULL;
-/** Callback function passed to event_set_log() so we can intercept
- * log messages from libevent. */
-static void
-libevent_logging_callback(int severity, const char *msg)
-{
-  char buf[1024];
-  size_t n;
-  if (suppress_msg && strstr(msg, suppress_msg))
-    return;
-  n = strlcpy(buf, msg, sizeof(buf));
-  if (n && n < sizeof(buf) && buf[n-1] == '\n') {
-    buf[n-1] = '\0';
-  }
-  switch (severity) {
-    case _EVENT_LOG_DEBUG:
-      log(LOG_DEBUG, LD_NET, "Message from libevent: %s", buf);
-      break;
-    case _EVENT_LOG_MSG:
-      log(LOG_INFO, LD_NET, "Message from libevent: %s", buf);
-      break;
-    case _EVENT_LOG_WARN:
-      log(LOG_WARN, LD_GENERAL, "Warning from libevent: %s", buf);
-      break;
-    case _EVENT_LOG_ERR:
-      log(LOG_ERR, LD_GENERAL, "Error from libevent: %s", buf);
-      break;
-    default:
-      log(LOG_WARN, LD_GENERAL, "Message [%d] from libevent: %s",
-          severity, buf);
-      break;
-  }
-}
-/** Set hook to intercept log messages from libevent. */
-void
-configure_libevent_logging(void)
-{
-  event_set_log_callback(libevent_logging_callback);
-}
-/** Ignore any libevent log message that contains <b>msg</b>. */
-void
-suppress_libevent_log_msg(const char *msg)
-{
-  suppress_msg = msg;
-}
-#else
-void
-configure_libevent_logging(void)
-{
-}
-void
-suppress_libevent_log_msg(const char *msg)
-{
-  (void)msg;
-}
-#endif
-
 #if 0
 static void
 dump_log_info(logfile_t *lf)

Modified: tor/trunk/src/common/log.h
===================================================================
--- tor/trunk/src/common/log.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/log.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -53,7 +53,7 @@
 
 /** Catch-all for miscellaneous events and fatal errors. */
 #define LD_GENERAL  (1u<<0)
-/** The cryptography subsytem. */
+/** The cryptography subsystem. */
 #define LD_CRYPTO   (1u<<1)
 /** Networking. */
 #define LD_NET      (1u<<2)
@@ -134,8 +134,6 @@
 void close_temp_logs(void);
 void rollback_log_changes(void);
 void mark_logs_temp(void);
-void configure_libevent_logging(void);
-void suppress_libevent_log_msg(const char *msg);
 void change_callback_log_severity(int loglevelMin, int loglevelMax,
                                   log_callback cb);
 void log_set_application_name(const char *name);

Modified: tor/trunk/src/common/memarea.c
===================================================================
--- tor/trunk/src/common/memarea.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/memarea.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, The Tor Project, Inc. */
+/* Copyright (c) 2008-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /** \file memarea.c
@@ -13,6 +13,10 @@
 #include "compat.h"
 #include "log.h"
 
+/** If true, we try to detect any attempts to write beyond the length of a
+ * memarea. */
+#define USE_SENTINELS
+
 /** All returned pointers should be aligned to the nearest multiple of this
  * value. */
 #define MEMAREA_ALIGN SIZEOF_VOID_P
@@ -25,6 +29,24 @@
 #error "void* is neither 4 nor 8 bytes long. I don't know how to align stuff."
 #endif
 
+#ifdef USE_SENTINELS
+#define SENTINEL_VAL 0x90806622u
+#define SENTINEL_LEN sizeof(uint32_t)
+#define SET_SENTINEL(chunk)                                     \
+  STMT_BEGIN                                                    \
+  set_uint32( &(chunk)->u.mem[chunk->mem_size], SENTINEL_VAL ); \
+  STMT_END
+#define CHECK_SENTINEL(chunk)                                           \
+  STMT_BEGIN                                                            \
+  uint32_t sent_val = get_uint32(&(chunk)->u.mem[chunk->mem_size]);     \
+  tor_assert(sent_val == SENTINEL_VAL);                                 \
+  STMT_END
+#else
+#define SENTINEL_LEN 0
+#define SET_SENTINEL(chunk) STMT_NIL
+#define CHECK_SENTINEL(chunk) STMT_NIL
+#endif
+
 /** Increment <b>ptr</b> until it is aligned to MEMAREA_ALIGN. */
 static INLINE void *
 realign_pointer(void *ptr)
@@ -78,15 +100,20 @@
     freelist = res->next_chunk;
     res->next_chunk = NULL;
     --freelist_len;
+    CHECK_SENTINEL(res);
     return res;
   } else {
     size_t chunk_size = freelist_ok ? CHUNK_SIZE : sz;
-    memarea_chunk_t *res = tor_malloc_roundup(&chunk_size);
+    memarea_chunk_t *res;
+    chunk_size += SENTINEL_LEN;
+    res = tor_malloc_roundup(&chunk_size);
     res->next_chunk = NULL;
-    res->mem_size = chunk_size - CHUNK_HEADER_SIZE;
+    res->mem_size = chunk_size - CHUNK_HEADER_SIZE - SENTINEL_LEN;
     res->next_mem = res->u.mem;
-    tor_assert(res->next_mem+res->mem_size == ((char*)res)+chunk_size);
+    tor_assert(res->next_mem+res->mem_size+SENTINEL_LEN ==
+               ((char*)res)+chunk_size);
     tor_assert(realign_pointer(res->next_mem) == res->next_mem);
+    SET_SENTINEL(res);
     return res;
   }
 }
@@ -96,6 +123,7 @@
 static void
 chunk_free(memarea_chunk_t *chunk)
 {
+  CHECK_SENTINEL(chunk);
   if (freelist_len < MAX_FREELIST_LEN) {
     ++freelist_len;
     chunk->next_chunk = freelist;
@@ -182,6 +210,9 @@
   memarea_chunk_t *chunk = area->first;
   char *result;
   tor_assert(chunk);
+  CHECK_SENTINEL(chunk);
+  if (sz == 0)
+    sz = 1;
   if (chunk->next_mem+sz > chunk->u.mem+chunk->mem_size) {
     if (sz+CHUNK_HEADER_SIZE >= CHUNK_SIZE) {
       /* This allocation is too big.  Stick it in a special chunk, and put
@@ -198,10 +229,11 @@
     tor_assert(chunk->mem_size >= sz);
   }
   result = chunk->next_mem;
-  chunk->next_mem = realign_pointer(chunk->next_mem + sz);
+  chunk->next_mem = chunk->next_mem + sz;
   // XXXX021 remove these once bug 930 is solved.
   tor_assert(chunk->next_mem >= chunk->u.mem);
   tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size);
+  chunk->next_mem = realign_pointer(chunk->next_mem);
   return result;
 }
 
@@ -255,6 +287,7 @@
   size_t a = 0, u = 0;
   memarea_chunk_t *chunk;
   for (chunk = area->first; chunk; chunk = chunk->next_chunk) {
+    CHECK_SENTINEL(chunk);
     a += CHUNK_HEADER_SIZE + chunk->mem_size;
     tor_assert(chunk->next_mem >= chunk->u.mem);
     u += CHUNK_HEADER_SIZE + (chunk->next_mem - chunk->u.mem);
@@ -271,8 +304,10 @@
   tor_assert(area->first);
 
   for (chunk = area->first; chunk; chunk = chunk->next_chunk) {
+    CHECK_SENTINEL(chunk);
     tor_assert(chunk->next_mem >= chunk->u.mem);
-    tor_assert(chunk->next_mem <= chunk->u.mem+chunk->mem_size+MEMAREA_ALIGN);
+    tor_assert(chunk->next_mem <=
+          (char*) realign_pointer(chunk->u.mem+chunk->mem_size));
   }
 }
 

Modified: tor/trunk/src/common/memarea.h
===================================================================
--- tor/trunk/src/common/memarea.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/memarea.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2008, The Tor Project, Inc. */
+/* Copyright (c) 2008-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 /* Tor dependencies */
 

Modified: tor/trunk/src/common/mempool.c
===================================================================
--- tor/trunk/src/common/mempool.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/mempool.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, The Tor Project, Inc. */
+/* Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 #if 1
 /* Tor dependencies */
@@ -54,7 +54,7 @@
  *   - One pointer overhead per allocated thing.  (The alternative is
  *     something like glib's use of an RB-tree to keep track of what
  *     chunk any given piece of memory is in.)
- *   - Only aligns allocated things to void* level: redefign ALIGNMENT_TYPE
+ *   - Only aligns allocated things to void* level: redefine ALIGNMENT_TYPE
  *     if you need doubles.
  *   - Could probably be optimized a bit; the representation contains
  *     a bit more info than it really needs to have.

Modified: tor/trunk/src/common/mempool.h
===================================================================
--- tor/trunk/src/common/mempool.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/mempool.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, The Tor Project, Inc. */
+/* Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/common/test.h
===================================================================
--- tor/trunk/src/common/test.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/test.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2003, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #ifndef _TOR_TEST_H

Modified: tor/trunk/src/common/torgzip.c
===================================================================
--- tor/trunk/src/common/torgzip.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/torgzip.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -365,7 +365,7 @@
  return NULL;
 }
 
-/** Compress/decommpress some bytes using <b>state</b>.  Read up to
+/** Compress/decompress some bytes using <b>state</b>.  Read up to
  * *<b>in_len</b> bytes from *<b>in</b>, and write up to *<b>out_len</b> bytes
  * to *<b>out</b>, adjusting the values as we go.  If <b>finish</b> is true,
  * we've reached the end of the input.

Modified: tor/trunk/src/common/torgzip.h
===================================================================
--- tor/trunk/src/common/torgzip.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/torgzip.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/common/torint.h
===================================================================
--- tor/trunk/src/common/torint.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/torint.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/common/tortls.c
===================================================================
--- tor/trunk/src/common/tortls.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/tortls.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -26,7 +26,7 @@
 #include <openssl/opensslv.h>
 
 #if OPENSSL_VERSION_NUMBER < 0x00907000l
-#error "We require openssl >= 0.9.7"
+#error "We require OpenSSL >= 0.9.7"
 #endif
 
 #define CRYPTO_PRIVATE /* to import prototypes from crypto.h */
@@ -70,7 +70,7 @@
   tor_tls_context_t *context; /** A link to the context object for this tls. */
   SSL *ssl; /**< An OpenSSL SSL object. */
   int socket; /**< The underlying file descriptor for this TLS connection. */
-  char *address; /**< An address to log when describing this connectinon. */
+  char *address; /**< An address to log when describing this connection. */
   enum {
     TOR_TLS_ST_HANDSHAKE, TOR_TLS_ST_OPEN, TOR_TLS_ST_GOTCLOSE,
     TOR_TLS_ST_SENTCLOSE, TOR_TLS_ST_CLOSED, TOR_TLS_ST_RENEGOTIATE,
@@ -308,7 +308,6 @@
   if (!tls_library_is_initialized) {
     SSL_library_init();
     SSL_load_error_strings();
-    crypto_global_init(-1);
     tls_library_is_initialized = 1;
   }
 }
@@ -454,7 +453,7 @@
 #define CIPHER(id, name) name ":"
 #define XCIPHER(id, name)
 /** List of ciphers that clients should advertise, omitting items that
- * our openssl doesn't know about. */
+ * our OpenSSL doesn't know about. */
 static const char CLIENT_CIPHER_LIST[] =
 #include "./ciphers.inc"
   ;
@@ -464,7 +463,7 @@
 /** Holds a cipher that we want to advertise, and its 2-byte ID. */
 typedef struct cipher_info_t { unsigned id; const char *name; } cipher_info_t;
 /** A list of all the ciphers that clients should advertise, including items
- * that openssl might not know about. */
+ * that OpenSSL might not know about. */
 static const cipher_info_t CLIENT_CIPHER_INFO_LIST[] = {
 #define CIPHER(id, name) { id, name },
 #define XCIPHER(id, name) { id, #name },
@@ -879,7 +878,7 @@
 
 /** Set <b>cb</b> to be called with argument <b>arg</b> whenever <b>tls</b>
  * next gets a client-side renegotiate in the middle of a read.  Do not
- * invoke this function untile <em>after</em> initial handshaking is done!
+ * invoke this function until <em>after</em> initial handshaking is done!
  */
 void
 tor_tls_set_renegotiate_callback(tor_tls_t *tls,

Modified: tor/trunk/src/common/tortls.h
===================================================================
--- tor/trunk/src/common/tortls.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/tortls.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #ifndef _TOR_TORTLS_H

Modified: tor/trunk/src/common/util.c
===================================================================
--- tor/trunk/src/common/util.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/util.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -258,7 +258,9 @@
 #ifdef HAVE_MALLOC_GOOD_SIZE
   *sizep = malloc_good_size(*sizep);
   return _tor_malloc(*sizep DMALLOC_FN_ARGS);
-#elif defined(HAVE_MALLOC_USABLE_SIZE) && !defined(USE_DMALLOC)
+#elif 0 && defined(HAVE_MALLOC_USABLE_SIZE) && !defined(USE_DMALLOC)
+  /* Never use malloc_usable_size(); it makes valgrind really unhappy,
+   * and doesn't win much in terms of usable space where it exists. */
   void *result = _tor_malloc(*sizep DMALLOC_FN_ARGS);
   *sizep = malloc_usable_size(result);
   return result;
@@ -343,6 +345,36 @@
     return low;
 }
 
+/** Return the lowest x such that x is at least <b>number</b>, and x modulo
+ * <b>divisor</b> == 0. */
+unsigned
+round_to_next_multiple_of(unsigned number, unsigned divisor)
+{
+  number += divisor - 1;
+  number -= number % divisor;
+  return number;
+}
+
+/** Return the lowest x such that x is at least <b>number</b>, and x modulo
+ * <b>divisor</b> == 0. */
+uint32_t
+round_uint32_to_next_multiple_of(uint32_t number, uint32_t divisor)
+{
+  number += divisor - 1;
+  number -= number % divisor;
+  return number;
+}
+
+/** Return the lowest x such that x is at least <b>number</b>, and x modulo
+ * <b>divisor</b> == 0. */
+uint64_t
+round_uint64_to_next_multiple_of(uint64_t number, uint64_t divisor)
+{
+  number += divisor - 1;
+  number -= number % divisor;
+  return number;
+}
+
 /* =====
  * String manipulation
  * ===== */
@@ -1000,7 +1032,8 @@
   long secdiff = end->tv_sec - start->tv_sec;
 
   if (labs(secdiff+1) > LONG_MAX/1000000) {
-    log_warn(LD_GENERAL, "comparing times too far apart.");
+    log_warn(LD_GENERAL, "comparing times on microsecond detail too far "
+             "apart: %ld seconds", secdiff);
     return LONG_MAX;
   }
 
@@ -1008,6 +1041,24 @@
   return udiff;
 }
 
+/** Return the number of milliseconds elapsed between *start and *end.
+ */
+long
+tv_mdiff(const struct timeval *start, const struct timeval *end)
+{
+  long mdiff;
+  long secdiff = end->tv_sec - start->tv_sec;
+
+  if (labs(secdiff+1) > LONG_MAX/1000) {
+    log_warn(LD_GENERAL, "comparing times on millisecond detail too far "
+             "apart: %ld seconds", secdiff);
+    return LONG_MAX;
+  }
+
+  mdiff = secdiff*1000L + (end->tv_usec - start->tv_usec) / 1000L;
+  return mdiff;
+}
+
 /** Yield true iff <b>y</b> is a leap-year. */
 #define IS_LEAPYEAR(y) (!(y % 4) && ((y % 100) || !(y % 400)))
 /** Helper: Return the number of leap-days between Jan 1, y1 and Jan 1, y2. */
@@ -1086,7 +1137,7 @@
 /** Parse the the RFC1123 encoding of some time (in GMT) from <b>buf</b>,
  * and store the result in *<b>t</b>.
  *
- * Return 0 on succcess, -1 on failure.
+ * Return 0 on success, -1 on failure.
 */
 int
 parse_rfc1123_time(const char *buf, time_t *t)
@@ -1317,7 +1368,7 @@
  * ===== */
 
 #ifndef TIME_IS_FAST
-/** Cached estimate of the currrent time.  Updated around once per second;
+/** Cached estimate of the current time.  Updated around once per second;
  * may be a few seconds off if we are really busy.  This is a hack to avoid
  * calling time(NULL) (which not everybody has optimized) on critical paths.
  */
@@ -1348,7 +1399,7 @@
  * XXXX022 Use this consistently or rip most of it out.
  * ===== */
 
-/* In a perfect world, everybody would run ntp, and ntp would be perfect, so
+/* In a perfect world, everybody would run NTP, and NTP would be perfect, so
  * if we wanted to know "Is the current time before time X?" we could just say
  * "time(NULL) < X".
  *
@@ -2478,6 +2529,8 @@
     if (fork() != 0) {
       exit(0);
     }
+    set_main_thread(); /* We are now the main thread. */
+
     return;
   }
 }

Modified: tor/trunk/src/common/util.h
===================================================================
--- tor/trunk/src/common/util.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/common/util.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -29,7 +29,7 @@
  */
 #ifdef NDEBUG
 /* Nobody should ever want to build with NDEBUG set.  99% of our asserts will
- * be outside the critical path anyway, so it's silly to disable bugchecking
+ * be outside the critical path anyway, so it's silly to disable bug-checking
  * throughout the entire program just because a few asserts are slowing you
  * down.  Profile, optimize the critical path, and keep debugging on.
  *
@@ -154,6 +154,9 @@
 /* Math functions */
 int tor_log2(uint64_t u64) ATTR_CONST;
 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);
 
 /* String manipulation */
 
@@ -208,6 +211,7 @@
 
 /* Time helpers */
 long tv_udiff(const struct timeval *start, const struct timeval *end);
+long tv_mdiff(const struct timeval *start, const struct timeval *end);
 time_t tor_timegm(struct tm *tm);
 #define RFC1123_TIME_LEN 29
 void format_rfc1123_time(char *buf, time_t t);
@@ -294,5 +298,7 @@
 void finish_daemon(const char *desired_cwd);
 void write_pidfile(char *filename);
 
+const char *libor_get_digests(void);
+
 #endif
 

Added: tor/trunk/src/common/util_codedigest.c
===================================================================
--- tor/trunk/src/common/util_codedigest.c	                        (rev 0)
+++ tor/trunk/src/common/util_codedigest.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,11 @@
+
+#include "util.h"
+
+const char *
+libor_get_digests(void)
+{
+  return ""
+#include "common_sha1.i"
+    ;
+}
+


Property changes on: tor/trunk/src/common/util_codedigest.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Modified: tor/trunk/src/config/geoip
===================================================================
--- tor/trunk/src/config/geoip	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/config/geoip	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
-# Last updated based on April 3 2009 ip-to-country db.
+# Last updated based on June 3 2009 ip-to-country db.
 # wget http://ip-to-country.webhosting.info/downloads/ip-to-country.csv.zip
-# cut -d, -f0-3 < ip-to-country.csv|sed 's/"//g' > geoip
+# cut -d, -f1-3 < ip-to-country.csv|sed 's/"//g' > geoip
 33996344,33996351,GB
 50331648,69956103,US
 69956104,69956111,BM
@@ -10,7 +10,11 @@
 94585424,94585439,SE
 100663296,121195295,US
 121195296,121195327,IT
-121195328,152305663,US
+121195328,134693119,US
+134693120,134693375,CA
+134693376,134730239,US
+134730240,134730495,CA
+134730496,152305663,US
 152305664,152338431,GB
 152338432,167772159,US
 184549376,201859071,US
@@ -51,8 +55,8 @@
 204047256,204047263,PR
 204047264,204047295,US
 204047296,204047303,VI
-204047304,204047327,US
-204047328,204047335,VI
+204047304,204047311,US
+204047312,204047335,VI
 204047336,204047431,US
 204047432,204047455,VI
 204047456,204047463,US
@@ -69,7 +73,8 @@
 204048000,204048007,VI
 204048008,204048015,US
 204048016,204048031,VI
-204048032,204048063,PR
+204048032,204048047,PR
+204048048,204048063,US
 204048064,204048127,VI
 204048128,204152831,US
 204152832,204153855,PR
@@ -93,8 +98,8 @@
 211597504,211597719,US
 211597720,211597727,VI
 211597728,211597743,PR
-211597744,211597751,US
-211597752,211597775,PR
+211597744,211597759,US
+211597760,211597775,PR
 211597776,211597791,VI
 211597792,211598399,US
 211598400,211598463,VI
@@ -175,8 +180,8 @@
 214698096,214698103,US
 214698104,214698135,VI
 214698136,214698143,PR
-214698144,214698151,VI
-214698152,214858655,US
+214698144,214698311,VI
+214698312,214858655,US
 214858656,214858671,NL
 214858672,216417663,US
 216417664,216417727,PR
@@ -219,22 +224,28 @@
 404692992,404979711,US
 405012480,405143551,CA
 405180416,405184511,CA
-405184512,405188607,US
-405192704,405295103,US
+405184512,405295103,US
 405299200,405331967,US
 405340160,405364735,US
 405405696,405422079,PR
 405422080,405798911,US
+405831680,405835775,US
 405839872,405843967,US
-405889024,405893119,US
-405905408,405909503,US
+405880832,405897215,US
+405901312,405909503,US
 405921792,405929983,CA
+405929984,405938175,US
+405962752,405966847,US
+406003712,406011903,US
 406044672,406052863,US
+406061056,406077439,US
 406093824,406102015,US
 406142976,406147071,US
 406159360,406175743,US
 406183936,406188031,CA
+406216704,406241279,US
 406241280,406257663,PR
+406274048,406282239,PR
 406298624,406306815,PR
 406323200,406388735,US
 406388736,406454271,CA
@@ -279,25 +290,24 @@
 411893760,411959295,CA
 411983872,411992063,US
 412024832,412069887,US
-412082176,412221439,US
+412073984,412221439,US
 412221440,412229631,CA
 412286976,412483583,US
 412483584,412549119,CA
 412549120,412614655,US
-412614656,412647423,CL
 412647424,412680191,US
 412680192,412688383,CA
 412696576,412704767,US
 412708864,412909567,US
 412909568,412917759,CA
 412942336,412946431,US
-413007872,413900799,US
+413007872,413908991,US
 413908992,413925375,PR
 413925376,415760383,US
 415760384,416022527,CA
 416022528,416059391,US
 416088064,416153599,US
-416169984,416219135,US
+416161792,416219135,US
 416219136,416251903,CA
 416251904,416546815,US
 416546816,416579583,CA
@@ -336,66 +346,66 @@
 418693120,418709503,CA
 418709504,418725887,US
 418729984,418766847,US
+418766848,418770943,CA
 418824192,418832383,US
 418840576,419430399,US
 419430400,436207615,GB
 436207616,452984831,US
 469762048,520093695,US
-536870912,540679167,US
-540679168,540679231,SE
-540679232,540680895,US
+536870912,540680895,GB
 540680896,540680959,BE
-540680960,540683775,US
+540680960,540683775,GB
 540683776,540683783,DE
-540683784,540685567,US
+540683784,540685567,GB
 540685568,540685631,FR
-540685632,540687231,US
+540685632,540687231,GB
 540687232,540687359,CA
-540687360,540694527,US
+540687360,540694527,GB
 540694528,540694591,IT
-540694592,540705023,US
+540694592,540705023,GB
 540705024,540705031,IE
-540705032,540705535,US
+540705032,540705535,GB
 540705536,540705599,IE
-540705600,540711935,US
+540705600,540711935,GB
 540711936,540712447,NL
-540712448,540737535,US
+540712448,540737535,GB
 540737536,540737791,BZ
 540737792,540737919,BR
 540737920,540750175,BZ
 540750176,540750191,MX
 540750192,540803071,BZ
-540803072,540819455,US
+540803072,540819455,GB
 540819456,540823551,CA
-540823552,540826671,US
+540823552,540826671,GB
 540826672,540826687,CA
-540826688,540827135,US
+540826688,540827135,GB
 540827136,540827263,CA
-540827264,540827295,US
+540827264,540827295,GB
 540827296,540827311,CA
-540827312,540827359,US
+540827312,540827359,GB
 540827360,540827375,CA
-540827376,540827391,US
+540827376,540827391,GB
 540827392,540827423,CA
-540827424,540827471,US
+540827424,540827471,GB
 540827472,540827487,CA
-540827488,540827519,US
+540827488,540827519,GB
 540827520,540827551,CA
-540827552,540827583,US
+540827552,540827583,GB
 540827584,540827647,CA
-540827648,540829695,US
+540827648,540829695,GB
 540829696,540829951,CA
-540829952,540830623,US
+540829952,540830623,GB
 540830624,540830735,CA
-540830736,540830815,US
+540830736,540830815,GB
 540830816,540830831,CA
-540830832,540830847,US
-540830848,540830879,CA
-540830880,543690751,US
+540830832,540830847,GB
+540830848,540830895,CA
+540830896,543690751,GB
 543690752,543691007,AR
-543691008,543844351,US
+543691008,543844351,GB
 543844352,543844607,CH
-543844608,603979775,US
+543844608,553648127,GB
+553648128,603979775,US
 637534208,654311423,US
 671088640,687865855,US
 721420288,738197503,JP
@@ -617,7 +627,7 @@
 1024131072,1024163839,IN
 1024163840,1024184319,JP
 1024184320,1024188415,MY
-1024188416,1024196607,TH
+1024188416,1024196607,AU
 1024196608,1024229375,IN
 1024229376,1024262143,JP
 1024262144,1024327679,SG
@@ -684,17 +694,25 @@
 1024352256,1024360447,AU
 1024360448,1024360535,HK
 1024360536,1024360543,AU
-1024360544,1024360623,HK
+1024360544,1024360607,HK
+1024360608,1024360615,AU
+1024360616,1024360623,HK
 1024360624,1024360631,AU
-1024360632,1024361007,HK
+1024360632,1024360735,HK
+1024360736,1024360751,AU
+1024360752,1024361007,HK
 1024361008,1024361039,AU
 1024361040,1024361095,HK
 1024361096,1024361103,AU
-1024361104,1024361183,HK
+1024361104,1024361135,HK
+1024361136,1024361151,AU
+1024361152,1024361183,HK
 1024361184,1024361215,AU
 1024361216,1024361311,HK
 1024361312,1024361327,AU
-1024361328,1024361471,HK
+1024361328,1024361439,HK
+1024361440,1024361455,AU
+1024361456,1024361471,HK
 1024361472,1024361487,TW
 1024361488,1024361503,AU
 1024361504,1024361567,PH
@@ -731,7 +749,9 @@
 1024363040,1024363071,AU
 1024363072,1024363103,SG
 1024363104,1024363111,AU
-1024363112,1024363199,SG
+1024363112,1024363119,SG
+1024363120,1024363135,AU
+1024363136,1024363199,SG
 1024363200,1024363215,MY
 1024363216,1024363295,SG
 1024363296,1024363319,MY
@@ -759,12 +779,13 @@
 1024371456,1024371711,JP
 1024371712,1024371967,AU
 1024371968,1024372223,JP
-1024372224,1024372479,PH
-1024372480,1024372735,HK
+1024372224,1024372319,HK
+1024372320,1024372351,AU
+1024372352,1024372735,HK
 1024372736,1024373247,AU
 1024373248,1024373503,PH
-1024373504,1024373759,AU
-1024373760,1024373887,TW
+1024373504,1024373823,AU
+1024373824,1024373887,TW
 1024373888,1024374079,PH
 1024374080,1024374111,TW
 1024374112,1024374271,PH
@@ -784,14 +805,15 @@
 1024375808,1024375999,TW
 1024376000,1024376095,PH
 1024376096,1024376111,TW
-1024376112,1024376159,PH
+1024376112,1024376127,PH
+1024376128,1024376159,AU
 1024376160,1024376191,TW
 1024376192,1024376199,PH
 1024376200,1024376207,AU
 1024376208,1024376223,PH
 1024376224,1024376255,AU
 1024376256,1024376463,TW
-1024376464,1024376471,PH
+1024376464,1024376471,AU
 1024376472,1024376479,TW
 1024376480,1024376511,PH
 1024376512,1024376703,TW
@@ -817,7 +839,9 @@
 1025296896,1025297407,SG
 1025297408,1025297919,AU
 1025297920,1025298175,NZ
-1025298176,1025302527,AU
+1025298176,1025298943,AU
+1025298944,1025299199,AE
+1025299200,1025302527,AU
 1025302528,1025310719,VN
 1025310720,1025343487,AU
 1025343488,1025376255,CN
@@ -890,9 +914,7 @@
 1040449792,1040450047,DE
 1040450048,1040457727,FR
 1040457728,1040465919,ME
-1040465920,1040466943,DE
-1040466944,1040466959,CA
-1040466960,1040467071,DE
+1040465920,1040467071,DE
 1040467072,1040467087,FR
 1040467088,1040467103,DE
 1040467104,1040467135,FR
@@ -961,13 +983,14 @@
 1040973824,1040982015,NL
 1040982016,1040982335,DK
 1040982336,1040982351,ZW
-1040982352,1040982399,DK
+1040982352,1040982359,GB
+1040982360,1040982399,DK
 1040982400,1040982407,CH
 1040982408,1040982487,DK
 1040982488,1040982495,IQ
 1040982496,1040982527,DK
 1040982528,1040982551,IQ
-1040982552,1040982559,DK
+1040982552,1040982559,FI
 1040982560,1040982615,IQ
 1040982616,1040982623,DK
 1040982624,1040982631,FI
@@ -976,7 +999,8 @@
 1040982648,1040982655,GB
 1040982656,1040982663,DE
 1040982664,1040982679,NL
-1040982680,1040982695,DK
+1040982680,1040982687,DK
+1040982688,1040982695,FI
 1040982696,1040982703,IR
 1040982704,1040982743,FI
 1040982744,1040982751,EG
@@ -1273,7 +1297,9 @@
 1041694720,1041694895,FR
 1041694896,1041694911,GB
 1041694912,1041694919,FR
-1041694920,1041694975,GB
+1041694920,1041694943,GB
+1041694944,1041694959,FR
+1041694960,1041694975,GB
 1041694976,1041695455,FR
 1041695456,1041695487,GB
 1041695488,1041695551,FR
@@ -1328,9 +1354,9 @@
 1041699616,1041699623,FR
 1041699624,1041699631,GB
 1041699632,1041699767,FR
-1041699768,1041699775,GB
-1041699776,1041700351,FR
-1041700352,1041700607,GB
+1041699768,1041699807,GB
+1041699808,1041700359,FR
+1041700360,1041700607,GB
 1041700608,1041700863,FR
 1041700864,1041700895,GB
 1041700896,1041700919,FR
@@ -1353,15 +1379,15 @@
 1041701640,1041701647,GB
 1041701648,1041701727,FR
 1041701728,1041701735,GB
-1041701736,1041701831,FR
+1041701736,1041701783,FR
+1041701784,1041701791,GB
+1041701792,1041701831,FR
 1041701832,1041701847,GB
 1041701848,1041701863,FR
 1041701864,1041701871,GB
 1041701872,1041701887,FR
 1041701888,1041701919,GB
-1041701920,1041701935,FR
-1041701936,1041701959,GB
-1041701960,1041701967,FR
+1041701920,1041701967,FR
 1041701968,1041701975,GB
 1041701976,1041702111,FR
 1041702112,1041702143,GB
@@ -1374,7 +1400,9 @@
 1041702336,1041702351,FR
 1041702352,1041702623,GB
 1041702624,1041702639,FR
-1041702640,1041703143,GB
+1041702640,1041702655,GB
+1041702656,1041702719,FR
+1041702720,1041703143,GB
 1041703144,1041703147,FR
 1041703148,1041703167,GB
 1041703168,1041703471,FR
@@ -1385,10 +1413,10 @@
 1041703552,1041703583,GB
 1041703584,1041703631,FR
 1041703632,1041703639,GB
-1041703640,1041703679,FR
-1041703680,1041703695,GB
-1041703696,1041703711,FR
-1041703712,1041703807,GB
+1041703640,1041703719,FR
+1041703720,1041703775,GB
+1041703776,1041703783,FR
+1041703784,1041703807,GB
 1041703808,1041703951,FR
 1041703952,1041703967,GB
 1041703968,1041703991,FR
@@ -1428,8 +1456,8 @@
 1041704864,1041704879,FR
 1041704880,1041704887,GB
 1041704888,1041704911,FR
-1041704912,1041704943,GB
-1041704944,1041705247,FR
+1041704912,1041704927,GB
+1041704928,1041705247,FR
 1041705248,1041705279,GB
 1041705280,1041705303,FR
 1041705304,1041705311,GB
@@ -1440,8 +1468,8 @@
 1041705440,1041705447,FR
 1041705448,1041705463,GB
 1041705464,1041705471,FR
-1041705472,1041705487,GB
-1041705488,1041705511,FR
+1041705472,1041705495,GB
+1041705496,1041705511,FR
 1041705512,1041705519,GB
 1041705520,1041705527,FR
 1041705528,1041705535,GB
@@ -1461,15 +1489,13 @@
 1041706088,1041706095,GB
 1041706096,1041706111,FR
 1041706112,1041706143,GB
-1041706144,1041706207,FR
-1041706208,1041706287,GB
+1041706144,1041706191,FR
+1041706192,1041706287,GB
 1041706288,1041706319,FR
 1041706320,1041706343,GB
 1041706344,1041706359,FR
 1041706360,1041706367,GB
-1041706368,1041706383,FR
-1041706384,1041706399,GB
-1041706400,1041706447,FR
+1041706368,1041706447,FR
 1041706448,1041706463,GB
 1041706464,1041706471,FR
 1041706472,1041706487,GB
@@ -1583,8 +1609,8 @@
 1041710048,1041710055,GB
 1041710056,1041710063,FR
 1041710064,1041710079,GB
-1041710080,1041710335,FR
-1041710336,1041710359,GB
+1041710080,1041710343,FR
+1041710344,1041710359,GB
 1041710360,1041710367,FR
 1041710368,1041710383,GB
 1041710384,1041710391,FR
@@ -1603,9 +1629,7 @@
 1041710560,1041710567,GB
 1041710568,1041710575,FR
 1041710576,1041710583,GB
-1041710584,1041710599,FR
-1041710600,1041710623,GB
-1041710624,1041710663,FR
+1041710584,1041710663,FR
 1041710664,1041710671,GB
 1041710672,1041710687,FR
 1041710688,1041710695,GB
@@ -1616,8 +1640,8 @@
 1041710728,1041710735,FR
 1041710736,1041710743,GB
 1041710744,1041710775,FR
-1041710776,1041710791,GB
-1041710792,1041710807,FR
+1041710776,1041710783,GB
+1041710784,1041710807,FR
 1041710808,1041710815,GB
 1041710816,1041711367,FR
 1041711368,1041711375,GB
@@ -1631,23 +1655,19 @@
 1041711536,1041711567,GB
 1041711568,1041711583,FR
 1041711584,1041711599,GB
-1041711600,1041711871,FR
-1041711872,1041711903,GB
+1041711600,1041711887,FR
+1041711888,1041711903,GB
 1041711904,1041711911,FR
 1041711912,1041711927,GB
 1041711928,1041711935,FR
 1041711936,1041711951,GB
 1041711952,1041711967,FR
 1041711968,1041711983,GB
-1041711984,1041712063,FR
-1041712064,1041712095,GB
-1041712096,1041712447,FR
+1041711984,1041712447,FR
 1041712448,1041712463,GB
-1041712464,1041712511,FR
-1041712512,1041712527,GB
-1041712528,1041712623,FR
-1041712624,1041712631,GB
-1041712632,1041712927,FR
+1041712464,1041712911,FR
+1041712912,1041712919,GB
+1041712920,1041712927,FR
 1041712928,1041712943,GB
 1041712944,1041712991,FR
 1041712992,1041712999,GB
@@ -1659,7 +1679,9 @@
 1041713056,1041713063,GB
 1041713064,1041713079,FR
 1041713080,1041713087,GB
-1041713088,1041713143,FR
+1041713088,1041713119,FR
+1041713120,1041713135,GB
+1041713136,1041713143,FR
 1041713144,1041713151,GB
 1041713152,1041713663,FR
 1041713664,1041713695,GB
@@ -1682,16 +1704,16 @@
 1041714080,1041714095,FR
 1041714096,1041714103,GB
 1041714104,1041714431,FR
-1041714432,1041714455,GB
-1041714456,1041714487,FR
-1041714488,1041714495,GB
-1041714496,1041714519,FR
+1041714432,1041714439,GB
+1041714440,1041714447,FR
+1041714448,1041714455,GB
+1041714456,1041714519,FR
 1041714520,1041714527,GB
 1041714528,1041714543,FR
 1041714544,1041714551,GB
 1041714552,1041714559,FR
-1041714560,1041714591,GB
-1041714592,1041714623,FR
+1041714560,1041714575,GB
+1041714576,1041714623,FR
 1041714624,1041714687,GB
 1041714688,1041714711,FR
 1041714712,1041714727,GB
@@ -1739,8 +1761,8 @@
 1041716040,1041716063,GB
 1041716064,1041716111,FR
 1041716112,1041716223,GB
-1041716224,1041716239,FR
-1041716240,1041716287,GB
+1041716224,1041716255,FR
+1041716256,1041716287,GB
 1041716288,1041716303,FR
 1041716304,1041716319,GB
 1041716320,1041716335,FR
@@ -1769,7 +1791,9 @@
 1041717520,1041717527,GB
 1041717528,1041717559,FR
 1041717560,1041717567,GB
-1041717568,1041718023,FR
+1041717568,1041717687,FR
+1041717688,1041717695,GB
+1041717696,1041718023,FR
 1041718024,1041718031,GB
 1041718032,1041718055,FR
 1041718056,1041718063,GB
@@ -1811,7 +1835,9 @@
 1041718880,1041718911,GB
 1041718912,1041718935,FR
 1041718936,1041718943,GB
-1041718944,1041718999,FR
+1041718944,1041718975,FR
+1041718976,1041718991,GB
+1041718992,1041718999,FR
 1041719000,1041719007,GB
 1041719008,1041719203,FR
 1041719204,1041719207,GB
@@ -1827,16 +1853,18 @@
 1041719376,1041719407,GB
 1041719408,1041719439,FR
 1041719440,1041719487,GB
-1041719488,1041719551,FR
-1041719552,1041719631,GB
+1041719488,1041719559,FR
+1041719560,1041719567,GB
+1041719568,1041719583,FR
+1041719584,1041719631,GB
 1041719632,1041719647,FR
 1041719648,1041719663,GB
 1041719664,1041719679,FR
 1041719680,1041719711,GB
 1041719712,1041719743,FR
 1041719744,1041719759,GB
-1041719760,1041719775,FR
-1041719776,1041719855,GB
+1041719760,1041719807,FR
+1041719808,1041719855,GB
 1041719856,1041719879,FR
 1041719880,1041719903,GB
 1041719904,1041719919,FR
@@ -1870,7 +1898,9 @@
 1041720848,1041720895,FR
 1041720896,1041720927,GB
 1041720928,1041720959,FR
-1041720960,1041721087,GB
+1041720960,1041721007,GB
+1041721008,1041721023,FR
+1041721024,1041721087,GB
 1041721088,1041721343,FR
 1041721344,1041721375,GB
 1041721376,1041721391,FR
@@ -1884,19 +1914,17 @@
 1041721856,1041722119,FR
 1041722120,1041722127,GB
 1041722128,1041722135,FR
-1041722136,1041722175,GB
-1041722176,1041722183,FR
-1041722184,1041722191,GB
+1041722136,1041722191,GB
 1041722192,1041722223,FR
 1041722224,1041722279,GB
 1041722280,1041722287,FR
-1041722288,1041722367,GB
-1041722368,1041722375,FR
-1041722376,1041722383,GB
+1041722288,1041722383,GB
 1041722384,1041722391,FR
 1041722392,1041722399,GB
 1041722400,1041722415,FR
-1041722416,1041722511,GB
+1041722416,1041722431,GB
+1041722432,1041722463,FR
+1041722464,1041722511,GB
 1041722512,1041722535,FR
 1041722536,1041722551,GB
 1041722552,1041722567,FR
@@ -1924,21 +1952,21 @@
 1041723216,1041723295,FR
 1041723296,1041723391,GB
 1041723392,1041723711,FR
-1041723712,1041723727,GB
-1041723728,1041723743,FR
-1041723744,1041723903,GB
-1041723904,1041724591,FR
+1041723712,1041723903,GB
+1041723904,1041724463,FR
+1041724464,1041724479,GB
+1041724480,1041724511,FR
+1041724512,1041724527,GB
+1041724528,1041724591,FR
 1041724592,1041724607,GB
-1041724608,1041724623,FR
-1041724624,1041724631,GB
-1041724632,1041724671,FR
+1041724608,1041724671,FR
 1041724672,1041724927,GB
 1041724928,1041725007,FR
 1041725008,1041725023,GB
 1041725024,1041725031,FR
 1041725032,1041725039,GB
-1041725040,1041725159,FR
-1041725160,1041725167,GB
+1041725040,1041725135,FR
+1041725136,1041725167,GB
 1041725168,1041725183,FR
 1041725184,1041725231,GB
 1041725232,1041725255,FR
@@ -1947,7 +1975,9 @@
 1041725344,1041725407,GB
 1041725408,1041725703,FR
 1041725704,1041725711,GB
-1041725712,1041725815,FR
+1041725712,1041725799,FR
+1041725800,1041725807,GB
+1041725808,1041725815,FR
 1041725816,1041725823,GB
 1041725824,1041725983,FR
 1041725984,1041725999,GB
@@ -1967,11 +1997,15 @@
 1041726648,1041726655,GB
 1041726656,1041726671,FR
 1041726672,1041726687,GB
-1041726688,1041726847,FR
+1041726688,1041726735,FR
+1041726736,1041726751,GB
+1041726752,1041726847,FR
 1041726848,1041726855,GB
 1041726856,1041726879,FR
 1041726880,1041726903,GB
-1041726904,1041727487,FR
+1041726904,1041727239,FR
+1041727240,1041727247,GB
+1041727248,1041727487,FR
 1041727488,1041727999,GB
 1041728000,1041728063,FR
 1041728064,1041728095,GB
@@ -1992,8 +2026,8 @@
 1041729565,1041729566,FR
 1041729567,1041729567,GB
 1041729568,1041729615,FR
-1041729616,1041729623,GB
-1041729624,1041729663,FR
+1041729616,1041729631,GB
+1041729632,1041729663,FR
 1041729664,1041729839,GB
 1041729840,1041729871,FR
 1041729872,1041729887,GB
@@ -2007,7 +2041,9 @@
 1041730176,1041730183,GB
 1041730184,1041730239,FR
 1041730240,1041730247,GB
-1041730248,1041731903,FR
+1041730248,1041730639,FR
+1041730640,1041730655,GB
+1041730656,1041731903,FR
 1041731904,1041731935,GB
 1041731936,1041731967,FR
 1041731968,1041732031,GB
@@ -2048,8 +2084,8 @@
 1041735504,1041735511,FR
 1041735512,1041735559,GB
 1041735560,1041735567,FR
-1041735568,1041735575,GB
-1041735576,1041735615,FR
+1041735568,1041735583,GB
+1041735584,1041735615,FR
 1041735616,1041735679,GB
 1041735680,1041736191,FR
 1041736192,1041736199,GB
@@ -2187,8 +2223,8 @@
 1041741632,1041741647,GB
 1041741648,1041741663,FR
 1041741664,1041741679,GB
-1041741680,1041741695,FR
-1041741696,1041741823,GB
+1041741680,1041741687,FR
+1041741688,1041741823,GB
 1041741824,1041742095,FR
 1041742096,1041742111,GB
 1041742112,1041742127,FR
@@ -2227,15 +2263,21 @@
 1041743744,1041743759,GB
 1041743760,1041743767,FR
 1041743768,1041743775,GB
-1041743776,1041743807,FR
+1041743776,1041743791,FR
+1041743792,1041743799,GB
+1041743800,1041743807,FR
 1041743808,1041743823,GB
 1041743824,1041743831,FR
 1041743832,1041743855,GB
 1041743856,1041743863,FR
 1041743864,1041743871,GB
-1041743872,1041744271,FR
-1041744272,1041744287,GB
-1041744288,1041744311,FR
+1041743872,1041744143,FR
+1041744144,1041744151,GB
+1041744152,1041744255,FR
+1041744256,1041744263,GB
+1041744264,1041744271,FR
+1041744272,1041744295,GB
+1041744296,1041744311,FR
 1041744312,1041744327,GB
 1041744328,1041744479,FR
 1041744480,1041744511,GB
@@ -2249,13 +2291,13 @@
 1041744944,1041744951,GB
 1041744952,1041744975,FR
 1041744976,1041744983,GB
-1041744984,1041744991,FR
-1041744992,1041745031,GB
+1041744984,1041745007,FR
+1041745008,1041745031,GB
 1041745032,1041745055,FR
 1041745056,1041745071,GB
 1041745072,1041745095,FR
-1041745096,1041745135,GB
-1041745136,1041745151,FR
+1041745096,1041745143,GB
+1041745144,1041745151,FR
 1041745152,1041745159,GB
 1041745160,1041745167,FR
 1041745168,1041745191,GB
@@ -2291,10 +2333,12 @@
 1041745752,1041745767,GB
 1041745768,1041745823,FR
 1041745824,1041745871,GB
-1041745872,1041745903,FR
-1041745904,1041745959,GB
+1041745872,1041745887,FR
+1041745888,1041745959,GB
 1041745960,1041745967,FR
-1041745968,1041746015,GB
+1041745968,1041745983,GB
+1041745984,1041745999,FR
+1041746000,1041746015,GB
 1041746016,1041746023,FR
 1041746024,1041746047,GB
 1041746048,1041746063,FR
@@ -2322,7 +2366,11 @@
 1041747520,1041749503,FR
 1041749504,1041749507,GB
 1041749508,1041749511,FR
-1041749512,1041749691,GB
+1041749512,1041749555,GB
+1041749556,1041749559,FR
+1041749560,1041749639,GB
+1041749640,1041749643,FR
+1041749644,1041749691,GB
 1041749692,1041749695,FR
 1041749696,1041749715,GB
 1041749716,1041749719,FR
@@ -2335,27 +2383,17 @@
 1041750528,1041750543,GB
 1041750544,1041750559,FR
 1041750560,1041750591,GB
-1041750592,1041750791,FR
-1041750792,1041750807,GB
-1041750808,1041750839,FR
-1041750840,1041750847,GB
-1041750848,1041750863,FR
+1041750592,1041750799,FR
+1041750800,1041750807,GB
+1041750808,1041750863,FR
 1041750864,1041750871,GB
-1041750872,1041750895,FR
-1041750896,1041750919,GB
-1041750920,1041750943,FR
-1041750944,1041750967,GB
-1041750968,1041750983,FR
-1041750984,1041750991,GB
-1041750992,1041751023,FR
-1041751024,1041751039,GB
-1041751040,1041751311,FR
+1041750872,1041751311,FR
 1041751312,1041751327,GB
 1041751328,1041751343,FR
 1041751344,1041751359,GB
 1041751360,1041751439,FR
-1041751440,1041751447,GB
-1041751448,1041751623,FR
+1041751440,1041751455,GB
+1041751456,1041751623,FR
 1041751624,1041751631,GB
 1041751632,1041751639,FR
 1041751640,1041751647,GB
@@ -2371,8 +2409,8 @@
 1041754144,1041754151,GB
 1041754152,1041754239,FR
 1041754240,1041754247,GB
-1041754248,1041754399,FR
-1041754400,1041754423,GB
+1041754248,1041754415,FR
+1041754416,1041754423,GB
 1041754424,1041754479,FR
 1041754480,1041754495,GB
 1041754496,1041755231,FR
@@ -2385,11 +2423,11 @@
 1041755336,1041755343,GB
 1041755344,1041755391,FR
 1041755392,1041755399,GB
-1041755400,1041755463,FR
-1041755464,1041755471,GB
+1041755400,1041755455,FR
+1041755456,1041755471,GB
 1041755472,1041755631,FR
-1041755632,1041755639,GB
-1041755640,1041756463,FR
+1041755632,1041755647,GB
+1041755648,1041756463,FR
 1041756464,1041756471,GB
 1041756472,1041756599,FR
 1041756600,1041756607,GB
@@ -2413,7 +2451,9 @@
 1041757584,1041757591,GB
 1041757592,1041757663,FR
 1041757664,1041757671,GB
-1041757672,1041758207,FR
+1041757672,1041758031,FR
+1041758032,1041758039,GB
+1041758040,1041758207,FR
 1041758208,1041760255,GB
 1041760256,1041768447,DE
 1041768448,1041776639,GB
@@ -2525,7 +2565,9 @@
 1042890960,1042890991,GB
 1042890992,1042891775,NL
 1042891776,1042891839,GB
-1042891840,1042892287,NL
+1042891840,1042892015,NL
+1042892016,1042892031,DE
+1042892032,1042892287,NL
 1042892288,1042892319,SE
 1042892320,1042892383,PT
 1042892384,1042892447,IT
@@ -2815,11 +2857,9 @@
 1043996120,1043996143,BE
 1043996144,1043996151,NL
 1043996152,1043996159,BE
-1043996160,1043996687,NL
-1043996688,1043996703,BE
-1043996704,1043996775,NL
-1043996776,1043996783,BE
-1043996784,1043996815,NL
+1043996160,1043996695,NL
+1043996696,1043996703,BE
+1043996704,1043996815,NL
 1043996816,1043997183,BE
 1043997184,1043997375,NL
 1043997376,1043997463,BE
@@ -2875,9 +2915,7 @@
 1044000000,1044000031,BE
 1044000032,1044000063,NL
 1044000064,1044000095,BE
-1044000096,1044000103,NL
-1044000104,1044000111,BE
-1044000112,1044000119,NL
+1044000096,1044000119,NL
 1044000120,1044000127,BE
 1044000128,1044000767,NL
 1044000768,1044000831,BE
@@ -2966,20 +3004,16 @@
 1044003364,1044003371,NL
 1044003372,1044003379,BE
 1044003380,1044003383,NL
-1044003384,1044003407,BE
-1044003408,1044003411,NL
-1044003412,1044003423,BE
+1044003384,1044003423,BE
 1044003424,1044003427,NL
 1044003428,1044003459,BE
 1044003460,1044003463,NL
 1044003464,1044003467,BE
 1044003468,1044003471,NL
-1044003472,1044003475,BE
-1044003476,1044003479,NL
-1044003480,1044003483,BE
+1044003472,1044003483,BE
 1044003484,1044003487,NL
-1044003488,1044003507,BE
-1044003508,1044003527,NL
+1044003488,1044003511,BE
+1044003512,1044003527,NL
 1044003528,1044003539,BE
 1044003540,1044003543,NL
 1044003544,1044003551,BE
@@ -3006,9 +3040,7 @@
 1044003688,1044003691,NL
 1044003692,1044003695,BE
 1044003696,1044003699,NL
-1044003700,1044003707,BE
-1044003708,1044003711,NL
-1044003712,1044003723,BE
+1044003700,1044003723,BE
 1044003724,1044003751,NL
 1044003752,1044003755,BE
 1044003756,1044003775,NL
@@ -3035,8 +3067,8 @@
 1044003992,1044004007,BE
 1044004008,1044004079,NL
 1044004080,1044004095,BE
-1044004096,1044004319,NL
-1044004320,1044004351,BE
+1044004096,1044004303,NL
+1044004304,1044004351,BE
 1044004352,1044004879,NL
 1044004880,1044004903,BE
 1044004904,1044004911,NL
@@ -3101,9 +3133,9 @@
 1044011772,1044011775,BE
 1044011776,1044011971,NL
 1044011972,1044012031,BE
-1044012032,1044012047,NL
-1044012048,1044012063,BE
-1044012064,1044012087,NL
+1044012032,1044012039,NL
+1044012040,1044012047,BE
+1044012048,1044012087,NL
 1044012088,1044012095,BE
 1044012096,1044012103,NL
 1044012104,1044012111,BE
@@ -3233,8 +3265,8 @@
 1044027424,1044027431,BE
 1044027432,1044027447,NL
 1044027448,1044027455,BE
-1044027456,1044027487,NL
-1044027488,1044027527,BE
+1044027456,1044027479,NL
+1044027480,1044027527,BE
 1044027528,1044027543,NL
 1044027544,1044027575,BE
 1044027576,1044027583,NL
@@ -3265,8 +3297,8 @@
 1044029052,1044029055,BE
 1044029056,1044029059,NL
 1044029060,1044029067,BE
-1044029068,1044029079,NL
-1044029080,1044029311,BE
+1044029068,1044029075,NL
+1044029076,1044029311,BE
 1044029312,1044029441,NL
 1044029442,1044029442,BE
 1044029443,1044029445,NL
@@ -3304,9 +3336,7 @@
 1044029546,1044029546,NL
 1044029547,1044029548,BE
 1044029549,1044029549,NL
-1044029550,1044029550,BE
-1044029551,1044029551,NL
-1044029552,1044029552,BE
+1044029550,1044029552,BE
 1044029553,1044029553,NL
 1044029554,1044029554,BE
 1044029555,1044029556,NL
@@ -3375,7 +3405,9 @@
 1044029687,1044029687,BE
 1044029688,1044029693,NL
 1044029694,1044029694,BE
-1044029695,1044029719,NL
+1044029695,1044029703,NL
+1044029704,1044029711,BE
+1044029712,1044029719,NL
 1044029720,1044029727,BE
 1044029728,1044029743,NL
 1044029744,1044029767,BE
@@ -3383,13 +3415,15 @@
 1044029776,1044029783,BE
 1044029784,1044029831,NL
 1044029832,1044029839,BE
-1044029840,1044029895,NL
+1044029840,1044029871,NL
+1044029872,1044029879,BE
+1044029880,1044029895,NL
 1044029896,1044029903,BE
 1044029904,1044029951,NL
 1044029952,1044029959,BE
 1044029960,1044029967,NL
-1044029968,1044029975,BE
-1044029976,1044030015,NL
+1044029968,1044029983,BE
+1044029984,1044030015,NL
 1044030016,1044030023,BE
 1044030024,1044030047,NL
 1044030048,1044030055,BE
@@ -3428,8 +3462,8 @@
 1044030768,1044030815,NL
 1044030816,1044030823,BE
 1044030824,1044030831,NL
-1044030832,1044030839,BE
-1044030840,1044030879,NL
+1044030832,1044030847,BE
+1044030848,1044030879,NL
 1044030880,1044030887,BE
 1044030888,1044030911,NL
 1044030912,1044030919,BE
@@ -3558,14 +3592,14 @@
 1044031760,1044031799,NL
 1044031800,1044031807,BE
 1044031808,1044031815,NL
-1044031816,1044031839,BE
-1044031840,1044031847,NL
-1044031848,1044031863,BE
-1044031864,1044031879,NL
+1044031816,1044031871,BE
+1044031872,1044031879,NL
 1044031880,1044031887,BE
 1044031888,1044031927,NL
 1044031928,1044031935,BE
-1044031936,1044031983,NL
+1044031936,1044031967,NL
+1044031968,1044031975,BE
+1044031976,1044031983,NL
 1044031984,1044031991,BE
 1044031992,1044031999,NL
 1044032000,1044032015,BE
@@ -3623,9 +3657,9 @@
 1044032992,1044032999,BE
 1044033000,1044033039,NL
 1044033040,1044033047,BE
-1044033048,1044033055,NL
-1044033056,1044033063,BE
-1044033064,1044033135,NL
+1044033048,1044033111,NL
+1044033112,1044033119,BE
+1044033120,1044033135,NL
 1044033136,1044033151,BE
 1044033152,1044033207,NL
 1044033208,1044033215,BE
@@ -3661,7 +3695,9 @@
 1044033992,1044033999,BE
 1044034000,1044034015,NL
 1044034016,1044034023,BE
-1044034024,1044034095,NL
+1044034024,1044034031,NL
+1044034032,1044034039,BE
+1044034040,1044034095,NL
 1044034096,1044034119,BE
 1044034120,1044034127,NL
 1044034128,1044034135,BE
@@ -3699,29 +3735,39 @@
 1044035064,1044035071,BE
 1044035072,1044035143,NL
 1044035144,1044035151,BE
-1044035152,1044035295,NL
+1044035152,1044035191,NL
+1044035192,1044035199,BE
+1044035200,1044035295,NL
 1044035296,1044035311,BE
 1044035312,1044035327,NL
-1044035328,1044035335,BE
-1044035336,1044035343,NL
-1044035344,1044035351,BE
-1044035352,1044035455,NL
+1044035328,1044035351,BE
+1044035352,1044035415,NL
+1044035416,1044035423,BE
+1044035424,1044035455,NL
 1044035456,1044035471,BE
-1044035472,1044035511,NL
-1044035512,1044035519,BE
-1044035520,1044035583,NL
+1044035472,1044035479,NL
+1044035480,1044035487,BE
+1044035488,1044035495,NL
+1044035496,1044035503,BE
+1044035504,1044035511,NL
+1044035512,1044035527,BE
+1044035528,1044035583,NL
 1044035584,1044035591,BE
 1044035592,1044035607,NL
 1044035608,1044035615,BE
 1044035616,1044035655,NL
 1044035656,1044035663,BE
 1044035664,1044035711,NL
-1044035712,1044035719,BE
-1044035720,1044035791,NL
+1044035712,1044035727,BE
+1044035728,1044035791,NL
 1044035792,1044035807,BE
-1044035808,1044035855,NL
-1044035856,1044035863,BE
-1044035864,1044035943,NL
+1044035808,1044035847,NL
+1044035848,1044035871,BE
+1044035872,1044035887,NL
+1044035888,1044035895,BE
+1044035896,1044035911,NL
+1044035912,1044035919,BE
+1044035920,1044035943,NL
 1044035944,1044035967,BE
 1044035968,1044035999,NL
 1044036000,1044036007,BE
@@ -3731,7 +3777,9 @@
 1044036080,1044036087,BE
 1044036088,1044036095,NL
 1044036096,1044036103,BE
-1044036104,1044036127,NL
+1044036104,1044036111,NL
+1044036112,1044036119,BE
+1044036120,1044036127,NL
 1044036128,1044036135,BE
 1044036136,1044036143,NL
 1044036144,1044036151,BE
@@ -3749,9 +3797,15 @@
 1044036472,1044036479,BE
 1044036480,1044036575,NL
 1044036576,1044036607,BE
-1044036608,1044036679,NL
-1044036680,1044036687,BE
-1044036688,1044036775,NL
+1044036608,1044036615,NL
+1044036616,1044036623,BE
+1044036624,1044036647,NL
+1044036648,1044036655,BE
+1044036656,1044036671,NL
+1044036672,1044036687,BE
+1044036688,1044036759,NL
+1044036760,1044036767,BE
+1044036768,1044036775,NL
 1044036776,1044036783,BE
 1044036784,1044036807,NL
 1044036808,1044036815,BE
@@ -3786,8 +3840,8 @@
 1044036986,1044036990,NL
 1044036991,1044036991,BE
 1044036992,1044037007,NL
-1044037008,1044037009,BE
-1044037010,1044037014,NL
+1044037008,1044037010,BE
+1044037011,1044037014,NL
 1044037015,1044037015,BE
 1044037016,1044037021,NL
 1044037022,1044037022,BE
@@ -3827,7 +3881,9 @@
 1044037160,1044037167,BE
 1044037168,1044037191,NL
 1044037192,1044037199,BE
-1044037200,1044037271,NL
+1044037200,1044037207,NL
+1044037208,1044037223,BE
+1044037224,1044037271,NL
 1044037272,1044037279,BE
 1044037280,1044037287,NL
 1044037288,1044037295,BE
@@ -3989,26 +4045,28 @@
 1044061760,1044061775,BE
 1044061776,1044061783,NL
 1044061784,1044061791,BE
-1044061792,1044061887,NL
+1044061792,1044061831,NL
+1044061832,1044061839,BE
+1044061840,1044061887,NL
 1044061888,1044061895,BE
 1044061896,1044061919,NL
-1044061920,1044061935,BE
-1044061936,1044062015,NL
+1044061920,1044061951,BE
+1044061952,1044062015,NL
 1044062016,1044062031,BE
 1044062032,1044062039,NL
 1044062040,1044062047,BE
 1044062048,1044062079,NL
 1044062080,1044062087,BE
 1044062088,1044062103,NL
-1044062104,1044062111,BE
-1044062112,1044062175,NL
+1044062104,1044062119,BE
+1044062120,1044062175,NL
 1044062176,1044062199,BE
 1044062200,1044062223,NL
 1044062224,1044062239,BE
 1044062240,1044062375,NL
 1044062376,1044062383,BE
-1044062384,1044062407,NL
-1044062408,1044062415,BE
+1044062384,1044062399,NL
+1044062400,1044062415,BE
 1044062416,1044062463,NL
 1044062464,1044062471,BE
 1044062472,1044062503,NL
@@ -4086,15 +4144,12 @@
 1044270080,1044271615,BE
 1044272128,1044272383,BE
 1044272896,1044273151,BE
-1044273408,1044273663,BE
-1044273920,1044274175,BE
 1044283392,1044316159,FR
 1044316160,1044332543,NO
 1044332544,1044348927,RU
 1044348928,1044365311,LV
 1044365312,1044381695,SE
-1044381696,1044384255,RU
-1044384256,1044384511,TJ
+1044381696,1044384511,RU
 1044384512,1044384767,KZ
 1044384768,1044389887,RU
 1044389888,1044398079,FR
@@ -4232,10 +4287,10 @@
 1044930808,1044930823,BE
 1044930824,1044930831,GB
 1044930832,1044930847,BE
-1044930848,1044930943,GB
-1044930944,1044930951,BE
-1044930952,1044930959,GB
-1044930960,1044930967,BE
+1044930848,1044930879,GB
+1044930880,1044930911,BE
+1044930912,1044930927,DE
+1044930928,1044930967,BE
 1044930968,1044930979,GB
 1044930980,1044931023,BE
 1044931024,1044931027,GB
@@ -4243,9 +4298,13 @@
 1044931104,1044931107,GB
 1044931108,1044931111,BE
 1044931112,1044931119,GB
-1044931120,1044931199,BE
-1044931200,1044931303,GB
-1044931304,1044931375,BE
+1044931120,1044931215,BE
+1044931216,1044931231,GB
+1044931232,1044931239,BE
+1044931240,1044931247,GB
+1044931248,1044931263,BE
+1044931264,1044931295,GB
+1044931296,1044931375,BE
 1044931376,1044931391,GB
 1044931392,1044931407,BE
 1044931408,1044931423,GB
@@ -4267,14 +4326,14 @@
 1044931976,1044931983,GB
 1044931984,1044932063,BE
 1044932064,1044932079,GB
-1044932080,1044932131,BE
-1044932132,1044932199,GB
-1044932200,1044932207,BE
-1044932208,1044932223,GB
-1044932224,1044932295,BE
-1044932296,1044932307,GB
-1044932308,1044932311,BE
-1044932312,1044932351,GB
+1044932080,1044932135,BE
+1044932136,1044932143,GB
+1044932144,1044932159,BE
+1044932160,1044932191,GB
+1044932192,1044932303,BE
+1044932304,1044932307,GB
+1044932308,1044932343,BE
+1044932344,1044932351,GB
 1044932352,1044932391,BE
 1044932392,1044932407,GB
 1044932408,1044932503,BE
@@ -4283,7 +4342,9 @@
 1044932676,1044932687,GB
 1044932688,1044932703,BE
 1044932704,1044932707,GB
-1044932708,1044932735,BE
+1044932708,1044932719,BE
+1044932720,1044932727,GB
+1044932728,1044932735,BE
 1044932736,1044932799,GB
 1044932800,1044932807,BE
 1044932808,1044932815,GB
@@ -4293,7 +4354,9 @@
 1044932856,1044932863,GB
 1044932864,1044932919,BE
 1044932920,1044932927,GB
-1044932928,1044932951,BE
+1044932928,1044932943,BE
+1044932944,1044932947,GB
+1044932948,1044932951,BE
 1044932952,1044932959,GB
 1044932960,1044933023,BE
 1044933024,1044933039,GB
@@ -4305,11 +4368,9 @@
 1044933304,1044933311,GB
 1044933312,1044933359,BE
 1044933360,1044933375,GB
-1044933376,1044933423,BE
-1044933424,1044933439,GB
-1044933440,1044933567,BE
-1044933568,1044933583,GB
-1044933584,1044933711,BE
+1044933376,1044933415,BE
+1044933416,1044933439,GB
+1044933440,1044933711,BE
 1044933712,1044933719,GB
 1044933720,1044933727,BE
 1044933728,1044933735,GB
@@ -4321,9 +4382,7 @@
 1044933844,1044933847,GB
 1044933848,1044933863,BE
 1044933864,1044933871,GB
-1044933872,1044933959,BE
-1044933960,1044933983,GB
-1044933984,1044934191,BE
+1044933872,1044934191,BE
 1044934192,1044934199,GB
 1044934200,1044934239,BE
 1044934240,1044934247,GB
@@ -4335,17 +4394,15 @@
 1044934400,1044934495,GB
 1044934496,1044934575,BE
 1044934576,1044934583,GB
-1044934584,1044934719,BE
+1044934584,1044934591,BE
+1044934592,1044934599,GB
+1044934600,1044934719,BE
 1044934720,1044934911,GB
 1044934912,1044934979,BE
-1044934980,1044934991,GB
-1044934992,1044935027,BE
+1044934980,1044934983,GB
+1044934984,1044935027,BE
 1044935028,1044935039,GB
-1044935040,1044935055,BE
-1044935056,1044935071,GB
-1044935072,1044935135,BE
-1044935136,1044935151,GB
-1044935152,1044935231,BE
+1044935040,1044935231,BE
 1044935232,1044935247,GB
 1044935248,1044935279,BE
 1044935280,1044935295,GB
@@ -4358,9 +4415,11 @@
 1044935432,1044935479,BE
 1044935480,1044935487,GB
 1044935488,1044935591,BE
-1044935592,1044935623,GB
-1044935624,1044935647,BE
-1044935648,1044935671,GB
+1044935592,1044935615,GB
+1044935616,1044935647,BE
+1044935648,1044935655,GB
+1044935656,1044935663,BE
+1044935664,1044935671,GB
 1044935672,1044935879,BE
 1044935880,1044935887,GB
 1044935888,1044935903,BE
@@ -4378,20 +4437,18 @@
 1044936312,1044936335,BE
 1044936336,1044936351,GB
 1044936352,1044936439,BE
-1044936440,1044936471,GB
-1044936472,1044936479,BE
-1044936480,1044936503,GB
+1044936440,1044936463,GB
+1044936464,1044936479,BE
+1044936480,1044936487,GB
+1044936488,1044936495,BE
+1044936496,1044936503,GB
 1044936504,1044936711,BE
 1044936712,1044936719,GB
 1044936720,1044936831,BE
 1044936832,1044936847,GB
-1044936848,1044936887,BE
-1044936888,1044936895,GB
-1044936896,1044936991,BE
-1044936992,1044937023,GB
-1044937024,1044937167,BE
-1044937168,1044937175,GB
-1044937176,1044937183,BE
+1044936848,1044937015,BE
+1044937016,1044937023,GB
+1044937024,1044937183,BE
 1044937184,1044937187,GB
 1044937188,1044937191,BE
 1044937192,1044937195,GB
@@ -4527,10 +4584,10 @@
 1045716992,1045725183,RU
 1045725184,1045733375,CZ
 1045733376,1045741567,GB
-1045741568,1045741839,SE
-1045741840,1045741855,GB
-1045741856,1045741887,SE
-1045741888,1045742039,GB
+1045741568,1045741887,SE
+1045741888,1045742015,GB
+1045742016,1045742023,SE
+1045742024,1045742039,GB
 1045742040,1045742047,SE
 1045742048,1045742063,GB
 1045742064,1045742127,SE
@@ -4556,8 +4613,8 @@
 1045742768,1045742783,SE
 1045742784,1045742831,GB
 1045742832,1045742839,SE
-1045742840,1045742975,GB
-1045742976,1045743023,SE
+1045742840,1045742847,GB
+1045742848,1045743023,SE
 1045743024,1045743031,GB
 1045743032,1045743039,SE
 1045743040,1045743063,GB
@@ -4574,11 +4631,12 @@
 1045743792,1045743803,SE
 1045743804,1045743807,GB
 1045743808,1045743999,SE
-1045744000,1045744063,GB
+1045744000,1045744007,LU
+1045744008,1045744063,GB
 1045744064,1045744383,SE
 1045744384,1045745407,GB
-1045745408,1045745599,SE
-1045745600,1045745623,GB
+1045745408,1045745607,SE
+1045745608,1045745623,GB
 1045745624,1045745639,SE
 1045745640,1045745647,GB
 1045745648,1045745655,SE
@@ -4663,8 +4721,8 @@
 1046316032,1046316543,FR
 1046316544,1046317055,DK
 1046317056,1046317567,ES
-1046317568,1046318079,SE
-1046318080,1046318335,NL
+1046317568,1046317823,GB
+1046317824,1046318335,NL
 1046318336,1046318591,GB
 1046318592,1046320127,NL
 1046320128,1046323199,GB
@@ -4703,7 +4761,9 @@
 1046479952,1046480475,DE
 1046480476,1046480479,GB
 1046480480,1046480703,DE
-1046480704,1046480895,GB
+1046480704,1046480735,GB
+1046480736,1046480767,DE
+1046480768,1046480895,GB
 1046480896,1046481175,DE
 1046481176,1046481183,GB
 1046481184,1046481327,DE
@@ -4714,13 +4774,13 @@
 1046481964,1046481967,GB
 1046481968,1046482207,DE
 1046482208,1046482239,GB
-1046482240,1046482335,DE
-1046482336,1046482943,GB
+1046482240,1046482367,DE
+1046482368,1046482943,GB
 1046482944,1046483231,DE
 1046483232,1046483471,GB
 1046483472,1046483871,DE
-1046483872,1046483983,GB
-1046483984,1046484351,DE
+1046483872,1046483967,GB
+1046483968,1046484351,DE
 1046484352,1046484479,GB
 1046484480,1046484511,DE
 1046484512,1046484607,GB
@@ -5203,9 +5263,15 @@
 1046514784,1046515199,DE
 1046515200,1046515711,GB
 1046515712,1046515967,DE
-1046515968,1046524159,GB
+1046515968,1046516991,GB
+1046516992,1046517031,DE
+1046517032,1046517039,GB
+1046517040,1046517087,DE
+1046517088,1046524159,GB
 1046524160,1046524191,DE
-1046524192,1046524287,GB
+1046524192,1046524207,GB
+1046524208,1046524215,DE
+1046524216,1046524287,GB
 1046524288,1046524355,DE
 1046524356,1046524415,GB
 1046524416,1046525183,DE
@@ -5226,8 +5292,8 @@
 1046527488,1046527743,GB
 1046527744,1046527999,DE
 1046528000,1046528255,GB
-1046528256,1046528295,DE
-1046528296,1046528319,GB
+1046528256,1046528287,DE
+1046528288,1046528319,GB
 1046528320,1046528335,DE
 1046528336,1046528351,GB
 1046528352,1046528383,DE
@@ -5241,9 +5307,7 @@
 1046528472,1046528479,DE
 1046528480,1046528487,GB
 1046528488,1046528495,DE
-1046528496,1046528499,GB
-1046528500,1046528503,DE
-1046528504,1046528519,GB
+1046528496,1046528519,GB
 1046528520,1046528527,DE
 1046528528,1046528543,GB
 1046528544,1046528559,DE
@@ -5258,11 +5322,7 @@
 1046528704,1046529279,GB
 1046529280,1046529535,DE
 1046529536,1046530047,GB
-1046530048,1046530559,DE
-1046530560,1046530591,GB
-1046530592,1046530639,DE
-1046530640,1046530655,GB
-1046530656,1046530687,DE
+1046530048,1046530687,DE
 1046530688,1046530815,GB
 1046530816,1046530879,DE
 1046530880,1046530943,GB
@@ -5275,16 +5335,16 @@
 1046531096,1046531103,DE
 1046531104,1046531111,GB
 1046531112,1046531127,DE
-1046531128,1046531167,GB
-1046531168,1046531183,DE
-1046531184,1046531839,GB
+1046531128,1046531839,GB
 1046531840,1046532095,DE
 1046532096,1046534015,GB
 1046534016,1046534047,DE
 1046534048,1046534143,GB
 1046534144,1046534655,DE
 1046534656,1046534911,GB
-1046534912,1046535311,DE
+1046534912,1046535167,DE
+1046535168,1046535295,GB
+1046535296,1046535311,DE
 1046535312,1046535359,GB
 1046535360,1046535423,DE
 1046535424,1046535487,GB
@@ -5313,25 +5373,21 @@
 1046536288,1046536295,DE
 1046536296,1046536319,GB
 1046536320,1046536351,DE
-1046536352,1046536391,GB
-1046536392,1046536399,DE
-1046536400,1046536423,GB
+1046536352,1046536423,GB
 1046536424,1046536439,DE
 1046536440,1046536607,GB
 1046536608,1046536667,DE
-1046536668,1046536671,GB
-1046536672,1046537023,DE
+1046536668,1046536703,GB
+1046536704,1046537023,DE
 1046537024,1046537055,GB
 1046537056,1046537071,DE
 1046537072,1046537087,GB
 1046537088,1046537151,DE
 1046537152,1046537215,GB
-1046537216,1046538239,DE
-1046538240,1046538255,GB
-1046538256,1046538303,DE
-1046538304,1046538431,GB
-1046538432,1046538455,DE
-1046538456,1046538463,GB
+1046537216,1046537983,DE
+1046537984,1046538431,GB
+1046538432,1046538447,DE
+1046538448,1046538463,GB
 1046538464,1046538495,DE
 1046538496,1046538751,GB
 1046538752,1046539519,DE
@@ -5344,12 +5400,12 @@
 1046541440,1046541503,GB
 1046541504,1046541567,DE
 1046541568,1046541631,GB
-1046541632,1046541711,DE
-1046541712,1046541727,GB
+1046541632,1046541695,DE
+1046541696,1046541727,GB
 1046541728,1046541759,DE
 1046541760,1046541767,GB
-1046541768,1046541787,DE
-1046541788,1046541807,GB
+1046541768,1046541783,DE
+1046541784,1046541807,GB
 1046541808,1046542591,DE
 1046542592,1046542847,GB
 1046542848,1046543103,DE
@@ -5478,7 +5534,7 @@
 1047306240,1047314431,PL
 1047314432,1047322623,SE
 1047322624,1047330815,IT
-1047330816,1047339007,LU
+1047330816,1047339007,RU
 1047339008,1047340431,SE
 1047340432,1047340439,NO
 1047340440,1047340799,SE
@@ -5557,7 +5613,9 @@
 1047567240,1047567243,CH
 1047567244,1047567247,DE
 1047567248,1047567255,CH
-1047567256,1047567315,DE
+1047567256,1047567279,DE
+1047567280,1047567287,CH
+1047567288,1047567315,DE
 1047567316,1047567319,AT
 1047567320,1047567359,DE
 1047567360,1047567375,ES
@@ -5569,7 +5627,9 @@
 1047567456,1047567459,CH
 1047567460,1047567463,DE
 1047567464,1047567467,CH
-1047567468,1047567551,DE
+1047567468,1047567495,DE
+1047567496,1047567499,CH
+1047567500,1047567551,DE
 1047567552,1047567555,CH
 1047567556,1047567647,DE
 1047567648,1047567651,CH
@@ -5597,7 +5657,9 @@
 1047568160,1047568163,CH
 1047568164,1047568167,DE
 1047568168,1047568171,ES
-1047568172,1047568235,DE
+1047568172,1047568215,DE
+1047568216,1047568219,CH
+1047568220,1047568235,DE
 1047568236,1047568239,CH
 1047568240,1047568247,DE
 1047568248,1047568251,CH
@@ -5609,10 +5671,14 @@
 1047601152,1047625727,RU
 1047625728,1047633919,NO
 1047633920,1047642111,FI
+1047642112,1047658495,DE
 1047728128,1047732223,SE
 1047740672,1047740927,GB
 1047782656,1047782687,GB
 1047782696,1047782703,GB
+1047782720,1047782751,SE
+1047782752,1047782783,NO
+1047782784,1047782815,FI
 1047789568,1047806031,AT
 1047806032,1047806047,IT
 1047806048,1047822335,AT
@@ -5652,19 +5718,29 @@
 1048215552,1048221695,RU
 1048221696,1048223743,UA
 1048223744,1048225791,DK
+1048225792,1048227839,CZ
+1048227840,1048233983,RU
+1048233984,1048236031,UA
+1048236032,1048240127,RU
+1048240128,1048242175,IL
+1048242176,1048244223,PL
+1048244224,1048246271,RU
+1048246272,1048248319,NO
 1048248320,1048313855,IT
 1048313856,1048510463,GB
 1048510464,1048575999,SE
-1048576000,1048584191,DE
+1048576000,1048580671,DE
+1048580672,1048580735,GB
+1048580736,1048584191,DE
 1048584192,1048592383,IL
 1048592384,1048600575,IT
 1048600576,1048603135,EE
 1048603136,1048603391,LV
 1048603392,1048604927,EE
-1048604928,1048604945,LT
-1048604946,1048604947,EE
-1048604948,1048604959,LT
-1048604960,1048608255,EE
+1048604928,1048604959,LT
+1048604960,1048604991,EE
+1048604992,1048605055,LT
+1048605056,1048608255,EE
 1048608256,1048608287,RU
 1048608288,1048608767,EE
 1048608768,1048611583,GB
@@ -5674,6 +5750,7 @@
 1048621056,1048625151,DE
 1048625152,1048633343,GB
 1048633344,1048641535,NO
+1048641536,1048649727,FR
 1048649728,1048657919,CZ
 1048657920,1048674303,GB
 1048674304,1048682495,NL
@@ -5690,9 +5767,7 @@
 1048840104,1048840463,NL
 1048840464,1048840471,DE
 1048840472,1048840703,NL
-1048840704,1048841343,DE
-1048841344,1048841359,CZ
-1048841360,1048843263,DE
+1048840704,1048843263,DE
 1048843264,1048843983,NL
 1048843984,1048843991,DE
 1048843992,1048844087,NL
@@ -5700,11 +5775,9 @@
 1048844096,1048844255,NL
 1048844256,1048844263,DE
 1048844264,1048844287,NL
-1048844288,1048844303,CH
-1048844304,1048844319,DE
+1048844288,1048844319,DE
 1048844320,1048844351,NL
-1048844352,1048844383,AT
-1048844384,1048845567,DE
+1048844352,1048845567,DE
 1048845568,1048845743,NL
 1048845744,1048845751,DE
 1048845752,1048845759,NL
@@ -6222,7 +6295,8 @@
 1048976297,1048976302,DE
 1048976304,1048976319,DE
 1048976384,1048976447,DE
-1048976512,1048978943,DE
+1048976512,1048977407,DE
+1048978432,1048978943,DE
 1048979136,1048979295,DE
 1048979328,1048980495,DE
 1048980512,1048980527,DE
@@ -6247,9 +6321,9 @@
 1049002624,1049002751,DE
 1049003264,1049004291,DE
 1049004352,1049004415,DE
-1049004544,1049006463,DE
+1049004544,1049006079,DE
 1049006504,1049006511,DE
-1049006592,1049007111,DE
+1049007104,1049007111,DE
 1049007120,1049007167,DE
 1049007360,1049011711,DE
 1049011968,1049012479,DE
@@ -6273,11 +6347,9 @@
 1049020472,1049020479,DE
 1049020480,1049020543,GE
 1049020544,1049026559,DE
-1049026816,1049031903,DE
-1049031936,1049032171,DE
+1049026816,1049032171,DE
 1049032176,1049032319,DE
-1049032384,1049032671,DE
-1049032688,1049032699,DE
+1049032384,1049032699,DE
 1049032704,1049034751,DE
 1049067520,1049100287,DK
 1049100288,1049231359,GB
@@ -6305,8 +6377,8 @@
 1049366528,1049368575,DE
 1049368576,1049369599,GB
 1049369600,1049369935,DE
-1049369936,1049369983,GB
-1049369984,1049370255,DE
+1049369936,1049370111,GB
+1049370112,1049370255,DE
 1049370256,1049370367,GB
 1049370368,1049370623,DE
 1049370624,1049378815,AT
@@ -6336,7 +6408,9 @@
 1049460736,1049468927,NO
 1049468928,1049477119,DE
 1049477120,1049493503,PL
-1049493504,1049518079,FI
+1049493504,1049514691,FI
+1049514692,1049514695,SE
+1049514696,1049518079,FI
 1049518080,1049518095,GB
 1049518096,1049547295,FI
 1049547296,1049547327,AF
@@ -6349,8 +6423,7 @@
 1049707008,1049707519,NL
 1049707520,1049707775,LB
 1049707776,1049708031,DZ
-1049708032,1049708543,IQ
-1049708544,1049709055,GB
+1049708032,1049709055,GB
 1049709056,1049710079,DZ
 1049710080,1049711103,NL
 1049711104,1049711359,IR
@@ -6628,8 +6701,8 @@
 1051100048,1051100055,NL
 1051100056,1051100079,BE
 1051100080,1051100095,NL
-1051100096,1051100135,BE
-1051100136,1051100159,NL
+1051100096,1051100143,BE
+1051100144,1051100159,NL
 1051100160,1051100455,BE
 1051100456,1051100463,NL
 1051100464,1051100487,BE
@@ -6665,27 +6738,31 @@
 1051101104,1051101127,BE
 1051101128,1051101151,NL
 1051101152,1051101183,BE
-1051101184,1051101239,NL
-1051101240,1051101247,BE
+1051101184,1051101191,NL
+1051101192,1051101199,BE
+1051101200,1051101231,NL
+1051101232,1051101247,BE
 1051101248,1051101279,NL
 1051101280,1051101287,BE
 1051101288,1051101407,NL
 1051101408,1051101415,BE
 1051101416,1051101431,NL
 1051101432,1051101439,BE
-1051101440,1051101599,NL
+1051101440,1051101463,NL
+1051101464,1051101471,BE
+1051101472,1051101599,NL
 1051101600,1051101607,BE
 1051101608,1051101615,NL
 1051101616,1051101623,BE
-1051101624,1051101639,NL
-1051101640,1051101647,BE
+1051101624,1051101631,NL
+1051101632,1051101647,BE
 1051101648,1051101679,NL
 1051101680,1051101687,BE
 1051101688,1051101719,NL
 1051101720,1051101735,BE
 1051101736,1051101783,NL
-1051101784,1051101791,BE
-1051101792,1051101999,NL
+1051101784,1051101799,BE
+1051101800,1051101999,NL
 1051102000,1051102007,BE
 1051102008,1051102143,NL
 1051102144,1051102159,BE
@@ -6697,11 +6774,15 @@
 1051103288,1051103295,BE
 1051103296,1051103439,NL
 1051103440,1051103447,BE
-1051103448,1051103543,NL
-1051103544,1051103551,BE
-1051103552,1051103559,NL
-1051103560,1051103567,BE
-1051103568,1051103639,NL
+1051103448,1051103511,NL
+1051103512,1051103519,BE
+1051103520,1051103543,NL
+1051103544,1051103567,BE
+1051103568,1051103583,NL
+1051103584,1051103591,BE
+1051103592,1051103599,NL
+1051103600,1051103607,BE
+1051103608,1051103639,NL
 1051103640,1051103647,BE
 1051103648,1051103695,NL
 1051103696,1051103703,BE
@@ -6711,8 +6792,8 @@
 1051103808,1051103815,BE
 1051103816,1051103919,NL
 1051103920,1051103927,BE
-1051103928,1051103967,NL
-1051103968,1051103975,BE
+1051103928,1051103959,NL
+1051103960,1051103975,BE
 1051103976,1051104023,NL
 1051104024,1051104031,BE
 1051104032,1051104111,NL
@@ -6725,11 +6806,15 @@
 1051104360,1051104367,BE
 1051104368,1051104383,NL
 1051104384,1051104391,BE
-1051104392,1051104583,NL
-1051104584,1051104591,BE
-1051104592,1051104615,NL
-1051104616,1051104631,BE
-1051104632,1051104751,NL
+1051104392,1051104503,NL
+1051104504,1051104511,BE
+1051104512,1051104583,NL
+1051104584,1051104599,BE
+1051104600,1051104607,NL
+1051104608,1051104631,BE
+1051104632,1051104719,NL
+1051104720,1051104727,BE
+1051104728,1051104751,NL
 1051104752,1051104759,BE
 1051104760,1051104823,NL
 1051104824,1051104831,BE
@@ -6741,8 +6826,8 @@
 1051104992,1051104999,BE
 1051105000,1051105047,NL
 1051105048,1051105055,BE
-1051105056,1051105071,NL
-1051105072,1051105079,BE
+1051105056,1051105063,NL
+1051105064,1051105079,BE
 1051105080,1051105111,NL
 1051105112,1051105119,BE
 1051105120,1051105127,NL
@@ -6819,7 +6904,9 @@
 1051107184,1051107199,BE
 1051107200,1051107207,NL
 1051107208,1051107215,BE
-1051107216,1051107239,NL
+1051107216,1051107223,NL
+1051107224,1051107231,BE
+1051107232,1051107239,NL
 1051107240,1051107247,BE
 1051107248,1051107295,NL
 1051107296,1051107303,BE
@@ -6961,7 +7048,7 @@
 1052002520,1052002523,DE
 1052002528,1052002543,DE
 1052003328,1052003359,DE
-1052003384,1052003455,DE
+1052003392,1052003455,DE
 1052003480,1052003487,DE
 1052003552,1052003839,DE
 1052003968,1052003999,DE
@@ -7011,7 +7098,7 @@
 1052014592,1052014623,DE
 1052015368,1052015375,DE
 1052015424,1052015519,DE
-1052015552,1052015615,DE
+1052015552,1052015583,DE
 1052015632,1052015647,DE
 1052015696,1052015727,DE
 1052016000,1052016127,DE
@@ -7813,7 +7900,9 @@
 1052504320,1052504351,BY
 1052504384,1052507583,GB
 1052507648,1052507775,GB
-1052507904,1052602495,GB
+1052507904,1052596447,GB
+1052596448,1052596463,IT
+1052596464,1052602495,GB
 1052602496,1052602623,ES
 1052602624,1052621951,GB
 1052621952,1052622015,IE
@@ -7907,14 +7996,11 @@
 1053295456,1053295471,AT
 1053295616,1053296639,AT
 1053296640,1053296927,IT
-1053296944,1053296959,IT
 1053296992,1053297023,IT
 1053297040,1053297055,IT
 1053297112,1053297151,IT
 1053298176,1053299199,CH
-1053299712,1053300103,GB
-1053300112,1053300119,GB
-1053300128,1053300143,GB
+1053299712,1053300119,GB
 1053300160,1053300735,GB
 1053300736,1053300991,CH
 1053300992,1053301023,FR
@@ -7952,8 +8038,8 @@
 1053312928,1053312959,DK
 1053313024,1053313279,GB
 1053313296,1053313343,GB
-1053313440,1053313567,GB
-1053313664,1053313695,GB
+1053313440,1053313599,GB
+1053313664,1053313679,GB
 1053313728,1053314047,GB
 1053314064,1053314079,CZ
 1053315072,1053316623,GB
@@ -7976,15 +8062,17 @@
 1053326432,1053326447,GB
 1053326448,1053326463,BE
 1053326528,1053326543,BE
+1053326560,1053326567,BE
 1053326576,1053326847,BE
 1053326848,1053327103,FI
 1053327104,1053327359,DK
 1053327872,1053328383,ZA
 1053328640,1053328799,ZA
 1053328896,1053329087,ZA
-1053329120,1053329279,ZA
+1053329120,1053329135,ZA
+1053329144,1053329151,ZA
+1053329184,1053329279,ZA
 1053329408,1053329439,ES
-1053329472,1053329487,ES
 1053329512,1053329535,ES
 1053329600,1053329639,ES
 1053330432,1053330687,ES
@@ -8006,7 +8094,7 @@
 1053337216,1053337279,ZA
 1053337600,1053337631,CH
 1053338112,1053338623,FI
-1053338624,1053338927,NO
+1053338624,1053338943,NO
 1053338976,1053338983,NO
 1053339136,1053339423,NO
 1053339456,1053339519,NO
@@ -8016,8 +8104,7 @@
 1053340160,1053340415,ZA
 1053340480,1053340495,NL
 1053340672,1053340711,GB
-1053340720,1053340823,GB
-1053340832,1053340871,GB
+1053340720,1053340871,GB
 1053340888,1053340895,GB
 1053340904,1053340919,GB
 1053340928,1053341183,GB
@@ -8029,7 +8116,8 @@
 1053348640,1053348655,PT
 1053349120,1053349631,NL
 1053349888,1053349951,IE
-1053350144,1053350383,IE
+1053350144,1053350359,IE
+1053350368,1053350383,IE
 1053350400,1053350479,BE
 1053350488,1053350495,BE
 1053350656,1053350911,BE
@@ -8079,6 +8167,7 @@
 1053821568,1053821695,GB
 1053824016,1053824023,DE
 1053824128,1053824255,NL
+1053825024,1053826047,ES
 1053826816,1053827327,DE
 1053827328,1053827583,BE
 1053829888,1053830143,DE
@@ -8144,9 +8233,9 @@
 1053882880,1053883391,GB
 1053883392,1053884415,DE
 1053884416,1053892607,BH
-1053892608,1053893631,DE
-1053893632,1053893647,GB
-1053893648,1053894495,DE
+1053892608,1053892619,DE
+1053892620,1053892623,GB
+1053892624,1053894495,DE
 1053894496,1053894527,GB
 1053894528,1053894719,DE
 1053894720,1053894735,FR
@@ -8262,7 +8351,7 @@
 1055199360,1055199375,CH
 1055199464,1055199487,CH
 1055200416,1055200423,PT
-1055201024,1055203327,US
+1055201024,1055201279,US
 1055203328,1055203359,CZ
 1055203840,1055204095,CZ
 1055204864,1055205375,CZ
@@ -8293,13 +8382,10 @@
 1055218432,1055218447,PT
 1055218464,1055218471,PT
 1055218480,1055219711,PT
-1055219968,1055219975,NL
 1055220224,1055220287,NL
 1055220352,1055220399,NL
-1055220736,1055221247,NL
 1055221504,1055221631,BE
-1055221760,1055222015,NL
-1055222528,1055223807,NL
+1055223040,1055223807,NL
 1055223904,1055223999,LU
 1055224064,1055224463,LU
 1055224576,1055224607,LU
@@ -8311,13 +8397,11 @@
 1055226368,1055226399,ES
 1055227640,1055227647,PT
 1055227904,1055228159,TR
-1055228416,1055229183,TR
+1055228928,1055229183,TR
 1055232000,1055232255,NL
-1055232512,1055233535,NL
-1055233792,1055234047,NL
+1055232512,1055233023,NL
 1055234064,1055234079,NL
 1055234080,1055234127,US
-1055234560,1055235071,NL
 1055241984,1055242239,GR
 1055252736,1055252991,ES
 1055253056,1055253087,ES
@@ -8325,9 +8409,7 @@
 1055260672,1055326207,SE
 1055326208,1055334399,RU
 1055334400,1055342591,IE
-1055342592,1055347455,RO
-1055347456,1055347711,HU
-1055347712,1055358975,RO
+1055342592,1055358975,RO
 1055358976,1055367167,GB
 1055367168,1055375359,RU
 1055375360,1055391743,OM
@@ -8513,9 +8595,7 @@
 1066627336,1066627343,CA
 1066627344,1066718559,US
 1066718560,1066718591,PR
-1066718592,1066828095,US
-1066828096,1066828127,HK
-1066828128,1066828151,US
+1066718592,1066828151,US
 1066828152,1066828159,CN
 1066828160,1066828255,US
 1066828256,1066828287,HK
@@ -8526,12 +8606,12 @@
 1066830240,1066830287,US
 1066830288,1066830303,SG
 1066830304,1066830311,US
-1066830312,1066830591,SG
+1066830312,1066830319,SG
+1066830320,1066830335,US
+1066830336,1066830591,SG
 1066830592,1066830799,US
 1066830800,1066830807,SG
-1066830808,1066830815,US
-1066830816,1066830847,SG
-1066830848,1066831039,US
+1066830808,1066831039,US
 1066831040,1066831071,JP
 1066831072,1066898783,US
 1066898784,1066898815,CO
@@ -8663,14 +8743,13 @@
 1072934880,1072934911,TW
 1072934912,1072934943,CA
 1072934944,1072934975,PH
-1072934976,1072935135,US
+1072934976,1072935039,CA
+1072935040,1072935135,US
 1072935136,1072935159,CA
 1072935160,1072935167,US
 1072935168,1072935679,CA
 1072935680,1072935807,PH
-1072935808,1072935871,CA
-1072935872,1072935935,US
-1072935936,1072936447,CA
+1072935808,1072936447,CA
 1072936448,1072936959,PH
 1072936960,1072937215,US
 1072937216,1072937471,IR
@@ -8711,7 +8790,7 @@
 1073049600,1073053695,BS
 1073053696,1073070079,US
 1073074176,1073143807,US
-1073147904,1073217535,US
+1073147904,1073233919,US
 1073283072,1073373183,US
 1073373184,1073381375,CA
 1073381376,1073381887,NL
@@ -8766,7 +8845,11 @@
 1074691136,1074691199,AR
 1074691200,1074696063,US
 1074696064,1074696095,AU
-1074696096,1074705791,US
+1074696096,1074701583,US
+1074701584,1074701591,CA
+1074701592,1074701599,US
+1074701600,1074701631,CA
+1074701632,1074705791,US
 1074705792,1074705799,IL
 1074705800,1074705887,US
 1074705888,1074705903,IL
@@ -8814,8 +8897,7 @@
 1075558912,1075576831,US
 1075576832,1075580927,GB
 1075580928,1075585023,NO
-1075585024,1075589119,US
-1075593216,1075593967,US
+1075585024,1075593967,US
 1075593968,1075593983,CA
 1075593984,1075594975,US
 1075594976,1075594991,CA
@@ -8902,7 +8984,9 @@
 1076026368,1076026879,CA
 1076026880,1076028159,US
 1076028160,1076028415,CA
-1076028416,1076029439,US
+1076028416,1076028927,US
+1076028928,1076029183,BZ
+1076029184,1076029439,US
 1076029440,1076029951,CA
 1076029952,1076030207,CN
 1076030208,1076030783,US
@@ -8919,15 +9003,21 @@
 1076282112,1076282143,AU
 1076282144,1076282351,US
 1076282352,1076282367,CA
-1076282368,1076284679,US
+1076282368,1076283903,US
+1076283904,1076284159,NO
+1076284160,1076284679,US
 1076284680,1076284687,HU
 1076284688,1076285439,US
 1076285440,1076285455,DK
-1076285456,1076292559,US
+1076285456,1076291903,US
+1076291904,1076291919,UA
+1076291920,1076292559,US
 1076292560,1076292567,NL
 1076292568,1076294655,US
 1076294656,1076294687,CY
-1076294688,1076295071,US
+1076294688,1076294703,US
+1076294704,1076294719,NO
+1076294720,1076295071,US
 1076295072,1076295087,NL
 1076295088,1076295167,US
 1076295168,1076295199,CY
@@ -9065,9 +9155,7 @@
 1078775808,1078777855,CO
 1078777856,1078780927,EC
 1078780928,1078935551,US
-1078947840,1078952831,US
-1078952832,1078952895,GB
-1078952896,1078956799,US
+1078947840,1078956799,US
 1078956800,1078957055,GB
 1078957056,1079320575,US
 1079320576,1079328767,CA
@@ -9076,14 +9164,16 @@
 1079329952,1079377919,US
 1079377920,1079378943,CA
 1079378944,1079379199,US
-1079379200,1079380927,CA
+1079379200,1079379455,CA
+1079379456,1079379711,US
+1079379712,1079380927,CA
 1079380928,1079381183,US
-1079381184,1079381503,CA
-1079381504,1079381599,US
+1079381184,1079381567,CA
+1079381568,1079381599,US
 1079381600,1079381631,WS
 1079381632,1079382015,US
-1079382016,1079382783,CA
-1079382784,1079383039,US
+1079382016,1079382527,CA
+1079382528,1079383039,US
 1079383040,1079383295,VG
 1079383296,1079383807,US
 1079383808,1079384063,MH
@@ -9091,17 +9181,19 @@
 1079384576,1079385087,ZW
 1079385088,1079385855,CA
 1079385856,1079386111,SZ
-1079386112,1079386623,US
+1079386112,1079386623,CA
 1079386624,1079386879,SG
 1079386880,1079387135,EG
-1079387136,1079387391,CA
+1079387136,1079387391,US
 1079387392,1079387647,NG
 1079387648,1079387903,US
 1079387904,1079388159,PH
 1079388160,1079389439,CA
 1079389440,1079389695,US
 1079389696,1079389951,LC
-1079389952,1079391231,CA
+1079389952,1079390719,CA
+1079390720,1079390975,US
+1079390976,1079391231,CA
 1079391232,1079391487,LC
 1079391488,1079393279,CA
 1079393280,1079393791,US
@@ -9114,8 +9206,7 @@
 1079394176,1079394191,US
 1079394192,1079394239,CA
 1079394240,1079394303,US
-1079394304,1079396095,CA
-1079396096,1079396351,US
+1079394304,1079396351,CA
 1079396352,1079397375,MP
 1079397376,1079397631,MH
 1079397632,1079397887,CA
@@ -9127,22 +9218,28 @@
 1079400448,1079400511,FR
 1079400512,1079400575,CA
 1079400576,1079400639,US
-1079400640,1079400703,CA
-1079400704,1079400831,US
-1079400832,1079401983,CA
-1079401984,1079402495,US
-1079402496,1079403007,CA
+1079400640,1079400767,CA
+1079400768,1079400799,US
+1079400800,1079401983,CA
+1079401984,1079402239,US
+1079402240,1079403007,CA
 1079403008,1079403519,US
 1079403520,1079403775,CA
-1079403776,1079403967,US
-1079403968,1079403999,CA
-1079404000,1079404799,US
+1079403776,1079403807,US
+1079403808,1079403903,CA
+1079403904,1079403935,US
+1079403936,1079403999,CA
+1079404000,1079404031,US
+1079404032,1079404543,CA
+1079404544,1079404799,US
 1079404800,1079405023,CA
-1079405024,1079405247,US
-1079405248,1079405407,CA
+1079405024,1079405119,US
+1079405120,1079405407,CA
 1079405408,1079405439,BD
 1079405440,1079405567,US
-1079405568,1079408383,CA
+1079405568,1079407615,CA
+1079407616,1079408127,US
+1079408128,1079408383,CA
 1079408384,1079408415,SA
 1079408416,1079408431,CA
 1079408432,1079408447,US
@@ -9152,22 +9249,13 @@
 1079409920,1079410175,US
 1079410176,1079411455,CA
 1079411456,1079411711,PK
-1079411712,1079412735,CA
-1079412736,1079413247,US
-1079413248,1079413311,CA
+1079411712,1079413311,CA
 1079413312,1079413343,US
-1079413344,1079414271,CA
-1079414272,1079414783,US
-1079414784,1079415807,CA
+1079413344,1079415807,CA
 1079415808,1079416319,US
 1079416320,1079422223,CA
 1079422224,1079422239,IN
-1079422240,1079422463,CA
-1079422464,1079423487,MZ
-1079423488,1079423999,CA
-1079424000,1079424767,MZ
-1079424768,1079425279,US
-1079425280,1079425535,CA
+1079422240,1079425535,CA
 1079425536,1079425551,ZA
 1079425552,1079433215,CA
 1079433216,1079435263,CR
@@ -9225,7 +9313,9 @@
 1081409792,1081410047,PR
 1081410048,1081410559,US
 1081410560,1081411583,PR
-1081411584,1081416191,US
+1081411584,1081413423,US
+1081413424,1081413439,PR
+1081413440,1081416191,US
 1081416192,1081416447,PR
 1081416448,1081419199,US
 1081419200,1081419231,PR
@@ -9246,7 +9336,9 @@
 1081573376,1081589759,US
 1081589760,1081593855,BB
 1081593856,1081597951,CA
-1081597952,1081606143,US
+1081597952,1081639423,US
+1081639424,1081639679,DE
+1081639680,1081655295,US
 1081671680,1082314751,US
 1082314752,1082315263,CA
 1082315264,1082315471,US
@@ -9280,7 +9372,7 @@
 1085603840,1085849599,US
 1085849600,1085857791,CA
 1085857792,1085927423,US
-1085939712,1085968383,US
+1085931520,1085968383,US
 1085972480,1085997055,US
 1085997056,1086013439,CA
 1086013440,1086022079,US
@@ -9302,14 +9394,15 @@
 1086029056,1086029663,US
 1086029664,1086029695,CA
 1086029696,1086070783,US
-1086095360,1086128127,US
-1086193664,1086358143,US
+1086095360,1086358143,US
 1086358144,1086358271,PA
 1086358272,1086359231,US
 1086359232,1086359295,IL
 1086359296,1086421503,US
 1086421504,1086422015,MP
-1086422016,1086922751,US
+1086422016,1086476543,US
+1086476544,1086476607,BM
+1086476608,1086922751,US
 1086922752,1086930943,CA
 1086930944,1086955519,US
 1086955520,1086971903,CA
@@ -9398,7 +9491,7 @@
 1089974272,1090129919,US
 1090142208,1090146303,US
 1090174976,1090207743,US
-1090207744,1090220031,CA
+1090207744,1090215935,CA
 1090220032,1090355199,US
 1090355200,1090363391,CA
 1090363392,1090387967,US
@@ -9479,9 +9572,7 @@
 1093126400,1093126431,VG
 1093126432,1093126911,US
 1093126912,1093127167,CA
-1093127168,1093128959,US
-1093128960,1093129215,CA
-1093129216,1093130751,US
+1093127168,1093130751,US
 1093130752,1093131007,CA
 1093131008,1093131231,US
 1093131232,1093131247,VG
@@ -9497,7 +9588,11 @@
 1093697536,1093699071,BB
 1093699072,1093700607,GD
 1093700608,1093701631,VC
-1093701632,1093730303,BB
+1093701632,1093708287,BB
+1093708288,1093709311,LC
+1093709312,1093719807,BB
+1093719808,1093720319,LC
+1093720320,1093730303,BB
 1093730304,1093730559,US
 1093730560,1093730815,HK
 1093730816,1093844991,US
@@ -9569,7 +9664,9 @@
 1098382144,1098382175,CA
 1098382176,1098891583,US
 1098891584,1098891607,AU
-1098891608,1098891695,US
+1098891608,1098891623,US
+1098891624,1098891631,AU
+1098891632,1098891695,US
 1098891696,1098891711,AU
 1098891712,1098891743,US
 1098891744,1098891775,AU
@@ -9683,8 +9780,7 @@
 1102449152,1102449407,SV
 1102449408,1102454527,CR
 1102454528,1102454783,HN
-1102454784,1102479359,US
-1102483456,1102512127,US
+1102454784,1102512127,US
 1102512128,1102516223,JM
 1102516224,1103244799,US
 1103244800,1103245055,EC
@@ -9734,12 +9830,10 @@
 1107275776,1107279871,CA
 1107279872,1107288063,US
 1107288064,1107296255,CA
-1107296256,1107697663,US
+1107296256,1107701759,US
 1107701760,1107705855,CA
 1107705856,1107730431,US
-1107734528,1107805695,US
-1107805696,1107805951,TR
-1107805952,1107820543,US
+1107734528,1107820543,US
 1107853312,1108025343,US
 1108029440,1108033535,US
 1108033536,1108041727,CA
@@ -9810,8 +9904,7 @@
 1109927168,1109927423,AU
 1109927424,1110126591,US
 1110126592,1110130687,CA
-1110130688,1110237183,US
-1110241280,1110310911,US
+1110130688,1110310911,US
 1110310912,1110376447,CA
 1110376448,1110445311,US
 1110445312,1110446591,CA
@@ -9897,8 +9990,7 @@
 1113923840,1113923903,BR
 1113923904,1113932815,US
 1113932816,1113932823,CA
-1113932824,1113989119,US
-1113993216,1113997311,US
+1113932824,1113997311,US
 1113997312,1114005503,CA
 1114005504,1114054655,US
 1114054656,1114062847,CA
@@ -9949,7 +10041,6 @@
 1115119616,1115135999,US
 1115136000,1115144191,CA
 1115144192,1115693055,US
-1115693056,1115697151,CO
 1115697152,1115705343,US
 1115705344,1115709439,CA
 1115709440,1115783167,US
@@ -10255,8 +10346,7 @@
 1118994432,1119109119,US
 1119109120,1119113215,CA
 1119113216,1119150079,US
-1119158272,1119199231,US
-1119207424,1119211519,US
+1119158272,1119211519,US
 1119211520,1119215615,CA
 1119215616,1119289343,US
 1119289344,1119354879,CA
@@ -10265,8 +10355,7 @@
 1119432704,1119436799,CA
 1119436800,1119440895,US
 1119440896,1119444991,CA
-1119444992,1119449087,US
-1119453184,1119469567,US
+1119444992,1119469567,US
 1119469568,1119477759,CA
 1119477760,1119502335,US
 1119502336,1119510527,CA
@@ -10274,8 +10363,7 @@
 1119567872,1119571967,CA
 1119571968,1119580159,US
 1119580160,1119584255,CA
-1119584256,1119592447,US
-1119596544,1120041983,US
+1119584256,1120041983,US
 1120041984,1120042495,AR
 1120042496,1120064511,US
 1120064512,1120064767,AR
@@ -10317,7 +10405,7 @@
 1120310016,1120310271,PH
 1120310272,1120312063,CA
 1120312064,1120312447,PH
-1120312448,1120312575,US
+1120312448,1120312575,CA
 1120312576,1120312831,PH
 1120312832,1120321535,CA
 1120321536,1120346111,US
@@ -10473,7 +10561,9 @@
 1122535424,1122538495,KR
 1122538496,1122635775,US
 1122635776,1122639871,CA
-1122639872,1123123199,US
+1122639872,1123057663,US
+1123057664,1123074047,CA
+1123074048,1123123199,US
 1123123200,1123127295,CA
 1123127296,1123180543,US
 1123180544,1123184639,CA
@@ -10487,7 +10577,9 @@
 1123534848,1123536895,AW
 1123536896,1123582239,US
 1123582240,1123582271,CY
-1123582272,1123583327,US
+1123582272,1123582431,US
+1123582432,1123582463,CA
+1123582464,1123583327,US
 1123583328,1123583359,CA
 1123583360,1123583455,US
 1123583456,1123583519,CY
@@ -10693,6 +10785,8 @@
 1125498880,1125515263,CA
 1125515264,1125531647,US
 1125531648,1125543935,CA
+1125543936,1125545983,US
+1125556224,1125560319,US
 1125564416,1125572607,US
 1125572608,1125576703,CA
 1125576704,1125593087,US
@@ -10761,12 +10855,13 @@
 1137491968,1137508351,CA
 1137508352,1137524735,US
 1137524736,1137541119,CA
-1137541120,1137598463,US
-1137606656,1137614847,US
-1137623040,1137631231,PR
+1137541120,1137623039,US
+1137623040,1137639423,PR
 1137639424,1137704959,US
 1137704960,1137713151,CA
-1137713152,1137843711,US
+1137713152,1137724063,US
+1137724064,1137724071,KR
+1137724072,1137843711,US
 1137843712,1137843775,NO
 1137843776,1137868799,US
 1137868800,1137872895,CA
@@ -10784,7 +10879,11 @@
 1137963008,1137967103,VI
 1137967104,1137975295,CA
 1137975296,1137983487,US
-1137983488,1137991679,CA
+1137983488,1137983823,CA
+1137983824,1137983831,US
+1137983832,1137983839,CA
+1137983840,1137983863,RU
+1137983864,1137991679,CA
 1137991680,1138049023,US
 1138049024,1138049919,CA
 1138049920,1138050047,US
@@ -10803,28 +10902,24 @@
 1138196480,1138204671,CA
 1138204672,1138212863,US
 1138212864,1138216959,CA
-1138216960,1138418175,US
+1138216960,1138417663,US
+1138417664,1138417695,CA
+1138417696,1138418175,US
 1138418176,1138418431,CA
 1138418432,1138421759,US
 1138421760,1138421791,DO
-1138421792,1138429951,US
-1138434048,1138462719,US
-1138466816,1138470911,US
-1138475008,1138479103,US
-1138483200,1138487295,US
-1138491392,1138499583,US
+1138421792,1138499583,US
 1138499584,1138503679,CA
-1138507776,1138536447,US
-1138540544,1138548735,US
+1138503680,1138544895,US
+1138544896,1138545151,GB
+1138545152,1138548735,US
 1138548736,1138550015,CA
 1138550016,1138552575,US
 1138552576,1138556927,CA
-1138556928,1138561023,US
-1138565120,1138593791,US
+1138556928,1138593791,US
 1138597888,1138601983,US
 1138606080,1138618367,US
-1138622464,1138642943,US
-1138647040,1138651135,US
+1138622464,1138651135,US
 1138655232,1138667519,US
 1138671616,1138675711,US
 1138679808,1138683903,US
@@ -10840,53 +10935,63 @@
 1138851840,1138854927,US
 1138854928,1138854943,GB
 1138854944,1138917375,US
-1138917376,1138933759,CA
+1138917376,1138937855,CA
 1138950144,1139146751,US
 1139146752,1139154943,GT
 1139154944,1139167231,JM
 1139167232,1139179519,US
-1139212288,1139216383,US
-1139277824,1140285439,US
+1139179520,1139187711,CA
+1139195904,1139199999,US
+1139212288,1139261439,US
+1139261440,1139269631,CA
+1139269632,1140563967,US
 1140850688,1145073663,US
 1145077760,1145094143,US
 1145098240,1145110527,US
-1145118720,1145139199,US
-1145142784,1145143295,US
-1145151488,1145180159,US
+1145118720,1145141247,US
+1145142784,1145180159,US
 1145184256,1145188351,US
 1145192448,1145196543,US
 1145208832,1145221119,US
 1145241600,1145245695,US
-1145274368,1145278463,US
+1145274368,1145290751,US
 1145294848,1145298943,US
 1145303040,1145307135,US
+1145307136,1145311231,CA
 1145319424,1145327615,US
-1145348096,1145376767,US
+1145331712,1145376767,US
+1145380864,1145384959,US
 1145389056,1145397247,US
 1145401344,1145405439,US
-1145417728,1145421823,US
+1145405440,1145409535,CA
+1145413632,1145421823,US
 1145421824,1145430015,CA
-1145446400,1145450495,US
+1145438208,1145450495,US
+1145466880,1145475071,US
 1145483264,1145487359,US
 1145503744,1145507839,CA
+1145511936,1145516031,CA
 1145520128,1145524223,US
-1145528320,1145532415,US
+1145528320,1145536511,US
 1145552896,1145556991,CA
+1145556992,1145561087,US
 1145569280,1150287871,US
 1150287872,1150812159,CA
 1150812160,1151860735,US
-1151877120,1151881215,US
+1151868928,1151881215,US
 1151889408,1151893503,CA
+1151901696,1151905791,US
 1151913984,1151918079,US
-1151926272,1151930367,US
-1151934464,1151946751,US
+1151926272,1151946751,US
 1151959040,1151967231,US
 1151979520,1151987711,US
 1151991808,1152016383,US
+1152024576,1152028671,US
 1152032768,1152040959,US
 1152049152,1152053247,US
 1152061440,1152073727,US
 1152086016,1152094207,US
+1152098304,1152102399,US
 1152106496,1152114687,US
 1152114688,1152122879,CA
 1152122880,1152581631,US
@@ -10896,6 +11001,7 @@
 1152778240,1152843775,CA
 1152843776,1156055039,US
 1156063232,1156067327,US
+1156071424,1156075519,CA
 1156083712,1156104191,US
 1156112384,1156128767,US
 1156132864,1156136959,US
@@ -10904,7 +11010,7 @@
 1156194304,1156214783,US
 1156218880,1156235263,US
 1156251648,1156255743,US
-1156268032,1156272127,US
+1156268032,1156276223,US
 1156284416,1156292607,US
 1156308992,1157713663,US
 1157713664,1157713791,CA
@@ -10918,7 +11024,8 @@
 1158027264,1158027519,CA
 1158027520,1158028287,US
 1158028288,1158028543,CA
-1158028544,1158148095,US
+1158028544,1158041599,US
+1158045696,1158148095,US
 1158148096,1158152191,CA
 1158152192,1158193151,US
 1158193152,1158197247,CA
@@ -11135,9 +11242,7 @@
 1163407360,1163411455,CA
 1163411456,1163527023,US
 1163527024,1163527039,VG
-1163527040,1163527935,US
-1163527936,1163528191,CA
-1163528192,1163531007,US
+1163527040,1163531007,US
 1163531008,1163532287,CA
 1163532288,1163533055,US
 1163533056,1163533311,CA
@@ -11171,11 +11276,9 @@
 1163547648,1163547903,CA
 1163547904,1163548159,US
 1163548160,1163548671,CA
-1163548672,1163549695,US
-1163549696,1163550207,CA
-1163550208,1163550463,US
-1163550464,1163550719,CA
-1163550720,1163551455,US
+1163548672,1163549951,US
+1163549952,1163550207,CA
+1163550208,1163551455,US
 1163551456,1163551487,CR
 1163551488,1163551743,US
 1163551744,1163552255,CA
@@ -11217,25 +11320,31 @@
 1167321960,1167321967,GB
 1167321968,1167851519,US
 1167851520,1168113663,CA
+1168130048,1168138239,US
 1168162816,1168171007,US
-1168175104,1168179199,US
+1168175104,1168187391,US
 1168195584,1168211967,US
+1168211968,1168220159,CA
 1168228352,1168236543,US
-1168261120,1168277503,US
-1168293888,1168302079,US
-1168310272,1168318463,US
+1168244736,1168322559,US
 1168343040,1168359423,US
 1168375808,1168392191,US
+1168408576,1168412671,US
+1168416768,1168420863,US
+1168424960,1168429055,US
+1168437248,1168441343,US
+1168457728,1168461823,US
 1168470016,1168474111,US
+1168474112,1168490495,CA
 1168509440,1168509695,US
+1168509952,1168510975,US
 1168515072,1168523263,US
-1168539648,1168547839,US
-1168556032,1168576511,US
-1168605184,1168621567,US
-1168646144,1168658431,US
-1168662528,1168670719,US
+1168539648,1168551935,US
+1168556032,1168584703,US
+1168588800,1168625663,US
+1168646144,1168670719,US
 1168670720,1168687103,CA
-1168687104,1168719871,US
+1168687104,1168728063,US
 1168736256,1168785407,US
 1168801792,1168805887,US
 1168818176,1168859135,US
@@ -11246,10 +11355,12 @@
 1168900096,1168908287,US
 1168916480,1168932863,CA
 1168932864,1168936959,US
-1168949248,1168973823,US
-1168982016,1169063935,US
-1169092608,1169096703,US
-1169162240,1169182975,US
+1168949248,1168963583,US
+1168963584,1168965119,CA
+1168965120,1168973823,US
+1168982016,1169068031,US
+1169092608,1169113087,US
+1169129472,1169182975,US
 1169182976,1169183487,CA
 1169183488,1169184767,US
 1169184768,1169185023,CA
@@ -11259,12 +11370,15 @@
 1169186048,1169186303,SG
 1169186304,1169203199,US
 1169203200,1169211391,CA
-1169211392,1170276351,US
+1169211392,1170333695,US
+1170341888,1170374655,US
+1170407424,1170411519,US
 1170472960,1170481151,CA
+1170481152,1170489343,US
 1170489344,1170497535,CA
+1170497536,1170505727,US
 1170505728,1170522111,CA
-1170522112,1170530303,US
-1170538496,1170718719,US
+1170522112,1170718719,US
 1170735104,1175977983,US
 1175977984,1176502271,CA
 1176502272,1176555519,US
@@ -11275,19 +11389,24 @@
 1176629248,1176629759,US
 1176629760,1176631039,CA
 1176631040,1176633343,US
-1176666112,1176698879,US
+1176666112,1176702975,US
 1176702976,1176707071,CA
-1176715264,1176719359,US
+1176707072,1176719359,US
 1176727552,1176731647,US
 1176731648,1176735743,PR
 1176748032,1176752127,US
 1176756224,1176760319,US
 1176764416,1176768511,PM
-1176797184,1176879103,US
+1176772608,1176776703,US
+1176780800,1176784895,US
+1176788992,1176879103,US
 1176895488,1176928255,CA
 1176928256,1176969215,US
-1177026560,1177028607,US
-1177030656,1177550847,US
+1177026560,1177030655,US
+1177030656,1177033727,AG
+1177033728,1177354239,US
+1177354240,1177419775,PR
+1177419776,1177550847,US
 1177550848,1178000911,CA
 1178000912,1178000919,US
 1178000920,1178075135,CA
@@ -11328,7 +11447,9 @@
 1208860672,1208918015,US
 1208918016,1208922111,CA
 1208922112,1208954879,US
-1208954880,1208958975,CA
+1208954880,1208958207,CA
+1208958208,1208958463,US
+1208958464,1208958975,CA
 1208958976,1208975359,US
 1208975360,1208983551,CA
 1208983552,1209347839,US
@@ -11359,10 +11480,7 @@
 1210366656,1210366719,GB
 1210366720,1210449919,US
 1210449920,1210580991,CA
-1210580992,1210740735,US
-1210744832,1210769407,US
-1210777600,1210892287,US
-1210908672,1210925055,US
+1210580992,1210925055,US
 1210925056,1210941439,CA
 1210941440,1211236351,US
 1211236352,1211269119,PR
@@ -11428,8 +11546,7 @@
 1224318208,1224318463,CA
 1224318464,1224321023,US
 1224321024,1224321535,CA
-1224321536,1224450047,US
-1224474624,1224476671,US
+1224321536,1224476671,US
 1224476672,1224478719,AN
 1224478720,1224480767,US
 1224480768,1224484863,JM
@@ -11439,9 +11556,13 @@
 1224501248,1224503551,JM
 1224503552,1224503807,BS
 1224503808,1224521727,JM
-1224521728,1224529919,US
+1224521728,1224527871,US
+1224527872,1224529664,JM
+1224529665,1224529919,US
 1224529920,1224538111,JM
 1224538112,1241743359,US
+1241743360,1241759743,CA
+1241759744,1241763839,US
 1241776128,1242300415,US
 1242300416,1242562559,CA
 1242562560,1244659711,US
@@ -11487,7 +11608,32 @@
 1247191200,1247191207,IE
 1247191208,1247346687,US
 1247543296,1248571391,US
+1248854016,1248864255,US
+1248864256,1248866303,CA
+1248866304,1248885759,US
+1248885760,1248886783,CA
+1248886784,1248899071,US
+1248899072,1248900095,CA
+1248900096,1248913407,US
+1248913408,1248915455,MF
+1248915456,1248919551,US
+1248919552,1248920575,CA
+1248920576,1248921599,US
+1248921600,1248923647,CA
+1248923648,1248931839,US
+1248933888,1248936959,US
+1248936960,1248939007,CA
+1248939008,1248946175,US
+1248946176,1248947199,VG
+1248947200,1248958463,US
+1248958464,1248959487,CA
+1248959488,1248964607,US
+1248964608,1248966655,CA
+1248966656,1249003519,US
+1249003520,1249005567,CA
+1249005568,1249010687,US
 1249640448,1249648639,US
+1249673216,1249677311,US
 1249681408,1249796095,US
 1249796096,1249804287,CA
 1249804288,1249886207,US
@@ -11506,9 +11652,9 @@
 1255062464,1255062527,PA
 1255062528,1255063551,US
 1255063552,1255071743,PR
-1255071744,1255193599,US
-1255193600,1255194623,GB
+1255071744,1255194623,US
 1255211008,1255247871,US
+1255251968,1255256063,US
 1255260160,1255276543,US
 1255276544,1255342079,CA
 1255342080,1255374303,US
@@ -11529,14 +11675,14 @@
 1256001536,1256005631,CA
 1256005632,1256079359,US
 1256079360,1256087551,KY
-1256087552,1263263743,US
+1256087552,1263267327,US
+1263267328,1263267839,CA
 1263271936,1264721919,US
 1264779264,1264980223,US
 1264980224,1264980479,HK
-1264980480,1264992255,US
-1265008640,1265012735,US
+1264980480,1265025023,US
 1265041408,1265057791,US
-1265074176,1265098751,US
+1265074176,1265102847,US
 1265106944,1266147327,US
 1266147328,1266155519,CA
 1266155520,1266489663,US
@@ -11617,13 +11763,12 @@
 1275714560,1275715583,CA
 1275715584,1275756543,US
 1275756544,1275772927,CA
-1275772928,1275781119,US
+1275772928,1275785215,US
 1275789312,1275822079,CA
 1275822080,1279262719,US
 1279262720,1279787007,CA
 1279787008,1279819775,US
-1279852544,1279868927,US
-1279885312,1279950847,US
+1279852544,1279950847,US
 1279950848,1279951103,FI
 1279951104,1279951359,US
 1279951360,1279952895,CA
@@ -11693,7 +11838,9 @@
 1294860288,1294893055,PL
 1294893056,1294895135,CS
 1294895136,1294895151,RS
-1294895152,1294895495,CS
+1294895152,1294895279,CS
+1294895280,1294895287,RS
+1294895288,1294895495,CS
 1294895496,1294895615,RS
 1294895616,1294902015,CS
 1294902016,1294902271,RS
@@ -11732,8 +11879,7 @@
 1296237312,1296237567,US
 1296237568,1296237823,NL
 1296237824,1296238079,ES
-1296238080,1296238591,GB
-1296238592,1296239103,NL
+1296238080,1296239103,NL
 1296239104,1296239231,FR
 1296239232,1296239359,NL
 1296239360,1296239615,ES
@@ -11754,7 +11900,8 @@
 1296245248,1296245503,FR
 1296245504,1296245759,NL
 1296245760,1296246783,ES
-1296246784,1296247807,NL
+1296246784,1296247295,NL
+1296247296,1296247807,FR
 1296247808,1296247871,US
 1296247872,1296247935,FR
 1296247936,1296247999,BE
@@ -11776,8 +11923,9 @@
 1296250144,1296250175,GB
 1296250176,1296250207,BE
 1296250208,1296250239,ES
-1296250240,1296251231,NL
-1296251232,1296251295,DE
+1296250240,1296250271,BE
+1296250272,1296251199,NL
+1296251200,1296251295,DE
 1296251296,1296251327,BE
 1296251328,1296251359,IE
 1296251360,1296251391,DE
@@ -11793,7 +11941,9 @@
 1296252352,1296252367,NL
 1296252368,1296252383,DE
 1296252384,1296252415,IE
-1296252416,1296252855,NL
+1296252416,1296252839,NL
+1296252840,1296252847,DE
+1296252848,1296252855,NL
 1296252856,1296252871,IE
 1296252872,1296252879,BE
 1296252880,1296252887,DE
@@ -11803,8 +11953,8 @@
 1296252920,1296252927,PL
 1296252928,1296254719,DE
 1296254720,1296254975,NL
-1296254976,1296255231,DE
-1296255232,1296258047,NL
+1296254976,1296255487,DE
+1296255488,1296258047,NL
 1296258048,1296258303,TW
 1296258304,1296259071,NL
 1296259072,1296259839,US
@@ -11821,10 +11971,12 @@
 1296264224,1296264239,IE
 1296264240,1296264255,NL
 1296264256,1296264303,US
-1296264304,1296264447,NL
+1296264304,1296264319,CA
+1296264320,1296264335,US
+1296264336,1296264447,NL
 1296264448,1296264543,US
-1296264544,1296264575,CA
-1296264576,1296264703,NL
+1296264544,1296264607,CA
+1296264608,1296264703,NL
 1296264704,1296264959,US
 1296264960,1296265087,NL
 1296265088,1296265151,CA
@@ -11856,8 +12008,8 @@
 1296469248,1296469503,NO
 1296469504,1296469759,ZM
 1296469760,1296470015,NO
-1296470016,1296470423,TZ
-1296470424,1296470463,NO
+1296470016,1296470439,TZ
+1296470440,1296470463,NO
 1296470464,1296470527,TZ
 1296470528,1296472319,NO
 1296472320,1296472327,CD
@@ -12114,9 +12266,7 @@
 1297661952,1297678335,UA
 1297678336,1297694719,IT
 1297694720,1297711103,PL
-1297711104,1297717895,GB
-1297717896,1297717903,BG
-1297717904,1297727487,GB
+1297711104,1297727487,GB
 1297727488,1297743871,MD
 1297743872,1297760255,DE
 1297760256,1297776639,LT
@@ -12305,7 +12455,8 @@
 1306509312,1306525695,PL
 1306525696,1307049983,ES
 1307049984,1307066367,RU
-1307069696,1307069855,DE
+1307069696,1307069823,DE
+1307069856,1307069887,DE
 1307074560,1307082751,SA
 1307082752,1307090943,RU
 1307090944,1307099135,GB
@@ -12479,7 +12630,11 @@
 1307914240,1307918335,NL
 1307918336,1307919439,GB
 1307919440,1307919447,ES
-1307919448,1307922431,GB
+1307919448,1307919503,GB
+1307919504,1307919511,ES
+1307919512,1307920575,GB
+1307920576,1307920583,AU
+1307920584,1307922431,GB
 1307922432,1307926527,NL
 1307926528,1307930623,KZ
 1307930624,1307934719,RU
@@ -12505,7 +12660,13 @@
 1308016640,1308020735,FI
 1308020736,1308024831,BG
 1308024832,1308033023,RU
-1308033024,1308035327,DE
+1308033024,1308033279,NL
+1308033280,1308033535,FR
+1308033536,1308033791,DE
+1308033792,1308034047,IT
+1308034048,1308034559,DE
+1308034560,1308034815,CZ
+1308034816,1308035327,DE
 1308035328,1308035583,GB
 1308035584,1308037119,DE
 1308037120,1308041215,UA
@@ -12760,6 +12921,7 @@
 1311248384,1311250431,GB
 1311250432,1311252479,RU
 1311252480,1311254527,GB
+1311254528,1311256575,SE
 1311256576,1311258623,FR
 1311258624,1311262719,GB
 1311262720,1311262975,FR
@@ -12855,7 +13017,9 @@
 1314127872,1314193407,LV
 1314193408,1314258943,RU
 1314258944,1314324479,GB
-1314324480,1314390015,GR
+1314324480,1314357247,GR
+1314357248,1314372352,CY
+1314372353,1314390015,GR
 1314390016,1314455551,PL
 1314455552,1314521087,KW
 1314521088,1314586623,BG
@@ -12939,7 +13103,9 @@
 1315772504,1315772511,NA
 1315772512,1315772583,UA
 1315772584,1315772599,NA
-1315772600,1315772791,UA
+1315772600,1315772703,UA
+1315772704,1315772711,NA
+1315772712,1315772791,UA
 1315772792,1315772799,NA
 1315772800,1315772887,UA
 1315772888,1315772895,NA
@@ -12957,7 +13123,9 @@
 1315773552,1315773567,NA
 1315773568,1315773575,UA
 1315773576,1315773583,NA
-1315773584,1315773703,UA
+1315773584,1315773679,UA
+1315773680,1315773687,NA
+1315773688,1315773703,UA
 1315773704,1315773711,NA
 1315773712,1315773719,UA
 1315773720,1315773751,NA
@@ -12967,9 +13135,7 @@
 1315773956,1315773959,NA
 1315773960,1315773983,UA
 1315773984,1315773991,BY
-1315773992,1315773999,UA
-1315774000,1315774007,NA
-1315774008,1315774015,UA
+1315773992,1315774015,UA
 1315774016,1315774031,NA
 1315774032,1315774039,UA
 1315774040,1315774071,NA
@@ -13009,7 +13175,9 @@
 1315860480,1315864575,IR
 1315864576,1315868671,CH
 1315868672,1315872767,RU
-1315872768,1315875183,GB
+1315872768,1315873055,GB
+1315873056,1315873063,RU
+1315873064,1315875183,GB
 1315875184,1315875199,ES
 1315875200,1315876607,GB
 1315876608,1315876863,RU
@@ -13023,22 +13191,19 @@
 1315897920,1315897951,IR
 1315897952,1315897991,AE
 1315897992,1315897999,IR
-1315898000,1315898431,AE
+1315898000,1315898111,AE
+1315898112,1315898367,IR
+1315898368,1315898431,AE
 1315898432,1315898447,IR
 1315898448,1315898623,AE
-1315898624,1315900927,IR
-1315900928,1315901183,AE
-1315901184,1315901439,IR
+1315898624,1315901439,IR
 1315901440,1315905535,UA
 1315905536,1315907583,BA
-1315907584,1315908095,SI
-1315908096,1315908607,BA
-1315908608,1315909631,SI
+1315907584,1315909631,SI
 1315909632,1315913727,AZ
 1315913728,1315917823,DE
 1315917824,1315921919,RU
 1315921920,1315926015,TR
-1315926016,1315930111,NO
 1315930112,1315934207,DE
 1315934208,1315938303,RU
 1315938304,1315942399,DK
@@ -13124,416 +13289,436 @@
 1317650432,1317666815,RU
 1317666816,1317666823,NG
 1317666824,1317666831,CD
-1317666832,1317666855,GB
-1317666856,1317666871,NG
-1317666872,1317666879,GB
+1317666832,1317666839,NG
+1317666840,1317666871,GH
+1317666872,1317666879,NG
 1317666880,1317666887,LR
-1317666888,1317666903,NG
-1317666904,1317666911,GB
-1317666912,1317666919,NG
+1317666888,1317666919,NG
 1317666920,1317666935,GB
 1317666936,1317666943,NG
 1317666944,1317666951,GB
-1317666952,1317666959,AO
-1317666960,1317666967,NG
-1317666968,1317667007,GB
+1317666952,1317666967,NG
+1317666968,1317666983,GB
+1317666984,1317666991,CM
+1317666992,1317666999,GB
+1317667000,1317667007,AO
 1317667008,1317667015,GH
-1317667016,1317667023,GB
+1317667016,1317667023,NG
 1317667024,1317667031,LR
 1317667032,1317667039,NG
-1317667040,1317667047,GB
+1317667040,1317667047,GH
 1317667048,1317667055,NG
 1317667056,1317667063,LR
-1317667064,1317667071,GB
-1317667072,1317667079,AO
-1317667080,1317667095,GB
+1317667064,1317667087,AO
+1317667088,1317667095,NG
 1317667096,1317667103,GH
-1317667104,1317667111,GB
+1317667104,1317667111,NG
 1317667112,1317667119,GH
 1317667120,1317667127,GB
 1317667128,1317667135,NG
-1317667136,1317667143,GB
-1317667144,1317667151,NG
-1317667152,1317667167,GB
+1317667136,1317667143,AO
+1317667144,1317667159,NG
+1317667160,1317667167,AO
 1317667168,1317667175,NG
 1317667176,1317667191,GH
-1317667192,1317667223,NG
-1317667224,1317667231,GB
+1317667192,1317667231,NG
 1317667232,1317667239,GH
-1317667240,1317667247,NG
-1317667248,1317667279,GB
-1317667280,1317667295,NG
+1317667240,1317667263,NG
+1317667264,1317667271,GB
+1317667272,1317667295,NG
 1317667296,1317667303,GB
 1317667304,1317667311,NG
-1317667312,1317667335,GB
-1317667336,1317667351,NG
+1317667312,1317667327,GB
+1317667328,1317667351,NG
 1317667352,1317667367,AO
-1317667368,1317667391,GB
+1317667368,1317667375,NG
+1317667376,1317667391,AO
 1317667392,1317667399,NG
-1317667400,1317667407,GB
-1317667408,1317667423,NG
+1317667400,1317667423,GB
 1317667424,1317667431,TD
-1317667432,1317667447,GB
-1317667448,1317667455,NG
-1317667456,1317667471,GB
-1317667472,1317667479,NG
-1317667480,1317667495,GB
+1317667432,1317667439,GH
+1317667440,1317667455,GB
+1317667456,1317667487,NG
+1317667488,1317667495,GH
 1317667496,1317667503,NG
-1317667504,1317667543,GB
+1317667504,1317667527,GB
+1317667528,1317667535,AO
+1317667536,1317667543,GB
 1317667544,1317667551,AO
 1317667552,1317667567,NG
 1317667568,1317667583,GB
-1317667584,1317667719,NG
-1317667720,1317667727,GB
-1317667728,1317667775,NG
+1317667584,1317667759,NG
+1317667760,1317667767,FR
+1317667768,1317667775,ZA
 1317667776,1317667783,CD
-1317667784,1317667799,GB
-1317667800,1317667823,NG
-1317667824,1317668095,GB
+1317667784,1317667807,NG
+1317667808,1317667815,GB
+1317667816,1317667823,NG
+1317667824,1317667831,GB
+1317667832,1317667839,GN
+1317667840,1317668095,GB
 1317668096,1317668103,GH
-1317668104,1317668111,GB
+1317668104,1317668111,ZM
 1317668112,1317668119,NG
-1317668120,1317668135,GB
+1317668120,1317668127,AO
+1317668128,1317668135,GB
 1317668136,1317668143,NG
-1317668144,1317668159,GB
-1317668160,1317668183,NG
+1317668144,1317668151,AO
+1317668152,1317668183,NG
 1317668184,1317668191,CI
-1317668192,1317668199,GB
+1317668192,1317668199,NG
 1317668200,1317668207,BW
 1317668208,1317668215,LR
 1317668216,1317668223,GB
-1317668224,1317668231,NG
-1317668232,1317668239,GB
+1317668224,1317668239,NG
 1317668240,1317668247,LR
 1317668248,1317668263,NG
-1317668264,1317668271,GB
+1317668264,1317668271,AO
 1317668272,1317668279,SL
-1317668280,1317668327,GB
-1317668328,1317668343,NG
+1317668280,1317668311,NG
+1317668312,1317668319,IQ
+1317668320,1317668343,NG
 1317668344,1317668351,AO
-1317668352,1317668367,GB
-1317668368,1317668375,NG
-1317668376,1317668383,GB
-1317668384,1317668391,NG
-1317668392,1317668463,GB
-1317668464,1317668479,GH
-1317668480,1317668503,GB
+1317668352,1317668367,SL
+1317668368,1317668399,NG
+1317668400,1317668407,GB
+1317668408,1317668415,GH
+1317668416,1317668447,NG
+1317668448,1317668455,GB
+1317668456,1317668463,NG
+1317668464,1317668471,AO
+1317668472,1317668479,GH
+1317668480,1317668487,NG
+1317668488,1317668495,GB
+1317668496,1317668503,GH
 1317668504,1317668511,CD
-1317668512,1317668527,GB
+1317668512,1317668519,IQ
+1317668520,1317668527,MZ
 1317668528,1317668535,AO
-1317668536,1317668559,GB
+1317668536,1317668543,BJ
+1317668544,1317668551,UG
+1317668552,1317668559,AO
 1317668560,1317668583,NG
 1317668584,1317668591,LR
-1317668592,1317668599,GB
-1317668600,1317668607,NG
+1317668592,1317668607,NG
 1317668608,1317668615,GH
 1317668616,1317668623,NG
-1317668624,1317668639,GB
-1317668640,1317668679,NG
-1317668680,1317668687,GB
-1317668688,1317668695,NG
-1317668696,1317668711,GB
-1317668712,1317668719,NG
-1317668720,1317668727,GB
-1317668728,1317668743,NG
-1317668744,1317668855,GB
-1317668856,1317668863,CI
-1317668864,1317668879,NG
-1317668880,1317668895,GB
-1317668896,1317668911,NG
-1317668912,1317668919,GB
-1317668920,1317668927,NG
-1317668928,1317668951,GB
-1317668952,1317668959,NG
-1317668960,1317668991,GB
+1317668624,1317668631,SL
+1317668632,1317668639,GB
+1317668640,1317668735,NG
+1317668736,1317668751,AO
+1317668752,1317668759,GB
+1317668760,1317668767,IQ
+1317668768,1317668775,LR
+1317668776,1317668791,NG
+1317668792,1317668807,AO
+1317668808,1317668823,NG
+1317668824,1317668831,AO
+1317668832,1317668855,NG
+1317668856,1317668863,GH
+1317668864,1317668871,LR
+1317668872,1317668879,NG
+1317668880,1317668887,GB
+1317668888,1317668895,SL
+1317668896,1317668983,NG
+1317668984,1317668991,GB
 1317668992,1317668999,NG
-1317669000,1317669007,GB
-1317669008,1317669015,NG
-1317669016,1317669023,GB
-1317669024,1317669031,NG
-1317669032,1317669039,GB
-1317669040,1317669063,NG
-1317669064,1317669071,GB
-1317669072,1317669087,NG
-1317669088,1317669095,CI
-1317669096,1317669119,NG
+1317669000,1317669007,CD
+1317669008,1317669031,NG
+1317669032,1317669039,TD
+1317669040,1317669047,CD
+1317669048,1317669055,GB
+1317669056,1317669119,NG
 1317669120,1317669375,GE
 1317669376,1317669631,CG
 1317669632,1317669887,GB
-1317669888,1317669911,NG
+1317669888,1317669895,AO
+1317669896,1317669911,NG
 1317669912,1317669919,GH
-1317669920,1317669959,NG
-1317669960,1317669967,SD
-1317669968,1317669975,GB
-1317669976,1317669983,NG
-1317669984,1317669999,GB
-1317670000,1317670007,CD
-1317670008,1317670055,GB
-1317670056,1317670063,NG
-1317670064,1317670071,GB
-1317670072,1317670079,NG
-1317670080,1317670103,GB
+1317669920,1317669983,NG
+1317669984,1317669991,LR
+1317669992,1317670015,NG
+1317670016,1317670031,GB
+1317670032,1317670103,NG
 1317670104,1317670111,CD
-1317670112,1317670119,NG
-1317670120,1317670175,GB
-1317670176,1317670399,NG
-1317670400,1317670447,GB
-1317670448,1317670455,NG
-1317670456,1317670471,GB
+1317670112,1317670143,NG
+1317670144,1317670175,SL
+1317670176,1317670223,NG
+1317670224,1317670231,AO
+1317670232,1317670239,GB
+1317670240,1317670263,NG
+1317670264,1317670271,GB
+1317670272,1317670399,NG
+1317670400,1317670415,CD
+1317670416,1317670447,NG
+1317670448,1317670455,IQ
+1317670456,1317670471,NG
 1317670472,1317670479,CO
 1317670480,1317670487,GB
-1317670488,1317670495,NG
-1317670496,1317670503,GB
-1317670504,1317670511,NG
+1317670488,1317670511,NG
 1317670512,1317670519,CI
-1317670520,1317670527,NG
-1317670528,1317670567,GB
+1317670520,1317670543,NG
+1317670544,1317670551,IQ
+1317670552,1317670567,NG
 1317670568,1317670575,BI
 1317670576,1317670583,NG
-1317670584,1317670591,TD
-1317670592,1317670599,GB
-1317670600,1317670615,NG
-1317670616,1317670655,GB
-1317670656,1317670663,NG
-1317670664,1317670679,GB
-1317670680,1317670687,NG
-1317670688,1317670695,GB
-1317670696,1317670703,NG
-1317670704,1317670719,GB
+1317670584,1317670599,GH
+1317670600,1317670607,AO
+1317670608,1317670639,NG
+1317670640,1317670647,GB
+1317670648,1317670671,NG
+1317670672,1317670679,CM
+1317670680,1317670711,NG
+1317670712,1317670719,GH
 1317670720,1317670727,NG
-1317670728,1317670735,GB
-1317670736,1317670751,NG
-1317670752,1317670767,GB
+1317670728,1317670735,GH
+1317670736,1317670743,AO
+1317670744,1317670767,NG
 1317670768,1317670775,GH
-1317670776,1317670799,GB
-1317670800,1317670807,NG
-1317670808,1317670823,GB
+1317670776,1317670783,GB
+1317670784,1317670791,GH
+1317670792,1317670807,NG
+1317670808,1317670815,AO
+1317670816,1317670823,NG
 1317670824,1317670831,CD
-1317670832,1317670839,GB
-1317670840,1317670847,NG
-1317670848,1317670887,GB
+1317670832,1317670855,NG
+1317670856,1317670863,CD
+1317670864,1317670871,GB
+1317670872,1317670887,NG
 1317670888,1317670895,AO
-1317670896,1317671207,GB
-1317671208,1317671215,NG
-1317671216,1317671223,GB
-1317671224,1317671231,NG
-1317671232,1317671247,GB
+1317670896,1317670896,GB
+1317670897,1317670911,NG
+1317670912,1317671167,GB
+1317671168,1317671175,AO
+1317671176,1317671191,NG
+1317671192,1317671199,SL
+1317671200,1317671207,CI
+1317671208,1317671239,NG
+1317671240,1317671247,CI
 1317671248,1317671255,NG
-1317671256,1317671335,GB
+1317671256,1317671263,CI
+1317671264,1317671335,NG
 1317671336,1317671343,BW
-1317671344,1317671351,AO
-1317671352,1317671415,GB
-1317671416,1317671439,NG
-1317671440,1317671455,GB
-1317671456,1317671463,NG
-1317671464,1317671471,GB
-1317671472,1317671479,NG
-1317671480,1317671487,GB
+1317671344,1317671351,CD
+1317671352,1317671383,NG
+1317671384,1317671391,CI
+1317671392,1317671399,NG
+1317671400,1317671407,IQ
+1317671408,1317671487,NG
 1317671488,1317671511,AO
-1317671512,1317671519,GB
+1317671512,1317671519,NG
 1317671520,1317671527,AO
 1317671528,1317671543,NG
-1317671544,1317671551,GB
+1317671544,1317671551,GH
 1317671552,1317671559,LR
-1317671560,1317671591,NG
-1317671592,1317671631,GB
+1317671560,1317671575,GB
+1317671576,1317671576,NG
+1317671577,1317671583,GB
+1317671584,1317671607,NG
+1317671608,1317671615,GH
+1317671616,1317671623,NG
+1317671624,1317671631,SL
 1317671632,1317671639,NG
-1317671640,1317671647,GB
-1317671648,1317671655,NE
-1317671656,1317671671,GB
+1317671640,1317671647,SL
+1317671648,1317671663,NG
+1317671664,1317671671,SL
 1317671672,1317671679,NG
 1317671680,1317671687,LR
-1317671688,1317671711,GB
-1317671712,1317671719,NG
-1317671720,1317671743,GB
-1317671744,1317671751,NG
-1317671752,1317671759,GB
+1317671688,1317671743,NG
+1317671744,1317671759,GB
 1317671760,1317671767,NG
-1317671768,1317671823,GB
+1317671768,1317671775,GB
+1317671776,1317671807,NG
+1317671808,1317671823,CI
 1317671824,1317671831,NG
-1317671832,1317671839,GB
+1317671832,1317671839,GH
 1317671840,1317671847,AO
-1317671848,1317671855,NG
-1317671856,1317671863,GB
-1317671864,1317671895,NG
-1317671896,1317671903,GB
+1317671848,1317671895,NG
+1317671896,1317671903,GH
 1317671904,1317671911,NG
-1317671912,1317671935,GB
+1317671912,1317671919,AO
+1317671920,1317671927,NG
+1317671928,1317671935,GH
 1317671936,1317672447,GA
-1317672448,1317672455,GB
-1317672456,1317672463,NG
-1317672464,1317672471,GB
-1317672472,1317672479,NG
-1317672480,1317672487,GB
-1317672488,1317672495,NG
-1317672496,1317672503,GB
-1317672504,1317672511,NG
-1317672512,1317672519,GB
-1317672520,1317672527,NG
-1317672528,1317672559,GB
-1317672560,1317672567,NG
-1317672568,1317672591,GB
-1317672592,1317672599,LR
-1317672600,1317672607,NG
-1317672608,1317672623,GB
-1317672624,1317672631,NG
-1317672632,1317672647,GB
-1317672648,1317672655,NG
+1317672448,1317672479,NG
+1317672480,1317672487,ZM
+1317672488,1317672583,NG
+1317672584,1317672591,CD
+1317672592,1317672607,NG
+1317672608,1317672615,CM
+1317672616,1317672631,NG
+1317672632,1317672639,GB
+1317672640,1317672655,NG
 1317672656,1317672663,CD
-1317672664,1317672671,GB
-1317672672,1317672687,NG
-1317672688,1317672711,GB
-1317672712,1317672719,NG
-1317672720,1317672735,GB
-1317672736,1317672743,RW
-1317672744,1317672759,GB
-1317672760,1317672775,NG
-1317672776,1317672783,GB
+1317672664,1317672719,NG
+1317672720,1317672727,LR
+1317672728,1317672735,NG
+1317672736,1317672743,LR
+1317672744,1317672751,GB
+1317672752,1317672767,NG
+1317672768,1317672775,GB
+1317672776,1317672783,NG
 1317672784,1317672791,AO
-1317672792,1317672799,NG
+1317672792,1317672799,GB
 1317672800,1317672807,RW
-1317672808,1317672815,GB
+1317672808,1317672815,TD
 1317672816,1317672823,BW
-1317672824,1317672863,GB
-1317672864,1317672871,NG
-1317672872,1317672887,GB
-1317672888,1317672895,NG
-1317672896,1317672919,GB
+1317672824,1317672831,NG
+1317672832,1317672839,GB
+1317672840,1317672903,NG
+1317672904,1317672919,CI
 1317672920,1317672927,GH
-1317672928,1317672943,GB
-1317672944,1317672959,AO
-1317672960,1317673215,GB
-1317673216,1317673223,NG
-1317673224,1317673231,GB
-1317673232,1317673263,NG
-1317673264,1317673287,GB
+1317672928,1317672935,NG
+1317672936,1317672943,LR
+1317672944,1317672951,NG
+1317672952,1317672959,AO
+1317672960,1317673239,NG
+1317673240,1317673247,ZW
+1317673248,1317673287,NG
 1317673288,1317673295,LR
-1317673296,1317673303,NG
-1317673304,1317673319,GB
+1317673296,1317673319,NG
 1317673320,1317673327,LR
-1317673328,1317673351,GB
-1317673352,1317673359,NG
-1317673360,1317673399,GB
-1317673400,1317673415,NG
-1317673416,1317673463,GB
-1317673464,1317673471,NG
-1317673472,1317673479,GB
-1317673480,1317673503,NG
-1317673504,1317673511,GB
-1317673512,1317673535,NG
-1317673536,1317673591,GB
+1317673328,1317673335,NG
+1317673336,1317673351,GB
+1317673352,1317673407,NG
+1317673408,1317673415,GB
+1317673416,1317673423,CI
+1317673424,1317673431,NG
+1317673432,1317673463,AO
+1317673464,1317673487,NG
+1317673488,1317673495,HK
+1317673496,1317673527,NG
+1317673528,1317673535,GB
+1317673536,1317673575,NG
+1317673576,1317673583,CD
+1317673584,1317673591,GB
 1317673592,1317673599,NG
-1317673600,1317673615,GB
-1317673616,1317673631,NG
-1317673632,1317673655,GB
-1317673656,1317673663,NG
-1317673664,1317673711,GB
+1317673600,1317673607,GB
+1317673608,1317673631,NG
+1317673632,1317673639,CD
+1317673640,1317673647,AO
+1317673648,1317673671,NG
+1317673672,1317673679,GB
+1317673680,1317673687,CD
+1317673688,1317673711,NG
 1317673712,1317673719,CO
-1317673720,1317673743,GB
+1317673720,1317673727,NG
+1317673728,1317673743,AO
 1317673744,1317673751,CD
-1317673752,1317673775,GB
+1317673752,1317673767,NG
+1317673768,1317673775,AO
 1317673776,1317673783,NG
-1317673784,1317673815,GB
+1317673784,1317673791,AO
+1317673792,1317673815,NG
 1317673816,1317673823,TD
-1317673824,1317673903,GB
-1317673904,1317673911,NG
-1317673912,1317673943,GB
-1317673944,1317673951,NG
-1317673952,1317673967,GB
-1317673968,1317674239,NG
-1317674240,1317674247,GB
-1317674248,1317674255,NG
-1317674256,1317674271,GB
+1317673824,1317673831,NG
+1317673832,1317673839,AO
+1317673840,1317673887,NG
+1317673888,1317673895,GB
+1317673896,1317673911,NG
+1317673912,1317673919,AO
+1317673920,1317673927,CI
+1317673928,1317673943,NG
+1317673944,1317673951,AO
+1317673952,1317674255,NG
+1317674256,1317674263,GB
+1317674264,1317674271,AO
 1317674272,1317674279,NG
-1317674280,1317674287,RW
+1317674280,1317674287,CD
 1317674288,1317674295,GH
-1317674296,1317674311,GB
-1317674312,1317674335,NG
-1317674336,1317674359,GB
+1317674296,1317674303,AO
+1317674304,1317674359,NG
 1317674360,1317674367,AO
-1317674368,1317674375,GB
-1317674376,1317674383,NG
-1317674384,1317674391,GB
-1317674392,1317674407,NG
-1317674408,1317674455,GB
-1317674456,1317674463,NG
-1317674464,1317674503,GB
+1317674368,1317674415,NG
+1317674416,1317674423,AO
+1317674424,1317674431,NG
+1317674432,1317674440,AO
+1317674441,1317674447,GB
+1317674448,1317674455,AO
+1317674456,1317674471,NG
+1317674472,1317674479,GB
+1317674480,1317674487,AO
+1317674488,1317674495,NG
+1317674496,1317674503,GB
 1317674504,1317674511,AO
-1317674512,1317674519,NG
-1317674520,1317674535,GB
-1317674536,1317674543,CM
+1317674512,1317674535,NG
+1317674536,1317674543,GB
 1317674544,1317674551,NG
-1317674552,1317674567,GB
-1317674568,1317674575,NG
+1317674552,1317674559,GB
+1317674560,1317674575,NG
 1317674576,1317674583,GB
-1317674584,1317674599,NG
-1317674600,1317674783,GB
-1317674784,1317674791,NG
+1317674584,1317674615,NG
+1317674616,1317674623,GB
+1317674624,1317674671,NG
+1317674672,1317674679,GB
+1317674680,1317674687,AO
+1317674688,1317674735,NG
+1317674736,1317674743,AO
+1317674744,1317674791,NG
 1317674792,1317674799,GH
 1317674800,1317674807,NG
 1317674808,1317674831,GB
-1317674832,1317674839,NG
-1317674840,1317674863,GB
-1317674864,1317674871,NG
-1317674872,1317674911,GB
-1317674912,1317674919,NG
-1317674920,1317674943,GB
+1317674832,1317674887,NG
+1317674888,1317674911,AO
+1317674912,1317674927,NG
+1317674928,1317674935,AO
+1317674936,1317674943,NG
 1317674944,1317674951,GA
-1317674952,1317674959,GB
-1317674960,1317674967,NG
-1317674968,1317674975,GB
-1317674976,1317674991,NG
+1317674952,1317674959,NG
+1317674960,1317674983,GB
+1317674984,1317674991,NG
 1317674992,1317674999,GB
 1317675000,1317675007,NG
-1317675008,1317675039,GB
-1317675040,1317675055,NG
-1317675056,1317675071,GB
-1317675072,1317675079,NG
-1317675080,1317675095,GB
-1317675096,1317675111,NG
-1317675112,1317675135,GB
-1317675136,1317675143,NG
-1317675144,1317675151,GB
-1317675152,1317675159,NG
-1317675160,1317675223,GB
-1317675224,1317675231,NG
+1317675008,1317675023,GB
+1317675024,1317675063,NG
+1317675064,1317675071,AO
+1317675072,1317675079,GB
+1317675080,1317675127,NG
+1317675128,1317675167,GB
+1317675168,1317675175,NG
+1317675176,1317675199,GB
+1317675200,1317675231,NG
 1317675232,1317675239,LR
 1317675240,1317675255,AO
-1317675256,1317675263,GB
-1317675264,1317675279,NG
-1317675280,1317675303,GB
-1317675304,1317675311,NG
-1317675312,1317675343,GB
+1317675256,1317675295,GB
+1317675296,1317675319,NG
+1317675320,1317675343,GB
 1317675344,1317675351,AO
-1317675352,1317675367,GB
-1317675368,1317675375,NG
-1317675376,1317675391,GB
-1317675392,1317675399,NG
-1317675400,1317675407,GB
+1317675352,1317675359,GB
+1317675360,1317675375,NG
+1317675376,1317675383,GB
+1317675384,1317675391,NG
+1317675392,1317675407,GB
 1317675408,1317675415,NG
-1317675416,1317675455,GB
+1317675416,1317675423,GB
+1317675424,1317675439,NG
+1317675440,1317675455,GB
 1317675456,1317675463,CD
 1317675464,1317675471,CI
 1317675472,1317675479,NG
 1317675480,1317675487,GB
-1317675488,1317675511,NG
-1317675512,1317675535,GB
-1317675536,1317675543,NG
-1317675544,1317675551,GB
+1317675488,1317675519,NG
+1317675520,1317675551,GB
 1317675552,1317675559,NG
 1317675560,1317675567,NA
-1317675568,1317675575,GB
-1317675576,1317675583,GH
-1317675584,1317675615,GB
-1317675616,1317675623,NG
-1317675624,1317675639,GB
+1317675568,1317675575,AO
+1317675576,1317675583,GB
+1317675584,1317675591,LR
+1317675592,1317675615,NG
+1317675616,1317675631,GB
+1317675632,1317675639,NG
 1317675640,1317675647,FR
-1317675648,1317675671,GB
-1317675672,1317675687,NG
-1317675688,1317675727,GB
-1317675728,1317675735,NG
+1317675648,1317675655,LR
+1317675656,1317675687,NG
+1317675688,1317675695,CM
+1317675696,1317675711,NG
+1317675712,1317675719,CM
+1317675720,1317675735,NG
 1317675736,1317675743,CD
-1317675744,1317683199,GB
+1317675744,1317675751,GH
+1317675752,1317675759,GB
+1317675760,1317675775,GH
+1317675776,1317683199,GB
 1317683200,1317683839,DE
 1317683840,1317683855,CH
 1317683856,1317683859,US
@@ -13568,7 +13753,9 @@
 1317912576,1317920767,GB
 1317920768,1317928959,ES
 1317928960,1317945343,BG
-1317945344,1317978111,AT
+1317945344,1317965047,AT
+1317965048,1317965055,DE
+1317965056,1317978111,AT
 1317978112,1317994495,RU
 1317994496,1318000383,DE
 1318000384,1318000447,NL
@@ -13586,7 +13773,6 @@
 1318592512,1318600703,FI
 1318600704,1318608895,AT
 1318608896,1318617087,IT
-1318617088,1318625279,LT
 1318625280,1318633471,UA
 1318633472,1318649855,IE
 1318649856,1318658047,RU
@@ -13598,18 +13784,19 @@
 1318699008,1318707199,IE
 1318707200,1318707743,FR
 1318707744,1318707967,SE
-1318707968,1318708479,FR
-1318708480,1318708991,SE
+1318707968,1318708495,FR
+1318708496,1318708991,SE
 1318708992,1318711495,FR
 1318711496,1318711503,SE
 1318711504,1318711647,FR
 1318711648,1318711663,IT
-1318711664,1318711775,FR
-1318711776,1318713343,SE
+1318711664,1318711887,FR
+1318711888,1318712319,SE
+1318712320,1318712575,FR
+1318712576,1318713343,SE
 1318713344,1318713855,FR
 1318713856,1318714111,CH
-1318714112,1318714367,SE
-1318714368,1318715390,FR
+1318714112,1318715390,FR
 1318715392,1318723583,BG
 1318723584,1318731775,IR
 1318731776,1318739967,PL
@@ -13640,8 +13827,9 @@
 1318944768,1318952959,LV
 1318952960,1318956543,CZ
 1318956544,1318957055,PL
-1318957056,1318959103,CZ
-1318959104,1318961151,PL
+1318957056,1318958847,CZ
+1318958848,1318960895,PL
+1318960896,1318961151,CZ
 1318961152,1318969343,NL
 1318969344,1318977535,RU
 1318977536,1318985727,LT
@@ -13774,19 +13962,20 @@
 1331948568,1331948575,DE
 1331948576,1331948583,CZ
 1331948584,1331948607,GB
-1331948608,1331949567,CH
+1331948608,1331948615,US
+1331948616,1331949567,CH
 1331949568,1331951615,RU
 1331951616,1331953663,GE
 1331953664,1332019199,BG
-1332019200,1332025087,CS
-1332025088,1332025343,RS
-1332025344,1332027135,CS
+1332019200,1332027135,CS
 1332027136,1332027391,RS
 1332027392,1332027903,CS
 1332027904,1332028159,RS
 1332028160,1332028671,CS
 1332028672,1332028735,RS
-1332028736,1332028923,CS
+1332028736,1332028895,CS
+1332028896,1332028903,RS
+1332028904,1332028923,CS
 1332028924,1332028927,RS
 1332028928,1332029015,CS
 1332029016,1332029023,RS
@@ -13871,15 +14060,9 @@
 1334247424,1334255615,NO
 1334255616,1334263807,IT
 1334263808,1334271999,RU
-1334272000,1334279615,GB
-1334279616,1334279647,GN
-1334279648,1334280191,GB
+1334272000,1334280191,GB
 1334280192,1334288383,LV
-1334288384,1334289407,TR
-1334289408,1334289663,UA
-1334289664,1334290431,TR
-1334290432,1334290687,LB
-1334290688,1334296575,TR
+1334288384,1334296575,TR
 1334296576,1334304767,UA
 1334304768,1334312959,RU
 1334312960,1334316031,SE
@@ -13890,7 +14073,9 @@
 1334345728,1334378495,RU
 1334378496,1334411263,IT
 1334411264,1334444031,RU
-1334444032,1334501375,SE
+1334444032,1334484991,SE
+1334484992,1334489087,DK
+1334489088,1334501375,SE
 1334501376,1334509567,DK
 1334509568,1334542335,PL
 1334542336,1334575103,RU
@@ -13914,9 +14099,9 @@
 1334585000,1334585007,US
 1334585008,1334585055,DE
 1334585056,1334585087,US
-1334585088,1334586879,DE
-1334586880,1334586911,LI
-1334586912,1334591487,DE
+1334585088,1334585111,DE
+1334585112,1334585119,US
+1334585120,1334591487,DE
 1334591488,1334595583,RU
 1334595584,1334596351,IT
 1334596352,1334596607,GR
@@ -13966,7 +14151,12 @@
 1334682880,1334683135,DK
 1334683136,1334683391,CZ
 1334683392,1334683647,CH
-1334683648,1334685695,DE
+1334683648,1334684159,DE
+1334684160,1334684415,SE
+1334684416,1334684671,DE
+1334684672,1334684927,FI
+1334684928,1334685183,NL
+1334685184,1334685695,DE
 1334685696,1334689791,IT
 1334689792,1334693887,FR
 1334693888,1334702079,RU
@@ -13977,18 +14167,22 @@
 1334718464,1334722559,KZ
 1334722560,1334726655,IT
 1334726656,1334730239,RU
-1334730240,1334730359,KZ
-1334730360,1334730367,RU
+1334730240,1334730363,KZ
+1334730364,1334730367,RU
 1334730368,1334730399,KZ
 1334730400,1334730495,RU
 1334730496,1334730499,KZ
 1334730500,1334730503,RU
 1334730504,1334730539,KZ
 1334730540,1334730543,RU
-1334730544,1334730547,KZ
-1334730548,1334730559,RU
+1334730544,1334730551,KZ
+1334730552,1334730559,RU
 1334730560,1334730571,KZ
-1334730572,1334734847,RU
+1334730572,1334730575,RU
+1334730576,1334730591,KZ
+1334730592,1334730603,RU
+1334730604,1334730615,KZ
+1334730616,1334734847,RU
 1334734848,1334738943,LT
 1334738944,1334743039,CH
 1334743040,1334747135,UA
@@ -14122,8 +14316,8 @@
 1342628664,1342628671,IE
 1342628672,1342701567,GB
 1342701568,1342981887,FR
-1342981888,1342981903,GB
-1342981904,1342982143,FR
+1342981888,1342981935,GB
+1342981936,1342982143,FR
 1342982144,1342982399,MG
 1342982400,1342988287,FR
 1342988288,1342989055,US
@@ -14204,7 +14398,9 @@
 1346453504,1346461695,BA
 1346461696,1346469887,NL
 1346469888,1346473983,BE
-1346473984,1346478079,IT
+1346473984,1346477823,IT
+1346477824,1346477855,HU
+1346477856,1346478079,IT
 1346478080,1346482175,BA
 1346482176,1346486271,CZ
 1346486272,1346490367,SE
@@ -14286,12 +14482,14 @@
 1346711552,1346715647,AZ
 1346715648,1346723839,NL
 1346723840,1346732031,DE
+1346732032,1346736127,GB
 1346736128,1346740223,RU
 1346740224,1346744319,NL
 1346744320,1346748415,RU
 1346748416,1346752511,DE
 1346752512,1346756607,FR
 1346756608,1346760703,SE
+1346760704,1346764799,IR
 1346764800,1346768895,RU
 1346768896,1346772991,LV
 1346772992,1346775071,FR
@@ -14431,8 +14629,12 @@
 1347229312,1347229343,AT
 1347229344,1347229727,DE
 1347229728,1347229743,AT
-1347229744,1347231743,DE
+1347229744,1347231071,DE
+1347231072,1347231087,AT
+1347231088,1347231095,GR
+1347231096,1347231743,DE
 1347231744,1347235839,UA
+1347235840,1347239935,GE
 1347239936,1347244031,DK
 1347244032,1347247359,GB
 1347247360,1347247871,RU
@@ -14452,6 +14654,7 @@
 1347252224,1347256319,HU
 1347256320,1347260415,FO
 1347260416,1347264511,MK
+1347264512,1347268607,RU
 1347268608,1347271935,LB
 1347271936,1347272447,IQ
 1347272448,1347272703,LB
@@ -14648,7 +14851,8 @@
 1347391488,1347395583,LB
 1347395584,1347399679,SE
 1347399680,1347403775,RU
-1347403776,1347411967,NL
+1347403776,1347407871,NL
+1347407872,1347411967,GB
 1347411968,1347416063,DE
 1347416064,1347420159,RU
 1347420160,1347420671,DK
@@ -14847,7 +15051,8 @@
 1347859408,1347859439,DE
 1347859456,1347860863,DE
 1347860880,1347860895,DE
-1347860912,1347861383,DE
+1347860912,1347861391,DE
+1347861408,1347861471,DE
 1347861504,1347861759,DE
 1347861800,1347861823,DE
 1347861944,1347861951,DE
@@ -14862,6 +15067,9 @@
 1347874816,1347878911,RU
 1347878912,1347883007,GB
 1347883008,1347887103,IT
+1347887104,1347891199,PL
+1347891200,1347895295,SE
+1347903488,1347907583,RU
 1347907584,1347911679,DE
 1347911680,1347915775,GB
 1347915776,1347919871,RU
@@ -14878,8 +15086,15 @@
 1347964928,1347969023,IT
 1347969024,1347977215,SE
 1347977216,1347977471,DK
-1347977472,1347977519,NG
-1347977520,1347977791,DK
+1347977472,1347977487,NG
+1347977488,1347977503,DK
+1347977504,1347977511,NG
+1347977512,1347977519,DK
+1347977520,1347977599,MZ
+1347977600,1347977607,DK
+1347977608,1347977623,NG
+1347977624,1347977631,KE
+1347977632,1347977791,DK
 1347977792,1347977919,NG
 1347977920,1347977951,DK
 1347977952,1347977967,NG
@@ -14911,7 +15126,11 @@
 1347978440,1347978463,NG
 1347978464,1347978487,DK
 1347978488,1347978495,YE
-1347978496,1347978679,NG
+1347978496,1347978559,NG
+1347978560,1347978575,DK
+1347978576,1347978663,NG
+1347978664,1347978671,DK
+1347978672,1347978679,NG
 1347978680,1347978687,AO
 1347978688,1347978695,NG
 1347978696,1347978711,AO
@@ -14923,7 +15142,8 @@
 1347978752,1347978759,DK
 1347978760,1347978807,NG
 1347978808,1347978815,UG
-1347978816,1347978831,NG
+1347978816,1347978823,DK
+1347978824,1347978831,NG
 1347978832,1347978847,DK
 1347978848,1347978855,NG
 1347978856,1347978863,IQ
@@ -14957,8 +15177,10 @@
 1347979376,1347979399,NG
 1347979400,1347979407,KM
 1347979408,1347979423,IQ
-1347979424,1347979455,NG
-1347979456,1347979535,DK
+1347979424,1347979471,NG
+1347979472,1347979479,DK
+1347979480,1347979487,NG
+1347979488,1347979535,DK
 1347979536,1347979543,UG
 1347979544,1347979551,NG
 1347979552,1347979559,IQ
@@ -14973,8 +15195,8 @@
 1347979672,1347979679,DK
 1347979680,1347979751,NG
 1347979752,1347979759,AE
-1347979760,1347979775,NG
-1347979776,1347979791,DK
+1347979760,1347979767,NG
+1347979768,1347979791,DK
 1347979792,1347979807,NG
 1347979808,1347979823,DK
 1347979824,1347979831,NG
@@ -15028,7 +15250,7 @@
 1347981888,1347981903,UG
 1347981904,1347981919,AO
 1347981920,1347981935,NG
-1347981936,1347981943,DK
+1347981936,1347981943,CG
 1347981944,1347981959,IQ
 1347981960,1347981983,DK
 1347981984,1347981999,AO
@@ -15056,8 +15278,8 @@
 1347983056,1347983063,SE
 1347983064,1347983071,NG
 1347983072,1347983087,BJ
-1347983088,1347983095,DK
-1347983096,1347983119,NG
+1347983088,1347983103,DK
+1347983104,1347983119,NG
 1347983120,1347983231,IQ
 1347983232,1347983263,DK
 1347983264,1347983271,LS
@@ -15177,6 +15399,7 @@
 1348124672,1348128767,GB
 1348128768,1348132863,SI
 1348132864,1348136959,UA
+1348136960,1348141055,RU
 1348141056,1348145151,DK
 1348145152,1348149247,RU
 1348149248,1348153343,NO
@@ -15245,6 +15468,7 @@
 1348284416,1348288511,RU
 1348288512,1348292607,IT
 1348292608,1348296703,FR
+1348296704,1348300799,RU
 1348300800,1348304895,UA
 1348304896,1348308991,IT
 1348308992,1348313087,MT
@@ -15257,6 +15481,7 @@
 1348341760,1348345855,PL
 1348345856,1348349951,GB
 1348349952,1348354047,SK
+1348354048,1348358143,NL
 1348358144,1348362239,DE
 1348362240,1348366335,MC
 1348366336,1348370431,IT
@@ -15442,9 +15667,7 @@
 1350296544,1350303743,AT
 1350303744,1350434815,FR
 1350434816,1350565887,NL
-1350565888,1351789119,DE
-1351789120,1351789151,BE
-1351789152,1351793791,DE
+1350565888,1351793791,DE
 1351793792,1351793855,GB
 1351793856,1351797231,DE
 1351797232,1351797239,PL
@@ -15452,9 +15675,7 @@
 1351800352,1351800359,CN
 1351800360,1351801327,DE
 1351801328,1351801335,HU
-1351801336,1351807391,DE
-1351807392,1351807423,GR
-1351807424,1351879631,DE
+1351801336,1351879631,DE
 1351879632,1351879639,IT
 1351879640,1351879999,DE
 1351880000,1351880031,IT
@@ -15483,20 +15704,17 @@
 1352147440,1352147447,SZ
 1352147448,1352148151,DE
 1352148152,1352148159,IT
-1352148160,1352271087,DE
+1352148160,1352148751,DE
+1352148752,1352148759,US
+1352148760,1352271087,DE
 1352271088,1352271095,AT
-1352271096,1352271871,DE
-1352271872,1352271903,GB
-1352271904,1352277535,DE
+1352271096,1352277535,DE
 1352277536,1352277567,IT
 1352277568,1352402791,DE
 1352402792,1352402799,BE
 1352402800,1352404599,DE
 1352404600,1352404607,NL
-1352404608,1352404991,DE
-1352404992,1352405055,NL
-1352405056,1352405119,BE
-1352405120,1352663039,DE
+1352404608,1352663039,DE
 1352663040,1353187327,DK
 1353187328,1353255071,GB
 1353255072,1353255087,CA
@@ -15510,105 +15728,171 @@
 1353258368,1353258415,SE
 1353258416,1353258423,GB
 1353258424,1353258503,SE
-1353258504,1353258783,GB
+1353258504,1353258527,GB
+1353258528,1353258543,SE
+1353258544,1353258631,GB
+1353258632,1353258647,SE
+1353258648,1353258783,GB
 1353258784,1353258807,SE
 1353258808,1353266959,GB
 1353266960,1353266975,IE
 1353266976,1353267455,GB
 1353267456,1353267743,IE
 1353267744,1353267751,GB
-1353267752,1353267759,IE
-1353267760,1353268495,GB
-1353268496,1353268511,BE
-1353268512,1353268639,GB
-1353268640,1353268647,BE
-1353268648,1353268663,GB
-1353268664,1353268671,BE
-1353268672,1353268695,GB
-1353268696,1353268711,BE
-1353268712,1353269015,GB
+1353267752,1353267767,IE
+1353267768,1353267775,GB
+1353267776,1353267839,IE
+1353267840,1353267967,GB
+1353267968,1353268223,IE
+1353268224,1353268487,GB
+1353268488,1353268511,BE
+1353268512,1353268559,GB
+1353268560,1353268567,BE
+1353268568,1353268575,GB
+1353268576,1353268583,BE
+1353268584,1353268599,GB
+1353268600,1353268647,BE
+1353268648,1353268655,GB
+1353268656,1353268679,BE
+1353268680,1353268687,GB
+1353268688,1353268735,BE
+1353268736,1353268883,GB
+1353268884,1353268887,BE
+1353268888,1353269015,GB
 1353269016,1353269039,BE
 1353269040,1353269055,GB
-1353269056,1353269079,BE
-1353269080,1353271823,GB
-1353271824,1353271831,ES
-1353271832,1353272071,GB
-1353272072,1353272079,ES
-1353272080,1353272095,GB
-1353272096,1353272111,ES
-1353272112,1353272255,GB
-1353272256,1353272271,ES
-1353272272,1353272655,GB
+1353269056,1353269087,BE
+1353269088,1353271807,GB
+1353271808,1353271831,ES
+1353271832,1353271895,GB
+1353271896,1353271919,ES
+1353271920,1353271927,GB
+1353271928,1353272031,ES
+1353272032,1353272039,FR
+1353272040,1353272055,ES
+1353272056,1353272063,GB
+1353272064,1353272191,ES
+1353272192,1353272207,GB
+1353272208,1353272247,ES
+1353272248,1353272255,GB
+1353272256,1353272303,ES
+1353272304,1353272583,GB
+1353272584,1353272591,ES
+1353272592,1353272599,GB
+1353272600,1353272631,ES
+1353272632,1353272639,GB
+1353272640,1353272647,ES
+1353272648,1353272655,GB
 1353272656,1353272663,ES
-1353272664,1353272767,GB
+1353272664,1353272687,GB
+1353272688,1353272691,ES
+1353272692,1353272703,GB
+1353272704,1353272711,ES
+1353272712,1353272719,GB
+1353272720,1353272727,ES
+1353272728,1353272767,GB
 1353272768,1353272775,ES
-1353272776,1353273343,GB
-1353273344,1353273599,BE
-1353273600,1353273663,GB
-1353273664,1353273695,BE
-1353273696,1353274631,GB
-1353274632,1353274639,ES
-1353274640,1353274647,GB
-1353274648,1353274655,ES
-1353274656,1353274719,GB
+1353272776,1353272815,GB
+1353272816,1353272823,ES
+1353272824,1353272831,GB
+1353272832,1353272839,ES
+1353272840,1353272967,GB
+1353272968,1353272975,ES
+1353272976,1353272991,GB
+1353272992,1353272999,ES
+1353273000,1353273039,GB
+1353273040,1353273047,ES
+1353273048,1353273343,GB
+1353273344,1353273607,BE
+1353273608,1353273623,GB
+1353273624,1353273647,BE
+1353273648,1353273663,GB
+1353273664,1353273711,BE
+1353273712,1353273719,GB
+1353273720,1353273727,BE
+1353273728,1353274623,GB
+1353274624,1353274655,ES
+1353274656,1353274663,GB
+1353274664,1353274671,ES
+1353274672,1353274719,GB
 1353274720,1353274751,ES
 1353274752,1353274783,GB
-1353274784,1353274791,ES
-1353274792,1353274855,GB
+1353274784,1353274799,ES
+1353274800,1353274831,GB
+1353274832,1353274839,ES
+1353274840,1353274855,GB
 1353274856,1353274863,ES
-1353274864,1353274935,GB
-1353274936,1353274943,ES
+1353274864,1353274879,GB
+1353274880,1353274887,ES
+1353274888,1353274911,GB
+1353274912,1353274919,ES
+1353274920,1353274927,GB
+1353274928,1353274943,ES
 1353274944,1353275039,GB
-1353275040,1353275055,ES
-1353275056,1353275279,GB
+1353275040,1353275063,ES
+1353275064,1353275103,GB
+1353275104,1353275111,ES
+1353275112,1353275119,GB
+1353275120,1353275159,ES
+1353275160,1353275167,GB
+1353275168,1353275231,ES
+1353275232,1353275279,GB
 1353275280,1353275287,ES
 1353275288,1353275295,GB
-1353275296,1353275327,ES
-1353275328,1353275343,GB
-1353275344,1353275359,ES
-1353275360,1353277439,GB
+1353275296,1353275335,ES
+1353275336,1353275343,GB
+1353275344,1353275391,ES
+1353275392,1353277439,GB
 1353277440,1353279487,CH
-1353279488,1353279679,GB
-1353279680,1353279719,IT
-1353279720,1353279791,GB
-1353279792,1353279799,IT
-1353279800,1353279839,GB
-1353279840,1353279847,IT
-1353279848,1353279871,GB
-1353279872,1353279935,IT
-1353279936,1353280047,GB
-1353280048,1353280079,IT
-1353280080,1353280087,GB
-1353280088,1353280103,IT
+1353279488,1353279495,GB
+1353279496,1353279735,IT
+1353279736,1353279751,GB
+1353279752,1353279759,IT
+1353279760,1353279791,GB
+1353279792,1353279999,IT
+1353280000,1353280007,GB
+1353280008,1353280031,IT
+1353280032,1353280039,GB
+1353280040,1353280103,IT
 1353280104,1353280111,GB
-1353280112,1353280159,IT
-1353280160,1353280215,GB
-1353280216,1353280231,IT
-1353280232,1353280255,GB
-1353280256,1353280271,IT
-1353280272,1353280279,GB
-1353280280,1353280287,IT
-1353280288,1353280375,GB
-1353280376,1353280383,IT
-1353280384,1353280431,GB
-1353280432,1353280439,IT
-1353280440,1353280479,GB
+1353280112,1353280303,IT
+1353280304,1353280335,GB
+1353280336,1353280383,IT
+1353280384,1353280391,GB
+1353280392,1353280471,IT
+1353280472,1353280479,GB
 1353280480,1353280487,IT
-1353280488,1353280519,GB
-1353280520,1353280527,IT
-1353280528,1353280543,GB
-1353280544,1353280575,IT
-1353280576,1353280663,GB
-1353280664,1353280679,IT
-1353280680,1353281343,GB
-1353281344,1353281359,BE
-1353281360,1353282143,GB
-1353282144,1353282159,IT
-1353282160,1353287327,GB
+1353280488,1353280495,GB
+1353280496,1353280623,IT
+1353280624,1353280631,GB
+1353280632,1353280639,IT
+1353280640,1353280647,GB
+1353280648,1353280655,IT
+1353280656,1353280663,GB
+1353280664,1353280687,IT
+1353280688,1353280703,GB
+1353280704,1353281023,IT
+1353281024,1353281279,GB
+1353281280,1353281535,BE
+1353281536,1353282047,GB
+1353282048,1353282111,IT
+1353282112,1353282119,GB
+1353282120,1353282239,IT
+1353282240,1353282247,GB
+1353282248,1353282255,IT
+1353282256,1353282263,GB
+1353282264,1353282287,IT
+1353282288,1353282295,GB
+1353282296,1353282303,IT
+1353282304,1353287327,GB
 1353287328,1353287359,IE
-1353287360,1353287967,GB
-1353287968,1353287999,IE
-1353288000,1353288079,GB
+1353287360,1353287935,GB
+1353287936,1353287951,IE
+1353287952,1353287959,GB
+1353287960,1353288031,IE
+1353288032,1353288063,GB
+1353288064,1353288071,IE
+1353288072,1353288079,GB
 1353288080,1353288151,IE
 1353288152,1353288191,GB
 1353288192,1353288231,IE
@@ -15618,23 +15902,33 @@
 1353288408,1353288431,IE
 1353288432,1353288447,GB
 1353288448,1353288511,IE
-1353288512,1353288543,GB
-1353288544,1353288655,IE
+1353288512,1353288527,GB
+1353288528,1353288655,IE
 1353288656,1353288663,GB
 1353288664,1353288687,IE
-1353288688,1353288959,GB
+1353288688,1353288703,GB
+1353288704,1353288831,IE
+1353288832,1353288959,GB
 1353288960,1353289343,IE
 1353289344,1353289351,GB
 1353289352,1353289359,IE
 1353289360,1353289367,GB
 1353289368,1353289375,IE
-1353289376,1353289615,GB
-1353289616,1353289623,IE
+1353289376,1353289383,GB
+1353289384,1353289391,IE
+1353289392,1353289415,GB
+1353289416,1353289423,IE
+1353289424,1353289431,GB
+1353289432,1353289471,IE
+1353289472,1353289599,GB
+1353289600,1353289623,IE
 1353289624,1353289631,GB
 1353289632,1353289647,IE
 1353289648,1353290751,GB
 1353290752,1353290815,DE
-1353290816,1353297151,GB
+1353290816,1353290927,GB
+1353290928,1353290935,IE
+1353290936,1353297151,GB
 1353297152,1353297183,IE
 1353297184,1353298687,GB
 1353298688,1353298695,SE
@@ -15650,9 +15944,13 @@
 1353299616,1353299631,SE
 1353299632,1353299647,GB
 1353299648,1353299711,SE
-1353299712,1353299871,GB
-1353299872,1353299879,SE
-1353299880,1353299967,GB
+1353299712,1353299839,GB
+1353299840,1353299847,SE
+1353299848,1353299863,GB
+1353299864,1353299879,SE
+1353299880,1353299887,GB
+1353299888,1353299911,SE
+1353299912,1353299967,GB
 1353299968,1353300031,SE
 1353300032,1353300039,GB
 1353300040,1353300047,SE
@@ -15666,12 +15964,32 @@
 1353300368,1353300383,SE
 1353300384,1353301095,GB
 1353301096,1353301103,US
-1353301104,1353306111,GB
+1353301104,1353304879,GB
+1353304880,1353304895,ES
+1353304896,1353305599,GB
+1353305600,1353305607,IE
+1353305608,1353306111,GB
 1353306112,1353306623,ES
 1353306624,1353306880,BE
 1353306881,1353308159,GB
 1353308160,1353309183,FR
-1353309184,1353317375,GB
+1353309184,1353310471,GB
+1353310472,1353310479,ES
+1353310480,1353310495,GB
+1353310496,1353310527,ES
+1353310528,1353310543,GB
+1353310544,1353310559,ES
+1353310560,1353310583,GB
+1353310584,1353310591,ES
+1353310592,1353310975,GB
+1353310976,1353311023,IT
+1353311024,1353311087,GB
+1353311088,1353311095,IT
+1353311096,1353311103,GB
+1353311104,1353311119,IT
+1353311120,1353312255,GB
+1353312256,1353312767,CH
+1353312768,1353317375,GB
 1353317376,1353317631,FR
 1353317632,1353318399,GB
 1353318400,1353383935,FR
@@ -15750,9 +16068,7 @@
 1354681248,1354681279,DK
 1354681280,1354681471,DE
 1354681472,1354681487,AE
-1354681488,1354681503,DE
-1354681504,1354681511,US
-1354681512,1354682111,DE
+1354681488,1354682111,DE
 1354682112,1354682143,DK
 1354682144,1354682175,CH
 1354682176,1354682287,DE
@@ -15773,9 +16089,7 @@
 1354684672,1354684927,AE
 1354684928,1354687023,DE
 1354687024,1354687031,LU
-1354687032,1354687231,DE
-1354687232,1354687247,CH
-1354687248,1354687359,DE
+1354687032,1354687359,DE
 1354687360,1354687375,NZ
 1354687376,1354687383,DE
 1354687384,1354687391,NZ
@@ -15827,11 +16141,11 @@
 1357318144,1357320191,QA
 1357320192,1357320703,FR
 1357320704,1357320959,RO
+1357320960,1357320991,ES
 1357320992,1357320999,GB
 1357321000,1357321007,FR
 1357321008,1357321015,GB
 1357321016,1357321023,DK
-1357321024,1357321087,GB
 1357321088,1357321215,LB
 1357321216,1357321471,GB
 1357321472,1357321503,ES
@@ -15852,8 +16166,6 @@
 1357332480,1357333247,DE
 1357333248,1357333503,GB
 1357333504,1357333759,IR
-1357333760,1357333823,GB
-1357333824,1357333855,GE
 1357333856,1357334527,ES
 1357334528,1357335039,FR
 1357335040,1357335295,LB
@@ -15899,7 +16211,7 @@
 1357365888,1357365951,DE
 1357365952,1357366015,GB
 1357366016,1357366271,KM
-1357366272,1357366527,KE
+1357366272,1357366527,FR
 1357366528,1357366591,BE
 1357366592,1357366655,FR
 1357366656,1357366719,PT
@@ -15952,7 +16264,7 @@
 1357873152,1357875199,DE
 1357875200,1357875215,AT
 1357875216,1357875223,DE
-1357875232,1357875263,DE
+1357875232,1357875247,DE
 1357875264,1357875279,AT
 1357875280,1357875423,DE
 1357875424,1357875439,GB
@@ -15961,7 +16273,6 @@
 1357875968,1357876143,DE
 1357876152,1357876191,DE
 1357876208,1357876215,DE
-1357876272,1357876279,PL
 1357876288,1357876303,PL
 1357876336,1357876339,PL
 1357876392,1357876399,PL
@@ -15969,8 +16280,8 @@
 1357876480,1357876495,SE
 1357876608,1357876863,DE
 1357876864,1357876927,SE
-1357876992,1357877759,DE
-1357878272,1357879551,DE
+1357876928,1357877759,DE
+1357878272,1357879807,DE
 1357879808,1357879871,RU
 1357879872,1357879935,DE
 1357880448,1357880511,CH
@@ -15983,7 +16294,7 @@
 1357883392,1357883407,ES
 1357883424,1357883519,FR
 1357883536,1357883551,FR
-1357883648,1357883719,FR
+1357883584,1357883719,FR
 1357883760,1357883807,FR
 1357883840,1357883951,FR
 1357884000,1357884031,FR
@@ -16010,21 +16321,18 @@
 1357892096,1357893119,NL
 1357893408,1357893439,SE
 1357893504,1357893631,DE
-1357897856,1357897887,DE
-1357897920,1357898495,DE
+1357897856,1357898495,DE
 1357898752,1357898879,DE
 1357899008,1357899015,DE
 1357899024,1357899263,DE
-1357899296,1357899311,US
 1357899552,1357899567,AT
 1357899776,1357900287,DE
 1357900416,1357900543,SE
 1357900544,1357900799,NL
 1357900800,1357901311,DE
 1357901568,1357901823,DE
+1357901824,1357902335,ES
 1357903616,1357903871,SE
-1357903872,1357904895,GB
-1357904896,1357905919,DE
 1357905920,1357910015,LT
 1357910016,1357914111,GR
 1357914112,1357922303,RU
@@ -16055,9 +16363,10 @@
 1358024704,1358028799,EE
 1358028800,1358032895,IT
 1358032896,1358036991,GE
+1358036992,1358041087,IR
+1358041088,1358045183,FI
 1358045184,1358049279,SK
 1358049280,1358061567,RU
-1358061568,1358065663,NL
 1358065664,1358069759,BA
 1358069760,1358074719,DE
 1358074720,1358074751,CH
@@ -16065,7 +16374,6 @@
 1358082816,1358083071,CH
 1358083072,1358086143,DE
 1358086144,1358090239,CH
-1358090240,1358094335,BE
 1358094336,1358102527,NL
 1358102528,1358106623,RU
 1358106624,1358110719,LT
@@ -16074,6 +16382,7 @@
 1358116912,1358118911,DE
 1358118912,1358123007,RU
 1358123008,1358127103,PT
+1358127104,1358131199,CZ
 1358131200,1358135295,DK
 1358135296,1358139391,DE
 1358139392,1358143487,UA
@@ -16106,15 +16415,17 @@
 1358223912,1358223927,NL
 1358223928,1358223967,DE
 1358223968,1358224039,NL
-1358224040,1358224611,DE
+1358224040,1358224511,DE
+1358224512,1358224519,BE
+1358224520,1358224611,DE
 1358224612,1358224651,BE
 1358224652,1358224655,DE
 1358224656,1358224719,BE
 1358224720,1358224927,DE
 1358224928,1358224979,IT
 1358224980,1358224983,DE
-1358224984,1358225047,IT
-1358225048,1358225407,DE
+1358224984,1358225055,IT
+1358225056,1358225407,DE
 1358225408,1358229503,RU
 1358229504,1358229631,DE
 1358229632,1358229639,LU
@@ -16123,11 +16434,7 @@
 1358230116,1358230383,DE
 1358230384,1358230391,US
 1358230392,1358230399,CH
-1358230400,1358231593,DE
-1358231594,1358231594,US
-1358231595,1358232703,DE
-1358232704,1358232831,AT
-1358232832,1358232863,DE
+1358230400,1358232863,DE
 1358232864,1358232879,IT
 1358232880,1358233599,DE
 1358233600,1358237695,ES
@@ -16155,9 +16462,10 @@
 1358278656,1358282751,PL
 1358282752,1358286847,AT
 1358286848,1358290943,MT
+1358290944,1358295039,SE
 1358295040,1358299135,RU
 1358303232,1358307327,RU
-1358307328,1358311423,DE
+1358307328,1358315519,DE
 1358315520,1358323711,RU
 1358323712,1358327807,LU
 1358327808,1358328671,DE
@@ -16165,7 +16473,7 @@
 1358328728,1358331903,DE
 1358331904,1358335999,IL
 1358336000,1358344191,FI
-1358348288,1358352383,NL
+1358344192,1358352383,NL
 1358352384,1358356479,RU
 1358356480,1358360575,SI
 1358360576,1358364671,RU
@@ -16325,39 +16633,33 @@
 1358647296,1358651391,DE
 1358651392,1358655487,FR
 1358655488,1358667775,RU
-1358667776,1358668063,PT
+1358667776,1358668039,PT
+1358668040,1358668047,GB
+1358668048,1358668063,PT
 1358668064,1358668095,GB
-1358668096,1358668103,PT
-1358668104,1358668127,GB
-1358668128,1358668211,PT
+1358668096,1358668211,PT
 1358668212,1358668223,GB
 1358668224,1358668231,PT
 1358668232,1358668239,GB
 1358668240,1358668263,PT
 1358668264,1358668279,GB
 1358668280,1358668359,PT
-1358668360,1358668383,GB
-1358668384,1358668399,PT
-1358668400,1358668415,GB
-1358668416,1358668463,PT
+1358668360,1358668367,GB
+1358668368,1358668463,PT
 1358668464,1358668479,ES
 1358668480,1358668551,PT
 1358668552,1358668567,GB
 1358668568,1358668575,PT
 1358668576,1358668591,GB
-1358668592,1358668607,PT
-1358668608,1358668639,GB
-1358668640,1358668799,PT
-1358668800,1358668831,GB
-1358668832,1358668895,PT
-1358668896,1358669055,GB
-1358669056,1358669351,PT
+1358668592,1358668735,PT
+1358668736,1358668807,GB
+1358668808,1358668815,PT
+1358668816,1358668831,GB
+1358668832,1358669351,PT
 1358669352,1358669359,GB
-1358669360,1358669375,PT
-1358669376,1358669383,GB
-1358669384,1358669399,PT
-1358669400,1358669423,GB
-1358669424,1358669503,PT
+1358669360,1358669399,PT
+1358669400,1358669407,GB
+1358669408,1358669503,PT
 1358669504,1358669519,GB
 1358669520,1358669543,PT
 1358669544,1358669551,GB
@@ -16467,9 +16769,7 @@
 1358787336,1358787359,IE
 1358787360,1358789167,GB
 1358789168,1358789183,IE
-1358789184,1358790655,GB
-1358790656,1358798847,IR
-1358798848,1358799359,GB
+1358789184,1358799359,GB
 1358799360,1358802943,HR
 1358802944,1358807039,HU
 1358807040,1358811135,RU
@@ -16500,6 +16800,7 @@
 1358876672,1358880767,LV
 1358880768,1358884863,GB
 1358884864,1358888959,SE
+1358888960,1358893055,DE
 1358893056,1358897151,RU
 1358897152,1358897183,US
 1358897184,1358897199,DE
@@ -16658,7 +16959,11 @@
 1358946304,1358950399,LV
 1358950400,1358954495,NL
 1358954496,1358970879,ES
-1358970880,1358987263,HU
+1358970880,1358984191,HU
+1358984192,1358984703,SK
+1358984704,1358986239,HU
+1358986240,1358986495,SK
+1358986496,1358987263,HU
 1358987264,1359003647,NO
 1359003648,1359020031,CZ
 1359020032,1359036415,FR
@@ -16692,7 +16997,7 @@
 1359349360,1359364095,CH
 1359364096,1359380479,TR
 1359380480,1359396863,PL
-1359396864,1359429631,GB
+1359396864,1359413247,GB
 1359429632,1359446015,LT
 1359446016,1359462399,DK
 1359462400,1359467063,DE
@@ -16831,6 +17136,7 @@
 1360240640,1360244735,ES
 1360244736,1360257023,GB
 1360257024,1360265215,DK
+1360265216,1360269311,GB
 1360269312,1360273407,KG
 1360273408,1360281599,GB
 1360281600,1360285695,NL
@@ -16910,7 +17216,10 @@
 1360613376,1360617471,SE
 1360617472,1360621567,IT
 1360621568,1360625663,ES
-1360625664,1360629759,DE
+1360625664,1360628735,DE
+1360628736,1360628991,IQ
+1360628992,1360629503,DE
+1360629504,1360629759,IQ
 1360629760,1360633855,SE
 1360633856,1360637951,RU
 1360637952,1360642047,FO
@@ -17048,11 +17357,10 @@
 1360991744,1360991999,GB
 1360992000,1360992255,SK
 1360992256,1360992767,CZ
-1360992768,1360993023,GB
-1360993024,1360994047,SK
-1360994048,1360994303,GB
+1360992768,1360994303,GB
 1360994304,1360998399,CZ
 1360998400,1361002495,FI
+1361002496,1361006591,GB
 1361006592,1361010687,DK
 1361010688,1361018879,GB
 1361018880,1361022975,AT
@@ -17410,8 +17718,8 @@
 1362411520,1362413273,MQ
 1362413274,1362413567,FR
 1362413568,1362413587,CM
-1362413588,1362413823,FR
-1362413824,1362414847,US
+1362413588,1362414079,FR
+1362414080,1362414847,US
 1362414848,1362415103,GB
 1362415104,1362415359,FR
 1362415360,1362415615,DE
@@ -17427,8 +17735,8 @@
 1362426624,1362426879,FR
 1362426880,1362427903,MQ
 1362427904,1362755583,FR
-1362755584,1362817047,NL
-1362817048,1362817063,BE
+1362755584,1362817055,NL
+1362817056,1362817063,BE
 1362817064,1362817071,NL
 1362817072,1362817087,BE
 1362817088,1362817127,NL
@@ -17498,9 +17806,17 @@
 1364526592,1364528639,GB
 1364528640,1364528895,UA
 1364528896,1364530175,GB
-1364530176,1364540671,NL
+1364530176,1364539903,NL
+1364539904,1364540159,US
+1364540160,1364540671,NL
 1364540672,1364540927,US
-1364540928,1364590591,NL
+1364540928,1364582415,NL
+1364582416,1364582431,LB
+1364582432,1364585983,NL
+1364585984,1364586240,LB
+1364586241,1364586495,NL
+1364586496,1364586752,LB
+1364586753,1364590591,NL
 1364590592,1364721663,GB
 1364721664,1364725759,SE
 1364725760,1364733951,DE
@@ -17599,8 +17915,7 @@
 1365004088,1365004095,SE
 1365004096,1365004207,GB
 1365004208,1365004223,SE
-1365004224,1365004271,GB
-1365004272,1365004287,SE
+1365004224,1365004287,GB
 1365004288,1365008383,FR
 1365008384,1365012479,CH
 1365012480,1365016575,FR
@@ -17656,8 +17971,8 @@
 1365096768,1365097215,FR
 1365097216,1365097471,ES
 1365097472,1365097727,FR
-1365097728,1365097935,CH
-1365097936,1365098495,FR
+1365097728,1365097983,CH
+1365097984,1365098495,FR
 1365098496,1365102591,HU
 1365102592,1365102911,ES
 1365102912,1365102919,GB
@@ -17673,7 +17988,9 @@
 1365103776,1365103791,GB
 1365103792,1365103871,ES
 1365103872,1365104135,GB
-1365104136,1365104735,ES
+1365104136,1365104199,ES
+1365104200,1365104207,GB
+1365104208,1365104735,ES
 1365104736,1365104743,GB
 1365104744,1365105151,ES
 1365105152,1365105215,GB
@@ -17785,9 +18102,7 @@
 1371602944,1371668479,PT
 1371668480,1371734015,FR
 1371734016,1371799551,RU
-1371799552,1371834367,RO
-1371834368,1371836415,HU
-1371836416,1371865087,RO
+1371799552,1371865087,RO
 1371865088,1371930623,FI
 1371930624,1371996159,LV
 1371996160,1371997183,IL
@@ -17941,8 +18256,7 @@
 1372687360,1372687711,DE
 1372687720,1372687727,DE
 1372687736,1372688199,DE
-1372688224,1372688319,DE
-1372688352,1372689791,DE
+1372688224,1372689823,DE
 1372689920,1372691455,DE
 1372691456,1372691711,US
 1372691968,1372694015,DE
@@ -17998,15 +18312,9 @@
 1379926016,1380188159,FR
 1380188160,1380450303,GB
 1380450304,1380712447,NL
-1380712448,1380802559,RO
-1380802560,1380804607,HU
-1380804608,1380903935,RO
+1380712448,1380903935,RO
 1380903936,1380904447,SK
-1380904448,1380935679,RO
-1380935680,1380937727,HU
-1380937728,1380950527,RO
-1380950528,1380951039,HU
-1380951040,1380974591,RO
+1380904448,1380974591,RO
 1380974592,1381105663,IL
 1381105664,1381236735,DE
 1381236736,1381367807,IT
@@ -18233,22 +18541,25 @@
 1383449376,1383449391,RS
 1383449392,1383449395,CS
 1383449396,1383449471,RS
-1383449472,1383449503,CS
+1383449472,1383449487,CS
+1383449488,1383449495,RS
+1383449496,1383449503,CS
 1383449504,1383449551,RS
 1383449552,1383449599,CS
 1383449600,1383450751,RS
 1383450752,1383450767,CS
 1383450768,1383450783,RS
 1383450784,1383450799,CS
-1383450800,1383452159,RS
-1383452160,1383452191,CS
+1383450800,1383452175,RS
+1383452176,1383452191,CS
 1383452192,1383452255,RS
 1383452256,1383452295,CS
 1383452296,1383452351,RS
 1383452352,1383452375,CS
-1383452376,1383452399,RS
-1383452400,1383452415,CS
+1383452376,1383452407,RS
+1383452408,1383452415,CS
 1383452416,1383456767,RS
+1383456768,1383464959,UA
 1383464960,1383473151,US
 1383473152,1383481343,DE
 1383481344,1383481599,GB
@@ -18332,16 +18643,17 @@
 1384195744,1384195751,CH
 1384195752,1384195775,DE
 1384195776,1384195839,SE
-1384195840,1384218623,DE
+1384195840,1384196095,DE
+1384196096,1384197119,CZ
+1384197120,1384218623,DE
 1384251392,1384267775,FI
 1384267776,1384284159,CH
 1384284160,1384316927,ES
 1384316928,1384349695,EE
 1384349696,1384382463,HU
+1384382464,1384415231,HR
 1384415232,1384415743,DE
-1384415744,1384418047,GB
-1384418048,1384418303,DE
-1384418304,1384419071,GB
+1384415744,1384419071,GB
 1384419072,1384419583,DE
 1384419584,1384419839,GB
 1384419840,1384420351,DE
@@ -18363,11 +18675,7 @@
 1384660992,1384677375,CH
 1384677376,1384693759,SE
 1384693760,1384710143,NL
-1384710144,1384711423,RO
-1384711424,1384712191,HU
-1384712192,1384714239,RO
-1384714240,1384715263,HU
-1384715264,1384726527,RO
+1384710144,1384726527,RO
 1384726528,1384742911,BG
 1384742912,1384759295,RU
 1384759296,1384775679,SY
@@ -18390,7 +18698,9 @@
 1384795280,1384795327,BE
 1384795328,1384801023,FR
 1384801024,1384801087,SM
-1384801088,1384808447,FR
+1384801088,1384802495,FR
+1384802496,1384802559,IT
+1384802560,1384808447,FR
 1384808960,1384808967,DE
 1384808968,1384808975,SE
 1384808976,1384808991,DE
@@ -18431,6 +18741,7 @@
 1385177088,1385185279,DE
 1385185280,1385193471,RU
 1385193472,1385201663,ES
+1385201664,1385209855,CZ
 1385209856,1385218047,HU
 1385218048,1385226239,UA
 1385226240,1385234431,GB
@@ -18489,7 +18800,7 @@
 1385559296,1385560831,DE
 1385560832,1385561087,SK
 1385561088,1385562111,DE
-1385562112,1385563135,ES
+1385562624,1385563135,ES
 1385563136,1385563391,IE
 1385563648,1385563935,IE
 1385564032,1385564095,IE
@@ -18497,13 +18808,12 @@
 1385564160,1385564223,HU
 1385564384,1385564671,HU
 1385565184,1385565439,ES
-1385566208,1385566415,FR
-1385566432,1385566719,FR
-1385566784,1385566847,FR
+1385566208,1385566399,FR
+1385566432,1385566847,FR
 1385566880,1385566911,FR
 1385566928,1385566935,FR
 1385566944,1385566991,FR
-1385566996,1385566999,FR
+1385566996,1385567007,FR
 1385567088,1385567103,FR
 1385567120,1385567151,FR
 1385567160,1385567215,FR
@@ -18532,7 +18842,6 @@
 1385652224,1385660415,RU
 1385660416,1385668607,TR
 1385668608,1385676799,NL
-1385676800,1385684991,ES
 1385684992,1385824255,GB
 1385824256,1385955327,PT
 1385955328,1386086399,NL
@@ -18649,7 +18958,9 @@
 1388683264,1388691455,CH
 1388691456,1388699647,NL
 1388699648,1388707839,SE
-1388707840,1388712959,RU
+1388707840,1388708863,RU
+1388708864,1388709119,LB
+1388709120,1388712959,RU
 1388712960,1388713215,LB
 1388713216,1388713727,TJ
 1388713728,1388713983,LB
@@ -18693,17 +19004,11 @@
 1388789760,1388797951,NL
 1388797952,1388806143,RU
 1388806144,1388814335,NL
-1388814336,1388814591,AX
-1388814592,1388814751,FI
-1388814752,1388814783,AX
-1388814784,1388814847,FI
-1388814848,1388815103,AX
-1388815104,1388815871,FI
-1388815872,1388818687,AX
+1388814336,1388815103,AX
+1388815104,1388815231,FI
+1388815232,1388818687,AX
 1388818688,1388818815,FI
-1388818816,1388819199,AX
-1388819200,1388819231,FI
-1388819232,1388821119,AX
+1388818816,1388821119,AX
 1388821120,1388821150,SE
 1388821151,1388821247,AX
 1388821248,1388822527,SE
@@ -19008,7 +19313,8 @@
 1389273600,1389273855,MG
 1389273856,1389274111,NG
 1389274112,1389274367,GB
-1389274368,1389274399,US
+1389274368,1389274383,US
+1389274384,1389274399,SA
 1389274400,1389274431,GH
 1389274432,1389274494,US
 1389274495,1389274495,GB
@@ -19026,8 +19332,8 @@
 1389275840,1389275902,SA
 1389275903,1389275903,GB
 1389275904,1389276415,US
-1389276416,1389276543,MX
-1389276544,1389277055,GB
+1389276416,1389276671,MX
+1389276672,1389277055,GB
 1389277056,1389277183,MX
 1389277184,1389277439,GB
 1389277440,1389277567,NP
@@ -19091,12 +19397,11 @@
 1389363200,1389379583,CZ
 1389379584,1389395967,RU
 1389395968,1389412351,RO
-1389412352,1389413375,CS
+1389412352,1389412607,RS
+1389412608,1389413375,CS
 1389413376,1389413407,RS
 1389413408,1389413631,CS
-1389413632,1389415167,RS
-1389415168,1389415423,CS
-1389415424,1389415427,RS
+1389413632,1389415427,RS
 1389415428,1389415431,CS
 1389415432,1389415439,RS
 1389415440,1389415679,CS
@@ -19104,10 +19409,14 @@
 1389416704,1389419775,CS
 1389419776,1389420543,RS
 1389420544,1389421055,CS
-1389421056,1389421311,RS
-1389421312,1389423871,CS
+1389421056,1389422591,RS
+1389422592,1389423359,CS
+1389423360,1389423615,RS
+1389423616,1389423871,CS
 1389423872,1389424383,RS
-1389424384,1389428735,CS
+1389424384,1389426175,CS
+1389426176,1389426687,RS
+1389426688,1389428735,CS
 1389428736,1389445119,CZ
 1389445120,1389461503,GB
 1389461504,1389477887,SE
@@ -19170,7 +19479,9 @@
 1389953024,1390018559,NL
 1390018560,1390084095,AT
 1390084096,1390149631,GB
-1390149632,1390215167,CH
+1390149632,1390153999,CH
+1390154000,1390154015,US
+1390154016,1390215167,CH
 1390215168,1390280703,IS
 1390280704,1390346239,TR
 1390346240,1390394367,ES
@@ -19249,7 +19560,11 @@
 1398973952,1398974207,IE
 1398974208,1398979583,NL
 1398979584,1398979839,GB
-1398979840,1398983423,NL
+1398979840,1398980873,NL
+1398980874,1398980881,US
+1398980882,1398982143,NL
+1398982144,1398982399,US
+1398982400,1398983423,NL
 1398983424,1398983487,GB
 1398983488,1398983519,JE
 1398983520,1398983551,GB
@@ -19273,7 +19588,7 @@
 1400111104,1400373247,NL
 1400373248,1400716287,DE
 1400717312,1400718335,DE
-1400718848,1400723455,DE
+1400718848,1400721407,DE
 1400725504,1400730639,DE
 1400731136,1400733695,DE
 1400897536,1400963071,NL
@@ -19307,6 +19622,7 @@
 1401427968,1401430015,RU
 1401430016,1401432063,AT
 1401432064,1401434111,IE
+1401434112,1401436159,RU
 1401436160,1401438207,BH
 1401438208,1401440255,GB
 1401440256,1401443487,DE
@@ -19327,6 +19643,8 @@
 1401468928,1401470975,ES
 1401470976,1401473023,NL
 1401473024,1401475071,CZ
+1401475072,1401477119,FR
+1401477120,1401479167,BE
 1401479168,1401481215,PL
 1401481216,1401485311,RU
 1401485312,1401486095,IT
@@ -19345,6 +19663,7 @@
 1401509888,1401511935,UA
 1401511936,1401513983,DE
 1401513984,1401516031,IT
+1401516032,1401518079,AT
 1401518080,1401520127,IT
 1401520128,1401522175,GB
 1401522176,1401526271,NL
@@ -19374,6 +19693,7 @@
 1401602048,1401618431,ES
 1401618432,1401634815,AM
 1401634816,1401651199,HR
+1401651200,1401667583,RU
 1401667584,1401683967,IT
 1401683968,1401684479,SE
 1401684480,1401684511,DK
@@ -19421,9 +19741,13 @@
 1401745920,1401745935,DE
 1401745936,1401746175,SE
 1401746176,1401746191,DK
-1401746192,1401746431,SE
+1401746192,1401746215,SE
+1401746216,1401746223,GB
+1401746224,1401746431,SE
 1401746432,1401746447,NL
-1401746448,1401746687,SE
+1401746448,1401746471,SE
+1401746472,1401746479,GB
+1401746480,1401746687,SE
 1401746688,1401746703,NO
 1401746704,1401746943,SE
 1401746944,1401746959,FR
@@ -19472,7 +19796,6 @@
 1401882624,1401884671,NG
 1401884672,1401886719,FR
 1401886720,1401888767,BW
-1401888768,1401890815,RO
 1401890816,1401892863,PL
 1401892864,1401894911,RU
 1401894912,1401896959,FI
@@ -19481,7 +19804,7 @@
 1401901056,1401903103,NO
 1401903104,1401905151,FI
 1401905152,1401907199,PL
-1401907200,1401909247,FR
+1401907200,1401909247,GR
 1401909248,1401911295,NO
 1401911296,1401913343,DK
 1401913344,1401917439,PL
@@ -19534,156 +19857,26 @@
 1402408960,1402413055,DE
 1402413056,1402417151,PL
 1402417152,1402421247,DE
-1402421248,1402421248,GB
-1402421249,1402421249,FR
-1402421250,1402421253,GB
-1402421254,1402421255,FR
-1402421256,1402421256,GB
-1402421257,1402421268,FR
-1402421269,1402421275,GB
-1402421276,1402421279,FR
-1402421280,1402421287,GB
-1402421288,1402421311,FR
-1402421312,1402421315,BE
-1402421316,1402421327,GB
-1402421328,1402421359,FR
-1402421360,1402421375,GB
-1402421376,1402421407,FR
-1402421408,1402421415,GB
-1402421416,1402421455,FR
-1402421456,1402421459,HR
-1402421460,1402421463,FR
-1402421464,1402421471,AT
-1402421472,1402421487,FR
-1402421488,1402421505,GB
-1402421506,1402421506,FR
-1402421507,1402421507,GB
-1402421508,1402421509,FR
-1402421510,1402421511,GB
-1402421512,1402421512,CH
-1402421513,1402421513,FR
-1402421514,1402421514,GB
-1402421515,1402421519,FR
-1402421520,1402421551,GB
-1402421552,1402421735,FR
-1402421736,1402421743,NL
-1402421744,1402421927,FR
-1402421928,1402421935,ES
-1402421936,1402421950,FR
-1402421951,1402421951,GB
-1402421952,1402421967,FR
-1402421968,1402421971,GB
-1402421972,1402421991,FR
-1402421992,1402421995,GB
-1402421996,1402422087,FR
-1402422088,1402422095,BE
-1402422096,1402422103,FR
-1402422104,1402422111,GB
-1402422112,1402422115,FR
-1402422116,1402422119,CH
-1402422120,1402422127,PT
-1402422128,1402422159,FR
-1402422160,1402422167,AT
-1402422168,1402422271,FR
-1402422272,1402422743,GB
-1402422744,1402422747,FR
-1402422748,1402422783,GB
-1402422784,1402422787,LU
-1402422788,1402422791,FR
-1402422792,1402423295,GB
-1402423296,1402423379,BE
-1402423380,1402423383,LU
-1402423384,1402425347,GB
-1402425348,1402425351,FR
-1402425352,1402425855,GB
-1402425856,1402425871,BE
-1402425872,1402425935,FR
-1402425936,1402426879,GB
-1402426880,1402426883,CH
-1402426884,1402427175,GB
-1402427176,1402427179,FR
-1402427180,1402427183,GB
-1402427184,1402427191,FR
-1402427192,1402427195,CH
-1402427196,1402427231,GB
-1402427232,1402427239,CH
-1402427240,1402427263,GB
-1402427264,1402427267,FR
-1402427268,1402427271,GB
-1402427272,1402427335,FR
-1402427336,1402427343,GB
-1402427344,1402427359,FR
-1402427360,1402427393,GB
-1402427394,1402427394,CH
-1402427395,1402427655,GB
-1402427656,1402427663,FR
-1402427664,1402427671,GB
-1402427672,1402427679,NL
-1402427680,1402427719,GB
-1402427720,1402427727,US
-1402427728,1402427903,GB
-1402427904,1402427935,FR
-1402427936,1402427951,GB
-1402427952,1402427959,FR
-1402427960,1402427967,GB
-1402427968,1402427975,FR
-1402427976,1402427983,GB
-1402427984,1402427999,FR
-1402428000,1402428019,GB
-1402428020,1402428023,FR
-1402428024,1402428031,AT
-1402428032,1402428063,GB
-1402428064,1402428095,FR
-1402428096,1402428103,BE
-1402428104,1402428111,CH
-1402428112,1402428119,BE
-1402428120,1402428247,GB
-1402428248,1402428251,NL
-1402428252,1402428255,GB
-1402428256,1402428271,AT
-1402428272,1402428279,FR
-1402428280,1402428471,GB
-1402428472,1402428475,FR
-1402428476,1402429439,GB
-1402429440,1402429455,US
-1402429456,1402429471,GB
-1402429472,1402429487,US
-1402429488,1402429503,FR
-1402429504,1402429791,US
-1402429792,1402429823,GB
-1402429824,1402429827,FR
-1402429828,1402429831,GB
-1402429832,1402429833,FR
-1402429834,1402429951,GB
-1402429952,1402429987,US
-1402429988,1402429999,GB
-1402430000,1402430015,US
-1402430016,1402430543,GB
-1402430544,1402430544,US
-1402430545,1402431999,GB
-1402432000,1402432001,US
-1402432002,1402433536,GB
-1402433537,1402433537,FR
-1402433538,1402433539,GB
-1402433540,1402433540,FR
-1402433541,1402433542,AT
-1402433543,1402433559,FR
-1402433560,1402433567,GB
-1402433568,1402433578,FR
-1402433579,1402433580,CH
-1402433581,1402433583,GB
-1402433584,1402433623,FR
-1402433624,1402433627,CH
-1402433628,1402433695,FR
-1402433696,1402433711,GB
-1402433712,1402433727,FR
-1402433728,1402433743,GB
-1402433744,1402433747,FR
-1402433748,1402433759,GB
-1402433760,1402433839,FR
-1402433840,1402434059,GB
-1402434060,1402434063,FR
-1402434064,1402437631,GB
+1402421248,1402422783,FR
+1402422784,1402423039,LU
+1402423040,1402423295,FR
+1402423296,1402423807,BE
+1402423808,1402424319,FR
+1402424320,1402424575,BE
+1402424576,1402424831,FR
+1402424832,1402425343,GB
+1402425344,1402425599,DE
+1402425600,1402425855,LU
+1402425856,1402426367,FR
+1402426368,1402426623,DE
+1402426624,1402427135,CH
+1402427136,1402429439,GB
+1402429440,1402431487,US
+1402431488,1402433535,GB
+1402433536,1402434047,FR
+1402434048,1402434559,GB
+1402434560,1402434815,US
+1402434816,1402437631,GB
 1402437632,1402454015,DK
 1402454016,1402470399,GB
 1402470400,1402994687,FR
@@ -19720,6 +19913,7 @@
 1403535360,1403551743,PL
 1403551744,1403568127,SK
 1403568128,1403584511,SE
+1403584512,1403600895,DE
 1403600896,1403617279,FR
 1403617280,1403633663,DE
 1403633664,1403650047,RU
@@ -19849,7 +20043,9 @@
 1404436480,1404502015,BE
 1404502016,1404698623,SE
 1404698624,1404764159,BE
-1404764160,1404805119,SE
+1404764160,1404802047,SE
+1404802048,1404802559,EE
+1404802560,1404805119,SE
 1404805120,1404813311,AT
 1404813312,1404829695,SE
 1404829696,1404870655,RU
@@ -19858,8 +20054,7 @@
 1404876800,1404895231,SE
 1404895232,1404927999,DE
 1404928000,1404940287,CH
-1404940288,1404944383,SE
-1404944384,1404952575,IT
+1404940288,1404952575,SE
 1404952576,1404960767,NL
 1404960768,1405050879,SE
 1405050880,1405059071,AT
@@ -19937,7 +20132,8 @@
 1407025152,1407025663,DK
 1407025664,1407025919,US
 1407025920,1407033343,DK
-1407033344,1407033855,UZ
+1407033344,1407033599,RU
+1407033600,1407033855,UZ
 1407033856,1407034111,RU
 1407034112,1407034367,UZ
 1407034368,1407035391,RU
@@ -19946,10 +20142,11 @@
 1407049728,1407057919,DE
 1407057920,1407066111,RU
 1407066112,1407074303,LU
-1407082496,1407090687,RU
+1407074304,1407090687,RU
 1407090688,1407098879,CH
 1407098880,1407107071,BG
 1407107072,1407115263,RU
+1407115264,1407123455,GB
 1407123456,1407131647,SE
 1407131648,1407139839,NL
 1407139840,1407148031,DE
@@ -19962,18 +20159,24 @@
 1407320064,1407451135,SE
 1407451136,1407483903,BG
 1407483904,1407516671,CH
-1407516672,1407516727,GB
-1407516728,1407516735,NG
-1407516736,1407516743,GB
+1407516672,1407516679,GB
+1407516680,1407516687,NG
+1407516688,1407516711,GB
+1407516712,1407516735,NG
+1407516736,1407516743,UG
 1407516744,1407516751,LR
 1407516752,1407516759,GH
-1407516760,1407516783,GB
+1407516760,1407516767,GB
+1407516768,1407516775,AO
+1407516776,1407516783,GB
 1407516784,1407516791,NG
 1407516792,1407516799,GB
 1407516800,1407516807,GH
 1407516808,1407516831,GB
-1407516832,1407516839,NG
-1407516840,1407516879,GB
+1407516832,1407516855,NG
+1407516856,1407516863,GB
+1407516864,1407516871,NG
+1407516872,1407516879,GB
 1407516880,1407516903,NG
 1407516904,1407516911,GB
 1407516912,1407516927,NG
@@ -19981,93 +20184,107 @@
 1407517184,1407517383,GB
 1407517384,1407517391,CD
 1407517392,1407517415,GB
-1407517416,1407517423,NG
-1407517424,1407517431,GB
-1407517432,1407517439,NG
+1407517416,1407517439,NG
 1407517440,1407517823,GB
 1407517824,1407517887,NG
 1407517888,1407517951,GB
 1407517952,1407518015,SL
-1407518016,1407518031,NG
+1407518016,1407518031,ZA
 1407518032,1407518039,GB
 1407518040,1407518047,CD
 1407518048,1407518055,NG
 1407518056,1407518079,GB
-1407518080,1407518135,NG
-1407518136,1407518143,TD
-1407518144,1407518167,NG
+1407518080,1407518111,FR
+1407518112,1407518135,NG
+1407518136,1407518143,GH
+1407518144,1407518159,ZA
+1407518160,1407518167,GB
 1407518168,1407518175,CD
 1407518176,1407518183,GH
-1407518184,1407518191,NG
-1407518192,1407518199,CD
-1407518200,1407518207,GB
-1407518208,1407518215,NG
-1407518216,1407518239,GB
-1407518240,1407518255,NG
+1407518184,1407518199,NG
+1407518200,1407518207,AE
+1407518208,1407518215,GB
+1407518216,1407518223,ZA
+1407518224,1407518231,GB
+1407518232,1407518247,NG
+1407518248,1407518255,GB
 1407518256,1407518269,GH
 1407518270,1407518335,GB
 1407518336,1407518343,CG
-1407518344,1407518351,GN
+1407518344,1407518351,GB
 1407518352,1407518359,GH
-1407518360,1407518399,NG
-1407518400,1407518847,GB
-1407518848,1407518911,NG
-1407518912,1407518975,GB
+1407518360,1407518391,NG
+1407518392,1407518719,GB
+1407518720,1407518783,AO
+1407518784,1407518847,GB
+1407518848,1407518943,NG
+1407518944,1407518975,GB
 1407518976,1407519000,NG
 1407519001,1407519007,GB
-1407519008,1407519015,GH
+1407519008,1407519015,NG
 1407519016,1407519023,AO
-1407519024,1407519031,GB
-1407519032,1407519047,AO
-1407519048,1407519087,NG
-1407519088,1407519095,GB
+1407519024,1407519031,NG
+1407519032,1407519039,AO
+1407519040,1407519063,NG
+1407519064,1407519071,BJ
+1407519072,1407519079,CD
+1407519080,1407519095,NG
 1407519096,1407519103,CM
 1407519104,1407519111,NG
 1407519112,1407519135,SL
-1407519136,1407519143,CM
-1407519144,1407519167,GB
+1407519136,1407519143,NG
+1407519144,1407519151,AO
+1407519152,1407519159,GB
+1407519160,1407519167,AO
 1407519168,1407519175,NG
-1407519176,1407519191,GB
+1407519176,1407519183,SL
+1407519184,1407519191,GB
 1407519192,1407519199,CD
-1407519200,1407519207,CM
+1407519200,1407519207,AO
 1407519208,1407519215,TG
 1407519216,1407519223,NG
 1407519224,1407519231,GB
-1407519232,1407519487,NG
-1407519488,1407520287,GB
+1407519232,1407519615,NG
+1407519616,1407520263,GB
+1407520264,1407520271,NG
+1407520272,1407520287,GB
 1407520288,1407520295,GH
-1407520296,1407520303,GB
-1407520304,1407520327,BJ
-1407520328,1407520351,GB
-1407520352,1407520359,NG
+1407520296,1407520319,NG
+1407520320,1407520327,GB
+1407520328,1407520335,SL
+1407520336,1407520343,GB
+1407520344,1407520359,NG
 1407520360,1407520367,CD
-1407520368,1407520383,GB
-1407520384,1407520397,NG
-1407520398,1407520431,GB
-1407520432,1407520439,NG
+1407520368,1407520375,GB
+1407520376,1407520397,NG
+1407520398,1407520439,GB
 1407520440,1407520447,CD
 1407520448,1407520463,CG
-1407520464,1407520471,GB
-1407520472,1407520479,NG
-1407520480,1407520527,GB
-1407520528,1407520535,NG
-1407520536,1407520543,GB
-1407520544,1407520559,NG
+1407520464,1407520511,GB
+1407520512,1407520519,ZW
+1407520520,1407520527,GB
+1407520528,1407520543,NG
+1407520544,1407520551,GB
+1407520552,1407520559,NG
 1407520560,1407520567,SL
-1407520568,1407520591,NG
-1407520592,1407520599,GB
+1407520568,1407520575,NG
+1407520576,1407520599,GB
 1407520600,1407520607,FR
 1407520608,1407520615,AO
-1407520616,1407520631,GB
+1407520616,1407520623,GB
+1407520624,1407520631,NG
 1407520632,1407520639,ZM
 1407520640,1407520655,NG
 1407520656,1407520663,GA
-1407520664,1407520695,NG
-1407520696,1407520703,GB
+1407520664,1407520671,NG
+1407520672,1407520679,CM
+1407520680,1407520695,NG
+1407520696,1407520703,GN
 1407520704,1407520727,NG
 1407520728,1407520735,AO
 1407520736,1407520751,NG
-1407520752,1407520767,CD
+1407520752,1407520759,CM
+1407520760,1407520767,CD
 1407520768,1407521279,NG
 1407521280,1407522047,GB
 1407522048,1407522303,TZ
@@ -20078,56 +20295,60 @@
 1407523344,1407523351,NG
 1407523352,1407523359,TZ
 1407523360,1407523367,ZW
-1407523368,1407523391,GB
+1407523368,1407523375,NG
+1407523376,1407523391,GB
 1407523392,1407523455,ZW
 1407523456,1407523519,MW
 1407523520,1407523535,GB
-1407523536,1407523543,GH
-1407523544,1407523559,NG
+1407523536,1407523551,NG
+1407523552,1407523559,CM
 1407523560,1407523575,KE
 1407523576,1407523583,MW
 1407523584,1407523839,SO
 1407523840,1407524351,MW
-1407524352,1407524607,GB
-1407524608,1407524863,CG
+1407524352,1407524863,GB
 1407524864,1407527935,MZ
 1407527936,1407529023,GB
 1407529024,1407529087,NG
 1407529088,1407529095,TZ
-1407529096,1407529103,GB
+1407529096,1407529103,ZW
 1407529104,1407529111,NG
 1407529112,1407529119,MW
-1407529120,1407529135,GB
+1407529120,1407529127,GB
+1407529128,1407529135,ZW
 1407529136,1407529143,MW
-1407529144,1407529151,GB
-1407529152,1407529183,NG
-1407529184,1407531007,GB
+1407529144,1407529151,ZW
+1407529152,1407529183,GB
+1407529184,1407529191,NG
+1407529192,1407529199,MZ
+1407529200,1407529207,GB
+1407529208,1407529215,NG
+1407529216,1407531007,GB
 1407531008,1407531775,NG
 1407531776,1407532031,GB
 1407532032,1407532543,KE
-1407532544,1407532551,GB
-1407532552,1407532559,NG
+1407532544,1407532551,UG
+1407532552,1407532559,AO
 1407532560,1407532583,GB
-1407532584,1407532591,CD
+1407532584,1407532591,ZW
 1407532592,1407532607,GB
 1407532608,1407532615,ZW
 1407532616,1407532623,KG
 1407532624,1407532631,GB
-1407532632,1407532639,NG
-1407532640,1407532663,GB
-1407532664,1407532671,NG
+1407532632,1407532639,MW
+1407532640,1407532647,TZ
+1407532648,1407532663,GB
+1407532664,1407532671,TZ
 1407532672,1407532799,ZW
 1407532800,1407532927,SO
 1407532928,1407533055,GB
 1407533056,1407533311,NG
-1407533312,1407533327,GE
+1407533312,1407533327,AO
 1407533328,1407533343,GB
-1407533344,1407533359,NG
-1407533360,1407533375,GB
+1407533344,1407533375,NG
 1407533376,1407533407,CD
 1407533408,1407533423,GB
-1407533424,1407533439,GH
-1407533440,1407533567,CM
+1407533424,1407533567,GH
 1407533568,1407533599,NG
 1407533600,1407533607,GB
 1407533608,1407533631,NG
@@ -20139,33 +20360,28 @@
 1407533720,1407533727,SL
 1407533728,1407533735,NG
 1407533736,1407533743,GN
-1407533744,1407533775,NG
-1407533776,1407533783,GB
-1407533784,1407533791,NG
-1407533792,1407533807,GB
-1407533808,1407533815,CM
+1407533744,1407533783,NG
+1407533784,1407533815,GB
 1407533816,1407533823,NG
 1407533824,1407534079,GB
 1407534080,1407534335,AE
 1407534336,1407534343,NG
-1407534344,1407534351,GB
-1407534352,1407534359,NG
+1407534344,1407534359,GB
 1407534360,1407534367,LR
-1407534368,1407534383,GB
+1407534368,1407534383,NG
 1407534384,1407534391,CD
 1407534392,1407534399,AO
 1407534400,1407534407,NG
 1407534408,1407534415,CI
 1407534416,1407534423,GB
 1407534424,1407534431,CD
-1407534432,1407534439,CM
+1407534432,1407534439,GB
 1407534440,1407534447,CD
-1407534448,1407534527,NG
-1407534528,1407534535,GH
-1407534536,1407534543,GB
+1407534448,1407534463,NG
+1407534464,1407534543,GB
 1407534544,1407534559,GH
 1407534560,1407534567,NG
-1407534568,1407534575,TZ
+1407534568,1407534575,GB
 1407534576,1407534583,CD
 1407534584,1407534591,GB
 1407534592,1407534727,NG
@@ -20173,10 +20389,7 @@
 1407534736,1407534775,NG
 1407534776,1407534783,ML
 1407534784,1407534791,CD
-1407534792,1407534799,NG
-1407534800,1407534823,GB
-1407534824,1407534831,GH
-1407534832,1407534839,GB
+1407534792,1407534839,GB
 1407534840,1407534847,NG
 1407534848,1407535103,CM
 1407535104,1407535615,GA
@@ -20185,51 +20398,50 @@
 1407536640,1407536895,CD
 1407536896,1407536903,GB
 1407536904,1407536919,ZW
-1407536920,1407536935,AO
+1407536920,1407536935,GB
 1407536936,1407536943,NG
 1407536944,1407536951,AO
 1407536952,1407536967,GB
-1407536968,1407536983,NG
+1407536968,1407536975,NG
+1407536976,1407536983,GB
 1407536984,1407536991,IQ
 1407536992,1407536999,GB
 1407537000,1407537007,GH
-1407537008,1407537015,GB
-1407537016,1407537023,GH
-1407537024,1407537031,GB
+1407537008,1407537031,GB
 1407537032,1407537039,NG
 1407537040,1407537047,GB
 1407537048,1407537055,NG
 1407537056,1407537071,GH
 1407537072,1407537087,NG
 1407537088,1407537095,GH
-1407537096,1407537111,NG
-1407537112,1407537135,GB
+1407537096,1407537103,GB
+1407537104,1407537111,NG
+1407537112,1407537119,LR
+1407537120,1407537135,GB
 1407537136,1407537151,NG
 1407537152,1407538175,GB
 1407538176,1407538431,AT
 1407538432,1407538439,GB
 1407538440,1407538447,NG
-1407538448,1407538455,GB
-1407538456,1407538463,NG
+1407538448,1407538463,GB
 1407538464,1407538471,ZM
 1407538472,1407538479,NG
-1407538480,1407538487,GB
-1407538488,1407538503,NG
+1407538480,1407538495,GB
+1407538496,1407538503,NG
 1407538504,1407538527,GB
 1407538528,1407538543,CD
-1407538544,1407538551,GH
-1407538552,1407538559,GB
-1407538560,1407538623,NG
-1407538624,1407538655,GB
-1407538656,1407538751,NG
-1407538752,1407538815,GB
-1407538816,1407538847,CD
+1407538544,1407538559,GB
+1407538560,1407538623,CD
+1407538624,1407538663,GB
+1407538664,1407538815,NG
+1407538816,1407538847,GB
 1407538848,1407538863,NG
 1407538864,1407538879,GE
 1407538880,1407538887,GB
 1407538888,1407538895,NG
 1407538896,1407538911,GB
-1407538912,1407538927,GH
+1407538912,1407538919,GH
+1407538920,1407538927,GB
 1407538928,1407538935,NG
 1407538936,1407538943,GH
 1407538944,1407538959,GB
@@ -20239,53 +20451,48 @@
 1407538984,1407538991,SL
 1407538992,1407538999,GB
 1407539000,1407539007,NG
-1407539008,1407539015,BF
-1407539016,1407539023,NG
-1407539024,1407539031,GB
-1407539032,1407539039,GH
-1407539040,1407539055,GB
+1407539008,1407539015,GH
+1407539016,1407539055,GB
 1407539056,1407539063,NG
 1407539064,1407539071,GB
 1407539072,1407539079,NG
 1407539080,1407539087,GB
 1407539088,1407539095,AO
-1407539096,1407539103,CI
+1407539096,1407539103,GB
 1407539104,1407539111,NG
 1407539112,1407539119,GB
 1407539120,1407539127,LR
-1407539128,1407539135,GB
-1407539136,1407539143,CI
+1407539128,1407539143,GB
 1407539144,1407539151,NG
-1407539152,1407539159,TZ
-1407539160,1407539167,GB
+1407539152,1407539167,GB
 1407539168,1407539175,TD
 1407539176,1407539183,GH
 1407539184,1407539199,NG
 1407539200,1407539455,GE
 1407539456,1407541247,NG
-1407541248,1407541487,GB
-1407541488,1407541495,NG
-1407541496,1407541503,GB
-1407541504,1407541535,BJ
+1407541248,1407541471,GB
+1407541472,1407541495,NG
+1407541496,1407541535,GB
 1407541536,1407541543,CM
 1407541544,1407541551,GB
 1407541552,1407541559,NG
 1407541560,1407541567,GH
-1407541568,1407541631,GB
-1407541632,1407541719,NG
+1407541568,1407541703,GB
+1407541704,1407541719,NG
 1407541720,1407541727,GB
 1407541728,1407541735,NG
 1407541736,1407541751,GB
 1407541752,1407541759,NG
-1407541760,1407542527,GB
+1407541760,1407541887,GB
+1407541888,1407542143,NG
+1407542144,1407542527,GB
 1407542528,1407542535,NG
 1407542536,1407542543,GB
 1407542544,1407542551,LR
-1407542552,1407542559,CM
-1407542560,1407542567,GB
-1407542568,1407542575,CI
+1407542552,1407542575,GB
 1407542576,1407542583,CD
-1407542584,1407542599,NG
+1407542584,1407542591,GB
+1407542592,1407542599,NG
 1407542600,1407542607,TG
 1407542608,1407542623,GB
 1407542624,1407542631,BJ
@@ -20299,78 +20506,75 @@
 1407542696,1407542703,NG
 1407542704,1407542711,CI
 1407542712,1407542719,GB
-1407542720,1407542743,NG
-1407542744,1407542759,GB
-1407542760,1407542767,CM
-1407542768,1407542799,NG
-1407542800,1407542847,GB
-1407542848,1407542871,NG
-1407542872,1407542879,GB
+1407542720,1407542735,NG
+1407542736,1407542767,GB
+1407542768,1407542775,GA
+1407542776,1407542783,NG
+1407542784,1407542791,GB
+1407542792,1407542799,NG
+1407542800,1407542831,GB
+1407542832,1407542863,NG
+1407542864,1407542879,GB
 1407542880,1407542887,NG
 1407542888,1407542903,GB
 1407542904,1407542911,CD
 1407542912,1407543039,AT
-1407543040,1407543167,NG
+1407543040,1407543167,GB
 1407543168,1407543183,GH
-1407543184,1407543191,GB
-1407543192,1407543239,NG
-1407543240,1407543247,GB
-1407543248,1407543255,NE
+1407543184,1407543239,NG
+1407543240,1407543255,GB
 1407543256,1407543263,NG
-1407543264,1407543279,GB
-1407543280,1407543295,NG
-1407543296,1407545343,GB
+1407543264,1407543271,CD
+1407543272,1407543279,GB
+1407543280,1407543287,NG
+1407543288,1407545343,GB
 1407545344,1407546367,SL
 1407546368,1407546495,AE
 1407546496,1407546879,GB
-1407546880,1407547143,NG
+1407546880,1407547135,NG
+1407547136,1407547143,GB
 1407547144,1407547151,GH
-1407547152,1407547159,GB
-1407547160,1407547175,NG
+1407547152,1407547167,GB
+1407547168,1407547175,NG
 1407547176,1407547183,GH
-1407547184,1407547191,AO
-1407547192,1407547199,GB
-1407547200,1407547207,NG
-1407547208,1407547215,AO
-1407547216,1407547239,SL
-1407547240,1407547247,NG
-1407547248,1407547279,GB
-1407547280,1407547303,NG
-1407547304,1407547311,GB
-1407547312,1407547319,NG
-1407547320,1407547327,SL
+1407547184,1407547199,NG
+1407547200,1407547207,AO
+1407547208,1407547215,TD
+1407547216,1407547223,SL
+1407547224,1407547231,GB
+1407547232,1407547255,SL
+1407547256,1407547263,GB
+1407547264,1407547271,SL
+1407547272,1407547295,NG
+1407547296,1407547303,GB
+1407547304,1407547311,SL
+1407547312,1407547327,NG
 1407547328,1407547335,GB
 1407547336,1407547343,CI
-1407547344,1407547351,GB
-1407547352,1407547367,NG
-1407547368,1407547383,GB
-1407547384,1407547911,NG
+1407547344,1407547911,NG
 1407547912,1407547919,GB
 1407547920,1407547927,CG
-1407547928,1407547935,GB
-1407547936,1407547943,CI
+1407547928,1407547943,GB
 1407547944,1407547951,BJ
 1407547952,1407547959,LR
 1407547960,1407547967,NG
 1407547968,1407547983,GB
 1407547984,1407547999,BJ
 1407548000,1407548007,NG
-1407548008,1407548015,GB
-1407548016,1407548023,NG
+1407548008,1407548023,GB
 1407548024,1407548031,CD
 1407548032,1407548047,GB
-1407548048,1407548063,NG
+1407548048,1407548055,GA
+1407548056,1407548063,NG
 1407548064,1407548111,GB
 1407548112,1407548119,CI
-1407548120,1407548127,NG
+1407548120,1407548127,GB
 1407548128,1407548143,CM
 1407548144,1407548151,GB
 1407548152,1407548159,NG
-1407548160,1407548415,NE
+1407548160,1407548415,GB
 1407548416,1407548543,GE
-1407548544,1407548671,NG
-1407548672,1407548927,GB
-1407548928,1407549183,NG
+1407548544,1407549183,GB
 1407549184,1407549439,GE
 1407549440,1407582207,RU
 1407582208,1407614975,PL
@@ -20394,10 +20598,10 @@
 1407703408,1407703415,GB
 1407703416,1407703455,FR
 1407703456,1407703535,GB
-1407703536,1407703543,FR
-1407703544,1407703551,GB
-1407703552,1407703583,FR
-1407703584,1407704063,GB
+1407703536,1407703695,FR
+1407703696,1407703711,GB
+1407703712,1407703839,FR
+1407703840,1407704063,GB
 1407704064,1407704127,FR
 1407704128,1407704191,GB
 1407704192,1407704319,FR
@@ -20407,7 +20611,9 @@
 1407705248,1407705295,ES
 1407705296,1407705599,GB
 1407705600,1407705727,FR
-1407705728,1407709183,GB
+1407705728,1407706367,GB
+1407706368,1407706383,FR
+1407706384,1407709183,GB
 1407709184,1407709439,DE
 1407709440,1407713279,GB
 1407713280,1407778815,NL
@@ -20454,7 +20660,9 @@
 1408499712,1408532479,PS
 1408532480,1408567919,GB
 1408567920,1408567927,IE
-1408567928,1408575231,GB
+1408567928,1408574847,GB
+1408574848,1408574911,IE
+1408574912,1408575231,GB
 1408575232,1408575239,IE
 1408575240,1408583167,GB
 1408583168,1408583679,IE
@@ -20464,11 +20672,7 @@
 1408585408,1408585471,IE
 1408585472,1408590847,GB
 1408590848,1408591103,BE
-1408591104,1408591871,GB
-1408591872,1408592127,IE
-1408592128,1408592639,GB
-1408592640,1408592895,IE
-1408592896,1408598015,GB
+1408591104,1408598015,GB
 1408598016,1408630783,FI
 1408630784,1408634879,RO
 1408634880,1408663551,DE
@@ -20486,11 +20690,13 @@
 1409548288,1409810431,FR
 1409810432,1409941503,GB
 1409941504,1410007039,PL
-1410007040,1410008575,DE
+1410007040,1410007551,DE
+1410007552,1410007807,IR
+1410007808,1410008575,DE
 1410008576,1410008607,AE
 1410008608,1410008831,DE
-1410008832,1410008879,US
-1410008880,1410009343,DE
+1410008832,1410008911,US
+1410008912,1410009343,DE
 1410009344,1410009479,US
 1410009480,1410009487,DE
 1410009488,1410009535,GI
@@ -20647,9 +20853,7 @@
 1410027264,1410027519,AF
 1410027520,1410027711,DE
 1410027712,1410027775,IR
-1410027776,1410028799,DE
-1410028800,1410028879,IQ
-1410028880,1410032127,DE
+1410027776,1410032127,DE
 1410032128,1410033151,IQ
 1410033152,1410035199,DE
 1410035200,1410035231,KW
@@ -20670,23 +20874,14 @@
 1410036736,1410036751,PA
 1410036752,1410039807,DE
 1410039808,1410041855,AE
-1410041856,1410042111,LB
-1410042112,1410042127,DE
-1410042128,1410042135,LB
-1410042136,1410042183,DE
-1410042184,1410042239,LB
-1410042240,1410042287,DE
-1410042288,1410043151,LB
-1410043152,1410043167,DE
-1410043168,1410043183,LB
-1410043184,1410043199,DE
-1410043200,1410043253,LB
-1410043254,1410043263,DE
-1410043264,1410043903,LB
-1410043904,1410072319,DE
+1410041856,1410043903,LB
+1410043904,1410044415,JO
+1410044416,1410072319,DE
 1410072320,1410072575,AE
 1410072576,1410203647,GB
-1410203648,1410214495,FR
+1410203648,1410212863,FR
+1410212864,1410213119,GB
+1410213120,1410214495,FR
 1410214496,1410214503,PT
 1410214504,1410262799,FR
 1410262800,1410262815,DE
@@ -20730,7 +20925,9 @@
 1410465792,1410473983,ES
 1410473984,1410490367,JO
 1410490368,1410498559,RU
-1410498560,1410506751,IT
+1410498560,1410502803,IT
+1410502804,1410502807,US
+1410502808,1410506751,IT
 1410506752,1410514943,IE
 1410514944,1410523135,GB
 1410523136,1410531327,PT
@@ -20741,11 +20938,19 @@
 1410547712,1410555903,CZ
 1410555904,1410564095,GB
 1410564096,1410572287,SE
-1410572288,1410572863,DE
+1410572288,1410572543,DE
+1410572544,1410572799,RU
+1410572800,1410572863,DE
 1410572864,1410572895,RU
 1410572896,1410573407,DE
 1410573408,1410573439,RU
-1410573440,1410575111,DE
+1410573440,1410573695,DE
+1410573696,1410573711,RU
+1410573712,1410573759,DE
+1410573760,1410573775,RU
+1410573776,1410574719,DE
+1410574720,1410574727,RU
+1410574728,1410575111,DE
 1410575112,1410575119,IT
 1410575120,1410575295,DE
 1410575296,1410575327,IT
@@ -20754,7 +20959,8 @@
 1410575552,1410575615,IT
 1410575616,1410575775,DE
 1410575776,1410575791,RU
-1410575792,1410575823,DE
+1410575792,1410575807,DE
+1410575808,1410575823,RU
 1410575824,1410575839,BG
 1410575840,1410575855,IT
 1410575856,1410575871,DE
@@ -20800,7 +21006,7 @@
 1410756864,1410757119,AQ
 1410757120,1410758655,NL
 1410758656,1410760191,AQ
-1410760192,1410760447,DE
+1410760192,1410760447,BE
 1410760448,1410760683,AQ
 1410760684,1410760687,US
 1410760688,1410760691,AQ
@@ -20868,8 +21074,7 @@
 1411916032,1411916095,GB
 1411916296,1411916303,GB
 1411916800,1411916863,GB
-1411917568,1411917583,GB
-1411917600,1411917631,GB
+1411917568,1411917639,GB
 1411919872,1411923967,DE
 1411940352,1411973119,PL
 1411973120,1411999759,SI
@@ -20898,7 +21103,11 @@
 1412136960,1412169727,BG
 1412169728,1412202495,TR
 1412202496,1412235263,DE
-1412235264,1412300799,GB
+1412235264,1412257535,GB
+1412257536,1412257615,NL
+1412257616,1412264023,GB
+1412264024,1412264031,NL
+1412264032,1412300799,GB
 1412300800,1412333567,DE
 1412333568,1412366335,LT
 1412366336,1412399103,SK
@@ -20926,7 +21135,9 @@
 1412710400,1412726783,RU
 1412726784,1412743167,SI
 1412743168,1412775935,NO
-1412775936,1412792319,NL
+1412775936,1412780239,NL
+1412780240,1412780247,GB
+1412780248,1412792319,NL
 1412792320,1412798463,US
 1412800512,1412804607,US
 1412808704,1412825087,RU
@@ -20959,7 +21170,9 @@
 1421869056,1422393343,BE
 1422393344,1422399743,DE
 1422399744,1422399999,IT
-1422400000,1422491647,DE
+1422400000,1422462207,DE
+1422462208,1422462463,TR
+1422462464,1422491647,DE
 1422491648,1422508031,GB
 1422508032,1422512127,BG
 1422512128,1422516223,PL
@@ -21003,9 +21216,8 @@
 1424588848,1424589311,DE
 1424589312,1424589567,FR
 1424589568,1424590719,GB
-1424590720,1424590727,SE
-1424590728,1424590735,GB
-1424590736,1424590783,SE
+1424590720,1424590767,SE
+1424590768,1424590783,GB
 1424590784,1424590847,CH
 1424590848,1424591423,SE
 1424591424,1424591439,GB
@@ -21027,7 +21239,13 @@
 1424594056,1424594063,IT
 1424594064,1424594175,FR
 1424594176,1424595455,GB
-1424595456,1424596479,IT
+1424595456,1424595575,IT
+1424595576,1424595583,ES
+1424595584,1424595663,IT
+1424595664,1424595671,GB
+1424595672,1424595839,IT
+1424595840,1424595871,GB
+1424595872,1424596479,IT
 1424596480,1424596991,FR
 1424596992,1424597503,CZ
 1424597504,1424597759,FR
@@ -21062,8 +21280,7 @@
 1424603008,1424603023,GB
 1424603024,1424603055,US
 1424603056,1424603063,NL
-1424603064,1424603071,GB
-1424603072,1424603087,US
+1424603064,1424603087,US
 1424603088,1424603135,GB
 1424603136,1424603391,SK
 1424603392,1424603647,DE
@@ -21081,7 +21298,10 @@
 1424605584,1424605631,GB
 1424605632,1424605695,BG
 1424605696,1424605951,NL
-1424605952,1424606199,GB
+1424605952,1424605959,CH
+1424605960,1424605967,GB
+1424605968,1424606015,AT
+1424606016,1424606199,GB
 1424606200,1424606207,AT
 1424606208,1424606455,GB
 1424606456,1424606463,AT
@@ -21102,7 +21322,9 @@
 1424607872,1424608031,GB
 1424608032,1424608127,FR
 1424608128,1424608279,GB
-1424608280,1424608511,FR
+1424608280,1424608383,FR
+1424608384,1424608399,ES
+1424608400,1424608511,FR
 1424608512,1424608703,ES
 1424608704,1424608719,GB
 1424608720,1424609023,ES
@@ -21116,45 +21338,50 @@
 1424610816,1424611071,FR
 1424611072,1424611143,BE
 1424611144,1424611151,GB
-1424611152,1424611327,BE
+1424611152,1424611167,BE
+1424611168,1424611175,GB
+1424611176,1424611327,BE
 1424611328,1424611583,PL
 1424611584,1424612095,GB
 1424612096,1424612231,CZ
-1424612232,1424612239,GB
-1424612240,1424612271,CZ
-1424612272,1424612607,GB
+1424612232,1424612239,CH
+1424612240,1424612319,CZ
+1424612320,1424612607,GB
 1424612608,1424612671,AE
 1424612672,1424612863,GB
 1424612864,1424613119,FR
 1424613120,1424613375,GB
 1424613376,1424613631,ES
-1424613632,1424614143,IT
-1424614144,1424614399,GB
+1424613632,1424614103,IT
+1424614104,1424614111,GB
+1424614112,1424614135,IT
+1424614136,1424614399,GB
 1424614400,1424614415,FR
-1424614416,1424614655,IT
+1424614416,1424614439,IT
+1424614440,1424614447,GB
+1424614448,1424614655,IT
 1424614656,1424614911,FR
 1424614912,1424615167,RO
-1424615168,1424615679,GB
-1424615680,1424615935,IT
+1424615168,1424615935,GB
 1424615936,1424616191,FR
 1424616192,1424616447,IT
 1424616448,1424616483,ES
 1424616484,1424616487,GB
-1424616488,1424616503,ES
-1424616504,1424616511,GB
-1424616512,1424616607,ES
+1424616488,1424616607,ES
 1424616608,1424616615,PT
-1424616616,1424616631,ES
-1424616632,1424616655,GB
+1424616616,1424616647,ES
+1424616648,1424616655,GB
 1424616656,1424616695,ES
 1424616696,1424616703,GB
 1424616704,1424616959,US
 1424616960,1424617215,FR
-1424617216,1424617395,IT
+1424617216,1424617375,IT
+1424617376,1424617391,GB
+1424617392,1424617395,IT
 1424617396,1424617399,GB
 1424617400,1424617407,IT
 1424617408,1424617423,ES
-1424617424,1424617431,IT
+1424617424,1424617431,GB
 1424617432,1424617439,ES
 1424617440,1424617471,IT
 1424617472,1424617727,US
@@ -21167,7 +21394,9 @@
 1424619008,1424619775,IT
 1424619776,1424619811,BE
 1424619812,1424619815,GB
-1424619816,1424620031,BE
+1424619816,1424619823,BE
+1424619824,1424619839,GB
+1424619840,1424620031,BE
 1424620032,1424621055,GB
 1424621056,1424621567,IT
 1424621568,1424625663,PL
@@ -21230,6 +21459,7 @@
 1424752128,1424752383,DE
 1424752384,1424752639,NL
 1424752640,1424785407,HU
+1424785408,1424818175,ES
 1424818176,1424850943,RU
 1424850944,1424883711,LV
 1424883712,1424916479,DK
@@ -21251,8 +21481,7 @@
 1425227776,1425244159,RO
 1425244160,1425260543,NO
 1425260544,1425276927,NL
-1425276928,1425287167,SE
-1425287168,1425293311,DE
+1425276928,1425293311,DE
 1425293312,1425309695,CZ
 1425309696,1425326079,NL
 1425326080,1425342463,SE
@@ -21274,6 +21503,7 @@
 1425426432,1425428479,KW
 1425428480,1425430527,GB
 1425430528,1425432575,SE
+1425432576,1425434623,IT
 1425434624,1425436671,FR
 1425436672,1425438719,GB
 1425438720,1425439271,DE
@@ -21296,7 +21526,7 @@
 1425458272,1425458303,US
 1425458304,1425461247,GB
 1425461248,1425463295,ES
-1425465344,1425467135,FR
+1425463296,1425467135,FR
 1425467136,1425467391,ES
 1425467392,1425469439,CH
 1425469440,1425471487,DK
@@ -21567,7 +21797,17 @@
 1427062784,1427095551,RU
 1427095552,1427111935,LV
 1427111936,1427177471,DE
-1427177472,1427243007,NL
+1427177472,1427227135,NL
+1427227136,1427227647,US
+1427227648,1427227967,NL
+1427227968,1427227975,GB
+1427227976,1427227983,DE
+1427227984,1427227991,IT
+1427227992,1427227999,ES
+1427228000,1427228007,PL
+1427228008,1427228015,RU
+1427228016,1427228023,FR
+1427228024,1427243007,NL
 1427243008,1427308543,IT
 1427308544,1427374079,NO
 1427374080,1427439615,IT
@@ -21584,14 +21824,16 @@
 1427744256,1427744287,US
 1427744288,1427744863,DE
 1427744864,1427744895,TR
-1427744896,1427750911,DE
+1427744896,1427746303,DE
+1427746304,1427746335,SE
+1427746336,1427748447,DE
+1427748448,1427748479,TR
+1427748480,1427750911,DE
 1427750912,1427759103,NL
 1427759104,1427759903,DE
 1427759904,1427759935,CH
 1427759936,1427759967,RO
-1427759968,1427760159,DE
-1427760160,1427760191,SE
-1427760192,1427760383,DE
+1427759968,1427760383,DE
 1427760384,1427760415,SE
 1427760416,1427760799,DE
 1427760800,1427760831,NL
@@ -21600,9 +21842,7 @@
 1427760960,1427760991,CZ
 1427760992,1427761023,DE
 1427761024,1427761055,CR
-1427761056,1427761183,DE
-1427761184,1427761215,RU
-1427761216,1427767295,DE
+1427761056,1427767295,DE
 1427767296,1427800063,BE
 1427800064,1427823615,RU
 1427823616,1427824639,KG
@@ -21626,6 +21866,7 @@
 1428096032,1428096039,CH
 1428096040,1428103167,AT
 1428103168,1428119551,GB
+1428119552,1428121599,LV
 1428121600,1428123647,FR
 1428123648,1428126975,RU
 1428126976,1428127231,TR
@@ -21640,10 +21881,8 @@
 1428142080,1428144127,DE
 1428144128,1428146847,FR
 1428146848,1428146855,SE
-1428146856,1428146867,FR
-1428146868,1428146871,SE
-1428146872,1428146879,FR
-1428146880,1428146911,SE
+1428146856,1428146883,FR
+1428146884,1428146911,SE
 1428146912,1428147071,FR
 1428147072,1428147119,SE
 1428147120,1428147127,FR
@@ -21653,14 +21892,15 @@
 1428147376,1428147391,ES
 1428147392,1428147775,FR
 1428147776,1428147783,CH
-1428147784,1428147791,SE
-1428147792,1428147839,FR
+1428147784,1428147839,FR
 1428147840,1428147847,SE
 1428147848,1428147855,DK
 1428147856,1428147871,US
 1428147872,1428147903,GB
-1428147904,1428148095,FR
-1428148096,1428148127,SE
+1428147904,1428148031,FR
+1428148032,1428148063,SE
+1428148064,1428148111,FR
+1428148112,1428148127,SE
 1428148128,1428148135,IL
 1428148136,1428148143,BE
 1428148144,1428148151,DE
@@ -21672,9 +21912,7 @@
 1428150496,1428150511,SE
 1428150512,1428150735,FR
 1428150736,1428150751,SE
-1428150752,1428150927,FR
-1428150928,1428150959,SE
-1428150960,1428151007,FR
+1428150752,1428151007,FR
 1428151008,1428151039,SE
 1428151040,1428151295,FR
 1428151296,1428151551,SE
@@ -21700,16 +21938,12 @@
 1431839040,1431846911,BE
 1431846912,1431855103,NO
 1431855104,1431863295,NL
-1431863296,1431863607,GB
-1431863608,1431863767,PT
+1431863296,1431863559,GB
+1431863560,1431863767,PT
 1431863768,1431863775,GB
-1431863776,1431863855,PT
-1431863856,1431863871,GB
-1431863872,1431863927,PT
-1431863928,1431863935,GB
-1431863936,1431864135,PT
-1431864136,1431864143,GB
-1431864144,1431864151,PT
+1431863776,1431863863,PT
+1431863864,1431863871,GB
+1431863872,1431864151,PT
 1431864152,1431864159,GB
 1431864160,1431864191,PT
 1431864192,1431864207,GB
@@ -21717,38 +21951,33 @@
 1431864288,1431864295,GB
 1431864296,1431864359,PT
 1431864360,1431864367,GB
-1431864368,1431864375,PT
-1431864376,1431864383,GB
-1431864384,1431864407,PT
+1431864368,1431864407,PT
 1431864408,1431864415,GB
 1431864416,1431864455,PT
 1431864456,1431864463,GB
-1431864464,1431864519,PT
-1431864520,1431864527,GB
-1431864528,1431864543,PT
-1431864544,1431864575,GB
-1431864576,1431864623,PT
+1431864464,1431864471,PT
+1431864472,1431864479,GB
+1431864480,1431864623,PT
 1431864624,1431864631,GB
 1431864632,1431864671,PT
 1431864672,1431864679,GB
-1431864680,1431864735,PT
-1431864736,1431864751,GB
+1431864680,1431864743,PT
+1431864744,1431864751,GB
 1431864752,1431864775,PT
-1431864776,1431864799,GB
-1431864800,1431864807,PT
+1431864776,1431864791,GB
+1431864792,1431864807,PT
 1431864808,1431864815,GB
 1431864816,1431864887,PT
 1431864888,1431864895,GB
 1431864896,1431864919,PT
 1431864920,1431864927,GB
-1431864928,1431865087,PT
-1431865088,1431865095,GB
-1431865096,1431865111,PT
+1431864928,1431865111,PT
 1431865112,1431865119,GB
 1431865120,1431865263,PT
 1431865264,1431865295,GB
 1431865296,1431865303,PT
-1431865304,1431865335,GB
+1431865304,1431865327,GB
+1431865328,1431865335,PT
 1431865336,1431865343,ES
 1431865344,1431865599,PT
 1431865600,1431865631,GB
@@ -21756,20 +21985,21 @@
 1431865648,1431865655,GB
 1431865656,1431865663,PT
 1431865664,1431865679,ES
-1431865680,1431865711,GB
+1431865680,1431865695,GB
+1431865696,1431865711,PT
 1431865712,1431865719,ES
-1431865720,1431865791,GB
-1431865792,1431865799,PT
-1431865800,1431865831,GB
-1431865832,1431865839,PT
-1431865840,1431865871,GB
-1431865872,1431865879,PT
-1431865880,1431865887,GB
-1431865888,1431865919,PT
-1431865920,1431866023,GB
-1431866024,1431866031,PT
-1431866032,1431866047,GB
-1431866048,1431866063,PT
+1431865720,1431865735,GB
+1431865736,1431865743,PT
+1431865744,1431865759,GB
+1431865760,1431865799,PT
+1431865800,1431865807,GB
+1431865808,1431865823,PT
+1431865824,1431865831,GB
+1431865832,1431865855,PT
+1431865856,1431865871,GB
+1431865872,1431866007,PT
+1431866008,1431866015,GB
+1431866016,1431866063,PT
 1431866064,1431867391,GB
 1431867392,1431867647,PT
 1431867648,1431871487,GB
@@ -21950,7 +22180,7 @@
 1433867648,1433867775,NL
 1433867776,1433867839,GB
 1433867840,1433868031,NL
-1433868032,1433868287,GB
+1433868032,1433870335,GB
 1433870336,1433872383,TR
 1433872384,1433874431,IT
 1433874432,1433876479,NL
@@ -22035,6 +22265,7 @@
 1436459008,1436461055,NL
 1436461056,1436463103,ES
 1436463104,1436465151,DE
+1436465152,1436467199,RU
 1436467200,1436469247,DE
 1436469248,1436471295,NL
 1436471296,1436471551,BE
@@ -22065,6 +22296,7 @@
 1436512256,1436514303,NL
 1436514304,1436516351,GI
 1436516352,1436520447,GB
+1436520448,1436522495,IT
 1436522496,1436524543,GB
 1436524544,1436526591,IL
 1436526592,1436528639,GB
@@ -22103,8 +22335,8 @@
 1438519040,1438523391,DE
 1438523392,1438524947,NL
 1438524948,1438524951,DE
-1438524952,1438525327,NL
-1438525328,1438525343,DE
+1438524952,1438525335,NL
+1438525336,1438525343,DE
 1438525344,1438525471,NL
 1438525472,1438525695,DE
 1438525696,1438526463,NL
@@ -22135,7 +22367,8 @@
 1438875258,1438875647,DE
 1438875648,1438875903,RU
 1438875904,1438876159,SE
-1438876160,1438876927,RU
+1438876160,1438876415,LB
+1438876416,1438876927,RU
 1438876928,1438877183,SE
 1438877184,1438877439,LT
 1438877440,1438877695,RU
@@ -22340,7 +22573,9 @@
 1441564672,1441566719,PK
 1441566720,1441570815,IR
 1441570816,1441579007,RU
-1441579008,1441587199,DE
+1441579008,1441582975,DE
+1441582976,1441583103,US
+1441583104,1441587199,DE
 1441587200,1441594879,AT
 1441594880,1441595135,DE
 1441595136,1441596159,AT
@@ -22430,7 +22665,10 @@
 1446576128,1446608895,LV
 1446608896,1446641663,BY
 1446641664,1446674431,SI
-1446674432,1446707199,DK
+1446674432,1446707175,DK
+1446707176,1446707179,NO
+1446707180,1446707183,FI
+1446707184,1446707199,DK
 1446707200,1446739967,AT
 1446739968,1446764543,RU
 1446764544,1446765055,CZ
@@ -22512,11 +22750,7 @@
 1450180608,1450311679,GB
 1450311680,1450442751,FI
 1450442752,1450704895,CH
-1450704896,1450731519,RO
-1450731520,1450732031,HU
-1450732032,1450860543,RO
-1450860544,1450864639,HU
-1450864640,1451173887,RO
+1450704896,1451173887,RO
 1451173888,1451175935,HU
 1451175936,1451229183,RO
 1451229184,1455423487,GB
@@ -22528,7 +22762,6 @@
 1464074240,1464336383,IL
 1464336384,1464467455,DK
 1464467456,1464598527,GB
-1464598528,1464664063,NO
 1464664064,1464801791,DE
 1464801792,1464801855,GB
 1464801856,1464860671,DE
@@ -22581,7 +22814,8 @@
 1466616576,1466617343,ES
 1466617344,1466617471,FR
 1466617472,1466617599,GB
-1466617600,1466630143,DE
+1466617600,1466617855,ES
+1466617856,1466630143,DE
 1466630144,1466695679,IR
 1466695680,1466761215,FI
 1466761216,1466826751,SA
@@ -22619,11 +22853,14 @@
 1467369760,1467369791,HR
 1467369792,1467369855,SE
 1467369856,1467369887,GB
-1467369888,1467369919,DE
+1467369888,1467369903,RU
+1467369904,1467369919,DE
 1467369920,1467369951,RU
 1467369952,1467370495,DE
 1467370496,1467371007,IE
-1467371008,1467383807,DE
+1467371008,1467371775,DE
+1467371776,1467372031,RU
+1467372032,1467383807,DE
 1467383808,1467400191,BG
 1467400192,1467416575,RU
 1467416576,1467432959,PL
@@ -22634,7 +22871,7 @@
 1467465760,1467465791,AT
 1467465792,1467465799,NL
 1467465800,1467465807,AT
-1467465808,1467465823,DE
+1467465808,1467465823,NL
 1467465824,1467465855,AT
 1467465856,1467466015,NL
 1467466016,1467466023,DE
@@ -22741,6 +22978,7 @@
 1475158016,1475160063,IS
 1475160064,1475162111,RU
 1475162112,1475170303,GB
+1475170304,1475172351,ES
 1475172352,1475174399,DE
 1475174400,1475175047,NL
 1475175048,1475175055,US
@@ -22795,7 +23033,11 @@
 1475211264,1475213311,DE
 1475213312,1475215359,FR
 1475215360,1475223551,IT
-1475223552,1475233791,NO
+1475223552,1475229695,NO
+1475229696,1475229759,SE
+1475229760,1475229951,NO
+1475229952,1475229967,SE
+1475229968,1475233791,NO
 1475233792,1475234303,GB
 1475234304,1475234559,IE
 1475234560,1475235839,GB
@@ -22854,7 +23096,6 @@
 1475282944,1475284991,NL
 1475284992,1475287039,GB
 1475287040,1475289087,RU
-1475289088,1475291135,UA
 1475291136,1475293183,PL
 1475293184,1475295231,GB
 1475295232,1475297279,PL
@@ -22884,7 +23125,9 @@
 1475362816,1475379199,FR
 1475379200,1475395583,GB
 1475395584,1475411967,LU
-1475411968,1475421239,IT
+1475411968,1475412471,IT
+1475412472,1475412479,ES
+1475412480,1475421239,IT
 1475421240,1475421247,FR
 1475421248,1475428351,IT
 1475428352,1475444735,SE
@@ -22950,8 +23193,7 @@
 1475958016,1475959039,GB
 1475959040,1475959047,US
 1475959048,1475960831,GB
-1475960832,1475961087,DE
-1475961088,1475969023,NL
+1475960832,1475969023,NL
 1475969024,1475977215,CZ
 1475977216,1475985407,SE
 1475985408,1475993599,PL
@@ -23070,7 +23312,9 @@
 1481988032,1481988095,NL
 1481988096,1481988159,GI
 1481988160,1481988167,RU
-1481988168,1481988351,NL
+1481988168,1481988319,NL
+1481988320,1481988335,BZ
+1481988336,1481988351,NL
 1481988352,1481988607,GB
 1481988608,1481990143,NL
 1481990144,1481998335,MK
@@ -23130,10 +23374,19 @@
 1486094336,1486127103,ES
 1486127104,1486159871,FI
 1486159872,1486192639,IS
-1486192640,1486225407,IT
+1486192640,1486211687,IT
+1486211688,1486211695,GB
+1486211696,1486225407,IT
 1486225408,1486258175,DE
 1486258176,1486290943,CS
-1486290944,1486292991,IE
+1486290944,1486290959,IE
+1486290960,1486291071,GB
+1486291072,1486291103,IE
+1486291104,1486291199,GB
+1486291200,1486291215,IE
+1486291216,1486291455,GB
+1486291456,1486291487,IE
+1486291488,1486292991,GB
 1486292992,1486295039,RU
 1486295040,1486297087,ES
 1486297088,1486299135,IE
@@ -23172,10 +23425,11 @@
 1486342144,1486344191,RU
 1486344192,1486346239,NO
 1486346240,1486348287,GB
+1486348288,1486350335,US
 1486350336,1486352383,TR
-1486352384,1486353663,BE
-1486353664,1486353919,NL
-1486353920,1486354431,BE
+1486352384,1486353535,BE
+1486353536,1486353663,NL
+1486353664,1486354431,BE
 1486354432,1486356479,RU
 1486356480,1486487551,DE
 1486487552,1486618623,UA
@@ -23211,18 +23465,17 @@
 1489642752,1489644543,IT
 1489644544,1489645055,GB
 1489645056,1489645567,IT
-1489645568,1489646079,GB
-1489646080,1489646334,BA
-1489646335,1489646591,IT
+1489645568,1489646335,GB
+1489646336,1489646591,IT
 1489646592,1489646847,GB
 1489646848,1489647103,IT
-1489647104,1489647359,DE
+1489647104,1489647359,GB
 1489647360,1489648639,IT
 1489648640,1489648895,GB
 1489648896,1489649407,IT
 1489649408,1489650687,FR
 1489650688,1489661951,IT
-1489661952,1489662719,FR
+1489661952,1489662719,GB
 1489662720,1489662975,ZA
 1489662976,1489663487,FR
 1489663488,1489663999,ES
@@ -23263,10 +23516,7 @@
 1490196480,1490196735,AL
 1490196736,1490196991,CZ
 1490196992,1490197247,IE
-1490197248,1490205439,GB
-1490205440,1490205471,IE
-1490205472,1490205567,IT
-1490205568,1490206719,GB
+1490197248,1490206719,GB
 1490206720,1490223103,GE
 1490223104,1490255871,GB
 1490255872,1490272255,NL
@@ -23312,7 +23562,6 @@
 1490935040,1490935295,ES
 1490944000,1491075071,LT
 1491075072,1493172223,TR
-1493172224,1493303295,IL
 1493303296,1493434367,FR
 1493434368,1493565439,SA
 1493565440,1493696511,ES
@@ -23329,7 +23578,7 @@
 1494286336,1494294527,HR
 1494294528,1494302719,RU
 1494302720,1494310911,FI
-1494310912,1494319103,LB
+1494310912,1494319103,GB
 1494319104,1494327295,MT
 1494327296,1494335487,IT
 1494335488,1494343679,ES
@@ -23406,7 +23655,9 @@
 1495140352,1495150847,FR
 1495150848,1495151103,GB
 1495151104,1495151359,NL
-1495151360,1495163903,FR
+1495151360,1495154687,FR
+1495162368,1495162879,US
+1495162880,1495163903,FR
 1495164416,1495164671,FR
 1495164928,1495165055,FR
 1495165184,1495165199,FR
@@ -23419,9 +23670,7 @@
 1495170304,1495170335,FR
 1495170560,1495170815,FR
 1495170816,1495171071,GB
-1495171072,1495175167,NL
-1495175168,1495176191,US
-1495176192,1495203839,NL
+1495171072,1495203839,NL
 1495203840,1495205887,DE
 1495205888,1495207935,CZ
 1495207936,1495209983,RU
@@ -23433,6 +23682,7 @@
 1495220224,1495222271,PL
 1495222272,1495224319,IT
 1495224320,1495228415,RU
+1495228416,1495230463,NL
 1495230464,1495234559,RU
 1495234560,1495236607,CH
 1495236608,1495237711,AT
@@ -23447,6 +23697,7 @@
 1495244800,1495246847,CZ
 1495246848,1495248895,IE
 1495248896,1495250943,GR
+1495250944,1495252991,RU
 1495252992,1495255039,BH
 1495255040,1495257087,IT
 1495257088,1495259135,GB
@@ -23472,7 +23723,9 @@
 1495801856,1495802879,GB
 1495802880,1495875583,RO
 1495875584,1495891967,MD
-1495891968,1496078335,RO
+1495891968,1495937023,RO
+1495937024,1495937535,ES
+1495937536,1496078335,RO
 1496078336,1496079359,MD
 1496079360,1496121343,RO
 1496121344,1496122367,MD
@@ -23500,13 +23753,18 @@
 1500094464,1500102655,AT
 1500102656,1500103935,NL
 1500103936,1500103967,VG
-1500103968,1500110847,NL
+1500103968,1500104063,NL
+1500104064,1500104071,DE
+1500104072,1500110847,NL
 1500110848,1500119039,UA
 1500119040,1500127231,TR
 1500127232,1500135423,RU
 1500135424,1500135555,DE
 1500135556,1500135559,CH
-1500135560,1500143615,DE
+1500135560,1500140560,DE
+1500140561,1500140564,AT
+1500140565,1500140568,CH
+1500140569,1500143615,DE
 1500143616,1500151807,BG
 1500151808,1500153855,GB
 1500153856,1500155903,IE
@@ -23527,7 +23785,7 @@
 1500184576,1500186623,GB
 1500186624,1500188671,KW
 1500188672,1500190719,GB
-1500190720,1500192767,RU
+1500190720,1500194815,RU
 1500194816,1500196863,GB
 1500196864,1500198911,ES
 1500198912,1500200959,GB
@@ -23543,7 +23801,6 @@
 1500217600,1500218111,DE
 1500218112,1500218367,CZ
 1500218368,1500219391,DE
-1500219392,1500221439,RU
 1500221440,1500223487,SK
 1500223488,1500225535,PL
 1500225536,1500227583,DE
@@ -23576,15 +23833,15 @@
 1500434448,1500434463,CS
 1500434464,1500434567,RS
 1500434568,1500434623,CS
-1500434624,1500434687,RS
-1500434688,1500434943,CS
-1500434944,1500435199,RS
+1500434624,1500435199,RS
 1500435200,1500435455,CS
 1500435456,1500435967,RS
 1500435968,1500436479,CS
 1500436480,1500437055,RS
-1500437056,1500437503,CS
-1500437504,1500438527,RS
+1500437056,1500437087,CS
+1500437088,1500437183,RS
+1500437184,1500437247,CS
+1500437248,1500438527,RS
 1500438528,1500446719,CS
 1500446720,1500463103,LV
 1500463104,1500479487,CZ
@@ -23635,8 +23892,8 @@
 1502953472,1502969855,MD
 1502969856,1502975231,US
 1502975232,1502975247,DE
-1502975248,1502975295,IE
-1502975296,1502975311,DE
+1502975248,1502975263,IE
+1502975264,1502975311,DE
 1502975312,1502975319,IE
 1502975320,1502975327,DE
 1502975328,1502975375,IE
@@ -23653,14 +23910,14 @@
 1502979104,1502979111,ES
 1502979112,1502979119,DE
 1502979120,1502979215,ES
-1502979216,1502979327,DE
-1502979328,1502980095,ES
+1502979216,1502980095,DE
 1502980096,1502980159,US
 1502980160,1502980351,DE
 1502980352,1502980871,US
 1502980872,1502981119,DE
 1502981120,1502981887,US
-1502981888,1502986255,DE
+1502981888,1502982143,NL
+1502982144,1502986255,DE
 1502986256,1502986495,TR
 1502986496,1502986511,DE
 1502986512,1502986751,PL
@@ -23713,25 +23970,23 @@
 1504051200,1504083967,FI
 1504083968,1504116735,DE
 1504116736,1504149503,PL
-1504149504,1504151647,GB
-1504151648,1504151679,IE
-1504151680,1504152127,GB
+1504149504,1504152127,GB
 1504152128,1504152191,IE
 1504152192,1504152447,GB
 1504152448,1504152575,IE
 1504152576,1504153855,GB
 1504153856,1504154111,IE
-1504154112,1504154367,GB
-1504154368,1504154623,IE
-1504154624,1504156927,GB
+1504154112,1504154623,GB
+1504154624,1504155647,IE
+1504155648,1504156927,GB
 1504156928,1504157183,IE
 1504157184,1504160255,GB
 1504160256,1504161023,IE
 1504161024,1504161279,GB
 1504161280,1504161535,IE
 1504161536,1504164607,GB
-1504164608,1504165887,IE
-1504165888,1504169983,GB
+1504164608,1504164863,IE
+1504164864,1504169983,GB
 1504169984,1504170239,IE
 1504170240,1504171007,GB
 1504171008,1504171263,PT
@@ -23761,6 +24016,7 @@
 1505099776,1505230847,DE
 1505230848,1505239039,RU
 1505239040,1505247231,IE
+1505247232,1505255423,UA
 1505255424,1505263615,IT
 1505263616,1505271807,DK
 1505271808,1505273087,NL
@@ -23882,7 +24138,8 @@
 1506440720,1506440735,US
 1506440736,1506440767,GB
 1506440768,1506440799,US
-1506440800,1506440959,DE
+1506440800,1506440831,DE
+1506440832,1506440959,US
 1506440960,1506440991,FR
 1506440992,1506440999,US
 1506441000,1506441007,GB
@@ -23906,8 +24163,8 @@
 1506442240,1506442383,US
 1506442384,1506442399,GB
 1506442400,1506442415,FR
-1506442416,1506442423,US
-1506442424,1506442431,DE
+1506442416,1506442427,US
+1506442428,1506442431,DE
 1506442432,1506442463,HK
 1506442464,1506442623,DE
 1506442624,1506442655,GB
@@ -23929,7 +24186,8 @@
 1506442992,1506442999,GB
 1506443000,1506443003,IE
 1506443004,1506443151,DE
-1506443152,1506443167,US
+1506443152,1506443159,US
+1506443160,1506443167,DE
 1506443168,1506443183,NL
 1506443184,1506443199,DE
 1506443200,1506443263,US
@@ -23939,7 +24197,8 @@
 1506445520,1506445527,GB
 1506445528,1506445703,FR
 1506445704,1506445711,NL
-1506445712,1506445791,FR
+1506445712,1506445719,GB
+1506445720,1506445791,FR
 1506445792,1506445807,GB
 1506445808,1506446335,FR
 1506446336,1506447359,NL
@@ -23954,22 +24213,22 @@
 1506448736,1506448895,GB
 1506448896,1506449167,BE
 1506449168,1506449171,GB
-1506449172,1506449375,BE
-1506449376,1506449407,GB
+1506449172,1506449391,BE
+1506449392,1506449407,GB
 1506449408,1506449663,NL
 1506449664,1506449919,SK
 1506449920,1506449927,CH
-1506449928,1506449935,GB
-1506449936,1506450431,CH
+1506449928,1506449951,GB
+1506449952,1506450431,CH
 1506450432,1506450767,CZ
 1506450768,1506450775,GB
 1506450776,1506450783,CZ
-1506450784,1506450815,GB
-1506450816,1506450943,CZ
+1506450784,1506450847,GB
+1506450848,1506450943,CZ
 1506450944,1506451007,DK
 1506451008,1506451199,GB
-1506451200,1506451899,ES
-1506451900,1506451903,GB
+1506451200,1506451895,ES
+1506451896,1506451903,GB
 1506451904,1506451967,ES
 1506451968,1506452031,GB
 1506452032,1506452223,ES
@@ -23996,9 +24255,7 @@
 1506456576,1506456831,GB
 1506456832,1506457087,IT
 1506457088,1506458239,GB
-1506458240,1506458359,CH
-1506458360,1506458367,GB
-1506458368,1506458623,CH
+1506458240,1506458623,CH
 1506458624,1506459135,GB
 1506459136,1506459647,BE
 1506459648,1506460339,FR
@@ -24012,9 +24269,7 @@
 1506461360,1506461695,IT
 1506461696,1506462207,FR
 1506462208,1506462463,ES
-1506462464,1506462607,FR
-1506462608,1506462623,GB
-1506462624,1506462719,FR
+1506462464,1506462719,FR
 1506462720,1506463231,IT
 1506463232,1506463487,SE
 1506463488,1506463999,DE
@@ -24034,16 +24289,22 @@
 1506467584,1506468351,IT
 1506468352,1506468607,GB
 1506468608,1506468863,TZ
-1506468864,1506469375,IT
-1506469376,1506469887,GB
-1506469888,1506470143,IT
+1506468864,1506469383,IT
+1506469384,1506469391,GB
+1506469392,1506469399,IT
+1506469400,1506469407,GB
+1506469408,1506469439,IT
+1506469440,1506469503,GB
+1506469504,1506470143,IT
 1506470144,1506470399,GB
 1506470400,1506470655,DE
 1506470656,1506471679,IT
-1506471680,1506472191,GB
+1506471680,1506471935,GB
+1506471936,1506471975,NL
+1506471976,1506472191,GB
 1506472192,1506472447,IT
-1506472448,1506472703,GB
-1506472704,1506473215,IT
+1506472448,1506472959,GB
+1506472960,1506473215,IT
 1506473216,1506473471,GB
 1506473472,1506474271,IT
 1506474272,1506474303,SE
@@ -24069,7 +24330,7 @@
 1506743216,1506743232,GB
 1506743233,1506744319,SE
 1506744320,1506746367,NL
-1506748416,1506750463,RU
+1506746368,1506750463,RU
 1506750464,1506752511,GB
 1506752512,1506754559,IE
 1506754560,1506758655,RU
@@ -24082,7 +24343,9 @@
 1506770944,1506772991,NL
 1506772992,1506775039,GB
 1506775040,1506777087,AT
-1506777088,1506783231,GB
+1506777088,1506781695,GB
+1506781696,1506781951,IE
+1506781952,1506783231,GB
 1506783232,1506785279,RU
 1506785280,1506787327,UA
 1506787328,1506789375,KW
@@ -24107,7 +24370,11 @@
 1507336192,1507336511,CS
 1507336512,1507336959,RS
 1507336960,1507337727,SR
-1507337728,1507343071,RS
+1507337728,1507341727,RS
+1507341728,1507341743,CS
+1507341744,1507342959,RS
+1507342960,1507342967,CS
+1507342968,1507343071,RS
 1507343072,1507343103,CS
 1507343104,1507360767,RS
 1507360768,1507377151,CS
@@ -24122,14 +24389,14 @@
 1507664128,1507664383,GR
 1507664384,1507664767,DE
 1507664768,1507664895,US
-1507664896,1507665663,GR
+1507664896,1507665407,GR
+1507665408,1507665663,IT
 1507665664,1507666431,US
 1507666432,1507666559,GR
 1507666560,1507666591,FR
 1507666592,1507666623,GR
-1507666624,1507666655,IT
-1507666656,1507666671,IL
-1507666672,1507666943,GB
+1507666624,1507666687,IT
+1507666688,1507666943,GB
 1507666944,1507667455,IT
 1507667456,1507667711,DE
 1507667712,1507667967,US
@@ -24162,11 +24429,7 @@
 1508486464,1508486527,DE
 1508486528,1508491263,CZ
 1508491264,1508507647,SE
-1508507648,1508515887,GB
-1508515888,1508515895,IE
-1508515896,1508519967,GB
-1508519968,1508519983,IE
-1508519984,1508521535,GB
+1508507648,1508521535,GB
 1508521536,1508521551,IE
 1508521552,1508524031,GB
 1508524032,1508540415,IE
@@ -24181,20 +24444,20 @@
 1508638720,1508639231,SE
 1508639232,1508640767,DK
 1508640768,1508641279,SE
-1508641280,1508641791,DK
-1508641792,1508642175,SE
+1508641280,1508641535,DK
+1508641536,1508642175,SE
 1508642176,1508642303,DK
 1508642304,1508642559,SE
 1508642560,1508642815,DK
 1508642816,1508646911,SE
 1508646912,1508646927,DK
-1508646928,1508647679,SE
-1508647680,1508647935,DK
-1508647936,1508648447,SE
+1508646928,1508648447,SE
 1508648448,1508648703,DK
-1508648704,1508650751,SE
-1508650752,1508651135,DK
-1508651136,1508655103,SE
+1508648704,1508651007,SE
+1508651008,1508651135,DK
+1508651136,1508652543,SE
+1508652544,1508654079,DK
+1508654080,1508655103,SE
 1508655104,1508671487,FI
 1508671488,1508687871,CH
 1508687872,1508704255,UZ
@@ -24225,7 +24488,7 @@
 1509425152,1509429247,NO
 1509429248,1509433343,GB
 1509433344,1509437439,CH
-1509441536,1509445631,GB
+1509437440,1509445631,GB
 1509445632,1509449727,LV
 1509449728,1509453823,ES
 1509453824,1509457919,RU
@@ -24513,10 +24776,11 @@
 1520205824,1520230399,RU
 1520230400,1520230911,NL
 1520230912,1520231423,RU
-1520231424,1520231935,NL
-1520231936,1520271359,RU
-1520271360,1520302079,SI
-1520302080,1520304127,HR
+1520231424,1520232191,NL
+1520232192,1520232447,RU
+1520232448,1520233471,NL
+1520233472,1520271359,RU
+1520271360,1520304127,SI
 1520304128,1520435199,TR
 1520435200,1521483775,ES
 1521483776,1522008063,CZ
@@ -24599,7 +24863,7 @@
 1533462528,1533464575,RU
 1533464576,1533466623,NL
 1533466624,1533468671,RU
-1533468672,1533470719,RS
+1533468672,1533470719,CS
 1533470720,1533472767,KW
 1533472768,1533474815,ES
 1533474816,1533476863,FR
@@ -24648,7 +24912,9 @@
 1534328832,1534459903,ES
 1534459904,1534590975,AT
 1534590976,1534656511,HU
-1534656512,1534713903,FR
+1534656512,1534711807,FR
+1534711808,1534712831,BE
+1534712832,1534713903,FR
 1534713904,1534713919,BE
 1534713920,1534714015,FR
 1534714016,1534714031,DE
@@ -24678,7 +24944,7 @@
 1534714528,1534714559,FR
 1534714560,1534714575,BE
 1534714576,1534714703,FR
-1534714704,1534714719,PL
+1534714704,1534714719,CH
 1534714720,1534714751,BE
 1534714752,1534714767,DE
 1534714768,1534714783,FR
@@ -24697,8 +24963,8 @@
 1534715184,1534715263,FR
 1534715264,1534715279,ES
 1534715280,1534715295,FR
-1534715296,1534715343,ES
-1534715344,1534715375,FR
+1534715296,1534715327,ES
+1534715328,1534715375,FR
 1534715376,1534715391,ES
 1534715392,1534715407,PL
 1534715408,1534715423,ES
@@ -24706,12 +24972,11 @@
 1534715488,1534715503,ES
 1534715504,1534715519,CH
 1534715520,1534715551,FR
-1534715552,1534715583,ES
-1534715584,1534715599,FR
+1534715552,1534715599,ES
 1534715600,1534715615,BE
 1534715616,1534715631,FR
 1534715632,1534715647,ES
-1534715648,1534715663,FR
+1534715648,1534715663,PL
 1534715664,1534715679,ES
 1534715680,1534715743,FR
 1534715744,1534715759,PL
@@ -24720,7 +24985,9 @@
 1534715808,1534715839,PL
 1534715840,1534715871,FR
 1534715872,1534715887,DE
-1534715888,1534716047,FR
+1534715888,1534715919,FR
+1534715920,1534715935,ES
+1534715936,1534716047,FR
 1534716048,1534716063,GB
 1534716064,1534716175,FR
 1534716176,1534716191,GB
@@ -24729,15 +24996,14 @@
 1534716256,1534716511,FR
 1534716512,1534716527,DE
 1534716528,1534716543,FR
-1534716544,1534716559,ES
+1534716544,1534716559,GB
 1534716560,1534716591,FR
 1534716592,1534716607,PL
 1534716608,1534716671,FR
 1534716672,1534716687,PL
 1534716688,1534716703,FR
 1534716704,1534716735,ES
-1534716736,1534716831,FR
-1534716832,1534716847,BE
+1534716736,1534716847,FR
 1534716848,1534716863,PL
 1534716864,1534716879,FR
 1534716880,1534716895,BE
@@ -24750,9 +25016,7 @@
 1534717056,1534717071,ES
 1534717072,1534717119,FR
 1534717120,1534717135,IT
-1534717136,1534717151,FR
-1534717152,1534717167,PL
-1534717168,1534717199,FR
+1534717136,1534717199,FR
 1534717200,1534717215,DE
 1534717216,1534717231,PL
 1534717232,1534717263,FR
@@ -24771,8 +25035,8 @@
 1534717584,1534717663,FR
 1534717664,1534717679,GB
 1534717680,1534717695,FR
-1534717696,1534717823,PL
-1534717824,1534717839,FR
+1534717696,1534717759,PL
+1534717760,1534717839,ES
 1534717840,1534717855,GB
 1534717856,1534717871,DE
 1534717872,1534717919,FR
@@ -24820,7 +25084,7 @@
 1534719456,1534719471,FR
 1534719472,1534719487,GB
 1534719488,1534719647,FR
-1534719648,1534719663,CH
+1534719648,1534719663,GB
 1534719664,1534719679,PL
 1534719680,1534719695,GB
 1534719696,1534719759,FR
@@ -24838,10 +25102,11 @@
 1534720064,1534720079,IT
 1534720080,1534720095,GB
 1534720096,1534720111,FR
-1534720112,1534720127,GB
+1534720112,1534720127,ES
 1534720128,1534720175,FR
 1534720176,1534720191,BE
-1534720192,1534720223,FR
+1534720192,1534720207,FR
+1534720208,1534720223,GB
 1534720224,1534720255,BE
 1534720256,1534720287,PL
 1534720288,1534720367,FR
@@ -24851,9 +25116,11 @@
 1534720464,1534720479,FR
 1534720480,1534720495,GB
 1534720496,1534720511,PL
-1534720512,1534720591,FR
+1534720512,1534720575,FR
+1534720576,1534720591,ES
 1534720592,1534720607,CH
-1534720608,1534720655,FR
+1534720608,1534720639,FR
+1534720640,1534720655,GB
 1534720656,1534720671,PL
 1534720672,1534720703,FR
 1534720704,1534720735,PL
@@ -24866,10 +25133,10 @@
 1534720832,1534720863,PL
 1534720864,1534720959,FR
 1534720960,1534720975,ES
-1534720976,1534721103,FR
-1534721104,1534721119,ES
+1534720976,1534721119,FR
 1534721120,1534721135,IT
-1534721136,1534721231,FR
+1534721136,1534721151,CH
+1534721152,1534721231,FR
 1534721232,1534721247,DE
 1534721248,1534721263,FR
 1534721264,1534721279,ES
@@ -24879,7 +25146,7 @@
 1534721344,1534721359,ES
 1534721360,1534721375,FR
 1534721376,1534721391,ES
-1534721392,1534721407,FR
+1534721392,1534721407,GB
 1534721408,1534721439,DE
 1534721440,1534721455,BE
 1534721456,1534721503,FR
@@ -24894,15 +25161,15 @@
 1534721680,1534721759,FR
 1534721760,1534721775,GB
 1534721776,1534721791,ES
-1534721792,1534721807,IT
+1534721792,1534721807,BE
 1534721808,1534721855,FR
-1534721856,1534721871,GB
-1534721872,1534721903,FR
+1534721856,1534721887,ES
+1534721888,1534721903,FR
 1534721904,1534721919,DE
 1534721920,1534721935,FR
 1534721936,1534721951,PL
 1534721952,1534721983,FR
-1534721984,1534721999,ES
+1534721984,1534721999,PL
 1534722000,1534722015,FR
 1534722016,1534722031,ES
 1534722032,1534722047,BE
@@ -24971,8 +25238,8 @@
 1536036864,1536040959,AT
 1536040960,1536045055,GB
 1536045056,1536045567,DE
-1536045568,1536045823,IQ
-1536045824,1536046591,DE
+1536045568,1536046079,IQ
+1536046080,1536046591,DE
 1536046592,1536046847,IQ
 1536046848,1536046975,DE
 1536046976,1536047039,SA
@@ -25061,9 +25328,7 @@
 1536622592,1536626687,GB
 1536626688,1536630783,IT
 1536630784,1536634879,RU
-1536634880,1536635647,FR
-1536635648,1536635903,CH
-1536635904,1536643071,FR
+1536634880,1536643071,FR
 1536643072,1536647167,TR
 1536647168,1536647434,ES
 1536647435,1536647435,PT
@@ -25072,18 +25337,18 @@
 1536655360,1536659455,GE
 1536659456,1536659743,DE
 1536659744,1536659751,IQ
-1536659752,1536659759,DE
+1536659752,1536659759,NG
 1536659760,1536659775,BI
 1536659776,1536659807,IQ
 1536659808,1536659823,SD
-1536659824,1536659903,IQ
-1536659904,1536659935,DE
+1536659824,1536659839,IQ
+1536659840,1536659935,DE
 1536659936,1536659967,MR
 1536659968,1536659975,EG
 1536659976,1536659991,DE
 1536659992,1536660003,EG
 1536660004,1536660007,SO
-1536660008,1536660015,EG
+1536660008,1536660015,DE
 1536660016,1536660019,KW
 1536660020,1536660023,DE
 1536660024,1536660031,IR
@@ -25098,7 +25363,7 @@
 1536662304,1536662311,IR
 1536662312,1536662335,LB
 1536662336,1536662351,AE
-1536662352,1536662359,DE
+1536662352,1536662359,TD
 1536662360,1536662367,IR
 1536662368,1536662399,IQ
 1536662400,1536662431,DE
@@ -25121,9 +25386,7 @@
 1537212416,1538260991,FR
 1538260992,1538785279,BE
 1538785280,1538793471,NL
-1538793472,1538794839,DE
-1538794840,1538794847,US
-1538794848,1538797567,DE
+1538793472,1538797567,DE
 1538797568,1538799551,NL
 1538799552,1538799615,DE
 1538799616,1538801663,NL
@@ -25145,7 +25408,9 @@
 1538879488,1538883583,RS
 1538883584,1538891775,BE
 1538891776,1538899967,DE
-1538899968,1538902063,SI
+1538899968,1538901167,SI
+1538901168,1538901175,IT
+1538901176,1538902063,SI
 1538902064,1538902079,NZ
 1538902080,1538908159,SI
 1538908160,1538916351,RU
@@ -25370,8 +25635,7 @@
 1539426304,1539427327,BG
 1539427328,1539428351,UA
 1539428352,1539429375,PL
-1539429376,1539430399,RU
-1539431424,1539434495,RU
+1539429376,1539434495,RU
 1539434496,1539435519,UA
 1539435520,1539437567,RU
 1539437568,1539439615,GB
@@ -25489,7 +25753,6 @@
 1539504640,1539505151,UA
 1539505152,1539506175,RU
 1539506176,1539506687,NL
-1539506688,1539507199,IT
 1539507200,1539508223,RO
 1539508224,1539508735,NO
 1539508736,1539509759,UA
@@ -25645,7 +25908,7 @@
 1539618816,1539619839,GB
 1539619840,1539620863,RU
 1539620864,1539623935,UA
-1539623936,1539625983,RU
+1539624960,1539625983,RU
 1539625984,1539627007,PL
 1539627008,1539628031,RU
 1539628032,1539629055,UA
@@ -26216,6 +26479,7 @@
 1539866624,1539867647,IT
 1539867648,1539869695,UA
 1539869696,1539870719,ES
+1539870720,1539871743,IL
 1539871744,1539872767,ES
 1539872768,1539873791,SE
 1539873792,1539876863,UA
@@ -26246,7 +26510,6 @@
 1539911680,1539913727,RU
 1539913728,1539914751,CH
 1539914752,1539915775,SE
-1539915776,1539916799,PL
 1539916800,1539917823,UA
 1539917824,1539918847,RU
 1539918848,1539920895,RO
@@ -26323,7 +26586,6 @@
 1540008960,1540011007,PL
 1540011008,1540014079,RU
 1540014080,1540015103,PL
-1540015104,1540016127,RU
 1540016128,1540017151,KR
 1540017152,1540018175,RU
 1540018176,1540020223,UA
@@ -26846,7 +27108,6 @@
 1540394752,1540395007,DK
 1540395008,1540395263,GE
 1540395264,1540395519,UA
-1540395520,1540395775,GB
 1540395776,1540396031,IL
 1540396032,1540396287,NO
 1540396288,1540396543,AM
@@ -27244,8 +27505,7 @@
 1540584448,1540586495,UA
 1540586496,1540588543,RU
 1540588544,1540589567,UA
-1540589568,1540591615,RU
-1540592640,1540593663,RU
+1540589568,1540593663,RU
 1540593664,1540594687,GB
 1540594688,1540595711,IT
 1540595712,1540596735,KZ
@@ -27354,7 +27614,6 @@
 1540642560,1540642815,DE
 1540642816,1540643071,IE
 1540643072,1540643327,UZ
-1540643328,1540643583,GB
 1540643584,1540643839,CH
 1540643840,1540644095,NO
 1540644096,1540644607,GB
@@ -27376,12 +27635,135 @@
 1540648448,1540648959,RO
 1540648960,1540649215,FR
 1540649216,1540649471,DE
+1540649472,1540649727,IL
+1540649728,1540649983,GB
+1540649984,1540650239,FR
+1540650240,1540650495,CH
+1540650496,1540650751,RU
+1540650752,1540651007,FR
+1540651008,1540651263,RO
+1540651264,1540651519,CH
+1540651520,1540651775,MK
+1540651776,1540652031,RU
+1540652032,1540652543,UA
+1540652544,1540652799,TR
+1540652800,1540653055,LV
+1540653056,1540653311,FR
+1540653312,1540653567,DK
+1540653568,1540653823,DE
+1540653824,1540654079,GB
+1540654080,1540654335,RS
+1540654336,1540654591,RU
+1540654592,1540654847,DE
+1540654848,1540655103,RU
+1540655104,1540655359,AT
+1540655360,1540655615,RU
+1540655616,1540655871,GB
+1540655872,1540656383,NL
+1540656384,1540656895,RU
+1540656896,1540657151,RO
+1540657152,1540657407,DE
+1540657408,1540657663,CY
+1540657664,1540657919,RU
+1540657920,1540658175,FR
+1540658176,1540658431,RO
+1540658432,1540659199,RU
+1540659200,1540659455,FR
+1540659456,1540659967,UA
+1540659968,1540660223,PL
+1540660224,1540660479,UA
+1540660480,1540660735,FR
+1540660736,1540660991,UA
+1540660992,1540661247,RO
+1540661248,1540661503,GB
+1540661504,1540662015,RO
+1540662016,1540662271,BG
+1540662272,1540662527,RO
+1540662528,1540662783,PL
+1540662784,1540663039,GB
+1540663040,1540663295,IT
+1540663296,1540663551,RU
+1540663552,1540664063,PL
+1540664064,1540664319,RU
+1540664320,1540664575,PL
+1540664576,1540665087,UA
+1540665088,1540665343,ES
+1540665344,1540665599,NL
+1540665600,1540665855,UA
+1540665856,1540666111,TR
+1540666112,1540666367,RU
+1540666368,1540666623,UZ
+1540666624,1540666879,DE
+1540666880,1540667135,GB
+1540667136,1540667647,NL
+1540667648,1540668159,BE
+1540668160,1540668415,AT
+1540668416,1540668671,SE
+1540668672,1540668927,IL
+1540668928,1540669695,RO
+1540669696,1540669951,KZ
+1540669952,1540670207,UA
+1540670208,1540670463,RU
+1540670464,1540670719,CH
+1540670720,1540671231,RU
+1540671232,1540671487,SI
+1540671488,1540671743,CH
+1540671744,1540671999,BG
+1540672000,1540672255,FR
+1540672256,1540672511,UA
+1540672512,1540672767,DE
+1540672768,1540673023,FR
+1540673024,1540673279,DE
+1540673280,1540673535,SE
+1540673536,1540673791,SI
+1540673792,1540674047,SE
+1540674048,1540674303,GB
+1540674304,1540674559,FR
+1540674560,1540674815,GB
+1540674816,1540675071,GE
+1540675072,1540675327,UA
+1540675328,1540675583,NL
+1540675584,1540675839,GB
+1540675840,1540676351,RU
+1540676352,1540676607,IT
+1540676608,1540677119,RU
+1540677120,1540677375,GB
+1540677376,1540677631,PL
+1540677632,1540677887,DK
+1540677888,1540678143,DE
+1540678144,1540678399,RU
+1540678400,1540678655,RO
+1540678656,1540678911,SE
+1540678912,1540679167,RO
+1540751360,1540752383,PL
+1540752384,1540753407,GB
+1540753408,1540754431,DE
+1540754432,1540755455,RO
+1540755456,1540756479,UA
+1540756480,1540757503,DK
+1540757504,1540758527,PL
+1540758528,1540760575,UA
+1540760576,1540761599,PL
+1540761600,1540762623,RU
+1540762624,1540763647,BZ
+1540763648,1540764671,UA
+1540764672,1540765695,PL
+1540765696,1540766719,RU
+1540766720,1540767743,IT
+1540767744,1540768767,GB
+1540769792,1540770815,IT
+1540770816,1540771839,RU
+1540771840,1540773887,UA
+1540773888,1540774911,SE
+1540774912,1540775935,GB
+1540775936,1540776959,RU
+1540776960,1540777983,IL
+1540777984,1540779007,HR
 1543503872,1545601023,GB
 1545601024,1545863167,SE
 1545863168,1545895935,RU
 1545895936,1545928703,BA
-1545928704,1545955327,SI
-1545955328,1545961471,HR
+1545928704,1545961471,SI
 1545961472,1545994239,RU
 1545994240,1546027007,CZ
 1546027008,1546059775,RU
@@ -27415,7 +27797,7 @@
 1546091008,1546091135,NA
 1546091136,1546091263,KM
 1546091264,1546091391,GN
-1546091392,1546091519,DE
+1546091392,1546091519,HT
 1546091520,1546091647,AF
 1546091648,1546091775,TD
 1546091776,1546091903,BF
@@ -27454,9 +27836,6 @@
 1546301440,1546303487,LU
 1546303488,1546305535,CH
 1546305536,1546307583,DE
-1546307584,1546307839,NL
-1546307840,1546307855,DE
-1546307856,1546309631,NL
 1546309632,1546311679,RU
 1546311680,1546313727,FR
 1546313728,1546315775,DE
@@ -27638,7 +28017,9 @@
 1547621144,1547621151,NG
 1547621152,1547621167,JE
 1547621168,1547621175,NG
-1547621176,1547624447,JE
+1547621176,1547621247,JE
+1547621248,1547621263,NG
+1547621264,1547624447,JE
 1547624448,1547628543,CZ
 1547628544,1547632639,BG
 1547632640,1547636735,TR
@@ -27649,7 +28030,9 @@
 1547657216,1547660287,RU
 1547660288,1547661311,BE
 1547661312,1547665407,LV
-1547665408,1547669503,GB
+1547665408,1547667807,GB
+1547667808,1547667815,LT
+1547667816,1547669503,GB
 1547669504,1547672575,AT
 1547672576,1547672831,HR
 1547672832,1547673599,AT
@@ -27683,6 +28066,7 @@
 1551544320,1551547391,DE
 1551548416,1551551487,DE
 1551555584,1551558655,FR
+1551564800,1551572991,FR
 1551572992,1551576063,NL
 1551577088,1551580159,NL
 1551630336,1551892479,RU
@@ -27753,7 +28137,9 @@
 1559838720,1559855103,UA
 1559855104,1559887871,HU
 1559887872,1559920639,PT
-1559920640,1559937023,LU
+1559920640,1559932927,LU
+1559932928,1559934975,DE
+1559934976,1559937023,LU
 1559937024,1559943167,DE
 1559943168,1559950335,LU
 1559950336,1559953407,DE
@@ -27778,7 +28164,17 @@
 1565984256,1565984511,CS
 1565984512,1565985279,RS
 1565985280,1565985791,CS
-1565985792,1566048255,RS
+1565985792,1565986159,RS
+1565986160,1565986175,CS
+1565986176,1565986239,RS
+1565986240,1565986271,CS
+1565986272,1565986295,RS
+1565986296,1565986303,CS
+1565986304,1565987119,RS
+1565987120,1565987135,CS
+1565987136,1565987531,RS
+1565987532,1565987535,CS
+1565987536,1566048255,RS
 1566048256,1566056447,RU
 1566056448,1566060543,IT
 1566060544,1566064639,UA
@@ -27880,7 +28276,7 @@
 1566384128,1566386175,RU
 1566386176,1566388223,FR
 1566388224,1566388735,HU
-1566388736,1566389247,US
+1566388736,1566389247,PT
 1566389248,1566389759,HU
 1566389760,1566390271,US
 1566390272,1566392319,LT
@@ -27889,12 +28285,24 @@
 1566396416,1566398463,GB
 1566398464,1566400511,RU
 1566400512,1566400575,NO
-1566400576,1566400639,NL
-1566400640,1566401023,NO
+1566400576,1566400607,NL
+1566400608,1566400639,GB
+1566400640,1566400671,NO
+1566400672,1566400703,DE
+1566400704,1566400735,NL
+1566400736,1566401023,NO
 1566401024,1566401055,US
-1566401056,1566401471,NO
+1566401056,1566401087,NO
+1566401088,1566401215,US
+1566401216,1566401471,NO
 1566401472,1566401535,US
-1566401536,1566402559,NO
+1566401536,1566401599,IN
+1566401600,1566401663,CN
+1566401664,1566401727,SG
+1566401728,1566401791,AU
+1566401792,1566401983,NO
+1566401984,1566402047,AU
+1566402048,1566402559,NO
 1566402560,1566404607,IT
 1566404608,1566406655,ES
 1566406656,1566408703,NL
@@ -27918,6 +28326,7 @@
 1566453760,1566455807,IQ
 1566455808,1566457855,PT
 1566457856,1566459903,CH
+1566459904,1566461951,GB
 1566461952,1566463999,DE
 1566464000,1566466047,IT
 1566466048,1566468095,ES
@@ -27963,6 +28372,7 @@
 1566552064,1566554111,TR
 1566554112,1566556159,UA
 1566556160,1566558207,RU
+1566558208,1566560255,JO
 1566560256,1566564351,IT
 1566564352,1566566399,IS
 1566566400,1566568447,FR
@@ -28004,7 +28414,9 @@
 1568243712,1568276479,FR
 1568276480,1568293135,DE
 1568293136,1568293151,SA
-1568293152,1568309247,DE
+1568293152,1568294223,DE
+1568294224,1568294239,IT
+1568294240,1568309247,DE
 1568309248,1568342015,RO
 1568342016,1568374783,BG
 1568374784,1568440319,RU
@@ -28046,7 +28458,7 @@
 1570592768,1570596863,PL
 1570596864,1570598911,UA
 1570598912,1570600959,PL
-1570600960,1570603007,RU
+1570600960,1570605055,RU
 1570605056,1570607103,NL
 1570607104,1570609151,RU
 1570609152,1570611199,PL
@@ -28079,7 +28491,8 @@
 1570667264,1570667267,ES
 1570667268,1570667519,SE
 1570667520,1570667523,NL
-1570667524,1570667775,SE
+1570667524,1570667527,IT
+1570667528,1570667775,SE
 1570667776,1570667779,NL
 1570667780,1570668031,SE
 1570668032,1570668035,NL
@@ -28102,9 +28515,10 @@
 1571430400,1571434495,UA
 1571434496,1571438591,RU
 1571438592,1571442687,UA
-1571442688,1571446783,RU
-1571446784,1571552255,CZ
-1571552256,1571553279,RU
+1571442688,1571450879,RU
+1571450880,1571454975,CZ
+1571454976,1571459071,RU
+1571459072,1571553279,CZ
 1571553280,1571684351,IL
 1571684352,1571686399,ES
 1571686400,1571688447,GB
@@ -28215,6 +28629,7 @@
 1572425728,1572429823,LB
 1572429824,1572433919,CZ
 1572433920,1572438015,IT
+1572438016,1572442111,AT
 1572442112,1572446207,RU
 1572446208,1572450303,NO
 1572450304,1572458495,RU
@@ -28431,18 +28846,15 @@
 1578590480,1578590495,IT
 1578590496,1578590511,PL
 1578590512,1578590543,FR
-1578590544,1578590559,ES
-1578590560,1578590575,GB
+1578590544,1578590575,ES
 1578590576,1578590591,CH
 1578590592,1578590623,FR
-1578590624,1578590639,GB
-1578590640,1578590655,FR
-1578590656,1578590687,GB
+1578590624,1578590687,GB
 1578590688,1578590703,FR
 1578590704,1578590719,PL
 1578590720,1578590799,FR
-1578590800,1578590831,GB
-1578590832,1578590879,FR
+1578590800,1578590847,GB
+1578590848,1578590879,FR
 1578590880,1578590895,PL
 1578590896,1578590911,GB
 1578590912,1578590927,ES
@@ -28451,11 +28863,12 @@
 1578590960,1578590975,FR
 1578590976,1578590991,GB
 1578590992,1578591007,ES
-1578591008,1578591039,FR
+1578591008,1578591023,FR
+1578591024,1578591039,PL
 1578591040,1578591055,NL
 1578591056,1578591087,FR
 1578591088,1578591103,ES
-1578591104,1578591119,PL
+1578591104,1578591119,DE
 1578591120,1578591135,CH
 1578591136,1578591151,FR
 1578591152,1578591167,ES
@@ -28464,12 +28877,12 @@
 1578591200,1578591247,FR
 1578591248,1578591263,PL
 1578591264,1578591295,FR
-1578591296,1578591327,PL
-1578591328,1578591343,FR
+1578591296,1578591343,PL
 1578591344,1578591359,ES
 1578591360,1578591375,PL
-1578591376,1578591407,FR
-1578591408,1578591423,CH
+1578591376,1578591391,FR
+1578591392,1578591407,CH
+1578591408,1578591423,GB
 1578591424,1578591471,FR
 1578591472,1578591487,PL
 1578591488,1578591503,FR
@@ -28500,11 +28913,73 @@
 1578592160,1578592175,ES
 1578592176,1578592223,FR
 1578592224,1578592255,ES
-1578592256,1578594319,FR
+1578592256,1578592271,FR
+1578592272,1578592287,PL
+1578592288,1578592351,ES
+1578592352,1578592367,FR
+1578592368,1578592383,GB
+1578592384,1578592415,PL
+1578592416,1578592479,FR
+1578592480,1578592495,PL
+1578592496,1578592511,FR
+1578592512,1578592575,GB
+1578592576,1578592591,FR
+1578592592,1578592607,PL
+1578592608,1578592687,FR
+1578592688,1578592719,ES
+1578592720,1578592735,CH
+1578592736,1578592751,DE
+1578592752,1578592767,GB
+1578592768,1578592783,FR
+1578592784,1578592799,DE
+1578592800,1578592831,FR
+1578592832,1578592847,PL
+1578592848,1578592895,FR
+1578592896,1578592959,IT
+1578592960,1578593007,FR
+1578593008,1578593023,GB
+1578593024,1578593279,DE
+1578593280,1578593295,PL
+1578593296,1578593311,FR
+1578593312,1578593327,PL
+1578593328,1578593359,FR
+1578593360,1578593375,GB
+1578593376,1578593391,FR
+1578593392,1578593407,BE
+1578593408,1578593439,FR
+1578593440,1578593455,PL
+1578593456,1578593503,FR
+1578593504,1578593535,PL
+1578593536,1578593615,FR
+1578593616,1578593631,BE
+1578593632,1578593663,FR
+1578593664,1578593679,DE
+1578593680,1578593727,FR
+1578593728,1578593743,GB
+1578593744,1578593759,IT
+1578593760,1578593775,ES
+1578593776,1578593823,FR
+1578593824,1578593839,GB
+1578593840,1578593935,FR
+1578593936,1578593967,PL
+1578593968,1578594015,FR
+1578594016,1578594031,BE
+1578594032,1578594047,PL
+1578594048,1578594063,FR
+1578594064,1578594079,PL
+1578594080,1578594095,IT
+1578594096,1578594111,GB
+1578594112,1578594127,PL
+1578594128,1578594143,GB
+1578594144,1578594191,FR
+1578594192,1578594207,IT
+1578594208,1578594223,PL
+1578594224,1578594239,CH
+1578594240,1578594319,FR
 1578594320,1578594335,PL
 1578594336,1578594399,FR
 1578594400,1578594431,PL
-1578594432,1578594447,GB
+1578594432,1578594447,FR
 1578594448,1578594463,PL
 1578594464,1578594479,FR
 1578594480,1578594495,ES
@@ -28519,8 +28994,8 @@
 1578594720,1578594751,FR
 1578594752,1578594767,ES
 1578594768,1578594799,FR
-1578594800,1578594943,DE
-1578594944,1578595039,FR
+1578594800,1578594815,DE
+1578594816,1578595039,FR
 1578595040,1578595055,GB
 1578595056,1578595071,FR
 1578595072,1578595103,CH
@@ -28536,16 +29011,33 @@
 1578595360,1578595455,FR
 1578595456,1578595487,CH
 1578595488,1578595503,DE
-1578595504,1578595599,FR
+1578595504,1578595519,PL
+1578595520,1578595599,FR
 1578595600,1578595647,PL
 1578595648,1578595663,FR
 1578595664,1578595679,ES
 1578595680,1578595695,BE
-1578595696,1578596351,FR
+1578595696,1578595711,PL
+1578595712,1578595983,FR
+1578595984,1578596111,DE
+1578596112,1578596127,ES
+1578596128,1578596143,PL
+1578596144,1578596159,GB
+1578596160,1578596191,PL
+1578596192,1578596207,ES
+1578596208,1578596255,FR
+1578596256,1578596287,GB
+1578596288,1578596319,PL
+1578596320,1578596335,FR
+1578596336,1578596351,ES
 1578596352,1578596863,GB
-1578596864,1578602495,FR
+1578596864,1578600191,FR
+1578600192,1578600255,BE
+1578600256,1578602495,FR
 1578602496,1578604543,NL
-1578604544,1578631167,FR
+1578604544,1578606591,GB
+1578606592,1578608639,DE
+1578608640,1578631167,FR
 1578631168,1578663935,RO
 1578663936,1578762239,RU
 1578762240,1578795007,BG
@@ -28556,13 +29048,7 @@
 1578991616,1579024383,KW
 1579024384,1579057151,GB
 1579057152,1579089919,LV
-1579089920,1579089927,NL
-1579089928,1579089943,GB
-1579089944,1579089951,NL
-1579089952,1579090175,GB
-1579090176,1579090399,NL
-1579090400,1579090431,GB
-1579090432,1579090463,NL
+1579089920,1579090463,NL
 1579090464,1579090495,GB
 1579090496,1579090559,NL
 1579090560,1579104511,GB
@@ -28587,8 +29073,11 @@
 1579941888,1580007423,HU
 1580007424,1580015615,RU
 1580015616,1580048383,UA
-1580048384,1580056575,RU
-1580072960,1580138495,PT
+1580048384,1580064767,RU
+1580064768,1580072959,DE
+1580072960,1580134399,PT
+1580134400,1580136447,ES
+1580136448,1580138495,PT
 1580138496,1580204031,IT
 1580204032,1580335103,RO
 1580335104,1580466175,RU
@@ -28655,21 +29144,22 @@
 1583697920,1583702015,TR
 1583702016,1583706111,RU
 1583706112,1583710207,GI
-1583710208,1583714303,IR
+1583710208,1583712255,IR
+1583712256,1583714303,AE
 1583714304,1583722495,GB
 1583722496,1583726591,IR
 1583726592,1583730687,BG
-1583730688,1583734783,DK
+1583730688,1583732383,DK
+1583732384,1583732399,DE
+1583732400,1583734783,DK
 1583734784,1583738879,LV
-1583738880,1583739135,GB
-1583739136,1583742975,IR
+1583738880,1583742975,IR
 1583742976,1583747071,TR
 1583747072,1583751167,RU
 1583751168,1583755263,NO
 1583755264,1583757311,NL
 1583757312,1583757567,PA
-1583757568,1583757823,US
-1583757824,1583758847,NL
+1583757568,1583758847,NL
 1583758848,1583759103,KY
 1583759104,1583759359,NL
 1583759360,1583763455,TR
@@ -28684,7 +29174,9 @@
 1583800320,1583804415,ME
 1583804416,1583808511,GB
 1583808512,1583812607,MD
-1583812608,1583816703,NL
+1583812608,1583813679,NL
+1583813680,1583813683,GB
+1583813684,1583816703,NL
 1583816704,1583820799,TR
 1583820800,1583824895,LV
 1583824896,1583828991,SI
@@ -28804,12 +29296,10 @@
 1585393664,1585395711,DK
 1585395712,1585397759,NO
 1585397760,1585399807,RU
-1585399808,1585399935,NL
-1585399936,1585400063,US
-1585400064,1585400191,IL
-1585400192,1585400319,US
-1585400320,1585400447,GB
-1585400448,1585401855,US
+1585399808,1585400063,NL
+1585400064,1585400319,IL
+1585400320,1585400575,GB
+1585400576,1585401855,US
 1585401856,1585403903,IT
 1585403904,1585405951,RU
 1585405952,1585407999,GB
@@ -28837,7 +29327,9 @@
 1585988096,1585988103,IT
 1585988104,1585988351,SE
 1585988352,1585988359,DE
-1585988360,1585995775,SE
+1585988360,1585990399,SE
+1585990400,1585990655,NL
+1585990656,1585995775,SE
 1585995776,1586003967,AT
 1586003968,1586012159,SK
 1586012160,1586020351,DE
@@ -28847,12 +29339,6 @@
 1586061312,1586069503,HR
 1586069504,1586077695,DE
 1586077696,1586085887,GE
-1586085888,1586086143,MQ
-1586086144,1586086399,FR
-1586086400,1586086655,MQ
-1586086656,1586089983,FR
-1586089984,1586091519,MQ
-1586091520,1586094079,FR
 1586094080,1586110463,RU
 1586110464,1586118655,IT
 1586118656,1586126847,DK
@@ -28896,7 +29382,10 @@
 1586405376,1586407423,AT
 1586407424,1586409471,GB
 1586409472,1586411519,IT
-1586411520,1586413567,GB
+1586411520,1586411775,GB
+1586411776,1586412287,US
+1586412288,1586412543,HK
+1586412544,1586413567,GB
 1586413568,1586415615,IT
 1586415616,1586417663,ES
 1586417664,1586419711,NL
@@ -28950,7 +29439,7 @@
 1587445760,1587449855,PL
 1587449856,1587453951,UA
 1587453952,1587470335,RU
-1587470336,1587478527,PL
+1587470336,1587474431,PL
 1587478528,1587511295,RU
 1587511296,1587544063,IL
 1587544064,1588068351,IT
@@ -29056,13 +29545,17 @@
 1592041472,1592045567,RU
 1592045568,1592049663,FR
 1592049664,1592053759,RU
-1592053760,1592054527,NL
+1592053760,1592054015,NL
+1592054016,1592054271,AE
+1592054272,1592054527,NL
 1592054528,1592054783,US
 1592054784,1592057855,NL
 1592057856,1592061951,RS
 1592061952,1592066047,RU
 1592066048,1592066815,US
-1592066816,1592070143,CY
+1592066816,1592069887,CY
+1592069888,1592069951,RU
+1592069952,1592070143,CY
 1592070144,1592074239,RU
 1592074240,1592078335,SK
 1592078336,1592082431,NL
@@ -29070,7 +29563,9 @@
 1592082848,1592082879,RU
 1592082880,1592083327,GB
 1592083328,1592083455,RU
-1592083456,1592086527,GB
+1592083456,1592085023,GB
+1592085024,1592085039,ES
+1592085040,1592086527,GB
 1592086528,1592087295,CZ
 1592087296,1592088063,PL
 1592088064,1592090623,CZ
@@ -29103,6 +29598,8 @@
 1592213504,1592217599,UA
 1592217600,1592221695,CH
 1592221696,1592225791,DK
+1592225792,1592242175,RU
+1592242176,1592246271,UA
 1592262656,1592270847,RU
 1592270848,1592272895,PL
 1592272896,1592281087,RU
@@ -29228,6 +29725,7 @@
 1597505536,1597767679,KZ
 1597767680,1598029823,ES
 1598029824,1598062591,RO
+1598062592,1598095359,RU
 1598095360,1598128127,MD
 1598128128,1598160895,TR
 1598160896,1598193663,KW
@@ -29259,7 +29757,7 @@
 1599356928,1599373311,BH
 1599373312,1599389695,RU
 1599406080,1599438847,RU
-1599438848,1599455231,CS
+1599438848,1599455231,RS
 1599455232,1599471615,CZ
 1599471616,1599487999,MK
 1599488000,1599504383,IL
@@ -29277,11 +29775,15 @@
 1600684032,1600716799,RU
 1600716800,1600749567,UA
 1600749568,1600782335,SK
-1600782336,1600815103,RU
-1600847872,1600880639,RU
+1600782336,1600880639,RU
 1600880640,1600913407,AL
 1600913408,1600946175,PL
-1600946176,1600978943,RU
+1600946176,1600963167,RU
+1600963168,1600963175,UA
+1600963176,1600963183,RU
+1600963184,1600963191,BY
+1600963192,1600963199,KZ
+1600963200,1600978943,RU
 1600978944,1601011711,SE
 1601011712,1601044479,UA
 1601044480,1601077247,RU
@@ -29296,7 +29798,9 @@
 1602232320,1602234367,CH
 1602234368,1602234495,GB
 1602234496,1602234527,FR
-1602234528,1602238463,GB
+1602234528,1602234639,GB
+1602234640,1602234655,FR
+1602234656,1602238463,GB
 1602238464,1602240511,TR
 1602240512,1602242559,BY
 1602242560,1602244607,FR
@@ -29329,7 +29833,9 @@
 1602291712,1602293759,SA
 1602293760,1602295807,RU
 1602295808,1602297855,NL
-1602297856,1602299903,IL
+1602297856,1602298367,IL
+1602298368,1602298879,MT
+1602298880,1602299903,IL
 1602299904,1602301951,DK
 1602301952,1602303999,DE
 1602304000,1602306047,RU
@@ -29338,8 +29844,7 @@
 1602310144,1602312191,NL
 1602312192,1602314239,RU
 1602314240,1602316287,CZ
-1602316288,1602316543,IE
-1602316544,1602318335,GB
+1602316288,1602318335,GB
 1602318336,1602320383,ES
 1602320384,1602324479,NL
 1602324480,1602326527,RU
@@ -29367,7 +29872,7 @@
 1602375680,1602377727,BY
 1602377728,1602379775,PS
 1602379776,1602383871,GB
-1602383872,1602385919,DE
+1602383872,1602384383,DE
 1602385920,1602387967,AT
 1602387968,1602390015,RU
 1602390016,1602392063,IT
@@ -29397,7 +29902,10 @@
 1602441216,1602443263,GB
 1602443264,1602445311,RU
 1602445312,1602447359,DE
-1602447360,1602449407,GB
+1602447360,1602447871,GB
+1602447872,1602448383,DE
+1602448384,1602448895,NL
+1602448896,1602449407,GB
 1602449408,1602451455,LV
 1602451456,1602453503,DE
 1602453504,1602455551,SK
@@ -29406,6 +29914,14 @@
 1602459648,1602461695,GB
 1602461696,1602465791,ES
 1602465792,1602467839,RU
+1602467840,1602469887,GI
+1602469888,1602471935,AT
+1602471936,1602473983,SE
+1602473984,1602476031,RU
+1602476032,1602478079,GB
+1602478080,1602482175,RU
+1602482176,1602484223,FR
+1602484224,1602486271,GB
 1602486272,1602748415,UA
 1602748416,1602781183,PT
 1602781184,1602813951,FR
@@ -29425,6 +29941,11 @@
 1603047424,1603051519,RU
 1603051520,1603055615,JO
 1603059712,1603063807,AM
+1603063808,1603067903,BG
+1603067904,1603071999,GB
+1603076096,1603080191,RU
+1603080192,1603084287,DE
+1603084288,1603088383,IT
 1603272704,1603796991,GB
 1603796992,1603813375,RU
 1603813376,1603829759,CH
@@ -29435,11 +29956,16 @@
 1603895296,1603911679,RU
 1603928064,1603944447,DK
 1603944448,1603977215,RU
-1603977216,1603978751,GB
-1603978752,1603978879,US
-1603978880,1603979007,GB
-1603979008,1603979263,US
-1603979264,1603993599,GB
+1603977216,1603980463,GB
+1603980464,1603980479,CH
+1603980480,1603981823,GB
+1603981824,1603982079,IE
+1603982080,1603982655,GB
+1603982656,1603982687,DK
+1603982688,1603982719,AN
+1603982720,1603982783,GB
+1603982784,1603982847,AN
+1603982848,1603993599,GB
 1603993600,1604009983,ME
 1604009984,1604026367,PL
 1604026368,1604042751,NL
@@ -29450,6 +29976,14 @@
 1604108288,1604141055,DE
 1604141056,1604157439,RO
 1604157440,1604190207,FR
+1604190208,1604206591,UA
+1604206592,1604222975,PL
+1604222976,1604239359,BG
+1604239360,1604255743,RU
+1604255744,1604272127,SY
+1604272128,1604288511,IQ
+1604288512,1604304895,RU
+1604304896,1604321279,SI
 1604321280,1604386815,PL
 1604386816,1604452351,RU
 1604452352,1604517887,RO
@@ -29470,16 +30004,23 @@
 1604888064,1604889599,TR
 1604889600,1604889855,DE
 1604889856,1604890111,BY
-1604890112,1604890239,DE
-1604890240,1604890367,MX
-1604890368,1604894719,DE
+1604890112,1604890239,RU
+1604890240,1604890367,US
+1604890368,1604890879,TR
+1604890880,1604891391,BY
+1604891392,1604891647,DE
+1604891648,1604891903,BY
+1604891904,1604892031,DE
+1604892032,1604892159,RU
+1604892160,1604894719,DE
 1604894720,1604902911,CZ
 1604902912,1604911103,BG
 1604911104,1604919295,UA
 1604919296,1604927487,NO
 1604927488,1604935679,IT
 1604935680,1604952063,RU
-1604952064,1604960255,DE
+1604952064,1604959743,DE
+1604959744,1604960255,RU
 1604960256,1604968447,BG
 1604968448,1604976639,ES
 1604976640,1604993023,FR
@@ -29492,6 +30033,7 @@
 1605058560,1605066751,HU
 1605074944,1605083135,FR
 1605083136,1605091327,BE
+1605091328,1605099519,PL
 1605099520,1605107711,RU
 1605107712,1605115903,GB
 1605115904,1605124095,RU
@@ -29521,6 +30063,11 @@
 1605304320,1605312511,PL
 1605312512,1605320703,IL
 1605320704,1605328895,KW
+1605328896,1605337087,FI
+1605337088,1605345279,GB
+1605345280,1605353471,FR
+1605353472,1605361663,GB
+1605361664,1605369855,RU
 1605369856,1605402623,FR
 1605402624,1605435391,SI
 1605435392,1605468159,GB
@@ -29543,7 +30090,9 @@
 1607588864,1607598079,DK
 1607598080,1607663615,IT
 1607663616,1607729151,NL
-1607729152,1607794687,EG
+1607729152,1607761919,EG
+1607761920,1607766015,SY
+1607766016,1607794687,EG
 1607860224,1607925759,ES
 1607925760,1607926783,RU
 1607926784,1607927807,PL
@@ -29587,6 +30136,15 @@
 1607979008,1607980031,RU
 1607980032,1607981055,DE
 1607981056,1607982079,UA
+1607982080,1607983103,RU
+1607983104,1607984127,GB
+1607984128,1607985151,RU
+1607985152,1607986175,AT
+1607986176,1607987199,UA
+1607987200,1607988223,ES
+1607988224,1607989247,KG
+1607989248,1607990271,DE
+1607990272,1607991295,RU
 1607991296,1608122367,UA
 1608122368,1608253439,RO
 1608253440,1608384511,RU
@@ -29606,11 +30164,10 @@
 1613758464,1614282751,CA
 1614282752,1614675967,US
 1614807040,1617362943,US
-1619001344,1631584255,US
+1619001344,1631633407,US
 1631649792,1632305151,US
 1632305152,1632321535,CA
-1632370688,1634394111,US
-1634402304,1634414591,US
+1632370688,1634414591,US
 1634414592,1634418687,CA
 1634418688,1634447359,US
 1634447360,1634451455,CA
@@ -29618,16 +30175,24 @@
 1634455552,1634459647,CA
 1634459648,1634467839,US
 1634467840,1634729983,CA
-1634729984,1650802687,US
-1650982912,1652293631,US
+1634729984,1652293631,US
 1652293632,1652310015,CA
-1652310016,1652318207,US
-1652326400,1652555775,US
-1652621312,1653243903,US
-1653342208,1653473279,US
+1652310016,1652322303,US
+1652326400,1653534719,US
+1653534720,1653538815,CA
+1653538816,1653555199,US
+1653555200,1653567487,CA
+1653567488,1653571583,US
+1653571584,1653575679,CA
+1653575680,1653592063,US
+1653592064,1653596159,CA
+1653596160,1653600255,US
+1653600256,1653604351,CA
 1653604352,1654521855,US
-1654652928,1664614399,US
+1654652928,1667235839,US
 1669332992,1673527295,US
+1673527296,1673560063,CA
+1673560064,1673576447,US
 1673592832,1673986047,US
 1673986048,1674051583,CA
 1674051584,1674575871,US
@@ -29703,11 +30268,116 @@
 1850343424,1850376191,JP
 1850376192,1850392575,MY
 1850392576,1850400767,KH
-1850400768,1850408959,CN
+1850400768,1850408959,JP
 1850408960,1850441727,AU
 1850441728,1850490879,CN
 1850490880,1850507263,KR
-1850507264,1879048191,AU
+1850507264,1850511359,AU
+1850511360,1850513407,ID
+1850513408,1850514431,TH
+1850514432,1850515455,AU
+1850515456,1850519551,IN
+1850519552,1850523647,AU
+1850523648,1850572799,CN
+1850572800,1850671103,TH
+1850671104,1850736639,HK
+1850736640,1851523071,CN
+1851523072,1851527167,JP
+1851527168,1851528191,NZ
+1851528192,1851529215,AU
+1851529216,1851531263,PH
+1851531264,1851539455,JP
+1851539456,1851542527,ID
+1851542528,1851543551,HK
+1851543552,1851547647,JP
+1851547648,1851555839,SG
+1851555840,1851588607,KR
+1851588608,1851590655,JP
+1851590656,1851594751,AU
+1851594752,1851596799,KR
+1851596800,1851604991,IN
+1851604992,1851613183,PH
+1851613184,1851617279,JP
+1851617280,1851637759,KR
+1851637760,1851654143,PK
+1851654144,1853882367,CN
+1853882368,1854406655,JP
+1854406656,1854668799,ID
+1854668800,1855455231,AU
+1855455232,1855848447,CN
+1855848448,1855913983,JP
+1855913984,1855979519,MY
+1855979520,1856241663,JP
+1856241664,1856307199,TH
+1856307200,1856315391,KR
+1856315392,1856323583,HK
+1856323584,1856339967,KR
+1856339968,1856372735,JP
+1856372736,1856503807,CN
+1856503808,1856765951,TH
+1856765952,1856770047,JP
+1856770048,1856774143,IN
+1856774144,1856779263,JP
+1856779264,1856780287,IN
+1856780288,1856782335,JP
+1856782336,1856798719,KR
+1856798720,1856815103,IN
+1856815104,1856843775,CN
+1856843776,1856847871,HK
+1856847872,1856864255,CN
+1856864256,1856872447,AU
+1856872448,1856876543,NZ
+1856876544,1856880639,AU
+1856880640,1856888831,CN
+1856888832,1856892927,AU
+1856892928,1856897023,JP
+1856897024,1857028095,AU
+1857028096,1860173823,CN
+1860173824,1860435967,IN
+1860435968,1860698111,CN
+1860698112,1860706303,JP
+1860706304,1860714495,CN
+1860714496,1860722687,ID
+1860722688,1860726783,KR
+1860726784,1860728831,AU
+1860728832,1860733951,JP
+1860733952,1860734975,AU
+1860734976,1860735999,NZ
+1860736000,1860737023,AU
+1860737024,1860739071,JP
+1860739072,1860743167,PH
+1860743168,1860747263,AU
+1860747264,1860759551,JP
+1860759552,1860763647,AU
+1860763648,1860829183,JP
+1860829184,1860960255,IN
+1860960256,1861091327,CN
+1861091328,1861222399,AU
+1861222400,1866465279,CN
+1866465280,1866530815,JP
+1866530816,1866563583,SG
+1866563584,1866579967,KR
+1866579968,1866588159,JP
+1866588160,1866592255,NZ
+1866592256,1866596351,AU
+1866596352,1866661887,CN
+1866661888,1866670079,AU
+1866670080,1866674175,MY
+1866674176,1866678271,AU
+1866678272,1866686463,ID
+1866686464,1866989567,AU
+1866989568,1867513855,CN
+1867513856,1870659583,AU
+1870659584,1873281023,CN
+1873281024,1873412095,JP
+1873412096,1873477631,CN
+1873477632,1873510399,KR
+1873510400,1873543167,JP
+1873543168,1874329599,CN
+1874329600,1874460671,TW
+1874460672,1874591743,CN
+1874591744,1874853887,JP
+1874853888,1879048191,AU
 1879048192,1883218547,CN
 1883218548,1883218551,ES
 1883218552,1883218555,FR
@@ -29835,7 +30505,7 @@
 1897242624,1897250815,TW
 1897250816,1897259007,HK
 1897259008,1897260031,NZ
-1897260032,1897261055,AU
+1897260032,1897261055,BD
 1897261056,1897263103,JP
 1897263104,1897265151,TH
 1897265152,1897267199,JP
@@ -30154,9 +30824,7 @@
 1937536000,1937536511,GB
 1937536512,1937539071,IN
 1937539072,1937637375,JP
-1937637376,1937637887,HK
-1937637888,1937638143,VN
-1937638144,1937639167,HK
+1937637376,1937639167,HK
 1937639168,1937639423,TH
 1937639424,1937670143,HK
 1937670144,1937672191,NZ
@@ -30222,19 +30890,17 @@
 1941655552,1941657599,KR
 1941657600,1941658623,MN
 1941658624,1941659647,JP
-1941659648,1941663743,NZ
-1941663744,1941700607,AU
+1941659648,1941667839,NZ
+1941667840,1941700607,AU
 1941700608,1941831679,NZ
 1941831680,1941962751,AU
 1941962752,1945108479,CN
 1945108480,1946157055,IN
 1946157056,1946159103,ID
-1946159104,1946163199,AU
-1946163200,1946165247,HK
+1946159104,1946165247,AU
 1946165248,1946173439,PK
 1946173440,1946173503,PG
-1946173504,1946173535,SG
-1946173536,1946173567,AU
+1946173504,1946173567,AU
 1946173568,1946173631,HK
 1946173632,1946173663,AU
 1946173664,1946173679,PH
@@ -30264,7 +30930,8 @@
 1947205632,1948254207,CN
 1948254208,1949302783,KR
 1949302784,1949433855,HK
-1949433856,1949435903,IN
+1949433856,1949434879,IN
+1949434880,1949435903,AU
 1949435904,1949437951,HK
 1949437952,1949439999,AU
 1949440000,1949442047,ID
@@ -30337,8 +31004,7 @@
 1952074752,1952075775,NZ
 1952075776,1952079871,CN
 1952079872,1952088063,PK
-1952088064,1952090111,NZ
-1952090112,1952092159,AU
+1952088064,1952092159,NZ
 1952092160,1952096255,JP
 1952096256,1952102399,ID
 1952102400,1952104447,CN
@@ -30412,7 +31078,8 @@
 1960091648,1960095743,CN
 1960095744,1960097791,IN
 1960097792,1960099839,BD
-1960099840,1960132607,AU
+1960099840,1960128511,AU
+1960128512,1960132607,ID
 1960132608,1960181759,CN
 1960181760,1960185855,TW
 1960185856,1960187903,JP
@@ -30704,7 +31371,9 @@
 1997709312,1997715455,JP
 1997715456,1997717503,VN
 1997717504,1997723647,CN
-1997723648,1997725695,JP
+1997723648,1997724495,JP
+1997724496,1997724511,NL
+1997724512,1997725695,JP
 1997725696,1998061567,CN
 1998061568,1998258175,JP
 1998258176,1998272735,SG
@@ -30726,7 +31395,13 @@
 1998503936,1998520319,JP
 1998520320,1998553087,TH
 1998553088,1998561279,JP
-1998561280,1998565375,IN
+1998561280,1998561535,IN
+1998561536,1998561791,SG
+1998561792,1998562047,IN
+1998562048,1998562303,TH
+1998562304,1998562559,IN
+1998562560,1998562815,CN
+1998562816,1998565375,IN
 1998565376,1998569471,TW
 1998569472,1998577663,CN
 1998577664,1998581759,AU
@@ -30761,7 +31436,9 @@
 2000224256,2000355327,CN
 2000355328,2000371711,KR
 2000371712,2000373759,JP
-2000373760,2000375807,HK
+2000373760,2000374399,HK
+2000374400,2000374527,US
+2000374528,2000375807,HK
 2000375808,2000377855,AF
 2000377856,2000379903,JP
 2000379904,2000388095,AU
@@ -30797,7 +31474,7 @@
 2001895424,2001899519,VN
 2001899520,2001903615,AU
 2001903616,2001915903,JP
-2001915904,2001919999,BD
+2001915904,2001919999,AU
 2001920000,2001926143,ID
 2001926144,2001928191,KH
 2001928192,2001993727,JP
@@ -30882,7 +31559,8 @@
 2015203328,2015205375,JP
 2015205376,2015207423,ID
 2015207424,2015215615,JP
-2015215616,2015216383,HK
+2015215616,2015216127,HK
+2015216128,2015216383,CA
 2015216384,2015216639,SG
 2015216640,2015217663,CA
 2015217664,2015219456,GU
@@ -30891,21 +31569,27 @@
 2015219816,2015219823,PH
 2015219824,2015219839,HK
 2015219840,2015219903,SG
-2015219904,2015219967,CA
+2015219904,2015219935,HK
+2015219936,2015219967,CA
 2015219968,2015220223,PH
 2015220224,2015220351,HK
 2015220352,2015220479,ID
 2015220480,2015220735,HK
-2015220736,2015221759,CA
+2015220736,2015221247,IN
+2015221248,2015221759,CA
 2015221760,2015222015,HK
 2015222016,2015222271,JP
-2015222272,2015223295,CA
+2015222272,2015222527,IN
+2015222528,2015222783,CA
+2015222784,2015223039,IN
+2015223040,2015223295,CA
 2015223296,2015223551,TH
 2015223552,2015223679,IN
 2015223680,2015223687,HK
 2015223688,2015223695,SG
 2015223696,2015223711,ID
-2015223712,2015223743,CA
+2015223712,2015223727,PH
+2015223728,2015223743,CA
 2015223744,2015223751,PG
 2015223752,2015223759,CA
 2015223760,2015223767,JP
@@ -30964,9 +31648,13 @@
 2022187008,2022187071,US
 2022187072,2022187783,HK
 2022187784,2022187791,US
-2022187792,2022187903,HK
-2022187904,2022187959,US
-2022187960,2022188031,HK
+2022187792,2022187807,HK
+2022187808,2022187831,US
+2022187832,2022187839,HK
+2022187840,2022187959,US
+2022187960,2022187991,HK
+2022187992,2022188015,US
+2022188016,2022188031,HK
 2022188032,2022188111,US
 2022188112,2022188119,HK
 2022188120,2022188191,US
@@ -31032,7 +31720,7 @@
 2033362944,2033364991,AU
 2033364992,2033369087,TW
 2033369088,2033377279,AU
-2033377280,2033385471,PH
+2033377280,2033385471,KR
 2033385472,2033451007,CN
 2033451008,2033487871,ID
 2033487872,2033491967,PK
@@ -31231,8 +31919,8 @@
 2056814592,2056815103,JP
 2056815104,2056815195,HK
 2056815196,2056815215,JP
-2056815216,2056815335,HK
-2056815336,2056815343,JP
+2056815216,2056815327,HK
+2056815328,2056815343,JP
 2056815344,2056815615,HK
 2056815616,2056816031,JP
 2056816032,2056816047,NZ
@@ -31245,7 +31933,8 @@
 2056816512,2056816639,JP
 2056816640,2056816815,SG
 2056816816,2056816831,JP
-2056816832,2056816959,SG
+2056816832,2056816943,SG
+2056816944,2056816959,JP
 2056816960,2056816991,MY
 2056816992,2056817007,JP
 2056817008,2056817151,SG
@@ -31275,9 +31964,7 @@
 2056820352,2056820479,HK
 2056820480,2056820511,JP
 2056820512,2056820607,HK
-2056820608,2056826623,JP
-2056826624,2056826879,HK
-2056826880,2056827935,JP
+2056820608,2056827935,JP
 2056827936,2056827965,HK
 2056827966,2056830271,JP
 2056830272,2056830275,HK
@@ -31308,11 +31995,20 @@
 2059976704,2059995135,JP
 2059995136,2059997183,VN
 2059997184,2060001279,MN
-2060001280,2060002239,HK
+2060001280,2060001791,AE
+2060001792,2060002239,HK
 2060002240,2060002247,PK
-2060002248,2060002455,HK
+2060002248,2060002391,HK
+2060002392,2060002415,AF
+2060002416,2060002455,HK
 2060002456,2060002463,PK
-2060002464,2060005375,HK
+2060002464,2060002847,HK
+2060002848,2060002863,AF
+2060002864,2060003039,HK
+2060003040,2060003071,AF
+2060003072,2060003199,HK
+2060003200,2060003215,AF
+2060003216,2060005375,HK
 2060005376,2060025855,AU
 2060025856,2060058623,TW
 2060058624,2060062719,AU
@@ -31329,9 +32025,7 @@
 2063085568,2063089663,CN
 2063089664,2063097855,JP
 2063097856,2063106047,AU
-2063106048,2063107423,SG
-2063107424,2063107455,AU
-2063107456,2063107575,SG
+2063106048,2063107575,SG
 2063107576,2063107583,AU
 2063107584,2063107623,SG
 2063107624,2063107631,AU
@@ -31348,7 +32042,11 @@
 2063109376,2063109607,HK
 2063109608,2063109631,AU
 2063109632,2063109759,HK
-2063109760,2063110143,AU
+2063109760,2063109823,AU
+2063109824,2063109839,HK
+2063109840,2063109855,AU
+2063109856,2063109887,HK
+2063109888,2063110143,AU
 2063110144,2063110399,JP
 2063110400,2063110527,AU
 2063110528,2063110591,JP
@@ -31357,18 +32055,18 @@
 2063110664,2063110687,AU
 2063110688,2063110703,JP
 2063110704,2063114239,AU
-2063114240,2063114431,IN
-2063114432,2063115263,AU
+2063114240,2063114439,IN
+2063114440,2063115263,AU
 2063115264,2063115519,JP
 2063115520,2063116287,AU
 2063116288,2063116319,SG
 2063116320,2063116799,AU
-2063116800,2063116803,KR
-2063116804,2063117311,AU
+2063116800,2063116807,KR
+2063116808,2063117311,AU
 2063117312,2063117327,NZ
 2063117328,2063117823,AU
-2063117824,2063117840,PH
-2063117841,2063138815,AU
+2063117824,2063117855,PH
+2063117856,2063138815,AU
 2063138816,2063335423,JP
 2063335424,2063351807,AU
 2063351808,2063368191,KR
@@ -31721,7 +32419,9 @@
 2097037312,2097053695,AU
 2097053696,2097086463,KR
 2097086464,2097479679,JP
-2097479680,2097545215,PH
+2097479680,2097504791,PH
+2097504792,2097504799,US
+2097504800,2097545215,PH
 2097545216,2097610751,JP
 2097610752,2097643519,AU
 2097643520,2097676287,KR
@@ -31811,7 +32511,8 @@
 2113684176,2113684223,PH
 2113684224,2113684239,AU
 2113684240,2113684255,PH
-2113684256,2113684279,TW
+2113684256,2113684271,TW
+2113684272,2113684279,AU
 2113684280,2113684431,PH
 2113684432,2113684439,TW
 2113684440,2113684479,PH
@@ -31844,7 +32545,9 @@
 2113692416,2113693183,AU
 2113693184,2113693343,HK
 2113693344,2113693359,AU
-2113693360,2113693663,HK
+2113693360,2113693375,HK
+2113693376,2113693439,AU
+2113693440,2113693663,HK
 2113693664,2113694207,AU
 2113694208,2113694463,JP
 2113694464,2113694719,HK
@@ -32377,13 +33080,16 @@
 2258593024,2258593151,SG
 2258593152,2258594303,AU
 2258594304,2258594559,BD
-2258594560,2258594607,AU
+2258594560,2258594591,HK
+2258594592,2258594607,AU
 2258594608,2258594615,HK
 2258594616,2258594623,AU
 2258594624,2258594639,HK
 2258594640,2258594655,AU
 2258594656,2258594687,HK
-2258594688,2258594831,AU
+2258594688,2258594751,AU
+2258594752,2258594815,HK
+2258594816,2258594831,AU
 2258594832,2258594839,JP
 2258594840,2258594847,AU
 2258594848,2258594879,JP
@@ -32430,7 +33136,9 @@
 2258596864,2258596903,HK
 2258596904,2258597071,AU
 2258597072,2258597087,TW
-2258597088,2258597895,AU
+2258597088,2258597372,AU
+2258597373,2258597375,HK
+2258597376,2258597895,AU
 2258597896,2258597903,NZ
 2258597904,2258597927,AU
 2258597928,2258597935,JP
@@ -32473,14 +33181,13 @@
 2258603680,2258603711,IN
 2258603712,2258603743,AU
 2258603744,2258603751,TW
-2258603752,2258603871,AU
-2258603872,2258603903,HK
+2258603752,2258603839,AU
+2258603840,2258603903,HK
 2258603904,2258604543,AU
 2258604544,2258604575,IN
 2258604576,2258604591,SG
 2258604592,2258604607,IN
-2258604608,2258604639,SG
-2258604640,2258604671,AU
+2258604608,2258604671,AU
 2258604672,2258604735,SG
 2258604736,2258605567,AU
 2258605568,2258605631,SG
@@ -33007,7 +33714,9 @@
 2365456384,2365521919,US
 2365652992,2367487999,DE
 2367488000,2367553535,BA
-2367553536,2371158015,DE
+2367553536,2370895871,DE
+2370895872,2370961407,SE
+2370961408,2371158015,DE
 2371158016,2371223551,RO
 2371223552,2371289087,US
 2371289088,2371616767,DE
@@ -33824,7 +34533,8 @@
 2545221632,2545287167,US
 2545287168,2545352703,GB
 2545352704,2545418239,CH
-2545418240,2545614847,US
+2545418240,2545483775,NL
+2545483776,2545614847,US
 2545614848,2545680383,NO
 2545680384,2545745919,US
 2545745920,2545811455,DE
@@ -34275,7 +34985,9 @@
 2665086976,2665152511,GB
 2665152512,2665218047,US
 2665218048,2665283583,CH
-2665283584,2665414655,US
+2665283584,2665349119,US
+2665359872,2665361407,US
+2665374720,2665375231,US
 2665414656,2665480191,GB
 2665480192,2665545727,US
 2665545728,2665611263,DE
@@ -34606,7 +35318,6 @@
 2708865024,2708930559,JP
 2708930560,2709127167,US
 2709127168,2709192703,KR
-2709192704,2709258239,BG
 2709258240,2709389311,US
 2709389312,2709454847,SG
 2709454848,2709716991,US
@@ -34660,7 +35371,8 @@
 2718629888,2718695423,GB
 2718695424,2718760959,US
 2718760960,2718826495,GB
-2718826496,2719285247,US
+2718826496,2719023103,US
+2719088640,2719285247,US
 2719285248,2719350783,CH
 2719350784,2719416319,US
 2719416320,2719481855,CH
@@ -34821,9 +35533,7 @@
 2759000064,2759065599,TH
 2759065600,2759589887,US
 2759589888,2759720959,KR
-2759852032,2759870947,CH
-2759870948,2759870951,AT
-2759870952,2759871035,CH
+2759852032,2759871035,CH
 2759871036,2759871039,GB
 2759871040,2759883039,CH
 2759883040,2759883043,LI
@@ -34974,7 +35684,9 @@
 2780945312,2780945375,BM
 2780945376,2780945663,US
 2780945664,2780945695,BM
-2780945696,2780947903,US
+2780945696,2780946127,US
+2780946128,2780946135,CA
+2780946136,2780947903,US
 2780947904,2780947967,MY
 2780947968,2780952967,US
 2780952968,2780952975,GB
@@ -35012,9 +35724,13 @@
 2788229936,2788229943,GB
 2788229944,2788230663,US
 2788230664,2788230671,GB
-2788230672,2788238847,US
+2788230672,2788234767,US
+2788234768,2788234775,GB
+2788234776,2788238847,US
 2788238848,2788238855,GB
-2788238856,2788261887,US
+2788238856,2788245007,US
+2788245008,2788245023,CA
+2788245024,2788261887,US
 2788261888,2788294655,GB
 2788294656,2789081087,US
 2789179392,2789203967,US
@@ -35103,20 +35819,20 @@
 2815098880,2815164415,GB
 2815164416,2815229951,US
 2815229952,2815295487,ID
-2815295488,2815983615,US
-2815983616,2815986687,IL
+2815295488,2815986687,US
 2815986688,2815986815,GB
-2815986816,2815986831,IL
+2815986816,2815986831,US
 2815986832,2815987215,GB
-2815987216,2815987327,IL
+2815987216,2815987231,US
+2815987232,2815987263,GB
+2815987264,2815987327,US
 2815987328,2815987391,GB
-2815987392,2816001151,IL
+2815987392,2816001151,US
 2816001152,2816001183,DE
-2816001184,2816016383,IL
-2816016384,2816671743,US
+2816001184,2816671743,US
 2816671744,2816737279,CA
 2816737280,2818113535,US
-2818179072,2818310143,US
+2818244608,2818310143,US
 2818310144,2818375679,AR
 2818375680,2818572287,US
 2818637824,2818703359,CH
@@ -35176,7 +35892,7 @@
 2831548416,2831613951,AU
 2831613952,2831810559,US
 2831810560,2831876095,IT
-2831876096,2832072703,US
+2831876096,2832007167,US
 2832138240,2832269311,US
 2832347648,2832347903,ZA
 2832465920,2832793599,US
@@ -35195,7 +35911,7 @@
 2834825216,2834956287,KR
 2834956288,2835087359,US
 2835087360,2835152895,AU
-2835152896,2835283967,US
+2835218432,2835283967,US
 2835283968,2835349503,MX
 2835480576,2837446655,US
 2837446656,2839543807,CH
@@ -35291,15 +36007,14 @@
 2873098240,2873884671,US
 2877292544,2882469887,US
 2894069760,2899902463,US
-2902458368,2904555519,US
+2902523904,2904555519,US
 2904555520,2904817663,CA
 2904817664,2905350143,US
-2905407488,2905432063,US
-2905440256,2905442303,US
-2905442304,2905443071,CA
-2905443072,2905443327,US
-2905443328,2905443583,CA
-2905443584,2905452543,US
+2905407488,2905449471,US
+2905449472,2905449727,CA
+2905449728,2905450495,US
+2905450496,2905451519,CA
+2905451520,2905452543,US
 2905456640,2905473023,US
 2905473024,2905481215,CA
 2905481216,2905493503,US
@@ -35307,6 +36022,9 @@
 2905513984,2905526271,US
 2905530368,2907897855,US
 2907963392,2912288767,US
+2912944128,2913861631,US
+2913992704,2914254847,CA
+2914516992,2915041279,US
 2919235584,2919759871,CA
 2919759872,2920808447,US
 2921332736,2921476095,US
@@ -35319,10 +36037,14 @@
 2925002752,2925527039,CA
 2925527040,2926215167,US
 2926575616,2927099903,CA
-2927099904,2927362047,US
-2927624192,2928164863,US
+2927099904,2927427583,US
+2927493120,2927575039,US
+2927591424,2927599615,US
+2927689728,2928164863,US
 2928181248,2928189439,US
-2928197632,2928226303,US
+2928197632,2928221695,US
+2928221696,2928221951,CA
+2928221952,2928226303,US
 2928226304,2928230399,CA
 2928230400,2928261375,US
 2928261376,2928261887,CA
@@ -35336,12 +36058,14 @@
 2928459776,2928525311,US
 2928541696,2928607231,CA
 2928607232,2936012799,US
+3019898880,3036676095,AU
+3070230528,3087007743,AU
 3120562176,3120578559,CO
 3120627712,3120644095,NI
 3120693248,3120709631,BO
 3120758784,3120775167,EC
 3121086464,3121102847,UY
-3121152000,3121217535,CL
+3121152000,3121250303,CL
 3121348608,3121479679,AR
 3121479680,3121512447,VE
 3121545216,3121610751,CR
@@ -35354,15 +36078,20 @@
 3122921472,3122987007,CL
 3124232192,3124494335,AR
 3124756480,3124772863,AR
-3124887552,3124920319,EC
+3124887552,3124953087,EC
+3125018624,3125149695,EC
 3125280768,3125346303,CO
 3125346304,3125411839,PA
-3125805056,3126067199,CO
-3126853632,3126870015,AR
+3125805056,3126329343,CO
+3126853632,3126853887,US
+3126853888,3126870015,AR
 3126919168,3126935551,CO
-3128948736,3129016319,UY
+3127115776,3127181311,AR
+3127377920,3127508991,CL
+3127902208,3128164351,CO
+3129475072,3129606143,AR
 3131047936,3131310079,PE
-3137339392,3141533695,BR
+3137339392,3143630847,BR
 3145728000,3147825151,MX
 3154182144,3154247679,DE
 3154247680,3154313215,RS
@@ -35380,22 +36109,171 @@
 3156279296,3156344831,PL
 3156344832,3156410367,IR
 3156410368,3156475903,RU
-3156475904,3156541439,HU
+3156475904,3156539391,HU
+3156539392,3156539647,RO
+3156539648,3156541439,HU
+3156606976,3156672511,TR
+3156672512,3156738047,GB
+3156738048,3156803583,DE
+3156803584,3156869119,TR
+3156869120,3156934655,LU
+3156934656,3157065727,RU
+3157065728,3157131263,AT
+3157131264,3157196799,DE
+3157196800,3157262335,PL
 3157262336,3157786623,SA
 3157786624,3158048767,TR
 3158048768,3158310911,CH
 3159359488,3159621631,PT
+3159621632,3159883775,ES
+3159883776,3160145919,NL
 3160145920,3160147967,RU
+3160147968,3160150015,CZ
+3160150016,3160152063,LV
+3160152064,3160154111,IT
+3160154112,3160156159,DE
+3160156160,3160158207,AM
+3160158208,3160160255,BY
+3160160256,3160162303,NL
+3160162304,3160164351,FR
+3160164352,3160166399,LV
+3160166400,3160168447,NO
+3160168448,3160170495,GB
+3160170496,3160172543,IT
+3160172544,3160174591,RU
+3160174592,3160176639,DE
+3160176640,3160178687,IT
+3160178688,3160180735,DE
+3160180736,3160182783,GB
+3160182784,3160184831,CH
+3160184832,3160186879,NL
+3160186880,3160188927,EE
+3160188928,3160190975,SE
+3160190976,3160193023,RU
+3160193024,3160195071,IT
+3160195072,3160197119,RU
+3160197120,3160199167,DE
+3160199168,3160201215,GE
+3160201216,3160203263,RU
+3160203264,3160203775,CH
+3160203776,3160203783,DE
+3160203784,3160203791,CH
+3160203792,3160203815,FR
+3160203816,3160205311,CH
+3160205312,3160207359,GB
+3160207360,3160209407,RU
+3160209408,3160211455,SE
+3160211456,3160213503,IE
+3160213504,3160215551,DE
+3160215552,3160219647,RU
+3160219648,3160221695,ES
+3160221696,3160223743,FR
+3160223744,3160227839,RU
+3160227840,3160229887,IR
+3160229888,3160231935,ES
+3160231936,3160233983,BE
+3160233984,3160236031,GE
+3160236032,3160238079,BE
+3160238080,3160240127,RU
+3160240128,3160242175,BE
+3160242176,3160244223,RS
+3160244224,3160246271,RU
+3160246272,3160248319,IT
+3160248320,3160250367,NL
+3160250368,3160252415,BE
+3160252416,3160254463,PL
+3160254464,3160256511,LU
+3160256512,3160258559,GB
+3160258560,3160260607,NO
+3160260608,3160262655,PT
+3160262656,3160264703,HU
+3160264704,3160266751,RU
+3160266752,3160268799,DE
+3160268800,3160272895,PT
+3160272896,3160274943,RU
+3160274944,3160276991,AT
+3160276992,3160279039,RU
+3160279040,3160281087,ES
+3160281088,3160283135,GB
+3160283136,3160285183,DE
+3160285184,3160287231,RU
+3160287232,3160289279,GB
+3160289280,3160291327,RU
+3160291328,3160293375,ES
 3160408064,3161456639,DE
+3161456640,3161473023,PL
+3161473024,3161489407,SK
+3161489408,3161505791,LV
+3161505792,3161538559,RU
+3161538560,3161554943,NO
+3161554944,3161571327,RU
+3161571328,3161587711,UZ
+3161587712,3161620479,RU
+3161620480,3161636863,DK
+3161636864,3161653247,RU
+3161653248,3161669631,LU
+3161669632,3161686015,FR
+3161686016,3161702399,UA
+3161702400,3161718783,AM
+3161718784,3161735167,PL
+3161980928,3161989119,SK
+3161989120,3161997311,RU
+3161997312,3162005503,DK
+3162005504,3162013695,CS
+3162013696,3162021887,IL
+3162021888,3162030079,SE
+3162030080,3162038271,CZ
+3162038272,3162046463,LU
+3162046464,3162054655,PL
+3162054656,3162062847,NL
+3162062848,3162071039,SE
+3162071040,3162087423,IR
+3162087424,3162095615,SK
+3162095616,3162103807,GE
+3162103808,3162111999,FR
+3162112000,3162120191,PL
+3162128384,3162128895,GB
+3162128896,3162129407,NL
+3162129408,3162129919,DE
+3162129920,3162136575,NL
 3162505216,3162537983,RU
 3162537984,3162570751,PL
 3162570752,3162603519,HR
 3162603520,3162636287,GE
 3162636288,3162669055,FR
 3162669056,3162701823,RU
+3162701824,3162734591,MD
+3162734592,3162767359,RU
+3162767360,3162800127,SA
+3162800128,3162832895,TR
+3162832896,3162865663,GR
+3162865664,3162931199,RU
+3162931200,3162963967,CZ
+3162963968,3162996735,OM
+3162996736,3163029503,IT
+3163029504,3163062271,DE
+3163062272,3163095039,IR
+3163095040,3163127807,PL
+3163160576,3163193343,DE
+3163226112,3163258879,SA
+3163258880,3163291647,SY
+3163291648,3163324415,PT
+3163324416,3163357183,OM
 3163553792,3163684863,DE
 3163684864,3163815935,PL
 3163815936,3163947007,NO
+3164078080,3164209151,IT
+3164209152,3164340223,CH
+3164340224,3164471295,HU
+3164602368,3164667903,SY
+3164667904,3164733439,PS
+3164733440,3164798975,RU
+3164798976,3164864511,UA
+3165650944,3166175231,DK
+3167748096,3168206847,RO
+3168206848,3168272383,MD
+3168272384,3168534527,IT
+3168534528,3168796671,GB
 3170893824,3179282431,BR
 3179282432,3187671039,MX
 3187671040,3187687423,CO
@@ -35943,7 +36821,9 @@
 3188343808,3188344063,CO
 3188344064,3188344575,CR
 3188344576,3188344831,CO
-3188344832,3188357631,CR
+3188344832,3188346367,CR
+3188346368,3188346623,CO
+3188346624,3188357631,CR
 3188357632,3188357887,CO
 3188357888,3188359167,CR
 3188359168,3188400127,EC
@@ -35960,9 +36840,8 @@
 3188506624,3188506879,AR
 3188506880,3188513535,US
 3188513536,3188513791,AR
-3188513792,3188521727,US
-3188521728,3188521983,AR
-3188521984,3188523007,US
+3188513792,3188520959,US
+3188520960,3188523007,AR
 3188523008,3188539391,CO
 3188539392,3188542207,CL
 3188542208,3188542463,US
@@ -35973,36 +36852,7 @@
 3188572160,3188576255,CO
 3188580352,3188584447,AR
 3188588544,3188596735,AR
-3188604928,3188605439,AR
-3188605440,3188606463,US
-3188606464,3188606975,AR
-3188606976,3188607231,US
-3188607232,3188607743,AR
-3188607744,3188607999,US
-3188608000,3188608511,AR
-3188608512,3188608767,US
-3188608768,3188609535,AR
-3188609536,3188609791,US
-3188609792,3188611583,AR
-3188611584,3188611839,US
-3188611840,3188612095,AR
-3188612096,3188612351,US
-3188612352,3188612863,AR
-3188612864,3188613375,US
-3188613376,3188613503,AR
-3188613504,3188613631,US
-3188613632,3188614143,AR
-3188614144,3188614399,US
-3188614400,3188614911,AR
-3188614912,3188615423,US
-3188615424,3188615935,AR
-3188615936,3188616703,US
-3188616704,3188616831,AR
-3188616832,3188616959,US
-3188616960,3188620287,AR
-3188620288,3188620543,US
-3188620544,3188621055,AR
-3188621056,3188621311,US
+3188604928,3188621311,AR
 3188621312,3188625407,GT
 3188629504,3188637695,AR
 3188637696,3188645887,PA
@@ -36010,7 +36860,7 @@
 3188670464,3188674559,HN
 3188678656,3188682751,AR
 3188686848,3188690943,EC
-3188695040,3188699135,VE
+3188695040,3188703231,VE
 3188703232,3188711423,AR
 3188719616,3188981759,AR
 3188981760,3189178367,CL
@@ -36087,7 +36937,7 @@
 3193896960,3193929727,CL
 3193929728,3193962495,EC
 3193962496,3193987071,CL
-3193995264,3194015743,CO
+3193995264,3194019839,CO
 3194028032,3194036223,AR
 3194044416,3194052607,CO
 3194052608,3194056461,TT
@@ -36116,7 +36966,7 @@
 3194454016,3194458111,AR
 3194462208,3194466303,AR
 3194470400,3194474495,AR
-3194478592,3194482687,AR
+3194478592,3194486783,AR
 3194486784,3194494975,BO
 3194519552,3194535935,PY
 3194552320,3194568703,AR
@@ -36125,24 +36975,33 @@
 3194642432,3194646527,AR
 3194650624,3194654719,AR
 3194654720,3194658303,US
-3194658304,3194658815,AR
+3194658304,3194659327,AR
+3194659328,3194659583,US
+3194659584,3194662399,AR
+3194662400,3194662655,US
+3194662656,3194665471,AR
+3194665472,3194665983,US
+3194665984,3194666495,AR
+3194666496,3194667007,US
 3194683392,3194687487,CU
 3194691584,3194695679,BO
 3194699776,3194703871,EC
-3194707968,3194712063,AR
+3194707968,3194716159,AR
 3194716160,3194720255,HN
 3194724352,3194728447,PA
 3194732544,3194736639,AR
 3194748928,3194757119,UY
 3194781696,3194798079,CL
 3194814464,3194822655,AR
-3194847232,3194855423,CO
+3194847232,3194863615,CO
 3194863616,3194871807,HN
 3194880000,3194888191,DO
 3194912768,3194920959,CL
 3194945536,3194953727,GT
 3194978304,3194986495,PA
 3194994688,3195002879,AR
+3195011072,3195019263,AR
+3195043840,3195052031,CO
 3195535360,3195539455,SV
 3195543552,3195547647,PE
 3195551744,3195555839,EC
@@ -36156,6 +37015,10 @@
 3195641856,3195645951,PY
 3195650048,3195654143,GT
 3195658240,3195662335,VE
+3195666432,3195670527,AR
+3195674624,3195678719,AR
+3195682816,3195686911,AR
+3195691008,3195695103,DO
 3196059648,3196092415,CO
 3196092416,3196125183,PY
 3196125184,3196157951,BO
@@ -36185,45 +37048,39 @@
 3198550016,3198681087,DO
 3198681088,3198877695,VE
 3198943232,3199467519,AR
-3199467520,3199468735,US
-3199468736,3199468799,AR
-3199468800,3199480831,US
-3199480832,3199481087,AR
-3199481088,3199481343,US
-3199481344,3199484927,AR
-3199484928,3199488255,US
-3199488256,3199489023,AR
+3199467520,3199488255,US
+3199488256,3199488511,AR
+3199488512,3199488767,US
+3199488768,3199489023,AR
 3199489024,3199489279,US
 3199489280,3199489535,AR
 3199489536,3199490303,US
 3199490304,3199491071,AR
-3199491072,3199492095,US
-3199492096,3199492351,AR
-3199492352,3199493375,US
+3199491072,3199493375,US
 3199493376,3199493631,AR
-3199493632,3199494143,US
-3199494144,3199494399,AR
-3199494400,3199499775,US
-3199499776,3199500031,AR
-3199500032,3199504383,US
+3199493632,3199504383,US
 3199504384,3199505663,AR
 3199505664,3199508223,US
 3199508224,3199508479,AR
 3199508480,3199511039,US
 3199511040,3199511551,AR
 3199511552,3199520767,US
-3199520768,3199533055,AR
+3199520768,3199522815,AR
+3199522816,3199523327,US
+3199523328,3199530495,AR
+3199530496,3199532031,US
+3199532032,3199533055,AR
 3199533056,3199549439,BO
 3199598592,3199631359,CO
 3199664128,3199713279,AR
 3199729664,3199762431,NI
 3199795200,3199815679,AN
-3199860736,3199893503,BO
+3199860736,3199909887,BO
 3199926272,3199959039,PE
 3199991808,3200385023,AR
 3200516096,3200548863,CL
 3200581632,3200598015,BZ
-3200614400,3200630783,AR
+3200614400,3200647167,AR
 3200647168,3201302527,VE
 3201302528,3201433599,CL
 3201433600,3201435135,AR
@@ -36233,7 +37090,7 @@
 3201435568,3201441791,AR
 3201441792,3201442047,US
 3201442048,3201466367,AR
-3201564672,3201581055,NI
+3201564672,3201630207,NI
 3201630208,3201695743,TT
 3201695744,3201728511,EC
 3201826816,3201867775,AR
@@ -36252,7 +37109,9 @@
 3202495496,3202495503,AW
 3202495504,3202620463,AR
 3202620464,3202620471,AW
-3202620472,3202875391,AR
+3202620472,3202647039,AR
+3202647040,3202647295,AW
+3202647296,3202875391,AR
 3202875392,3203137535,PE
 3203399680,3203432447,CO
 3203465216,3203476479,CR
@@ -36260,12 +37119,16 @@
 3203476736,3203476991,CR
 3203476992,3203477503,CO
 3203477504,3203481599,CR
-3203497984,3203530751,CR
+3203497984,3203509247,CR
+3203509248,3203511295,CO
+3203511296,3203530751,CR
 3203530752,3203531775,CO
 3203531776,3203532031,CR
 3203532032,3203532287,CO
 3203532288,3203533055,PA
-3203533056,3203547135,CO
+3203533056,3203533567,CO
+3203533568,3203533823,PA
+3203533824,3203547135,CO
 3203547136,3203547647,PA
 3203547648,3203596287,CO
 3203661824,3203923967,AR
@@ -36473,7 +37336,6 @@
 3223244288,3223245311,US
 3223249408,3223249663,CA
 3223254784,3223255295,US
-3223255808,3223256063,US
 3223257088,3223258623,US
 3223258624,3223258879,CA
 3223258880,3223260671,US
@@ -36501,13 +37363,13 @@
 3223297536,3223298815,US
 3223299072,3223299327,US
 3223299584,3223301119,NL
-3223301120,3223303167,US
+3223301120,3223302399,US
 3223303168,3223303423,CA
 3223303424,3223303679,US
 3223305984,3223307519,US
 3223307520,3223310079,JP
 3223310080,3223310335,US
-3223310592,3223311103,US
+3223310848,3223311103,US
 3223311104,3223311359,FR
 3223311360,3223311871,US
 3223312128,3223314431,US
@@ -36549,7 +37411,9 @@
 3223433216,3223435007,FR
 3223435008,3223437055,US
 3223437312,3223447551,CH
-3223447552,3223452671,US
+3223447552,3223447807,US
+3223447808,3223449599,NL
+3223449600,3223452671,US
 3223452928,3223453183,US
 3223453184,3223453439,DE
 3223458560,3223458815,GB
@@ -36587,7 +37451,9 @@
 3223546112,3223546879,US
 3223546880,3223547135,GB
 3223547136,3223551743,US
-3223552000,3223554559,US
+3223552000,3223552511,US
+3223552512,3223553535,NL
+3223553536,3223554559,US
 3223554560,3223554815,GB
 3223555328,3223556095,US
 3223556096,3223556351,CA
@@ -36619,9 +37485,9 @@
 3223584768,3223650303,SE
 3223650304,3223715839,CH
 3223715840,3223781375,DK
-3223781376,3223823871,GB
+3223781376,3223823871,US
 3223823872,3223824127,AT
-3223824128,3223846911,GB
+3223824128,3223846911,US
 3223848704,3223852799,US
 3223853312,3223853567,US
 3223854336,3223854591,US
@@ -36786,7 +37652,8 @@
 3224407808,3224408319,US
 3224408320,3224408575,DE
 3224408576,3224424959,US
-3224425216,3224428287,US
+3224425216,3224427007,US
+3224427776,3224428287,US
 3224428544,3224428799,DE
 3224428800,3224430079,US
 3224430336,3224430591,DE
@@ -36886,7 +37753,8 @@
 3224828672,3224828927,AU
 3224829184,3224829439,US
 3224829440,3224829695,DE
-3224830208,3224851455,US
+3224830208,3224850943,US
+3224851200,3224851455,US
 3224851456,3224851711,DE
 3224851968,3224852735,US
 3224852736,3224852991,DE
@@ -36967,7 +37835,9 @@
 3225081088,3225081343,CA
 3225081600,3225082367,US
 3225082368,3225082623,IT
-3225082880,3225089279,US
+3225082880,3225084671,US
+3225084672,3225085439,NL
+3225085440,3225089279,US
 3225089280,3225089535,CA
 3225089536,3225091071,US
 3225091584,3225091839,US
@@ -37767,14 +38637,16 @@
 3227865088,3227865343,US
 3227865344,3227867903,NL
 3227867904,3227868159,TH
-3227868160,3227874815,US
+3227868160,3227873023,US
+3227873024,3227874047,NL
+3227874048,3227874815,US
 3227874816,3227875071,PT
 3227875072,3227878911,US
 3227878912,3227879167,AU
 3227879168,3227879679,US
 3227879680,3227879935,GB
 3227880192,3227880959,US
-3227881216,3227885567,US
+3227881472,3227885567,US
 3227885824,3227887871,ES
 3227887872,3227888127,PR
 3227888128,3227888383,BE
@@ -38266,7 +39138,7 @@
 3229889792,3229890047,PT
 3229890048,3229890303,US
 3229890304,3229890559,PT
-3229890560,3229891327,US
+3229890560,3229891071,US
 3229891584,3229891839,CA
 3229892608,3229900031,US
 3229900032,3229900287,AU
@@ -38300,7 +39172,8 @@
 3229947392,3229948415,US
 3229948672,3229948927,US
 3229948928,3229949183,IT
-3229949184,3229949695,US
+3229949184,3229949439,GB
+3229949440,3229949695,US
 3229949696,3229949951,NZ
 3229949952,3229950207,NO
 3229950208,3229950975,US
@@ -38490,7 +39363,8 @@
 3230333184,3230333695,US
 3230333696,3230333951,NZ
 3230333952,3230334719,US
-3230335232,3230336255,CA
+3230335232,3230335743,CA
+3230336000,3230336255,CA
 3230336512,3230339583,CA
 3230339840,3230340095,CA
 3230340352,3230350847,CA
@@ -38502,7 +39376,8 @@
 3230370304,3230370559,CA
 3230370816,3230372607,CA
 3230372864,3230383359,CA
-3230383616,3230387455,CA
+3230383616,3230384127,CA
+3230384384,3230387455,CA
 3230387712,3230400255,CA
 3230400768,3230591231,FR
 3230591232,3230591487,FI
@@ -38795,7 +39670,8 @@
 3231154432,3231154687,IN
 3231187200,3231188479,US
 3231188480,3231188735,NO
-3231188736,3231190527,US
+3231188736,3231189503,US
+3231189760,3231190527,US
 3231190528,3231190783,GB
 3231190784,3231191295,US
 3231191296,3231191551,GB
@@ -38972,7 +39848,7 @@
 3231503616,3231503871,IT
 3231503872,3231504383,US
 3231504640,3231504895,GB
-3231504896,3231505407,US
+3231505152,3231505407,US
 3231505664,3231506687,US
 3231506688,3231506943,NZ
 3231506944,3231507199,US
@@ -39084,7 +39960,9 @@
 3231729664,3231735551,US
 3231735552,3231736063,CH
 3231736064,3231737087,US
-3231737600,3231739135,US
+3231737600,3231738367,US
+3231738368,3231738623,NL
+3231738624,3231739135,US
 3231739136,3231739391,GB
 3231739392,3231739647,PL
 3231739648,3231739903,BR
@@ -39591,7 +40469,7 @@
 3234795008,3234795263,GB
 3234795264,3234795519,US
 3234795776,3234796031,US
-3234796288,3234799359,US
+3234796544,3234799359,US
 3234799360,3234799615,NL
 3234799616,3234799871,US
 3234799872,3234800127,AU
@@ -39613,7 +40491,8 @@
 3234816000,3234816767,AU
 3234816768,3234820351,US
 3234820352,3234820607,AU
-3234820608,3234821887,US
+3234820608,3234820863,US
+3234821120,3234821887,US
 3234821888,3234822655,AU
 3234822656,3234826751,US
 3234826752,3234827007,CA
@@ -39738,7 +40617,8 @@
 3236416256,3236416511,AU
 3236416512,3236418303,US
 3236418304,3236418815,AU
-3236418816,3236419583,US
+3236418816,3236419071,US
+3236419328,3236419583,US
 3236419584,3236419839,AU
 3236419840,3236420095,US
 3236420096,3236420351,AU
@@ -39913,7 +40793,6 @@
 3238007040,3238010879,NL
 3238010880,3238017023,CH
 3238017024,3238018303,DK
-3238018560,3238019071,CH
 3238019072,3238035455,PL
 3238035456,3238060031,FR
 3238060032,3238060287,CH
@@ -40208,7 +41087,6 @@
 3239277056,3239277567,DE
 3239277568,3239278079,RU
 3239278080,3239278591,UA
-3239278592,3239279103,AT
 3239279104,3239280127,PL
 3239280128,3239280639,RU
 3239280640,3239281663,IR
@@ -40436,7 +41314,7 @@
 3239691264,3239691519,IT
 3239691520,3239692031,FR
 3239692032,3239692287,AT
-3239694336,3239697407,DE
+3239692288,3239697407,DE
 3239697408,3239697663,NL
 3239697664,3239697919,RU
 3239697920,3239698431,PL
@@ -40459,6 +41337,7 @@
 3239709952,3239710207,UA
 3239710208,3239710463,BG
 3239710464,3239710719,DE
+3239710720,3239710975,RU
 3239710976,3239711231,SE
 3239711232,3239711487,BY
 3239711488,3239711743,FR
@@ -40487,6 +41366,7 @@
 3239741184,3239741439,RU
 3239741440,3239759871,DE
 3239759872,3239760127,RU
+3239760128,3239760383,UA
 3239760384,3239760895,PL
 3239760896,3239761151,RU
 3239761152,3239761407,GB
@@ -40815,7 +41695,6 @@
 3240201728,3240202239,CH
 3240202240,3240202751,RU
 3240202752,3240203263,UA
-3240203264,3240203775,RO
 3240203776,3240204799,AT
 3240204800,3240205311,RO
 3240205312,3240205823,GB
@@ -40930,6 +41809,8 @@
 3240281216,3240281343,FR
 3240281344,3240281471,PL
 3240281472,3240281599,IR
+3240281600,3240281727,CY
+3240281728,3240281855,PL
 3240288256,3240296447,GB
 3240296448,3240296703,RO
 3240296704,3240302847,GB
@@ -40952,8 +41833,7 @@
 3240373248,3240373503,RO
 3240373504,3240373759,FR
 3240373760,3240374015,DE
-3240374016,3240374271,IE
-3240374272,3240407039,GB
+3240374016,3240407039,GB
 3240407040,3240407295,IL
 3240407296,3240407551,NL
 3240407552,3240407807,NO
@@ -41044,7 +41924,7 @@
 3240691712,3240692735,DE
 3240692736,3240693247,DK
 3240693248,3240693759,ES
-3240693760,3240695807,IE
+3240693760,3240695807,BE
 3240695808,3240697855,ES
 3240697856,3240698111,SE
 3240698112,3240698367,LV
@@ -41422,7 +42302,8 @@
 3241541376,3241541631,PL
 3241541632,3241673215,FR
 3241673472,3241674751,FR
-3241675008,3241681407,FR
+3241675008,3241676543,FR
+3241676800,3241681407,FR
 3241681664,3241683199,FR
 3241683456,3241702399,FR
 3241702912,3241704447,FR
@@ -41671,11 +42552,10 @@
 3244149760,3244150783,PL
 3244150784,3244151807,CH
 3244151808,3244152831,KZ
-3244152832,3244153855,RU
 3244153856,3244154879,NO
 3244154880,3244155903,GB
 3244155904,3244156927,UA
-3244156928,3244157951,RU
+3244156928,3244158975,RU
 3244158976,3244159999,DE
 3244160000,3244161023,RU
 3244161024,3244163071,NO
@@ -41718,7 +42598,7 @@
 3245088512,3245088767,FR
 3245088768,3245089279,BG
 3245089280,3245089791,PL
-3245089792,3245090815,UA
+3245090304,3245090815,UA
 3245090816,3245091327,AT
 3245091328,3245091839,SE
 3245091840,3245093887,UA
@@ -41734,6 +42614,7 @@
 3245107712,3245108735,CZ
 3245108736,3245109247,FR
 3245109248,3245113855,UA
+3245113856,3245114367,RU
 3245114368,3245114879,SK
 3245114880,3245115391,JO
 3245115392,3245115903,CH
@@ -41819,7 +42700,7 @@
 3245161984,3245162495,BE
 3245162496,3245163007,DE
 3245163008,3245163519,KE
-3245164032,3245164543,RU
+3245163520,3245164031,RU
 3245164544,3245165055,BE
 3245165056,3245165567,AT
 3245165568,3245166079,RU
@@ -41919,7 +42800,7 @@
 3245218816,3245219839,AT
 3245219840,3245221887,FI
 3245221888,3245223935,DE
-3245223936,3245225983,NL
+3245223936,3245225983,GB
 3245225984,3245228031,HU
 3245228032,3245229055,FI
 3245229056,3245230079,DE
@@ -42147,7 +43028,9 @@
 3245910832,3245910847,GB
 3245910848,3245921279,IE
 3245921280,3245921535,BE
-3245921536,3245931263,IE
+3245921536,3245924647,IE
+3245924648,3245924655,GB
+3245924656,3245931263,IE
 3245931264,3245931519,GB
 3245931520,3245932543,IE
 3245932544,3245998079,BE
@@ -42393,7 +43276,9 @@
 3247266400,3247266407,DE
 3247266408,3247266559,NL
 3247266560,3247271679,DE
-3247271680,3247272775,NL
+3247271680,3247272351,NL
+3247272352,3247272359,DE
+3247272360,3247272775,NL
 3247272776,3247272783,DE
 3247272784,3247273751,NL
 3247273752,3247273759,DE
@@ -42551,7 +43436,9 @@
 3247347968,3247348223,HU
 3247348224,3247348991,FI
 3247348992,3247349247,DE
-3247349248,3247362047,FI
+3247349248,3247349759,FI
+3247349760,3247353855,SE
+3247353856,3247362047,FI
 3247362048,3247362303,RO
 3247362304,3247362559,HU
 3247362560,3247362815,PL
@@ -42569,7 +43456,6 @@
 3247365888,3247366143,DE
 3247366144,3247371007,FI
 3247371008,3247371263,PL
-3247371264,3247371519,LT
 3247371520,3247371775,GB
 3247371776,3247374335,FI
 3247374336,3247374591,RU
@@ -42690,9 +43576,7 @@
 3248372264,3248372271,NL
 3248372272,3248372319,DE
 3248372320,3248372327,BE
-3248372328,3248417311,DE
-3248417312,3248417343,ES
-3248417344,3248488447,DE
+3248372328,3248488447,DE
 3248488448,3248525311,NO
 3248525312,3248525567,DE
 3248525568,3248525823,DK
@@ -42755,7 +43639,6 @@
 3248813568,3248814079,DE
 3248814080,3248815103,DK
 3248815104,3248815615,GB
-3248815616,3248816127,PL
 3248816128,3248881663,CZ
 3248881664,3249012735,FI
 3249012736,3249012991,DE
@@ -42765,6 +43648,25 @@
 3249025792,3249026559,LU
 3249026816,3249045503,LU
 3249045504,3249078271,DE
+3249078272,3249078783,RU
+3249078784,3249079295,CH
+3249079296,3249079807,RU
+3249079808,3249080831,RO
+3249080832,3249081343,DE
+3249081344,3249081855,UA
+3249081856,3249082367,GB
+3249082368,3249082879,HU
+3249082880,3249083391,PL
+3249083392,3249083903,RO
+3249083904,3249085951,RU
+3249085952,3249086463,GI
+3249086464,3249088511,RU
+3249088512,3249089023,NL
+3249089024,3249089535,NO
+3249089536,3249090047,RU
+3249090048,3249090559,FR
+3249090560,3249091071,SI
+3249091072,3249091583,RO
 3249143808,3249274879,AT
 3249274880,3249277759,NL
 3249277760,3249277775,BG
@@ -43121,6 +44023,7 @@
 3251116544,3251116799,DK
 3251116800,3251117055,GB
 3251117056,3251117311,BG
+3251117312,3251117567,FR
 3251117568,3251117823,IL
 3251117824,3251118079,SE
 3251118080,3251118591,UA
@@ -43355,7 +44258,6 @@
 3251212800,3251212927,FR
 3251213056,3251213119,SE
 3251213120,3251213151,NL
-3251213152,3251213183,DE
 3251213184,3251213215,UA
 3251213216,3251213247,CH
 3251213248,3251213311,GB
@@ -43675,7 +44577,9 @@
 3252407600,3252407615,BJ
 3252407616,3252407679,NO
 3252407680,3252407743,NG
-3252407744,3252407807,NO
+3252407744,3252407751,NO
+3252407752,3252407759,AO
+3252407760,3252407807,NO
 3252407808,3252407999,GN
 3252408000,3252408159,NO
 3252408160,3252408191,GQ
@@ -43719,9 +44623,11 @@
 3252409104,3252409111,SD
 3252409112,3252409119,LT
 3252409120,3252409127,NG
-3252409128,3252409215,LT
-3252409216,3252409223,SO
-3252409224,3252409247,LT
+3252409128,3252409135,LT
+3252409136,3252409143,AO
+3252409144,3252409183,LT
+3252409184,3252409191,UG
+3252409192,3252409247,LT
 3252409248,3252409263,IQ
 3252409264,3252409343,SO
 3252409344,3252409375,TD
@@ -43737,9 +44643,7 @@
 3252409600,3252409663,NG
 3252409664,3252409855,LT
 3252409856,3252410383,BW
-3252410384,3252410623,LT
-3252410624,3252410655,SO
-3252410656,3252410879,LT
+3252410384,3252410879,LT
 3252410880,3252411007,IQ
 3252411008,3252411135,LT
 3252411136,3252411167,IQ
@@ -43757,8 +44661,7 @@
 3252411840,3252411855,NG
 3252411856,3252411879,LT
 3252411880,3252411895,CD
-3252411896,3252411903,LT
-3252411904,3252412415,NG
+3252411896,3252412415,LT
 3252412416,3252412479,IQ
 3252412480,3252412927,LT
 3252412928,3252413439,NG
@@ -43775,10 +44678,11 @@
 3252414496,3252414511,LT
 3252414512,3252414527,MR
 3252414528,3252414607,GH
-3252414608,3252414639,TZ
+3252414608,3252414623,LT
+3252414624,3252414639,TZ
 3252414640,3252414655,GH
 3252414656,3252414719,ER
-3252414720,3252414975,IQ
+3252414720,3252414975,LT
 3252414976,3252415231,NG
 3252415232,3252415487,LT
 3252415488,3252415503,SD
@@ -43815,7 +44719,7 @@
 3252419088,3252419103,LT
 3252419104,3252419119,SL
 3252419120,3252419127,GH
-3252419128,3252419135,TZ
+3252419128,3252419135,LT
 3252419136,3252419167,SL
 3252419168,3252419199,CD
 3252419200,3252419215,GH
@@ -43828,13 +44732,9 @@
 3252419344,3252419359,LT
 3252419360,3252419423,GH
 3252419424,3252419583,LT
-3252419584,3252419791,IQ
-3252419792,3252419839,LT
-3252419840,3252419879,IQ
-3252419880,3252419887,LT
-3252419888,3252419895,IQ
-3252419896,3252419919,LT
-3252419920,3252420111,IQ
+3252419584,3252419775,IQ
+3252419776,3252419839,LT
+3252419840,3252420111,IQ
 3252420112,3252420119,GB
 3252420120,3252420231,IQ
 3252420232,3252420239,LT
@@ -43842,7 +44742,9 @@
 3252420256,3252420263,LT
 3252420264,3252420279,IQ
 3252420280,3252420287,LT
-3252420288,3252420447,IQ
+3252420288,3252420415,IQ
+3252420416,3252420431,GB
+3252420432,3252420447,IQ
 3252420448,3252420455,LT
 3252420456,3252420463,IQ
 3252420464,3252420479,LT
@@ -43861,8 +44763,8 @@
 3252425024,3252425215,SO
 3252425216,3252425343,TD
 3252425344,3252425471,LT
-3252425472,3252425543,AO
-3252425544,3252425599,LT
+3252425472,3252425551,AO
+3252425552,3252425599,LT
 3252425600,3252425631,AF
 3252425632,3252425727,LT
 3252425728,3252425855,ZM
@@ -43877,23 +44779,17 @@
 3252428416,3252428447,KE
 3252428448,3252428543,LT
 3252428544,3252428671,CG
-3252428672,3252428799,LT
-3252428800,3252428831,IQ
-3252428832,3252428863,LT
-3252428864,3252428887,IQ
-3252428888,3252429103,LT
-3252429104,3252429119,IQ
-3252429120,3252429247,LT
+3252428672,3252428863,LT
+3252428864,3252428879,IQ
+3252428880,3252429247,LT
 3252429248,3252429263,IQ
-3252429264,3252429727,LT
-3252429728,3252429743,IQ
-3252429744,3252429823,LT
+3252429264,3252429823,LT
 3252429824,3252429951,NE
 3252429952,3252430079,LT
 3252430080,3252430335,BJ
 3252430336,3252430463,NE
-3252430464,3252430527,LT
-3252430528,3252430535,BF
+3252430464,3252430519,LT
+3252430520,3252430535,BF
 3252430536,3252430543,LT
 3252430544,3252430559,BJ
 3252430560,3252430591,BF
@@ -43921,9 +44817,9 @@
 3252435200,3252435263,TZ
 3252435264,3252435295,LT
 3252435296,3252435311,TZ
-3252435312,3252435319,EG
+3252435312,3252435319,MG
 3252435320,3252435327,MZ
-3252435328,3252435343,LT
+3252435328,3252435343,CD
 3252435344,3252435359,BF
 3252435360,3252435375,CD
 3252435376,3252435391,GN
@@ -43957,12 +44853,12 @@
 3252438528,3252438783,CM
 3252438784,3252439039,LT
 3252439040,3252439055,BJ
-3252439056,3252439287,LT
+3252439056,3252439071,LT
+3252439072,3252439079,BJ
+3252439080,3252439287,LT
 3252439288,3252439295,SN
 3252439296,3252439391,SO
-3252439392,3252439551,LT
-3252439552,3252439583,AL
-3252439584,3252439807,LT
+3252439392,3252439807,LT
 3252439808,3252439871,SO
 3252439872,3252440063,LT
 3252440064,3252440319,MW
@@ -44034,7 +44930,9 @@
 3252452496,3252452503,ZM
 3252452504,3252452607,LT
 3252452608,3252452735,TD
-3252452736,3252453119,LT
+3252452736,3252452863,LT
+3252452864,3252452879,TZ
+3252452880,3252453119,LT
 3252453120,3252453151,NG
 3252453152,3252453375,LT
 3252453376,3252454527,NO
@@ -44107,7 +45005,11 @@
 3252483584,3252484095,LT
 3252484096,3252486143,KW
 3252486144,3252490239,BE
-3252490240,3252507135,SE
+3252490240,3252495871,SE
+3252495872,3252496127,HU
+3252496128,3252505343,SE
+3252505344,3252505855,US
+3252505856,3252507135,SE
 3252507648,3252509951,GB
 3252509952,3252510719,CH
 3252510720,3252514815,FR
@@ -44235,7 +45137,6 @@
 3252933632,3252934655,IT
 3252934656,3252936703,PL
 3252936704,3252937215,CH
-3252937216,3252937727,RO
 3252937728,3252938239,FR
 3252938240,3252938751,UA
 3252938752,3252939263,RU
@@ -44716,6 +45617,7 @@
 3254781440,3254781951,BE
 3254781952,3254782207,LV
 3254796288,3254797311,SE
+3254797312,3254798335,RU
 3254798336,3254799359,AT
 3254799360,3254800383,IE
 3254800384,3254801407,FI
@@ -45004,9 +45906,7 @@
 3255246592,3255246623,LU
 3255246624,3255247455,BE
 3255247456,3255247487,LU
-3255247488,3255247615,BE
-3255247616,3255247631,LU
-3255247632,3255247647,BE
+3255247488,3255247647,BE
 3255247648,3255247663,LU
 3255247664,3255248127,BE
 3255248128,3255248383,LU
@@ -45026,9 +45926,7 @@
 3255252560,3255252575,LU
 3255252576,3255254847,BE
 3255254848,3255254879,LU
-3255254880,3255254927,BE
-3255254928,3255254943,LU
-3255254944,3255255559,BE
+3255254880,3255255559,BE
 3255255560,3255255567,LU
 3255255568,3255255599,BE
 3255255600,3255255607,LU
@@ -45064,7 +45962,9 @@
 3255273856,3255273887,LU
 3255273888,3255274207,BE
 3255274208,3255274239,LU
-3255274240,3255276223,BE
+3255274240,3255274335,BE
+3255274336,3255274367,LU
+3255274368,3255276223,BE
 3255276224,3255276255,FR
 3255276256,3255278855,BE
 3255278856,3255278863,DE
@@ -45155,6 +46055,10 @@
 3255327744,3255328255,SE
 3255328256,3255328767,SI
 3255328768,3255336959,DE
+3255336960,3255341055,RU
+3255341056,3255343103,UA
+3255343104,3255344127,RU
+3255344128,3255345151,UA
 3255345152,3255353343,RU
 3255353344,3255361535,DE
 3255361536,3255369727,GB
@@ -45440,9 +46344,11 @@
 3256694784,3256695807,CH
 3256695808,3256696831,UA
 3256696832,3256697599,BE
+3256697600,3256697855,GB
 3256697856,3256698367,IT
 3256698368,3256698623,NL
 3256698624,3256698879,GB
+3256698880,3256699135,DE
 3256701184,3256701439,BE
 3256701440,3256701695,GB
 3256705280,3256705791,BE
@@ -46552,7 +47458,6 @@
 3259965440,3259966463,RU
 3259966464,3259967487,DE
 3259967488,3259968511,CS
-3259968512,3259969535,RO
 3259969536,3259970559,FR
 3259970560,3259971583,CZ
 3259971584,3259972607,IT
@@ -46710,13 +47615,9 @@
 3261173992,3261174007,DE
 3261174008,3261174015,AT
 3261174016,3261202431,DE
-3261202432,3261236527,FR
-3261236528,3261236543,GB
-3261236544,3261236863,FR
+3261202432,3261236863,FR
 3261236864,3261236991,GB
-3261236992,3261241503,FR
-3261241504,3261241535,GB
-3261241536,3261267967,FR
+3261236992,3261267967,FR
 3261267968,3261297663,DE
 3261297664,3261297919,RU
 3261297920,3261298175,PL
@@ -46726,7 +47627,9 @@
 3261472768,3261503487,RO
 3261503488,3261503935,MD
 3261503936,3261530111,RO
-3261530112,3261595647,SE
+3261530112,3261570303,SE
+3261570304,3261570559,IT
+3261570560,3261595647,SE
 3261595648,3261599743,NL
 3261600768,3261661183,NL
 3261661184,3261669375,RO
@@ -46889,12 +47792,14 @@
 3262034528,3262034559,AX
 3262034560,3262034687,FI
 3262034688,3262034719,AX
-3262034720,3262035199,FI
-3262035200,3262035455,AX
-3262035456,3262036287,FI
+3262034720,3262034943,FI
+3262034944,3262035455,AX
+3262035456,3262035487,FI
+3262035488,3262035519,AX
+3262035520,3262036287,FI
 3262036288,3262036303,AX
-3262036304,3262036319,FI
-3262036320,3262036335,AX
+3262036304,3262036311,FI
+3262036312,3262036335,AX
 3262036336,3262036367,FI
 3262036368,3262036383,AX
 3262036384,3262036415,FI
@@ -46903,8 +47808,8 @@
 3262036464,3262036479,AX
 3262036480,3262036607,FI
 3262036608,3262036615,AX
-3262036616,3262036735,FI
-3262036736,3262038015,AX
+3262036616,3262036719,FI
+3262036720,3262038015,AX
 3262038016,3262038271,FR
 3262038272,3262038527,RU
 3262038528,3262038783,GB
@@ -46963,11 +47868,15 @@
 3262115072,3262115327,RU
 3262115328,3262119935,FI
 3262119936,3262120447,AX
-3262120448,3262120959,FI
-3262120960,3262121215,AX
-3262121216,3262122143,FI
-3262122144,3262122147,AX
-3262122148,3262122431,FI
+3262120448,3262120703,FI
+3262120704,3262121599,AX
+3262121600,3262121663,FI
+3262121664,3262122007,AX
+3262122008,3262122143,FI
+3262122144,3262122159,AX
+3262122160,3262122239,FI
+3262122240,3262122367,AX
+3262122368,3262122431,FI
 3262122432,3262122455,AX
 3262122456,3262122559,FI
 3262122560,3262122591,AX
@@ -46996,6 +47905,7 @@
 3262148928,3262149119,DE
 3262149120,3262149151,FR
 3262149152,3262149159,DE
+3262149160,3262149167,GB
 3262149168,3262149247,FR
 3262149632,3262149887,DE
 3262150912,3262151047,DE
@@ -50708,7 +51618,9 @@
 3262889112,3262889119,DE
 3262889120,3262889351,NL
 3262889352,3262889359,DE
-3262889360,3262889519,NL
+3262889360,3262889415,NL
+3262889416,3262889423,DE
+3262889424,3262889519,NL
 3262889520,3262889527,DE
 3262889528,3262890047,NL
 3262890048,3262890055,DE
@@ -50825,8 +51737,7 @@
 3263037440,3263045631,LB
 3263045632,3263047935,KW
 3263047936,3263048191,LB
-3263048192,3263048447,BH
-3263048448,3263053823,KW
+3263048192,3263053823,KW
 3263053824,3263062015,GB
 3263062016,3263070207,EE
 3263070208,3263070719,FR
@@ -50835,8 +51746,6 @@
 3263071488,3263072255,NL
 3263072256,3263074303,LB
 3263074304,3263074815,CH
-3263074816,3263075327,PL
-3263075328,3263075839,GB
 3263075840,3263076351,SE
 3263076352,3263076863,RO
 3263076864,3263077375,IT
@@ -50921,14 +51830,13 @@
 3263437312,3263477759,SE
 3263477760,3263478015,JP
 3263478016,3263496191,SE
-3263497216,3263497983,US
 3263497984,3263498239,GB
-3263498496,3263498751,ES
 3263498752,3263498879,US
 3263498880,3263498943,GB
 3263498960,3263499007,GB
 3263499776,3263500031,FR
-3263500032,3263501341,GB
+3263500032,3263500287,GB
+3263500800,3263501341,GB
 3263501344,3263501439,GB
 3263501440,3263501503,US
 3263501504,3263501519,GB
@@ -50937,24 +51845,16 @@
 3263501536,3263501551,DE
 3263501552,3263501823,GB
 3263501824,3263502079,EG
-3263502080,3263502335,FR
-3263502336,3263502847,GB
 3263503104,3263503167,DE
 3263503200,3263503267,DE
 3263503272,3263503279,DE
 3263503296,3263503359,DE
-3263503360,3263503871,FR
 3263503872,3263504127,GB
 3263504128,3263504255,EG
-3263506432,3263506687,BE
 3263506688,3263506815,DE
 3263506816,3263506943,US
-3263506944,3263507199,BE
 3263507200,3263507455,US
-3263507456,3263507967,GB
-3263507968,3263508223,IE
-3263508224,3263508735,GB
-3263508992,3263509503,US
+3263508224,3263508479,GB
 3263509504,3263509759,SE
 3263509760,3263509791,GB
 3263509792,3263509807,IE
@@ -50967,19 +51867,10 @@
 3263510032,3263510063,GB
 3263510064,3263510079,US
 3263510080,3263510271,GB
-3263510784,3263511039,US
 3263511296,3263511551,GB
-3263511552,3263512063,BE
 3263512064,3263512311,GB
-3263512320,3263512831,ES
-3263512832,3263513087,TR
-3263513088,3263513343,FR
 3263513344,3263513599,US
 3263513856,3263514111,RU
-3263515392,3263515903,ES
-3263515904,3263516159,GB
-3263516160,3263516415,FR
-3263516416,3263516671,LK
 3263516672,3263516927,US
 3263516928,3263517183,GB
 3263517696,3263517951,US
@@ -50988,33 +51879,24 @@
 3263518720,3263518751,IR
 3263518976,3263519231,GB
 3263519744,3263519759,GB
-3263520000,3263520255,GB
 3263520256,3263520511,FR
-3263520512,3263521279,US
-3263521536,3263521791,DE
+3263520512,3263520767,US
 3263521792,3263522047,GB
-3263522304,3263522559,FR
-3263523072,3263523839,DE
+3263523072,3263523583,DE
 3263525760,3263525887,DE
-3263526400,3263526655,IT
 3263527424,3263527679,ZW
 3263527680,3263527935,DE
 3263528192,3263528447,FR
 3263528704,3263528959,GB
 3263530496,3263530751,GB
-3263531008,3263531263,FR
 3263531520,3263531535,DE
 3263531552,3263531775,DE
 3263532544,3263532799,GB
-3263536896,3263537151,ZW
-3263537152,3263538431,TR
+3263537664,3263538431,TR
 3263540224,3263540479,TR
 3263540480,3263540735,GB
-3263540992,3263541247,TR
-3263541248,3263541535,GB
-3263545344,3263546879,US
-3263547136,3263557631,US
-3263557632,3263558399,TR
+3263541504,3263541535,GB
+3263557632,3263557887,TR
 3263558656,3263558911,TR
 3263558912,3263559679,GB
 3263559680,3263560191,TR
@@ -51149,7 +52031,7 @@
 3264320256,3264321023,GB
 3264321024,3264321535,DE
 3264321536,3264321791,SE
-3264321792,3264322047,CS
+3264321792,3264322047,RS
 3264322048,3264322303,FR
 3264322304,3264322559,RO
 3264322560,3264322815,HU
@@ -51187,7 +52069,6 @@
 3264341504,3264341759,DE
 3264341760,3264342015,IT
 3264342016,3264342783,DE
-3264342784,3264343039,RU
 3264343040,3264343295,DE
 3264343296,3264343551,GB
 3264343552,3264343807,RO
@@ -51424,9 +52305,9 @@
 3264845952,3264846079,GB
 3264846080,3264846207,UG
 3264846208,3264846335,PL
-3264846336,3264846463,RU
 3264846464,3264846591,NO
 3264846592,3264846719,US
+3264846720,3264846847,RU
 3264846848,3264846911,DK
 3264846912,3264846975,RU
 3264846976,3264847039,DE
@@ -51494,10 +52375,10 @@
 3264907152,3264907155,GR
 3264907156,3264907639,CY
 3264907640,3264907647,GR
-3264907648,3264907655,CY
-3264907656,3264907671,GR
-3264907672,3264907675,CY
-3264907676,3264907683,GR
+3264907648,3264907663,CY
+3264907664,3264907671,GR
+3264907672,3264907679,CY
+3264907680,3264907683,GR
 3264907684,3264907687,CY
 3264907688,3264907691,GR
 3264907692,3264907695,CY
@@ -51857,9 +52738,13 @@
 3266384896,3266385919,RU
 3266385920,3266386943,UA
 3266386944,3266387967,PL
-3266387968,3266389247,FR
+3266387968,3266388375,FR
+3266388376,3266388378,NL
+3266388379,3266389247,FR
 3266389248,3266389327,LU
-3266389328,3266396159,FR
+3266389328,3266395647,FR
+3266395648,3266395903,NL
+3266395904,3266396159,FR
 3266396160,3266412543,IT
 3266412544,3266420735,AT
 3266420736,3266428927,GB
@@ -51918,8 +52803,8 @@
 3266813952,3266822143,UA
 3266822144,3266830335,FR
 3266830336,3266836479,BE
-3266836480,3266837023,LU
-3266837024,3266838527,BE
+3266836480,3266837503,LU
+3266837504,3266838527,BE
 3266838528,3266969599,IT
 3266969600,3267008767,RU
 3267008768,3267009023,UA
@@ -52085,8 +52970,7 @@
 3267626496,3267626751,ES
 3267626752,3267627007,RU
 3267627008,3267627343,DE
-3267627360,3267627439,DE
-3267627456,3267627463,DE
+3267627360,3267627487,DE
 3267627776,3267627807,DE
 3267627840,3267628031,DE
 3267628032,3267628287,IT
@@ -52095,14 +52979,13 @@
 3267629056,3267629311,CZ
 3267629312,3267629567,DK
 3267629568,3267629759,BE
-3267629792,3267629823,BE
+3267629808,3267629823,BE
 3267629824,3267630079,GR
 3267630080,3267630591,GB
 3267630592,3267630847,SK
 3267630848,3267630863,IT
 3267630864,3267630943,FR
-3267630944,3267631007,IT
-3267631024,3267631055,IT
+3267630944,3267631055,IT
 3267631056,3267631071,GB
 3267631088,3267631103,IT
 3267631104,3267631615,GB
@@ -52152,7 +53035,7 @@
 3267644672,3267644927,SI
 3267644936,3267644959,BE
 3267644960,3267644975,FR
-3267644976,3267644991,GB
+3267644976,3267644983,GB
 3267644992,3267645055,BE
 3267645056,3267645183,GB
 3267645440,3267645695,GB
@@ -52194,17 +53077,15 @@
 3267658752,3267659263,CH
 3267659520,3267659775,IT
 3267660288,3267660543,CH
-3267660544,3267660575,ES
-3267660592,3267660671,ES
+3267660544,3267660671,ES
 3267661312,3267661567,SK
 3267661568,3267661631,GB
 3267661664,3267661679,GB
 3267661696,3267661823,GB
 3267661824,3267661831,ES
-3267661840,3267661951,ES
+3267661840,3267661887,ES
 3267662024,3267662031,ES
 3267662040,3267662079,ES
-3267662880,3267662887,IE
 3267662888,3267662895,GB
 3267662896,3267662951,IE
 3267662952,3267662959,GB
@@ -52224,22 +53105,20 @@
 3267666256,3267666431,GR
 3267666432,3267666447,GB
 3267666464,3267666543,GB
-3267666576,3267666687,GB
-3267666720,3267667199,GB
+3267666576,3267667199,GB
 3267667200,3267667455,NL
-3267667456,3267667583,GB
-3267667712,3267667967,GB
+3267667456,3267667967,GB
 3267670016,3267671551,ZA
 3267671552,3267671807,DE
 3267671808,3267672063,NO
 3267672064,3267672319,DE
 3267672576,3267672831,AT
-3267672832,3267672951,FR
-3267672960,3267672999,FR
+3267672832,3267672927,FR
+3267672936,3267672999,FR
 3267673008,3267673015,FR
 3267673024,3267673087,FR
 3267673088,3267673439,DE
-3267673472,3267673495,DE
+3267673472,3267673503,DE
 3267673600,3267673791,DE
 3267673808,3267673855,DE
 3267674112,3267674127,NL
@@ -52609,6 +53488,8 @@
 3269277760,3269278719,NL
 3269279232,3269279487,NL
 3269279672,3269279679,CH
+3269279744,3269279999,GB
+3269280000,3269280767,NL
 3269280768,3269281023,GB
 3269281024,3269281279,DE
 3269281536,3269281663,DE
@@ -52635,7 +53516,7 @@
 3269293120,3269293151,DE
 3269293208,3269293215,DE
 3269293248,3269293279,DE
-3269293376,3269293383,DE
+3269293376,3269293391,DE
 3269293856,3269293887,DE
 3269293920,3269293951,DE
 3269296232,3269296235,DE
@@ -52676,14 +53557,14 @@
 3269327864,3269328383,DE
 3269328896,3269459967,GB
 3269459968,3269525503,ES
-3269525504,3269591039,IR
+3269525504,3269556223,IR
+3269556224,3269556479,AE
+3269556480,3269591039,IR
 3269591040,3269621759,RU
 3269621760,3269623551,BY
 3269623552,3269656575,RU
 3269656576,3269722111,GB
-3269722112,3269731839,CZ
-3269731840,3269732095,CR
-3269732096,3269750799,CZ
+3269722112,3269750799,CZ
 3269750800,3269750815,CR
 3269750816,3269787647,CZ
 3269787648,3269853183,NL
@@ -52721,23 +53602,19 @@
 3270170112,3270170623,NO
 3270174720,3270174975,NO
 3270175744,3270175999,NO
-3270181120,3270181887,CH
-3270182144,3270183679,CH
-3270188288,3270188799,CH
-3270189056,3270190079,BE
+3270181120,3270181375,CH
+3270181632,3270181887,CH
+3270182144,3270182399,CH
+3270182656,3270183679,CH
+3270189056,3270189311,BE
 3270190080,3270190591,IT
-3270190592,3270191359,CH
-3270191616,3270192047,CH
-3270193152,3270193919,CH
-3270194176,3270194431,CH
-3270194688,3270194943,CH
-3270195456,3270195967,CH
-3270196480,3270197247,CH
-3270198528,3270199039,NL
-3270199808,3270201087,NL
+3270190592,3270191103,CH
+3270191872,3270192047,CH
+3270196992,3270197247,CH
+3270200064,3270200319,NL
 3270201344,3270201599,NL
-3270202624,3270203135,NL
-3270204416,3270205695,NL
+3270202880,3270203135,NL
+3270205440,3270205695,NL
 3270205984,3270205999,ES
 3270206064,3270206079,ES
 3270206976,3270207231,ES
@@ -52747,8 +53624,6 @@
 3270208256,3270208511,LU
 3270208768,3270209023,RO
 3270209024,3270209279,NL
-3270210560,3270211071,NL
-3270211328,3270211583,NL
 3270212352,3270212863,NL
 3270213120,3270213631,NL
 3270213888,3270214279,PT
@@ -52761,24 +53636,21 @@
 3270216736,3270216751,IT
 3270216800,3270216815,IT
 3270216832,3270216879,IT
-3270217472,3270219775,CH
-3270222336,3270223871,IT
+3270217472,3270217727,CH
+3270218496,3270218751,CH
 3270224640,3270224895,CH
-3270225408,3270225663,CH
-3270230016,3270230783,LU
+3270230272,3270230783,LU
 3270231296,3270231647,LU
-3270231808,3270232831,LU
+3270232576,3270232831,LU
 3270234112,3270234367,LU
-3270234368,3270238719,NL
-3270238976,3270239999,CH
-3270240000,3270240255,NL
-3270240768,3270241023,NL
-3270241280,3270241535,NL
-3270241536,3270242559,RO
-3270242816,3270243071,AT
+3270234368,3270234623,NL
+3270235136,3270236159,NL
+3270238208,3270238719,NL
+3270238976,3270239487,CH
+3270241792,3270242559,RO
 3270243328,3270243839,RO
-3270243840,3270244351,NL
-3270244352,3270245887,CH
+3270244096,3270244351,NL
+3270244352,3270244863,CH
 3270245888,3270246143,RO
 3270246144,3270246399,CH
 3270246400,3270247951,SE
@@ -52851,7 +53723,6 @@
 3270929408,3270929919,GB
 3270929920,3270930431,BG
 3270930432,3270930943,RU
-3270930944,3270931455,NL
 3270931456,3270931967,UA
 3270931968,3270932479,CH
 3270932480,3270932991,UA
@@ -52879,7 +53750,9 @@
 3271020272,3271020279,RS
 3271020280,3271020511,CS
 3271020512,3271020543,CS
-3271020544,3271020695,CS
+3271020544,3271020671,CS
+3271020672,3271020687,RS
+3271020688,3271020695,CS
 3271020696,3271020703,CS
 3271020704,3271020751,CS
 3271020752,3271020767,RS
@@ -53194,7 +54067,9 @@
 3272065504,3272065535,GB
 3272065536,3272065551,NL
 3272065552,3272065559,GB
-3272065560,3272065599,NL
+3272065560,3272065575,NL
+3272065576,3272065583,GB
+3272065584,3272065599,NL
 3272065600,3272065615,GB
 3272065616,3272065663,NL
 3272065664,3272065791,GB
@@ -53216,8 +54091,8 @@
 3272067776,3272067807,GB
 3272067808,3272067839,NL
 3272067840,3272067871,GB
-3272067872,3272067895,NL
-3272067896,3272067927,GB
+3272067872,3272067887,NL
+3272067888,3272067927,GB
 3272067928,3272067967,NL
 3272067968,3272068095,GB
 3272068096,3272068351,NL
@@ -53292,7 +54167,7 @@
 3272089480,3272089535,PT
 3272089536,3272089551,ST
 3272089552,3272089599,PT
-3272089600,3272091647,RU
+3272090112,3272091647,RU
 3272091648,3272092671,UA
 3272092672,3272093183,RU
 3272093184,3272094207,RO
@@ -53543,7 +54418,7 @@
 3272402032,3272402039,GB
 3272402040,3272402047,US
 3272402176,3272402191,GB
-3272402208,3272402303,GB
+3272402240,3272402303,GB
 3272402560,3272402623,GB
 3272402816,3272402943,GB
 3272403072,3272403199,FR
@@ -53789,8 +54664,7 @@
 3273052080,3273052087,CU
 3273052088,3273052095,GR
 3273052096,3273052111,FR
-3273052112,3273052127,GB
-3273052128,3273052415,IT
+3273052112,3273052415,IT
 3273052416,3273052671,GB
 3273052672,3273052927,FR
 3273052928,3273053183,DE
@@ -53892,6 +54766,7 @@
 3273332544,3273332575,DE
 3273332608,3273332671,DE
 3273333056,3273333119,DE
+3273334272,3273334783,DE
 3273335040,3273335295,DE
 3273335296,3273335807,GB
 3273335936,3273335999,DE
@@ -53906,9 +54781,7 @@
 3273339920,3273339943,DE
 3273339944,3273339955,GB
 3273339956,3273339959,DE
-3273339960,3273340023,GB
-3273340024,3273340031,DE
-3273340032,3273340095,GB
+3273339960,3273340095,GB
 3273340096,3273340111,GI
 3273340112,3273340415,GB
 3273340928,3273341695,FR
@@ -54199,7 +55072,7 @@
 3274338816,3274339327,DE
 3274339328,3274339839,RO
 3274339840,3274340351,RU
-3274340352,3274340863,ES
+3274340352,3274340863,IE
 3274340864,3274341375,RU
 3274341376,3274341887,FR
 3274341888,3274342399,UA
@@ -54646,7 +55519,8 @@
 3275423744,3275423751,GB
 3275423776,3275423807,GB
 3275424000,3275424255,GB
-3275425792,3275426303,GB
+3275425792,3275426367,GB
+3275426432,3275426559,GB
 3275427840,3275428367,GB
 3275429888,3275430143,GB
 3275430272,3275430399,GB
@@ -54661,16 +55535,17 @@
 3275446848,3275446911,GB
 3275448320,3275449519,GB
 3275449520,3275449527,FR
-3275449536,3275449887,GB
+3275449528,3275449927,GB
 3275450368,3275450879,GB
 3275451232,3275451263,GB
 3275452416,3275452943,GB
 3275452960,3275453023,GB
-3275454464,3275454975,GB
+3275453056,3275453119,GB
+3275454464,3275455231,GB
 3275456512,3275457023,GB
 3275457024,3275457791,FK
 3275457792,3275458559,GB
-3275458560,3275459327,IE
+3275458560,3275459583,IE
 3275460608,3275460863,HK
 3275460864,3275462655,GB
 3275464704,3275468655,GB
@@ -54758,7 +55633,6 @@
 3275551744,3275552767,RU
 3275552768,3275553791,LV
 3275553792,3275554815,FI
-3275554816,3275555071,ES
 3275555392,3275555455,ES
 3275555592,3275555647,ES
 3275555744,3275555759,ES
@@ -54778,13 +55652,15 @@
 3275567616,3275568127,CH
 3275568384,3275569407,CH
 3275569920,3275570687,CH
-3275571200,3275572223,PT
+3275571200,3275571455,PT
+3275571968,3275572095,PT
 3275572768,3275572863,PT
 3275572992,3275573055,PT
 3275573120,3275574015,PT
 3275574032,3275574047,PT
 3275574144,3275574147,PT
-3275574152,3275574191,PT
+3275574152,3275574159,PT
+3275574176,3275574191,PT
 3275574784,3275575231,PT
 3275575424,3275575727,PT
 3275575808,3275575935,PT
@@ -54797,28 +55673,28 @@
 3275578880,3275579007,PT
 3275579136,3275579391,PT
 3275579392,3275579519,FR
-3275579520,3275579615,NL
+3275579520,3275579583,NL
+3275579600,3275579615,NL
 3275579648,3275579703,NL
-3275579904,3275581311,NL
+3275579904,3275580159,NL
+3275580928,3275581311,NL
 3275581536,3275581671,NL
-3275581680,3275582207,NL
+3275581680,3275581695,NL
 3275582224,3275582247,NL
 3275582256,3275582287,NL
-3275582464,3275582591,NL
 3275582656,3275582719,NL
 3275582976,3275583231,NL
-3275583744,3275584127,NL
 3275584256,3275584287,NL
 3275584512,3275584527,NL
 3275585024,3275585279,NL
-3275585536,3275586047,NL
 3275587072,3275587136,NL
 3275587584,3275587855,BE
 3275588096,3275588287,BE
 3275588288,3275588319,NL
-3275588352,3275588711,BE
+3275588352,3275588607,BE
+3275588640,3275588655,BE
 3275588712,3275588719,CH
-3275588720,3275588799,BE
+3275588736,3275588799,BE
 3275588848,3275588855,BE
 3275588864,3275589119,IT
 3275589272,3275589279,BE
@@ -54832,12 +55708,13 @@
 3275593984,3275595007,RO
 3275595008,3275595039,BE
 3275595264,3275595519,US
-3275595776,3275603967,AT
+3275596168,3275596175,AT
+3275599104,3275599231,AT
+3275599872,3275600127,AT
 3275603968,3275604735,IT
 3275604736,3275604767,IL
 3275604992,3275606271,IT
 3275606528,3275606783,IT
-3275607296,3275608319,IT
 3275608832,3275610063,IT
 3275610112,3275610623,IT
 3275612160,3275612287,LU
@@ -54855,7 +55732,6 @@
 3275626496,3275627007,UA
 3275627008,3275627519,AT
 3275627520,3275628031,GB
-3275628032,3275628543,PL
 3275628544,3275629567,RU
 3275629568,3275630079,UA
 3275630592,3275631103,PL
@@ -54916,7 +55792,7 @@
 3275796480,3275796991,DE
 3275796992,3275797503,RO
 3275797504,3275798015,DE
-3275798016,3275799039,RO
+3275798016,3275798527,RO
 3275799040,3275799551,ES
 3275799552,3275800063,IT
 3275800064,3275800575,UA
@@ -55058,7 +55934,9 @@
 3275948032,3275965267,SE
 3275965268,3275965271,FI
 3275965272,3276013567,SE
-3276013568,3276014151,FR
+3276013568,3276014087,FR
+3276014088,3276014095,GB
+3276014096,3276014151,FR
 3276014152,3276014159,GB
 3276014160,3276014191,FR
 3276014192,3276014207,GB
@@ -55209,9 +56087,7 @@
 3276021248,3276021535,FR
 3276021536,3276021543,GB
 3276021544,3276021575,FR
-3276021576,3276021591,GB
-3276021592,3276021599,FR
-3276021600,3276021615,GB
+3276021576,3276021615,GB
 3276021616,3276021655,FR
 3276021656,3276021663,GB
 3276021664,3276021727,FR
@@ -55230,15 +56106,15 @@
 3276022128,3276022143,GB
 3276022144,3276022247,FR
 3276022248,3276022271,GB
-3276022272,3276022415,FR
-3276022416,3276022431,GB
-3276022432,3276022479,FR
+3276022272,3276022479,FR
 3276022480,3276022495,GB
 3276022496,3276022519,FR
 3276022520,3276022527,GB
 3276022528,3276022567,FR
 3276022568,3276022639,GB
-3276022640,3276022751,FR
+3276022640,3276022655,FR
+3276022656,3276022687,GB
+3276022688,3276022751,FR
 3276022752,3276022783,GB
 3276022784,3276022983,FR
 3276022984,3276022991,GB
@@ -55260,17 +56136,17 @@
 3276023488,3276023519,GB
 3276023520,3276023679,FR
 3276023680,3276023711,GB
-3276023712,3276023855,FR
+3276023712,3276023759,FR
+3276023760,3276023767,GB
+3276023768,3276023855,FR
 3276023856,3276023887,GB
 3276023888,3276023895,FR
 3276023896,3276023919,GB
 3276023920,3276023943,FR
 3276023944,3276023951,GB
 3276023952,3276023959,FR
-3276023960,3276024063,GB
-3276024064,3276024239,FR
-3276024240,3276024271,GB
-3276024272,3276025103,FR
+3276023960,3276023967,GB
+3276023968,3276025103,FR
 3276025104,3276025135,GB
 3276025136,3276025151,FR
 3276025152,3276025159,GB
@@ -55286,7 +56162,9 @@
 3276026112,3276026127,GB
 3276026128,3276026167,FR
 3276026168,3276026175,GB
-3276026176,3276026335,FR
+3276026176,3276026215,FR
+3276026216,3276026223,GB
+3276026224,3276026335,FR
 3276026336,3276026351,GB
 3276026352,3276026399,FR
 3276026400,3276026415,GB
@@ -55297,9 +56175,7 @@
 3276026448,3276026527,FR
 3276026528,3276026535,GB
 3276026536,3276026543,FR
-3276026544,3276026551,GB
-3276026552,3276026559,FR
-3276026560,3276026575,GB
+3276026544,3276026575,GB
 3276026576,3276026703,FR
 3276026704,3276026719,GB
 3276026720,3276026727,FR
@@ -55339,9 +56215,7 @@
 3276028256,3276028263,FR
 3276028264,3276028287,GB
 3276028288,3276028415,FR
-3276028416,3276028479,GB
-3276028480,3276028511,FR
-3276028512,3276028671,GB
+3276028416,3276028671,GB
 3276028672,3276028743,FR
 3276028744,3276028751,GB
 3276028752,3276028759,FR
@@ -55352,7 +56226,9 @@
 3276028808,3276028815,GB
 3276028816,3276028863,FR
 3276028864,3276028871,GB
-3276028872,3276028895,FR
+3276028872,3276028879,FR
+3276028880,3276028887,GB
+3276028888,3276028895,FR
 3276028896,3276028927,GB
 3276028928,3276029183,FR
 3276029184,3276029199,GB
@@ -55366,8 +56242,8 @@
 3276029424,3276029439,GB
 3276029440,3276029567,FR
 3276029568,3276029599,GB
-3276029600,3276029759,FR
-3276029760,3276029791,GB
+3276029600,3276029727,FR
+3276029728,3276029791,GB
 3276029792,3276029871,FR
 3276029872,3276029887,GB
 3276029888,3276029935,FR
@@ -55377,9 +56253,7 @@
 3276030096,3276030191,FR
 3276030192,3276030207,GB
 3276030208,3276030215,FR
-3276030216,3276030223,GB
-3276030224,3276030239,FR
-3276030240,3276030247,GB
+3276030216,3276030247,GB
 3276030248,3276030255,FR
 3276030256,3276030263,GB
 3276030264,3276030271,FR
@@ -55437,7 +56311,9 @@
 3276033696,3276033727,FR
 3276033728,3276033759,GB
 3276033760,3276033791,FR
-3276033792,3276033895,GB
+3276033792,3276033855,GB
+3276033856,3276033863,FR
+3276033864,3276033895,GB
 3276033896,3276033911,FR
 3276033912,3276033919,GB
 3276033920,3276033927,FR
@@ -55447,8 +56323,8 @@
 3276034016,3276035839,FR
 3276035840,3276036079,GB
 3276036080,3276036095,FR
-3276036096,3276036151,GB
-3276036152,3276036191,FR
+3276036096,3276036143,GB
+3276036144,3276036191,FR
 3276036192,3276036207,GB
 3276036208,3276036223,FR
 3276036224,3276036255,GB
@@ -55497,7 +56373,9 @@
 3276039248,3276039279,FR
 3276039280,3276039311,GB
 3276039312,3276039327,FR
-3276039328,3276039423,GB
+3276039328,3276039359,GB
+3276039360,3276039391,FR
+3276039392,3276039423,GB
 3276039424,3276039551,FR
 3276039552,3276039583,GB
 3276039584,3276039647,FR
@@ -55507,8 +56385,8 @@
 3276039952,3276039967,FR
 3276039968,3276040031,GB
 3276040032,3276040063,FR
-3276040064,3276040111,GB
-3276040112,3276040159,FR
+3276040064,3276040095,GB
+3276040096,3276040159,FR
 3276040160,3276040175,GB
 3276040176,3276040207,FR
 3276040208,3276040215,GB
@@ -55516,16 +56394,16 @@
 3276040232,3276040319,GB
 3276040320,3276040351,FR
 3276040352,3276040367,GB
-3276040368,3276040447,FR
-3276040448,3276040463,GB
+3276040368,3276040439,FR
+3276040440,3276040463,GB
 3276040464,3276040479,FR
 3276040480,3276040495,GB
 3276040496,3276040591,FR
 3276040592,3276040607,GB
 3276040608,3276040639,FR
 3276040640,3276040687,GB
-3276040688,3276040703,FR
-3276040704,3276040735,GB
+3276040688,3276040719,FR
+3276040720,3276040735,GB
 3276040736,3276040927,FR
 3276040928,3276040959,GB
 3276040960,3276040991,FR
@@ -55556,7 +56434,9 @@
 3276041968,3276041983,GB
 3276041984,3276041999,FR
 3276042000,3276042007,GB
-3276042008,3276042111,FR
+3276042008,3276042015,FR
+3276042016,3276042031,GB
+3276042032,3276042111,FR
 3276042112,3276042143,GB
 3276042144,3276042175,FR
 3276042176,3276042239,GB
@@ -55570,12 +56450,16 @@
 3276044304,3276044359,GB
 3276044360,3276044447,FR
 3276044448,3276044463,GB
-3276044464,3276044511,FR
+3276044464,3276044479,FR
+3276044480,3276044495,GB
+3276044496,3276044511,FR
 3276044512,3276044543,GB
 3276044544,3276044607,FR
 3276044608,3276044639,GB
 3276044640,3276044671,FR
-3276044672,3276044735,GB
+3276044672,3276044703,GB
+3276044704,3276044719,FR
+3276044720,3276044735,GB
 3276044736,3276044815,FR
 3276044816,3276044839,GB
 3276044840,3276044863,FR
@@ -55775,7 +56659,9 @@
 3276346912,3276346919,DE
 3276346920,3276347111,NL
 3276347112,3276347119,DE
-3276347120,3276347991,NL
+3276347120,3276347959,NL
+3276347960,3276347967,DE
+3276347968,3276347991,NL
 3276347992,3276347999,DE
 3276348000,3276348343,NL
 3276348344,3276348351,DE
@@ -55909,9 +56795,7 @@
 3276373120,3276373127,DE
 3276373128,3276373447,NL
 3276373448,3276373455,DE
-3276373456,3276373607,NL
-3276373608,3276373615,DE
-3276373616,3276373911,NL
+3276373456,3276373911,NL
 3276373912,3276373919,DE
 3276373920,3276374143,NL
 3276374144,3276374151,DE
@@ -56288,7 +57172,7 @@
 3276428032,3276428287,GB
 3276428288,3276428543,RU
 3276428544,3276428799,BG
-3276428800,3276429311,DE
+3276428800,3276429055,DE
 3276429312,3276430079,RU
 3276430080,3276430591,PL
 3276430592,3276430847,GB
@@ -56312,7 +57196,7 @@
 3276475040,3276475063,IT
 3276475072,3276475135,IT
 3276475904,3276475951,IT
-3276475968,3276476055,IT
+3276475984,3276476055,IT
 3276476064,3276476071,IT
 3276476080,3276476095,IT
 3276476112,3276476119,GB
@@ -56324,8 +57208,7 @@
 3276478304,3276478311,CH
 3276478320,3276478335,CH
 3276478464,3276478855,FR
-3276478864,3276478943,FR
-3276478960,3276479127,FR
+3276478864,3276479127,FR
 3276479136,3276479167,FR
 3276479200,3276479215,FR
 3276479224,3276479343,FR
@@ -56357,10 +57240,10 @@
 3276491264,3276491327,CZ
 3276491392,3276491775,CZ
 3276491776,3276491847,GB
-3276491856,3276491903,GB
-3276491968,3276492055,GB
+3276491856,3276492055,GB
 3276492064,3276492127,GB
-3276492288,3276492479,GB
+3276492288,3276492431,GB
+3276492440,3276492479,GB
 3276492488,3276493183,GB
 3276493248,3276494383,GB
 3276494416,3276494559,GB
@@ -56368,16 +57251,14 @@
 3276495776,3276495823,GB
 3276495832,3276496639,GB
 3276496896,3276497151,DE
-3276497216,3276497271,DE
-3276497280,3276497295,DE
+3276497216,3276497295,DE
 3276497304,3276497311,DE
 3276497344,3276497375,DE
-3276497408,3276497567,DE
-3276497584,3276497599,DE
+3276497408,3276497599,DE
 3276497616,3276497919,DE
 3276497920,3276498047,GB
 3276498304,3276498319,GB
-3276498328,3276498415,GB
+3276498328,3276498431,GB
 3276498432,3276499199,DE
 3276499456,3276499503,DE
 3276499520,3276499615,DE
@@ -56408,8 +57289,7 @@
 3276508160,3276508327,GB
 3276508352,3276508415,FR
 3276508416,3276508671,GB
-3276508680,3276508879,GB
-3276508896,3276509183,GB
+3276508680,3276509183,GB
 3276509184,3276510207,IT
 3276510720,3276510735,IT
 3276510784,3276510815,IT
@@ -56419,7 +57299,7 @@
 3276511872,3276511919,ZA
 3276511928,3276511951,ZA
 3276511968,3276512191,ZA
-3276512200,3276512215,ZA
+3276512200,3276512207,ZA
 3276512256,3276513023,ZA
 3276513536,3276513567,CH
 3276514336,3276514367,CH
@@ -56433,7 +57313,7 @@
 3276517904,3276517951,NL
 3276518016,3276518023,NL
 3276518056,3276518063,NL
-3276518088,3276518111,NL
+3276518096,3276518111,NL
 3276518128,3276518175,NL
 3276518184,3276518271,NL
 3276518304,3276518335,NL
@@ -56479,7 +57359,6 @@
 3276528128,3276528223,BE
 3276528224,3276528239,GB
 3276528240,3276528247,BE
-3276528248,3276528255,GB
 3276528256,3276528351,BE
 3276528368,3276528399,BE
 3276528448,3276528503,BE
@@ -56491,7 +57370,8 @@
 3276528816,3276528831,FR
 3276528832,3276528895,BE
 3276528896,3276528903,IE
-3276528912,3276528943,IE
+3276528912,3276528927,IE
+3276528936,3276528943,IE
 3276528960,3276529151,IE
 3276529152,3276529167,TR
 3276529184,3276529279,TR
@@ -56522,11 +57402,10 @@
 3276534784,3276534879,NL
 3276534888,3276534895,NL
 3276534928,3276534975,NL
-3276535016,3276535039,GB
 3276535040,3276535063,RU
 3276535064,3276535071,LV
 3276535072,3276535103,RU
-3276535296,3276535327,FI
+3276535296,3276535319,FI
 3276535336,3276535359,FI
 3276535376,3276535423,FI
 3276535552,3276535807,PK
@@ -56950,9 +57829,13 @@
 3276869888,3276870143,NL
 3276870144,3276871679,IT
 3276871680,3276871935,DE
-3276871936,3276873727,GB
+3276871936,3276872447,GB
+3276872448,3276872463,DE
+3276872464,3276873727,GB
 3276873728,3276873735,ES
-3276873736,3276875263,GB
+3276873736,3276873791,GB
+3276873792,3276873983,ES
+3276873984,3276875263,GB
 3276875264,3276875775,NL
 3276875776,3276876799,GB
 3276876800,3276876823,AT
@@ -56970,46 +57853,57 @@
 3276878336,3276879871,GB
 3276879872,3276880639,DK
 3276880640,3276883967,GB
-3276883968,3276884223,PL
-3276884224,3276886015,GB
+3276883968,3276884231,PL
+3276884232,3276886015,GB
 3276886016,3276886271,RO
-3276886272,3276890111,GB
+3276886272,3276888575,GB
+3276888576,3276888831,AT
+3276888832,3276889087,GB
+3276889088,3276890111,AT
 3276890112,3276890135,US
 3276890136,3276890143,GB
 3276890144,3276890175,US
 3276890176,3276890367,GB
 3276890368,3276890623,US
-3276890624,3276895999,GB
+3276890624,3276891903,GB
+3276891904,3276892159,US
+3276892160,3276895999,GB
 3276896000,3276896255,CZ
 3276896256,3276896831,BE
 3276896832,3276896847,SE
 3276896848,3276897023,GB
 3276897024,3276897279,BE
 3276897280,3276898303,GB
-3276898304,3276898559,CH
-3276898560,3276898815,GB
-3276898816,3276899839,CH
-3276899840,3276902399,GB
+3276898304,3276898671,CH
+3276898672,3276898815,GB
+3276898816,3276899847,CH
+3276899848,3276902399,GB
 3276902400,3276902559,SE
 3276902560,3276902655,GB
-3276902656,3276903167,SE
-3276903168,3276906495,GB
+3276902656,3276903295,SE
+3276903296,3276906495,GB
 3276906496,3276906511,NL
 3276906512,3276906519,GB
-3276906520,3276906839,NL
-3276906840,3276907007,GB
+3276906520,3276906847,NL
+3276906848,3276907007,GB
 3276907008,3276907263,NL
 3276907264,3276910591,GB
-3276910592,3276913351,IT
-3276913352,3276913359,GB
-3276913360,3276913919,IT
+3276910592,3276910847,IT
+3276910848,3276910879,GB
+3276910880,3276911103,IT
+3276911104,3276911359,GB
+3276911360,3276913919,IT
 3276913920,3276913983,US
 3276913984,3276914687,IT
-3276914688,3276916047,ES
-3276916048,3276916055,GB
-3276916056,3276916175,ES
+3276914688,3276914943,ES
+3276914944,3276915199,GB
+3276915200,3276915455,ES
+3276915456,3276915487,GB
+3276915488,3276916175,ES
 3276916176,3276916183,GB
-3276916184,3276917183,ES
+3276916184,3276916479,ES
+3276916480,3276916735,GB
+3276916736,3276917183,ES
 3276917184,3276917215,SE
 3276917216,3276917231,ES
 3276917232,3276917247,GB
@@ -57019,7 +57913,9 @@
 3276917344,3276917503,GB
 3276917504,3276917759,ES
 3276917760,3276918783,GB
-3276918784,3276919551,DE
+3276918784,3276919471,DE
+3276919472,3276919479,GB
+3276919480,3276919551,DE
 3276919552,3276919807,GB
 3276919808,3276920543,DE
 3276920544,3276920575,GB
@@ -57183,7 +58079,7 @@
 3277361152,3277361663,UA
 3277361664,3277362175,RU
 3277362176,3277362687,ES
-3277362688,3277363199,GB
+3277362688,3277363199,AR
 3277363200,3277363711,ES
 3277363712,3277364223,RU
 3277364224,3277364735,GB
@@ -57194,7 +58090,40 @@
 3277366784,3277367295,AT
 3277367296,3277367807,PL
 3277367808,3277368319,RU
-3277368320,3277368831,RO
+3277368320,3277369343,RO
+3277369344,3277369855,CY
+3277369856,3277370367,RU
+3277370368,3277370879,SE
+3277370880,3277371391,RO
+3277371392,3277371903,RU
+3277371904,3277372415,PL
+3277372416,3277373951,RU
+3277373952,3277374463,FR
+3277374464,3277375999,RU
+3277376000,3277376511,NL
+3277376512,3277377023,RO
+3277377024,3277378559,RU
+3277378560,3277379071,HR
+3277379072,3277379583,UZ
+3277379584,3277380095,RS
+3277380096,3277380607,RO
+3277380608,3277381119,RU
+3277381120,3277381631,KW
+3277381632,3277382143,RU
+3277382144,3277382655,UA
+3277382656,3277383167,GB
+3277383168,3277383679,UA
+3277383680,3277384191,PL
+3277384192,3277384703,IL
+3277384704,3277385215,GB
+3277385216,3277385727,AT
+3277385728,3277386239,RU
+3277386240,3277386751,UA
+3277386752,3277387263,SA
+3277387264,3277388287,RU
+3277388288,3277388799,GB
+3277388800,3277389311,RU
+3277389312,3277389823,AM
 3277389824,3277395951,GB
 3277395952,3277395967,IE
 3277395968,3277452647,GB
@@ -57344,7 +58273,6 @@
 3277823488,3277823743,SI
 3277823744,3277823999,UA
 3277824000,3277824255,TR
-3277824256,3277824511,AT
 3277824512,3277824767,UA
 3277824768,3277825023,AT
 3277825024,3277825279,PL
@@ -57436,8 +58364,8 @@
 3278115072,3278115327,SE
 3278115328,3278116607,ES
 3278116608,3278116735,SE
-3278116736,3278116863,ES
-3278116864,3278118143,SE
+3278116736,3278117119,ES
+3278117120,3278118143,SE
 3278118144,3278118175,ES
 3278118176,3278119423,SE
 3278119424,3278119935,NL
@@ -60388,7 +61316,6 @@
 3280654848,3280655103,RU
 3280655104,3280655359,PL
 3280655360,3280655615,SE
-3280655616,3280655871,RU
 3280655872,3280656127,RO
 3280656128,3280656639,CH
 3280656640,3280657407,UA
@@ -60451,6 +61378,7 @@
 3280997120,3280997375,FR
 3280997376,3280997631,BE
 3280997632,3280997887,SE
+3280997888,3280998143,UA
 3280998144,3280998399,DE
 3280998400,3280998655,GR
 3280998656,3280999423,GB
@@ -60459,7 +61387,6 @@
 3280999936,3281000447,DE
 3281000448,3281000703,FR
 3281000704,3281000959,UA
-3281000960,3281001215,RU
 3281001216,3281001471,RO
 3281001472,3281001727,UA
 3281001728,3281001983,RU
@@ -60629,7 +61556,7 @@
 3281999104,3282042879,NO
 3282042880,3282083839,CH
 3282083840,3282084351,DE
-3282084352,3282085375,RO
+3282084352,3282084863,RO
 3282085376,3282085887,BE
 3282085888,3282086399,DE
 3282086400,3282086911,LV
@@ -60695,7 +61622,9 @@
 3282284600,3282284603,FR
 3282284604,3282284687,SE
 3282284688,3282284703,FI
-3282284704,3282286975,SE
+3282284704,3282284735,SE
+3282284736,3282284783,FI
+3282284784,3282286975,SE
 3282286976,3282287007,FI
 3282287008,3282287615,SE
 3282287616,3282287759,FI
@@ -60754,7 +61683,6 @@
 3282739200,3282739455,CH
 3282739456,3282739711,RO
 3282739712,3282739967,FR
-3282739968,3282740223,UA
 3282740224,3282740479,FR
 3282740480,3282740735,AT
 3282740736,3282740991,BG
@@ -60827,7 +61755,7 @@
 3283213824,3283214335,UA
 3283214336,3283214847,RO
 3283214848,3283215359,RU
-3283215360,3283215871,SE
+3283215360,3283215871,AT
 3283215872,3283216383,TR
 3283216384,3283216895,DE
 3283216896,3283217407,CH
@@ -60848,7 +61776,8 @@
 3283233480,3283233483,RS
 3283233484,3283234815,CS
 3283234816,3283235071,CS
-3283235072,3283235223,CS
+3283235072,3283235199,RS
+3283235200,3283235223,CS
 3283235224,3283235227,RS
 3283235228,3283235275,CS
 3283235276,3283235279,RS
@@ -60856,7 +61785,9 @@
 3283235304,3283235311,RS
 3283235312,3283235319,CS
 3283235320,3283235327,RS
-3283235328,3283235647,CS
+3283235328,3283235519,CS
+3283235520,3283235535,RS
+3283235536,3283235647,CS
 3283235648,3283235655,RS
 3283235656,3283235871,CS
 3283235872,3283235875,RS
@@ -60881,7 +61812,8 @@
 3283237284,3283237349,CS
 3283237350,3283237351,RS
 3283237352,3283237631,CS
-3283237632,3283238335,CS
+3283237632,3283237887,RS
+3283237888,3283238335,CS
 3283238336,3283238399,CS
 3283238400,3283238463,RS
 3283238464,3283238479,CS
@@ -60935,9 +61867,8 @@
 3283486464,3283486719,UA
 3283486720,3283486975,RU
 3283486976,3283487231,PL
-3283487232,3283487487,RU
 3283487488,3283487743,DE
-3283487744,3283488255,CH
+3283487744,3283487999,CH
 3283488256,3283488511,PL
 3283488512,3283488767,RU
 3283488768,3283489279,FR
@@ -61204,8 +62135,7 @@
 3283587896,3283587903,CH
 3283587904,3283587967,IE
 3283587968,3283588095,DE
-3283588096,3283588119,BE
-3283588128,3283588191,BE
+3283588096,3283588191,BE
 3283588224,3283588479,BE
 3283588480,3283588543,AT
 3283588544,3283588607,GB
@@ -61476,7 +62406,6 @@
 3283987456,3283987967,GB
 3283987968,3283988991,RO
 3283988992,3283989503,FR
-3283989504,3283990015,IE
 3283990016,3283990527,SE
 3283990528,3283991551,RO
 3283991552,3283992063,SE
@@ -61557,6 +62486,7 @@
 3284045568,3284045823,AT
 3284045824,3284046079,UA
 3284046080,3284046335,DE
+3284046336,3284046591,NL
 3284046592,3284046847,SE
 3284046848,3284047103,DE
 3284047104,3284047359,DK
@@ -61704,11 +62634,13 @@
 3285453568,3285454047,GB
 3285454080,3285454175,GB
 3285454208,3285454847,GB
-3285454848,3285455687,DE
-3285455712,3285455887,DE
+3285454848,3285455695,DE
+3285455712,3285455743,DE
+3285455872,3285455887,DE
 3285455888,3285455903,GB
 3285455904,3285456255,DE
-3285456288,3285456351,DE
+3285456288,3285456335,DE
+3285456344,3285456351,DE
 3285456384,3285456639,DE
 3285456640,3285456703,DK
 3285456704,3285456711,DE
@@ -61725,8 +62657,7 @@
 3285457408,3285457663,GB
 3285457664,3285457759,IT
 3285457792,3285457919,IT
-3285457920,3285458103,GB
-3285458112,3285458943,GB
+3285457920,3285458943,GB
 3285458944,3285459071,DK
 3285459104,3285459327,DK
 3285459392,3285459535,DK
@@ -61743,7 +62674,8 @@
 3285461312,3285461375,CH
 3285461376,3285461447,NL
 3285461448,3285461455,DE
-3285461456,3285461535,NL
+3285461456,3285461503,NL
+3285461520,3285461535,NL
 3285461568,3285461807,NL
 3285461856,3285461877,NL
 3285461880,3285461991,NL
@@ -61763,13 +62695,14 @@
 3285463008,3285463039,AT
 3285463040,3285463071,LU
 3285463080,3285463087,LU
+3285463104,3285463135,LU
 3285463296,3285463311,FR
 3285463320,3285463327,FR
 3285463360,3285463455,BE
-3285463488,3285463519,GB
 3285463520,3285463615,BE
-3285463616,3285463631,FR
-3285463672,3285463839,BE
+3285463616,3285463647,FR
+3285463672,3285463759,BE
+3285463776,3285463839,BE
 3285463856,3285463935,BE
 3285463944,3285463991,BE
 3285464016,3285464063,BE
@@ -61801,11 +62734,10 @@
 3285468576,3285468591,DE
 3285468600,3285468615,DE
 3285468616,3285468623,GB
-3285468640,3285468647,DE
 3285468656,3285471007,DE
 3285471040,3285471055,DE
 3285471104,3285471743,DE
-3285471808,3285471887,DE
+3285471808,3285471871,DE
 3285471936,3285471951,DE
 3285472000,3285472127,DE
 3285472160,3285472175,DE
@@ -61825,12 +62757,12 @@
 3285474240,3285474271,DE
 3285474304,3285474319,DE
 3285474336,3285474559,DE
-3285474816,3285475127,DE
+3285475072,3285475127,DE
 3285475144,3285475207,DE
 3285475232,3285475327,DE
 3285475624,3285475647,AT
 3285475680,3285475711,AT
-3285475776,3285475791,AT
+3285475776,3285475783,AT
 3285475808,3285475839,AT
 3285475904,3285475951,AT
 3285475968,3285476095,AT
@@ -61840,7 +62772,7 @@
 3285477024,3285477087,AT
 3285477152,3285477247,IT
 3285477256,3285477263,IT
-3285477280,3285477327,IT
+3285477280,3285477319,IT
 3285477336,3285477343,IT
 3285477344,3285477359,FR
 3285477360,3285477375,IT
@@ -61865,6 +62797,7 @@
 3285482496,3285482527,CH
 3285482752,3285482783,CH
 3285483008,3285483519,CH
+3285484544,3285485055,IE
 3285485104,3285485119,SK
 3285485640,3285485647,SK
 3285485728,3285485743,SK
@@ -61908,8 +62841,7 @@
 3285496608,3285496671,DE
 3285496704,3285496783,DE
 3285496800,3285496815,DE
-3285496832,3285497087,DE
-3285497344,3285497855,DE
+3285496832,3285497855,DE
 3285497888,3285498031,DE
 3285498096,3285498111,DE
 3285498112,3285498367,IT
@@ -61951,7 +62883,8 @@
 3285507656,3285507711,CZ
 3285507840,3285508095,CZ
 3285508096,3285508607,DE
-3285508608,3285508671,RU
+3285508608,3285508623,RU
+3285508632,3285508671,RU
 3285508736,3285508863,RU
 3285508872,3285508927,PT
 3285509120,3285509247,SE
@@ -62058,7 +62991,9 @@
 3285527432,3285527439,FR
 3285527440,3285527455,LU
 3285527456,3285527487,IL
-3285527488,3285527551,BE
+3285527488,3285527495,BE
+3285527496,3285527503,DE
+3285527504,3285527551,BE
 3285527552,3285527615,IL
 3285527616,3285527679,GB
 3285527680,3285527807,BE
@@ -62810,12 +63745,14 @@
 3285910272,3285910303,ES
 3285910304,3285910335,GB
 3285910336,3285910407,DE
-3285910408,3285910463,GB
+3285910408,3285910415,GB
 3285910464,3285910527,ES
 3285910528,3285911551,GB
 3285912576,3285913087,GB
 3285913088,3285913215,ES
 3285913344,3285913599,GB
+3285915648,3285915903,GB
+3285915904,3285916159,AT
 3285916160,3285916415,FR
 3285916416,3285916671,YE
 3285916672,3285916703,BH
@@ -62831,6 +63768,7 @@
 3285919232,3285919487,GB
 3285919488,3285919743,UA
 3285919744,3285921791,QA
+3285921792,3285921823,CZ
 3285921856,3285921919,DE
 3285921920,3285921983,GB
 3285921984,3285922047,FR
@@ -62840,9 +63778,13 @@
 3285922184,3285922191,RU
 3285922192,3285922207,DE
 3285922208,3285922239,ES
+3285922240,3285922287,RU
 3285922288,3285922303,IR
+3285922304,3285922559,FR
+3285922560,3285922815,GB
 3285922816,3285923327,KW
 3285923328,3285924415,ES
+3285924416,3285924431,DE
 3285924432,3285924479,GB
 3285924480,3285924863,ES
 3285925056,3285925119,FR
@@ -62850,9 +63792,9 @@
 3285926144,3285926399,YE
 3285926400,3285926407,DE
 3285926408,3285926431,ES
-3285926432,3285926463,GB
 3285926496,3285926527,ES
 3285926848,3285926911,GB
+3285926912,3285927423,DE
 3285927424,3285927679,GB
 3285927680,3285927935,IR
 3285928064,3285928191,ES
@@ -62867,8 +63809,10 @@
 3285930560,3285930575,ES
 3285930576,3285930623,GB
 3285930624,3285930631,DE
+3285930632,3285930639,GB
 3285930672,3285930687,DE
 3285930752,3285931007,GB
+3285932032,3285932287,NL
 3285932544,3285932799,GB
 3285932800,3285933055,ES
 3285933056,3285933311,DE
@@ -62947,7 +63891,7 @@
 3285960192,3285960447,FR
 3285960448,3285960703,GB
 3285962752,3285963775,DE
-3285963776,3285964031,GB
+3285963776,3285964287,GB
 3285964288,3285964351,KE
 3285964544,3285964799,FR
 3285966848,3285967103,FR
@@ -63010,7 +63954,6 @@
 3286317056,3286317567,RU
 3286317568,3286318079,PL
 3286318080,3286318591,CH
-3286318592,3286319103,NG
 3286319104,3286320127,RO
 3286320128,3286321151,PL
 3286321152,3286322175,CZ
@@ -63067,12 +64010,10 @@
 3286433792,3286499327,DE
 3286499328,3286564863,HU
 3286564864,3286566143,AE
-3286566144,3286566399,TZ
-3286566400,3286566655,AE
+3286566144,3286566271,TZ
+3286566272,3286566655,AE
 3286566656,3286567423,KW
-3286567424,3286567679,AE
-3286567680,3286567935,TZ
-3286567936,3286568191,AE
+3286567424,3286568191,AE
 3286568192,3286568703,KW
 3286568704,3286571007,AE
 3286571008,3286571775,KW
@@ -63302,6 +64243,12 @@
 3287177216,3287178239,RO
 3287178240,3287178751,UA
 3287178752,3287179263,RO
+3287179264,3287180287,FR
+3287180288,3287181311,RU
+3287181312,3287182335,UZ
+3287182336,3287185407,UA
+3287185408,3287186431,SE
+3287186432,3287187455,FI
 3287187456,3287196671,DE
 3287196672,3287198719,PL
 3287198720,3287199743,GB
@@ -63362,6 +64309,7 @@
 3287436288,3287436799,RS
 3287436800,3287437311,RO
 3287437312,3287437823,UA
+3287437824,3287438335,RU
 3287438336,3287438847,CH
 3287438848,3287439359,GB
 3287439360,3287439871,RO
@@ -63450,9 +64398,7 @@
 3287507984,3287507991,FR
 3287507992,3287515375,DE
 3287515376,3287515383,CZ
-3287515384,3287522399,DE
-3287522400,3287522431,GR
-3287522432,3287523303,DE
+3287515384,3287523303,DE
 3287523304,3287523311,US
 3287523312,3287526303,DE
 3287526304,3287526311,LU
@@ -63509,7 +64455,6 @@
 3287639552,3287640063,RU
 3287640064,3287640575,DE
 3287640576,3287641087,SI
-3287641088,3287641599,NG
 3287641600,3287642111,FI
 3287642112,3287642623,UA
 3287642624,3287643135,BE
@@ -63842,7 +64787,9 @@
 3288143616,3288143871,CH
 3288143872,3288145663,DE
 3288145664,3288146175,CH
-3288146176,3288236031,DE
+3288146176,3288150015,DE
+3288150016,3288151551,NL
+3288151552,3288236031,DE
 3288236032,3288236543,LI
 3288236544,3288237055,FR
 3288237056,3288238591,RO
@@ -63998,7 +64945,8 @@
 3323020800,3323021055,SG
 3323021056,3323022591,US
 3323022592,3323022847,GB
-3323022848,3323025663,US
+3323022848,3323024383,US
+3323024640,3323025663,US
 3323025920,3323027199,US
 3323027712,3323030015,US
 3323030016,3323030271,AU
@@ -64233,7 +65181,8 @@
 3325976064,3325976319,CA
 3325976320,3325980671,US
 3325980672,3325980927,CA
-3325980928,3325986815,US
+3325980928,3325982719,US
+3325983488,3325986815,US
 3325987072,3325992447,US
 3325992448,3325992959,CA
 3325992960,3325993215,US
@@ -64266,7 +65215,8 @@
 3326713344,3326714111,US
 3326714112,3326716927,CA
 3326716928,3326717951,US
-3326717952,3326728703,CA
+3326717952,3326726399,CA
+3326726912,3326728703,CA
 3326728960,3326729215,CA
 3326729216,3326729471,JP
 3326729472,3326729727,CA
@@ -64314,7 +65264,8 @@
 3328237312,3328245759,CA
 3328245760,3328249087,US
 3328249856,3328253439,US
-3328253952,3328265471,US
+3328253952,3328259071,US
+3328259584,3328265471,US
 3328265728,3328271871,US
 3328272128,3328297215,US
 3328298240,3328298495,US
@@ -64408,7 +65359,8 @@
 3330678784,3330697215,US
 3330703360,3330714367,US
 3330714368,3330714623,CA
-3330714624,3330726655,US
+3330714624,3330723839,US
+3330724096,3330726655,US
 3330726656,3330726911,CA
 3330726912,3330735871,US
 3330736128,3330743295,US
@@ -64431,18 +65383,21 @@
 3330785792,3330791423,US
 3330791424,3330791679,CA
 3330791680,3330795775,US
-3330796032,3330798847,US
+3330796032,3330796543,US
+3330796800,3330798847,US
 3330799104,3330799871,US
 3330800128,3330801407,US
 3330801664,3330807807,US
 3330809856,3330812415,US
-3330818048,3330844159,US
+3330818048,3330841599,US
+3330841856,3330844159,US
 3330844416,3330848767,US
 3330849024,3330862591,US
 3330862848,3330866943,US
 3330867200,3330904575,US
 3330904832,3330906623,US
-3330906880,3330923263,US
+3330906880,3330908415,US
+3330908672,3330923263,US
 3330923520,3330928127,US
 3330928384,3330930175,US
 3330930944,3330932479,US
@@ -64507,7 +65462,8 @@
 3331932160,3331934719,US
 3331948544,3331962879,US
 3331964416,3331968767,US
-3331969024,3331972863,US
+3331969024,3331971839,US
+3331972096,3331972863,US
 3331973120,3331981055,US
 3331981312,3331983103,US
 3331983360,3331987967,US
@@ -64527,7 +65483,8 @@
 3332440320,3332460543,CA
 3332460544,3332460799,US
 3332460800,3332462335,CA
-3332462592,3332473855,CA
+3332462592,3332463615,CA
+3332463872,3332473855,CA
 3332477952,3332482303,CA
 3332484096,3332491263,CA
 3332492032,3332500735,CA
@@ -64587,7 +65544,8 @@
 3333521408,3333534975,US
 3333535232,3333535743,US
 3333536256,3333541631,US
-3333541888,3333553919,US
+3333541888,3333550335,US
+3333550592,3333553919,US
 3333554176,3333561343,US
 3333562368,3333568511,US
 3333570560,3333583359,US
@@ -64621,7 +65579,7 @@
 3333816320,3333859839,US
 3333859840,3333860095,BM
 3333860096,3333870847,US
-3333871104,3333881599,US
+3333871104,3333881343,US
 3333881856,3333927423,US
 3333927936,3333933823,US
 3333934080,3333937919,US
@@ -64677,7 +65635,8 @@
 3335000064,3335003135,US
 3335028736,3335032063,US
 3335032320,3335033343,US
-3335033600,3335043327,US
+3335033600,3335033855,US
+3335034112,3335043327,US
 3335043584,3335048191,US
 3335048448,3335057407,US
 3335058176,3335163135,US
@@ -64809,9 +65768,11 @@
 3339000832,3339028735,US
 3339028992,3339031295,US
 3339031552,3339042047,US
-3339042304,3339045119,US
+3339042304,3339043327,US
+3339043584,3339045119,US
 3339045376,3339050751,US
-3339051008,3339058943,US
+3339051008,3339055615,US
+3339055872,3339058943,US
 3339059200,3339063039,US
 3339063296,3339076863,US
 3339076864,3339077631,JP
@@ -64852,7 +65813,8 @@
 3339672576,3339673599,US
 3339714560,3339722495,US
 3339722752,3339739135,US
-3339780096,3339923455,US
+3339780096,3339911167,US
+3339913216,3339923455,US
 3339923456,3339926015,CA
 3339926528,3339927551,CA
 3339976704,3340046079,US
@@ -64956,7 +65918,7 @@
 3343482880,3343568127,US
 3343568384,3343575807,US
 3343576064,3343580927,US
-3343581184,3343855359,US
+3343581184,3343855615,US
 3343859712,3343887359,US
 3343887616,3343890687,US
 3343890944,3343902463,US
@@ -64994,7 +65956,9 @@
 3344466688,3344467455,US
 3344468480,3344469247,US
 3344469504,3344482047,US
-3344482304,3344495871,US
+3344482304,3344486399,US
+3344486400,3344488447,NL
+3344488448,3344495871,US
 3344496640,3344497919,US
 3344498176,3344498431,US
 3344498688,3344511231,US
@@ -65016,7 +65980,9 @@
 3345292288,3345295871,US
 3345296384,3345297407,US
 3345350656,3345362943,US
-3345416192,3345422847,US
+3345416192,3345418239,US
+3345418240,3345419519,NL
+3345419520,3345422847,US
 3345423360,3345424383,TC
 3345424384,3345430527,US
 3345430528,3345432575,CA
@@ -65104,20 +66070,25 @@
 3349610496,3349614591,US
 3349676032,3349678591,US
 3349679104,3349682431,US
-3349684224,3349686527,US
+3349683200,3349686527,US
+3349687296,3349688319,US
 3349741568,3349987327,US
 3349987328,3349996543,BM
 3349996544,3349997055,KY
 3349997056,3350003711,BM
 3350003712,3350134783,US
 3350135040,3350145791,CA
+3350146048,3350147071,US
 3350151168,3350160639,CA
 3350160896,3350175743,CA
 3350176512,3350181887,CA
+3350181888,3350182911,US
 3350183168,3350200063,CA
 3350200320,3350466303,US
 3350466560,3350469119,US
+3350469632,3350470655,CA
 3350470656,3350475775,US
+3350475776,3350476799,CA
 3350476800,3350478847,US
 3350528000,3350545151,US
 3350545408,3350548735,US
@@ -65133,7 +66104,7 @@
 3350728704,3350746367,US
 3350746624,3350756607,US
 3350757376,3350760959,US
-3350766080,3350770943,US
+3350766080,3350771967,US
 3350772224,3350774271,US
 3350774528,3350778623,US
 3350778880,3350789887,US
@@ -65148,13 +66119,11 @@
 3350855680,3350862079,US
 3350862080,3350864639,CL
 3350864640,3350925055,US
-3350925312,3350928383,US
-3350929408,3350950399,US
-3350951936,3350953983,US
+3350925312,3350950399,US
+3350950912,3350953983,US
 3350986752,3350988031,US
 3350988800,3350990335,US
-3350990848,3350993919,US
-3350994944,3350998015,US
+3350990848,3350999039,US
 3351052288,3351053823,US
 3351054336,3351058943,US
 3351060480,3351068159,US
@@ -65246,9 +66215,7 @@
 3352014928,3352014943,IL
 3352014944,3352014975,US
 3352014976,3352015103,IL
-3352015104,3352015839,US
-3352015840,3352015871,IL
-3352015872,3352015999,US
+3352015104,3352015999,US
 3352016000,3352016127,IL
 3352016128,3352020671,US
 3352020672,3352020703,IL
@@ -65301,15 +66268,18 @@
 3353739264,3353741823,US
 3353743360,3353746943,US
 3353747456,3353752575,US
-3353755648,3353765887,US
+3353753600,3353767935,US
 3353772032,3353806335,US
 3353806848,3353818111,US
+3353819136,3353821183,US
 3353837568,3353843455,US
+3353843712,3353845759,US
 3353870336,3353939455,US
 3353939968,3353942527,US
 3353944064,3353948159,US
 3353952256,3353953279,US
-3353953536,3353960191,US
+3353953536,3353959423,US
+3353959680,3353960191,US
 3353960448,3353966079,US
 3353966336,3353967871,US
 3353968128,3353969663,US
@@ -65328,8 +66298,7 @@
 3354468352,3354476031,US
 3354476544,3354484735,US
 3354525696,3354532351,US
-3354533888,3354540031,US
-3354542080,3354560255,US
+3354533888,3354560255,US
 3354560512,3354562559,US
 3354562816,3354568703,US
 3354568960,3354570239,US
@@ -65339,10 +66308,11 @@
 3354656768,3354660351,US
 3354660864,3354663423,US
 3354664960,3354670079,US
+3354671104,3354673151,US
 3354689536,3354707455,US
 3354709248,3354720511,US
 3354722304,3354735615,US
-3354738688,3354747391,US
+3354736640,3354747391,US
 3354748416,3354751999,US
 3354752256,3354758399,US
 3354759424,3354767359,US
@@ -65352,7 +66322,9 @@
 3354782720,3354782975,CA
 3354782976,3354787071,US
 3354787328,3354787583,US
-3354788096,3354817535,CA
+3354788096,3354807551,CA
+3354807552,3354810367,US
+3354810368,3354817535,CA
 3354817792,3354823423,CA
 3354823680,3354830847,CA
 3354831360,3354853119,CA
@@ -65364,7 +66336,8 @@
 3354955776,3354956031,AR
 3354956032,3354967295,US
 3354967552,3354969855,US
-3354970112,3354978303,US
+3354970112,3354972159,US
+3354972416,3354978303,US
 3354978560,3354988031,US
 3354988544,3355012351,US
 3355013120,3355017215,CA
@@ -65396,11 +66369,11 @@
 3355445248,3355447295,BR
 3355447296,3355447551,CU
 3355447552,3355447807,AR
+3355447808,3355448063,HT
 3355448320,3355449343,AN
 3355449344,3355450367,CU
 3355450368,3355451391,EC
 3355451392,3355459071,BR
-3355459072,3355459327,CO
 3355459328,3355459583,EC
 3355459584,3355459839,PA
 3355459840,3355460095,VE
@@ -65428,7 +66401,7 @@
 3355472640,3355473407,CL
 3355473408,3355473919,PE
 3355473920,3355475199,CL
-3355475200,3355478015,MX
+3355475200,3355477503,MX
 3355478016,3355478271,PE
 3355478272,3355478783,US
 3355478784,3355479039,VE
@@ -65558,7 +66531,8 @@
 3355858944,3355860991,DO
 3355860992,3355869183,CL
 3355869184,3355870719,BR
-3355871232,3355873279,AR
+3355871232,3355871487,US
+3355871488,3355873279,AR
 3355873280,3355875327,AN
 3355875328,3355877375,VE
 3355877376,3355885567,CO
@@ -65672,7 +66646,7 @@
 3356135680,3356135935,CL
 3356135936,3356136191,BR
 3356136192,3356137471,EC
-3356137472,3356137727,US
+3356137472,3356137727,JM
 3356137728,3356138239,BR
 3356138240,3356138495,US
 3356138496,3356139519,BR
@@ -65680,7 +66654,7 @@
 3356139776,3356140031,AR
 3356140032,3356140287,DO
 3356140288,3356140799,BR
-3356140800,3356141311,US
+3356140800,3356141311,BM
 3356141312,3356142847,CL
 3356142848,3356145151,BR
 3356145152,3356145407,CL
@@ -65728,6 +66702,7 @@
 3356163584,3356163839,VE
 3356163840,3356164095,CL
 3356164096,3356171519,BR
+3356171520,3356171775,AR
 3356172288,3356172543,PE
 3356172800,3356174335,PE
 3356174336,3356176383,CO
@@ -66068,9 +67043,7 @@
 3358142720,3358142975,US
 3358142976,3358143231,CO
 3358143232,3358143487,VE
-3358143488,3358143615,US
-3358143616,3358143623,CL
-3358143624,3358143999,AR
+3358143488,3358143999,US
 3358144000,3358144511,CL
 3358144512,3358145023,VE
 3358145024,3358147135,AR
@@ -66153,7 +67126,9 @@
 3358717952,3358719999,AR
 3358720000,3358728191,US
 3358728192,3358736383,CL
-3358736384,3358744575,US
+3358736384,3358737111,US
+3358737112,3358737119,CA
+3358737120,3358744575,US
 3358744576,3358752767,CL
 3358752768,3358756863,US
 3358756864,3358760959,CL
@@ -66273,7 +67248,7 @@
 3360104448,3360116735,CO
 3360116736,3360118783,BO
 3360118784,3360120831,AR
-3360120832,3360129023,CO
+3360120832,3360124927,CO
 3360129024,3360145407,VE
 3360145408,3360153599,CL
 3360153600,3360157695,AR
@@ -66304,7 +67279,9 @@
 3360235520,3360235775,CL
 3360235776,3360236799,CO
 3360236800,3360237055,CL
-3360237056,3360240895,CO
+3360237056,3360238847,CO
+3360238848,3360239103,CL
+3360239104,3360240895,CO
 3360240896,3360241151,CL
 3360241152,3360243199,CO
 3360243200,3360243455,CL
@@ -66325,11 +67302,17 @@
 3360253952,3360255999,SV
 3360256000,3360258047,AR
 3360258048,3360260095,CL
-3360260096,3360268287,AR
-3360268288,3360268543,US
-3360268544,3360268799,AR
-3360268800,3360269055,US
-3360269056,3360276479,AR
+3360260096,3360267263,AR
+3360267264,3360267775,US
+3360267776,3360268287,AR
+3360268288,3360269055,US
+3360269056,3360269567,AR
+3360269568,3360269823,US
+3360269824,3360270079,AR
+3360270080,3360270335,US
+3360270336,3360270591,AR
+3360270592,3360270847,US
+3360270848,3360276479,AR
 3360276480,3360278527,VE
 3360278528,3360280575,EC
 3360280576,3360282623,CL
@@ -66339,6 +67322,7 @@
 3360333824,3360342015,CL
 3360342016,3360354303,VE
 3360354304,3360356351,PA
+3360356352,3360358399,CR
 3360358400,3360358911,CL
 3360358912,3360358919,CO
 3360358920,3360366591,CL
@@ -66361,7 +67345,9 @@
 3360687984,3360688079,AR
 3360688080,3360688119,CO
 3360688120,3360688127,AR
-3360688128,3360689407,CO
+3360688128,3360688639,CO
+3360688640,3360688895,AR
+3360688896,3360689407,CO
 3360689408,3360689919,AR
 3360689920,3360690199,CO
 3360690200,3360690215,AR
@@ -66486,7 +67472,7 @@
 3361538048,3361570815,VE
 3361570816,3361587199,CO
 3361587200,3361599487,EC
-3361599488,3361600511,UY
+3361599488,3361600767,UY
 3361601536,3361603583,EC
 3361603584,3361734655,MX
 3361734656,3362258943,BR
@@ -66501,13 +67487,17 @@
 3362336768,3362338815,CO
 3362338816,3362339839,AR
 3362339840,3362341887,CO
-3362341888,3362342143,GT
+3362341888,3362342143,AR
 3362342144,3362342911,PA
 3362342912,3362343423,CO
 3362343424,3362343679,EC
 3362343680,3362344959,CO
 3362344960,3362347007,PA
 3362347008,3362349055,CO
+3362349056,3362351103,CR
+3362351104,3362353151,AR
+3362353152,3362355199,EC
+3362355200,3362357247,AR
 3362357248,3362381823,BO
 3362381824,3362390015,EC
 3362390016,3362422783,PE
@@ -66520,6 +67510,8 @@
 3362450176,3362451455,HN
 3362455552,3362471935,EC
 3362471936,3362476031,CL
+3362476032,3362476287,HN
+3362476544,3362477055,CR
 3362484224,3362484479,AR
 3362484480,3362486271,UY
 3362486272,3362488319,HN
@@ -66548,8 +67540,8 @@
 3362689280,3362689311,AR
 3362689312,3362689535,CO
 3362689536,3362689567,AR
-3362689568,3362689791,CO
-3362689792,3362690047,AR
+3362689568,3362690015,CO
+3362690016,3362690047,AR
 3362690048,3362690367,CO
 3362690368,3362690431,AR
 3362690432,3362691071,CO
@@ -66572,12 +67564,14 @@
 3362832384,3362836479,BO
 3362840576,3362897919,CL
 3362897920,3362906111,HT
-3362914304,3362934783,CO
+3362914304,3362930687,CO
 3362947072,3362983935,AR
 3362988032,3362992127,EC
 3362996224,3363000319,UY
 3363004416,3363012607,CO
-3363012608,3363024895,PA
+3363012608,3363013967,PA
+3363013968,3363013975,NI
+3363013976,3363024895,PA
 3363028992,3363045375,AR
 3363045376,3363110911,CO
 3363110912,3363112063,AR
@@ -66598,9 +67592,7 @@
 3363504128,3363512319,PE
 3363520512,3363553599,AR
 3363553600,3363553663,US
-3363553664,3363553791,AR
-3363553792,3363554047,CL
-3363554048,3363557375,AR
+3363553664,3363557375,AR
 3363561472,3363565567,CO
 3363569664,3363577855,PA
 3363577856,3363586047,CL
@@ -66799,9 +67791,7 @@
 3389211648,3389212671,TH
 3389212672,3389213439,AU
 3389213440,3389214207,IN
-3389214208,3389214719,AU
-3389214720,3389218815,IN
-3389218816,3389222911,AU
+3389214208,3389222911,AU
 3389222912,3389225983,IN
 3389225984,3389226239,HK
 3389226240,3389226495,IN
@@ -67236,7 +68226,21 @@
 3391819776,3391823871,JP
 3391823872,3391827967,TH
 3391827968,3391832063,KR
-3391832064,3391852543,AU
+3391832064,3391832575,ID
+3391832576,3391832831,AU
+3391832832,3391833087,IN
+3391833088,3391834111,JP
+3391834112,3391835135,ID
+3391835136,3391836159,CN
+3391836160,3391836671,AU
+3391836672,3391837183,HK
+3391837184,3391838207,AU
+3391838208,3391838719,ID
+3391838720,3391839231,AU
+3391839232,3391840255,ID
+3391840256,3391841279,JP
+3391841280,3391842303,MY
+3391842304,3391852543,AU
 3391852544,3391856639,CN
 3391856640,3391864831,ID
 3391864832,3391868927,US
@@ -67419,7 +68423,9 @@
 3392660928,3392667647,TW
 3392667648,3392668671,IN
 3392668672,3392669695,BD
-3392669696,3392670815,HK
+3392669696,3392670783,HK
+3392670784,3392670791,GB
+3392670792,3392670815,HK
 3392670816,3392670847,US
 3392670848,3392671743,HK
 3392671744,3392675839,JP
@@ -67646,7 +68652,7 @@
 3393789952,3393798143,SG
 3393798144,3393806335,JP
 3393806336,3393814527,ID
-3393814528,3393815551,HK
+3393814528,3393815551,AU
 3393815552,3393816575,KR
 3393816576,3393818623,JP
 3393818624,3393822719,AU
@@ -67664,7 +68670,7 @@
 3393871872,3393880063,HK
 3393880064,3393896447,AU
 3393896448,3393906687,NZ
-3393906688,3393908735,PK
+3393906688,3393908735,AU
 3393908736,3393910783,BD
 3393910784,3393911807,PH
 3393911808,3393912063,AU
@@ -67916,9 +68922,7 @@
 3395027968,3395028991,VN
 3395028992,3395031039,AU
 3395031040,3395035135,PK
-3395035136,3395039231,AU
-3395039232,3395043327,BD
-3395043328,3395059711,AU
+3395035136,3395059711,AU
 3395059712,3395067903,PH
 3395067904,3395076095,HK
 3395076096,3395080191,ID
@@ -68076,7 +69080,9 @@
 3397410816,3397419007,AU
 3397419008,3397419535,HK
 3397419536,3397419551,KR
-3397419552,3397419871,HK
+3397419552,3397419743,HK
+3397419744,3397419759,KR
+3397419760,3397419871,HK
 3397419872,3397419904,KR
 3397419905,3397427199,HK
 3397427200,3397443583,SG
@@ -68112,7 +69118,15 @@
 3397516800,3397517055,JP
 3397517056,3397517311,AU
 3397517312,3397525503,CN
-3397525504,3397533695,AU
+3397525504,3397526527,AU
+3397526528,3397527039,VN
+3397527040,3397527295,AU
+3397527296,3397527551,JP
+3397527552,3397528575,IN
+3397528576,3397530623,AU
+3397530624,3397531647,ID
+3397531648,3397532671,SG
+3397532672,3397533695,JP
 3397533696,3397555903,HK
 3397555904,3397555935,JP
 3397555936,3397566263,HK
@@ -68323,14 +69337,14 @@
 3398634464,3398634479,KR
 3398634480,3398634495,AU
 3398634496,3398634591,KR
-3398634592,3398634607,AU
-3398634608,3398634623,KR
-3398634624,3398634751,AU
+3398634592,3398634751,AU
 3398634752,3398634783,KR
 3398634784,3398635263,AU
 3398635264,3398635391,KR
 3398635392,3398636039,AU
-3398636040,3398636127,HK
+3398636040,3398636087,HK
+3398636088,3398636095,AU
+3398636096,3398636127,HK
 3398636128,3398636351,AU
 3398636352,3398636367,HK
 3398636368,3398636375,AU
@@ -68340,8 +69354,8 @@
 3398636512,3398636543,AU
 3398636544,3398636583,HK
 3398636584,3398636591,AU
-3398636592,3398636735,HK
-3398636736,3398636767,AU
+3398636592,3398636719,HK
+3398636720,3398636767,AU
 3398636768,3398636775,HK
 3398636776,3398636783,AU
 3398636784,3398636799,HK
@@ -68350,7 +69364,9 @@
 3398637216,3398637247,AU
 3398637248,3398637311,HK
 3398637312,3398637375,AU
-3398637376,3398637503,HK
+3398637376,3398637439,HK
+3398637440,3398637455,AU
+3398637456,3398637503,HK
 3398637504,3398637511,AU
 3398637512,3398637519,HK
 3398637520,3398637551,AU
@@ -68390,8 +69406,7 @@
 3398640640,3398640695,SG
 3398640696,3398640783,AU
 3398640784,3398640799,SG
-3398640800,3398640895,AU
-3398640896,3398640911,MY
+3398640800,3398640911,AU
 3398640912,3398640959,SG
 3398640960,3398641007,AU
 3398641008,3398641039,SG
@@ -68444,7 +69459,8 @@
 3398819840,3398828031,CN
 3398828032,3398829055,KH
 3398829056,3398830079,IN
-3398830080,3398832127,AU
+3398830080,3398831103,KH
+3398831104,3398832127,AU
 3398832128,3398836223,CN
 3398836224,3398840319,AU
 3398840320,3398842367,JP
@@ -68557,8 +69573,7 @@
 3399393280,3399401471,CN
 3399401472,3399409663,AU
 3399409664,3399413759,JP
-3399413760,3399414015,NL
-3399414016,3399414271,AU
+3399413760,3399414271,AU
 3399414272,3399414527,JP
 3399414528,3399414783,AU
 3399414784,3399415807,VN
@@ -68667,8 +69682,7 @@
 3399924224,3399924735,AU
 3399924736,3399925759,PH
 3399925760,3399933951,NP
-3399933952,3399942143,TW
-3399942144,3399950335,AU
+3399933952,3399950335,AU
 3399950336,3399967871,US
 3399967872,3399967999,HK
 3399968000,3399974911,US
@@ -68855,14 +69869,13 @@
 3400437632,3400437647,MY
 3400437648,3400437655,HK
 3400437656,3400437663,MY
-3400437664,3400437671,MN
-3400437672,3400437679,HK
+3400437664,3400437679,HK
 3400437680,3400437687,MN
 3400437688,3400437703,ID
 3400437704,3400437711,HK
 3400437712,3400437719,MY
-3400437720,3400437727,HK
-3400437728,3400437759,ID
+3400437720,3400437735,HK
+3400437736,3400437759,ID
 3400437760,3400437767,AF
 3400437768,3400437775,MY
 3400437776,3400437783,HK
@@ -68882,12 +69895,7 @@
 3400437960,3400437967,ID
 3400437968,3400437975,MY
 3400437976,3400437983,AF
-3400437984,3400438015,HK
-3400438016,3400438079,LK
-3400438080,3400438111,BD
-3400438112,3400438143,HK
-3400438144,3400438175,BD
-3400438176,3400438191,HK
+3400437984,3400438191,HK
 3400438192,3400438207,US
 3400438208,3400438399,HK
 3400438400,3400438591,BD
@@ -69032,15 +70040,23 @@
 3400608768,3400609791,IN
 3400609792,3400630271,JP
 3400630272,3400646655,IN
-3400646656,3400648735,SG
+3400646656,3400647043,SG
+3400647044,3400647047,JP
+3400647048,3400647623,SG
+3400647624,3400647631,JP
+3400647632,3400648735,SG
 3400648736,3400648743,DE
 3400648744,3400648767,SG
 3400648768,3400648807,US
 3400648808,3400649191,SG
 3400649192,3400649199,HK
-3400649200,3400649983,SG
+3400649200,3400649519,SG
+3400649520,3400649527,JP
+3400649528,3400649983,SG
 3400649984,3400650047,HK
-3400650048,3400654847,SG
+3400650048,3400650751,SG
+3400650752,3400651007,JP
+3400651008,3400654847,SG
 3400654848,3400663039,IN
 3400663040,3400683519,MY
 3400683520,3400691711,JP
@@ -69151,9 +70167,13 @@
 3406696960,3406697215,IN
 3406697216,3406737407,AU
 3406737408,3406737663,ID
-3406737664,3406746623,AU
+3406737664,3406739199,AU
+3406739200,3406739455,ID
+3406739456,3406746623,AU
 3406746624,3406746879,HK
-3406746880,3406946815,AU
+3406746880,3406865663,AU
+3406865664,3406865919,IN
+3406865920,3406946815,AU
 3406946816,3406947071,KR
 3406947072,3406950399,AU
 3406950400,3406951423,NF
@@ -69161,11 +70181,14 @@
 3406961152,3406961407,IN
 3406961408,3406967295,AU
 3406967296,3406967551,CN
-3406967552,3407020287,AU
+3406967552,3406989567,AU
+3406989568,3406989823,IN
+3406989824,3407020287,AU
 3407020288,3407020543,SG
 3407020544,3407020799,AU
 3407020800,3407021055,IN
-3407021056,3407045887,AU
+3407021056,3407021311,ID
+3407021312,3407045887,AU
 3407045888,3407046143,HK
 3407046144,3407057663,AU
 3407057664,3407057919,JP
@@ -69211,7 +70234,11 @@
 3407243264,3407243775,HK
 3407243776,3407268863,AU
 3407268864,3407269119,US
-3407269120,3407369983,AU
+3407269120,3407329791,AU
+3407329792,3407330047,IN
+3407330048,3407367167,AU
+3407367168,3407367679,ID
+3407367680,3407369983,AU
 3407369984,3407370239,IN
 3407370240,3407498495,AU
 3407498496,3407498751,PK
@@ -69231,7 +70258,11 @@
 3407753216,3407753727,HK
 3407753728,3407785471,AU
 3407785472,3407785727,NZ
-3407785728,3407814655,AU
+3407785728,3407801343,AU
+3407801344,3407801855,ID
+3407801856,3407805951,AU
+3407805952,3407806463,ID
+3407806464,3407814655,AU
 3407814656,3407815167,HK
 3407815168,3407828991,AU
 3407828992,3407829503,US
@@ -69260,7 +70291,9 @@
 3408024064,3408032767,AU
 3408032768,3408033279,IN
 3408033280,3408033791,ID
-3408033792,3408042495,AU
+3408033792,3408039935,AU
+3408039936,3408040191,VN
+3408040192,3408042495,AU
 3408042496,3408042751,HK
 3408042752,3408066047,AU
 3408066048,3408066303,PH
@@ -69268,7 +70301,9 @@
 3409396480,3409396735,PH
 3409396736,3409418495,AU
 3409418496,3409418751,PL
-3409418752,3409423615,AU
+3409418752,3409420287,AU
+3409420288,3409420543,IN
+3409420544,3409423615,AU
 3409423616,3409423871,IN
 3409423872,3409491711,AU
 3409491712,3409491967,SG
@@ -69280,7 +70315,9 @@
 3409509632,3409509887,HK
 3409509888,3409510367,AU
 3409510368,3409510383,IN
-3409510384,3409547519,AU
+3409510384,3409516543,AU
+3409516544,3409517055,ID
+3409517056,3409547519,AU
 3409547520,3409547775,NZ
 3409547776,3409802831,AU
 3409802832,3409802847,MT
@@ -69553,7 +70590,18 @@
 3411609600,3411611647,AU
 3411611648,3411615743,ID
 3411615744,3411623935,JP
-3411623936,3411648511,AU
+3411623936,3411640319,AU
+3411640320,3411641343,JP
+3411641344,3411641599,IN
+3411641600,3411641855,HK
+3411641856,3411642367,IN
+3411642368,3411643391,AU
+3411643392,3411644415,VN
+3411644416,3411644927,AU
+3411644928,3411645951,ID
+3411645952,3411646207,SG
+3411646208,3411647487,IN
+3411647488,3411648511,HK
 3411648512,3411656703,NZ
 3411656704,3411673087,AU
 3411673088,3411674111,CN
@@ -69673,8 +70721,8 @@
 3412249232,3412249239,HK
 3412249240,3412249243,SG
 3412249244,3412249247,AU
-3412249248,3412249263,CN
-3412249264,3412249279,AU
+3412249248,3412249271,CN
+3412249272,3412249279,AU
 3412249280,3412249471,IN
 3412249472,3412249599,TW
 3412249600,3412249855,AU
@@ -69761,7 +70809,8 @@
 3412295680,3412296191,NZ
 3412296192,3412296703,ID
 3412296704,3412297727,NZ
-3412297728,3412298751,MY
+3412297728,3412298239,SC
+3412298240,3412298751,MY
 3412298752,3412299263,CN
 3412299264,3412299519,AU
 3412299520,3412299775,HK
@@ -69849,7 +70898,14 @@
 3413270528,3413278719,TH
 3413278720,3413295103,NZ
 3413295104,3413303295,JP
-3413303296,3413311487,AU
+3413303296,3413304319,ID
+3413304320,3413305343,JP
+3413305344,3413306367,IN
+3413306368,3413307391,PH
+3413307392,3413308415,IN
+3413308416,3413309439,CN
+3413309440,3413310463,JP
+3413310464,3413311487,HK
 3413311488,3413327871,LK
 3413327872,3413344255,IN
 3413344256,3413360639,PH
@@ -70031,8 +71087,7 @@
 3415435264,3415436287,PH
 3415436288,3415436799,AU
 3415436800,3415437311,HK
-3415437312,3415441407,SE
-3415441408,3415474175,AU
+3415437312,3415474175,AU
 3415474176,3415490559,CN
 3415490560,3415491583,PK
 3415491584,3415494655,AU
@@ -70208,9 +71263,7 @@
 3416481856,3416481871,HK
 3416481872,3416481887,JP
 3416481888,3416481919,HK
-3416481920,3416481967,JP
-3416481968,3416481983,HK
-3416481984,3416482047,JP
+3416481920,3416482047,JP
 3416482048,3416482079,SG
 3416482080,3416482159,JP
 3416482160,3416482191,SG
@@ -70349,7 +71402,8 @@
 3416865608,3416865655,AU
 3416865656,3416865791,JP
 3416865792,3416866055,HK
-3416866056,3416866303,AU
+3416866056,3416866063,SG
+3416866064,3416866303,AU
 3416866304,3416866559,HK
 3416866560,3416866815,AU
 3416866816,3416883199,SG
@@ -70497,7 +71551,9 @@
 3418066528,3418066591,IN
 3418066592,3418066703,US
 3418066704,3418066719,IN
-3418066720,3418067967,US
+3418066720,3418067071,US
+3418067072,3418067135,SG
+3418067136,3418067967,US
 3418067968,3418068223,IN
 3418068224,3418068479,US
 3418068480,3418068607,IN
@@ -70530,8 +71586,7 @@
 3418181632,3418183679,AU
 3418183680,3418184191,ID
 3418184192,3418184959,IN
-3418184960,3418185727,AU
-3418185728,3418189823,PK
+3418184960,3418189823,AU
 3418189824,3418190847,BD
 3418190848,3418191871,TH
 3418191872,3418192895,ID
@@ -70558,7 +71613,9 @@
 3418246024,3418251263,PH
 3418251264,3418255359,CN
 3418255360,3418257407,ID
-3418257408,3418259367,HK
+3418257408,3418257551,HK
+3418257552,3418257559,GB
+3418257560,3418259367,HK
 3418259368,3418259373,SG
 3418259374,3418259455,HK
 3418259456,3418267647,IN
@@ -70572,10 +71629,20 @@
 3418282496,3418283519,PH
 3418283520,3418284031,AU
 3418284032,3418285055,SG
-3418285056,3418285567,JP
-3418285568,3418287135,SG
+3418285056,3418285823,JP
+3418285824,3418287135,SG
 3418287136,3418287167,JP
-3418287168,3418288127,SG
+3418287168,3418287691,SG
+3418287692,3418287695,JP
+3418287696,3418287699,SG
+3418287700,3418287703,JP
+3418287704,3418287719,SG
+3418287720,3418287730,JP
+3418287731,3418287732,SG
+3418287733,3418287734,JP
+3418287735,3418287735,SG
+3418287736,3418287743,JP
+3418287744,3418288127,SG
 3418288128,3418290175,ID
 3418290176,3418290431,IN
 3418290432,3418290687,HK
@@ -70764,8 +71831,8 @@
 3418510928,3418510943,HK
 3418510944,3418510991,JP
 3418510992,3418511007,HK
-3418511008,3418511023,JP
-3418511024,3418511055,HK
+3418511008,3418511031,JP
+3418511032,3418511055,HK
 3418511056,3418511087,JP
 3418511088,3418511103,HK
 3418511104,3418511107,JP
@@ -70790,10 +71857,7 @@
 3418513408,3418517503,IN
 3418517504,3418519551,MN
 3418519552,3418521599,AU
-3418521600,3418524574,HK
-3418524575,3418524606,CN
-3418524607,3418524638,TH
-3418524639,3418554367,HK
+3418521600,3418554367,HK
 3418554368,3418578943,AU
 3418578944,3418583039,TH
 3418583040,3418585087,AU
@@ -71165,9 +72229,7 @@
 3423094784,3423095807,CA
 3423095808,3423143935,US
 3423143936,3423145983,CA
-3423145984,3423177471,US
-3423177472,3423177727,CA
-3423177728,3423182847,US
+3423145984,3423182847,US
 3423182848,3423183743,CA
 3423183744,3423183871,EE
 3423183872,3423184207,CA
@@ -71248,8 +72310,7 @@
 3423473664,3423474687,CA
 3423474688,3423493631,US
 3423493632,3423493887,CA
-3423493888,3423498239,US
-3423500288,3423533055,US
+3423493888,3423533055,US
 3423533056,3423535103,AI
 3423535104,3423543295,US
 3423543296,3423545343,CA
@@ -71288,7 +72349,7 @@
 3423858688,3423858943,CA
 3423859456,3423859711,CA
 3423859968,3423862527,CA
-3423862784,3424270591,US
+3423862784,3424270847,US
 3424271360,3424321279,US
 3424321536,3424334847,US
 3424334848,3424335871,CA
@@ -71502,7 +72563,6 @@
 3428299776,3428302079,US
 3428302336,3428305663,US
 3428305920,3428306175,US
-3428306176,3428306431,MX
 3428306432,3428310527,US
 3428310784,3428311039,US
 3428311296,3428318975,US
@@ -71516,7 +72576,8 @@
 3428434944,3428435199,IT
 3428435200,3428437503,US
 3428437504,3428437759,MX
-3428437760,3428440575,US
+3428437760,3428439551,US
+3428439808,3428440575,US
 3428440832,3428442367,US
 3428442624,3428445695,US
 3428445952,3428452863,US
@@ -71667,7 +72728,7 @@
 3430704128,3430705151,US
 3430705152,3430706175,MX
 3430706176,3430707967,US
-3430708224,3430715135,US
+3430708224,3430714367,US
 3430715392,3430719231,US
 3430719488,3430721279,US
 3430721536,3430722303,US
@@ -71780,7 +72841,8 @@
 3432677376,3432680703,US
 3432681472,3432683263,US
 3432683520,3432688895,US
-3432689664,3432703231,US
+3432689664,3432695807,US
+3432697856,3432703231,US
 3432704000,3432716799,US
 3432717312,3432734463,US
 3432734720,3432806655,US
@@ -71905,7 +72967,6 @@
 3438214912,3438215167,US
 3438215424,3438215935,CA
 3438216192,3438217983,CA
-3438217984,3438218239,US
 3438218240,3438218751,CA
 3438219264,3438219519,CA
 3438219776,3438246911,CA
@@ -71913,15 +72974,11 @@
 3438252800,3438261759,CA
 3438262016,3438280447,CA
 3438280704,3438542847,US
-3438542848,3438544943,CA
-3438544944,3438544959,TC
-3438544960,3438545423,CA
+3438542848,3438545423,CA
 3438545424,3438545431,US
 3438545432,3438545471,CA
 3438545472,3438545479,US
-3438545480,3438545583,CA
-3438545584,3438545591,US
-3438545592,3438550071,CA
+3438545480,3438550071,CA
 3438550072,3438550079,US
 3438550080,3438550447,CA
 3438550448,3438550463,US
@@ -71929,11 +72986,7 @@
 3438552272,3438552287,US
 3438552288,3438570031,CA
 3438570032,3438570039,MY
-3438570040,3438589951,CA
-3438589952,3438590207,TC
-3438590208,3438590975,CA
-3438590976,3438591231,TC
-3438591232,3438592255,CA
+3438570040,3438592255,CA
 3438592256,3438592263,US
 3438592264,3438600319,CA
 3438600320,3438600351,US
@@ -71943,11 +72996,11 @@
 3438723072,3438813183,US
 3438813184,3438814207,GH
 3438814208,3438895103,US
-3438895104,3438896895,HN
-3438896896,3439183359,US
+3438895104,3438896639,HN
+3438896640,3439183359,US
 3439183360,3439183871,HT
 3439183872,3447991551,US
-3447992320,3448004095,US
+3447991808,3448004095,US
 3448004608,3448263423,US
 3448263424,3448263935,AG
 3448263936,3448338687,US
@@ -71959,9 +73012,15 @@
 3448379424,3448379519,US
 3448379520,3448379647,IN
 3448379648,3448379903,SG
-3448379904,3448380415,US
+3448379904,3448380063,US
+3448380064,3448380079,SG
+3448380080,3448380095,US
+3448380096,3448380159,SG
+3448380160,3448380415,US
 3448380416,3448380671,SG
-3448380672,3448381183,US
+3448380672,3448380687,US
+3448380688,3448380719,SG
+3448380720,3448381183,US
 3448381184,3448381439,SG
 3448381440,3448397887,US
 3448397888,3448397967,CA
@@ -71971,16 +73030,30 @@
 3448399360,3448399871,CA
 3448399872,3448461311,US
 3448461312,3448461391,GB
-3448461392,3448462111,US
+3448461392,3448461415,US
+3448461416,3448461423,SG
+3448461424,3448461543,US
+3448461544,3448461551,GB
+3448461552,3448461567,US
+3448461568,3448461599,SG
+3448461600,3448461631,US
+3448461632,3448461695,SG
+3448461696,3448462111,US
 3448462112,3448462127,SG
 3448462128,3448462143,US
 3448462144,3448462223,SG
 3448462224,3448462239,GB
 3448462240,3448462255,US
 3448462256,3448462271,GB
-3448462272,3448556799,US
+3448462272,3448556671,US
+3448556672,3448556735,GB
+3448556736,3448556799,US
 3448556800,3448556815,GB
-3448556816,3448637183,US
+3448556816,3448558911,US
+3448558912,3448558919,GB
+3448558920,3448559103,US
+3448559104,3448559359,GB
+3448559360,3448637183,US
 3448637440,3448638975,US
 3448639488,3448647423,US
 3448647680,3448651775,US
@@ -72095,7 +73168,8 @@
 3449768192,3449769727,US
 3449769984,3449782271,US
 3449782528,3449783551,US
-3449783808,3449814783,US
+3449783808,3449813503,US
+3449813760,3449814783,US
 3449815040,3449843199,US
 3449843200,3449843711,YE
 3449843712,3449874687,US
@@ -72242,8 +73316,7 @@
 3453408256,3453409023,BB
 3453409024,3453409535,KN
 3453409536,3453411327,BB
-3453411328,3453480959,US
-3453485056,3453551839,US
+3453411328,3453551839,US
 3453551840,3453551879,GB
 3453551880,3453551895,US
 3453551896,3453551903,GB
@@ -72251,7 +73324,9 @@
 3453551936,3453551967,GB
 3453551968,3453552039,US
 3453552040,3453552047,GB
-3453552048,3453552455,US
+3453552048,3453552399,US
+3453552400,3453552407,GB
+3453552408,3453552455,US
 3453552456,3453552463,IE
 3453552464,3453552471,GB
 3453552472,3453552511,US
@@ -72259,7 +73334,13 @@
 3453552640,3453552895,GB
 3453552896,3453553151,US
 3453553152,3453553407,GB
-3453553408,3453607935,US
+3453553408,3453553631,US
+3453553632,3453553639,GB
+3453553640,3453553919,US
+3453553920,3453553983,GB
+3453553984,3453554063,US
+3453554064,3453554095,GB
+3453554096,3453607935,US
 3453607936,3453608959,KN
 3453608960,3453609983,LC
 3453609984,3453612543,AG
@@ -72414,7 +73495,7 @@
 3459457792,3459458047,PR
 3459458048,3459512319,US
 3459512320,3459513855,CA
-3459514368,3459592191,US
+3459513856,3459592191,US
 3459592192,3459596287,CA
 3459596288,3459614719,US
 3459616768,3459620863,CA
@@ -72445,7 +73526,9 @@
 3461285888,3461285967,GB
 3461285968,3461330943,US
 3461330944,3461331199,SG
-3461331200,3461331711,US
+3461331200,3461331327,US
+3461331328,3461331455,SG
+3461331456,3461331711,US
 3461331712,3461331967,SG
 3461331968,3461332223,US
 3461332224,3461332479,SG
@@ -72475,7 +73558,8 @@
 3462605824,3462608895,UY
 3462608896,3462633471,US
 3462633472,3462633727,SG
-3462633728,3462633983,US
+3462633728,3462633799,BV
+3462633800,3462633983,US
 3462633984,3462634239,SG
 3462634240,3462634247,US
 3462634248,3462634255,SG
@@ -72590,7 +73674,9 @@
 3465983208,3465983263,GB
 3465983264,3465983271,US
 3465983272,3465983311,GB
-3465983312,3466044903,US
+3465983312,3465983463,US
+3465983464,3465983487,GB
+3465983488,3466044903,US
 3466044904,3466044911,PH
 3466044912,3466158079,US
 3466158080,3466166271,PA
@@ -72636,7 +73722,8 @@
 3468656640,3469055743,US
 3469055744,3469055999,CA
 3469056000,3469068287,US
-3469068800,3469893631,US
+3469068800,3469070335,US
+3469070592,3469893631,US
 3469893632,3469901823,CA
 3469901824,3469989887,US
 3469990400,3470131199,US
@@ -72665,7 +73752,7 @@
 3470746112,3470749951,US
 3470749952,3470750207,CA
 3470750208,3470751743,US
-3470752512,3470752767,US
+3470752256,3470752767,US
 3470752768,3470753023,CO
 3470753024,3470754303,US
 3470754304,3470754559,PE
@@ -72723,8 +73810,7 @@
 3474391040,3474456575,CA
 3474456576,3475111935,US
 3475112192,3475113215,CA
-3475113216,3475113471,US
-3475113984,3475115007,US
+3475113216,3475115007,US
 3475115008,3475120127,CA
 3475120128,3475124223,US
 3475124224,3475243007,CA
@@ -72764,11 +73850,8 @@
 3478364168,3479207935,US
 3479207936,3479214079,CA
 3479214080,3479214335,US
-3479214336,3479231199,CA
-3479231200,3479231207,US
-3479231208,3479240703,CA
-3479240704,3479339007,US
-3479371776,3479568383,US
+3479214336,3479240703,CA
+3479240704,3479568383,US
 3479568384,3479633919,CA
 3479633920,3479896063,US
 3479896064,3479961599,CA
@@ -72799,8 +73882,7 @@
 3483296005,3483296005,BE
 3483296006,3483435007,US
 3483435008,3483533311,CA
-3483533312,3483537407,US
-3483541504,3483631615,US
+3483533312,3483631615,US
 3483631616,3483697151,CA
 3483697152,3483791359,US
 3483791360,3483795455,PR
@@ -72890,8 +73972,7 @@
 3485290464,3485290479,GB
 3485290480,3485327359,US
 3485327360,3485335551,CA
-3485335552,3485433855,US
-3485442048,3485446143,VE
+3485335552,3485442047,US
 3485446144,3485462527,US
 3485466624,3485597695,US
 3485597696,3485671583,CA
@@ -72901,7 +73982,10 @@
 3485672552,3485695999,CA
 3485704192,3486023679,US
 3486023680,3486031871,CA
-3486031872,3486253055,US
+3486031872,3486269439,US
+3486269440,3486277631,JM
+3486285824,3486302207,PR
+3486302208,3486310399,CA
 3486318592,3486646271,US
 3486646272,3486662655,CA
 3486662656,3486699519,US
@@ -72910,7 +73994,9 @@
 3486700400,3486700407,CA
 3486700408,3486701311,US
 3486701312,3486701567,CA
-3486701568,3487039487,US
+3486701568,3486711551,US
+3486711552,3486711807,CA
+3486711808,3487039487,US
 3487039488,3487105023,CA
 3487105024,3487187199,US
 3487187200,3487187215,GB
@@ -72995,7 +74081,7 @@
 3489464320,3489529855,CA
 3489529856,3489562623,US
 3489562624,3489566719,JM
-3489566720,3489579007,US
+3489566720,3489583103,US
 3489587200,3489717759,US
 3489717760,3489718015,PR
 3489718016,3489718271,US
@@ -73174,7 +74260,7 @@
 3494095872,3494114303,US
 3494115328,3494121471,US
 3494121472,3494122495,CA
-3494122496,3494135807,US
+3494122496,3494134783,US
 3494135808,3494136831,CA
 3494136832,3494139903,US
 3494139904,3494141735,CA
@@ -73203,8 +74289,7 @@
 3494277120,3494290943,US
 3494290944,3494291455,GB
 3494291456,3494294527,US
-3494295040,3494295551,UM
-3494295552,3494302719,US
+3494295040,3494302719,US
 3494302720,3494303743,CA
 3494303744,3494310911,US
 3494310912,3494311935,CA
@@ -73279,7 +74364,7 @@
 3494758400,3494776831,US
 3494776832,3494777855,CA
 3494777856,3494785023,US
-3494785024,3494787071,GP
+3494785024,3494787071,MF
 3494787072,3494789119,CA
 3494789120,3494852607,US
 3494852608,3494854655,CA
@@ -73297,7 +74382,8 @@
 3494928384,3494930431,CA
 3494930432,3494938623,US
 3494938624,3494939647,CA
-3494939648,3494964223,US
+3494939648,3494946815,US
+3494948864,3494964223,US
 3494964224,3494965247,PR
 3494965248,3494968319,US
 3494968320,3494972415,CA
@@ -73342,9 +74428,7 @@
 3495349248,3495350271,CA
 3495350272,3495358463,US
 3495358464,3495359487,CA
-3495359488,3495362367,US
-3495362368,3495362399,AU
-3495362400,3495367679,US
+3495359488,3495367679,US
 3495367680,3495368703,CA
 3495368704,3495370751,US
 3495370752,3495372799,BS
@@ -73384,9 +74468,15 @@
 3495505920,3495507967,CA
 3495507968,3495515135,US
 3495515136,3495516159,CA
-3495516160,3495526399,US
+3495516160,3495520303,US
+3495520304,3495520307,CA
+3495520308,3495526399,US
 3495526400,3495527423,CA
-3495527424,3495551999,US
+3495527424,3495549183,US
+3495549184,3495549439,CA
+3495549440,3495550207,US
+3495550208,3495550463,CA
+3495550464,3495551999,US
 3495552000,3495553023,BM
 3495553024,3495579647,US
 3495579648,3495581695,CA
@@ -73401,7 +74491,7 @@
 3495622656,3495653375,US
 3495653376,3495654399,CA
 3495655424,3495673855,US
-3495673856,3495674879,GP
+3495673856,3495674879,MF
 3495674880,3495686143,US
 3495687168,3495688191,US
 3495688192,3495689215,CA
@@ -73417,9 +74507,7 @@
 3495740416,3495741439,CA
 3495741440,3495749631,US
 3495749632,3495750655,CA
-3495750656,3495761407,US
-3495761408,3495761663,CA
-3495761664,3495774207,US
+3495750656,3495774207,US
 3495774208,3495776255,CA
 3495776256,3495815167,US
 3495815168,3495817215,CA
@@ -73438,7 +74526,8 @@
 3495896064,3495897087,PR
 3495897088,3495930879,US
 3495930880,3495931903,CA
-3495931904,3495968767,US
+3495931904,3495934975,US
+3495936000,3495968767,US
 3495968768,3495985151,CA
 3495985152,3495988223,NI
 3495988224,3495989247,GT
@@ -73487,7 +74576,7 @@
 3497224320,3497224831,US
 3497224832,3497224863,CH
 3497224864,3497225375,US
-3497225376,3497225383,GB
+3497225376,3497225383,CN
 3497225384,3497225471,US
 3497225472,3497225535,IN
 3497225536,3497226783,US
@@ -73498,9 +74587,17 @@
 3497226880,3497226959,CH
 3497226960,3497227023,US
 3497227024,3497227039,GB
-3497227040,3497227231,US
-3497227232,3497227263,CH
-3497227264,3497246719,US
+3497227040,3497227247,US
+3497227248,3497227255,CN
+3497227256,3497227391,US
+3497227392,3497227407,CN
+3497227408,3497227527,US
+3497227528,3497227535,CN
+3497227536,3497228015,US
+3497228016,3497228023,CN
+3497228024,3497228079,US
+3497228080,3497228087,CN
+3497228088,3497246719,US
 3497263104,3497264913,US
 3497264914,3497264950,GB
 3497264951,3497266527,US
@@ -73587,7 +74684,8 @@
 3500752896,3500761087,KY
 3500761088,3501181703,US
 3501181704,3501181711,AU
-3501181712,3501182975,US
+3501181712,3501181727,KR
+3501181728,3501182975,US
 3501182976,3501183007,SG
 3501183008,3501183167,US
 3501183168,3501183231,SG
@@ -73600,9 +74698,7 @@
 3501522944,3501588479,CA
 3501588480,3502418175,US
 3502418176,3502418431,GU
-3502418432,3502569215,US
-3502569216,3502569471,BS
-3502569472,3502929663,US
+3502418432,3502929663,US
 3502929664,3502929919,GU
 3502929920,3502993407,US
 3502993408,3502993919,NL
@@ -73664,10 +74760,14 @@
 3509326080,3509326087,CA
 3509326088,3509327695,US
 3509327696,3509327711,CA
-3509327712,3509346303,US
+3509327712,3509327807,US
+3509327808,3509327871,CA
+3509327872,3509346303,US
 3509346304,3509347103,CA
 3509347104,3509347119,US
-3509347120,3509354495,CA
+3509347120,3509350335,CA
+3509350336,3509350343,US
+3509350344,3509354495,CA
 3509354496,3509387263,US
 3509387264,3509420031,PE
 3509420032,3509519871,US
@@ -73724,9 +74824,7 @@
 3509555456,3509555711,CA
 3509555712,3509555967,US
 3509555968,3509556479,CA
-3509556480,3509556735,US
-3509556736,3509557247,CA
-3509557248,3509558015,US
+3509556480,3509558015,US
 3509558016,3509558079,CA
 3509558080,3509559039,US
 3509559040,3509559295,KW
@@ -73807,7 +74905,8 @@
 3510335744,3510335999,VG
 3510336000,3510337279,AG
 3510337280,3510337535,LC
-3510337536,3510831527,US
+3510337536,3510362111,US
+3510370304,3510831527,US
 3510831528,3510831535,GB
 3510831536,3510833423,US
 3510833424,3510833439,CA
@@ -73988,8 +75087,8 @@
 3512647680,3512655871,TT
 3512655872,3512696831,US
 3512696832,3512699775,SE
-3512699776,3512701951,US
-3512701952,3512705023,SE
+3512699776,3512699903,US
+3512699904,3512705023,SE
 3512705024,3512844287,US
 3512844288,3512852479,CA
 3512852480,3512983551,US
@@ -74004,8 +75103,7 @@
 3513368576,3513376767,CA
 3513376768,3513475071,US
 3513475072,3513483263,CA
-3513483264,3513499647,US
-3513507840,3513778175,US
+3513483264,3513778175,US
 3513778176,3513794559,CA
 3513794560,3514007551,US
 3514007552,3514040319,CA
@@ -74056,9 +75154,8 @@
 3516355664,3516355679,CA
 3516355680,3516366847,US
 3516366848,3516370943,CA
-3516370944,3516375039,US
-3516383232,3516432383,US
-3516440576,3516514303,US
+3516370944,3516379135,US
+3516383232,3516514303,US
 3516514304,3516530687,CA
 3516530688,3516895231,US
 3516899328,3516899839,ZA
@@ -74227,7 +75324,9 @@
 3517597184,3517597695,US
 3517597696,3517600767,SE
 3517600768,3517601279,US
-3517601280,3517603071,SE
+3517601280,3517602047,SE
+3517602048,3517602303,DE
+3517602304,3517603071,SE
 3517603072,3517603327,US
 3517603328,3517605119,SE
 3517605120,3517605375,US
@@ -74310,7 +75409,7 @@
 3519873024,3519901695,CA
 3519901696,3519934463,US
 3519934464,3519938559,CA
-3519938560,3520004095,US
+3519938560,3520020479,US
 3520020480,3520036863,CA
 3520036864,3520356351,US
 3520364544,3520368639,US
@@ -74348,8 +75447,7 @@
 3521192704,3521192735,FR
 3521192736,3521249279,US
 3521249280,3521314815,CA
-3521314816,3521781759,US
-3521789952,3521904639,US
+3521314816,3521904639,US
 3521904640,3521921023,JM
 3521937408,3522101247,US
 3522101248,3522109439,CA
@@ -74408,7 +75506,9 @@
 3523592496,3523592511,HK
 3523592512,3523592575,PK
 3523592576,3523592703,LB
-3523592704,3523593215,HK
+3523592704,3523592735,HK
+3523592736,3523592751,AF
+3523592752,3523593215,HK
 3523593216,3523593231,KW
 3523593232,3523593239,AE
 3523593240,3523593279,HK
@@ -74454,9 +75554,10 @@
 3523596864,3523596927,IQ
 3523596928,3523597127,PK
 3523597128,3523597311,HK
-3523597312,3523597823,PK
+3523597312,3523597567,AE
+3523597568,3523597823,PK
 3523597824,3523597951,TZ
-3523597952,3523597959,IR
+3523597952,3523597959,HK
 3523597960,3523597983,IQ
 3523597984,3523597991,KZ
 3523597992,3523597999,US
@@ -74797,8 +75898,8 @@
 3557027864,3557027871,BE
 3557027872,3557027887,GB
 3557027888,3557028031,BE
-3557028032,3557028047,GB
-3557028048,3557028095,BE
+3557028032,3557028063,GB
+3557028064,3557028095,BE
 3557028096,3557028351,GB
 3557028352,3557028735,BE
 3557028736,3557028799,GB
@@ -74880,13 +75981,13 @@
 3557310464,3557326847,ES
 3557326848,3557335039,DE
 3557335040,3557335391,BE
-3557335456,3557335967,BE
+3557335456,3557335535,BE
+3557335552,3557335967,BE
 3557336000,3557336191,BE
-3557336256,3557336279,BE
-3557336288,3557336639,BE
+3557336256,3557336639,BE
 3557338112,3557338367,BE
 3557338496,3557339135,BE
-3557339160,3557339175,BE
+3557339152,3557339175,BE
 3557339184,3557339199,BE
 3557339216,3557339223,BE
 3557339232,3557339267,BE
@@ -74915,6 +76016,7 @@
 3557416960,3557425151,UA
 3557425152,3557490687,DK
 3557490688,3557507071,FR
+3557507072,3557515263,GB
 3557515264,3557523455,CZ
 3557523456,3557531647,RU
 3557531648,3557539839,SA
@@ -75010,7 +76112,7 @@
 3558122768,3558122783,CH
 3558122784,3558129663,DE
 3558129664,3558137855,NO
-3558137856,3558154239,GB
+3558137856,3558146047,GB
 3558154240,3558154367,NG
 3558154368,3558154495,SD
 3558154496,3558154623,MZ
@@ -75032,8 +76134,8 @@
 3558195456,3558196031,ES
 3558196032,3558196047,IT
 3558196048,3558196095,ES
-3558196096,3558196119,IT
-3558196120,3558196159,ES
+3558196096,3558196127,IT
+3558196128,3558196159,ES
 3558196160,3558196167,IT
 3558196168,3558196175,ES
 3558196176,3558196191,IT
@@ -75066,7 +76168,9 @@
 3558271488,3558276095,GI
 3558276096,3558276863,GB
 3558276864,3558277119,GI
-3558277120,3558285631,GB
+3558277120,3558285567,GB
+3558285568,3558285599,DE
+3558285600,3558285631,GB
 3558285632,3558285823,DE
 3558285824,3558285951,GB
 3558285952,3558286079,DE
@@ -75085,8 +76189,8 @@
 3558288192,3558288255,SE
 3558288256,3558288319,US
 3558288320,3558288383,CH
-3558288384,3558288431,US
-3558288432,3558288447,GB
+3558288384,3558288427,US
+3558288428,3558288447,GB
 3558288448,3558288483,US
 3558288484,3558288487,GB
 3558288488,3558288639,US
@@ -75107,13 +76211,12 @@
 3558290176,3558290431,GB
 3558290432,3558290575,BE
 3558290576,3558290591,GB
-3558290592,3558290623,BE
-3558290624,3558290655,GB
+3558290592,3558290615,BE
+3558290616,3558290655,GB
 3558290656,3558290663,BE
 3558290664,3558290671,GB
 3558290672,3558290687,BE
-3558290688,3558290815,ES
-3558290816,3558290943,GB
+3558290688,3558290943,ES
 3558290944,3558290959,DE
 3558290960,3558290967,NL
 3558290968,3558290975,GB
@@ -75129,8 +76232,8 @@
 3558291240,3558291247,GB
 3558291248,3558291263,CH
 3558291264,3558291279,AT
-3558291280,3558291295,GB
-3558291296,3558291455,CH
+3558291280,3558291311,GB
+3558291312,3558291455,CH
 3558291456,3558291903,GB
 3558291904,3558291967,DE
 3558291968,3558292223,GB
@@ -75191,7 +76294,9 @@
 3558368448,3558368479,DE
 3558368480,3558368495,ES
 3558368496,3558368511,US
-3558368512,3558372351,AT
+3558368512,3558369503,AT
+3558369504,3558369511,FR
+3558369512,3558372351,AT
 3558372352,3558372607,BG
 3558372608,3558372735,AT
 3558372736,3558372863,ES
@@ -75272,8 +76377,7 @@
 3558851472,3558851479,NO
 3558851480,3558851807,ES
 3558851808,3558851815,PT
-3558851816,3558851823,IR
-3558851824,3558852095,ES
+3558851816,3558852095,ES
 3558852096,3558852607,GB
 3558852608,3558852863,DE
 3558852864,3558853119,ES
@@ -75327,75 +76431,52 @@
 3559038721,3559038975,US
 3559038976,3559047167,DE
 3559047168,3559055359,IT
+3559055360,3559063551,AM
 3559063552,3559079935,CH
 3559079936,3559088127,JO
 3559088128,3559088283,BE
 3559088284,3559088287,GB
 3559088288,3559088367,BE
 3559088368,3559088371,GB
-3559088372,3559088431,BE
-3559088432,3559088447,GB
-3559088448,3559088551,BE
-3559088552,3559088559,GB
-3559088560,3559088919,BE
-3559088920,3559088959,GB
-3559088960,3559089015,BE
-3559089016,3559089023,GB
-3559089024,3559089055,BE
+3559088372,3559088919,BE
+3559088920,3559088927,GB
+3559088928,3559089055,BE
 3559089056,3559089063,DE
-3559089064,3559089119,BE
-3559089120,3559089127,GB
-3559089128,3559089143,BE
+3559089064,3559089143,BE
 3559089144,3559089151,GB
 3559089152,3559089159,BE
-3559089160,3559089215,GB
-3559089216,3559089279,BE
-3559089280,3559089287,GB
-3559089288,3559089295,BE
-3559089296,3559089343,GB
+3559089160,3559089167,GB
+3559089168,3559089175,BE
+3559089176,3559089215,GB
+3559089216,3559089303,BE
+3559089304,3559089311,GB
+3559089312,3559089327,BE
+3559089328,3559089343,GB
 3559089344,3559089563,BE
-3559089564,3559089599,GB
+3559089564,3559089567,GB
+3559089568,3559089583,BE
+3559089584,3559089599,GB
 3559089600,3559089607,BE
 3559089608,3559089611,GB
 3559089612,3559089663,BE
 3559089664,3559089919,GB
 3559089920,3559089983,BE
-3559089984,3559090071,GB
+3559089984,3559090047,GB
+3559090048,3559090071,BE
 3559090072,3559090079,NL
-3559090080,3559090191,GB
-3559090192,3559090199,BE
-3559090200,3559090207,GB
-3559090208,3559090215,BE
-3559090216,3559090239,GB
-3559090240,3559090367,BE
-3559090368,3559090399,GB
-3559090400,3559090415,BE
-3559090416,3559090431,GB
-3559090432,3559090503,BE
-3559090504,3559090511,GB
-3559090512,3559090519,BE
+3559090080,3559090175,BE
+3559090176,3559090191,GB
+3559090192,3559090223,BE
+3559090224,3559090239,GB
+3559090240,3559090519,BE
 3559090520,3559090527,GB
-3559090528,3559090559,BE
-3559090560,3559090567,GB
-3559090568,3559090615,BE
-3559090616,3559090623,GB
-3559090624,3559090719,BE
-3559090720,3559090751,GB
-3559090752,3559090759,BE
-3559090760,3559090767,GB
-3559090768,3559090783,BE
-3559090784,3559090791,GB
-3559090792,3559090815,BE
+3559090528,3559090815,BE
 3559090816,3559090823,GB
 3559090824,3559090895,BE
 3559090896,3559090899,GB
 3559090900,3559090919,BE
 3559090920,3559090927,GB
-3559090928,3559091047,BE
-3559091048,3559091055,GB
-3559091056,3559091095,BE
-3559091096,3559091103,GB
-3559091104,3559091111,BE
+3559090928,3559091111,BE
 3559091112,3559091115,GB
 3559091116,3559091131,BE
 3559091132,3559091151,GB
@@ -75417,18 +76498,18 @@
 3559091584,3559091615,GB
 3559091616,3559091631,BE
 3559091632,3559091635,GB
-3559091636,3559091775,BE
-3559091776,3559091823,GB
-3559091824,3559091855,BE
-3559091856,3559091871,GB
-3559091872,3559092159,BE
+3559091636,3559091791,BE
+3559091792,3559091807,GB
+3559091808,3559092159,BE
 3559092160,3559092160,GB
 3559092161,3559092222,BE
 3559092223,3559092223,GB
 3559092224,3559092239,BE
 3559092240,3559092247,GB
 3559092248,3559092287,BE
-3559092288,3559092351,GB
+3559092288,3559092295,GB
+3559092296,3559092311,BE
+3559092312,3559092351,GB
 3559092352,3559092367,BE
 3559092368,3559092383,GB
 3559092384,3559092447,BE
@@ -75465,13 +76546,9 @@
 3559093672,3559093675,GB
 3559093676,3559093679,BE
 3559093680,3559093695,GB
-3559093696,3559093703,BE
-3559093704,3559093711,GB
-3559093712,3559093759,BE
-3559093760,3559093983,GB
-3559093984,3559093999,BE
-3559094000,3559094015,GB
-3559094016,3559094071,BE
+3559093696,3559093759,BE
+3559093760,3559093975,GB
+3559093976,3559094071,BE
 3559094072,3559094079,GB
 3559094080,3559094087,BE
 3559094088,3559094095,GB
@@ -75506,13 +76583,13 @@
 3559095648,3559095767,BE
 3559095768,3559095775,GB
 3559095776,3559096087,BE
-3559096088,3559096107,GB
-3559096108,3559096123,BE
+3559096088,3559096103,GB
+3559096104,3559096123,BE
 3559096124,3559096127,GB
-3559096128,3559096199,BE
-3559096200,3559096223,GB
-3559096224,3559096239,BE
-3559096240,3559096251,GB
+3559096128,3559096215,BE
+3559096216,3559096223,NL
+3559096224,3559096247,BE
+3559096248,3559096251,GB
 3559096252,3559096255,BE
 3559096256,3559096319,GB
 3559096320,3559103231,RO
@@ -75591,8 +76668,8 @@
 3559491232,3559491263,ES
 3559491264,3559491447,NL
 3559491448,3559491455,ES
-3559491456,3559491759,NL
-3559491760,3559491771,ES
+3559491456,3559491767,NL
+3559491768,3559491771,ES
 3559491772,3559491839,NL
 3559491840,3559491871,ES
 3559491872,3559491903,GB
@@ -75692,9 +76769,7 @@
 3559981056,3559989247,EE
 3559989248,3559997439,PL
 3560005632,3560013823,RU
-3560013824,3560022975,ES
-3560022976,3560022991,IT
-3560022992,3560030207,ES
+3560013824,3560030207,ES
 3560030208,3560046591,GB
 3560046592,3560054783,BG
 3560054784,3560062975,TR
@@ -75735,7 +76810,11 @@
 3560341504,3560349695,PT
 3560349696,3560357887,GB
 3560357888,3560366079,GR
-3560366080,3560374271,CH
+3560366080,3560366687,CH
+3560366688,3560366695,IT
+3560366696,3560366703,CH
+3560366704,3560366711,IT
+3560366712,3560374271,CH
 3560374272,3560382463,ES
 3560382464,3560387103,FO
 3560387104,3560387111,DK
@@ -75794,9 +76873,7 @@
 3560842448,3560842455,RS
 3560842456,3560842751,CS
 3560842752,3560843007,RS
-3560843008,3560843071,CS
-3560843072,3560843135,RS
-3560843136,3560844031,CS
+3560843008,3560844031,CS
 3560844032,3560844223,RS
 3560844224,3560844227,CS
 3560844228,3560844287,RS
@@ -75808,7 +76885,9 @@
 3560844752,3560844759,RS
 3560844760,3560844767,CS
 3560844768,3560844775,RS
-3560844776,3560844875,CS
+3560844776,3560844799,CS
+3560844800,3560844863,RS
+3560844864,3560844875,CS
 3560844876,3560844879,RS
 3560844880,3560844895,CS
 3560844896,3560844899,RS
@@ -75837,8 +76916,8 @@
 3560845717,3560845717,CS
 3560845718,3560845718,RS
 3560845719,3560845759,CS
-3560845760,3560845763,RS
-3560845764,3560846079,CS
+3560845760,3560845775,RS
+3560845776,3560846079,CS
 3560846080,3560846087,RS
 3560846088,3560846351,CS
 3560846352,3560846367,RS
@@ -75855,9 +76934,10 @@
 3560848656,3560848671,CS
 3560848672,3560848679,RS
 3560848680,3560848695,CS
-3560848696,3560848895,RS
-3560848896,3560849407,CS
-3560849408,3560857599,DE
+3560848696,3560849407,RS
+3560849408,3560852911,DE
+3560852912,3560852919,TH
+3560852920,3560857599,DE
 3560857600,3560865791,SA
 3560865792,3560882175,FR
 3560882176,3560890367,DE
@@ -75868,6 +76948,7 @@
 3560916392,3560919047,DE
 3560919048,3560919055,CH
 3560919056,3560923135,DE
+3560923136,3560931327,ES
 3560931328,3560939523,DE
 3560939524,3560939527,AT
 3560939528,3560939535,DE
@@ -77835,19 +78916,26 @@
 3560947500,3560947686,JP
 3560947687,3560947687,DE
 3560947688,3560947711,JP
-3560947712,3560951195,SE
+3560947712,3560950863,SE
+3560950864,3560950867,DK
+3560950868,3560951039,SE
+3560951040,3560951043,NO
+3560951044,3560951195,SE
 3560951196,3560951199,DK
 3560951200,3560951207,SE
 3560951208,3560951211,DK
 3560951212,3560951383,SE
 3560951384,3560951387,NO
-3560951388,3560951423,SE
+3560951388,3560951391,SE
+3560951392,3560951395,IT
+3560951396,3560951423,SE
 3560951424,3560951427,NL
 3560951428,3560951447,SE
 3560951448,3560951451,FR
 3560951452,3560951551,SE
 3560951552,3560951555,ES
-3560951556,3560951583,SE
+3560951556,3560951559,NO
+3560951560,3560951583,SE
 3560951584,3560951587,FI
 3560951588,3560955903,SE
 3560955904,3560964095,BE
@@ -77875,11 +78963,7 @@
 3561152512,3561160703,IT
 3561160704,3561168895,RU
 3561168896,3561177087,FR
-3561177088,3561181215,CZ
-3561181216,3561181247,CA
-3561181248,3561181263,CZ
-3561181264,3561181271,DE
-3561181272,3561185279,CZ
+3561177088,3561185279,CZ
 3561185280,3561193471,GB
 3561193472,3561201663,PL
 3561201664,3561206655,NL
@@ -77912,7 +78996,9 @@
 3561414656,3561422847,IT
 3561422848,3561427207,BE
 3561427208,3561427211,NL
-3561427212,3561429279,BE
+3561427212,3561428135,BE
+3561428136,3561428143,NL
+3561428144,3561429279,BE
 3561429280,3561429287,NL
 3561429288,3561431039,BE
 3561431040,3561439231,SA
@@ -78004,11 +79090,13 @@
 3561611560,3561611567,FR
 3561611568,3561614175,GB
 3561614176,3561614199,FR
-3561614200,3561615359,GB
+3561614200,3561614335,GB
+3561614336,3561614591,FR
+3561614592,3561615359,GB
 3561615360,3561615615,FR
 3561615616,3561615871,IT
-3561615872,3561616447,FR
-3561616448,3561616511,GB
+3561615872,3561616383,FR
+3561616384,3561616511,GB
 3561616512,3561616543,FR
 3561616544,3561616559,GB
 3561616560,3561616575,FR
@@ -78085,17 +79173,25 @@
 3561922912,3561922975,NL
 3561922976,3561922991,GB
 3561922992,3561923015,NL
-3561923016,3561923071,GB
+3561923016,3561923063,GB
+3561923064,3561923067,NL
+3561923068,3561923071,GB
 3561923072,3561923551,NL
 3561923552,3561923583,GB
 3561923584,3561923679,NL
-3561923680,3561923847,GB
-3561923848,3561923855,NL
-3561923856,3561923871,GB
+3561923680,3561923871,GB
 3561923872,3561924159,NL
-3561924160,3561924207,GB
-3561924208,3561924215,NL
-3561924216,3561924703,GB
+3561924160,3561924199,GB
+3561924200,3561924215,NL
+3561924216,3561924223,GB
+3561924224,3561924351,NL
+3561924352,3561924639,GB
+3561924640,3561924647,NL
+3561924648,3561924663,GB
+3561924664,3561924671,NL
+3561924672,3561924679,GB
+3561924680,3561924687,NL
+3561924688,3561924703,GB
 3561924704,3561924719,NL
 3561924720,3561924911,GB
 3561924912,3561924943,NL
@@ -78105,8 +79201,8 @@
 3561925008,3561925039,NL
 3561925040,3561925087,GB
 3561925088,3561925103,NL
-3561925104,3561926911,GB
-3561926912,3561926975,NL
+3561925104,3561926943,GB
+3561926944,3561926975,NL
 3561926976,3561927167,GB
 3561927168,3561927423,NL
 3561927424,3561927551,GB
@@ -78124,19 +79220,21 @@
 3561930336,3561930503,GB
 3561930504,3561930511,NL
 3561930512,3561930751,GB
-3561930752,3561931519,DE
-3561931520,3561931967,SE
-3561931968,3561932031,DE
-3561932032,3561934591,SE
-3561934592,3561934847,DE
+3561930752,3561931647,DE
+3561931648,3561931711,SE
+3561931712,3561931791,DE
+3561931792,3561932031,SE
+3561932032,3561934847,DE
 3561934848,3561935359,SE
 3561935360,3561935871,DE
 3561935872,3561936127,SE
 3561936128,3561938175,DE
-3561938176,3561938559,SE
-3561938560,3561938687,DE
+3561938176,3561938431,SE
+3561938432,3561938687,DE
 3561938688,3561938943,SE
-3561938944,3561947135,IE
+3561938944,3561940991,IE
+3561940992,3561942015,GB
+3561942016,3561947135,IE
 3561947136,3561963519,DE
 3561963520,3561971711,BE
 3561971712,3561976831,TR
@@ -78162,6 +79260,7 @@
 3562012064,3562012479,NL
 3562012480,3562012483,KN
 3562012484,3562012671,NL
+3562012672,3562020863,IR
 3562020864,3562029055,UA
 3562029056,3562037247,CZ
 3562037248,3562045439,CH
@@ -78338,6 +79437,7 @@
 3563011840,3563012095,BY
 3563012096,3563020287,FR
 3563020288,3563028479,DE
+3563028480,3563036671,IR
 3563036672,3563044863,BG
 3563044864,3563053055,ES
 3563053056,3563053503,GB
@@ -78360,12 +79460,13 @@
 3563102208,3563110399,CZ
 3563110400,3563118591,RU
 3563118592,3563126783,DE
+3563126784,3563134975,KG
 3563134976,3563143167,IT
 3563143168,3563151359,GB
 3563151360,3563159551,DE
-3563159552,3563167487,DK
-3563167488,3563167503,SE
-3563167504,3563167743,DK
+3563159552,3563163647,DK
+3563163648,3563164159,SE
+3563164160,3563167743,DK
 3563167744,3563175935,ES
 3563175936,3563192319,DK
 3563192320,3563200511,TR
@@ -78403,6 +79504,7 @@
 3563413504,3563421695,TR
 3563421696,3563438079,CH
 3563438080,3563446271,DE
+3563446272,3563454463,LB
 3563454464,3563462655,SA
 3563462656,3563479039,IT
 3563479040,3563487231,GB
@@ -78572,10 +79674,8 @@
 3563850816,3563850831,ES
 3563850832,3563850847,NL
 3563850848,3563850879,ES
-3563850880,3563851199,NL
-3563851200,3563851263,ES
-3563851264,3563851775,US
-3563851776,3563852095,ES
+3563850880,3563851839,NL
+3563851840,3563852095,ES
 3563852096,3563852191,NL
 3563852192,3563852207,GB
 3563852208,3563852216,NL
@@ -78592,8 +79692,8 @@
 3563854176,3563854239,ES
 3563854240,3563854259,NL
 3563854260,3563854591,ES
-3563854592,3563855103,NL
-3563855104,3563855359,ES
+3563854592,3563854847,NL
+3563854848,3563855359,ES
 3563855360,3563855487,NL
 3563855488,3563855551,ES
 3563855552,3563855583,NL
@@ -78715,8 +79815,8 @@
 3564344000,3564344031,GB
 3564344032,3564344231,NL
 3564344232,3564344239,GB
-3564344240,3564344255,NL
-3564344256,3564344575,GB
+3564344240,3564344247,NL
+3564344248,3564344575,GB
 3564344576,3564344831,NL
 3564344832,3564344895,GB
 3564344896,3564344959,NL
@@ -78832,15 +79932,7 @@
 3564453888,3564462079,DE
 3564462080,3564470271,CH
 3564470272,3564478463,IL
-3564478464,3564484607,LU
-3564484608,3564484640,AL
-3564484641,3564484863,LU
-3564484864,3564485119,RU
-3564485120,3564485631,LU
-3564485632,3564485887,BZ
-3564485888,3564486143,LU
-3564486144,3564486399,IT
-3564486400,3564486655,LU
+3564478464,3564486655,LU
 3564486656,3564494847,CH
 3564494848,3564494907,GB
 3564494908,3564494911,FR
@@ -78893,8 +79985,8 @@
 3564560640,3564560927,GB
 3564560928,3564560959,US
 3564560960,3564561039,GB
-3564561040,3564561087,US
-3564561088,3564561151,GB
+3564561040,3564561055,US
+3564561056,3564561151,GB
 3564561152,3564561407,US
 3564561408,3564561663,GB
 3564561664,3564561791,US
@@ -78920,8 +80012,8 @@
 3564567248,3564567255,US
 3564567256,3564567295,GB
 3564567296,3564567423,US
-3564567424,3564567551,GB
-3564567552,3564567935,US
+3564567424,3564567807,GB
+3564567808,3564567935,US
 3564567936,3564568039,GB
 3564568040,3564568183,US
 3564568184,3564568223,GB
@@ -79007,8 +80099,8 @@
 3564736960,3564736967,DE
 3564736968,3564736975,GB
 3564736976,3564736991,DE
-3564736992,3564737007,GB
-3564737008,3564737535,DE
+3564736992,3564737023,GB
+3564737024,3564737535,DE
 3564737536,3564737791,GB
 3564737792,3564738047,DE
 3564738048,3564738303,GB
@@ -79019,10 +80111,8 @@
 3564739392,3564739455,DE
 3564739456,3564739503,GB
 3564739504,3564739519,DE
-3564739520,3564739567,GB
-3564739568,3564739583,DE
-3564739584,3564739799,GB
-3564739800,3564739815,DE
+3564739520,3564739807,GB
+3564739808,3564739815,DE
 3564739816,3564739823,GB
 3564739824,3564740351,DE
 3564740352,3564740383,GB
@@ -79040,7 +80130,9 @@
 3564740544,3564740575,GB
 3564740576,3564740591,DE
 3564740592,3564740595,GB
-3564740596,3564740607,DE
+3564740596,3564740599,DE
+3564740600,3564740603,GB
+3564740604,3564740607,DE
 3564740608,3564748799,FR
 3564748800,3564756991,GB
 3564756992,3564765183,ES
@@ -79059,8 +80151,8 @@
 3564862872,3564863487,DE
 3564863488,3564880895,NL
 3564880896,3564880911,GB
-3564880912,3564880919,NL
-3564880920,3564880943,GB
+3564880912,3564880935,NL
+3564880936,3564880943,GB
 3564880944,3564880951,NL
 3564880952,3564880975,GB
 3564880976,3564880991,NL
@@ -79126,7 +80218,9 @@
 3564885008,3564885023,NL
 3564885024,3564885087,GB
 3564885088,3564885135,NL
-3564885136,3564885343,GB
+3564885136,3564885215,GB
+3564885216,3564885231,NL
+3564885232,3564885343,GB
 3564885344,3564885359,NL
 3564885360,3564885439,GB
 3564885440,3564885455,NL
@@ -79139,8 +80233,8 @@
 3564885696,3564885727,GB
 3564885728,3564885743,NL
 3564885744,3564885775,GB
-3564885776,3564885791,NL
-3564885792,3564885839,GB
+3564885776,3564885799,NL
+3564885800,3564885839,GB
 3564885840,3564885903,NL
 3564885904,3564885919,GB
 3564885920,3564885967,NL
@@ -79186,9 +80280,7 @@
 3564888816,3564888823,GB
 3564888824,3564888879,NL
 3564888880,3564888895,GB
-3564888896,3564888903,NL
-3564888904,3564888911,GB
-3564888912,3564888991,NL
+3564888896,3564888991,NL
 3564888992,3564889023,FR
 3564889024,3564889087,NL
 3564889088,3564889151,GB
@@ -79222,7 +80314,9 @@
 3564890704,3564890719,NL
 3564890720,3564890751,GB
 3564890752,3564890783,NL
-3564890784,3564892431,GB
+3564890784,3564890927,GB
+3564890928,3564890943,NL
+3564890944,3564892431,GB
 3564892432,3564892447,NL
 3564892448,3564892463,GB
 3564892464,3564892479,NL
@@ -79242,9 +80336,7 @@
 3564924672,3564929023,RU
 3564929024,3564937215,AT
 3564937216,3564941311,CS
-3564941312,3564942591,CS
-3564942592,3564942847,CS
-3564942848,3564945407,CS
+3564941312,3564945407,CS
 3564945408,3564947175,GB
 3564947176,3564947183,FR
 3564947184,3564948063,GB
@@ -79259,12 +80351,10 @@
 3564954140,3564954143,AT
 3564954144,3564954155,GB
 3564954156,3564954159,AT
-3564954160,3564954175,GB
+3564954160,3564954175,DE
 3564954176,3564954183,AT
 3564954184,3564954191,CH
-3564954192,3564954199,AT
-3564954200,3564954207,GB
-3564954208,3564954211,AT
+3564954192,3564954211,AT
 3564954212,3564954231,GB
 3564954232,3564954239,AT
 3564954240,3564954303,GB
@@ -79340,9 +80430,7 @@
 3564958016,3564958111,GB
 3564958112,3564958143,AT
 3564958144,3564958147,GB
-3564958148,3564958159,AT
-3564958160,3564958175,GB
-3564958176,3564958179,AT
+3564958148,3564958179,AT
 3564958180,3564958183,US
 3564958184,3564958191,AT
 3564958192,3564958207,GB
@@ -79355,9 +80443,11 @@
 3564958808,3564958815,AT
 3564958816,3564958816,GB
 3564958817,3564958847,AT
-3564958848,3564958912,GB
-3564958913,3564958943,AT
-3564958944,3564959008,GB
+3564958848,3564958911,GB
+3564958912,3564958943,AT
+3564958944,3564958975,GB
+3564958976,3564959007,NL
+3564959008,3564959008,GB
 3564959009,3564959039,AT
 3564959040,3564959075,GB
 3564959076,3564959091,AT
@@ -79384,9 +80474,7 @@
 3564959480,3564959487,GB
 3564959488,3564959495,AT
 3564959496,3564959499,GB
-3564959500,3564959503,AT
-3564959504,3564959511,GB
-3564959512,3564959519,AT
+3564959500,3564959519,AT
 3564959520,3564959535,GB
 3564959536,3564959551,AT
 3564959552,3564959567,GB
@@ -79726,9 +80814,7 @@
 3566862336,3566895103,TR
 3566895104,3566897279,KZ
 3566897280,3566897311,KG
-3566897312,3566905939,KZ
-3566905940,3566905943,DE
-3566905944,3566927871,KZ
+3566897312,3566927871,KZ
 3566927872,3566960127,FR
 3566960128,3566960143,GB
 3566960144,3566993407,FR
@@ -79821,8 +80907,8 @@
 3567387472,3567387539,DE
 3567387540,3567387543,GB
 3567387544,3567387547,DE
-3567387548,3567387567,GB
-3567387568,3567388031,DE
+3567387548,3567387583,GB
+3567387584,3567388031,DE
 3567388032,3567388159,GB
 3567388160,3567388399,DE
 3567388400,3567388415,GB
@@ -79879,9 +80965,7 @@
 3567401504,3567401519,DE
 3567401520,3567401543,GB
 3567401544,3567401551,DE
-3567401552,3567401583,GB
-3567401584,3567401599,DE
-3567401600,3567401727,GB
+3567401552,3567401727,GB
 3567401728,3567402367,DE
 3567402368,3567402495,GB
 3567402496,3567403007,DE
@@ -80085,8 +81169,8 @@
 3568946672,3568959487,DE
 3568959488,3569025023,AT
 3569025024,3569057791,NL
-3569057792,3569068031,GB
-3569068032,3569068543,DE
+3569057792,3569068415,GB
+3569068416,3569068543,DE
 3569068544,3569068671,BG
 3569068672,3569068951,GB
 3569068952,3569068991,DE
@@ -80140,9 +81224,7 @@
 3569252992,3569253007,LU
 3569253008,3569253095,BE
 3569253096,3569253103,LU
-3569253104,3569253311,BE
-3569253312,3569253343,LU
-3569253344,3569254911,BE
+3569253104,3569254911,BE
 3569254912,3569254959,LU
 3569254960,3569255007,BE
 3569255008,3569255055,LU
@@ -80161,12 +81243,10 @@
 3569271912,3569271919,DE
 3569271920,3569271935,BE
 3569271936,3569271943,IT
-3569271944,3569271959,BE
-3569271960,3569271963,LU
-3569271964,3569272063,BE
+3569271944,3569272063,BE
 3569272064,3569272079,LU
-3569272080,3569272223,BE
-3569272224,3569272255,LU
+3569272080,3569272239,BE
+3569272240,3569272255,LU
 3569272256,3569273167,BE
 3569273168,3569273183,LU
 3569273184,3569273791,BE
@@ -80495,15 +81575,15 @@
 3569896104,3569896111,RS
 3569896112,3569896143,CS
 3569896144,3569896155,RS
-3569896156,3569896395,CS
-3569896396,3569896415,RS
-3569896416,3569896447,CS
+3569896156,3569896447,CS
 3569896448,3569896703,CS
 3569896704,3569898495,CS
 3569898496,3569899007,CS
 3569899008,3569899775,CS
 3569899776,3569900031,RS
-3569900032,3569902847,CS
+3569900032,3569900319,CS
+3569900320,3569900543,RS
+3569900544,3569902847,CS
 3569902848,3569903359,RS
 3569903360,3569903999,CS
 3569904000,3569904127,RS
@@ -80519,7 +81599,9 @@
 3569907724,3569907731,RS
 3569907732,3569907787,CS
 3569907788,3569907791,RS
-3569907792,3569907847,CS
+3569907792,3569907799,CS
+3569907800,3569907807,RS
+3569907808,3569907847,CS
 3569907848,3569907855,RS
 3569907856,3569907911,CS
 3569907912,3569907927,RS
@@ -80533,15 +81615,17 @@
 3569912752,3569912831,RS
 3569912832,3569913599,CS
 3569913600,3569913607,RS
-3569913608,3569913711,CS
+3569913608,3569913655,CS
+3569913656,3569913663,RS
+3569913664,3569913711,CS
 3569913712,3569913719,RS
 3569913720,3569914015,CS
 3569914016,3569914047,RS
 3569914048,3569914191,CS
 3569914192,3569914239,RS
 3569914240,3569914351,CS
-3569914352,3569914367,RS
-3569914368,3569914623,CS
+3569914352,3569914495,RS
+3569914496,3569914623,CS
 3569914624,3569914879,RS
 3569914880,3569915831,CS
 3569915832,3569915839,RS
@@ -80549,7 +81633,9 @@
 3569916332,3569916335,RS
 3569916336,3569916671,CS
 3569916672,3569916735,RS
-3569916736,3569918847,CS
+3569916736,3569918463,CS
+3569918464,3569918719,RS
+3569918720,3569918847,CS
 3569918848,3569918855,RS
 3569918856,3569918863,CS
 3569918864,3569918951,RS
@@ -80637,9 +81723,7 @@
 3571321056,3571321087,GB
 3571321088,3571326255,DE
 3571326256,3571326259,BE
-3571326260,3571337471,DE
-3571337472,3571337599,NL
-3571337600,3571343495,DE
+3571326260,3571343495,DE
 3571343496,3571343503,ES
 3571343504,3571347455,DE
 3571347456,3571347711,BE
@@ -80680,7 +81764,9 @@
 3571456576,3571456591,GB
 3571456592,3571472383,DE
 3571472384,3571472639,NL
-3571472640,3571481599,DE
+3571472640,3571481343,DE
+3571481344,3571481359,AT
+3571481360,3571481599,DE
 3571481600,3571481855,NL
 3571481856,3571482367,DE
 3571482368,3571482623,CH
@@ -80698,7 +81784,11 @@
 3571979008,3572006911,AT
 3572006912,3572039679,CH
 3572039680,3572047871,BE
-3572047872,3572056063,LU
+3572047872,3572049407,LU
+3572049408,3572050687,BE
+3572050688,3572051711,LU
+3572051712,3572051967,BE
+3572051968,3572056063,LU
 3572056064,3572072447,RU
 3572072448,3572105215,BG
 3572105216,3572148223,FR
@@ -80799,14 +81889,13 @@
 3574155852,3574155855,NO
 3574155856,3574155859,DE
 3574155860,3574155863,NO
-3574155864,3574155983,DE
-3574155984,3574155987,AT
-3574155988,3574157551,DE
+3574155864,3574157551,DE
 3574157552,3574157559,AT
 3574157560,3574159871,DE
 3574159872,3574159875,GB
-3574159876,3574159879,NL
-3574159880,3574160931,DE
+3574159876,3574159919,DE
+3574159920,3574159927,NL
+3574159928,3574160931,DE
 3574160932,3574160935,NL
 3574160936,3574160959,DE
 3574160960,3574161023,GB
@@ -80818,7 +81907,12 @@
 3574161108,3574161111,NL
 3574161112,3574161171,DE
 3574161172,3574161175,NO
-3574161176,3574161383,DE
+3574161176,3574161319,DE
+3574161320,3574161323,NO
+3574161324,3574161335,DE
+3574161336,3574161339,AI
+3574161340,3574161343,AT
+3574161344,3574161383,DE
 3574161384,3574161387,GB
 3574161388,3574169599,DE
 3574169600,3574202367,ES
@@ -80875,7 +81969,9 @@
 3574825408,3574825471,GB
 3574825472,3574826111,NL
 3574826112,3574826239,GB
-3574826240,3574829823,NL
+3574826240,3574829055,NL
+3574829056,3574829567,GB
+3574829568,3574829823,NL
 3574829824,3574830079,GB
 3574830080,3574831359,NL
 3574831360,3574833279,GB
@@ -80889,14 +81985,12 @@
 3574834176,3574834431,GB
 3574834432,3574834559,NL
 3574834560,3574834687,GB
-3574834688,3574836223,NL
-3574836224,3574836351,GB
+3574834688,3574835199,NL
+3574835200,3574836351,GB
 3574836352,3574838015,NL
 3574838016,3574838271,GB
 3574838272,3574838527,NL
-3574838528,3574839807,GB
-3574839808,3574841343,NL
-3574841344,3574857727,GB
+3574838528,3574857727,GB
 3574857728,3574917375,DE
 3574917376,3574917631,CH
 3574917632,3574919359,DE
@@ -81046,7 +82140,9 @@
 3575631104,3575631111,AT
 3575631112,3575631119,CH
 3575631120,3575631127,DE
-3575631128,3575631183,BE
+3575631128,3575631135,BE
+3575631136,3575631143,HU
+3575631144,3575631183,BE
 3575631184,3575631199,HU
 3575631200,3575631207,IE
 3575631208,3575631231,BE
@@ -81187,7 +82283,9 @@
 3575636880,3575636895,BE
 3575636896,3575636903,PL
 3575636904,3575636911,CZ
-3575636912,3575636983,BE
+3575636912,3575636927,BE
+3575636928,3575636959,DE
+3575636960,3575636983,BE
 3575636984,3575636991,FR
 3575636992,3575637039,BE
 3575637040,3575637055,DE
@@ -81432,8 +82530,8 @@
 3576237056,3576237063,FR
 3576237064,3576237071,GB
 3576237072,3576237087,FR
-3576237088,3576237135,GB
-3576237136,3576237215,FR
+3576237088,3576237119,GB
+3576237120,3576237215,FR
 3576237216,3576237279,GB
 3576237280,3576237455,FR
 3576237456,3576237503,GB
@@ -81456,24 +82554,20 @@
 3576238016,3576238143,FR
 3576238144,3576238159,GB
 3576238160,3576238271,FR
-3576238272,3576238287,GB
-3576238288,3576238303,FR
-3576238304,3576238335,GB
+3576238272,3576238335,GB
 3576238336,3576238447,FR
 3576238448,3576238463,GB
 3576238464,3576238511,FR
 3576238512,3576238527,GB
 3576238528,3576238559,FR
-3576238560,3576238591,GB
-3576238592,3576238607,FR
+3576238560,3576238575,GB
+3576238576,3576238607,FR
 3576238608,3576238623,GB
 3576238624,3576238639,FR
-3576238640,3576238719,GB
-3576238720,3576238847,FR
-3576238848,3576238911,GB
+3576238640,3576238911,GB
 3576238912,3576238927,FR
-3576238928,3576238959,GB
-3576238960,3576239007,FR
+3576238928,3576238975,GB
+3576238976,3576239007,FR
 3576239008,3576239023,GB
 3576239024,3576239039,FR
 3576239040,3576239071,GB
@@ -81525,18 +82619,14 @@
 3576253160,3576253183,GB
 3576253184,3576254479,FR
 3576254480,3576254495,GB
-3576254496,3576254511,FR
-3576254512,3576254527,GB
-3576254528,3576254551,FR
+3576254496,3576254551,FR
 3576254552,3576254559,GB
 3576254560,3576254575,FR
 3576254576,3576254615,GB
 3576254616,3576254623,FR
 3576254624,3576254639,GB
 3576254640,3576254647,FR
-3576254648,3576254663,GB
-3576254664,3576254671,FR
-3576254672,3576254679,GB
+3576254648,3576254679,GB
 3576254680,3576254695,FR
 3576254696,3576254711,GB
 3576254712,3576254767,FR
@@ -81552,16 +82642,14 @@
 3576255200,3576255215,FR
 3576255216,3576255263,GB
 3576255264,3576255319,FR
-3576255320,3576255359,GB
-3576255360,3576255375,FR
+3576255320,3576255327,GB
+3576255328,3576255375,FR
 3576255376,3576255383,GB
 3576255384,3576255407,FR
 3576255408,3576255423,GB
 3576255424,3576255431,FR
 3576255432,3576255439,GB
-3576255440,3576255447,FR
-3576255448,3576255455,GB
-3576255456,3576255503,FR
+3576255440,3576255503,FR
 3576255504,3576255511,GB
 3576255512,3576255519,FR
 3576255520,3576255527,GB
@@ -81582,9 +82670,7 @@
 3576255872,3576255887,FR
 3576255888,3576255935,GB
 3576255936,3576255943,FR
-3576255944,3576255951,GB
-3576255952,3576255975,FR
-3576255976,3576256047,GB
+3576255944,3576256047,GB
 3576256048,3576256111,FR
 3576256112,3576256143,GB
 3576256144,3576256239,FR
@@ -81621,9 +82707,7 @@
 3576257328,3576257359,GB
 3576257360,3576257367,FR
 3576257368,3576257375,GB
-3576257376,3576257455,FR
-3576257456,3576257471,GB
-3576257472,3576257487,FR
+3576257376,3576257487,FR
 3576257488,3576257495,GB
 3576257496,3576257503,FR
 3576257504,3576257535,GB
@@ -81638,8 +82722,8 @@
 3576257840,3576257855,FR
 3576257856,3576257871,GB
 3576257872,3576257887,FR
-3576257888,3576257895,GB
-3576257896,3576257983,FR
+3576257888,3576257903,GB
+3576257904,3576257983,FR
 3576257984,3576257999,GB
 3576258000,3576258055,FR
 3576258056,3576258063,GB
@@ -81669,8 +82753,10 @@
 3576258864,3576258895,GB
 3576258896,3576258911,FR
 3576258912,3576258927,GB
-3576258928,3576259031,FR
-3576259032,3576259087,GB
+3576258928,3576259023,FR
+3576259024,3576259039,GB
+3576259040,3576259071,FR
+3576259072,3576259087,GB
 3576259088,3576259103,FR
 3576259104,3576259199,GB
 3576259200,3576259231,FR
@@ -81746,8 +82832,8 @@
 3576263624,3576263751,FR
 3576263752,3576263759,GB
 3576263760,3576263791,FR
-3576263792,3576263903,GB
-3576263904,3576263911,FR
+3576263792,3576263887,GB
+3576263888,3576263911,FR
 3576263912,3576263919,GB
 3576263920,3576264303,FR
 3576264304,3576264311,GB
@@ -81760,17 +82846,19 @@
 3576264560,3576264575,FR
 3576264576,3576264607,GB
 3576264608,3576264639,FR
-3576264640,3576264703,GB
-3576264704,3576265311,FR
+3576264640,3576264687,GB
+3576264688,3576265311,FR
 3576265312,3576265319,GB
-3576265320,3576265343,FR
-3576265344,3576265359,GB
-3576265360,3576265407,FR
-3576265408,3576265415,GB
-3576265416,3576265831,FR
+3576265320,3576265399,FR
+3576265400,3576265415,GB
+3576265416,3576265463,FR
+3576265464,3576265471,GB
+3576265472,3576265807,FR
+3576265808,3576265823,GB
+3576265824,3576265831,FR
 3576265832,3576265839,GB
-3576265840,3576265855,FR
-3576265856,3576265863,GB
+3576265840,3576265847,FR
+3576265848,3576265863,GB
 3576265864,3576265879,FR
 3576265880,3576265895,GB
 3576265896,3576265911,FR
@@ -81807,8 +82895,8 @@
 3576622336,3576622591,GB
 3576622592,3576623871,NL
 3576623872,3576624127,AT
-3576624128,3576627199,NL
-3576627200,3576692735,AT
+3576624128,3576626943,NL
+3576626944,3576692735,AT
 3576692736,3576758271,GB
 3576758272,3576823807,BE
 3576823808,3576889343,SE
@@ -81834,7 +82922,9 @@
 3577545796,3577545799,GB
 3577545800,3577545863,DE
 3577545864,3577545871,US
-3577545872,3577545983,DE
+3577545872,3577545903,DE
+3577545904,3577545919,GB
+3577545920,3577545983,DE
 3577545984,3577546111,SE
 3577546112,3577546143,DE
 3577546144,3577546151,GB
@@ -81872,8 +82962,8 @@
 3577549824,3577550847,DE
 3577550848,3577550983,GB
 3577550984,3577551047,DE
-3577551048,3577551063,GB
-3577551064,3577551087,DE
+3577551048,3577551055,GB
+3577551056,3577551087,DE
 3577551088,3577551095,GB
 3577551096,3577551103,DE
 3577551104,3577551111,GB
@@ -81891,8 +82981,8 @@
 3577551408,3577551411,US
 3577551412,3577551423,DE
 3577551424,3577551455,GB
-3577551456,3577552159,DE
-3577552160,3577552183,GB
+3577551456,3577552151,DE
+3577552152,3577552183,GB
 3577552184,3577552191,DE
 3577552192,3577552199,GB
 3577552200,3577552215,DE
@@ -81900,19 +82990,19 @@
 3577552224,3577552239,DE
 3577552240,3577552247,GB
 3577552248,3577552255,DE
-3577552256,3577552263,GB
-3577552264,3577552287,DE
-3577552288,3577552295,GB
-3577552296,3577552399,DE
+3577552256,3577552271,GB
+3577552272,3577552319,DE
+3577552320,3577552359,GB
+3577552360,3577552367,DE
+3577552368,3577552383,GB
+3577552384,3577552399,DE
 3577552400,3577552447,GB
-3577552448,3577552919,DE
-3577552920,3577552927,GB
-3577552928,3577552959,DE
+3577552448,3577552959,DE
 3577552960,3577552967,GB
-3577552968,3577552975,DE
-3577552976,3577552991,GB
-3577552992,3577553007,DE
-3577553008,3577553023,GB
+3577552968,3577552983,DE
+3577552984,3577552991,GB
+3577552992,3577553015,DE
+3577553016,3577553023,GB
 3577553024,3577553103,DE
 3577553104,3577553119,GB
 3577553120,3577553191,DE
@@ -81922,11 +83012,13 @@
 3577553408,3577553503,DE
 3577553504,3577553575,GB
 3577553576,3577553583,DE
-3577553584,3577553607,GB
-3577553608,3577553623,DE
+3577553584,3577553615,GB
+3577553616,3577553623,DE
 3577553624,3577553663,GB
 3577553664,3577553983,DE
-3577553984,3577554463,GB
+3577553984,3577554047,GB
+3577554048,3577554175,DE
+3577554176,3577554463,GB
 3577554464,3577554467,DE
 3577554468,3577554483,GB
 3577554484,3577554487,DE
@@ -81944,13 +83036,19 @@
 3577557104,3577557215,DE
 3577557216,3577557231,US
 3577557232,3577557247,GB
-3577557248,3577558783,DE
+3577557248,3577558143,DE
+3577558144,3577558207,GB
+3577558208,3577558359,DE
+3577558360,3577558367,GB
+3577558368,3577558383,DE
+3577558384,3577558391,GB
+3577558392,3577558431,DE
+3577558432,3577558439,GB
+3577558440,3577558783,DE
 3577558784,3577559167,GB
 3577559168,3577559183,DE
 3577559184,3577559199,GB
-3577559200,3577559215,DE
-3577559216,3577559223,GB
-3577559224,3577559231,DE
+3577559200,3577559231,DE
 3577559232,3577559247,GB
 3577559248,3577559279,DE
 3577559280,3577559303,GB
@@ -81962,9 +83060,7 @@
 3577559384,3577559391,GB
 3577559392,3577559399,DE
 3577559400,3577559407,GB
-3577559408,3577559415,DE
-3577559416,3577559423,GB
-3577559424,3577559431,DE
+3577559408,3577559431,DE
 3577559432,3577559447,GB
 3577559448,3577559455,DE
 3577559456,3577559463,GB
@@ -81976,24 +83072,36 @@
 3577559536,3577559543,GB
 3577559544,3577559559,DE
 3577559560,3577559567,GB
-3577559568,3577559663,DE
+3577559568,3577559607,DE
+3577559608,3577559615,GB
+3577559616,3577559663,DE
 3577559664,3577559671,GB
 3577559672,3577559679,DE
 3577559680,3577559687,GB
-3577559688,3577559751,DE
-3577559752,3577559759,GB
-3577559760,3577559815,DE
+3577559688,3577559815,DE
 3577559816,3577559823,GB
-3577559824,3577559951,DE
-3577559952,3577559959,GB
-3577559960,3577559983,DE
+3577559824,3577559983,DE
 3577559984,3577559999,GB
 3577560000,3577560063,DE
 3577560064,3577560079,GB
-3577560080,3577560087,DE
-3577560088,3577560103,GB
+3577560080,3577560095,DE
+3577560096,3577560103,GB
 3577560104,3577560111,DE
-3577560112,3577560575,GB
+3577560112,3577560167,GB
+3577560168,3577560175,DE
+3577560176,3577560271,GB
+3577560272,3577560287,DE
+3577560288,3577560295,GB
+3577560296,3577560343,DE
+3577560344,3577560351,GB
+3577560352,3577560447,DE
+3577560448,3577560463,GB
+3577560464,3577560479,DE
+3577560480,3577560487,GB
+3577560488,3577560495,DE
+3577560496,3577560511,GB
+3577560512,3577560559,DE
+3577560560,3577560575,GB
 3577560576,3577561087,DE
 3577561088,3577561127,GB
 3577561128,3577561131,DE
@@ -82006,31 +83114,35 @@
 3577561324,3577561327,GB
 3577561328,3577561331,DE
 3577561332,3577561595,GB
-3577561596,3577561639,DE
-3577561640,3577561647,GB
-3577561648,3577561767,DE
-3577561768,3577561775,GB
-3577561776,3577561791,DE
-3577561792,3577561855,GB
-3577561856,3577561863,DE
-3577561864,3577561879,GB
-3577561880,3577561887,DE
-3577561888,3577561903,GB
-3577561904,3577562087,DE
+3577561596,3577561623,DE
+3577561624,3577561631,GB
+3577561632,3577561679,DE
+3577561680,3577561687,GB
+3577561688,3577561695,DE
+3577561696,3577561703,GB
+3577561704,3577561711,DE
+3577561712,3577561719,GB
+3577561720,3577561791,DE
+3577561792,3577561823,GB
+3577561824,3577561839,DE
+3577561840,3577561855,GB
+3577561856,3577562087,DE
 3577562088,3577562095,GB
 3577562096,3577562103,DE
 3577562104,3577562111,GB
 3577562112,3577562391,DE
-3577562392,3577562415,GB
-3577562416,3577562439,DE
-3577562440,3577562447,GB
-3577562448,3577562455,DE
-3577562456,3577562471,GB
+3577562392,3577562399,GB
+3577562400,3577562415,DE
+3577562416,3577562423,GB
+3577562424,3577562431,DE
+3577562432,3577562439,GB
+3577562440,3577562463,DE
+3577562464,3577562471,GB
 3577562472,3577562479,DE
-3577562480,3577562495,GB
-3577562496,3577562511,DE
-3577562512,3577562519,GB
-3577562520,3577562535,DE
+3577562480,3577562487,GB
+3577562488,3577562511,DE
+3577562512,3577562527,GB
+3577562528,3577562535,DE
 3577562536,3577562551,GB
 3577562552,3577562559,DE
 3577562560,3577562623,GB
@@ -82040,7 +83152,9 @@
 3577563000,3577563007,GB
 3577563008,3577563015,DE
 3577563016,3577563135,GB
-3577563136,3577563295,DE
+3577563136,3577563279,DE
+3577563280,3577563287,GB
+3577563288,3577563295,DE
 3577563296,3577563311,GB
 3577563312,3577563327,DE
 3577563328,3577563359,GB
@@ -82049,26 +83163,28 @@
 3577563384,3577563919,DE
 3577563920,3577563927,GB
 3577563928,3577563935,DE
-3577563936,3577563967,GB
-3577563968,3577563983,DE
+3577563936,3577563943,GB
+3577563944,3577563983,DE
 3577563984,3577564031,GB
 3577564032,3577564039,DE
 3577564040,3577564043,GB
-3577564044,3577564079,DE
-3577564080,3577564087,GB
-3577564088,3577564111,DE
+3577564044,3577564087,DE
+3577564088,3577564095,GB
+3577564096,3577564111,DE
 3577564112,3577564119,GB
-3577564120,3577564303,DE
-3577564304,3577564319,GB
-3577564320,3577564327,DE
-3577564328,3577564335,GB
-3577564336,3577564359,DE
-3577564360,3577564383,GB
+3577564120,3577564191,DE
+3577564192,3577564303,GB
+3577564304,3577564359,DE
+3577564360,3577564367,GB
+3577564368,3577564375,DE
+3577564376,3577564383,GB
 3577564384,3577564575,DE
 3577564576,3577564583,GB
-3577564584,3577564591,DE
-3577564592,3577564599,GB
-3577564600,3577564927,DE
+3577564584,3577564599,DE
+3577564600,3577564607,GB
+3577564608,3577564655,DE
+3577564656,3577564663,GB
+3577564664,3577564927,DE
 3577564928,3577565227,GB
 3577565228,3577565255,DE
 3577565256,3577565259,GB
@@ -82097,9 +83213,9 @@
 3577565968,3577565975,DE
 3577565976,3577565999,GB
 3577566000,3577566007,DE
-3577566008,3577566071,GB
-3577566072,3577566079,DE
-3577566080,3577566103,GB
+3577566008,3577566063,GB
+3577566064,3577566087,DE
+3577566088,3577566103,GB
 3577566104,3577566119,DE
 3577566120,3577566135,GB
 3577566136,3577566143,DE
@@ -82126,7 +83242,9 @@
 3577567168,3577567199,GB
 3577567200,3577567495,DE
 3577567496,3577567503,GB
-3577567504,3577567615,DE
+3577567504,3577567511,DE
+3577567512,3577567519,GB
+3577567520,3577567615,DE
 3577567616,3577567623,GB
 3577567624,3577567639,DE
 3577567640,3577567647,GB
@@ -82144,7 +83262,11 @@
 3577568528,3577569279,GB
 3577569280,3577569383,DE
 3577569384,3577569391,GB
-3577569392,3577569499,DE
+3577569392,3577569407,DE
+3577569408,3577569431,GB
+3577569432,3577569439,DE
+3577569440,3577569471,GB
+3577569472,3577569499,DE
 3577569500,3577569503,GB
 3577569504,3577569519,DE
 3577569520,3577569535,GB
@@ -82152,23 +83274,47 @@
 3577569856,3577569863,GB
 3577569864,3577569887,DE
 3577569888,3577569895,GB
-3577569896,3577570159,DE
+3577569896,3577569911,DE
+3577569912,3577569919,GB
+3577569920,3577569999,DE
+3577570000,3577570015,GB
+3577570016,3577570159,DE
 3577570160,3577570167,GB
 3577570168,3577570367,DE
 3577570368,3577570559,GB
 3577570560,3577570703,DE
 3577570704,3577570707,GB
-3577570708,3577570847,DE
+3577570708,3577570783,DE
+3577570784,3577570791,GB
+3577570792,3577570847,DE
 3577570848,3577570855,GB
 3577570856,3577570911,DE
-3577570912,3577570943,GB
-3577570944,3577571695,DE
+3577570912,3577571007,GB
+3577571008,3577571327,DE
+3577571328,3577571343,GB
+3577571344,3577571359,DE
+3577571360,3577571391,GB
+3577571392,3577571399,DE
+3577571400,3577571407,GB
+3577571408,3577571695,DE
 3577571696,3577571703,GB
 3577571704,3577571791,DE
 3577571792,3577571839,GB
-3577571840,3577572463,DE
+3577571840,3577572095,DE
+3577572096,3577572415,GB
+3577572416,3577572463,DE
 3577572464,3577572471,GB
-3577572472,3577573051,DE
+3577572472,3577572487,DE
+3577572488,3577572495,GB
+3577572496,3577572607,DE
+3577572608,3577572863,GB
+3577572864,3577572927,DE
+3577572928,3577572935,GB
+3577572936,3577572943,DE
+3577572944,3577572959,GB
+3577572960,3577573039,DE
+3577573040,3577573047,GB
+3577573048,3577573051,DE
 3577573052,3577573055,GB
 3577573056,3577573071,DE
 3577573072,3577573079,GB
@@ -82178,11 +83324,15 @@
 3577573176,3577573183,GB
 3577573184,3577573191,DE
 3577573192,3577573207,GB
-3577573208,3577573439,DE
+3577573208,3577573287,DE
+3577573288,3577573295,GB
+3577573296,3577573439,DE
 3577573440,3577574399,GB
-3577574400,3577574479,DE
-3577574480,3577575175,GB
-3577575176,3577575191,DE
+3577574400,3577574407,DE
+3577574408,3577574415,GB
+3577574416,3577574479,DE
+3577574480,3577575183,GB
+3577575184,3577575191,DE
 3577575192,3577575431,GB
 3577575432,3577575583,DE
 3577575584,3577575599,GB
@@ -82198,7 +83348,9 @@
 3577577232,3577577247,US
 3577577248,3577577391,DE
 3577577392,3577577407,GB
-3577577408,3577577647,DE
+3577577408,3577577543,DE
+3577577544,3577577551,GB
+3577577552,3577577647,DE
 3577577648,3577577655,GB
 3577577656,3577577695,DE
 3577577696,3577577703,GB
@@ -82206,55 +83358,89 @@
 3577577744,3577577759,GB
 3577577760,3577577783,DE
 3577577784,3577577791,GB
-3577577792,3577577887,DE
-3577577888,3577577895,GB
-3577577896,3577577923,DE
-3577577924,3577577927,GB
-3577577928,3577577983,DE
-3577577984,3577578047,GB
-3577578048,3577579191,DE
+3577577792,3577577823,DE
+3577577824,3577577855,GB
+3577577856,3577577887,DE
+3577577888,3577577903,GB
+3577577904,3577577923,DE
+3577577924,3577577935,GB
+3577577936,3577578095,DE
+3577578096,3577578103,GB
+3577578104,3577579191,DE
 3577579192,3577579199,GB
 3577579200,3577579231,DE
 3577579232,3577579239,GB
-3577579240,3577579887,DE
-3577579888,3577579895,GB
-3577579896,3577580127,DE
+3577579240,3577579839,DE
+3577579840,3577579871,GB
+3577579872,3577579879,DE
+3577579880,3577579903,GB
+3577579904,3577580087,DE
+3577580088,3577580095,GB
+3577580096,3577580111,DE
+3577580112,3577580119,GB
+3577580120,3577580127,DE
 3577580128,3577580135,GB
 3577580136,3577580175,DE
 3577580176,3577580191,GB
-3577580192,3577580343,DE
-3577580344,3577580351,GB
+3577580192,3577580335,DE
+3577580336,3577580351,GB
 3577580352,3577580375,DE
 3577580376,3577580383,GB
 3577580384,3577580407,DE
 3577580408,3577580415,GB
-3577580416,3577580483,DE
+3577580416,3577580463,DE
+3577580464,3577580471,GB
+3577580472,3577580483,DE
 3577580484,3577580487,GB
-3577580488,3577580895,DE
-3577580896,3577580911,GB
-3577580912,3577581015,DE
-3577581016,3577581055,GB
+3577580488,3577580511,DE
+3577580512,3577580543,GB
+3577580544,3577580799,DE
+3577580800,3577580807,GB
+3577580808,3577580891,DE
+3577580892,3577580911,GB
+3577580912,3577580927,DE
+3577580928,3577580959,GB
+3577580960,3577581007,DE
+3577581008,3577581055,GB
 3577581056,3577581903,DE
 3577581904,3577581911,GB
 3577581912,3577581919,DE
 3577581920,3577581927,GB
 3577581928,3577582015,DE
 3577582016,3577582023,GB
-3577582024,3577582111,DE
+3577582024,3577582047,DE
+3577582048,3577582055,GB
+3577582056,3577582111,DE
 3577582112,3577582335,GB
 3577582336,3577582343,DE
 3577582344,3577582351,GB
-3577582352,3577582511,DE
+3577582352,3577582463,DE
+3577582464,3577582471,GB
+3577582472,3577582511,DE
 3577582512,3577582519,GB
-3577582520,3577583247,DE
+3577582520,3577582575,DE
+3577582576,3577582591,GB
+3577582592,3577582847,DE
+3577582848,3577583103,GB
+3577583104,3577583247,DE
 3577583248,3577583255,GB
-3577583256,3577584143,DE
+3577583256,3577583263,DE
+3577583264,3577583295,GB
+3577583296,3577583359,DE
+3577583360,3577583615,GB
+3577583616,3577584143,DE
 3577584144,3577584147,GB
-3577584148,3577584175,DE
-3577584176,3577584191,GB
-3577584192,3577584295,DE
+3577584148,3577584159,DE
+3577584160,3577584167,GB
+3577584168,3577584171,DE
+3577584172,3577584191,GB
+3577584192,3577584279,DE
+3577584280,3577584291,GB
+3577584292,3577584295,DE
 3577584296,3577584303,GB
-3577584304,3577584351,DE
+3577584304,3577584335,DE
+3577584336,3577584343,GB
+3577584344,3577584351,DE
 3577584352,3577584359,GB
 3577584360,3577584383,DE
 3577584384,3577584407,GB
@@ -82283,9 +83469,7 @@
 3577585616,3577585631,DE
 3577585632,3577585639,GB
 3577585640,3577585647,DE
-3577585648,3577585663,GB
-3577585664,3577585919,DE
-3577585920,3577586067,GB
+3577585648,3577586067,GB
 3577586068,3577586071,DE
 3577586072,3577586075,GB
 3577586076,3577586079,DE
@@ -82293,14 +83477,16 @@
 3577586084,3577586087,DE
 3577586088,3577586171,GB
 3577586172,3577586175,DE
-3577586176,3577586207,GB
-3577586208,3577586319,DE
+3577586176,3577586215,GB
+3577586216,3577586319,DE
 3577586320,3577586327,GB
-3577586328,3577586431,DE
-3577586432,3577586447,GB
-3577586448,3577586495,DE
-3577586496,3577586559,GB
-3577586560,3577586575,DE
+3577586328,3577586375,DE
+3577586376,3577586383,GB
+3577586384,3577586415,DE
+3577586416,3577586447,GB
+3577586448,3577586463,DE
+3577586464,3577586567,GB
+3577586568,3577586575,DE
 3577586576,3577586583,GB
 3577586584,3577586647,DE
 3577586648,3577586687,GB
@@ -82308,18 +83494,18 @@
 3577586712,3577586719,GB
 3577586720,3577586751,DE
 3577586752,3577586783,GB
-3577586784,3577587103,DE
+3577586784,3577587079,DE
+3577587080,3577587087,GB
+3577587088,3577587103,DE
 3577587104,3577587135,GB
-3577587136,3577587239,DE
+3577587136,3577587183,DE
+3577587184,3577587199,GB
+3577587200,3577587239,DE
 3577587240,3577587319,GB
 3577587320,3577587327,DE
-3577587328,3577587455,GB
-3577587456,3577587463,DE
-3577587464,3577587471,GB
+3577587328,3577587471,GB
 3577587472,3577587479,DE
-3577587480,3577587487,GB
-3577587488,3577587503,DE
-3577587504,3577587519,GB
+3577587480,3577587519,GB
 3577587520,3577587615,DE
 3577587616,3577587623,GB
 3577587624,3577587631,DE
@@ -82330,7 +83516,9 @@
 3577587848,3577587863,GB
 3577587864,3577587871,DE
 3577587872,3577587879,GB
-3577587880,3577588095,DE
+3577587880,3577587919,DE
+3577587920,3577587927,GB
+3577587928,3577588095,DE
 3577588096,3577588099,GB
 3577588100,3577588103,DE
 3577588104,3577588151,GB
@@ -82340,13 +83528,15 @@
 3577588512,3577588551,GB
 3577588552,3577588559,DE
 3577588560,3577588735,GB
-3577588736,3577588783,DE
+3577588736,3577588743,DE
+3577588744,3577588751,GB
+3577588752,3577588783,DE
 3577588784,3577588799,GB
 3577588800,3577588803,DE
 3577588804,3577588815,GB
 3577588816,3577588863,DE
-3577588864,3577588871,GB
-3577588872,3577589007,DE
+3577588864,3577588879,GB
+3577588880,3577589007,DE
 3577589008,3577589023,GB
 3577589024,3577589119,DE
 3577589120,3577589135,GB
@@ -82366,50 +83556,90 @@
 3577589556,3577589703,GB
 3577589704,3577589735,DE
 3577589736,3577589759,GB
-3577589760,3577590047,DE
+3577589760,3577590015,DE
+3577590016,3577590023,GB
+3577590024,3577590047,DE
 3577590048,3577590079,GB
-3577590080,3577590199,DE
+3577590080,3577590175,DE
+3577590176,3577590191,GB
+3577590192,3577590199,DE
 3577590200,3577590207,GB
 3577590208,3577590219,DE
 3577590220,3577590223,GB
-3577590224,3577590295,DE
+3577590224,3577590239,DE
+3577590240,3577590247,GB
+3577590248,3577590263,DE
+3577590264,3577590271,GB
+3577590272,3577590295,DE
 3577590296,3577590303,GB
-3577590304,3577590399,DE
+3577590304,3577590311,DE
+3577590312,3577590319,GB
+3577590320,3577590399,DE
 3577590400,3577590407,GB
 3577590408,3577590455,DE
-3577590456,3577590463,GB
-3577590464,3577590975,DE
-3577590976,3577591039,GB
-3577591040,3577591279,DE
-3577591280,3577591287,GB
+3577590456,3577590527,GB
+3577590528,3577590911,DE
+3577590912,3577590919,GB
+3577590920,3577590975,DE
+3577590976,3577591055,GB
+3577591056,3577591071,DE
+3577591072,3577591079,GB
+3577591080,3577591111,DE
+3577591112,3577591119,GB
+3577591120,3577591127,DE
+3577591128,3577591135,GB
+3577591136,3577591143,DE
+3577591144,3577591147,GB
+3577591148,3577591175,DE
+3577591176,3577591183,GB
+3577591184,3577591215,DE
+3577591216,3577591231,GB
+3577591232,3577591271,DE
+3577591272,3577591287,GB
 3577591288,3577591807,DE
 3577591808,3577591871,GB
 3577591872,3577591887,DE
-3577591888,3577591935,GB
-3577591936,3577591959,DE
+3577591888,3577591951,GB
+3577591952,3577591959,DE
 3577591960,3577591963,GB
 3577591964,3577592007,DE
 3577592008,3577592015,GB
-3577592016,3577592543,DE
+3577592016,3577592335,DE
+3577592336,3577592343,GB
+3577592344,3577592383,DE
+3577592384,3577592391,GB
+3577592392,3577592407,DE
+3577592408,3577592415,GB
+3577592416,3577592543,DE
 3577592544,3577592551,GB
-3577592552,3577592703,DE
+3577592552,3577592583,DE
+3577592584,3577592607,GB
+3577592608,3577592623,DE
+3577592624,3577592639,GB
+3577592640,3577592703,DE
 3577592704,3577592735,GB
 3577592736,3577592743,DE
 3577592744,3577592751,IE
-3577592752,3577592767,GB
-3577592768,3577593103,DE
+3577592752,3577592783,GB
+3577592784,3577593103,DE
 3577593104,3577593111,GB
-3577593112,3577593171,DE
+3577593112,3577593127,DE
+3577593128,3577593135,GB
+3577593136,3577593143,DE
+3577593144,3577593147,GB
+3577593148,3577593171,DE
 3577593172,3577593175,GB
 3577593176,3577593187,DE
-3577593188,3577593199,GB
-3577593200,3577593215,DE
+3577593188,3577593207,GB
+3577593208,3577593215,DE
 3577593216,3577593223,GB
 3577593224,3577593231,DE
 3577593232,3577593239,GB
-3577593240,3577593407,DE
-3577593408,3577593415,GB
-3577593416,3577593487,DE
+3577593240,3577593391,DE
+3577593392,3577593415,GB
+3577593416,3577593423,DE
+3577593424,3577593439,GB
+3577593440,3577593487,DE
 3577593488,3577593495,GB
 3577593496,3577600687,DE
 3577600688,3577600703,GB
@@ -82431,7 +83661,15 @@
 3577601448,3577601455,GB
 3577601456,3577601791,DE
 3577601792,3577602071,GB
-3577602072,3577602847,DE
+3577602072,3577602095,DE
+3577602096,3577602111,GB
+3577602112,3577602175,DE
+3577602176,3577602367,GB
+3577602368,3577602503,DE
+3577602504,3577602511,GB
+3577602512,3577602519,DE
+3577602520,3577602527,GB
+3577602528,3577602847,DE
 3577602848,3577602879,GB
 3577602880,3577602919,DE
 3577602920,3577602927,GB
@@ -82445,27 +83683,35 @@
 3577603104,3577603111,GB
 3577603112,3577603131,DE
 3577603132,3577603135,GB
-3577603136,3577603199,DE
+3577603136,3577603151,DE
+3577603152,3577603159,GB
+3577603160,3577603199,DE
 3577603200,3577603247,GB
 3577603248,3577603263,DE
 3577603264,3577603271,GB
-3577603272,3577603455,DE
+3577603272,3577603319,DE
+3577603320,3577603327,GB
+3577603328,3577603455,DE
 3577603456,3577603471,GB
-3577603472,3577603551,DE
-3577603552,3577603583,GB
-3577603584,3577603887,DE
+3577603472,3577603543,DE
+3577603544,3577603583,GB
+3577603584,3577603655,DE
+3577603656,3577603663,GB
+3577603664,3577603887,DE
 3577603888,3577603903,GB
 3577603904,3577604031,DE
 3577604032,3577604095,GB
-3577604096,3577606191,DE
+3577604096,3577606175,DE
+3577606176,3577606183,GB
+3577606184,3577606191,DE
 3577606192,3577606199,GB
 3577606200,3577606215,DE
-3577606216,3577606223,GB
-3577606224,3577606279,DE
+3577606216,3577606231,GB
+3577606232,3577606279,DE
 3577606280,3577606287,GB
-3577606288,3577606431,DE
-3577606432,3577606447,GB
-3577606448,3577606479,DE
+3577606288,3577606399,DE
+3577606400,3577606455,GB
+3577606456,3577606479,DE
 3577606480,3577606487,GB
 3577606488,3577606655,DE
 3577606656,3577606663,GB
@@ -82475,17 +83721,23 @@
 3577606816,3577606831,GB
 3577606832,3577606847,DE
 3577606848,3577606855,GB
-3577606856,3577606911,DE
+3577606856,3577606871,DE
+3577606872,3577606879,GB
+3577606880,3577606887,DE
+3577606888,3577606895,GB
+3577606896,3577606911,DE
 3577606912,3577607007,GB
-3577607008,3577607199,DE
+3577607008,3577607055,DE
+3577607056,3577607071,GB
+3577607072,3577607199,DE
 3577607200,3577607423,GB
 3577607424,3577607559,DE
 3577607560,3577607567,GB
 3577607568,3577607583,DE
 3577607584,3577607615,GB
 3577607616,3577607663,DE
-3577607664,3577607671,GB
-3577607672,3577607711,DE
+3577607664,3577607679,GB
+3577607680,3577607711,DE
 3577607712,3577607719,GB
 3577607720,3577607727,DE
 3577607728,3577607735,GB
@@ -82493,8 +83745,8 @@
 3577607744,3577607775,GB
 3577607776,3577607807,DE
 3577607808,3577607815,GB
-3577607816,3577607831,DE
-3577607832,3577607839,GB
+3577607816,3577607823,DE
+3577607824,3577607839,GB
 3577607840,3577607847,DE
 3577607848,3577607855,GB
 3577607856,3577608191,DE
@@ -82502,7 +83754,9 @@
 3577608448,3577608703,DE
 3577608704,3577608743,GB
 3577608744,3577608751,ES
-3577608752,3577608959,GB
+3577608752,3577608815,GB
+3577608816,3577608823,DE
+3577608824,3577608959,GB
 3577608960,3577608999,DE
 3577609000,3577609007,GB
 3577609008,3577609023,DE
@@ -82546,7 +83800,7 @@
 3577624896,3577625199,GB
 3577625208,3577625215,GB
 3577625232,3577625599,GB
-3577625808,3577625839,GB
+3577625824,3577625839,GB
 3577625856,3577626143,GB
 3577626240,3577626367,GB
 3577626624,3577627135,FR
@@ -82581,8 +83835,9 @@
 3577641416,3577641423,FR
 3577641472,3577641983,FR
 3577641984,3577642047,GB
-3577642056,3577642111,GB
-3577642176,3577642223,GB
+3577642056,3577642079,GB
+3577642088,3577642111,GB
+3577642176,3577642239,GB
 3577642240,3577642623,FR
 3577642752,3577643007,FR
 3577643008,3577643231,NL
@@ -82908,7 +84163,8 @@
 3580266496,3580272639,PL
 3580272640,3580329983,SE
 3580329984,3580338175,CH
-3580338176,3580362751,SE
+3580338176,3580338432,HR
+3580338433,3580362751,SE
 3580362752,3580473375,GB
 3580473376,3580473391,IE
 3580473392,3580473503,GB
@@ -82946,6 +84202,9 @@
 3580475128,3580475343,GB
 3580475344,3580475351,IE
 3580475352,3580624895,GB
+3580624896,3580626943,RU
+3580626944,3580628991,PL
+3580628992,3580631039,RU
 3580887040,3581149183,SE
 3581150368,3581150463,IE
 3581150592,3581150719,NL
@@ -82970,6 +84229,7 @@
 3581673472,3581935615,NL
 3581935616,3581943807,RU
 3581943808,3581951999,FR
+3581952000,3581960191,TR
 3581960192,3581976575,DE
 3581976576,3581984767,NO
 3581984768,3581992959,RU
@@ -83016,7 +84276,9 @@
 3582195136,3582195143,CH
 3582195144,3582196183,DE
 3582196184,3582196191,BE
-3582196192,3582197759,DE
+3582196192,3582197127,DE
+3582197128,3582197135,BZ
+3582197136,3582197759,DE
 3582197760,3582205951,DK
 3582205952,3582214143,AE
 3582214144,3582222335,RU
@@ -83075,7 +84337,9 @@
 3582551216,3582551551,CS
 3582551552,3582553471,RS
 3582553472,3582554623,CS
-3582554624,3582555391,RS
+3582554624,3582554879,RS
+3582554880,3582555007,CS
+3582555008,3582555391,RS
 3582555392,3582555647,CS
 3582555648,3582557183,RS
 3582557184,3582557439,CS
@@ -83236,12 +84500,10 @@
 3583029376,3583029503,FR
 3583029504,3583029759,IT
 3583029760,3583030015,GR
-3583030016,3583030783,IT
-3583030784,3583031039,GR
+3583030016,3583030847,IT
+3583030848,3583031039,GR
 3583031040,3583031295,FR
-3583031296,3583031551,GR
-3583031552,3583031807,GB
-3583031808,3583031839,GR
+3583031296,3583031839,GR
 3583031840,3583031847,IT
 3583031848,3583031887,GR
 3583031888,3583032095,IT
@@ -83363,7 +84625,9 @@
 3583705176,3583705223,NA
 3583705224,3583705239,UA
 3583705240,3583705247,NA
-3583705248,3583705303,UA
+3583705248,3583705287,UA
+3583705288,3583705295,NA
+3583705296,3583705303,UA
 3583705304,3583705319,NA
 3583705320,3583705335,UA
 3583705336,3583705343,NA
@@ -83387,15 +84651,15 @@
 3583705904,3583705911,NA
 3583705912,3583706023,UA
 3583706024,3583706031,NA
-3583706032,3583706039,UA
-3583706040,3583706047,NA
-3583706048,3583706055,UA
+3583706032,3583706055,UA
 3583706056,3583706063,RU
 3583706064,3583706071,UA
 3583706072,3583706079,NA
 3583706080,3583706175,UA
 3583706176,3583706183,NA
-3583706184,3583706263,UA
+3583706184,3583706191,UA
+3583706192,3583706199,NA
+3583706200,3583706263,UA
 3583706264,3583706271,NA
 3583706272,3583706295,UA
 3583706296,3583706311,NA
@@ -83421,8 +84685,8 @@
 3583706616,3583706623,NA
 3583706624,3583706624,UA
 3583706625,3583706631,NA
-3583706632,3583706647,UA
-3583706648,3583706655,NA
+3583706632,3583706639,UA
+3583706640,3583706655,NA
 3583706656,3583706679,UA
 3583706680,3583706687,NA
 3583706688,3583706695,RU
@@ -83451,9 +84715,12 @@
 3583707560,3583707567,NA
 3583707568,3583707639,UA
 3583707640,3583707647,NA
-3583707648,3583707671,UA
+3583707648,3583707663,UA
+3583707664,3583707671,NA
 3583707672,3583707679,RU
-3583707680,3583707735,UA
+3583707680,3583707703,UA
+3583707704,3583707711,NA
+3583707712,3583707735,UA
 3583707736,3583707743,NA
 3583707744,3583707775,UA
 3583707776,3583707791,NA
@@ -83467,7 +84734,33 @@
 3583708032,3583708095,NA
 3583708096,3583708167,UA
 3583708168,3583708175,NA
-3583708176,3583713279,UA
+3583708176,3583708231,UA
+3583708232,3583708239,NA
+3583708240,3583708327,UA
+3583708328,3583708335,NA
+3583708336,3583708423,UA
+3583708424,3583708431,NA
+3583708432,3583708479,UA
+3583708480,3583708543,NA
+3583708544,3583708575,UA
+3583708576,3583708583,NA
+3583708584,3583708607,UA
+3583708608,3583708623,NA
+3583708624,3583713071,UA
+3583713072,3583713079,NA
+3583713080,3583713103,UA
+3583713104,3583713111,NA
+3583713112,3583713127,UA
+3583713128,3583713135,NA
+3583713136,3583713159,UA
+3583713160,3583713167,NA
+3583713168,3583713183,UA
+3583713184,3583713191,NA
+3583713192,3583713199,BG
+3583713200,3583713207,NA
+3583713208,3583713271,UA
+3583713272,3583713275,NA
+3583713276,3583713279,UA
 3583713280,3583721471,CZ
 3583721472,3583729663,DE
 3583729664,3583737855,TR
@@ -83622,8 +84915,8 @@
 3584344064,3584352255,SE
 3584352256,3584360447,RO
 3584360448,3584368639,GB
-3584368640,3584376831,SA
-3584376832,3584385023,DE
+3584368640,3584376831,LB
+3584376832,3584393215,DE
 3584393216,3584401407,GB
 3584401408,3584409599,MT
 3584409600,3584413439,RU
@@ -83638,7 +84931,6 @@
 3584434176,3584442367,LU
 3584442368,3584450559,GB
 3584458752,3584466943,SA
-3584466944,3584475135,NG
 3584475136,3584483327,FR
 3584483328,3584491519,DE
 3584491520,3584499711,BG
@@ -83722,7 +85014,11 @@
 3584901120,3584909311,AT
 3584909312,3584917503,IT
 3584917504,3584925695,FI
-3584925696,3584931375,CH
+3584925696,3584928275,CH
+3584928276,3584928279,IT
+3584928280,3584929599,CH
+3584929600,3584929727,DE
+3584929728,3584931375,CH
 3584931376,3584931391,ES
 3584931392,3584931687,CH
 3584931688,3584931695,ES
@@ -83741,9 +85037,9 @@
 3584983296,3584984063,NL
 3584984064,3584984319,US
 3584984320,3584984575,NL
-3584984576,3584987135,US
-3584987136,3584988159,NL
-3584988160,3584988311,US
+3584984576,3584987391,US
+3584987392,3584987647,NL
+3584987648,3584988311,US
 3584988312,3584988319,NL
 3584988320,3584988335,US
 3584988336,3584988415,NL
@@ -83757,6 +85053,7 @@
 3585015808,3585023999,IT
 3585024000,3585032191,CZ
 3585032192,3585048575,LV
+3585048576,3585056767,GB
 3585056768,3585064959,LB
 3585064960,3585081343,GB
 3585081344,3585114111,IR
@@ -83802,8 +85099,8 @@
 3585400832,3585409023,FR
 3585409024,3585417215,RU
 3585417216,3585425407,BE
-3585425408,3585433599,NG
 3585433600,3585441791,IS
+3585441792,3585449983,SK
 3585449984,3585458175,SA
 3585458176,3585466367,HU
 3585474560,3585482751,DE
@@ -83839,7 +85136,9 @@
 3585631216,3585631223,CS
 3585631224,3585631227,CS
 3585631228,3585631231,RS
-3585631232,3585631307,CS
+3585631232,3585631255,CS
+3585631256,3585631263,RS
+3585631264,3585631307,CS
 3585631308,3585631311,RS
 3585631312,3585631503,CS
 3585631504,3585631519,RS
@@ -84040,8 +85339,8 @@
 3586191888,3586195455,ES
 3586195456,3586197503,DE
 3586197504,3586198015,FR
-3586198016,3586198527,DE
-3586198528,3586199295,FR
+3586198016,3586199039,DE
+3586199040,3586199295,FR
 3586199296,3586203391,DE
 3586203392,3586203647,SE
 3586211840,3586220287,CH
@@ -84061,9 +85360,7 @@
 3586252800,3586254847,BE
 3586254848,3586258943,NL
 3586258944,3586259455,BE
-3586259456,3586269263,NL
-3586269264,3586269279,ES
-3586269280,3586269343,NL
+3586259456,3586269343,NL
 3586269344,3586269415,ES
 3586269416,3586269423,NL
 3586269424,3586269439,ES
@@ -84101,12 +85398,11 @@
 3586277376,3586293759,TR
 3586293760,3586310143,ES
 3586310144,3586326527,CZ
+3586326528,3586342911,IR
 3586342912,3586359295,ES
 3586359296,3586375679,PL
 3586375680,3586392063,CZ
-3586392064,3586396415,NL
-3586396416,3586396671,GB
-3586396672,3586408447,NL
+3586392064,3586408447,NL
 3586408448,3586424831,BA
 3586424832,3586441215,CH
 3586441216,3586457599,DE
@@ -84136,9 +85432,7 @@
 3586662400,3586670591,UA
 3586670592,3586677759,DE
 3586677760,3586678015,GR
-3586678016,3586678271,DE
-3586678272,3586678303,IE
-3586678304,3586678335,DE
+3586678016,3586678335,DE
 3586678336,3586678399,US
 3586678400,3586678415,GB
 3586678416,3586678439,IE
@@ -84153,8 +85447,8 @@
 3586679104,3586679167,DE
 3586679168,3586679231,US
 3586679232,3586679327,DE
-3586679328,3586679335,DK
-3586679336,3586679583,DE
+3586679328,3586679343,DK
+3586679344,3586679583,DE
 3586679584,3586679599,IT
 3586679600,3586679647,DE
 3586679648,3586679711,IT
@@ -84162,7 +85456,8 @@
 3586679728,3586679743,IT
 3586679744,3586679839,DE
 3586679840,3586679871,FR
-3586679872,3586680319,DE
+3586679872,3586680063,DE
+3586680064,3586680319,IT
 3586680320,3586680447,ES
 3586680448,3586680463,DE
 3586680464,3586680575,ES
@@ -84173,7 +85468,8 @@
 3586680832,3586680959,FR
 3586680960,3586681015,DE
 3586681016,3586681087,FR
-3586681088,3586681599,DE
+3586681088,3586681343,IT
+3586681344,3586681599,DE
 3586681600,3586681615,FR
 3586681616,3586681695,DE
 3586681696,3586682111,FR
@@ -84234,7 +85530,9 @@
 3586910592,3586910671,NL
 3586910672,3586910687,DE
 3586910688,3586910703,NL
-3586910704,3586910991,DE
+3586910704,3586910711,DE
+3586910712,3586910719,NL
+3586910720,3586910991,DE
 3586910992,3586911007,BE
 3586911008,3586911039,DE
 3586911040,3586911103,GB
@@ -84262,19 +85560,34 @@
 3586924944,3586924959,AX
 3586924960,3586924983,FI
 3586924984,3586925055,AX
-3586925056,3586925791,FI
+3586925056,3586925103,FI
+3586925104,3586925135,AX
+3586925136,3586925471,FI
+3586925472,3586925503,AX
+3586925504,3586925535,FI
+3586925536,3586925567,AX
+3586925568,3586925695,FI
+3586925696,3586925759,AX
+3586925760,3586925791,FI
 3586925792,3586925823,AX
 3586925824,3586925831,FI
 3586925832,3586925839,AX
-3586925840,3586925983,FI
+3586925840,3586925887,FI
+3586925888,3586925919,AX
+3586925920,3586925983,FI
 3586925984,3586926003,AX
-3586926004,3586926591,FI
+3586926004,3586926015,FI
+3586926016,3586926047,AX
+3586926048,3586926079,FI
+3586926080,3586926591,AX
 3586926592,3586926847,SE
 3586926848,3586927103,FI
-3586927104,3586927871,AX
-3586927872,3586928159,FI
+3586927104,3586927999,AX
+3586928000,3586928159,FI
 3586928160,3586928175,AX
-3586928176,3586928639,FI
+3586928176,3586928303,FI
+3586928304,3586928319,AX
+3586928320,3586928639,FI
 3586928640,3586932735,AX
 3586932736,3586949119,LB
 3586949120,3586965503,SE
@@ -84355,9 +85668,7 @@
 3587228016,3587228047,GB
 3587228048,3587228095,NL
 3587228096,3587228127,GB
-3587228128,3587228159,NL
-3587228160,3587228175,GB
-3587228176,3587228207,NL
+3587228128,3587228207,NL
 3587228208,3587228223,GB
 3587228224,3587228271,NL
 3587228272,3587228287,GB
@@ -84366,8 +85677,8 @@
 3587228336,3587228351,NL
 3587228352,3587228447,GB
 3587228448,3587228463,NL
-3587228464,3587228671,GB
-3587228672,3587229183,NL
+3587228464,3587228667,GB
+3587228668,3587229183,NL
 3587229184,3587229455,GB
 3587229456,3587229487,NL
 3587229488,3587229535,GB
@@ -84380,7 +85691,9 @@
 3587229792,3587229807,NL
 3587229808,3587229855,GB
 3587229856,3587229903,NL
-3587229904,3587230047,GB
+3587229904,3587229951,GB
+3587229952,3587229967,NL
+3587229968,3587230047,GB
 3587230048,3587230079,NL
 3587230080,3587230095,GB
 3587230096,3587230111,NL
@@ -84388,11 +85701,13 @@
 3587230128,3587230143,NL
 3587230144,3587230239,GB
 3587230240,3587230271,NL
-3587230272,3587230335,GB
-3587230336,3587230351,NL
+3587230272,3587230319,GB
+3587230320,3587230351,NL
 3587230352,3587230383,GB
 3587230384,3587230399,NL
-3587230400,3587230511,GB
+3587230400,3587230447,GB
+3587230448,3587230463,NL
+3587230464,3587230511,GB
 3587230512,3587230519,NL
 3587230520,3587230527,GB
 3587230528,3587230543,NL
@@ -84409,8 +85724,8 @@
 3587230992,3587231231,GB
 3587231232,3587231263,NL
 3587231264,3587231359,GB
-3587231360,3587231487,NL
-3587231488,3587231887,GB
+3587231360,3587231743,NL
+3587231744,3587231887,GB
 3587231888,3587231903,NL
 3587231904,3587232767,GB
 3587232768,3587232831,NL
@@ -84441,8 +85756,8 @@
 3587233408,3587233471,GB
 3587233472,3587233519,NL
 3587233520,3587233535,GB
-3587233536,3587233551,NL
-3587233552,3587233599,GB
+3587233536,3587233543,NL
+3587233544,3587233599,GB
 3587233600,3587233663,NL
 3587233664,3587233791,GB
 3587233792,3587233807,NL
@@ -84465,9 +85780,7 @@
 3587236095,3587236095,GB
 3587236096,3587236471,NL
 3587236472,3587236479,GB
-3587236480,3587236487,NL
-3587236488,3587236495,GB
-3587236496,3587236503,NL
+3587236480,3587236503,NL
 3587236504,3587236527,GB
 3587236528,3587236535,NL
 3587236536,3587236543,GB
@@ -84490,17 +85803,27 @@
 3587238464,3587238479,NL
 3587238480,3587238487,GB
 3587238488,3587238559,NL
-3587238560,3587239279,GB
-3587239280,3587239287,NL
-3587239288,3587239359,GB
-3587239360,3587239423,NL
-3587239424,3587239455,GB
-3587239456,3587239487,NL
-3587239488,3587239943,GB
-3587239944,3587239951,NL
-3587239952,3587239967,GB
-3587239968,3587239983,NL
-3587239984,3587239999,GB
+3587238560,3587239167,GB
+3587239168,3587239199,NL
+3587239200,3587239215,GB
+3587239216,3587239231,NL
+3587239232,3587239239,GB
+3587239240,3587239247,NL
+3587239248,3587239263,GB
+3587239264,3587239295,NL
+3587239296,3587239311,GB
+3587239312,3587239439,NL
+3587239440,3587239447,GB
+3587239448,3587239487,NL
+3587239488,3587239503,GB
+3587239504,3587239511,NL
+3587239512,3587239519,GB
+3587239520,3587239535,NL
+3587239536,3587239935,GB
+3587239936,3587239959,NL
+3587239960,3587239967,GB
+3587239968,3587239991,NL
+3587239992,3587239999,GB
 3587240000,3587240055,NL
 3587240056,3587240071,GB
 3587240072,3587240111,NL
@@ -84509,10 +85832,8 @@
 3587240272,3587240287,GB
 3587240288,3587240295,NL
 3587240296,3587240319,GB
-3587240320,3587240351,NL
-3587240352,3587240359,GB
-3587240360,3587240367,NL
-3587240368,3587240383,GB
+3587240320,3587240375,NL
+3587240376,3587240383,GB
 3587240384,3587240575,NL
 3587240576,3587240583,GB
 3587240584,3587240639,NL
@@ -84520,34 +85841,40 @@
 3587241032,3587241119,NL
 3587241120,3587241151,GB
 3587241152,3587241167,NL
-3587241168,3587241279,GB
-3587241280,3587241287,NL
+3587241168,3587241183,GB
+3587241184,3587241287,NL
 3587241288,3587241983,GB
 3587241984,3587242047,NL
-3587242048,3587242063,GB
-3587242064,3587242071,NL
+3587242048,3587242055,GB
+3587242056,3587242071,NL
 3587242072,3587242079,GB
 3587242080,3587242111,NL
 3587242112,3587242271,GB
 3587242272,3587242287,NL
-3587242288,3587242495,GB
-3587242496,3587242527,NL
-3587242528,3587242559,GB
-3587242560,3587242623,NL
-3587242624,3587242663,GB
-3587242664,3587243279,NL
+3587242288,3587242463,GB
+3587242464,3587242471,NL
+3587242472,3587242495,GB
+3587242496,3587242623,NL
+3587242624,3587242631,GB
+3587242632,3587242639,NL
+3587242640,3587242655,GB
+3587242656,3587243279,NL
 3587243280,3587243295,GB
-3587243296,3587243407,NL
-3587243408,3587243415,GB
-3587243416,3587243423,NL
-3587243424,3587243439,GB
+3587243296,3587243431,NL
+3587243432,3587243439,GB
 3587243440,3587243471,NL
 3587243472,3587243519,GB
 3587243520,3587243647,NL
-3587243648,3587244031,GB
+3587243648,3587244015,GB
+3587244016,3587244023,NL
+3587244024,3587244031,GB
 3587244032,3587260415,IT
 3587260416,3587284991,DE
-3587284992,3587287295,IT
+3587284992,3587287043,IT
+3587287044,3587287047,LY
+3587287048,3587287055,IT
+3587287056,3587287059,LY
+3587287060,3587287295,IT
 3587287296,3587287307,GE
 3587287308,3587287311,DE
 3587287312,3587287319,GE
@@ -84674,12 +86001,15 @@
 3587555328,3587571711,BE
 3587571712,3587579903,DE
 3587579904,3587588095,BE
+3587588096,3587596287,BG
 3587596288,3587604479,NL
 3587604480,3587620863,FI
 3587620864,3587637247,SE
 3587637248,3587653631,FR
 3587653632,3587670015,SK
-3587670016,3587687591,IT
+3587670016,3587686031,IT
+3587686032,3587686039,FR
+3587686040,3587687591,IT
 3587687592,3587687599,NL
 3587687600,3587702783,IT
 3587702784,3587710975,DE
@@ -84710,9 +86040,7 @@
 3587932416,3587932671,DE
 3587932672,3587932927,BE
 3587932928,3587933183,GB
-3587933184,3587940095,BE
-3587940096,3587940351,FR
-3587940352,3587944447,BE
+3587933184,3587944447,BE
 3587944448,3587945471,NL
 3587945472,3587948031,BE
 3587948032,3587948543,NL
@@ -84766,7 +86094,6 @@
 3588554240,3588554687,GB
 3588554688,3588554751,IE
 3588554752,3588571135,AT
-3588571136,3588587519,NL
 3588587520,3588603903,ES
 3588603904,3588620287,SI
 3588620288,3588628479,SA
@@ -84807,8 +86134,8 @@
 3589029888,3589030015,NL
 3589030016,3589030143,ES
 3589030144,3589030175,NL
-3589030176,3589030183,ES
-3589030184,3589030207,NL
+3589030176,3589030191,ES
+3589030192,3589030207,NL
 3589030208,3589030239,ES
 3589030240,3589031423,NL
 3589031424,3589031935,ES
@@ -84897,9 +86224,7 @@
 3589285048,3589285055,RS
 3589285056,3589285087,CS
 3589285088,3589285279,RS
-3589285280,3589285327,CS
-3589285328,3589285335,RS
-3589285336,3589288015,CS
+3589285280,3589288015,CS
 3589288016,3589288023,RS
 3589288024,3589288127,CS
 3589288128,3589288159,RS
@@ -84975,7 +86300,9 @@
 3589570656,3589571327,GB
 3589571328,3589571455,NL
 3589571456,3589578751,GB
-3589578752,3589580031,NL
+3589578752,3589579263,NL
+3589579264,3589579775,GB
+3589579776,3589580031,NL
 3589580032,3589580127,GB
 3589580128,3589580159,NL
 3589580160,3589580287,GB
@@ -84985,7 +86312,9 @@
 3589581056,3589581199,GB
 3589581200,3589581215,NL
 3589581216,3589581327,GB
-3589581328,3589581791,NL
+3589581328,3589581439,NL
+3589581440,3589581567,GB
+3589581568,3589581791,NL
 3589581792,3589581823,GB
 3589581824,3589582591,NL
 3589582592,3589582607,GB
@@ -84995,13 +86324,16 @@
 3589583616,3589583647,GB
 3589583648,3589583663,NL
 3589583664,3589583743,GB
-3589583744,3589584271,NL
-3589584272,3589584383,GB
-3589584384,3589585279,NL
+3589583744,3589583871,NL
+3589583872,3589584127,GB
+3589584128,3589584271,NL
+3589584272,3589584639,GB
+3589584640,3589585279,NL
 3589585280,3589585407,GB
 3589585408,3589585983,NL
 3589585984,3589586431,GB
-3589586432,3589586943,NL
+3589586432,3589586687,NL
+3589586688,3589586943,GB
 3589586944,3589597559,CS
 3589597560,3589597567,RS
 3589597568,3589603327,CS
@@ -85039,26 +86371,30 @@
 3589718656,3589718783,GB
 3589718784,3589719095,BE
 3589719096,3589719103,GB
-3589719104,3589719159,BE
-3589719160,3589719167,GB
-3589719168,3589719231,BE
-3589719232,3589719295,GB
-3589719296,3589719343,BE
-3589719344,3589719395,GB
-3589719396,3589719399,BE
-3589719400,3589719551,GB
-3589719552,3589719647,BE
-3589719648,3589719679,GB
+3589719104,3589719247,BE
+3589719248,3589719263,GB
+3589719264,3589719271,BE
+3589719272,3589719279,GB
+3589719280,3589719343,BE
+3589719344,3589719359,GB
+3589719360,3589719391,BE
+3589719392,3589719395,GB
+3589719396,3589719463,BE
+3589719464,3589719471,GB
+3589719472,3589719503,BE
+3589719504,3589719519,GB
+3589719520,3589719527,BE
+3589719528,3589719551,GB
+3589719552,3589719655,BE
+3589719656,3589719679,GB
 3589719680,3589719711,BE
-3589719712,3589719743,GB
-3589719744,3589719775,BE
+3589719712,3589719735,GB
+3589719736,3589719775,BE
 3589719776,3589719783,GB
-3589719784,3589719807,BE
-3589719808,3589719815,GB
-3589719816,3589719823,BE
-3589719824,3589719839,GB
-3589719840,3589719855,BE
-3589719856,3589719903,GB
+3589719784,3589719855,BE
+3589719856,3589719863,GB
+3589719864,3589719871,BE
+3589719872,3589719903,GB
 3589719904,3589719971,BE
 3589719972,3589719975,GB
 3589719976,3589720071,BE
@@ -85106,12 +86442,8 @@
 3589721280,3589721295,BE
 3589721296,3589721311,GB
 3589721312,3589721375,BE
-3589721376,3589721407,GB
-3589721408,3589721423,BE
-3589721424,3589721431,GB
-3589721432,3589721487,BE
-3589721488,3589721495,GB
-3589721496,3589721575,BE
+3589721376,3589721391,GB
+3589721392,3589721575,BE
 3589721576,3589721583,GB
 3589721584,3589721607,BE
 3589721608,3589721615,GB
@@ -85138,7 +86470,9 @@
 3589722032,3589722059,BE
 3589722060,3589722063,GB
 3589722064,3589722111,BE
-3589722112,3589722167,GB
+3589722112,3589722143,GB
+3589722144,3589722151,BE
+3589722152,3589722167,GB
 3589722168,3589722175,BE
 3589722176,3589722207,GB
 3589722208,3589722247,BE
@@ -85182,18 +86516,20 @@
 3589723096,3589723391,BE
 3589723392,3589723647,GB
 3589723648,3589723775,BE
-3589723776,3589723839,GB
-3589723840,3589723903,BE
-3589723904,3589723967,GB
-3589723968,3589724031,BE
-3589724032,3589724159,GB
-3589724160,3589724223,BE
-3589724224,3589724231,GB
-3589724232,3589724271,BE
-3589724272,3589724287,GB
-3589724288,3589724351,BE
-3589724352,3589724407,GB
-3589724408,3589724423,BE
+3589723776,3589723783,GB
+3589723784,3589723791,BE
+3589723792,3589723807,GB
+3589723808,3589724031,BE
+3589724032,3589724039,GB
+3589724040,3589724047,BE
+3589724048,3589724059,GB
+3589724060,3589724063,BE
+3589724064,3589724159,GB
+3589724160,3589724271,BE
+3589724272,3589724287,NL
+3589724288,3589724367,BE
+3589724368,3589724375,GB
+3589724376,3589724423,BE
 3589724424,3589724431,GB
 3589724432,3589724607,BE
 3589724608,3589724631,GB
@@ -85237,8 +86573,8 @@
 3589725792,3589725807,GB
 3589725808,3589725831,BE
 3589725832,3589725863,GB
-3589725864,3589725871,BE
-3589725872,3589725895,GB
+3589725864,3589725879,BE
+3589725880,3589725895,GB
 3589725896,3589725903,BE
 3589725904,3589725943,GB
 3589725944,3589725959,BE
@@ -85287,19 +86623,15 @@
 3589727096,3589727127,GB
 3589727128,3589727143,BE
 3589727144,3589727159,GB
-3589727160,3589727175,BE
-3589727176,3589727215,GB
+3589727160,3589727183,BE
+3589727184,3589727215,GB
 3589727216,3589727223,BE
 3589727224,3589727295,GB
-3589727296,3589727319,BE
-3589727320,3589727327,GB
-3589727328,3589727431,BE
+3589727296,3589727431,BE
 3589727432,3589727439,GB
 3589727440,3589727447,BE
 3589727448,3589727455,GB
-3589727456,3589727463,BE
-3589727464,3589727471,GB
-3589727472,3589727487,BE
+3589727456,3589727487,BE
 3589727488,3589727743,GB
 3589727744,3589727759,BE
 3589727760,3589727999,GB
@@ -85365,7 +86697,9 @@
 3589731616,3589731623,GB
 3589731624,3589731631,BE
 3589731632,3589731679,GB
-3589731680,3589731719,BE
+3589731680,3589731687,BE
+3589731688,3589731695,GB
+3589731696,3589731719,BE
 3589731720,3589731735,GB
 3589731736,3589731783,BE
 3589731784,3589731791,GB
@@ -85373,18 +86707,18 @@
 3589731800,3589731831,GB
 3589731832,3589731839,BE
 3589731840,3589732111,GB
-3589732112,3589732239,BE
-3589732240,3589732255,GB
+3589732112,3589732243,BE
+3589732244,3589732255,GB
 3589732256,3589732287,BE
 3589732288,3589732295,GB
 3589732296,3589732303,BE
 3589732304,3589732319,GB
 3589732320,3589732327,BE
 3589732328,3589732607,GB
-3589732608,3589732711,BE
-3589732712,3589732743,GB
-3589732744,3589732759,BE
-3589732760,3589732783,GB
+3589732608,3589732719,BE
+3589732720,3589732743,GB
+3589732744,3589732767,BE
+3589732768,3589732783,GB
 3589732784,3589732863,BE
 3589732864,3589733183,GB
 3589733184,3589733191,BE
@@ -85392,20 +86726,20 @@
 3589733440,3589733455,BE
 3589733456,3589733695,GB
 3589733696,3589733711,BE
-3589733712,3589734015,GB
+3589733712,3589733719,GB
+3589733720,3589733727,BE
+3589733728,3589734015,GB
 3589734016,3589734055,BE
 3589734056,3589734063,GB
 3589734064,3589734119,BE
 3589734120,3589734159,GB
-3589734160,3589734231,BE
-3589734232,3589734247,GB
-3589734248,3589734271,BE
-3589734272,3589734319,GB
+3589734160,3589734271,BE
+3589734272,3589734287,GB
+3589734288,3589734295,BE
+3589734296,3589734319,GB
 3589734320,3589734327,BE
 3589734328,3589734335,GB
-3589734336,3589734367,BE
-3589734368,3589734383,GB
-3589734384,3589734391,BE
+3589734336,3589734391,BE
 3589734392,3589734399,GB
 3589742592,3589744895,NL
 3589744896,3589744959,BE
@@ -85430,6 +86764,7 @@
 3589828608,3589828639,SE
 3589828640,3589828671,NL
 3589828736,3589828863,NL
+3589829120,3589829183,GB
 3589829376,3589829887,GB
 3589830144,3589830655,GB
 3589830656,3589831167,DE
@@ -85518,7 +86853,8 @@
 3590157648,3590157655,CS
 3590157656,3590157663,RS
 3590157664,3590157671,CS
-3590157672,3590157695,SI
+3590157672,3590157679,RS
+3590157680,3590157695,SI
 3590157696,3590157727,CS
 3590157728,3590157735,RS
 3590157736,3590157743,SI
@@ -85581,16 +86917,14 @@
 3590247488,3590247551,US
 3590247552,3590247679,IT
 3590247680,3590247687,GB
-3590247688,3590247935,DE
-3590247936,3590248191,ES
-3590248192,3590248447,DE
+3590247688,3590248447,DE
 3590248448,3590248959,US
 3590248960,3590249471,ES
 3590249472,3590249983,IE
 3590249984,3590250495,GR
 3590250496,3590250751,IE
 3590250752,3590251007,GR
-3590251008,3590251263,ES
+3590251008,3590251263,IT
 3590251264,3590251519,DE
 3590251520,3590251551,ES
 3590251552,3590251583,DE
@@ -85620,7 +86954,8 @@
 3590255104,3590255359,ES
 3590255360,3590255935,DE
 3590255936,3590255999,US
-3590256000,3590256639,DE
+3590256000,3590256383,DE
+3590256384,3590256639,IT
 3590256640,3590256703,US
 3590256704,3590256719,BE
 3590256720,3590256735,DE
@@ -85638,44 +86973,52 @@
 3590307904,3590307935,UA
 3590307936,3590307951,GB
 3590307952,3590307967,NG
-3590307968,3590307999,CD
-3590308000,3590308031,GB
+3590307968,3590308031,GB
 3590308032,3590308047,UG
 3590308048,3590308055,KE
 3590308056,3590308063,GB
-3590308064,3590308071,ZM
-3590308072,3590308079,SZ
-3590308080,3590308087,GB
+3590308064,3590308071,ZW
+3590308072,3590308079,GB
+3590308080,3590308087,MW
 3590308088,3590308095,AO
-3590308096,3590308183,GB
-3590308184,3590308191,IQ
-3590308192,3590308199,GB
-3590308200,3590308223,IQ
-3590308224,3590308247,GB
-3590308248,3590308263,IQ
-3590308264,3590308271,GB
-3590308272,3590308279,IQ
-3590308280,3590308351,GB
+3590308096,3590308119,GB
+3590308120,3590308127,IQ
+3590308128,3590308151,GB
+3590308152,3590308159,NG
+3590308160,3590308167,ZM
+3590308168,3590308175,GB
+3590308176,3590308183,NG
+3590308184,3590308231,IQ
+3590308232,3590308247,GB
+3590308248,3590308303,IQ
+3590308304,3590308311,SO
+3590308312,3590308319,IQ
+3590308320,3590308327,GB
+3590308328,3590308343,IQ
+3590308344,3590308351,GB
 3590308352,3590308607,CG
 3590308608,3590308735,NG
 3590308736,3590308767,GB
 3590308768,3590308775,RW
 3590308776,3590308783,ZA
 3590308784,3590308799,ZW
-3590308800,3590308815,GB
+3590308800,3590308807,GB
+3590308808,3590308815,ZM
 3590308816,3590308831,KE
-3590308832,3590308839,CG
-3590308840,3590308855,GB
+3590308832,3590308839,ZW
+3590308840,3590308847,ET
+3590308848,3590308855,GB
 3590308856,3590308911,NG
 3590308912,3590308927,BI
 3590308928,3590308951,GB
 3590308952,3590308959,GH
 3590308960,3590308991,GB
-3590308992,3590308999,ZM
+3590308992,3590308999,NG
 3590309000,3590309007,UG
-3590309008,3590309023,GB
+3590309008,3590309023,TZ
 3590309024,3590309055,ZW
-3590309056,3590309071,GB
+3590309056,3590309063,CD
+3590309064,3590309071,TZ
 3590309072,3590309079,MW
 3590309080,3590309087,GH
 3590309088,3590309103,NG
@@ -85689,16 +87032,41 @@
 3590309544,3590309551,AM
 3590309552,3590309559,UG
 3590309560,3590309567,KE
-3590309568,3590309575,NG
-3590309576,3590309583,AO
+3590309568,3590309575,GB
+3590309576,3590309583,NG
 3590309584,3590309591,ZW
 3590309592,3590309599,SO
 3590309600,3590309607,KE
 3590309608,3590309615,GB
 3590309616,3590309623,UG
-3590309624,3590309887,GB
+3590309624,3590309631,ZW
+3590309632,3590309655,IQ
+3590309656,3590309671,GB
+3590309672,3590309695,IQ
+3590309696,3590309711,GB
+3590309712,3590309719,IQ
+3590309720,3590309727,GB
+3590309728,3590309735,IQ
+3590309736,3590309743,GB
+3590309744,3590309751,IQ
+3590309752,3590309887,GB
 3590309888,3590310143,MW
-3590310144,3590310399,GB
+3590310144,3590310159,MZ
+3590310160,3590310175,GB
+3590310176,3590310183,LR
+3590310184,3590310191,IQ
+3590310192,3590310199,CD
+3590310200,3590310215,GB
+3590310216,3590310287,IQ
+3590310288,3590310288,GB
+3590310289,3590310303,IQ
+3590310304,3590310311,GH
+3590310312,3590310319,IQ
+3590310320,3590310327,ZW
+3590310328,3590310335,GB
+3590310336,3590310351,IQ
+3590310352,3590310359,GB
+3590310360,3590310399,IQ
 3590310400,3590310655,UA
 3590310656,3590311679,GB
 3590311680,3590311935,YT
@@ -85712,10 +87080,12 @@
 3590312896,3590312903,ZA
 3590312904,3590312911,AO
 3590312912,3590312919,NG
-3590312920,3590312927,ZM
+3590312920,3590312927,GB
 3590312928,3590312943,UG
 3590312944,3590312951,NG
-3590312952,3590314639,GB
+3590312952,3590312959,KE
+3590312960,3590314623,GB
+3590314624,3590314639,ET
 3590314640,3590314655,GH
 3590314656,3590314671,GB
 3590314672,3590314679,UG
@@ -85728,13 +87098,15 @@
 3590314744,3590314751,KE
 3590314752,3590314767,GB
 3590314768,3590314783,KE
-3590314784,3590314791,GB
-3590314792,3590314799,KE
+3590314784,3590314799,GB
 3590314800,3590314807,NG
 3590314808,3590314815,GB
 3590314816,3590314823,NG
-3590314824,3590314895,GB
-3590314896,3590314903,NG
+3590314824,3590314831,ZW
+3590314832,3590314879,GB
+3590314880,3590314887,KE
+3590314888,3590314895,NG
+3590314896,3590314903,GB
 3590314904,3590314911,KE
 3590314912,3590314927,GH
 3590314928,3590314943,NG
@@ -85743,27 +87115,25 @@
 3590314968,3590314973,YT
 3590314974,3590314975,GB
 3590314976,3590314983,UG
-3590314984,3590314991,RW
+3590314984,3590314991,MW
 3590314992,3590316031,GB
-3590316032,3590316039,CI
+3590316032,3590316039,TZ
 3590316040,3590316047,GB
 3590316048,3590316055,GH
 3590316056,3590316071,IQ
-3590316072,3590316079,BJ
-3590316080,3590316087,GB
+3590316072,3590316079,GB
+3590316080,3590316087,LB
 3590316088,3590316127,IQ
 3590316128,3590316151,NG
 3590316152,3590316159,GR
-3590316160,3590316175,GB
-3590316176,3590316183,IQ
+3590316160,3590316183,IQ
 3590316184,3590316191,GB
 3590316192,3590316199,LY
-3590316200,3590316207,GB
-3590316208,3590316215,IQ
-3590316216,3590316255,GB
-3590316256,3590316263,IQ
-3590316264,3590316271,GB
-3590316272,3590316287,IQ
+3590316200,3590316215,IQ
+3590316216,3590316223,ZM
+3590316224,3590316231,IQ
+3590316232,3590316255,GB
+3590316256,3590316287,IQ
 3590316288,3590316543,LB
 3590316544,3590316559,GB
 3590316560,3590316575,IQ
@@ -85777,25 +87147,32 @@
 3590316648,3590316655,LY
 3590316656,3590316663,IQ
 3590316664,3590316671,LY
-3590316672,3590316679,IQ
-3590316680,3590316687,GB
+3590316672,3590316687,GB
 3590316688,3590316695,IQ
-3590316696,3590316703,NG
-3590316704,3590316719,GB
+3590316696,3590316719,GB
 3590316720,3590316727,IQ
 3590316728,3590316735,LB
 3590316736,3590316751,GR
 3590316752,3590316783,GB
 3590316784,3590316791,IQ
-3590316792,3590316799,CI
+3590316792,3590316799,GB
 3590316800,3590317055,CS
 3590317056,3590317311,NG
-3590317312,3590317471,GB
+3590317312,3590317343,AO
+3590317344,3590317407,GB
+3590317408,3590317439,US
+3590317440,3590317447,AM
+3590317448,3590317455,LB
+3590317456,3590317471,IQ
 3590317472,3590317479,MW
-3590317480,3590317527,GB
+3590317480,3590317487,US
+3590317488,3590317495,IQ
+3590317496,3590317503,LB
+3590317504,3590317519,GB
+3590317520,3590317527,LY
 3590317528,3590317951,IQ
-3590317952,3590318063,UA
-3590318064,3590319167,GB
+3590317952,3590318047,UA
+3590318048,3590319167,GB
 3590319168,3590319231,AE
 3590319232,3590319335,GB
 3590319336,3590319359,AE
@@ -85806,24 +87183,31 @@
 3590320000,3590320127,GB
 3590320128,3590320191,NG
 3590320192,3590320199,LB
-3590320200,3590320231,GB
+3590320200,3590320207,IQ
+3590320208,3590320231,GB
 3590320232,3590320239,IQ
 3590320240,3590320247,GB
 3590320248,3590320255,LB
 3590320256,3590320263,LY
 3590320264,3590320271,TZ
-3590320272,3590320335,IQ
-3590320336,3590320343,GB
-3590320344,3590320351,UG
+3590320272,3590320295,IQ
+3590320296,3590320303,GB
+3590320304,3590320335,IQ
+3590320336,3590320343,UG
+3590320344,3590320351,GB
 3590320352,3590320367,IQ
 3590320368,3590320375,GB
 3590320376,3590320383,IQ
-3590320384,3590320639,CM
-3590320640,3590321151,GB
+3590320384,3590321151,GB
 3590321152,3590321663,IQ
-3590321664,3590321711,GB
+3590321664,3590321679,GB
+3590321680,3590321687,CM
+3590321688,3590321695,IQ
+3590321696,3590321711,ZW
 3590321712,3590321727,IQ
-3590321728,3590321839,GB
+3590321728,3590321791,GB
+3590321792,3590321823,IQ
+3590321824,3590321839,GB
 3590321840,3590321855,US
 3590321856,3590321887,IQ
 3590321888,3590321919,CY
@@ -85833,30 +87217,34 @@
 3590321944,3590321959,IQ
 3590321960,3590321967,GB
 3590321968,3590321983,TR
-3590321984,3590321999,GB
+3590321984,3590321991,GB
+3590321992,3590321999,LB
 3590322000,3590322007,CY
 3590322008,3590322015,IQ
 3590322016,3590322023,GB
 3590322024,3590322031,IQ
 3590322032,3590322047,GB
 3590322048,3590322055,NG
-3590322056,3590322063,IQ
-3590322064,3590322071,GB
-3590322072,3590322079,IQ
-3590322080,3590322111,GB
+3590322056,3590322079,IQ
+3590322080,3590322095,GB
+3590322096,3590322103,IQ
+3590322104,3590322111,GB
 3590322112,3590322119,BJ
-3590322120,3590322127,LY
+3590322120,3590322127,IQ
 3590322128,3590322135,GH
 3590322136,3590322151,GB
-3590322152,3590322159,IQ
+3590322152,3590322159,LY
 3590322160,3590322167,GB
-3590322168,3590322175,IQ
-3590322176,3590322303,NG
-3590322304,3590322367,IQ
-3590322368,3590322375,GB
+3590322168,3590322239,IQ
+3590322240,3590322255,GB
+3590322256,3590322271,RW
+3590322272,3590322335,GB
+3590322336,3590322351,MG
+3590322352,3590322367,GB
+3590322368,3590322375,LB
 3590322376,3590322383,LY
 3590322384,3590322391,LB
-3590322392,3590322399,GB
+3590322392,3590322399,IQ
 3590322400,3590322415,AO
 3590322416,3590322423,LR
 3590322424,3590322431,GB
@@ -85867,8 +87255,7 @@
 3590323200,3590323711,MW
 3590323712,3590323903,GB
 3590323904,3590323911,CD
-3590323912,3590323967,GB
-3590323968,3590324223,NG
+3590323912,3590324223,GB
 3590324224,3623890943,US
 3623890944,3623891199,ZA
 3623891200,3623891455,US
@@ -85890,7 +87277,7 @@
 3624279088,3624288255,CA
 3624288256,3624290303,IN
 3624290304,3624292351,CA
-3624292352,3624292607,GP
+3624292352,3624292607,MF
 3624292608,3624297471,CA
 3624297472,3624298495,CO
 3624298496,3624299519,PH
@@ -85911,7 +87298,9 @@
 3624480768,3624484863,CA
 3624484864,3624529919,US
 3624529920,3624534015,CA
-3624534016,3624587263,US
+3624534016,3624534271,PA
+3624534272,3624536063,CA
+3624536064,3624587263,US
 3624587264,3624591359,JM
 3624591360,3624730623,US
 3624730624,3624796159,CA
@@ -85943,7 +87332,7 @@
 3624903680,3624904703,CA
 3624904704,3624905471,US
 3624905472,3624905727,CA
-3624905728,3624959999,US
+3624905728,3624964095,US
 3624976384,3624984575,US
 3624984576,3624992767,CA
 3624992768,3625019135,US
@@ -85972,7 +87361,7 @@
 3625148416,3625168895,US
 3625168896,3625172991,CA
 3625172992,3625254911,US
-3625255168,3625255423,US
+3625255168,3625255935,US
 3625256448,3625257983,US
 3625258752,3625259007,US
 3625259264,3625259519,US
@@ -86459,8 +87848,8 @@
 3631663152,3631663159,CA
 3631663160,3631665151,US
 3631665152,3631669247,CA
-3631669248,3631710207,US
-3631722496,3631841279,US
+3631669248,3631714303,US
+3631718400,3631841279,US
 3631841280,3631874047,CA
 3631874048,3631939583,US
 3631939584,3632005119,CA
@@ -86625,7 +88014,7 @@
 3633786880,3633815551,US
 3633815552,3633819647,CA
 3633819648,3633823743,US
-3633831936,3633848319,US
+3633831936,3633852415,US
 3633856512,3633881087,US
 3633881088,3633885183,AN
 3633885184,3633889279,US
@@ -86636,7 +88025,7 @@
 3634053120,3634061311,CL
 3634061312,3634511871,US
 3634511872,3634515967,CA
-3634515968,3634520063,US
+3634515968,3634524159,US
 3634528256,3634552831,US
 3634552832,3634556927,CA
 3634556928,3634880511,US
@@ -86739,13 +88128,29 @@
 3637072896,3637073151,CY
 3637073152,3637073215,US
 3637073216,3637073231,CY
-3637073232,3637075967,US
+3637073232,3637074239,US
+3637074240,3637074303,PA
+3637074304,3637074687,US
+3637074688,3637074703,CA
+3637074704,3637074751,US
+3637074752,3637074815,PA
+3637074816,3637074943,US
+3637074944,3637074959,CA
+3637074960,3637074975,US
+3637074976,3637075007,PA
+3637075008,3637075231,US
+3637075232,3637075263,PA
+3637075264,3637075487,US
+3637075488,3637075519,PA
+3637075520,3637075743,US
+3637075744,3637075775,PA
+3637075776,3637075967,US
 3637075968,3637080063,CA
 3637080064,3637389335,US
 3637389336,3637389343,CA
 3637389344,3637510143,US
 3637510144,3637641215,CA
-3637641216,3637657599,US
+3637641216,3637661695,US
 3637665792,3637667439,CA
 3637667440,3637667518,US
 3637667519,3637669887,CA
@@ -86761,8 +88166,8 @@
 3638247552,3638247679,DE
 3638247680,3638247855,US
 3638247856,3638247871,DE
-3638247872,3638247935,US
-3638247936,3638248703,GB
+3638247872,3638247903,US
+3638247904,3638248703,GB
 3638248704,3638249215,US
 3638249216,3638249471,GB
 3638249472,3638249751,US
@@ -86792,7 +88197,7 @@
 3638509568,3638534143,CA
 3638534144,3638697983,US
 3638697984,3638706175,CA
-3638706176,3638788095,US
+3638706176,3638796287,US
 3638804480,3638874111,US
 3638874112,3638878207,CA
 3638878208,3638898687,US
@@ -86811,8 +88216,7 @@
 3639258679,3639263231,CA
 3639263232,3639279615,US
 3639279616,3639283711,CA
-3639283712,3639308287,US
-3639312384,3639390207,US
+3639283712,3639390207,US
 3639394304,3639396351,US
 3639396352,3639396383,NE
 3639396384,3639396415,US
@@ -86976,8 +88380,9 @@
 3639680992,3639681023,CL
 3639681024,3639730175,US
 3639730176,3639734271,CA
-3639734272,3639812095,US
-3639820288,3639902207,US
+3639734272,3639886095,US
+3639886096,3639886103,CN
+3639886104,3639902207,US
 3639902208,3639903755,PE
 3639903756,3639903759,PA
 3639903760,3639904031,PE
@@ -87014,8 +88419,7 @@
 3640317560,3640317567,NL
 3640317568,3640318975,US
 3640318976,3640319103,GQ
-3640319104,3640328191,US
-3640336384,3640360959,US
+3640319104,3640360959,US
 3640360960,3640369151,CA
 3640369152,3640377343,US
 3640381440,3640410111,US
@@ -87274,7 +88678,11 @@
 3641762012,3641762047,GR
 3641762048,3641762571,CY
 3641762572,3641762575,GR
-3641762576,3641762647,CY
+3641762576,3641762591,CY
+3641762592,3641762595,GR
+3641762596,3641762607,CY
+3641762608,3641762611,GR
+3641762612,3641762647,CY
 3641762648,3641762655,GR
 3641762656,3641762703,CY
 3641762704,3641762711,GR
@@ -87315,7 +88723,9 @@
 3641764328,3641764607,CY
 3641764608,3641764631,GR
 3641764632,3641764635,CY
-3641764636,3641764679,GR
+3641764636,3641764647,GR
+3641764648,3641764651,CY
+3641764652,3641764679,GR
 3641764680,3641764683,CY
 3641764684,3641764699,GR
 3641764700,3641764703,CY
@@ -87327,7 +88737,9 @@
 3641764848,3641764856,CY
 3641764857,3641764863,GR
 3641764864,3641764875,CY
-3641764876,3641764927,GR
+3641764876,3641764899,GR
+3641764900,3641764903,CY
+3641764904,3641764927,GR
 3641764928,3641764931,CY
 3641764932,3641764943,GR
 3641764944,3641764951,CY
@@ -87382,11 +88794,21 @@
 3641860096,3641868287,IT
 3641868288,3641876479,RU
 3641876480,3641880575,ES
-3641880576,3641881447,DE
+3641880576,3641881343,DE
+3641881344,3641881359,US
+3641881360,3641881391,DE
+3641881392,3641881395,CH
+3641881396,3641881399,DE
+3641881400,3641881407,CH
+3641881408,3641881423,DE
+3641881424,3641881439,US
+3641881440,3641881447,DE
 3641881448,3641881455,CH
 3641881456,3641881567,DE
 3641881568,3641881583,CH
-3641881584,3641884671,DE
+3641881584,3641882727,DE
+3641882728,3641882735,CH
+3641882736,3641884671,DE
 3641884672,3641888767,NO
 3641888768,3641892863,IT
 3641892864,3641896959,ES
@@ -87403,7 +88825,9 @@
 3641950208,3641954303,FR
 3641954304,3641957887,MD
 3641957888,3641957951,GB
-3641957952,3641958399,MD
+3641957952,3641958143,MD
+3641958144,3641958207,GB
+3641958208,3641958399,MD
 3641958400,3641960699,BE
 3641960700,3641960703,NL
 3641960704,3641961727,BE
@@ -87425,41 +88849,21 @@
 3642007552,3642015743,UA
 3642015744,3642019839,CH
 3642019840,3642023935,RU
-3642028032,3642028288,GB
-3642028289,3642028295,NG
-3642028296,3642028303,GB
-3642028304,3642028319,NG
-3642028320,3642028327,AO
-3642028328,3642028503,NG
-3642028504,3642028511,GH
-3642028512,3642028519,SO
-3642028520,3642028543,CG
-3642028544,3642028599,NG
-3642028600,3642028607,GB
-3642028608,3642028671,NG
-3642028672,3642028703,GB
-3642028704,3642028735,NG
-3642028736,3642028767,GH
-3642028768,3642028815,GB
-3642028816,3642028823,GH
-3642028824,3642028863,NG
-3642028864,3642028959,GB
-3642028960,3642028991,NG
-3642028992,3642029051,GB
-3642029052,3642029055,SO
-3642029056,3642029183,GB
-3642029184,3642029199,SA
-3642029200,3642029215,GB
-3642029216,3642029247,CD
-3642029248,3642029407,GB
-3642029408,3642029439,SO
-3642029440,3642029567,GB
-3642029568,3642030623,NG
-3642030624,3642030631,CY
-3642030632,3642030847,NG
-3642030848,3642031519,GB
-3642031520,3642031551,UG
-3642031552,3642032127,GB
+3642028032,3642028287,GB
+3642028288,3642028543,NG
+3642028544,3642028544,GB
+3642028545,3642028799,NG
+3642028800,3642028800,GB
+3642028801,3642028863,SO
+3642028864,3642028928,GB
+3642028929,3642029055,NG
+3642029056,3642029056,GB
+3642029057,3642029311,NG
+3642029312,3642029567,GB
+3642029568,3642031359,NG
+3642031360,3642031616,GB
+3642031617,3642031871,NG
+3642031872,3642032127,GB
 3642032128,3642036223,PS
 3642036224,3642040319,RU
 3642040320,3642048511,BY
@@ -87477,7 +88881,7 @@
 3642089472,3642093567,SE
 3642093568,3642097663,NL
 3642097664,3642101759,GB
-3642101760,3642105855,NO
+3642101760,3642109951,NO
 3642109952,3642114047,BE
 3642114048,3642118143,NL
 3642118144,3642122239,GB
@@ -87548,12 +88952,11 @@
 3642322944,3642327039,AT
 3642327040,3642331135,DE
 3642331136,3642335231,RU
-3642335232,3642339327,UA
 3642339328,3642343423,FR
 3642343424,3642347519,UA
 3642347520,3642355711,RU
 3642355712,3642359807,SE
-3642359808,3642363903,RU
+3642359808,3642367999,RU
 3642368000,3642376191,CH
 3642376192,3642379519,CS
 3642379520,3642379711,CS
@@ -87575,7 +88978,7 @@
 3642415652,3642415655,MT
 3642415656,3642417151,GB
 3642417152,3642421247,IT
-3642425344,3642429439,DE
+3642421248,3642429439,DE
 3642429440,3642433535,GB
 3642433536,3642435583,CY
 3642435584,3642436607,RU
@@ -87595,6 +88998,7 @@
 3642441728,3642449919,IT
 3642449920,3642454015,CH
 3642454016,3642458111,IT
+3642458112,3642462207,RU
 3642462208,3642466303,UA
 3642466304,3642474495,SE
 3642474496,3642478591,DE
@@ -87624,9 +89028,7 @@
 3642552688,3642553103,NL
 3642553104,3642553119,LV
 3642553120,3642553151,NL
-3642553152,3642553289,LV
-3642553290,3642553291,NL
-3642553292,3642553326,LV
+3642553152,3642553326,LV
 3642553327,3642553343,NL
 3642553344,3642553363,RU
 3642553364,3642553375,NL
@@ -87648,9 +89050,7 @@
 3642553588,3642554111,NL
 3642554112,3642554151,RU
 3642554152,3642554175,NL
-3642554176,3642554193,RU
-3642554194,3642554195,NL
-3642554196,3642554197,RU
+3642554176,3642554197,RU
 3642554198,3642554199,NL
 3642554200,3642554203,RU
 3642554204,3642554205,NL
@@ -87695,8 +89095,8 @@
 3642555136,3642555223,LT
 3642555224,3642555227,LV
 3642555228,3642555391,LT
-3642555392,3642555475,PL
-3642555476,3642555647,NL
+3642555392,3642555479,PL
+3642555480,3642555647,NL
 3642555648,3642555683,SE
 3642555684,3642555687,NL
 3642555688,3642555695,SE
@@ -87707,8 +89107,8 @@
 3642555728,3642555735,SE
 3642555736,3642555743,GB
 3642555744,3642555759,SE
-3642555760,3642555767,GB
-3642555768,3642555935,NL
+3642555760,3642555771,GB
+3642555772,3642555935,NL
 3642555936,3642555983,UA
 3642555984,3642556159,NL
 3642556160,3642556415,LV
@@ -87741,6 +89141,7 @@
 3642654720,3642662911,PL
 3642662912,3642667007,GR
 3642667008,3642671103,FI
+3642671104,3642675199,UA
 3642675200,3642679295,BG
 3642679296,3642683391,DE
 3642683392,3642687487,RU
@@ -87789,7 +89190,9 @@
 3644923904,3644924927,IL
 3644924928,3644925055,US
 3644925056,3644925119,CI
-3644925120,3644927999,US
+3644925120,3644926207,US
+3644926208,3644926223,IL
+3644926224,3644927999,US
 3644928000,3644932095,GI
 3644932096,3644936191,IT
 3644936192,3644940287,RU
@@ -87802,8 +89205,9 @@
 3644961792,3644964351,TR
 3644964352,3644964383,DE
 3644964384,3644964863,TR
-3644964864,3644965479,RS
-3644965480,3644968959,CS
+3644964864,3644966911,RS
+3644966912,3644966927,CS
+3644966928,3644968959,RS
 3644968960,3644973055,RU
 3644973056,3644977151,NO
 3644977152,3644981247,UA
@@ -87828,6 +89232,7 @@
 3645071360,3645075455,DE
 3645075456,3645079551,RU
 3645079552,3645083647,IE
+3645083648,3645087743,FR
 3645087744,3645091839,ES
 3645091840,3645095935,RU
 3645095936,3645104127,PL
@@ -87892,9 +89297,7 @@
 3645281280,3645281535,DE
 3645281536,3645281791,IT
 3645281792,3645281919,HU
-3645281920,3645282047,IT
-3645282048,3645282303,DE
-3645282304,3645284351,IT
+3645281920,3645284351,IT
 3645284352,3645288447,DE
 3645288448,3645292543,FR
 3645292544,3645295103,DE
@@ -87910,7 +89313,7 @@
 3645325312,3645329407,IT
 3645329408,3645333503,CH
 3645333504,3645334031,DE
-3645335040,3645336927,DE
+3645334272,3645336927,DE
 3645336936,3645336991,DE
 3645337008,3645337023,DE
 3645337088,3645337599,DE
@@ -87945,9 +89348,7 @@
 3645386752,3645390847,SE
 3645390848,3645399039,SI
 3645399040,3645403135,IT
-3645403136,3645404671,DE
-3645404672,3645405183,CH
-3645405184,3645408255,DE
+3645403136,3645408255,DE
 3645408256,3645408319,CH
 3645408320,3645411327,DE
 3645411328,3645415423,RU
@@ -87962,6 +89363,7 @@
 3645456640,3645456895,DE
 3645456896,3645457407,GB
 3645457408,3645460479,DE
+3645460480,3645464575,UA
 3645464576,3645468671,SE
 3645468672,3645472767,RU
 3645472768,3645476607,UA
@@ -87997,9 +89399,8 @@
 3645563136,3645564671,LS
 3645564672,3645564927,PK
 3645564928,3645565055,SO
-3645565056,3645565439,GB
-3645565440,3645565951,NG
-3645565952,3645566975,ZW
+3645565056,3645565695,GB
+3645565696,3645566975,ZW
 3645566976,3645571071,RU
 3645571072,3645575167,IE
 3645575168,3645579263,CH
@@ -88019,6 +89420,7 @@
 3645620224,3645624319,BA
 3645624320,3645628415,CZ
 3645628416,3645636607,ES
+3645636608,3645640703,AM
 3645640704,3645644799,NL
 3645644800,3645648895,RU
 3645648896,3645652991,SE
@@ -88254,7 +89656,7 @@
 3645763856,3645763858,DE
 3645763859,3645763859,DK
 3645763860,3645763860,IT
-3645763861,3645763861,BE
+3645763861,3645763861,DE
 3645763862,3645763862,FR
 3645763863,3645763864,ES
 3645763865,3645763865,CH
@@ -88979,9 +90381,7 @@
 3646501712,3646501719,US
 3646501720,3646513103,DE
 3646513104,3646513111,CA
-3646513112,3646519103,DE
-3646519104,3646519135,GB
-3646519136,3646947327,DE
+3646513112,3646947327,DE
 3646947328,3647209471,PL
 3647209472,3647602687,NL
 3647602688,3647658751,RU
@@ -89223,38 +90623,36 @@
 3647872960,3647872967,GB
 3647872968,3647872975,DE
 3647872976,3647872983,GB
-3647872984,3647873039,DE
-3647873040,3647873047,GB
-3647873048,3647873075,DE
-3647873076,3647873079,GB
-3647873080,3647873095,DE
-3647873096,3647873103,GB
+3647872984,3647873071,DE
+3647873072,3647873079,GB
+3647873080,3647873087,DE
+3647873088,3647873103,GB
 3647873104,3647873279,DE
-3647873280,3647873343,GB
-3647873344,3647873535,DE
-3647873536,3647873663,GB
-3647873664,3647874958,DE
+3647873280,3647873319,GB
+3647873320,3647873375,DE
+3647873376,3647873407,GB
+3647873408,3647873535,DE
+3647873536,3647873567,GB
+3647873568,3647873599,DE
+3647873600,3647873647,GB
+3647873648,3647874958,DE
 3647874959,3647874959,GB
 3647874960,3647875039,DE
-3647875040,3647875063,GB
-3647875064,3647875095,DE
+3647875040,3647875055,GB
+3647875056,3647875095,DE
 3647875096,3647875103,GB
 3647875104,3647875111,DE
 3647875112,3647875119,GB
 3647875120,3647875127,DE
-3647875128,3647875135,GB
-3647875136,3647875175,DE
-3647875176,3647875183,GB
-3647875184,3647875199,DE
-3647875200,3647875231,GB
+3647875128,3647875151,GB
+3647875152,3647875175,DE
+3647875176,3647875231,GB
 3647875232,3647875239,DE
-3647875240,3647875247,GB
-3647875248,3647875327,DE
+3647875240,3647875255,GB
+3647875256,3647875327,DE
 3647875328,3647875343,GB
 3647875344,3647875367,DE
-3647875368,3647875375,GB
-3647875376,3647875379,DE
-3647875380,3647875383,GB
+3647875368,3647875383,GB
 3647875384,3647875455,DE
 3647875456,3647875487,GB
 3647875488,3647875527,DE
@@ -89263,7 +90661,9 @@
 3647876096,3647876359,GB
 3647876360,3647876375,DE
 3647876376,3647876383,GB
-3647876384,3647876439,DE
+3647876384,3647876415,DE
+3647876416,3647876431,GB
+3647876432,3647876439,DE
 3647876440,3647876447,GB
 3647876448,3647876455,DE
 3647876456,3647876471,GB
@@ -89273,13 +90673,13 @@
 3647876664,3647876671,GB
 3647876672,3647876703,DE
 3647876704,3647876711,GB
-3647876712,3647876767,DE
-3647876768,3647876783,GB
+3647876712,3647876759,DE
+3647876760,3647876783,GB
 3647876784,3647876839,DE
-3647876840,3647876847,GB
-3647876848,3647877447,DE
-3647877448,3647877463,GB
-3647877464,3647877495,DE
+3647876840,3647876863,GB
+3647876864,3647877447,DE
+3647877448,3647877455,GB
+3647877456,3647877495,DE
 3647877496,3647877503,GB
 3647877504,3647877567,DE
 3647877568,3647877599,GB
@@ -89300,19 +90700,21 @@
 3647877952,3647878103,DE
 3647878104,3647878111,GB
 3647878112,3647878447,DE
-3647878448,3647878463,GB
-3647878464,3647878487,DE
+3647878448,3647878479,GB
+3647878480,3647878487,DE
 3647878488,3647878495,GB
 3647878496,3647878503,DE
 3647878504,3647878527,GB
 3647878528,3647878591,DE
 3647878592,3647878607,GB
 3647878608,3647879231,DE
-3647879232,3647879295,GB
-3647879296,3647879695,DE
+3647879232,3647879263,GB
+3647879264,3647879695,DE
 3647879696,3647879703,GB
 3647879704,3647879735,DE
-3647879736,3647879807,GB
+3647879736,3647879743,GB
+3647879744,3647879775,DE
+3647879776,3647879807,GB
 3647879808,3647879839,DE
 3647879840,3647879867,GB
 3647879868,3647879879,DE
@@ -89322,8 +90724,8 @@
 3647879904,3647879935,DE
 3647879936,3647879999,GB
 3647880000,3647880047,DE
-3647880048,3647880063,GB
-3647880064,3647880183,DE
+3647880048,3647880127,GB
+3647880128,3647880183,DE
 3647880184,3647880447,GB
 3647880448,3647880959,DE
 3647880960,3647880991,GB
@@ -89333,17 +90735,21 @@
 3647881136,3647881183,GB
 3647881184,3647881199,DE
 3647881200,3647881215,GB
-3647881216,3647881243,DE
+3647881216,3647881231,DE
+3647881232,3647881239,GB
+3647881240,3647881243,DE
 3647881244,3647881247,GB
 3647881248,3647881271,DE
 3647881272,3647881279,GB
 3647881280,3647881375,DE
-3647881376,3647881399,GB
-3647881400,3647881471,DE
+3647881376,3647881383,GB
+3647881384,3647881471,DE
 3647881472,3647881727,GB
 3647881728,3647881991,DE
-3647881992,3647881995,GB
-3647881996,3647882343,DE
+3647881992,3647881999,GB
+3647882000,3647882271,DE
+3647882272,3647882303,GB
+3647882304,3647882343,DE
 3647882344,3647882351,GB
 3647882352,3647882359,DE
 3647882360,3647882367,GB
@@ -89354,64 +90760,84 @@
 3647882504,3647882511,DE
 3647882512,3647882575,GB
 3647882576,3647882623,DE
-3647882624,3647882751,GB
-3647882752,3647883071,DE
+3647882624,3647882687,GB
+3647882688,3647883071,DE
 3647883072,3647883095,GB
 3647883096,3647883135,DE
-3647883136,3647883199,GB
-3647883200,3647883207,DE
+3647883136,3647883151,GB
+3647883152,3647883207,DE
 3647883208,3647883215,GB
 3647883216,3647883231,DE
 3647883232,3647883239,GB
-3647883240,3647884287,DE
-3647884288,3647884799,GB
-3647884800,3647884847,DE
-3647884848,3647884855,GB
-3647884856,3647884915,DE
+3647883240,3647883551,DE
+3647883552,3647883559,GB
+3647883560,3647883575,DE
+3647883576,3647883583,GB
+3647883584,3647884287,DE
+3647884288,3647884351,GB
+3647884352,3647884367,DE
+3647884368,3647884383,GB
+3647884384,3647884415,DE
+3647884416,3647884543,GB
+3647884544,3647884847,DE
+3647884848,3647884863,GB
+3647884864,3647884895,DE
+3647884896,3647884907,GB
+3647884908,3647884915,DE
 3647884916,3647884919,GB
-3647884920,3647885191,DE
-3647885192,3647885215,GB
+3647884920,3647885199,DE
+3647885200,3647885215,GB
 3647885216,3647885247,DE
-3647885248,3647885311,GB
-3647885312,3647885575,DE
+3647885248,3647885567,GB
+3647885568,3647885575,DE
 3647885576,3647885583,GB
 3647885584,3647885599,DE
 3647885600,3647885607,GB
-3647885608,3647885663,DE
-3647885664,3647885695,GB
-3647885696,3647886187,DE
-3647886188,3647886191,GB
-3647886192,3647886271,DE
+3647885608,3647885759,DE
+3647885760,3647886079,GB
+3647886080,3647886111,DE
+3647886112,3647886119,GB
+3647886120,3647886175,DE
+3647886176,3647886183,GB
+3647886184,3647886187,DE
+3647886188,3647886199,GB
+3647886200,3647886271,DE
 3647886272,3647886303,GB
-3647886304,3647886727,DE
+3647886304,3647886335,DE
+3647886336,3647886591,GB
+3647886592,3647886727,DE
 3647886728,3647886847,GB
 3647886848,3647887427,DE
-3647887428,3647887431,GB
-3647887432,3647887479,DE
-3647887480,3647887483,GB
-3647887484,3647887519,DE
-3647887520,3647887527,GB
-3647887528,3647887543,DE
-3647887544,3647887551,GB
-3647887552,3647887599,DE
+3647887428,3647887447,GB
+3647887448,3647887471,DE
+3647887472,3647887483,GB
+3647887484,3647887487,DE
+3647887488,3647887527,GB
+3647887528,3647887599,DE
 3647887600,3647887615,GB
-3647887616,3647887871,DE
+3647887616,3647887679,DE
+3647887680,3647887743,GB
+3647887744,3647887871,DE
 3647887872,3647887903,GB
 3647887904,3647887911,DE
-3647887912,3647887919,GB
-3647887920,3647887951,DE
-3647887952,3647887959,GB
-3647887960,3647888895,DE
+3647887912,3647887951,GB
+3647887952,3647887959,DE
+3647887960,3647887967,GB
+3647887968,3647888135,DE
+3647888136,3647888143,GB
+3647888144,3647888199,DE
+3647888200,3647888207,GB
+3647888208,3647888215,DE
+3647888216,3647888223,GB
+3647888224,3647888255,DE
+3647888256,3647888383,GB
+3647888384,3647888895,DE
 3647888896,3647888959,GB
 3647888960,3647889023,DE
 3647889024,3647889055,GB
 3647889056,3647889215,DE
 3647889216,3647889231,GB
-3647889232,3647889279,DE
-3647889280,3647889343,GB
-3647889344,3647889359,DE
-3647889360,3647889367,GB
-3647889368,3647889375,DE
+3647889232,3647889375,DE
 3647889376,3647889383,GB
 3647889384,3647889407,DE
 3647889408,3647889471,GB
@@ -89421,20 +90847,22 @@
 3647889688,3647889695,GB
 3647889696,3647889727,DE
 3647889728,3647889735,GB
-3647889736,3647889775,DE
-3647889776,3647889783,GB
-3647889784,3647890247,DE
+3647889736,3647890175,DE
+3647890176,3647890239,GB
+3647890240,3647890247,DE
 3647890248,3647890255,GB
-3647890256,3647890271,DE
-3647890272,3647890295,GB
+3647890256,3647890279,DE
+3647890280,3647890295,GB
 3647890296,3647890375,DE
 3647890376,3647890447,GB
 3647890448,3647890471,DE
 3647890472,3647890479,GB
 3647890480,3647890487,DE
 3647890488,3647890527,GB
-3647890528,3647890543,DE
-3647890544,3647891199,GB
+3647890528,3647890559,DE
+3647890560,3647890847,GB
+3647890848,3647890879,DE
+3647890880,3647891199,GB
 3647891200,3647891463,DE
 3647891464,3647891471,GB
 3647891472,3647891487,DE
@@ -89476,31 +90904,35 @@
 3647895808,3647896095,DE
 3647896096,3647896127,GB
 3647896128,3647896159,DE
-3647896160,3647896351,GB
-3647896352,3647896399,DE
-3647896400,3647896407,GB
-3647896408,3647896415,DE
-3647896416,3647896423,GB
-3647896424,3647896511,DE
+3647896160,3647896223,GB
+3647896224,3647896255,DE
+3647896256,3647896295,GB
+3647896296,3647896303,DE
+3647896304,3647896311,GB
+3647896312,3647896319,DE
+3647896320,3647896351,GB
+3647896352,3647896463,DE
+3647896464,3647896471,GB
+3647896472,3647896511,DE
 3647896512,3647896519,GB
 3647896520,3647896527,DE
-3647896528,3647896543,GB
-3647896544,3647896559,DE
-3647896560,3647896567,GB
-3647896568,3647896631,DE
-3647896632,3647896647,GB
-3647896648,3647896671,DE
+3647896528,3647896559,GB
+3647896560,3647896575,DE
+3647896576,3647896607,GB
+3647896608,3647896623,DE
+3647896624,3647896631,GB
+3647896632,3647896671,DE
 3647896672,3647896679,GB
 3647896680,3647896687,DE
 3647896688,3647896695,GB
-3647896696,3647897039,DE
-3647897040,3647897047,GB
-3647897048,3647897087,DE
-3647897088,3647897095,GB
-3647897096,3647897111,DE
+3647896696,3647897047,DE
+3647897048,3647897055,GB
+3647897056,3647897087,DE
+3647897088,3647897103,GB
+3647897104,3647897111,DE
 3647897112,3647897135,GB
-3647897136,3647897215,DE
-3647897216,3647897343,GB
+3647897136,3647897295,DE
+3647897296,3647897343,GB
 3647897344,3647897359,DE
 3647897360,3647897375,GB
 3647897376,3647897415,DE
@@ -89512,7 +90944,9 @@
 3647901264,3647901439,DE
 3647901440,3647901519,GB
 3647901520,3647901535,DE
-3647901536,3647901695,GB
+3647901536,3647901567,GB
+3647901568,3647901583,DE
+3647901584,3647901695,GB
 3647901696,3647901735,DE
 3647901736,3647901743,GB
 3647901744,3647901751,DE
@@ -89565,9 +90999,7 @@
 3647904392,3647904398,GB
 3647904399,3647904399,DE
 3647904400,3647904447,GB
-3647904448,3647904639,DE
-3647904640,3647904671,GB
-3647904672,3647904735,DE
+3647904448,3647904735,DE
 3647904736,3647904751,GB
 3647904752,3647904799,DE
 3647904800,3647904807,GB
@@ -89824,37 +91256,43 @@
 3647921984,3647922095,DE
 3647922096,3647922103,GB
 3647922104,3647922167,DE
-3647922168,3647922207,GB
-3647922208,3647922219,DE
+3647922168,3647922215,GB
+3647922216,3647922219,DE
 3647922220,3647922223,GB
-3647922224,3647922231,DE
-3647922232,3647922239,GB
-3647922240,3647922271,DE
-3647922272,3647922287,GB
-3647922288,3647922303,DE
-3647922304,3647922367,GB
-3647922368,3647922687,DE
+3647922224,3647922239,DE
+3647922240,3647922271,GB
+3647922272,3647922335,DE
+3647922336,3647922367,GB
+3647922368,3647922415,DE
+3647922416,3647922423,GB
+3647922424,3647922455,DE
+3647922456,3647922463,GB
+3647922464,3647922647,DE
+3647922648,3647922655,GB
+3647922656,3647922687,DE
 3647922688,3647922811,GB
 3647922812,3647922815,DE
 3647922816,3647922831,GB
 3647922832,3647922835,DE
 3647922836,3647922843,GB
 3647922844,3647922847,DE
-3647922848,3647922943,GB
-3647922944,3647922951,DE
+3647922848,3647922951,GB
 3647922952,3647922959,FR
-3647922960,3647922967,GB
-3647922968,3647922975,DE
-3647922976,3647922991,GB
-3647922992,3647923327,DE
+3647922960,3647922967,DE
+3647922968,3647922983,GB
+3647922984,3647923327,DE
 3647923328,3647923331,GB
 3647923332,3647923343,DE
 3647923344,3647923351,GB
-3647923352,3647923399,DE
-3647923400,3647923407,GB
-3647923408,3647923775,DE
-3647923776,3647923839,GB
-3647923840,3647924199,DE
+3647923352,3647923391,DE
+3647923392,3647923407,GB
+3647923408,3647923455,DE
+3647923456,3647923711,GB
+3647923712,3647923775,DE
+3647923776,3647923967,GB
+3647923968,3647924183,DE
+3647924184,3647924191,GB
+3647924192,3647924199,DE
 3647924200,3647924207,GB
 3647924208,3647924287,DE
 3647924288,3647924383,GB
@@ -89894,8 +91332,8 @@
 3647926224,3647926239,GB
 3647926240,3647926255,DE
 3647926256,3647926271,GB
-3647926272,3647926343,DE
-3647926344,3647926375,GB
+3647926272,3647926351,DE
+3647926352,3647926375,GB
 3647926376,3647926407,DE
 3647926408,3647926423,GB
 3647926424,3647926463,DE
@@ -89978,30 +91416,32 @@
 3647930384,3647930399,GB
 3647930400,3647930471,DE
 3647930472,3647930479,GB
-3647930480,3647930487,DE
-3647930488,3647930495,GB
-3647930496,3647930623,DE
+3647930480,3647930623,DE
 3647930624,3647930879,GB
 3647930880,3647931159,DE
 3647931160,3647931199,GB
 3647931200,3647931279,DE
-3647931280,3647931287,GB
-3647931288,3647931311,DE
-3647931312,3647931327,GB
-3647931328,3647931391,DE
+3647931280,3647931295,GB
+3647931296,3647931391,DE
 3647931392,3647931611,GB
 3647931612,3647931615,DE
 3647931616,3647931647,GB
 3647931648,3647931775,DE
 3647931776,3647931783,GB
-3647931784,3647931799,DE
+3647931784,3647931787,DE
+3647931788,3647931791,GB
+3647931792,3647931799,DE
 3647931800,3647931807,GB
 3647931808,3647931855,DE
 3647931856,3647931863,GB
-3647931864,3647932199,DE
+3647931864,3647931871,DE
+3647931872,3647931879,GB
+3647931880,3647932199,DE
 3647932200,3647932223,GB
 3647932224,3647932287,DE
-3647932288,3647932671,GB
+3647932288,3647932351,GB
+3647932352,3647932383,DE
+3647932384,3647932671,GB
 3647932672,3647932975,DE
 3647932976,3647932991,GB
 3647932992,3647933063,DE
@@ -90040,28 +91480,38 @@
 3647936640,3647936655,GB
 3647936656,3647936659,DE
 3647936660,3647936767,GB
-3647936768,3647936943,DE
+3647936768,3647936775,DE
+3647936776,3647936783,GB
+3647936784,3647936823,DE
+3647936824,3647936839,GB
+3647936840,3647936943,DE
 3647936944,3647936959,GB
 3647936960,3647937535,DE
 3647937536,3647937595,GB
 3647937596,3647937599,DE
 3647937600,3647937611,GB
 3647937612,3647937615,DE
-3647937616,3647937791,GB
-3647937792,3647938559,DE
-3647938560,3647938575,GB
+3647937616,3647938047,GB
+3647938048,3647938207,DE
+3647938208,3647938215,GB
+3647938216,3647938231,DE
+3647938232,3647938239,GB
+3647938240,3647938303,DE
+3647938304,3647938463,GB
+3647938464,3647938471,DE
+3647938472,3647938479,GB
+3647938480,3647938495,DE
+3647938496,3647938575,GB
 3647938576,3647938583,DE
 3647938584,3647938591,GB
 3647938592,3647938615,DE
 3647938616,3647938623,GB
-3647938624,3647938631,DE
-3647938632,3647938655,GB
+3647938624,3647938639,DE
+3647938640,3647938655,GB
 3647938656,3647938671,DE
 3647938672,3647938727,GB
-3647938728,3647938735,DE
-3647938736,3647938751,GB
-3647938752,3647938759,DE
-3647938760,3647938783,GB
+3647938728,3647938767,DE
+3647938768,3647938783,GB
 3647938784,3647938807,DE
 3647938808,3647938879,GB
 3647938880,3647938887,DE
@@ -90071,7 +91521,11 @@
 3647938936,3647938943,DE
 3647938944,3647938975,GB
 3647938976,3647938983,DE
-3647938984,3647939103,GB
+3647938984,3647938999,GB
+3647939000,3647939007,DE
+3647939008,3647939031,GB
+3647939032,3647939047,DE
+3647939048,3647939103,GB
 3647939104,3647939143,DE
 3647939144,3647939151,GB
 3647939152,3647939167,DE
@@ -90094,17 +91548,19 @@
 3647939928,3647939935,GB
 3647939936,3647940047,DE
 3647940048,3647940055,GB
-3647940056,3647940415,DE
-3647940416,3647940607,GB
+3647940056,3647940447,DE
+3647940448,3647940607,GB
 3647940608,3647941119,DE
 3647941120,3647941127,GB
 3647941128,3647941135,DE
 3647941136,3647941151,GB
-3647941152,3647941167,DE
-3647941168,3647941375,GB
+3647941152,3647941215,DE
+3647941216,3647941375,GB
 3647941376,3647941559,DE
 3647941560,3647941567,GB
-3647941568,3647941887,DE
+3647941568,3647941575,DE
+3647941576,3647941583,GB
+3647941584,3647941887,DE
 3647941888,3647941935,GB
 3647941936,3647941939,DE
 3647941940,3647941943,GB
@@ -90122,15 +91578,21 @@
 3647942024,3647942031,GB
 3647942032,3647942047,DE
 3647942048,3647942399,GB
-3647942400,3647942711,DE
+3647942400,3647942687,DE
+3647942688,3647942695,GB
+3647942696,3647942711,DE
 3647942712,3647942719,GB
-3647942720,3647942815,DE
-3647942816,3647942847,GB
+3647942720,3647942783,DE
+3647942784,3647942815,GB
+3647942816,3647942839,DE
+3647942840,3647942847,GB
 3647942848,3647942903,DE
-3647942904,3647942911,GB
-3647942912,3647943207,DE
-3647943208,3647943215,GB
-3647943216,3647943423,DE
+3647942904,3647943167,GB
+3647943168,3647943207,DE
+3647943208,3647943231,GB
+3647943232,3647943295,DE
+3647943296,3647943327,GB
+3647943328,3647943423,DE
 3647943424,3647943431,GB
 3647943432,3647943435,DE
 3647943436,3647943499,GB
@@ -90139,34 +91601,50 @@
 3647943528,3647943543,DE
 3647943544,3647943547,GB
 3647943548,3647943559,DE
-3647943560,3647943679,GB
-3647943680,3647944591,DE
-3647944592,3647944599,GB
-3647944600,3647944623,DE
+3647943560,3647943935,GB
+3647943936,3647944087,DE
+3647944088,3647944095,GB
+3647944096,3647944575,DE
+3647944576,3647944583,GB
+3647944584,3647944591,DE
+3647944592,3647944615,GB
+3647944616,3647944623,DE
 3647944624,3647944671,GB
 3647944672,3647944687,DE
 3647944688,3647944703,GB
-3647944704,3647945475,DE
+3647944704,3647945215,DE
+3647945216,3647945471,GB
+3647945472,3647945475,DE
 3647945476,3647945531,GB
 3647945532,3647945535,DE
 3647945536,3647945635,GB
 3647945636,3647945643,DE
 3647945644,3647945727,GB
 3647945728,3647945983,DE
-3647945984,3647946239,GB
-3647946240,3647946499,DE
+3647945984,3647946063,GB
+3647946064,3647946071,DE
+3647946072,3647946111,GB
+3647946112,3647946127,DE
+3647946128,3647946143,GB
+3647946144,3647946175,DE
+3647946176,3647946495,GB
+3647946496,3647946499,DE
 3647946500,3647946503,GB
 3647946504,3647946527,DE
 3647946528,3647946559,GB
-3647946560,3647947391,DE
+3647946560,3647946687,DE
+3647946688,3647946719,GB
+3647946720,3647947391,DE
 3647947392,3647947399,GB
 3647947400,3647947407,DE
 3647947408,3647947415,GB
 3647947416,3647947423,DE
-3647947424,3647947431,GB
-3647947432,3647947447,DE
+3647947424,3647947439,GB
+3647947440,3647947447,DE
 3647947448,3647947455,GB
-3647947456,3647947647,DE
+3647947456,3647947487,DE
+3647947488,3647947519,GB
+3647947520,3647947647,DE
 3647947648,3647947711,GB
 3647947712,3647947735,DE
 3647947736,3647947775,GB
@@ -90179,19 +91657,25 @@
 3647948808,3647948815,DE
 3647948816,3647949063,GB
 3647949064,3647949079,DE
-3647949080,3647949119,GB
+3647949080,3647949087,GB
+3647949088,3647949095,DE
+3647949096,3647949119,GB
 3647949120,3647949151,DE
 3647949152,3647949183,GB
-3647949184,3647949887,DE
+3647949184,3647949439,DE
+3647949440,3647949567,GB
+3647949568,3647949887,DE
 3647949888,3647949951,GB
-3647949952,3647950015,DE
-3647950016,3647950847,GB
+3647949952,3647950047,DE
+3647950048,3647950847,GB
 3647950848,3647953023,DE
 3647953024,3647953039,GB
 3647953040,3647953055,DE
 3647953056,3647953079,GB
 3647953080,3647953407,DE
-3647953408,3647953663,GB
+3647953408,3647953503,GB
+3647953504,3647953511,DE
+3647953512,3647953663,GB
 3647953664,3647953791,DE
 3647953792,3647953823,GB
 3647953824,3647953919,DE
@@ -90200,23 +91684,23 @@
 3647954208,3647954215,GB
 3647954216,3647954231,DE
 3647954232,3647954239,GB
-3647954240,3647954263,DE
-3647954264,3647954271,GB
-3647954272,3647954719,DE
+3647954240,3647954719,DE
 3647954720,3647954815,GB
-3647954816,3647954879,DE
-3647954880,3647955199,GB
+3647954816,3647954911,DE
+3647954912,3647955199,GB
 3647955200,3647955207,DE
 3647955208,3647955215,GB
 3647955216,3647955287,DE
 3647955288,3647955295,GB
-3647955296,3647955303,DE
-3647955304,3647955335,GB
-3647955336,3647955391,DE
-3647955392,3647955399,GB
-3647955400,3647955423,DE
-3647955424,3647955431,GB
-3647955432,3647956615,DE
+3647955296,3647955311,DE
+3647955312,3647955327,GB
+3647955328,3647955383,DE
+3647955384,3647955399,GB
+3647955400,3647955415,DE
+3647955416,3647955431,GB
+3647955432,3647956479,DE
+3647956480,3647956607,GB
+3647956608,3647956615,DE
 3647956616,3647956671,GB
 3647956672,3647956991,DE
 3647956992,3647957503,GB
@@ -90226,19 +91710,46 @@
 3647957560,3647957599,GB
 3647957600,3647957623,DE
 3647957624,3647957727,GB
-3647957728,3647957735,DE
-3647957736,3647959567,GB
+3647957728,3647957759,DE
+3647957760,3647957887,GB
+3647957888,3647958015,DE
+3647958016,3647958527,GB
+3647958528,3647958655,DE
+3647958656,3647958687,GB
+3647958688,3647958911,DE
+3647958912,3647959559,GB
+3647959560,3647959567,DE
 3647959568,3647959575,ES
-3647959576,3647959679,GB
+3647959576,3647959607,GB
+3647959608,3647959615,DE
+3647959616,3647959655,GB
+3647959656,3647959671,DE
+3647959672,3647959679,GB
 3647959680,3647959687,DE
-3647959688,3647962143,GB
-3647962144,3647962151,DE
-3647962152,3647963231,GB
+3647959688,3647959711,GB
+3647959712,3647959775,DE
+3647959776,3647960831,GB
+3647960832,3647960839,DE
+3647960840,3647960847,GB
+3647960848,3647961087,DE
+3647961088,3647961151,GB
+3647961152,3647961215,DE
+3647961216,3647961279,GB
+3647961280,3647961311,DE
+3647961312,3647961343,GB
+3647961344,3647961471,DE
+3647961472,3647962111,GB
+3647962112,3647962151,DE
+3647962152,3647962159,GB
+3647962160,3647962191,DE
+3647962192,3647963167,GB
+3647963168,3647963183,BE
+3647963184,3647963231,GB
 3647963232,3647963263,BE
 3647963264,3647963647,GB
 3647963648,3647963711,BE
 3647963712,3647995903,GB
-3648000000,3648004095,RU
+3647995904,3648004095,RU
 3648004096,3648004607,GB
 3648004608,3648004863,RU
 3648004864,3648005119,GB
@@ -90335,7 +91846,13 @@
 3648181120,3648181247,IE
 3648181248,3648181311,DE
 3648181312,3648181343,AT
-3648181344,3648182143,DE
+3648181344,3648181631,DE
+3648181632,3648181647,AT
+3648181648,3648181887,DE
+3648181888,3648181903,AT
+3648181904,3648181951,DE
+3648181952,3648181967,RU
+3648181968,3648182143,DE
 3648182144,3648182159,NL
 3648182160,3648182175,DE
 3648182176,3648182207,RU
@@ -90347,9 +91864,10 @@
 3648182824,3648182831,RU
 3648182832,3648182847,DE
 3648182848,3648182911,IT
-3648182912,3648184319,DE
+3648182912,3648183871,DE
+3648183872,3648183935,GB
+3648183936,3648184319,DE
 3648184320,3648192511,RU
-3648192512,3648196607,ES
 3648196608,3648200703,IT
 3648200704,3648208895,SE
 3648208896,3648212991,DE
@@ -90413,11 +91931,15 @@
 3648397312,3648405503,NO
 3648405504,3648413695,RU
 3648413696,3648417791,SK
-3648417792,3648417879,AT
+3648417792,3648417807,AT
+3648417808,3648417815,GB
+3648417816,3648417879,AT
 3648417880,3648417919,GB
 3648417920,3648418047,AT
 3648418048,3648418079,GB
-3648418080,3648418247,ES
+3648418080,3648418135,ES
+3648418136,3648418143,GB
+3648418144,3648418247,ES
 3648418248,3648418255,CH
 3648418256,3648418303,ES
 3648418304,3648419327,GB
@@ -90457,6 +91979,7 @@
 3648475136,3648479231,RU
 3648479232,3648483327,CH
 3648483328,3648487423,SK
+3648487424,3648491519,FR
 3648491520,3648495615,CH
 3648495616,3648499711,SE
 3648499712,3648503807,FR
@@ -90542,8 +92065,10 @@
 3650236693,3650236911,GB
 3650236912,3650236926,CH
 3650236927,3650240511,GB
+3650240512,3650244607,EE
 3650244608,3650256895,GB
 3650256896,3650265087,DE
+3650265088,3650269183,CH
 3650269184,3650273279,GB
 3650273280,3650277375,IT
 3650277376,3650281471,IR
@@ -90551,7 +92076,6 @@
 3650285568,3650289663,UA
 3650289664,3650297855,RU
 3650297856,3650301951,LT
-3650301952,3650306047,RU
 3650306048,3650306623,DE
 3650306624,3650306639,GE
 3650306640,3650306775,DE
@@ -90616,6 +92140,7 @@
 3650392064,3650396159,NO
 3650396160,3650404351,NL
 3650404352,3650412543,RU
+3650412544,3650416639,DE
 3650416640,3650420735,BE
 3650420736,3650424831,ES
 3650424832,3650428927,RU
@@ -90740,8 +92265,9 @@
 3651108480,3651108543,ES
 3651108544,3651108863,DE
 3651108864,3651141631,EE
-3651141632,3651198975,DE
-3651198976,3651207167,US
+3651141632,3651202815,DE
+3651202816,3651203071,GB
+3651203072,3651207167,US
 3651207168,3651207199,GB
 3651207224,3651207295,GB
 3651207424,3651207615,GB
@@ -90789,7 +92315,8 @@
 3651694848,3651694975,NG
 3651694976,3651695103,PT
 3651695104,3651695359,CV
-3651695360,3651696639,PT
+3651695360,3651695615,AO
+3651695616,3651696639,PT
 3651696640,3651698687,AO
 3651698688,3651702783,PL
 3651702784,3651706879,GB
@@ -90886,6 +92413,7 @@
 3651821568,3651825663,CZ
 3651825664,3651829759,RU
 3651829760,3651833855,NO
+3651837952,3651842047,PL
 3651842048,3651846143,DE
 3651846144,3651850239,NO
 3651850240,3651854335,RU
@@ -90987,6 +92515,7 @@
 3651954432,3651958271,IR
 3651958272,3651958783,UA
 3651958784,3651960831,IR
+3651960832,3651964927,GB
 3651964928,3651969023,SK
 3651969024,3651977215,DE
 3651977216,3651985407,IT
@@ -91010,8 +92539,8 @@
 3652019792,3652019807,GB
 3652019808,3652019815,IE
 3652019816,3652019887,GB
-3652019888,3652019903,IE
-3652019904,3652019951,GB
+3652019888,3652019935,IE
+3652019936,3652019951,GB
 3652019952,3652019967,IE
 3652019968,3652020479,GB
 3652020480,3652020735,IE
@@ -91070,6 +92599,7 @@
 3652059136,3652063231,RU
 3652063232,3652067327,IR
 3652067328,3652071423,TR
+3652071424,3652075519,BG
 3652075520,3652083711,SE
 3652083712,3652087807,RU
 3652087808,3652095999,IT
@@ -91116,7 +92646,7 @@
 3653394432,3653402623,NL
 3653402624,3653403135,AT
 3653403136,3653403647,CD
-3653403648,3653403903,GH
+3653403648,3653403903,ZW
 3653403904,3653403911,UA
 3653403912,3653403919,IQ
 3653403920,3653403931,UA
@@ -91127,12 +92657,12 @@
 3653403960,3653403967,MW
 3653403968,3653403983,NG
 3653403984,3653403999,UA
-3653404000,3653404015,LB
-3653404016,3653404023,IQ
+3653404000,3653404008,LB
+3653404009,3653404015,GB
+3653404016,3653404023,LB
 3653404024,3653404031,GB
 3653404032,3653404039,NA
-3653404040,3653404047,GB
-3653404048,3653404055,LB
+3653404040,3653404055,IQ
 3653404056,3653404063,GB
 3653404064,3653404071,LB
 3653404072,3653404079,AO
@@ -91143,12 +92673,12 @@
 3653404112,3653404119,MD
 3653404120,3653404127,GB
 3653404128,3653404135,CS
-3653404136,3653404143,AM
+3653404136,3653404143,LY
 3653404144,3653404159,GB
 3653404160,3653404415,AT
 3653404416,3653404543,IQ
 3653404544,3653404559,NG
-3653404560,3653404567,CM
+3653404560,3653404567,IQ
 3653404568,3653404575,LY
 3653404576,3653404591,TR
 3653404592,3653404599,GH
@@ -91163,8 +92693,11 @@
 3653404720,3653404735,LB
 3653404736,3653404751,GB
 3653404752,3653404759,AM
-3653404760,3653404799,GB
-3653404800,3653404815,IQ
+3653404760,3653404783,GB
+3653404784,3653404791,IQ
+3653404792,3653404799,GB
+3653404800,3653404807,IQ
+3653404808,3653404815,GB
 3653404816,3653404831,LB
 3653404832,3653404847,NG
 3653404848,3653404855,GB
@@ -91175,9 +92708,8 @@
 3653404888,3653404903,GB
 3653404904,3653404911,IQ
 3653404912,3653404919,LY
-3653404920,3653404935,GB
-3653404936,3653404943,TR
-3653404944,3653404959,IQ
+3653404920,3653404951,GB
+3653404952,3653404959,IQ
 3653404960,3653404975,UA
 3653404976,3653404983,GB
 3653404984,3653404991,AM
@@ -91196,54 +92728,61 @@
 3653405168,3653405183,UA
 3653405184,3653405439,AT
 3653405440,3653405695,IQ
-3653405696,3653406975,NG
-3653406976,3653407007,GB
-3653407008,3653407015,TZ
+3653405696,3653407007,NG
+3653407008,3653407015,GB
 3653407016,3653407023,UG
 3653407024,3653407031,KE
 3653407032,3653407071,NG
 3653407072,3653407087,GB
 3653407088,3653407095,NG
-3653407096,3653407111,GB
+3653407096,3653407103,GB
+3653407104,3653407111,UG
 3653407112,3653407119,ZM
-3653407120,3653407151,GB
+3653407120,3653407127,ZW
+3653407128,3653407151,GB
 3653407152,3653407159,KE
 3653407160,3653407167,GB
 3653407168,3653407231,NG
 3653407232,3653407359,GB
 3653407360,3653407375,NG
-3653407376,3653407383,KE
+3653407376,3653407383,UG
 3653407384,3653407391,GB
-3653407392,3653407399,KE
+3653407392,3653407399,NG
 3653407400,3653407423,GB
 3653407424,3653407487,ZW
-3653407488,3653407615,RW
-3653407616,3653407631,NG
-3653407632,3653407647,ZM
+3653407488,3653407615,GB
+3653407616,3653407639,NG
+3653407640,3653407647,ZM
 3653407648,3653407679,GB
 3653407680,3653407695,UG
 3653407696,3653407703,CD
 3653407704,3653407711,NG
-3653407712,3653407743,GB
+3653407712,3653407727,GB
+3653407728,3653407743,ZW
 3653407744,3653407999,AT
 3653408000,3653408023,GB
-3653408024,3653408031,SO
-3653408032,3653408055,GB
+3653408024,3653408031,UG
+3653408032,3653408047,ZW
+3653408048,3653408055,GB
 3653408056,3653408063,TZ
 3653408064,3653408071,ZM
 3653408072,3653408079,NG
 3653408080,3653408087,MW
 3653408088,3653408143,GB
 3653408144,3653408151,NG
-3653408152,3653408175,GB
+3653408152,3653408159,ZM
+3653408160,3653408167,NG
+3653408168,3653408175,ZW
 3653408176,3653408183,KE
 3653408184,3653408191,MW
-3653408192,3653408199,NG
-3653408200,3653408223,GB
-3653408224,3653408231,ZM
-3653408232,3653408239,GB
+3653408192,3653408215,GB
+3653408216,3653408223,MW
+3653408224,3653408231,GB
+3653408232,3653408239,KE
 3653408240,3653408247,ZM
-3653408248,3653409279,GB
+3653408248,3653408767,GB
+3653408768,3653409023,CD
+3653409024,3653409279,GB
 3653409280,3653409535,TZ
 3653409536,3653409559,UA
 3653409560,3653409567,CM
@@ -91262,7 +92801,8 @@
 3653410080,3653410087,GB
 3653410088,3653410095,NG
 3653410096,3653410111,ZW
-3653410112,3653410127,NG
+3653410112,3653410119,KE
+3653410120,3653410127,NG
 3653410128,3653410143,GB
 3653410144,3653410151,ET
 3653410152,3653410159,KE
@@ -91277,9 +92817,11 @@
 3653410248,3653410255,ZM
 3653410256,3653410263,MW
 3653410264,3653410271,NG
-3653410272,3653410295,GB
-3653410296,3653410303,NG
+3653410272,3653410279,KE
+3653410280,3653410295,GB
+3653410296,3653410303,MW
 3653410304,3653410815,GB
+3653410816,3653414911,CZ
 3653414912,3653419007,IT
 3653419008,3653423103,IL
 3653423104,3653427199,GB
@@ -91404,6 +92946,7 @@
 3653740304,3653744895,GB
 3653744896,3653744959,AE
 3653744960,3653746687,GB
+3653746688,3653750783,DE
 3653750784,3653754879,RU
 3653754880,3653758975,UA
 3653758976,3653763071,RU
@@ -91431,7 +92974,9 @@
 3654613000,3654613007,SE
 3654613008,3654613015,RU
 3654613016,3654613055,SE
-3654613056,3654613151,RU
+3654613056,3654613071,RU
+3654613072,3654613087,SE
+3654613088,3654613151,RU
 3654613152,3654613247,SE
 3654613248,3654614015,NO
 3654614016,3654614031,SE
@@ -91459,9 +93004,7 @@
 3656633496,3656633503,US
 3656633504,3656650583,DE
 3656650584,3656650591,US
-3656650592,3656650623,DE
-3656650624,3656650687,CN
-3656650688,3656661183,DE
+3656650592,3656661183,DE
 3656661184,3656661199,AT
 3656661200,3656661583,DE
 3656661584,3656661599,AT

Modified: tor/trunk/src/config/torrc.complete.in
===================================================================
--- tor/trunk/src/config/torrc.complete.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/config/torrc.complete.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,3 @@
-# $Id$
-# Last updated on $Date$
 ####################################################################
 ## This config file is divided into four sections.  They are:
 ## 1.  Global Options (clients and servers)

Modified: tor/trunk/src/config/torrc.sample.in
===================================================================
--- tor/trunk/src/config/torrc.sample.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/config/torrc.sample.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 ## Configuration file for a typical Tor user
-## Last updated 12 April 2009 for Tor 0.2.1.14-rc.
+## Last updated 16 July 2009 for Tor 0.2.2.1-alpha.
 ## (May or may not work for much older or much newer versions of Tor.)
 ##
 ## Lines that begin with "## " try to explain what's going on. Lines
@@ -99,6 +99,19 @@
 #RelayBandwidthRate 100 KBytes  # Throttle traffic to 100KB/s (800Kbps)
 #RelayBandwidthBurst 200 KBytes # But allow bursts up to 200KB/s (1600Kbps)
 
+## Use these to restrict the maximum traffic per day, week, or month.
+## Note that this threshold applies to sent _and_ to received bytes,
+## not to their sum: Setting "4 GBytes" may allow up to 8 GBytes
+## total before hibernating.
+##
+## Set a maximum of 4 gigabytes each way per period.
+#AccountingMax 4 GBytes
+## Each period starts daily at midnight (AccountingMax is per day)
+#AccountingStart day 00:00
+## Each period starts on the 3rd of the month at 15:00 (AccountingMax
+## is per month)
+#AccountingStart month 3 15:00
+
 ## Contact info to be published in the directory, so we can contact you
 ## if your relay is misconfigured or something else goes wrong. Google
 ## indexes this, so spammers might also collect it.

Modified: tor/trunk/src/or/Makefile.am
===================================================================
--- tor/trunk/src/or/Makefile.am	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/Makefile.am	2009-08-19 21:47:25 UTC (rev 20335)
@@ -10,9 +10,15 @@
 tor_platform_source=
 endif
 
-EXTRA_DIST=ntmain.c
+EXTRA_DIST=ntmain.c or_sha1.i
 
-tor_SOURCES = buffers.c circuitbuild.c circuitlist.c \
+if USE_EXTERNAL_EVDNS
+evdns_source=
+else
+evdns_source=eventdns.c
+endif
+
+COMMON_SRC = buffers.c circuitbuild.c circuitlist.c \
 	circuituse.c command.c config.c \
 	connection.c connection_edge.c connection_or.c control.c \
 	cpuworker.c directory.c dirserv.c dirvote.c \
@@ -20,9 +26,10 @@
 	networkstatus.c onion.c policies.c \
 	reasons.c relay.c rendcommon.c rendclient.c rendmid.c \
 	rendservice.c rephist.c router.c routerlist.c routerparse.c \
-	eventdns.c \
-	tor_main.c
+	$(evdns_source) config_codedigest.c
 
+tor_SOURCES = $(COMMON_SRC) tor_main.c
+
 AM_CPPFLAGS = -DSHARE_DATADIR="\"$(datadir)\"" \
         -DLOCALSTATEDIR="\"$(localstatedir)\"" \
         -DBINDIR="\"$(bindir)\""
@@ -33,25 +40,20 @@
 
 tor_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ @TOR_LDFLAGS_libevent@
 tor_LDADD = ../common/libor.a ../common/libor-crypto.a \
-  -lz -levent -lssl -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@
-test_SOURCES = buffers.c circuitbuild.c circuitlist.c \
-	circuituse.c command.c config.c \
-	connection.c connection_edge.c connection_or.c control.c \
-	cpuworker.c directory.c dirserv.c dirvote.c \
-	dns.c dnsserv.c geoip.c hibernate.c main.c $(tor_platform_source) \
-	networkstatus.c onion.c policies.c \
-	reasons.c relay.c rendcommon.c rendclient.c rendmid.c \
-	rendservice.c rephist.c router.c routerlist.c routerparse.c \
-	eventdns.c \
-	test_data.c test.c
+	../common/libor-event.a \
+	-lz -levent -lssl -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@
+test_SOURCES = $(COMMON_SRC) test_data.c test.c
 
 test_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
         @TOR_LDFLAGS_libevent@
 test_LDADD = ../common/libor.a ../common/libor-crypto.a \
-        -lz -levent -lssl -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@
+	../common/libor-event.a \
+	-lz -levent -lssl -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@
 
 noinst_HEADERS = or.h eventdns.h eventdns_tor.h micro-revision.i
 
+config_codedigest.o: or_sha1.i
+
 tor_main.o: micro-revision.i
 
 micro-revision.i: FORCE
@@ -103,5 +105,17 @@
 	  mv micro-revision.tmp micro-revision.i;		\
 	fi; true
 
+or_sha1.i: $(tor_SOURCES) test_data.c test.c
+	if test "@SHA1SUM@" != none; then \
+	  @SHA1SUM@ $(tor_SOURCES) test_data.c test.c | @SED@ -n 's/^\(.*\)$$/"\1\\n"/p' > or_sha1.i; \
+	elif test "@OPENSSL@" != none; then \
+	  @OPENSSL@ sha1 $(tor_SOURCES) test_data.c test.c | @SED@ -n 's/SHA1(\(.*\))= \(.*\)/"\2  \1\\n"/p' > or_sha1.i; \
+	else \
+	  rm or_sha1.i; \
+	  touch or_sha1.i; \
+	fi
+
+
+
 #Dummy target to ensure that micro-revision.i _always_ gets built.
 FORCE:

Modified: tor/trunk/src/or/buffers.c
===================================================================
--- tor/trunk/src/or/buffers.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/buffers.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -161,7 +161,7 @@
 }
 
 /** Allocate a new chunk with a given allocation size, or get one from the
- * freelist.  Note that a chunk with allocation size A can actualy hold only
+ * freelist.  Note that a chunk with allocation size A can actually hold only
  * CHUNK_SIZE_WITH_ALLOC(A) bytes in its mem field. */
 static INLINE chunk_t *
 chunk_new_with_alloc_size(size_t alloc)
@@ -258,6 +258,7 @@
       int n_to_free = free_all ? freelists[i].cur_length :
         (freelists[i].lowest_length - slack);
       int n_to_skip = freelists[i].cur_length - n_to_free;
+      int orig_n_to_free = n_to_free, n_freed=0;
       int new_length = n_to_skip;
       chunk_t **chp = &freelists[i].head;
       chunk_t *chunk;
@@ -276,9 +277,19 @@
         tor_free(chunk);
         chunk = next;
         --n_to_free;
+        ++n_freed;
         ++freelists[i].n_free;
       }
-      tor_assert(!n_to_free);
+      if (n_to_free) {
+        log_warn(LD_BUG, "Freelist length for %d-byte chunks may have been "
+                 "messed up somehow.", (int)freelists[i].alloc_size);
+        log_warn(LD_BUG, "There were %d chunks at the start.  I decided to "
+                 "keep %d. I wanted to free %d.  I freed %d.  I somehow think "
+                 "I have %d left to free.",
+                 freelists[i].cur_length, n_to_skip, orig_n_to_free,
+                 n_freed, n_to_free);
+      }
+      // tor_assert(!n_to_free);
       freelists[i].cur_length = new_length;
     }
     freelists[i].lowest_length = freelists[i].cur_length;
@@ -776,7 +787,7 @@
  * <b>chunk</b> of buffer <b>buf</b> onto socket <b>s</b>.  (Tries to write
  * more if there is a forced pending write size.)  On success, deduct the
  * bytes written from *<b>buf_flushlen</b>.  Return the number of bytes
- * written on success, and a TOR_TLS error code on failue or blocking.
+ * written on success, and a TOR_TLS error code on failure or blocking.
  */
 static INLINE int
 flush_chunk_tls(tor_tls_t *tls, buf_t *buf, chunk_t *chunk,
@@ -1097,7 +1108,7 @@
 }
 
 /** Advance <b>pos</b> by a single character, if there are any more characters
- * in the buffer.  Returns 0 on sucess, -1 on failure. */
+ * in the buffer.  Returns 0 on success, -1 on failure. */
 static INLINE int
 buf_pos_inc(buf_pos_t *pos)
 {
@@ -1158,13 +1169,13 @@
 }
 
 /** There is a (possibly incomplete) http statement on <b>buf</b>, of the
- * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain nuls.)
+ * form "\%s\\r\\n\\r\\n\%s", headers, body. (body may contain NULs.)
  * If a) the headers include a Content-Length field and all bytes in
  * the body are present, or b) there's no Content-Length field and
  * all headers are present, then:
  *
- *  - strdup headers into <b>*headers_out</b>, and nul-terminate it.
- *  - memdup body into <b>*body_out</b>, and nul-terminate it.
+ *  - strdup headers into <b>*headers_out</b>, and NUL-terminate it.
+ *  - memdup body into <b>*body_out</b>, and NUL-terminate it.
  *  - Then remove them from <b>buf</b>, and return 1.
  *
  *  - If headers or body is NULL, discard that part of the buf.
@@ -1248,14 +1259,14 @@
   if (headers_out) {
     *headers_out = tor_malloc(headerlen+1);
     fetch_from_buf(*headers_out, headerlen, buf);
-    (*headers_out)[headerlen] = 0; /* nul terminate it */
+    (*headers_out)[headerlen] = 0; /* NUL terminate it */
   }
   if (body_out) {
     tor_assert(body_used);
     *body_used = bodylen;
     *body_out = tor_malloc(bodylen+1);
     fetch_from_buf(*body_out, bodylen, buf);
-    (*body_out)[bodylen] = 0; /* nul terminate it */
+    (*body_out)[bodylen] = 0; /* NUL terminate it */
   }
   check();
   return 1;
@@ -1389,7 +1400,7 @@
                 "Tor only an IP address. Applications that do DNS resolves "
                 "themselves may leak information. Consider using Socks4A "
                 "(e.g. via privoxy or socat) instead. For more information, "
-                "please see http://wiki.noreply.org/noreply/TheOnionRouter/";
+                "please see https://wiki.torproject.org/TheOnionRouter/";
                 "TorFAQ#SOCKSAndDNS.%s", req->port,
                 safe_socks ? " Rejecting." : "");
             /*have_warned_about_unsafe_socks = 1;*/
@@ -1502,7 +1513,7 @@
                  "only an IP address. Applications that do DNS resolves "
                  "themselves may leak information. Consider using Socks4A "
                  "(e.g. via privoxy or socat) instead. For more information, "
-                 "please see http://wiki.noreply.org/noreply/TheOnionRouter/";
+                 "please see https://wiki.torproject.org/TheOnionRouter/";
                  "TorFAQ#SOCKSAndDNS.%s", req->port,
                  safe_socks ? " Rejecting." : "");
         /*have_warned_about_unsafe_socks = 1;*/  /*(for now, warn every time)*/

Modified: tor/trunk/src/or/circuitbuild.c
===================================================================
--- tor/trunk/src/or/circuitbuild.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/circuitbuild.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -1436,17 +1436,67 @@
 /** Log a warning if the user specified an exit for the circuit that
  * has been excluded from use by ExcludeNodes or ExcludeExitNodes. */
 static void
-warn_if_router_excluded(const extend_info_t *exit)
+warn_if_last_router_excluded(uint8_t purpose, const extend_info_t *exit)
 {
   or_options_t *options = get_options();
-  routerinfo_t *ri = router_get_by_digest(exit->identity_digest);
+  routerset_t *rs = options->ExcludeNodes;
+  const char *description;
+  int severity;
+  int domain = LD_CIRC;
 
-  if (!ri || !options->_ExcludeExitNodesUnion)
-    return;
+  switch (purpose)
+    {
+    default:
+    case CIRCUIT_PURPOSE_OR:
+    case CIRCUIT_PURPOSE_INTRO_POINT:
+    case CIRCUIT_PURPOSE_REND_POINT_WAITING:
+    case CIRCUIT_PURPOSE_REND_ESTABLISHED:
+      log_warn(LD_BUG, "Called on non-origin circuit (purpose %d)",
+               (int)purpose);
+      return;
+    case CIRCUIT_PURPOSE_C_GENERAL:
+      description = "Requested exit node";
+      rs = options->_ExcludeExitNodesUnion;
+      severity = LOG_WARN;
+      break;
+    case CIRCUIT_PURPOSE_C_INTRODUCING:
+    case CIRCUIT_PURPOSE_C_INTRODUCE_ACK_WAIT:
+    case CIRCUIT_PURPOSE_C_INTRODUCE_ACKED:
+      description = "Introduction point for hidden service";
+      severity = LOG_INFO;
+      break;
+    case CIRCUIT_PURPOSE_C_ESTABLISH_REND:
+    case CIRCUIT_PURPOSE_C_REND_READY:
+    case CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED:
+    case CIRCUIT_PURPOSE_C_REND_JOINED:
+      description = "Chosen rendezvous point";
+      severity = LOG_WARN;
+      domain = LD_BUG;
+      break;
+    case CIRCUIT_PURPOSE_S_ESTABLISH_INTRO:
+      description = "Chosen introduction point";
+      severity = LOG_INFO;
+      break;
+    case CIRCUIT_PURPOSE_S_CONNECT_REND:
+    case CIRCUIT_PURPOSE_S_REND_JOINED:
+      description = "Client-selected rendezvous point";
+      severity = LOG_INFO;
+      break;
+    case CIRCUIT_PURPOSE_TESTING:
+      description = "Target for testing circuit";
+      severity = LOG_INFO;
+      break;
+    case CIRCUIT_PURPOSE_CONTROLLER:
+      rs = options->_ExcludeExitNodesUnion;
+      description = "Controller-selected circuit target";
+      severity = LOG_WARN;
+      break;
+    }
 
-  if (routerset_contains_router(options->_ExcludeExitNodesUnion, ri))
-    log_warn(LD_CIRC,"Requested exit node '%s' is in ExcludeNodes, "
-             "or ExcludeExitNodes, using anyway.",exit->nickname);
+  if (routerset_contains_extendinfo(rs, exit))
+    log_fn(severity, domain, "%s '%s' is in ExcludeNodes%s.  Using anyway.",
+           description,exit->nickname,
+           rs==options->ExcludeNodes?"":" or ExcludeExitNodes.");
 
   return;
 }
@@ -1471,7 +1521,7 @@
   }
 
   if (exit) { /* the circuit-builder pre-requested one */
-    warn_if_router_excluded(exit);
+    warn_if_last_router_excluded(circ->_base.purpose, exit);
     log_info(LD_CIRC,"Using requested exit node '%s'", exit->nickname);
     exit = extend_info_dup(exit);
   } else { /* we have to decide one */
@@ -1938,7 +1988,7 @@
  * right now. (Else return NULL.) In particular, it must be
  * - Listed as either up or never yet contacted;
  * - Present in the routerlist;
- * - Listed as 'stable' or 'fast' by the current dirserver concensus,
+ * - Listed as 'stable' or 'fast' by the current dirserver consensus,
  *   if demanded by <b>need_uptime</b> or <b>need_capacity</b>;
  *   (This check is currently redundant with the Guard flag, but in
  *   the future that might change. Best to leave it in for now.)
@@ -2025,7 +2075,7 @@
 
 /** Called when one or more guards that we would previously have used for some
  * purpose are no longer in use because a higher-priority guard has become
- * useable again. */
+ * usable again. */
 static void
 control_event_guard_deferred(void)
 {
@@ -2849,8 +2899,7 @@
 getinfo_helper_entry_guards(control_connection_t *conn,
                             const char *question, char **answer)
 {
-  int use_long_names = conn->use_long_names;
-
+  (void) conn;
   if (!strcmp(question,"entry-guards") ||
       !strcmp(question,"helper-nodes")) {
     smartlist_t *sl = smartlist_create();
@@ -2858,12 +2907,13 @@
     char nbuf[MAX_VERBOSE_NICKNAME_LEN+1];
     if (!entry_guards)
       entry_guards = smartlist_create();
-    SMARTLIST_FOREACH(entry_guards, entry_guard_t *, e,
-      {
+    SMARTLIST_FOREACH_BEGIN(entry_guards, entry_guard_t *, e) {
         size_t len = MAX_VERBOSE_NICKNAME_LEN+ISO_TIME_LEN+32;
         char *c = tor_malloc(len);
         const char *status = NULL;
         time_t when = 0;
+        routerinfo_t *ri;
+
         if (!e->made_contact) {
           status = "never-connected";
         } else if (e->bad_since) {
@@ -2872,19 +2922,17 @@
         } else {
           status = "up";
         }
-        if (use_long_names) {
-          routerinfo_t *ri = router_get_by_digest(e->identity);
-          if (ri) {
-            router_get_verbose_nickname(nbuf, ri);
-          } else {
-            nbuf[0] = '$';
-            base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN);
-            /* e->nickname field is not very reliable if we don't know about
-             * this router any longer; don't include it. */
-          }
+
+        ri = router_get_by_digest(e->identity);
+        if (ri) {
+          router_get_verbose_nickname(nbuf, ri);
         } else {
-          base16_encode(nbuf, sizeof(nbuf), e->identity, DIGEST_LEN);
+          nbuf[0] = '$';
+          base16_encode(nbuf+1, sizeof(nbuf)-1, e->identity, DIGEST_LEN);
+          /* e->nickname field is not very reliable if we don't know about
+           * this router any longer; don't include it. */
         }
+
         if (when) {
           format_iso_time(tbuf, when);
           tor_snprintf(c, len, "%s %s %s\n", nbuf, status, tbuf);
@@ -2892,7 +2940,7 @@
           tor_snprintf(c, len, "%s %s\n", nbuf, status);
         }
         smartlist_add(sl, c);
-      });
+    } SMARTLIST_FOREACH_END(e);
     *answer = smartlist_join_strings(sl, "", 0, NULL);
     SMARTLIST_FOREACH(sl, char *, c, tor_free(c));
     smartlist_free(sl);

Modified: tor/trunk/src/or/circuitlist.c
===================================================================
--- tor/trunk/src/or/circuitlist.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/circuitlist.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -447,6 +447,11 @@
       rend_data_free(ocirc->rend_data);
   } else {
     or_circuit_t *ocirc = TO_OR_CIRCUIT(circ);
+#ifdef ENABLE_BUFFER_STATS
+    /* Remember cell statistics for this circuit before deallocating. */
+    if (get_options()->CellStatistics)
+      add_circ_to_buffer_stats(circ, time(NULL));
+#endif
     mem = ocirc;
     memlen = sizeof(or_circuit_t);
     tor_assert(circ->magic == OR_CIRCUIT_MAGIC);

Modified: tor/trunk/src/or/circuituse.c
===================================================================
--- tor/trunk/src/or/circuituse.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/circuituse.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -298,13 +298,13 @@
     if (victim->purpose >= CIRCUIT_PURPOSE_C_INTRODUCING &&
         victim->purpose <= CIRCUIT_PURPOSE_C_REND_READY_INTRO_ACKED) {
       if (!victim->timestamp_dirty)
-        log_fn(LOG_DEBUG,"Considering %sopen purp %d to %s (circid %d)."
+        log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d)."
                "(clean).",
                victim->state == CIRCUIT_STATE_OPEN ? "" : "non",
                victim->purpose, victim->build_state->chosen_exit_name,
                victim->n_circ_id);
       else
-        log_fn(LOG_DEBUG,"Considering %sopen purp %d to %s (circid %d). "
+        log_fn(LOG_DEBUG,"Considering %sopen purpose %d to %s (circid %d). "
                "%d secs since dirty.",
                victim->state == CIRCUIT_STATE_OPEN ? "" : "non",
                victim->purpose, victim->build_state->chosen_exit_name,
@@ -512,7 +512,7 @@
     flags |= CIRCLAUNCH_IS_INTERNAL;
     log_info(LD_CIRC,
              "Have %d clean circs (%d uptime-internal, %d internal), need"
-             " another hidserv circ.",
+             " another hidden service circ.",
              num, num_uptime_internal, num_internal);
     circuit_launch_by_router(CIRCUIT_PURPOSE_C_GENERAL, NULL, flags);
     return;
@@ -642,7 +642,8 @@
     if (circ->timestamp_dirty &&
         circ->timestamp_dirty + get_options()->MaxCircuitDirtiness < now &&
         !TO_ORIGIN_CIRCUIT(circ)->p_streams /* nothing attached */ ) {
-      log_debug(LD_CIRC, "Closing n_circ_id %d (dirty %d secs ago, purp %d)",
+      log_debug(LD_CIRC, "Closing n_circ_id %d (dirty %d secs ago, "
+                "purpose %d)",
                 circ->n_circ_id, (int)(now - circ->timestamp_dirty),
                 circ->purpose);
       circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
@@ -1035,7 +1036,7 @@
   if (!want_onehop && !router_have_minimum_dir_info()) {
     if (!connection_get_by_type(CONN_TYPE_DIR)) {
       int severity = LOG_NOTICE;
-      /* FFFF if this is a tunnelled directory fetch, don't yell
+      /* FFFF if this is a tunneled directory fetch, don't yell
        * as loudly. the user doesn't even know it's happening. */
       if (options->UseBridges && bridges_known_but_down()) {
         log_fn(severity, LD_APP|LD_DIR,
@@ -1108,14 +1109,9 @@
       extend_info = rend_client_get_random_intro(conn->rend_data);
       if (!extend_info) {
         log_info(LD_REND,
-                 "No intro points for '%s': refetching service descriptor.",
+                 "No intro points for '%s': re-fetching service descriptor.",
                  safe_str(conn->rend_data->onion_address));
-        /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
-         * arrives first. Exception: When using client authorization, only
-         * fetch v2 descriptors.*/
         rend_client_refetch_v2_renddesc(conn->rend_data);
-        if (conn->rend_data->auth_type == REND_NO_AUTH)
-          rend_client_refetch_renddesc(conn->rend_data->onion_address);
         conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT;
         return 0;
       }
@@ -1451,7 +1447,7 @@
                rendcirc->_base.n_circ_id, conn_age);
       /* Mark rendezvous circuits as 'newly dirty' every time you use
        * them, since the process of rebuilding a rendezvous circ is so
-       * expensive. There is a tradeoffs between linkability and
+       * expensive. There is a tradeoff between linkability and
        * feasibility, at this point.
        */
       rendcirc->_base.timestamp_dirty = time(NULL);

Modified: tor/trunk/src/or/command.c
===================================================================
--- tor/trunk/src/or/command.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/command.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -395,12 +395,8 @@
    * gotten no more than MAX_RELAY_EARLY_CELLS_PER_CIRCUIT of them. */
   if (cell->command == CELL_RELAY_EARLY) {
     if (direction == CELL_DIRECTION_IN) {
-      log_fn(LOG_PROTOCOL_WARN, LD_OR,
-             "Received an inbound RELAY_EARLY cell on circuit %d from %s:%d."
-             "  Closing circuit.",
-             cell->circ_id, conn->_base.address, conn->_base.port);
-      circuit_mark_for_close(circ, END_CIRC_REASON_TORPROTOCOL);
-      return;
+      /* XXX Allow an unlimited number of inbound relay_early cells for
+       * now, for hidden service compatibility. See bug 1038. -RD */
     } else {
       or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
       if (or_circ->remaining_relay_early_cells == 0) {

Modified: tor/trunk/src/or/config.c
===================================================================
--- tor/trunk/src/or/config.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/config.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -25,7 +25,7 @@
   CONFIG_TYPE_MEMUNIT,      /**< A number of bytes, with optional units*/
   CONFIG_TYPE_DOUBLE,       /**< A floating-point value */
   CONFIG_TYPE_BOOL,         /**< A boolean value, expressed as 0 or 1. */
-  CONFIG_TYPE_ISOTIME,      /**< An ISO-formated time relative to GMT. */
+  CONFIG_TYPE_ISOTIME,      /**< An ISO-formatted time relative to GMT. */
   CONFIG_TYPE_CSV,          /**< A list of strings, separated by commas and
                               * optional whitespace. */
   CONFIG_TYPE_LINELIST,     /**< Uninterpreted config lines */
@@ -134,6 +134,7 @@
   V(AccountingMax,               MEMUNIT,  "0 bytes"),
   V(AccountingStart,             STRING,   NULL),
   V(Address,                     STRING,   NULL),
+  V(AllowDotExit,                BOOL,     "0"),
   V(AllowInvalidNodes,           CSV,      "middle,rendezvous"),
   V(AllowNonRFC953Hostnames,     BOOL,     "0"),
   V(AllowSingleHopCircuits,      BOOL,     "0"),
@@ -162,6 +163,7 @@
   V(BridgePassword,              STRING,   NULL),
   V(BridgeRecordUsageByCountry,  BOOL,     "1"),
   V(BridgeRelay,                 BOOL,     "0"),
+  V(CellStatistics,              BOOL,     "0"),
   V(CircuitBuildTimeout,         INTERVAL, "1 minute"),
   V(CircuitIdleTimeout,          INTERVAL, "1 hour"),
   V(ClientDNSRejectInternalAddresses, BOOL,"1"),
@@ -186,18 +188,20 @@
   V(DirPort,                     UINT,     "0"),
   V(DirPortFrontPage,            FILENAME, NULL),
   OBSOLETE("DirPostPeriod"),
-#ifdef ENABLE_GEOIP_STATS
-  V(DirRecordUsageByCountry,     BOOL,     "0"),
-  V(DirRecordUsageGranularity,   UINT,     "4"),
-  V(DirRecordUsageRetainIPs,     INTERVAL, "14 days"),
-  V(DirRecordUsageSaveInterval,  INTERVAL, "6 hours"),
+#ifdef ENABLE_DIRREQ_STATS
+  OBSOLETE("DirRecordUsageByCountry"),
+  OBSOLETE("DirRecordUsageGranularity"),
+  OBSOLETE("DirRecordUsageRetainIPs"),
+  OBSOLETE("DirRecordUsageSaveInterval"),
 #endif
+  V(DirReqStatistics,            BOOL,     "0"),
   VAR("DirServer",               LINELIST, DirServers, NULL),
   V(DNSPort,                     UINT,     "0"),
   V(DNSListenAddress,            LINELIST, NULL),
   V(DownloadExtraInfo,           BOOL,     "0"),
   V(EnforceDistinctSubnets,      BOOL,     "1"),
   V(EntryNodes,                  ROUTERSET,   NULL),
+  V(EntryStatistics,             BOOL,     "0"),
   V(TestingEstimatedDescriptorPropagationTime, INTERVAL, "10 minutes"),
   V(ExcludeNodes,                ROUTERSET, NULL),
   V(ExcludeExitNodes,            ROUTERSET, NULL),
@@ -205,12 +209,14 @@
   V(ExitNodes,                   ROUTERSET, NULL),
   V(ExitPolicy,                  LINELIST, NULL),
   V(ExitPolicyRejectPrivate,     BOOL,     "1"),
+  V(ExitPortStatistics,          BOOL,     "0"),
   V(FallbackNetworkstatusFile,   FILENAME,
     SHARE_DATADIR PATH_SEPARATOR "tor" PATH_SEPARATOR "fallback-consensus"),
   V(FascistFirewall,             BOOL,     "0"),
   V(FirewallPorts,               CSV,      ""),
   V(FastFirstHopPK,              BOOL,     "1"),
   V(FetchDirInfoEarly,           BOOL,     "0"),
+  V(FetchDirInfoExtraEarly,      BOOL,     "0"),
   V(FetchServerDescriptors,      BOOL,     "1"),
   V(FetchHidServDescriptors,     BOOL,     "1"),
   V(FetchUselessDescriptors,     BOOL,     "0"),
@@ -222,6 +228,8 @@
 #endif
   OBSOLETE("Group"),
   V(HardwareAccel,               BOOL,     "0"),
+  V(AccelName,                   STRING,   NULL),
+  V(AccelDir,                    FILENAME, NULL),
   V(HashedControlPassword,       LINELIST, NULL),
   V(HidServDirectoryV2,          BOOL,     "1"),
   VAR("HiddenServiceDir",    LINELIST_S, RendConfigLines,    NULL),
@@ -330,6 +338,7 @@
   V(V3AuthDistDelay,             INTERVAL, "5 minutes"),
   V(V3AuthNIntervalsValid,       UINT,     "3"),
   V(V3AuthUseLegacyKey,          BOOL,     "0"),
+  V(V3BandwidthsFile,            FILENAME, NULL),
   VAR("VersioningAuthoritativeDirectory",BOOL,VersioningAuthoritativeDir, "0"),
   V(VirtualAddrNetwork,          STRING,   "127.192.0.0/10"),
   V(WarnPlaintextPorts,          CSV,      "23,109,110,143"),
@@ -444,12 +453,16 @@
    * FetchUselessDescriptors */
   { "HardwareAccel", "If set, Tor tries to use hardware crypto accelerators "
     "when it can." },
+  { "AccelName", "If set, try to use hardware crypto accelerator with this "
+    "specific ID." },
+  { "AccelDir", "If set, look in this directory for the dynamic hardware "
+    "engine in addition to OpenSSL default path." },
   /* HashedControlPassword */
   { "HTTPProxy", "Force Tor to make all HTTP directory requests through this "
     "host:port (or host:80 if port is not set)." },
   { "HTTPProxyAuthenticator", "A username:password pair to be used with "
     "HTTPProxy." },
-  { "HTTPSProxy", "Force Tor to make all TLS (SSL) connectinos through this "
+  { "HTTPSProxy", "Force Tor to make all TLS (SSL) connections through this "
     "host:port (or host:80 if port is not set)." },
   { "HTTPSProxyAuthenticator", "A username:password pair to be used with "
     "HTTPSProxy." },
@@ -693,24 +706,13 @@
 static int or_state_load(void);
 static int options_init_logs(or_options_t *options, int validate_only);
 
+static int is_listening_on_low_port(uint16_t port_option,
+                                    const config_line_t *listen_options);
+
 static uint64_t config_parse_memunit(const char *s, int *ok);
 static int config_parse_interval(const char *s, int *ok);
 static void init_libevent(void);
 static int opt_streq(const char *s1, const char *s2);
-/** Versions of libevent. */
-typedef enum {
-  /* Note: we compare these, so it's important that "old" precede everything,
-   * and that "other" come last. */
-  LE_OLD=0, LE_10C, LE_10D, LE_10E, LE_11, LE_11A, LE_11B, LE_12, LE_12A,
-  LE_13, LE_13A, LE_13B, LE_13C, LE_13D, LE_13E,
-  LE_140, LE_141, LE_142, LE_143, LE_144, LE_145, LE_146, LE_147, LE_148,
-  LE_1499,
-  LE_OTHER
-} le_version_t;
-static le_version_t decode_libevent_version(const char *v, int *bincompat_out);
-#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
-static void check_libevent_version(const char *m, int server);
-#endif
 
 /** Magic value for or_options_t. */
 #define OR_OPTIONS_MAGIC 9090909
@@ -918,6 +920,8 @@
     "dannenberg orport=443 no-v2 "
       "v3ident=585769C78764D58426B8B52B6651A5A71137189A "
       "213.73.91.31:80 7BE6 83E6 5D48 1413 21C5 ED92 F075 C553 64AC 7123",
+    "urras orport=80 no-v2 v3ident=80550987E1D626E3EBA5E5E75A458DE0626D088C "
+      "208.83.223.34:443 0AD3 FA88 4D18 F89E EA2D 89C0 1937 9E0E 7FD9 4417",
     NULL
   };
   for (i=0; dirservers[i]; i++) {
@@ -1209,7 +1213,7 @@
 
   if (routerset_usage && reason_out) {
     *reason_out = "We've been configured to use (or avoid) nodes in certain "
-      "contries, and we need GEOIP information to figure out which ones they "
+      "countries, and we need GEOIP information to figure out which ones they "
       "are.";
   } else if (bridge_usage && reason_out) {
     *reason_out = "We've been configured to see which countries can access "
@@ -1219,6 +1223,32 @@
   return bridge_usage || routerset_usage;
 }
 
+/** Return the bandwidthrate that we are going to report to the authorities
+ * based on the config options. */
+uint32_t
+get_effective_bwrate(or_options_t *options)
+{
+  uint64_t bw = options->BandwidthRate;
+  if (bw > options->MaxAdvertisedBandwidth)
+    bw = options->MaxAdvertisedBandwidth;
+  if (options->RelayBandwidthRate > 0 && bw > options->RelayBandwidthRate)
+    bw = options->RelayBandwidthRate;
+  /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */
+  return (uint32_t)bw;
+}
+
+/** Return the bandwidthburst that we are going to report to the authorities
+ * based on the config options. */
+uint32_t
+get_effective_bwburst(or_options_t *options)
+{
+  uint64_t bw = options->BandwidthBurst;
+  if (options->RelayBandwidthBurst > 0 && bw > options->RelayBandwidthBurst)
+    bw = options->RelayBandwidthBurst;
+  /* ensure_bandwidth_cap() makes sure that this cast can't overflow. */
+  return (uint32_t)bw;
+}
+
 /** Fetch the active option list, and take actions based on it. All of the
  * things we do should survive being done repeatedly.  If present,
  * <b>old_options</b> contains the previous value of the options.
@@ -1280,14 +1310,14 @@
     return 0;
 
   /* Finish backgrounding the process */
-  if (running_tor && options->RunAsDaemon) {
+  if (options->RunAsDaemon) {
     /* We may be calling this for the n'th time (on SIGHUP), but it's safe. */
     finish_daemon(options->DataDirectory);
   }
 
-  /* Write our pid to the pid file. If we do not have write permissions we
+  /* Write our PID to the PID file. If we do not have write permissions we
    * will log a warning */
-  if (running_tor && options->PidFile)
+  if (options->PidFile)
     write_pidfile(options->PidFile);
 
   /* Register addressmap directives */
@@ -1329,6 +1359,11 @@
       circuit_expire_all_dirty_circs();
     }
 
+    if (! bool_eq(options->BridgeRelay, old_options->BridgeRelay)) {
+      log_info(LD_GENERAL, "Bridge status changed.  Forgetting GeoIP stats.");
+      geoip_remove_old_clients(time(NULL)+(2*60*60));
+    }
+
     if (options_transition_affects_workers(old_options, options)) {
       log_info(LD_GENERAL,
                "Worker-related options changed. Rotating workers.");
@@ -1373,6 +1408,71 @@
     geoip_load_file(actual_fname, options);
     tor_free(actual_fname);
   }
+
+  if (options->DirReqStatistics) {
+#ifdef ENABLE_DIRREQ_STATS
+    /* Check if GeoIP database could be loaded. */
+    if (!geoip_is_loaded()) {
+      log_warn(LD_CONFIG, "Configured to measure directory request "
+               "statistics, but no GeoIP database found!");
+      return -1;
+    }
+    log_notice(LD_CONFIG, "Configured to count directory requests by "
+               "country and write aggregate statistics to disk. Check the "
+               "dirreq-stats file in your data directory that will first "
+               "be written in 24 hours from now.");
+#else
+  log_warn(LD_CONFIG, "DirReqStatistics enabled, but Tor was built "
+           "without support for directory request statistics.");
+#endif
+  }
+
+#ifdef ENABLE_EXIT_STATS
+  if (options->ExitPortStatistics)
+    log_notice(LD_CONFIG, "Configured to measure exit port statistics. "
+               "Look for the exit-stats file that will first be written to "
+               "the data directory in 24 hours from now.");
+#else
+  if (options->ExitPortStatistics)
+    log_warn(LD_CONFIG, "ExitPortStatistics enabled, but Tor was built "
+             "without port statistics support.");
+#endif
+
+#ifdef ENABLE_BUFFER_STATS
+  if (options->CellStatistics)
+    log_notice(LD_CONFIG, "Configured to measure cell statistics. Look "
+               "for the buffer-stats file that will first be written to "
+               "the data directory in 24 hours from now.");
+#else
+  if (options->CellStatistics)
+    log_warn(LD_CONFIG, "CellStatistics enabled, but Tor was built "
+             "without cell statistics support.");
+#endif
+
+#ifdef ENABLE_ENTRY_STATS
+  if (options->EntryStatistics) {
+    if (should_record_bridge_info(options)) {
+      /* Don't allow measuring statistics on entry guards when configured
+       * as bridge. */
+      log_warn(LD_CONFIG, "Bridges cannot be configured to measure "
+               "additional GeoIP statistics as entry guards.");
+      return -1;
+    } else if (!geoip_is_loaded()) {
+      /* Check if GeoIP database could be loaded. */
+      log_warn(LD_CONFIG, "Configured to measure entry node statistics, "
+               "but no GeoIP database found!");
+      return -1;
+    } else
+      log_notice(LD_CONFIG, "Configured to measure entry node "
+                 "statistics. Look for the entry-stats file that will "
+                 "first be written to the data directory in 24 hours "
+                 "from now.");
+  }
+#else
+  if (options->EntryStatistics)
+    log_warn(LD_CONFIG, "EntryStatistics enabled, but Tor was built "
+             "without entry node statistics support.");
+#endif
   /* Check if we need to parse and add the EntryNodes config option. */
   if (options->EntryNodes &&
       (!old_options ||
@@ -1402,7 +1502,7 @@
     }
   }
 
-  /* Load the webpage we're going to serve everytime someone asks for '/' on
+  /* Load the webpage we're going to serve every time someone asks for '/' on
      our DirPort. */
   tor_free(global_dirfrontpagecontents);
   if (options->DirPortFrontPage) {
@@ -1435,7 +1535,7 @@
   if (! fmt->abbrevs)
     return option;
   for (i=0; fmt->abbrevs[i].abbreviated; ++i) {
-    /* Abbreviations are casei. */
+    /* Abbreviations are case insensitive. */
     if (!strcasecmp(option,fmt->abbrevs[i].abbreviated) &&
         (command_line || !fmt->abbrevs[i].commandline_only)) {
       if (warn_obsolete && fmt->abbrevs[i].warn) {
@@ -1496,7 +1596,7 @@
     (*new)->key = tor_strdup(expand_abbrev(&options_format, s, 1, 1));
     (*new)->value = tor_strdup(argv[i+1]);
     (*new)->next = NULL;
-    log(LOG_DEBUG, LD_CONFIG, "Commandline: parsed keyword '%s', value '%s'",
+    log(LOG_DEBUG, LD_CONFIG, "command line: parsed keyword '%s', value '%s'",
         (*new)->key, (*new)->value);
 
     new = &((*new)->next);
@@ -1605,7 +1705,7 @@
   int i;
   size_t keylen = strlen(key);
   if (!keylen)
-    return NULL; /* if they say "--" on the commandline, it's not an option */
+    return NULL; /* if they say "--" on the command line, it's not an option */
   /* First, check for an exact (case-insensitive) match */
   for (i=0; fmt->vars[i].name; ++i) {
     if (!strcasecmp(key, fmt->vars[i].name)) {
@@ -1810,7 +1910,7 @@
     if (!clear_first) {
       if (var->type == CONFIG_TYPE_LINELIST ||
           var->type == CONFIG_TYPE_LINELIST_S) {
-        /* We got an empty linelist from the torrc or commandline.
+        /* We got an empty linelist from the torrc or command line.
            As a special case, call this an error. Warn and ignore. */
         log_warn(LD_CONFIG,
                  "Linelist option '%s' has no value. Skipping.", c->key);
@@ -1860,7 +1960,7 @@
   return var ? var->name : NULL;
 }
 
-/** Return a canonicalized list of the options assigned for key.
+/** Return a canonical list of the options assigned for key.
  */
 config_line_t *
 option_get_assignment(or_options_t *options, const char *key)
@@ -2246,7 +2346,7 @@
   printf(
 "Copyright (c) 2001-2004, Roger Dingledine\n"
 "Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson\n"
-"Copyright (c) 2007-2008, The Tor Project, Inc.\n\n"
+"Copyright (c) 2007-2009, The Tor Project, Inc.\n\n"
 "tor -f <torrc> [args]\n"
 "See man page for options, or https://www.torproject.org/ for "
 "documentation.\n");
@@ -2612,6 +2712,35 @@
   config_init(&options_format, options);
 }
 
+/* Check if the port number given in <b>port_option</b> in combination with
+ * the specified port in <b>listen_options</b> will result in Tor actually
+ * opening a low port (meaning a port lower than 1024). Return 1 if
+ * it is, or 0 if it isn't or the concept of a low port isn't applicable for
+ * the platform we're on. */
+static int
+is_listening_on_low_port(uint16_t port_option,
+                         const config_line_t *listen_options)
+{
+#ifdef MS_WINDOWS
+  return 0; /* No port is too low for windows. */
+#else
+  const config_line_t *l;
+  uint16_t p;
+  if (port_option == 0)
+    return 0; /* We're not listening */
+  if (listen_options == NULL)
+    return (port_option < 1024);
+
+  for (l = listen_options; l; l = l->next) {
+    parse_addr_port(LOG_WARN, l->value, NULL, NULL, &p);
+    if (p<1024) {
+      return 1;
+    }
+  }
+  return 0;
+#endif
+}
+
 /** Set all vars in the configuration object <b>options</b> to their default
  * values. */
 static void
@@ -2864,7 +2993,7 @@
        !strcmpstart(uname, "Windows Me"))) {
     log(LOG_WARN, LD_CONFIG, "Tor is running as a server, but you are "
         "running %s; this probably won't work. See "
-        "http://wiki.noreply.org/noreply/TheOnionRouter/TorFAQ#ServerOS "
+        "https://wiki.torproject.org/TheOnionRouter/TorFAQ#ServerOS "
         "for details.", uname);
   }
 
@@ -3013,6 +3142,19 @@
     REJECT("TransPort and TransListenAddress are disabled in this build.");
 #endif
 
+  if (options->AccountingMax &&
+      (is_listening_on_low_port(options->ORPort, options->ORListenAddress) ||
+       is_listening_on_low_port(options->DirPort, options->DirListenAddress)))
+  {
+    log(LOG_WARN, LD_CONFIG,
+          "You have set AccountingMax to use hibernation. You have also "
+          "chosen a low DirPort or OrPort. This combination can make Tor stop "
+          "working when it tries to re-attach the port after a period of "
+          "hibernation. Please choose a different port or turn off "
+          "hibernation unless you know this combination will work on your "
+          "platform.");
+  }
+
   if (options->ExcludeExitNodes || options->ExcludeNodes) {
     options->_ExcludeExitNodesUnion = routerset_new();
     routerset_union(options->_ExcludeExitNodesUnion,options->ExcludeExitNodes);
@@ -3042,7 +3184,7 @@
     if (!options->ContactInfo && !options->TestingTorNetwork)
       REJECT("Authoritative directory servers must set ContactInfo");
     if (options->V1AuthoritativeDir && !options->RecommendedVersions)
-      REJECT("V1 auth dir servers must set RecommendedVersions.");
+      REJECT("V1 authoritative dir servers must set RecommendedVersions.");
     if (!options->RecommendedClientVersions)
       options->RecommendedClientVersions =
         config_lines_dup(options->RecommendedVersions);
@@ -3052,7 +3194,8 @@
     if (options->VersioningAuthoritativeDir &&
         (!options->RecommendedClientVersions ||
          !options->RecommendedServerVersions))
-      REJECT("Versioning auth dir servers must set Recommended*Versions.");
+      REJECT("Versioning authoritative dir servers must set "
+             "Recommended*Versions.");
     if (options->UseEntryGuards) {
       log_info(LD_CONFIG, "Authoritative directory servers can't set "
                "UseEntryGuards. Disabling.");
@@ -3068,6 +3211,10 @@
           options->V3AuthoritativeDir))
       REJECT("AuthoritativeDir is set, but none of "
              "(Bridge/HS/V1/V2/V3)AuthoritativeDir is set.");
+    /* If we have a v3bandwidthsfile and it's broken, complain on startup */
+    if (options->V3BandwidthsFile && !old_options) {
+      dirserv_read_measured_bandwidths(options->V3BandwidthsFile, NULL);
+    }
   }
 
   if (options->AuthoritativeDir && !options->DirPort)
@@ -3083,6 +3230,10 @@
     REJECT("HSAuthorityRecordStats is set but we're not running as "
            "a hidden service authority.");
 
+  if (options->FetchDirInfoExtraEarly && !options->FetchDirInfoEarly)
+    REJECT("FetchDirInfoExtraEarly requires that you also set "
+           "FetchDirInfoEarly");
+
   if (options->ConnLimit <= 0) {
     r = tor_snprintf(buf, sizeof(buf),
         "ConnLimit must be greater than 0, but was set to %d",
@@ -3221,6 +3372,15 @@
     return -1;
   }
 
+  if ((options->BridgeRelay
+        || options->_PublishServerDescriptor & BRIDGE_AUTHORITY)
+      && (options->_PublishServerDescriptor
+          & (V1_AUTHORITY|V2_AUTHORITY|V3_AUTHORITY))) {
+    REJECT("Bridges are not supposed to publish router descriptors to the "
+           "directory authorities. Please correct your "
+           "PublishServerDescriptor line.");
+  }
+
   if (options->MinUptimeHidServDirectoryV2 < 0) {
     log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at "
                         "least 0 seconds. Changing to 0.");
@@ -3576,6 +3736,11 @@
                         "testing Tor network!");
   }
 
+  if (options->AccelName && !options->HardwareAccel)
+    options->HardwareAccel = 1;
+  if (options->AccelDir && !options->AccelName)
+    REJECT("Can't use hardware crypto accelerator dir without engine name.");
+
   return 0;
 #undef REJECT
 #undef COMPLAIN
@@ -3633,9 +3798,11 @@
     return -1;
   }
 
-  if (old->HardwareAccel != new_val->HardwareAccel) {
-    *msg = tor_strdup("While Tor is running, changing HardwareAccel is "
-                      "not allowed.");
+  if ((old->HardwareAccel != new_val->HardwareAccel)
+      || !opt_streq(old->AccelName, new_val->AccelName)
+      || !opt_streq(old->AccelDir, new_val->AccelDir)) {
+    *msg = tor_strdup("While Tor is running, changing OpenSSL hardware "
+                      "acceleration engine is not allowed.");
     return -1;
   }
 
@@ -3649,7 +3816,7 @@
 }
 
 /** Return 1 if any change from <b>old_options</b> to <b>new_options</b>
- * will require us to rotate the cpu and dns workers; else return 0. */
+ * will require us to rotate the CPU and DNS workers; else return 0. */
 static int
 options_transition_affects_workers(or_options_t *old_options,
                                    or_options_t *new_options)
@@ -3677,9 +3844,7 @@
                                       or_options_t *new_options)
 {
   /* XXX We can be smarter here. If your DirPort isn't being
-   * published and you just turned it off, no need to republish. If
-   * you changed your bandwidthrate but maxadvertisedbandwidth still
-   * trumps, no need to republish. Etc. */
+   * published and you just turned it off, no need to republish. Etc. */
   if (!opt_streq(old_options->DataDirectory, new_options->DataDirectory) ||
       !opt_streq(old_options->Nickname,new_options->Nickname) ||
       !opt_streq(old_options->Address,new_options->Address) ||
@@ -3692,10 +3857,9 @@
       old_options->NoPublish != new_options->NoPublish ||
       old_options->_PublishServerDescriptor !=
         new_options->_PublishServerDescriptor ||
-      old_options->BandwidthRate != new_options->BandwidthRate ||
-      old_options->BandwidthBurst != new_options->BandwidthBurst ||
-      old_options->MaxAdvertisedBandwidth !=
-        new_options->MaxAdvertisedBandwidth ||
+      get_effective_bwrate(old_options) != get_effective_bwrate(new_options) ||
+      get_effective_bwburst(old_options) !=
+        get_effective_bwburst(new_options) ||
       !opt_streq(old_options->ContactInfo, new_options->ContactInfo) ||
       !opt_streq(old_options->MyFamily, new_options->MyFamily) ||
       !opt_streq(old_options->AccountingStart, new_options->AccountingStart) ||
@@ -3906,7 +4070,7 @@
   char *command_arg = NULL;
   char *errmsg=NULL;
 
-  if (argv) { /* first time we're called. save commandline args */
+  if (argv) { /* first time we're called. save command line args */
     backup_argv = argv;
     backup_argc = argc;
   } else { /* we're reloading. need to clean up old options first. */
@@ -3927,6 +4091,12 @@
     printf("Tor version %s.\n",get_version());
     exit(0);
   }
+  if (argc > 1 && (!strcmp(argv[1],"--digests"))) {
+    printf("Tor version %s.\n",get_version());
+    printf("%s", libor_get_digests());
+    printf("%s", tor_get_digests());
+    exit(0);
+  }
 
   /* Go through command-line variables */
   if (!global_cmdline_options) {
@@ -4115,7 +4285,7 @@
     return get_default_conf_file();
 }
 
-/** Adjust the address map mased on the MapAddress elements in the
+/** Adjust the address map based on the MapAddress elements in the
  * configuration <b>options</b>
  */
 static void
@@ -4671,30 +4841,56 @@
 static uint64_t
 config_parse_units(const char *val, struct unit_table_t *u, int *ok)
 {
-  uint64_t v;
-  char *cp;
+  uint64_t v = 0;
+  double d = 0;
+  int use_float = 0;
 
+  smartlist_t *sl;
+
   tor_assert(ok);
+  sl = smartlist_create();
+  smartlist_split_string(sl, val, NULL,
+                         SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 3);
 
-  v = tor_parse_uint64(val, 10, 0, UINT64_MAX, ok, &cp);
-  if (!*ok)
-    return 0;
-  if (!cp) {
+  if (smartlist_len(sl) < 1 || smartlist_len(sl) > 2) {
+    *ok = 0;
+    goto done;
+  }
+
+  v = tor_parse_uint64(smartlist_get(sl,0), 10, 0, UINT64_MAX, ok, NULL);
+  if (!*ok) {
+    int r = sscanf(smartlist_get(sl,0), "%lf", &d);
+    if (r == 0 || d < 0)
+      goto done;
+    use_float = 1;
+  }
+
+  if (smartlist_len(sl) == 1) {
     *ok = 1;
-    return v;
+    v = use_float ? DBL_TO_U64(d) :  v;
+    goto done;
   }
-  while (TOR_ISSPACE(*cp))
-    ++cp;
+
   for ( ;u->unit;++u) {
-    if (!strcasecmp(u->unit, cp)) {
-      v *= u->multiplier;
+    if (!strcasecmp(u->unit, smartlist_get(sl,1))) {
+      if (use_float)
+        v = u->multiplier * d;
+      else
+        v *= u->multiplier;
       *ok = 1;
-      return v;
+      goto done;
     }
   }
-  log_warn(LD_CONFIG, "Unknown unit '%s'.", cp);
+  log_warn(LD_CONFIG, "Unknown unit '%s'.", (char*)smartlist_get(sl,1));
   *ok = 0;
-  return 0;
+ done:
+  SMARTLIST_FOREACH(sl, char *, cp, tor_free(cp));
+  smartlist_free(sl);
+
+  if (*ok)
+    return v;
+  else
+    return 0;
 }
 
 /** Parse a string in the format "number unit", where unit is a unit of
@@ -4726,256 +4922,37 @@
   return (int)r;
 }
 
-/* This is what passes for version detection on OSX.  We set
- * MACOSX_KQUEUE_IS_BROKEN to true iff we're on a version of OSX before
- * 10.4.0 (aka 1040). */
-#ifdef __APPLE__
-#ifdef __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
-#define MACOSX_KQUEUE_IS_BROKEN \
-  (__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ < 1040)
-#else
-#define MACOSX_KQUEUE_IS_BROKEN 0
-#endif
-#endif
-
 /**
  * Initialize the libevent library.
  */
 static void
 init_libevent(void)
 {
+  const char *badness=NULL;
+
   configure_libevent_logging();
   /* If the kernel complains that some method (say, epoll) doesn't
    * exist, we don't care about it, since libevent will cope.
    */
   suppress_libevent_log_msg("Function not implemented");
-#ifdef __APPLE__
-  if (MACOSX_KQUEUE_IS_BROKEN ||
-      decode_libevent_version(event_get_version(), NULL) < LE_11B) {
-    setenv("EVENT_NOKQUEUE","1",1);
-  }
-#endif
 
-  /* In libevent versions before 2.0, it's hard to keep binary compatibility
-   * between upgrades, and unpleasant to detect when the version we compiled
-   * against is unlike the version we have linked against. Here's how. */
-#if defined(_EVENT_VERSION) && defined(HAVE_EVENT_GET_VERSION)
-  /* We have a header-file version and a function-call version. Easy. */
-  if (strcmp(_EVENT_VERSION, event_get_version())) {
-    int compat1 = -1, compat2 = -1;
-    int verybad, prettybad ;
-    decode_libevent_version(_EVENT_VERSION, &compat1);
-    decode_libevent_version(event_get_version(), &compat2);
-    verybad = compat1 != compat2;
-    prettybad = (compat1 == -1 || compat2 == -1) && compat1 != compat2;
+  tor_check_libevent_header_compatibility();
 
-    log(verybad ? LOG_WARN : (prettybad ? LOG_NOTICE : LOG_INFO),
-        LD_GENERAL, "We were compiled with headers from version %s "
-        "of Libevent, but we're using a Libevent library that says it's "
-        "version %s.", _EVENT_VERSION, event_get_version());
-    if (verybad)
-      log_warn(LD_GENERAL, "This will almost certainly make Tor crash.");
-    else if (prettybad)
-      log_notice(LD_GENERAL, "If Tor crashes, this might be why.");
-    else
-      log_info(LD_GENERAL, "I think these versions are binary-compatible.");
-  }
-#elif defined(HAVE_EVENT_GET_VERSION)
-  /* event_get_version but no _EVENT_VERSION.  We might be in 1.4.0-beta or
-     earlier, where that's normal.  To see whether we were compiled with an
-     earlier version, let's see whether the struct event defines MIN_HEAP_IDX.
-  */
-#ifdef HAVE_STRUCT_EVENT_MIN_HEAP_IDX
-  /* The header files are 1.4.0-beta or later. If the version is not
-   * 1.4.0-beta, we are incompatible. */
-  {
-    if (strcmp(event_get_version(), "1.4.0-beta")) {
-      log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
-               "Libevent 1.4.0-beta header files, whereas you have linked "
-               "against Libevent %s.  This will probably make Tor crash.",
-               event_get_version());
-    }
-  }
-#else
-  /* Our headers are 1.3e or earlier. If the library version is not 1.4.x or
-     later, we're probably fine. */
-  {
-    const char *v = event_get_version();
-    if ((v[0] == '1' && v[2] == '.' && v[3] > '3') || v[0] > '1') {
-      log_warn(LD_GENERAL, "It's a little hard to tell, but you seem to have "
-               "Libevent header file from 1.3e or earlier, whereas you have "
-               "linked against Libevent %s.  This will probably make Tor "
-               "crash.", event_get_version());
-    }
-  }
-#endif
+  tor_libevent_initialize();
 
-#elif defined(_EVENT_VERSION)
-#warn "_EVENT_VERSION is defined but not get_event_version(): Libevent is odd."
-#else
-  /* Your libevent is ancient. */
-#endif
-
-  event_init();
   suppress_libevent_log_msg(NULL);
-#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
-  /* Making this a NOTICE for now so we can link bugs to a libevent versions
-   * or methods better. */
-  log(LOG_NOTICE, LD_GENERAL,
-      "Initialized libevent version %s using method %s. Good.",
-      event_get_version(), event_get_method());
-  check_libevent_version(event_get_method(), get_options()->ORPort != 0);
-#else
-  log(LOG_NOTICE, LD_GENERAL,
-      "Initialized old libevent (version 1.0b or earlier).");
-  log(LOG_WARN, LD_GENERAL,
-      "You have a *VERY* old version of libevent.  It is likely to be buggy; "
-      "please build Tor with a more recent version.");
-#endif
-}
 
-/** Table mapping return value of event_get_version() to le_version_t. */
-static const struct {
-  const char *name; le_version_t version; int bincompat;
-} le_version_table[] = {
-  /* earlier versions don't have get_version. */
-  { "1.0c", LE_10C, 1},
-  { "1.0d", LE_10D, 1},
-  { "1.0e", LE_10E, 1},
-  { "1.1",  LE_11,  1 },
-  { "1.1a", LE_11A, 1 },
-  { "1.1b", LE_11B, 1 },
-  { "1.2",  LE_12,  1 },
-  { "1.2a", LE_12A, 1 },
-  { "1.3",  LE_13,  1 },
-  { "1.3a", LE_13A, 1 },
-  { "1.3b", LE_13B, 1 },
-  { "1.3c", LE_13C, 1 },
-  { "1.3d", LE_13D, 1 },
-  { "1.3e", LE_13E, 1 },
-  { "1.4.0-beta", LE_140, 2 },
-  { "1.4.1-beta", LE_141, 2 },
-  { "1.4.2-rc",   LE_142, 2 },
-  { "1.4.3-stable", LE_143, 2 },
-  { "1.4.4-stable", LE_144, 2 },
-  { "1.4.5-stable", LE_145, 2 },
-  { "1.4.6-stable", LE_146, 2 },
-  { "1.4.7-stable", LE_147, 2 },
-  { "1.4.8-stable", LE_148, 2 },
-  { "1.4.99-trunk", LE_1499, 3 },
-  { NULL, LE_OTHER, 0 }
-};
-
-/** Return the le_version_t for the current version of libevent.  If the
- * version is very new, return LE_OTHER.  If the version is so old that it
- * doesn't support event_get_version(), return LE_OLD. */
-static le_version_t
-decode_libevent_version(const char *v, int *bincompat_out)
-{
-  int i;
-  for (i=0; le_version_table[i].name; ++i) {
-    if (!strcmp(le_version_table[i].name, v)) {
-      if (bincompat_out)
-        *bincompat_out = le_version_table[i].bincompat;
-      return le_version_table[i].version;
-    }
-  }
-  if (v[0] != '1' && bincompat_out)
-    *bincompat_out = 100;
-  else if (!strcmpstart(v, "1.4") && bincompat_out)
-    *bincompat_out = 2;
-  return LE_OTHER;
-}
-
-#if defined(HAVE_EVENT_GET_VERSION) && defined(HAVE_EVENT_GET_METHOD)
-/**
- * Compare the given libevent method and version to a list of versions
- * which are known not to work.  Warn the user as appropriate.
- */
-static void
-check_libevent_version(const char *m, int server)
-{
-  int buggy = 0, iffy = 0, slow = 0, thread_unsafe = 0;
-  le_version_t version;
-  const char *v = event_get_version();
-  const char *badness = NULL;
-  const char *sad_os = "";
-
-  version = decode_libevent_version(v, NULL);
-
-  /* XXX Would it be worthwhile disabling the methods that we know
-   * are buggy, rather than just warning about them and then proceeding
-   * to use them? If so, we should probably not wrap this whole thing
-   * in HAVE_EVENT_GET_VERSION and HAVE_EVENT_GET_METHOD. -RD */
-  /* XXXX The problem is that it's not trivial to get libevent to change it's
-   * method once it's initialized, and it's not trivial to tell what method it
-   * will use without initializing it.  I guess we could preemptively disable
-   * buggy libevent modes based on the version _before_ initializing it,
-   * though, but then there's no good way (afaict) to warn "I would have used
-   * kqueue, but instead I'm using select." -NM */
-  if (!strcmp(m, "kqueue")) {
-    if (version < LE_11B)
-      buggy = 1;
-  } else if (!strcmp(m, "epoll")) {
-    if (version < LE_11)
-      iffy = 1;
-  } else if (!strcmp(m, "poll")) {
-    if (version < LE_10E)
-      buggy = 1;
-    else if (version < LE_11)
-      slow = 1;
-  } else if (!strcmp(m, "select")) {
-    if (version < LE_11)
-      slow = 1;
-  } else if (!strcmp(m, "win32")) {
-    if (version < LE_11B)
-      buggy = 1;
-  }
-
-  /* Libevent versions before 1.3b do very badly on operating systems with
-   * user-space threading implementations. */
-#if defined(__OpenBSD__) || defined(__FreeBSD__) || defined(__NetBSD__)
-  if (server && version < LE_13B) {
-    thread_unsafe = 1;
-    sad_os = "BSD variants";
-  }
-#elif defined(__APPLE__) || defined(__darwin__)
-  if (server && version < LE_13B) {
-    thread_unsafe = 1;
-    sad_os = "Mac OS X";
-  }
-#endif
-
-  if (thread_unsafe) {
-    log(LOG_WARN, LD_GENERAL,
-        "Libevent version %s often crashes when running a Tor server with %s. "
-        "Please use the latest version of libevent (1.3b or later)",v,sad_os);
-    badness = "BROKEN";
-  } else if (buggy) {
-    log(LOG_WARN, LD_GENERAL,
-        "There are serious bugs in using %s with libevent %s. "
-        "Please use the latest version of libevent.", m, v);
-    badness = "BROKEN";
-  } else if (iffy) {
-    log(LOG_WARN, LD_GENERAL,
-        "There are minor bugs in using %s with libevent %s. "
-        "You may want to use the latest version of libevent.", m, v);
-    badness = "BUGGY";
-  } else if (slow && server) {
-    log(LOG_WARN, LD_GENERAL,
-        "libevent %s can be very slow with %s. "
-        "When running a server, please use the latest version of libevent.",
-        v,m);
-    badness = "SLOW";
-  }
+  tor_check_libevent_version(tor_libevent_get_method(),
+                             get_options()->ORPort != 0,
+                             &badness);
   if (badness) {
+    const char *v = tor_libevent_get_version_str();
+    const char *m = tor_libevent_get_method();
     control_event_general_status(LOG_WARN,
         "BAD_LIBEVENT VERSION=%s METHOD=%s BADNESS=%s RECOVERED=NO",
                                  v, m, badness);
   }
-
 }
-#endif
 
 /** Return the persistent state struct for this Tor. */
 or_state_t *

Added: tor/trunk/src/or/config_codedigest.c
===================================================================
--- tor/trunk/src/or/config_codedigest.c	                        (rev 0)
+++ tor/trunk/src/or/config_codedigest.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -0,0 +1,11 @@
+
+const char *tor_get_digests(void);
+
+const char *
+tor_get_digests(void)
+{
+  return ""
+#include "or_sha1.i"
+    ;
+}
+


Property changes on: tor/trunk/src/or/config_codedigest.c
___________________________________________________________________
Added: svn:keywords
   + Author Date Id Revision

Modified: tor/trunk/src/or/connection.c
===================================================================
--- tor/trunk/src/or/connection.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/connection.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -299,25 +299,6 @@
   conn_b->linked_conn = conn_a;
 }
 
-/** Tell libevent that we don't care about <b>conn</b> any more. */
-void
-connection_unregister_events(connection_t *conn)
-{
-  if (conn->read_event) {
-    if (event_del(conn->read_event))
-      log_warn(LD_BUG, "Error removing read event for %d", conn->s);
-    tor_free(conn->read_event);
-  }
-  if (conn->write_event) {
-    if (event_del(conn->write_event))
-      log_warn(LD_BUG, "Error removing write event for %d", conn->s);
-    tor_free(conn->write_event);
-  }
-  if (conn->dns_server_port) {
-    dnsserv_close_listener(conn);
-  }
-}
-
 /** Deallocate memory used by <b>conn</b>. Deallocate its buffers if
  * necessary, close its socket if necessary, and mark the directory as dirty
  * if <b>conn</b> is an OR or OP connection.
@@ -369,7 +350,7 @@
     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 ports can be Unix domain sockets
        * and listeners at the same time */
       tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER);
 
@@ -474,7 +455,7 @@
 }
 
 /** Call _connection_free() on every connection in our array, and release all
- * storage helpd by connection.c. This is used by cpuworkers and dnsworkers
+ * 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).
  *
@@ -544,13 +525,6 @@
          * failed: forget about this router, and maybe try again. */
         connection_dir_request_failed(dir_conn);
       }
-      if (conn->purpose == DIR_PURPOSE_FETCH_RENDDESC && dir_conn->rend_data) {
-        /* Give it a try. However, there is no re-fetching for v0 rend
-         * descriptors; if the response is empty or the descriptor is
-         * unusable, close pending connections (unless a v2 request is
-         * still in progress). */
-        rend_client_desc_trynow(dir_conn->rend_data->onion_address, 0);
-      }
       /* If we were trying to fetch a v2 rend desc and did not succeed,
        * retry as needed. (If a fetch is successful, the connection state
        * is changed to DIR_PURPOSE_HAS_FETCHED_RENDDESC to mark that
@@ -618,6 +592,7 @@
                  conn->marked_for_close_file, conn->marked_for_close);
         dnsserv_reject_request(edge_conn);
       }
+      control_event_stream_bandwidth(edge_conn);
       control_event_stream_status(edge_conn, STREAM_EVENT_CLOSED,
                                   edge_conn->end_reason);
       circ = circuit_get_by_edge_conn(edge_conn);
@@ -746,7 +721,7 @@
  * for the new structure.  If no port is provided in <b>listenaddress</b> then
  * <b>listenport</b> is used.
  *
- * If not NULL <b>readable_addrress</b> will contain a copy of the host part of
+ * If not NULL <b>readable_address</b> will contain a copy of the host part of
  * <b>listenaddress</b>.
  *
  * The listenaddr struct has to be freed by the caller.
@@ -783,14 +758,14 @@
 
 #ifdef HAVE_SYS_UN_H
 /** Create an AF_UNIX listenaddr struct.
- * <b>listenaddress</b> provides the path to the unix socket.
+ * <b>listenaddress</b> provides the path to the Unix socket.
  *
  * Eventually <b>listenaddress</b> will also optionally contain user, group,
  * and file permissions for the new socket.  But not yet. XXX
  * Also, since we do not create the socket here the information doesn't help
  * here.
  *
- * If not NULL <b>readable_addrress</b> will contain a copy of the path part of
+ * If not NULL <b>readable_address</b> will contain a copy of the path part of
  * <b>listenaddress</b>.
  *
  * The listenaddr struct has to be freed by the caller.
@@ -918,7 +893,7 @@
   } else if (listensockaddr->sa_family == AF_UNIX) {
     start_reading = 1;
 
-    /* For now only control ports can be unix domain sockets
+    /* For now only control ports can be Unix domain sockets
      * and listeners at the same time */
     tor_assert(type == CONN_TYPE_CONTROL_LISTENER);
 
@@ -1150,7 +1125,7 @@
     newconn->address = tor_dup_addr(&addr);
 
   } else if (conn->socket_family == AF_UNIX) {
-    /* For now only control ports can be unix domain sockets
+    /* For now only control ports can be Unix domain sockets
      * and listeners at the same time */
     tor_assert(conn->type == CONN_TYPE_CONTROL_LISTENER);
 
@@ -1178,7 +1153,7 @@
 }
 
 /** Initialize states for newly accepted connection <b>conn</b>.
- * If conn is an OR, start the tls handshake.
+ * If conn is an OR, start the TLS handshake.
  * If conn is a transparent AP, get its original destination
  * and place it in circuit_wait.
  */
@@ -1727,10 +1702,16 @@
     tor_fragile_assert();
   }
 
-  if (num_read > 0)
+  if (num_read > 0) {
+    if (conn->type == CONN_TYPE_EXIT)
+      rep_hist_note_exit_bytes_read(conn->port, num_read, now);
     rep_hist_note_bytes_read(num_read, now);
-  if (num_written > 0)
+  }
+  if (num_written > 0) {
+    if (conn->type == CONN_TYPE_EXIT)
+      rep_hist_note_exit_bytes_written(conn->port, num_written, now);
     rep_hist_note_bytes_written(num_written, now);
+  }
 
   if (connection_counts_as_relayed_traffic(conn, now)) {
     global_relayed_read_bucket -= (int)num_read;
@@ -1809,7 +1790,7 @@
   }
 }
 
-/** Refill a single <b>bucket</b> called <b>name</b> with bandwith rate
+/** Refill a single <b>bucket</b> called <b>name</b> with bandwidth rate
  * <b>rate</b> and bandwidth burst <b>burst</b>, assuming that
  * <b>seconds_elapsed</b> seconds have passed since the last call.
  **/
@@ -2321,6 +2302,13 @@
     /* else open, or closing */
     result = flush_buf_tls(or_conn->tls, conn->outbuf,
                            max_to_write, &conn->outbuf_flushlen);
+#ifdef ENABLE_DIRREQ_STATS
+    /* If we just flushed the last bytes, check if this tunneled dir
+     * request is done. */
+    if (buf_datalen(conn->outbuf) == 0 && conn->dirreq_id)
+      geoip_change_dirreq_state(conn->dirreq_id, DIRREQ_TUNNELED,
+                                DIRREQ_OR_CONN_BUFFER_FLUSHED);
+#endif
     switch (result) {
       CASE_TOR_TLS_ERROR_ANY:
       case TOR_TLS_CLOSE:
@@ -2576,13 +2564,11 @@
 
 /** Return a connection of type <b>type</b> that has rendquery equal
  * to <b>rendquery</b>, and that is not marked for close. If state
- * is non-zero, conn must be of that state too. If rendversion is
- * nonnegative, conn must be fetching that rendversion, too.
+ * is non-zero, conn must be of that state too.
  */
 connection_t *
 connection_get_by_type_state_rendquery(int type, int state,
-                                       const char *rendquery,
-                                       int rendversion)
+                                       const char *rendquery)
 {
   smartlist_t *conns = get_connection_array();
 
@@ -2597,8 +2583,6 @@
         (!state || state == conn->state)) {
       if (type == CONN_TYPE_DIR &&
           TO_DIR_CONN(conn)->rend_data &&
-          (rendversion < 0 ||
-           rendversion == TO_DIR_CONN(conn)->rend_data->rend_desc_version) &&
           !rend_cmp_service_ids(rendquery,
                                 TO_DIR_CONN(conn)->rend_data->onion_address))
         return conn;

Modified: tor/trunk/src/or/connection_edge.c
===================================================================
--- tor/trunk/src/or/connection_edge.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/connection_edge.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -160,6 +160,7 @@
              "CircID %d: At an edge. Marking connection for close.", circ_id);
     if (conn->_base.type == CONN_TYPE_AP) {
       connection_mark_unattached_ap(conn, END_STREAM_REASON_DESTROY);
+      control_event_stream_bandwidth(conn);
       control_event_stream_status(conn, STREAM_EVENT_CLOSED,
                                   END_STREAM_REASON_DESTROY);
       conn->end_reason |= END_STREAM_REASON_FLAG_ALREADY_SENT_CLOSED;
@@ -265,7 +266,7 @@
   return 0;
 }
 
-/** An error has just occured on an operation on an edge connection
+/** An error has just occurred on an operation on an edge connection
  * <b>conn</b>.  Extract the errno; convert it to an end reason, and send an
  * appropriate relay end cell to the other end of the connection's circuit.
  **/
@@ -332,8 +333,10 @@
            escaped_safe_str(conn->address),conn->port,
            safe_str(fmt_addr(&conn->addr)));
 
+  rep_hist_note_exit_stream_opened(conn->port, approx_time());
+
   conn->state = EXIT_CONN_STATE_OPEN;
-  connection_watch_events(conn, EV_READ); /* stop writing, continue reading */
+  connection_watch_events(conn, READ_EVENT); /* stop writing, keep reading */
   if (connection_wants_to_flush(conn)) /* in case there are any queued relay
                                         * cells */
     connection_start_writing(conn);
@@ -508,10 +511,10 @@
   });
 }
 
-/** Tell any AP streams that are waiting for a onehop tunnel to
+/** Tell any AP streams that are waiting for a one-hop tunnel to
  * <b>failed_digest</b> that they are going to fail. */
 /* XXX022 We should get rid of this function, and instead attach
- * onehop streams to circ->p_streams so they get marked in
+ * one-hop streams to circ->p_streams so they get marked in
  * circuit_mark_for_close like normal p_streams. */
 void
 connection_ap_fail_onehop(const char *failed_digest,
@@ -542,7 +545,7 @@
           build_state->chosen_exit->port != edge_conn->socks_request->port)
         continue;
     }
-    log_info(LD_APP, "Closing onehop stream to '%s/%s' because the OR conn "
+    log_info(LD_APP, "Closing one-hop stream to '%s/%s' because the OR conn "
                      "just failed.", edge_conn->chosen_exit_name,
                      edge_conn->socks_request->address);
     connection_mark_unattached_ap(edge_conn, END_STREAM_REASON_TIMEOUT);
@@ -630,12 +633,12 @@
  * - A MapAddress command from the controller [permanent]
  * - An AddressMap directive in the torrc [permanent]
  * - When a TrackHostExits torrc directive is triggered [temporary]
- * - When a dns resolve succeeds [temporary]
- * - When a dns resolve fails [temporary]
+ * - When a DNS resolve succeeds [temporary]
+ * - When a DNS resolve fails [temporary]
  *
  * When an addressmap request is made but one is already registered,
  * the new one is replaced only if the currently registered one has
- * no "new_address" (that is, it's in the process of dns resolve),
+ * no "new_address" (that is, it's in the process of DNS resolve),
  * or if the new one is permanent (expires==0 or 1).
  *
  * (We overload the 'expires' field, using "0" for mappings set via
@@ -954,7 +957,7 @@
   return ent->num_resolve_failures;
 }
 
-/** If <b>address</b> is in the client dns addressmap, reset
+/** If <b>address</b> is in the client DNS addressmap, reset
  * the number of resolve failures we have on record for it.
  * This is used when we fail a stream because it won't resolve:
  * otherwise future attempts on that address will only try once.
@@ -1480,10 +1483,12 @@
   /* 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);
+  addresstype = parse_extended_hostname(socks->address,
+                         remapped_to_exit || options->AllowDotExit);
 
   if (addresstype == BAD_HOSTNAME) {
-    log_warn(LD_APP, "Invalid hostname %s; rejecting", socks->address);
+    log_warn(LD_APP, "Invalid onion hostname %s; rejecting",
+             safe_str(socks->address));
     control_event_client_status(LOG_WARN, "SOCKS_BAD_HOSTNAME HOSTNAME=%s",
                                 escaped(socks->address));
     connection_mark_unattached_ap(conn, END_STREAM_REASON_TORPROTOCOL);
@@ -1492,7 +1497,7 @@
 
   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.*/
+     * node, and conn->address to hold only the address portion. */
     char *s = strrchr(socks->address,'.');
     tor_assert(!automap);
     if (s) {
@@ -1675,34 +1680,14 @@
       conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT;
       log_info(LD_REND, "Unknown descriptor %s. Fetching.",
                safe_str(conn->rend_data->onion_address));
-      /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
-       * arrives first. Exception: When using client authorization, only
-       * fetch v2 descriptors.*/
       rend_client_refetch_v2_renddesc(conn->rend_data);
-      if (conn->rend_data->auth_type == REND_NO_AUTH)
-        rend_client_refetch_renddesc(conn->rend_data->onion_address);
     } else { /* r > 0 */
-/** How long after we receive a hidden service descriptor do we consider
- * it valid? */
-#define NUM_SECONDS_BEFORE_HS_REFETCH (60*15)
-      if (now - entry->received < NUM_SECONDS_BEFORE_HS_REFETCH) {
-        conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
-        log_info(LD_REND, "Descriptor is here and fresh enough. Great.");
-        if (connection_ap_handshake_attach_circuit(conn) < 0) {
-          if (!conn->_base.marked_for_close)
-            connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
-          return -1;
-        }
-      } else {
-        conn->_base.state = AP_CONN_STATE_RENDDESC_WAIT;
-        log_info(LD_REND, "Stale descriptor %s. Refetching.",
-                 safe_str(conn->rend_data->onion_address));
-        /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
-         * arrives first. Exception: When using client authorization, only
-         * fetch v2 descriptors.*/
-        rend_client_refetch_v2_renddesc(conn->rend_data);
-        if (conn->rend_data->auth_type == REND_NO_AUTH)
-          rend_client_refetch_renddesc(conn->rend_data->onion_address);
+      conn->_base.state = AP_CONN_STATE_CIRCUIT_WAIT;
+      log_info(LD_REND, "Descriptor is here. Great.");
+      if (connection_ap_handshake_attach_circuit(conn) < 0) {
+        if (!conn->_base.marked_for_close)
+          connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
+        return -1;
       }
     }
     return 0;
@@ -1716,7 +1701,7 @@
 get_pf_socket(void)
 {
   int pf;
-  /*  This should be opened before dropping privs. */
+  /*  This should be opened before dropping privileges. */
   if (pf_socket >= 0)
     return pf_socket;
 
@@ -1890,14 +1875,6 @@
     return -1;
   } /* else socks handshake is done, continue processing */
 
-  if (hostname_is_noconnect_address(socks->address))
-  {
-    control_event_stream_status(conn, STREAM_EVENT_NEW, 0);
-    control_event_stream_status(conn, STREAM_EVENT_CLOSED, 0);
-    connection_mark_unattached_ap(conn, END_STREAM_REASON_DONE);
-    return -1;
-  }
-
   if (SOCKS_COMMAND_IS_CONNECT(socks->command))
     control_event_stream_status(conn, STREAM_EVENT_NEW, 0);
   else
@@ -2567,6 +2544,11 @@
 
   log_debug(LD_EXIT,"Creating new exit connection.");
   n_stream = edge_connection_new(CONN_TYPE_EXIT, AF_INET);
+#ifdef ENABLE_DIRREQ_STATS
+  /* Remember the tunneled request ID in the new edge connection, so that
+   * we can measure download times. */
+  TO_CONN(n_stream)->dirreq_id = circ->dirreq_id;
+#endif
   n_stream->_base.purpose = EXIT_PURPOSE_CONNECT;
 
   n_stream->stream_id = rh.stream_id;
@@ -2736,9 +2718,9 @@
     case 0:
       conn->state = EXIT_CONN_STATE_CONNECTING;
 
-      connection_watch_events(conn, EV_WRITE | EV_READ);
+      connection_watch_events(conn, READ_EVENT | WRITE_EVENT);
       /* writable indicates finish;
-       * readable/error indicates broken link in windowsland. */
+       * readable/error indicates broken link in windows-land. */
       return;
     /* case 1: fall through */
   }
@@ -2749,7 +2731,7 @@
     log_warn(LD_BUG,"newly connected conn had data waiting!");
 //    connection_start_writing(conn);
   }
-  connection_watch_events(conn, EV_READ);
+  connection_watch_events(conn, READ_EVENT);
 
   /* also, deliver a 'connected' cell back through the circuit. */
   if (connection_edge_is_rendezvous_stream(edge_conn)) {
@@ -2803,6 +2785,11 @@
   dirconn->_base.purpose = DIR_PURPOSE_SERVER;
   dirconn->_base.state = DIR_CONN_STATE_SERVER_COMMAND_WAIT;
 
+#ifdef ENABLE_DIRREQ_STATS
+  /* Note that the new dir conn belongs to the same tunneled request as
+   * the edge conn, so that we can measure download times. */
+  TO_CONN(dirconn)->dirreq_id = TO_CONN(exitconn)->dirreq_id;
+#endif
   connection_link_connections(TO_CONN(dirconn), TO_CONN(exitconn));
 
   if (connection_add(TO_CONN(exitconn))<0) {
@@ -2908,14 +2895,14 @@
 /** If address is of the form "y.onion" with a well-formed handle y:
  *     Put a NUL after y, lower-case it, and return ONION_HOSTNAME.
  *
- * If address is of the form "y.exit":
+ * If address is of the form "y.exit" and <b>allowdotexit</b> is true:
  *     Put a NUL after y and return EXIT_HOSTNAME.
  *
  * Otherwise:
  *     Return NORMAL_HOSTNAME and change nothing.
  */
 hostname_type_t
-parse_extended_hostname(char *address)
+parse_extended_hostname(char *address, int allowdotexit)
 {
     char *s;
     char query[REND_SERVICE_ID_LEN_BASE32+1];
@@ -2924,14 +2911,19 @@
     if (!s)
       return NORMAL_HOSTNAME; /* no dot, thus normal */
     if (!strcmp(s+1,"exit")) {
-      *s = 0; /* nul-terminate it */
-      return EXIT_HOSTNAME; /* .exit */
+      if (allowdotexit) {
+        *s = 0; /* NUL-terminate it */
+        return EXIT_HOSTNAME; /* .exit */
+      } /* else */
+      log_warn(LD_APP, "The \".exit\" notation is disabled in Tor due to "
+               "security risks. Set AllowDotExit in your torrc to enable it.");
+      /* FFFF send a controller event too to notify Vidalia users */
     }
     if (strcmp(s+1,"onion"))
       return NORMAL_HOSTNAME; /* neither .exit nor .onion, thus normal */
 
     /* so it is .onion */
-    *s = 0; /* nul-terminate it */
+    *s = 0; /* NUL-terminate it */
     if (strlcpy(query, address, REND_SERVICE_ID_LEN_BASE32+1) >=
         REND_SERVICE_ID_LEN_BASE32+1)
       goto failed;
@@ -2944,11 +2936,3 @@
     return BAD_HOSTNAME;
 }
 
-/** Check if the address is of the form "y.noconnect"
- */
-int
-hostname_is_noconnect_address(const char *address)
-{
-  return ! strcasecmpend(address, ".noconnect");
-}
-

Modified: tor/trunk/src/or/connection_or.c
===================================================================
--- tor/trunk/src/or/connection_or.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/connection_or.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -792,7 +792,7 @@
       connection_free(TO_CONN(conn));
       return NULL;
     case 0:
-      connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE);
+      connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT);
       /* writable indicates finish, readable indicates broken link,
          error indicates broken link on windows */
       return conn;

Modified: tor/trunk/src/or/control.c
===================================================================
--- tor/trunk/src/or/control.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/control.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -54,27 +54,17 @@
  **/
 typedef uint32_t event_mask_t;
 
-/** An event mask of all the events that controller with the LONG_NAMES option
- * set is interested in receiving. */
-static event_mask_t global_event_mask1long = 0;
+/** An event mask of all the events that any controller is interested in
+ * receiving. */
+static event_mask_t global_event_mask = 0;
 
-/** An event mask of all the events that controller with the SHORT_NAMES option
- * set is interested in receiving. */
-static event_mask_t global_event_mask1short = 0;
-
 /** True iff we have disabled log messages from being sent to the controller */
 static int disable_log_messages = 0;
 
 /** Macro: true if any control connection is interested in events of type
  * <b>e</b>. */
 #define EVENT_IS_INTERESTING(e) \
-  ((global_event_mask1long|global_event_mask1short) & (1<<(e)))
-/** Macro: true if any control connection with the LONG_NAMES option is
- * interested in events of type <b>e</b>. */
-#define EVENT_IS_INTERESTING1L(e) (global_event_mask1long & (1<<(e)))
-/** Macro: true if any control connection with the SHORT_NAMES option is
- * interested in events of type <b>e</b>. */
-#define EVENT_IS_INTERESTING1S(e) (global_event_mask1short & (1<<(e)))
+  (global_event_mask & (1<<(e)))
 
 /** If we're using cookie-type authentication, how long should our cookies be?
  */
@@ -95,25 +85,13 @@
  * of this so we can respond to getinfo status/bootstrap-phase queries. */
 static char last_sent_bootstrap_message[BOOTSTRAP_MSG_LEN];
 
-/** Flag for event_format_t.  Indicates that we should use the old
- * name format of nickname|hexdigest
+/** Flag for event_format_t.  Indicates that we should use the one standard
+    format.
  */
-#define SHORT_NAMES 1
-/** Flag for event_format_t.  Indicates that we should use the new
- * name format of $hexdigest[=~]nickname
- */
-#define LONG_NAMES 2
-#define ALL_NAMES (SHORT_NAMES|LONG_NAMES)
-/** Flag for event_format_t.  Indicates that we should use the new event
- * format where extra event fields are allowed using a NAME=VAL format. */
-#define EXTENDED_FORMAT 4
-/** Flag for event_format_t.  Indicates that we are using the old event format
- * where extra fields aren't allowed. */
-#define NONEXTENDED_FORMAT 8
-#define ALL_FORMATS (EXTENDED_FORMAT|NONEXTENDED_FORMAT)
+#define ALL_FORMATS 1
 
 /** Bit field of flags to select how to format a controller event.  Recognized
- * flags are SHORT_NAMES, LONG_NAMES, EXTENDED_FORMAT, NONEXTENDED_FORMAT. */
+ * flag is ALL_FORMATS. */
 typedef int event_format_t;
 
 static void connection_printf_to_buf(control_connection_t *conn,
@@ -123,9 +101,6 @@
 static void send_control_event(uint16_t event, event_format_t which,
                                const char *format, ...)
   CHECK_PRINTF(3,4);
-static void send_control_event_extended(uint16_t event, event_format_t which,
-                                        const char *format, ...)
-  CHECK_PRINTF(3,4);
 static int handle_control_setconf(control_connection_t *conn, uint32_t len,
                                   char *body);
 static int handle_control_resetconf(control_connection_t *conn, uint32_t len,
@@ -174,7 +149,7 @@
                                      const char *body);
 static int write_stream_target_to_buf(edge_connection_t *conn, char *buf,
                                       size_t len);
-static void orconn_target_get_name(int long_names, char *buf, size_t len,
+static void orconn_target_get_name(char *buf, size_t len,
                                    or_connection_t *conn);
 static char *get_cookie_file(void);
 
@@ -214,25 +189,19 @@
 {
   smartlist_t *conns = get_connection_array();
   event_mask_t old_mask, new_mask;
-  old_mask = global_event_mask1short;
-  old_mask |= global_event_mask1long;
+  old_mask = global_event_mask;
 
-  global_event_mask1short = 0;
-  global_event_mask1long = 0;
+  global_event_mask = 0;
   SMARTLIST_FOREACH(conns, connection_t *, _conn,
   {
     if (_conn->type == CONN_TYPE_CONTROL &&
         STATE_IS_OPEN(_conn->state)) {
       control_connection_t *conn = TO_CONTROL_CONN(_conn);
-      if (conn->use_long_names)
-        global_event_mask1long |= conn->event_mask;
-      else
-        global_event_mask1short |= conn->event_mask;
+      global_event_mask |= conn->event_mask;
     }
   });
 
-  new_mask = global_event_mask1short;
-  new_mask |= global_event_mask1long;
+  new_mask = global_event_mask;
 
   /* Handle the aftermath.  Set up the log callback to tell us only what
    * we want to hear...*/
@@ -533,7 +502,7 @@
  * If <b>which</b> & SHORT_NAMES, the event contains short-format names: send
  * it to controllers that haven't enabled the VERBOSE_NAMES feature.  If
  * <b>which</b> & LONG_NAMES, the event contains long-format names: send it
- * to contollers that <em>have</em> enabled VERBOSE_NAMES.
+ * to controllers that <em>have</em> enabled VERBOSE_NAMES.
  *
  * The EXTENDED_FORMAT and NONEXTENDED_FORMAT flags behave similarly with
  * respect to the EXTENDED_EVENTS feature. */
@@ -542,28 +511,15 @@
                           const char *msg)
 {
   smartlist_t *conns = get_connection_array();
+  (void)which;
   tor_assert(event >= _EVENT_MIN && event <= _EVENT_MAX);
 
-  SMARTLIST_FOREACH(conns, connection_t *, conn,
-  {
+  SMARTLIST_FOREACH_BEGIN(conns, connection_t *, conn) {
     if (conn->type == CONN_TYPE_CONTROL &&
         !conn->marked_for_close &&
         conn->state == CONTROL_CONN_STATE_OPEN) {
       control_connection_t *control_conn = TO_CONTROL_CONN(conn);
-      if (control_conn->use_long_names) {
-        if (!(which & LONG_NAMES))
-          continue;
-      } else {
-        if (!(which & SHORT_NAMES))
-          continue;
-      }
-      if (control_conn->use_extended_events) {
-        if (!(which & EXTENDED_FORMAT))
-          continue;
-      } else {
-        if (!(which & NONEXTENDED_FORMAT))
-          continue;
-      }
+
       if (control_conn->event_mask & (1<<event)) {
         int is_err = 0;
         connection_write_to_buf(msg, strlen(msg), TO_CONN(control_conn));
@@ -579,7 +535,7 @@
           connection_handle_write(TO_CONN(control_conn), 1);
       }
     }
-  });
+  } SMARTLIST_FOREACH_END(conn);
 }
 
 /** Helper for send_control1_event and send_control1_event_extended:
@@ -587,22 +543,17 @@
  * <b>event</b>.  The event's body is created by the printf-style format in
  * <b>format</b>, and other arguments as provided.
  *
- * If <b>extended</b> is true, and the format contains a single '@' character,
- * it will be replaced with a space and all text after that character will be
- * sent only to controllers that have enabled extended events.
- *
  * Currently the length of the message is limited to 1024 (including the
  * ending \\r\\n\\0). */
 static void
-send_control_event_impl(uint16_t event, event_format_t which, int extended,
-                        const char *format, va_list ap)
+send_control_event_impl(uint16_t event, event_format_t which,
+                         const char *format, va_list ap)
 {
   /* This is just a little longer than the longest allowed log message */
 #define SEND_CONTROL1_EVENT_BUFFERSIZE 10064
   int r;
   char buf[SEND_CONTROL1_EVENT_BUFFERSIZE];
   size_t len;
-  char *cp;
 
   r = tor_vsnprintf(buf, sizeof(buf), format, ap);
   if (r<0) {
@@ -618,15 +569,7 @@
     buf[SEND_CONTROL1_EVENT_BUFFERSIZE-3] = '\r';
   }
 
-  if (extended && (cp = strchr(buf, '@'))) {
-    which &= ~ALL_FORMATS;
-    *cp = ' ';
-    send_control_event_string(event, which|EXTENDED_FORMAT, buf);
-    memcpy(cp, "\r\n\0", 3);
-    send_control_event_string(event, which|NONEXTENDED_FORMAT, buf);
-  } else {
-    send_control_event_string(event, which|ALL_FORMATS, buf);
-  }
+  send_control_event_string(event, which|ALL_FORMATS, buf);
 }
 
 /** Send an event to all v1 controllers that are listening for code
@@ -641,30 +584,10 @@
 {
   va_list ap;
   va_start(ap, format);
-  send_control_event_impl(event, which, 0, format, ap);
+  send_control_event_impl(event, which, format, ap);
   va_end(ap);
 }
 
-/** Send an event to all v1 controllers that are listening for code
- * <b>event</b>.  The event's body is created by the printf-style format in
- * <b>format</b>, and other arguments as provided.
- *
- * If the format contains a single '@' character, it will be replaced with a
- * space and all text after that character will be sent only to controllers
- * that have enabled extended events.
- *
- * Currently the length of the message is limited to 1024 (including the
- * ending \\n\\r\\0. */
-static void
-send_control_event_extended(uint16_t event, event_format_t which,
-                            const char *format, ...)
-{
-  va_list ap;
-  va_start(ap, format);
-  send_control_event_impl(event, which, 1, format, ap);
-  va_end(ap);
-}
-
 /** Given a text circuit <b>id</b>, return the corresponding circuit. */
 static origin_circuit_t *
 get_circ(const char *id)
@@ -832,7 +755,7 @@
   or_options_t *options = get_options();
   int i, len;
 
-  (void) body_len; /* body is nul-terminated; so we can ignore len. */
+  (void) body_len; /* body is NUL-terminated; so we can ignore len. */
   smartlist_split_string(questions, body, " ",
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
   SMARTLIST_FOREACH(questions, const char *, q,
@@ -948,7 +871,6 @@
 {
   uint16_t event_code;
   uint32_t event_mask = 0;
-  unsigned int extended = 0;
   smartlist_t *events = smartlist_create();
 
   (void) len;
@@ -958,7 +880,6 @@
   SMARTLIST_FOREACH_BEGIN(events, const char *, ev)
     {
       if (!strcasecmp(ev, "EXTENDED")) {
-        extended = 1;
         continue;
       } else if (!strcasecmp(ev, "CIRC"))
         event_code = EVENT_CIRCUIT_STATUS;
@@ -1016,8 +937,6 @@
   smartlist_free(events);
 
   conn->event_mask = event_mask;
-  if (extended)
-    conn->use_extended_events = 1;
 
   control_update_global_event_mask();
   send_control_done(conn);
@@ -1286,7 +1205,7 @@
 }
 
 /** Called when we get a MAPADDRESS command; try to bind all listed addresses,
- * and report success or failrue. */
+ * and report success or failure. */
 static int
 handle_control_mapaddress(control_connection_t *conn, uint32_t len,
                           const char *body)
@@ -1296,7 +1215,7 @@
   smartlist_t *reply;
   char *r;
   size_t sz;
-  (void) len; /* body is nul-terminated, so it's safe to ignore the length. */
+  (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
 
   lines = smartlist_create();
   elts = smartlist_create();
@@ -1463,6 +1382,7 @@
 getinfo_helper_dir(control_connection_t *control_conn,
                    const char *question, char **answer)
 {
+  (void) control_conn;
   if (!strcmpstart(question, "desc/id/")) {
     routerinfo_t *ri = router_get_by_hexdigest(question+strlen("desc/id/"));
     if (ri) {
@@ -1597,10 +1517,8 @@
     }
   } else if (!strcmp(question, "network-status")) { /* v1 */
     routerlist_t *routerlist = router_get_routerlist();
-    int verbose = control_conn->use_long_names;
     if (!routerlist || !routerlist->routers ||
-        list_server_status_v1(routerlist->routers, answer,
-                              verbose ? 2 : 1) < 0) {
+        list_server_status_v1(routerlist->routers, answer, 1) < 0) {
       return -1;
     }
   } else if (!strcmpstart(question, "extra-info/digest/")) {
@@ -1636,6 +1554,7 @@
 getinfo_helper_events(control_connection_t *control_conn,
                       const char *question, char **answer)
 {
+  (void) control_conn;
   if (!strcmp(question, "circuit-status")) {
     circuit_t *circ;
     smartlist_t *status = smartlist_create();
@@ -1646,10 +1565,9 @@
       const char *purpose;
       if (! CIRCUIT_IS_ORIGIN(circ) || circ->marked_for_close)
         continue;
-      if (control_conn->use_long_names)
-        path = circuit_list_path_for_controller(TO_ORIGIN_CIRCUIT(circ));
-      else
-        path = circuit_list_path(TO_ORIGIN_CIRCUIT(circ),0);
+
+      path = circuit_list_path_for_controller(TO_ORIGIN_CIRCUIT(circ));
+
       if (circ->state == CIRCUIT_STATE_OPEN)
         state = "BUILT";
       else if (strlen(path))
@@ -1727,8 +1645,7 @@
   } else if (!strcmp(question, "orconn-status")) {
     smartlist_t *conns = get_connection_array();
     smartlist_t *status = smartlist_create();
-    SMARTLIST_FOREACH(conns, connection_t *, base_conn,
-    {
+    SMARTLIST_FOREACH_BEGIN(conns, connection_t *, base_conn) {
       const char *state;
       char *s;
       char name[128];
@@ -1743,29 +1660,19 @@
         state = "LAUNCHED";
       else
         state = "NEW";
-      orconn_target_get_name(control_conn->use_long_names, name, sizeof(name),
-                             conn);
+      orconn_target_get_name(name, sizeof(name), conn);
       slen = strlen(name)+strlen(state)+2;
       s = tor_malloc(slen+1);
       tor_snprintf(s, slen, "%s %s", name, state);
       smartlist_add(status, s);
-    });
+    } SMARTLIST_FOREACH_END(base_conn);
     *answer = smartlist_join_strings(status, "\r\n", 0, NULL);
     SMARTLIST_FOREACH(status, char *, cp, tor_free(cp));
     smartlist_free(status);
-  } else if (!strcmpstart(question, "addr-mappings/") ||
-             !strcmpstart(question, "address-mappings/")) {
+  } else if (!strcmpstart(question, "address-mappings/")) {
     time_t min_e, max_e;
     smartlist_t *mappings;
-    int want_expiry = !strcmpstart(question, "address-mappings/");
-    if (!strcmpstart(question, "addr-mappings/")) {
-      /* XXXX022 This has been deprecated since 0.2.0.3-alpha, and has
-         generated a warning since 0.2.1.10-alpha; remove late in 0.2.2.x. */
-      log_warn(LD_CONTROL, "Controller used obsolete addr-mappings/ GETINFO "
-               "key; use address-mappings/ instead.");
-    }
-    question += strlen(want_expiry ? "address-mappings/"
-                                   : "addr-mappings/");
+    question += strlen("address-mappings/");
     if (!strcmp(question, "all")) {
       min_e = 0; max_e = TIME_MAX;
     } else if (!strcmp(question, "cache")) {
@@ -1778,7 +1685,7 @@
       return 0;
     }
     mappings = smartlist_create();
-    addressmap_get_mappings(mappings, min_e, max_e, want_expiry);
+    addressmap_get_mappings(mappings, min_e, max_e, 1);
     *answer = smartlist_join_strings(mappings, "\r\n", 0, NULL);
     SMARTLIST_FOREACH(mappings, char *, cp, tor_free(cp));
     smartlist_free(mappings);
@@ -1928,7 +1835,6 @@
   PREFIX("ns/purpose/", networkstatus,
          "Brief summary of router status by purpose (v2 directory format)."),
 
-  PREFIX("unregistered-servers-", dirserv_unregistered, NULL),
   ITEM("network-status", dir,
        "Brief summary of router status (v1 directory format)"),
   ITEM("circuit-status", events, "List of current circuits originating here."),
@@ -1940,14 +1846,6 @@
   DOC("address-mappings/config",
       "Current address mappings from configuration."),
   DOC("address-mappings/control", "Current address mappings from controller."),
-  PREFIX("addr-mappings/", events, NULL),
-  DOC("addr-mappings/all", "Current address mappings without expiry times."),
-  DOC("addr-mappings/cache",
-      "Current cached DNS replies without expiry times."),
-  DOC("addr-mappings/config",
-      "Current address mappings from configuration without expiry times."),
-  DOC("addr-mappings/control",
-      "Current address mappings from controller without expiry times."),
   PREFIX("status/", events, NULL),
   DOC("status/circuit-established",
       "Whether we think client functionality is working."),
@@ -2042,7 +1940,7 @@
   smartlist_t *unrecognized = smartlist_create();
   char *msg = NULL, *ans = NULL;
   int i;
-  (void) len; /* body is nul-terminated, so it's safe to ignore the length. */
+  (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
 
   smartlist_split_string(questions, body, " ",
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
@@ -2253,7 +2151,7 @@
   origin_circuit_t *circ = NULL;
   uint8_t new_purpose;
   smartlist_t *args;
-  (void) len; /* body is nul-terminated, so it's safe to ignore the length. */
+  (void) len; /* body is NUL-terminated, so it's safe to ignore the length. */
 
   args = getargs_helper("SETCIRCUITPURPOSE", conn, body, 2, -1);
   if (!args)
@@ -2705,7 +2603,6 @@
                           const char *body)
 {
   smartlist_t *args;
-  int verbose_names = 0, extended_events = 0;
   int bad = 0;
   (void) len; /* body is nul-terminated; it's safe to ignore the length */
   args = smartlist_create();
@@ -2713,9 +2610,9 @@
                          SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
   SMARTLIST_FOREACH(args, const char *, arg, {
       if (!strcasecmp(arg, "VERBOSE_NAMES"))
-        verbose_names = 1;
+        ;
       else if (!strcasecmp(arg, "EXTENDED_EVENTS"))
-        extended_events = 1;
+        ;
       else {
         connection_printf_to_buf(conn, "552 Unrecognized feature \"%s\"\r\n",
                                  arg);
@@ -2725,12 +2622,6 @@
     });
 
   if (!bad) {
-    if (verbose_names) {
-      conn->use_long_names = 1;
-      control_update_global_event_mask();
-    }
-    if (extended_events)
-      conn->use_extended_events = 1;
     send_control_done(conn);
   }
 
@@ -2888,10 +2779,16 @@
     --data_len;
   }
 
-  /* Quit is always valid. */
+  /* If the connection is already closing, ignore further commands */
+  if (TO_CONN(conn)->marked_for_close) {
+    return 0;
+  }
+
+  /* Otherwise, Quit is always valid. */
   if (!strcasecmp(conn->incoming_cmd, "QUIT")) {
     connection_write_str_to_buf("250 closing connection\r\n", conn);
     connection_mark_for_close(TO_CONN(conn));
+    conn->_base.hold_open_until_flushed = 1;
     return 0;
   }
 
@@ -3028,20 +2925,11 @@
     tor_free(reason);
   }
 
-  if (EVENT_IS_INTERESTING1S(EVENT_CIRCUIT_STATUS)) {
-    char *path = circuit_list_path(circ,0);
-    const char *sp = strlen(path) ? " " : "";
-    send_control_event_extended(EVENT_CIRCUIT_STATUS, SHORT_NAMES,
-                                "650 CIRC %lu %s%s%s@%s\r\n",
-                                (unsigned long)circ->global_identifier,
-                                status, sp, path, extended_buf);
-    tor_free(path);
-  }
-  if (EVENT_IS_INTERESTING1L(EVENT_CIRCUIT_STATUS)) {
+  {
     char *vpath = circuit_list_path_for_controller(circ);
     const char *sp = strlen(vpath) ? " " : "";
-    send_control_event_extended(EVENT_CIRCUIT_STATUS, LONG_NAMES,
-                                "650 CIRC %lu %s%s%s@%s\r\n",
+    send_control_event(EVENT_CIRCUIT_STATUS, ALL_FORMATS,
+                                "650 CIRC %lu %s%s%s %s\r\n",
                                 (unsigned long)circ->global_identifier,
                                 status, sp, vpath, extended_buf);
     tor_free(vpath);
@@ -3177,8 +3065,8 @@
   circ = circuit_get_by_edge_conn(conn);
   if (circ && CIRCUIT_IS_ORIGIN(circ))
     origin_circ = TO_ORIGIN_CIRCUIT(circ);
-  send_control_event_extended(EVENT_STREAM_STATUS, ALL_NAMES,
-                        "650 STREAM "U64_FORMAT" %s %lu %s@%s%s%s\r\n",
+  send_control_event(EVENT_STREAM_STATUS, ALL_FORMATS,
+                        "650 STREAM "U64_FORMAT" %s %lu %s %s%s%s\r\n",
                         U64_PRINTF_ARG(conn->_base.global_identifier), status,
                         origin_circ?
                            (unsigned long)origin_circ->global_identifier : 0ul,
@@ -3191,30 +3079,21 @@
 
 /** Figure out the best name for the target router of an OR connection
  * <b>conn</b>, and write it into the <b>len</b>-character buffer
- * <b>name</b>.  Use verbose names if <b>long_names</b> is set. */
+ * <b>name</b>. */
 static void
-orconn_target_get_name(int long_names,
-                       char *name, size_t len, or_connection_t *conn)
+orconn_target_get_name(char *name, size_t len, or_connection_t *conn)
 {
-  if (! long_names) {
-    if (conn->nickname)
-      strlcpy(name, conn->nickname, len);
-    else
-      tor_snprintf(name, len, "%s:%d",
-                   conn->_base.address, conn->_base.port);
+  routerinfo_t *ri = router_get_by_digest(conn->identity_digest);
+  if (ri) {
+    tor_assert(len > MAX_VERBOSE_NICKNAME_LEN);
+    router_get_verbose_nickname(name, ri);
+  } else if (! tor_digest_is_zero(conn->identity_digest)) {
+    name[0] = '$';
+    base16_encode(name+1, len-1, conn->identity_digest,
+                  DIGEST_LEN);
   } else {
-    routerinfo_t *ri = router_get_by_digest(conn->identity_digest);
-    if (ri) {
-      tor_assert(len > MAX_VERBOSE_NICKNAME_LEN);
-      router_get_verbose_nickname(name, ri);
-    } else if (! tor_digest_is_zero(conn->identity_digest)) {
-      name[0] = '$';
-      base16_encode(name+1, len-1, conn->identity_digest,
-                    DIGEST_LEN);
-    } else {
-     tor_snprintf(name, len, "%s:%d",
-                   conn->_base.address, conn->_base.port);
-    }
+    tor_snprintf(name, len, "%s:%d",
+                 conn->_base.address, conn->_base.port);
   }
 }
 
@@ -3253,24 +3132,35 @@
                  reason ? " " : "", ncircs);
   }
 
-  if (EVENT_IS_INTERESTING1S(EVENT_OR_CONN_STATUS)) {
-    orconn_target_get_name(0, name, sizeof(name), conn);
-    send_control_event_extended(EVENT_OR_CONN_STATUS, SHORT_NAMES,
-                          "650 ORCONN %s %s@%s%s%s\r\n",
-                          name, status,
-                          reason ? "REASON=" : "",
-                          orconn_end_reason_to_control_string(reason),
-                          ncircs_buf);
+  orconn_target_get_name(name, sizeof(name), conn);
+  send_control_event(EVENT_OR_CONN_STATUS, ALL_FORMATS,
+                              "650 ORCONN %s %s %s%s%s\r\n",
+                              name, status,
+                              reason ? "REASON=" : "",
+                              orconn_end_reason_to_control_string(reason),
+                              ncircs_buf);
+
+  return 0;
+}
+
+/**
+ * Print out STREAM_BW event for a single conn
+ */
+int
+control_event_stream_bandwidth(edge_connection_t *edge_conn)
+{
+  if (EVENT_IS_INTERESTING(EVENT_STREAM_BANDWIDTH_USED)) {
+    if (!edge_conn->n_read && !edge_conn->n_written)
+      return 0;
+
+    send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS,
+                       "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n",
+                       U64_PRINTF_ARG(edge_conn->_base.global_identifier),
+                       (unsigned long)edge_conn->n_read,
+                       (unsigned long)edge_conn->n_written);
+
+    edge_conn->n_written = edge_conn->n_read = 0;
   }
-  if (EVENT_IS_INTERESTING1L(EVENT_OR_CONN_STATUS)) {
-    orconn_target_get_name(1, name, sizeof(name), conn);
-    send_control_event_extended(EVENT_OR_CONN_STATUS, LONG_NAMES,
-                          "650 ORCONN %s %s@%s%s%s\r\n",
-                          name, status,
-                          reason ? "REASON=" : "",
-                          orconn_end_reason_to_control_string(reason),
-                          ncircs_buf);
-  }
 
   return 0;
 }
@@ -3292,7 +3182,7 @@
         if (!edge_conn->n_read && !edge_conn->n_written)
           continue;
 
-        send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_NAMES,
+        send_control_event(EVENT_STREAM_BANDWIDTH_USED, ALL_FORMATS,
                            "650 STREAM_BW "U64_FORMAT" %lu %lu\r\n",
                            U64_PRINTF_ARG(edge_conn->_base.global_identifier),
                            (unsigned long)edge_conn->n_read,
@@ -3312,7 +3202,7 @@
 control_event_bandwidth_used(uint32_t n_read, uint32_t n_written)
 {
   if (EVENT_IS_INTERESTING(EVENT_BANDWIDTH_USED)) {
-    send_control_event(EVENT_BANDWIDTH_USED, ALL_NAMES,
+    send_control_event(EVENT_BANDWIDTH_USED, ALL_FORMATS,
                        "650 BW %lu %lu\r\n",
                        (unsigned long)n_read,
                        (unsigned long)n_written);
@@ -3345,6 +3235,11 @@
 {
   int event;
 
+  /* Don't even think of trying to add stuff to a buffer from a cpuworker
+   * thread. */
+  if (! in_main_thread())
+    return;
+
   if (disable_log_messages)
     return;
 
@@ -3377,7 +3272,7 @@
       default: s = "UnknownLogSeverity"; break;
     }
     ++disable_log_messages;
-    send_control_event(event, ALL_NAMES, "650 %s %s\r\n", s, b?b:msg);
+    send_control_event(event, ALL_FORMATS, "650 %s %s\r\n", s, b?b:msg);
     --disable_log_messages;
     tor_free(b);
   }
@@ -3390,31 +3285,12 @@
 int
 control_event_descriptors_changed(smartlist_t *routers)
 {
-  size_t len;
   char *msg;
-  smartlist_t *identities = NULL;
-  char buf[HEX_DIGEST_LEN+1];
 
   if (!EVENT_IS_INTERESTING(EVENT_NEW_DESC))
     return 0;
-  if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) {
-    identities = smartlist_create();
-    SMARTLIST_FOREACH(routers, routerinfo_t *, r,
-    {
-      base16_encode(buf,sizeof(buf),r->cache_info.identity_digest,DIGEST_LEN);
-      smartlist_add(identities, tor_strdup(buf));
-    });
-  }
-  if (EVENT_IS_INTERESTING1S(EVENT_NEW_DESC)) {
-    char *ids = smartlist_join_strings(identities, " ", 0, &len);
-    size_t ids_len = strlen(ids)+32;
-    msg = tor_malloc(ids_len);
-    tor_snprintf(msg, ids_len, "650 NEWDESC %s\r\n", ids);
-    send_control_event_string(EVENT_NEW_DESC, SHORT_NAMES|ALL_FORMATS, msg);
-    tor_free(ids);
-    tor_free(msg);
-  }
-  if (EVENT_IS_INTERESTING1L(EVENT_NEW_DESC)) {
+
+  {
     smartlist_t *names = smartlist_create();
     char *ids;
     size_t names_len;
@@ -3427,16 +3303,12 @@
     names_len = strlen(ids)+32;
     msg = tor_malloc(names_len);
     tor_snprintf(msg, names_len, "650 NEWDESC %s\r\n", ids);
-    send_control_event_string(EVENT_NEW_DESC, LONG_NAMES|ALL_FORMATS, msg);
+    send_control_event_string(EVENT_NEW_DESC, ALL_FORMATS, msg);
     tor_free(ids);
     tor_free(msg);
     SMARTLIST_FOREACH(names, char *, cp, tor_free(cp));
     smartlist_free(names);
   }
-  if (identities) {
-    SMARTLIST_FOREACH(identities, char *, cp, tor_free(cp));
-    smartlist_free(identities);
-  }
   return 0;
 }
 
@@ -3453,17 +3325,17 @@
     return 0;
 
   if (expires < 3 || expires == TIME_MAX)
-    send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES,
-                                "650 ADDRMAP %s %s NEVER@%s\r\n", from, to,
+    send_control_event(EVENT_ADDRMAP, ALL_FORMATS,
+                                "650 ADDRMAP %s %s NEVER %s\r\n", from, to,
                                 error?error:"");
   else {
     char buf[ISO_TIME_LEN+1];
     char buf2[ISO_TIME_LEN+1];
     format_local_iso_time(buf,expires);
     format_iso_time(buf2,expires);
-    send_control_event_extended(EVENT_ADDRMAP, ALL_NAMES,
+    send_control_event(EVENT_ADDRMAP, ALL_FORMATS,
                                 "650 ADDRMAP %s %s \"%s\""
-                                "@%s%sEXPIRES=\"%s\"\r\n",
+                                " %s%sEXPIRES=\"%s\"\r\n",
                                 from, to, buf,
                                 error?error:"", error?" ":"",
                                 buf2);
@@ -3503,9 +3375,9 @@
   buf = tor_malloc(totallen);
   strlcpy(buf, firstline, totallen);
   strlcpy(buf+strlen(firstline), esc, totallen);
-  send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS,
+  send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS,
                             buf);
-  send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_NAMES|ALL_FORMATS,
+  send_control_event_string(EVENT_AUTHDIR_NEWDESCS, ALL_FORMATS,
                             "650 OK\r\n");
   tor_free(esc);
   tor_free(buf);
@@ -3543,8 +3415,8 @@
   SMARTLIST_FOREACH(strs, char *, cp, tor_free(cp));
   smartlist_free(strs);
   tor_free(s);
-  send_control_event_string(event, ALL_NAMES|ALL_FORMATS, esc);
-  send_control_event_string(event, ALL_NAMES|ALL_FORMATS,
+  send_control_event_string(event, ALL_FORMATS, esc);
+  send_control_event_string(event, ALL_FORMATS,
                             "650 OK\r\n");
 
   tor_free(esc);
@@ -3571,7 +3443,7 @@
 }
 
 /** Called when a single local_routerstatus_t has changed: Sends an NS event
- * to any countroller that cares. */
+ * to any controller that cares. */
 int
 control_event_networkstatus_changed_single(routerstatus_t *rs)
 {
@@ -3593,7 +3465,7 @@
 int
 control_event_my_descriptor_changed(void)
 {
-  send_control_event(EVENT_DESCCHANGED, ALL_NAMES, "650 DESCCHANGED\r\n");
+  send_control_event(EVENT_DESCCHANGED, ALL_FORMATS, "650 DESCCHANGED\r\n");
   return 0;
 }
 
@@ -3641,7 +3513,7 @@
     return -1;
   }
 
-  send_control_event_impl(type, ALL_NAMES|ALL_FORMATS, 0, format_buf, args);
+  send_control_event_impl(type, ALL_FORMATS, format_buf, args);
   return 0;
 }
 
@@ -3705,7 +3577,7 @@
   if (!EVENT_IS_INTERESTING(EVENT_GUARD))
     return 0;
 
-  if (EVENT_IS_INTERESTING1L(EVENT_GUARD)) {
+  {
     char buf[MAX_VERBOSE_NICKNAME_LEN+1];
     routerinfo_t *ri = router_get_by_digest(digest);
     if (ri) {
@@ -3713,13 +3585,9 @@
     } else {
       tor_snprintf(buf, sizeof(buf), "$%s~%s", hbuf, nickname);
     }
-    send_control_event(EVENT_GUARD, LONG_NAMES,
+    send_control_event(EVENT_GUARD, ALL_FORMATS,
                        "650 GUARD ENTRY %s %s\r\n", buf, status);
   }
-  if (EVENT_IS_INTERESTING1S(EVENT_GUARD)) {
-    send_control_event(EVENT_GUARD, SHORT_NAMES,
-                       "650 GUARD ENTRY $%s %s\r\n", hbuf, status);
-  }
   return 0;
 }
 

Modified: tor/trunk/src/or/cpuworker.c
===================================================================
--- tor/trunk/src/or/cpuworker.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/cpuworker.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -444,8 +444,10 @@
   if (1) {
     if (num_cpuworkers_busy == num_cpuworkers) {
       log_debug(LD_OR,"No idle cpuworkers. Queuing.");
-      if (onion_pending_add(circ, onionskin) < 0)
+      if (onion_pending_add(circ, onionskin) < 0) {
+        tor_free(onionskin);
         return -1;
+      }
       return 0;
     }
 

Modified: tor/trunk/src/or/directory.c
===================================================================
--- tor/trunk/src/or/directory.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/directory.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #include "or.h"
@@ -794,7 +794,7 @@
                                payload, payload_len,
                                supports_conditional_consensus,
                                if_modified_since);
-        connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE);
+        connection_watch_events(TO_CONN(conn), READ_EVENT | WRITE_EVENT);
         /* writable indicates finish, readable indicates broken link,
            error indicates broken link in windowsland. */
     }
@@ -833,7 +833,7 @@
                            payload, payload_len,
                            supports_conditional_consensus,
                            if_modified_since);
-    connection_watch_events(TO_CONN(conn), EV_READ | EV_WRITE);
+    connection_watch_events(TO_CONN(conn), READ_EVENT|WRITE_EVENT);
     connection_start_reading(TO_CONN(linked_conn));
   }
 }
@@ -881,7 +881,7 @@
 
   if (supports_conditional_consensus) {
     char *authority_id_list;
-    smartlist_t *authority_digets = smartlist_create();
+    smartlist_t *authority_digests = smartlist_create();
 
     SMARTLIST_FOREACH(router_get_trusted_dir_servers(),
                       trusted_dir_server_t *, ds,
@@ -893,10 +893,10 @@
         hex = tor_malloc(2*CONDITIONAL_CONSENSUS_FPR_LEN+1);
         base16_encode(hex, 2*CONDITIONAL_CONSENSUS_FPR_LEN+1,
                       ds->v3_identity_digest, CONDITIONAL_CONSENSUS_FPR_LEN);
-        smartlist_add(authority_digets, hex);
+        smartlist_add(authority_digests, hex);
       });
-    smartlist_sort(authority_digets, _compare_strs);
-    authority_id_list = smartlist_join_strings(authority_digets,
+    smartlist_sort(authority_digests, _compare_strs);
+    authority_id_list = smartlist_join_strings(authority_digests,
                                                "+", 0, NULL);
 
     len = strlen(authority_id_list)+64;
@@ -904,8 +904,8 @@
     tor_snprintf(url, len, "/tor/status-vote/current/consensus/%s.z",
                  authority_id_list);
 
-    SMARTLIST_FOREACH(authority_digets, char *, cp, tor_free(cp));
-    smartlist_free(authority_digets);
+    SMARTLIST_FOREACH(authority_digests, char *, cp, tor_free(cp));
+    smartlist_free(authority_digests);
     tor_free(authority_id_list);
   } else {
     url = tor_strdup("/tor/status-vote/current/consensus.z");
@@ -1050,31 +1050,10 @@
       httpcommand = "POST";
       url = tor_strdup("/tor/post/consensus-signature");
       break;
-    case DIR_PURPOSE_FETCH_RENDDESC:
-      tor_assert(resource);
-      tor_assert(!payload);
-
-      /* this must be true or we wouldn't be doing the lookup */
-      tor_assert(strlen(resource) <= REND_SERVICE_ID_LEN_BASE32);
-      /* This breaks the function abstraction. */
-      conn->rend_data = tor_malloc_zero(sizeof(rend_data_t));
-      strlcpy(conn->rend_data->onion_address, resource,
-              sizeof(conn->rend_data->onion_address));
-      conn->rend_data->rend_desc_version = 0;
-
-      httpcommand = "GET";
-      /* Request the most recent versioned descriptor. */
-      // (XXXX We were going to switch this to fetch rendezvous1 descriptors,
-      // but that never got testing, and it wasn't a good design.)
-      len = strlen(resource)+32;
-      url = tor_malloc(len);
-      tor_snprintf(url, len, "/tor/rendezvous/%s", resource);
-      break;
     case DIR_PURPOSE_FETCH_RENDDESC_V2:
       tor_assert(resource);
       tor_assert(strlen(resource) <= REND_DESC_ID_V2_LEN_BASE32);
       tor_assert(!payload);
-      conn->rend_data->rend_desc_version = 2;
       httpcommand = "GET";
       len = strlen(resource) + 32;
       url = tor_malloc(len);
@@ -1920,7 +1899,7 @@
           /* Success, or at least there's a v2 descriptor already
            * present. Notify pending connections about this. */
           conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
-          rend_client_desc_trynow(conn->rend_data->onion_address, -1);
+          rend_client_desc_trynow(conn->rend_data->onion_address);
         }
         break;
       case 404:
@@ -1967,7 +1946,7 @@
             log_info(LD_REND, "Successfully fetched v2 rendezvous "
                      "descriptor.");
             conn->_base.purpose = DIR_PURPOSE_HAS_FETCHED_RENDDESC;
-            rend_client_desc_trynow(conn->rend_data->onion_address, -1);
+            rend_client_desc_trynow(conn->rend_data->onion_address);
             break;
         }
         break;
@@ -2428,13 +2407,9 @@
       dlen = strlen(frontpage);
       /* Let's return a disclaimer page (users shouldn't use V1 anymore,
          and caches don't fetch '/', so this is safe). */
-      if (global_write_bucket_low(TO_CONN(conn), dlen, 1)) {
-        log_info(LD_DIRSERV,
-                 "Client asked for DirPortFrontPage content, but we've been "
-                 "writing too many bytes lately. Sending 503 Dir busy.");
-        write_http_status_line(conn, 503, "Directory busy, try again later");
-        goto done;
-      }
+
+      /* [We don't check for write_bucket_low here, since we want to serve
+       *  this page no matter what.] */
       note_request(url, dlen);
       write_http_response_header_impl(conn, dlen, "text/html", "identity",
                                       NULL, DIRPORTFRONTPAGE_CACHE_LIFETIME);
@@ -2518,6 +2493,8 @@
     /* v2 or v3 network status fetch. */
     smartlist_t *dir_fps = smartlist_create();
     int is_v3 = !strcmpstart(url, "/tor/status-vote");
+    geoip_client_action_t act =
+        is_v3 ? GEOIP_CLIENT_NETWORKSTATUS : GEOIP_CLIENT_NETWORKSTATUS_V2;
     const char *request_type = NULL;
     const char *key = url + strlen("/tor/status/");
     long lifetime = NETWORKSTATUS_CACHE_LIFETIME;
@@ -2542,6 +2519,7 @@
         write_http_status_line(conn, 404, "Consensus not signed by sufficient "
                                           "number of requested authorities");
         smartlist_free(dir_fps);
+        geoip_note_ns_response(act, GEOIP_REJECT_NOT_ENOUGH_SIGS);
         goto done;
       }
 
@@ -2554,6 +2532,7 @@
     if (!smartlist_len(dir_fps)) { /* we failed to create/cache cp */
       write_http_status_line(conn, 503, "Network status object unavailable");
       smartlist_free(dir_fps);
+      geoip_note_ns_response(act, GEOIP_REJECT_UNAVAILABLE);
       goto done;
     }
 
@@ -2561,11 +2540,13 @@
       write_http_status_line(conn, 404, "Not found");
       SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
       smartlist_free(dir_fps);
+      geoip_note_ns_response(act, GEOIP_REJECT_NOT_FOUND);
       goto done;
     } else if (!smartlist_len(dir_fps)) {
       write_http_status_line(conn, 304, "Not modified");
       SMARTLIST_FOREACH(dir_fps, char *, cp, tor_free(cp));
       smartlist_free(dir_fps);
+      geoip_note_ns_response(act, GEOIP_REJECT_NOT_MODIFIED);
       goto done;
     }
 
@@ -2577,16 +2558,25 @@
       write_http_status_line(conn, 503, "Directory busy, try again later");
       SMARTLIST_FOREACH(dir_fps, char *, fp, tor_free(fp));
       smartlist_free(dir_fps);
+      geoip_note_ns_response(act, GEOIP_REJECT_BUSY);
       goto done;
     }
 
-#ifdef ENABLE_GEOIP_STATS
+#ifdef ENABLE_DIRREQ_STATS
     {
-      geoip_client_action_t act =
-        is_v3 ? GEOIP_CLIENT_NETWORKSTATUS : GEOIP_CLIENT_NETWORKSTATUS_V2;
       struct in_addr in;
-      if (tor_inet_aton((TO_CONN(conn))->address, &in))
+      if (tor_inet_aton((TO_CONN(conn))->address, &in)) {
         geoip_note_client_seen(act, ntohl(in.s_addr), time(NULL));
+        geoip_note_ns_response(act, GEOIP_SUCCESS);
+        /* Note that a request for a network status has started, so that we
+         * can measure the download time later on. */
+        if (TO_CONN(conn)->dirreq_id)
+          geoip_start_dirreq(TO_CONN(conn)->dirreq_id, dlen, act,
+                             DIRREQ_TUNNELED);
+        else
+          geoip_start_dirreq(TO_CONN(conn)->global_identifier, dlen, act,
+                             DIRREQ_DIRECT);
+      }
     }
 #endif
 
@@ -2894,7 +2884,7 @@
                                         "application/octet-stream",
                                         NULL, NULL, 0);
         note_request("/tor/rendezvous?/", desc_len);
-        /* need to send descp separately, because it may include nuls */
+        /* need to send descp separately, because it may include NULs */
         connection_write_to_buf(descp, desc_len, TO_CONN(conn));
         /* report successful fetch to statistic */
         if (options->HSAuthorityRecordStats) {
@@ -3220,6 +3210,18 @@
   tor_assert(conn);
   tor_assert(conn->_base.type == CONN_TYPE_DIR);
 
+#ifdef ENABLE_DIRREQ_STATS
+  /* Note that we have finished writing the directory response. For direct
+   * connections this means we're done, for tunneled connections its only
+   * an intermediate step. */
+  if (TO_CONN(conn)->dirreq_id)
+    geoip_change_dirreq_state(TO_CONN(conn)->dirreq_id, DIRREQ_TUNNELED,
+                              DIRREQ_FLUSHING_DIR_CONN_FINISHED);
+  else
+    geoip_change_dirreq_state(TO_CONN(conn)->global_identifier,
+                              DIRREQ_DIRECT,
+                              DIRREQ_FLUSHING_DIR_CONN_FINISHED);
+#endif
   switch (conn->_base.state) {
     case DIR_CONN_STATE_CLIENT_SENDING:
       log_debug(LD_DIR,"client finished sending command.");

Modified: tor/trunk/src/or/dirserv.c
===================================================================
--- tor/trunk/src/or/dirserv.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/dirserv.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #define DIRSERV_PRIVATE
@@ -63,6 +63,9 @@
                                                         time_t publish_cutoff);
 static int dirserv_add_extrainfo(extrainfo_t *ei, const char **msg);
 
+/************** Measured Bandwidth parsing code ******/
+#define MAX_MEASUREMENT_AGE (3*24*60*60) /* 3 days */
+
 /************** Fingerprint handling code ************/
 
 #define FP_NAMED   1  /**< Listed in fingerprint file. */
@@ -652,8 +655,8 @@
 
 /** Examine the parsed server descriptor in <b>ri</b> and maybe insert it into
  * the list of server descriptors. Set *<b>msg</b> to a message that should be
- * passed back to the origin of this descriptor. Use <b>source</b> to produce
- * better log messages.
+ * passed back to the origin of this descriptor, or NULL if there is no such
+ * message. Use <b>source</b> to produce better log messages.
  *
  * Return the status of the operation
  *
@@ -667,6 +670,7 @@
   routerinfo_t *ri_old;
   char *desc, *nickname;
   size_t desclen = 0;
+  *msg = NULL;
 
   /* If it's too big, refuse it now. Otherwise we'll cache it all over the
    * network and it'll clog everything up. */
@@ -718,7 +722,7 @@
       control_event_or_authdir_new_descriptor("REJECTED", desc, desclen, *msg);
     log_info(LD_DIRSERV,
              "Did not add descriptor from '%s' (source: %s): %s.",
-             nickname, source, *msg);
+             nickname, source, *msg ? *msg : "(no message)");
   } else {
     smartlist_t *changed;
     control_event_or_authdir_new_descriptor("ACCEPTED", desc, desclen, *msg);
@@ -797,7 +801,7 @@
     if (r & FP_REJECT) {
       log_info(LD_DIRSERV, "Router '%s' is now rejected: %s",
                ent->nickname, msg?msg:"");
-      routerlist_remove(rl, ent, 0);
+      routerlist_remove(rl, ent, 0, time(NULL));
       i--;
       changed = 1;
       continue;
@@ -834,46 +838,6 @@
   routerlist_assert_ok(rl);
 }
 
-/** Write a list of unregistered descriptors into a newly allocated
- * string and return it. Used by dirserv operators to keep track of
- * fast nodes that haven't registered.
- */
-int
-getinfo_helper_dirserv_unregistered(control_connection_t *control_conn,
-                                    const char *question, char **answer_out)
-{
-  smartlist_t *answerlist;
-  char buf[1024];
-  char *answer;
-  int min_bw = atoi(question);
-  routerlist_t *rl = router_get_routerlist();
-
-  (void) control_conn;
-
-  if (strcmpstart(question, "unregistered-servers-"))
-    return 0;
-  question += strlen("unregistered-servers-");
-
-  answerlist = smartlist_create();
-  SMARTLIST_FOREACH(rl->routers, routerinfo_t *, ent, {
-    uint32_t r = dirserv_router_get_status(ent, NULL);
-    if (router_get_advertised_bandwidth(ent) >= (size_t)min_bw &&
-        !(r & FP_NAMED)) {
-      /* then log this one */
-      tor_snprintf(buf, sizeof(buf),
-                   "%s: BW %d on '%s'.",
-                   ent->nickname, router_get_advertised_bandwidth(ent),
-                   ent->platform ? ent->platform : "");
-      smartlist_add(answerlist, tor_strdup(buf));
-    }
-  });
-  answer = smartlist_join_strings(answerlist, "\r\n", 0, NULL);
-  SMARTLIST_FOREACH(answerlist, char *, cp, tor_free(cp));
-  smartlist_free(answerlist);
-  *answer_out = answer;
-  return 0;
-}
-
 /** Mark the directory as <b>dirty</b> -- when we're next asked for a
  * directory, we will rebuild it instead of reusing the most recently
  * generated one.
@@ -951,8 +915,8 @@
     answer = get_options()->AssumeReachable ||
              now < router->last_reachable + REACHABLE_TIMEOUT;
 
-  if (router->is_running && !answer) {
-    /* it was running but now it's not. tell rephist. */
+  if (!answer) {
+    /* not considered reachable. tell rephist. */
     rep_hist_note_router_unreachable(router->cache_info.identity_digest, now);
   }
 
@@ -964,7 +928,6 @@
  * *<b>router_status_out</b>.  Return 0 on success, -1 on failure.
  *
  * If for_controller is true, include the routers with very old descriptors.
- * If for_controller is &gt;1, use the verbose nickname format.
  */
 int
 list_server_status_v1(smartlist_t *routers, char **router_status_out,
@@ -984,23 +947,22 @@
 
   rs_entries = smartlist_create();
 
-  SMARTLIST_FOREACH(routers, routerinfo_t *, ri,
-  {
+  SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
     if (authdir) {
       /* Update router status in routerinfo_t. */
       dirserv_set_router_is_running(ri, now);
     }
-    if (for_controller == 1 || ri->cache_info.published_on >= cutoff)
-      smartlist_add(rs_entries, list_single_server_status(ri, ri->is_running));
-    else if (for_controller > 2) {
+    if (for_controller) {
       char name_buf[MAX_VERBOSE_NICKNAME_LEN+2];
       char *cp = name_buf;
       if (!ri->is_running)
         *cp++ = '!';
       router_get_verbose_nickname(cp, ri);
       smartlist_add(rs_entries, tor_strdup(name_buf));
+    } else if (ri->cache_info.published_on >= cutoff) {
+      smartlist_add(rs_entries, list_single_server_status(ri, ri->is_running));
     }
-  });
+  } SMARTLIST_FOREACH_END(ri);
 
   *router_status_out = smartlist_join_strings(rs_entries, " ", 0, NULL);
 
@@ -1896,16 +1858,18 @@
  * which has at least <b>buf_len</b> free characters.  Do NUL-termination.
  * Use the same format as in network-status documents.  If <b>version</b> is
  * non-NULL, add a "v" line for the platform.  Return 0 on success, -1 on
- * failure.  If <b>first_line_only</b> is true, don't include any flags
- * or version line.
+ * failure.
+ *
+ * The format argument has three possible values:
+ *   NS_V2 - Output an entry suitable for a V2 NS opinion document
+ *   NS_V3_CONSENSUS - Output the first portion of a V3 NS consensus entry
+ *   NS_V3_VOTE - Output a complete V3 NS vote
+ *   NS_CONTROL_PORT - Output a NS docunent for the control port
  */
 int
 routerstatus_format_entry(char *buf, size_t buf_len,
                           routerstatus_t *rs, const char *version,
-                          int first_line_only, int v2_format)
-/* XXX: first_line_only and v2_format should probably be be both
- *      replaced by a single purpose parameter.
- */
+                          routerstatus_format_type_t format)
 {
   int r;
   struct in_addr in;
@@ -1936,7 +1900,12 @@
     log_warn(LD_BUG, "Not enough space in buffer.");
     return -1;
   }
-  if (first_line_only)
+
+  /* TODO: Maybe we want to pass in what we need to build the rest of
+   * this here, instead of in the caller. Then we could use the
+   * networkstatus_type_t values, with an additional control port value
+   * added -MP */
+  if (format == NS_V3_CONSENSUS)
     return 0;
 
   cp = buf + strlen(buf);
@@ -1973,62 +1942,87 @@
     cp += strlen(cp);
   }
 
-  if (!v2_format) {
+  if (format != NS_V2) {
     routerinfo_t* desc = router_get_by_digest(rs->identity_digest);
+    uint32_t bw;
 
-    /* Blow up more or less nicely if we didn't get anything or not the
-     * thing we expected.
-     */
-    if (!desc) {
-      char id[HEX_DIGEST_LEN+1];
-      char dd[HEX_DIGEST_LEN+1];
+    if (format != NS_CONTROL_PORT) {
+      /* Blow up more or less nicely if we didn't get anything or not the
+       * thing we expected.
+       */
+      if (!desc) {
+        char id[HEX_DIGEST_LEN+1];
+        char dd[HEX_DIGEST_LEN+1];
 
-      base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN);
-      base16_encode(dd, sizeof(dd), rs->descriptor_digest, DIGEST_LEN);
-      log_warn(LD_BUG, "Cannot get any descriptor for %s "
-                       "(wanted descriptor %s).",
-               id, dd);
-      return -1;
-    };
-    if (memcmp(desc->cache_info.signed_descriptor_digest,
-               rs->descriptor_digest,
-               DIGEST_LEN)) {
-      char rl_d[HEX_DIGEST_LEN+1];
-      char rs_d[HEX_DIGEST_LEN+1];
-      char id[HEX_DIGEST_LEN+1];
+        base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN);
+        base16_encode(dd, sizeof(dd), rs->descriptor_digest, DIGEST_LEN);
+        log_warn(LD_BUG, "Cannot get any descriptor for %s "
+            "(wanted descriptor %s).",
+            id, dd);
+        return -1;
+      };
 
-      base16_encode(rl_d, sizeof(rl_d),
-                    desc->cache_info.signed_descriptor_digest, DIGEST_LEN);
-      base16_encode(rs_d, sizeof(rs_d), rs->descriptor_digest, DIGEST_LEN);
-      base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN);
-      log_err(LD_BUG, "descriptor digest in routerlist does not match "
-                      "the one in routerstatus: %s vs %s "
-                      "(router %s)\n",
-              rl_d, rs_d, id);
+      /* This assert can fire for the control port, because
+       * it can request NS documents before all descriptors
+       * have been fetched. */
+      if (memcmp(desc->cache_info.signed_descriptor_digest,
+            rs->descriptor_digest,
+            DIGEST_LEN)) {
+        char rl_d[HEX_DIGEST_LEN+1];
+        char rs_d[HEX_DIGEST_LEN+1];
+        char id[HEX_DIGEST_LEN+1];
 
-      tor_assert(!memcmp(desc->cache_info.signed_descriptor_digest,
-                       rs->descriptor_digest,
-                       DIGEST_LEN));
-    };
+        base16_encode(rl_d, sizeof(rl_d),
+            desc->cache_info.signed_descriptor_digest, DIGEST_LEN);
+        base16_encode(rs_d, sizeof(rs_d), rs->descriptor_digest, DIGEST_LEN);
+        base16_encode(id, sizeof(id), rs->identity_digest, DIGEST_LEN);
+        log_err(LD_BUG, "descriptor digest in routerlist does not match "
+            "the one in routerstatus: %s vs %s "
+            "(router %s)\n",
+            rl_d, rs_d, id);
 
+        tor_assert(!memcmp(desc->cache_info.signed_descriptor_digest,
+              rs->descriptor_digest,
+              DIGEST_LEN));
+      };
+    }
+
+    if (format == NS_CONTROL_PORT && rs->has_bandwidth) {
+      bw = rs->bandwidth;
+    } else {
+      tor_assert(desc);
+      bw = router_get_advertised_bandwidth_capped(desc) / 1000;
+    }
     r = tor_snprintf(cp, buf_len - (cp-buf),
-                     "w Bandwidth=%d\n",
-                     router_get_advertised_bandwidth_capped(desc) / 1024);
+                     "w Bandwidth=%d\n", bw);
+
     if (r<0) {
       log_warn(LD_BUG, "Not enough space in buffer.");
       return -1;
     }
     cp += strlen(cp);
+    if (format == NS_V3_VOTE && rs->has_measured_bw) {
+      *--cp = '\0'; /* Kill "\n" */
+      r = tor_snprintf(cp, buf_len - (cp-buf),
+                       " Measured=%d\n", rs->measured_bw);
+      if (r<0) {
+        log_warn(LD_BUG, "Not enough space in buffer for weight line.");
+        return -1;
+      }
+      cp += strlen(cp);
+    }
 
-    summary = policy_summarize(desc->exit_policy);
-    r = tor_snprintf(cp, buf_len - (cp-buf), "p %s\n", summary);
-    if (r<0) {
-      log_warn(LD_BUG, "Not enough space in buffer.");
+    if (desc) {
+      summary = policy_summarize(desc->exit_policy);
+      r = tor_snprintf(cp, buf_len - (cp-buf), "p %s\n", summary);
+      if (r<0) {
+        log_warn(LD_BUG, "Not enough space in buffer.");
+        tor_free(summary);
+        return -1;
+      }
+      cp += strlen(cp);
       tor_free(summary);
-      return -1;
     }
-    cp += strlen(cp);
-    tor_free(summary);
   }
 
   return 0;
@@ -2231,6 +2225,177 @@
     router->is_bad_exit = router->is_bad_directory = 0;
 }
 
+/**
+ * Helper function to parse out a line in the measured bandwidth file
+ * into a measured_bw_line_t output structure. Returns -1 on failure
+ * or 0 on success.
+ */
+int
+measured_bw_line_parse(measured_bw_line_t *out, const char *orig_line)
+{
+  char *line = tor_strdup(orig_line);
+  char *cp = line;
+  int got_bw = 0;
+  int got_node_id = 0;
+  char *strtok_state; /* lame sauce d'jour */
+  cp = tor_strtok_r(cp, " \t", &strtok_state);
+
+  if (!cp) {
+    log_warn(LD_DIRSERV, "Invalid line in bandwidth file: %s",
+             escaped(orig_line));
+    tor_free(line);
+    return -1;
+  }
+
+  if (orig_line[strlen(orig_line)-1] != '\n') {
+    log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s",
+             escaped(orig_line));
+    tor_free(line);
+    return -1;
+  }
+
+  do {
+    if (strcmpstart(cp, "bw=") == 0) {
+      int parse_ok = 0;
+      char *endptr;
+      if (got_bw) {
+        log_warn(LD_DIRSERV, "Double bw= in bandwidth file line: %s",
+                 escaped(orig_line));
+        tor_free(line);
+        return -1;
+      }
+      cp+=strlen("bw=");
+
+      out->bw = tor_parse_long(cp, 0, 0, LONG_MAX, &parse_ok, &endptr);
+      if (!parse_ok || (*endptr && !TOR_ISSPACE(*endptr))) {
+        log_warn(LD_DIRSERV, "Invalid bandwidth in bandwidth file line: %s",
+                 escaped(orig_line));
+        tor_free(line);
+        return -1;
+      }
+      got_bw=1;
+    } else if (strcmpstart(cp, "node_id=$") == 0) {
+      if (got_node_id) {
+        log_warn(LD_DIRSERV, "Double node_id= in bandwidth file line: %s",
+                 escaped(orig_line));
+        tor_free(line);
+        return -1;
+      }
+      cp+=strlen("node_id=$");
+
+      if (strlen(cp) != HEX_DIGEST_LEN ||
+          base16_decode(out->node_id, DIGEST_LEN, cp, HEX_DIGEST_LEN)) {
+        log_warn(LD_DIRSERV, "Invalid node_id in bandwidth file line: %s",
+                 escaped(orig_line));
+        tor_free(line);
+        return -1;
+      }
+      strncpy(out->node_hex, cp, sizeof(out->node_hex));
+      got_node_id=1;
+    }
+  } while ((cp = tor_strtok_r(NULL, " \t", &strtok_state)));
+
+  if (got_bw && got_node_id) {
+    tor_free(line);
+    return 0;
+  } else {
+    log_warn(LD_DIRSERV, "Incomplete line in bandwidth file: %s",
+             escaped(orig_line));
+    tor_free(line);
+    return -1;
+  }
+}
+
+/**
+ * Helper function to apply a parsed measurement line to a list
+ * of bandwidth statuses. Returns true if a line is found,
+ * false otherwise.
+ */
+int
+measured_bw_line_apply(measured_bw_line_t *parsed_line,
+                       smartlist_t *routerstatuses)
+{
+  routerstatus_t *rs = NULL;
+  if (!routerstatuses)
+    return 0;
+
+  rs = smartlist_bsearch(routerstatuses, parsed_line->node_id,
+                         compare_digest_to_routerstatus_entry);
+
+  if (rs) {
+    rs->has_measured_bw = 1;
+    rs->measured_bw = parsed_line->bw;
+  } else {
+    log_info(LD_DIRSERV, "Node ID %s not found in routerstatus list",
+             parsed_line->node_hex);
+  }
+
+  return rs != NULL;
+}
+
+/**
+ * Read the measured bandwidth file and apply it to the list of
+ * routerstatuses. Returns -1 on error, 0 otherwise.
+ */
+int
+dirserv_read_measured_bandwidths(const char *from_file,
+                                 smartlist_t *routerstatuses)
+{
+  char line[256];
+  FILE *fp = fopen(from_file, "r");
+  int applied_lines = 0;
+  time_t file_time;
+  int ok;
+  if (fp == NULL) {
+    log_warn(LD_CONFIG, "Can't open bandwidth file at configured location: %s",
+             from_file);
+    return -1;
+  }
+
+  if (!fgets(line, sizeof(line), fp)
+          || !strlen(line) || line[strlen(line)-1] != '\n') {
+    log_warn(LD_DIRSERV, "Long or truncated time in bandwidth file: %s",
+             escaped(line));
+    fclose(fp);
+    return -1;
+  }
+
+  line[strlen(line)-1] = '\0';
+  file_time = tor_parse_ulong(line, 10, 0, ULONG_MAX, &ok, NULL);
+  if (!ok) {
+    log_warn(LD_DIRSERV, "Non-integer time in bandwidth file: %s",
+             escaped(line));
+    fclose(fp);
+    return -1;
+  }
+
+  if ((time(NULL) - file_time) > MAX_MEASUREMENT_AGE) {
+    log_warn(LD_DIRSERV, "Bandwidth measurement file stale. Age: %u",
+             (unsigned)(time(NULL) - file_time));
+    fclose(fp);
+    return -1;
+  }
+
+  if (routerstatuses)
+    smartlist_sort(routerstatuses, compare_routerstatus_entries);
+
+  while (!feof(fp)) {
+    measured_bw_line_t parsed_line;
+    if (fgets(line, sizeof(line), fp) && strlen(line)) {
+      if (measured_bw_line_parse(&parsed_line, line) != -1) {
+        if (measured_bw_line_apply(&parsed_line, routerstatuses) > 0)
+          applied_lines++;
+      }
+    }
+  }
+
+  fclose(fp);
+  log_notice(LD_DIRSERV,
+             "Bandwidth measurement file successfully read. "
+             "Applied %d measurements.", applied_lines);
+  return 0;
+}
+
 /** Return a new networkstatus_t* containing our current opinion. (For v3
  * authorities) */
 networkstatus_t *
@@ -2330,9 +2495,15 @@
       smartlist_add(routerstatuses, vrs);
     }
   });
+
   smartlist_free(routers);
   digestmap_free(omit_as_sybil, NULL);
 
+  if (options->V3BandwidthsFile) {
+    dirserv_read_measured_bandwidths(options->V3BandwidthsFile,
+                                     routerstatuses);
+  }
+
   v3_out = tor_malloc_zero(sizeof(networkstatus_t));
 
   v3_out->type = NS_TYPE_VOTE;
@@ -2536,7 +2707,7 @@
       if (digestmap_get(omit_as_sybil, ri->cache_info.identity_digest))
         clear_status_flags_on_sybil(&rs);
 
-      if (routerstatus_format_entry(outp, endp-outp, &rs, version, 0, 1)) {
+      if (routerstatus_format_entry(outp, endp-outp, &rs, version, NS_V2)) {
         log_warn(LD_BUG, "Unable to print router status.");
         tor_free(version);
         goto done;
@@ -2755,7 +2926,7 @@
  * message.
  *
  * XXXX rename this function.  It's only called from the controller.
- * XXXX in fact, refactor this function, mergeing as much as possible.
+ * XXXX in fact, refactor this function, merging as much as possible.
  */
 int
 dirserv_get_routerdescs(smartlist_t *descs_out, const char *key,
@@ -2972,7 +3143,7 @@
   return NULL;
 }
 
-/** Return true iff we have any of the docments (extrainfo or routerdesc)
+/** Return true iff we have any of the documents (extrainfo or routerdesc)
  * specified by the fingerprints in <b>fps</b> and <b>spool_src</b>.  Used to
  * decide whether to send a 404.  */
 int
@@ -3018,7 +3189,7 @@
     routerinfo_t *me = router_get_my_routerinfo();
     result = (me?me->cache_info.signed_descriptor_len:2048) * n;
     if (compressed)
-      result /= 2; /* observed compressability is between 35 and 55%. */
+      result /= 2; /* observed compressibility is between 35 and 55%. */
   } else {
     result = 0;
     SMARTLIST_FOREACH(fps, const char *, digest, {

Modified: tor/trunk/src/or/dirvote.c
===================================================================
--- tor/trunk/src/or/dirvote.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/dirvote.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #define DIRVOTE_PRIVATE
@@ -103,7 +103,10 @@
     tor_snprintf(status, len,
                  "network-status-version 3\n"
                  "vote-status %s\n"
-                 "consensus-methods 1 2 3 4 5\n"
+                 /* XXX: If you change this value, you also need to
+                  * change consensus_method_is_supported().
+                  * Perhaps we should unify these somehow? */
+                 "consensus-methods 1 2 3 4 5 6\n"
                  "published %s\n"
                  "valid-after %s\n"
                  "fresh-until %s\n"
@@ -142,7 +145,7 @@
   SMARTLIST_FOREACH(v3_ns->routerstatus_list, vote_routerstatus_t *, vrs,
   {
     if (routerstatus_format_entry(outp, endp-outp, &vrs->status,
-                                  vrs->version, 0, 0) < 0) {
+                                  vrs->version, NS_V3_VOTE) < 0) {
       log_warn(LD_BUG, "Unable to print router status.");
       goto err;
     }
@@ -341,7 +344,7 @@
 /** Given a list of vote_routerstatus_t, all for the same router identity,
  * return whichever is most frequent, breaking ties in favor of more
  * recently published vote_routerstatus_t and in case of ties there,
- * in favour of smaller descriptor digest.
+ * in favor of smaller descriptor digest.
  */
 static vote_routerstatus_t *
 compute_routerstatus_consensus(smartlist_t *votes)
@@ -455,11 +458,14 @@
 static int
 consensus_method_is_supported(int method)
 {
-  return (method >= 1) && (method <= 5);
+  /* XXX: If you change this value, you also need to change
+   * format_networkstatus_vote(). Perhaps we should unify
+   * these somehow? */
+  return (method >= 1) && (method <= 6);
 }
 
 /** Helper: given <b>lst</b>, a list of version strings such that every
- * version appears once for every versioning voter who recommends it, returna
+ * version appears once for every versioning voter who recommends it, return a
  * newly allocated string holding the resulting client-versions or
  * server-versions list. May change contents of <b>lst</b> */
 static char *
@@ -701,7 +707,10 @@
     smartlist_t *versions = smartlist_create();
     smartlist_t *exitsummaries = smartlist_create();
     uint32_t *bandwidths = tor_malloc(sizeof(uint32_t) * smartlist_len(votes));
+    uint32_t *measured_bws = tor_malloc(sizeof(uint32_t) *
+                                        smartlist_len(votes));
     int num_bandwidths;
+    int num_mbws;
 
     int *n_voter_flags; /* n_voter_flags[j] is the number of flags that
                          * votes[j] knows about. */
@@ -835,6 +844,7 @@
       smartlist_clear(chosen_flags);
       smartlist_clear(versions);
       num_bandwidths = 0;
+      num_mbws = 0;
 
       /* Okay, go through all the entries for this digest. */
       SMARTLIST_FOREACH_BEGIN(votes, networkstatus_t *, v) {
@@ -843,7 +853,7 @@
         rs = smartlist_get(v->routerstatus_list, index[v_sl_idx]);
         if (memcmp(rs->status.identity_digest, lowest_id, DIGEST_LEN))
           continue; /* doesn't include this router. */
-        /* At this point, we know that we're looking at a routersatus with
+        /* At this point, we know that we're looking at a routerstatus with
          * identity "lowest".
          */
         ++index[v_sl_idx];
@@ -868,6 +878,9 @@
         }
 
         /* count bandwidths */
+        if (rs->status.has_measured_bw)
+          measured_bws[num_mbws++] = rs->status.measured_bw;
+
         if (rs->status.has_bandwidth)
           bandwidths[num_bandwidths++] = rs->status.bandwidth;
       } SMARTLIST_FOREACH_END(v);
@@ -945,8 +958,11 @@
       }
 
       /* Pick a bandwidth */
-      if (consensus_method >= 5 && num_bandwidths > 0) {
+      if (consensus_method >= 6 && num_mbws > 2) {
         rs_out.has_bandwidth = 1;
+        rs_out.bandwidth = median_uint32(measured_bws, num_mbws);
+      } else if (consensus_method >= 5 && num_bandwidths > 0) {
+        rs_out.has_bandwidth = 1;
         rs_out.bandwidth = median_uint32(bandwidths, num_bandwidths);
       }
 
@@ -955,7 +971,7 @@
        * that descriptor.  If everybody plays nice all the voters who
        * listed that descriptor will have the same summary.  If not then
        * something is fishy and we'll use the most common one (breaking
-       * ties in favor of lexigraphically larger one (only because it
+       * ties in favor of lexicographically larger one (only because it
        * lets me reuse more existing code.
        *
        * The other case that can happen is that no authority that voted
@@ -996,8 +1012,8 @@
           char dd[HEX_DIGEST_LEN+1];
           base16_encode(id, sizeof(dd), rs_out.identity_digest, DIGEST_LEN);
           base16_encode(dd, sizeof(dd), rs_out.descriptor_digest, DIGEST_LEN);
-          log_warn(LD_DIR, "The voters disgreed on the exit policy summary for"
-                   " router %s with descriptor %s.  This really shouldn't"
+          log_warn(LD_DIR, "The voters disagreed on the exit policy summary "
+                   " for router %s with descriptor %s.  This really shouldn't"
                    " have happened.", id, dd);
 
           smartlist_sort_strings(exitsummaries);
@@ -1036,7 +1052,8 @@
 
       /* Okay!! Now we can write the descriptor... */
       /*     First line goes into "buf". */
-      routerstatus_format_entry(buf, sizeof(buf), &rs_out, NULL, 1, 0);
+      routerstatus_format_entry(buf, sizeof(buf), &rs_out, NULL,
+                                NS_V3_CONSENSUS);
       smartlist_add(chunks, tor_strdup(buf));
       /*     Second line is all flags.  The "\n" is missing. */
       smartlist_add(chunks,
@@ -1055,8 +1072,10 @@
           log_warn(LD_BUG, "Not enough space in buffer for weight line.");
           *buf = '\0';
         }
+
         smartlist_add(chunks, tor_strdup(buf));
       };
+
       /*     Now the exitpolicy summary line. */
       if (rs_out.has_exitsummary) {
         char buf[MAX_POLICY_LINE_LEN+1];
@@ -2101,7 +2120,7 @@
   return r;
 }
 
-/** Helper: we just got the <b>deteached_signatures_body</b> sent to us as
+/** Helper: we just got the <b>detached_signatures_body</b> sent to us as
  * signatures on the currently pending consensus.  Add them to the pending
  * consensus (if we have one); otherwise queue them until we have a
  * consensus.  Return negative on failure, nonnegative on success. */
@@ -2117,7 +2136,7 @@
                                      detached_signatures_body, msg);
   } else {
     log_notice(LD_DIR, "Got a signature from %s. "
-                       "Queueing it for the next consensus.", source);
+                       "Queuing it for the next consensus.", source);
     if (!pending_consensus_signature_list)
       pending_consensus_signature_list = smartlist_create();
     smartlist_add(pending_consensus_signature_list,
@@ -2183,7 +2202,7 @@
 }
 
 /** Return the signatures that we know for the consensus that we're currently
- * trying to build */
+ * trying to build. */
 const char *
 dirvote_get_pending_detached_signatures(void)
 {

Modified: tor/trunk/src/or/dns.c
===================================================================
--- tor/trunk/src/or/dns.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/dns.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2003-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -13,7 +13,17 @@
 
 #include "or.h"
 #include "ht.h"
+#ifdef HAVE_EVENT2_DNS_H
+#include <event2/event.h>
+#include <event2/dns.h>
+#include <event2/dns_compat.h>
+#else
+#include <event.h>
 #include "eventdns.h"
+#ifndef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS
+#define HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS
+#endif
+#endif
 
 /** Longest hostname we're willing to resolve. */
 #define MAX_ADDRESSLEN 256
@@ -736,15 +746,25 @@
 assert_connection_edge_not_dns_pending(edge_connection_t *conn)
 {
   pending_connection_t *pend;
+  cached_resolve_t search;
+
+#if 1
+  cached_resolve_t *resolve;
+  strlcpy(search.address, conn->_base.address, sizeof(search.address));
+  resolve = HT_FIND(cache_map, &cache_root, &search);
+  if (!resolve)
+    return;
+  for (pend = resolve->pending_connections; pend; pend = pend->next) {
+    tor_assert(pend->conn != conn);
+  }
+#else
   cached_resolve_t **resolve;
-
   HT_FOREACH(resolve, cache_map, &cache_root) {
-    for (pend = (*resolve)->pending_connections;
-         pend;
-         pend = pend->next) {
+    for (pend = (*resolve)->pending_connections; pend; pend = pend->next) {
       tor_assert(pend->conn != conn);
     }
   }
+#endif
 }
 
 /** Log an error and abort if any connection waiting for a DNS resolve is
@@ -1098,6 +1118,7 @@
     conf_fname = "/etc/resolv.conf";
 #endif
 
+#ifdef HAVE_EVDNS_SET_DEFAULT_OUTGOING_BIND_ADDRESS
   if (options->OutboundBindAddress) {
     tor_addr_t addr;
     if (tor_addr_from_str(&addr, options->OutboundBindAddress) < 0) {
@@ -1109,7 +1130,7 @@
       socklen = tor_addr_to_sockaddr(&addr, 0,
                                      (struct sockaddr *)&ss, sizeof(ss));
       if (socklen < 0) {
-        log_warn(LD_BUG, "Couldn't convert outboung bind address to sockaddr."
+        log_warn(LD_BUG, "Couldn't convert outbound bind address to sockaddr."
                  " Ignoring.");
       } else {
         evdns_set_default_outgoing_bind_address((struct sockaddr *)&ss,
@@ -1117,6 +1138,7 @@
       }
     }
   }
+#endif
 
   if (options->ServerDNSRandomizeCase)
     evdns_set_option("randomize-case:", "1", DNS_OPTIONS_ALL);
@@ -1439,8 +1461,8 @@
     }
     log(dns_wildcard_one_notice_given ? LOG_INFO : LOG_NOTICE, LD_EXIT,
         "Your DNS provider gave an answer for \"%s\", which "
-        "is not supposed to exist.  Apparently they are hijacking "
-        "DNS failures. Trying to correct for this.  We've noticed %d "
+        "is not supposed to exist. Apparently they are hijacking "
+        "DNS failures. Trying to correct for this. We've noticed %d "
         "possibly bad address%s so far.",
         string_address, strmap_size(dns_wildcard_response_count),
         (strmap_size(dns_wildcard_response_count) == 1) ? "" : "es");
@@ -1537,7 +1559,7 @@
 void
 dns_launch_correctness_checks(void)
 {
-  static struct event launch_event;
+  static struct event *launch_event = NULL;
   struct timeval timeout;
   if (!get_options()->ServerDNSDetectHijacking)
     return;
@@ -1545,15 +1567,16 @@
 
   /* Wait a while before launching requests for test addresses, so we can
    * get the results from checking for wildcarding. */
-  evtimer_set(&launch_event, launch_test_addresses, NULL);
+  if (! launch_event)
+    launch_event = tor_evtimer_new(NULL, launch_test_addresses, NULL);
   timeout.tv_sec = 30;
   timeout.tv_usec = 0;
-  if (evtimer_add(&launch_event, &timeout)<0) {
+  if (evtimer_add(launch_event, &timeout)<0) {
     log_warn(LD_BUG, "Couldn't add timer for checking for dns hijacking");
   }
 }
 
-/** Return true iff our DNS servers lie to us too much to be trustd. */
+/** Return true iff our DNS servers lie to us too much to be trusted. */
 int
 dns_seems_to_be_broken(void)
 {
@@ -1612,6 +1635,30 @@
   }
 }
 
+/** Return the number of DNS cache entries as an int */
+static int
+dns_cache_entry_count(void)
+{
+   return HT_SIZE(&cache_root);
+}
+
+/** Log memory information about our internal DNS cache at level 'severity'. */
+void
+dump_dns_mem_usage(int severity)
+{
+  /* This should never be larger than INT_MAX. */
+  int hash_count = dns_cache_entry_count();
+  size_t hash_mem = sizeof(struct cached_resolve_t) * hash_count;
+  hash_mem += HT_MEM_USAGE(&cache_root);
+
+  /* Print out the count and estimated size of our &cache_root.  It undercounts
+     hostnames in cached reverse resolves.
+   */
+  log(severity, LD_MM, "Our DNS cache has %d entries.", hash_count);
+  log(severity, LD_MM, "Our DNS cache size is approximately %u bytes.",
+      (unsigned)hash_mem);
+}
+
 #ifdef DEBUG_DNS_CACHE
 /** Exit with an assertion if the DNS cache is corrupt. */
 static void

Modified: tor/trunk/src/or/dnsserv.c
===================================================================
--- tor/trunk/src/or/dnsserv.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/dnsserv.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, The Tor Project, Inc. */
+/* Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -9,7 +9,14 @@
  **/
 
 #include "or.h"
+#ifdef HAVE_EVENT2_DNS_H
+#include <event2/dns.h>
+#include <event2/dns_compat.h>
+/* XXXX022 this implies we want an improved evdns  */
+#include <event2/dns_struct.h>
+#else
 #include "eventdns.h"
+#endif
 
 /** Helper function: called by evdns whenever the client sends a request to our
  * DNSPort.  We need to eventually answer the request <b>req</b>.
@@ -85,12 +92,7 @@
     evdns_server_request_respond(req, DNS_ERR_NONE);
     return;
   }
-  if (q->type == EVDNS_TYPE_A) {
-    /* Refuse any attempt to resolve a noconnect address, right now. */
-    if (hostname_is_noconnect_address(q->name)) {
-      err = DNS_ERR_REFUSED;
-    }
-  } else {
+  if (q->type != EVDNS_TYPE_A) {
     tor_assert(q->type == EVDNS_TYPE_PTR);
   }
 

Modified: tor/trunk/src/or/eventdns.c
===================================================================
--- tor/trunk/src/or/eventdns.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/eventdns.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -89,6 +89,7 @@
 #include <stdarg.h>
 
 #include "eventdns.h"
+
 #ifdef WIN32
 #include <windows.h>
 #include <winsock2.h>
@@ -173,8 +174,6 @@
 	/* these objects are kept in a circular list */
 	struct evdns_request *next, *prev;
 
-	u16 timeout_event_deleted; /**< Debugging: where was timeout_event
-								* deleted?  0 for "it's added." */
 	struct event timeout_event;
 
 	u16 trans_id;  /* the transaction id */
@@ -214,8 +213,6 @@
 	struct event event;
 	/* these objects are kept in a circular list */
 	struct nameserver *next, *prev;
-	u16 timeout_event_deleted; /**< Debugging: where was timeout_event
-								* deleted?  0 for "it's added." */
 	struct event timeout_event; /* used to keep the timeout for */
 								/* when we next probe this server. */
 								/* Valid if state == 0 */
@@ -474,34 +471,11 @@
 	return 1;
 }
 
-/* for debugging bug 929.  XXXX021 */
-static int
-_add_timeout_event(u16 *lineno, struct event *ev, struct timeval *to)
-{
-	*lineno = 0;
-	return evtimer_add(ev, to);
-}
-#define add_timeout_event(s, to) \
-	(_add_timeout_event(&(s)->timeout_event_deleted, &(s)->timeout_event, (to)))
+#define add_timeout_event(s, to)				\
+	(event_add(&(s)->timeout_event, (to)))
+#define del_timeout_event(s)					\
+	(event_del(&(s)->timeout_event))
 
-/* for debugging bug 929.  XXXX021 */
-static int
-_del_timeout_event(u16 *lineno, struct event *ev, int line)
-{
-	if (*lineno) {
-		log(EVDNS_LOG_WARN,
-			"Duplicate timeout event_del from line %d: first call "
-			"was at %d.", line, (int)*lineno);
-		return 0;
-	} else {
-		*lineno = (u16)line;
-		return event_del(ev);
-	}
-}
-#define del_timeout_event(s)											\
-	(_del_timeout_event(&(s)->timeout_event_deleted, &(s)->timeout_event, \
-						__LINE__))
-
 /* This walks the list of inflight requests to find the */
 /* one with a matching transaction id. Returns NULL on */
 /* failure */
@@ -537,7 +511,7 @@
 nameserver_probe_failed(struct nameserver *const ns) {
 	const struct timeval * timeout;
 	del_timeout_event(ns);
-	CLEAR(&ns->timeout_event);
+
 	if (ns->state == 1) {
 		/* This can happen if the nameserver acts in a way which makes us mark */
 		/* it as bad and then starts sending good replies. */
@@ -549,7 +523,6 @@
 										global_nameserver_timeouts_length - 1)];
 	ns->failed_times++;
 
-	evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
 	if (add_timeout_event(ns, (struct timeval *) timeout) < 0) {
 		log(EVDNS_LOG_WARN,
 			"Error from libevent when adding timer event for %s",
@@ -578,7 +551,6 @@
 	ns->state = 0;
 	ns->failed_times = 1;
 
-	evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
 	if (add_timeout_event(ns, (struct timeval *) &global_nameserver_timeouts[0]) < 0) {
 		log(EVDNS_LOG_WARN,
 			"Error from libevent when adding timer event for %s",
@@ -614,7 +586,6 @@
 	log(EVDNS_LOG_WARN, "Nameserver %s is back up",
 		debug_ntop((struct sockaddr *)&ns->address));
 	del_timeout_event(ns);
-	CLEAR(&ns->timeout_event);
 	ns->state = 1;
 	ns->failed_times = 0;
 	ns->timedout = 0;
@@ -646,7 +617,6 @@
 	log(EVDNS_LOG_DEBUG, "Removing timeout for request %lx",
 		(unsigned long) req);
 	del_timeout_event(req);
-	CLEAR(&req->timeout_event);
 
 	search_request_finished(req);
 	global_requests_inflight--;
@@ -1279,7 +1249,7 @@
 		if (r < 0) {
 			int err = last_error(ns->socket);
 			if (error_is_eagain(err)) return;
-			nameserver_failed(ns, strerror(err));
+			nameserver_failed(ns, tor_socket_strerror(err));
 			return;
 		}
 		/* XXX Match port too? */
@@ -1311,7 +1281,7 @@
 			int err = last_error(s->socket);
 			if (error_is_eagain(err)) return;
 			log(EVDNS_LOG_WARN, "Error %s (%d) while reading request.",
-				strerror(err), err);
+				tor_socket_strerror(err), err);
 			return;
 		}
 		request_parse(packet, r, s, (struct sockaddr*) &addr, addrlen);
@@ -1330,7 +1300,7 @@
 			int err = last_error(port->socket);
 			if (error_is_eagain(err))
 				return;
-			log(EVDNS_LOG_WARN, "Error %s (%d) while writing response to port; dropping", strerror(err), err);
+			log(EVDNS_LOG_WARN, "Error %s (%d) while writing response to port; dropping", tor_socket_strerror(err), err);
 		}
 		if (server_request_free(req)) {
 			/* we released the last reference to req->port. */
@@ -1822,7 +1792,7 @@
 	if (j > 512) {
 overflow:
 		j = 512;
-		buf[3] |= 0x02; /* set the truncated bit. */
+		buf[2] |= 0x02; /* set the truncated bit. */
 	}
 
 	req->response_len = (size_t)j;
@@ -2026,7 +1996,6 @@
 		 * request_finished; that one already deletes the timeout event.
 		 * XXXX021 port this change to libevent. */
 		del_timeout_event(req);
-		CLEAR(&req->timeout_event);
 		evdns_request_transmit(req);
 	}
 }
@@ -2043,7 +2012,7 @@
 	if (r < 0) {
 		int err = last_error(server->socket);
 		if (error_is_eagain(err)) return 1;
-		nameserver_failed(req->ns, strerror(err));
+		nameserver_failed(req->ns, tor_socket_strerror(err));
 		return 2;
 	} else if (r != (ssize_t)req->request_len) {
 		return 1;  /* short write */
@@ -2089,7 +2058,7 @@
 		/* transmitted; we need to check for timeout. */
 		log(EVDNS_LOG_DEBUG,
 			"Setting timeout for request %lx", (unsigned long) req);
-		evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req);
+
 		if (add_timeout_event(req, &global_timeout) < 0) {
 			log(EVDNS_LOG_WARN,
 				"Error from libevent when adding timer for request %lx",
@@ -2204,7 +2173,6 @@
 		(void) event_del(&server->event);
 		CLEAR(&server->event);
 		del_timeout_event(server);
-		CLEAR(&server->timeout_event);
 		if (server->socket >= 0)
 			CLOSE_SOCKET(server->socket);
 		CLEAR(server);
@@ -2222,7 +2190,6 @@
 		req->ns = NULL;
 		/* ???? What to do about searches? */
 		del_timeout_event(req);
-		CLEAR(&req->timeout_event);
 		req->trans_id = 0;
 		req->transmit_me = 0;
 
@@ -2298,6 +2265,8 @@
 
 	memset(ns, 0, sizeof(struct nameserver));
 
+	evtimer_set(&ns->timeout_event, nameserver_prod_callback, ns);
+
 	ns->socket = socket(PF_INET, SOCK_DGRAM, 0);
 	if (ns->socket < 0) { err = 1; goto out1; }
 #ifdef WIN32
@@ -2532,6 +2501,8 @@
 
 	memset(req, 0, sizeof(struct evdns_request));
 
+	evtimer_set(&req->timeout_event, evdns_request_timeout_callback, req);
+
 	if (global_randomize_case) {
 		unsigned i;
 		char randbits[32];
@@ -2918,14 +2889,6 @@
 	if (flags & DNS_OPTION_NAMESERVERS) evdns_nameserver_ip_add("127.0.0.1");
 }
 
-#ifndef HAVE_STRTOK_R
-static char *
-strtok_r(char *s, const char *delim, char **state) {
-	(void)state;
-	return strtok(s, delim);
-}
-#endif
-
 /* helper version of atoi which returns -1 on error */
 static int
 strtoint(const char *const str) {
@@ -3002,9 +2965,9 @@
 resolv_conf_parse_line(char *const start, int flags) {
 	char *strtok_state;
 	static const char *const delims = " \t";
-#define NEXT_TOKEN strtok_r(NULL, delims, &strtok_state)
+#define NEXT_TOKEN tor_strtok_r(NULL, delims, &strtok_state)
 
-	char *const first_token = strtok_r(start, delims, &strtok_state);
+	char *const first_token = tor_strtok_r(start, delims, &strtok_state);
 	if (!first_token) return;
 
 	if (!strcmp(first_token, "nameserver") && (flags & DNS_OPTION_NAMESERVERS)) {
@@ -3361,8 +3324,7 @@
 		if (server->socket >= 0)
 			CLOSE_SOCKET(server->socket);
 		(void) event_del(&server->event);
-		if (server->state == 0)
-			del_timeout_event(server);
+		del_timeout_event(server);
 		CLEAR(server);
 		mm_free(server);
 		if (server_next == server_head)

Modified: tor/trunk/src/or/eventdns_tor.h
===================================================================
--- tor/trunk/src/or/eventdns_tor.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/eventdns_tor.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, The Tor Project, Inc. */
+/* Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #include "orconfig.h"

Modified: tor/trunk/src/or/geoip.c
===================================================================
--- tor/trunk/src/or/geoip.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/geoip.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008, The Tor Project, Inc. */
+/* Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -12,6 +12,8 @@
 #include "ht.h"
 
 static void clear_geoip_db(void);
+static void dump_geoip_stats(void);
+static void dump_entry_stats(void);
 
 /** An entry from the GeoIP file: maps an IP range to a country. */
 typedef struct geoip_entry_t {
@@ -21,9 +23,9 @@
 } geoip_entry_t;
 
 /** For how many periods should we remember per-country request history? */
-#define REQUEST_HIST_LEN 3
+#define REQUEST_HIST_LEN 1
 /** How long are the periods for which we should remember request history? */
-#define REQUEST_HIST_PERIOD (8*60*60)
+#define REQUEST_HIST_PERIOD (24*60*60)
 
 /** A per-country record for GeoIP request history. */
 typedef struct geoip_country_t {
@@ -42,7 +44,7 @@
 static smartlist_t *geoip_entries = NULL;
 
 /** Return the index of the <b>country</b>'s entry in the GeoIP DB
- * if it is a valid 2-letter country code, otherwise return zero.
+ * if it is a valid 2-letter country code, otherwise return -1.
  */
 country_t
 geoip_get_country(const char *country)
@@ -186,7 +188,14 @@
     return -1;
   }
   if (!geoip_countries) {
+    geoip_country_t *geoip_unresolved;
     geoip_countries = smartlist_create();
+    /* Add a geoip_country_t for requests that could not be resolved to a
+     * country as first element (index 0) to geoip_countries. */
+    geoip_unresolved = tor_malloc_zero(sizeof(geoip_country_t));
+    strlcpy(geoip_unresolved->countrycode, "??",
+            sizeof(geoip_unresolved->countrycode));
+    smartlist_add(geoip_countries, geoip_unresolved);
     country_idxplus1_by_lc_code = strmap_new();
   }
   if (geoip_entries) {
@@ -261,8 +270,8 @@
 typedef struct clientmap_entry_t {
   HT_ENTRY(clientmap_entry_t) node;
   uint32_t ipaddr;
-  time_t last_seen; /* The last 2 bits of this value hold the client
-                     * operation. */
+  unsigned int last_seen_in_minutes:30;
+  unsigned int action:2;
 } clientmap_entry_t;
 
 #define ACTION_MASK 3
@@ -289,7 +298,7 @@
 static INLINE int
 clientmap_entries_eq(const clientmap_entry_t *a, const clientmap_entry_t *b)
 {
-  return a->ipaddr == b->ipaddr;
+  return a->ipaddr == b->ipaddr && a->action == b->action;
 }
 
 HT_PROTOTYPE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
@@ -297,8 +306,72 @@
 HT_GENERATE(clientmap, clientmap_entry_t, node, clientmap_entry_hash,
             clientmap_entries_eq, 0.6, malloc, realloc, free);
 
+/** How often do we update our estimate which share of v2 and v3 directory
+ * requests is sent to us? We could as well trigger updates of shares from
+ * network status updates, but that means adding a lot of calls into code
+ * that is independent from geoip stats (and keeping them up-to-date). We
+ * are perfectly fine with an approximation of 15-minute granularity. */
+#define REQUEST_SHARE_INTERVAL (15 * 60)
+
+/** When did we last determine which share of v2 and v3 directory requests
+ * is sent to us? */
+static time_t last_time_determined_shares = 0;
+
+/** Sum of products of v2 shares times the number of seconds for which we
+ * consider these shares as valid. */
+static double v2_share_times_seconds;
+
+/** Sum of products of v3 shares times the number of seconds for which we
+ * consider these shares as valid. */
+static double v3_share_times_seconds;
+
+/** Number of seconds we are determining v2 and v3 shares. */
+static int share_seconds;
+
+/** Try to determine which fraction of v2 and v3 directory requests aimed at
+ * caches will be sent to us at time <b>now</b> and store that value in
+ * order to take a mean value later on. */
+static void
+geoip_determine_shares(time_t now)
+{
+  double v2_share = 0.0, v3_share = 0.0;
+  if (router_get_my_share_of_directory_requests(&v2_share, &v3_share) < 0)
+    return;
+  if (last_time_determined_shares) {
+    v2_share_times_seconds += v2_share *
+        ((double) (now - last_time_determined_shares));
+    v3_share_times_seconds += v3_share *
+        ((double) (now - last_time_determined_shares));
+    share_seconds += now - last_time_determined_shares;
+  }
+  last_time_determined_shares = now;
+}
+
+#ifdef ENABLE_DIRREQ_STATS
+/** Calculate which fraction of v2 and v3 directory requests aimed at caches
+ * have been sent to us since the last call of this function up to time
+ * <b>now</b>. Set *<b>v2_share_out</b> and *<b>v3_share_out</b> to the
+ * fractions of v2 and v3 protocol shares we expect to have seen. Reset
+ * counters afterwards. Return 0 on success, -1 on failure (e.g. when zero
+ * seconds have passed since the last call).*/
+static int
+geoip_get_mean_shares(time_t now, double *v2_share_out,
+                         double *v3_share_out)
+{
+  geoip_determine_shares(now);
+  if (!share_seconds)
+    return -1;
+  *v2_share_out = v2_share_times_seconds / ((double) share_seconds);
+  *v3_share_out = v3_share_times_seconds / ((double) share_seconds);
+  v2_share_times_seconds = v3_share_times_seconds = 0.0;
+  share_seconds = 0;
+  return 0;
+}
+#endif
+
 /** Note that we've seen a client connect from the IP <b>addr</b> (host order)
- * at time <b>now</b>. Ignored by all but bridges. */
+ * at time <b>now</b>. Ignored by all but bridges and directories if
+ * configured accordingly. */
 void
 geoip_note_client_seen(geoip_client_action_t action,
                        uint32_t addr, time_t now)
@@ -306,14 +379,22 @@
   or_options_t *options = get_options();
   clientmap_entry_t lookup, *ent;
   if (action == GEOIP_CLIENT_CONNECT) {
+#ifdef ENABLE_ENTRY_STATS
+    if (!options->EntryStatistics)
+      return;
+#else
     if (!(options->BridgeRelay && options->BridgeRecordUsageByCountry))
       return;
+#endif
+    /* Did we recently switch from bridge to relay or back? */
+    if (client_history_starts > now)
+      return;
   } else {
-#ifndef ENABLE_GEOIP_STATS
+#ifndef ENABLE_DIRREQ_STATS
     return;
 #else
     if (options->BridgeRelay || options->BridgeAuthoritativeDir ||
-        !options->DirRecordUsageByCountry)
+        !options->DirReqStatistics)
       return;
 #endif
   }
@@ -326,6 +407,16 @@
       current_request_period_starts = now;
       break;
     }
+    /* Also discard all items in the client history that are too old.
+     * (This only works here because bridge and directory stats are
+     * independent. Otherwise, we'd only want to discard those items
+     * with action GEOIP_CLIENT_NETWORKSTATUS{_V2}.) */
+    geoip_remove_old_clients(current_request_period_starts);
+    /* Before rotating, write the current stats to disk. */
+    dump_geoip_stats();
+    if (get_options()->EntryStatistics)
+      dump_entry_stats();
+    /* Now rotate request period */
     SMARTLIST_FOREACH(geoip_countries, geoip_country_t *, c, {
         memmove(&c->n_v2_ns_requests[0], &c->n_v2_ns_requests[1],
                 sizeof(uint32_t)*(REQUEST_HIST_LEN-1));
@@ -337,26 +428,26 @@
     current_request_period_starts += REQUEST_HIST_PERIOD;
     if (n_old_request_periods < REQUEST_HIST_LEN-1)
       ++n_old_request_periods;
-   }
+  }
 
-  /* We use the low 3 bits of the time to encode the action. Since we're
-   * potentially remembering tons of clients, we don't want to make
-   * clientmap_entry_t larger than it has to be. */
-  now = (now & ~ACTION_MASK) | (((int)action) & ACTION_MASK);
   lookup.ipaddr = addr;
+  lookup.action = (int)action;
   ent = HT_FIND(clientmap, &client_history, &lookup);
   if (ent) {
-    ent->last_seen = now;
+    ent->last_seen_in_minutes = now / 60;
   } else {
     ent = tor_malloc_zero(sizeof(clientmap_entry_t));
     ent->ipaddr = addr;
-    ent->last_seen = now;
+    ent->last_seen_in_minutes = now / 60;
+    ent->action = (int)action;
     HT_INSERT(clientmap, &client_history, ent);
   }
 
   if (action == GEOIP_CLIENT_NETWORKSTATUS ||
       action == GEOIP_CLIENT_NETWORKSTATUS_V2) {
     int country_idx = geoip_get_country_by_ip(addr);
+    if (country_idx < 0)
+      country_idx = 0; /** unresolved requests are stored at index 0. */
     if (country_idx >= 0 && country_idx < smartlist_len(geoip_countries)) {
       geoip_country_t *country = smartlist_get(geoip_countries, country_idx);
       if (action == GEOIP_CLIENT_NETWORKSTATUS)
@@ -364,6 +455,10 @@
       else
         ++country->n_v2_ns_requests[REQUEST_HIST_LEN-1];
     }
+
+    /* Periodically determine share of requests that we should see */
+    if (last_time_determined_shares + REQUEST_SHARE_INTERVAL < now)
+      geoip_determine_shares(now);
   }
 
   if (!client_history_starts) {
@@ -377,8 +472,8 @@
 static int
 _remove_old_client_helper(struct clientmap_entry_t *ent, void *_cutoff)
 {
-  time_t cutoff = *(time_t*)_cutoff;
-  if (ent->last_seen < cutoff) {
+  time_t cutoff = *(time_t*)_cutoff / 60;
+  if (ent->last_seen_in_minutes < cutoff) {
     tor_free(ent);
     return 1;
   } else {
@@ -386,7 +481,10 @@
   }
 }
 
-/** Forget about all clients that haven't connected since <b>cutoff</b>. */
+/** Forget about all clients that haven't connected since <b>cutoff</b>.
+ * If <b>cutoff</b> is in the future, clients won't be added to the history
+ * until this time is reached. This is useful to prevent relays that switch
+ * to bridges from reporting unbelievable numbers of clients. */
 void
 geoip_remove_old_clients(time_t cutoff)
 {
@@ -397,6 +495,45 @@
     client_history_starts = cutoff;
 }
 
+#ifdef ENABLE_DIRREQ_STATS
+/** How many responses are we giving to clients requesting v2 network
+ * statuses? */
+static uint32_t ns_v2_responses[GEOIP_NS_RESPONSE_NUM];
+
+/** How many responses are we giving to clients requesting v3 network
+ * statuses? */
+static uint32_t ns_v3_responses[GEOIP_NS_RESPONSE_NUM];
+#endif
+
+/** Note that we've rejected a client's request for a v2 or v3 network
+ * status, encoded in <b>action</b> for reason <b>reason</b> at time
+ * <b>now</b>. */
+void
+geoip_note_ns_response(geoip_client_action_t action,
+                       geoip_ns_response_t response)
+{
+#ifdef ENABLE_DIRREQ_STATS
+  static int arrays_initialized = 0;
+  if (!get_options()->DirReqStatistics)
+    return;
+  if (!arrays_initialized) {
+    memset(ns_v2_responses, 0, sizeof(ns_v2_responses));
+    memset(ns_v3_responses, 0, sizeof(ns_v3_responses));
+    arrays_initialized = 1;
+  }
+  tor_assert(action == GEOIP_CLIENT_NETWORKSTATUS ||
+             action == GEOIP_CLIENT_NETWORKSTATUS_V2);
+  tor_assert(response < GEOIP_NS_RESPONSE_NUM);
+  if (action == GEOIP_CLIENT_NETWORKSTATUS)
+    ns_v3_responses[response]++;
+  else
+    ns_v2_responses[response]++;
+#else
+  (void) action;
+  (void) response;
+#endif
+}
+
 /** Do not mention any country from which fewer than this number of IPs have
  * connected.  This conceivably avoids reporting information that could
  * deanonymize users, though analysis is lacking. */
@@ -436,20 +573,239 @@
     return strcmp(a->country, b->country);
 }
 
+/** When there are incomplete directory requests at the end of a 24-hour
+ * period, consider those requests running for longer than this timeout as
+ * failed, the others as still running. */
+#define DIRREQ_TIMEOUT (10*60)
+
+/** Entry in a map from either conn->global_identifier for direct requests
+ * or a unique circuit identifier for tunneled requests to request time,
+ * response size, and completion time of a network status request. Used to
+ * measure download times of requests to derive average client
+ * bandwidths. */
+typedef struct dirreq_map_entry_t {
+  HT_ENTRY(dirreq_map_entry_t) node;
+  /** Unique identifier for this network status request; this is either the
+   * conn->global_identifier of the dir conn (direct request) or a new
+   * locally unique identifier of a circuit (tunneled request). This ID is
+   * only unique among other direct or tunneled requests, respectively. */
+  uint64_t dirreq_id;
+  unsigned int state:3; /**< State of this directory request. */
+  unsigned int type:1; /**< Is this a direct or a tunneled request? */
+  unsigned int completed:1; /**< Is this request complete? */
+  unsigned int action:2; /**< Is this a v2 or v3 request? */
+  /** When did we receive the request and started sending the response? */
+  struct timeval request_time;
+  size_t response_size; /**< What is the size of the response in bytes? */
+  struct timeval completion_time; /**< When did the request succeed? */
+} dirreq_map_entry_t;
+
+/** Map of all directory requests asking for v2 or v3 network statuses in
+ * the current geoip-stats interval. Values are
+ * of type *<b>dirreq_map_entry_t</b>. */
+static HT_HEAD(dirreqmap, dirreq_map_entry_t) dirreq_map =
+     HT_INITIALIZER();
+
+static int
+dirreq_map_ent_eq(const dirreq_map_entry_t *a,
+                  const dirreq_map_entry_t *b)
+{
+  return a->dirreq_id == b->dirreq_id && a->type == b->type;
+}
+
+static unsigned
+dirreq_map_ent_hash(const dirreq_map_entry_t *entry)
+{
+  unsigned u = (unsigned) entry->dirreq_id;
+  u += entry->type << 20;
+  return u;
+}
+
+HT_PROTOTYPE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash,
+             dirreq_map_ent_eq);
+HT_GENERATE(dirreqmap, dirreq_map_entry_t, node, dirreq_map_ent_hash,
+            dirreq_map_ent_eq, 0.6, malloc, realloc, free);
+
+/** Helper: Put <b>entry</b> into map of directory requests using
+ * <b>tunneled</b> and <b>dirreq_id</b> as key parts. If there is
+ * already an entry for that key, print out a BUG warning and return. */
+static void
+_dirreq_map_put(dirreq_map_entry_t *entry, dirreq_type_t type,
+               uint64_t dirreq_id)
+{
+  dirreq_map_entry_t *old_ent;
+  tor_assert(entry->type == type);
+  tor_assert(entry->dirreq_id == dirreq_id);
+
+  /* XXXX022 once we're sure the bug case never happens, we can switch
+   * to HT_INSERT */
+  old_ent = HT_REPLACE(dirreqmap, &dirreq_map, entry);
+  if (old_ent && old_ent != entry) {
+    log_warn(LD_BUG, "Error when putting directory request into local "
+             "map. There was already an entry for the same identifier.");
+    return;
+  }
+}
+
+/** Helper: Look up and return an entry in the map of directory requests
+ * using <b>tunneled</b> and <b>dirreq_id</b> as key parts. If there
+ * is no such entry, return NULL. */
+static dirreq_map_entry_t *
+_dirreq_map_get(dirreq_type_t type, uint64_t dirreq_id)
+{
+  dirreq_map_entry_t lookup;
+  lookup.type = type;
+  lookup.dirreq_id = dirreq_id;
+  return HT_FIND(dirreqmap, &dirreq_map, &lookup);
+}
+
+/** Note that an either direct or tunneled (see <b>type</b>) directory
+ * request for a network status with unique ID <b>dirreq_id</b> of size
+ * <b>response_size</b> and action <b>action</b> (either v2 or v3) has
+ * started. */
+void
+geoip_start_dirreq(uint64_t dirreq_id, size_t response_size,
+                   geoip_client_action_t action, dirreq_type_t type)
+{
+  dirreq_map_entry_t *ent;
+  if (!get_options()->DirReqStatistics)
+    return;
+  ent = tor_malloc_zero(sizeof(dirreq_map_entry_t));
+  ent->dirreq_id = dirreq_id;
+  tor_gettimeofday(&ent->request_time);
+  ent->response_size = response_size;
+  ent->action = action;
+  ent->type = type;
+  _dirreq_map_put(ent, type, dirreq_id);
+}
+
+/** Change the state of the either direct or tunneled (see <b>type</b>)
+ * directory request with <b>dirreq_id</b> to <b>new_state</b> and
+ * possibly mark it as completed. If no entry can be found for the given
+ * key parts (e.g., if this is a directory request that we are not
+ * measuring, or one that was started in the previous measurement period),
+ * or if the state cannot be advanced to <b>new_state</b>, do nothing. */
+void
+geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type,
+                          dirreq_state_t new_state)
+{
+  dirreq_map_entry_t *ent;
+  if (!get_options()->DirReqStatistics)
+    return;
+  ent = _dirreq_map_get(type, dirreq_id);
+  if (!ent)
+    return;
+  if (new_state == DIRREQ_IS_FOR_NETWORK_STATUS)
+    return;
+  if (new_state - 1 != ent->state)
+    return;
+  ent->state = new_state;
+  if ((type == DIRREQ_DIRECT &&
+         new_state == DIRREQ_FLUSHING_DIR_CONN_FINISHED) ||
+      (type == DIRREQ_TUNNELED &&
+         new_state == DIRREQ_OR_CONN_BUFFER_FLUSHED)) {
+    tor_gettimeofday(&ent->completion_time);
+    ent->completed = 1;
+  }
+}
+
+#ifdef ENABLE_DIRREQ_STATS
+/** Return a newly allocated comma-separated string containing statistics
+ * on network status downloads. The string contains the number of completed
+ * requests, timeouts, and still running requests as well as the download
+ * times by deciles and quartiles. Return NULL if we have not observed
+ * requests for long enough. */
+static char *
+geoip_get_dirreq_history(geoip_client_action_t action,
+                           dirreq_type_t type)
+{
+  char *result = NULL;
+  smartlist_t *dirreq_times = NULL;
+  uint32_t complete = 0, timeouts = 0, running = 0;
+  int i = 0, bufsize = 1024, written;
+  dirreq_map_entry_t **ptr, **next, *ent;
+  struct timeval now;
+
+  tor_gettimeofday(&now);
+  if (action != GEOIP_CLIENT_NETWORKSTATUS &&
+      action != GEOIP_CLIENT_NETWORKSTATUS_V2)
+    return NULL;
+  dirreq_times = smartlist_create();
+  for (ptr = HT_START(dirreqmap, &dirreq_map); ptr; ptr = next) {
+    ent = *ptr;
+    if (ent->action != action || ent->type != type) {
+      next = HT_NEXT(dirreqmap, &dirreq_map, ptr);
+      continue;
+    } else {
+      if (ent->completed) {
+        uint32_t *bytes_per_second = tor_malloc_zero(sizeof(uint32_t));
+        uint32_t time_diff = (uint32_t) tv_mdiff(&ent->request_time,
+                                                 &ent->completion_time);
+        if (time_diff == 0)
+          time_diff = 1; /* Avoid DIV/0; "instant" answers are impossible
+                          * anyway by law of nature or something.. */
+        *bytes_per_second = 1000 * ent->response_size / time_diff;
+        smartlist_add(dirreq_times, bytes_per_second);
+        complete++;
+      } else {
+        if (tv_mdiff(&ent->request_time, &now) / 1000 > DIRREQ_TIMEOUT)
+          timeouts++;
+        else
+          running++;
+      }
+      next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ptr);
+      tor_free(ent);
+    }
+  }
+#define DIR_REQ_GRANULARITY 4
+  complete = round_uint32_to_next_multiple_of(complete,
+                                              DIR_REQ_GRANULARITY);
+  timeouts = round_uint32_to_next_multiple_of(timeouts,
+                                              DIR_REQ_GRANULARITY);
+  running = round_uint32_to_next_multiple_of(running,
+                                             DIR_REQ_GRANULARITY);
+  result = tor_malloc_zero(bufsize);
+  written = tor_snprintf(result, bufsize, "complete=%u,timeout=%u,"
+                         "running=%u", complete, timeouts, running);
+  if (written < 0)
+    return NULL;
+#define MIN_DIR_REQ_RESPONSES 16
+  if (complete >= MIN_DIR_REQ_RESPONSES) {
+    uint32_t *dltimes = tor_malloc(sizeof(uint32_t) * complete);
+    SMARTLIST_FOREACH(dirreq_times, uint32_t *, dlt, {
+      dltimes[i++] = *dlt;
+      tor_free(dlt);
+    });
+    median_uint32(dltimes, complete); /* sort */
+    written = tor_snprintf(result + written, bufsize - written,
+                           ",min=%u,d1=%u,d2=%u,q1=%u,d3=%u,d4=%u,md=%u,"
+                           "d6=%u,d7=%u,q3=%u,d8=%u,d9=%u,max=%u",
+                           dltimes[0],
+                           dltimes[1*complete/10-1],
+                           dltimes[2*complete/10-1],
+                           dltimes[1*complete/4-1],
+                           dltimes[3*complete/10-1],
+                           dltimes[4*complete/10-1],
+                           dltimes[5*complete/10-1],
+                           dltimes[6*complete/10-1],
+                           dltimes[7*complete/10-1],
+                           dltimes[3*complete/4-1],
+                           dltimes[8*complete/10-1],
+                           dltimes[9*complete/10-1],
+                           dltimes[complete-1]);
+    tor_free(dltimes);
+  }
+  if (written < 0)
+    result = NULL;
+  smartlist_free(dirreq_times);
+  return result;
+}
+#endif
+
 /** How long do we have to have observed per-country request history before we
  * are willing to talk about it? */
 #define GEOIP_MIN_OBSERVATION_TIME (12*60*60)
 
-/** Return the lowest x such that x is at least <b>number</b>, and x modulo
- * <b>divisor</b> == 0. */
-static INLINE unsigned
-round_to_next_multiple_of(unsigned number, unsigned divisor)
-{
-  number += divisor - 1;
-  number -= number % divisor;
-  return number;
-}
-
 /** Return a newly allocated comma-separated string containing entries for all
  * the countries from which we've seen enough clients connect. The entry
  * format is cc=num where num is the number of IPs we've seen connecting from
@@ -459,9 +815,13 @@
 geoip_get_client_history(time_t now, geoip_client_action_t action)
 {
   char *result = NULL;
+  int min_observation_time = GEOIP_MIN_OBSERVATION_TIME;
+#ifdef ENABLE_DIRREQ_STATS
+  min_observation_time = DIR_RECORD_USAGE_MIN_OBSERVATION_TIME;
+#endif
   if (!geoip_is_loaded())
     return NULL;
-  if (client_history_starts < (now - GEOIP_MIN_OBSERVATION_TIME)) {
+  if (client_history_starts < (now - min_observation_time)) {
     char buf[32];
     smartlist_t *chunks = NULL;
     smartlist_t *entries = NULL;
@@ -471,17 +831,16 @@
     unsigned *counts = tor_malloc_zero(sizeof(unsigned)*n_countries);
     unsigned total = 0;
     unsigned granularity = IP_GRANULARITY;
-#ifdef ENABLE_GEOIP_STATS
-    if (get_options()->DirRecordUsageByCountry)
-      granularity = get_options()->DirRecordUsageGranularity;
+#ifdef ENABLE_DIRREQ_STATS
+    granularity = DIR_RECORD_USAGE_GRANULARITY;
 #endif
     HT_FOREACH(ent, clientmap, &client_history) {
       int country;
-      if (((*ent)->last_seen & ACTION_MASK) != (int)action)
+      if ((*ent)->action != (int)action)
         continue;
       country = geoip_get_country_by_ip((*ent)->ipaddr);
       if (country < 0)
-        continue;
+        country = 0; /** unresolved requests are stored at index 0. */
       tor_assert(0 <= country && country < n_countries);
       ++counts[country];
       ++total;
@@ -539,12 +898,13 @@
   smartlist_t *entries, *strings;
   char *result;
   unsigned granularity = IP_GRANULARITY;
-#ifdef ENABLE_GEOIP_STATS
-  if (get_options()->DirRecordUsageByCountry)
-    granularity = get_options()->DirRecordUsageGranularity;
+  int min_observation_time = GEOIP_MIN_OBSERVATION_TIME;
+#ifdef ENABLE_DIRREQ_STATS
+  granularity = DIR_RECORD_USAGE_GRANULARITY;
+  min_observation_time = DIR_RECORD_USAGE_MIN_OBSERVATION_TIME;
 #endif
 
-  if (client_history_starts >= (now - GEOIP_MIN_OBSERVATION_TIME))
+  if (client_history_starts >= (now - min_observation_time))
     return NULL;
   if (action != GEOIP_CLIENT_NETWORKSTATUS &&
       action != GEOIP_CLIENT_NETWORKSTATUS_V2)
@@ -584,25 +944,29 @@
   return result;
 }
 
-/** Store all our geoip statistics into $DATADIR/geoip-stats. */
-void
+/** Store all our geoip statistics into $DATADIR/dirreq-stats. */
+static void
 dump_geoip_stats(void)
 {
-#ifdef ENABLE_GEOIP_STATS
+#ifdef ENABLE_DIRREQ_STATS
   time_t now = time(NULL);
   time_t request_start;
-  char *filename = get_datadir_fname("geoip-stats");
+  char *filename = get_datadir_fname("dirreq-stats");
   char *data_v2 = NULL, *data_v3 = NULL;
   char since[ISO_TIME_LEN+1], written[ISO_TIME_LEN+1];
   open_file_t *open_file = NULL;
   double v2_share = 0.0, v3_share = 0.0;
   FILE *out;
+  int i;
 
+  if (!get_options()->DirReqStatistics)
+    goto done;
+
   data_v2 = geoip_get_client_history(now, GEOIP_CLIENT_NETWORKSTATUS_V2);
   data_v3 = geoip_get_client_history(now, GEOIP_CLIENT_NETWORKSTATUS);
   format_iso_time(since, geoip_get_history_start());
   format_iso_time(written, now);
-  out = start_writing_to_stdio_file(filename, OPEN_FLAGS_REPLACE,
+  out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND,
                                     0600, &open_file);
   if (!out)
     goto done;
@@ -622,13 +986,57 @@
               since,
               data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0)
     goto done;
-  if (!router_get_my_share_of_directory_requests(&v2_share, &v3_share)) {
+#define RESPONSE_GRANULARITY 8
+  for (i = 0; i < GEOIP_NS_RESPONSE_NUM; i++) {
+    ns_v2_responses[i] = round_uint32_to_next_multiple_of(
+                               ns_v2_responses[i], RESPONSE_GRANULARITY);
+    ns_v3_responses[i] = round_uint32_to_next_multiple_of(
+                               ns_v3_responses[i], RESPONSE_GRANULARITY);
+  }
+#undef RESPONSE_GRANULARITY
+  if (fprintf(out, "n-ns-resp ok=%u,not-enough-sigs=%u,unavailable=%u,"
+                   "not-found=%u,not-modified=%u,busy=%u\n",
+                   ns_v3_responses[GEOIP_SUCCESS],
+                   ns_v3_responses[GEOIP_REJECT_NOT_ENOUGH_SIGS],
+                   ns_v3_responses[GEOIP_REJECT_UNAVAILABLE],
+                   ns_v3_responses[GEOIP_REJECT_NOT_FOUND],
+                   ns_v3_responses[GEOIP_REJECT_NOT_MODIFIED],
+                   ns_v3_responses[GEOIP_REJECT_BUSY]) < 0)
+    goto done;
+  if (fprintf(out, "n-v2-ns-resp ok=%u,unavailable=%u,"
+                   "not-found=%u,not-modified=%u,busy=%u\n",
+                   ns_v2_responses[GEOIP_SUCCESS],
+                   ns_v2_responses[GEOIP_REJECT_UNAVAILABLE],
+                   ns_v2_responses[GEOIP_REJECT_NOT_FOUND],
+                   ns_v2_responses[GEOIP_REJECT_NOT_MODIFIED],
+                   ns_v2_responses[GEOIP_REJECT_BUSY]) < 0)
+    goto done;
+  memset(ns_v2_responses, 0, sizeof(ns_v2_responses));
+  memset(ns_v3_responses, 0, sizeof(ns_v3_responses));
+  if (!geoip_get_mean_shares(now, &v2_share, &v3_share)) {
     if (fprintf(out, "v2-ns-share %0.2lf%%\n", v2_share*100) < 0)
       goto done;
     if (fprintf(out, "v3-ns-share %0.2lf%%\n", v3_share*100) < 0)
       goto done;
   }
 
+  data_v2 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS_V2,
+                                       DIRREQ_DIRECT);
+  data_v3 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS,
+                                       DIRREQ_DIRECT);
+  if (fprintf(out, "ns-direct-dl %s\nns-v2-direct-dl %s\n",
+              data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0)
+    goto done;
+  tor_free(data_v2);
+  tor_free(data_v3);
+  data_v2 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS_V2,
+                                       DIRREQ_TUNNELED);
+  data_v3 = geoip_get_dirreq_history(GEOIP_CLIENT_NETWORKSTATUS,
+                                       DIRREQ_TUNNELED);
+  if (fprintf(out, "ns-tunneled-dl %s\nns-v2-tunneled-dl %s\n",
+              data_v3 ? data_v3 : "", data_v2 ? data_v2 : "") < 0)
+    goto done;
+
   finish_writing_to_file(open_file);
   open_file = NULL;
  done:
@@ -640,6 +1048,40 @@
 #endif
 }
 
+/** Store all our geoip statistics as entry guards into
+ * $DATADIR/entry-stats. */
+static void
+dump_entry_stats(void)
+{
+#ifdef ENABLE_ENTRY_STATS
+  time_t now = time(NULL);
+  char *filename = get_datadir_fname("entry-stats");
+  char *data = NULL;
+  char since[ISO_TIME_LEN+1], written[ISO_TIME_LEN+1];
+  open_file_t *open_file = NULL;
+  FILE *out;
+
+  data = geoip_get_client_history(now, GEOIP_CLIENT_CONNECT);
+  format_iso_time(since, geoip_get_history_start());
+  format_iso_time(written, now);
+  out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND,
+                                    0600, &open_file);
+  if (!out)
+    goto done;
+  if (fprintf(out, "written %s\nstarted-at %s\nips %s\n",
+              written, since, data ? data : "") < 0)
+    goto done;
+
+  finish_writing_to_file(open_file);
+  open_file = NULL;
+ done:
+  if (open_file)
+    abort_writing_to_file(open_file);
+  tor_free(filename);
+  tor_free(data);
+#endif
+}
+
 /** Helper used to implement GETINFO ip-to-country/... controller command. */
 int
 getinfo_helper_geoip(control_connection_t *control_conn,
@@ -683,13 +1125,24 @@
 void
 geoip_free_all(void)
 {
-  clientmap_entry_t **ent, **next, *this;
-  for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) {
-    this = *ent;
-    next = HT_NEXT_RMV(clientmap, &client_history, ent);
-    tor_free(this);
+  {
+    clientmap_entry_t **ent, **next, *this;
+    for (ent = HT_START(clientmap, &client_history); ent != NULL; ent = next) {
+      this = *ent;
+      next = HT_NEXT_RMV(clientmap, &client_history, ent);
+      tor_free(this);
+    }
+    HT_CLEAR(clientmap, &client_history);
   }
-  HT_CLEAR(clientmap, &client_history);
+  {
+    dirreq_map_entry_t **ent, **next, *this;
+    for (ent = HT_START(dirreqmap, &dirreq_map); ent != NULL; ent = next) {
+      this = *ent;
+      next = HT_NEXT_RMV(dirreqmap, &dirreq_map, ent);
+      tor_free(this);
+    }
+    HT_CLEAR(dirreqmap, &dirreq_map);
+  }
 
   clear_geoip_db();
 }

Modified: tor/trunk/src/or/hibernate.c
===================================================================
--- tor/trunk/src/or/hibernate.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/hibernate.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -583,10 +583,10 @@
     return -1;
 
   /* Okay; it looks like the state file is more up-to-date than the
-   * bw_accounting file, or the bw_accounting file is nonexistant,
+   * bw_accounting file, or the bw_accounting file is nonexistent,
    * or the bw_accounting file is corrupt.
    */
-  log_info(LD_ACCT, "Reading bandwdith accounting data from state file");
+  log_info(LD_ACCT, "Reading bandwidth accounting data from state file");
   n_bytes_read_in_interval = state->AccountingBytesReadInInterval;
   n_bytes_written_in_interval = state->AccountingBytesWrittenInInterval;
   n_seconds_active_in_interval = state->AccountingSecondsActive;
@@ -651,7 +651,7 @@
 
   if (new_state == HIBERNATE_STATE_EXITING &&
       hibernate_state != HIBERNATE_STATE_LIVE) {
-    log_notice(LD_GENERAL,"Sigint received %s; exiting now.",
+    log_notice(LD_GENERAL,"SIGINT received %s; exiting now.",
                hibernate_state == HIBERNATE_STATE_EXITING ?
                "a second time" : "while hibernating");
     tor_cleanup();

Modified: tor/trunk/src/or/main.c
===================================================================
--- tor/trunk/src/or/main.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/main.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -18,6 +18,12 @@
 #endif
 #include "memarea.h"
 
+#ifdef HAVE_EVENT2_EVENT_H
+#include <event2/event.h>
+#else
+#include <event.h>
+#endif
+
 void evdns_shutdown(int);
 
 /********* PROTOTYPES **********/
@@ -127,12 +133,10 @@
   smartlist_add(connection_array, conn);
 
   if (conn->s >= 0 || conn->linked) {
-    conn->read_event = tor_malloc_zero(sizeof(struct event));
-    conn->write_event = tor_malloc_zero(sizeof(struct event));
-    event_set(conn->read_event, conn->s, EV_READ|EV_PERSIST,
-              conn_read_callback, conn);
-    event_set(conn->write_event, conn->s, EV_WRITE|EV_PERSIST,
-              conn_write_callback, conn);
+    conn->read_event = tor_event_new(tor_libevent_get_base(),
+         conn->s, EV_READ|EV_PERSIST, conn_read_callback, conn);
+    conn->write_event = tor_event_new(tor_libevent_get_base(),
+         conn->s, EV_WRITE|EV_PERSIST, conn_write_callback, conn);
   }
 
   log_debug(LD_NET,"new conn type %s, socket %d, address %s, n_conns %d.",
@@ -142,6 +146,25 @@
   return 0;
 }
 
+/** Tell libevent that we don't care about <b>conn</b> any more. */
+void
+connection_unregister_events(connection_t *conn)
+{
+  if (conn->read_event) {
+    if (event_del(conn->read_event))
+      log_warn(LD_BUG, "Error removing read event for %d", conn->s);
+    tor_free(conn->read_event);
+  }
+  if (conn->write_event) {
+    if (event_del(conn->write_event))
+      log_warn(LD_BUG, "Error removing write event for %d", conn->s);
+    tor_free(conn->write_event);
+  }
+  if (conn->dns_server_port) {
+    dnsserv_close_listener(conn);
+  }
+}
+
 /** Remove the connection from the global list, and remove the
  * corresponding poll entry.  Calling this function will shift the last
  * connection (if any) into the position occupied by conn.
@@ -246,17 +269,17 @@
 }
 
 /** Set the event mask on <b>conn</b> to <b>events</b>.  (The event
- * mask is a bitmask whose bits are EV_READ and EV_WRITE.)
+ * mask is a bitmask whose bits are READ_EVENT and WRITE_EVENT)
  */
 void
-connection_watch_events(connection_t *conn, short events)
+connection_watch_events(connection_t *conn, watchable_events_t events)
 {
-  if (events & EV_READ)
+  if (events & READ_EVENT)
     connection_start_reading(conn);
   else
     connection_stop_reading(conn);
 
-  if (events & EV_WRITE)
+  if (events & WRITE_EVENT)
     connection_start_writing(conn);
   else
     connection_stop_writing(conn);
@@ -393,11 +416,11 @@
     smartlist_add(active_linked_connection_lst, conn);
     if (!called_loop_once) {
       /* This is the first event on the list; we won't be in LOOP_ONCE mode,
-       * so we need to make sure that the event_loop() actually exits at the
-       * end of its run through the current connections and
-       * lets us activate read events for linked connections. */
+       * so we need to make sure that the event_base_loop() actually exits at
+       * the end of its run through the current connections and lets us
+       * activate read events for linked connections. */
       struct timeval tv = { 0, 0 };
-      event_loopexit(&tv);
+      tor_event_base_loopexit(tor_libevent_get_base(), &tv);
     }
   } else {
     tor_assert(smartlist_isin(active_linked_connection_lst, conn));
@@ -451,7 +474,7 @@
 
   log_debug(LD_NET,"socket %d wants to read.",conn->s);
 
-  assert_connection_ok(conn, time(NULL));
+  /* assert_connection_ok(conn, time(NULL)); */
 
   if (connection_handle_read(conn) < 0) {
     if (!conn->marked_for_close) {
@@ -483,7 +506,7 @@
 
   LOG_FN_CONN(conn, (LOG_DEBUG, LD_NET, "socket %d wants to write.",conn->s));
 
-  assert_connection_ok(conn, time(NULL));
+  /* assert_connection_ok(conn, time(NULL)); */
 
   if (connection_handle_write(conn, 0) < 0) {
     if (!conn->marked_for_close) {
@@ -529,7 +552,7 @@
     return 0; /* nothing to see here, move along */
   now = time(NULL);
   assert_connection_ok(conn, now);
-  assert_all_pending_dns_resolves_ok();
+  /* assert_all_pending_dns_resolves_ok(); */
 
   log_debug(LD_NET,"Cleaning up connection (fd %d).",conn->s);
   if ((conn->s >= 0 || conn->linked_conn) && connection_wants_to_flush(conn)) {
@@ -774,7 +797,7 @@
   }
 }
 
-/** Honor a NEWNYM request: make future requests unlinkability to past
+/** Honor a NEWNYM request: make future requests unlinkable to past
  * requests. */
 static void
 signewnym_impl(time_t now)
@@ -807,7 +830,9 @@
   static time_t time_to_clean_caches = 0;
   static time_t time_to_recheck_bandwidth = 0;
   static time_t time_to_check_for_expired_networkstatus = 0;
-  static time_t time_to_dump_geoip_stats = 0;
+#ifdef ENABLE_BUFFER_STATS
+  static time_t time_to_dump_buffer_stats = 0;
+#endif
   static time_t time_to_retry_dns_init = 0;
   or_options_t *options = get_options();
   int i;
@@ -903,7 +928,7 @@
     time_to_downrate_stability = rep_hist_downrate_old_runs(now);
   if (authdir_mode_tests_reachability(options)) {
     if (time_to_save_stability < now) {
-      if (time_to_save_stability && rep_hist_record_mtbf_data()<0) {
+      if (time_to_save_stability && rep_hist_record_mtbf_data(now, 1)<0) {
         log_warn(LD_GENERAL, "Couldn't store mtbf data.");
       }
 #define SAVE_STABILITY_INTERVAL (30*60)
@@ -911,7 +936,7 @@
     }
   }
 
-  /* 1e. Periodicaly, if we're a v3 authority, we check whether our cert is
+  /* 1e. Periodically, if we're a v3 authority, we check whether our cert is
    * close to expiring and warn the admin if it is. */
   if (time_to_check_v3_certificate < now) {
     v3_authority_check_key_expiry();
@@ -935,12 +960,13 @@
     time_to_check_for_expired_networkstatus = now + CHECK_EXPIRED_NS_INTERVAL;
   }
 
-  if (time_to_dump_geoip_stats < now) {
-#define DUMP_GEOIP_STATS_INTERVAL (60*60);
-    if (time_to_dump_geoip_stats)
-      dump_geoip_stats();
-    time_to_dump_geoip_stats = now + DUMP_GEOIP_STATS_INTERVAL;
+#ifdef ENABLE_BUFFER_STATS
+  if (time_to_dump_buffer_stats < now) {
+    if (get_options()->CellStatistics && time_to_dump_buffer_stats)
+      dump_buffer_stats();
+    time_to_dump_buffer_stats = now + DUMP_BUFFER_STATS_INTERVAL;
   }
+#endif
 
   /* Remove old information from rephist and the rend cache. */
   if (time_to_clean_caches < now) {
@@ -1135,7 +1161,7 @@
 second_elapsed_callback(int fd, short event, void *args)
 {
   /* XXXX This could be sensibly refactored into multiple callbacks, and we
-   * could use libevent's timers for this rather than checking the current
+   * could use Libevent's timers for this rather than checking the current
    * time against a bunch of timeouts every second. */
   static struct timeval one_second;
   static time_t current_second = 0;
@@ -1148,8 +1174,8 @@
   (void)event;
   (void)args;
   if (!timeout_event) {
-    timeout_event = tor_malloc_zero(sizeof(struct event));
-    evtimer_set(timeout_event, second_elapsed_callback, NULL);
+    timeout_event = tor_evtimer_new(tor_libevent_get_base(),
+                                    second_elapsed_callback, NULL);
     one_second.tv_sec = 1;
     one_second.tv_usec = 0;
   }
@@ -1221,7 +1247,7 @@
   }
 #endif
 
-  if (evtimer_add(timeout_event, &one_second))
+  if (event_add(timeout_event, &one_second))
     log_err(LD_NET,
             "Error from libevent when setting one-second timeout event");
 }
@@ -1432,20 +1458,16 @@
 
     /* poll until we have an event, or the second ends, or until we have
      * some active linked connections to trigger events for. */
-    loop_result = event_loop(called_loop_once ? EVLOOP_ONCE : 0);
+    loop_result = event_base_loop(tor_libevent_get_base(),
+                                  called_loop_once ? EVLOOP_ONCE : 0);
 
     /* let catch() handle things like ^c, and otherwise don't worry about it */
     if (loop_result < 0) {
       int e = tor_socket_errno(-1);
       /* let the program survive things like ^z */
       if (e != EINTR && !ERRNO_IS_EINPROGRESS(e)) {
-#ifdef HAVE_EVENT_GET_METHOD
         log_err(LD_NET,"libevent call with %s failed: %s [%d]",
-                event_get_method(), tor_socket_strerror(e), e);
-#else
-        log_err(LD_NET,"libevent call failed: %s [%d]",
-                tor_socket_strerror(e), e);
-#endif
+                tor_libevent_get_method(), tor_socket_strerror(e), e);
         return -1;
 #ifndef MS_WINDOWS
       } else if (e == EINVAL) {
@@ -1472,7 +1494,7 @@
  *   1. We handle a different set of signals than those allowed in catch.
  *   2. Platforms without signal() are unlikely to define SIGfoo.
  *   3. The control spec is defined to use fixed numeric signal values
- *      which just happen to match the unix values.
+ *      which just happen to match the Unix values.
  */
 void
 control_signal_act(int the_signal)
@@ -1531,7 +1553,7 @@
       break;
 #ifdef SIGPIPE
     case SIGPIPE:
-      log_debug(LD_GENERAL,"Caught sigpipe. Ignoring.");
+      log_debug(LD_GENERAL,"Caught SIGPIPE. Ignoring.");
       break;
 #endif
     case SIGUSR1:
@@ -1588,6 +1610,7 @@
       U64_PRINTF_ARG(rephist_total_alloc), rephist_total_num);
   dump_routerlist_mem_usage(severity);
   dump_cell_pool_usage(severity);
+  dump_dns_mem_usage(severity);
   buf_dump_freelist_sizes(severity);
   tor_log_mallinfo(severity);
 }
@@ -1633,7 +1656,7 @@
           tor_tls_get_buffer_sizes(or_conn->tls, &rbuf_cap, &rbuf_len,
                                    &wbuf_cap, &wbuf_len);
           log(severity, LD_GENERAL,
-              "Conn %d: %d/%d bytes used on openssl read buffer; "
+              "Conn %d: %d/%d bytes used on OpenSSL read buffer; "
               "%d/%d bytes used on write buffer.",
               i, rbuf_len, rbuf_cap, wbuf_len, wbuf_cap);
         }
@@ -1709,12 +1732,12 @@
 void
 handle_signals(int is_parent)
 {
-#ifndef MS_WINDOWS /* do signal stuff only on unix */
+#ifndef MS_WINDOWS /* do signal stuff only on Unix */
   int i;
-  static int signals[] = {
+  static const int signals[] = {
     SIGINT,  /* do a controlled slow shutdown */
     SIGTERM, /* to terminate now */
-    SIGPIPE, /* otherwise sigpipe kills us */
+    SIGPIPE, /* otherwise SIGPIPE kills us */
     SIGUSR1, /* dump stats */
     SIGUSR2, /* go to loglevel debug */
     SIGHUP,  /* to reload config, retry conns, etc */
@@ -1723,12 +1746,13 @@
 #endif
     SIGCHLD, /* handle dns/cpu workers that exit */
     -1 };
-  static struct event signal_events[16]; /* bigger than it has to be. */
+  static struct event *signal_events[16]; /* bigger than it has to be. */
   if (is_parent) {
     for (i = 0; signals[i] >= 0; ++i) {
-      signal_set(&signal_events[i], signals[i], signal_callback,
-                 (void*)(uintptr_t)signals[i]);
-      if (signal_add(&signal_events[i], NULL))
+      signal_events[i] = tor_evsignal_new(
+                       tor_libevent_get_base(), signals[i], signal_callback,
+                       (void*)(uintptr_t)signals[i]);
+      if (event_add(signal_events[i], NULL))
         log_warn(LD_BUG, "Error from libevent when adding event for signal %d",
                  signals[i]);
     }
@@ -1817,7 +1841,9 @@
              "and you probably shouldn't.");
 #endif
 
-  if (crypto_global_init(get_options()->HardwareAccel)) {
+  if (crypto_global_init(get_options()->HardwareAccel,
+                         get_options()->AccelName,
+                         get_options()->AccelDir)) {
     log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting.");
     return -1;
   }
@@ -1894,7 +1920,7 @@
  *
  * Helps us find the real leaks with dmalloc and the like. Also valgrind
  * should then report 0 reachable in its leak report (in an ideal world --
- * in practice libevent, ssl, libc etc never quite free everything). */
+ * in practice libevent, SSL, libc etc never quite free everything). */
 void
 tor_free_all(int postfork)
 {
@@ -1955,14 +1981,15 @@
   /* Remove our pid file. We don't care if there was an error when we
    * unlink, nothing we could do about it anyways. */
   if (options->command == CMD_RUN_TOR) {
+    time_t now = time(NULL);
     if (options->PidFile)
       unlink(options->PidFile);
     if (accounting_is_enabled(options))
-      accounting_record_bandwidth_usage(time(NULL), get_or_state());
+      accounting_record_bandwidth_usage(now, get_or_state());
     or_state_mark_dirty(get_or_state(), 0); /* force an immediate save. */
-    or_state_save(time(NULL));
+    or_state_save(now);
     if (authdir_mode_tests_reachability(options))
-      rep_hist_record_mtbf_data();
+      rep_hist_record_mtbf_data(now, 0);
   }
 #ifdef USE_DMALLOC
   dmalloc_log_stats();

Modified: tor/trunk/src/or/networkstatus.c
===================================================================
--- tor/trunk/src/or/networkstatus.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/networkstatus.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -780,8 +780,8 @@
 
 /** Helper for bsearching a list of routerstatus_t pointers: compare a
  * digest in the key to the identity digest of a routerstatus_t. */
-static int
-_compare_digest_to_routerstatus_entry(const void *_key, const void **_member)
+int
+compare_digest_to_routerstatus_entry(const void *_key, const void **_member)
 {
   const char *key = _key;
   const routerstatus_t *rs = *_member;
@@ -794,7 +794,7 @@
 networkstatus_v2_find_entry(networkstatus_v2_t *ns, const char *digest)
 {
   return smartlist_bsearch(ns->entries, digest,
-                           _compare_digest_to_routerstatus_entry);
+                           compare_digest_to_routerstatus_entry);
 }
 
 /** Return the entry in <b>ns</b> for the identity digest <b>digest</b>, or
@@ -803,7 +803,7 @@
 networkstatus_vote_find_entry(networkstatus_t *ns, const char *digest)
 {
   return smartlist_bsearch(ns->routerstatus_list, digest,
-                           _compare_digest_to_routerstatus_entry);
+                           compare_digest_to_routerstatus_entry);
 }
 
 /*XXXX make this static once functions are moved into this file. */
@@ -815,7 +815,7 @@
                                   const char *digest, int *found_out)
 {
   return smartlist_bsearch_idx(ns->routerstatus_list, digest,
-                               _compare_digest_to_routerstatus_entry,
+                               compare_digest_to_routerstatus_entry,
                                found_out);
 }
 
@@ -868,7 +868,7 @@
   if (!current_consensus)
     return NULL;
   return smartlist_bsearch(current_consensus->routerstatus_list, digest,
-                           _compare_digest_to_routerstatus_entry);
+                           compare_digest_to_routerstatus_entry);
 }
 
 /** Given a nickname (possibly verbose, possibly a hexadecimal digest), return
@@ -947,7 +947,7 @@
       });
     if (any_unwarned) {
       log_warn(LD_CONFIG,"There are multiple matches for the nickname \"%s\","
-               " but none is listed as named by the directory authorites. "
+               " but none is listed as named by the directory authorities. "
                "Choosing one arbitrarily.", nickname);
     }
   } else if (warn_if_unnamed && best && !best->name_lookup_warned) {
@@ -1133,8 +1133,13 @@
       /* We want to cache the next one at some point after this one
        * is no longer fresh... */
       start = c->fresh_until + CONSENSUS_MIN_SECONDS_BEFORE_CACHING;
-      /* But only in the first half-interval after that. */
-      dl_interval = interval/2;
+      /* Some clients may need the consensus sooner than others. */
+      if (options->FetchDirInfoExtraEarly) {
+        dl_interval = 60;
+      } else {
+        /* But only in the first half-interval after that. */
+        dl_interval = interval/2;
+      }
     } else {
       /* We're an ordinary client or a bridge. Give all the caches enough
        * time to download the consensus. */
@@ -1154,7 +1159,7 @@
     }
     if (dl_interval < 1)
       dl_interval = 1;
-    /* We must not try to replace c while it's still the most valid: */
+    /* 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: */
     tor_assert(start+dl_interval < c->valid_until);
@@ -1822,7 +1827,7 @@
 networkstatus_getinfo_helper_single(routerstatus_t *rs)
 {
   char buf[RS_ENTRY_LEN+1];
-  routerstatus_format_entry(buf, sizeof(buf), rs, NULL, 0, 1);
+  routerstatus_format_entry(buf, sizeof(buf), rs, NULL, NS_CONTROL_PORT);
   return tor_strdup(buf);
 }
 

Modified: tor/trunk/src/or/ntmain.c
===================================================================
--- tor/trunk/src/or/ntmain.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/ntmain.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #define MAIN_PRIVATE
@@ -299,7 +299,7 @@
       case CMD_LIST_FINGERPRINT:
       case CMD_HASH_PASSWORD:
       case CMD_VERIFY_CONFIG:
-        log_err(LD_CONFIG, "Unsupported command (--list-fingerint, "
+        log_err(LD_CONFIG, "Unsupported command (--list-fingerprint, "
                 "--hash-password, or --verify-config) in NT service.");
         break;
       case CMD_RUN_UNITTESTS:

Modified: tor/trunk/src/or/onion.c
===================================================================
--- tor/trunk/src/or/onion.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/onion.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -75,7 +75,7 @@
     circ = ol_list->circ;
     onion_pending_remove(ol_list->circ);
     log_info(LD_CIRC,
-             "Circuit create request is too old; cancelling due to overload.");
+             "Circuit create request is too old; canceling due to overload.");
     circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_RESOURCELIMIT);
   }
   return 0;

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/or.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -20,10 +20,13 @@
 #ifndef INSTRUMENT_DOWNLOADS
 #define INSTRUMENT_DOWNLOADS 1
 #endif
-#ifndef ENABLE_GEOIP_STATS
-#define ENABLE_GEOIP_STATS 1
+#ifndef ENABLE_DIRREQ_STATS
+#define ENABLE_DIRREQ_STATS 1
 #endif
+#ifndef ENABLE_BUFFER_STATS
+#define ENABLE_BUFFER_STATS 1
 #endif
+#endif
 
 #ifdef MS_WINDOWS
 #define WIN32_WINNT 0x400
@@ -91,9 +94,8 @@
 #include "util.h"
 #include "torgzip.h"
 #include "address.h"
+#include "compat_libevent.h"
 
-#include <event.h>
-
 /* These signals are defined to help control_signal_act work.
  */
 #ifndef SIGHUP
@@ -136,7 +138,7 @@
 /** Maximum size, in bytes, for any directory object that we've downloaded. */
 #define MAX_DIR_DL_SIZE MAX_BUF_SIZE
 
-/** For http parsing: Maximum number of bytes we'll accept in the headers
+/** For HTTP parsing: Maximum number of bytes we'll accept in the headers
  * of an HTTP request or response. */
 #define MAX_HEADERS_SIZE 50000
 /** Maximum size, in bytes, for any directory object that we're accepting
@@ -263,7 +265,7 @@
 #define _OR_CONN_STATE_MAX 8
 
 #define _EXIT_CONN_STATE_MIN 1
-/** State for an exit connection: waiting for response from dns farm. */
+/** State for an exit connection: waiting for response from DNS farm. */
 #define EXIT_CONN_STATE_RESOLVING 1
 /** State for an exit connection: waiting for connect() to finish. */
 #define EXIT_CONN_STATE_CONNECTING 2
@@ -483,11 +485,16 @@
 #define CIRCUIT_PURPOSE_IS_ORIGIN(p) ((p)>_CIRCUIT_PURPOSE_OR_MAX)
 /** True iff the circuit purpose <b>p</b> is for a circuit that originated
  * here to serve as a client.  (Hidden services don't count here.) */
-#define CIRCUIT_PURPOSE_IS_CLIENT(p) \
+#define CIRCUIT_PURPOSE_IS_CLIENT(p)  \
   ((p)> _CIRCUIT_PURPOSE_OR_MAX &&    \
    (p)<=_CIRCUIT_PURPOSE_C_MAX)
 /** True iff the circuit_t <b>c</b> is actually an origin_circuit_t. */
 #define CIRCUIT_IS_ORIGIN(c) (CIRCUIT_PURPOSE_IS_ORIGIN((c)->purpose))
+/** True iff the circuit purpose <b>p</b> is for an established rendezvous
+ * circuit. */
+#define CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(p) \
+  ((p) == CIRCUIT_PURPOSE_C_REND_JOINED ||     \
+   (p) == CIRCUIT_PURPOSE_S_REND_JOINED)
 
 /** How many circuits do we want simultaneously in-progress to handle
  * a given stream? */
@@ -730,12 +737,6 @@
 
   /** Rendezvous cookie used by both, client and service. */
   char rend_cookie[REND_COOKIE_LEN];
-
-  /** Rendezvous descriptor version that is used by a service. Used to
-   * distinguish introduction and rendezvous points belonging to the same
-   * rendezvous service ID, but different descriptor versions.
-   */
-  uint8_t rend_desc_version;
 } rend_data_t;
 
 /** Time interval for tracking possible replays of INTRODUCE2 cells.
@@ -840,6 +841,9 @@
 typedef struct packed_cell_t {
   struct packed_cell_t *next; /**< Next cell queued on this circuit. */
   char body[CELL_NETWORK_SIZE]; /**< Cell as packed for network. */
+#ifdef ENABLE_BUFFER_STATS
+  struct timeval packed_timeval; /**< When was this cell packed? */
+#endif
 } packed_cell_t;
 
 /** A queue of cells on a circuit, waiting to be added to the
@@ -928,8 +932,8 @@
    * connection. */
   unsigned int linked_conn_is_closed:1;
 
-  int s; /**< Our socket; -1 if this connection is closed, or has no
-          * socket. */
+  /** Our socket; -1 if this connection is closed, or has no socket. */
+  evutil_socket_t s;
   int conn_array_index; /**< Index into the global connection array. */
   struct event *read_event; /**< Libevent event structure. */
   struct event *write_event; /**< Libevent event structure. */
@@ -943,7 +947,7 @@
                                  * could write? */
   time_t timestamp_created; /**< When was this connection_t created? */
 
-  /* XXXX_IP6 make this ipv6-capable */
+  /* XXXX_IP6 make this IPv6-capable */
   int socket_family; /**< Address family of this connection's socket.  Usually
                       * AF_INET, but it can also be AF_UNIX, or in the future
                       * AF_INET6 */
@@ -971,6 +975,10 @@
    * to the evdns_server_port is uses to listen to and answer connections. */
   struct evdns_server_port *dns_server_port;
 
+#ifdef ENABLE_DIRREQ_STATS
+  /** Unique ID for measuring tunneled network status requests. */
+  uint64_t dirreq_id;
+#endif
 } connection_t;
 
 /** Stores flags and information related to the portion of a v2 Tor OR
@@ -1093,7 +1101,7 @@
    * already retried several times. */
   uint8_t num_socks_retries;
 
-  /** True iff this connection is for a dns request only. */
+  /** True iff this connection is for a DNS request only. */
   unsigned int is_dns_request:1;
 
   /** True iff this stream must attach to a one-hop circuit (e.g. for
@@ -1146,7 +1154,7 @@
   /** If we're fetching descriptors, what router purpose shall we assign
    * to them? */
   uint8_t router_purpose;
-  /** List of fingerprints for networkstatuses or desriptors to be spooled. */
+  /** List of fingerprints for networkstatuses or descriptors to be spooled. */
   smartlist_t *fingerprint_stack;
   /** A cached_dir_t object that we're currently spooling out */
   struct cached_dir_t *cached_dir;
@@ -1169,12 +1177,6 @@
 
   uint32_t event_mask; /**< Bitfield: which events does this controller
                         * care about? */
-  unsigned int use_long_names:1; /**< True if we should use long nicknames
-                                  * on this (v1) connection. Only settable
-                                  * via v1 controllers. */
-  /** For control connections only. If set, we send extended info with control
-   * events as appropriate. */
-  unsigned int use_extended_events:1;
 
   /** True if we have sent a protocolinfo reply on this connection. */
   unsigned int have_sent_protocolinfo:1;
@@ -1253,9 +1255,9 @@
 /** A cached_dir_t represents a cacheable directory object, along with its
  * compressed form. */
 typedef struct cached_dir_t {
-  char *dir; /**< Contents of this object, nul-terminated. */
+  char *dir; /**< Contents of this object, NUL-terminated. */
   char *dir_z; /**< Compressed contents of this object. */
-  size_t dir_len; /**< Length of <b>dir</b> (not counting its nul). */
+  size_t dir_len; /**< Length of <b>dir</b> (not counting its NUL). */
   size_t dir_z_len; /**< Length of <b>dir_z</b>. */
   time_t published; /**< When was this object published. */
   int refcnt; /**< Reference count for this cached_dir_t. */
@@ -1312,7 +1314,7 @@
    * necessarily NUL-terminated.  If saved_location is SAVED_IN_CACHE, this
    * pointer is null. */
   char *signed_descriptor_body;
-  /** Length of the annotations preceeding the server descriptor. */
+  /** Length of the annotations preceding the server descriptor. */
   size_t annotations_len;
   /** Length of the server descriptor. */
   size_t signed_descriptor_len;
@@ -1507,7 +1509,10 @@
 
   unsigned int has_bandwidth:1; /**< The vote/consensus had bw info */
   unsigned int has_exitsummary:1; /**< The vote/consensus had exit summaries */
+  unsigned int has_measured_bw:1; /**< The vote/consensus had a measured bw */
 
+  uint32_t measured_bw; /**< Measured bandwidth (capacity) of the router */
+
   uint32_t bandwidth; /**< Bandwidth (capacity) of the router as reported in
                        * the vote/consensus, in kilobytes/sec. */
   char *exitsummary; /**< exit policy summary -
@@ -1619,7 +1624,7 @@
  * status consensus. */
 typedef struct networkstatus_t {
   networkstatus_type_t type; /**< Vote, consensus, or opinion? */
-  time_t published; /**< Vote only: Tiem when vote was written. */
+  time_t published; /**< Vote only: Time when vote was written. */
   time_t valid_after; /**< Time after which this vote or consensus applies. */
   time_t fresh_until; /**< Time before which this is the most recent vote or
                        * consensus. */
@@ -1634,7 +1639,7 @@
   /** How long does this vote/consensus claim that authorities take to
    * distribute their votes to one another? */
   int vote_seconds;
-  /** How long does this vote/consensus claim that authorites take to
+  /** How long does this vote/consensus claim that authorities take to
    * distribute their consensus signatures to one another? */
   int dist_seconds;
 
@@ -1915,7 +1920,7 @@
   /** The circuit_id used in the next (forward) hop of this circuit. */
   circid_t n_circ_id;
 
-  /** The hop to which we want to extend this ciruit.  Should be NULL if
+  /** The hop to which we want to extend this circuit.  Should be NULL if
    * the circuit has attached to a connection. */
   extend_info_t *n_hop;
 
@@ -1963,6 +1968,10 @@
    * linked to an OR connection. */
   struct circuit_t *prev_active_on_n_conn;
   struct circuit_t *next; /**< Next circuit in linked list of all circuits. */
+#ifdef ENABLE_DIRREQ_STATS
+  /** Unique ID for measuring tunneled network status requests. */
+  uint64_t dirreq_id;
+#endif
 } circuit_t;
 
 /** Largest number of relay_early cells that we can send on a given
@@ -2085,6 +2094,17 @@
 
   /** True iff this circuit was made with a CREATE_FAST cell. */
   unsigned int is_first_hop : 1;
+
+#ifdef ENABLE_BUFFER_STATS
+  /** Number of cells that were removed from circuit queue; reset every
+   * time when writing buffer stats to disk. */
+  uint32_t processed_cells;
+
+  /** Total time in milliseconds that cells spent in both app-ward and
+   * exit-ward queues of this circuit; reset every time when writing
+   * buffer stats to disk. */
+  uint64_t total_cell_waiting_time;
+#endif
 } or_circuit_t;
 
 /** Convert a circuit subtype to a circuit_t.*/
@@ -2180,7 +2200,7 @@
   config_line_t *DirPolicy; /**< Lists of dir policy components */
   /** Addresses to bind for listening for SOCKS connections. */
   config_line_t *SocksListenAddress;
-  /** Addresses to bind for listening for transparent pf/nefilter
+  /** Addresses to bind for listening for transparent pf/netfilter
    * connections. */
   config_line_t *TransListenAddress;
   /** Addresses to bind for listening for transparent natd connections */
@@ -2428,6 +2448,8 @@
                   * log whether it was DNS-leaking or not? */
   int HardwareAccel; /**< Boolean: Should we enable OpenSSL hardware
                       * acceleration where available? */
+  char *AccelName; /**< Optional hardware acceleration engine name. */
+  char *AccelDir; /**< Optional hardware acceleration engine search dir. */
   int UseEntryGuards; /**< Boolean: Do we try to enter from a smallish number
                        * of fixed nodes? */
   int NumEntryGuards; /**< How many entry guards do we try to establish? */
@@ -2438,6 +2460,9 @@
    * means directly from the authorities) no matter our other config? */
   int FetchDirInfoEarly;
 
+  /** Should we fetch our dir info at the start of the consensus period? */
+  int FetchDirInfoExtraEarly;
+
   char *VirtualAddrNetwork; /**< Address and mask to hand out for virtual
                              * MAPADDRESS requests. */
   int ServerDNSSearchDomains; /**< Boolean: If set, we don't force exit
@@ -2459,7 +2484,7 @@
   int ServerDNSAllowBrokenConfig;
 
   smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely
-                                        * should be resolveable. Used for
+                                        * should be resolvable. Used for
                                         * testing our DNS server. */
   int EnforceDistinctSubnets; /**< If true, don't allow multiple routers in the
                                * same network zone in the same circuit. */
@@ -2486,6 +2511,26 @@
    * exit allows it, we use it. */
   int AllowSingleHopCircuits;
 
+  /** If true, we convert "www.google.com.foo.exit" addresses on the
+   * socks/trans/natd ports into "www.google.com" addresses that
+   * exit from the node "foo". Disabled by default since attacking
+   * websites and exit relays can use it to manipulate your path
+   * selection. */
+  int AllowDotExit;
+
+  /** If true, the user wants us to collect statistics on clients
+   * requesting network statuses from us as directory. */
+  int DirReqStatistics;
+
+  /** If true, the user wants us to collect statistics on port usage. */
+  int ExitPortStatistics;
+
+  /** If true, the user wants us to collect cell statistics. */
+  int CellStatistics;
+
+  /** If true, the user wants us to collect statistics as entry node. */
+  int EntryStatistics;
+
   /** If true, do not believe anybody who tells us that a domain resolves
    * to an internal address, or that an internal address has a PTR mapping.
    * Helps avoid some cross-site attacks. */
@@ -2504,6 +2549,9 @@
    * migration purposes? */
   int V3AuthUseLegacyKey;
 
+  /** Location of bandwidth measurement file */
+  char *V3BandwidthsFile;
+
   /** The length of time that we think an initial consensus should be fresh.
    * Only altered on testing networks. */
   int TestingV3AuthInitialVotingInterval;
@@ -2540,8 +2588,8 @@
    * the bridge authority guess which countries have blocked access to us. */
   int BridgeRecordUsageByCountry;
 
-#ifdef ENABLE_GEOIP_STATS
-  /** If true, and Tor is built with GEOIP_STATS support, and we're a
+#if 0
+  /** If true, and Tor is built with DIRREQ_STATS support, and we're a
    * directory, record how many directory requests we get from each country. */
   int DirRecordUsageByCountry;
   /** Round all GeoIP results to the next multiple of this value, to avoid
@@ -2566,7 +2614,7 @@
 typedef struct {
   uint32_t _magic;
   /** The time at which we next plan to write the state to the disk.  Equal to
-   * TIME_MAX if there are no saveable changes, 0 if there are changes that
+   * TIME_MAX if there are no savable changes, 0 if there are changes that
    * should be saved right away. */
   time_t next_write;
 
@@ -2830,7 +2878,7 @@
 #define CIRCLAUNCH_ONEHOP_TUNNEL  (1<<0)
 /** Flag to set when a circuit needs to be built of high-uptime nodes */
 #define CIRCLAUNCH_NEED_UPTIME    (1<<1)
-/** Flag to set when a circuit needs to be build of high-capcity nodes */
+/** Flag to set when a circuit needs to be built of high-capacity nodes */
 #define CIRCLAUNCH_NEED_CAPACITY  (1<<2)
 /** Flag to set when the last hop of a circuit doesn't need to be an
  * exit node. */
@@ -2917,6 +2965,10 @@
 int getinfo_helper_config(control_connection_t *conn,
                           const char *question, char **answer);
 
+const char *tor_get_digests(void);
+uint32_t get_effective_bwrate(or_options_t *options);
+uint32_t get_effective_bwburst(or_options_t *options);
+
 #ifdef CONFIG_PRIVATE
 /* Used only by config.c and test.c */
 or_options_t *options_new(void);
@@ -2934,7 +2986,6 @@
 connection_t *connection_new(int type, int socket_family);
 
 void connection_link_connections(connection_t *conn_a, connection_t *conn_b);
-void connection_unregister_events(connection_t *conn);
 void connection_free(connection_t *conn);
 void connection_free_all(void);
 void connection_about_to_close_connection(connection_t *conn);
@@ -2991,8 +3042,7 @@
                                                    uint16_t port, int purpose);
 connection_t *connection_get_by_type_state(int type, int state);
 connection_t *connection_get_by_type_state_rendquery(int type, int state,
-                                                     const char *rendquery,
-                                                     int rendversion);
+                                                     const char *rendquery);
 
 #define connection_speaks_cells(conn) ((conn)->type == CONN_TYPE_OR)
 int connection_is_listener(connection_t *conn);
@@ -3096,7 +3146,7 @@
 typedef enum hostname_type_t {
   NORMAL_HOSTNAME, ONION_HOSTNAME, EXIT_HOSTNAME, BAD_HOSTNAME
 } hostname_type_t;
-hostname_type_t parse_extended_hostname(char *address);
+hostname_type_t parse_extended_hostname(char *address, int allowdotexit);
 
 #if defined(HAVE_NET_IF_H) && defined(HAVE_NET_PFVAR_H)
 int get_pf_socket(void);
@@ -3225,6 +3275,7 @@
 int control_event_or_conn_status(or_connection_t *conn,
                                  or_conn_status_event_t e, int reason);
 int control_event_bandwidth_used(uint32_t n_read, uint32_t n_written);
+int control_event_stream_bandwidth(edge_connection_t *edge_conn);
 int control_event_stream_bandwidth_used(void);
 void control_event_logmsg(int severity, unsigned int domain, const char *msg);
 int control_event_descriptors_changed(smartlist_t *routers);
@@ -3399,8 +3450,8 @@
  * Running Stable Unnamed V2Dir Valid\n". */
 #define MAX_FLAG_LINE_LEN 96
 /** Length of "w" line for weighting.  Currently at most
- * "w Bandwidth=<uint32t>\n" */
-#define MAX_WEIGHT_LINE_LEN (13+10)
+ * "w Bandwidth=<uint32t> Measured=<uint32t>\n" */
+#define MAX_WEIGHT_LINE_LEN (12+10+10+10+1)
 /** Maximum length of an exit policy summary line. */
 #define MAX_POLICY_LINE_LEN (3+MAX_EXITPOLICY_SUMMARY_LEN)
 /** Amount of space to allocate for each entry: r, s, and v lines. */
@@ -3432,8 +3483,6 @@
 enum was_router_added_t dirserv_add_descriptor(routerinfo_t *ri,
                                                const char **msg,
                                                const char *source);
-int getinfo_helper_dirserv_unregistered(control_connection_t *conn,
-                                        const char *question, char **answer);
 void dirserv_free_descriptors(void);
 void dirserv_set_router_is_running(routerinfo_t *router, time_t now);
 int list_server_status_v1(smartlist_t *routers, char **router_status_out,
@@ -3485,13 +3534,32 @@
 int dirserv_have_any_serverdesc(smartlist_t *fps, int spool_src);
 size_t dirserv_estimate_data_size(smartlist_t *fps, int is_serverdescs,
                                   int compressed);
+typedef enum {
+  NS_V2, NS_V3_CONSENSUS, NS_V3_VOTE, NS_CONTROL_PORT
+} routerstatus_format_type_t;
 int routerstatus_format_entry(char *buf, size_t buf_len,
                               routerstatus_t *rs, const char *platform,
-                              int first_line_only, int v2_format);
+                              routerstatus_format_type_t format);
 void dirserv_free_all(void);
 void cached_dir_decref(cached_dir_t *d);
 cached_dir_t *new_cached_dir(char *s, time_t published);
 
+#ifdef DIRSERV_PRIVATE
+typedef struct measured_bw_line_t {
+  char node_id[DIGEST_LEN];
+  char node_hex[MAX_HEX_NICKNAME_LEN+1];
+  long int bw;
+} measured_bw_line_t;
+
+int measured_bw_line_parse(measured_bw_line_t *out, const char *line);
+
+int measured_bw_line_apply(measured_bw_line_t *parsed_line,
+                           smartlist_t *routerstatuses);
+#endif
+
+int dirserv_read_measured_bandwidths(const char *from_file,
+                                     smartlist_t *routerstatuses);
+
 /********************************* dirvote.c ************************/
 
 /** Lowest allowable value for VoteSeconds. */
@@ -3577,6 +3645,7 @@
 void dns_launch_correctness_checks(void);
 int dns_seems_to_be_broken(void);
 void dns_reset_correctness_checks(void);
+void dump_dns_mem_usage(int severity);
 
 /********************************* dnsserv.c ************************/
 
@@ -3592,6 +3661,19 @@
 
 /********************************* geoip.c **************************/
 
+/** Round all GeoIP results to the next multiple of this value, to avoid
+ * leaking information. */
+#define DIR_RECORD_USAGE_GRANULARITY 8
+/** Time interval: Flush geoip data to disk this often. */
+#define DIR_RECORD_USAGE_RETAIN_IPS (24*60*60)
+/** How long do we have to have observed per-country request history before
+ * we are willing to talk about it? */
+#define DIR_RECORD_USAGE_MIN_OBSERVATION_TIME (24*60*60)
+
+/** Time interval: Flush geoip data to disk this often when measuring on an
+ * entry guard. */
+#define ENTRY_RECORD_USAGE_RETAIN_IPS (24*60*60)
+
 #ifdef GEOIP_PRIVATE
 int geoip_parse_entry(const char *line);
 #endif
@@ -3607,7 +3689,7 @@
  * the others, we're not.
  */
 typedef enum {
-  /** We've noticed a connection as a bridge relay. */
+  /** We've noticed a connection as a bridge relay or entry guard. */
   GEOIP_CLIENT_CONNECT = 0,
   /** We've served a networkstatus consensus as a directory server. */
   GEOIP_CLIENT_NETWORKSTATUS = 1,
@@ -3617,14 +3699,67 @@
 void geoip_note_client_seen(geoip_client_action_t action,
                             uint32_t addr, time_t now);
 void geoip_remove_old_clients(time_t cutoff);
+/** Indicates either a positive reply or a reason for rejectng a network
+ * status request that will be included in geoip statistics. */
+typedef enum {
+  /** Request is answered successfully. */
+  GEOIP_SUCCESS = 0,
+  /** V3 network status is not signed by a sufficient number of requested
+   * authorities. */
+  GEOIP_REJECT_NOT_ENOUGH_SIGS = 1,
+  /** Requested network status object is unavailable. */
+  GEOIP_REJECT_UNAVAILABLE = 2,
+  /** Requested network status not found. */
+  GEOIP_REJECT_NOT_FOUND = 3,
+  /** Network status has not been modified since If-Modified-Since time. */
+  GEOIP_REJECT_NOT_MODIFIED = 4,
+  /** Directory is busy. */
+  GEOIP_REJECT_BUSY = 5,
+} geoip_ns_response_t;
+#define GEOIP_NS_RESPONSE_NUM 6
+void geoip_note_ns_response(geoip_client_action_t action,
+                            geoip_ns_response_t response);
 time_t geoip_get_history_start(void);
 char *geoip_get_client_history(time_t now, geoip_client_action_t action);
 char *geoip_get_request_history(time_t now, geoip_client_action_t action);
 int getinfo_helper_geoip(control_connection_t *control_conn,
                          const char *question, char **answer);
 void geoip_free_all(void);
-void dump_geoip_stats(void);
 
+/** Directory requests that we are measuring can be either direct or
+ * tunneled. */
+typedef enum {
+  DIRREQ_DIRECT = 0,
+  DIRREQ_TUNNELED = 1,
+} dirreq_type_t;
+
+/** Possible states for either direct or tunneled directory requests that
+ * are relevant for determining network status download times. */
+typedef enum {
+  /** Found that the client requests a network status; applies to both
+   * direct and tunneled requests; initial state of a request that we are
+   * measuring. */
+  DIRREQ_IS_FOR_NETWORK_STATUS = 0,
+  /** Finished writing a network status to the directory connection;
+   * applies to both direct and tunneled requests; completes a direct
+   * request. */
+  DIRREQ_FLUSHING_DIR_CONN_FINISHED = 1,
+  /** END cell sent to circuit that initiated a tunneled request. */
+  DIRREQ_END_CELL_SENT = 2,
+  /** Flushed last cell from queue of the circuit that initiated a
+    * tunneled request to the outbuf of the OR connection. */
+  DIRREQ_CIRC_QUEUE_FLUSHED = 3,
+  /** Flushed last byte from buffer of the OR connection belonging to the
+    * circuit that initiated a tunneled request; completes a tunneled
+    * request. */
+  DIRREQ_OR_CONN_BUFFER_FLUSHED = 4
+} dirreq_state_t;
+
+void geoip_start_dirreq(uint64_t dirreq_id, size_t response_size,
+                        geoip_client_action_t action, dirreq_type_t type);
+void geoip_change_dirreq_state(uint64_t dirreq_id, dirreq_type_t type,
+                               dirreq_state_t new_state);
+
 /********************************* hibernate.c **********************/
 
 int accounting_parse_options(or_options_t *options, int validate_only);
@@ -3646,13 +3781,18 @@
 
 int connection_add(connection_t *conn);
 int connection_remove(connection_t *conn);
+void connection_unregister_events(connection_t *conn);
 int connection_in_array(connection_t *conn);
 void add_connection_to_closeable_list(connection_t *conn);
 int connection_is_on_closeable_list(connection_t *conn);
 
 smartlist_t *get_connection_array(void);
 
-void connection_watch_events(connection_t *conn, short events);
+typedef enum watchable_events {
+  READ_EVENT=0x02,
+  WRITE_EVENT=0x04
+} watchable_events_t;
+void connection_watch_events(connection_t *conn, watchable_events_t events);
 int connection_is_reading(connection_t *conn);
 void connection_stop_reading(connection_t *conn);
 void connection_start_reading(connection_t *conn);
@@ -3733,6 +3873,8 @@
                              v2_networkstatus_source_t source,
                              smartlist_t *requested_fingerprints);
 void networkstatus_v2_list_clean(time_t now);
+int compare_digest_to_routerstatus_entry(const void *_key,
+                                         const void **_member);
 routerstatus_t *networkstatus_v2_find_entry(networkstatus_v2_t *ns,
                                          const char *digest);
 routerstatus_t *networkstatus_vote_find_entry(networkstatus_t *ns,
@@ -3828,7 +3970,7 @@
 /********************************* policies.c ************************/
 
 /* (length of "accept 255.255.255.255/255.255.255.255:65535-65535\n" plus a
- * nul.)
+ * NUL.)
  */
 #define POLICY_BUF_LEN 52
 
@@ -3957,6 +4099,17 @@
 void rep_hist_dump_stats(time_t now, int severity);
 void rep_hist_note_bytes_read(size_t num_bytes, time_t when);
 void rep_hist_note_bytes_written(size_t num_bytes, time_t when);
+#ifdef ENABLE_EXIT_STATS
+void rep_hist_note_exit_bytes_read(uint16_t port, size_t num_bytes,
+                                   time_t now);
+void rep_hist_note_exit_bytes_written(uint16_t port, size_t num_bytes,
+                                      time_t now);
+void rep_hist_note_exit_stream_opened(uint16_t port, time_t now);
+#else
+#define rep_hist_note_exit_bytes_read(p,n,t) STMT_NIL
+#define rep_hist_note_exit_bytes_written(p,n,t) STMT_NIL
+#define rep_hist_note_exit_stream_opened(p,t) STMT_NIL
+#endif
 int rep_hist_bandwidth_assess(void);
 char *rep_hist_get_bandwidth_lines(int for_extrainfo);
 void rep_hist_update_state(or_state_t *state);
@@ -3965,7 +4118,7 @@
 
 void rep_hist_note_router_reachable(const char *id, time_t when);
 void rep_hist_note_router_unreachable(const char *id, time_t when);
-int rep_hist_record_mtbf_data(void);
+int rep_hist_record_mtbf_data(time_t now, int missing_means_down);
 int rep_hist_load_mtbf_data(time_t now);
 
 time_t rep_hist_downrate_old_runs(time_t now);
@@ -4008,13 +4161,18 @@
 void hs_usage_write_statistics_to_file(time_t now);
 void hs_usage_free_all(void);
 
+#ifdef ENABLE_BUFFER_STATS
+#define DUMP_BUFFER_STATS_INTERVAL (24*60*60)
+void add_circ_to_buffer_stats(circuit_t *circ, time_t end_of_interval);
+void dump_buffer_stats(void);
+#endif
+
 /********************************* rendclient.c ***************************/
 
 void rend_client_introcirc_has_opened(origin_circuit_t *circ);
 void rend_client_rendcirc_has_opened(origin_circuit_t *circ);
 int rend_client_introduction_acked(origin_circuit_t *circ, const char *request,
                                    size_t request_len);
-void rend_client_refetch_renddesc(const char *query);
 void rend_client_refetch_v2_renddesc(const rend_data_t *rend_query);
 int rend_client_remove_intro_point(extend_info_t *failed_intro,
                                    const rend_data_t *rend_query);
@@ -4022,7 +4180,7 @@
                                  size_t request_len);
 int rend_client_receive_rendezvous(origin_circuit_t *circ, const char *request,
                                    size_t request_len);
-void rend_client_desc_trynow(const char *query, int rend_version);
+void rend_client_desc_trynow(const char *query);
 
 extend_info_t *rend_client_get_random_intro(const rend_data_t *rend_query);
 
@@ -4089,10 +4247,6 @@
                              int command, size_t length, const char *payload);
 
 void rend_service_descriptor_free(rend_service_descriptor_t *desc);
-int rend_encode_service_descriptor(rend_service_descriptor_t *desc,
-                                   crypto_pk_env_t *key,
-                                   char **str_out,
-                                   size_t *len_out);
 rend_service_descriptor_t *rend_parse_service_descriptor(const char *str,
                                                          size_t len);
 int rend_get_service_id(crypto_pk_env_t *pk, char *out);
@@ -4406,7 +4560,8 @@
 void extrainfo_free(extrainfo_t *extrainfo);
 void routerlist_free(routerlist_t *rl);
 void dump_routerlist_mem_usage(int severity);
-void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old);
+void routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old,
+                       time_t now);
 void routerlist_free_all(void);
 void routerlist_reset_warnings(void);
 void router_set_status(const char *digest, int up);
@@ -4503,7 +4658,8 @@
 int routerset_contains_router(const routerset_t *set, routerinfo_t *ri);
 int routerset_contains_routerstatus(const routerset_t *set,
                                     routerstatus_t *rs);
-int routerset_contains_extendinfo(const routerset_t *set, extend_info_t *ei);
+int routerset_contains_extendinfo(const routerset_t *set,
+                                  const extend_info_t *ei);
 void routerset_get_all_routers(smartlist_t *out, const routerset_t *routerset,
                                int running_only);
 void routersets_get_disjunction(smartlist_t *target, const smartlist_t *source,
@@ -4583,6 +4739,7 @@
 void assert_addr_policy_ok(smartlist_t *t);
 void dump_distinct_digest_count(int severity);
 
+int compare_routerstatus_entries(const void **_a, const void **_b);
 networkstatus_v2_t *networkstatus_v2_parse_from_string(const char *s);
 networkstatus_t *networkstatus_parse_vote_from_string(const char *s,
                                                  const char **eos_out,

Modified: tor/trunk/src/or/policies.c
===================================================================
--- tor/trunk/src/or/policies.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/policies.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -40,7 +40,7 @@
     uint16_t prt_min; /**< Lowest port number to accept/reject. */
     uint16_t prt_max; /**< Highest port number to accept/reject. */
     uint64_t reject_count; /**< Number of IP-Addresses that are rejected to
-                                this portrange. */
+                                this port range. */
     int accepted:1; /** Has this port already been accepted */
 } policy_summary_item_t;
 
@@ -411,6 +411,7 @@
         memcpy(&newp, n, sizeof(newp));
         newp.prt_min = 1;
         newp.prt_max = 65535;
+        newp.is_canonical = 0;
         c = addr_policy_get_canonical_entry(&newp);
         SMARTLIST_REPLACE_CURRENT(*policy, n, c);
         addr_policy_free(n);
@@ -795,7 +796,7 @@
    * (accept/reject), A is a subset of B, and there is no other entry of
    * different type in between those two that intersects with A.
    *
-   * Anybody want to doublecheck the logic here? XXX
+   * Anybody want to double-check the logic here? XXX
    */
   for (i = 0; i < smartlist_len(dest)-1; ++i) {
     ap = smartlist_get(dest, i);
@@ -1136,8 +1137,8 @@
 }
 
 /** Create a string representing a summary for an exit policy.
- * The summary will either be an "accept" plus a comma-seperated list of port
- * ranges or a "reject" plus portranges, depending on which is shorter.
+ * The summary will either be an "accept" plus a comma-separated list of port
+ * ranges or a "reject" plus port-ranges, depending on which is shorter.
  *
  * If no exits are allowed at all then NULL is returned, if no ports
  * are blocked instead of "reject " we return "accept 1-65535" (this

Modified: tor/trunk/src/or/reasons.c
===================================================================
--- tor/trunk/src/or/reasons.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/reasons.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/or/relay.c
===================================================================
--- tor/trunk/src/or/relay.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/relay.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,13 +1,13 @@
 /* Copyright (c) 2001 Matej Pfajfar.
  * Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
  * \file relay.c
  * \brief Handle relay cell encryption/decryption, plus packaging and
- *    receiving from circuits, plus queueing on circuits.
+ *    receiving from circuits, plus queuing on circuits.
  **/
 
 #include "or.h"
@@ -208,6 +208,7 @@
       tor_assert(circ->purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED);
       tor_assert(splice->_base.purpose == CIRCUIT_PURPOSE_REND_ESTABLISHED);
       cell->circ_id = splice->p_circ_id;
+      cell->command = CELL_RELAY; /* can't be relay_early anyway */
       if ((reason = circuit_receive_relay_cell(cell, TO_CIRCUIT(splice),
                                                CELL_DIRECTION_IN)) < 0) {
         log_warn(LD_REND, "Error relaying cell across rendezvous; closing "
@@ -532,6 +533,14 @@
   log_debug(LD_OR,"delivering %d cell %s.", relay_command,
             cell_direction == CELL_DIRECTION_OUT ? "forward" : "backward");
 
+#ifdef ENABLE_DIRREQ_STATS
+  /* If we are sending an END cell and this circuit is used for a tunneled
+   * directory request, advance its state. */
+  if (relay_command == RELAY_COMMAND_END && circ->dirreq_id)
+    geoip_change_dirreq_state(circ->dirreq_id, DIRREQ_TUNNELED,
+                              DIRREQ_END_CELL_SENT);
+#endif
+
   if (cell_direction == CELL_DIRECTION_OUT && circ->n_conn) {
     /* if we're using relaybandwidthrate, this conn wants priority */
     circ->n_conn->client_used = approx_time();
@@ -541,11 +550,17 @@
     origin_circuit_t *origin_circ = TO_ORIGIN_CIRCUIT(circ);
     if (origin_circ->remaining_relay_early_cells > 0 &&
         (relay_command == RELAY_COMMAND_EXTEND ||
-         cpath_layer != origin_circ->cpath)) {
-      /* If we've got any relay_early cells left, and we're sending a relay
-       * cell or we're not talking to the first hop, use one of them.  Don't
-       * worry about the conn protocol version: append_cell_to_circuit_queue
-       * will fix it up. */
+         (cpath_layer != origin_circ->cpath &&
+          !CIRCUIT_PURPOSE_IS_ESTABLISHED_REND(circ->purpose)))) {
+      /* If we've got any relay_early cells left, and we're sending
+       * an extend cell or (we're not talking to the first hop and we're
+       * not talking to a rendezvous circuit), use one of them.
+       * Don't worry about the conn protocol version:
+       * append_cell_to_circuit_queue will fix it up. */
+      /* XXX For now, clients don't use RELAY_EARLY cells when sending
+       * relay cells on rendezvous circuits. See bug 1038. Eventually,
+       * we can take this behavior away in favor of having clients avoid
+       * rendezvous points running 0.2.1.3-alpha through 0.2.1.18. -RD */
       cell.command = CELL_RELAY_EARLY;
       --origin_circ->remaining_relay_early_cells;
       log_debug(LD_OR, "Sending a RELAY_EARLY cell; %d remaining.",
@@ -783,7 +798,7 @@
            "Edge got end (%s) before we're connected. Marking for close.",
        stream_end_reason_to_string(rh->length > 0 ? reason : -1));
   circuit_log_path(LOG_INFO,LD_APP,circ);
-  /* need to test because of detach_retriable*/
+  /* need to test because of detach_retriable */
   if (!conn->_base.marked_for_close)
     connection_mark_unattached_ap(conn, control_reason);
   return 0;
@@ -925,7 +940,7 @@
                                   2+answer_len));
     else
       ttl = -1;
-    if (answer_type == RESOLVED_TYPE_IPV4 && answer_len >= 4) {
+    if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) {
       uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2));
       if (get_options()->ClientDNSRejectInternalAddresses &&
           is_internal_IP(addr, 0)) {
@@ -947,7 +962,7 @@
                    cell->payload+RELAY_HEADER_SIZE+2, /*answer*/
                    ttl,
                    -1);
-    if (answer_type == RESOLVED_TYPE_IPV4) {
+    if (answer_type == RESOLVED_TYPE_IPV4 && answer_len == 4) {
       uint32_t addr = ntohl(get_uint32(cell->payload+RELAY_HEADER_SIZE+2));
       remap_event_helper(conn, addr);
     }
@@ -992,7 +1007,8 @@
   relay_header_unpack(&rh, cell->payload);
 //  log_fn(LOG_DEBUG,"command %d stream %d", rh.command, rh.stream_id);
   num_seen++;
-  log_debug(domain, "Now seen %d relay cells here.", num_seen);
+  log_debug(domain, "Now seen %d relay cells here (command %d, stream %d).",
+            num_seen, rh.command, rh.stream_id);
 
   if (rh.length > RELAY_PAYLOAD_SIZE) {
     log_fn(LOG_PROTOCOL_WARN, LD_PROTOCOL,
@@ -1031,6 +1047,18 @@
                "Begin cell for known stream. Dropping.");
         return 0;
       }
+#ifdef ENABLE_DIRREQ_STATS
+      if (rh.command == RELAY_COMMAND_BEGIN_DIR) {
+        /* Assign this circuit and its app-ward OR connection a unique ID,
+         * so that we can measure download times. The local edge and dir
+         * connection will be assigned the same ID when they are created
+         * and linked. */
+        static uint64_t next_id = 0;
+        circ->dirreq_id = ++next_id;
+        TO_CONN(TO_OR_CIRCUIT(circ)->p_conn)->dirreq_id = circ->dirreq_id;
+      }
+#endif
+
       return connection_exit_begin_conn(cell, circ);
     case RELAY_COMMAND_DATA:
       ++stats_n_data_cells_received;
@@ -1351,9 +1379,9 @@
     return;
   }
 
-  while (conn->deliver_window < STREAMWINDOW_START - STREAMWINDOW_INCREMENT) {
+  while (conn->deliver_window <= STREAMWINDOW_START - STREAMWINDOW_INCREMENT) {
     log_debug(conn->cpath_layer?LD_APP:LD_EXIT,
-              "Outbuf %d, Queueing stream sendme.",
+              "Outbuf %d, Queuing stream sendme.",
               (int)conn->_base.outbuf_flushlen);
     conn->deliver_window += STREAMWINDOW_INCREMENT;
     if (connection_edge_send_command(conn, RELAY_COMMAND_SENDME,
@@ -1465,9 +1493,9 @@
 {
 //  log_fn(LOG_INFO,"Considering: layer_hint is %s",
 //         layer_hint ? "defined" : "null");
-  while ((layer_hint ? layer_hint->deliver_window : circ->deliver_window) <
+  while ((layer_hint ? layer_hint->deliver_window : circ->deliver_window) <=
           CIRCWINDOW_START - CIRCWINDOW_INCREMENT) {
-    log_debug(LD_CIRC,"Queueing circuit sendme.");
+    log_debug(LD_CIRC,"Queuing circuit sendme.");
     if (layer_hint)
       layer_hint->deliver_window += CIRCWINDOW_INCREMENT;
     else
@@ -1592,7 +1620,13 @@
 void
 cell_queue_append_packed_copy(cell_queue_t *queue, const cell_t *cell)
 {
-  cell_queue_append(queue, packed_cell_copy(cell));
+  packed_cell_t *copy = packed_cell_copy(cell);
+#ifdef ENABLE_BUFFER_STATS
+  /* Remember the exact time when this cell was put in the queue. */
+  if (get_options()->CellStatistics)
+    tor_gettimeofday(&copy->packed_timeval);
+#endif
+  cell_queue_append(queue, copy);
 }
 
 /** Remove and free every cell in <b>queue</b>. */
@@ -1660,7 +1694,7 @@
 }
 
 /** Add <b>circ</b> to the list of circuits with pending cells on
- * <b>conn</b>.  No effect if <b>circ</b> is already unlinked. */
+ * <b>conn</b>.  No effect if <b>circ</b> is already linked. */
 void
 make_circuit_active_on_conn(circuit_t *circ, or_connection_t *conn)
 {
@@ -1686,7 +1720,7 @@
   assert_active_circuits_ok_paranoid(conn);
 }
 
-/** Remove <b>circ</b> to the list of circuits with pending cells on
+/** Remove <b>circ</b> from the list of circuits with pending cells on
  * <b>conn</b>.  No effect if <b>circ</b> is already unlinked. */
 void
 make_circuit_inactive_on_conn(circuit_t *circ, or_connection_t *conn)
@@ -1801,6 +1835,29 @@
     packed_cell_t *cell = cell_queue_pop(queue);
     tor_assert(*next_circ_on_conn_p(circ,conn));
 
+#ifdef ENABLE_BUFFER_STATS
+    /* Calculate the exact time that this cell has spent in the queue. */
+    if (get_options()->CellStatistics && !CIRCUIT_IS_ORIGIN(circ)) {
+      struct timeval flushed_from_queue;
+      uint32_t cell_waiting_time;
+      or_circuit_t *orcirc = TO_OR_CIRCUIT(circ);
+      tor_gettimeofday(&flushed_from_queue);
+      cell_waiting_time = (uint32_t)
+            tv_mdiff(&cell->packed_timeval, &flushed_from_queue);
+
+      orcirc->total_cell_waiting_time += cell_waiting_time;
+      orcirc->processed_cells++;
+    }
+#endif
+#ifdef ENABLE_DIRREQ_STATS
+    /* If we just flushed our queue and this circuit is used for a
+     * tunneled directory request, possibly advance its state. */
+    if (queue->n == 0 && TO_CONN(conn)->dirreq_id)
+      geoip_change_dirreq_state(TO_CONN(conn)->dirreq_id,
+                                DIRREQ_TUNNELED,
+                                DIRREQ_CIRC_QUEUE_FLUSHED);
+#endif
+
     connection_write_to_buf(cell->body, CELL_NETWORK_SIZE, TO_CONN(conn));
 
     packed_cell_free(cell);

Modified: tor/trunk/src/or/rendclient.c
===================================================================
--- tor/trunk/src/or/rendclient.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/rendclient.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -63,7 +63,7 @@
   rend_cache_entry_t *entry;
   crypt_path_t *cpath;
   off_t dh_offset;
-  crypto_pk_env_t *intro_key; /* either Bob's public key or an intro key. */
+  crypto_pk_env_t *intro_key = NULL;
 
   tor_assert(introcirc->_base.purpose == CIRCUIT_PURPOSE_C_INTRODUCING);
   tor_assert(rendcirc->_base.purpose == CIRCUIT_PURPOSE_C_REND_READY);
@@ -80,23 +80,21 @@
     goto err;
   }
 
-  /* first 20 bytes of payload are the hash of bob's pk */
-  if (entry->parsed->version == 0) { /* unversioned descriptor */
-    intro_key = entry->parsed->pk;
-  } else { /* versioned descriptor */
-    intro_key = NULL;
-    SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *,
-                      intro, {
-      if (!memcmp(introcirc->build_state->chosen_exit->identity_digest,
-                  intro->extend_info->identity_digest, DIGEST_LEN)) {
-        intro_key = intro->intro_key;
-        break;
-      }
-    });
-    if (!intro_key) {
-      log_warn(LD_BUG, "Internal error: could not find intro key.");
-      goto err;
+  /* first 20 bytes of payload are the hash of the intro key */
+  intro_key = NULL;
+  SMARTLIST_FOREACH(entry->parsed->intro_nodes, rend_intro_point_t *,
+                    intro, {
+    if (!memcmp(introcirc->build_state->chosen_exit->identity_digest,
+                intro->extend_info->identity_digest, DIGEST_LEN)) {
+      intro_key = intro->intro_key;
+      break;
     }
+  });
+  if (!intro_key) {
+    log_warn(LD_BUG, "Internal error: could not find intro key; we "
+             "only have a v2 rend desc with %d intro points.",
+             smartlist_len(entry->parsed->intro_nodes));
+    goto err;
   }
   if (crypto_pk_get_digest(intro_key, payload)<0) {
     log_warn(LD_BUG, "Internal error: couldn't hash public key.");
@@ -451,33 +449,10 @@
   return 1;
 }
 
-/** If we are not currently fetching a rendezvous service descriptor
- * for the service ID <b>query</b>, start a directory connection to fetch a
- * new one.
- */
+/** Unless we already have a descriptor for <b>rend_query</b> with at least
+ * one (possibly) working introduction point in it, start a connection to a
+ * hidden service directory to fetch a v2 rendezvous service descriptor. */
 void
-rend_client_refetch_renddesc(const char *query)
-{
-  if (!get_options()->FetchHidServDescriptors)
-    return;
-  log_info(LD_REND, "Fetching rendezvous descriptor for service %s",
-           escaped_safe_str(query));
-  if (connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query, 0)) {
-    log_info(LD_REND,"Would fetch a new renddesc here (for %s), but one is "
-             "already in progress.", escaped_safe_str(query));
-  } else {
-    /* not one already; initiate a dir rend desc lookup */
-    directory_get_from_dirserver(DIR_PURPOSE_FETCH_RENDDESC,
-                                 ROUTER_PURPOSE_GENERAL, query,
-                                 PDS_RETRY_IF_NO_SERVERS);
-  }
-}
-
-/** Start a connection to a hidden service directory to fetch a v2
- * rendezvous service descriptor for the base32-encoded service ID
- * <b>query</b>.
- */
-void
 rend_client_refetch_v2_renddesc(const rend_data_t *rend_query)
 {
   char descriptor_id[DIGEST_LEN];
@@ -524,8 +499,8 @@
   log_info(LD_REND, "Could not pick one of the responsible hidden "
                     "service directories to fetch descriptors, because "
                     "we already tried them all unsuccessfully.");
-  /* Close pending connections (unless a v0 request is still going on). */
-  rend_client_desc_trynow(rend_query->onion_address, 2);
+  /* Close pending connections. */
+  rend_client_desc_trynow(rend_query->onion_address);
   return;
 }
 
@@ -552,12 +527,7 @@
   if (r==0) {
     log_info(LD_REND, "Unknown service %s. Re-fetching descriptor.",
              escaped_safe_str(rend_query->onion_address));
-    /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
-     * arrives first. Exception: When using client authorization, only
-     * fetch v2 descriptors.*/
     rend_client_refetch_v2_renddesc(rend_query);
-    if (rend_query->auth_type == REND_NO_AUTH)
-      rend_client_refetch_renddesc(rend_query->onion_address);
     return 0;
   }
 
@@ -575,17 +545,12 @@
     log_info(LD_REND,
              "No more intro points remain for %s. Re-fetching descriptor.",
              escaped_safe_str(rend_query->onion_address));
-    /* Fetch both, v0 and v2 rend descriptors in parallel. Use whichever
-     * arrives first. Exception: When using client authorization, only
-     * fetch v2 descriptors.*/
     rend_client_refetch_v2_renddesc(rend_query);
-    if (rend_query->auth_type == REND_NO_AUTH)
-      rend_client_refetch_renddesc(rend_query->onion_address);
 
     /* move all pending streams back to renddesc_wait */
     while ((conn = connection_get_by_type_state_rendquery(CONN_TYPE_AP,
                                    AP_CONN_STATE_CIRCUIT_WAIT,
-                                   rend_query->onion_address, -1))) {
+                                   rend_query->onion_address))) {
       conn->state = AP_CONN_STATE_RENDDESC_WAIT;
     }
 
@@ -694,24 +659,18 @@
   return -1;
 }
 
-/** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that
- * are waiting on query. If there's a working cache entry here
- * with at least one intro point, move them to the next state. If
- * <b>rend_version</b> is non-negative, fail connections that have
- * requested <b>query</b> unless there are still descriptor fetch
- * requests in progress for other descriptor versions than
- * <b>rend_version</b>.
- */
+/** Find all the apconns in state AP_CONN_STATE_RENDDESC_WAIT that are
+ * waiting on <b>query</b>. If there's a working cache entry here with at
+ * least one intro point, move them to the next state. */
 void
-rend_client_desc_trynow(const char *query, int rend_version)
+rend_client_desc_trynow(const char *query)
 {
   edge_connection_t *conn;
   rend_cache_entry_t *entry;
   time_t now = time(NULL);
 
   smartlist_t *conns = get_connection_array();
-  SMARTLIST_FOREACH(conns, connection_t *, _conn,
-  {
+  SMARTLIST_FOREACH_BEGIN(conns, connection_t *, _conn) {
     if (_conn->type != CONN_TYPE_AP ||
         _conn->state != AP_CONN_STATE_RENDDESC_WAIT ||
         _conn->marked_for_close)
@@ -743,17 +702,11 @@
           connection_mark_unattached_ap(conn, END_STREAM_REASON_CANT_ATTACH);
       }
     } else { /* 404, or fetch didn't get that far */
-      /* Unless there are requests for another descriptor version pending,
-       * close the connection. */
-      if (rend_version >= 0 &&
-          !connection_get_by_type_state_rendquery(CONN_TYPE_DIR, 0, query,
-                                                  rend_version == 0 ? 2 : 0)) {
-        log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
-                   "unavailable (try again later).", safe_str(query));
-        connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
-      }
+      log_notice(LD_REND,"Closing stream for '%s.onion': hidden service is "
+                 "unavailable (try again later).", safe_str(query));
+      connection_mark_unattached_ap(conn, END_STREAM_REASON_RESOLVEFAILED);
     }
-  });
+  } SMARTLIST_FOREACH_END(_conn);
 }
 
 /** Return a newly allocated extend_info_t* for a randomly chosen introduction

Modified: tor/trunk/src/or/rendcommon.c
===================================================================
--- tor/trunk/src/or/rendcommon.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/rendcommon.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -655,61 +655,6 @@
   return seconds_valid;
 }
 
-/** Encode a service descriptor for <b>desc</b>, and sign it with
- * <b>key</b>. Store the descriptor in *<b>str_out</b>, and set
- * *<b>len_out</b> to its length.
- */
-int
-rend_encode_service_descriptor(rend_service_descriptor_t *desc,
-                               crypto_pk_env_t *key,
-                               char **str_out, size_t *len_out)
-{
-  char *cp;
-  char *end;
-  int i, r;
-  size_t asn1len;
-  size_t buflen =
-         PK_BYTES*2*(smartlist_len(desc->intro_nodes)+2);/*Too long, but ok*/
-  cp = *str_out = tor_malloc(buflen);
-  end = cp + PK_BYTES*2*(smartlist_len(desc->intro_nodes)+1);
-  r = crypto_pk_asn1_encode(desc->pk, cp+2, end-(cp+2));
-  if (r < 0) {
-    tor_free(*str_out);
-    return -1;
-  }
-  asn1len = r;
-  set_uint16(cp, htons((uint16_t)asn1len));
-  cp += 2+asn1len;
-  set_uint32(cp, htonl((uint32_t)desc->timestamp));
-  cp += 4;
-  set_uint16(cp, htons((uint16_t)smartlist_len(desc->intro_nodes)));
-  cp += 2;
-  for (i=0; i < smartlist_len(desc->intro_nodes); ++i) {
-    rend_intro_point_t *intro = smartlist_get(desc->intro_nodes, i);
-    char ipoint[HEX_DIGEST_LEN+2];
-    const size_t ipoint_len = HEX_DIGEST_LEN+1;
-    ipoint[0] = '$';
-    base16_encode(ipoint+1, HEX_DIGEST_LEN+1,
-                  intro->extend_info->identity_digest,
-                  DIGEST_LEN);
-    tor_assert(strlen(ipoint) == ipoint_len);
-    /* Assert that appending ipoint and its NUL won't over overrun the
-     * buffer. */
-    tor_assert(cp + ipoint_len+1 < *str_out + buflen);
-    memcpy(cp, ipoint, ipoint_len+1);
-    cp += ipoint_len+1;
-  }
-  note_crypto_pk_op(REND_SERVER);
-  r = crypto_pk_private_sign_digest(key, cp, *str_out, cp-*str_out);
-  if (r<0) {
-    tor_free(*str_out);
-    return -1;
-  }
-  cp += r;
-  *len_out = (size_t)(cp-*str_out);
-  return 0;
-}
-
 /** Parse a service descriptor at <b>str</b> (<b>len</b> bytes).  On
  * success, return a newly alloced service_descriptor_t.  On failure,
  * return NULL.
@@ -966,6 +911,11 @@
   }
   if (!*e)
     return 0;
+  tor_assert((*e)->parsed && (*e)->parsed->intro_nodes);
+  /* XXX022 hack for now, to return "not found" if there are no intro
+   * points remaining. See bug 997. */
+  if (smartlist_len((*e)->parsed->intro_nodes) == 0)
+    return 0;
   return 1;
 }
 

Modified: tor/trunk/src/or/rendmid.c
===================================================================
--- tor/trunk/src/or/rendmid.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/rendmid.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**

Modified: tor/trunk/src/or/rendservice.c
===================================================================
--- tor/trunk/src/or/rendservice.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/rendservice.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -10,8 +10,7 @@
 #include "or.h"
 
 static origin_circuit_t *find_intro_circuit(rend_intro_point_t *intro,
-                                            const char *pk_digest,
-                                            int desc_version);
+                                            const char *pk_digest);
 
 /** Represents the mapping from a virtual port of a rendezvous service to
  * a real port on some IP.
@@ -42,13 +41,11 @@
   /* Fields specified in config file */
   char *directory; /**< where in the filesystem it stores it */
   smartlist_t *ports; /**< List of rend_service_port_config_t */
-  int descriptor_version; /**< Rendezvous descriptor version that will be
-                           * published. */
   rend_auth_type_t auth_type; /**< Client authorization type or 0 if no client
                                * authorization is performed. */
   smartlist_t *clients; /**< List of rend_authorized_client_t's of
                          * clients that may access our service. Can be NULL
-                         * if no client authorization is peformed. */
+                         * if no client authorization is performed. */
   /* Other fields */
   crypto_pk_env_t *private_key; /**< Permanent hidden-service key. */
   char service_id[REND_SERVICE_ID_LEN_BASE32+1]; /**< Onion address without
@@ -58,7 +55,7 @@
                              * or are trying to establish. */
   time_t intro_period_started; /**< Start of the current period to build
                                 * introduction points. */
-  int n_intro_circuits_launched; /**< count of intro circuits we have
+  int n_intro_circuits_launched; /**< Count of intro circuits we have
                                   * established in this period. */
   rend_service_descriptor_t *desc; /**< Current hidden service descriptor. */
   time_t desc_is_dirty; /**< Time at which changes to the hidden service
@@ -66,7 +63,7 @@
                          * up-to-date. */
   time_t next_upload_time; /**< Scheduled next hidden service descriptor
                             * upload time. */
-  /** Map from digests of diffie-hellman values INTRODUCE2 to time_t of when
+  /** Map from digests of Diffie-Hellman values INTRODUCE2 to time_t of when
    * they were received; used to prevent replays. */
   digestmap_t *accepted_intros;
   /** Time at which we last removed expired values from accepted_intros. */
@@ -156,36 +153,6 @@
 
   service->intro_nodes = smartlist_create();
 
-  /* If the service is configured to publish unversioned (v0) and versioned
-   * descriptors (v2 or higher), split it up into two separate services
-   * (unless it is configured to perform client authorization). */
-  if (service->descriptor_version == -1) {
-    if (service->auth_type == REND_NO_AUTH) {
-      rend_service_t *v0_service = tor_malloc_zero(sizeof(rend_service_t));
-      v0_service->directory = tor_strdup(service->directory);
-      v0_service->ports = smartlist_create();
-      SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p, {
-        rend_service_port_config_t *copy =
-          tor_malloc_zero(sizeof(rend_service_port_config_t));
-        memcpy(copy, p, sizeof(rend_service_port_config_t));
-        smartlist_add(v0_service->ports, copy);
-      });
-      v0_service->intro_period_started = service->intro_period_started;
-      v0_service->descriptor_version = 0; /* Unversioned descriptor. */
-      v0_service->auth_type = REND_NO_AUTH;
-      rend_add_service(v0_service);
-    }
-
-    service->descriptor_version = 2; /* Versioned descriptor. */
-  }
-
-  if (service->auth_type != REND_NO_AUTH && !service->descriptor_version) {
-    log_warn(LD_CONFIG, "Hidden service with client authorization and "
-                        "version 0 descriptors configured; ignoring.");
-    rend_service_free(service);
-    return;
-  }
-
   if (service->auth_type != REND_NO_AUTH &&
       smartlist_len(service->clients) == 0) {
     log_warn(LD_CONFIG, "Hidden service with client authorization but no "
@@ -307,7 +274,6 @@
       service->directory = tor_strdup(line->value);
       service->ports = smartlist_create();
       service->intro_period_started = time(NULL);
-      service->descriptor_version = -1; /**< All descriptor versions. */
       continue;
     }
     if (!service) {
@@ -433,35 +399,13 @@
         return -1;
       }
     } else {
-      smartlist_t *versions;
-      char *version_str;
-      int i, version, ver_ok=1, versions_bitmask = 0;
       tor_assert(!strcasecmp(line->key, "HiddenServiceVersion"));
-      versions = smartlist_create();
-      smartlist_split_string(versions, line->value, ",",
-                             SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 0);
-      for (i = 0; i < smartlist_len(versions); i++) {
-        version_str = smartlist_get(versions, i);
-        if (strlen(version_str) != 1 || strspn(version_str, "02") != 1) {
-          log_warn(LD_CONFIG,
-                   "HiddenServiceVersion can only be 0 and/or 2.");
-          SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp));
-          smartlist_free(versions);
-          rend_service_free(service);
-          return -1;
-        }
-        version = (int)tor_parse_long(version_str, 10, 0, INT_MAX, &ver_ok,
-                                      NULL);
-        if (!ver_ok)
-          continue;
-        versions_bitmask |= 1 << version;
+      if (strcmp(line->value, "2")) {
+        log_warn(LD_CONFIG,
+                 "The only supported HiddenServiceVersion is 2.");
+        rend_service_free(service);
+        return -1;
       }
-      /* If exactly one version is set, change descriptor_version to that
-       * value; otherwise leave it at -1. */
-      if (versions_bitmask == 1 << 0) service->descriptor_version = 0;
-      if (versions_bitmask == 1 << 2) service->descriptor_version = 2;
-      SMARTLIST_FOREACH(versions, char *, cp, tor_free(cp));
-      smartlist_free(versions);
     }
   }
   if (service) {
@@ -483,8 +427,7 @@
      * probably ok? */
     SMARTLIST_FOREACH(rend_service_list, rend_service_t *, new, {
       SMARTLIST_FOREACH(old_service_list, rend_service_t *, old, {
-        if (!strcmp(old->directory, new->directory) &&
-            old->descriptor_version == new->descriptor_version) {
+        if (!strcmp(old->directory, new->directory)) {
           smartlist_add_all(new->intro_nodes, old->intro_nodes);
           smartlist_clear(old->intro_nodes);
           smartlist_add(surviving_services, old);
@@ -507,18 +450,16 @@
         tor_assert(oc->rend_data);
         SMARTLIST_FOREACH(surviving_services, rend_service_t *, ptr, {
           if (!memcmp(ptr->pk_digest, oc->rend_data->rend_pk_digest,
-                      DIGEST_LEN) &&
-              ptr->descriptor_version == oc->rend_data->rend_desc_version) {
+                      DIGEST_LEN)) {
             keep_it = 1;
             break;
           }
         });
         if (keep_it)
           continue;
-        log_info(LD_REND, "Closing intro point %s for service %s version %d.",
+        log_info(LD_REND, "Closing intro point %s for service %s.",
                  safe_str(oc->build_state->chosen_exit->nickname),
-                 oc->rend_data->onion_address,
-                 oc->rend_data->rend_desc_version);
+                 oc->rend_data->onion_address);
         circuit_mark_for_close(circ, END_CIRC_REASON_FINISHED);
         /* XXXX Is there another reason we should use here? */
       }
@@ -548,7 +489,6 @@
   d = service->desc = tor_malloc_zero(sizeof(rend_service_descriptor_t));
   d->pk = crypto_pk_dup_key(service->private_key);
   d->timestamp = time(NULL);
-  d->version = service->descriptor_version;
   d->intro_nodes = smartlist_create();
   /* Support intro protocols 2 and 3. */
   d->protocols = (1 << 2) + (1 << 3);
@@ -556,7 +496,7 @@
   for (i = 0; i < smartlist_len(service->intro_nodes); ++i) {
     rend_intro_point_t *intro_svc = smartlist_get(service->intro_nodes, i);
     rend_intro_point_t *intro_desc;
-    circ = find_intro_circuit(intro_svc, service->pk_digest, d->version);
+    circ = find_intro_circuit(intro_svc, service->pk_digest);
     if (!circ || circ->_base.purpose != CIRCUIT_PURPOSE_S_INTRO)
       continue;
 
@@ -797,17 +737,15 @@
   return r;
 }
 
-/** Return the service whose public key has a digest of <b>digest</b> and
- * which publishes the given descriptor <b>version</b>.  Return NULL if no
- * such service exists.
+/** Return the service whose public key has a digest of <b>digest</b>, or
+ * NULL if no such service exists.
  */
 static rend_service_t *
-rend_service_get_by_pk_digest_and_version(const char* digest,
-                                          uint8_t version)
+rend_service_get_by_pk_digest(const char* digest)
 {
   SMARTLIST_FOREACH(rend_service_list, rend_service_t*, s,
-                    if (!memcmp(s->pk_digest,digest,DIGEST_LEN) &&
-                        s->descriptor_version == version) return s);
+                    if (!memcmp(s->pk_digest,digest,DIGEST_LEN))
+                        return s);
   return NULL;
 }
 
@@ -944,21 +882,16 @@
   }
 
   /* look up service depending on circuit. */
-  service = rend_service_get_by_pk_digest_and_version(
-              circuit->rend_data->rend_pk_digest,
-              circuit->rend_data->rend_desc_version);
+  service = rend_service_get_by_pk_digest(
+                circuit->rend_data->rend_pk_digest);
   if (!service) {
     log_warn(LD_REND, "Got an INTRODUCE2 cell for an unrecognized service %s.",
              escaped(serviceid));
     return -1;
   }
 
-  /* if descriptor version is 2, use intro key instead of service key. */
-  if (circuit->rend_data->rend_desc_version == 0) {
-    intro_key = service->private_key;
-  } else {
-    intro_key = circuit->intro_key;
-  }
+  /* use intro key instead of service key. */
+  intro_key = circuit->intro_key;
 
   /* first DIGEST_LEN bytes of request is intro or service pk digest */
   crypto_pk_get_digest(intro_key, intro_key_digest);
@@ -1201,7 +1134,6 @@
   memcpy(launched->rend_data->rend_cookie, r_cookie, REND_COOKIE_LEN);
   strlcpy(launched->rend_data->onion_address, service->service_id,
           sizeof(launched->rend_data->onion_address));
-  launched->rend_data->rend_desc_version = service->descriptor_version;
   launched->build_state->pending_final_cpath = cpath =
     tor_malloc_zero(sizeof(crypt_path_t));
   cpath->magic = CRYPT_PATH_MAGIC;
@@ -1323,18 +1255,16 @@
   strlcpy(launched->rend_data->onion_address, service->service_id,
           sizeof(launched->rend_data->onion_address));
   memcpy(launched->rend_data->rend_pk_digest, service->pk_digest, DIGEST_LEN);
-  launched->rend_data->rend_desc_version = service->descriptor_version;
-  if (service->descriptor_version == 2)
-    launched->intro_key = crypto_pk_dup_key(intro->intro_key);
+  launched->intro_key = crypto_pk_dup_key(intro->intro_key);
   if (launched->_base.state == CIRCUIT_STATE_OPEN)
     rend_service_intro_has_opened(launched);
   return 0;
 }
 
 /** Return the number of introduction points that are or have been
- * established for the given service address and rendezvous version. */
+ * established for the given service address in <b>query</b>. */
 static int
-count_established_intro_points(const char *query, int rend_version)
+count_established_intro_points(const char *query)
 {
   int num_ipos = 0;
   circuit_t *circ;
@@ -1345,7 +1275,6 @@
          circ->purpose == CIRCUIT_PURPOSE_S_INTRO)) {
       origin_circuit_t *oc = TO_ORIGIN_CIRCUIT(circ);
       if (oc->rend_data &&
-          oc->rend_data->rend_desc_version == rend_version &&
           !rend_cmp_service_ids(query, oc->rend_data->onion_address))
         num_ipos++;
     }
@@ -1375,9 +1304,8 @@
   base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1,
                 circuit->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN);
 
-  service = rend_service_get_by_pk_digest_and_version(
-              circuit->rend_data->rend_pk_digest,
-              circuit->rend_data->rend_desc_version);
+  service = rend_service_get_by_pk_digest(
+                circuit->rend_data->rend_pk_digest);
   if (!service) {
     log_warn(LD_REND, "Unrecognized service ID %s on introduction circuit %d.",
              serviceid, circuit->_base.n_circ_id);
@@ -1387,8 +1315,7 @@
 
   /* If we already have enough introduction circuits for this service,
    * redefine this one as a general circuit. */
-  if (count_established_intro_points(serviceid,
-          circuit->rend_data->rend_desc_version) > NUM_INTRO_POINTS) {
+  if (count_established_intro_points(serviceid) > NUM_INTRO_POINTS) {
     log_info(LD_CIRC|LD_REND, "We have just finished an introduction "
              "circuit, but we already have enough. Redefining purpose to "
              "general.");
@@ -1401,13 +1328,8 @@
            "Established circuit %d as introduction point for service %s",
            circuit->_base.n_circ_id, serviceid);
 
-  /* If the introduction point will not be used in an unversioned
-   * descriptor, use the intro key instead of the service key in
-   * ESTABLISH_INTRO. */
-  if (service->descriptor_version == 0)
-    intro_key = service->private_key;
-  else
-    intro_key = circuit->intro_key;
+  /* Use the intro key instead of the service key in ESTABLISH_INTRO. */
+  intro_key = circuit->intro_key;
   /* Build the payload for a RELAY_ESTABLISH_INTRO cell. */
   r = crypto_pk_asn1_encode(intro_key, buf+2,
                             RELAY_PAYLOAD_SIZE-2);
@@ -1466,9 +1388,8 @@
     goto err;
   }
   tor_assert(circuit->rend_data);
-  service = rend_service_get_by_pk_digest_and_version(
-              circuit->rend_data->rend_pk_digest,
-              circuit->rend_data->rend_desc_version);
+  service = rend_service_get_by_pk_digest(
+                circuit->rend_data->rend_pk_digest);
   if (!service) {
     log_warn(LD_REND, "Unknown service on introduction circuit %d.",
              circuit->_base.n_circ_id);
@@ -1518,9 +1439,8 @@
            "cookie %s for service %s",
            circuit->_base.n_circ_id, hexcookie, serviceid);
 
-  service = rend_service_get_by_pk_digest_and_version(
-              circuit->rend_data->rend_pk_digest,
-              circuit->rend_data->rend_desc_version);
+  service = rend_service_get_by_pk_digest(
+                circuit->rend_data->rend_pk_digest);
   if (!service) {
     log_warn(LD_GENERAL, "Internal error: unrecognized service ID on "
              "introduction circuit.");
@@ -1576,13 +1496,12 @@
  */
 
 /** Return the (possibly non-open) introduction circuit ending at
- * <b>intro</b> for the service whose public key is <b>pk_digest</b> and
- * which publishes descriptor of version <b>desc_version</b>.  Return
- * NULL if no such service is found.
+ * <b>intro</b> for the service whose public key is <b>pk_digest</b>.
+ * (<b>desc_version</b> is ignored). Return NULL if no such service is
+ * found.
  */
 static origin_circuit_t *
-find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest,
-                   int desc_version)
+find_intro_circuit(rend_intro_point_t *intro, const char *pk_digest)
 {
   origin_circuit_t *circ = NULL;
 
@@ -1591,8 +1510,7 @@
                                                   CIRCUIT_PURPOSE_S_INTRO))) {
     if (!memcmp(circ->build_state->chosen_exit->identity_digest,
                 intro->extend_info->identity_digest, DIGEST_LEN) &&
-        circ->rend_data &&
-        circ->rend_data->rend_desc_version == desc_version) {
+        circ->rend_data) {
       return circ;
     }
   }
@@ -1602,8 +1520,7 @@
                                         CIRCUIT_PURPOSE_S_ESTABLISH_INTRO))) {
     if (!memcmp(circ->build_state->chosen_exit->identity_digest,
                 intro->extend_info->identity_digest, DIGEST_LEN) &&
-        circ->rend_data &&
-        circ->rend_data->rend_desc_version == desc_version) {
+        circ->rend_data) {
       return circ;
     }
   }
@@ -1644,7 +1561,7 @@
       if (!router_get_by_digest(hs_dir->identity_digest)) {
         log_info(LD_REND, "Not sending publish request for v2 descriptor to "
                           "hidden service directory '%s'; we don't have its "
-                          "router descriptor. Queueing for later upload.",
+                          "router descriptor. Queuing for later upload.",
                  hs_dir->nickname);
         failed_upload = -1;
         continue;
@@ -1695,9 +1612,8 @@
   smartlist_free(successful_uploads);
 }
 
-/** Encode and sign up-to-date v0 and/or v2 service descriptors for
- * <b>service</b>, and upload it/them to all the dirservers/to the
- * responsible hidden service directories.
+/** Encode and sign an up-to-date service descriptor for <b>service</b>,
+ * and upload it/them to the responsible hidden service directories.
  */
 static void
 upload_service_descriptor(rend_service_t *service)
@@ -1709,35 +1625,8 @@
 
   rendpostperiod = get_options()->RendPostPeriod;
 
-  /* Upload unversioned (v0) descriptor? */
-  if (service->descriptor_version == 0 &&
-      get_options()->PublishHidServDescriptors) {
-    char *desc;
-    size_t desc_len;
-    /* Encode the descriptor. */
-    if (rend_encode_service_descriptor(service->desc,
-                                       service->private_key,
-                                       &desc, &desc_len)<0) {
-      log_warn(LD_BUG, "Internal error: couldn't encode service descriptor; "
-               "not uploading.");
-      return;
-    }
-
-    /* Post it to the dirservers */
-    rend_get_service_id(service->desc->pk, serviceid);
-    log_info(LD_REND, "Sending publish request for hidden service %s",
-             serviceid);
-    directory_post_to_dirservers(DIR_PURPOSE_UPLOAD_RENDDESC,
-                                 ROUTER_PURPOSE_GENERAL,
-                                 HIDSERV_AUTHORITY, desc, desc_len, 0);
-    tor_free(desc);
-    service->next_upload_time = now + rendpostperiod;
-    uploaded = 1;
-  }
-
-  /* Upload v2 descriptor? */
-  if (service->descriptor_version == 2 &&
-      get_options()->PublishHidServDescriptors) {
+  /* Upload descriptor? */
+  if (get_options()->PublishHidServDescriptors) {
     networkstatus_t *c = networkstatus_get_latest_consensus();
     if (c && smartlist_len(c->routerstatus_list) > 0) {
       int seconds_valid, i, j, num_descs;
@@ -1876,8 +1765,7 @@
     for (j=0; j < smartlist_len(service->intro_nodes); ++j) {
       intro = smartlist_get(service->intro_nodes, j);
       router = router_get_by_digest(intro->extend_info->identity_digest);
-      if (!router || !find_intro_circuit(intro, service->pk_digest,
-                                         service->descriptor_version)) {
+      if (!router || !find_intro_circuit(intro, service->pk_digest)) {
         log_info(LD_REND,"Giving up on %s as intro point for %s.",
                  intro->extend_info->nickname, service->service_id);
         if (service->desc) {
@@ -1941,10 +1829,8 @@
       smartlist_add(intro_routers, router);
       intro = tor_malloc_zero(sizeof(rend_intro_point_t));
       intro->extend_info = extend_info_from_router(router);
-      if (service->descriptor_version == 2) {
-        intro->intro_key = crypto_new_pk_env();
-        tor_assert(!crypto_pk_generate_key(intro->intro_key));
-      }
+      intro->intro_key = crypto_new_pk_env();
+      tor_assert(!crypto_pk_generate_key(intro->intro_key));
       smartlist_add(service->intro_nodes, intro);
       log_info(LD_REND, "Picked router %s as an intro point for %s.",
                router->nickname, service->service_id);
@@ -2037,8 +1923,7 @@
 
   for (i=0; i < smartlist_len(rend_service_list); ++i) {
     service = smartlist_get(rend_service_list, i);
-    if (service->descriptor_version && service->desc &&
-        !service->desc->all_uploads_performed) {
+    if (service->desc && !service->desc->all_uploads_performed) {
       /* If we failed in uploading a descriptor last time, try again *without*
        * updating the descriptor's contents. */
       upload_service_descriptor(service);
@@ -2066,8 +1951,7 @@
       intro = smartlist_get(service->intro_nodes, j);
       safe_name = safe_str(intro->extend_info->nickname);
 
-      circ = find_intro_circuit(intro, service->pk_digest,
-                                service->descriptor_version);
+      circ = find_intro_circuit(intro, service->pk_digest);
       if (!circ) {
         log(severity, LD_GENERAL, "  Intro point %d at %s: no circuit",
             j, safe_name);
@@ -2098,9 +1982,8 @@
   log_debug(LD_REND,"beginning to hunt for addr/port");
   base32_encode(serviceid, REND_SERVICE_ID_LEN_BASE32+1,
                 circ->rend_data->rend_pk_digest, REND_SERVICE_ID_LEN);
-  service = rend_service_get_by_pk_digest_and_version(
-                circ->rend_data->rend_pk_digest,
-                circ->rend_data->rend_desc_version);
+  service = rend_service_get_by_pk_digest(
+                circ->rend_data->rend_pk_digest);
   if (!service) {
     log_warn(LD_REND, "Couldn't find any service associated with pk %s on "
              "rendezvous circuit %d; closing.",

Modified: tor/trunk/src/or/rephist.c
===================================================================
--- tor/trunk/src/or/rephist.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/rephist.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -24,7 +24,7 @@
 /** If the total weighted run count of all runs for a router ever falls
  * below this amount, the router can be treated as having 0 MTBF. */
 #define STABILITY_EPSILON   0.0001
-/** Value by which to discount all old intervals for MTBF purposses.  This
+/** Value by which to discount all old intervals for MTBF purposes.  This
  * is compounded every STABILITY_INTERVAL. */
 #define STABILITY_ALPHA     0.95
 /** Interval at which to discount all old intervals for MTBF purposes. */
@@ -501,7 +501,7 @@
 /** Return a number representing how long we've known about the router whose
  * digest is <b>id</b>. Return 0 if the router is unknown.
  *
- * Be careful: this measure incresases monotonically as we know the router for
+ * Be careful: this measure increases monotonically as we know the router for
  * longer and longer, but it doesn't increase linearly.
  */
 long
@@ -683,9 +683,13 @@
   }
 }
 
-/** Write MTBF data to disk.  Returns 0 on success, negative on failure. */
+/** Write MTBF data to disk. Return 0 on success, negative on failure.
+ *
+ * If <b>missing_means_down</b>, then if we're about to write an entry
+ * that is still considered up but isn't in our routerlist, consider it
+ * to be down. */
 int
-rep_hist_record_mtbf_data(void)
+rep_hist_record_mtbf_data(time_t now, int missing_means_down)
 {
   char time_buf[ISO_TIME_LEN+1];
 
@@ -745,6 +749,18 @@
     hist = (or_history_t*) or_history_p;
 
     base16_encode(dbuf, sizeof(dbuf), digest, DIGEST_LEN);
+
+    if (missing_means_down && hist->start_of_run &&
+        !router_get_by_digest(digest)) {
+      /* We think this relay is running, but it's not listed in our
+       * routerlist. Somehow it fell out without telling us it went
+       * down. Complain and also correct it. */
+      log_info(LD_HIST,
+               "Relay '%s' is listed as up in rephist, but it's not in "
+               "our routerlist. Correcting.", dbuf);
+      rep_hist_note_router_unreachable(digest, now);
+    }
+
     PRINTF((f, "R %s\n", dbuf));
     if (hist->start_of_run > 0) {
       format_iso_time(time_buf, hist->start_of_run);
@@ -1304,6 +1320,201 @@
   add_obs(read_array, when, num_bytes);
 }
 
+#ifdef ENABLE_EXIT_STATS
+/* Some constants */
+/** How long are the intervals for measuring exit stats? */
+#define EXIT_STATS_INTERVAL_SEC (24 * 60 * 60)
+/** To what multiple should byte numbers be rounded up? */
+#define EXIT_STATS_ROUND_UP_BYTES 1024
+/** To what multiple should stream counts be rounded up? */
+#define EXIT_STATS_ROUND_UP_STREAMS 4
+/** Number of TCP ports */
+#define EXIT_STATS_NUM_PORTS 65536
+/** Reciprocal of threshold (= 0.01%) of total bytes that a port needs to
+ * see in order to be included in exit stats. */
+#define EXIT_STATS_THRESHOLD_RECIPROCAL 10000
+
+/* The following data structures are arrays and no fancy smartlists or maps,
+ * so that all write operations can be done in constant time. This comes at
+ * the price of some memory (1.25 MB) and linear complexity when writing
+ * stats. */
+/** Number of bytes read in current period by exit port */
+static uint64_t exit_bytes_read[EXIT_STATS_NUM_PORTS];
+/** Number of bytes written in current period by exit port */
+static uint64_t exit_bytes_written[EXIT_STATS_NUM_PORTS];
+/** Number of streams opened in current period by exit port */
+static uint32_t exit_streams[EXIT_STATS_NUM_PORTS];
+
+/** When does the current exit stats period end? */
+static time_t end_of_current_exit_stats_period = 0;
+
+/** Write exit stats for the current period to disk and reset counters. */
+static void
+write_exit_stats(time_t when)
+{
+  char t[ISO_TIME_LEN+1];
+  int r, i, comma;
+  uint64_t *b, total_bytes, threshold_bytes, other_bytes;
+  uint32_t other_streams;
+
+  char *filename = get_datadir_fname("exit-stats");
+  open_file_t *open_file = NULL;
+  FILE *out = NULL;
+
+  log_debug(LD_HIST, "Considering writing exit port statistics to disk..");
+  while (when > end_of_current_exit_stats_period) {
+    format_iso_time(t, end_of_current_exit_stats_period);
+    log_info(LD_HIST, "Writing exit port statistics to disk for period "
+             "ending at %s.", t);
+
+    if (!open_file) {
+      out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND,
+                                        0600, &open_file);
+      if (!out) {
+        log_warn(LD_HIST, "Couldn't open '%s'.", filename);
+        goto done;
+      }
+    }
+
+    /* written yyyy-mm-dd HH:MM:SS (n s) */
+    if (fprintf(out, "written %s (%d s)\n", t, EXIT_STATS_INTERVAL_SEC) < 0)
+      goto done;
+
+    /* Count the total number of bytes, so that we can attribute all
+     * observations below a threshold of 1 / EXIT_STATS_THRESHOLD_RECIPROCAL
+     * of all bytes to a special port 'other'. */
+    total_bytes = 0;
+    for (i = 1; i < EXIT_STATS_NUM_PORTS; i++) {
+      total_bytes += exit_bytes_read[i];
+      total_bytes += exit_bytes_written[i];
+    }
+    threshold_bytes = total_bytes / EXIT_STATS_THRESHOLD_RECIPROCAL;
+
+    /* kibibytes-(read|written) port=kibibytes,.. */
+    for (r = 0; r < 2; r++) {
+      b = r ? exit_bytes_read : exit_bytes_written;
+      tor_assert(b);
+      if (fprintf(out, "%s ",
+                  r ? "kibibytes-read" : "kibibytes-written")<0)
+        goto done;
+
+      comma = 0;
+      other_bytes = 0;
+      for (i = 1; i < EXIT_STATS_NUM_PORTS; i++) {
+        if (b[i] > 0) {
+          if (exit_bytes_read[i] + exit_bytes_written[i] > threshold_bytes) {
+            uint64_t num = round_uint64_to_next_multiple_of(b[i],
+                                                EXIT_STATS_ROUND_UP_BYTES);
+            num /= 1024;
+            if (fprintf(out, "%s%d="U64_FORMAT,
+                        comma++ ? "," : "", i,
+                        U64_PRINTF_ARG(num)) < 0)
+              goto done;
+          } else
+            other_bytes += b[i];
+        }
+      }
+      other_bytes = round_uint64_to_next_multiple_of(other_bytes,
+                                         EXIT_STATS_ROUND_UP_BYTES);
+      other_bytes /= 1024;
+      if (fprintf(out, "%sother="U64_FORMAT"\n",
+                  comma ? "," : "", U64_PRINTF_ARG(other_bytes))<0)
+        goto done;
+    }
+    /* streams-opened port=num,.. */
+    if (fprintf(out, "streams-opened ")<0)
+      goto done;
+    comma = 0;
+    other_streams = 0;
+    for (i = 1; i < EXIT_STATS_NUM_PORTS; i++) {
+      if (exit_streams[i] > 0) {
+        if (exit_bytes_read[i] + exit_bytes_written[i] > threshold_bytes) {
+          uint32_t num = round_uint32_to_next_multiple_of(exit_streams[i],
+                                              EXIT_STATS_ROUND_UP_STREAMS);
+          if (fprintf(out, "%s%d=%u",
+                      comma++ ? "," : "", i, num)<0)
+            goto done;
+        } else
+          other_streams += exit_streams[i];
+      }
+    }
+    other_streams = round_uint32_to_next_multiple_of(other_streams,
+                                         EXIT_STATS_ROUND_UP_STREAMS);
+    if (fprintf(out, "%sother=%u\n",
+                comma ? "," : "", other_streams)<0)
+      goto done;
+    /* Reset counters */
+    memset(exit_bytes_read, 0, sizeof(exit_bytes_read));
+    memset(exit_bytes_written, 0, sizeof(exit_bytes_written));
+    memset(exit_streams, 0, sizeof(exit_streams));
+    end_of_current_exit_stats_period += EXIT_STATS_INTERVAL_SEC;
+  }
+
+  if (open_file)
+    finish_writing_to_file(open_file);
+  open_file = NULL;
+ done:
+  if (open_file)
+    abort_writing_to_file(open_file);
+  tor_free(filename);
+}
+
+/** Prepare to add an exit stats observation at second <b>when</b> by
+ * checking whether this observation lies in the current observation
+ * period; if not, shift the current period forward by one until the
+ * reported event fits it and write all results in between to disk. */
+static void
+add_exit_obs(time_t when)
+{
+  if (when > end_of_current_exit_stats_period) {
+    if (end_of_current_exit_stats_period)
+      write_exit_stats(when);
+    else
+      end_of_current_exit_stats_period = when + EXIT_STATS_INTERVAL_SEC;
+  }
+}
+
+/** Note that we wrote <b>num_bytes</b> to an exit connection to
+ * <b>port</b> in second <b>when</b>. */
+void
+rep_hist_note_exit_bytes_written(uint16_t port, size_t num_bytes,
+                                 time_t when)
+{
+  if (!get_options()->ExitPortStatistics)
+    return;
+  add_exit_obs(when);
+  exit_bytes_written[port] += num_bytes;
+  log_debug(LD_HIST, "Written %lu bytes to exit connection to port %d.",
+            (unsigned long)num_bytes, port);
+}
+
+/** Note that we read <b>num_bytes</b> from an exit connection to
+ * <b>port</b> in second <b>when</b>. */
+void
+rep_hist_note_exit_bytes_read(uint16_t port, size_t num_bytes,
+                              time_t when)
+{
+  if (!get_options()->ExitPortStatistics)
+    return;
+  add_exit_obs(when);
+  exit_bytes_read[port] += num_bytes;
+  log_debug(LD_HIST, "Read %lu bytes from exit connection to port %d.",
+            (unsigned long)num_bytes, port);
+}
+
+/** Note that we opened an exit stream to <b>port</b> in second
+ * <b>when</b>. */
+void
+rep_hist_note_exit_stream_opened(uint16_t port, time_t when)
+{
+  if (!get_options()->ExitPortStatistics)
+    return;
+  add_exit_obs(when);
+  exit_streams[port]++;
+  log_debug(LD_HIST, "Opened exit stream to port %d", port);
+}
+#endif
+
 /** Helper: Return the largest value in b->maxima.  (This is equal to the
  * most bandwidth used in any NUM_SECS_ROLLING_MEASURE period for the last
  * NUM_SECS_BW_SUM_IS_VALID seconds.)
@@ -2390,3 +2601,174 @@
   tor_free(fname);
 }
 
+/*** cell statistics ***/
+
+#ifdef ENABLE_BUFFER_STATS
+/** Start of the current buffer stats interval. */
+time_t start_of_buffer_stats_interval;
+
+typedef struct circ_buffer_stats_t {
+  uint32_t processed_cells;
+  double mean_num_cells_in_queue;
+  double mean_time_cells_in_queue;
+  uint32_t local_circ_id;
+} circ_buffer_stats_t;
+
+/** Holds stats. */
+smartlist_t *circuits_for_buffer_stats = NULL;
+
+/** Remember cell statistics for circuit <b>circ</b> at time
+ * <b>end_of_interval</b> and reset cell counters in case the circuit
+ * remains open in the next measurement interval. */
+void
+add_circ_to_buffer_stats(circuit_t *circ, time_t end_of_interval)
+{
+  circ_buffer_stats_t *stat;
+  time_t start_of_interval;
+  int interval_length;
+  or_circuit_t *orcirc;
+  if (CIRCUIT_IS_ORIGIN(circ))
+    return;
+  orcirc = TO_OR_CIRCUIT(circ);
+  if (!orcirc->processed_cells)
+    return;
+  if (!circuits_for_buffer_stats)
+    circuits_for_buffer_stats = smartlist_create();
+  start_of_interval = circ->timestamp_created >
+      start_of_buffer_stats_interval ?
+        circ->timestamp_created :
+        start_of_buffer_stats_interval;
+  interval_length = (int) (end_of_interval - start_of_interval);
+  stat = tor_malloc_zero(sizeof(circ_buffer_stats_t));
+  stat->processed_cells = orcirc->processed_cells;
+  /* 1000.0 for s -> ms; 2.0 because of app-ward and exit-ward queues */
+  stat->mean_num_cells_in_queue = interval_length == 0 ? 0.0 :
+      (double) orcirc->total_cell_waiting_time /
+      (double) interval_length / 1000.0 / 2.0;
+  stat->mean_time_cells_in_queue =
+      (double) orcirc->total_cell_waiting_time /
+      (double) orcirc->processed_cells;
+  smartlist_add(circuits_for_buffer_stats, stat);
+  orcirc->total_cell_waiting_time = 0;
+  orcirc->processed_cells = 0;
+}
+
+/** Sorting helper: return -1, 1, or 0 based on comparison of two
+ * circ_buffer_stats_t */
+static int
+_buffer_stats_compare_entries(const void **_a, const void **_b)
+{
+  const circ_buffer_stats_t *a = *_a, *b = *_b;
+  if (a->processed_cells < b->processed_cells)
+    return 1;
+  else if (a->processed_cells > b->processed_cells)
+    return -1;
+  else
+    return 0;
+}
+
+/** Append buffer statistics to local file. */
+void
+dump_buffer_stats(void)
+{
+  time_t now = time(NULL);
+  char *filename;
+  char written[ISO_TIME_LEN+1];
+  open_file_t *open_file = NULL;
+  FILE *out;
+#define SHARES 10
+  int processed_cells[SHARES], circs_in_share[SHARES],
+      number_of_circuits, i;
+  double queued_cells[SHARES], time_in_queue[SHARES];
+  smartlist_t *str_build = smartlist_create();
+  char *str = NULL;
+  char buf[32];
+  circuit_t *circ;
+  /* add current circuits to stats */
+  for (circ = _circuit_get_global_list(); circ; circ = circ->next)
+    add_circ_to_buffer_stats(circ, now);
+  /* calculate deciles */
+  memset(processed_cells, 0, SHARES * sizeof(int));
+  memset(circs_in_share, 0, SHARES * sizeof(int));
+  memset(queued_cells, 0, SHARES * sizeof(double));
+  memset(time_in_queue, 0, SHARES * sizeof(double));
+  smartlist_sort(circuits_for_buffer_stats,
+                 _buffer_stats_compare_entries);
+  number_of_circuits = smartlist_len(circuits_for_buffer_stats);
+  i = 0;
+  SMARTLIST_FOREACH_BEGIN(circuits_for_buffer_stats,
+                          circ_buffer_stats_t *, stat)
+  {
+    int share = i++ * SHARES / number_of_circuits;
+    processed_cells[share] += stat->processed_cells;
+    queued_cells[share] += stat->mean_num_cells_in_queue;
+    time_in_queue[share] += stat->mean_time_cells_in_queue;
+    circs_in_share[share]++;
+  }
+  SMARTLIST_FOREACH_END(stat);
+  /* clear buffer stats history */
+  SMARTLIST_FOREACH(circuits_for_buffer_stats, circ_buffer_stats_t *,
+      stat, tor_free(stat));
+  smartlist_clear(circuits_for_buffer_stats);
+  /* write to file */
+  filename = get_datadir_fname("buffer-stats");
+  out = start_writing_to_stdio_file(filename, OPEN_FLAGS_APPEND,
+                                    0600, &open_file);
+  if (!out)
+    goto done;
+  format_iso_time(written, now);
+  if (fprintf(out, "written %s (%d s)\n", written,
+              DUMP_BUFFER_STATS_INTERVAL) < 0)
+    goto done;
+  for (i = 0; i < SHARES; i++) {
+    tor_snprintf(buf, sizeof(buf), "%d", !circs_in_share[i] ? 0 :
+                 processed_cells[i] / circs_in_share[i]);
+    smartlist_add(str_build, tor_strdup(buf));
+  }
+  str = smartlist_join_strings(str_build, ",", 0, NULL);
+  if (fprintf(out, "processed-cells %s\n", str) < 0)
+    goto done;
+  tor_free(str);
+  SMARTLIST_FOREACH(str_build, char *, c, tor_free(c));
+  smartlist_clear(str_build);
+  for (i = 0; i < SHARES; i++) {
+    tor_snprintf(buf, sizeof(buf), "%.2f", circs_in_share[i] == 0 ? 0.0 :
+                 queued_cells[i] / (double) circs_in_share[i]);
+    smartlist_add(str_build, tor_strdup(buf));
+  }
+  str = smartlist_join_strings(str_build, ",", 0, NULL);
+  if (fprintf(out, "queued-cells %s\n", str) < 0)
+    goto done;
+  tor_free(str);
+  SMARTLIST_FOREACH(str_build, char *, c, tor_free(c));
+  smartlist_clear(str_build);
+  for (i = 0; i < SHARES; i++) {
+    tor_snprintf(buf, sizeof(buf), "%.0f", circs_in_share[i] == 0 ? 0.0 :
+                 time_in_queue[i] / (double) circs_in_share[i]);
+    smartlist_add(str_build, tor_strdup(buf));
+  }
+  str = smartlist_join_strings(str_build, ",", 0, NULL);
+  if (fprintf(out, "time-in-queue %s\n", str) < 0)
+    goto done;
+  tor_free(str);
+  SMARTLIST_FOREACH(str_build, char *, c, tor_free(c));
+  smartlist_free(str_build);
+  str_build = NULL;
+  if (fprintf(out, "number-of-circuits-per-share %d\n",
+              (number_of_circuits + SHARES - 1) / SHARES) < 0)
+    goto done;
+  finish_writing_to_file(open_file);
+  open_file = NULL;
+ done:
+  if (open_file)
+    abort_writing_to_file(open_file);
+  tor_free(filename);
+  if (str_build) {
+    SMARTLIST_FOREACH(str_build, char *, c, tor_free(c));
+    smartlist_free(str_build);
+  }
+  tor_free(str);
+#undef SHARES
+}
+#endif
+

Modified: tor/trunk/src/or/router.c
===================================================================
--- tor/trunk/src/or/router.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/router.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #define ROUTER_PRIVATE
@@ -28,7 +28,7 @@
 static time_t onionkey_set_at=0; /**< When was onionkey last changed? */
 /** Current private onionskin decryption key: used to decode CREATE cells. */
 static crypto_pk_env_t *onionkey=NULL;
-/** Previous private onionskin decription key: used to decode CREATE cells
+/** Previous private onionskin decryption key: used to decode CREATE cells
  * generated by clients that have an older version of our descriptor. */
 static crypto_pk_env_t *lastonionkey=NULL;
 /** Private "identity key": used to sign directory info and TLS
@@ -293,7 +293,7 @@
  * directory authority, and make sure they match.  If <b>legacy</b>, load a
  * legacy key/cert set for emergency key migration; otherwise load the regular
  * key/cert set.  On success, store them into *<b>key_out</b> and
- * *<b>cert_out</b> respectively, and return 0.  On failrue, return -1. */
+ * *<b>cert_out</b> respectively, and return 0.  On failure, return -1. */
 static int
 load_authority_keyset(int legacy, crypto_pk_env_t **key_out,
                       authority_cert_t **cert_out)
@@ -330,9 +330,6 @@
              "certificate");
     goto done;
   }
-  parsed->cache_info.signed_descriptor_body = cert;
-  parsed->cache_info.signed_descriptor_len = eos-cert;
-  cert = NULL;
 
   if (*key_out)
     crypto_free_pk_env(*key_out);
@@ -445,7 +442,9 @@
     key_lock = tor_mutex_new();
 
   /* There are a couple of paths that put us here before */
-  if (crypto_global_init(get_options()->HardwareAccel)) {
+  if (crypto_global_init(get_options()->HardwareAccel,
+                         get_options()->AccelName,
+                         get_options()->AccelDir)) {
     log_err(LD_BUG, "Unable to initialize OpenSSL. Exiting.");
     return -1;
   }
@@ -547,7 +546,7 @@
   /* Must be called after keys are initialized. */
   mydesc = router_get_my_descriptor();
   if (authdir_mode(options)) {
-    const char *m;
+    const char *m = NULL;
     routerinfo_t *ri;
     /* We need to add our own fingerprint so it gets recognized. */
     if (dirserv_add_own_fingerprint(options->Nickname, get_identity_key())) {
@@ -571,7 +570,7 @@
   /* 5. Dump fingerprint to 'fingerprint' */
   keydir = get_datadir_fname("fingerprint");
   log_info(LD_GENERAL,"Dumping fingerprint to \"%s\"...",keydir);
-  if (crypto_pk_get_fingerprint(get_identity_key(), fingerprint, 1)<0) {
+  if (crypto_pk_get_fingerprint(get_identity_key(), fingerprint, 0)<0) {
     log_err(LD_GENERAL,"Error computing fingerprint");
     tor_free(keydir);
     return -1;
@@ -1303,18 +1302,10 @@
   ri->platform = tor_strdup(platform);
 
   /* compute ri->bandwidthrate as the min of various options */
-  ri->bandwidthrate = (int)options->BandwidthRate;
-  if (ri->bandwidthrate > options->MaxAdvertisedBandwidth)
-    ri->bandwidthrate = (int)options->MaxAdvertisedBandwidth;
-  if (options->RelayBandwidthRate > 0 &&
-      ri->bandwidthrate > options->RelayBandwidthRate)
-    ri->bandwidthrate = (int)options->RelayBandwidthRate;
+  ri->bandwidthrate = get_effective_bwrate(options);
 
   /* and compute ri->bandwidthburst similarly */
-  ri->bandwidthburst = (int)options->BandwidthBurst;
-  if (options->RelayBandwidthBurst > 0 &&
-      ri->bandwidthburst > options->RelayBandwidthBurst)
-    ri->bandwidthburst = (int)options->RelayBandwidthBurst;
+  ri->bandwidthburst = get_effective_bwburst(options);
 
   ri->bandwidthcapacity = hibernating ? 0 : rep_hist_bandwidth_assess();
 
@@ -1512,8 +1503,8 @@
            addrbuf_prev, addrbuf_cur, source);
   else
     log_notice(LD_GENERAL,
-             "Guessed our IP address as %s.",
-             addrbuf_cur);
+             "Guessed our IP address as %s (source: %s).",
+             addrbuf_cur, source);
 }
 
 /** Check whether our own address as defined by the Address configuration
@@ -1536,7 +1527,7 @@
   }
 
   if (prev != cur) {
-    log_addr_has_changed(LOG_INFO, prev, cur, "resolve");
+    log_addr_has_changed(LOG_NOTICE, prev, cur, "resolve");
     ip_address_changed(0);
   }
 }
@@ -1917,11 +1908,17 @@
 {
   static time_t last_purged_at = 0;
   int geoip_purge_interval = 48*60*60;
-#ifdef ENABLE_GEOIP_STATS
-  if (get_options()->DirRecordUsageByCountry)
-    geoip_purge_interval = get_options()->DirRecordUsageRetainIPs;
+#ifdef ENABLE_DIRREQ_STATS
+  geoip_purge_interval = DIR_RECORD_USAGE_RETAIN_IPS;
 #endif
+#ifdef ENABLE_ENTRY_STATS
+  geoip_purge_interval = ENTRY_RECORD_USAGE_RETAIN_IPS;
+#endif
   if (now > last_purged_at+geoip_purge_interval) {
+    /* (Note that this also discards items in the client history with
+     * action GEOIP_CLIENT_NETWORKSTATUS{_V2}, which doesn't matter
+     * because bridge and directory stats are independent. Keep in mind
+     * for future extensions, though.) */
     geoip_remove_old_clients(now-geoip_purge_interval);
     last_purged_at = now;
   }

Modified: tor/trunk/src/or/routerlist.c
===================================================================
--- tor/trunk/src/or/routerlist.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/routerlist.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -911,10 +911,10 @@
   return choice;
 }
 
-/** Try to determine which fraction of v2 and v3 directory requsts aimed at
+/** Try to determine which fraction of v2 and v3 directory requests aimed at
  * caches will be sent to us. Set *<b>v2_share_out</b> and
  * *<b>v3_share_out</b> to the fractions of v2 and v3 protocol shares we
- * expect to see, respectively.  Return 0 on success, negative on failue. */
+ * expect to see, respectively.  Return 0 on success, negative on failure. */
 int
 router_get_my_share_of_directory_requests(double *v2_share_out,
                                           double *v3_share_out)
@@ -1523,15 +1523,12 @@
   return result;
 }
 
-/** Eventually, the number we return will come from the directory
- * consensus, so clients can dynamically update to better numbers.
- *
- * But for now, or in case there is no consensus available, just return
- * a sufficient default. */
-static uint32_t
-get_max_believable_bandwidth(void)
+/** Return bw*1000, unless bw*1000 would overflow, in which case return
+ * INT32_MAX. */
+static INLINE int32_t
+kb_to_bytes(uint32_t bw)
 {
-  return DEFAULT_MAX_BELIEVABLE_BANDWIDTH;
+  return (bw > (INT32_MAX/1000)) ? INT32_MAX : bw*1000;
 }
 
 /** Helper function:
@@ -1568,7 +1565,6 @@
   int n_unknown = 0;
   bitarray_t *exit_bits;
   bitarray_t *guard_bits;
-  uint32_t max_believable_bw = get_max_believable_bandwidth();
   int me_idx = -1;
 
   /* Can't choose exit and guard at same time */
@@ -1591,48 +1587,50 @@
     int32_t flags = 0;
     uint32_t this_bw = 0;
     if (statuses) {
-      /* need to extract router info */
       status = smartlist_get(sl, i);
       if (router_digest_is_me(status->identity_digest))
         me_idx = i;
       router = router_get_by_digest(status->identity_digest);
       is_exit = status->is_exit;
       is_guard = status->is_possible_guard;
-      if (router) {
-        this_bw = router_get_advertised_bandwidth(router);
+      if (status->has_bandwidth) {
+        this_bw = kb_to_bytes(status->bandwidth);
       } else { /* guess */
+        /* XXX022 once consensuses always list bandwidths, we can take
+         * this guessing business out. -RD */
         is_known = 0;
         flags = status->is_fast ? 1 : 0;
         flags |= is_exit ? 2 : 0;
         flags |= is_guard ? 4 : 0;
       }
     } else {
+      routerstatus_t *rs;
       router = smartlist_get(sl, i);
+      rs = router_get_consensus_status_by_id(
+             router->cache_info.identity_digest);
       if (router_digest_is_me(router->cache_info.identity_digest))
         me_idx = i;
       is_exit = router->is_exit;
       is_guard = router->is_possible_guard;
-      this_bw = router_get_advertised_bandwidth(router);
+      if (rs && rs->has_bandwidth) {
+        this_bw = kb_to_bytes(rs->bandwidth);
+      } else if (rs) { /* guess; don't trust the descriptor */
+        /* XXX022 once consensuses always list bandwidths, we can take
+         * this guessing business out. -RD */
+        is_known = 0;
+        flags = router->is_fast ? 1 : 0;
+        flags |= is_exit ? 2 : 0;
+        flags |= is_guard ? 4 : 0;
+      } else /* bridge or other descriptor not in our consensus */
+        this_bw = router_get_advertised_bandwidth_capped(router);
     }
     if (is_exit)
       bitarray_set(exit_bits, i);
     if (is_guard)
       bitarray_set(guard_bits, i);
-    /* if they claim something huge, don't believe it */
-    if (this_bw > max_believable_bw) {
-      char fp[HEX_DIGEST_LEN+1];
-      base16_encode(fp, sizeof(fp), statuses ?
-                      status->identity_digest :
-                      router->cache_info.identity_digest,
-                    DIGEST_LEN);
-      log_fn(LOG_PROTOCOL_WARN, LD_DIR,
-             "Bandwidth %d for router %s (%s) exceeds allowed max %d, capping",
-             this_bw, router ? router->nickname : "(null)",
-             fp, max_believable_bw);
-      this_bw = max_believable_bw;
-    }
     if (is_known) {
       bandwidths[i] = (int32_t) this_bw; // safe since MAX_BELIEVABLE<INT32_MAX
+      tor_assert(bandwidths[i] >= 0);
       if (is_guard)
         total_guard_bw += this_bw;
       else
@@ -2631,7 +2629,7 @@
  * If <b>make_old</b> is true, instead of deleting the router, we try adding
  * it to rl-&gt;old_routers. */
 void
-routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old)
+routerlist_remove(routerlist_t *rl, routerinfo_t *ri, int make_old, time_t now)
 {
   routerinfo_t *ri_tmp;
   extrainfo_t *ei_tmp;
@@ -2639,6 +2637,9 @@
   tor_assert(0 <= idx && idx < smartlist_len(rl->routers));
   tor_assert(smartlist_get(rl->routers, idx) == ri);
 
+  /* make sure the rephist module knows that it's not running */
+  rep_hist_note_router_unreachable(ri->cache_info.identity_digest, now);
+
   ri->cache_info.routerlist_index = -1;
   smartlist_del(rl->routers, idx);
   if (idx < smartlist_len(rl->routers)) {
@@ -3270,7 +3271,7 @@
     if (caches && networkstatus_v2_list) {
       /* If we care about v2 statuses, we'll retain at most as many as are
          listed any of the v2 statues.  This will be at least the length of
-         the largest v2 networstatus, and in the worst case, this set will be
+         the largest v2 networkstatus, and in the worst case, this set will be
          equal to the sum of the lengths of all v2 consensuses.  Take the
          worst case.
       */
@@ -3330,7 +3331,7 @@
         log_info(LD_DIR,
                  "Forgetting obsolete (too old) routerinfo for router '%s'",
                  router->nickname);
-        routerlist_remove(routerlist, router, 1);
+        routerlist_remove(routerlist, router, 1, now);
         i--;
       }
     }
@@ -3513,6 +3514,7 @@
 
   SMARTLIST_FOREACH_BEGIN(routers, routerinfo_t *, ri) {
     was_router_added_t r;
+    char d[DIGEST_LEN];
     if (requested_fingerprints) {
       base16_encode(fp, sizeof(fp), descriptor_digests ?
                       ri->cache_info.signed_descriptor_digest :
@@ -3533,6 +3535,7 @@
       }
     }
 
+    memcpy(d, ri->cache_info.signed_descriptor_digest, DIGEST_LEN);
     r = router_add_to_routerlist(ri, &msg, from_cache, !from_cache);
     if (WRA_WAS_ADDED(r)) {
       any_changed++;
@@ -3541,11 +3544,10 @@
       smartlist_clear(changed);
     } else if (WRA_WAS_REJECTED(r)) {
       download_status_t *dl_status;
-      dl_status = router_get_dl_status_by_descriptor_digest(
-          ri->cache_info.signed_descriptor_digest);
+      dl_status = router_get_dl_status_by_descriptor_digest(d);
       if (dl_status) {
         log_info(LD_GENERAL, "Marking router %s as never downloadable",
-                 hex_str(ri->cache_info.signed_descriptor_digest, DIGEST_LEN));
+                 hex_str(d, DIGEST_LEN));
         download_status_mark_impossible(dl_status);
       }
     }
@@ -4615,7 +4617,7 @@
       (r2->bandwidthcapacity < r1->bandwidthcapacity/2))
     return 0;
 
-  /* Did the bandwithrate or bandwithburst change? */
+  /* Did the bandwidthrate or bandwidthburst change? */
   if ((r1->bandwidthrate != r2->bandwidthrate) ||
       (r1->bandwidthburst != r2->bandwidthburst))
     return 0;
@@ -4978,7 +4980,7 @@
  *
  * Three kinds of elements are allowed in routersets: nicknames, IP address
  * patterns, and fingerprints.  They may be surrounded by optional space, and
- * mst be separated by commas.
+ * must be separated by commas.
  */
 int
 routerset_parse(routerset_t *target, const char *s, const char *description)
@@ -5118,7 +5120,7 @@
 
 /** Return true iff we can tell that <b>ei</b> is a member of <b>set</b>. */
 int
-routerset_contains_extendinfo(const routerset_t *set, extend_info_t *ei)
+routerset_contains_extendinfo(const routerset_t *set, const extend_info_t *ei)
 {
   return routerset_contains(set,
                             &ei->addr,

Modified: tor/trunk/src/or/routerparse.c
===================================================================
--- tor/trunk/src/or/routerparse.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/routerparse.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -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-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /**
@@ -167,7 +167,7 @@
   /** If true, we concatenate all arguments for this item into a single
    * string. */
   int concat_args;
-  /** Requirments on object syntax for this item. */
+  /** Requirements on object syntax for this item. */
   obj_syntax os;
   /** Lowest number of times this item may appear in a document. */
   int min_cnt;
@@ -217,7 +217,7 @@
 /* Argument multiplicity: exactly <b>n</b> arguments. */
 #define EQ(n)       n,n,0
 
-/** List of tokens allowable in router derscriptors */
+/** List of tokens allowable in router descriptors */
 static token_rule_t routerdesc_token_table[] = {
   T0N("reject",              K_REJECT,              ARGS,    NO_OBJ ),
   T0N("accept",              K_ACCEPT,              ARGS,    NO_OBJ ),
@@ -601,7 +601,7 @@
  * <b>versionlist</b> is newer than <b>myversion</b>.  Else, return
  * VS_NEW_IN_SERIES if there is at least one member of <b>versionlist</b> in
  * the same series (major.minor.micro) as <b>myversion</b>, but no such member
- * is newer than <b>myversion.</b>.  Else, return VS_NEW if every memeber of
+ * is newer than <b>myversion.</b>.  Else, return VS_NEW if every member of
  * <b>versionlist</b> is older than <b>myversion</b>.  Else, return
  * VS_UNRECOMMENDED.
  *
@@ -1924,6 +1924,16 @@
           goto err;
         }
         rs->has_bandwidth = 1;
+      } else if (!strcmpstart(tok->args[i], "Measured=")) {
+        int ok;
+        rs->measured_bw = tor_parse_ulong(strchr(tok->args[i], '=')+1, 10,
+                                          0, UINT32_MAX, &ok, NULL);
+        if (!ok) {
+          log_warn(LD_DIR, "Invalid Measured Bandwidth %s",
+                   escaped(tok->args[i]));
+          goto err;
+        }
+        rs->has_measured_bw = 1;
       }
     }
   }
@@ -1966,8 +1976,8 @@
 }
 
 /** Helper to sort a smartlist of pointers to routerstatus_t */
-static int
-_compare_routerstatus_entries(const void **_a, const void **_b)
+int
+compare_routerstatus_entries(const void **_a, const void **_b)
 {
   const routerstatus_t *a = *_a, *b = *_b;
   return memcmp(a->identity_digest, b->identity_digest, DIGEST_LEN);
@@ -2114,8 +2124,8 @@
                                                    NULL, NULL, 0)))
       smartlist_add(ns->entries, rs);
   }
-  smartlist_sort(ns->entries, _compare_routerstatus_entries);
-  smartlist_uniq(ns->entries, _compare_routerstatus_entries,
+  smartlist_sort(ns->entries, compare_routerstatus_entries);
+  smartlist_uniq(ns->entries, compare_routerstatus_entries,
                  _free_duplicate_routerstatus_entry);
 
   if (tokenize_string(area,s, NULL, footer_tokens, dir_footer_token_table,0)) {
@@ -3166,7 +3176,7 @@
     }
     if ((flags & TS_NO_NEW_ANNOTATIONS)) {
       if (first_nonannotation != prev_len) {
-        log_warn(LD_DIR, "parse error: Unexpectd annotations.");
+        log_warn(LD_DIR, "parse error: Unexpected annotations.");
         return -1;
       }
     }
@@ -3453,7 +3463,7 @@
 }
 
 /** Helper: Given pointers to two strings describing tor versions, return -1
- * if _a precedes _b, 1 if _b preceeds _a, and 0 if they are equivalent.
+ * if _a precedes _b, 1 if _b precedes _a, and 0 if they are equivalent.
  * Used to sort a list of versions. */
 static int
 _compare_tor_version_str_ptr(const void **_a, const void **_b)

Modified: tor/trunk/src/or/test.c
===================================================================
--- tor/trunk/src/or/test.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/test.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright (c) 2001-2004, Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /* Ordinarily defined in tor_main.c; this bit is just here to provide one
@@ -2492,7 +2492,7 @@
   test_assert(buf3);
   test_streq(buf1,buf3);
 
-  /* Check whether we can uncompress concatenated, compresed strings. */
+  /* Check whether we can uncompress concatenated, compressed strings. */
   tor_free(buf3);
   buf2 = tor_realloc(buf2, len1*2);
   memcpy(buf2+len1, buf2, len1);
@@ -2514,7 +2514,7 @@
   test_assert(!tor_gzip_compress(&buf2, &len1, buf1, strlen(buf1)+1,
                                  ZLIB_METHOD));
   tor_assert(len1>16);
-  /* when we allow an uncomplete string, we should succeed.*/
+  /* when we allow an incomplete string, we should succeed.*/
   tor_assert(!tor_gzip_uncompress(&buf3, &len2, buf2, len1-16,
                                   ZLIB_METHOD, 0, LOG_INFO));
   buf3[len2]='\0';
@@ -3004,7 +3004,7 @@
   test_assert(!crypto_pk_get_fingerprint(pk2, fingerprint, 1));
   strlcat(buf2, fingerprint, sizeof(buf2));
   strlcat(buf2, "\nuptime 0\n"
-  /* XXX the "0" above is hardcoded, but even if we made it reflect
+  /* XXX the "0" above is hard-coded, but even if we made it reflect
    * uptime, that still wouldn't make it right, because the two
    * descriptors might be made on different seconds... hm. */
          "bandwidth 1000 5000 10000\n"
@@ -3232,6 +3232,72 @@
   smartlist_free(sl);
 }
 
+static void
+test_dirutil_measured_bw(void)
+{
+  measured_bw_line_t mbwl;
+  int i;
+  const char *lines_pass[] = {
+    "node_id=$557365204145532d32353620696e73746561642e bw=1024\n",
+    "node_id=$557365204145532d32353620696e73746561642e\t  bw=1024 \n",
+    " node_id=$557365204145532d32353620696e73746561642e  bw=1024\n",
+    "\tnoise\tnode_id=$557365204145532d32353620696e73746561642e  "
+                "bw=1024 junk=007\n",
+    "misc=junk node_id=$557365204145532d32353620696e73746561642e  "
+                "bw=1024 junk=007\n",
+    "end"
+  };
+  const char *lines_fail[] = {
+    /* Test possible python stupidity on input */
+    "node_id=None bw=1024\n",
+    "node_id=$None bw=1024\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=None\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=1024.0\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=.1024\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=1.024\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=0\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=1024 bw=None\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=-1024\n",
+    /* Test incomplete writes due to race conditions, partial copies, etc */
+    "node_i",
+    "node_i\n",
+    "node_id=",
+    "node_id=\n",
+    "node_id=$557365204145532d32353620696e73746561642e bw=",
+    "node_id=$557365204145532d32353620696e73746561642e bw=1024",
+    "node_id=$557365204145532d32353620696e73746561642e bw=\n",
+    "node_id=$557365204145532d32353620696e7374",
+    "node_id=$557365204145532d32353620696e7374\n",
+    "",
+    "\n",
+    " \n ",
+    " \n\n",
+    /* Test assorted noise */
+    " node_id= ",
+    "node_id==$557365204145532d32353620696e73746561642e bw==1024\n",
+    "node_id=$55736520414552d32353620696e73746561642e bw=1024\n",
+    "node_id=557365204145532d32353620696e73746561642e bw=1024\n",
+    "node_id= $557365204145532d32353620696e73746561642e bw=0.23\n",
+    "end"
+  };
+
+  for (i = 0; strcmp(lines_fail[i], "end"); i++) {
+    //fprintf(stderr, "Testing: %s\n", lines_fail[i]);
+    test_assert(measured_bw_line_parse(&mbwl, lines_fail[i]) == -1);
+  }
+
+  for (i = 0; strcmp(lines_pass[i], "end"); i++) {
+    //fprintf(stderr, "Testing: %s %d\n", lines_pass[i], TOR_ISSPACE('\n'));
+    test_assert(measured_bw_line_parse(&mbwl, lines_pass[i]) == 0);
+    test_assert(mbwl.bw == 1024);
+    test_assert(strcmp(mbwl.node_hex,
+                "557365204145532d32353620696e73746561642e") == 0);
+  }
+
+done:
+  return;
+}
+
 extern const char AUTHORITY_CERT_1[];
 extern const char AUTHORITY_SIGNKEY_1[];
 extern const char AUTHORITY_CERT_2[];
@@ -3512,6 +3578,17 @@
   test_eq(rs->dir_port, 0);
   test_eq(vrs->flags, U64_LITERAL(254)); // all flags except "authority."
 
+  {
+    measured_bw_line_t mbw;
+    memset(mbw.node_id, 33, sizeof(mbw.node_id));
+    mbw.bw = 1024;
+    test_assert(measured_bw_line_apply(&mbw,
+                v1->routerstatus_list) == 1);
+    vrs = smartlist_get(v1->routerstatus_list, 2);
+    test_assert(vrs->status.has_measured_bw &&
+                vrs->status.measured_bw == 1024);
+  }
+
   /* Generate second vote. It disagrees on some of the times,
    * and doesn't list versions, and knows some crazy flags */
   vote->published = now+1;
@@ -4000,78 +4077,6 @@
   }
 }
 
-/** Run unit tests for basic rendezvous functions. */
-static void
-test_rend_fns(void)
-{
-  char address1[] = "fooaddress.onion";
-  char address2[] = "aaaaaaaaaaaaaaaa.onion";
-  char address3[] = "fooaddress.exit";
-  char address4[] = "www.torproject.org";
-  rend_service_descriptor_t *d1 =
-    tor_malloc_zero(sizeof(rend_service_descriptor_t));
-  rend_service_descriptor_t *d2 = NULL;
-  char *encoded = NULL;
-  size_t len;
-  time_t now;
-  int i;
-  crypto_pk_env_t *pk1 = pk_generate(0), *pk2 = pk_generate(1);
-
-  /* Test unversioned (v0) descriptor */
-  d1->pk = crypto_pk_dup_key(pk1);
-  now = time(NULL);
-  d1->timestamp = now;
-  d1->version = 0;
-  d1->intro_nodes = smartlist_create();
-  for (i = 0; i < 3; i++) {
-    rend_intro_point_t *intro = tor_malloc_zero(sizeof(rend_intro_point_t));
-    intro->extend_info = tor_malloc_zero(sizeof(extend_info_t));
-    crypto_rand(intro->extend_info->identity_digest, DIGEST_LEN);
-    intro->extend_info->nickname[0] = '$';
-    base16_encode(intro->extend_info->nickname+1, HEX_DIGEST_LEN+1,
-                  intro->extend_info->identity_digest, DIGEST_LEN);
-    smartlist_add(d1->intro_nodes, intro);
-  }
-  test_assert(! rend_encode_service_descriptor(d1, pk1, &encoded, &len));
-  d2 = rend_parse_service_descriptor(encoded, len);
-  test_assert(d2);
-
-  test_assert(!crypto_pk_cmp_keys(d1->pk, d2->pk));
-  test_eq(d2->timestamp, now);
-  test_eq(d2->version, 0);
-  test_eq(d2->protocols, 1<<2);
-  test_eq(smartlist_len(d2->intro_nodes), 3);
-  for (i = 0; i < 3; i++) {
-    rend_intro_point_t *intro1 = smartlist_get(d1->intro_nodes, i);
-    rend_intro_point_t *intro2 = smartlist_get(d2->intro_nodes, i);
-    test_streq(intro1->extend_info->nickname,
-               intro2->extend_info->nickname);
-  }
-
-  test_assert(BAD_HOSTNAME == parse_extended_hostname(address1));
-  test_assert(ONION_HOSTNAME == parse_extended_hostname(address2));
-  test_assert(EXIT_HOSTNAME == parse_extended_hostname(address3));
-  test_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4));
-
-  crypto_free_pk_env(pk1);
-  crypto_free_pk_env(pk2);
-  pk1 = pk2 = NULL;
-  rend_service_descriptor_free(d1);
-  rend_service_descriptor_free(d2);
-  d1 = d2 = NULL;
-
- done:
-  if (pk1)
-    crypto_free_pk_env(pk1);
-  if (pk2)
-    crypto_free_pk_env(pk2);
-  if (d1)
-    rend_service_descriptor_free(d1);
-  if (d2)
-    rend_service_descriptor_free(d2);
-  tor_free(encoded);
-}
-
 /** Run AES performance benchmarks. */
 static void
 bench_aes(void)
@@ -4356,6 +4361,39 @@
   tor_free(f);
 }
 
+static void
+test_util_strtok(void)
+{
+  char buf[128];
+  char buf2[128];
+  char *cp1, *cp2;
+  strlcpy(buf, "Graved on the dark in gestures of descent", sizeof(buf));
+  strlcpy(buf2, "they.seemed;their!own;most.perfect;monument", sizeof(buf2));
+  /*  -- "Year's End", Richard Wilbur */
+
+  test_streq("Graved", tor_strtok_r_impl(buf, " ", &cp1));
+  test_streq("they", tor_strtok_r_impl(buf2, ".!..;!", &cp2));
+#define S1() tor_strtok_r_impl(NULL, " ", &cp1)
+#define S2() tor_strtok_r_impl(NULL, ".!..;!", &cp2)
+  test_streq("on", S1());
+  test_streq("the", S1());
+  test_streq("dark", S1());
+  test_streq("seemed", S2());
+  test_streq("their", S2());
+  test_streq("own", S2());
+  test_streq("in", S1());
+  test_streq("gestures", S1());
+  test_streq("of", S1());
+  test_streq("most", S2());
+  test_streq("perfect", S2());
+  test_streq("descent", S1());
+  test_streq("monument", S2());
+  test_assert(NULL == S1());
+  test_assert(NULL == S2());
+ done:
+  ;
+}
+
 /** Test AES-CTR encryption and decryption with IV. */
 static void
 test_crypto_aes_iv(void)
@@ -4539,9 +4577,9 @@
   ;
 }
 
-/** Test encoding and parsing of v2 rendezvous service descriptors. */
+/** Test encoding and parsing of rendezvous service descriptors. */
 static void
-test_rend_fns_v2(void)
+test_rend_fns(void)
 {
   rend_service_descriptor_t *generated = NULL, *parsed = NULL;
   char service_id[DIGEST_LEN];
@@ -4556,6 +4594,16 @@
   size_t intro_points_size;
   size_t encoded_size;
   int i;
+  char address1[] = "fooaddress.onion";
+  char address2[] = "aaaaaaaaaaaaaaaa.onion";
+  char address3[] = "fooaddress.exit";
+  char address4[] = "www.torproject.org";
+
+  test_assert(BAD_HOSTNAME == parse_extended_hostname(address1, 1));
+  test_assert(ONION_HOSTNAME == parse_extended_hostname(address2, 1));
+  test_assert(EXIT_HOSTNAME == parse_extended_hostname(address3, 1));
+  test_assert(NORMAL_HOSTNAME == parse_extended_hostname(address4, 1));
+
   pk1 = pk_generate(0);
   pk2 = pk_generate(1);
   generated = tor_malloc_zero(sizeof(rend_service_descriptor_t));
@@ -4678,25 +4726,25 @@
   get_options()->BridgeRecordUsageByCountry = 1;
   /* Put 9 observations in AB... */
   for (i=32; i < 40; ++i)
-    geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now);
-  geoip_note_client_seen(GEOIP_CLIENT_CONNECT, 225, now);
+    geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-7200);
+  geoip_note_client_seen(GEOIP_CLIENT_CONNECT, 225, now-7200);
   /* and 3 observations in XY, several times. */
   for (j=0; j < 10; ++j)
     for (i=52; i < 55; ++i)
       geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-3600);
   /* and 17 observations in ZZ... */
   for (i=110; i < 127; ++i)
-    geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now-7200);
+    geoip_note_client_seen(GEOIP_CLIENT_CONNECT, i, now);
   s = geoip_get_client_history(now+5*24*60*60, GEOIP_CLIENT_CONNECT);
   test_assert(s);
   test_streq("zz=24,ab=16,xy=8", s);
   tor_free(s);
 
-  /* Now clear out all the zz observations. */
+  /* Now clear out all the AB observations. */
   geoip_remove_old_clients(now-6000);
   s = geoip_get_client_history(now+5*24*60*60, GEOIP_CLIENT_CONNECT);
   test_assert(s);
-  test_streq("ab=16,xy=8", s);
+  test_streq("zz=24,xy=8", s);
 
  done:
   tor_free(s);
@@ -4754,13 +4802,14 @@
   SUBENT(util, threads),
   SUBENT(util, order_functions),
   SUBENT(util, sscanf),
+  SUBENT(util, strtok),
   ENT(onion_handshake),
   ENT(dir_format),
   ENT(dirutil),
+  SUBENT(dirutil, measured_bw),
   ENT(v3_networkstatus),
   ENT(policies),
   ENT(rend_fns),
-  SUBENT(rend_fns, v2),
   ENT(geoip),
 
   DISABLED(bench_aes),
@@ -4856,12 +4905,13 @@
   }
 
   options->command = CMD_RUN_UNITTESTS;
-  crypto_global_init(0);
+  crypto_global_init(0, NULL, NULL);
   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);

Modified: tor/trunk/src/or/test_data.c
===================================================================
--- tor/trunk/src/or/test_data.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/test_data.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright 2001-2004 Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /** First of 3 example authority certificates for unit testing. */

Modified: tor/trunk/src/or/tor_main.c
===================================================================
--- tor/trunk/src/or/tor_main.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/or/tor_main.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,6 +1,6 @@
 /* Copyright 2001-2004 Roger Dingledine.
  * Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson.
- * Copyright (c) 2007-2008, The Tor Project, Inc. */
+ * Copyright (c) 2007-2009, The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 /** String describing which Tor subversion repository version the source was

Modified: tor/trunk/src/tools/Makefile.am
===================================================================
--- tor/trunk/src/tools/Makefile.am	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/tools/Makefile.am	2009-08-19 21:47:25 UTC (rev 20335)
@@ -3,16 +3,16 @@
 
 tor_resolve_SOURCES = tor-resolve.c
 tor_resolve_LDFLAGS = @TOR_LDFLAGS_libevent@
-tor_resolve_LDADD = ../common/libor.a -levent @TOR_LIB_WS32@
+tor_resolve_LDADD = ../common/libor.a @TOR_LIB_WS32@
 
 tor_gencert_SOURCES = tor-gencert.c
 tor_gencert_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
         @TOR_LDFLAGS_libevent@
 tor_gencert_LDADD = ../common/libor.a ../common/libor-crypto.a \
-        -lz -lcrypto -levent @TOR_LIB_WS32@ @TOR_LIB_GDI@
+        -lz -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@
 
 tor_checkkey_SOURCES = tor-checkkey.c
 tor_checkkey_LDFLAGS = @TOR_LDFLAGS_zlib@ @TOR_LDFLAGS_openssl@ \
         @TOR_LDFLAGS_libevent@
 tor_checkkey_LDADD = ../common/libor.a ../common/libor-crypto.a \
-        -lz -lcrypto -levent @TOR_LIB_WS32@ @TOR_LIB_GDI@
+        -lz -lcrypto @TOR_LIB_WS32@ @TOR_LIB_GDI@

Modified: tor/trunk/src/tools/tor-checkkey.c
===================================================================
--- tor/trunk/src/tools/tor-checkkey.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/tools/tor-checkkey.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -29,7 +29,7 @@
     return 1;
   }
 
-  if (crypto_global_init(0)) {
+  if (crypto_global_init(0, NULL, NULL)) {
     fprintf(stderr, "Couldn't initialize crypto library.\n");
     return 1;
   }

Modified: tor/trunk/src/tools/tor-gencert.c
===================================================================
--- tor/trunk/src/tools/tor-gencert.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/tools/tor-gencert.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,4 +1,4 @@
-/* Copyright (c) 2007-2008 The Tor Project, Inc. */
+/* Copyright (c) 2007-2009 The Tor Project, Inc. */
 /* See LICENSE for licensing information */
 
 #include "orconfig.h"
@@ -496,7 +496,7 @@
   init_logging();
 
   /* Don't bother using acceleration. */
-  if (crypto_global_init(0)) {
+  if (crypto_global_init(0, NULL, NULL)) {
     fprintf(stderr, "Couldn't initialize crypto library.\n");
     return 1;
   }

Modified: tor/trunk/src/tools/tor-resolve.c
===================================================================
--- tor/trunk/src/tools/tor-resolve.c	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/tools/tor-resolve.c	2009-08-19 21:47:25 UTC (rev 20335)
@@ -1,5 +1,5 @@
 /* Copyright (c) 2004-2006, Roger Dingledine, Nick Mathewson
- * Copyright (c) 2007-2008, The Tor Project, Inc.
+ * Copyright (c) 2007-2009, The Tor Project, Inc.
  */
 /* See LICENSE for licensing information */
 
@@ -107,7 +107,8 @@
  * Return 0 on success, -1 on error.
  */
 static int
-parse_socks4a_resolve_response(const char *response, size_t len,
+parse_socks4a_resolve_response(const char *hostname,
+                               const char *response, size_t len,
                                uint32_t *addr_out)
 {
   uint8_t status;
@@ -129,6 +130,13 @@
   }
   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);
+      return -1;
+    }
     return -1;
   }
 
@@ -241,7 +249,8 @@
       log_err(LD_NET, "Error reading SOCKS4 response.");
       return -1;
     }
-    if (parse_socks4a_resolve_response(reply_buf, RESPONSE_LEN_4,
+    if (parse_socks4a_resolve_response(hostname,
+                                       reply_buf, RESPONSE_LEN_4,
                                        result_addr)<0){
       return -1;
     }
@@ -260,6 +269,13 @@
       log_warn(LD_NET,"Got SOCKS5 status response '%u': %s",
                (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);
+      }
       return -1;
     }
     if (reply_buf[3] == 1) {
@@ -396,14 +412,6 @@
     usage();
   }
 
-  if (!strcasecmpend(arg[0], ".onion") && !force) {
-    fprintf(stderr,
-       "%s is a hidden service; those don't have IP addresses.\n\n"
-       "To connect to a hidden service, you need to send the hostname\n"
-       "to Tor; we suggest an application that uses SOCKS 4a.\n", arg[0]);
-    return 1;
-  }
-
   if (network_init()<0) {
     log_err(LD_BUG,"Error initializing network; exiting.");
     return 1;

Modified: tor/trunk/src/win32/orconfig.h
===================================================================
--- tor/trunk/src/win32/orconfig.h	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/src/win32/orconfig.h	2009-08-19 21:47:25 UTC (rev 20335)
@@ -226,6 +226,5 @@
 #define USING_TWOS_COMPLEMENT
 
 /* Version number of package */
-#define VERSION "0.2.1.14-rc"
+#define VERSION "0.2.2.0-alpha-dev"
 
-

Modified: tor/trunk/tor.spec.in
===================================================================
--- tor/trunk/tor.spec.in	2009-08-19 21:39:02 UTC (rev 20334)
+++ tor/trunk/tor.spec.in	2009-08-19 21:47:25 UTC (rev 20335)
@@ -15,13 +15,6 @@
 %define toruser @TORUSER@
 %define torgroup @TORGROUP@
 
-## Target a specific arch and OS
-#
-# default is i386 linux
-
-## Override any system rpm macros
-#
-
 ## Version song and dance
 #
 # This should be the Tor version number, as it appears on the tarball,
@@ -54,15 +47,12 @@
 
 %if %{is_fc}
 %define ostag %(sed -e 's/^.*release /fc/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/fedora-release)
-%else
+%endif
+
 %if %{is_rh}
 %define ostag %(sed -e 's/^.*release /rh/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redhat-release)
 %endif
-%endif
 
-# These are probably wrong... just placeholders should we actually
-# end up supporting these distributions
-
 %if %{is_mdk}
 %define ostag mdk
 %endif
@@ -72,7 +62,7 @@
 %endif
 
 %if %{is_rfl}
-%define ostag redflag%(sed -e 's/^.*Desktop /redflag/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redflag-release)
+%define ostag %(sed -e 's/^.*Desktop /redflag/' -e 's/ .*$//' -e 's/\\./_/g' < /etc/redflag-release)
 %endif
 
 # Using the build date ensures that every build really does get
@@ -119,11 +109,11 @@
 Packager: Andrew Lewman <andrew@xxxxxxxxxxxxxx>
 
 %if %{is_suse}
-Requires: openssl >= 0.9.6
-BuildRequires: openssl-devel >= 0.9.6, rpm >= 4.0, zlib-devel
+Requires: openssl >= 0.9.7
+BuildRequires: openssl-devel >= 0.9.7, rpm >= 4.0, zlib-devel
 %else 
-Requires: openssl >= 0.9.6, libevent >= 1.1
-BuildRequires: openssl-devel >= 0.9.6, libevent-devel >= 1.1
+Requires: openssl >= 0.9.7
+BuildRequires: openssl-devel >= 0.9.7
 %endif
 %if %{is_fc}
 BuildRequires: rpm-build >= 4.0
@@ -290,6 +280,9 @@
 
 %changelog
 
+* Fri May 01 2009 Andrew Lewman <andrew@xxxxxxxxxxxxxx>
+- clean up distro detection and remove dead comment blocks
+
 * Sun Feb 22 2009 Andrew Lewman <andrew@xxxxxxxxxxxxxx>
 - update the description, vendor, and packager