diff options
Diffstat (limited to 'contrib')
38 files changed, 2201 insertions, 1070 deletions
diff --git a/contrib/debian/changelog b/contrib/debian/changelog index 110bfe03ef..33dab9b638 100644 --- a/contrib/debian/changelog +++ b/contrib/debian/changelog @@ -1,3 +1,122 @@ +bitcoin (0.14.1-trusty4) trusty; urgency=medium + + * Re-enable UPnP support. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 05 May 2017 13:28:00 -0400 + +bitcoin (0.14.1-trusty3) trusty; urgency=medium + + * Build with qt5 if we are on a non-Ubuntu (ie non-Unity) distro. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 04 May 2017 17:13:00 -0400 + +bitcoin (0.14.1-trusty2) trusty; urgency=medium + + * Bump minimum boost version in deps. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 04 May 2017 17:12:00 -0400 + +bitcoin (0.14.1-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Sat, 22 Apr 2017 17:10:00 -0400 + +bitcoin (0.14.0-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 08 Mar 2017 10:30:00 -0500 + +bitcoin (0.13.2-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 05 Jan 2017 09:59:00 -0500 + +bitcoin (0.13.1-trusty2) trusty; urgency=medium + + * Revert to Qt4, due to https://github.com/bitcoin/bitcoin/issues/9038 + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Mon, 31 Oct 2016 11:16:00 -0400 + +bitcoin (0.13.1-trusty1) trusty; urgency=medium + + * New upstream release. + * Backport updated bitcoin-qt.desktop from upstream master + * Add zmq dependency + * Switch to Qt5 (breaks precise, but that was already broken by C++11) + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Thu, 27 Oct 2016 17:32:00 -0400 + +bitcoin (0.13.0-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Sun, 04 Sep 2016 22:09:00 -0400 + +bitcoin (0.12.1-trusty1) trusty; urgency=medium + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Mon, 18 Apr 2016 14:26:00 -0700 + +bitcoin (0.12.0-trusty6) trusty; urgency=medium + + * Fix program-options dep. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 25 Mar 2016 21:41:00 -0700 + +bitcoin (0.12.0-trusty5) trusty; urgency=medium + + * Test explicit --with-gui + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 23:25:00 -0800 + +bitcoin (0.12.0-trusty4) trusty; urgency=medium + + * Fix libevent-dev dep. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 23:25:00 -0800 + +bitcoin (0.12.0-trusty3) trusty; urgency=medium + + * Fix precise boost dep. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:55:00 -0800 + +bitcoin (0.12.0-trusty2) trusty; urgency=medium + + * Fix libevent dep. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:53:00 -0800 + +bitcoin (0.12.0-trusty1) trusty; urgency=medium + + * New upstream release + * Various updates to contrib/debian were merged, a few were not + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Tue, 23 Feb 2015 19:29:00 -0800 + +bitcoin (0.11.2-trusty1) trusty; urgency=low + + * New upstream release. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Fri, 13 Nov 2015 18:39:00 -0800 + +bitcoin (0.11.1-trusty2) trusty; urgency=low + + * Remove minupnpc builddep. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 14 Oct 2015 23:06:00 -1000 + +bitcoin (0.11.1-trusty1) trusty; urgency=high + + * New upstream release. + * Disable all UPnP support. + + -- Matt Corallo (BlueMatt) <matt@mattcorallo.com> Wed, 14 Oct 2015 13:57:00 -1000 + bitcoin (0.11.0-precise1) precise; urgency=medium * New upstream release. @@ -179,7 +298,7 @@ bitcoin (0.5.3-natty0) natty; urgency=low bitcoin (0.5.2-natty1) natty; urgency=low * Remove mentions on anonymity in package descriptions and manpage. - These should never have been there, bitcoin isn't anonymous without + These should never have been there, bitcoin isnt anonymous without a ton of work that virtually no users will ever be willing and capable of doing @@ -220,7 +339,7 @@ bitcoin (0.5.0~rc1-natty1) natty; urgency=low * Add test_bitcoin to build test * Fix clean - * Remove unnecessary build-dependancies + * Remove uneccessary build-dependancies -- Matt Corallo <matt@bluematt.me> Wed, 26 Oct 2011 14:37:18 -0400 @@ -380,7 +499,7 @@ bitcoin (0.3.20.01~dfsg-1) unstable; urgency=low bitcoin (0.3.19~dfsg-6) unstable; urgency=low - * Fix override aggressive optimizations. + * Fix override agressive optimizations. * Fix tighten build-dependencies to really fit backporting to Lenny: + Add fallback build-dependency on libdb4.6++-dev. + Tighten unversioned Boost build-dependencies to recent versions, diff --git a/contrib/debian/control b/contrib/debian/control index fce6bc0118..0d6ad25e24 100644 --- a/contrib/debian/control +++ b/contrib/debian/control @@ -1,27 +1,30 @@ Source: bitcoin Section: utils Priority: optional -Maintainer: Jonas Smedegaard <dr@jones.dk> -Uploaders: Micah Anderson <micah@debian.org> +Maintainer: Matt Corallo <matt@mattcorallo.com> +Uploaders: Matt Corallo <matt@mattcorallo.com> Build-Depends: debhelper, devscripts, automake, libtool, bash-completion, - libboost-system-dev (>> 1.35) | libboost-system1.35-dev, libdb4.8++-dev, libssl-dev, pkg-config, - libminiupnpc8-dev | libminiupnpc-dev (>> 1.6), - libboost-filesystem-dev (>> 1.35) | libboost-filesystem1.35-dev, - libboost-program-options-dev (>> 1.35) | libboost-program-options1.35-dev, - libboost-thread-dev (>> 1.35) | libboost-thread1.35-dev, - libboost-test-dev (>> 1.35) | libboost-test1.35-dev, - qt4-qmake, - libqt4-dev, + libevent-dev, + libboost-system1.48-dev | libboost-system-dev (>> 1.47), + libboost-filesystem1.48-dev | libboost-filesystem-dev (>> 1.47), + libboost-program-options1.48-dev | libboost-program-options-dev (>> 1.47), + libboost-thread1.48-dev | libboost-thread-dev (>> 1.47), + libboost-test1.48-dev | libboost-test-dev (>> 1.47), + libboost-chrono1.48-dev | libboost-chrono-dev (>> 1.47), + libminiupnpc8-dev | libminiupnpc-dev, + qt4-qmake, libqt4-dev, + qttools5-dev-tools, qttools5-dev, libqrencode-dev, libprotobuf-dev, protobuf-compiler, - python + python, + libzmq3-dev Standards-Version: 3.9.2 Homepage: https://bitcoincore.org/ Vcs-Git: git://github.com/bitcoin/bitcoin.git @@ -31,11 +34,11 @@ Package: bitcoind Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - daemon - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides the daemon, bitcoind, and the CLI tool bitcoin-cli to interact with the daemon. @@ -44,11 +47,11 @@ Package: bitcoin-qt Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer network based digital currency - Qt GUI - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides Bitcoin-Qt, a GUI for Bitcoin based on Qt. @@ -56,11 +59,11 @@ Package: bitcoin-tx Architecture: any Depends: ${shlibs:Depends}, ${misc:Depends} Description: peer-to-peer digital currency - standalone transaction tool - Bitcoin is an experimental new digital currency that enables instant - payments to anyone, anywhere in the world. Bitcoin uses peer-to-peer - technology to operate with no central authority: managing transactions - and issuing money are carried out collectively by the network. Bitcoin Core - is the name of the open source software which enables the use of this currency. + Bitcoin is a free open source peer-to-peer electronic cash system that + is completely decentralized, without the need for a central server or + trusted parties. Users hold the crypto keys to their own money and + transact directly with each other, with the help of a P2P network to + check for double-spending. . This package provides bitcoin-tx, a command-line transaction creation tool which can be used without a bitcoin daemon. Some means of diff --git a/contrib/debian/examples/bitcoin.conf b/contrib/debian/examples/bitcoin.conf index afbc7882e0..1029a51073 100644 --- a/contrib/debian/examples/bitcoin.conf +++ b/contrib/debian/examples/bitcoin.conf @@ -116,12 +116,7 @@ # running on another host using this option: #rpcconnect=127.0.0.1 -# Transaction Fee Changes in 0.10.0 - -# Send transactions as zero-fee transactions if possible (default: 0) -#sendfreetransactions=0 - -# Create transactions that have enough fees (or priority) so they are likely to begin confirmation within n blocks (default: 1). +# Create transactions that have enough fees so they are likely to begin confirmation within n blocks (default: 6). # This setting is over-ridden by the -paytxfee option. #txconfirmtarget=n @@ -136,6 +131,13 @@ # be validated sooner. #paytxfee=0.00 +# Enable pruning to reduce storage requirements by deleting old blocks. +# This mode is incompatible with -txindex and -rescan. +# 0 = default (no pruning). +# 1 = allows manual pruning via RPC. +# >=550 = target to stay under in MiB. +#prune=550 + # User interface options # Start Bitcoin minimized diff --git a/contrib/debian/rules b/contrib/debian/rules index 3896d2caa3..6885e38521 100755 --- a/contrib/debian/rules +++ b/contrib/debian/rules @@ -12,10 +12,12 @@ override_dh_auto_clean: if [ -f Makefile ]; then $(MAKE) distclean; fi rm -rf Makefile.in aclocal.m4 configure src/Makefile.in src/bitcoin-config.h.in src/build-aux src/qt/Makefile.in src/qt/test/Makefile.in src/test/Makefile.in +QT=$(shell dpkg-vendor --derives-from Ubuntu && echo qt4 || echo qt5) + # Yea, autogen should be run on the source archive, but I like doing git archive override_dh_auto_configure: ./autogen.sh - ./configure + ./configure --with-gui=$(QT) override_dh_auto_test: make check diff --git a/contrib/devtools/check-doc.py b/contrib/devtools/check-doc.py index 249214e931..3b7a8f9a61 100755 --- a/contrib/devtools/check-doc.py +++ b/contrib/devtools/check-doc.py @@ -21,7 +21,7 @@ CMD_GREP_DOCS = r"egrep -r -I 'HelpMessageOpt\(\"\-[^\"=]+?(=|\")' %s" % (CMD_RO REGEX_ARG = re.compile(r'(?:map(?:Multi)?Args(?:\.count\(|\[)|Get(?:Bool)?Arg\()\"(\-[^\"]+?)\"') REGEX_DOC = re.compile(r'HelpMessageOpt\(\"(\-[^\"=]+?)(?:=|\")') # list unsupported, deprecated and duplicate args as they need no documentation -SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize']) +SET_DOC_OPTIONAL = set(['-rpcssl', '-benchmark', '-h', '-help', '-socks', '-tor', '-debugnet', '-whitelistalwaysrelay', '-prematurewitness', '-walletprematurewitness', '-promiscuousmempoolflags', '-blockminsize', '-dbcrashratio', '-forcecompactdb']) def main(): used = check_output(CMD_GREP_ARGS, shell=True) diff --git a/contrib/devtools/commit-script-check.sh b/contrib/devtools/commit-script-check.sh new file mode 100755 index 0000000000..1c9dbc7f68 --- /dev/null +++ b/contrib/devtools/commit-script-check.sh @@ -0,0 +1,46 @@ +#!/bin/sh +# Copyright (c) 2017 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +# This simple script checks for commits beginning with: scripted-diff: +# If found, looks for a script between the lines -BEGIN VERIFY SCRIPT- and +# -END VERIFY SCRIPT-. If no ending is found, it reads until the end of the +# commit message. + +# The resulting script should exactly transform the previous commit into the current +# one. Any remaining diff signals an error. + +if test "x$1" = "x"; then + echo "Usage: $0 <commit>..." + exit 1 +fi + +RET=0 +PREV_BRANCH=`git name-rev --name-only HEAD` +PREV_HEAD=`git rev-parse HEAD` +for i in `git rev-list --reverse $1`; do + if git rev-list -n 1 --pretty="%s" $i | grep -q "^scripted-diff:"; then + git checkout --quiet $i^ || exit + SCRIPT="`git rev-list --format=%b -n1 $i | sed '/^-BEGIN VERIFY SCRIPT-$/,/^-END VERIFY SCRIPT-$/{//!b};d'`" + if test "x$SCRIPT" = "x"; then + echo "Error: missing script for: $i" + echo "Failed" + RET=1 + else + echo "Running script for: $i" + echo "$SCRIPT" + eval "$SCRIPT" + git --no-pager diff --exit-code $i && echo "OK" || (echo "Failed"; false) || RET=1 + fi + git reset --quiet --hard HEAD + else + if git rev-list "--format=%b" -n1 $i | grep -q '^-\(BEGIN\|END\)[ a-zA-Z]*-$'; then + echo "Error: script block marker but no scripted-diff in title" + echo "Failed" + RET=1 + fi + fi +done +git checkout --quiet $PREV_BRANCH 2>/dev/null || git checkout --quiet $PREV_HEAD +exit $RET diff --git a/contrib/devtools/copyright_header.py b/contrib/devtools/copyright_header.py index 9f35c378bf..6d801d3ac7 100755 --- a/contrib/devtools/copyright_header.py +++ b/contrib/devtools/copyright_header.py @@ -32,7 +32,7 @@ EXCLUDE = [ 'src/tinyformat.h', 'src/leveldb/util/env_win.cc', 'src/crypto/ctaes/bench.c', - 'qa/rpc-tests/test_framework/bignum.py', + 'test/functional/test_framework/bignum.py', # python init: '*__init__.py', ] diff --git a/contrib/devtools/github-merge.py b/contrib/devtools/github-merge.py index 0cee0921b1..c664cf81fa 100755 --- a/contrib/devtools/github-merge.py +++ b/contrib/devtools/github-merge.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -# Copyright (c) 2016 The Bitcoin Core developers +# Copyright (c) 2016-2017 Bitcoin Core Developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. @@ -18,6 +18,7 @@ from __future__ import division,print_function,unicode_literals import os from sys import stdin,stdout,stderr import argparse +import hashlib import subprocess import json,codecs try: @@ -69,6 +70,67 @@ def ask_prompt(text): print("",file=stderr) return reply +def get_symlink_files(): + files = sorted(subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', 'HEAD']).splitlines()) + ret = [] + for f in files: + if (int(f.decode('utf-8').split(" ")[0], 8) & 0o170000) == 0o120000: + ret.append(f.decode('utf-8').split("\t")[1]) + return ret + +def tree_sha512sum(commit='HEAD'): + # request metadata for entire tree, recursively + files = [] + blob_by_name = {} + for line in subprocess.check_output([GIT, 'ls-tree', '--full-tree', '-r', commit]).splitlines(): + name_sep = line.index(b'\t') + metadata = line[:name_sep].split() # perms, 'blob', blobid + assert(metadata[1] == b'blob') + name = line[name_sep+1:] + files.append(name) + blob_by_name[name] = metadata[2] + + files.sort() + # open connection to git-cat-file in batch mode to request data for all blobs + # this is much faster than launching it per file + p = subprocess.Popen([GIT, 'cat-file', '--batch'], stdout=subprocess.PIPE, stdin=subprocess.PIPE) + overall = hashlib.sha512() + for f in files: + blob = blob_by_name[f] + # request blob + p.stdin.write(blob + b'\n') + p.stdin.flush() + # read header: blob, "blob", size + reply = p.stdout.readline().split() + assert(reply[0] == blob and reply[1] == b'blob') + size = int(reply[2]) + # hash the blob data + intern = hashlib.sha512() + ptr = 0 + while ptr < size: + bs = min(65536, size - ptr) + piece = p.stdout.read(bs) + if len(piece) == bs: + intern.update(piece) + else: + raise IOError('Premature EOF reading git cat-file output') + ptr += bs + dig = intern.hexdigest() + assert(p.stdout.read(1) == b'\n') # ignore LF that follows blob data + # update overall hash with file hash + overall.update(dig.encode("utf-8")) + overall.update(" ".encode("utf-8")) + overall.update(f) + overall.update("\n".encode("utf-8")) + p.stdin.close() + if p.wait(): + raise IOError('Non-zero return value executing git cat-file') + return overall.hexdigest() + +def print_merge_details(pull, title, branch, base_branch, head_branch): + print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET)) + subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch]) + def parse_arguments(): epilog = ''' In addition, you can set the following git configuration variables: @@ -112,7 +174,8 @@ def main(): info = retrieve_pr_info(repo,pull) if info is None: exit(1) - title = info['title'] + title = info['title'].strip() + body = info['body'].strip() # precedence order for destination branch argument: # - command line argument # - githubmerge.branch setting @@ -157,6 +220,9 @@ def main(): subprocess.check_call([GIT,'checkout','-q','-b',local_merge_branch]) try: + # Go up to the repository's root. + toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip() + os.chdir(toplevel) # Create unsigned merge commit. if title: firstline = 'Merge #%s: %s' % (pull,title) @@ -164,6 +230,7 @@ def main(): firstline = 'Merge #%s' % (pull,) message = firstline + '\n\n' message += subprocess.check_output([GIT,'log','--no-merges','--topo-order','--pretty=format:%h %s (%an)',base_branch+'..'+head_branch]).decode('utf-8') + message += '\n\nPull request description:\n\n ' + body.replace('\n', '\n ') + '\n' try: subprocess.check_call([GIT,'merge','-q','--commit','--no-edit','--no-ff','-m',message.encode('utf-8'),head_branch]) except subprocess.CalledProcessError as e: @@ -175,14 +242,30 @@ def main(): print("ERROR: Creating merge failed (already merged?).",file=stderr) exit(4) - print('%s#%s%s %s %sinto %s%s' % (ATTR_RESET+ATTR_PR,pull,ATTR_RESET,title,ATTR_RESET+ATTR_PR,branch,ATTR_RESET)) - subprocess.check_call([GIT,'log','--graph','--topo-order','--pretty=format:'+COMMIT_FORMAT,base_branch+'..'+head_branch]) + symlink_files = get_symlink_files() + for f in symlink_files: + print("ERROR: File %s was a symlink" % f) + if len(symlink_files) > 0: + exit(4) + + # Put tree SHA512 into the message + try: + first_sha512 = tree_sha512sum() + message += '\n\nTree-SHA512: ' + first_sha512 + except subprocess.CalledProcessError as e: + printf("ERROR: Unable to compute tree hash") + exit(4) + try: + subprocess.check_call([GIT,'commit','--amend','-m',message.encode('utf-8')]) + except subprocess.CalledProcessError as e: + printf("ERROR: Cannot update message.",file=stderr) + exit(4) + + print_merge_details(pull, title, branch, base_branch, head_branch) print() + # Run test command if configured. if testcmd: - # Go up to the repository's root. - toplevel = subprocess.check_output([GIT,'rev-parse','--show-toplevel']).strip() - os.chdir(toplevel) if subprocess.call(testcmd,shell=True): print("ERROR: Running %s failed." % testcmd,file=stderr) exit(5) @@ -197,12 +280,6 @@ def main(): print("Difference with github ignored.",file=stderr) else: exit(6) - reply = ask_prompt("Press 'd' to accept the diff.") - if reply.lower() == 'd': - print("Diff accepted.",file=stderr) - else: - print("ERROR: Diff rejected.",file=stderr) - exit(6) else: # Verify the result manually. print("Dropping you on a shell so you can try building/testing the merged source.",file=stderr) @@ -211,24 +288,25 @@ def main(): if os.path.isfile('/etc/debian_version'): # Show pull number on Debian default prompt os.putenv('debian_chroot',pull) subprocess.call([BASH,'-i']) - reply = ask_prompt("Type 'm' to accept the merge.") - if reply.lower() == 'm': - print("Merge accepted.",file=stderr) - else: - print("ERROR: Merge rejected.",file=stderr) - exit(7) + + second_sha512 = tree_sha512sum() + if first_sha512 != second_sha512: + print("ERROR: Tree hash changed unexpectedly",file=stderr) + exit(8) # Sign the merge commit. - reply = ask_prompt("Type 's' to sign off on the merge.") - if reply == 's': - try: - subprocess.check_call([GIT,'commit','-q','--gpg-sign','--amend','--no-edit']) - except subprocess.CalledProcessError as e: - print("Error signing, exiting.",file=stderr) + print_merge_details(pull, title, branch, base_branch, head_branch) + while True: + reply = ask_prompt("Type 's' to sign off on the above merge, or 'x' to reject and exit.").lower() + if reply == 's': + try: + subprocess.check_call([GIT,'commit','-q','--gpg-sign','--amend','--no-edit']) + break + except subprocess.CalledProcessError as e: + print("Error while signing, asking again.",file=stderr) + elif reply == 'x': + print("Not signing off on merge, exiting.",file=stderr) exit(1) - else: - print("Not signing off on merge, exiting.",file=stderr) - exit(1) # Put the result in branch. subprocess.check_call([GIT,'checkout','-q',branch]) @@ -242,9 +320,13 @@ def main(): subprocess.call([GIT,'branch','-q','-D',local_merge_branch],stderr=devnull) # Push the result. - reply = ask_prompt("Type 'push' to push the result to %s, branch %s." % (host_repo,branch)) - if reply.lower() == 'push': - subprocess.check_call([GIT,'push',host_repo,'refs/heads/'+branch]) + while True: + reply = ask_prompt("Type 'push' to push the result to %s, branch %s, or 'x' to exit without pushing." % (host_repo,branch)).lower() + if reply == 'push': + subprocess.check_call([GIT,'push',host_repo,'refs/heads/'+branch]) + break + elif reply == 'x': + exit(1) if __name__ == '__main__': main() diff --git a/contrib/filter-lcov.py b/contrib/filter-lcov.py new file mode 100755 index 0000000000..299377d691 --- /dev/null +++ b/contrib/filter-lcov.py @@ -0,0 +1,25 @@ +#!/usr/bin/env python3 + +import argparse + +parser = argparse.ArgumentParser(description='Remove the coverage data from a tracefile for all files matching the pattern.') +parser.add_argument('--pattern', '-p', action='append', help='the pattern of files to remove', required=True) +parser.add_argument('tracefile', help='the tracefile to remove the coverage data from') +parser.add_argument('outfile', help='filename for the output to be written to') + +args = parser.parse_args() +tracefile = args.tracefile +pattern = args.pattern +outfile = args.outfile + +in_remove = False +with open(tracefile, 'r') as f: + with open(outfile, 'w') as wf: + for line in f: + for p in pattern: + if line.startswith("SF:") and p in line: + in_remove = True + if not in_remove: + wf.write(line) + if line == 'end_of_record\n': + in_remove = False diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml index 6f43119ba2..82f4c7e0a8 100644 --- a/contrib/gitian-descriptors/gitian-linux.yml +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-linux-0.13" +name: "bitcoin-linux-0.15" enable_cache: true suites: - "trusty" @@ -144,6 +144,9 @@ script: | find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd + # Workaround for tarball not building with the bare tag version (prep) + make -C src obj/build.h + ORIGPATH="$PATH" # Extract the release tarball into a dir for each host and build for i in ${HOSTS}; do @@ -154,6 +157,11 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST + # Workaround for tarball not building with the bare tag version + echo '#!/bin/true' >share/genbuild.sh + mkdir src/obj + cp ../src/obj/build.h src/obj/ + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" LDFLAGS="${HOST_LDFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml index 991976d59e..35dee579af 100644 --- a/contrib/gitian-descriptors/gitian-osx.yml +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-osx-0.13" +name: "bitcoin-osx-0.15" enable_cache: true suites: - "trusty" @@ -114,6 +114,9 @@ script: | find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST popd + # Workaround for tarball not building with the bare tag version (prep) + make -C src obj/build.h + ORIGPATH="$PATH" # Extract the release tarball into a dir for each host and build for i in ${HOSTS}; do @@ -124,6 +127,11 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST + # Workaround for tarball not building with the bare tag version + echo '#!/bin/true' >share/genbuild.sh + mkdir src/obj + cp ../src/obj/build.h src/obj/ + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} make ${MAKEOPTS} make install-strip DESTDIR=${INSTALLPATH} diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml index fe01b5b957..b396116599 100644 --- a/contrib/gitian-descriptors/gitian-win.yml +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -1,5 +1,5 @@ --- -name: "bitcoin-win-0.13" +name: "bitcoin-win-0.15" enable_cache: true suites: - "trusty" @@ -131,6 +131,9 @@ script: | cp ../$SOURCEDIST $OUTDIR/src popd + # Workaround for tarball not building with the bare tag version (prep) + make -C src obj/build.h + ORIGPATH="$PATH" # Extract the release tarball into a dir for each host and build for i in ${HOSTS}; do @@ -141,11 +144,17 @@ script: | mkdir -p ${INSTALLPATH} tar --strip-components=1 -xf ../$SOURCEDIST + # Workaround for tarball not building with the bare tag version + echo '#!/bin/true' >share/genbuild.sh + mkdir src/obj + cp ../src/obj/build.h src/obj/ + CONFIG_SITE=${BASEPREFIX}/${i}/share/config.site ./configure --prefix=/ --disable-ccache --disable-maintainer-mode --disable-dependency-tracking ${CONFIGFLAGS} CFLAGS="${HOST_CFLAGS}" CXXFLAGS="${HOST_CXXFLAGS}" make ${MAKEOPTS} make ${MAKEOPTS} -C src check-security make deploy make install DESTDIR=${INSTALLPATH} + rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe cp -f bitcoin-*setup*.exe $OUTDIR/ cd installed mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ @@ -159,9 +168,11 @@ script: | cd ../../ rm -rf distsrc-${i} done - cd $OUTDIR - rename 's/-setup\.exe$/-setup-unsigned.exe/' *-setup.exe - find . -name "*-setup-unsigned.exe" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz + cp -rf contrib/windeploy $BUILD_DIR + cd $BUILD_DIR/windeploy + mkdir unsigned + cp $OUTDIR/bitcoin-*setup-unsigned.exe unsigned/ + find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-win-unsigned.tar.gz mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.zip ${OUTDIR}/${DISTNAME}-win64-debug.zip mv ${OUTDIR}/${DISTNAME}-i686-*-debug.zip ${OUTDIR}/${DISTNAME}-win32-debug.zip mv ${OUTDIR}/${DISTNAME}-x86_64-*.zip ${OUTDIR}/${DISTNAME}-win64.zip diff --git a/contrib/gitian-keys/laanwj-key.pgp b/contrib/gitian-keys/laanwj-key.pgp Binary files differindex 559295109d..eed232a872 100644 --- a/contrib/gitian-keys/laanwj-key.pgp +++ b/contrib/gitian-keys/laanwj-key.pgp diff --git a/contrib/init/README.md b/contrib/init/README.md index eb5d30acce..1a949f3c07 100644 --- a/contrib/init/README.md +++ b/contrib/init/README.md @@ -1,12 +1,12 @@ Sample configuration files for: - +``` SystemD: bitcoind.service Upstart: bitcoind.conf OpenRC: bitcoind.openrc bitcoind.openrcconf CentOS: bitcoind.init OS X: org.bitcoin.bitcoind.plist - +``` have been made available to assist packagers in creating node packages here. See doc/init.md for more information. diff --git a/contrib/init/bitcoind.openrcconf b/contrib/init/bitcoind.openrcconf index 0cbff6d30d..f70e25cb5f 100644 --- a/contrib/init/bitcoind.openrcconf +++ b/contrib/init/bitcoind.openrcconf @@ -23,7 +23,7 @@ #BITCOIND_NICE=0 # Additional options (avoid -conf and -datadir, use flags above) -BITCOIND_OPTS="-disablewallet" +#BITCOIND_OPTS="" # The timeout in seconds OpenRC will wait for bitcoind to terminate # after a SIGTERM has been raised. diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md index 0971e7816b..f2a2ab2768 100644 --- a/contrib/linearize/README.md +++ b/contrib/linearize/README.md @@ -7,7 +7,8 @@ run using Python 3 but are compatible with Python 2. $ ./linearize-hashes.py linearize.cfg > hashlist.txt Required configuration file settings for linearize-hashes: -* RPC: `rpcuser`, `rpcpassword` +* RPC: `datadir` (Required if `rpcuser` and `rpcpassword` are not specified) +* RPC: `rpcuser`, `rpcpassword` (Required if `datadir` is not specified) Optional config file setting for linearize-hashes: * RPC: `host` (Default: `127.0.0.1`) diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg index 2cc910edfe..d019b06b6c 100644 --- a/contrib/linearize/example-linearize.cfg +++ b/contrib/linearize/example-linearize.cfg @@ -1,6 +1,7 @@ # bitcoind RPC settings (linearize-hashes) rpcuser=someuser rpcpassword=somepassword +#datadir=~/.bitcoin host=127.0.0.1 port=8332 #port=18332 diff --git a/contrib/linearize/linearize-hashes.py b/contrib/linearize/linearize-hashes.py index 00a54d0820..db8eb7021e 100755 --- a/contrib/linearize/linearize-hashes.py +++ b/contrib/linearize/linearize-hashes.py @@ -16,6 +16,8 @@ import json import re import base64 import sys +import os +import os.path settings = {} @@ -93,6 +95,14 @@ def get_block_hashes(settings, max_blocks_per_call=10000): height += num_blocks +def get_rpc_cookie(): + # Open the cookie file + with open(os.path.join(os.path.expanduser(settings['datadir']), '.cookie'), 'r') as f: + combined = f.readline() + combined_split = combined.split(":") + settings['rpcuser'] = combined_split[0] + settings['rpcpassword'] = combined_split[1] + if __name__ == '__main__': if len(sys.argv) != 2: print("Usage: linearize-hashes.py CONFIG-FILE") @@ -122,8 +132,15 @@ if __name__ == '__main__': settings['max_height'] = 313000 if 'rev_hash_bytes' not in settings: settings['rev_hash_bytes'] = 'false' + + use_userpass = True + use_datadir = False if 'rpcuser' not in settings or 'rpcpassword' not in settings: - print("Missing username and/or password in cfg file", file=stderr) + use_userpass = False + if 'datadir' in settings and not use_userpass: + use_datadir = True + if not use_userpass and not use_datadir: + print("Missing datadir or username and/or password in cfg file", file=stderr) sys.exit(1) settings['port'] = int(settings['port']) @@ -133,4 +150,8 @@ if __name__ == '__main__': # Force hash byte format setting to be lowercase to make comparisons easier. settings['rev_hash_bytes'] = settings['rev_hash_bytes'].lower() + # Get the rpc user and pass from the cookie if the datadir is set + if use_datadir: + get_rpc_cookie() + get_block_hashes(settings) diff --git a/contrib/macdeploy/detached-sig-create.sh b/contrib/macdeploy/detached-sig-create.sh index 5022ea88bc..7f017bb4f1 100755 --- a/contrib/macdeploy/detached-sig-create.sh +++ b/contrib/macdeploy/detached-sig-create.sh @@ -10,7 +10,7 @@ BUNDLE="${ROOTDIR}/Bitcoin-Qt.app" CODESIGN=codesign TEMPDIR=sign.temp TEMPLIST=${TEMPDIR}/signatures.txt -OUT=signature.tar.gz +OUT=signature-osx.tar.gz OUTROOT=osx if [ ! -n "$1" ]; then diff --git a/contrib/macdeploy/macdeployqtplus b/contrib/macdeploy/macdeployqtplus index 5995f9f438..23a568ad13 100755 --- a/contrib/macdeploy/macdeployqtplus +++ b/contrib/macdeploy/macdeployqtplus @@ -302,7 +302,6 @@ def copyFramework(framework, path, verbose): if os.path.exists(fromContentsDir): toContentsDir = os.path.join(path, framework.destinationVersionContentsDirectory) shutil.copytree(fromContentsDir, toContentsDir, symlinks=True) - contentslinkfrom = os.path.join(path, framework.destinationContentsDirectory) if verbose >= 3: print("Copied Contents:", fromContentsDir) print(" to:", toContentsDir) @@ -675,9 +674,8 @@ else: if verbose >= 2: print("+ Installing qt.conf +") -f = open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") -f.write(qt_conf.encode()) -f.close() +with open(os.path.join(applicationBundle.resourcesPath, "qt.conf"), "wb") as f: + f.write(qt_conf.encode()) # ------------------------------------------------ diff --git a/contrib/rpm/README.md b/contrib/rpm/README.md index e1fd0b317b..4ab2f35680 100644 --- a/contrib/rpm/README.md +++ b/contrib/rpm/README.md @@ -181,5 +181,5 @@ knows what they are getting when installing the GUI package. As far as minor differences, I generally prefer to assign the file permissions in the `%files` portion of an RPM spec file rather than specifying the -permissions of a file during `%install` and other minor things like that that +permissions of a file during `%install` and other minor things like that are largely just cosmetic. diff --git a/contrib/rpm/bitcoin.if b/contrib/rpm/bitcoin.if index 2b096c24dc..b206866cc5 100644 --- a/contrib/rpm/bitcoin.if +++ b/contrib/rpm/bitcoin.if @@ -121,7 +121,7 @@ interface(`bitcoin_manage_lib_dirs',` ######################################## ## <summary> ## All of the rules required to administrate -## an bitcoin environment +## a bitcoin environment ## </summary> ## <param name="domain"> ## <summary> diff --git a/contrib/rpm/bitcoin.spec b/contrib/rpm/bitcoin.spec index 516f42334e..cc54fcaf3d 100644 --- a/contrib/rpm/bitcoin.spec +++ b/contrib/rpm/bitcoin.spec @@ -311,10 +311,8 @@ rm -f %{buildroot}%{_bindir}/test_* %check make check -pushd src -srcdir=. test/bitcoin-util-test.py -popd -qa/pull-tester/rpc-tests.py -extended +srcdir=src test/bitcoin-util-test.py +test/functional/test_runner.py --extended %post libs -p /sbin/ldconfig diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md index afe902fd7f..139c03181f 100644 --- a/contrib/seeds/README.md +++ b/contrib/seeds/README.md @@ -8,7 +8,7 @@ and remove old versions as necessary. The seeds compiled into the release are created from sipa's DNS seed data, like this: - curl -s http://bitcoin.sipa.be/seeds.txt > seeds_main.txt + curl -s http://bitcoin.sipa.be/seeds.txt.gz | gzip -dc > seeds_main.txt python3 makeseeds.py < seeds_main.txt > nodes_main.txt python3 generate-seeds.py . > ../../src/chainparamsseeds.h diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py index 34f0f57671..877a7836ef 100755 --- a/contrib/seeds/makeseeds.py +++ b/contrib/seeds/makeseeds.py @@ -30,7 +30,7 @@ import collections PATTERN_IPV4 = re.compile(r"^((\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})):(\d+)$") PATTERN_IPV6 = re.compile(r"^\[([0-9a-z:]+)\]:(\d+)$") PATTERN_ONION = re.compile(r"^([abcdefghijklmnopqrstuvwxyz234567]{16}\.onion):(\d+)$") -PATTERN_AGENT = re.compile(r"^(/Satoshi:0.12.(0|1|99)/|/Satoshi:0.13.(0|1|2|99)/)$") +PATTERN_AGENT = re.compile(r"^(/Satoshi:0.13.(1|2|99)/|/Satoshi:0.14.(0|1|2|99)/)$") def parseline(line): sline = line.split() diff --git a/contrib/seeds/nodes_main.txt b/contrib/seeds/nodes_main.txt index 0451771dae..60b34216cd 100644 --- a/contrib/seeds/nodes_main.txt +++ b/contrib/seeds/nodes_main.txt @@ -1,1168 +1,1450 @@ -2.7.8.12:8333 2.228.70.198:8333 -5.39.64.7:8333 -5.45.80.34:38333 -5.51.160.38:8333 -5.61.33.33:8333 -5.61.37.12:8333 -5.95.80.47:8333 -5.102.164.173:8333 -5.175.71.130:8333 -5.189.165.22:8333 -5.199.130.228:8333 -5.228.100.222:8333 +4.15.180.29:8333 +4.15.180.30:8333 +5.2.67.110:8333 +5.39.224.103:8333 +5.43.124.154:8333 +5.189.165.102:8333 +5.226.149.145:8333 +5.228.7.146:8333 +5.228.64.71:8333 +5.249.152.101:8333 +5.254.124.55:8333 5.255.64.231:8333 -13.93.6.133:8333 -18.85.34.10:8333 -18.241.0.63:8333 +5.255.90.234:8333 +14.192.8.27:21301 +18.62.3.86:8333 +18.85.35.80:8333 23.28.128.65:8333 -23.248.113.52:8333 -23.253.151.73:8333 -24.4.96.121:8333 -24.69.65.191:8333 -24.87.8.43:8333 -24.150.224.110:8333 +23.108.83.12:8333 +23.233.2.238:8333 +24.27.65.168:8333 +24.56.241.219:8333 +24.64.75.132:8333 +24.73.70.26:8333 +24.121.154.140:8333 +24.203.96.72:8333 +24.225.34.62:8333 24.227.69.146:8333 -27.0.235.33:8333 -31.170.106.203:8333 -31.184.197.96:8333 -31.214.240.56:8333 -37.1.202.134:8333 -37.18.74.232:8333 -37.34.48.17:8333 +24.232.136.119:8333 +31.16.123.235:8333 +31.19.205.53:8333 +31.132.136.35:8333 +31.184.234.85:8333 +31.211.102.161:8333 37.48.64.140:8333 37.97.141.116:8333 +37.120.160.12:8333 37.120.164.16:8333 -37.120.169.123:8333 -37.143.9.128:8333 -37.153.172.227:8333 -37.193.227.16:8333 -37.205.8.78:8333 -37.220.0.114:8333 -37.232.218.199:8333 -38.140.161.53:8333 -40.87.70.120:8333 -41.162.163.93:8333 -42.2.198.48:8333 -45.20.67.1:8333 -45.55.197.77:8333 +37.134.226.181:8333 +37.147.110.43:8333 +37.194.10.30:8333 +37.247.22.53:8333 +38.27.65.158:8333 +38.133.141.34:8333 +43.248.160.151:8333 +45.32.130.19:8333 +45.32.193.157:8333 +45.46.161.121:8333 45.56.97.63:8333 -45.58.38.162:8333 -45.63.1.33:8333 -45.79.2.70:8333 +45.116.178.79:8188 46.16.240.98:8333 -46.19.137.74:8333 -46.28.206.146:8333 -46.32.252.197:8333 +46.20.246.100:8333 +46.21.97.135:8333 +46.59.10.237:8333 46.59.13.59:8333 -46.59.39.195:8333 46.148.16.210:8333 -46.160.195.121:8333 -46.166.142.21:8333 -46.166.160.29:8330 +46.166.160.96:8333 46.188.44.20:8333 46.229.238.187:8333 46.231.16.149:8333 +47.88.35.181:8333 47.88.100.130:8333 -47.89.192.134:8333 -47.185.194.160:8333 -47.189.129.218:8333 -49.65.2.140:8333 -50.3.72.129:8333 -50.31.99.225:8333 -51.175.33.95:8333 -52.1.165.219:8333 -52.10.170.186:8333 -52.51.128.216:8333 -54.197.130.244:8333 -58.59.2.22:8333 -58.84.6.81:8333 -59.125.8.143:8333 -59.167.130.139:8333 +47.184.129.94:8333 +47.199.68.204:8333 +50.30.38.203:8333 +50.63.162.242:8333 +50.97.133.208:8333 +50.114.227.224:8333 +51.15.0.17:8333 +51.174.69.239:8333 +52.7.135.69:8333 +52.14.64.82:8333 +52.204.105.25:8333 +54.255.160.87:8333 61.47.2.20:8333 +61.125.131.55:8333 62.43.130.178:8333 -62.76.96.6:8333 +62.106.16.111:8333 62.107.200.30:8333 -62.133.15.58:8333 +62.109.20.99:8333 62.133.194.2:8333 62.133.194.156:8333 -62.138.1.95:8333 -62.216.238.3:8333 -62.238.34.125:8333 -63.137.40.207:8333 -63.231.96.109:8333 -64.78.240.150:8333 -64.83.225.146:8333 -64.137.236.68:8833 -64.156.193.120:8333 -66.79.160.82:8333 -66.91.230.231:8333 -66.135.128.121:8333 -66.172.10.4:8333 +62.176.6.94:8333 +62.182.169.222:8333 +62.205.132.245:8333 +62.216.238.133:8333 +63.231.239.212:8333 +64.34.231.140:8333 +64.203.102.86:8333 +64.233.245.39:8333 +65.183.76.73:8333 +66.96.199.166:8333 66.194.38.250:8333 66.194.38.253:8333 -66.215.34.26:8333 -66.240.237.155:8333 -67.205.96.108:8333 -67.205.128.5:8333 -67.219.233.140:8333 +66.196.12.63:8333 +67.215.6.34:8333 67.221.193.55:8333 -68.100.196.118:8333 +68.66.193.192:8333 +68.69.235.230:8333 +68.111.10.219:8333 +68.119.138.175:8333 68.132.193.222:8333 -68.168.118.234:8333 +68.194.42.76:8333 +68.235.41.204:8333 69.11.97.43:8333 -69.30.229.10:8333 -69.50.171.205:8333 -69.125.193.145:8333 -69.162.139.125:8333 -70.35.98.39:8333 +69.41.3.212:8333 +69.41.171.35:8333 +69.41.171.36:8333 +69.55.64.216:8333 +69.84.42.56:8333 +70.48.48.250:8333 70.112.32.29:8333 -71.126.181.146:8333 -72.180.32.105:8333 -73.226.64.145:8333 -74.83.140.242:8333 -74.84.128.158:9333 +70.250.74.20:8333 +71.93.161.162:8333 +71.198.0.126:8333 +72.5.167.41:8333 +72.224.11.103:8333 +73.72.160.213:8333 74.122.237.124:8333 -74.215.133.145:8333 -75.76.101.169:8333 -75.85.13.8:8333 -75.86.168.13:8333 -75.170.97.25:8333 -75.177.137.134:8333 +75.86.137.34:8333 +75.165.99.144:8333 +76.64.74.193:8333 76.76.227.136:8333 -77.53.136.6:8333 -77.110.11.52:8333 -78.25.32.206:8333 -78.34.8.120:8333 -78.46.32.99:8333 -78.56.9.214:8333 -78.56.229.177:8333 -78.129.237.245:8333 +76.173.161.44:8333 +76.178.22.44:8333 +77.47.137.27:8333 +77.77.46.250:8333 +77.91.193.152:8333 +77.95.226.194:8333 +77.120.246.254:8333 +77.163.136.136:8333 +77.203.13.57:8333 +77.236.37.214:8333 +77.239.37.12:8333 +77.247.179.44:8333 +78.34.14.52:8333 +78.109.163.153:8333 78.196.172.45:8333 79.132.230.144:8333 -79.169.35.235:8333 -79.172.194.219:8333 -80.64.65.87:8333 -80.89.137.115:8333 -80.93.36.173:8333 -80.101.167.100:8333 -80.114.34.158:8333 -80.127.136.50:8333 -80.188.139.82:8333 -80.222.39.77:8333 -80.223.105.69:8333 -80.229.151.187:8333 -80.240.129.221:8333 +79.160.2.105:8333 +80.82.77.138:8333 +80.100.203.151:8333 +80.147.68.237:8333 +80.237.240.102:8333 +81.2.246.127:8333 +81.7.7.86:8333 81.7.10.238:8333 -81.7.13.84:8333 -81.27.96.92:8333 -81.35.143.98:8333 -81.82.201.5:8333 +81.27.96.37:8333 81.83.96.5:8333 -81.169.227.36:8333 -81.171.2.119:8333 -81.171.38.130:8333 -81.175.255.118:8333 -81.207.8.49:8333 81.228.194.187:8333 -82.9.1.77:8333 -82.11.33.229:8333 -82.102.13.117:8333 -82.116.203.240:8333 -82.130.103.16:8333 -82.136.65.227:8333 -82.158.227.238:8333 -82.197.212.25:8333 +82.45.69.216:8333 +82.69.44.183:8333 +82.72.198.68:8333 +82.95.204.10:8333 +82.118.236.127:8333 +82.118.242.4:8333 +82.134.66.146:8333 +82.193.109.199:8333 +82.197.210.65:8333 82.199.102.10:8333 -82.200.204.41:8333 -82.200.204.119:8333 -82.221.105.223:8333 +82.200.205.30:8333 82.221.108.27:8333 -82.221.111.136:8333 +82.221.128.81:8333 82.221.139.97:8333 +82.232.202.246:8333 +83.60.64.252:8333 +83.61.8.228:8333 +83.128.41.48:8333 +83.128.111.69:8333 83.137.41.10:8333 -83.143.130.19:8333 -83.150.9.196:8333 +83.150.43.17:8333 83.169.2.43:8333 -83.217.203.130:8333 -83.249.88.52:8333 -84.26.162.92:8333 +83.174.209.87:8333 +83.255.43.163:8333 84.42.193.6:8333 -84.134.194.115:8333 -84.201.32.115:8333 -84.212.232.71:8333 -84.238.140.176:8333 -85.10.104.34:8333 +84.52.145.231:8333 +84.52.234.70:8333 +84.85.102.113:8333 +84.92.92.247:8333 +84.146.35.123:8333 +84.212.198.222:8333 +84.217.163.135:8333 +84.245.27.185:8333 +84.251.203.5:8333 85.21.144.226:8333 85.25.194.12:8333 -85.144.79.190:8333 -85.145.228.192:8333 -85.194.238.130:8333 -85.228.201.80:8333 -85.229.228.174:8333 -85.236.233.87:8333 -86.80.204.185:8333 -86.105.227.190:8333 -86.135.39.40:8333 -87.106.139.127:8333 +85.25.194.28:8333 +85.144.119.222:8333 +85.183.140.62:8333 +85.214.228.203:8333 +85.214.234.254:8333 +85.218.150.1:8333 +85.228.196.10:8333 +86.15.2.235:8333 +86.61.6.210:8333 +87.92.115.194:8333 87.120.8.5:8333 87.120.37.230:8333 +87.233.181.146:8333 87.239.101.102:8333 -87.243.197.82:8333 -88.112.112.173:8333 +88.87.78.126:8333 +88.98.198.130:8333 +88.98.225.214:8333 +88.99.58.194:8333 88.150.192.17:8333 -88.185.155.134:8333 -88.202.202.221:8333 -88.202.230.87:8333 -88.208.39.182:8333 +88.196.136.31:17556 +88.208.58.193:8333 +88.208.58.194:8333 +89.22.96.132:8333 +89.22.104.48:8333 +89.25.80.98:8333 89.34.99.41:8333 +89.142.195.112:8333 89.163.224.187:8333 -89.169.233.150:8333 -89.184.65.85:8333 -89.212.91.219:8333 -89.249.178.36:8333 +89.163.224.195:8333 +89.238.79.235:8333 +90.46.240.214:8333 +90.65.232.129:8333 +90.71.117.90:8333 90.149.38.172:8333 -91.65.97.157:8333 -91.107.64.143:8333 -91.114.35.107:8333 +90.156.97.145:8333 +90.177.48.104:8333 +91.106.194.97:8333 91.135.0.187:8333 -91.145.110.95:8333 -91.157.38.151:8333 +91.150.189.155:8333 +91.185.198.216:8333 +91.196.11.45:8333 91.197.44.133:8333 -91.205.176.54:8333 -91.206.203.10:8333 -91.206.203.18:8333 -91.215.35.130:8333 -91.219.239.159:8333 -91.223.133.2:8333 -91.223.133.40:8333 +91.224.0.227:8333 91.226.10.90:8333 +91.228.45.130:8333 +91.229.77.239:8333 +91.238.100.249:8333 91.240.141.169:8333 92.27.7.209:8333 -92.89.67.207:8333 -92.221.201.138:8333 -93.95.187.122:8333 -93.103.73.187:8333 +92.54.16.135:8333 +93.89.84.93:8333 +93.100.51.48:8333 +93.100.76.151:8333 +93.104.214.235:8333 +93.115.86.246:8333 93.123.80.47:8333 +93.174.88.211:8333 93.188.224.253:8333 93.190.69.242:8333 -94.19.12.244:8333 -94.156.128.116:8333 -94.177.171.73:8333 +94.74.81.93:8333 +94.156.35.8:8333 +94.176.237.241:8333 94.181.44.104:8333 -94.237.26.173:8333 -94.242.229.158:8333 -94.255.128.98:8333 -95.79.35.50:8333 -95.91.41.39:8333 -95.110.234.93:8333 -95.128.48.209:8333 +94.227.43.171:8333 +95.79.102.208:8333 +95.79.102.209:8333 +95.154.237.24:8333 +95.183.48.62:8333 95.183.48.71:8333 -96.23.67.85:8333 -97.64.177.10:8333 -97.104.201.95:8333 -98.29.197.149:8333 -98.169.2.107:8333 -99.232.48.72:8333 -101.100.141.55:8333 -103.7.32.40:8333 -103.53.225.69:8333 -103.249.106.74:8333 -104.128.224.13:8333 -104.128.228.252:8333 -104.155.1.158:8333 -104.168.128.50:8333 -104.199.160.228:8333 -104.204.109.11:8333 -104.219.251.118:8333 -104.223.3.129:8333 -104.223.3.219:8333 -104.238.130.182:8333 -104.245.99.227:8333 -106.38.234.89:8333 -106.104.134.218:8333 -107.136.6.71:8333 +95.213.161.2:8333 +95.213.201.94:8333 +96.20.227.39:8333 +96.28.41.91:8333 +98.127.130.17:8333 +100.36.48.101:8333 +101.0.81.42:8333 +101.0.81.43:8333 +103.11.64.46:8333 +103.24.244.69:8333 +103.47.210.50:8333 +103.76.41.169:8333 +103.80.168.57:8333 +103.203.51.186:8333 +103.224.118.79:8333 +103.250.4.74:8333 +104.192.170.202:8333 +104.196.0.99:8333 +104.199.192.85:8333 +104.219.251.46:8333 +104.223.108.33:8333 +104.237.2.189:8333 +104.247.230.28:8333 107.150.45.210:8333 -107.151.144.103:8333 -107.170.44.99:8333 -107.181.137.133:8333 -107.191.102.13:8333 -108.58.252.82:8333 -108.59.9.167:8333 +107.174.34.77:8333 +107.174.34.78:8333 +107.180.71.47:8333 108.59.12.163:8333 -108.162.106.215:8333 -108.168.133.164:8333 -108.173.202.101:8333 -108.180.110.190:8333 -109.29.75.40:8333 -109.120.194.136:8333 -109.230.230.88:8333 -109.235.67.115:8333 -109.235.69.120:8333 -109.236.90.199:8333 +108.168.37.13:8333 +108.175.3.18:8333 +108.234.193.106:8333 +109.9.173.13:8333 +109.101.220.151:8333 +109.172.104.119:8333 +109.195.193.138:8333 +109.206.177.21:8333 +109.226.35.28:8333 109.255.0.107:8333 -110.10.130.12:8333 -110.10.176.94:8333 -110.132.172.251:8333 -111.90.158.17:8333 +113.29.183.143:8333 +114.145.97.73:8333 115.66.205.171:8333 -116.31.123.139:8333 -118.192.48.46:8333 -118.193.164.98:8333 -119.29.156.231:8333 -119.63.44.133:19980 -119.81.99.27:8333 -119.106.12.169:8333 -119.147.137.155:19980 -119.185.1.182:8333 -120.55.193.136:8333 -121.254.173.23:8333 +118.67.201.40:8333 +118.194.226.168:8333 +119.28.70.144:8333 +120.24.166.73:9998 +120.76.244.201:10022 +121.82.4.232:8333 121.254.173.40:8333 -123.56.129.45:8333 123.203.163.128:8333 -123.206.32.198:8333 -124.189.160.221:8333 -124.189.192.232:8333 -128.140.224.162:8333 -128.199.68.205:8333 -130.234.207.115:8333 -131.113.41.123:8333 -131.114.72.104:8333 -132.204.108.155:8333 -134.119.13.230:8333 -134.213.133.206:8333 -134.213.133.207:8333 -135.23.5.3:8333 -137.74.0.66:8333 -138.68.1.45:8333 -138.68.2.194:8333 +124.171.70.45:8333 +125.63.57.7:8333 +125.128.35.41:8333 +128.208.244.124:8333 +128.230.208.73:8333 +131.114.10.233:8333 +131.114.10.235:8333 +132.239.36.105:8333 +134.213.214.233:8333 +136.61.238.121:8333 +136.62.86.140:8333 +136.144.128.49:8333 +137.48.144.52:8333 +137.116.160.176:8333 +137.117.193.113:8333 +138.19.79.208:8333 138.68.64.19:8333 -138.68.64.28:8333 -139.59.42.248:8333 -139.220.240.153:8333 -140.112.107.118:8333 -140.186.224.112:8333 -141.52.64.141:8333 -142.68.237.107:8333 -142.217.12.106:8333 -146.60.204.92:8333 -146.185.161.209:8333 +139.59.96.16:8333 +139.162.160.232:8333 +141.136.115.230:8333 +142.59.232.111:8333 +142.111.2.74:8333 +142.162.128.23:8333 +143.107.116.5:8333 +143.229.22.74:8333 +143.229.36.71:8333 +144.2.105.60:8333 +144.76.224.214:8333 +146.185.19.30:8333 +147.32.30.25:8333 +147.229.13.210:8333 148.103.7.119:8333 -149.210.133.244:8333 +150.101.114.194:8333 150.229.0.143:8333 -151.231.238.25:8333 -151.248.160.227:8333 -153.230.228.15:8333 -155.133.43.249:8333 -158.58.238.145:8333 -158.109.79.13:34821 -159.203.70.208:8333 +154.66.207.126:8333 +158.129.212.236:8333 +158.129.212.251:8333 160.16.206.31:8333 162.209.1.233:8333 162.209.4.125:8333 -162.216.192.231:8333 -162.243.100.111:8333 -162.246.11.194:8333 -162.248.102.117:8333 -162.252.46.83:8333 -163.172.33.78:8333 -163.172.194.30:8333 -169.229.198.106:8333 +162.220.246.225:8333 +163.172.218.186:8333 +166.230.70.145:8333 +168.235.74.45:8333 +169.44.34.88:8333 170.75.195.168:8333 -172.103.205.197:8333 -172.245.225.126:8333 -173.179.37.8:8333 -173.208.203.74:8333 -173.252.46.16:8333 -174.117.141.124:8333 -175.126.38.158:8333 -175.126.38.177:8333 -175.139.106.119:8333 -175.140.232.66:8333 -176.9.117.100:8333 -176.36.33.121:8333 +172.112.2.67:8333 +173.94.164.38:8333 +173.183.232.109:8333 +173.208.176.122:8333 +173.212.194.114:8333 +173.232.228.146:8333 +175.126.124.92:8333 +175.145.109.51:8333 +176.24.198.205:8333 +176.36.37.62:8333 176.36.99.222:8333 -176.56.227.36:8333 -176.100.100.206:8333 176.106.144.183:8333 -176.123.7.148:8333 -176.126.167.10:8333 -176.223.201.198:8333 -178.62.68.62:8333 -178.62.102.56:8333 -178.62.203.185:8333 -178.124.197.101:8333 +177.33.1.40:8333 +178.162.214.225:8333 +178.164.109.83:8333 178.170.138.202:8333 -178.175.129.18:8333 -178.188.47.62:8333 -178.199.240.22:8333 +178.175.136.122:8333 178.218.209.162:8333 -178.237.35.34:8333 -178.238.224.242:8333 +178.254.2.64:8333 178.254.34.144:8333 -178.254.34.161:8333 -179.43.183.2:8333 +178.255.41.21:8333 +178.255.144.163:8333 +180.181.208.42:8333 180.200.128.58:8333 -182.93.34.130:8333 -185.8.238.197:8333 -185.11.139.172:8333 +180.235.50.14:8333 +181.215.148.154:8333 +184.64.13.43:8333 +184.94.164.170:8333 +184.152.107.251:8333 +184.182.233.206:8333 +185.4.24.199:8333 +185.20.99.49:8333 185.24.97.11:8333 -185.24.233.100:8333 +185.25.48.27:8333 185.25.48.71:8333 -185.25.48.114:8333 +185.26.196.249:8333 185.28.76.179:8333 -185.70.105.152:8339 -185.77.128.69:8333 -185.77.128.241:8333 -185.86.79.87:8333 -185.89.102.2:3333 -185.89.102.53:3333 -185.109.144.155:8333 -185.117.75.50:8333 +185.35.139.250:8333 +185.41.113.69:8333 +185.50.213.123:8333 +185.50.213.124:8333 +185.50.232.114:8333 +185.51.192.40:8333 +185.53.129.244:8333 +185.71.177.100:8333 +185.77.129.176:8333 +185.82.201.51:8333 185.121.173.223:8333 -185.128.41.157:8333 -185.130.226.106:8333 -185.145.130.76:8333 -188.63.192.104:8333 +185.140.252.253:8333 +185.145.129.184:8333 +185.145.130.163:8333 +185.154.156.50:8333 +185.162.124.69:8333 +185.170.42.2:8333 +186.149.197.96:8333 +188.65.212.138:8333 +188.65.213.48:8333 +188.93.209.192:8333 +188.113.79.45:8333 +188.113.84.116:8333 188.113.164.231:8333 -188.166.229.112:8333 -188.214.128.77:8333 -190.10.8.211:8333 -190.81.160.184:8333 -190.111.231.19:8333 -192.131.44.93:8333 +188.122.16.153:8333 +188.165.224.28:8333 +188.175.239.227:8333 +188.214.128.18:8333 +188.227.64.19:8333 +188.253.2.125:8333 +189.45.203.166:8333 +190.184.198.34:8333 +192.151.145.250:8333 192.206.202.6:8333 -192.227.245.133:8333 -192.241.74.123:8333 -192.241.74.126:8333 -192.254.71.222:8333 -193.10.64.85:8333 -193.46.80.101:8333 +192.228.101.157:8333 +193.2.76.41:8333 +193.27.209.100:8333 +193.33.237.187:8333 +193.46.83.17:8333 193.49.43.219:8333 -193.93.79.215:8333 -193.183.99.46:8333 -193.234.224.195:8333 -193.239.80.155:8333 -194.63.140.208:8333 -194.87.1.232:8333 -194.187.227.18:8333 -194.247.12.136:8333 -195.91.176.86:8333 -196.28.98.20:8333 -198.44.249.35:8333 -198.84.172.252:8333 -198.204.224.106:8333 -198.211.97.46:8333 -199.66.64.198:8333 -199.101.100.58:8333 -199.101.100.59:8333 +194.24.182.27:8333 +194.28.206.201:8333 +194.63.143.197:8333 +194.71.109.91:8333 +194.79.8.36:8333 +194.135.93.38:8333 +194.186.160.253:8333 +195.9.140.134:8333 +195.39.206.29:8333 +195.67.36.89:8333 +195.169.99.82:8333 +195.214.214.253:8333 +195.223.71.147:8333 +198.37.118.11:8333 +198.54.113.125:8333 +198.101.12.139:8333 +198.143.12.105:8333 +198.251.83.19:8333 199.127.224.50:8333 -200.46.241.71:8333 +200.12.138.146:8333 200.116.98.185:8333 -203.9.225.13:8333 -203.177.142.37:8333 -205.200.247.149:8333 -205.209.131.150:13838 -206.53.64.74:8333 -206.72.192.69:8333 -206.123.112.180:8333 -208.66.208.153:8333 -208.68.174.76:8333 +200.122.128.130:8333 +202.29.6.48:8333 +202.133.115.115:8333 +203.59.17.160:8333 +204.15.11.4:8333 +204.111.241.195:8333 +205.251.85.151:8333 +207.244.70.40:8333 +207.254.50.72:8333 +208.76.93.83:8333 208.107.97.242:8333 -208.111.48.132:8333 +208.110.73.107:8333 208.118.235.190:8333 -209.6.205.126:8333 -209.40.96.121:8333 -209.58.130.137:8333 209.73.142.226:8333 -209.90.224.4:8333 -209.126.69.243:8333 -209.126.108.91:8333 -209.195.4.18:8333 +209.81.9.223:8333 +209.126.107.166:8333 +209.177.86.19:8333 209.250.6.190:8333 -210.54.37.225:8333 +210.1.219.155:8333 +210.211.109.165:8333 210.223.3.44:8333 -211.149.234.109:8333 +211.21.129.69:8333 +212.50.98.161:8333 212.51.140.183:8333 +212.56.108.81:8333 +212.83.35.173:8333 212.90.179.206:8333 212.93.226.90:8333 212.110.171.118:8333 -212.202.132.17:8333 +213.5.36.58:8333 +213.5.181.205:8333 +213.17.16.251:8333 213.91.205.134:8333 -213.165.68.218:8333 -213.196.200.213:8333 +213.91.211.17:8333 +213.155.3.216:8333 +213.168.13.151:8333 +213.186.170.109:8334 +213.222.208.150:8333 +216.32.213.112:8333 216.59.4.212:8333 -216.74.32.109:8333 -216.158.225.70:8333 -216.164.138.13:8333 -216.167.236.247:8333 +216.126.193.163:8333 216.197.79.74:8333 -217.11.225.189:8333 +216.218.147.140:8333 +216.227.39.84:8333 +216.245.206.181:8333 +216.249.92.230:8333 217.12.199.207:8333 -217.20.130.72:8333 -217.23.6.148:8333 -217.23.140.103:8333 -217.28.96.180:8333 +217.23.2.177:8333 +217.23.5.68:8333 +217.28.194.2:8333 217.35.130.42:8333 -217.111.66.79:8333 -217.158.9.102:8333 +217.64.47.138:8333 +217.101.72.242:8333 +217.145.81.229:8333 217.168.143.169:8333 -217.209.32.219:8333 -218.161.33.165:8333 -221.121.144.138:8333 -[2001:0:4137:9e76:2048:3a84:bb91:e846]:8333 -[2001:0:4137:9e76:2066:e9e:b489:f8b8]:8333 -[2001:0:4137:9e76:3854:1211:b5ac:a96b]:8333 -[2001:0:4137:9e76:4e3:1f66:cd4c:829f]:8333 -[2001:0:4137:9e76:ad:1f4:9ea9:fa2e]:8333 -[2001:0:4137:9e76:e5:baa:b66f:f418]:8333 -[2001:0:53aa:64c:20a2:59c4:ad22:93ea]:8333 +217.169.7.111:8333 +217.182.192.7:8333 +219.88.232.229:8333 +219.113.244.52:8333 +220.130.128.58:8333 +220.244.225.239:8333 +221.141.3.12:8333 +222.166.176.99:8333 +223.252.173.147:8333 +[2001:0:4137:9e76:1025:4e5:acb0:22cd]:8333 +[2001:0:4137:9e76:1078:18a6:5d2c:2461]:8333 +[2001:0:4137:9e76:10ec:236a:bd3b:f3c0]:8333 +[2001:0:4137:9e76:186d:3f17:b7ad:95cf]:8333 +[2001:0:4137:9e76:1870:242:ac03:aaf9]:8333 +[2001:0:4137:9e76:18a6:1102:2abf:eb70]:8333 +[2001:0:4137:9e76:1ce5:248c:4ff5:2b1d]:8333 +[2001:0:4137:9e76:200f:156a:bc77:3acd]:8333 +[2001:0:4137:9e76:2418:19d1:cddc:b1af]:8333 +[2001:0:4137:9e76:2857:3d78:aaf8:eb28]:8333 +[2001:0:4137:9e76:28b2:1b84:64fb:2d6a]:8333 +[2001:0:4137:9e76:2c70:d51:d046:1209]:8333 +[2001:0:4137:9e76:2cac:2fcf:46bb:be0d]:8333 +[2001:0:4137:9e76:305e:20ee:a94f:6f69]:8333 +[2001:0:4137:9e76:30cd:849:adfe:6e67]:8333 +[2001:0:4137:9e76:345b:f12:ae1e:2948]:8333 +[2001:0:4137:9e76:3c40:146e:9741:5a3a]:8333 +[2001:0:4137:9e76:3c9e:3c3e:9d6e:7340]:8333 +[2001:0:4137:9e76:499:29a8:d047:7ea1]:8333 +[2001:0:4137:9e76:51:24:81b2:59e3]:8333 +[2001:0:4137:9e76:889:2d7c:b61b:bf0d]:8333 +[2001:0:4137:9e76:c9f:379c:add2:c938]:8333 +[2001:0:4137:9e76:cd6:2eb4:b82b:addb]:8333 +[2001:0:4137:9e76:cf0:2e3a:b29d:6207]:8333 +[2001:0:53aa:64c:1485:fbf9:a798:1ffe]:8333 [2001:0:53aa:64c:59:617f:a10d:e0]:8333 -[2001:0:5ef5:79fb:200f:3ae5:3cbc:74c9]:8333 -[2001:0:5ef5:79fb:38f2:13b4:b208:5604]:8333 -[2001:0:5ef5:79fd:200b:22a7:cc50:f52d]:8333 -[2001:0:5ef5:79fd:24ef:1aef:a994:303d]:8333 -[2001:0:5ef5:79fd:24fc:b5d:ad4f:4db2]:8333 -[2001:0:5ef5:79fd:28bf:2d23:e02e:c3ef]:8333 -[2001:0:5ef5:79fd:3cd0:3c2e:da44:a759]:8333 -[2001:0:5ef5:79fd:87e:fd7:b1c2:1b4]:8333 -[2001:0:9d38:6ab8:18db:3bda:ab90:e81e]:8333 -[2001:0:9d38:6ab8:4e7:1660:862f:a6d7]:8333 -[2001:0:9d38:6ab8:6:2b:5074:9588]:8333 -[2001:0:9d38:6abd:10f8:a7d7:bb90:f524]:8333 -[2001:13d8:1c01:1000::11]:8333 -[2001:15c0:65ff:610::2]:8333 -[2001:1608:10:156:ae::4adb]:8333 -[2001:1620:b1b:8888:20d:b9ff:fe41:6710]:8333 -[2001:1620:b1b:face:20d:b9ff:fe41:6710]:8333 -[2001:1620:f00:282::2]:8333 -[2001:1620:f00:8282::1]:8333 -[2001:1680:101:1ae::1]:8333 -[2001:16d8:ff00:85de:20c:29ff:fe52:9594]:8333 -[2001:19f0:4400:434d:5400:ff:fe42:2678]:8333 +[2001:0:5ef5:79fb:1020:2cd0:4750:eb12]:8333 +[2001:0:5ef5:79fb:1036:1d50:3881:6930]:8333 +[2001:0:5ef5:79fb:10a4:27d8:9c0a:cfa9]:8333 +[2001:0:5ef5:79fb:10ae:5a8:524b:dcc4]:8333 +[2001:0:5ef5:79fb:1892:3e3a:3f74:affa]:8333 +[2001:0:5ef5:79fb:1c95:1a60:d1f5:215b]:8333 +[2001:0:5ef5:79fb:200b:16ef:b9cf:9860]:8333 +[2001:0:5ef5:79fb:28e4:fbff:3237:992]:8333 +[2001:0:5ef5:79fb:2ce8:1d9e:b3bf:b53e]:8333 +[2001:0:5ef5:79fb:300a:2e20:4750:eb12]:8333 +[2001:0:5ef5:79fb:30a2:1ad9:5324:836a]:8333 +[2001:0:5ef5:79fb:3409:1996:bcac:241f]:8333 +[2001:0:5ef5:79fb:344b:2bd4:bb3e:e26]:8333 +[2001:0:5ef5:79fb:34b3:11db:e7da:d461]:8333 +[2001:0:5ef5:79fb:3839:2e0c:ba30:288e]:8333 +[2001:0:5ef5:79fb:3880:ef4:b5f0:ee4d]:8333 +[2001:0:5ef5:79fb:389f:52:9c0c:1f41]:8333 +[2001:0:5ef5:79fb:3c73:304a:9d8b:99d5]:8333 +[2001:0:5ef5:79fb:3cac:33e4:39ca:38c]:8333 +[2001:0:5ef5:79fb:6f:3667:5398:538f]:8333 +[2001:0:5ef5:79fb:88c:3e6:9454:3331]:8333 +[2001:0:5ef5:79fb:89:3b55:9fcc:8e66]:8333 +[2001:0:5ef5:79fb:c9b:3d65:bdf4:5d58]:8333 +[2001:0:5ef5:79fb:cb7:8cc:b8ee:6806]:8333 +[2001:0:5ef5:79fd:24f6:37b5:b9d2:2aa7]:8333 +[2001:0:5ef5:79fd:3c63:82e:aabc:bd39]:8333 +[2001:0:5ef5:79fd:3cf5:2eb7:c966:561d]:8333 +[2001:0:5ef5:79fd:cf4:28e2:aabd:b766]:8333 +[2001:0:9d38:6ab8:10f6:453:3ca4:1a8e]:8333 +[2001:0:9d38:6ab8:14dd:298b:431c:bfec]:8333 +[2001:0:9d38:6ab8:3051:1561:b62d:73a5]:8333 +[2001:0:9d38:6ab8:3467:ffa:b612:e9c6]:8333 +[2001:0:9d38:6ab8:8e8:1e26:e8e3:eed7]:8333 +[2001:0:9d38:6ab8:c82:37b3:47ee:3ae2]:8333 +[2001:0:9d38:6abd:1052:3cd8:a89b:e67]:8333 +[2001:0:9d38:6abd:144d:23f3:abcb:8bcb]:8333 +[2001:0:9d38:6abd:1c2e:31df:adf1:e616]:8333 +[2001:0:9d38:6abd:1c41:213b:facc:9c6b]:8333 +[2001:0:9d38:6abd:2093:12b5:8cbf:4f57]:8333 +[2001:0:9d38:6abd:243a:2394:fd91:712c]:8333 +[2001:0:9d38:6abd:2833:9f8:c94c:6881]:8333 +[2001:0:9d38:6abd:2c84:29d3:ae5a:f6f0]:8333 +[2001:0:9d38:6abd:2ce4:d50:cb22:3672]:8333 +[2001:0:9d38:6abd:3824:816:c30d:e9d4]:8333 +[2001:0:9d38:6abd:389a:24e9:cb5c:a1cd]:8333 +[2001:0:9d38:6abd:38bd:88f:2193:4932]:8333 +[2001:0:9d38:6abd:3c4f:cb1:d65b:d775]:8333 +[2001:0:9d38:6abd:3c51:280b:b1e9:ffd]:8333 +[2001:0:9d38:6abd:3c5a:2e2:2193:4932]:8333 +[2001:0:9d38:6abd:3c5e:3ebf:3dc0:703a]:8333 +[2001:0:9d38:6abd:4c9:12fc:d1d9:dc21]:8333 +[2001:0:9d38:6abd:6e:34e7:d0a7:6772]:8333 +[2001:0:9d38:6abd:8de:1f29:2aea:f96f]:8333 +[2001:0:9d38:6abd:c5f:2674:a467:787c]:8333 +[2001:0:9d38:6abd:cc0:23a4:ad7c:c998]:8333 +[2001:0:9d38:78cf:20c0:2097:d188:9c3b]:8333 +[2001:0:9d38:78cf:2420:dda:4ff6:8794]:8333 +[2001:0:9d38:78cf:2892:fcb:26b2:22ac]:8333 +[2001:0:9d38:78cf:3020:1ad7:26b2:22ac]:8333 +[2001:0:9d38:78cf:30ae:211b:e717:7788]:8333 +[2001:0:9d38:78cf:30d0:6edd:a418:a9e9]:8333 +[2001:0:9d38:78cf:30d9:3278:b004:65a7]:8333 +[2001:0:9d38:78cf:387a:17d5:dacb:bdf1]:8333 +[2001:0:9d38:78cf:3c38:c41:433c:7b87]:8333 +[2001:0:9d38:78cf:467:193:a8b0:a122]:8333 +[2001:0:9d38:78cf:c65:fb96:97d2:a9b0]:8333 +[2001:0:9d38:78cf:c9f:2633:d169:9999]:8333 +[2001:0:9d38:78cf:ce2:aba:d120:90db]:8333 +[2001:0:9d38:90d7:105d:26f2:a241:7339]:8333 +[2001:0:9d38:90d7:1062:3f95:e065:fc21]:8333 +[2001:0:9d38:90d7:10a6:19f6:ab95:ebcb]:8333 +[2001:0:9d38:90d7:14e2:22cb:738f:9489]:8333 +[2001:0:9d38:90d7:18fb:3da9:893d:1d57]:8333 +[2001:0:9d38:90d7:1cc3:2534:e020:53fa]:8333 +[2001:0:9d38:90d7:206d:2b34:d0cb:9de8]:8333 +[2001:0:9d38:90d7:20cb:2cb:b9a7:ca5e]:8333 +[2001:0:9d38:90d7:245c:2753:4382:704b]:8333 +[2001:0:9d38:90d7:24d6:225f:793b:bf5]:8333 +[2001:0:9d38:90d7:24da:8f0:bbf9:9c93]:8333 +[2001:0:9d38:90d7:28a2:107b:438e:b08d]:8333 +[2001:0:9d38:90d7:2c16:d58:b381:b61]:8333 +[2001:0:9d38:90d7:2c68:3068:cb59:3be7]:8333 +[2001:0:9d38:90d7:2c90:3855:b94f:c926]:8333 +[2001:0:9d38:90d7:2ca2:3592:c111:dd82]:8333 +[2001:0:9d38:90d7:2cce:1f6e:b381:8605]:8333 +[2001:0:9d38:90d7:3435:3915:2bcc:6cc7]:8333 +[2001:0:9d38:90d7:3438:2b9f:ad57:a721]:8333 +[2001:0:9d38:90d7:3474:1df1:e732:e5e3]:8333 +[2001:0:9d38:90d7:38c4:37af:ab0a:f5ef]:8333 +[2001:0:9d38:90d7:3a:39fd:a43b:5591]:8333 +[2001:0:9d38:90d7:3c9d:2a45:d537:3bd6]:8333 +[2001:0:9d38:90d7:3cfb:2cf5:5254:4d1e]:8333 +[2001:0:9d38:90d7:43f:337:adb4:6310]:8333 +[2001:0:9d38:90d7:493:995:d2e9:39be]:8333 +[2001:0:9d38:90d7:5b:ce3:b275:92ab]:8333 +[2001:0:9d38:90d7:8a8:59d:d0cb:d585]:8333 +[2001:0:9d38:90d7:c8e:1ba0:c5a9:dace]:8333 +[2001:0:9d38:90d7:cdb:365f:2302:f729]:8333 +[2001:0:9d38:90d7:cf5:222e:893e:716c]:8333 +[2001:0:9d38:90d7:d6:1085:b8dd:41c2]:8333 +[2001:0:9d38:953c:101a:23b3:6b98:f888]:8333 +[2001:0:9d38:953c:1805:f38:3eb2:2121]:8333 +[2001:0:9d38:953c:1858:16f9:3833:da19]:8333 +[2001:0:9d38:953c:18ea:2735:e73d:adc5]:8333 +[2001:0:9d38:953c:1c44:2b70:9de7:a7cc]:8333 +[2001:0:9d38:953c:200a:3f95:bb7c:c09f]:8333 +[2001:0:9d38:953c:200c:3473:b85d:ddd]:8333 +[2001:0:9d38:953c:200f:5a0:47c6:5507]:8333 +[2001:0:9d38:953c:2097:204a:47c5:5881]:8333 +[2001:0:9d38:953c:248f:24cd:aaf5:dee3]:8333 +[2001:0:9d38:953c:287d:168e:3caf:47af]:8333 +[2001:0:9d38:953c:28c1:58d:b721:94c1]:8333 +[2001:0:9d38:953c:2c31:30a3:39d3:528]:8188 +[2001:0:9d38:953c:2c3d:309b:d2db:8288]:8333 +[2001:0:9d38:953c:2c47:1b36:52c1:3c73]:8333 +[2001:0:9d38:953c:304a:10e1:b739:822a]:8333 +[2001:0:9d38:953c:30a3:29fd:33f6:eaab]:8333 +[2001:0:9d38:953c:3427:859b:b525:1069]:8333 +[2001:0:9d38:953c:3459:2541:3651:d675]:8333 +[2001:0:9d38:953c:4f5:9c88:af91:d3d3]:8333 +[2001:0:9d38:953c:cd1:1d54:b80a:42f4]:8333 +[2001:0:9d38:953c:cfa:37e6:9d8e:7474]:8333 +[2001:13d8:1c01:2000:2470::1]:8333 +[2001:1470:fffd:202c:225:90ff:fe8f:5f62]:8333 +[2001:14ba:200:0:543c:42ce:a48b:b0d0]:8333 +[2001:14ba:2fc:700:41b2:df51:efd8:f581]:8333 [2001:19f0:5000:8c8b:5400:ff:fe1f:c023]:8333 -[2001:19f0:5000:8ce6:5400:ff:fe1b:24a9]:8333 -[2001:19f0:5:314:5400:ff:fe2c:42e8]:8333 -[2001:19f0:5:51b:5400:ff:fe49:fe5b]:8333 +[2001:19f0:5:749:5400:ff:fe71:c3fc]:8333 [2001:19f0:5:bc:5400:ff:fe3b:9339]:8333 -[2001:1af8:4020:a020:5::]:8333 +[2001:19f0:7402:42c:5400:ff:fe6c:b9b8]:8333 +[2001:1af8:4010:a08f:f811:e5f0:3f63:e753]:8333 +[2001:1af8:4010:a094:3333::8c38]:8333 +[2001:1af8:4070:a016:3333::5afb]:8333 +[2001:1af8:4700:a071:4444::e26e]:8333 [2001:1bc8:1a0:590e:2e0:f4ff:fe16:3a39]:8333 -[2001:1c04:1401:8f00:f4fe:4fff:fe0c:df40]:8333 +[2001:2040:77::89]:8333 +[2001:288:1001:107:294e:5581:74bd:42f9]:8333 +[2001:3c8:c103:a001::48]:8333 [2001:4128:6135:10:20c:29ff:fe69:9e81]:8333 [2001:4128:6135:2010:21e:bff:fee8:a3c0]:8333 [2001:4128:6135:e001:5054:ff:fe37:e9eb]:8333 -[2001:41d0:1000:1024::]:8333 -[2001:41d0:1000:1433::]:8333 -[2001:41d0:1004:22ae::]:8333 -[2001:41d0:1004:2996::]:8333 -[2001:41d0:1008:11e0::1a5c:6d9d]:8333 -[2001:41d0:1008:11e0::b74:baf7]:8333 -[2001:41d0:1008:237a::]:8333 +[2001:4178:6:1427:62:116:188:85]:8333 +[2001:41d0:1004:20f0::]:8333 [2001:41d0:1008:2752::]:8333 -[2001:41d0:1008:494::]:8333 -[2001:41d0:1:45d8::1]:8333 -[2001:41d0:1:5630::1]:8333 +[2001:41d0:1:4722::1]:8333 [2001:41d0:1:6f57::1]:8333 -[2001:41d0:1:801e::1]:8333 -[2001:41d0:1:8852::1]:8333 +[2001:41d0:1:7353::1]:8333 +[2001:41d0:1:7469::1]:8333 +[2001:41d0:1:7d09::1]:8333 [2001:41d0:1:8b26::1]:8333 -[2001:41d0:1:a5b8::1]:8333 -[2001:41d0:1:b26b::1]:8333 -[2001:41d0:1:c139::1]:8333 -[2001:41d0:1:c8d7::1]:8333 +[2001:41d0:1:c129::1]:8333 [2001:41d0:1:d227::]:8333 -[2001:41d0:1:dbc4::1]:8333 -[2001:41d0:1:dc5d::1]:8333 [2001:41d0:1:e13b::1]:8333 -[2001:41d0:1:ef5b::1]:8333 +[2001:41d0:1:e623::1]:8333 [2001:41d0:2:16be::1]:8333 [2001:41d0:2:203c::1]:8333 -[2001:41d0:2:38c5::1]:8333 -[2001:41d0:2:519::]:8333 +[2001:41d0:2:3242::]:8333 +[2001:41d0:2:8a0f::]:8333 +[2001:41d0:2:8c65::]:8333 +[2001:41d0:2:8d13::]:8333 +[2001:41d0:2:9459::]:8333 +[2001:41d0:2:950a:ffff:ffff:0:3]:8333 [2001:41d0:2:9c94::1]:8333 -[2001:41d0:2:b792::]:8333 +[2001:41d0:2:a212::]:8333 +[2001:41d0:2:a232::]:8333 +[2001:41d0:2:ab1c::]:8333 [2001:41d0:2:bf2a::]:8333 [2001:41d0:2:c793::]:8333 -[2001:41d0:2:c9bf::]:8333 -[2001:41d0:303:4f0::]:8333 -[2001:41d0:8:1a8a::1]:8333 -[2001:41d0:8:3fa9::1]:8333 -[2001:41d0:8:4670::1]:8333 -[2001:41d0:8:4f48::1]:8333 -[2001:41d0:8:6728::]:8333 -[2001:41d0:8:72c2:d:242:ac11:2]:8333 -[2001:41d0:8:8007::]:8333 -[2001:41d0:8:a71c::]:8333 -[2001:41d0:8:bccc::1]:8333 +[2001:41d0:302:1000::fa25]:8333 +[2001:41d0:303:1907::]:8333 +[2001:41d0:52:d00::6e2]:8333 +[2001:41d0:52:d00::6e3]:8333 +[2001:41d0:8:1b29::]:8333 +[2001:41d0:8:3d4b::1]:8333 +[2001:41d0:8:4d4d::1]:8333 +[2001:41d0:8:7a38::1]:8333 +[2001:41d0:8:8f46::1]:8333 +[2001:41d0:8:ba87::1]:8333 [2001:41d0:8:bd45::1]:8333 +[2001:41d0:8:bed3::]:8333 [2001:41d0:8:c67c::]:8333 +[2001:41d0:8:d844:1337::1017]:8333 +[2001:41d0:8:ddb::1]:8333 +[2001:41d0:8:ddf::1]:8333 [2001:41d0:8:de3d::1]:8333 -[2001:41d0:8:e257::1]:8333 [2001:41d0:8:e3e4::1]:8333 -[2001:41d0:a:14cc::1]:8333 -[2001:41d0:a:15b2::1]:8333 -[2001:41d0:a:1ac9::1]:8333 -[2001:41d0:a:2496::1]:8333 -[2001:41d0:a:308c::]:8333 -[2001:41d0:a:5879::]:8333 +[2001:41d0:a:4e3f::1c7d:6b01]:8333 +[2001:41d0:a:635b::1]:8333 [2001:41d0:a:6810::1]:8333 -[2001:41d0:a:682d::1]:8333 [2001:41d0:a:6c29::1]:8333 -[2001:41d0:a:f52a::1]:8333 +[2001:41d0:a:6fd0::]:8333 +[2001:41d0:a:fac7::1]:8333 [2001:41d0:d:111c::]:8333 +[2001:41d0:d:2ac8::]:8333 [2001:41d0:e:1388::1]:8333 -[2001:41d0:e:26b::1]:8333 -[2001:41d0:e:f73::1]:8333 -[2001:41d0:fc8c:a200:7a24:afff:fe9d:c69b]:8333 [2001:41f0:61:0:72f3:95ff:fe09:7521]:8333 [2001:41f0:61::7]:8333 -[2001:4428:200:8171:db6:2ff4:9c0e:a2da]:8333 [2001:470:1f07:151c:baac:6fff:feb7:3ba9]:8333 -[2001:470:1f0b:ad6:a60:6eff:fec6:2323]:8333 -[2001:470:1f11:617::10f]:8333 -[2001:470:1f14:73e::2]:8333 -[2001:470:1f14:7d::2]:8333 +[2001:470:1f0b:8c4::5]:8333 +[2001:470:1f0b:967::11]:8333 [2001:470:1f15:11f8::10]:8333 [2001:470:1f15:1b95:2c3e:8a9a:24e1:7084]:8333 -[2001:470:1f15:e9b::3ef]:8333 +[2001:470:1f15:f28::3]:8333 +[2001:470:1f1a:172::2]:8333 +[2001:470:1f1c:b07::2]:8333 [2001:470:1f1d:3a9::10]:8333 [2001:470:25:482::2]:8333 -[2001:470:27:19f::2]:8333 -[2001:470:27:665::2]:8333 [2001:470:28:365::4]:8333 -[2001:470:41:6::2]:8333 -[2001:470:727b::11:14]:8333 -[2001:470:7:2f0::2]:8333 -[2001:470:7:65::2]:8333 -[2001:470:7f85::2]:8333 -[2001:470:8:2e1:5825:39df:3e4c:54a8]:8333 -[2001:470:8:2e1::43]:8333 -[2001:470:8:2e1:ae2a:e257:4470:6350]:8333 +[2001:470:754f:42::17a]:8333 +[2001:470:7:b74::2]:8333 +[2001:470:7dda:1::1]:8333 +[2001:470:8:c70:20c:29ff:fe6a:8fdc]:8333 +[2001:470:8:c70::54]:8333 [2001:470:a:c13::2]:8333 +[2001:470:d00d:0:3664:a9ff:fe9a:5150]:8333 +[2001:470:dbf2:aaaa::b17:c01c]:8333 +[2001:470:f457:8000::a6]:8333 [2001:4801:7819:74:b745:b9d5:ff10:a61a]:8333 [2001:4801:7819:74:b745:b9d5:ff10:aaec]:8333 [2001:4801:7828:104:be76:4eff:fe10:1325]:8333 -[2001:4802:7800:2:30d7:1775:ff20:1858]:8333 -[2001:4ba0:babe:832::]:8333 -[2001:4ba0:cafe:379::1]:8333 -[2001:4ba0:ffee:33::10]:8333 -[2001:4dd0:ff00:9a67::9]:8333 -[2001:610:1b19::3]:8333 -[2001:610:600:a41::2]:8333 -[2001:678:174:4021::2:8333]:8333 -[2001:67c:16dc:1201:5054:ff:fe17:4dac]:8333 +[2001:4ba0:cafe:13c0::1]:8333 +[2001:4ba0:cafe:418::1]:8333 +[2001:558:6045:23:1830:896c:d901:190d]:8333 +[2001:67c:1220:80c::93e5:dd2]:8333 [2001:67c:2128:ffff:6062:36ff:fe30:6532]:8333 -[2001:67c:2564:331:3547:6e28:85a4:fb27]:8333 -[2001:6a0:200:368::2]:8333 -[2001:718:801:311:5054:ff:fe19:c483]:8333 -[2001:7b8:2ff:8f::2]:8333 -[2001:8d8:8a6:4400::3f:86c]:8333 [2001:8d8:923:8400::87:ebd]:8333 -[2001:960:66d::2]:8333 +[2001:981:4452:1::100]:8333 [2001:981:46:1:ba27:ebff:fe5b:edee]:8333 -[2001:ba8:1f1:f069::2]:8333 +[2001:981:bdbd:1:c506:7d38:4b47:da15]:8333 +[2001:985:79af:20::35]:8333 [2001:bc8:225f:10e:505:6573:7573:d0a]:8333 -[2001:bc8:2706::1]:8333 [2001:bc8:323c:100::53]:8333 [2001:bc8:323c:100::80:4]:8333 [2001:bc8:323c:100::cafe]:8333 [2001:bc8:3680:4242::1]:8333 [2001:bc8:399f:f000::1]:8333 -[2001:bc8:3cbf::5]:8333 -[2001:bc8:4700:2300::19:807]:8333 -[2001:e42:102:1805:160:16:206:31]:8333 -[2002:12f1:3f::12f1:3f]:8333 -[2002:1e2:5349::1e2:5349]:8333 +[2002:1e2:5587::1e2:5587]:8333 [2002:1e2:5588::1e2:5588]:8333 -[2002:2501:cf62::2501:cf62]:8333 -[2002:268c:a135::268c:a135]:8333 -[2002:2a33:99db::2a33:99db]:8332 -[2002:2ebc:2c14::7]:8333 -[2002:2f59:2c9c::2f59:2c9c]:11885 -[2002:2f5a:3619::2f5a:3619]:8333 -[2002:2f5a:36a4::2f5a:36a4]:8333 -[2002:2f5a:429::2f5a:429]:8333 +[2002:2a33:21c4::2a33:21c4]:8333 +[2002:2e04:784b::2e04:784b]:8333 +[2002:2ebc:2c14::16]:8333 +[2002:2f5a:3c1c::2f5a:3c1c]:10011 [2002:2f5a:562a::2f5a:562a]:8333 -[2002:3a3b:216::3a3b:216]:8333 -[2002:3dfa:5d23::3dfa:5d23]:8333 -[2002:424f:a052::424f:a052]:8333 -[2002:451e:e922::451e:e922]:8333 +[2002:2f5b:a5f9::2f5b:a5f9]:8333 +[2002:3141:28c::3141:28c]:8333 +[2002:323f:a2f2::323f:a2f2]:8333 +[2002:323f:fbd::323f:fbd]:8333 +[2002:33ff:69a0::1]:8333 +[2002:3e6a:106f::3e6a:106f]:8333 +[2002:3e70:bbc::3e70:bbc]:8333 +[2002:3e7a:6727::3e7a:6727]:8333 +[2002:3f62:e6bb::3f62:e6bb]:8333 [2002:4540:4b30::4540:4b30]:8333 -[2002:51ab:7cc::51ab:7cc]:8333 -[2002:527:de11::527:de11]:8333 -[2002:5395:7d01::5395:7d01]:8333 -[2002:5395:7d2a::5395:7d2a]:8333 -[2002:5669:e3be::5669:e3be]:8333 -[2002:566a:5d6d::566a:5d6d]:8333 -[2002:59b9:f820::59b9:f820]:8333 -[2002:59f8:ac69::59f8:ac69]:8333 -[2002:5bd4:b65a::5bd4:b65a]:8333 -[2002:5c3f:39db::5c3f:39db]:8333 -[2002:5d33:8d03::5d33:8d03]:8333 -[2002:5d67:49bb::5d67:49bb]:8333 -[2002:5dae:5d5f::5dae:5d5f]:8333 +[2002:4e6b:c745::1]:8333 +[2002:5052:4d8a::5052:4d8a]:8333 +[2002:51a9:9cc9::51a9:9cc9]:8333 +[2002:54fb:cb05::1]:8333 +[2002:5bc2:5428::5bc2:5428]:8333 +[2002:5bce:1253::5bce:1253]:8333 +[2002:5bdb:19e8::5bdb:19e8]:8333 +[2002:5c3f:3912::5c3f:3912]:8333 +[2002:5dbd:91a9::5dbd:91a9]:8333 [2002:5dbe:8cc6::5dbe:8cc6]:8333 -[2002:5dbe:9503::5dbe:9503]:8333 [2002:5fd3:8944::5fd3:8944]:8333 -[2002:5fd3:9467::5fd3:9467]:8333 -[2002:67f9:6a48::67f9:6a48]:8333 -[2002:67f9:6a4a::67f9:6a4a]:8333 -[2002:67f9:6a95::67f9:6a95]:8333 +[2002:65c8:a018::65c8:a018]:8333 +[2002:6750:a839::6750:a839]:8333 +[2002:67fa:44b::67fa:44b]:8333 [2002:6a0e:3ea8::6a0e:3ea8]:10011 -[2002:6b96:375a::6b96:375a]:8333 -[2002:6ca8:cffb::6ca8:cffb]:8333 -[2002:6caf:234::6caf:234]:8333 -[2002:6dec:58f5::6dec:58f5]:8333 +[2002:6a0f:2497::6a0f:2497]:8333 [2002:6dec:5ac7::6dec:5ac7]:8333 -[2002:7237:4a02::7237:4a02]:20033 -[2002:7237:94fd::7237:94fd]:10011 -[2002:7237:e428::7237:e428]:8333 +[2002:704a:d6d4::704a:d6d4]:9997 [2002:7237:fcf6::7237:fcf6]:20188 -[2002:76c0:96e6::76c0:96e6]:8333 +[2002:76b2:7f40::76b2:7f40]:8333 [2002:7819:7e80::7819:7e80]:7743 -[2002:781a:ea86::781a:ea86]:8333 -[2002:781a:f3c2::781a:f3c2]:14475 -[2002:784c:c2c0::784c:c2c0]:8333 -[2002:784c:ec97::784c:ec97]:8333 -[2002:792b:261a::792b:261a]:8333 -[2002:88f3:8cca::88f3:8cca]:8333 -[2002:88f3:a83c::88f3:a83c]:8333 -[2002:8ac9:516f::8ac9:516f]:8333 -[2002:8b81:6d78::8b81:6d78]:50344 -[2002:8b81:6e5c::8b81:6e5c]:38176 -[2002:8bc4:90a6::8bc4:90a6]:8333 +[2002:781b:8db8::781b:8db8]:8333 +[2002:7b38:cd00::7b38:cd00]:8333 [2002:ac52:b854::ac52:b854]:8333 -[2002:add0:c14a::add0:c14a]:8333 -[2002:b07e:a70a::b07e:a70a]:8333 -[2002:b27c:c565:1::250]:8333 -[2002:b27c:c565::1]:8333 -[2002:b94d:80f1::b94d:80f1]:8333 -[2002:b982:e26a::b982:e26a]:8333 -[2002:bcd5:3145::bcd5:3145]:8333 -[2002:c08a:d22b::c08a:d22b]:8333 -[2002:c0c7:f8e3::c0c7:f8e3]:32771 -[2002:c1a9:fc5a::c1a9:fc5a]:8333 +[2002:b610:1ca3::b610:1ca3]:8333 +[2002:b946:694a::b946:694a]:8339 +[2002:b994:9167::b994:9167]:8333 +[2002:bc28:6b92::bc28:6b92]:8333 [2002:c23f:8fc5::c23f:8fc5]:8333 -[2002:d395:ea6d::d395:ea6d]:8333 -[2002:d917:ca5::d917:ca5]:8333 -[2002:d917:e91::d917:e91]:8333 +[2002:c338:3f0a::c338:3f0a]:8333 +[2002:d1b1:5615::d1b1:5615]:8333 +[2002:d2d3:6da5::d2d3:6da5]:8333 +[2002:d917:2b1::d917:2b1]:8333 [2002:db71:f434::db71:f434]:8333 -[2400:2651:161:1000:6847:d40f:aaa3:4848]:8333 -[2400:8901::f03c:91ff:fec8:4280]:8333 -[2401:1800:7800:102:be76:4eff:fe1c:a7d]:8333 +[2003:a:36f:4f01::1]:8333 +[2003:a:37f:ef4f:dead:babe:b00b:beef]:8333 +[2400:8901::f03c:91ff:fe2c:63d8]:8333 +[2400:8902::f03c:91ff:fed5:9d8d]:8333 [2401:2500:203:10:153:120:156:83]:8333 [2401:a400:3200:5600:14ee:f361:4bdc:1f7c]:8333 +[2402:1f00:8100:36::]:8333 [2403:4200:403:2::ff]:8333 +[2405:9800:b440:947f:59a5:f379:1876:858c]:8333 [2405:aa00:2::40]:8333 +[2406:da14:445:5201::4]:8333 +[2406:da18:f7c:4351:1a58:81fe:6ed0:1103]:8333 +[2406:da18:f7c:4351:22aa:2585:fe88:7d58]:8333 +[2406:da18:f7c:4351:2674:33bb:25d6:cbba]:8333 +[2406:da18:f7c:4351:2e19:a8c7:a36a:bde0]:8333 +[2406:da18:f7c:4351:3cc8:43d:fbcc:5067]:8333 +[2406:da18:f7c:4351:5228:2b53:bb9a:edf5]:8333 +[2406:da18:f7c:4351:5729:102:998c:d41a]:8333 +[2406:da18:f7c:4351:591b:4881:3986:3703]:8333 +[2406:da18:f7c:4351:59b9:b50:f47f:b560]:8333 +[2406:da18:f7c:4351:61f2:cfb0:8c45:5fdd]:8333 +[2406:da18:f7c:4351:6356:68e0:73fc:ac0b]:8333 +[2406:da18:f7c:4351:660e:f6bc:3563:ba8e]:8333 +[2406:da18:f7c:4351:691:9e:f2df:227d]:8333 +[2406:da18:f7c:4351:721c:83d2:6765:4300]:8333 +[2406:da18:f7c:4351:7237:9be:4601:bc15]:8333 +[2406:da18:f7c:4351:7a3b:c203:fd11:6c7d]:8333 +[2406:da18:f7c:4351:7a74:a80e:889a:ba42]:8333 +[2406:da18:f7c:4351:7ee3:a181:f25c:fa79]:8333 +[2406:da18:f7c:4351:8a25:9084:140:4549]:8333 +[2406:da18:f7c:4351:8bc0:c6fd:ecfb:f074]:8333 +[2406:da18:f7c:4351:91ce:d0ba:1b9e:c27b]:8333 +[2406:da18:f7c:4351:9336:44e7:84b4:85b9]:8333 +[2406:da18:f7c:4351:936c:c3b9:a1d0:848]:8333 +[2406:da18:f7c:4351:93ef:1eef:65c8:766d]:8333 +[2406:da18:f7c:4351:94e0:5b27:78c2:5111]:8333 +[2406:da18:f7c:4351:9815:a202:18a3:2a36]:8333 +[2406:da18:f7c:4351:9e1b:135c:7472:9d9]:8333 +[2406:da18:f7c:4351:9f84:278:68f5:b8ea]:8333 +[2406:da18:f7c:4351:a062:493f:a6f8:ca75]:8333 +[2406:da18:f7c:4351:a192:b98:3066:8f11]:8333 +[2406:da18:f7c:4351:a1cb:2f19:4a54:38c9]:8333 +[2406:da18:f7c:4351:a4a2:4c9:c43a:98ae]:8333 +[2406:da18:f7c:4351:a7e9:cd48:fa90:46d3]:8333 +[2406:da18:f7c:4351:a88:99:6671:fce4]:8333 +[2406:da18:f7c:4351:abe1:2e48:eb97:2ab5]:8333 +[2406:da18:f7c:4351:acf5:2b21:5d2a:6b31]:8333 +[2406:da18:f7c:4351:b51f:8966:74a5:6c53]:8333 +[2406:da18:f7c:4351:b8e3:f3ca:e412:daa5]:8333 +[2406:da18:f7c:4351:ba7c:6da8:da59:b1b6]:8333 +[2406:da18:f7c:4351:be04:6f8e:8f93:c555]:8333 +[2406:da18:f7c:4351:c82d:2a0b:31a5:e28d]:8333 +[2406:da18:f7c:4351:c993:eb06:bd2c:1e65]:8333 +[2406:da18:f7c:4351:d4b9:bff8:c4d4:1e05]:8333 +[2406:da18:f7c:4351:d70d:a73d:1ddd:439e]:8333 +[2406:da18:f7c:4351:e103:f456:b296:9f29]:8333 +[2406:da18:f7c:4351:ea3b:27ec:7c2:aebc]:8333 +[2406:da18:f7c:4351:f62c:5013:379b:363e]:8333 [240b:10:ca20:f0:224:e8ff:fe1f:60d9]:8333 [240b:250:1e0:2400:b9ef:8fe3:a69a:7378]:8333 -[240d:1a:302:8600:8876:a36d:12ee:f285]:8333 +[2600:1f14:34a:fe00:13f4:ceb6:a9db:4f47]:8333 +[2600:1f14:34a:fe00:2550:9366:a5d9:78a5]:8333 +[2600:1f14:34a:fe00:27d:6ed:7c8d:7bee]:8333 +[2600:1f14:34a:fe00:2ed6:8a19:4eb:36c1]:8333 +[2600:1f14:34a:fe00:34c7:2e9e:e60e:f823]:8333 +[2600:1f14:34a:fe00:38de:442:72df:6346]:8333 +[2600:1f14:34a:fe00:3a1e:878f:991a:9582]:8333 +[2600:1f14:34a:fe00:3d88:1805:54e3:f4c8]:8333 +[2600:1f14:34a:fe00:3f3e:58bd:ec82:5dac]:8333 +[2600:1f14:34a:fe00:449a:9515:8436:f407]:8333 +[2600:1f14:34a:fe00:4f84:277f:e64d:1f06]:8333 +[2600:1f14:34a:fe00:5229:de84:8226:7257]:8333 +[2600:1f14:34a:fe00:5743:42c3:951b:e97a]:8333 +[2600:1f14:34a:fe00:5a29:85b:86b5:fa0e]:8333 +[2600:1f14:34a:fe00:5de8:81e:6d79:330b]:8333 +[2600:1f14:34a:fe00:5fca:ad1e:5b9c:5265]:8333 +[2600:1f14:34a:fe00:68c4:ca1b:813e:1bce]:8333 +[2600:1f14:34a:fe00:6:de9e:7b5e:a558]:8333 +[2600:1f14:34a:fe00:6c72:1fcd:433:dc97]:8333 +[2600:1f14:34a:fe00:77ee:629f:bc13:fb4f]:8333 +[2600:1f14:34a:fe00:79d0:85d6:516f:3293]:8333 +[2600:1f14:34a:fe00:81:422f:9ef3:4579]:8333 +[2600:1f14:34a:fe00:822b:5f05:ec8d:48c6]:8333 +[2600:1f14:34a:fe00:82a:76a2:fdc9:845e]:8333 +[2600:1f14:34a:fe00:83ca:cef6:e04c:50c0]:8333 +[2600:1f14:34a:fe00:8ba2:a36c:8687:d5aa]:8333 +[2600:1f14:34a:fe00:8c80:5c67:3b47:90b3]:8333 +[2600:1f14:34a:fe00:8eb8:f47f:6d53:e3ae]:8333 +[2600:1f14:34a:fe00:989c:f8f8:a922:1b9a]:8333 +[2600:1f14:34a:fe00:98c9:1eb3:ea12:a8f0]:8333 +[2600:1f14:34a:fe00:9ee5:a8f6:6b2a:866e]:8333 +[2600:1f14:34a:fe00:a46b:7bd5:629f:f75c]:8333 +[2600:1f14:34a:fe00:a627:8299:8784:d439]:8333 +[2600:1f14:34a:fe00:ad0b:955e:b4e5:d97d]:8333 +[2600:1f14:34a:fe00:ae82:7117:9d69:7c86]:8333 +[2600:1f14:34a:fe00:ccee:365a:43f8:b871]:8333 +[2600:1f14:34a:fe00:d5ee:a3e2:2f85:e593]:8333 +[2600:1f14:34a:fe00:d5f0:1fe0:6bd5:18a8]:8333 +[2600:1f14:34a:fe00:e4a7:5aba:af87:4cdb]:8333 +[2600:1f14:34a:fe00:e8e5:2d0:fb6f:2f5]:8333 +[2600:1f14:34a:fe00:e9ef:4690:a5ac:92be]:8333 +[2600:1f14:34a:fe00:efba:2260:6997:fcf7]:8333 +[2600:1f14:34a:fe00:f107:2d08:c67:e5dd]:8333 +[2600:1f14:34a:fe00:f1b9:88fb:f3db:a86e]:8333 +[2600:1f14:34a:fe00:f79c:17b7:6f75:95b7]:8333 +[2600:1f14:6ae:d900:6550:3fc5:e074:a72c]:8333 +[2600:1f16:625:e00:1243:38b3:caa:d62e]:8333 +[2600:1f16:625:e00:166d:a956:1041:f97d]:8333 +[2600:1f16:625:e00:35f2:2428:fc57:d638]:8333 +[2600:1f16:625:e00:3c75:333e:b7f:8cc0]:8333 +[2600:1f16:625:e00:3fbf:31f:1b57:8b18]:8333 +[2600:1f16:625:e00:5617:7575:379:a8cc]:8333 +[2600:1f16:625:e00:58fa:fce6:30:a5dc]:8333 +[2600:1f16:625:e00:5e74:70dc:af78:6b77]:8333 +[2600:1f16:625:e00:7036:f651:2ee:39cd]:8333 +[2600:1f16:625:e00:7fc:9004:e7be:ffe2]:8333 +[2600:1f16:625:e00:814a:23f6:e996:5e64]:8333 +[2600:1f16:625:e00:822c:a88b:f9c:57e3]:8333 +[2600:1f16:625:e00:8314:b91e:a7ba:702]:8333 +[2600:1f16:625:e00:88bb:ee9a:10de:12]:8333 +[2600:1f16:625:e00:8c30:56f5:a29a:91de]:8333 +[2600:1f16:625:e00:8fdf:6517:7718:8c42]:8333 +[2600:1f16:625:e00:91fd:78b1:62a3:193]:8333 +[2600:1f16:625:e00:930d:93ed:76a6:3285]:8333 +[2600:1f16:625:e00:93c2:615f:a79a:c11f]:8333 +[2600:1f16:625:e00:a780:8bc8:a1f6:d417]:8333 +[2600:1f16:625:e00:a951:e663:4046:8c3a]:8333 +[2600:1f16:625:e00:ab19:5fe3:f155:1371]:8333 +[2600:1f16:625:e00:aefd:9cc7:d3:6e86]:8333 +[2600:1f16:625:e00:b031:e86e:8604:324a]:8333 +[2600:1f16:625:e00:b6e:4399:9dc2:6b45]:8333 +[2600:1f16:625:e00:b7c7:58c6:21a1:fd41]:8333 +[2600:1f16:625:e00:c169:6282:178c:27d6]:8333 +[2600:1f16:625:e00:c94e:58b:bd35:d815]:8333 +[2600:1f16:625:e00:caa5:7369:73a4:5711]:8333 +[2600:1f16:625:e00:cd15:b9f2:6e3e:6fd1]:8333 +[2600:1f16:625:e00:d6f3:775:66b7:3e92]:8333 +[2600:1f16:625:e00:dbec:f7d9:e15:f8e0]:8333 +[2600:1f16:625:e00:dbf4:4d41:594e:bc20]:8333 +[2600:1f16:625:e00:e11b:4589:a0c3:9cc7]:8333 +[2600:1f16:625:e00:ed68:15b0:3a97:be0c]:8333 +[2600:1f16:625:e00:eef3:bce0:84ee:a98b]:8333 +[2600:1f16:625:e00:ef3a:f66e:f059:d03f]:8333 +[2600:1f16:625:e00:f67c:d398:5b6:d34f]:8333 +[2600:1f16:625:e00:fe35:5099:3a8e:d123]:8333 +[2600:1f18:64d9:1603:6f6f:eef9:b595:1958]:8333 +[2600:3c00::f03c:91ff:fe84:d650]:8333 +[2600:3c00::f03c:91ff:fe89:7438]:8333 [2600:3c00::f03c:91ff:fe91:3e49]:8333 [2600:3c00::f03c:91ff:febb:981e]:8333 -[2600:3c01::f03c:91ff:fe18:6adf]:8333 [2600:3c01::f03c:91ff:fe69:89e9]:8333 [2600:3c01::f03c:91ff:fe91:6a29]:8333 -[2600:3c01::f03c:91ff:fef1:1eaa]:8333 -[2600:3c03::f03c:91ff:fe18:da80]:8333 [2600:3c03::f03c:91ff:fe28:1445]:8333 -[2600:3c03::f03c:91ff:fe67:d2e]:8333 -[2600:3c03::f03c:91ff:fe89:116f]:8333 -[2600:3c03::f03c:91ff:feb0:5fc4]:8333 [2600:3c03::f03c:91ff:fee0:233e]:8333 -[2600:3c03::f03c:91ff:fee0:51]:8333 +[2600:6c55:7200:24d:cf4:811c:7cb3:f7a7]:8333 [2600:8805:2400:14e:226:4aff:fe02:2ba4]:8333 -[2600:8807:5080:3301:1487:83b7:33d7:eb97]:8333 -[2601:186:c100:6bcd:16bd:cea1:235d:1c19]:8333 -[2601:18c:4200:28d0:e4d:e9ff:fec5:76d0]:8333 -[2601:247:8201:6251:30e6:7b95:69bf:9248]:8333 +[2601:18d:4600:3cc2:20e7:b3ff:fecf:a99]:8333 +[2601:1c2:1702:5241:47d:4016:ec42:6705]:8333 +[2601:441:4101:70cd:4e3:8e81:3250:1f0b]:8333 [2601:602:9980:f78:211:11ff:fec5:1ae]:8333 -[2602:ae:1993:de00:2c50:9a44:8f11:77a5]:8333 -[2602:ff68:0:1:21e:bff:feca:db72]:8333 -[2602:ff68:0:1:2bd:27ff:feb0:adf8]:8333 -[2602:ff68:0:1::5]:8333 -[2602:ff68:0:5:2bd:27ff:feb0:adf8]:8333 -[2602:ffc5:1f::1f:2d61]:8333 -[2602:ffc5:1f::1f:9211]:8333 -[2602:ffc5::9e63:27a2]:8333 +[2601:646:4103:179f:5809:1bff:fe55:6678]:8333 +[2602:4c:323:b101:35a3:9de8:6984:ef56]:8333 +[2602:ff62:104:ac1:8000::]:8333 +[2602:ffc5:40::1:711e]:8333 [2602:ffc5::c30:1c75]:8333 -[2602:ffc5::ffc5:b844]:8333 -[2602:ffe8:100:2::457:936b]:8333 -[2604:180:2:eee::ca46]:8333 -[2604:880:d:85::be37]:8333 -[2604:9a00:2100:a009:2::]:8333 -[2604:a880:2:d0::301:8001]:8333 -[2604:a880:2:d0::4a9:1001]:8333 -[2604:a880:2:d0::53a:c001]:8333 +[2604:a880:2:d0::17e9:2001]:8333 +[2604:a880:2:d0::22f8:f001]:8333 +[2604:a880:2:d0::22f9:1]:8333 +[2604:a880:2:d0::22f9:c001]:8333 +[2604:a880:2:d0::22f9:d001]:8333 +[2604:a880:2:d0::22f9:e001]:8333 +[2604:a880:2:d0::22fa:2001]:8333 +[2604:a880:2:d0::22fa:3001]:8333 +[2604:a880:400:d0::1684:5001]:8333 +[2604:a880:400:d0::1ac4:b001]:8333 +[2604:a880:400:d0::2004:4001]:8333 +[2604:a880:400:d0::2004:5001]:8333 +[2604:a880:400:d0::2004:6001]:8333 +[2604:a880:400:d0::2004:c001]:8333 +[2604:a880:400:d0::2004:d001]:8333 +[2604:a880:400:d0::2004:e001]:8333 +[2604:a880:400:d0::2004:f001]:8333 +[2604:a880:400:d0::2005:1]:8333 +[2604:a880:400:d0::2005:3001]:8333 +[2604:a880:400:d0::261f:6001]:8333 +[2604:a880:400:d0::28b8:5001]:8333 [2604:a880:400:d0::ad7:e001]:8333 -[2604:a880:400:d0::dcf:f001]:8333 [2605:4d00::50]:8333 -[2605:6000:edc8:300::ddfe]:8333 -[2605:6000:ffc0:70:74d5:225c:f553:5bb8]:8333 -[2606:6000:c148:7003:5054:ff:fe78:66ff]:8333 -[2606:6000:e6d6:d701:d428:5e44:a2c9:3ff6]:8333 -[2606:c680:1:4a:2016:d1ff:fe93:52a7]:8333 +[2605:5d80:2002::245]:8333 +[2605:9880:0:953:225:90ff:fed2:c0b4]:8333 +[2606:c380::215:17ff:feb3:3ec]:8333 +[2607:1c00:a:6:3c1c:1b0d:ba4:8ea9]:8333 +[2607:1c00:a:6::1000]:8333 +[2607:4480:2:2000:250:56ff:fe86:6449]:8333 +[2607:5300:120:671::]:8333 +[2607:5300:120:962::]:8333 +[2607:5300:201:2000::1:556]:8333 [2607:5300:203:118:3733::1414]:8333 -[2607:5300:60:13bb::1]:8333 -[2607:5300:60:1966::1]:8333 -[2607:5300:60:2218::]:8333 -[2607:5300:60:3775::]:8333 +[2607:5300:60:10aa::1]:8333 +[2607:5300:60:1e83::]:8333 +[2607:5300:60:1e83::1000]:8333 +[2607:5300:60:1e83::2000]:8333 +[2607:5300:60:2d0::1]:8333 [2607:5300:60:3ddf::]:8333 -[2607:5300:60:a654::]:8333 -[2607:5300:60:a7a3::]:8333 +[2607:5300:60:3f3c::]:8333 +[2607:5300:60:5428::]:8333 [2607:5300:60:ac0::1]:8333 -[2607:5300:60:cf97::]:8333 -[2607:f0d0:1901:19::6]:8333 -[2607:f128:40:1202:69:162:139:125]:8333 -[2607:f128:40:1703::2]:8333 -[2607:f178:0:8::106]:8333 -[2607:f1c0:84d:8900::7e:cad]:8333 +[2607:5300:61:f4b::1]:8333 +[2607:9000:0:1:5054:ff:fe5d:264e]:8333 +[2607:f1c0:846:9a00::87:d00e]:8333 +[2607:f2d8:4005:d:a8a2:eeff:fee0:a859]:8333 [2607:f948:0:1::1:40]:8333 -[2607:fcd0:100:2302::6094:635a]:8333 -[2607:fcd0:100:6a00::3a96:1]:8333 -[2607:fcd0:100:6a02::7ff0:1]:8333 -[2607:fcd0:100:8203::8c58:dbc]:8333 -[2607:fea8:1360:9c2:221a:6ff:fe47:776d]:8333 -[2607:fea8:4da0:9ce:5114:a8ec:20f5:a50b]:8333 -[2607:fea8:5df:fda0:feaa:14ff:feda:c79a]:8333 -[2607:fea8:84c0:163:f42c:baff:fecc:6bbf]:8333 +[2607:fa18:3a01::50]:8333 +[2607:fea8:3ca0:926::2]:8333 +[2607:fea8:4da0:3b0::2]:8333 [2607:ff10:c5:502:225:90ff:fe32:d446]:8333 -[2607:ff48:aa81:800::96cf:1]:8333 -[2620:11c:5001:1118:d267:e5ff:fee9:e673]:8333 +[2607:ff28:9005:1::2567:57e0]:8333 +[2620:71:4000:0:192:30:120:110]:8333 [2620:b8:4000:1000::93:1]:8333 [2800:1a0::9]:8333 -[2a00:1178:2:43:19fd:d43e:b77:edeb]:8333 -[2a00:1178:2:43:b4e3:e562:f811:d761]:8333 -[2a00:14f0:e000:80d2:cd1a::1]:8333 -[2a00:1630:14::101]:8333 -[2a00:1630:2:1802:188:122:91:11]:8333 -[2a00:1630:2:500::4]:8333 +[2801:84:0:1034:76d4:35ff:fe7f:5033]:8333 +[2a00:16d8:c::5b6a:c261]:8333 [2a00:1768:2001:24::148:218]:8333 -[2a00:1768:2001:27::142:21]:8333 +[2a00:19e0:1:1:225:90ff:fea5:fc0]:8333 [2a00:1a48:7810:101:be76:4eff:fe08:c774]:8333 -[2a00:1ca8:37::a5fc:40d1]:8333 -[2a00:1ca8:37::ab6d:ce2c]:8333 -[2a00:1dc0:2255:10::2]:8333 +[2a00:6340:2004:0:5054:ff:fe54:38c]:8333 +[2a00:7b80:477:21::1c8c:83a6]:8333 [2a00:7c80:0:71::8]:8333 [2a00:7c80:0:97::7]:8333 -[2a00:bbe0:0:42:222:64ff:fe9a:e206]:8333 -[2a00:c98:2050:a020:3::110]:8333 -[2a00:dcc0:eda:98:183:193:1d24:b53a]:8333 -[2a00:dcc0:eda:98:183:193:c382:6bdb]:8333 -[2a00:dcc0:eda:98:183:193:f72e:d943]:8333 -[2a00:f90:ff0:c100:53c4:97a7:8b59:796a]:8333 -[2a01:238:435c:de00:b110:38cf:192d:b2c]:28333 -[2a01:348:6:7cf::2]:8333 -[2a01:368:e012:8888:216:3eff:fe24:1162]:8333 +[2a01:238:4363:4900:d85e:c1d9:2b32:61d0]:8333 [2a01:488:66:1000:53a9:22b:0:1]:8333 -[2a01:488:67:1000:523:ffa7:0:1]:8333 +[2a01:488:67:1000:5bfa:5526:0:1]:8333 [2a01:488:67:1000:b01c:3379:0:1]:8333 -[2a01:4f8:100:34ce::2]:8333 -[2a01:4f8:100:44e7::2]:8333 -[2a01:4f8:10a:2e4::2]:8333 -[2a01:4f8:10a:34e::2]:8333 -[2a01:4f8:10a:51d::2]:8333 -[2a01:4f8:10a:622::2]:8333 -[2a01:4f8:10a:85f::2]:8333 -[2a01:4f8:10a:864::2]:8333 -[2a01:4f8:10a:d04::2]:8333 -[2a01:4f8:110:334c::2]:8333 +[2a01:4d60:3:1:5::1]:8333 +[2a01:4f8:10a:1d8f::2]:8333 +[2a01:4f8:10a:1e81::2]:8333 +[2a01:4f8:10a:2261::2]:8833 +[2a01:4f8:10a:239c::2]:9002 +[2a01:4f8:10a:294a::2]:8333 +[2a01:4f8:10a:31d3::2]:8333 +[2a01:4f8:10a:3fe6::2]:8333 +[2a01:4f8:10a:b2e::2]:8333 +[2a01:4f8:10b:12d7::2]:8333 +[2a01:4f8:10b:d50::2]:8333 +[2a01:4f8:10b:e2d::2]:8333 +[2a01:4f8:10b:ee1::2]:8333 +[2a01:4f8:110:5107::2]:8333 +[2a01:4f8:110:5292::2]:8333 [2a01:4f8:110:536e::2]:8333 [2a01:4f8:120:43e4::2]:8333 -[2a01:4f8:120:702e::2]:8333 -[2a01:4f8:121:4346::2]:8333 [2a01:4f8:130:3332::2]:8333 +[2a01:4f8:130:430b::2]:8333 +[2a01:4f8:130:618e::2]:8333 +[2a01:4f8:130:71d2::2]:8333 +[2a01:4f8:130:7422::2]:8333 [2a01:4f8:131:33ad::2]:8333 [2a01:4f8:131:33ad:fea1::666]:8333 -[2a01:4f8:140:31b0::2]:8333 -[2a01:4f8:140:4088::2]:8333 +[2a01:4f8:131:3428::2]:8333 +[2a01:4f8:140:1326::2]:8333 +[2a01:4f8:140:524a::2]:8333 +[2a01:4f8:140:6055::2]:8333 +[2a01:4f8:140:7410::2]:8333 [2a01:4f8:140:931a::2]:8333 -[2a01:4f8:140:93b0::2]:8333 -[2a01:4f8:141:13ad::c451]:8333 -[2a01:4f8:141:186::2]:8333 +[2a01:4f8:141:2254::2]:8333 [2a01:4f8:141:22ae::2]:8333 -[2a01:4f8:141:322c::2]:8333 [2a01:4f8:150:11d4::2]:8333 -[2a01:4f8:150:440f::2]:8333 -[2a01:4f8:150:61ee::2]:8333 +[2a01:4f8:150:70a4::2]:8333 [2a01:4f8:150:726b::2]:8333 -[2a01:4f8:151:30c9::2]:15000 -[2a01:4f8:151:41a2::2]:8333 -[2a01:4f8:151:41cc::2]:8333 -[2a01:4f8:151:52c6::154]:8333 -[2a01:4f8:151:600b::1:1]:8333 +[2a01:4f8:150:72ee::4202]:8333 +[2a01:4f8:150:90ca::2]:8333 +[2a01:4f8:151:30c9::2]:8333 +[2a01:4f8:151:334d::3]:8333 [2a01:4f8:151:7175::2]:8333 [2a01:4f8:160:41f0::1:33]:8333 -[2a01:4f8:160:5328::27f0:187a]:8333 -[2a01:4f8:160:814f::2]:8333 -[2a01:4f8:161:21ad::333:30]:8333 +[2a01:4f8:160:636e::2]:8333 [2a01:4f8:161:7026::2]:8333 -[2a01:4f8:162:4110::2]:8333 -[2a01:4f8:162:4348::2]:8333 +[2a01:4f8:162:2108::2]:8333 +[2a01:4f8:162:3121::50]:8333 +[2a01:4f8:162:424c::2]:8333 [2a01:4f8:171:1c1b::2]:8333 [2a01:4f8:171:1c3::2]:8333 [2a01:4f8:171:2258::2]:8333 -[2a01:4f8:171:2a70::2]:8333 -[2a01:4f8:171:2e1b::2]:8333 +[2a01:4f8:171:27d6::2]:8333 [2a01:4f8:171:2f28::2]:8333 -[2a01:4f8:171:3248::2]:8333 -[2a01:4f8:171:380c::2]:8333 -[2a01:4f8:171:b93::2]:8333 -[2a01:4f8:171:d0a::2]:8333 -[2a01:4f8:172:116c::2]:8333 -[2a01:4f8:172:1287::2]:8333 -[2a01:4f8:172:17a9::2]:8333 -[2a01:4f8:172:1ca7::2]:8333 -[2a01:4f8:172:2159::2]:8333 -[2a01:4f8:172:3a41::2]:8333 -[2a01:4f8:172:3b42::2]:8333 -[2a01:4f8:172:3ec1::2]:8333 -[2a01:4f8:172:3ec2::2]:8333 -[2a01:4f8:172:aeb::2]:8333 -[2a01:4f8:172:aec::2]:8333 -[2a01:4f8:173:10ab::2]:8333 -[2a01:4f8:173:1551::2]:8333 -[2a01:4f8:173:1bca::2]:8333 -[2a01:4f8:173:1e2e::2]:8333 -[2a01:4f8:173:2162::2]:8333 -[2a01:4f8:173:21e6::2]:8333 +[2a01:4f8:171:d23::2]:8333 +[2a01:4f8:172:10da::2]:8333 +[2a01:4f8:172:504::2]:8333 +[2a01:4f8:173:1622::2]:8333 [2a01:4f8:173:42::2]:8333 -[2a01:4f8:173:cc1::2]:8333 -[2a01:4f8:190:1253::2]:8333 [2a01:4f8:190:24eb::2]:8333 -[2a01:4f8:190:34f0::2]:8333 [2a01:4f8:190:528d::2]:8333 -[2a01:4f8:190:91ce::2]:8333 -[2a01:4f8:191:2194::83]:8333 -[2a01:4f8:191:40e8::2]:8333 -[2a01:4f8:191:8165::2]:22556 +[2a01:4f8:190:61f3::2]:8333 +[2a01:4f8:191:418f::2]:3333 +[2a01:4f8:191:63b4:5000::1]:8333 [2a01:4f8:191:81b7::2]:8333 [2a01:4f8:191:8328::3]:8333 -[2a01:4f8:192:11b2::2]:8343 -[2a01:4f8:192:216c::2]:8333 -[2a01:4f8:192:22af::2]:8333 -[2a01:4f8:192:2422::2]:8333 -[2a01:4f8:192:34d0::2]:8333 -[2a01:4f8:192:440b::2]:8333 +[2a01:4f8:192:4a5::2]:8333 [2a01:4f8:192:5230::2]:8333 -[2a01:4f8:192:db::2]:8333 [2a01:4f8:200:1012::2]:8333 +[2a01:4f8:200:32a6::2]:8333 [2a01:4f8:200:414e::2]:8333 [2a01:4f8:200:416a::2]:8333 -[2a01:4f8:201:21a7::2]:8333 -[2a01:4f8:201:4017::11]:8333 +[2a01:4f8:200:90c3::2]:8333 +[2a01:4f8:201:148d::2]:8333 +[2a01:4f8:201:2cc::2]:8333 +[2a01:4f8:201:3e3::2]:8333 +[2a01:4f8:201:53cc::2]:8333 [2a01:4f8:201:6011::4]:8333 -[2a01:4f8:201:60d5::2]:8333 -[2a01:4f8:202:12d6::2]:8333 +[2a01:4f8:202:3030::2]:8333 [2a01:4f8:202:31e3::2]:8333 [2a01:4f8:202:32c6::2]:8333 -[2a01:4f8:202:53c3::2]:8333 -[2a01:4f8:211:14cf::2]:8333 +[2a01:4f8:202:6035::2]:8333 +[2a01:4f8:210:5488::2]:8333 +[2a01:4f8:211:1e17::2]:8333 [2a01:4f8:211:1ec5::2]:8333 -[2a01:4f8:211:483::2]:8333 -[2a01:4f8:211:d99::8]:8333 [2a01:4f8:212:1826::2]:8333 -[2a01:4f8:212:27a8::2]:8333 -[2a01:4f8:221:801::2]:8333 -[2a01:4f8:a0:12cc::2]:8333 -[2a01:4f8:a0:746a:101:1:1:2]:8333 -[2a01:4f8:a0:828a::2]:8333 -[2a01:4f8:c17:2eef::2]:8333 -[2a01:4f8:c17:2f3c::2]:3333 +[2a01:4f8:221:f59::2]:8333 +[2a01:4f8:c0c:1026::2]:8333 +[2a01:4f8:c0c:1028::2]:8333 +[2a01:4f8:c0c:1029::2]:8333 +[2a01:4f8:c0c:105f::2]:8333 +[2a01:4f8:c0c:1064::2]:8333 +[2a01:4f8:c0c:106b::2]:8333 +[2a01:4f8:c0c:106d::2]:8333 +[2a01:4f8:c0c:1070::2]:8333 +[2a01:4f8:c0c:1105::2]:8333 +[2a01:4f8:c0c:1106::2]:8333 +[2a01:4f8:c0c:1134::2]:8333 +[2a01:4f8:c0c:1135::2]:8333 +[2a01:4f8:c0c:113c::2]:8333 +[2a01:4f8:c0c:115c::2]:8333 +[2a01:4f8:c0c:115e::2]:8333 +[2a01:4f8:c0c:1170::2]:8333 +[2a01:4f8:c0c:1172::2]:8333 +[2a01:4f8:c0c:117b::2]:8333 +[2a01:4f8:c0c:117c::2]:8333 +[2a01:4f8:c0c:1180::2]:8333 +[2a01:4f8:c0c:1181::2]:8333 +[2a01:4f8:c0c:1185::2]:8333 +[2a01:4f8:c0c:1186::2]:8333 +[2a01:4f8:c0c:1187::2]:8333 +[2a01:4f8:c0c:1188::2]:8333 +[2a01:4f8:c0c:1189::2]:8333 +[2a01:4f8:c0c:121::2]:8333 +[2a01:4f8:c0c:122::2]:8333 +[2a01:4f8:c0c:15a8::2]:8333 +[2a01:4f8:c0c:1da4::2]:8333 +[2a01:4f8:c0c:1ff7::2]:8333 +[2a01:4f8:c0c:2262::2]:8333 +[2a01:4f8:c0c:73d::2]:8333 +[2a01:4f8:c0c:790::2]:8333 +[2a01:4f8:c0c:7a8::2]:8333 +[2a01:4f8:c0c:7a9::2]:8333 +[2a01:4f8:c0c:7e9::2]:8333 +[2a01:4f8:c0c:816::2]:8333 +[2a01:4f8:c0c:817::2]:8333 +[2a01:4f8:c0c:818::2]:8333 +[2a01:4f8:c0c:820::2]:8333 +[2a01:4f8:c0c:821::2]:8333 +[2a01:4f8:c0c:822::2]:8333 +[2a01:4f8:c0c:896::2]:8333 +[2a01:4f8:c0c:8c6::2]:8333 +[2a01:4f8:c0c:8c9::2]:8333 +[2a01:4f8:c0c:8d1::2]:8333 +[2a01:4f8:c0c:8d2::2]:8333 +[2a01:4f8:c0c:8d9::2]:8333 +[2a01:4f8:c0c:8da::2]:8333 +[2a01:4f8:c0c:8dc::2]:8333 +[2a01:4f8:c0c:8f1::2]:8333 +[2a01:4f8:c0c:91e::2]:8333 +[2a01:4f8:c0c:927::2]:8333 +[2a01:4f8:c0c:939::2]:8333 +[2a01:4f8:c0c:944::2]:8333 +[2a01:4f8:c0c:951::2]:8333 +[2a01:4f8:c0c:967::2]:8333 +[2a01:4f8:c0c:96f::2]:8333 +[2a01:4f8:c0c:97d::2]:8333 +[2a01:4f8:c0c:982::2]:8333 +[2a01:4f8:c0c:9fc::2]:8333 +[2a01:4f8:c0c:b35::2]:8333 +[2a01:4f8:c0c:b4c::2]:8333 +[2a01:4f8:c0c:bfe::2]:8333 +[2a01:4f8:c0c:c08::2]:8333 +[2a01:4f8:c0c:c13::2]:8333 +[2a01:4f8:c0c:c14::2]:8333 +[2a01:4f8:c0c:c16::2]:8333 +[2a01:4f8:c0c:c19::2]:8333 +[2a01:4f8:c0c:c32::2]:8333 +[2a01:4f8:c0c:c36::2]:8333 +[2a01:4f8:c0c:c39::2]:8333 +[2a01:4f8:c0c:c58::2]:8333 +[2a01:4f8:c0c:c5e::2]:8333 +[2a01:4f8:c0c:c70::2]:8333 +[2a01:4f8:c0c:c72::2]:8333 +[2a01:4f8:c0c:c79::2]:8333 +[2a01:4f8:c0c:cb1::2]:8333 +[2a01:4f8:c0c:cf5::2]:8333 +[2a01:4f8:c0c:cff::2]:8333 +[2a01:4f8:c0c:d0e::2]:8333 +[2a01:4f8:c0c:d1b::2]:8333 +[2a01:4f8:c0c:d67::2]:8333 +[2a01:4f8:c0c:d68::2]:8333 +[2a01:4f8:c0c:d81::2]:8333 +[2a01:4f8:c0c:e2d::2]:8333 +[2a01:4f8:c0c:e30::2]:8333 +[2a01:4f8:c0c:e4f::2]:8333 +[2a01:4f8:c0c:e5b::2]:8333 +[2a01:4f8:c0c:e88::2]:8333 +[2a01:4f8:c0c:f69::2]:8333 +[2a01:4f8:c0c:f76::2]:8333 +[2a01:4f8:c0c:f77::2]:8333 +[2a01:4f8:c0c:f78::2]:8333 +[2a01:4f8:c0c:f89::2]:8333 +[2a01:4f8:c0c:f8a::2]:8333 +[2a01:4f8:c0c:fd6::2]:8333 +[2a01:4f8:c0c:fea::2]:8333 +[2a01:4f8:c17:24ee::2]:8333 +[2a01:4f8:c17:2c16::2]:8333 +[2a01:4f8:c17:330f::2]:8333 +[2a01:4f8:c17:34f0::2]:8333 +[2a01:4f8:c17:3986::2]:8333 [2a01:4f8:c17:3b02::2]:8333 -[2a01:4f8:c17:4245::2]:8333 -[2a01:4f8:c17:464f::2]:8333 -[2a01:4f8:c17:4a1c::2]:8333 -[2a01:4f8:c17:4c5d::2]:8333 +[2a01:4f8:c17:3d85::2]:8333 +[2a01:4f8:c17:4271::2]:8333 +[2a01:4f8:c17:5dc0::2]:8333 +[2a01:4f8:c17:63a0::2]:8333 [2a01:4f8:c17:67f8::2]:8333 -[2a01:4f8:c17:6dd0::2]:8333 [2a01:4f8:c17:710b::2]:8333 -[2a01:4f8:c17:714::2]:8333 -[2a01:4f8:c17:72c6::2]:8333 -[2a01:608:ffff:a009:8bf5:879d:e51a:f837]:8333 +[2a01:4f8:c17:e00::2]:8333 [2a01:680:10:10::1]:8333 [2a01:6f0:ffff:120::8dcb]:8333 -[2a01:79c:cebc:857c:98c1:88ff:fef5:90de]:8333 -[2a01:79d:7377:2629:7e57:7e57:1:1]:8333 -[2a01:7c8:aaac:43d:5054:ff:fe4e:3dd4]:8333 +[2a01:79d:b7dd:ffb4:5d86:70b8:fc7f:f253]:8333 +[2a01:7a0:2:1374::4]:8333 +[2a01:7a0:2:1374::5]:8333 +[2a01:7a0:2:137c::3]:8333 +[2a01:7c8:aaaa:373:5054:ff:feb3:2947]:8333 +[2a01:7c8:aaaa:3a0:5054:ff:fe8c:974c]:8333 +[2a01:7c8:aab0:4b7:910d:625e:a13e:c342]:8333 [2a01:7c8:aab5:3e6:5054:ff:fed7:4e54]:8333 +[2a01:7c8:aab5:41e:5054:ff:fe38:f4fb]:8333 +[2a01:7c8:aaba:343::8333]:8333 +[2a01:7c8:aabc:18c:5054:ff:fefd:3b49]:8333 [2a01:7c8:aabd:3d5:5054:ff:fe95:f586]:8333 -[2a01:7c8:aac1:453:d0d2:af96:fa88:5d0e]:8333 -[2a01:7c8:aac3:663:5054:ff:fe25:8c69]:8333 -[2a01:7c8:aac3:97:5054:ff:fea7:3780]:8333 -[2a01:7c8:aac4:567:5054:ff:fedc:518a]:8333 -[2a01:7e00::f03c:91ff:fe26:8c87]:8333 [2a01:7e00::f03c:91ff:fe50:94b8]:8333 -[2a01:7e00::f03c:91ff:fe55:2c]:8333 -[2a01:7e00::f03c:91ff:fe89:1143]:8333 -[2a01:7e00::f03c:91ff:fe89:53fd]:8333 -[2a01:7e00::f03c:91ff:fedf:b70f]:8333 -[2a01:b000::4166:515b:ef9e:b3]:8333 +[2a01:8e01:b943:3a63:d250:99ff:fe1f:4fb2]:8333 [2a01:b2e0:2::40]:8333 -[2a01:e34:ec29:24c0:f3:ddaf:9f59:586f]:8333 +[2a01:d0:0:1c::245]:8333 +[2a01:d0:8fc3::2]:8333 +[2a01:e34:ec29:e8d0:25c7:c1ce:b7a3:d238]:8333 +[2a01:e34:ec4a:c2d0:1cf3:40d2:a79f:3901]:8333 [2a01:e34:eed7:6670:ec1b:bf7c:b012:6069]:8333 +[2a01:e35:2433:e320:9c8e:6ff0:990f:f06e]:8333 [2a01:e35:2ee5:610:21f:d0ff:fe4e:7460]:8333 -[2a01:e35:8a3f:47c0:c617:feff:fe3c:9fbd]:8333 -[2a01:e35:8bff:70b0:1e1b:dff:fe0b:236d]:8333 -[2a02:1205:34c3:a4e0:d63d:7eff:fe98:10c8]:8333 -[2a02:1205:34da:aa00:5882:249d:ddbf:bc43]:8333 [2a02:1205:5051:a640:d6ae:52ff:fea3:ac]:8333 -[2a02:1205:c689:d980:baae:edff:feea:9445]:8333 [2a02:120b:2c2a:5ec0:10dd:31ff:fe42:5079]:8333 -[2a02:120b:2c35:69d0:219:99ff:fe6b:4ec3]:8333 -[2a02:120b:c3c2:ff60:21f:5bff:fec3:a7ad]:24312 -[2a02:13b8:4000:1000:216:e6ff:fe92:8619]:8333 -[2a02:13b8:4000:1000::27]:8333 -[2a02:17d0:2a:4400:40f:3dd4:b053:47ad]:8333 -[2a02:180:1:1::517:afb]:8333 +[2a02:168:6273::614]:8333 [2a02:180:6:1::18]:8333 -[2a02:1810:1d11:f900:6872:f28e:8126:f635]:8333 -[2a02:27a8:0:1:52e5:49ff:fee3:3b49]:8333 -[2a02:348:86:3011::1]:8333 +[2a02:180:6:1::ed]:8333 +[2a02:1811:b707:116:8c1f:c5be:bf3a:54df]:8333 +[2a02:20c8:1422:1::a3]:8333 +[2a02:2168:d05:2c00:216:3eff:fef7:a099]:8333 +[2a02:27f8:2012:0:e9f7:268f:c441:6129]:8333 +[2a02:2808:5401:0:225:90ff:fe4e:ee42]:8333 [2a02:390:9000:0:218:7dff:fe10:be33]:8333 -[2a02:582:78c1:7600:2d49:6212:29d3:abb]:8333 -[2a02:6080::1:190b:69e3]:8333 -[2a02:750:7:3305::575]:8333 -[2a02:752:100:3::53]:8333 -[2a02:7aa0:1201::7501:d950]:8333 -[2a02:7aa0:1201::deb3:81a2]:8333 -[2a02:7aa0:1619::a037:69a6]:8333 -[2a02:810d:14c0:8694:d250:99ff:fe81:23d9]:8333 -[2a02:a50::dacb:8aff:fe36:8d2d]:8333 -[2a02:c200:0:10:3:0:2591:1]:8333 -[2a02:c200:1:10:2:5:9982:1]:8333 -[2a02:c200:1:10:3:0:9290:1]:8333 -[2a02:c205:3000:7158::1]:8333 -[2a02:c205:3001:4522::1]:8333 -[2a02:c205:3001:6549::1]:8333 -[2a02:c207:2008:3772::1]:8333 -[2a02:c207:2008:6519::1]:8333 +[2a02:7aa0:1201::bd4e:1219]:8333 +[2a02:7aa0:1619::590:eba2]:8333 +[2a02:7aa0:1619::a7a2:7e86]:8333 +[2a02:c200:1:10:2:5:800:1]:8333 +[2a02:c205:2002:2550::17]:8333 +[2a02:c205:2008:272::1]:8333 +[2a02:c205:2010:5484::1]:8333 +[2a02:c205:3001:6710::1]:8333 +[2a02:c205:3001:7714::2]:8333 +[2a02:c205:3002:888::1]:8333 +[2a02:c207:2002:9013::1]:8333 +[2a02:c207:2008:3392::1]:8333 +[2a02:c207:2008:8337::1]:8333 [2a02:c207:2009:213::1]:8333 -[2a02:c207:2009:7858::1]:8333 -[2a02:c207:2010:302::1]:8333 +[2a02:c207:2010:7751::1]:8333 +[2a02:c207:2010:7986::1]:8333 +[2a02:c207:2011:7829::1]:8333 +[2a02:c207:2011:8299::1]:8333 +[2a02:c207:2012:2133::1]:8333 +[2a02:c207:2012:263::1]:8333 +[2a02:c207:2012:2682::1]:8333 +[2a02:c207:2012:3635::1]:8333 +[2a02:c207:2012:4826::1]:8333 +[2a02:c207:2012:5668::1]:8333 [2a02:c207:3001:5824::1]:8333 +[2a02:c207:3001:7776::1]:8333 +[2a02:c207:3002:621::1]:8333 [2a02:ce80:0:20::1]:8333 +[2a03:2260:11e:301::8]:8333 +[2a03:2260:11e:302::3]:8333 [2a03:4000:2:496::8]:8333 +[2a03:4000:6:12e7::1]:8333 [2a03:4000:6:416c::53]:8333 -[2a03:4000:6:8009::1]:8333 -[2a03:4000:9:8e::1]:8333 -[2a03:7380:2140:17:51fe:3519:b571:4a13]:8333 -[2a03:b0c0:0:1010::7a3:1001]:8333 -[2a03:b0c0:0:1010::7aa:4001]:8333 +[2a03:b0c0:3:d0::1219:6001]:8333 [2a03:b0c0:3:d0::1b99:c001]:8333 [2a03:b0c0:3:d0::1b99:e001]:8333 [2a03:b0c0:3:d0::1b9a:3001]:8333 -[2a03:b0c0:3:d0::2208:6001]:8333 [2a03:b0c0:3:d0::23f7:1001]:8333 +[2a03:b0c0:3:d0::23f7:2001]:8333 +[2a03:b0c0:3:d0::23f7:4001]:8333 +[2a03:b0c0:3:d0::23f7:5001]:8333 +[2a03:b0c0:3:d0::23f7:7001]:8333 [2a03:b0c0:3:d0::23f7:9001]:8333 +[2a03:b0c0:3:d0::23fb:1001]:8333 [2a03:b0c0:3:d0::23fb:2001]:8333 [2a03:b0c0:3:d0::23fb:3001]:8333 [2a03:b0c0:3:d0::23fb:5001]:8333 -[2a03:b0c0:3:d0::23fb:7001]:8333 +[2a03:b0c0:3:d0::23fb:6001]:8333 +[2a03:b0c0:3:d0::23fb:8001]:8333 +[2a03:b0c0:3:d0::23ff:b001]:8333 [2a03:b0c0:3:d0::2400:1]:8333 [2a03:b0c0:3:d0::2400:3001]:8333 +[2a03:b0c0:3:d0::2400:4001]:8333 [2a03:b0c0:3:d0::2400:e001]:8333 +[2a03:b0c0:3:d0::2400:f001]:8333 [2a03:b0c0:3:d0::2401:e001]:8333 +[2a03:b0c0:3:d0::2402:1]:8333 [2a03:b0c0:3:d0::2402:2001]:8333 [2a03:b0c0:3:d0::2402:8001]:8333 [2a03:b0c0:3:d0::2402:9001]:8333 [2a03:b0c0:3:d0::2402:b001]:8333 [2a03:b0c0:3:d0::2402:d001]:8333 +[2a03:b0c0:3:d0::2402:e001]:8333 [2a03:b0c0:3:d0::2403:1001]:8333 [2a03:b0c0:3:d0::2403:2001]:8333 +[2a03:b0c0:3:d0::2403:3001]:8333 [2a03:b0c0:3:d0::2403:4001]:8333 [2a03:b0c0:3:d0::2403:6001]:8333 [2a03:b0c0:3:d0::2403:a001]:8333 [2a03:b0c0:3:d0::2403:b001]:8333 +[2a03:b0c0:3:d0::2403:e001]:8333 [2a03:b0c0:3:d0::2403:f001]:8333 +[2a03:b0c0:3:d0::2404:1]:8333 +[2a03:b0c0:3:d0::2404:3001]:8333 +[2a03:b0c0:3:d0::2404:4001]:8333 [2a03:b0c0:3:d0::2404:6001]:8333 +[2a03:b0c0:3:d0::2404:8001]:8333 +[2a03:b0c0:3:d0::2404:9001]:8333 [2a03:b0c0:3:d0::2404:b001]:8333 -[2a03:f80:ed15:149:154:155:235:1]:8333 -[2a04:1980:3100:1aac:e61d:2dff:fe29:f241]:8333 -[2a04:1980:3100:1aac:e61d:2dff:fe29:f251]:8333 -[2a04:2180:0:1::5a49:3c06]:8333 -[2a04:2180:1:7::3]:8333 -[2a04:2e00:5:2e:9a4b:e1ff:fe62:6dc0]:8333 +[2a03:b0c0:3:d0::2405:2001]:8333 +[2a03:b0c0:3:d0::2405:3001]:8333 +[2a03:b0c0:3:d0::2405:8001]:8333 +[2a03:b0c0:3:d0::2405:9001]:8333 +[2a03:b0c0:3:d0::2405:a001]:8333 +[2a03:b0c0:3:d0::44b8:9001]:8333 +[2a03:b0c0:3:d0::44b8:e001]:8333 +[2a03:b0c0:3:d0::44b8:f001]:8333 +[2a03:b0c0:3:d0::44b9:1]:8333 +[2a03:b0c0:3:d0::44b9:1001]:8333 +[2a03:b0c0:3:d0::44b9:2001]:8333 +[2a03:b0c0:3:d0::44b9:4001]:8333 +[2a04:2180:0:2::94]:8333 [2a04:3542:1000:910:8492:b8ff:fe91:711d]:8333 -[2a04:dbc3:fffe:0:e61f:13ff:fe95:8401]:8333 +[2a04:52c0:101:122::ba8e]:8333 +[2a05:3580:d400:140d:da6e:826e:e771:4100]:8333 [2a06:9fc0:2a06:9fc0:2a06:9fc1:67c:e706]:8333 -[2c0f:f738:2004:82::]:8333 -2hryb3uh3tzwgnya.onion:8333 -3nmbbakinewlgdln.onion:8333 -3qeri3tmhzmpegyv.onion:8333 -4wdknmecghcmclq5.onion:8333 -53tsjt6zq3iasv5q.onion:8333 -5cg7qeywvwo6vxpt.onion:8333 -5gbcrgqxcbxj253s.onion:8333 -6cn4ilbwkrkh7gwo.onion:8333 -6e4jrnn7igeqxmlf.onion:8333 -6ymgbvnn6d5nfmv4.onion:8333 -6zsh3bfduhpo7ldl.onion:8333 -72fq6phv4fg4rhvh.onion:8333 -7gdqp6npusk4lfwk.onion:8333 -a7emxol55e623lqc.onion:8333 -assbiydziq77zaki.onion:8333 +226eupdnaouu4h2v.onion:8333 +2frgxpe5mheghyom.onion:8333 +3ihjnsvwc3x6dp2o.onion:8333 +3w77hrilg6q64opl.onion:8333 +4ls4o6iszcd7mkfw.onion:8333 +4p3abjxqppzxi7qi.onion:8333 +546esc6botbjfbxb.onion:8333 +5msftytzlsskr4ut.onion:8333 +5ty6rxpgrkmdnk4a.onion:8333 +akmqyuidrf56ip26.onion:8333 +alhlegtjkdmbqsvt.onion:8333 bafk5ioatlgt7dgl.onion:8333 -bk7yp6epnmcllq72.onion:8333 -brwqezn6le54w2bb.onion:8333 -bs4bq6s6qkvt5hpi.onion:8333 bup5n5e3kurvjzf3.onion:8333 -c2tpqkaz4ihjzwgb.onion:8333 -cernrmrk5zomzozn.onion:8333 -cfyegj64ht3jpodr.onion:8333 -cg5vg54cazzpvoug.onion:8333 -cgk4u2lxrvml4jvb.onion:8333 cjygd7pu5lqkky5j.onion:8333 -d6wubsdtr46dd5ki.onion:8333 -dfq6yjc3aelplwr4.onion:8333 +cyvpgt25274i5b7c.onion:8333 +dekj4wacywpqsad3.onion:8333 dqpxwlpnv3z3hznl.onion:8333 -eamfospuveabaimd.onion:8333 -ep2mjzox3kvb6ax4.onion:8333 -fpbxb4wjudiw2w5a.onion:8333 -fu5hfsbbf5jwsvhv.onion:8333 -g4freoibsczujle3.onion:8333 +drarzpycbtxwbcld.onion:8333 +drp4pvejybx2ejdr.onion:8333 +dxkmtmwiq7ddtgul.onion:8333 +e6j57zkyibu2smad.onion:8333 +ejcqevujcqltqn7d.onion:8333 +eqgbt2ghfvsshbvo.onion:8333 +fgizgkdnndilo6ka.onion:8333 +fqxup4oev33eeidg.onion:8333 gb5ypqt63du3wfhn.onion:8333 ggdy2pb2avlbtjwq.onion:8333 -gh2aiddzxmvyrnue.onion:8333 -gnxgylbgzvaazkq7.onion:8333 -hnizdxnejel64ubk.onion:8333 -htvdcmlc3abji2ab.onion:8443 -hwuboois4gslupgx.onion:8333 -hxz6gowludlj6d5a.onion:8333 -j6umo4bnsztpsonc.onion:8333 -jdunmaocwbbnw565.onion:8333 -ktv3qlxl7xvmdlf4.onion:8333 +hahhloezyfqh3hci.onion:8333 +ihdv6bzz2gx72fs7.onion:8333 +in7r5ieo7ogkxbne.onion:8333 kvd44sw7skb5folw.onion:8333 -kwimnzm6vd4zakvl.onion:8333 -la5xhk3lprxzxmz2.onion:8333 -lc7cx67end26uutp.onion:8352 -mwu5og2agcspmgkx.onion:8333 -mzxkipiyekaoh7my.onion:8333 -n6rwlrtwpqc7qwo7.onion:8333 -nj36424yccqph62z.onion:8333 -o256w7t3vcgktmxk.onion:8333 +mn744hbioayn3ojs.onion:8333 +ms4ntrrisfxzpvmy.onion:8333 +n5lqwpjabqg62ihx.onion:8333 o4sl5na6jeqgi3l6.onion:8333 -okdzjarwekbshnof.onion:8333 -oyebydl2pacx6v26.onion:8333 -p5mx2imj75dpmime.onion:8333 +omjv24nbck4k5ud6.onion:8333 +po3j2hfkmf7sh36o.onion:8333 psco6bxjewljrczx.onion:8333 -pxtgswet6tlgrbwj.onion:8333 -rb4v3fhgx2zr4rre.onion:8333 +qi5yr6lvlckzffor.onion:8333 +qlv6py6hdtzipntn.onion:8333 +qynmpgdbp23xyfnj.onion:8333 +rhtawcs7xak4gi3t.onion:8333 +rjacws757ai66lre.onion:8333 rjlnp3hwvrsmap6e.onion:8333 +rkdvqcrtfv6yt4oy.onion:8333 rlafimkctvz63llg.onion:8333 -rxjvy5eyttep5tts.onion:8333 +rlj4ppok4dnsdu5n.onion:8333 seoskudzk6vn6mqz.onion:8333 -tpgdufxxsw3jkrdf.onion:8333 -tuiyvqgi3o675pjb.onion:8333 +tayqi57tfiy7x3vk.onion:8333 +tchop676j6yppwwm.onion:8333 +trrtyp3sirmwttyu.onion:8333 tx4zd7d5exonnblh.onion:8333 -uokg6avfgbhofls3.onion:8333 -v3gjphgqy5hygcml.onion:8333 -vhdoxqq63xr53ol7.onion:8333 +u4ecb7txxi6l3gix.onion:8333 +umcxcmfycvejw264.onion:8333 +v7xqd42ocemalurd.onion:8333 +vb267mt3lnwfdmdb.onion:8333 +vev3n5fxfrtqj6e5.onion:8333 visevrizz3quyagj.onion:8333 -vqpye2k5rcqvj5mq.onion:8333 -wfsx2gi7djhy22hk.onion:8333 -wg6vwmbrzyyzapun.onion:8333 -xub4w3w4wwk56xiq.onion:8333 +vpg6p5e5ln33dqtp.onion:8333 +vr2ruasinafoy3fl.onion:8333 +x6pthvd5x6abyfo7.onion:8333 +xbwbzrspvav7u5ie.onion:8333 +xfcevnql2chnawko.onion:8333 ycivnom44dmxx4ob.onion:8333 -ywskufc62bf2fum4.onion:8333 -z4fax2vxg23t2ddf.onion:8333 -zo5dklwelmdrpo5n.onion:8333 +yzdvlv5daitafekn.onion:8333 diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py index ac0701e6be..86366eb8e3 100755 --- a/contrib/testgen/gen_base58_test_vectors.py +++ b/contrib/testgen/gen_base58_test_vectors.py @@ -13,7 +13,7 @@ Usage: # Released under MIT License import os from itertools import islice -from base58 import b58encode, b58decode, b58encode_chk, b58decode_chk, b58chars +from base58 import b58encode_chk, b58decode_chk, b58chars import random from binascii import b2a_hex diff --git a/contrib/verify-commits/allow-revsig-commits b/contrib/verify-commits/allow-revsig-commits index e69de29bb2..f0088cdca4 100644 --- a/contrib/verify-commits/allow-revsig-commits +++ b/contrib/verify-commits/allow-revsig-commits @@ -0,0 +1,104 @@ +a06ede9a138d0fb86b0de17c42b936d9fe6e2158 +923dc447eaa8e017985b2afbbb12dd1283fbea0e +71148b8947fe8b4d756822420a7f31c380159425 +6696b4635ceb9b47aaa63244bff9032fa7b08354 +812714fd80e96e28cd288c553c83838cecbfc2d9 +8a445c5651edb9a1f51497055b7ddf4402be9188 +e126d0c12ca66278d9e7b12187c5ff4fc02a7e6c +3908fc4728059719bed0e1c7b1c8b388c2d4a8da +8b66bf74e2a349e71eaa183af81fa63eaee76ad2 +05950427d310654774031764a7141a1a4fd9c6e4 +07fd147b9f12e9205afd66a624edce357977d615 +12e31127948fa4bb01c3bddc1b8c85b432f7465b +8c87f175d335e9d9e93f987d871ae9f05f6a10a7 +46b249e578e8a3dfbe85bc7253a12e82ef4b658b +a55716abe5662ec74c2f8af93023f1e7cca901fc +f646275b90b1de93bc62b4c4d045d75ac0b96eee +c252685aa5867631e9a5ef07ccae7c7c25cae8ff +a7d55c93385359952d85decd5037843ac70ba3d4 +7dac1e5e9e887f5f6ff146e812a05bd3bf281eae +2a524b8e8fe69ef487fd8ea1b4f7a03f473ed201 +ce5c1f4acae43477989cdf9a82ed33703919cda2 +2db4cbcc437f51f5dac82cc4de46f383b92e6f11 +7aa700424cbda387536373d8dfec88aee43f950e +b99a093afed880f23fb279c443cc6ae5e379cc43 +b83264d9c7a8ddb79f64bd9540caddc8632ef31f +57e337d40e94ba33d8cd265c134d6ef857b32b59 +a1dcf2e1087beaf3981739fd2bb74f35ecad630a +d38b0d7a6b6056cba26999b702815775e2437d87 +815640ec6af9a38d6a2da4a4400056e2f4105080 +09c4fd157c5b88df2d97fad4826c79b094db90c9 +2efcfa5acfacb958973d9e8125e1d81f102e2dfd +dc6dee41f7cf2ba93fcd0fea7c157e4b2775d439 +ad826b3df9f763b49f1e3e3d50c4efdd438c7547 +c1a52276848d8caa9a9789dff176408c1aa6b1ed +3bf06e9bac57b5b5a746677b75e297a7b154bdbd +72ae6f8cf0224370e8121d6769b21e612ca15d6f +a143b88dbd4971ecfdd1d39a494489c8f2db0344 +76fec09d878d6dbf214bdb6228d480bd9195db4c +93566e0c37c5ae104095474fea89f00dcb40f551 +407d9232ef5cb1ebf6cff21f3d13e07ea4158eeb +9346f8429957e356d21c665bab59fe45bcf1f74e +6eeac6e30d65f9a972067c1ea8c49978c8e631ac +dc6b9406bdfab2af8c86cb080cb3e6cf8f2385d8 +9f554e03ebe5701c1b75ff03b3d6152095c0cad3 +05009935f9ac070197113954d680bc2c9150b9b3 +508404de98a8a5435f52916cef8f328e82651961 +ed0cc50afed146c27f6d8129c683c225fb940093 +6429cfa8a70308241c576aeb92ffe3db5203b2ef +6898213409811b140843c3d89af43328c3b22fad +5b2ea29cf4fd298346437bb16a54407f8c1f9dca +e2a1a1ee895149c544d4ae295466611f0cec3094 +e82fb872ff5cc8fd22d43327c1ee3e755f61c562 +19b0f33de0efd9da788e8e4f3fdc2a9e159abdb1 +89de1538ce1f8c00f80e8d11f43e1b77e24d7dea +de07fdcf77e97b8613091285e4d0a734f5de7492 +01680195f8aa586c55c44767397380def3a23b54 +05e1c85fb687c82ae477c72d4a7e2d6b0c692167 +c072b8fd95cd4fa84f08189a0cd8b173ea2dbb8e +9a0ed08b40b15ae2b791aa8549b53e69934b4ea7 +53f8f226bd1d627c4a6dec5862a1d4ea5a933e45 +9d0f43b7ca7241d8a018fd35dd3bc01555235ec6 +f12d2b5a8ac397e4bcaefcc19898f8ff5705dea5 +8250de13587ed05ca45df3e12c5dc9bcb1500e2c +d727f77e390426e9e463336bda08d50c451c7086 +484312bda2d43e3ea60047be076332299463adf8 +c7e05b35ab0a791c7a8e2d863e716fdec6f3f671 +b9c1cd81848da9de1baf9c2f29c19c50e549de13 +8ea7d31e384975019733b5778feabbd9955c79d8 +f798b891bcecea9548eedacae70eeb9906c1ddbf +ebefe7a00b46579cdd1e033a8c7fd8ce9aa578e4 +ad087638ee4864d6244ec9381ff764bfa6ee5086 +66db2d62d59817320c9182fc18e75a93b76828ea +7ce9ac5c83b1844a518ef2e12e87aae3cacdfe58 +4286f43025149cf44207c3ad98e4a1f068520ada +cd0c5135ab2291aaa5410ac919bad3fc87249a4a +66ed450d771a8fc01c159a8402648ebd1c35eb4c +a82f03393a32842d49236e8666ee57805ca701f8 +f972b04d63eb8af79ff3cec1dc561ed13dfa6053 +ec45cc5e27668171b55271b0c735194c70e7da41 +715e9fd7454f7a48d7adba7d42f662c20a3e3367 +2e0a99037dcc35bc63ba0d54371bc678af737c8e +7fa8d758598407f3bf0beb0118dc122ea5340736 +6a22373771edbc3c7513cacb9355f880c73c2cbf +b89ef131147f71a96152a7b5c4374266cdf539b2 +01d8359983e2f77b5118fede3ffa947072c666c8 +58f0c929a3d70a4bff79cc200f1c186f71ef1675 +950be19727a581970591d8f8138dfe4725750382 +425278d17bd0edf8a3a7cc81e55016f7fd8e7726 +c028c7b7557da2baff7af8840108e8be4db8e0c6 +47a7cfb0aa2498f6801026d258a59f9de48f60b0 +f6b7df3155ddb4cedfbcf5d3eb3383d4614b3a85 +d72098038f3b55a714ed8adb34fab547b15eb0d5 +c49c825bd9f4764536b45df5a684d97173673fc7 +33799afe83eec4200ff140e9bf5eae83701a4d7f +5c3f8ddcaa1164079105c452429fccf8127b01b6 +1f01443567b03ac75a91c810f1733f5c21b5699d +b3e42b6d02e8d19658a9135e427ebceab5367779 +69b3a6dd9d9a0adf5506c8b9fde42187356bd4a8 +bafd075c5e6a1088ef0f1aa0b0b224e026a3d3e0 +7daa3adb242d9c8728fdb15c6af6596aaad5502f +514993554c370f4cf30a109ac28d5d64893dbf0a +c8d2473e6cb042e7275a10c49d3f6a4a91bf0166 +386f4385ab04b0b2c3d47bddc0dc0f2de7354964 +9f33dba05c01ecc5c56eb1284ab7d64d42f55171 diff --git a/contrib/verify-commits/gpg.sh b/contrib/verify-commits/gpg.sh index 09ff237544..abd8f5fd9f 100755 --- a/contrib/verify-commits/gpg.sh +++ b/contrib/verify-commits/gpg.sh @@ -8,21 +8,48 @@ VALID=false REVSIG=false IFS=' ' -for LINE in $(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null); do +if [ "$BITCOIN_VERIFY_COMMITS_ALLOW_SHA1" = 1 ]; then + GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)" +else + # Note how we've disabled SHA1 with the --weak-digest option, disabling + # signatures - including selfsigs - that use SHA1. While you might think that + # collision attacks shouldn't be an issue as they'd be an attack on yourself, + # in fact because what's being signed is a commit object that's + # semi-deterministically generated by untrusted input (the pull-req) in theory + # an attacker could construct a pull-req that results in a commit object that + # they've created a collision for. Not the most likely attack, but preventing + # it is pretty easy so we do so as a "belt-and-suspenders" measure. + GPG_RES="" + for LINE in "$(gpg --version)"; do + case "$LINE" in + "gpg (GnuPG) 1.4.1"*|"gpg (GnuPG) 2.0."*) + echo "Please upgrade to at least gpg 2.1.10 to check for weak signatures" > /dev/stderr + GPG_RES="$(echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null)" + ;; + # We assume if you're running 2.1+, you're probably running 2.1.10+ + # gpg will fail otherwise + # We assume if you're running 1.X, it is either 1.4.1X or 1.4.20+ + # gpg will fail otherwise + esac + done + [ "$GPG_RES" = "" ] && GPG_RES="$(echo "$INPUT" | gpg --trust-model always --weak-digest sha1 "$@" 2>/dev/null)" +fi +for LINE in $(echo "$GPG_RES"); do case "$LINE" in "[GNUPG:] VALIDSIG "*) while read KEY; do - case "$LINE" in "[GNUPG:] VALIDSIG $KEY "*) VALID=true;; esac + [ "${LINE#?GNUPG:? VALIDSIG * * * * * * * * * }" = "$KEY" ] && VALID=true done < ./contrib/verify-commits/trusted-keys ;; "[GNUPG:] REVKEYSIG "*) [ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1 - while read KEY; do - case "$LINE" in "[GNUPG:] REVKEYSIG ${KEY#????????????????????????} "*) - REVSIG=true - GOODREVSIG="[GNUPG:] GOODSIG ${KEY#????????????????????????} " - esac - done < ./contrib/verify-commits/trusted-keys + REVSIG=true + GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}" + ;; + "[GNUPG:] EXPKEYSIG "*) + [ "$BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG" != 1 ] && exit 1 + REVSIG=true + GOODREVSIG="[GNUPG:] GOODSIG ${LINE#* * *}" ;; esac done @@ -30,7 +57,7 @@ if ! $VALID; then exit 1 fi if $VALID && $REVSIG; then - echo "$INPUT" | gpg --trust-model always "$@" | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" 2>/dev/null + echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null | grep "\[GNUPG:\] \(NEWSIG\|SIG_ID\|VALIDSIG\)" echo "$GOODREVSIG" else echo "$INPUT" | gpg --trust-model always "$@" 2>/dev/null diff --git a/contrib/verify-commits/trusted-keys b/contrib/verify-commits/trusted-keys index 75242c2a97..5610692616 100644 --- a/contrib/verify-commits/trusted-keys +++ b/contrib/verify-commits/trusted-keys @@ -1,4 +1,4 @@ 71A3B16735405025D447E8F274810B012346C9A6 -3F1888C6DCA92A6499C4911FDBA1A67379A1A931 +133EAC179436F14A5CF1B794860FEB804E669320 32EE5C4C3FA15CCADB46ABE529D4BCB6416F53EC -FE09B823E6D83A3BC7983EAA2D7F2372E50FE137 +B8B3F1C0E58C15DB6A81D30C3648A882F4316B9B diff --git a/contrib/verify-commits/trusted-sha512-root-commit b/contrib/verify-commits/trusted-sha512-root-commit new file mode 100644 index 0000000000..7d41f90ad7 --- /dev/null +++ b/contrib/verify-commits/trusted-sha512-root-commit @@ -0,0 +1 @@ +309bf16257b2395ce502017be627186b749ee749 diff --git a/contrib/verify-commits/verify-commits.sh b/contrib/verify-commits/verify-commits.sh index b2cebdf1a0..74b7f38375 100755 --- a/contrib/verify-commits/verify-commits.sh +++ b/contrib/verify-commits/verify-commits.sh @@ -3,61 +3,130 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -# Not technically POSIX-compliant due to use of "local", but almost every -# shell anyone uses today supports it, so its probably fine - DIR=$(dirname "$0") [ "/${DIR#/}" != "$DIR" ] && DIR=$(dirname "$(pwd)/$0") +echo "Using verify-commits data from ${DIR}" + VERIFIED_ROOT=$(cat "${DIR}/trusted-git-root") +VERIFIED_SHA512_ROOT=$(cat "${DIR}/trusted-sha512-root-commit") REVSIG_ALLOWED=$(cat "${DIR}/allow-revsig-commits") HAVE_FAILED=false -IS_SIGNED () { - if [ $1 = $VERIFIED_ROOT ]; then - return 0; + +HAVE_GNU_SHA512=1 +[ ! -x "$(which sha512sum)" ] && HAVE_GNU_SHA512=0 + +if [ x"$1" = "x" ]; then + CURRENT_COMMIT="HEAD" +else + CURRENT_COMMIT="$1" +fi + +if [ "${CURRENT_COMMIT#* }" != "$CURRENT_COMMIT" ]; then + echo "Commit must not contain spaces?" > /dev/stderr + exit 1 +fi + +VERIFY_TREE=0 +if [ x"$2" = "x--tree-checks" ]; then + VERIFY_TREE=1 +fi + +NO_SHA1=1 +PREV_COMMIT="" + +while true; do + if [ "$CURRENT_COMMIT" = $VERIFIED_ROOT ]; then + echo "There is a valid path from "$CURRENT_COMMIT" to $VERIFIED_ROOT where all commits are signed!" + exit 0; + fi + + if [ "$CURRENT_COMMIT" = $VERIFIED_SHA512_ROOT ]; then + if [ "$VERIFY_TREE" = "1" ]; then + echo "All Tree-SHA512s matched up to $VERIFIED_SHA512_ROOT" > /dev/stderr + fi + VERIFY_TREE=0 + NO_SHA1=0 fi - if [ "${REVSIG_ALLOWED#*$1}" != "$REVSIG_ALLOWED" ]; then + + if [ "$NO_SHA1" = "1" ]; then + export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=0 + else + export BITCOIN_VERIFY_COMMITS_ALLOW_SHA1=1 + fi + + if [ "${REVSIG_ALLOWED#*$CURRENT_COMMIT}" != "$REVSIG_ALLOWED" ]; then export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=1 else export BITCOIN_VERIFY_COMMITS_ALLOW_REVSIG=0 fi - if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit $1 > /dev/null 2>&1; then - return 1; - fi - local PARENTS - PARENTS=$(git show -s --format=format:%P $1) - for PARENT in $PARENTS; do - if IS_SIGNED $PARENT; then - return 0; + + if ! git -c "gpg.program=${DIR}/gpg.sh" verify-commit "$CURRENT_COMMIT" > /dev/null; then + if [ "$PREV_COMMIT" != "" ]; then + echo "No parent of $PREV_COMMIT was signed with a trusted key!" > /dev/stderr + echo "Parents are:" > /dev/stderr + PARENTS=$(git show -s --format=format:%P $PREV_COMMIT) + for PARENT in $PARENTS; do + git show -s $PARENT > /dev/stderr + done + else + echo "$CURRENT_COMMIT was not signed with a trusted key!" > /dev/stderr fi - break - done - if ! "$HAVE_FAILED"; then - echo "No parent of $1 was signed with a trusted key!" > /dev/stderr - echo "Parents are:" > /dev/stderr - for PARENT in $PARENTS; do - git show -s $PARENT > /dev/stderr - done - HAVE_FAILED=true + exit 1 fi - return 1; -} -if [ x"$1" = "x" ]; then - TEST_COMMIT="HEAD" -else - TEST_COMMIT="$1" -fi + # We always verify the top of the tree + if [ "$VERIFY_TREE" = 1 -o "$PREV_COMMIT" = "" ]; then + IFS_CACHE="$IFS" + IFS=' +' + for LINE in $(git ls-tree --full-tree -r "$CURRENT_COMMIT"); do + case "$LINE" in + "12"*) + echo "Repo contains symlinks" > /dev/stderr + IFS="$IFS_CACHE" + exit 1 + ;; + esac + done + IFS="$IFS_CACHE" + + FILE_HASHES="" + for FILE in $(git ls-tree --full-tree -r --name-only "$CURRENT_COMMIT" | LC_ALL=C sort); do + if [ "$HAVE_GNU_SHA512" = 1 ]; then + HASH=$(git cat-file blob "$CURRENT_COMMIT":"$FILE" | sha512sum | { read FIRST OTHER; echo $FIRST; } ) + else + HASH=$(git cat-file blob "$CURRENT_COMMIT":"$FILE" | shasum -a 512 | { read FIRST OTHER; echo $FIRST; } ) + fi + [ "$FILE_HASHES" != "" ] && FILE_HASHES="$FILE_HASHES"' +' + FILE_HASHES="$FILE_HASHES$HASH $FILE" + done + + if [ "$HAVE_GNU_SHA512" = 1 ]; then + TREE_HASH="$(echo "$FILE_HASHES" | sha512sum)" + else + TREE_HASH="$(echo "$FILE_HASHES" | shasum -a 512)" + fi + HASH_MATCHES=0 + MSG="$(git show -s --format=format:%B "$CURRENT_COMMIT" | tail -n1)" -IS_SIGNED "$TEST_COMMIT" -RES=$? -if [ "$RES" = 1 ]; then - if ! "$HAVE_FAILED"; then - echo "$TEST_COMMIT was not signed with a trusted key!" + case "$MSG -" in + "Tree-SHA512: $TREE_HASH") + HASH_MATCHES=1;; + esac + + if [ "$HASH_MATCHES" = "0" ]; then + echo "Tree-SHA512 did not match for commit $CURRENT_COMMIT" > /dev/stderr + exit 1 + fi fi -else - echo "There is a valid path from $TEST_COMMIT to $VERIFIED_ROOT where all commits are signed!" -fi -exit $RES + PARENTS=$(git show -s --format=format:%P "$CURRENT_COMMIT") + for PARENT in $PARENTS; do + PREV_COMMIT="$CURRENT_COMMIT" + CURRENT_COMMIT="$PARENT" + break + done +done diff --git a/contrib/verifybinaries/README.md b/contrib/verifybinaries/README.md index ed3e14fb6c..3ffe0a2f28 100644 --- a/contrib/verifybinaries/README.md +++ b/contrib/verifybinaries/README.md @@ -26,6 +26,14 @@ The script returns 0 if everything passes the checks. It returns 1 if either the ./verify.sh bitcoin-core-0.13.0-rc3 ``` +If you only want to download the binaries of certain platform, add the corresponding suffix, e.g.: + +```sh +./verify.sh bitcoin-core-0.11.2-osx +./verify.sh 0.12.0-linux +./verify.sh bitcoin-core-0.13.0-rc3-win64 +``` + If you do not want to keep the downloaded binaries, specify anything as the second parameter. ```sh diff --git a/contrib/verifybinaries/verify.sh b/contrib/verifybinaries/verify.sh index e20770c96a..409f517c9f 100755 --- a/contrib/verifybinaries/verify.sh +++ b/contrib/verifybinaries/verify.sh @@ -3,7 +3,8 @@ # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. -### This script attempts to download the signature file SHA256SUMS.asc from bitcoin.org +### This script attempts to download the signature file SHA256SUMS.asc from +### bitcoincore.org and bitcoin.org and compares them. ### It first checks if the signature passes, and then downloads the files specified in ### the file, and checks if the hashes of these files match those that are specified ### in the signature file. @@ -22,7 +23,9 @@ TMPFILE="hashes.tmp" SIGNATUREFILENAME="SHA256SUMS.asc" RCSUBDIR="test" -BASEDIR="https://bitcoin.org/bin/" +HOST1="https://bitcoincore.org" +HOST2="https://bitcoin.org" +BASEDIR="/bin/" VERSIONPREFIX="bitcoin-core-" RCVERSIONSTRING="rc" @@ -42,13 +45,36 @@ if [ -n "$1" ]; then VERSION="$VERSIONPREFIX$1" fi - #now let's see if the version string contains "rc", and strip it off if it does - # and simultaneously add RCSUBDIR to BASEDIR, where we will look for SIGNATUREFILENAME - if [[ $VERSION == *"$RCVERSIONSTRING"* ]]; then - BASEDIR="$BASEDIR${VERSION/%-$RCVERSIONSTRING*}/" - BASEDIR="$BASEDIR$RCSUBDIR.$RCVERSIONSTRING${VERSION: -1}/" + STRIPPEDLAST="${VERSION%-*}" + + #now let's see if the version string contains "rc" or a platform name (e.g. "osx") + if [[ "$STRIPPEDLAST-" == "$VERSIONPREFIX" ]]; then + BASEDIR="$BASEDIR$VERSION/" else + # let's examine the last part to see if it's rc and/or platform name + STRIPPEDNEXTTOLAST="${STRIPPEDLAST%-*}" + if [[ "$STRIPPEDNEXTTOLAST-" == "$VERSIONPREFIX" ]]; then + + LASTSUFFIX="${VERSION##*-}" + VERSION="$STRIPPEDLAST" + + if [[ $LASTSUFFIX == *"$RCVERSIONSTRING"* ]]; then + RCVERSION="$LASTSUFFIX" + else + PLATFORM="$LASTSUFFIX" + fi + + else + RCVERSION="${STRIPPEDLAST##*-}" + PLATFORM="${VERSION##*-}" + + VERSION="$STRIPPEDNEXTTOLAST" + fi + BASEDIR="$BASEDIR$VERSION/" + if [[ $RCVERSION == *"$RCVERSIONSTRING"* ]]; then + BASEDIR="$BASEDIR$RCSUBDIR.$RCVERSION/" + fi fi SIGNATUREFILE="$BASEDIR$SIGNATUREFILENAME" @@ -58,7 +84,7 @@ else fi #first we fetch the file containing the signature -WGETOUT=$(wget -N "$BASEDIR$SIGNATUREFILENAME" 2>&1) +WGETOUT=$(wget -N "$HOST1$BASEDIR$SIGNATUREFILENAME" 2>&1) #and then see if wget completed successfully if [ $? -ne 0 ]; then @@ -69,6 +95,22 @@ if [ $? -ne 0 ]; then exit 2 fi +WGETOUT=$(wget -N -O "$SIGNATUREFILENAME.2" "$HOST2$BASEDIR$SIGNATUREFILENAME" 2>&1) +if [ $? -ne 0 ]; then + echo "bitcoin.org failed to provide signature file, but bitcoincore.org did?" + echo "wget output:" + echo "$WGETOUT"|sed 's/^/\t/g' + clean_up $SIGNATUREFILENAME + exit 3 +fi + +SIGFILEDIFFS="$(diff $SIGNATUREFILENAME $SIGNATUREFILENAME.2)" +if [ "$SIGFILEDIFFS" != "" ]; then + echo "bitcoin.org and bitcoincore.org signature files were not equal?" + clean_up $SIGNATUREFILENAME $SIGNATUREFILENAME.2 + exit 4 +fi + #then we check it GPGOUT=$(gpg --yes --decrypt --output "$TMPFILE" "$SIGNATUREFILENAME" 2>&1) @@ -88,17 +130,27 @@ if [ $RET -ne 0 ]; then echo "gpg output:" echo "$GPGOUT"|sed 's/^/\t/g' - clean_up $SIGNATUREFILENAME $TMPFILE + clean_up $SIGNATUREFILENAME $SIGNATUREFILENAME.2 $TMPFILE exit "$RET" fi +if [ -n "$PLATFORM" ]; then + grep $PLATFORM $TMPFILE > "$TMPFILE-plat" + TMPFILESIZE=$(stat -c%s "$TMPFILE-plat") + if [ $TMPFILESIZE -eq 0 ]; then + echo "error: no files matched the platform specified" && exit 3 + fi + mv "$TMPFILE-plat" $TMPFILE +fi + #here we extract the filenames from the signature file FILES=$(awk '{print $2}' "$TMPFILE") #and download these one by one for file in $FILES do - wget --quiet -N "$BASEDIR$file" + echo "Downloading $file" + wget --quiet -N "$HOST1$BASEDIR$file" done #check hashes @@ -116,7 +168,7 @@ fi if [ -n "$2" ]; then echo "Clean up the binaries" - clean_up $FILES $SIGNATUREFILENAME $TMPFILE + clean_up $FILES $SIGNATUREFILENAME $SIGNATUREFILENAME.2 $TMPFILE else echo "Keep the binaries in $WORKINGDIR" clean_up $TMPFILE diff --git a/contrib/windeploy/detached-sig-create.sh b/contrib/windeploy/detached-sig-create.sh new file mode 100755 index 0000000000..bf4978d143 --- /dev/null +++ b/contrib/windeploy/detached-sig-create.sh @@ -0,0 +1,34 @@ +#!/bin/sh +# Copyright (c) 2014-2015 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +if [ -z "$OSSLSIGNCODE" ]; then + OSSLSIGNCODE=osslsigncode +fi + +if [ ! -n "$1" ]; then + echo "usage: $0 <osslcodesign args>" + echo "example: $0 -key codesign.key" + exit 1 +fi + +OUT=signature-win.tar.gz +SRCDIR=unsigned +WORKDIR=./.tmp +OUTDIR="${WORKDIR}/out" +OUTSUBDIR="${OUTDIR}/win" +TIMESERVER=http://timestamp.comodoca.com +CERTFILE="win-codesign.cert" + +mkdir -p "${OUTSUBDIR}" +basename -a `ls -1 "${SRCDIR}"/*-unsigned.exe` | while read UNSIGNED; do + echo Signing "${UNSIGNED}" + "${OSSLSIGNCODE}" sign -certs "${CERTFILE}" -t "${TIMESERVER}" -in "${SRCDIR}/${UNSIGNED}" -out "${WORKDIR}/${UNSIGNED}" "$@" + "${OSSLSIGNCODE}" extract-signature -pem -in "${WORKDIR}/${UNSIGNED}" -out "${OUTSUBDIR}/${UNSIGNED}.pem" && rm "${WORKDIR}/${UNSIGNED}" +done + +rm -f "${OUT}" +tar -C "${OUTDIR}" -czf "${OUT}" . +rm -rf "${WORKDIR}" +echo "Created ${OUT}" diff --git a/contrib/windeploy/win-codesign.cert b/contrib/windeploy/win-codesign.cert new file mode 100644 index 0000000000..200b30a3f0 --- /dev/null +++ b/contrib/windeploy/win-codesign.cert @@ -0,0 +1,99 @@ +-----BEGIN CERTIFICATE----- +MIIFTTCCBDWgAwIBAgIRALlW05RLwG2hMQMX5d/o5J8wDQYJKoZIhvcNAQELBQAw +fTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxIzAhBgNV +BAMTGkNPTU9ETyBSU0EgQ29kZSBTaWduaW5nIENBMB4XDTE2MDIwMzAwMDAwMFoX +DTE5MDMwNTIzNTk1OVowgbUxCzAJBgNVBAYTAlVTMQ4wDAYDVQQRDAU5ODEwNDEL +MAkGA1UECAwCV0ExEDAOBgNVBAcMB1NlYXR0bGUxEDAOBgNVBAkMB1N0ZSAzMDAx +FzAVBgNVBAkMDjcxIENvbHVtYmlhIFN0MSUwIwYDVQQKDBxUaGUgQml0Y29pbiBG +b3VuZGF0aW9uLCBJbmMuMSUwIwYDVQQDDBxUaGUgQml0Y29pbiBGb3VuZGF0aW9u +LCBJbmMuMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAw37Vrv9Gbku0 ++kuV0t89TuyxtAcmT7QE4GcwESKKjmkxfzD9a0qlhqk8GfQ+fw4DHNN+nLKNv7xB +bk6aS7J2v2DcXkOjrP99P9jqgTkp7MC04VtG3OqVRGB+gum0pptRovYZUQXIdkY7 +GJOok/NDagwKiiUe2V2meZ7UctsZNvYeilQdTgKIIhrMB9NowCOhT8ocVL4Ki55/ +l7hukJn3fueCM3fHTwY2/1gaGsOHoCkFRsD7vokjAVpiY+8rUgvHjb0gxgojiVGd +6a6/F5XJwKJacvUyN4Hfc2K5lRMQjTTmo4aWNWIa0iJ3TK9BHpdSLJBqerMPvmnM +kkapS+ZTNQIDAQABo4IBjTCCAYkwHwYDVR0jBBgwFoAUKZFg/4pN+uv5pmq4z/nm +S71JzhIwHQYDVR0OBBYEFONpQ+cV82URVe+V8G57377KxxexMA4GA1UdDwEB/wQE +AwIHgDAMBgNVHRMBAf8EAjAAMBMGA1UdJQQMMAoGCCsGAQUFBwMDMBEGCWCGSAGG ++EIBAQQEAwIEEDBGBgNVHSAEPzA9MDsGDCsGAQQBsjEBAgEDAjArMCkGCCsGAQUF +BwIBFh1odHRwczovL3NlY3VyZS5jb21vZG8ubmV0L0NQUzBDBgNVHR8EPDA6MDig +NqA0hjJodHRwOi8vY3JsLmNvbW9kb2NhLmNvbS9DT01PRE9SU0FDb2RlU2lnbmlu +Z0NBLmNybDB0BggrBgEFBQcBAQRoMGYwPgYIKwYBBQUHMAKGMmh0dHA6Ly9jcnQu +Y29tb2RvY2EuY29tL0NPTU9ET1JTQUNvZGVTaWduaW5nQ0EuY3J0MCQGCCsGAQUF +BzABhhhodHRwOi8vb2NzcC5jb21vZG9jYS5jb20wDQYJKoZIhvcNAQELBQADggEB +AGnBSi9K/9rgTAyKFKrfGWSfNOwAghmsnsvpZSQ7QyoGWBFKSgCs/70kErl18oHA +g7Y8loQB1yukZmJaCa3OvGud7smn45TCh0TMf4EpP20Wxf4rMQTxwAatasHL3+vi +I+Nl5bsRZ09kWjvayqLII5upjS/yq0JfpmyGl5k2C/fIpztq0iOLvqWlXcL4+51r +cMUAfX6E6EaZQm//ikp+w2+7MEXTKguOuV3gwsrTy0DsvkZl4YDgx/FA4ImzXopv +d+3KJPLvO+OSBqUD3JPwXHnuJqGAbLBFyyCa/feGUjLlR8cxcNWLWdp4qxtoIUPG +3wTsC9YgrglS0F7FKMXlNRY= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF4DCCA8igAwIBAgIQLnyHzA6TSlL+lP0ct800rzANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTMwNTA5 +MDAwMDAwWhcNMjgwNTA4MjM1OTU5WjB9MQswCQYDVQQGEwJHQjEbMBkGA1UECBMS +R3JlYXRlciBNYW5jaGVzdGVyMRAwDgYDVQQHEwdTYWxmb3JkMRowGAYDVQQKExFD +T01PRE8gQ0EgTGltaXRlZDEjMCEGA1UEAxMaQ09NT0RPIFJTQSBDb2RlIFNpZ25p +bmcgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQCmmJBjd5E0f4rR +3elnMRHrzB79MR2zuWJXP5O8W+OfHiQyESdrvFGRp8+eniWzX4GoGA8dHiAwDvth +e4YJs+P9omidHCydv3Lj5HWg5TUjjsmK7hoMZMfYQqF7tVIDSzqwjiNLS2PgIpQ3 +e9V5kAoUGFEs5v7BEvAcP2FhCoyi3PbDMKrNKBh1SMF5WgjNu4xVjPfUdpA6M0ZQ +c5hc9IVKaw+A3V7Wvf2pL8Al9fl4141fEMJEVTyQPDFGy3CuB6kK46/BAW+QGiPi +XzjbxghdR7ODQfAuADcUuRKqeZJSzYcPe9hiKaR+ML0btYxytEjy4+gh+V5MYnmL +Agaff9ULAgMBAAGjggFRMIIBTTAfBgNVHSMEGDAWgBS7r34CPfqm8TyEjq3uOJjs +2TIy1DAdBgNVHQ4EFgQUKZFg/4pN+uv5pmq4z/nmS71JzhIwDgYDVR0PAQH/BAQD +AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYD +VR0gBAowCDAGBgRVHSAAMEwGA1UdHwRFMEMwQaA/oD2GO2h0dHA6Ly9jcmwuY29t +b2RvY2EuY29tL0NPTU9ET1JTQUNlcnRpZmljYXRpb25BdXRob3JpdHkuY3JsMHEG +CCsGAQUFBwEBBGUwYzA7BggrBgEFBQcwAoYvaHR0cDovL2NydC5jb21vZG9jYS5j +b20vQ09NT0RPUlNBQWRkVHJ1c3RDQS5jcnQwJAYIKwYBBQUHMAGGGGh0dHA6Ly9v +Y3NwLmNvbW9kb2NhLmNvbTANBgkqhkiG9w0BAQwFAAOCAgEAAj8COcPu+Mo7id4M +bU2x8U6ST6/COCwEzMVjEasJY6+rotcCP8xvGcM91hoIlP8l2KmIpysQGuCbsQci +GlEcOtTh6Qm/5iR0rx57FjFuI+9UUS1SAuJ1CAVM8bdR4VEAxof2bO4QRHZXavHf +WGshqknUfDdOvf+2dVRAGDZXZxHNTwLk/vPa/HUX2+y392UJI0kfQ1eD6n4gd2HI +TfK7ZU2o94VFB696aSdlkClAi997OlE5jKgfcHmtbUIgos8MbAOMTM1zB5TnWo46 +BLqioXwfy2M6FafUFRunUkcyqfS/ZEfRqh9TTjIwc8Jvt3iCnVz/RrtrIh2IC/gb +qjSm/Iz13X9ljIwxVzHQNuxHoc/Li6jvHBhYxQZ3ykubUa9MCEp6j+KjUuKOjswm +5LLY5TjCqO3GgZw1a6lYYUoKl7RLQrZVnb6Z53BtWfhtKgx/GWBfDJqIbDCsUgmQ +Fhv/K53b0CDKieoofjKOGd97SDMe12X4rsn4gxSTdn1k0I7OvjV9/3IxTZ+evR5s +L6iPDAZQ+4wns3bJ9ObXwzTijIchhmH+v1V04SF3AwpobLvkyanmz1kl63zsRQ55 +ZmjoIs2475iFTZYRPAmK0H+8KCgT+2rKVI2SXM3CZZgGns5IW9S1N5NGQXwH3c/6 +Q++6Z2H/fUnguzB9XIDj5hY5S6c= +-----END CERTIFICATE----- +-----BEGIN CERTIFICATE----- +MIIF2DCCA8CgAwIBAgIQTKr5yttjb+Af907YWwOGnTANBgkqhkiG9w0BAQwFADCB +hTELMAkGA1UEBhMCR0IxGzAZBgNVBAgTEkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4G +A1UEBxMHU2FsZm9yZDEaMBgGA1UEChMRQ09NT0RPIENBIExpbWl0ZWQxKzApBgNV +BAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwHhcNMTAwMTE5 +MDAwMDAwWhcNMzgwMTE4MjM1OTU5WjCBhTELMAkGA1UEBhMCR0IxGzAZBgNVBAgT +EkdyZWF0ZXIgTWFuY2hlc3RlcjEQMA4GA1UEBxMHU2FsZm9yZDEaMBgGA1UEChMR +Q09NT0RPIENBIExpbWl0ZWQxKzApBgNVBAMTIkNPTU9ETyBSU0EgQ2VydGlmaWNh +dGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUAA4ICDwAwggIKAoICAQCR +6FSS0gpWsawNJN3Fz0RndJkrN6N9I3AAcbxT38T6KhKPS38QVr2fcHK3YX/JSw8X +pz3jsARh7v8Rl8f0hj4K+j5c+ZPmNHrZFGvnnLOFoIJ6dq9xkNfs/Q36nGz637CC +9BR++b7Epi9Pf5l/tfxnQ3K9DADWietrLNPtj5gcFKt+5eNu/Nio5JIk2kNrYrhV +/erBvGy2i/MOjZrkm2xpmfh4SDBF1a3hDTxFYPwyllEnvGfDyi62a+pGx8cgoLEf +Zd5ICLqkTqnyg0Y3hOvozIFIQ2dOciqbXL1MGyiKXCJ7tKuY2e7gUYPDCUZObT6Z ++pUX2nwzV0E8jVHtC7ZcryxjGt9XyD+86V3Em69FmeKjWiS0uqlWPc9vqv9JWL7w +qP/0uK3pN/u6uPQLOvnoQ0IeidiEyxPx2bvhiWC4jChWrBQdnArncevPDt09qZah +SL0896+1DSJMwBGB7FY79tOi4lu3sgQiUpWAk2nojkxl8ZEDLXB0AuqLZxUpaVIC +u9ffUGpVRr+goyhhf3DQw6KqLCGqR84onAZFdr+CGCe01a60y1Dma/RMhnEw6abf +Fobg2P9A3fvQQoh/ozM6LlweQRGBY84YcWsr7KaKtzFcOmpH4MN5WdYgGq/yapiq +crxXStJLnbsQ/LBMQeXtHT1eKJ2czL+zUdqnR+WEUwIDAQABo0IwQDAdBgNVHQ4E +FgQUu69+Aj36pvE8hI6t7jiY7NkyMtQwDgYDVR0PAQH/BAQDAgEGMA8GA1UdEwEB +/wQFMAMBAf8wDQYJKoZIhvcNAQEMBQADggIBAArx1UaEt65Ru2yyTUEUAJNMnMvl +wFTPoCWOAvn9sKIN9SCYPBMtrFaisNZ+EZLpLrqeLppysb0ZRGxhNaKatBYSaVqM +4dc+pBroLwP0rmEdEBsqpIt6xf4FpuHA1sj+nq6PK7o9mfjYcwlYRm6mnPTXJ9OV +2jeDchzTc+CiR5kDOF3VSXkAKRzH7JsgHAckaVd4sjn8OoSgtZx8jb8uk2Intzna +FxiuvTwJaP+EmzzV1gsD41eeFPfR60/IvYcjt7ZJQ3mFXLrrkguhxuhoqEwWsRqZ +CuhTLJK7oQkYdQxlqHvLI7cawiiFwxv/0Cti76R7CZGYZ4wUAc1oBmpjIXUDgIiK +boHGhfKppC3n9KUkEEeDys30jXlYsQab5xoq2Z0B15R97QNKyvDb6KkBPvVWmcke +jkk9u+UJueBPSZI9FoJAzMxZxuY67RIuaTxslbH9qh17f4a+Hg4yRvv7E491f0yL +S0Zj/gA0QHDBw7mh3aZw4gSzQbzpgJHqZJx64SIDqZxubw5lT2yHh17zbqD5daWb +QOhTsiedSrnAdyGN/4fy3ryM7xfft0kL0fJuMAsaDk527RH89elWsn2/x20Kk4yl +0MC2Hb46TpSi125sC8KKfPog88Tk5c0NqMuRkrF8hey1FGlmDoLnzc7ILaZRfyHB +NVOFBkpdn627G190 +-----END CERTIFICATE----- diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py index 5707188f23..ea398a27ea 100755 --- a/contrib/zmq/zmq_sub.py +++ b/contrib/zmq/zmq_sub.py @@ -1,43 +1,84 @@ -#!/usr/bin/env python2 +#!/usr/bin/env python3 # Copyright (c) 2014-2016 The Bitcoin Core developers # Distributed under the MIT software license, see the accompanying # file COPYING or http://www.opensource.org/licenses/mit-license.php. +""" + ZMQ example using python3's asyncio + + Bitcoin should be started with the command line arguments: + bitcoind -testnet -daemon \ + -zmqpubhashblock=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=tcp://127.0.0.1:28332 \ + -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubhashblock=tcp://127.0.0.1:28332 + + We use the asyncio library here. `self.handle()` installs itself as a + future at the end of the function. Since it never returns with the event + loop having an empty stack of futures, this creates an infinite loop. An + alternative is to wrap the contents of `handle` inside `while True`. + + A blocking example using python 2.7 can be obtained from the git history: + https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py +""" + import binascii +import asyncio import zmq +import zmq.asyncio +import signal import struct +import sys + +if not (sys.version_info.major >= 3 and sys.version_info.minor >= 5): + print("This example only works with Python 3.5 and greater") + exit(1) port = 28332 -zmqContext = zmq.Context() -zmqSubSocket = zmqContext.socket(zmq.SUB) -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashblock") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "hashtx") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawblock") -zmqSubSocket.setsockopt(zmq.SUBSCRIBE, "rawtx") -zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) - -try: - while True: - msg = zmqSubSocket.recv_multipart() - topic = str(msg[0]) +class ZMQHandler(): + def __init__(self): + self.loop = zmq.asyncio.install() + self.zmqContext = zmq.asyncio.Context() + + self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx") + self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + + async def handle(self) : + msg = await self.zmqSubSocket.recv_multipart() + topic = msg[0] body = msg[1] sequence = "Unknown" if len(msg[-1]) == 4: msgSequence = struct.unpack('<I', msg[-1])[-1] sequence = str(msgSequence) - if topic == "hashblock": - print '- HASH BLOCK ('+sequence+') -' - print binascii.hexlify(body) - elif topic == "hashtx": - print '- HASH TX ('+sequence+') -' - print binascii.hexlify(body) - elif topic == "rawblock": - print '- RAW BLOCK HEADER ('+sequence+') -' - print binascii.hexlify(body[:80]) - elif topic == "rawtx": - print '- RAW TX ('+sequence+') -' - print binascii.hexlify(body) - -except KeyboardInterrupt: - zmqContext.destroy() + if topic == b"hashblock": + print('- HASH BLOCK ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"hashtx": + print('- HASH TX ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"rawblock": + print('- RAW BLOCK HEADER ('+sequence+') -') + print(binascii.hexlify(body[:80])) + elif topic == b"rawtx": + print('- RAW TX ('+sequence+') -') + print(binascii.hexlify(body)) + # schedule ourselves to receive the next message + asyncio.ensure_future(self.handle()) + + def start(self): + self.loop.add_signal_handler(signal.SIGINT, self.stop) + self.loop.create_task(self.handle()) + self.loop.run_forever() + + def stop(self): + self.loop.stop() + self.zmqContext.destroy() + +daemon = ZMQHandler() +daemon.start() diff --git a/contrib/zmq/zmq_sub3.4.py b/contrib/zmq/zmq_sub3.4.py new file mode 100755 index 0000000000..1cb7eec0c0 --- /dev/null +++ b/contrib/zmq/zmq_sub3.4.py @@ -0,0 +1,89 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or http://www.opensource.org/licenses/mit-license.php. + +""" + ZMQ example using python3's asyncio + + Bitcoin should be started with the command line arguments: + bitcoind -testnet -daemon \ + -zmqpubhashblock=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=tcp://127.0.0.1:28332 \ + -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubhashblock=tcp://127.0.0.1:28332 + + We use the asyncio library here. `self.handle()` installs itself as a + future at the end of the function. Since it never returns with the event + loop having an empty stack of futures, this creates an infinite loop. An + alternative is to wrap the contents of `handle` inside `while True`. + + The `@asyncio.coroutine` decorator and the `yield from` syntax found here + was introduced in python 3.4 and has been deprecated in favor of the `async` + and `await` keywords respectively. + + A blocking example using python 2.7 can be obtained from the git history: + https://github.com/bitcoin/bitcoin/blob/37a7fe9e440b83e2364d5498931253937abe9294/contrib/zmq/zmq_sub.py +""" + +import binascii +import asyncio +import zmq +import zmq.asyncio +import signal +import struct +import sys + +if not (sys.version_info.major >= 3 and sys.version_info.minor >= 4): + print("This example only works with Python 3.4 and greater") + exit(1) + +port = 28332 + +class ZMQHandler(): + def __init__(self): + self.loop = zmq.asyncio.install() + self.zmqContext = zmq.asyncio.Context() + + self.zmqSubSocket = self.zmqContext.socket(zmq.SUB) + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "hashtx") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawblock") + self.zmqSubSocket.setsockopt_string(zmq.SUBSCRIBE, "rawtx") + self.zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + + @asyncio.coroutine + def handle(self) : + msg = yield from self.zmqSubSocket.recv_multipart() + topic = msg[0] + body = msg[1] + sequence = "Unknown" + if len(msg[-1]) == 4: + msgSequence = struct.unpack('<I', msg[-1])[-1] + sequence = str(msgSequence) + if topic == b"hashblock": + print('- HASH BLOCK ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"hashtx": + print('- HASH TX ('+sequence+') -') + print(binascii.hexlify(body)) + elif topic == b"rawblock": + print('- RAW BLOCK HEADER ('+sequence+') -') + print(binascii.hexlify(body[:80])) + elif topic == b"rawtx": + print('- RAW TX ('+sequence+') -') + print(binascii.hexlify(body)) + # schedule ourselves to receive the next message + asyncio.ensure_future(self.handle()) + + def start(self): + self.loop.add_signal_handler(signal.SIGINT, self.stop) + self.loop.create_task(self.handle()) + self.loop.run_forever() + + def stop(self): + self.loop.stop() + self.zmqContext.destroy() + +daemon = ZMQHandler() +daemon.start() |