From 1e0846c93aafe574527cee5c941538c23be4a413 Mon Sep 17 00:00:00 2001 From: arya2 Date: Tue, 27 Jun 2023 14:33:36 -0400 Subject: [PATCH] Squashed 'depend/zcash/' content from commit 00c2a2434 git-subtree-dir: depend/zcash git-subtree-split: 00c2a2434e655d275c26986c8751793f4c98bb01 --- .cargo/config.offline | 8 + .editorconfig | 17 + .gitattributes | 1 + .github/ISSUE_TEMPLATE/bug-report.md | 65 + .github/ISSUE_TEMPLATE/feature-request.md | 22 + .github/ISSUE_TEMPLATE/ux-report.md | 17 + .github/dependabot.yml | 14 + .github/workflows/audits.yml | 18 + .github/workflows/book.yml | 33 + .github/workflows/build.yml | 117 + .github/workflows/lints.yml | 94 + .gitignore | 133 + CONTRIBUTING.md | 1 + COPYING | 53 + Cargo.lock | 2605 +++ Cargo.toml | 120 + INSTALL | 5 + Makefile.am | 177 + README.md | 83 + SECURITY.md | 66 + autogen.sh | 18 + build-aux/m4/ax_boost_base.m4 | 303 + build-aux/m4/ax_boost_chrono.m4 | 118 + build-aux/m4/ax_boost_filesystem.m4 | 118 + build-aux/m4/ax_boost_program_options.m4 | 108 + build-aux/m4/ax_boost_system.m4 | 121 + build-aux/m4/ax_boost_thread.m4 | 187 + build-aux/m4/ax_boost_unit_test_framework.m4 | 137 + build-aux/m4/ax_check_compile_flag.m4 | 74 + build-aux/m4/ax_check_link_flag.m4 | 74 + build-aux/m4/ax_check_preproc_flag.m4 | 74 + build-aux/m4/ax_cxx_compile_stdcxx.m4 | 951 + build-aux/m4/ax_gcc_func_attribute.m4 | 223 + build-aux/m4/ax_pthread.m4 | 485 + build-aux/m4/bitcoin_find_bdb.m4 | 72 + build-aux/m4/bitcoin_subdir_to_include.m4 | 20 + build-aux/m4/l_atomic.m4 | 46 + code_of_conduct.md | 65 + configure.ac | 1324 ++ contrib/README.md | 43 + contrib/bitrpc/README.md | 8 + contrib/bitrpc/bitrpc.py | 335 + .../buildbot/Dockerfile-bbworker.apt | 42 + .../buildbot/Dockerfile-bbworker.arch | 35 + .../buildbot/Dockerfile-bbworker.centos8 | 35 + .../buildbot/Dockerfile-build-python.apt | 30 + .../ci-builders/buildbot/Dockerfile-build.apt | 9 + .../buildbot/Dockerfile-build.arch | 23 + .../buildbot/Dockerfile-build.centos8 | 14 + .../buildbot/Dockerfile-gitian.apt | 8 + contrib/ci-builders/buildbot/README.md | 42 + .../ci-builders/buildbot/apt-package-list.txt | 23 + .../buildbot/bbworker-buildbot.tac | 40 + .../buildbot/bbworker-requirements.txt | 9 + contrib/ci-builders/buildbot/docker-build.sh | 62 + .../ci-builders/tekton/Dockerfile-build.apt | 9 + .../ci-builders/tekton/Dockerfile-build.arch | 14 + .../tekton/Dockerfile-build.centos8 | 14 + .../tekton/Dockerfile-tekton-worker | 11 + contrib/ci-builders/tekton/README.md | 35 + .../tekton/apt-package-tekton-list.txt | 24 + contrib/ci-builders/tekton/docker-build.sh | 60 + contrib/ci-builders/tekton/requirements.txt | 8 + .../ci-builders/tekton/tekton-labs/README.md | 89 + .../tekton-dashboard-readonly-v0.27.0.yaml | 334 + .../releases/tekton-pipeline-v0.37.0.yaml | 2222 +++ .../tekton-labs/tasks/zcash-build-bench.yml | 218 + .../tekton-labs/tasks/zcash-build-test.yml | 57 + .../tekton/tekton-labs/tasks/zcash-build.yml | 51 + contrib/ci-workers/README.md | 62 + contrib/ci-workers/ansible.cfg | 2 + contrib/ci-workers/files/bashrc | 2 + contrib/ci-workers/grind.yml | 27 + contrib/ci-workers/tasks/install-brew.yml | 10 + contrib/ci-workers/tasks/install-pip.yml | 8 + .../templates/buildbot-worker.plist.j2 | 23 + .../templates/buildbot-worker.service.j2 | 17 + contrib/ci-workers/templates/host.ec2.j2 | 1 + contrib/ci-workers/templates/host.j2 | 3 + contrib/ci-workers/unix.yml | 209 + contrib/ci-workers/vars/Archlinux.yml | 7 + contrib/ci-workers/vars/CentOS.yml | 13 + contrib/ci-workers/vars/Debian.yml | 6 + contrib/ci-workers/vars/Fedora.yml | 11 + contrib/ci-workers/vars/FreeBSD.yml | 10 + contrib/ci-workers/vars/MacOSX.yml | 6 + contrib/ci-workers/vars/Ubuntu.yml | 4 + contrib/ci-workers/vars/buildbot.yml | 5 + contrib/ci-workers/vars/default.yml | 53 + contrib/debian/changelog | 743 + contrib/debian/compat | 1 + contrib/debian/control | 22 + contrib/debian/copyright | 1971 ++ contrib/debian/examples/zcash.conf | 133 + contrib/debian/postinst | 39 + contrib/debian/postrm | 37 + contrib/debian/preinst | 35 + contrib/debian/prerm | 38 + contrib/debian/rules | 25 + contrib/debian/zcash.examples | 1 + contrib/debian/zcash.install | 3 + contrib/debian/zcash.manpages | 2 + contrib/devtools/README.md | 102 + contrib/devtools/fix-copyright-headers.sh | 29 + contrib/devtools/gen-manpages.sh | 40 + contrib/devtools/github-merge.sh | 181 + contrib/devtools/optimize-pngs.py | 73 + contrib/devtools/rust-deps-graph.sh | 18 + contrib/devtools/security-check.py | 224 + contrib/devtools/split-debug.sh | 10 + contrib/devtools/symbol-check.py | 189 + contrib/devtools/test-security-check.py | 62 + contrib/devtools/update-clang-hashes.sh | 47 + contrib/devtools/update-rust-hashes.sh | 37 + contrib/docker/.dockerignore | 2 + contrib/docker/.env.example | 12 + contrib/docker/.gitignore | 3 + contrib/docker/Dockerfile | 37 + contrib/docker/README.md | 87 + contrib/docker/docker-compose.yml | 11 + contrib/docker/entrypoint.sh | 58 + contrib/gitian-descriptors/README.md | 65 + .../gitian-linux-parallel.yml | 142 + contrib/gitian-descriptors/gitian-linux.yml | 142 + .../gitian-descriptors/gitian-osx-signer.yml | 37 + contrib/gitian-descriptors/gitian-osx.yml | 146 + .../gitian-descriptors/gitian-win-signer.yml | 38 + contrib/gitian-descriptors/gitian-win.yml | 166 + contrib/gitian-downloader/daira.asc | 70 + contrib/gitian-downloader/jack.asc | 449 + contrib/gitian-downloader/kevin.asc | 171 + contrib/gitian-downloader/nathan.asc | 52 + contrib/gitian-downloader/sean.asc | 51 + contrib/gitian-downloader/simon.asc | 47 + contrib/linearize/README.md | 33 + contrib/linearize/example-linearize.cfg | 29 + contrib/linearize/linearize-data.py | 303 + contrib/linearize/linearize-hashes.py | 113 + contrib/macdeploy/README.md | 123 + contrib/macdeploy/gen-sdk | 94 + contrib/metrics/docker-compose.yml | 52 + .../grafana/dashboards/zcashd-metrics.json | 911 + contrib/metrics/grafana/grafana.ini | 2 + .../provisioning/dashboards/zcash.yaml | 18 + .../provisioning/datasources/prometheus.yaml | 12 + contrib/metrics/prometheus.yaml | 6 + contrib/metrics/pyproject.toml | 29 + contrib/metrics/supply_check/__init__.py | 102 + .../metrics/supply_check/deltas_mainnet.py | 15529 +++++++++++++++ .../supply_check/funding_streams_mainnet.py | 104 + contrib/metrics/supply_check/supply_deltas.py | 60 + contrib/metrics/supply_check/theoretical.py | 67 + contrib/qos/README.md | 5 + contrib/qos/tc.sh | 62 + contrib/seeds/README.md | 4 + contrib/seeds/generate-seeds.py | 138 + contrib/seeds/makeseeds.py | 169 + contrib/simulations/worstcase.py | 246 + contrib/testgen/README.md | 8 + contrib/testgen/base58.py | 104 + contrib/testgen/gen_base58_test_vectors.py | 126 + contrib/zcash-cli.bash-completion | 161 + contrib/zcash-tx.bash-completion | 58 + contrib/zcashd.bash-completion | 57 + contrib/zmq/zmq_sub.py | 48 + depends/.gitignore | 10 + depends/Makefile | 210 + depends/README.md | 57 + depends/builders/darwin.mk | 23 + depends/builders/default.mk | 20 + depends/builders/freebsd.mk | 4 + depends/builders/linux.mk | 2 + depends/config.guess | 1685 ++ depends/config.site.in | 78 + depends/config.sub | 1845 ++ depends/description.md | 53 + depends/funcs.mk | 278 + depends/hosts/darwin.mk | 44 + depends/hosts/default.mk | 45 + depends/hosts/freebsd.mk | 22 + depends/hosts/linux.mk | 26 + depends/hosts/mingw32.mk | 15 + depends/packages.md | 186 + depends/packages/bdb.mk | 64 + depends/packages/boost.mk | 66 + depends/packages/googletest.mk | 41 + depends/packages/libcxx.mk | 61 + depends/packages/libevent.mk | 40 + depends/packages/libsodium.mk | 26 + depends/packages/native_b2.mk | 20 + depends/packages/native_ccache.mk | 33 + depends/packages/native_cctools.mk | 63 + depends/packages/native_clang.mk | 77 + depends/packages/native_cmake.mk | 22 + depends/packages/native_cxxbridge.mk | 50 + depends/packages/native_libtinfo.mk | 22 + depends/packages/native_rust.mk | 70 + depends/packages/native_zstd.mk | 35 + depends/packages/packages.mk | 20 + depends/packages/rustcxx.mk | 13 + depends/packages/tl_expected.mk | 16 + depends/packages/utfcpp.mk | 11 + depends/packages/zeromq.mk | 49 + .../patches/bdb/clang-12-stpcpy-issue.diff | 17 + .../bdb/winioctl-and-atomic_init_db.patch | 136 + .../0001-fix-windows-getaddrinfo.patch | 15 + .../libsodium/1.0.15-pubkey-validation.diff | 17 + .../1.0.15-signature-validation.diff | 78 + .../patches/native_cctools/ignore-otool.diff | 24 + depends/patches/native_cxxbridge/Cargo.lock | 423 + .../remove-undefined-behaviour.diff | 78 + .../zeromq/check_snprintf_return.patch | 48 + .../zeromq/use-snprintf-not-sprintf.patch | 249 + .../zeromq/windows-unused-variables.diff | 17 + doc/Doxyfile | 1752 ++ doc/authors.md | 270 + doc/bips.md | 4 + doc/book/.gitignore | 1 + doc/book/book.toml | 6 + doc/book/src/README.md | 1 + doc/book/src/SUMMARY.md | 23 + doc/book/src/design.md | 9 + doc/book/src/design/chain-state.md | 3 + doc/book/src/design/coins-view.md | 10 + doc/book/src/design/p2p-data-propagation.md | 43 + doc/book/src/dev.md | 3 + doc/book/src/dev/deprecation.md | 38 + doc/book/src/dev/dnsseed-policy.md | 54 + doc/book/src/dev/platform-tier-policy.md | 136 + doc/book/src/dev/regtest.md | 165 + doc/book/src/dev/rust.md | 126 + doc/book/src/doc/imgs/logo.png | 1 + doc/book/src/doc/imgs/zcashd_screen.gif | 1 + doc/book/src/user.md | 6 + doc/book/src/user/deprecation.md | 60 + doc/book/src/user/files.md | 23 + doc/book/src/user/metrics.md | 141 + doc/book/src/user/platform-support.md | 50 + doc/book/src/user/release-support.md | 53 + doc/book/src/user/security-warnings.md | 137 + doc/book/src/user/shield-coinbase.md | 137 + doc/book/src/user/tor.md | 289 + doc/book/src/user/wallet-backup.md | 137 + doc/developer-notes.md | 373 + doc/hotfix-process.md | 49 + doc/imgs/logo.png | Bin 0 -> 10950 bytes doc/imgs/zcashd_screen.gif | Bin 0 -> 39787 bytes doc/imgs/zcashd_screenshot.png | Bin 0 -> 101160 bytes doc/man/Makefile.am | 1 + doc/man/zcash-cli.1 | 89 + doc/man/zcash-fetch-params.1 | 28 + doc/man/zcash-tx.1 | 100 + doc/man/zcashd-wallet-tool.1 | 53 + doc/man/zcashd.1 | 609 + doc/payment-api.md | 179 + doc/payment-disclosure.md | 107 + doc/reduce-traffic.md | 54 + doc/reducing-memory-usage.md | 8 + doc/release-notes.md | 6 + doc/release-notes/release-notes-0.11.2.z2.md | 35 + doc/release-notes/release-notes-0.11.2.z3.md | 69 + doc/release-notes/release-notes-0.11.2.z4.md | 70 + doc/release-notes/release-notes-0.11.2.z5.md | 78 + doc/release-notes/release-notes-0.11.2.z6.md | 18 + doc/release-notes/release-notes-0.11.2.z7.md | 90 + doc/release-notes/release-notes-0.11.2.z8.md | 61 + doc/release-notes/release-notes-0.11.2.z9.md | 55 + .../release-notes-1.0.0-beta1.md | 159 + .../release-notes-1.0.0-beta2.md | 119 + doc/release-notes/release-notes-1.0.0-rc1.md | 121 + doc/release-notes/release-notes-1.0.0-rc2.md | 106 + doc/release-notes/release-notes-1.0.0-rc3.md | 51 + doc/release-notes/release-notes-1.0.0-rc4.md | 14 + doc/release-notes/release-notes-1.0.0.md | 18 + doc/release-notes/release-notes-1.0.1.md | 34 + doc/release-notes/release-notes-1.0.10-1.md | 11 + doc/release-notes/release-notes-1.0.10.md | 79 + doc/release-notes/release-notes-1.0.11-rc1.md | 44 + doc/release-notes/release-notes-1.0.11.md | 47 + doc/release-notes/release-notes-1.0.12-rc1.md | 57 + doc/release-notes/release-notes-1.0.12.md | 65 + doc/release-notes/release-notes-1.0.13-rc1.md | 88 + doc/release-notes/release-notes-1.0.13-rc2.md | 95 + doc/release-notes/release-notes-1.0.13.md | 98 + doc/release-notes/release-notes-1.0.14-rc1.md | 156 + doc/release-notes/release-notes-1.0.14.md | 160 + doc/release-notes/release-notes-1.0.15-rc1.md | 165 + doc/release-notes/release-notes-1.0.15.md | 209 + doc/release-notes/release-notes-1.0.2.md | 16 + doc/release-notes/release-notes-1.0.3.md | 35 + doc/release-notes/release-notes-1.0.4.md | 75 + doc/release-notes/release-notes-1.0.5.md | 58 + doc/release-notes/release-notes-1.0.6.md | 148 + doc/release-notes/release-notes-1.0.7-1.md | 4 + doc/release-notes/release-notes-1.0.7.md | 165 + doc/release-notes/release-notes-1.0.8-1.md | 16 + doc/release-notes/release-notes-1.0.8.md | 170 + doc/release-notes/release-notes-1.0.9.md | 90 + doc/release-notes/release-notes-1.1.0-rc1.md | 180 + doc/release-notes/release-notes-1.1.0.md | 193 + doc/release-notes/release-notes-1.1.1-rc1.md | 286 + doc/release-notes/release-notes-1.1.1-rc2.md | 290 + doc/release-notes/release-notes-1.1.1.md | 336 + doc/release-notes/release-notes-1.1.2-rc1.md | 96 + doc/release-notes/release-notes-1.1.2.md | 99 + doc/release-notes/release-notes-2.0.0-rc1.md | 176 + doc/release-notes/release-notes-2.0.0.md | 199 + doc/release-notes/release-notes-2.0.1-rc1.md | 244 + doc/release-notes/release-notes-2.0.1.md | 276 + doc/release-notes/release-notes-2.0.2-rc1.md | 106 + doc/release-notes/release-notes-2.0.2.md | 110 + doc/release-notes/release-notes-2.0.3-rc1.md | 57 + doc/release-notes/release-notes-2.0.3.md | 61 + doc/release-notes/release-notes-2.0.4-rc1.md | 132 + doc/release-notes/release-notes-2.0.4.md | 139 + doc/release-notes/release-notes-2.0.5-1.md | 68 + doc/release-notes/release-notes-2.0.5-2.md | 77 + doc/release-notes/release-notes-2.0.5-rc1.md | 73 + doc/release-notes/release-notes-2.0.5.md | 130 + doc/release-notes/release-notes-2.0.6-rc1.md | 62 + doc/release-notes/release-notes-2.0.6.md | 102 + doc/release-notes/release-notes-2.0.7-1.md | 38 + doc/release-notes/release-notes-2.0.7-2.md | 30 + doc/release-notes/release-notes-2.0.7-3.md | 35 + doc/release-notes/release-notes-2.0.7-rc1.md | 118 + doc/release-notes/release-notes-2.0.7.md | 149 + doc/release-notes/release-notes-2.1.0-1.md | 10 + doc/release-notes/release-notes-2.1.0-rc1.md | 177 + doc/release-notes/release-notes-2.1.0.md | 215 + doc/release-notes/release-notes-2.1.1-1.md | 43 + doc/release-notes/release-notes-2.1.1-rc1.md | 288 + doc/release-notes/release-notes-2.1.1-rc2.md | 298 + doc/release-notes/release-notes-2.1.1.md | 301 + doc/release-notes/release-notes-2.1.2-1.md | 17 + doc/release-notes/release-notes-2.1.2-2.md | 18 + doc/release-notes/release-notes-2.1.2-3.md | 12 + doc/release-notes/release-notes-2.1.2-rc1.md | 615 + doc/release-notes/release-notes-2.1.2.md | 623 + doc/release-notes/release-notes-3.0.0-rc1.md | 120 + doc/release-notes/release-notes-3.0.0.md | 130 + doc/release-notes/release-notes-3.1.0-rc1.md | 243 + doc/release-notes/release-notes-3.1.0-rc2.md | 250 + doc/release-notes/release-notes-3.1.0.md | 274 + doc/release-notes/release-notes-4.0.0-rc1.md | 276 + doc/release-notes/release-notes-4.0.0.md | 290 + doc/release-notes/release-notes-4.1.0-rc1.md | 382 + doc/release-notes/release-notes-4.1.0.md | 387 + doc/release-notes/release-notes-4.1.1.md | 156 + doc/release-notes/release-notes-4.2.0-rc1.md | 242 + doc/release-notes/release-notes-4.2.0.md | 247 + doc/release-notes/release-notes-4.3.0-rc1.md | 320 + doc/release-notes/release-notes-4.3.0.md | 331 + doc/release-notes/release-notes-4.4.0-rc1.md | 187 + doc/release-notes/release-notes-4.4.0.md | 197 + doc/release-notes/release-notes-4.4.1-rc1.md | 128 + doc/release-notes/release-notes-4.4.1.md | 156 + doc/release-notes/release-notes-4.5.0-rc1.md | 311 + doc/release-notes/release-notes-4.5.0.md | 387 + doc/release-notes/release-notes-4.5.1-1.md | 46 + doc/release-notes/release-notes-4.5.1.md | 80 + doc/release-notes/release-notes-4.6.0-1.md | 37 + doc/release-notes/release-notes-4.6.0-2.md | 47 + doc/release-notes/release-notes-4.6.0-rc1.md | 111 + doc/release-notes/release-notes-4.6.0.md | 126 + doc/release-notes/release-notes-4.7.0-rc1.md | 538 + doc/release-notes/release-notes-4.7.0.md | 869 + doc/release-notes/release-notes-5.0.0-rc1.md | 215 + doc/release-notes/release-notes-5.0.0.md | 253 + doc/release-notes/release-notes-5.1.0-rc1.md | 222 + doc/release-notes/release-notes-5.1.0.md | 259 + doc/release-notes/release-notes-5.2.0-rc1.md | 200 + doc/release-notes/release-notes-5.2.0.md | 211 + doc/release-notes/release-notes-5.3.0-rc1.md | 176 + doc/release-notes/release-notes-5.3.0.md | 192 + doc/release-notes/release-notes-5.3.1-rc1.md | 99 + doc/release-notes/release-notes-5.3.1.md | 135 + doc/release-notes/release-notes-5.3.2.md | 26 + doc/release-notes/release-notes-5.3.3.md | 36 + doc/release-notes/release-notes-5.4.0-rc1.md | 202 + doc/release-notes/release-notes-5.4.0-rc2.md | 262 + doc/release-notes/release-notes-5.4.0-rc3.md | 288 + doc/release-notes/release-notes-5.4.0-rc4.md | 300 + doc/release-notes/release-notes-5.4.0.md | 311 + doc/release-notes/release-notes-5.4.1.md | 46 + doc/release-notes/release-notes-5.4.2.md | 36 + doc/release-notes/release-notes-5.5.0-rc1.md | 407 + doc/release-notes/release-notes-5.5.0-rc2.md | 458 + doc/release-notes/release-notes-5.5.0-rc3.md | 467 + doc/release-notes/release-notes-5.5.0.md | 479 + doc/release-notes/release-notes-5.5.1.md | 31 + doc/release-notes/release-notes-5.6.0-rc1.md | 195 + doc/release-notes/release-notes-5.6.0.md | 232 + doc/release-notes/release-notes-5.6.1.md | 38 + doc/release-process.md | 247 + doc/translation_strings_policy.md | 71 + doc/unit-tests.md | 17 + doc/zmq.md | 122 + libzcash_script.pc.in | 10 + qa/README.md | 91 + qa/pull-tester/rpc-tests.py | 525 + qa/pull-tester/tests_config.ini.in | 19 + qa/rpc-tests/.gitignore | 1 + qa/rpc-tests/README.md | 108 + qa/rpc-tests/addressindex.py | 389 + qa/rpc-tests/bip65-cltv-p2p.py | 99 + qa/rpc-tests/bipdersig-p2p.py | 106 + qa/rpc-tests/blockchain.py | 53 + .../cache/golden-v5.6.0/cache_config.json | 3 + .../cache/golden-v5.6.0/chain_cache.tar.gz | Bin 0 -> 345574 bytes .../cache/golden-v5.6.0/node0_wallet.tar.gz | Bin 0 -> 186852 bytes .../cache/golden-v5.6.0/node1_wallet.tar.gz | Bin 0 -> 21878 bytes .../cache/golden-v5.6.0/node2_wallet.tar.gz | Bin 0 -> 185783 bytes .../cache/golden-v5.6.0/node3_wallet.tar.gz | Bin 0 -> 21144 bytes qa/rpc-tests/cache/sprout/README.md | 10 + qa/rpc-tests/cache/sprout/chain_cache.tar.gz | Bin 0 -> 118769 bytes qa/rpc-tests/cache/sprout/node0_wallet.tar.gz | Bin 0 -> 21491 bytes qa/rpc-tests/cache/sprout/node1_wallet.tar.gz | Bin 0 -> 24058 bytes qa/rpc-tests/cache/sprout/node2_wallet.tar.gz | Bin 0 -> 23123 bytes qa/rpc-tests/cache/sprout/node3_wallet.tar.gz | Bin 0 -> 22023 bytes .../cache/tarnished-v5.6.0/cache_config.json | 3 + .../cache/tarnished-v5.6.0/chain_cache.tar.gz | Bin 0 -> 361686 bytes .../tarnished-v5.6.0/node0_wallet.tar.gz | Bin 0 -> 186828 bytes .../tarnished-v5.6.0/node1_wallet.tar.gz | Bin 0 -> 21198 bytes .../tarnished-v5.6.0/node2_wallet.tar.gz | Bin 0 -> 185943 bytes .../tarnished-v5.6.0/node3_wallet.tar.gz | Bin 0 -> 31812 bytes qa/rpc-tests/coinbase_funding_streams.py | 104 + qa/rpc-tests/create_cache.py | 30 + qa/rpc-tests/decodescript.py | 188 + qa/rpc-tests/disablewallet.py | 35 + qa/rpc-tests/errors.py | 39 + qa/rpc-tests/feature_logging.py | 60 + qa/rpc-tests/feature_walletfile.py | 51 + qa/rpc-tests/feature_zip221.py | 190 + qa/rpc-tests/feature_zip239.py | 264 + .../feature_zip244_blockcommitments.py | 68 + qa/rpc-tests/finalorchardroot.py | 313 + qa/rpc-tests/finalsaplingroot.py | 270 + qa/rpc-tests/forknotify.py | 68 + qa/rpc-tests/framework.py | 51 + qa/rpc-tests/fundrawtransaction.py | 612 + qa/rpc-tests/getblocktemplate.py | 209 + qa/rpc-tests/getblocktemplate_longpoll.py | 93 + qa/rpc-tests/getblocktemplate_proposals.py | 194 + qa/rpc-tests/getchaintips.py | 60 + qa/rpc-tests/getmininginfo.py | 47 + qa/rpc-tests/getrawtransaction_insight.py | 110 + qa/rpc-tests/golden/blossom.tar.gz | Bin 0 -> 47555 bytes qa/rpc-tests/golden/heartwood.tar.gz | Bin 0 -> 55861 bytes qa/rpc-tests/hardforkdetection.py | 69 + qa/rpc-tests/httpbasics.py | 113 + qa/rpc-tests/invalidateblock.py | 78 + qa/rpc-tests/invalidblockrequest.py | 116 + qa/rpc-tests/invalidtxrequest.py | 73 + qa/rpc-tests/key_import_export.py | 113 + qa/rpc-tests/keypool.py | 99 + qa/rpc-tests/listtransactions.py | 136 + qa/rpc-tests/maxblocksinflight.py | 106 + qa/rpc-tests/maxuploadtarget.py | 305 + qa/rpc-tests/mempool_limit.py | 123 + qa/rpc-tests/mempool_nu_activation.py | 216 + qa/rpc-tests/mempool_packages.py | 233 + qa/rpc-tests/mempool_reorg.py | 114 + qa/rpc-tests/mempool_resurrect_test.py | 100 + qa/rpc-tests/mempool_spendcoinbase.py | 95 + qa/rpc-tests/mempool_tx_expiry.py | 272 + qa/rpc-tests/mergetoaddress_helper.py | 346 + qa/rpc-tests/mergetoaddress_mixednotes.py | 77 + qa/rpc-tests/mergetoaddress_sapling.py | 28 + qa/rpc-tests/mergetoaddress_ua_nu5.py | 35 + qa/rpc-tests/mergetoaddress_ua_sapling.py | 31 + qa/rpc-tests/merkle_blocks.py | 122 + qa/rpc-tests/mining_shielded_coinbase.py | 175 + qa/rpc-tests/multi_rpc.py | 120 + qa/rpc-tests/nodehandling.py | 83 + qa/rpc-tests/nuparams.py | 243 + qa/rpc-tests/orchard_reorg.py | 128 + qa/rpc-tests/p2p-acceptblock.py | 298 + qa/rpc-tests/p2p-fullblocktest.py | 283 + qa/rpc-tests/p2p_node_bloom.py | 111 + qa/rpc-tests/p2p_nu_peer_management.py | 192 + qa/rpc-tests/p2p_txexpiringsoon.py | 214 + qa/rpc-tests/p2p_txexpiry_dos.py | 84 + qa/rpc-tests/post_heartwood_rollback.py | 115 + qa/rpc-tests/prioritisetransaction.py | 181 + qa/rpc-tests/proxy_test.py | 194 + qa/rpc-tests/pruning.py | 364 + qa/rpc-tests/rawtransactions.py | 184 + qa/rpc-tests/receivedby.py | 170 + qa/rpc-tests/regtest_signrawtransaction.py | 40 + qa/rpc-tests/reindex.py | 46 + qa/rpc-tests/remove_sprout_shielding.py | 147 + qa/rpc-tests/reorg_limit.py | 107 + qa/rpc-tests/rest.py | 350 + qa/rpc-tests/rewind_index.py | 93 + qa/rpc-tests/rpcbind_test.py | 125 + qa/rpc-tests/sapling_rewind_check.py | 109 + qa/rpc-tests/shorter_block_times.py | 78 + qa/rpc-tests/show_help.py | 655 + qa/rpc-tests/signrawtransaction_offline.py | 71 + qa/rpc-tests/signrawtransactions.py | 112 + qa/rpc-tests/spentindex.py | 191 + qa/rpc-tests/sprout_sapling_migration.py | 192 + qa/rpc-tests/test_framework/__init__.py | 0 qa/rpc-tests/test_framework/authproxy.py | 166 + qa/rpc-tests/test_framework/bignum.py | 100 + qa/rpc-tests/test_framework/blockstore.py | 142 + qa/rpc-tests/test_framework/blocktools.py | 97 + qa/rpc-tests/test_framework/comptool.py | 430 + qa/rpc-tests/test_framework/coverage.py | 107 + qa/rpc-tests/test_framework/equihash.py | 294 + qa/rpc-tests/test_framework/flyclient.py | 210 + qa/rpc-tests/test_framework/key.py | 215 + qa/rpc-tests/test_framework/mininode.py | 2116 ++ qa/rpc-tests/test_framework/netutil.py | 157 + qa/rpc-tests/test_framework/script.py | 979 + qa/rpc-tests/test_framework/socks5.py | 162 + qa/rpc-tests/test_framework/test_framework.py | 211 + qa/rpc-tests/test_framework/util.py | 759 + qa/rpc-tests/test_framework/zip244.py | 294 + qa/rpc-tests/test_framework/zip317.py | 39 + qa/rpc-tests/threeofthreerestore.py | 62 + qa/rpc-tests/timestampindex.py | 92 + qa/rpc-tests/turnstile.py | 191 + qa/rpc-tests/tx_expiry_helper.py | 101 + qa/rpc-tests/txn_doublespend.py | 118 + qa/rpc-tests/upgrade_golden.py | 96 + qa/rpc-tests/wallet.py | 232 + qa/rpc-tests/wallet_1941.py | 116 + qa/rpc-tests/wallet_accounts.py | 256 + qa/rpc-tests/wallet_addresses.py | 194 + qa/rpc-tests/wallet_anchorfork.py | 123 + qa/rpc-tests/wallet_broadcast.py | 63 + qa/rpc-tests/wallet_changeaddresses.py | 97 + qa/rpc-tests/wallet_changeindicator.py | 95 + qa/rpc-tests/wallet_db_flush.py | 85 + qa/rpc-tests/wallet_deprecation.py | 115 + qa/rpc-tests/wallet_doublespend.py | 177 + qa/rpc-tests/wallet_golden_5_6_0.py | 253 + qa/rpc-tests/wallet_import_export.py | 105 + qa/rpc-tests/wallet_isfromme.py | 98 + qa/rpc-tests/wallet_listnotes.py | 193 + qa/rpc-tests/wallet_listreceived.py | 395 + qa/rpc-tests/wallet_listunspent.py | 120 + qa/rpc-tests/wallet_nullifiers.py | 188 + qa/rpc-tests/wallet_orchard.py | 251 + qa/rpc-tests/wallet_orchard_change.py | 124 + qa/rpc-tests/wallet_orchard_init.py | 163 + qa/rpc-tests/wallet_orchard_persistence.py | 108 + qa/rpc-tests/wallet_orchard_reindex.py | 96 + qa/rpc-tests/wallet_overwintertx.py | 183 + qa/rpc-tests/wallet_parsing_amounts.py | 103 + qa/rpc-tests/wallet_persistence.py | 198 + qa/rpc-tests/wallet_sapling.py | 168 + qa/rpc-tests/wallet_sendmany_any_taddr.py | 158 + qa/rpc-tests/wallet_shieldcoinbase.py | 191 + qa/rpc-tests/wallet_shieldcoinbase_sapling.py | 22 + qa/rpc-tests/wallet_shieldcoinbase_ua_nu5.py | 49 + .../wallet_shieldcoinbase_ua_sapling.py | 42 + qa/rpc-tests/wallet_shieldingcoinbase.py | 375 + qa/rpc-tests/wallet_tarnished_5_6_0.py | 32 + qa/rpc-tests/wallet_treestate.py | 112 + qa/rpc-tests/wallet_unified_change.py | 116 + qa/rpc-tests/wallet_z_sendmany.py | 518 + qa/rpc-tests/wallet_zero_value.py | 51 + qa/rpc-tests/walletbackup.py | 254 + qa/rpc-tests/zapwallettxes.py | 88 + qa/rpc-tests/zkey_import_export.py | 166 + qa/rpc-tests/zmq_test.py | 104 + qa/supply-chain/audits.toml | 1673 ++ qa/supply-chain/config.toml | 773 + qa/supply-chain/imports.lock | 877 + qa/zcash/checksec.sh | 2057 ++ qa/zcash/create_benchmark_archive.py | 270 + qa/zcash/create_wallet_200k_utxos.py | 60 + qa/zcash/full_test_suite.py | 243 + qa/zcash/performance-measurements.sh | 415 + qa/zcash/postponed-updates.txt | 47 + qa/zcash/smoke_tests.py | 744 + qa/zcash/test-depends-sources-mirror.py | 48 + qa/zcash/updatecheck.py | 452 + rust-toolchain.toml | 3 + share/genbuild.sh | 51 + share/rpcuser/README.md | 10 + share/rpcuser/rpcuser.py | 41 + src/.clang-format | 50 + src/Makefile.am | 801 + src/Makefile.bench.include | 67 + src/Makefile.crc32c.include | 75 + src/Makefile.gtest.include | 109 + src/Makefile.leveldb.include | 147 + src/Makefile.test.include | 196 + src/addrdb.cpp | 219 + src/addrdb.h | 103 + src/addressindex.h | 288 + src/addrman.cpp | 517 + src/addrman.h | 580 + src/alert.cpp | 285 + src/alert.h | 116 + src/alertkeys.h | 10 + src/amount.cpp | 42 + src/amount.h | 71 + src/arith_uint256.cpp | 261 + src/arith_uint256.h | 290 + src/asyncrpcoperation.cpp | 181 + src/asyncrpcoperation.h | 153 + src/asyncrpcqueue.cpp | 236 + src/asyncrpcqueue.h | 68 + src/base58.cpp | 137 + src/base58.h | 62 + src/bech32.cpp | 194 + src/bech32.h | 30 + src/bench/.gitignore | 1 + src/bench/Examples.cpp | 35 + src/bench/base58.cpp | 59 + src/bench/bench.cpp | 107 + src/bench/bench.h | 96 + src/bench/bench_bitcoin.cpp | 50 + src/bench/checkqueue.cpp | 104 + src/bench/crypto_hash.cpp | 89 + src/bench/lockedpool.cpp | 47 + src/bench/merkle_root.cpp | 26 + src/bench/perf.cpp | 54 + src/bench/perf.h | 38 + src/bench/prevector_destructor.cpp | 37 + src/bench/rollingbloom.cpp | 52 + src/bench/verification.cpp | 141 + src/bitcoin-cli-res.rc | 35 + src/bitcoin-cli.cpp | 467 + src/bitcoin-tx-res.rc | 35 + src/bitcoin-tx.cpp | 695 + src/bitcoind-res.rc | 35 + src/bitcoind.cpp | 225 + src/bloom.cpp | 286 + src/bloom.h | 149 + src/chain.cpp | 159 + src/chain.h | 721 + src/chainparams.cpp | 871 + src/chainparams.h | 167 + src/chainparamsbase.cpp | 119 + src/chainparamsbase.h | 61 + src/chainparamsseeds.h | 15 + src/checkpoints.cpp | 90 + src/checkpoints.h | 34 + src/checkqueue.h | 219 + src/clientversion.cpp | 130 + src/clientversion.h | 71 + src/coincontrol.h | 69 + src/coins.cpp | 1338 ++ src/coins.h | 824 + src/compat.h | 112 + src/compat/byteswap.h | 47 + src/compat/endian.h | 241 + src/compat/glibc_compat.cpp | 30 + src/compat/glibc_sanity.cpp | 69 + src/compat/glibcxx_sanity.cpp | 62 + src/compat/sanity.h | 12 + src/compat/strnlen.cpp | 19 + src/compressor.cpp | 186 + src/compressor.h | 122 + src/config/.empty | 0 src/consensus/consensus.h | 51 + src/consensus/funding.cpp | 94 + src/consensus/funding.h | 45 + src/consensus/merkle.cpp | 71 + src/consensus/merkle.h | 23 + src/consensus/params.cpp | 249 + src/consensus/params.h | 372 + src/consensus/upgrades.cpp | 177 + src/consensus/upgrades.h | 98 + src/consensus/validation.h | 86 + src/core_io.h | 33 + src/core_memusage.h | 69 + src/core_read.cpp | 152 + src/core_write.cpp | 196 + src/crc32c/.appveyor.yml | 37 + src/crc32c/.clang-format | 3 + src/crc32c/.clang_complete | 8 + src/crc32c/.gitignore | 8 + src/crc32c/.gitmodules | 0 src/crc32c/.travis.yml | 76 + src/crc32c/.ycm_extra_conf.py | 142 + src/crc32c/AUTHORS | 9 + src/crc32c/CMakeLists.txt | 423 + src/crc32c/CONTRIBUTING.md | 23 + src/crc32c/Crc32cConfig.cmake | 5 + src/crc32c/LICENSE | 28 + src/crc32c/README.md | 125 + src/crc32c/include/crc32c/crc32c.h | 89 + src/crc32c/src/crc32c.cc | 39 + src/crc32c/src/crc32c_arm64.cc | 126 + src/crc32c/src/crc32c_arm64.h | 27 + src/crc32c/src/crc32c_arm64_linux_check.h | 50 + src/crc32c/src/crc32c_arm64_unittest.cc | 24 + src/crc32c/src/crc32c_benchmark.cc | 106 + src/crc32c/src/crc32c_capi_unittest.c | 66 + src/crc32c/src/crc32c_config.h.in | 36 + src/crc32c/src/crc32c_extend_unittests.h | 112 + src/crc32c/src/crc32c_internal.h | 23 + src/crc32c/src/crc32c_portable.cc | 351 + src/crc32c/src/crc32c_portable_unittest.cc | 20 + src/crc32c/src/crc32c_prefetch.h | 46 + src/crc32c/src/crc32c_prefetch_unittest.cc | 9 + src/crc32c/src/crc32c_read_le.h | 53 + src/crc32c/src/crc32c_read_le_unittest.cc | 32 + src/crc32c/src/crc32c_round_up.h | 34 + src/crc32c/src/crc32c_round_up_unittest.cc | 84 + src/crc32c/src/crc32c_sse42.cc | 258 + src/crc32c/src/crc32c_sse42.h | 33 + src/crc32c/src/crc32c_sse42_check.h | 50 + src/crc32c/src/crc32c_sse42_unittest.cc | 24 + src/crc32c/src/crc32c_test_main.cc | 22 + src/crc32c/src/crc32c_unittest.cc | 129 + src/crypto/aes.cpp | 218 + src/crypto/aes.h | 119 + src/crypto/chacha20.cpp | 181 + src/crypto/chacha20.h | 27 + src/crypto/common.h | 109 + src/crypto/ctaes/COPYING | 21 + src/crypto/ctaes/README.md | 41 + src/crypto/ctaes/bench.c | 170 + src/crypto/ctaes/ctaes.c | 556 + src/crypto/ctaes/ctaes.h | 41 + src/crypto/ctaes/test.c | 110 + src/crypto/equihash.cpp | 768 + src/crypto/equihash.h | 295 + src/crypto/equihash.tcc | 49 + src/crypto/hmac_sha256.cpp | 35 + src/crypto/hmac_sha256.h | 33 + src/crypto/hmac_sha512.cpp | 35 + src/crypto/hmac_sha512.h | 33 + src/crypto/ripemd160.cpp | 293 + src/crypto/ripemd160.h | 29 + src/crypto/sha1.cpp | 200 + src/crypto/sha1.h | 29 + src/crypto/sha256.cpp | 741 + src/crypto/sha256.h | 46 + src/crypto/sha256_avx2.cpp | 325 + src/crypto/sha256_shani.cpp | 356 + src/crypto/sha256_sse4.cpp | 1503 ++ src/crypto/sha256_sse41.cpp | 317 + src/crypto/sha512.cpp | 208 + src/crypto/sha512.h | 29 + src/cuckoocache.h | 483 + src/dbwrapper.cpp | 108 + src/dbwrapper.h | 261 + src/deprecation.cpp | 127 + src/deprecation.h | 99 + src/experimental_features.cpp | 56 + src/experimental_features.h | 21 + src/fs.cpp | 15 + src/fs.h | 25 + src/fuzzing/CheckBlock/fuzz.cpp | 67 + src/fuzzing/CheckBlock/input/0.bin | Bin 0 -> 1692 bytes src/fuzzing/CheckBlock/input/476431.bin | Bin 0 -> 1967 bytes src/fuzzing/CheckBlock/input/620000.bin | Bin 0 -> 2584 bytes src/fuzzing/DecodeHexTx/fuzz.cpp | 39 + src/fuzzing/DecodeHexTx/input/coinbase.txt | 1 + src/fuzzing/DecodeHexTx/input/manyoutputs.txt | 1 + src/fuzzing/DecodeHexTx/input/sapling.txt | 1 + src/fuzzing/DecodeHexTx/input/sprout.txt | 1 + src/fuzzing/DeserializeAddrMan/fuzz.cpp | 33 + .../input/peers.dat-minus-4-byte-header | Bin 0 -> 160686 bytes src/fuzzing/DeserializeTx/fuzz.cpp | 43 + src/fuzzing/DeserializeTx/input/coinbase.bin | Bin 0 -> 178 bytes .../DeserializeTx/input/manyoutputs.bin | Bin 0 -> 2734 bytes src/fuzzing/DeserializeTx/input/sapling.bin | Bin 0 -> 2373 bytes src/fuzzing/DeserializeTx/input/sprout.bin | Bin 0 -> 1823 bytes src/fuzzing/UniValue__Read/dict | 7 + src/fuzzing/UniValue__Read/fuzz.cpp | 29 + src/fuzzing/UniValue__Read/input/fail1.json | 1 + src/fuzzing/UniValue__Read/input/fail10.json | 1 + src/fuzzing/UniValue__Read/input/fail11.json | 1 + src/fuzzing/UniValue__Read/input/fail12.json | 1 + src/fuzzing/UniValue__Read/input/fail13.json | 1 + src/fuzzing/UniValue__Read/input/fail14.json | 1 + src/fuzzing/UniValue__Read/input/fail15.json | 1 + src/fuzzing/UniValue__Read/input/fail16.json | 1 + src/fuzzing/UniValue__Read/input/fail17.json | 1 + src/fuzzing/UniValue__Read/input/fail18.json | 1 + src/fuzzing/UniValue__Read/input/fail19.json | 1 + src/fuzzing/UniValue__Read/input/fail2.json | 1 + src/fuzzing/UniValue__Read/input/fail20.json | 1 + src/fuzzing/UniValue__Read/input/fail21.json | 1 + src/fuzzing/UniValue__Read/input/fail22.json | 1 + src/fuzzing/UniValue__Read/input/fail23.json | 1 + src/fuzzing/UniValue__Read/input/fail24.json | 1 + src/fuzzing/UniValue__Read/input/fail25.json | 1 + src/fuzzing/UniValue__Read/input/fail26.json | 1 + src/fuzzing/UniValue__Read/input/fail27.json | 2 + src/fuzzing/UniValue__Read/input/fail28.json | 2 + src/fuzzing/UniValue__Read/input/fail29.json | 1 + src/fuzzing/UniValue__Read/input/fail3.json | 1 + src/fuzzing/UniValue__Read/input/fail30.json | 1 + src/fuzzing/UniValue__Read/input/fail31.json | 1 + src/fuzzing/UniValue__Read/input/fail32.json | 1 + src/fuzzing/UniValue__Read/input/fail33.json | 1 + src/fuzzing/UniValue__Read/input/fail34.json | 1 + src/fuzzing/UniValue__Read/input/fail35.json | 1 + src/fuzzing/UniValue__Read/input/fail36.json | 1 + src/fuzzing/UniValue__Read/input/fail37.json | 1 + src/fuzzing/UniValue__Read/input/fail38.json | 1 + src/fuzzing/UniValue__Read/input/fail39.json | 1 + src/fuzzing/UniValue__Read/input/fail4.json | 1 + src/fuzzing/UniValue__Read/input/fail40.json | 1 + src/fuzzing/UniValue__Read/input/fail41.json | 1 + src/fuzzing/UniValue__Read/input/fail42.json | Bin 0 -> 37 bytes src/fuzzing/UniValue__Read/input/fail5.json | 1 + src/fuzzing/UniValue__Read/input/fail6.json | 1 + src/fuzzing/UniValue__Read/input/fail7.json | 1 + src/fuzzing/UniValue__Read/input/fail8.json | 1 + src/fuzzing/UniValue__Read/input/fail9.json | 1 + src/fuzzing/UniValue__Read/input/pass1.json | 58 + src/fuzzing/UniValue__Read/input/pass2.json | 1 + src/fuzzing/UniValue__Read/input/pass3.json | 6 + src/fuzzing/UniValue__Read/input/round1.json | 1 + src/fuzzing/UniValue__Read/input/round2.json | 1 + src/fuzzing/UniValue__Read/input/round3.json | 1 + src/fuzzing/UniValue__Read/input/round4.json | 1 + src/fuzzing/UniValue__Read/input/round5.json | 1 + src/fuzzing/UniValue__Read/input/round6.json | 1 + src/fuzzing/UniValue__Read/input/round7.json | 1 + .../data/tx-orchard-duplicate-nullifiers.h | 4 + src/gtest/json_test_vectors.cpp | 14 + src/gtest/json_test_vectors.h | 56 + src/gtest/main.cpp | 96 + src/gtest/test_allocator.cpp | 22 + src/gtest/test_block.cpp | 15 + src/gtest/test_checkblock.cpp | 398 + src/gtest/test_checktransaction.cpp | 1630 ++ src/gtest/test_coins.cpp | 1202 ++ src/gtest/test_consensus.cpp | 1298 ++ src/gtest/test_deprecation.cpp | 150 + src/gtest/test_dynamicusage.cpp | 132 + src/gtest/test_equihash.cpp | 292 + src/gtest/test_feature_flagging.cpp | 97 + src/gtest/test_foundersreward.cpp | 300 + src/gtest/test_history.cpp | 156 + src/gtest/test_httprpc.cpp | 62 + src/gtest/test_joinsplit.cpp | 654 + src/gtest/test_keys.cpp | 313 + src/gtest/test_keystore.cpp | 634 + src/gtest/test_libzcash_utils.cpp | 44 + src/gtest/test_mempool.cpp | 300 + src/gtest/test_mempoollimit.cpp | 184 + src/gtest/test_merkletree.cpp | 358 + src/gtest/test_metrics.cpp | 193 + src/gtest/test_miner.cpp | 125 + src/gtest/test_noteencryption.cpp | 495 + src/gtest/test_pedersen_hash.cpp | 15 + src/gtest/test_pow.cpp | 125 + src/gtest/test_random.cpp | 33 + src/gtest/test_rpc.cpp | 109 + src/gtest/test_sapling_note.cpp | 72 + src/gtest/test_sighash.cpp | 129 + src/gtest/test_tautology.cpp | 10 + src/gtest/test_timedata.cpp | 100 + src/gtest/test_transaction.cpp | 93 + src/gtest/test_transaction_builder.cpp | 512 + src/gtest/test_transaction_builder.h | 95 + src/gtest/test_txid.cpp | 34 + src/gtest/test_upgrades.cpp | 202 + src/gtest/test_util_string.cpp | 34 + src/gtest/test_validation.cpp | 330 + src/gtest/test_weightedmap.cpp | 160 + src/gtest/test_zip32.cpp | 188 + src/gtest/utils.cpp | 92 + src/gtest/utils.h | 16 + src/hash.cpp | 213 + src/hash.h | 251 + src/httprpc.cpp | 250 + src/httprpc.h | 38 + src/httpserver.cpp | 664 + src/httpserver.h | 151 + src/init.cpp | 2081 ++ src/init.h | 43 + src/int128.h | 25 + src/key.cpp | 370 + src/key.h | 201 + src/key_constants.h | 57 + src/key_io.cpp | 532 + src/key_io.h | 50 + src/keystore.cpp | 540 + src/keystore.h | 448 + src/leveldb/.appveyor.yml | 35 + src/leveldb/.clang-format | 18 + src/leveldb/.gitignore | 8 + src/leveldb/.travis.yml | 82 + src/leveldb/AUTHORS | 12 + src/leveldb/CMakeLists.txt | 465 + src/leveldb/CONTRIBUTING.md | 36 + src/leveldb/LICENSE | 27 + src/leveldb/NEWS | 17 + src/leveldb/README.md | 225 + src/leveldb/TODO | 14 + src/leveldb/benchmarks/db_bench.cc | 981 + src/leveldb/benchmarks/db_bench_sqlite3.cc | 714 + src/leveldb/benchmarks/db_bench_tree_db.cc | 522 + src/leveldb/cmake/leveldbConfig.cmake | 1 + src/leveldb/db/autocompact_test.cc | 112 + src/leveldb/db/builder.cc | 79 + src/leveldb/db/builder.h | 30 + src/leveldb/db/c.cc | 562 + src/leveldb/db/c_test.c | 384 + src/leveldb/db/corruption_test.cc | 362 + src/leveldb/db/db_impl.cc | 1555 ++ src/leveldb/db/db_impl.h | 217 + src/leveldb/db/db_iter.cc | 318 + src/leveldb/db/db_iter.h | 26 + src/leveldb/db/db_test.cc | 2302 +++ src/leveldb/db/dbformat.cc | 137 + src/leveldb/db/dbformat.h | 224 + src/leveldb/db/dbformat_test.cc | 131 + src/leveldb/db/dumpfile.cc | 232 + src/leveldb/db/fault_injection_test.cc | 552 + src/leveldb/db/filename.cc | 141 + src/leveldb/db/filename.h | 84 + src/leveldb/db/filename_test.cc | 131 + src/leveldb/db/leveldbutil.cc | 64 + src/leveldb/db/log_format.h | 35 + src/leveldb/db/log_reader.cc | 274 + src/leveldb/db/log_reader.h | 112 + src/leveldb/db/log_test.cc | 562 + src/leveldb/db/log_writer.cc | 111 + src/leveldb/db/log_writer.h | 54 + src/leveldb/db/memtable.cc | 137 + src/leveldb/db/memtable.h | 87 + src/leveldb/db/recovery_test.cc | 330 + src/leveldb/db/repair.cc | 450 + src/leveldb/db/skiplist.h | 382 + src/leveldb/db/skiplist_test.cc | 369 + src/leveldb/db/snapshot.h | 95 + src/leveldb/db/table_cache.cc | 120 + src/leveldb/db/table_cache.h | 58 + src/leveldb/db/version_edit.cc | 257 + src/leveldb/db/version_edit.h | 106 + src/leveldb/db/version_edit_test.cc | 44 + src/leveldb/db/version_set.cc | 1562 ++ src/leveldb/db/version_set.h | 393 + src/leveldb/db/version_set_test.cc | 332 + src/leveldb/db/write_batch.cc | 150 + src/leveldb/db/write_batch_internal.h | 45 + src/leveldb/db/write_batch_test.cc | 137 + src/leveldb/doc/benchmark.html | 459 + src/leveldb/doc/impl.md | 172 + src/leveldb/doc/index.md | 523 + src/leveldb/doc/log_format.md | 75 + src/leveldb/doc/table_format.md | 107 + src/leveldb/helpers/memenv/memenv.cc | 394 + src/leveldb/helpers/memenv/memenv.h | 22 + src/leveldb/helpers/memenv/memenv_test.cc | 259 + src/leveldb/include/leveldb/c.h | 270 + src/leveldb/include/leveldb/cache.h | 111 + src/leveldb/include/leveldb/comparator.h | 64 + src/leveldb/include/leveldb/db.h | 167 + src/leveldb/include/leveldb/dumpfile.h | 28 + src/leveldb/include/leveldb/env.h | 396 + src/leveldb/include/leveldb/export.h | 33 + src/leveldb/include/leveldb/filter_policy.h | 72 + src/leveldb/include/leveldb/iterator.h | 112 + src/leveldb/include/leveldb/options.h | 187 + src/leveldb/include/leveldb/slice.h | 115 + src/leveldb/include/leveldb/status.h | 122 + src/leveldb/include/leveldb/table.h | 84 + src/leveldb/include/leveldb/table_builder.h | 93 + src/leveldb/include/leveldb/write_batch.h | 83 + src/leveldb/issues/issue178_test.cc | 88 + src/leveldb/issues/issue200_test.cc | 57 + src/leveldb/issues/issue320_test.cc | 128 + src/leveldb/port/README.md | 10 + src/leveldb/port/port.h | 19 + src/leveldb/port/port_config.h.in | 39 + src/leveldb/port/port_example.h | 104 + src/leveldb/port/port_stdcxx.h | 153 + src/leveldb/port/thread_annotations.h | 108 + src/leveldb/table/block.cc | 267 + src/leveldb/table/block.h | 44 + src/leveldb/table/block_builder.cc | 108 + src/leveldb/table/block_builder.h | 55 + src/leveldb/table/filter_block.cc | 106 + src/leveldb/table/filter_block.h | 69 + src/leveldb/table/filter_block_test.cc | 124 + src/leveldb/table/format.cc | 141 + src/leveldb/table/format.h | 100 + src/leveldb/table/iterator.cc | 76 + src/leveldb/table/iterator_wrapper.h | 92 + src/leveldb/table/merger.cc | 191 + src/leveldb/table/merger.h | 26 + src/leveldb/table/table.cc | 273 + src/leveldb/table/table_builder.cc | 265 + src/leveldb/table/table_test.cc | 837 + src/leveldb/table/two_level_iterator.cc | 171 + src/leveldb/table/two_level_iterator.h | 31 + src/leveldb/util/arena.cc | 66 + src/leveldb/util/arena.h | 71 + src/leveldb/util/arena_test.cc | 65 + src/leveldb/util/bloom.cc | 92 + src/leveldb/util/bloom_test.cc | 156 + src/leveldb/util/cache.cc | 400 + src/leveldb/util/cache_test.cc | 226 + src/leveldb/util/coding.cc | 166 + src/leveldb/util/coding.h | 164 + src/leveldb/util/coding_test.cc | 196 + src/leveldb/util/comparator.cc | 75 + src/leveldb/util/crc32c.cc | 380 + src/leveldb/util/crc32c.h | 43 + src/leveldb/util/crc32c_test.cc | 59 + src/leveldb/util/env.cc | 92 + src/leveldb/util/env_posix.cc | 906 + src/leveldb/util/env_posix_test.cc | 350 + src/leveldb/util/env_posix_test_helper.h | 28 + src/leveldb/util/env_test.cc | 237 + src/leveldb/util/env_windows.cc | 849 + src/leveldb/util/env_windows_test.cc | 64 + src/leveldb/util/env_windows_test_helper.h | 25 + src/leveldb/util/filter_policy.cc | 11 + src/leveldb/util/hash.cc | 55 + src/leveldb/util/hash.h | 19 + src/leveldb/util/hash_test.cc | 44 + src/leveldb/util/histogram.cc | 272 + src/leveldb/util/histogram.h | 44 + src/leveldb/util/logging.cc | 84 + src/leveldb/util/logging.h | 45 + src/leveldb/util/logging_test.cc | 143 + src/leveldb/util/mutexlock.h | 39 + src/leveldb/util/no_destructor.h | 46 + src/leveldb/util/no_destructor_test.cc | 47 + src/leveldb/util/options.cc | 14 + src/leveldb/util/posix_logger.h | 130 + src/leveldb/util/random.h | 63 + src/leveldb/util/status.cc | 77 + src/leveldb/util/status_test.cc | 40 + src/leveldb/util/testharness.cc | 81 + src/leveldb/util/testharness.h | 141 + src/leveldb/util/testutil.cc | 49 + src/leveldb/util/testutil.h | 66 + src/leveldb/util/windows_logger.h | 124 + src/limitedmap.h | 98 + src/logging.cpp | 145 + src/logging.h | 59 + src/main.cpp | 8397 ++++++++ src/main.h | 685 + src/mempool_limit.cpp | 51 + src/mempool_limit.h | 119 + src/memusage.h | 155 + src/merkleblock.cpp | 180 + src/merkleblock.h | 157 + src/metrics.cpp | 702 + src/metrics.h | 121 + src/miner.cpp | 1069 + src/miner.h | 182 + src/net.cpp | 2403 +++ src/net.h | 798 + src/netbase.cpp | 1469 ++ src/netbase.h | 226 + src/noui.cpp | 61 + src/noui.h | 11 + src/obj/.gitignore | 2 + src/policy/policy.cpp | 194 + src/policy/policy.h | 107 + src/pow.cpp | 174 + src/pow.h | 36 + src/pow/tromp/equi.h | 61 + src/pow/tromp/equi_miner.h | 745 + src/pow/tromp/osx_barrier.h | 75 + src/prevector.h | 489 + src/primitives/block.cpp | 103 + src/primitives/block.h | 210 + src/primitives/orchard.h | 141 + src/primitives/sapling.h | 185 + src/primitives/transaction.cpp | 373 + src/primitives/transaction.h | 911 + src/primitives/tx_version_info.cpp | 47 + src/proof_verifier.cpp | 71 + src/proof_verifier.h | 42 + src/protocol.cpp | 157 + src/protocol.h | 205 + src/pubkey.cpp | 158 + src/pubkey.h | 307 + src/random.cpp | 122 + src/random.h | 206 + src/rest.cpp | 638 + src/reverse_iterator.h | 39 + src/reverselock.h | 35 + src/rpc/blockchain.cpp | 1681 ++ src/rpc/client.cpp | 114 + src/rpc/client.h | 61 + src/rpc/common.h | 191 + src/rpc/mining.cpp | 1023 + src/rpc/misc.cpp | 1258 ++ src/rpc/net.cpp | 691 + src/rpc/protocol.cpp | 137 + src/rpc/protocol.h | 94 + src/rpc/rawtransaction.cpp | 1326 ++ src/rpc/register.h | 33 + src/rpc/server.cpp | 674 + src/rpc/server.h | 206 + src/rust/README.md | 30 + src/rust/bin/inspect/address.rs | 139 + src/rust/bin/inspect/block.rs | 401 + src/rust/bin/inspect/context.rs | 308 + src/rust/bin/inspect/keys.rs | 168 + src/rust/bin/inspect/main.rs | 129 + src/rust/bin/inspect/transaction.rs | 545 + src/rust/bin/wallet_tool.rs | 664 + src/rust/include/librustzcash.h | 298 + src/rust/include/rust/VA_OPT.hpp | 156 + src/rust/include/rust/address.h | 54 + src/rust/include/rust/builder.h | 93 + src/rust/include/rust/constants.h | 16 + src/rust/include/rust/helpers.h | 34 + src/rust/include/rust/history.h | 74 + src/rust/include/rust/init.h | 19 + src/rust/include/rust/map.h | 71 + src/rust/include/rust/metrics.h | 315 + src/rust/include/rust/orchard.h | 24 + src/rust/include/rust/orchard/keys.h | 269 + src/rust/include/rust/orchard/wallet.h | 418 + src/rust/include/rust/streams.h | 23 + src/rust/include/rust/transaction.h | 68 + src/rust/include/rust/types.h | 16 + src/rust/include/rust/unified_keys.h | 144 + src/rust/include/rust/zip339.h | 59 + src/rust/include/tracing.h | 316 + src/rust/src/address_ffi.rs | 233 + src/rust/src/blake2b.rs | 44 + src/rust/src/bridge.rs | 412 + src/rust/src/builder_ffi.rs | 249 + src/rust/src/bundlecache.rs | 144 + src/rust/src/ed25519.rs | 69 + src/rust/src/equihash.rs | 32 + src/rust/src/history_ffi.rs | 265 + src/rust/src/incremental_merkle_tree.rs | 543 + src/rust/src/init_ffi.rs | 7 + src/rust/src/merkle_frontier.rs | 152 + src/rust/src/metrics_ffi.rs | 279 + src/rust/src/note_encryption.rs | 145 + src/rust/src/orchard_bundle.rs | 233 + src/rust/src/orchard_ffi.rs | 98 + src/rust/src/orchard_keys_ffi.rs | 402 + src/rust/src/params.rs | 146 + src/rust/src/rustzcash.rs | 861 + src/rust/src/sapling.rs | 782 + src/rust/src/streams.rs | 142 + src/rust/src/streams_ffi.rs | 54 + src/rust/src/test_harness_ffi.rs | 155 + src/rust/src/tests/key_agreement.rs | 74 + src/rust/src/tests/key_components.rs | 701 + src/rust/src/tests/mmr.rs | 225 + src/rust/src/tests/mod.rs | 81 + src/rust/src/tests/notes.rs | 672 + src/rust/src/tests/res/tree1023.dat | Bin 0 -> 153867 bytes src/rust/src/tests/res/tree16.dat | Bin 0 -> 2352 bytes src/rust/src/tests/signatures.rs | 510 + src/rust/src/tests/zip339.rs | 120 + src/rust/src/tracing_ffi.rs | 675 + src/rust/src/transaction_ffi.rs | 304 + src/rust/src/unified_keys_ffi.rs | 217 + src/rust/src/wallet.rs | 1407 ++ src/rust/src/wallet_scanner.rs | 694 + src/rust/src/zcashd_orchard.rs | 36 + src/rust/src/zip339_ffi.rs | 114 + src/scheduler.cpp | 123 + src/scheduler.h | 83 + src/script/interpreter.cpp | 1522 ++ src/script/interpreter.h | 196 + src/script/ismine.cpp | 125 + src/script/ismine.h | 33 + src/script/script.cpp | 272 + src/script/script.h | 648 + src/script/script_error.cpp | 76 + src/script/script_error.h | 63 + src/script/sigcache.cpp | 92 + src/script/sigcache.h | 55 + src/script/sign.cpp | 387 + src/script/sign.h | 105 + src/script/standard.cpp | 305 + src/script/standard.h | 131 + src/script/zcash_script.cpp | 284 + src/script/zcash_script.h | 190 + src/secp256k1/.cirrus.yml | 377 + src/secp256k1/.gitattributes | 2 + src/secp256k1/.gitignore | 62 + src/secp256k1/CHANGELOG.md | 28 + src/secp256k1/COPYING | 19 + src/secp256k1/Makefile.am | 243 + src/secp256k1/README.md | 122 + src/secp256k1/SECURITY.md | 15 + src/secp256k1/autogen.sh | 3 + src/secp256k1/build-aux/m4/bitcoin_secp.m4 | 55 + src/secp256k1/ci/cirrus.sh | 108 + src/secp256k1/ci/linux-debian.Dockerfile | 37 + src/secp256k1/configure.ac | 451 + src/secp256k1/contrib/lax_der_parsing.c | 148 + src/secp256k1/contrib/lax_der_parsing.h | 97 + .../contrib/lax_der_privatekey_parsing.c | 112 + .../contrib/lax_der_privatekey_parsing.h | 95 + src/secp256k1/doc/release-process.md | 52 + src/secp256k1/doc/safegcd_implementation.md | 771 + src/secp256k1/examples/EXAMPLES_COPYING | 121 + src/secp256k1/examples/ecdh.c | 123 + src/secp256k1/examples/ecdsa.c | 133 + src/secp256k1/examples/random.h | 73 + src/secp256k1/examples/schnorr.c | 148 + src/secp256k1/include/secp256k1.h | 907 + src/secp256k1/include/secp256k1_ecdh.h | 63 + src/secp256k1/include/secp256k1_extrakeys.h | 249 + .../include/secp256k1_preallocated.h | 130 + src/secp256k1/include/secp256k1_recovery.h | 113 + src/secp256k1/include/secp256k1_schnorrsig.h | 182 + src/secp256k1/libsecp256k1.pc.in | 13 + src/secp256k1/sage/gen_exhaustive_groups.sage | 124 + .../sage/gen_split_lambda_constants.sage | 114 + src/secp256k1/sage/group_prover.sage | 353 + .../sage/prove_group_implementations.sage | 293 + src/secp256k1/sage/secp256k1_params.sage | 39 + src/secp256k1/sage/weierstrass_prover.sage | 275 + src/secp256k1/src/asm/field_10x26_arm.s | 913 + src/secp256k1/src/assumptions.h | 83 + src/secp256k1/src/bench.c | 229 + src/secp256k1/src/bench.h | 188 + src/secp256k1/src/bench_ecmult.c | 370 + src/secp256k1/src/bench_internal.c | 393 + src/secp256k1/src/ecdsa.h | 21 + src/secp256k1/src/ecdsa_impl.h | 315 + src/secp256k1/src/eckey.h | 25 + src/secp256k1/src/eckey_impl.h | 96 + src/secp256k1/src/ecmult.h | 61 + src/secp256k1/src/ecmult_compute_table.h | 16 + src/secp256k1/src/ecmult_compute_table_impl.h | 49 + src/secp256k1/src/ecmult_const.h | 21 + src/secp256k1/src/ecmult_const_impl.h | 231 + src/secp256k1/src/ecmult_gen.h | 48 + src/secp256k1/src/ecmult_gen_compute_table.h | 14 + .../src/ecmult_gen_compute_table_impl.h | 81 + src/secp256k1/src/ecmult_gen_impl.h | 133 + src/secp256k1/src/ecmult_impl.h | 865 + src/secp256k1/src/field.h | 142 + src/secp256k1/src/field_10x26.h | 50 + src/secp256k1/src/field_10x26_impl.h | 1367 ++ src/secp256k1/src/field_5x52.h | 55 + src/secp256k1/src/field_5x52_asm_impl.h | 502 + src/secp256k1/src/field_5x52_impl.h | 670 + src/secp256k1/src/field_5x52_int128_impl.h | 278 + src/secp256k1/src/field_impl.h | 138 + src/secp256k1/src/group.h | 167 + src/secp256k1/src/group_impl.h | 705 + src/secp256k1/src/hash.h | 41 + src/secp256k1/src/hash_impl.h | 290 + src/secp256k1/src/int128.h | 85 + src/secp256k1/src/int128_impl.h | 18 + src/secp256k1/src/int128_native.h | 19 + src/secp256k1/src/int128_native_impl.h | 87 + src/secp256k1/src/int128_struct.h | 14 + src/secp256k1/src/int128_struct_impl.h | 192 + src/secp256k1/src/modinv32.h | 42 + src/secp256k1/src/modinv32_impl.h | 587 + src/secp256k1/src/modinv64.h | 46 + src/secp256k1/src/modinv64_impl.h | 629 + .../src/modules/ecdh/Makefile.am.include | 4 + src/secp256k1/src/modules/ecdh/bench_impl.h | 57 + src/secp256k1/src/modules/ecdh/main_impl.h | 71 + src/secp256k1/src/modules/ecdh/tests_impl.h | 165 + .../src/modules/extrakeys/Makefile.am.include | 4 + .../src/modules/extrakeys/main_impl.h | 284 + .../modules/extrakeys/tests_exhaustive_impl.h | 68 + .../src/modules/extrakeys/tests_impl.h | 565 + .../src/modules/recovery/Makefile.am.include | 5 + .../src/modules/recovery/bench_impl.h | 62 + .../src/modules/recovery/main_impl.h | 159 + .../modules/recovery/tests_exhaustive_impl.h | 149 + .../src/modules/recovery/tests_impl.h | 373 + .../modules/schnorrsig/Makefile.am.include | 5 + .../src/modules/schnorrsig/bench_impl.h | 104 + .../src/modules/schnorrsig/main_impl.h | 267 + .../schnorrsig/tests_exhaustive_impl.h | 214 + .../src/modules/schnorrsig/tests_impl.h | 879 + src/secp256k1/src/precompute_ecmult.c | 99 + src/secp256k1/src/precompute_ecmult_gen.c | 83 + src/secp256k1/src/precomputed_ecmult.c | 16460 ++++++++++++++++ src/secp256k1/src/precomputed_ecmult.h | 35 + src/secp256k1/src/precomputed_ecmult_gen.c | 9750 +++++++++ src/secp256k1/src/precomputed_ecmult_gen.h | 26 + src/secp256k1/src/scalar.h | 105 + src/secp256k1/src/scalar_4x64.h | 19 + src/secp256k1/src/scalar_4x64_impl.h | 924 + src/secp256k1/src/scalar_8x32.h | 19 + src/secp256k1/src/scalar_8x32_impl.h | 735 + src/secp256k1/src/scalar_impl.h | 297 + src/secp256k1/src/scalar_low.h | 17 + src/secp256k1/src/scalar_low_impl.h | 139 + src/secp256k1/src/scratch.h | 42 + src/secp256k1/src/scratch_impl.h | 99 + src/secp256k1/src/secp256k1.c | 787 + src/secp256k1/src/selftest.h | 32 + src/secp256k1/src/testrand.h | 50 + src/secp256k1/src/testrand_impl.h | 197 + src/secp256k1/src/tests.c | 7473 +++++++ src/secp256k1/src/tests_exhaustive.c | 459 + src/secp256k1/src/util.h | 345 + src/secp256k1/src/valgrind_ctime_test.c | 171 + src/sendalert.cpp | 173 + src/serialize.h | 1184 ++ src/spentindex.h | 98 + src/streams.h | 737 + src/streams_rust.cpp | 29 + src/streams_rust.h | 22 + src/support/allocators/secure.h | 62 + src/support/allocators/zeroafterfree.h | 49 + src/support/cleanse.cpp | 39 + src/support/cleanse.h | 16 + src/support/events.h | 57 + src/support/lockedpool.cpp | 418 + src/support/lockedpool.h | 239 + src/sync.cpp | 205 + src/sync.h | 304 + src/test/Checkpoints_tests.cpp | 30 + src/test/DoS_tests.cpp | 217 + src/test/Makefile | 6 + src/test/README.md | 43 + src/test/addrman_tests.cpp | 524 + src/test/alert_tests.cpp | 416 + src/test/allocator_tests.cpp | 229 + src/test/arith_uint256_tests.cpp | 568 + src/test/base32_tests.cpp | 26 + src/test/base58_tests.cpp | 200 + src/test/base64_tests.cpp | 26 + src/test/bctest.py | 127 + src/test/bech32_tests.cpp | 125 + src/test/bip32_tests.cpp | 141 + src/test/bitcoin-util-test.py | 45 + src/test/bloom_tests.cpp | 567 + src/test/buildenv.py.in | 2 + src/test/checkblock_tests.cpp | 70 + src/test/checkqueue_tests.cpp | 443 + src/test/coins_tests.cpp | 778 + src/test/compress_tests.cpp | 66 + src/test/convertbits_tests.cpp | 52 + src/test/crypto_tests.cpp | 523 + src/test/cuckoocache_tests.cpp | 382 + src/test/data/README.md | 12 + src/test/data/alertTests.raw | Bin 0 -> 2111 bytes src/test/data/base58_encode_decode.json | 14 + src/test/data/base58_keys_invalid.json | 152 + src/test/data/base58_keys_valid.json | 426 + src/test/data/bitcoin-util-test.json | 160 + src/test/data/blanktx.hex | 1 + src/test/data/blanktx.json | 10 + src/test/data/merkle_commitments.json | 18 + src/test/data/merkle_commitments_sapling.json | 18 + src/test/data/merkle_path.json | 122 + src/test/data/merkle_path_sapling.json | 122 + src/test/data/merkle_roots.json | 18 + src/test/data/merkle_roots_orchard.h | 5595 ++++++ src/test/data/merkle_roots_sapling.json | 18 + src/test/data/merkle_serialization.json | 18 + .../data/merkle_serialization_sapling.json | 18 + .../data/merkle_witness_serialization.json | 138 + .../merkle_witness_serialization_sapling.json | 138 + src/test/data/sapling_key_components.json | 14 + src/test/data/script_invalid.json | 772 + src/test/data/script_valid.json | 834 + src/test/data/sighash.json | 503 + src/test/data/tt-delin1-out.hex | 1 + src/test/data/tt-delin1-out.json | 216 + src/test/data/tt-delout1-out.hex | 1 + src/test/data/tt-delout1-out.json | 212 + src/test/data/tt-locktime317000-out.hex | 1 + src/test/data/tt-locktime317000-out.json | 225 + src/test/data/tx394b54bb.hex | 1 + src/test/data/tx_invalid.json | 245 + src/test/data/tx_valid.json | 138 + src/test/data/txcreate1.hex | 1 + src/test/data/txcreate1.json | 63 + src/test/data/txcreate2.hex | 1 + src/test/data/txcreate2.json | 19 + src/test/data/txcreatedata_seq0.hex | 1 + src/test/data/txcreatedata_seq0.json | 32 + src/test/data/txcreatedata_seq1.hex | 1 + src/test/data/txcreatedata_seq1.json | 41 + src/test/data/txcreatesign.hex | 1 + src/test/data/txcreatesign.json | 32 + src/test/data/unified_addrs.json | 24 + src/test/data/unified_full_viewing_keys.json | 25 + src/test/data/zip0244.json | 14 + src/test/dbwrapper_tests.cpp | 234 + src/test/equihash_tests.cpp | 237 + src/test/getarg_tests.cpp | 162 + src/test/hash_tests.cpp | 128 + src/test/key_tests.cpp | 237 + src/test/limitedmap_tests.cpp | 102 + src/test/main_tests.cpp | 126 + src/test/mempool_tests.cpp | 387 + src/test/merkle_tests.cpp | 253 + src/test/miner_tests.cpp | 607 + src/test/multisig_tests.cpp | 239 + src/test/net_tests.cpp | 146 + src/test/netbase_tests.cpp | 255 + src/test/pmt_tests.cpp | 127 + src/test/pow_tests.cpp | 168 + src/test/prevector_tests.cpp | 249 + src/test/raii_event_tests.cpp | 95 + src/test/random_tests.cpp | 56 + src/test/reverselock_tests.cpp | 61 + src/test/rpc_tests.cpp | 416 + src/test/sanity_tests.cpp | 23 + src/test/scheduler_tests.cpp | 111 + src/test/script_P2PKH_tests.cpp | 60 + src/test/script_P2SH_tests.cpp | 406 + src/test/script_standard_tests.cpp | 527 + src/test/script_tests.cpp | 979 + src/test/scriptnum10.h | 210 + src/test/scriptnum_tests.cpp | 248 + src/test/serialize_tests.cpp | 421 + src/test/sha256compress_tests.cpp | 86 + src/test/sighash_tests.cpp | 328 + src/test/sigopcount_tests.cpp | 66 + src/test/skiplist_tests.cpp | 103 + src/test/streams_tests.cpp | 256 + src/test/sync_tests.cpp | 52 + src/test/test_bitcoin.cpp | 251 + src/test/test_bitcoin.h | 112 + src/test/test_util.cpp | 123 + src/test/test_util.h | 15 + src/test/torcontrol_tests.cpp | 199 + src/test/transaction_tests.cpp | 950 + src/test/txvalidationcache_tests.cpp | 90 + src/test/uint256_tests.cpp | 270 + src/test/univalue_tests.cpp | 320 + src/test/util_tests.cpp | 624 + src/threadsafety.h | 58 + src/timedata.cpp | 70 + src/timedata.h | 40 + src/timestampindex.h | 132 + src/tinyformat.h | 1053 + src/torcontrol.cpp | 777 + src/torcontrol.h | 21 + src/transaction_builder.cpp | 932 + src/transaction_builder.h | 396 + src/txdb.cpp | 788 + src/txdb.h | 160 + src/txmempool.cpp | 1311 ++ src/txmempool.h | 657 + src/ui_interface.h | 116 + src/uint252.h | 50 + src/uint256.cpp | 87 + src/uint256.h | 188 + src/undo.h | 82 + src/univalue/.gitignore | 32 + src/univalue/.travis.yml | 51 + src/univalue/COPYING | 19 + src/univalue/Makefile.am | 118 + src/univalue/README.md | 21 + src/univalue/TODO | 10 + src/univalue/autogen.sh | 9 + src/univalue/build-aux/m4/.gitignore | 1 + src/univalue/configure.ac | 69 + src/univalue/gen/gen.cpp | 82 + src/univalue/include/univalue.h | 242 + src/univalue/lib/.gitignore | 2 + src/univalue/lib/univalue.cpp | 242 + src/univalue/lib/univalue_escapes.h | 262 + src/univalue/lib/univalue_get.cpp | 147 + src/univalue/lib/univalue_read.cpp | 460 + src/univalue/lib/univalue_utffilter.h | 119 + src/univalue/lib/univalue_write.cpp | 113 + src/univalue/pc/libunivalue-uninstalled.pc.in | 9 + src/univalue/pc/libunivalue.pc.in | 10 + src/univalue/test/.gitignore | 8 + src/univalue/test/fail1.json | 1 + src/univalue/test/fail10.json | 1 + src/univalue/test/fail11.json | 1 + src/univalue/test/fail12.json | 1 + src/univalue/test/fail13.json | 1 + src/univalue/test/fail14.json | 1 + src/univalue/test/fail15.json | 1 + src/univalue/test/fail16.json | 1 + src/univalue/test/fail17.json | 1 + src/univalue/test/fail18.json | 1 + src/univalue/test/fail19.json | 1 + src/univalue/test/fail2.json | 1 + src/univalue/test/fail20.json | 1 + src/univalue/test/fail21.json | 1 + src/univalue/test/fail22.json | 1 + src/univalue/test/fail23.json | 1 + src/univalue/test/fail24.json | 1 + src/univalue/test/fail25.json | 1 + src/univalue/test/fail26.json | 1 + src/univalue/test/fail27.json | 2 + src/univalue/test/fail28.json | 2 + src/univalue/test/fail29.json | 1 + src/univalue/test/fail3.json | 1 + src/univalue/test/fail30.json | 1 + src/univalue/test/fail31.json | 1 + src/univalue/test/fail32.json | 1 + src/univalue/test/fail33.json | 1 + src/univalue/test/fail34.json | 1 + src/univalue/test/fail35.json | 1 + src/univalue/test/fail36.json | 1 + src/univalue/test/fail37.json | 1 + src/univalue/test/fail38.json | 1 + src/univalue/test/fail39.json | 1 + src/univalue/test/fail4.json | 1 + src/univalue/test/fail40.json | 1 + src/univalue/test/fail41.json | 1 + src/univalue/test/fail42.json | Bin 0 -> 37 bytes src/univalue/test/fail44.json | 1 + src/univalue/test/fail45.json | 1 + src/univalue/test/fail5.json | 1 + src/univalue/test/fail6.json | 1 + src/univalue/test/fail7.json | 1 + src/univalue/test/fail8.json | 1 + src/univalue/test/fail9.json | 1 + src/univalue/test/no_nul.cpp | 8 + src/univalue/test/object.cpp | 421 + src/univalue/test/pass1.json | 58 + src/univalue/test/pass2.json | 1 + src/univalue/test/pass3.json | 6 + src/univalue/test/pass4.json | 1 + src/univalue/test/round1.json | 1 + src/univalue/test/round2.json | 1 + src/univalue/test/round3.json | 1 + src/univalue/test/round4.json | 1 + src/univalue/test/round5.json | 1 + src/univalue/test/round6.json | 1 + src/univalue/test/round7.json | 1 + src/univalue/test/test_json.cpp | 24 + src/univalue/test/unitester.cpp | 171 + src/util/match.h | 39 + src/util/moneystr.cpp | 84 + src/util/moneystr.h | 25 + src/util/strencodings.cpp | 566 + src/util/strencodings.h | 177 + src/util/string.h | 38 + src/util/system.cpp | 681 + src/util/system.h | 229 + src/util/test.cpp | 364 + src/util/test.h | 147 + src/util/time.cpp | 174 + src/util/time.h | 108 + src/validationinterface.cpp | 553 + src/validationinterface.h | 171 + src/version.h | 44 + src/wallet/asyncrpcoperation_common.cpp | 233 + src/wallet/asyncrpcoperation_common.h | 72 + .../asyncrpcoperation_mergetoaddress.cpp | 217 + src/wallet/asyncrpcoperation_mergetoaddress.h | 79 + .../asyncrpcoperation_saplingmigration.cpp | 235 + .../asyncrpcoperation_saplingmigration.h | 39 + src/wallet/asyncrpcoperation_sendmany.cpp | 215 + src/wallet/asyncrpcoperation_sendmany.h | 85 + .../asyncrpcoperation_shieldcoinbase.cpp | 270 + src/wallet/asyncrpcoperation_shieldcoinbase.h | 120 + src/wallet/crypter.cpp | 733 + src/wallet/crypter.h | 268 + src/wallet/db.cpp | 460 + src/wallet/db.h | 313 + src/wallet/gtest/test_note_selection.cpp | 502 + src/wallet/gtest/test_orchard_wallet.cpp | 157 + src/wallet/gtest/test_orchard_zkeys.cpp | 35 + src/wallet/gtest/test_paymentdisclosure.cpp | 191 + src/wallet/gtest/test_rpc_wallet.cpp | 516 + src/wallet/gtest/test_wallet.cpp | 2500 +++ src/wallet/gtest/test_wallet_zkeys.cpp | 531 + src/wallet/orchard.cpp | 47 + src/wallet/orchard.h | 563 + src/wallet/paymentdisclosure.cpp | 66 + src/wallet/paymentdisclosure.h | 161 + src/wallet/paymentdisclosuredb.cpp | 92 + src/wallet/paymentdisclosuredb.h | 41 + src/wallet/rpcdisclosure.cpp | 313 + src/wallet/rpcdump.cpp | 1015 + src/wallet/rpcwallet.cpp | 6048 ++++++ src/wallet/rpcwallet.h | 13 + src/wallet/test/crypto_tests.cpp | 127 + src/wallet/test/rpc_wallet_tests.cpp | 1740 ++ src/wallet/test/wallet_test_fixture.cpp | 31 + src/wallet/test/wallet_test_fixture.h | 18 + src/wallet/test/wallet_tests.cpp | 334 + src/wallet/wallet.cpp | 8117 ++++++++ src/wallet/wallet.h | 2395 +++ src/wallet/wallet_tx_builder.cpp | 1162 ++ src/wallet/wallet_tx_builder.h | 454 + src/wallet/walletdb.cpp | 1376 ++ src/wallet/walletdb.h | 498 + src/warnings.cpp | 118 + src/warnings.h | 23 + src/weighted_map.h | 199 + src/zcash/Address.cpp | 383 + src/zcash/Address.hpp | 332 + src/zcash/History.cpp | 190 + src/zcash/History.hpp | 84 + src/zcash/IncrementalMerkleTree.cpp | 1183 ++ src/zcash/IncrementalMerkleTree.hpp | 430 + src/zcash/JoinSplit.cpp | 251 + src/zcash/JoinSplit.hpp | 84 + src/zcash/Note.cpp | 369 + src/zcash/Note.hpp | 255 + src/zcash/NoteEncryption.cpp | 461 + src/zcash/NoteEncryption.hpp | 220 + src/zcash/Proof.hpp | 218 + src/zcash/Zcash.h | 28 + src/zcash/address/mnemonic.cpp | 68 + src/zcash/address/mnemonic.h | 119 + src/zcash/address/orchard.cpp | 73 + src/zcash/address/orchard.hpp | 325 + src/zcash/address/sapling.cpp | 95 + src/zcash/address/sapling.hpp | 145 + src/zcash/address/sprout.cpp | 44 + src/zcash/address/sprout.hpp | 95 + src/zcash/address/transparent.cpp | 122 + src/zcash/address/transparent.h | 112 + src/zcash/address/unified.cpp | 257 + src/zcash/address/unified.h | 291 + src/zcash/address/zip32.cpp | 298 + src/zcash/address/zip32.h | 329 + src/zcash/cache.cpp | 22 + src/zcash/cache.h | 44 + src/zcash/memo.cpp | 101 + src/zcash/memo.h | 112 + src/zcash/prf.cpp | 153 + src/zcash/prf.h | 36 + src/zcash/util.cpp | 45 + src/zcash/util.h | 11 + src/zcbenchmarks.cpp | 868 + src/zcbenchmarks.h | 30 + src/zip317.cpp | 39 + src/zip317.h | 46 + src/zmq/zmqabstractnotifier.cpp | 28 + src/zmq/zmqabstractnotifier.h | 46 + src/zmq/zmqconfig.h | 25 + src/zmq/zmqnotificationinterface.cpp | 186 + src/zmq/zmqnotificationinterface.h | 40 + src/zmq/zmqpublishnotifier.cpp | 206 + src/zmq/zmqpublishnotifier.h | 62 + test/lint/README.md | 32 + test/lint/commit-script-check.sh | 55 + test/lint/git-subtree-check.sh | 97 + test/lint/lint-all.sh | 31 + test/lint/lint-cargo-patches.sh | 68 + test/lint/lint-include-guards.sh | 35 + test/lint/lint-includes.sh | 134 + test/lint/lint-locale-dependence.sh | 231 + test/lint/lint-python-utf8-encoding.sh | 21 + test/lint/lint-shebang.sh | 26 + test/lint/lint-shell-locale.sh | 26 + test/lint/lint-shell.sh | 64 + test/lint/lint-whitespace.sh | 114 + zcutil/afl/afl-build.sh | 106 + zcutil/afl/afl-get.sh | 80 + zcutil/afl/afl-getbuildrun.sh | 70 + zcutil/afl/afl-run.sh | 62 + zcutil/afl/zcash-wrapper | 59 + zcutil/afl/zcash-wrapper-clang | 1 + zcutil/afl/zcash-wrapper-clang++ | 1 + zcutil/afl/zcash-wrapper-g++ | 1 + zcutil/afl/zcash-wrapper-gcc | 1 + zcutil/build-debian-package.sh | 78 + zcutil/build.sh | 97 + zcutil/clean.sh | 112 + zcutil/cleanup-tags.sh | 27 + zcutil/distclean.sh | 17 + zcutil/fetch-params.sh | 291 + zcutil/libfuzzer/libfuzzer-build.sh | 153 + zcutil/libfuzzer/zcash-wrapper | 123 + zcutil/libfuzzer/zcash-wrapper-clang | 1 + zcutil/libfuzzer/zcash-wrapper-clang++ | 1 + zcutil/make-release.py | 803 + zcutil/release-notes.py | 159 + 1668 files changed, 379710 insertions(+) create mode 100644 .cargo/config.offline create mode 100644 .editorconfig create mode 100644 .gitattributes create mode 100644 .github/ISSUE_TEMPLATE/bug-report.md create mode 100644 .github/ISSUE_TEMPLATE/feature-request.md create mode 100644 .github/ISSUE_TEMPLATE/ux-report.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/audits.yml create mode 100644 .github/workflows/book.yml create mode 100644 .github/workflows/build.yml create mode 100644 .github/workflows/lints.yml create mode 100644 .gitignore create mode 100644 CONTRIBUTING.md create mode 100644 COPYING create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 INSTALL create mode 100644 Makefile.am create mode 100644 README.md create mode 100644 SECURITY.md create mode 100755 autogen.sh create mode 100644 build-aux/m4/ax_boost_base.m4 create mode 100644 build-aux/m4/ax_boost_chrono.m4 create mode 100644 build-aux/m4/ax_boost_filesystem.m4 create mode 100644 build-aux/m4/ax_boost_program_options.m4 create mode 100644 build-aux/m4/ax_boost_system.m4 create mode 100644 build-aux/m4/ax_boost_thread.m4 create mode 100644 build-aux/m4/ax_boost_unit_test_framework.m4 create mode 100644 build-aux/m4/ax_check_compile_flag.m4 create mode 100644 build-aux/m4/ax_check_link_flag.m4 create mode 100644 build-aux/m4/ax_check_preproc_flag.m4 create mode 100644 build-aux/m4/ax_cxx_compile_stdcxx.m4 create mode 100644 build-aux/m4/ax_gcc_func_attribute.m4 create mode 100644 build-aux/m4/ax_pthread.m4 create mode 100644 build-aux/m4/bitcoin_find_bdb.m4 create mode 100644 build-aux/m4/bitcoin_subdir_to_include.m4 create mode 100644 build-aux/m4/l_atomic.m4 create mode 100644 code_of_conduct.md create mode 100644 configure.ac create mode 100644 contrib/README.md create mode 100644 contrib/bitrpc/README.md create mode 100644 contrib/bitrpc/bitrpc.py create mode 100644 contrib/ci-builders/buildbot/Dockerfile-bbworker.apt create mode 100644 contrib/ci-builders/buildbot/Dockerfile-bbworker.arch create mode 100644 contrib/ci-builders/buildbot/Dockerfile-bbworker.centos8 create mode 100644 contrib/ci-builders/buildbot/Dockerfile-build-python.apt create mode 100644 contrib/ci-builders/buildbot/Dockerfile-build.apt create mode 100644 contrib/ci-builders/buildbot/Dockerfile-build.arch create mode 100644 contrib/ci-builders/buildbot/Dockerfile-build.centos8 create mode 100644 contrib/ci-builders/buildbot/Dockerfile-gitian.apt create mode 100644 contrib/ci-builders/buildbot/README.md create mode 100644 contrib/ci-builders/buildbot/apt-package-list.txt create mode 100644 contrib/ci-builders/buildbot/bbworker-buildbot.tac create mode 100644 contrib/ci-builders/buildbot/bbworker-requirements.txt create mode 100755 contrib/ci-builders/buildbot/docker-build.sh create mode 100644 contrib/ci-builders/tekton/Dockerfile-build.apt create mode 100644 contrib/ci-builders/tekton/Dockerfile-build.arch create mode 100644 contrib/ci-builders/tekton/Dockerfile-build.centos8 create mode 100644 contrib/ci-builders/tekton/Dockerfile-tekton-worker create mode 100644 contrib/ci-builders/tekton/README.md create mode 100644 contrib/ci-builders/tekton/apt-package-tekton-list.txt create mode 100755 contrib/ci-builders/tekton/docker-build.sh create mode 100644 contrib/ci-builders/tekton/requirements.txt create mode 100644 contrib/ci-builders/tekton/tekton-labs/README.md create mode 100644 contrib/ci-builders/tekton/tekton-labs/releases/tekton-dashboard-readonly-v0.27.0.yaml create mode 100644 contrib/ci-builders/tekton/tekton-labs/releases/tekton-pipeline-v0.37.0.yaml create mode 100644 contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-bench.yml create mode 100644 contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml create mode 100644 contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml create mode 100644 contrib/ci-workers/README.md create mode 100644 contrib/ci-workers/ansible.cfg create mode 100644 contrib/ci-workers/files/bashrc create mode 100644 contrib/ci-workers/grind.yml create mode 100644 contrib/ci-workers/tasks/install-brew.yml create mode 100644 contrib/ci-workers/tasks/install-pip.yml create mode 100644 contrib/ci-workers/templates/buildbot-worker.plist.j2 create mode 100644 contrib/ci-workers/templates/buildbot-worker.service.j2 create mode 100644 contrib/ci-workers/templates/host.ec2.j2 create mode 100644 contrib/ci-workers/templates/host.j2 create mode 100644 contrib/ci-workers/unix.yml create mode 100644 contrib/ci-workers/vars/Archlinux.yml create mode 100644 contrib/ci-workers/vars/CentOS.yml create mode 100644 contrib/ci-workers/vars/Debian.yml create mode 100644 contrib/ci-workers/vars/Fedora.yml create mode 100644 contrib/ci-workers/vars/FreeBSD.yml create mode 100644 contrib/ci-workers/vars/MacOSX.yml create mode 100644 contrib/ci-workers/vars/Ubuntu.yml create mode 100644 contrib/ci-workers/vars/buildbot.yml create mode 100644 contrib/ci-workers/vars/default.yml create mode 100644 contrib/debian/changelog create mode 100644 contrib/debian/compat create mode 100644 contrib/debian/control create mode 100644 contrib/debian/copyright create mode 100644 contrib/debian/examples/zcash.conf create mode 100755 contrib/debian/postinst create mode 100755 contrib/debian/postrm create mode 100755 contrib/debian/preinst create mode 100755 contrib/debian/prerm create mode 100755 contrib/debian/rules create mode 100644 contrib/debian/zcash.examples create mode 100644 contrib/debian/zcash.install create mode 100644 contrib/debian/zcash.manpages create mode 100644 contrib/devtools/README.md create mode 100755 contrib/devtools/fix-copyright-headers.sh create mode 100755 contrib/devtools/gen-manpages.sh create mode 100755 contrib/devtools/github-merge.sh create mode 100755 contrib/devtools/optimize-pngs.py create mode 100755 contrib/devtools/rust-deps-graph.sh create mode 100755 contrib/devtools/security-check.py create mode 100755 contrib/devtools/split-debug.sh create mode 100755 contrib/devtools/symbol-check.py create mode 100755 contrib/devtools/test-security-check.py create mode 100755 contrib/devtools/update-clang-hashes.sh create mode 100755 contrib/devtools/update-rust-hashes.sh create mode 100644 contrib/docker/.dockerignore create mode 100644 contrib/docker/.env.example create mode 100644 contrib/docker/.gitignore create mode 100644 contrib/docker/Dockerfile create mode 100644 contrib/docker/README.md create mode 100644 contrib/docker/docker-compose.yml create mode 100755 contrib/docker/entrypoint.sh create mode 100644 contrib/gitian-descriptors/README.md create mode 100644 contrib/gitian-descriptors/gitian-linux-parallel.yml create mode 100644 contrib/gitian-descriptors/gitian-linux.yml create mode 100644 contrib/gitian-descriptors/gitian-osx-signer.yml create mode 100644 contrib/gitian-descriptors/gitian-osx.yml create mode 100644 contrib/gitian-descriptors/gitian-win-signer.yml create mode 100644 contrib/gitian-descriptors/gitian-win.yml create mode 100644 contrib/gitian-downloader/daira.asc create mode 100644 contrib/gitian-downloader/jack.asc create mode 100644 contrib/gitian-downloader/kevin.asc create mode 100644 contrib/gitian-downloader/nathan.asc create mode 100644 contrib/gitian-downloader/sean.asc create mode 100644 contrib/gitian-downloader/simon.asc create mode 100644 contrib/linearize/README.md create mode 100644 contrib/linearize/example-linearize.cfg create mode 100755 contrib/linearize/linearize-data.py create mode 100755 contrib/linearize/linearize-hashes.py create mode 100644 contrib/macdeploy/README.md create mode 100755 contrib/macdeploy/gen-sdk create mode 100644 contrib/metrics/docker-compose.yml create mode 100644 contrib/metrics/grafana/dashboards/zcashd-metrics.json create mode 100644 contrib/metrics/grafana/grafana.ini create mode 100644 contrib/metrics/grafana/provisioning/dashboards/zcash.yaml create mode 100644 contrib/metrics/grafana/provisioning/datasources/prometheus.yaml create mode 100644 contrib/metrics/prometheus.yaml create mode 100644 contrib/metrics/pyproject.toml create mode 100644 contrib/metrics/supply_check/__init__.py create mode 100644 contrib/metrics/supply_check/deltas_mainnet.py create mode 100644 contrib/metrics/supply_check/funding_streams_mainnet.py create mode 100644 contrib/metrics/supply_check/supply_deltas.py create mode 100644 contrib/metrics/supply_check/theoretical.py create mode 100644 contrib/qos/README.md create mode 100644 contrib/qos/tc.sh create mode 100644 contrib/seeds/README.md create mode 100755 contrib/seeds/generate-seeds.py create mode 100755 contrib/seeds/makeseeds.py create mode 100755 contrib/simulations/worstcase.py create mode 100644 contrib/testgen/README.md create mode 100644 contrib/testgen/base58.py create mode 100755 contrib/testgen/gen_base58_test_vectors.py create mode 100644 contrib/zcash-cli.bash-completion create mode 100644 contrib/zcash-tx.bash-completion create mode 100644 contrib/zcashd.bash-completion create mode 100755 contrib/zmq/zmq_sub.py create mode 100644 depends/.gitignore create mode 100644 depends/Makefile create mode 100644 depends/README.md create mode 100644 depends/builders/darwin.mk create mode 100644 depends/builders/default.mk create mode 100644 depends/builders/freebsd.mk create mode 100644 depends/builders/linux.mk create mode 100755 depends/config.guess create mode 100644 depends/config.site.in create mode 100755 depends/config.sub create mode 100644 depends/description.md create mode 100644 depends/funcs.mk create mode 100644 depends/hosts/darwin.mk create mode 100644 depends/hosts/default.mk create mode 100644 depends/hosts/freebsd.mk create mode 100644 depends/hosts/linux.mk create mode 100644 depends/hosts/mingw32.mk create mode 100644 depends/packages.md create mode 100644 depends/packages/bdb.mk create mode 100644 depends/packages/boost.mk create mode 100644 depends/packages/googletest.mk create mode 100644 depends/packages/libcxx.mk create mode 100644 depends/packages/libevent.mk create mode 100644 depends/packages/libsodium.mk create mode 100644 depends/packages/native_b2.mk create mode 100644 depends/packages/native_ccache.mk create mode 100644 depends/packages/native_cctools.mk create mode 100644 depends/packages/native_clang.mk create mode 100644 depends/packages/native_cmake.mk create mode 100644 depends/packages/native_cxxbridge.mk create mode 100644 depends/packages/native_libtinfo.mk create mode 100644 depends/packages/native_rust.mk create mode 100644 depends/packages/native_zstd.mk create mode 100644 depends/packages/packages.mk create mode 100644 depends/packages/rustcxx.mk create mode 100644 depends/packages/tl_expected.mk create mode 100644 depends/packages/utfcpp.mk create mode 100644 depends/packages/zeromq.mk create mode 100644 depends/patches/bdb/clang-12-stpcpy-issue.diff create mode 100644 depends/patches/bdb/winioctl-and-atomic_init_db.patch create mode 100644 depends/patches/libevent/0001-fix-windows-getaddrinfo.patch create mode 100644 depends/patches/libsodium/1.0.15-pubkey-validation.diff create mode 100644 depends/patches/libsodium/1.0.15-signature-validation.diff create mode 100644 depends/patches/native_cctools/ignore-otool.diff create mode 100644 depends/patches/native_cxxbridge/Cargo.lock create mode 100644 depends/patches/tl_expected/remove-undefined-behaviour.diff create mode 100644 depends/patches/zeromq/check_snprintf_return.patch create mode 100644 depends/patches/zeromq/use-snprintf-not-sprintf.patch create mode 100644 depends/patches/zeromq/windows-unused-variables.diff create mode 100644 doc/Doxyfile create mode 100644 doc/authors.md create mode 100644 doc/bips.md create mode 100644 doc/book/.gitignore create mode 100644 doc/book/book.toml create mode 100644 doc/book/src/README.md create mode 100644 doc/book/src/SUMMARY.md create mode 100644 doc/book/src/design.md create mode 100644 doc/book/src/design/chain-state.md create mode 100644 doc/book/src/design/coins-view.md create mode 100644 doc/book/src/design/p2p-data-propagation.md create mode 100644 doc/book/src/dev.md create mode 100644 doc/book/src/dev/deprecation.md create mode 100644 doc/book/src/dev/dnsseed-policy.md create mode 100644 doc/book/src/dev/platform-tier-policy.md create mode 100644 doc/book/src/dev/regtest.md create mode 100644 doc/book/src/dev/rust.md create mode 120000 doc/book/src/doc/imgs/logo.png create mode 120000 doc/book/src/doc/imgs/zcashd_screen.gif create mode 100644 doc/book/src/user.md create mode 100644 doc/book/src/user/deprecation.md create mode 100644 doc/book/src/user/files.md create mode 100644 doc/book/src/user/metrics.md create mode 100644 doc/book/src/user/platform-support.md create mode 100644 doc/book/src/user/release-support.md create mode 100644 doc/book/src/user/security-warnings.md create mode 100644 doc/book/src/user/shield-coinbase.md create mode 100644 doc/book/src/user/tor.md create mode 100644 doc/book/src/user/wallet-backup.md create mode 100644 doc/developer-notes.md create mode 100644 doc/hotfix-process.md create mode 100644 doc/imgs/logo.png create mode 100644 doc/imgs/zcashd_screen.gif create mode 100644 doc/imgs/zcashd_screenshot.png create mode 100644 doc/man/Makefile.am create mode 100644 doc/man/zcash-cli.1 create mode 100644 doc/man/zcash-fetch-params.1 create mode 100644 doc/man/zcash-tx.1 create mode 100644 doc/man/zcashd-wallet-tool.1 create mode 100644 doc/man/zcashd.1 create mode 100644 doc/payment-api.md create mode 100644 doc/payment-disclosure.md create mode 100644 doc/reduce-traffic.md create mode 100644 doc/reducing-memory-usage.md create mode 100644 doc/release-notes.md create mode 100644 doc/release-notes/release-notes-0.11.2.z2.md create mode 100644 doc/release-notes/release-notes-0.11.2.z3.md create mode 100644 doc/release-notes/release-notes-0.11.2.z4.md create mode 100644 doc/release-notes/release-notes-0.11.2.z5.md create mode 100644 doc/release-notes/release-notes-0.11.2.z6.md create mode 100644 doc/release-notes/release-notes-0.11.2.z7.md create mode 100644 doc/release-notes/release-notes-0.11.2.z8.md create mode 100644 doc/release-notes/release-notes-0.11.2.z9.md create mode 100644 doc/release-notes/release-notes-1.0.0-beta1.md create mode 100644 doc/release-notes/release-notes-1.0.0-beta2.md create mode 100644 doc/release-notes/release-notes-1.0.0-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.0-rc2.md create mode 100644 doc/release-notes/release-notes-1.0.0-rc3.md create mode 100644 doc/release-notes/release-notes-1.0.0-rc4.md create mode 100644 doc/release-notes/release-notes-1.0.0.md create mode 100644 doc/release-notes/release-notes-1.0.1.md create mode 100644 doc/release-notes/release-notes-1.0.10-1.md create mode 100644 doc/release-notes/release-notes-1.0.10.md create mode 100644 doc/release-notes/release-notes-1.0.11-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.11.md create mode 100644 doc/release-notes/release-notes-1.0.12-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.12.md create mode 100644 doc/release-notes/release-notes-1.0.13-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.13-rc2.md create mode 100644 doc/release-notes/release-notes-1.0.13.md create mode 100644 doc/release-notes/release-notes-1.0.14-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.14.md create mode 100644 doc/release-notes/release-notes-1.0.15-rc1.md create mode 100644 doc/release-notes/release-notes-1.0.15.md create mode 100644 doc/release-notes/release-notes-1.0.2.md create mode 100644 doc/release-notes/release-notes-1.0.3.md create mode 100644 doc/release-notes/release-notes-1.0.4.md create mode 100644 doc/release-notes/release-notes-1.0.5.md create mode 100644 doc/release-notes/release-notes-1.0.6.md create mode 100644 doc/release-notes/release-notes-1.0.7-1.md create mode 100644 doc/release-notes/release-notes-1.0.7.md create mode 100644 doc/release-notes/release-notes-1.0.8-1.md create mode 100644 doc/release-notes/release-notes-1.0.8.md create mode 100644 doc/release-notes/release-notes-1.0.9.md create mode 100644 doc/release-notes/release-notes-1.1.0-rc1.md create mode 100644 doc/release-notes/release-notes-1.1.0.md create mode 100644 doc/release-notes/release-notes-1.1.1-rc1.md create mode 100644 doc/release-notes/release-notes-1.1.1-rc2.md create mode 100644 doc/release-notes/release-notes-1.1.1.md create mode 100644 doc/release-notes/release-notes-1.1.2-rc1.md create mode 100644 doc/release-notes/release-notes-1.1.2.md create mode 100644 doc/release-notes/release-notes-2.0.0-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.0.md create mode 100644 doc/release-notes/release-notes-2.0.1-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.1.md create mode 100644 doc/release-notes/release-notes-2.0.2-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.2.md create mode 100644 doc/release-notes/release-notes-2.0.3-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.3.md create mode 100644 doc/release-notes/release-notes-2.0.4-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.4.md create mode 100644 doc/release-notes/release-notes-2.0.5-1.md create mode 100644 doc/release-notes/release-notes-2.0.5-2.md create mode 100644 doc/release-notes/release-notes-2.0.5-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.5.md create mode 100644 doc/release-notes/release-notes-2.0.6-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.6.md create mode 100644 doc/release-notes/release-notes-2.0.7-1.md create mode 100644 doc/release-notes/release-notes-2.0.7-2.md create mode 100644 doc/release-notes/release-notes-2.0.7-3.md create mode 100644 doc/release-notes/release-notes-2.0.7-rc1.md create mode 100644 doc/release-notes/release-notes-2.0.7.md create mode 100644 doc/release-notes/release-notes-2.1.0-1.md create mode 100644 doc/release-notes/release-notes-2.1.0-rc1.md create mode 100644 doc/release-notes/release-notes-2.1.0.md create mode 100644 doc/release-notes/release-notes-2.1.1-1.md create mode 100644 doc/release-notes/release-notes-2.1.1-rc1.md create mode 100644 doc/release-notes/release-notes-2.1.1-rc2.md create mode 100644 doc/release-notes/release-notes-2.1.1.md create mode 100644 doc/release-notes/release-notes-2.1.2-1.md create mode 100644 doc/release-notes/release-notes-2.1.2-2.md create mode 100644 doc/release-notes/release-notes-2.1.2-3.md create mode 100644 doc/release-notes/release-notes-2.1.2-rc1.md create mode 100644 doc/release-notes/release-notes-2.1.2.md create mode 100644 doc/release-notes/release-notes-3.0.0-rc1.md create mode 100644 doc/release-notes/release-notes-3.0.0.md create mode 100644 doc/release-notes/release-notes-3.1.0-rc1.md create mode 100644 doc/release-notes/release-notes-3.1.0-rc2.md create mode 100644 doc/release-notes/release-notes-3.1.0.md create mode 100644 doc/release-notes/release-notes-4.0.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.0.0.md create mode 100644 doc/release-notes/release-notes-4.1.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.1.0.md create mode 100644 doc/release-notes/release-notes-4.1.1.md create mode 100644 doc/release-notes/release-notes-4.2.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.2.0.md create mode 100644 doc/release-notes/release-notes-4.3.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.3.0.md create mode 100644 doc/release-notes/release-notes-4.4.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.4.0.md create mode 100644 doc/release-notes/release-notes-4.4.1-rc1.md create mode 100644 doc/release-notes/release-notes-4.4.1.md create mode 100644 doc/release-notes/release-notes-4.5.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.5.0.md create mode 100644 doc/release-notes/release-notes-4.5.1-1.md create mode 100644 doc/release-notes/release-notes-4.5.1.md create mode 100644 doc/release-notes/release-notes-4.6.0-1.md create mode 100644 doc/release-notes/release-notes-4.6.0-2.md create mode 100644 doc/release-notes/release-notes-4.6.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.6.0.md create mode 100644 doc/release-notes/release-notes-4.7.0-rc1.md create mode 100644 doc/release-notes/release-notes-4.7.0.md create mode 100644 doc/release-notes/release-notes-5.0.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.0.0.md create mode 100644 doc/release-notes/release-notes-5.1.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.1.0.md create mode 100644 doc/release-notes/release-notes-5.2.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.2.0.md create mode 100644 doc/release-notes/release-notes-5.3.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.3.0.md create mode 100644 doc/release-notes/release-notes-5.3.1-rc1.md create mode 100644 doc/release-notes/release-notes-5.3.1.md create mode 100644 doc/release-notes/release-notes-5.3.2.md create mode 100644 doc/release-notes/release-notes-5.3.3.md create mode 100644 doc/release-notes/release-notes-5.4.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.4.0-rc2.md create mode 100644 doc/release-notes/release-notes-5.4.0-rc3.md create mode 100644 doc/release-notes/release-notes-5.4.0-rc4.md create mode 100644 doc/release-notes/release-notes-5.4.0.md create mode 100644 doc/release-notes/release-notes-5.4.1.md create mode 100644 doc/release-notes/release-notes-5.4.2.md create mode 100644 doc/release-notes/release-notes-5.5.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.5.0-rc2.md create mode 100644 doc/release-notes/release-notes-5.5.0-rc3.md create mode 100644 doc/release-notes/release-notes-5.5.0.md create mode 100644 doc/release-notes/release-notes-5.5.1.md create mode 100644 doc/release-notes/release-notes-5.6.0-rc1.md create mode 100644 doc/release-notes/release-notes-5.6.0.md create mode 100644 doc/release-notes/release-notes-5.6.1.md create mode 100644 doc/release-process.md create mode 100644 doc/translation_strings_policy.md create mode 100644 doc/unit-tests.md create mode 100644 doc/zmq.md create mode 100644 libzcash_script.pc.in create mode 100644 qa/README.md create mode 100755 qa/pull-tester/rpc-tests.py create mode 100644 qa/pull-tester/tests_config.ini.in create mode 100644 qa/rpc-tests/.gitignore create mode 100644 qa/rpc-tests/README.md create mode 100755 qa/rpc-tests/addressindex.py create mode 100755 qa/rpc-tests/bip65-cltv-p2p.py create mode 100755 qa/rpc-tests/bipdersig-p2p.py create mode 100755 qa/rpc-tests/blockchain.py create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/cache_config.json create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/chain_cache.tar.gz create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/node0_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/node1_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/node2_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/golden-v5.6.0/node3_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/sprout/README.md create mode 100644 qa/rpc-tests/cache/sprout/chain_cache.tar.gz create mode 100644 qa/rpc-tests/cache/sprout/node0_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/sprout/node1_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/sprout/node2_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/sprout/node3_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/cache_config.json create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/chain_cache.tar.gz create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/node0_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/node1_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/node2_wallet.tar.gz create mode 100644 qa/rpc-tests/cache/tarnished-v5.6.0/node3_wallet.tar.gz create mode 100755 qa/rpc-tests/coinbase_funding_streams.py create mode 100755 qa/rpc-tests/create_cache.py create mode 100755 qa/rpc-tests/decodescript.py create mode 100755 qa/rpc-tests/disablewallet.py create mode 100755 qa/rpc-tests/errors.py create mode 100755 qa/rpc-tests/feature_logging.py create mode 100755 qa/rpc-tests/feature_walletfile.py create mode 100755 qa/rpc-tests/feature_zip221.py create mode 100755 qa/rpc-tests/feature_zip239.py create mode 100755 qa/rpc-tests/feature_zip244_blockcommitments.py create mode 100755 qa/rpc-tests/finalorchardroot.py create mode 100755 qa/rpc-tests/finalsaplingroot.py create mode 100755 qa/rpc-tests/forknotify.py create mode 100755 qa/rpc-tests/framework.py create mode 100755 qa/rpc-tests/fundrawtransaction.py create mode 100755 qa/rpc-tests/getblocktemplate.py create mode 100755 qa/rpc-tests/getblocktemplate_longpoll.py create mode 100755 qa/rpc-tests/getblocktemplate_proposals.py create mode 100755 qa/rpc-tests/getchaintips.py create mode 100755 qa/rpc-tests/getmininginfo.py create mode 100755 qa/rpc-tests/getrawtransaction_insight.py create mode 100644 qa/rpc-tests/golden/blossom.tar.gz create mode 100644 qa/rpc-tests/golden/heartwood.tar.gz create mode 100755 qa/rpc-tests/hardforkdetection.py create mode 100755 qa/rpc-tests/httpbasics.py create mode 100755 qa/rpc-tests/invalidateblock.py create mode 100755 qa/rpc-tests/invalidblockrequest.py create mode 100755 qa/rpc-tests/invalidtxrequest.py create mode 100755 qa/rpc-tests/key_import_export.py create mode 100755 qa/rpc-tests/keypool.py create mode 100755 qa/rpc-tests/listtransactions.py create mode 100755 qa/rpc-tests/maxblocksinflight.py create mode 100755 qa/rpc-tests/maxuploadtarget.py create mode 100755 qa/rpc-tests/mempool_limit.py create mode 100755 qa/rpc-tests/mempool_nu_activation.py create mode 100755 qa/rpc-tests/mempool_packages.py create mode 100755 qa/rpc-tests/mempool_reorg.py create mode 100755 qa/rpc-tests/mempool_resurrect_test.py create mode 100755 qa/rpc-tests/mempool_spendcoinbase.py create mode 100755 qa/rpc-tests/mempool_tx_expiry.py create mode 100755 qa/rpc-tests/mergetoaddress_helper.py create mode 100755 qa/rpc-tests/mergetoaddress_mixednotes.py create mode 100755 qa/rpc-tests/mergetoaddress_sapling.py create mode 100755 qa/rpc-tests/mergetoaddress_ua_nu5.py create mode 100755 qa/rpc-tests/mergetoaddress_ua_sapling.py create mode 100755 qa/rpc-tests/merkle_blocks.py create mode 100755 qa/rpc-tests/mining_shielded_coinbase.py create mode 100755 qa/rpc-tests/multi_rpc.py create mode 100755 qa/rpc-tests/nodehandling.py create mode 100755 qa/rpc-tests/nuparams.py create mode 100755 qa/rpc-tests/orchard_reorg.py create mode 100755 qa/rpc-tests/p2p-acceptblock.py create mode 100755 qa/rpc-tests/p2p-fullblocktest.py create mode 100755 qa/rpc-tests/p2p_node_bloom.py create mode 100755 qa/rpc-tests/p2p_nu_peer_management.py create mode 100755 qa/rpc-tests/p2p_txexpiringsoon.py create mode 100755 qa/rpc-tests/p2p_txexpiry_dos.py create mode 100755 qa/rpc-tests/post_heartwood_rollback.py create mode 100755 qa/rpc-tests/prioritisetransaction.py create mode 100755 qa/rpc-tests/proxy_test.py create mode 100755 qa/rpc-tests/pruning.py create mode 100755 qa/rpc-tests/rawtransactions.py create mode 100755 qa/rpc-tests/receivedby.py create mode 100755 qa/rpc-tests/regtest_signrawtransaction.py create mode 100755 qa/rpc-tests/reindex.py create mode 100755 qa/rpc-tests/remove_sprout_shielding.py create mode 100755 qa/rpc-tests/reorg_limit.py create mode 100755 qa/rpc-tests/rest.py create mode 100755 qa/rpc-tests/rewind_index.py create mode 100755 qa/rpc-tests/rpcbind_test.py create mode 100755 qa/rpc-tests/sapling_rewind_check.py create mode 100755 qa/rpc-tests/shorter_block_times.py create mode 100755 qa/rpc-tests/show_help.py create mode 100755 qa/rpc-tests/signrawtransaction_offline.py create mode 100755 qa/rpc-tests/signrawtransactions.py create mode 100755 qa/rpc-tests/spentindex.py create mode 100755 qa/rpc-tests/sprout_sapling_migration.py create mode 100644 qa/rpc-tests/test_framework/__init__.py create mode 100644 qa/rpc-tests/test_framework/authproxy.py create mode 100644 qa/rpc-tests/test_framework/bignum.py create mode 100644 qa/rpc-tests/test_framework/blockstore.py create mode 100644 qa/rpc-tests/test_framework/blocktools.py create mode 100755 qa/rpc-tests/test_framework/comptool.py create mode 100644 qa/rpc-tests/test_framework/coverage.py create mode 100755 qa/rpc-tests/test_framework/equihash.py create mode 100644 qa/rpc-tests/test_framework/flyclient.py create mode 100644 qa/rpc-tests/test_framework/key.py create mode 100755 qa/rpc-tests/test_framework/mininode.py create mode 100644 qa/rpc-tests/test_framework/netutil.py create mode 100644 qa/rpc-tests/test_framework/script.py create mode 100644 qa/rpc-tests/test_framework/socks5.py create mode 100755 qa/rpc-tests/test_framework/test_framework.py create mode 100644 qa/rpc-tests/test_framework/util.py create mode 100644 qa/rpc-tests/test_framework/zip244.py create mode 100644 qa/rpc-tests/test_framework/zip317.py create mode 100755 qa/rpc-tests/threeofthreerestore.py create mode 100755 qa/rpc-tests/timestampindex.py create mode 100755 qa/rpc-tests/turnstile.py create mode 100755 qa/rpc-tests/tx_expiry_helper.py create mode 100755 qa/rpc-tests/txn_doublespend.py create mode 100755 qa/rpc-tests/upgrade_golden.py create mode 100755 qa/rpc-tests/wallet.py create mode 100755 qa/rpc-tests/wallet_1941.py create mode 100755 qa/rpc-tests/wallet_accounts.py create mode 100755 qa/rpc-tests/wallet_addresses.py create mode 100755 qa/rpc-tests/wallet_anchorfork.py create mode 100755 qa/rpc-tests/wallet_broadcast.py create mode 100755 qa/rpc-tests/wallet_changeaddresses.py create mode 100755 qa/rpc-tests/wallet_changeindicator.py create mode 100755 qa/rpc-tests/wallet_db_flush.py create mode 100755 qa/rpc-tests/wallet_deprecation.py create mode 100755 qa/rpc-tests/wallet_doublespend.py create mode 100755 qa/rpc-tests/wallet_golden_5_6_0.py create mode 100755 qa/rpc-tests/wallet_import_export.py create mode 100755 qa/rpc-tests/wallet_isfromme.py create mode 100755 qa/rpc-tests/wallet_listnotes.py create mode 100755 qa/rpc-tests/wallet_listreceived.py create mode 100755 qa/rpc-tests/wallet_listunspent.py create mode 100755 qa/rpc-tests/wallet_nullifiers.py create mode 100755 qa/rpc-tests/wallet_orchard.py create mode 100755 qa/rpc-tests/wallet_orchard_change.py create mode 100755 qa/rpc-tests/wallet_orchard_init.py create mode 100755 qa/rpc-tests/wallet_orchard_persistence.py create mode 100755 qa/rpc-tests/wallet_orchard_reindex.py create mode 100755 qa/rpc-tests/wallet_overwintertx.py create mode 100755 qa/rpc-tests/wallet_parsing_amounts.py create mode 100755 qa/rpc-tests/wallet_persistence.py create mode 100755 qa/rpc-tests/wallet_sapling.py create mode 100755 qa/rpc-tests/wallet_sendmany_any_taddr.py create mode 100755 qa/rpc-tests/wallet_shieldcoinbase.py create mode 100755 qa/rpc-tests/wallet_shieldcoinbase_sapling.py create mode 100755 qa/rpc-tests/wallet_shieldcoinbase_ua_nu5.py create mode 100755 qa/rpc-tests/wallet_shieldcoinbase_ua_sapling.py create mode 100755 qa/rpc-tests/wallet_shieldingcoinbase.py create mode 100755 qa/rpc-tests/wallet_tarnished_5_6_0.py create mode 100755 qa/rpc-tests/wallet_treestate.py create mode 100755 qa/rpc-tests/wallet_unified_change.py create mode 100755 qa/rpc-tests/wallet_z_sendmany.py create mode 100755 qa/rpc-tests/wallet_zero_value.py create mode 100755 qa/rpc-tests/walletbackup.py create mode 100755 qa/rpc-tests/zapwallettxes.py create mode 100755 qa/rpc-tests/zkey_import_export.py create mode 100755 qa/rpc-tests/zmq_test.py create mode 100644 qa/supply-chain/audits.toml create mode 100644 qa/supply-chain/config.toml create mode 100644 qa/supply-chain/imports.lock create mode 100755 qa/zcash/checksec.sh create mode 100644 qa/zcash/create_benchmark_archive.py create mode 100755 qa/zcash/create_wallet_200k_utxos.py create mode 100755 qa/zcash/full_test_suite.py create mode 100755 qa/zcash/performance-measurements.sh create mode 100644 qa/zcash/postponed-updates.txt create mode 100755 qa/zcash/smoke_tests.py create mode 100755 qa/zcash/test-depends-sources-mirror.py create mode 100755 qa/zcash/updatecheck.py create mode 100644 rust-toolchain.toml create mode 100755 share/genbuild.sh create mode 100644 share/rpcuser/README.md create mode 100755 share/rpcuser/rpcuser.py create mode 100644 src/.clang-format create mode 100644 src/Makefile.am create mode 100644 src/Makefile.bench.include create mode 100644 src/Makefile.crc32c.include create mode 100644 src/Makefile.gtest.include create mode 100644 src/Makefile.leveldb.include create mode 100644 src/Makefile.test.include create mode 100644 src/addrdb.cpp create mode 100644 src/addrdb.h create mode 100644 src/addressindex.h create mode 100644 src/addrman.cpp create mode 100644 src/addrman.h create mode 100644 src/alert.cpp create mode 100644 src/alert.h create mode 100644 src/alertkeys.h create mode 100644 src/amount.cpp create mode 100644 src/amount.h create mode 100644 src/arith_uint256.cpp create mode 100644 src/arith_uint256.h create mode 100644 src/asyncrpcoperation.cpp create mode 100644 src/asyncrpcoperation.h create mode 100644 src/asyncrpcqueue.cpp create mode 100644 src/asyncrpcqueue.h create mode 100644 src/base58.cpp create mode 100644 src/base58.h create mode 100644 src/bech32.cpp create mode 100644 src/bech32.h create mode 100644 src/bench/.gitignore create mode 100644 src/bench/Examples.cpp create mode 100644 src/bench/base58.cpp create mode 100644 src/bench/bench.cpp create mode 100644 src/bench/bench.h create mode 100644 src/bench/bench_bitcoin.cpp create mode 100644 src/bench/checkqueue.cpp create mode 100644 src/bench/crypto_hash.cpp create mode 100644 src/bench/lockedpool.cpp create mode 100644 src/bench/merkle_root.cpp create mode 100644 src/bench/perf.cpp create mode 100644 src/bench/perf.h create mode 100644 src/bench/prevector_destructor.cpp create mode 100644 src/bench/rollingbloom.cpp create mode 100644 src/bench/verification.cpp create mode 100644 src/bitcoin-cli-res.rc create mode 100644 src/bitcoin-cli.cpp create mode 100644 src/bitcoin-tx-res.rc create mode 100644 src/bitcoin-tx.cpp create mode 100644 src/bitcoind-res.rc create mode 100644 src/bitcoind.cpp create mode 100644 src/bloom.cpp create mode 100644 src/bloom.h create mode 100644 src/chain.cpp create mode 100644 src/chain.h create mode 100644 src/chainparams.cpp create mode 100644 src/chainparams.h create mode 100644 src/chainparamsbase.cpp create mode 100644 src/chainparamsbase.h create mode 100644 src/chainparamsseeds.h create mode 100644 src/checkpoints.cpp create mode 100644 src/checkpoints.h create mode 100644 src/checkqueue.h create mode 100644 src/clientversion.cpp create mode 100644 src/clientversion.h create mode 100644 src/coincontrol.h create mode 100644 src/coins.cpp create mode 100644 src/coins.h create mode 100644 src/compat.h create mode 100644 src/compat/byteswap.h create mode 100644 src/compat/endian.h create mode 100644 src/compat/glibc_compat.cpp create mode 100644 src/compat/glibc_sanity.cpp create mode 100644 src/compat/glibcxx_sanity.cpp create mode 100644 src/compat/sanity.h create mode 100644 src/compat/strnlen.cpp create mode 100644 src/compressor.cpp create mode 100644 src/compressor.h create mode 100644 src/config/.empty create mode 100644 src/consensus/consensus.h create mode 100644 src/consensus/funding.cpp create mode 100644 src/consensus/funding.h create mode 100644 src/consensus/merkle.cpp create mode 100644 src/consensus/merkle.h create mode 100644 src/consensus/params.cpp create mode 100644 src/consensus/params.h create mode 100644 src/consensus/upgrades.cpp create mode 100644 src/consensus/upgrades.h create mode 100644 src/consensus/validation.h create mode 100644 src/core_io.h create mode 100644 src/core_memusage.h create mode 100644 src/core_read.cpp create mode 100644 src/core_write.cpp create mode 100644 src/crc32c/.appveyor.yml create mode 100644 src/crc32c/.clang-format create mode 100644 src/crc32c/.clang_complete create mode 100644 src/crc32c/.gitignore create mode 100644 src/crc32c/.gitmodules create mode 100644 src/crc32c/.travis.yml create mode 100644 src/crc32c/.ycm_extra_conf.py create mode 100644 src/crc32c/AUTHORS create mode 100644 src/crc32c/CMakeLists.txt create mode 100644 src/crc32c/CONTRIBUTING.md create mode 100644 src/crc32c/Crc32cConfig.cmake create mode 100644 src/crc32c/LICENSE create mode 100644 src/crc32c/README.md create mode 100644 src/crc32c/include/crc32c/crc32c.h create mode 100644 src/crc32c/src/crc32c.cc create mode 100644 src/crc32c/src/crc32c_arm64.cc create mode 100644 src/crc32c/src/crc32c_arm64.h create mode 100644 src/crc32c/src/crc32c_arm64_linux_check.h create mode 100644 src/crc32c/src/crc32c_arm64_unittest.cc create mode 100644 src/crc32c/src/crc32c_benchmark.cc create mode 100644 src/crc32c/src/crc32c_capi_unittest.c create mode 100644 src/crc32c/src/crc32c_config.h.in create mode 100644 src/crc32c/src/crc32c_extend_unittests.h create mode 100644 src/crc32c/src/crc32c_internal.h create mode 100644 src/crc32c/src/crc32c_portable.cc create mode 100644 src/crc32c/src/crc32c_portable_unittest.cc create mode 100644 src/crc32c/src/crc32c_prefetch.h create mode 100644 src/crc32c/src/crc32c_prefetch_unittest.cc create mode 100644 src/crc32c/src/crc32c_read_le.h create mode 100644 src/crc32c/src/crc32c_read_le_unittest.cc create mode 100644 src/crc32c/src/crc32c_round_up.h create mode 100644 src/crc32c/src/crc32c_round_up_unittest.cc create mode 100644 src/crc32c/src/crc32c_sse42.cc create mode 100644 src/crc32c/src/crc32c_sse42.h create mode 100644 src/crc32c/src/crc32c_sse42_check.h create mode 100644 src/crc32c/src/crc32c_sse42_unittest.cc create mode 100644 src/crc32c/src/crc32c_test_main.cc create mode 100644 src/crc32c/src/crc32c_unittest.cc create mode 100644 src/crypto/aes.cpp create mode 100644 src/crypto/aes.h create mode 100644 src/crypto/chacha20.cpp create mode 100644 src/crypto/chacha20.h create mode 100644 src/crypto/common.h create mode 100644 src/crypto/ctaes/COPYING create mode 100644 src/crypto/ctaes/README.md create mode 100644 src/crypto/ctaes/bench.c create mode 100644 src/crypto/ctaes/ctaes.c create mode 100644 src/crypto/ctaes/ctaes.h create mode 100644 src/crypto/ctaes/test.c create mode 100644 src/crypto/equihash.cpp create mode 100644 src/crypto/equihash.h create mode 100644 src/crypto/equihash.tcc create mode 100644 src/crypto/hmac_sha256.cpp create mode 100644 src/crypto/hmac_sha256.h create mode 100644 src/crypto/hmac_sha512.cpp create mode 100644 src/crypto/hmac_sha512.h create mode 100644 src/crypto/ripemd160.cpp create mode 100644 src/crypto/ripemd160.h create mode 100644 src/crypto/sha1.cpp create mode 100644 src/crypto/sha1.h create mode 100644 src/crypto/sha256.cpp create mode 100644 src/crypto/sha256.h create mode 100644 src/crypto/sha256_avx2.cpp create mode 100644 src/crypto/sha256_shani.cpp create mode 100644 src/crypto/sha256_sse4.cpp create mode 100644 src/crypto/sha256_sse41.cpp create mode 100644 src/crypto/sha512.cpp create mode 100644 src/crypto/sha512.h create mode 100644 src/cuckoocache.h create mode 100644 src/dbwrapper.cpp create mode 100644 src/dbwrapper.h create mode 100644 src/deprecation.cpp create mode 100644 src/deprecation.h create mode 100644 src/experimental_features.cpp create mode 100644 src/experimental_features.h create mode 100644 src/fs.cpp create mode 100644 src/fs.h create mode 100644 src/fuzzing/CheckBlock/fuzz.cpp create mode 100644 src/fuzzing/CheckBlock/input/0.bin create mode 100644 src/fuzzing/CheckBlock/input/476431.bin create mode 100644 src/fuzzing/CheckBlock/input/620000.bin create mode 100644 src/fuzzing/DecodeHexTx/fuzz.cpp create mode 100644 src/fuzzing/DecodeHexTx/input/coinbase.txt create mode 100644 src/fuzzing/DecodeHexTx/input/manyoutputs.txt create mode 100644 src/fuzzing/DecodeHexTx/input/sapling.txt create mode 100644 src/fuzzing/DecodeHexTx/input/sprout.txt create mode 100644 src/fuzzing/DeserializeAddrMan/fuzz.cpp create mode 100644 src/fuzzing/DeserializeAddrMan/input/peers.dat-minus-4-byte-header create mode 100644 src/fuzzing/DeserializeTx/fuzz.cpp create mode 100644 src/fuzzing/DeserializeTx/input/coinbase.bin create mode 100644 src/fuzzing/DeserializeTx/input/manyoutputs.bin create mode 100644 src/fuzzing/DeserializeTx/input/sapling.bin create mode 100644 src/fuzzing/DeserializeTx/input/sprout.bin create mode 100644 src/fuzzing/UniValue__Read/dict create mode 100644 src/fuzzing/UniValue__Read/fuzz.cpp create mode 100644 src/fuzzing/UniValue__Read/input/fail1.json create mode 100644 src/fuzzing/UniValue__Read/input/fail10.json create mode 100644 src/fuzzing/UniValue__Read/input/fail11.json create mode 100644 src/fuzzing/UniValue__Read/input/fail12.json create mode 100644 src/fuzzing/UniValue__Read/input/fail13.json create mode 100644 src/fuzzing/UniValue__Read/input/fail14.json create mode 100644 src/fuzzing/UniValue__Read/input/fail15.json create mode 100644 src/fuzzing/UniValue__Read/input/fail16.json create mode 100644 src/fuzzing/UniValue__Read/input/fail17.json create mode 100644 src/fuzzing/UniValue__Read/input/fail18.json create mode 100644 src/fuzzing/UniValue__Read/input/fail19.json create mode 100644 src/fuzzing/UniValue__Read/input/fail2.json create mode 100644 src/fuzzing/UniValue__Read/input/fail20.json create mode 100644 src/fuzzing/UniValue__Read/input/fail21.json create mode 100644 src/fuzzing/UniValue__Read/input/fail22.json create mode 100644 src/fuzzing/UniValue__Read/input/fail23.json create mode 100644 src/fuzzing/UniValue__Read/input/fail24.json create mode 100644 src/fuzzing/UniValue__Read/input/fail25.json create mode 100644 src/fuzzing/UniValue__Read/input/fail26.json create mode 100644 src/fuzzing/UniValue__Read/input/fail27.json create mode 100644 src/fuzzing/UniValue__Read/input/fail28.json create mode 100644 src/fuzzing/UniValue__Read/input/fail29.json create mode 100644 src/fuzzing/UniValue__Read/input/fail3.json create mode 100644 src/fuzzing/UniValue__Read/input/fail30.json create mode 100644 src/fuzzing/UniValue__Read/input/fail31.json create mode 100644 src/fuzzing/UniValue__Read/input/fail32.json create mode 100644 src/fuzzing/UniValue__Read/input/fail33.json create mode 100644 src/fuzzing/UniValue__Read/input/fail34.json create mode 100644 src/fuzzing/UniValue__Read/input/fail35.json create mode 100644 src/fuzzing/UniValue__Read/input/fail36.json create mode 100644 src/fuzzing/UniValue__Read/input/fail37.json create mode 100644 src/fuzzing/UniValue__Read/input/fail38.json create mode 100644 src/fuzzing/UniValue__Read/input/fail39.json create mode 100644 src/fuzzing/UniValue__Read/input/fail4.json create mode 100644 src/fuzzing/UniValue__Read/input/fail40.json create mode 100644 src/fuzzing/UniValue__Read/input/fail41.json create mode 100644 src/fuzzing/UniValue__Read/input/fail42.json create mode 100644 src/fuzzing/UniValue__Read/input/fail5.json create mode 100644 src/fuzzing/UniValue__Read/input/fail6.json create mode 100644 src/fuzzing/UniValue__Read/input/fail7.json create mode 100644 src/fuzzing/UniValue__Read/input/fail8.json create mode 100644 src/fuzzing/UniValue__Read/input/fail9.json create mode 100644 src/fuzzing/UniValue__Read/input/pass1.json create mode 100644 src/fuzzing/UniValue__Read/input/pass2.json create mode 100644 src/fuzzing/UniValue__Read/input/pass3.json create mode 100644 src/fuzzing/UniValue__Read/input/round1.json create mode 100644 src/fuzzing/UniValue__Read/input/round2.json create mode 100644 src/fuzzing/UniValue__Read/input/round3.json create mode 100644 src/fuzzing/UniValue__Read/input/round4.json create mode 100644 src/fuzzing/UniValue__Read/input/round5.json create mode 100644 src/fuzzing/UniValue__Read/input/round6.json create mode 100644 src/fuzzing/UniValue__Read/input/round7.json create mode 100644 src/gtest/data/tx-orchard-duplicate-nullifiers.h create mode 100644 src/gtest/json_test_vectors.cpp create mode 100644 src/gtest/json_test_vectors.h create mode 100644 src/gtest/main.cpp create mode 100644 src/gtest/test_allocator.cpp create mode 100644 src/gtest/test_block.cpp create mode 100644 src/gtest/test_checkblock.cpp create mode 100644 src/gtest/test_checktransaction.cpp create mode 100644 src/gtest/test_coins.cpp create mode 100644 src/gtest/test_consensus.cpp create mode 100644 src/gtest/test_deprecation.cpp create mode 100644 src/gtest/test_dynamicusage.cpp create mode 100644 src/gtest/test_equihash.cpp create mode 100644 src/gtest/test_feature_flagging.cpp create mode 100644 src/gtest/test_foundersreward.cpp create mode 100644 src/gtest/test_history.cpp create mode 100644 src/gtest/test_httprpc.cpp create mode 100644 src/gtest/test_joinsplit.cpp create mode 100644 src/gtest/test_keys.cpp create mode 100644 src/gtest/test_keystore.cpp create mode 100644 src/gtest/test_libzcash_utils.cpp create mode 100644 src/gtest/test_mempool.cpp create mode 100644 src/gtest/test_mempoollimit.cpp create mode 100644 src/gtest/test_merkletree.cpp create mode 100644 src/gtest/test_metrics.cpp create mode 100644 src/gtest/test_miner.cpp create mode 100644 src/gtest/test_noteencryption.cpp create mode 100644 src/gtest/test_pedersen_hash.cpp create mode 100644 src/gtest/test_pow.cpp create mode 100644 src/gtest/test_random.cpp create mode 100644 src/gtest/test_rpc.cpp create mode 100644 src/gtest/test_sapling_note.cpp create mode 100644 src/gtest/test_sighash.cpp create mode 100644 src/gtest/test_tautology.cpp create mode 100644 src/gtest/test_timedata.cpp create mode 100644 src/gtest/test_transaction.cpp create mode 100644 src/gtest/test_transaction_builder.cpp create mode 100644 src/gtest/test_transaction_builder.h create mode 100644 src/gtest/test_txid.cpp create mode 100644 src/gtest/test_upgrades.cpp create mode 100644 src/gtest/test_util_string.cpp create mode 100644 src/gtest/test_validation.cpp create mode 100644 src/gtest/test_weightedmap.cpp create mode 100644 src/gtest/test_zip32.cpp create mode 100644 src/gtest/utils.cpp create mode 100644 src/gtest/utils.h create mode 100644 src/hash.cpp create mode 100644 src/hash.h create mode 100644 src/httprpc.cpp create mode 100644 src/httprpc.h create mode 100644 src/httpserver.cpp create mode 100644 src/httpserver.h create mode 100644 src/init.cpp create mode 100644 src/init.h create mode 100644 src/int128.h create mode 100644 src/key.cpp create mode 100644 src/key.h create mode 100644 src/key_constants.h create mode 100644 src/key_io.cpp create mode 100644 src/key_io.h create mode 100644 src/keystore.cpp create mode 100644 src/keystore.h create mode 100644 src/leveldb/.appveyor.yml create mode 100644 src/leveldb/.clang-format create mode 100644 src/leveldb/.gitignore create mode 100644 src/leveldb/.travis.yml create mode 100644 src/leveldb/AUTHORS create mode 100644 src/leveldb/CMakeLists.txt create mode 100644 src/leveldb/CONTRIBUTING.md create mode 100644 src/leveldb/LICENSE create mode 100644 src/leveldb/NEWS create mode 100644 src/leveldb/README.md create mode 100644 src/leveldb/TODO create mode 100644 src/leveldb/benchmarks/db_bench.cc create mode 100644 src/leveldb/benchmarks/db_bench_sqlite3.cc create mode 100644 src/leveldb/benchmarks/db_bench_tree_db.cc create mode 100644 src/leveldb/cmake/leveldbConfig.cmake create mode 100644 src/leveldb/db/autocompact_test.cc create mode 100644 src/leveldb/db/builder.cc create mode 100644 src/leveldb/db/builder.h create mode 100644 src/leveldb/db/c.cc create mode 100644 src/leveldb/db/c_test.c create mode 100644 src/leveldb/db/corruption_test.cc create mode 100644 src/leveldb/db/db_impl.cc create mode 100644 src/leveldb/db/db_impl.h create mode 100644 src/leveldb/db/db_iter.cc create mode 100644 src/leveldb/db/db_iter.h create mode 100644 src/leveldb/db/db_test.cc create mode 100644 src/leveldb/db/dbformat.cc create mode 100644 src/leveldb/db/dbformat.h create mode 100644 src/leveldb/db/dbformat_test.cc create mode 100644 src/leveldb/db/dumpfile.cc create mode 100644 src/leveldb/db/fault_injection_test.cc create mode 100644 src/leveldb/db/filename.cc create mode 100644 src/leveldb/db/filename.h create mode 100644 src/leveldb/db/filename_test.cc create mode 100644 src/leveldb/db/leveldbutil.cc create mode 100644 src/leveldb/db/log_format.h create mode 100644 src/leveldb/db/log_reader.cc create mode 100644 src/leveldb/db/log_reader.h create mode 100644 src/leveldb/db/log_test.cc create mode 100644 src/leveldb/db/log_writer.cc create mode 100644 src/leveldb/db/log_writer.h create mode 100644 src/leveldb/db/memtable.cc create mode 100644 src/leveldb/db/memtable.h create mode 100644 src/leveldb/db/recovery_test.cc create mode 100644 src/leveldb/db/repair.cc create mode 100644 src/leveldb/db/skiplist.h create mode 100644 src/leveldb/db/skiplist_test.cc create mode 100644 src/leveldb/db/snapshot.h create mode 100644 src/leveldb/db/table_cache.cc create mode 100644 src/leveldb/db/table_cache.h create mode 100644 src/leveldb/db/version_edit.cc create mode 100644 src/leveldb/db/version_edit.h create mode 100644 src/leveldb/db/version_edit_test.cc create mode 100644 src/leveldb/db/version_set.cc create mode 100644 src/leveldb/db/version_set.h create mode 100644 src/leveldb/db/version_set_test.cc create mode 100644 src/leveldb/db/write_batch.cc create mode 100644 src/leveldb/db/write_batch_internal.h create mode 100644 src/leveldb/db/write_batch_test.cc create mode 100644 src/leveldb/doc/benchmark.html create mode 100644 src/leveldb/doc/impl.md create mode 100644 src/leveldb/doc/index.md create mode 100644 src/leveldb/doc/log_format.md create mode 100644 src/leveldb/doc/table_format.md create mode 100644 src/leveldb/helpers/memenv/memenv.cc create mode 100644 src/leveldb/helpers/memenv/memenv.h create mode 100644 src/leveldb/helpers/memenv/memenv_test.cc create mode 100644 src/leveldb/include/leveldb/c.h create mode 100644 src/leveldb/include/leveldb/cache.h create mode 100644 src/leveldb/include/leveldb/comparator.h create mode 100644 src/leveldb/include/leveldb/db.h create mode 100644 src/leveldb/include/leveldb/dumpfile.h create mode 100644 src/leveldb/include/leveldb/env.h create mode 100644 src/leveldb/include/leveldb/export.h create mode 100644 src/leveldb/include/leveldb/filter_policy.h create mode 100644 src/leveldb/include/leveldb/iterator.h create mode 100644 src/leveldb/include/leveldb/options.h create mode 100644 src/leveldb/include/leveldb/slice.h create mode 100644 src/leveldb/include/leveldb/status.h create mode 100644 src/leveldb/include/leveldb/table.h create mode 100644 src/leveldb/include/leveldb/table_builder.h create mode 100644 src/leveldb/include/leveldb/write_batch.h create mode 100644 src/leveldb/issues/issue178_test.cc create mode 100644 src/leveldb/issues/issue200_test.cc create mode 100644 src/leveldb/issues/issue320_test.cc create mode 100644 src/leveldb/port/README.md create mode 100644 src/leveldb/port/port.h create mode 100644 src/leveldb/port/port_config.h.in create mode 100644 src/leveldb/port/port_example.h create mode 100644 src/leveldb/port/port_stdcxx.h create mode 100644 src/leveldb/port/thread_annotations.h create mode 100644 src/leveldb/table/block.cc create mode 100644 src/leveldb/table/block.h create mode 100644 src/leveldb/table/block_builder.cc create mode 100644 src/leveldb/table/block_builder.h create mode 100644 src/leveldb/table/filter_block.cc create mode 100644 src/leveldb/table/filter_block.h create mode 100644 src/leveldb/table/filter_block_test.cc create mode 100644 src/leveldb/table/format.cc create mode 100644 src/leveldb/table/format.h create mode 100644 src/leveldb/table/iterator.cc create mode 100644 src/leveldb/table/iterator_wrapper.h create mode 100644 src/leveldb/table/merger.cc create mode 100644 src/leveldb/table/merger.h create mode 100644 src/leveldb/table/table.cc create mode 100644 src/leveldb/table/table_builder.cc create mode 100644 src/leveldb/table/table_test.cc create mode 100644 src/leveldb/table/two_level_iterator.cc create mode 100644 src/leveldb/table/two_level_iterator.h create mode 100644 src/leveldb/util/arena.cc create mode 100644 src/leveldb/util/arena.h create mode 100644 src/leveldb/util/arena_test.cc create mode 100644 src/leveldb/util/bloom.cc create mode 100644 src/leveldb/util/bloom_test.cc create mode 100644 src/leveldb/util/cache.cc create mode 100644 src/leveldb/util/cache_test.cc create mode 100644 src/leveldb/util/coding.cc create mode 100644 src/leveldb/util/coding.h create mode 100644 src/leveldb/util/coding_test.cc create mode 100644 src/leveldb/util/comparator.cc create mode 100644 src/leveldb/util/crc32c.cc create mode 100644 src/leveldb/util/crc32c.h create mode 100644 src/leveldb/util/crc32c_test.cc create mode 100644 src/leveldb/util/env.cc create mode 100644 src/leveldb/util/env_posix.cc create mode 100644 src/leveldb/util/env_posix_test.cc create mode 100644 src/leveldb/util/env_posix_test_helper.h create mode 100644 src/leveldb/util/env_test.cc create mode 100644 src/leveldb/util/env_windows.cc create mode 100644 src/leveldb/util/env_windows_test.cc create mode 100644 src/leveldb/util/env_windows_test_helper.h create mode 100644 src/leveldb/util/filter_policy.cc create mode 100644 src/leveldb/util/hash.cc create mode 100644 src/leveldb/util/hash.h create mode 100644 src/leveldb/util/hash_test.cc create mode 100644 src/leveldb/util/histogram.cc create mode 100644 src/leveldb/util/histogram.h create mode 100644 src/leveldb/util/logging.cc create mode 100644 src/leveldb/util/logging.h create mode 100644 src/leveldb/util/logging_test.cc create mode 100644 src/leveldb/util/mutexlock.h create mode 100644 src/leveldb/util/no_destructor.h create mode 100644 src/leveldb/util/no_destructor_test.cc create mode 100644 src/leveldb/util/options.cc create mode 100644 src/leveldb/util/posix_logger.h create mode 100644 src/leveldb/util/random.h create mode 100644 src/leveldb/util/status.cc create mode 100644 src/leveldb/util/status_test.cc create mode 100644 src/leveldb/util/testharness.cc create mode 100644 src/leveldb/util/testharness.h create mode 100644 src/leveldb/util/testutil.cc create mode 100644 src/leveldb/util/testutil.h create mode 100644 src/leveldb/util/windows_logger.h create mode 100644 src/limitedmap.h create mode 100644 src/logging.cpp create mode 100644 src/logging.h create mode 100644 src/main.cpp create mode 100644 src/main.h create mode 100644 src/mempool_limit.cpp create mode 100644 src/mempool_limit.h create mode 100644 src/memusage.h create mode 100644 src/merkleblock.cpp create mode 100644 src/merkleblock.h create mode 100644 src/metrics.cpp create mode 100644 src/metrics.h create mode 100644 src/miner.cpp create mode 100644 src/miner.h create mode 100644 src/net.cpp create mode 100644 src/net.h create mode 100644 src/netbase.cpp create mode 100644 src/netbase.h create mode 100644 src/noui.cpp create mode 100644 src/noui.h create mode 100644 src/obj/.gitignore create mode 100644 src/policy/policy.cpp create mode 100644 src/policy/policy.h create mode 100644 src/pow.cpp create mode 100644 src/pow.h create mode 100644 src/pow/tromp/equi.h create mode 100644 src/pow/tromp/equi_miner.h create mode 100644 src/pow/tromp/osx_barrier.h create mode 100644 src/prevector.h create mode 100644 src/primitives/block.cpp create mode 100644 src/primitives/block.h create mode 100644 src/primitives/orchard.h create mode 100644 src/primitives/sapling.h create mode 100644 src/primitives/transaction.cpp create mode 100644 src/primitives/transaction.h create mode 100644 src/primitives/tx_version_info.cpp create mode 100644 src/proof_verifier.cpp create mode 100644 src/proof_verifier.h create mode 100644 src/protocol.cpp create mode 100644 src/protocol.h create mode 100644 src/pubkey.cpp create mode 100644 src/pubkey.h create mode 100644 src/random.cpp create mode 100644 src/random.h create mode 100644 src/rest.cpp create mode 100644 src/reverse_iterator.h create mode 100644 src/reverselock.h create mode 100644 src/rpc/blockchain.cpp create mode 100644 src/rpc/client.cpp create mode 100644 src/rpc/client.h create mode 100644 src/rpc/common.h create mode 100644 src/rpc/mining.cpp create mode 100644 src/rpc/misc.cpp create mode 100644 src/rpc/net.cpp create mode 100644 src/rpc/protocol.cpp create mode 100644 src/rpc/protocol.h create mode 100644 src/rpc/rawtransaction.cpp create mode 100644 src/rpc/register.h create mode 100644 src/rpc/server.cpp create mode 100644 src/rpc/server.h create mode 100644 src/rust/README.md create mode 100644 src/rust/bin/inspect/address.rs create mode 100644 src/rust/bin/inspect/block.rs create mode 100644 src/rust/bin/inspect/context.rs create mode 100644 src/rust/bin/inspect/keys.rs create mode 100644 src/rust/bin/inspect/main.rs create mode 100644 src/rust/bin/inspect/transaction.rs create mode 100644 src/rust/bin/wallet_tool.rs create mode 100644 src/rust/include/librustzcash.h create mode 100644 src/rust/include/rust/VA_OPT.hpp create mode 100644 src/rust/include/rust/address.h create mode 100644 src/rust/include/rust/builder.h create mode 100644 src/rust/include/rust/constants.h create mode 100644 src/rust/include/rust/helpers.h create mode 100644 src/rust/include/rust/history.h create mode 100644 src/rust/include/rust/init.h create mode 100644 src/rust/include/rust/map.h create mode 100644 src/rust/include/rust/metrics.h create mode 100644 src/rust/include/rust/orchard.h create mode 100644 src/rust/include/rust/orchard/keys.h create mode 100644 src/rust/include/rust/orchard/wallet.h create mode 100644 src/rust/include/rust/streams.h create mode 100644 src/rust/include/rust/transaction.h create mode 100644 src/rust/include/rust/types.h create mode 100644 src/rust/include/rust/unified_keys.h create mode 100644 src/rust/include/rust/zip339.h create mode 100644 src/rust/include/tracing.h create mode 100644 src/rust/src/address_ffi.rs create mode 100644 src/rust/src/blake2b.rs create mode 100644 src/rust/src/bridge.rs create mode 100644 src/rust/src/builder_ffi.rs create mode 100644 src/rust/src/bundlecache.rs create mode 100644 src/rust/src/ed25519.rs create mode 100644 src/rust/src/equihash.rs create mode 100644 src/rust/src/history_ffi.rs create mode 100644 src/rust/src/incremental_merkle_tree.rs create mode 100644 src/rust/src/init_ffi.rs create mode 100644 src/rust/src/merkle_frontier.rs create mode 100644 src/rust/src/metrics_ffi.rs create mode 100644 src/rust/src/note_encryption.rs create mode 100644 src/rust/src/orchard_bundle.rs create mode 100644 src/rust/src/orchard_ffi.rs create mode 100644 src/rust/src/orchard_keys_ffi.rs create mode 100644 src/rust/src/params.rs create mode 100644 src/rust/src/rustzcash.rs create mode 100644 src/rust/src/sapling.rs create mode 100644 src/rust/src/streams.rs create mode 100644 src/rust/src/streams_ffi.rs create mode 100644 src/rust/src/test_harness_ffi.rs create mode 100644 src/rust/src/tests/key_agreement.rs create mode 100644 src/rust/src/tests/key_components.rs create mode 100644 src/rust/src/tests/mmr.rs create mode 100644 src/rust/src/tests/mod.rs create mode 100644 src/rust/src/tests/notes.rs create mode 100644 src/rust/src/tests/res/tree1023.dat create mode 100644 src/rust/src/tests/res/tree16.dat create mode 100644 src/rust/src/tests/signatures.rs create mode 100644 src/rust/src/tests/zip339.rs create mode 100644 src/rust/src/tracing_ffi.rs create mode 100644 src/rust/src/transaction_ffi.rs create mode 100644 src/rust/src/unified_keys_ffi.rs create mode 100644 src/rust/src/wallet.rs create mode 100644 src/rust/src/wallet_scanner.rs create mode 100644 src/rust/src/zcashd_orchard.rs create mode 100644 src/rust/src/zip339_ffi.rs create mode 100644 src/scheduler.cpp create mode 100644 src/scheduler.h create mode 100644 src/script/interpreter.cpp create mode 100644 src/script/interpreter.h create mode 100644 src/script/ismine.cpp create mode 100644 src/script/ismine.h create mode 100644 src/script/script.cpp create mode 100644 src/script/script.h create mode 100644 src/script/script_error.cpp create mode 100644 src/script/script_error.h create mode 100644 src/script/sigcache.cpp create mode 100644 src/script/sigcache.h create mode 100644 src/script/sign.cpp create mode 100644 src/script/sign.h create mode 100644 src/script/standard.cpp create mode 100644 src/script/standard.h create mode 100644 src/script/zcash_script.cpp create mode 100644 src/script/zcash_script.h create mode 100644 src/secp256k1/.cirrus.yml create mode 100644 src/secp256k1/.gitattributes create mode 100644 src/secp256k1/.gitignore create mode 100644 src/secp256k1/CHANGELOG.md create mode 100644 src/secp256k1/COPYING create mode 100644 src/secp256k1/Makefile.am create mode 100644 src/secp256k1/README.md create mode 100644 src/secp256k1/SECURITY.md create mode 100755 src/secp256k1/autogen.sh create mode 100644 src/secp256k1/build-aux/m4/bitcoin_secp.m4 create mode 100755 src/secp256k1/ci/cirrus.sh create mode 100644 src/secp256k1/ci/linux-debian.Dockerfile create mode 100644 src/secp256k1/configure.ac create mode 100644 src/secp256k1/contrib/lax_der_parsing.c create mode 100644 src/secp256k1/contrib/lax_der_parsing.h create mode 100644 src/secp256k1/contrib/lax_der_privatekey_parsing.c create mode 100644 src/secp256k1/contrib/lax_der_privatekey_parsing.h create mode 100644 src/secp256k1/doc/release-process.md create mode 100644 src/secp256k1/doc/safegcd_implementation.md create mode 100644 src/secp256k1/examples/EXAMPLES_COPYING create mode 100644 src/secp256k1/examples/ecdh.c create mode 100644 src/secp256k1/examples/ecdsa.c create mode 100644 src/secp256k1/examples/random.h create mode 100644 src/secp256k1/examples/schnorr.c create mode 100644 src/secp256k1/include/secp256k1.h create mode 100644 src/secp256k1/include/secp256k1_ecdh.h create mode 100644 src/secp256k1/include/secp256k1_extrakeys.h create mode 100644 src/secp256k1/include/secp256k1_preallocated.h create mode 100644 src/secp256k1/include/secp256k1_recovery.h create mode 100644 src/secp256k1/include/secp256k1_schnorrsig.h create mode 100644 src/secp256k1/libsecp256k1.pc.in create mode 100644 src/secp256k1/sage/gen_exhaustive_groups.sage create mode 100644 src/secp256k1/sage/gen_split_lambda_constants.sage create mode 100644 src/secp256k1/sage/group_prover.sage create mode 100644 src/secp256k1/sage/prove_group_implementations.sage create mode 100644 src/secp256k1/sage/secp256k1_params.sage create mode 100644 src/secp256k1/sage/weierstrass_prover.sage create mode 100644 src/secp256k1/src/asm/field_10x26_arm.s create mode 100644 src/secp256k1/src/assumptions.h create mode 100644 src/secp256k1/src/bench.c create mode 100644 src/secp256k1/src/bench.h create mode 100644 src/secp256k1/src/bench_ecmult.c create mode 100644 src/secp256k1/src/bench_internal.c create mode 100644 src/secp256k1/src/ecdsa.h create mode 100644 src/secp256k1/src/ecdsa_impl.h create mode 100644 src/secp256k1/src/eckey.h create mode 100644 src/secp256k1/src/eckey_impl.h create mode 100644 src/secp256k1/src/ecmult.h create mode 100644 src/secp256k1/src/ecmult_compute_table.h create mode 100644 src/secp256k1/src/ecmult_compute_table_impl.h create mode 100644 src/secp256k1/src/ecmult_const.h create mode 100644 src/secp256k1/src/ecmult_const_impl.h create mode 100644 src/secp256k1/src/ecmult_gen.h create mode 100644 src/secp256k1/src/ecmult_gen_compute_table.h create mode 100644 src/secp256k1/src/ecmult_gen_compute_table_impl.h create mode 100644 src/secp256k1/src/ecmult_gen_impl.h create mode 100644 src/secp256k1/src/ecmult_impl.h create mode 100644 src/secp256k1/src/field.h create mode 100644 src/secp256k1/src/field_10x26.h create mode 100644 src/secp256k1/src/field_10x26_impl.h create mode 100644 src/secp256k1/src/field_5x52.h create mode 100644 src/secp256k1/src/field_5x52_asm_impl.h create mode 100644 src/secp256k1/src/field_5x52_impl.h create mode 100644 src/secp256k1/src/field_5x52_int128_impl.h create mode 100644 src/secp256k1/src/field_impl.h create mode 100644 src/secp256k1/src/group.h create mode 100644 src/secp256k1/src/group_impl.h create mode 100644 src/secp256k1/src/hash.h create mode 100644 src/secp256k1/src/hash_impl.h create mode 100644 src/secp256k1/src/int128.h create mode 100644 src/secp256k1/src/int128_impl.h create mode 100644 src/secp256k1/src/int128_native.h create mode 100644 src/secp256k1/src/int128_native_impl.h create mode 100644 src/secp256k1/src/int128_struct.h create mode 100644 src/secp256k1/src/int128_struct_impl.h create mode 100644 src/secp256k1/src/modinv32.h create mode 100644 src/secp256k1/src/modinv32_impl.h create mode 100644 src/secp256k1/src/modinv64.h create mode 100644 src/secp256k1/src/modinv64_impl.h create mode 100644 src/secp256k1/src/modules/ecdh/Makefile.am.include create mode 100644 src/secp256k1/src/modules/ecdh/bench_impl.h create mode 100644 src/secp256k1/src/modules/ecdh/main_impl.h create mode 100644 src/secp256k1/src/modules/ecdh/tests_impl.h create mode 100644 src/secp256k1/src/modules/extrakeys/Makefile.am.include create mode 100644 src/secp256k1/src/modules/extrakeys/main_impl.h create mode 100644 src/secp256k1/src/modules/extrakeys/tests_exhaustive_impl.h create mode 100644 src/secp256k1/src/modules/extrakeys/tests_impl.h create mode 100644 src/secp256k1/src/modules/recovery/Makefile.am.include create mode 100644 src/secp256k1/src/modules/recovery/bench_impl.h create mode 100644 src/secp256k1/src/modules/recovery/main_impl.h create mode 100644 src/secp256k1/src/modules/recovery/tests_exhaustive_impl.h create mode 100644 src/secp256k1/src/modules/recovery/tests_impl.h create mode 100644 src/secp256k1/src/modules/schnorrsig/Makefile.am.include create mode 100644 src/secp256k1/src/modules/schnorrsig/bench_impl.h create mode 100644 src/secp256k1/src/modules/schnorrsig/main_impl.h create mode 100644 src/secp256k1/src/modules/schnorrsig/tests_exhaustive_impl.h create mode 100644 src/secp256k1/src/modules/schnorrsig/tests_impl.h create mode 100644 src/secp256k1/src/precompute_ecmult.c create mode 100644 src/secp256k1/src/precompute_ecmult_gen.c create mode 100644 src/secp256k1/src/precomputed_ecmult.c create mode 100644 src/secp256k1/src/precomputed_ecmult.h create mode 100644 src/secp256k1/src/precomputed_ecmult_gen.c create mode 100644 src/secp256k1/src/precomputed_ecmult_gen.h create mode 100644 src/secp256k1/src/scalar.h create mode 100644 src/secp256k1/src/scalar_4x64.h create mode 100644 src/secp256k1/src/scalar_4x64_impl.h create mode 100644 src/secp256k1/src/scalar_8x32.h create mode 100644 src/secp256k1/src/scalar_8x32_impl.h create mode 100644 src/secp256k1/src/scalar_impl.h create mode 100644 src/secp256k1/src/scalar_low.h create mode 100644 src/secp256k1/src/scalar_low_impl.h create mode 100644 src/secp256k1/src/scratch.h create mode 100644 src/secp256k1/src/scratch_impl.h create mode 100644 src/secp256k1/src/secp256k1.c create mode 100644 src/secp256k1/src/selftest.h create mode 100644 src/secp256k1/src/testrand.h create mode 100644 src/secp256k1/src/testrand_impl.h create mode 100644 src/secp256k1/src/tests.c create mode 100644 src/secp256k1/src/tests_exhaustive.c create mode 100644 src/secp256k1/src/util.h create mode 100644 src/secp256k1/src/valgrind_ctime_test.c create mode 100644 src/sendalert.cpp create mode 100644 src/serialize.h create mode 100644 src/spentindex.h create mode 100644 src/streams.h create mode 100644 src/streams_rust.cpp create mode 100644 src/streams_rust.h create mode 100644 src/support/allocators/secure.h create mode 100644 src/support/allocators/zeroafterfree.h create mode 100644 src/support/cleanse.cpp create mode 100644 src/support/cleanse.h create mode 100644 src/support/events.h create mode 100644 src/support/lockedpool.cpp create mode 100644 src/support/lockedpool.h create mode 100644 src/sync.cpp create mode 100644 src/sync.h create mode 100644 src/test/Checkpoints_tests.cpp create mode 100644 src/test/DoS_tests.cpp create mode 100644 src/test/Makefile create mode 100644 src/test/README.md create mode 100644 src/test/addrman_tests.cpp create mode 100644 src/test/alert_tests.cpp create mode 100644 src/test/allocator_tests.cpp create mode 100644 src/test/arith_uint256_tests.cpp create mode 100644 src/test/base32_tests.cpp create mode 100644 src/test/base58_tests.cpp create mode 100644 src/test/base64_tests.cpp create mode 100644 src/test/bctest.py create mode 100644 src/test/bech32_tests.cpp create mode 100644 src/test/bip32_tests.cpp create mode 100755 src/test/bitcoin-util-test.py create mode 100644 src/test/bloom_tests.cpp create mode 100644 src/test/buildenv.py.in create mode 100644 src/test/checkblock_tests.cpp create mode 100644 src/test/checkqueue_tests.cpp create mode 100644 src/test/coins_tests.cpp create mode 100644 src/test/compress_tests.cpp create mode 100644 src/test/convertbits_tests.cpp create mode 100644 src/test/crypto_tests.cpp create mode 100644 src/test/cuckoocache_tests.cpp create mode 100644 src/test/data/README.md create mode 100644 src/test/data/alertTests.raw create mode 100644 src/test/data/base58_encode_decode.json create mode 100644 src/test/data/base58_keys_invalid.json create mode 100644 src/test/data/base58_keys_valid.json create mode 100644 src/test/data/bitcoin-util-test.json create mode 100644 src/test/data/blanktx.hex create mode 100644 src/test/data/blanktx.json create mode 100644 src/test/data/merkle_commitments.json create mode 100644 src/test/data/merkle_commitments_sapling.json create mode 100644 src/test/data/merkle_path.json create mode 100644 src/test/data/merkle_path_sapling.json create mode 100644 src/test/data/merkle_roots.json create mode 100644 src/test/data/merkle_roots_orchard.h create mode 100644 src/test/data/merkle_roots_sapling.json create mode 100644 src/test/data/merkle_serialization.json create mode 100644 src/test/data/merkle_serialization_sapling.json create mode 100644 src/test/data/merkle_witness_serialization.json create mode 100644 src/test/data/merkle_witness_serialization_sapling.json create mode 100644 src/test/data/sapling_key_components.json create mode 100644 src/test/data/script_invalid.json create mode 100644 src/test/data/script_valid.json create mode 100644 src/test/data/sighash.json create mode 100644 src/test/data/tt-delin1-out.hex create mode 100644 src/test/data/tt-delin1-out.json create mode 100644 src/test/data/tt-delout1-out.hex create mode 100644 src/test/data/tt-delout1-out.json create mode 100644 src/test/data/tt-locktime317000-out.hex create mode 100644 src/test/data/tt-locktime317000-out.json create mode 100644 src/test/data/tx394b54bb.hex create mode 100644 src/test/data/tx_invalid.json create mode 100644 src/test/data/tx_valid.json create mode 100644 src/test/data/txcreate1.hex create mode 100644 src/test/data/txcreate1.json create mode 100644 src/test/data/txcreate2.hex create mode 100644 src/test/data/txcreate2.json create mode 100644 src/test/data/txcreatedata_seq0.hex create mode 100644 src/test/data/txcreatedata_seq0.json create mode 100644 src/test/data/txcreatedata_seq1.hex create mode 100644 src/test/data/txcreatedata_seq1.json create mode 100644 src/test/data/txcreatesign.hex create mode 100644 src/test/data/txcreatesign.json create mode 100644 src/test/data/unified_addrs.json create mode 100644 src/test/data/unified_full_viewing_keys.json create mode 100644 src/test/data/zip0244.json create mode 100644 src/test/dbwrapper_tests.cpp create mode 100644 src/test/equihash_tests.cpp create mode 100644 src/test/getarg_tests.cpp create mode 100644 src/test/hash_tests.cpp create mode 100644 src/test/key_tests.cpp create mode 100644 src/test/limitedmap_tests.cpp create mode 100644 src/test/main_tests.cpp create mode 100644 src/test/mempool_tests.cpp create mode 100644 src/test/merkle_tests.cpp create mode 100644 src/test/miner_tests.cpp create mode 100644 src/test/multisig_tests.cpp create mode 100644 src/test/net_tests.cpp create mode 100644 src/test/netbase_tests.cpp create mode 100644 src/test/pmt_tests.cpp create mode 100644 src/test/pow_tests.cpp create mode 100644 src/test/prevector_tests.cpp create mode 100644 src/test/raii_event_tests.cpp create mode 100644 src/test/random_tests.cpp create mode 100644 src/test/reverselock_tests.cpp create mode 100644 src/test/rpc_tests.cpp create mode 100644 src/test/sanity_tests.cpp create mode 100644 src/test/scheduler_tests.cpp create mode 100644 src/test/script_P2PKH_tests.cpp create mode 100644 src/test/script_P2SH_tests.cpp create mode 100644 src/test/script_standard_tests.cpp create mode 100644 src/test/script_tests.cpp create mode 100644 src/test/scriptnum10.h create mode 100644 src/test/scriptnum_tests.cpp create mode 100644 src/test/serialize_tests.cpp create mode 100644 src/test/sha256compress_tests.cpp create mode 100644 src/test/sighash_tests.cpp create mode 100644 src/test/sigopcount_tests.cpp create mode 100644 src/test/skiplist_tests.cpp create mode 100644 src/test/streams_tests.cpp create mode 100644 src/test/sync_tests.cpp create mode 100644 src/test/test_bitcoin.cpp create mode 100644 src/test/test_bitcoin.h create mode 100644 src/test/test_util.cpp create mode 100644 src/test/test_util.h create mode 100644 src/test/torcontrol_tests.cpp create mode 100644 src/test/transaction_tests.cpp create mode 100644 src/test/txvalidationcache_tests.cpp create mode 100644 src/test/uint256_tests.cpp create mode 100644 src/test/univalue_tests.cpp create mode 100644 src/test/util_tests.cpp create mode 100644 src/threadsafety.h create mode 100644 src/timedata.cpp create mode 100644 src/timedata.h create mode 100644 src/timestampindex.h create mode 100644 src/tinyformat.h create mode 100644 src/torcontrol.cpp create mode 100644 src/torcontrol.h create mode 100644 src/transaction_builder.cpp create mode 100644 src/transaction_builder.h create mode 100644 src/txdb.cpp create mode 100644 src/txdb.h create mode 100644 src/txmempool.cpp create mode 100644 src/txmempool.h create mode 100644 src/ui_interface.h create mode 100644 src/uint252.h create mode 100644 src/uint256.cpp create mode 100644 src/uint256.h create mode 100644 src/undo.h create mode 100644 src/univalue/.gitignore create mode 100644 src/univalue/.travis.yml create mode 100644 src/univalue/COPYING create mode 100644 src/univalue/Makefile.am create mode 100644 src/univalue/README.md create mode 100644 src/univalue/TODO create mode 100755 src/univalue/autogen.sh create mode 100644 src/univalue/build-aux/m4/.gitignore create mode 100644 src/univalue/configure.ac create mode 100644 src/univalue/gen/gen.cpp create mode 100644 src/univalue/include/univalue.h create mode 100644 src/univalue/lib/.gitignore create mode 100644 src/univalue/lib/univalue.cpp create mode 100644 src/univalue/lib/univalue_escapes.h create mode 100644 src/univalue/lib/univalue_get.cpp create mode 100644 src/univalue/lib/univalue_read.cpp create mode 100644 src/univalue/lib/univalue_utffilter.h create mode 100644 src/univalue/lib/univalue_write.cpp create mode 100644 src/univalue/pc/libunivalue-uninstalled.pc.in create mode 100644 src/univalue/pc/libunivalue.pc.in create mode 100644 src/univalue/test/.gitignore create mode 100644 src/univalue/test/fail1.json create mode 100644 src/univalue/test/fail10.json create mode 100644 src/univalue/test/fail11.json create mode 100644 src/univalue/test/fail12.json create mode 100644 src/univalue/test/fail13.json create mode 100644 src/univalue/test/fail14.json create mode 100644 src/univalue/test/fail15.json create mode 100644 src/univalue/test/fail16.json create mode 100644 src/univalue/test/fail17.json create mode 100644 src/univalue/test/fail18.json create mode 100644 src/univalue/test/fail19.json create mode 100644 src/univalue/test/fail2.json create mode 100644 src/univalue/test/fail20.json create mode 100644 src/univalue/test/fail21.json create mode 100644 src/univalue/test/fail22.json create mode 100644 src/univalue/test/fail23.json create mode 100644 src/univalue/test/fail24.json create mode 100644 src/univalue/test/fail25.json create mode 100644 src/univalue/test/fail26.json create mode 100644 src/univalue/test/fail27.json create mode 100644 src/univalue/test/fail28.json create mode 100644 src/univalue/test/fail29.json create mode 100644 src/univalue/test/fail3.json create mode 100644 src/univalue/test/fail30.json create mode 100644 src/univalue/test/fail31.json create mode 100644 src/univalue/test/fail32.json create mode 100644 src/univalue/test/fail33.json create mode 100644 src/univalue/test/fail34.json create mode 100644 src/univalue/test/fail35.json create mode 100644 src/univalue/test/fail36.json create mode 100644 src/univalue/test/fail37.json create mode 100644 src/univalue/test/fail38.json create mode 100644 src/univalue/test/fail39.json create mode 100644 src/univalue/test/fail4.json create mode 100644 src/univalue/test/fail40.json create mode 100644 src/univalue/test/fail41.json create mode 100644 src/univalue/test/fail42.json create mode 100644 src/univalue/test/fail44.json create mode 100644 src/univalue/test/fail45.json create mode 100644 src/univalue/test/fail5.json create mode 100644 src/univalue/test/fail6.json create mode 100644 src/univalue/test/fail7.json create mode 100644 src/univalue/test/fail8.json create mode 100644 src/univalue/test/fail9.json create mode 100644 src/univalue/test/no_nul.cpp create mode 100644 src/univalue/test/object.cpp create mode 100644 src/univalue/test/pass1.json create mode 100644 src/univalue/test/pass2.json create mode 100644 src/univalue/test/pass3.json create mode 100644 src/univalue/test/pass4.json create mode 100644 src/univalue/test/round1.json create mode 100644 src/univalue/test/round2.json create mode 100644 src/univalue/test/round3.json create mode 100644 src/univalue/test/round4.json create mode 100644 src/univalue/test/round5.json create mode 100644 src/univalue/test/round6.json create mode 100644 src/univalue/test/round7.json create mode 100644 src/univalue/test/test_json.cpp create mode 100644 src/univalue/test/unitester.cpp create mode 100644 src/util/match.h create mode 100644 src/util/moneystr.cpp create mode 100644 src/util/moneystr.h create mode 100644 src/util/strencodings.cpp create mode 100644 src/util/strencodings.h create mode 100644 src/util/string.h create mode 100644 src/util/system.cpp create mode 100644 src/util/system.h create mode 100644 src/util/test.cpp create mode 100644 src/util/test.h create mode 100644 src/util/time.cpp create mode 100644 src/util/time.h create mode 100644 src/validationinterface.cpp create mode 100644 src/validationinterface.h create mode 100644 src/version.h create mode 100644 src/wallet/asyncrpcoperation_common.cpp create mode 100644 src/wallet/asyncrpcoperation_common.h create mode 100644 src/wallet/asyncrpcoperation_mergetoaddress.cpp create mode 100644 src/wallet/asyncrpcoperation_mergetoaddress.h create mode 100644 src/wallet/asyncrpcoperation_saplingmigration.cpp create mode 100644 src/wallet/asyncrpcoperation_saplingmigration.h create mode 100644 src/wallet/asyncrpcoperation_sendmany.cpp create mode 100644 src/wallet/asyncrpcoperation_sendmany.h create mode 100644 src/wallet/asyncrpcoperation_shieldcoinbase.cpp create mode 100644 src/wallet/asyncrpcoperation_shieldcoinbase.h create mode 100644 src/wallet/crypter.cpp create mode 100644 src/wallet/crypter.h create mode 100644 src/wallet/db.cpp create mode 100644 src/wallet/db.h create mode 100644 src/wallet/gtest/test_note_selection.cpp create mode 100644 src/wallet/gtest/test_orchard_wallet.cpp create mode 100644 src/wallet/gtest/test_orchard_zkeys.cpp create mode 100644 src/wallet/gtest/test_paymentdisclosure.cpp create mode 100644 src/wallet/gtest/test_rpc_wallet.cpp create mode 100644 src/wallet/gtest/test_wallet.cpp create mode 100644 src/wallet/gtest/test_wallet_zkeys.cpp create mode 100644 src/wallet/orchard.cpp create mode 100644 src/wallet/orchard.h create mode 100644 src/wallet/paymentdisclosure.cpp create mode 100644 src/wallet/paymentdisclosure.h create mode 100644 src/wallet/paymentdisclosuredb.cpp create mode 100644 src/wallet/paymentdisclosuredb.h create mode 100644 src/wallet/rpcdisclosure.cpp create mode 100644 src/wallet/rpcdump.cpp create mode 100644 src/wallet/rpcwallet.cpp create mode 100644 src/wallet/rpcwallet.h create mode 100644 src/wallet/test/crypto_tests.cpp create mode 100644 src/wallet/test/rpc_wallet_tests.cpp create mode 100644 src/wallet/test/wallet_test_fixture.cpp create mode 100644 src/wallet/test/wallet_test_fixture.h create mode 100644 src/wallet/test/wallet_tests.cpp create mode 100644 src/wallet/wallet.cpp create mode 100644 src/wallet/wallet.h create mode 100644 src/wallet/wallet_tx_builder.cpp create mode 100644 src/wallet/wallet_tx_builder.h create mode 100644 src/wallet/walletdb.cpp create mode 100644 src/wallet/walletdb.h create mode 100644 src/warnings.cpp create mode 100644 src/warnings.h create mode 100644 src/weighted_map.h create mode 100644 src/zcash/Address.cpp create mode 100644 src/zcash/Address.hpp create mode 100644 src/zcash/History.cpp create mode 100644 src/zcash/History.hpp create mode 100644 src/zcash/IncrementalMerkleTree.cpp create mode 100644 src/zcash/IncrementalMerkleTree.hpp create mode 100644 src/zcash/JoinSplit.cpp create mode 100644 src/zcash/JoinSplit.hpp create mode 100644 src/zcash/Note.cpp create mode 100644 src/zcash/Note.hpp create mode 100644 src/zcash/NoteEncryption.cpp create mode 100644 src/zcash/NoteEncryption.hpp create mode 100644 src/zcash/Proof.hpp create mode 100644 src/zcash/Zcash.h create mode 100644 src/zcash/address/mnemonic.cpp create mode 100644 src/zcash/address/mnemonic.h create mode 100644 src/zcash/address/orchard.cpp create mode 100644 src/zcash/address/orchard.hpp create mode 100644 src/zcash/address/sapling.cpp create mode 100644 src/zcash/address/sapling.hpp create mode 100644 src/zcash/address/sprout.cpp create mode 100644 src/zcash/address/sprout.hpp create mode 100644 src/zcash/address/transparent.cpp create mode 100644 src/zcash/address/transparent.h create mode 100644 src/zcash/address/unified.cpp create mode 100644 src/zcash/address/unified.h create mode 100644 src/zcash/address/zip32.cpp create mode 100644 src/zcash/address/zip32.h create mode 100644 src/zcash/cache.cpp create mode 100644 src/zcash/cache.h create mode 100644 src/zcash/memo.cpp create mode 100644 src/zcash/memo.h create mode 100644 src/zcash/prf.cpp create mode 100644 src/zcash/prf.h create mode 100644 src/zcash/util.cpp create mode 100644 src/zcash/util.h create mode 100644 src/zcbenchmarks.cpp create mode 100644 src/zcbenchmarks.h create mode 100644 src/zip317.cpp create mode 100644 src/zip317.h create mode 100644 src/zmq/zmqabstractnotifier.cpp create mode 100644 src/zmq/zmqabstractnotifier.h create mode 100644 src/zmq/zmqconfig.h create mode 100644 src/zmq/zmqnotificationinterface.cpp create mode 100644 src/zmq/zmqnotificationinterface.h create mode 100644 src/zmq/zmqpublishnotifier.cpp create mode 100644 src/zmq/zmqpublishnotifier.h create mode 100644 test/lint/README.md create mode 100755 test/lint/commit-script-check.sh create mode 100755 test/lint/git-subtree-check.sh create mode 100755 test/lint/lint-all.sh create mode 100755 test/lint/lint-cargo-patches.sh create mode 100755 test/lint/lint-include-guards.sh create mode 100755 test/lint/lint-includes.sh create mode 100755 test/lint/lint-locale-dependence.sh create mode 100755 test/lint/lint-python-utf8-encoding.sh create mode 100755 test/lint/lint-shebang.sh create mode 100755 test/lint/lint-shell-locale.sh create mode 100755 test/lint/lint-shell.sh create mode 100755 test/lint/lint-whitespace.sh create mode 100755 zcutil/afl/afl-build.sh create mode 100755 zcutil/afl/afl-get.sh create mode 100755 zcutil/afl/afl-getbuildrun.sh create mode 100755 zcutil/afl/afl-run.sh create mode 100755 zcutil/afl/zcash-wrapper create mode 120000 zcutil/afl/zcash-wrapper-clang create mode 120000 zcutil/afl/zcash-wrapper-clang++ create mode 120000 zcutil/afl/zcash-wrapper-g++ create mode 120000 zcutil/afl/zcash-wrapper-gcc create mode 100755 zcutil/build-debian-package.sh create mode 100755 zcutil/build.sh create mode 100755 zcutil/clean.sh create mode 100755 zcutil/cleanup-tags.sh create mode 100755 zcutil/distclean.sh create mode 100755 zcutil/fetch-params.sh create mode 100755 zcutil/libfuzzer/libfuzzer-build.sh create mode 100755 zcutil/libfuzzer/zcash-wrapper create mode 120000 zcutil/libfuzzer/zcash-wrapper-clang create mode 120000 zcutil/libfuzzer/zcash-wrapper-clang++ create mode 100755 zcutil/make-release.py create mode 100755 zcutil/release-notes.py diff --git a/.cargo/config.offline b/.cargo/config.offline new file mode 100644 index 000000000..8b7762d20 --- /dev/null +++ b/.cargo/config.offline @@ -0,0 +1,8 @@ +[target.aarch64-unknown-linux-gnu] +linker = "aarch64-linux-gnu-gcc" + +[source.crates-io] +replace-with = "vendored-sources" + +[source.vendored-sources] +# The directory for this source is set to RUST_VENDORED_SOURCES by src/Makefile.am diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..2ffda198d --- /dev/null +++ b/.editorconfig @@ -0,0 +1,17 @@ +# This configures basic cross-editor formatting. +# +# See https://editorconfig.org/ for more info, and to see if your editor +# requires a plugin to take advantage of it. + +root = true + +[*] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true + +[{Makefile*, *.mk}] +indent_style = tab diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 000000000..c9cf4a7d9 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +src/clientversion.cpp export-subst diff --git a/.github/ISSUE_TEMPLATE/bug-report.md b/.github/ISSUE_TEMPLATE/bug-report.md new file mode 100644 index 000000000..447787404 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug-report.md @@ -0,0 +1,65 @@ +--- +name: Bug report +about: Create a report about a bug in zcashd. +title: '' +labels: 'bug' +assignees: '' + +--- + + + +### Describe the issue +Please provide a general summary of the issue you're experiencing + +### Can you reliably reproduce the issue? +#### If so, please list the steps to reproduce below: +1. +2. +3. + +### Expected behaviour +Tell us what should happen + +### Actual behaviour + errors +Tell us what happens instead including any noticeable error output (any messages +displayed on-screen when e.g. a crash occurred) + +### The version of Zcash you were using: +Run `zcashd --version` to find out + +### Machine specs: +- OS name + version: +- CPU: +- RAM: +- Disk size: +- Disk Type (HD/SDD): +- Linux kernel version (uname -a): +- Compiler version (gcc --version): +- Linker version (ld -v): +- Assembler version (as --version): + +### Any extra information that might be useful in the debugging process. +This includes the relevant contents of `~/.zcash/debug.log`. You can paste raw +text, attach the file directly in the issue or link to the text via a pastebin +type site. Please also include any non-standard things you did during +compilation (extra flags, dependency version changes etc.) if applicable. + +### Do you have a backup of `~/.zcash` directory and/or take a VM snapshot? +- Backing up / making a copy of the `~/.zcash` directory might help make the + problem reproducible. Please redact appropriately. +- Taking a VM snapshot is really helpful for interactively testing fixes diff --git a/.github/ISSUE_TEMPLATE/feature-request.md b/.github/ISSUE_TEMPLATE/feature-request.md new file mode 100644 index 000000000..57abb7286 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature-request.md @@ -0,0 +1,22 @@ +--- +name: Feature request +about: Suggest an idea for zcashd. +title: '' +labels: 'use case' +assignees: '' + +--- + +## Is your feature request related to a problem? Please describe. +A clear and concise description of what the problem is. Example: I'm always +frustrated when [...] + +## Describe the solution you'd like +A clear and concise description of what you want to happen. + +## Alternatives you've considered +A clear and concise description of any alternative solutions or features you've +considered. + +## Additional context +Add any other context or screenshots about the feature request here. diff --git a/.github/ISSUE_TEMPLATE/ux-report.md b/.github/ISSUE_TEMPLATE/ux-report.md new file mode 100644 index 000000000..118db34a2 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/ux-report.md @@ -0,0 +1,17 @@ +--- +name: UX report +about: Was zcashd hard to use? It's not you, it's us. We want to hear about it. +title: 'UX: ' +labels: 'usability' +assignees: '' + +--- + + + +## What were you trying to do + +## What happened diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 000000000..5c4156c6a --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,14 @@ +version: 2 +updates: +- package-ecosystem: github-actions + directory: "/" + schedule: + interval: daily + timezone: Etc/UTC + open-pull-requests-limit: 10 + reviewers: + - str4d + assignees: + - str4d + labels: + - "A-CI" diff --git a/.github/workflows/audits.yml b/.github/workflows/audits.yml new file mode 100644 index 000000000..ab19a3dc4 --- /dev/null +++ b/.github/workflows/audits.yml @@ -0,0 +1,18 @@ +name: Audits + +on: [push, pull_request] + +permissions: + contents: read + +jobs: + cargo-vet: + name: Vet Rust dependencies + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: dtolnay/rust-toolchain@stable + id: toolchain + - run: rustup override set ${{steps.toolchain.outputs.name}} + - run: cargo install cargo-vet --version ~0.6 + - run: cargo vet --locked diff --git a/.github/workflows/book.yml b/.github/workflows/book.yml new file mode 100644 index 000000000..fac308c59 --- /dev/null +++ b/.github/workflows/book.yml @@ -0,0 +1,33 @@ +name: zcashd book + +on: + push: + branches: + - master + +permissions: {} +jobs: + deploy: + permissions: + contents: write # to push pages branch (peaceiris/actions-gh-pages) + + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + + - name: Setup mdBook + uses: peaceiris/actions-mdbook@v1 + with: + mdbook-version: 'latest' + + - name: Install mdbook-katex + run: cargo install mdbook-katex + + - name: Build zcashd book + run: mdbook build doc/book/ + + - name: Deploy to GitHub Pages + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./doc/book/book diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 000000000..74ba216c4 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,117 @@ +name: Build + +on: [push, pull_request] + +jobs: + build: + name: Tier ${{ matrix.tier }} platform ${{ matrix.platform }} + runs-on: ${{ matrix.os }} + continue-on-error: ${{ matrix.tier == 3 }} + strategy: + matrix: + include: + - name: ubuntu-20.04 + tier: 1 + platform: Ubuntu 20.04 + os: ubuntu-20.04 + + - name: ubuntu-22.04 + tier: 3 + platform: Ubuntu 22.04 + os: ubuntu-22.04 + + - name: macos-11 + tier: 3 + platform: macOS Big Sur 11 + os: macos-11 + brew_deps: > + autoconf + automake + coreutils + libtool + pkgconfig + + - name: mingw32 + tier: 3 + platform: Windows (64-bit MinGW) + os: ubuntu-latest + cross_deps: > + mingw-w64 + host: HOST=x86_64-w64-mingw32 + + - name: aarch64-linux + tier: 3 + platform: ARM64 Linux + os: ubuntu-latest + cross_deps: > + g++-aarch64-linux-gnu + host: HOST=aarch64-linux-gnu + + steps: + - uses: actions/checkout@v3 + + - name: Install Homebrew build dependencies + if: matrix.brew_deps != '' + run: brew install ${{ matrix.brew_deps }} + + - name: Install cross-compilation build dependencies + if: matrix.cross_deps != '' + run: sudo apt install ${{ matrix.cross_deps }} + + - name: Configure MinGW to use POSIX variant + if: matrix.name == 'mingw32' + run: | + sudo update-alternatives --set x86_64-w64-mingw32-gcc $(update-alternatives --query x86_64-w64-mingw32-gcc | grep Alternative | grep posix | cut -d' ' -f2) + sudo update-alternatives --set x86_64-w64-mingw32-g++ $(update-alternatives --query x86_64-w64-mingw32-g++ | grep Alternative | grep posix | cut -d' ' -f2) + + - name: Cache built dependencies + uses: actions/cache@v3 + with: + path: depends/built + key: ${{ matrix.name }}-built-${{ hashFiles('depends/Makefile', 'depends/funcs.mk') }}-${{ hashFiles('depends/packages/*.mk', 'depends/patches/**/*') }} + restore-keys: | + ${{ matrix.name }}-built-${{ hashFiles('depends/Makefile', 'depends/funcs.mk') }}- + + - name: Prepare ccache timestamp + id: ccache_cache_timestamp + shell: bash + run: echo "timestamp=$(date +'%Y-%m-%d-%H;%M;%S')" >> "$GITHUB_OUTPUT" + + - name: Cache ccache files + uses: actions/cache@v3 + with: + path: ~/.cache/ccache + key: ${{ matrix.name }}-ccache-${{ steps.ccache_cache_timestamp.outputs.timestamp }} + restore-keys: | + ${{ matrix.name }}-ccache- + + - name: Build zcashd + id: build + run: > + ${{ matrix.host }} + ./zcutil/build.sh + -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" + + - name: Build zcashd with libraries enabled + if: ${{ always() && steps.build.outcome == 'success' }} + run: > + CONFIGURE_FLAGS="--with-libs" + ${{ matrix.host }} + ./zcutil/build.sh + -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" + + - name: Build zcashd with wallet disabled + if: ${{ always() && steps.build.outcome == 'success' }} + run: > + CONFIGURE_FLAGS="--disable-wallet" + ${{ matrix.host }} + ./zcutil/build.sh + -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" + + - name: Build zcashd with mining disabled + if: ${{ always() && steps.build.outcome == 'success' }} + run: > + CONFIGURE_FLAGS="--disable-mining" + ${{ matrix.host }} + ./zcutil/build.sh + -j"$(nproc 2> /dev/null || sysctl -n hw.ncpu)" diff --git a/.github/workflows/lints.yml b/.github/workflows/lints.yml new file mode 100644 index 000000000..71ca24dc6 --- /dev/null +++ b/.github/workflows/lints.yml @@ -0,0 +1,94 @@ +name: Lints + +# We only run these lints on trial-merges of PRs to reduce noise. +on: pull_request + +jobs: + commit-script-check: + name: Scripted diffs + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + with: + fetch-depth: 0 + ref: ${{ github.event.pull_request.head.sha }} + - name: Check scripted diffs + run: ./test/lint/commit-script-check.sh ${{ github.event.pull_request.base.sha }}..${{ github.event.pull_request.head.sha }} + + general-lints: + name: General + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: sudo python3 -m pip install yq + + - name: Cargo patches + run: ./test/lint/lint-cargo-patches.sh + if: always() + + - name: Include guards + run: ./test/lint/lint-include-guards.sh + if: always() + + - name: Includes + run: ./test/lint/lint-includes.sh + if: always() + + - name: Locale dependence + run: ./test/lint/lint-locale-dependence.sh + if: always() + continue-on-error: true # Temporary until we get this passing + + - name: Shebang + run: ./test/lint/lint-shebang.sh + if: always() + continue-on-error: true # Temporary until we get this passing + + - name: Shell locale + run: ./test/lint/lint-shell-locale.sh + if: always() + continue-on-error: true # Temporary until we get this passing + + - name: Shellcheck + run: ./test/lint/lint-shell.sh + if: always() + + - name: Whitespace + run: ./test/lint/lint-whitespace.sh + if: always() + + python: + name: Python + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Install dependencies + run: sudo python3 -m pip install pyflakes + + - name: Pyflakes + run: pyflakes qa src zcutil + if: always() + + - name: UTF-8 encoding + run: ./test/lint/lint-python-utf8-encoding.sh + if: always() + + rust-clippy: + name: Clippy (MSRV) + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - name: Run clippy + uses: actions-rs/clippy-check@v1 + with: + name: Clippy (MSRV) + token: ${{ secrets.GITHUB_TOKEN }} + args: --all-features --all-targets -- -D warnings + + rustfmt: + name: Rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - run: cargo fmt -- --check diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..e9daf3dfd --- /dev/null +++ b/.gitignore @@ -0,0 +1,133 @@ +*.tar.gz +*.deb +*.exe +src/bitcoin +src/zcashd +src/zcashd-wallet-tool +src/zcash-cli +src/zcash-gtest +src/zcash-inspect +src/zcash-tx +src/test/test_bitcoin +zcutil/bin/ + +*zcashTest.pk +*zcashTest.vk + +# autoreconf +Makefile.in +aclocal.m4 +autom4te.cache/ +build-aux/config.guess +build-aux/config.sub +build-aux/depcomp +build-aux/install-sh +build-aux/ltmain.sh +build-aux/m4/libtool.m4 +build-aux/m4/lt~obsolete.m4 +build-aux/m4/ltoptions.m4 +build-aux/m4/ltsugar.m4 +build-aux/m4/ltversion.m4 +build-aux/missing +build-aux/compile +build-aux/test-driver +config.log +config.status +configure +configure~ +libtool +src/config/bitcoin-config.h +src/config/bitcoin-config.h.in +src/config/stamp-h1 +share/setup.nsi +confdefs.h +conftest.cpp +conftest.err + +venv-mnf/ +src/univalue/gen + +.deps +.dirstamp +.libs +.*.swp +*.*~* +*.bak +*.rej +*.orig +*.pyc +*.o +*.o.tmp +*.o-* +.zcash +*.a +*.lib +*.pb.cc +*.pb.h +.vscode + +*.log +*.trs +*.dmg + +*.json.h +*.raw.h + +#libtool object files +*.lo +*.la + +# Compilation +Makefile + +# Rust +.cargo/.configured-for-* +.cargo/config +src/rust/gen/ +target/ + +# Unit-tests +Makefile.test +src/test/buildenv.py + +# Resources cpp +qrc_*.cpp + +# Mac specific +.DS_Store +build + +#lcov +*.gcno +*.gcda +/*.info +test_bitcoin.coverage/ +zcash-gtest.coverage/ +total.coverage/ +coverage_percent.txt +afl-temp + +#build tests +linux-coverage-build +linux-build +win32-build +qa/pull-tester/tests_config.py +qa/pull-tester/tests_config.ini +qa/cache/* + +!src/leveldb*/Makefile + +/doc/doxygen/ + +libzcash_script.pc + +contrib/debian/files +contrib/debian/substvars + +src/fuzzing/*/input +src/fuzzing/*/output +src/fuzz.cpp + +.updatecheck-token +.env +poetry.lock diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 000000000..ba01490e4 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1 @@ +Please read [our Development Guidelines](https://zcash.readthedocs.io/en/latest/rtd_pages/development_guidelines.html). diff --git a/COPYING b/COPYING new file mode 100644 index 000000000..37c45176c --- /dev/null +++ b/COPYING @@ -0,0 +1,53 @@ +Copyright (c) 2016-2023 The Zcash developers +Copyright (c) 2009-2023 The Bitcoin Core developers +Copyright (c) 2009-2023 Bitcoin Developers + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +The MIT software license (https://www.opensource.org/licenses/mit-license.php) +above applies to the code directly included in this source distribution, with +the exception of certain Autoconf macros. Dependencies downloaded as part of +the build process may be covered by other open-source licenses. The MIT-licensed +source code is not considered a derived work of these Autoconf macros or of the +dependencies. For further details see 'contrib/debian/copyright'. + + +Although almost all of the Zcash code is licensed under "permissive" open source +licenses, there are two dependencies that use "copyleft" open source licenses: +- Users and distributors should note that when built using the default build + options, zcashd depends on Oracle Berkeley DB 6.2.x, which is licensed under + the GNU Affero General Public License. +- Downstream code forks should note that zcashd depends on the 'orchard' crate, + which is licensed under the Bootstrap Open Source License. + A license exception is provided allowing some derived works that are linked or + combined with the 'orchard' crate to be copied or distributed under the original + licenses (in this case documented in 'contrib/debian/copyright'), provided that + the included portions of the 'orchard' code remain subject to BOSL. + See https://github.com/zcash/orchard/blob/main/COPYING for details of which + projects can make use of this exception. + + +Contributors should understand licensing implications before modifying the +following files in build-aux/m4 (see https://github.com/zcash/zcash/issues/2827): + + * ax_check_compile_flag.m4 + * ax_check_link_flag.m4 + * ax_check_preproc_flag.m4 + * ax_pthread.m4 diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 000000000..48de106d7 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2605 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a76fd60b23679b7d19bd066031410fb7e458ccc5e958eb5c325888ce4baedc97" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aead" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d122413f284cf2d62fb1b7db97e02edb8cda96d769b16e443a4f6195e35662b0" +dependencies = [ + "crypto-common", + "generic-array", +] + +[[package]] +name = "aes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "433cfd6710c9986c576a25ca913c39d66a6474107b406f34f91d4a8923395241" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "ahash" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47" +dependencies = [ + "getrandom", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c99f64d1e06488f620f932677e24bc6e2897582980441ae90a671415bd7ec2f" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", +] + +[[package]] +name = "aho-corasick" +version = "0.7.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc936419f96fa211c1b9166887b38e5e40b19958e5b895be7c1f93adec7071ac" +dependencies = [ + "memchr", +] + +[[package]] +name = "anyhow" +version = "1.0.70" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7de8ce5e0f9f8d88245311066a578d72b7af3e7088f32783804676302df237e4" + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6" + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "backtrace" +version = "0.3.67" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233d376d6d185f2a3093e58f283f60f880315b6c60075b01f36b3b85154564ca" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "604178f6c5c21f02dc555784810edfb88d34ac2c73b2eae109655649ee73ce3d" + +[[package]] +name = "base64ct" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a32fd6af2b5827bce66c29053ba0e7c42b9dcab01835835058558c10851a46b" + +[[package]] +name = "bech32" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d86b93f97252c47b41663388e6d155714a9d0c398b99f1005cbc5f978b29f445" + +[[package]] +name = "bellman" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9afceed28bac7f9f5a508bca8aeeff51cdfa4770c0b967ac55c621e2ddfd6171" +dependencies = [ + "bitvec", + "blake2s_simd", + "byteorder", + "crossbeam-channel", + "ff", + "group", + "lazy_static", + "log", + "num_cpus", + "pairing", + "rand_core 0.6.4", + "rayon", + "subtle", +] + +[[package]] +name = "bip0039" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef0f0152ec5cf17f49a5866afaa3439816207fd4f0a224c0211ffaf5e278426" +dependencies = [ + "hmac", + "pbkdf2", + "rand", + "sha2 0.10.6", + "unicode-normalization", + "zeroize", +] + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + +[[package]] +name = "blake2b_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c2f0dc9a68c6317d884f97cc36cf5a3d20ba14ce404227df55e1af708ab04bc" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "blake2s_simd" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637f448b9e61dfadbdcbae9a885fadee1f3eaffb1f8d3c1965d3ade8bdfd44f" +dependencies = [ + "arrayref", + "arrayvec", + "constant_time_eq", +] + +[[package]] +name = "block-buffer" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4152116fd6e9dadb291ae18fc1ec3575ed6d84c29642d97890f4b4a3417297e4" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "bls12_381" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7bc6d6292be3a19e6379786dac800f551e5865a5bb51ebbe3064ab80433f403" +dependencies = [ + "ff", + "group", + "pairing", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "bridgetree" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a813dadc684e4c78a4547757debd99666282545d90e4ccc3210913ed4337ad2" +dependencies = [ + "incrementalmerkletree", +] + +[[package]] +name = "bs58" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5353f36341f7451062466f0b755b96ac3a9547e4d7f6b70d603fc721a7d7896" +dependencies = [ + "sha2 0.10.6", + "tinyvec", +] + +[[package]] +name = "bumpalo" +version = "3.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d261e256854913907f67ed06efbc3338dfe6179796deefc1ff763fc1aee5535" + +[[package]] +name = "byte-slice-cast" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3ac9f8b63eca6fd385229b3675f6cc0dc5c8a5c8a54a59d4f52ffd670d87b0c" + +[[package]] +name = "byteorder" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" + +[[package]] +name = "bytes" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chacha20" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3613f74bd2eac03dad61bd53dbe620703d4371614fe0bc3b9f04dd36fe4e818" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures", +] + +[[package]] +name = "chacha20poly1305" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35" +dependencies = [ + "aead", + "chacha20", + "cipher", + "poly1305", + "zeroize", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common", + "inout", + "zeroize", +] + +[[package]] +name = "clearscreen" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f3f22f1a586604e62efd23f78218f3ccdecf7a33c4500db2d37d85a24fe994" +dependencies = [ + "nix", + "terminfo", + "thiserror", + "which", + "winapi", +] + +[[package]] +name = "constant_time_eq" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13418e745008f7349ec7e449155f419a61b92b58a99cc3616942b926825ec76b" + +[[package]] +name = "cpufeatures" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "280a9f2d8b3a38871a3c8a46fb80db65e5e5ed97da80c4d08bf27fb63e35e181" +dependencies = [ + "libc", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +dependencies = [ + "cfg-if", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +dependencies = [ + "cfg-if", + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46bd5f3f85273295a9d14aedfb86f6aadbff6d8f5295c4a9edb08e819dcf5695" +dependencies = [ + "autocfg", + "cfg-if", + "crossbeam-utils", + "memoffset", + "scopeguard", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c063cd8cc95f5c377ed0d4b49a4b21f632396ff690e8470c29b3359b346984b" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "curve25519-dalek" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b9fdf9972b2bd6af2d913799d9ebc165ea4d2e65878e329d9c6b372c4491b61" +dependencies = [ + "byteorder", + "digest 0.9.0", + "rand_core 0.5.1", + "subtle", + "zeroize", +] + +[[package]] +name = "cxx" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "109308c20e8445959c2792e81871054c6a17e6976489a93d2769641a2ba5839c" +dependencies = [ + "cc", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "882074421238e84fe3b4c65d0081de34e5b323bf64555d3e61991f76eb64a7bb" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.95" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a076022ece33e7686fb76513518e219cca4fce5750a8ae6d1ce6c0f48fd1af9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "digest" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3dd60d1080a57a05ab032377049e0591415d2b31afd7028356dbf3cc6dcb066" +dependencies = [ + "generic-array", +] + +[[package]] +name = "digest" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8168378f4e5023e7218c89c891c0fd8ecdb5e5e4f18cb78f38cf245dd021e76f" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common", + "subtle", +] + +[[package]] +name = "directories" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74be3be809c18e089de43bdc504652bb2bc473fca8756131f8689db8cf079ba9" +dependencies = [ + "dirs-sys 0.4.0", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04414300db88f70d74c5ff54e50f9e1d1737d9a5b90f53fcf2e95ca2a9ab554b" +dependencies = [ + "libc", + "redox_users", + "windows-sys", +] + +[[package]] +name = "ed25519-zebra" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c24f403d068ad0b359e577a77f92392118be3f3c927538f2bb544a5ecd828c6" +dependencies = [ + "curve25519-dalek", + "hashbrown 0.12.3", + "hex", + "rand_core 0.6.4", + "serde", + "sha2 0.9.9", + "zeroize", +] + +[[package]] +name = "either" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fcaabb2fef8c910e7f4c7ce9f67a1283a1715879a7c230ca9d6d1ae31f16d91" + +[[package]] +name = "equihash" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab579d7cf78477773b03e80bc2f89702ef02d7112c711d54ca93dcdce68533d5" +dependencies = [ + "blake2b_simd", + "byteorder", +] + +[[package]] +name = "errno" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d6a0976c999d473fe89ad888d5a284e55366d9dc9038b1ba2aa15128c4afa0" +dependencies = [ + "errno-dragonfly", + "libc", + "windows-sys", +] + +[[package]] +name = "errno-dragonfly" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "f4jumble" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a83e8d7fd0c526af4aad893b7c9fe41e2699ed8a776a6c74aecdeafe05afc75" +dependencies = [ + "blake2b_simd", +] + +[[package]] +name = "fastrand" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "ff" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ded41244b729663b1e574f1b4fb731469f69f79c17667b5d776b16cda0479449" +dependencies = [ + "bitvec", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "fixed-hash" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcf0ed7fe52a17a03854ec54a9f76d6d84508d1c0e66bc1793301c73fc8493c" +dependencies = [ + "byteorder", + "rand", + "rustc-hex", + "static_assertions", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "fpe" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26c4b37de5ae15812a764c958297cfc50f5c010438f60c6ce75d11b802abd404" +dependencies = [ + "cbc", + "cipher", + "libm", + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + +[[package]] +name = "futures-channel" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955518d47e09b25bbebc7a18df10b81f0c766eaf4c4f1cccef2fca5f2a4fb5f2" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4bca583b7e26f571124fe5b7561d49cb2868d79116cfa0eefce955557c6fee8c" + +[[package]] +name = "futures-task" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76d3d132be6c0e6aa1534069c705a74a5997a356c0dc2f86a47765e5617c5b65" + +[[package]] +name = "futures-util" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b01e40b772d54cf6c6d721c1d1abd0647a0106a12ecaa1c186273392a69533" +dependencies = [ + "futures-core", + "futures-task", + "pin-project-lite", + "pin-utils", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c85e1d9ab2eadba7e5040d4e09cbd6d072b76a557ad64e797c2cb9d4da21d7e4" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gimli" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0a93d233ebf96623465aad4046a8d3aa4da22d4f4beba5388838c8a434bbb4" + +[[package]] +name = "group" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0f9ef7462f7c099f518d754361858f86d8a07af53ba9af0fe635bbccb151a63" +dependencies = [ + "ff", + "memuse", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "gumdrop" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5bc700f989d2f6f0248546222d9b4258f5b02a171a431f8285a81c08142629e3" +dependencies = [ + "gumdrop_derive", +] + +[[package]] +name = "gumdrop_derive" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "729f9bd3449d77e7831a18abfb7ba2f99ee813dfd15b8c2167c9a54ba20aa99d" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "halo2_gadgets" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "126a150072b0c38c7b573fe3eaf0af944a7fed09e154071bf2436d3f016f7230" +dependencies = [ + "arrayvec", + "bitvec", + "ff", + "group", + "halo2_proofs", + "lazy_static", + "pasta_curves", + "rand", + "subtle", + "uint", +] + +[[package]] +name = "halo2_legacy_pdqsort" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47716fe1ae67969c5e0b2ef826f32db8c3be72be325e1aa3c1951d06b5575ec5" + +[[package]] +name = "halo2_proofs" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b867a8d9bbb85fca76fff60652b5cd19b853a1c4d0665cb89bee68b18d2caf0" +dependencies = [ + "blake2b_simd", + "ff", + "group", + "halo2_legacy_pdqsort", + "maybe-rayon", + "pasta_curves", + "rand_core 0.6.4", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.6", +] + +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" +dependencies = [ + "ahash 0.8.3", +] + +[[package]] +name = "hdwallet" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a03ba7d4c9ea41552cd4351965ff96883e629693ae85005c501bb4b9e1c48a7" +dependencies = [ + "lazy_static", + "rand_core 0.6.4", + "ring", + "secp256k1", + "thiserror", +] + +[[package]] +name = "hermit-abi" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +dependencies = [ + "libc", +] + +[[package]] +name = "hermit-abi" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "http" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +dependencies = [ + "bytes", + "fnv", + "itoa", +] + +[[package]] +name = "http-body" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" + +[[package]] +name = "hyper" +version = "0.14.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab302d72a6f11a3b910431ff93aae7e773078c769f0a3ef15fb9ec692ed147d4" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "http", + "http-body", + "httparse", + "httpdate", + "itoa", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "impl-codec" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba6a270039626615617f3f36d15fc827041df3b78c439da2cadfa47455a77f2f" +dependencies = [ + "parity-scale-codec", +] + +[[package]] +name = "impl-trait-for-tuples" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11d7a9f6330b71fea57921c9b61c47ee6e84f72d394754eff6163ae67e7395eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "incrementalmerkletree" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb91780c91bfc79769006a55c49127b83e1c1a6cf2b3b149ce3f247cbe342f0" +dependencies = [ + "either", + "proptest", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", +] + +[[package]] +name = "inout" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c10553d664a4d0bcff9f4215d0aac67a639cc68ef660840afe309b807bc9f5" +dependencies = [ + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09270fd4fa1111bc614ed2246c7ef56239a3063d5be0d1ec3b589c505d400aeb" +dependencies = [ + "hermit-abi 0.3.1", + "libc", + "windows-sys", +] + +[[package]] +name = "ipnet" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12b6ee2129af8d4fb011108c73d99a1b83a85977f23b82460c0ae2e25bb4b57f" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "js-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445dde2150c55e483f3d8416706b97ec8e8237c307e5b7b4b8dd15e6af2a0730" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jubjub" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8499f7a74008aafbecb2a2e608a3e13e4dd3e84df198b604451efe93f2de6e61" +dependencies = [ + "bitvec", + "bls12_381", + "ff", + "group", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +dependencies = [ + "spin", +] + +[[package]] +name = "libc" +version = "0.2.141" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5" + +[[package]] +name = "libm" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "348108ab3fba42ec82ff6e9564fc4ca0247bdccdc68dd8af9764bbc79c3c8ffb" + +[[package]] +name = "librustzcash" +version = "0.2.0" +dependencies = [ + "anyhow", + "backtrace", + "bech32", + "bellman", + "blake2b_simd", + "blake2s_simd", + "bls12_381", + "bridgetree", + "byteorder", + "clearscreen", + "crossbeam-channel", + "cxx", + "ed25519-zebra", + "equihash", + "group", + "gumdrop", + "hex", + "incrementalmerkletree", + "ipnet", + "jubjub", + "lazy_static", + "libc", + "memuse", + "metrics", + "metrics-exporter-prometheus", + "metrics-util", + "nonempty", + "orchard", + "proptest", + "rand", + "rand_core 0.6.4", + "rayon", + "secp256k1", + "secrecy", + "serde", + "serde_json", + "sha2 0.10.6", + "subtle", + "thiserror", + "time", + "tokio", + "tracing", + "tracing-appender", + "tracing-core", + "tracing-subscriber", + "uint", + "zcash_address", + "zcash_encoding", + "zcash_history", + "zcash_note_encryption", + "zcash_primitives", + "zcash_proofs", + "zeroize", +] + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "log" +version = "0.4.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "mach2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +dependencies = [ + "libc", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2dffe52ecf27772e601905b7522cb4ef790d2cc203488bbd0e2fe85fcb74566d" + +[[package]] +name = "memoffset" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d61c719bcfbcf5d62b3a09efa6088de8c54bc0bfcd3ea7ae39fcc186108b8de1" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memuse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2145869435ace5ea6ea3d35f59be559317ec9a0d04e1812d5f185a87b6d36f1a" +dependencies = [ + "nonempty", +] + +[[package]] +name = "metrics" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa8ebbd1a9e57bbab77b9facae7f5136aea44c356943bf9a198f647da64285d6" +dependencies = [ + "ahash 0.8.3", + "metrics-macros", + "portable-atomic", +] + +[[package]] +name = "metrics-exporter-prometheus" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a4964177ddfdab1e3a2b37aec7cf320e14169abb0ed73999f558136409178d5" +dependencies = [ + "base64", + "hyper", + "indexmap", + "ipnet", + "metrics", + "metrics-util", + "quanta", + "thiserror", + "tokio", + "tracing", +] + +[[package]] +name = "metrics-macros" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddece26afd34c31585c74a4db0630c376df271c285d682d1e55012197830b6df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "metrics-util" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "111cb375987443c3de8d503580b536f77dc8416d32db62d9456db5d93bd7ac47" +dependencies = [ + "aho-corasick", + "crossbeam-epoch", + "crossbeam-utils", + "hashbrown 0.13.2", + "metrics", + "num_cpus", + "quanta", + "sketches-ddsketch", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b275950c28b37e794e8c55d88aeb5e139d0ce23fdbbeda68f8d7174abdf9e8fa" +dependencies = [ + "adler", +] + +[[package]] +name = "mio" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys", +] + +[[package]] +name = "nix" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfdda3d196821d6af13126e40375cdf7da646a96114af134d5f417a9a1dc8e1a" +dependencies = [ + "bitflags", + "cfg-if", + "libc", + "static_assertions", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nonempty" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e591e719385e6ebaeb5ce5d3887f7d5676fceca6411d1925ccc95745f3d6f7" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-bigint" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93ab6289c7b344a8a9f60f88d80aa20032336fe78da341afc91c8a2341fc75f" +dependencies = [ + "autocfg", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +dependencies = [ + "hermit-abi 0.2.6", + "libc", +] + +[[package]] +name = "object" +version = "0.30.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea86265d3d3dcb6a27fc51bd29a4bf387fae9d2986b823079d4986af253eb439" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "opaque-debug" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "624a8340c38c1b80fd549087862da4ba43e08858af025b236e509b6649fc13d5" + +[[package]] +name = "orchard" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f4e7a52f510cb8c39e639e662a353adbaf86025478af89ae54a0551f8ca35e2" +dependencies = [ + "aes", + "bitvec", + "blake2b_simd", + "ff", + "fpe", + "group", + "halo2_gadgets", + "halo2_proofs", + "hex", + "incrementalmerkletree", + "lazy_static", + "memuse", + "nonempty", + "pasta_curves", + "proptest", + "rand", + "reddsa", + "serde", + "subtle", + "tracing", + "zcash_note_encryption", +] + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pairing" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fec4625e73cf41ef4bb6846cafa6d44736525f442ba45e407c4a000a13996f" +dependencies = [ + "group", +] + +[[package]] +name = "parity-scale-codec" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ddb756ca205bd108aee3c62c6d3c994e1df84a59b9d6d4a5ea42ee1fd5a9a28" +dependencies = [ + "arrayvec", + "bitvec", + "byte-slice-cast", + "impl-trait-for-tuples", + "parity-scale-codec-derive", + "serde", +] + +[[package]] +name = "parity-scale-codec-derive" +version = "3.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b26a931f824dd4eca30b3e43bb4f31cd5f0d3a403c5f5ff27106b805bfde7b" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "password-hash" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d791538a6dcc1e7cb7fe6f6b58aca40e7f79403c45b2bc274008b5e647af1d8" +dependencies = [ + "base64ct", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "pasta_curves" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3e57598f73cc7e1b2ac63c79c517b31a0877cd7c402cdcaa311b5208de7a095" +dependencies = [ + "blake2b_simd", + "ff", + "group", + "lazy_static", + "rand", + "static_assertions", + "subtle", +] + +[[package]] +name = "pbkdf2" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271779f35b581956db91a3e55737327a03aa051e90b1c47aeb189508533adfd7" +dependencies = [ + "digest 0.10.6", + "password-hash", +] + +[[package]] +name = "phf" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928c6535de93548188ef63bb7c4036bd415cd8f36ad25af44b9789b2ee72a48c" +dependencies = [ + "phf_shared", +] + +[[package]] +name = "phf_codegen" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56ac890c5e3ca598bbdeaa99964edb5b0258a583a9eb6ef4e89fc85d9224770" +dependencies = [ + "phf_generator", + "phf_shared", +] + +[[package]] +name = "phf_generator" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1181c94580fa345f50f19d738aaa39c0ed30a600d95cb2d3e23f94266f14fbf" +dependencies = [ + "phf_shared", + "rand", +] + +[[package]] +name = "phf_shared" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fb5f6f826b772a8d4c0394209441e7d37cbbb967ae9c7e0e8134365c9ee676" +dependencies = [ + "siphasher", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "poly1305" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8159bd90725d2df49889a078b54f4f79e87f1f8a8444194cdca81d38f5393abf" +dependencies = [ + "cpufeatures", + "opaque-debug", + "universal-hash", +] + +[[package]] +name = "portable-atomic" +version = "1.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "767eb9f07d4a5ebcb39bbf2d452058a93c011373abf6832e24194a1c3f004794" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "primitive-types" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28720988bff275df1f51b171e1b2a18c30d194c4d2b61defdacecd625a5d94a" +dependencies = [ + "fixed-hash", + "impl-codec", + "uint", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit", +] + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "proptest" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e35c06b98bf36aba164cc17cb25f7e232f5c4aeea73baa14b8a9f0d92dbfa65" +dependencies = [ + "bit-set", + "bitflags", + "byteorder", + "lazy_static", + "num-traits", + "rand", + "rand_chacha", + "rand_xorshift", + "regex-syntax", + "rusty-fork", + "tempfile", + "unarray", +] + +[[package]] +name = "quanta" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a17e662a7a8291a865152364c20c7abc5e60486ab2001e8ec10b24862de0b9ab" +dependencies = [ + "crossbeam-utils", + "libc", + "mach2", + "once_cell", + "raw-cpuid", + "wasi", + "web-sys", + "winapi", +] + +[[package]] +name = "quick-error" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1d01941d82fa2ab50be1e79e6714289dd7cde78eba4c074bc5a4374f650dfe0" + +[[package]] +name = "quote" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4424af4bf778aae2051a77b60283332f386554255d722233d09fbfc7e30da2fc" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "rand_xorshift" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d25bf25ec5ae4a3f1b92f929810509a2f53d7dca2f50b794ff57e3face536c8f" +dependencies = [ + "rand_core 0.6.4", +] + +[[package]] +name = "raw-cpuid" +version = "10.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c297679cb867470fa8c9f67dbba74a78d78e3e98d7cf2b08d6d71540f797332" +dependencies = [ + "bitflags", +] + +[[package]] +name = "rayon" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d2df5196e37bcc87abebc0053e20787d73847bb33134a69841207dd0a47f03b" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b8f95bd6966f5c87776639160a66bd8ab9895d9d4ab01ddba9fc60661aebe8d" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-utils", + "num_cpus", +] + +[[package]] +name = "reddsa" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54b34d2c0df43159d2ff79d3cf929c9f11415529127344edb8160ad2be499fcd" +dependencies = [ + "blake2b_simd", + "byteorder", + "group", + "hex", + "jubjub", + "pasta_curves", + "rand_core 0.6.4", + "serde", + "thiserror", + "zeroize", +] + +[[package]] +name = "redjubjub" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a60db2c3bc9c6fd1e8631fee75abc008841d27144be744951d6b9b75f9b569c" +dependencies = [ + "rand_core 0.6.4", + "reddsa", + "serde", + "thiserror", + "zeroize", +] + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags", +] + +[[package]] +name = "redox_users" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b" +dependencies = [ + "getrandom", + "redox_syscall 0.2.16", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b1f693b24f6ac912f4893ef08244d70b6067480d2f1a46e950c9691e6749d1d" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "ring" +version = "0.16.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3053cf52e236a3ed746dfc745aa9cacf1b791d846bdaf412f60a8d7d6e17c8fc" +dependencies = [ + "cc", + "libc", + "once_cell", + "spin", + "untrusted", + "web-sys", + "winapi", +] + +[[package]] +name = "ripemd" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd124222d17ad93a644ed9d011a40f4fb64aa54275c08cc216524a9ea82fb09f" +dependencies = [ + "digest 0.10.6", +] + +[[package]] +name = "rustc-demangle" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" + +[[package]] +name = "rustc-hex" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" + +[[package]] +name = "rustix" +version = "0.37.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aae838e49b3d63e9274e1c01833cc8139d3fec468c3b84688c628f44b1ae11d" +dependencies = [ + "bitflags", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys", + "windows-sys", +] + +[[package]] +name = "rusty-fork" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb3dcc6e454c328bb824492db107ab7c0ae8fcffe4ad210136ef014458c1bc4f" +dependencies = [ + "fnv", + "quick-error", + "tempfile", + "wait-timeout", +] + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "scopeguard" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" + +[[package]] +name = "secp256k1" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4124a35fe33ae14259c490fd70fa199a32b9ce9502f2ee6bc4f81ec06fa65894" +dependencies = [ + "secp256k1-sys", +] + +[[package]] +name = "secp256k1-sys" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70a129b9e9efbfb223753b9163c4ab3b13cff7fd9c7f010fbac25ab4099fa07e" +dependencies = [ + "cc", +] + +[[package]] +name = "secrecy" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9bd1c54ea06cfd2f6b63219704de0b9b4f72dcc2b8fdef820be6cd799780e91e" +dependencies = [ + "zeroize", +] + +[[package]] +name = "serde" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb2f3770c8bce3bcda7e149193a069a0f4365bda1fa5cd88e03bca26afc1216c" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.160" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha2" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d58a1e1bf39749807d89cf2d98ac2dfa0ff1cb3faa38fbb64dd88ac8013d800" +dependencies = [ + "block-buffer 0.9.0", + "cfg-if", + "cpufeatures", + "digest 0.9.0", + "opaque-debug", +] + +[[package]] +name = "sha2" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82e6b795fe2e3b1e845bafcb27aa35405c4d47cdfc92af5fc8d3002f76cebdc0" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest 0.10.6", +] + +[[package]] +name = "sharded-slab" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900fba806f70c630b0a382d0d825e17a0f19fcd059a2ade1ff237bcddf446b31" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "siphasher" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bd3e3206899af3f8b12af284fafc038cc1dc2b41d1b89dd17297221c5d225de" + +[[package]] +name = "sketches-ddsketch" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68a406c1882ed7f29cd5e248c9848a80e7cb6ae0fea82346d2746f2f941c07e1" + +[[package]] +name = "socket2" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d" + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a34fcf3e8b60f57e6a14301a2e916d323af98b0ea63c599441eec8558660c822" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + +[[package]] +name = "tempfile" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9fbec84f381d5795b08656e4912bec604d162bff9291d6189a78f4c8ab87998" +dependencies = [ + "cfg-if", + "fastrand", + "redox_syscall 0.3.5", + "rustix", + "windows-sys", +] + +[[package]] +name = "terminfo" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666cd3a6681775d22b200409aad3b089c5b99fb11ecdd8a204d9d62f8148498f" +dependencies = [ + "dirs", + "fnv", + "nom", + "phf", + "phf_codegen", +] + +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "thread_local" +version = "1.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdd6f064ccff2d6567adcb3873ca630700f00b5ad3f060c25b5dcfd9a4ce152" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd0cbfecb4d19b5ea75bb31ad904eb5b9fa13f21079c3b92017ebdf4999a5890" +dependencies = [ + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e153e1f1acaef8acc537e68b44906d2db6436e2b35ac2c6b42640fff91f00fd" + +[[package]] +name = "time-macros" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd80a657e71da814b8e5d60d3374fc6d35045062245d80224748ae522dd76f36" +dependencies = [ + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0de47a4eecbe11f498978a9b29d792f0d2692d1dd003650c24c76510e3bc001" +dependencies = [ + "autocfg", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys", +] + +[[package]] +name = "toml_datetime" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a76a9312f5ba4c2dec6b9161fdf25d87ad8a09256ccea5a556fef03c706a10f" + +[[package]] +name = "toml_edit" +version = "0.19.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2380d56e8670370eee6566b0bfd4265f65b3f432e8c6d85623f728d4fa31f739" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8" +dependencies = [ + "cfg-if", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-appender" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09d48f71a791638519505cefafe162606f706c25592e4bde4d97600c0195312e" +dependencies = [ + "crossbeam-channel", + "time", + "tracing-subscriber", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tracing-core" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "thread_local", + "time", + "tracing", + "tracing-core", +] + +[[package]] +name = "try-lock" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" + +[[package]] +name = "typenum" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497961ef93d974e23eb6f433eb5fe1b7930b659f06d12dec6fc44a8f554c0bba" + +[[package]] +name = "uint" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76f64bba2c53b04fcab63c01a7d7427eadc821e3bc48c34dc9ba29c501164b52" +dependencies = [ + "byteorder", + "crunchy", + "hex", + "static_assertions", +] + +[[package]] +name = "unarray" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaea85b334db583fe3274d12b4cd1880032beab409c0d774be044d4480ab9a94" + +[[package]] +name = "unicode-ident" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" + +[[package]] +name = "unicode-normalization" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "universal-hash" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d3160b73c9a19f7e2939a2fdad446c57c1bbbbf4d919d3213ff1267a580d8b5" +dependencies = [ + "crypto-common", + "subtle", +] + +[[package]] +name = "untrusted" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a" + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "wait-timeout" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f200f5b12eb75f8c1ed65abd4b2db8a6e1b138a20de009dacee265a2498f3f6" +dependencies = [ + "libc", +] + +[[package]] +name = "want" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ce8a968cb1cd110d136ff8b819a556d6fb6d919363c61534f6860c7eb172ba0" +dependencies = [ + "log", + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31f8dcbc21f30d9b8f2ea926ecb58f6b91192c17e9d33594b3df58b2007ca53b" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ce90fd5bcc06af55a641a86428ee4229e44e07033963a2290a8e241607ccb9" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c21f77c0bedc37fd5dc21f897894a5ca01e7bb159884559461862ae90c0b4c5" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2aff81306fcac3c7515ad4e177f521b5c9a15f2b08f4e32d823066102f35a5f6" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.84" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0046fef7e28c3804e5e38bfa31ea2a0f73905319b677e57ebe37e49358989b5d" + +[[package]] +name = "web-sys" +version = "0.3.61" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e33b99f4b23ba3eec1a53ac264e35a755f00e966e0065077d6027c0f575b0b97" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "which" +version = "4.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2441c784c52b289a054b7201fc93253e288f094e2f4be9058343127c4226a269" +dependencies = [ + "either", + "libc", + "once_cell", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm", + "windows_aarch64_msvc", + "windows_i686_gnu", + "windows_i686_msvc", + "windows_x86_64_gnu", + "windows_x86_64_gnullvm", + "windows_x86_64_msvc", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[package]] +name = "winnow" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61de7bac303dc551fe038e2b3cef0f571087a47571ea6e79a87692ac99b99699" +dependencies = [ + "memchr", +] + +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + +[[package]] +name = "zcash_address" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8944af5c206cf2e37020ad54618e1825501b98548d35a638b73e0ec5762df8d5" +dependencies = [ + "bech32", + "bs58", + "f4jumble", + "zcash_encoding", +] + +[[package]] +name = "zcash_encoding" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f03391b81727875efa6ac0661a20883022b6fba92365dc121c48fa9b00c5aac0" +dependencies = [ + "byteorder", + "nonempty", +] + +[[package]] +name = "zcash_history" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb611a28a4e13ac715ee712f4344d6b279b767daf6345dafefb2c4bf582b6679" +dependencies = [ + "blake2b_simd", + "byteorder", + "primitive-types", +] + +[[package]] +name = "zcash_note_encryption" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b4580cd6cee12e44421dac43169be8d23791650816bdb34e6ddfa70ac89c1c5" +dependencies = [ + "chacha20", + "chacha20poly1305", + "cipher", + "rand_core 0.6.4", + "subtle", +] + +[[package]] +name = "zcash_primitives" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de1a231e6a58d3dcdd6e21d229db33d7c10f9b54d8c170e122b267f6826bb48f" +dependencies = [ + "aes", + "bip0039", + "bitvec", + "blake2b_simd", + "blake2s_simd", + "bls12_381", + "byteorder", + "equihash", + "ff", + "fpe", + "group", + "hdwallet", + "hex", + "incrementalmerkletree", + "jubjub", + "lazy_static", + "memuse", + "nonempty", + "orchard", + "proptest", + "rand", + "rand_core 0.6.4", + "ripemd", + "secp256k1", + "sha2 0.10.6", + "subtle", + "zcash_address", + "zcash_encoding", + "zcash_note_encryption", +] + +[[package]] +name = "zcash_proofs" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b209661425fa780ff4fd1b5d8ef2148f569536b5071051143eede32e291e1a65" +dependencies = [ + "bellman", + "blake2b_simd", + "bls12_381", + "directories", + "group", + "incrementalmerkletree", + "jubjub", + "lazy_static", + "rand_core 0.6.4", + "redjubjub", + "tracing", + "zcash_primitives", +] + +[[package]] +name = "zeroize" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a0956f1ba7c7909bfb66c2e9e4124ab6f6482560f6628b5aaeba39207c9aad9" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 000000000..d6ca43611 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,120 @@ +[package] +name = "librustzcash" +description = "Rust FFI used by the zcashd binary. Not an official API." +version = "0.2.0" +authors = [ + "Sean Bowe ", + "Jay Graber", + "Jack Grigg ", + "Daira Hopwood ", + "Ying Tong Lai ", + "Simon Liu", + "Kris Nuttycombe ", + "Greg Pfeil ", + "Larry Ruane ", + "Steven Smith " +] +homepage = "https://github.com/zcash/zcash" +repository = "https://github.com/zcash/zcash" +readme = "README.md" +license = "MIT OR Apache-2.0" +edition = "2018" +rust-version = "1.69" + +[package.metadata.vet] +store = { path = "./qa/supply-chain" } + +[lib] +name = "rustzcash" +path = "src/rust/src/rustzcash.rs" +crate-type = ["staticlib"] + +[[bin]] +name = "zcash-inspect" +path = "src/rust/bin/inspect/main.rs" + +[[bin]] +name = "zcashd-wallet-tool" +path = "src/rust/bin/wallet_tool.rs" + +[dependencies] +bellman = "0.14" +blake2b_simd = "1" +blake2s_simd = "1" +bls12_381 = "0.8" +bridgetree = "0.3" +byteorder = "1" +crossbeam-channel = "0.5" +group = "0.13" +incrementalmerkletree = "0.4" +libc = "0.2" +jubjub = "0.10" +memuse = "0.2" +nonempty = "0.7" +orchard = "0.5" +secp256k1 = "0.26" +subtle = "2.2" +rand_core = "0.6" +tracing = "0.1" +tracing-core = "0.1" +tracing-appender = "0.2" +zcash_address = "0.3" +zcash_encoding = "0.2" +zcash_history = "0.3" +zcash_note_encryption = "0.4" +zcash_primitives = { version = "0.12", features = ["temporary-zcashd", "transparent-inputs"] } +zcash_proofs = { version = "0.12", features = ["directories"] } +ed25519-zebra = "3.1" +zeroize = "1.4.2" + +# Rust/C++ interop +# The version needs to match depends/packages/native_cxxbridge.mk +cxx = { version = "=1.0.95", features = ["c++17"] } + +# Rust threading +rayon = "1.5" + +# Metrics +ipnet = "2" +metrics = "0.21" +metrics-exporter-prometheus = "0.12" +metrics-util = { version = "0.15", default-features = false, features = ["layer-filter"] } +tokio = { version = "1", features = ["rt", "net", "time"] } + +# General tool dependencies +gumdrop = "0.8" + +# zcash-inspect tool +bech32 = "0.9" +equihash = "0.2" +hex = "0.4" +lazy_static = "1.4" +serde = "1.0" +serde_json = "1.0" +sha2 = "0.10" +uint = "0.9" + +# Wallet tool +# (also depends on tracing, and tracing-subscriber with "env-filter" and "fmt" features) +anyhow = "1.0" +backtrace = "0.3" +clearscreen = "2.0" +rand = "0.8" +secrecy = "0.8" +thiserror = "1" +time = { version = "0.3", features = ["formatting", "macros"] } + +[dev-dependencies] +incrementalmerkletree = { version = "0.4", features = ["test-dependencies"] } +proptest = "1.0.0" +zcash_primitives = { version = "0.12", features = ["temporary-zcashd", "transparent-inputs", "test-dependencies"] } + +[dependencies.tracing-subscriber] +version = "0.3" +default-features = false +features = ["ansi", "env-filter", "fmt", "time"] + +[profile.release] +lto = 'thin' +panic = 'abort' +codegen-units = 1 diff --git a/INSTALL b/INSTALL new file mode 100644 index 000000000..9c62d3995 --- /dev/null +++ b/INSTALL @@ -0,0 +1,5 @@ +Building Zcash + +See the Zcash documentation wiki (https://zcash.readthedocs.io/en/latest/rtd_pages/zcashd.html) for instructions on building zcashd, +the intended-for-services, no-graphical-interface, reference +implementation of Zcash. diff --git a/Makefile.am b/Makefile.am new file mode 100644 index 000000000..a5fa7513f --- /dev/null +++ b/Makefile.am @@ -0,0 +1,177 @@ +# Copyright (c) 2016-2019 The Zcash developers +# Copyright (c) 2013-2019 The Bitcoin Core developers +# Copyright (c) 2013-2019 Bitcoin Developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +# Pattern rule to print variables, e.g. make print-top_srcdir +print-%: + @echo $* = $($*) + +ACLOCAL_AMFLAGS = -I build-aux/m4 +SUBDIRS = src +if ENABLE_MAN +SUBDIRS += doc/man +endif +.PHONY: deploy FORCE rpc-tests + +if BUILD_BITCOIN_LIBS +pkgconfigdir = $(libdir)/pkgconfig +pkgconfig_DATA = libzcash_script.pc +endif + +BITCOIND_BIN=$(top_builddir)/src/$(BITCOIN_DAEMON_NAME)$(EXEEXT) +BITCOIN_CLI_BIN=$(top_builddir)/src/$(BITCOIN_CLI_NAME)$(EXEEXT) + +DIST_DOCS = $(wildcard doc/*.md) $(wildcard doc/release-notes/*.md) + +BIN_CHECKS=$(top_srcdir)/contrib/devtools/symbol-check.py \ + $(top_srcdir)/contrib/devtools/security-check.py + +COVERAGE_INFO = baseline_filtered_combined.info baseline.info \ + leveldb_baseline.info test_bitcoin_filtered.info total_coverage.info \ + baseline_filtered.info \ + leveldb_baseline_filtered.info test_bitcoin_coverage.info test_bitcoin.info \ + zcash-gtest.info zcash-gtest_filtered.info zcash-gtest_coverage.info + +dist-hook: + -$(GIT) archive --format=tar HEAD -- src/clientversion.cpp | $(AMTAR) -C $(top_distdir) -xf - + +$(if $(findstring src/,$(MAKECMDGOALS)),$(MAKECMDGOALS), none): FORCE + $(MAKE) -C src $(patsubst src/%,%,$@) + +$(BITCOIND_BIN): FORCE + $(MAKE) -C src $(@F) + +$(BITCOIN_CLI_BIN): FORCE + $(MAKE) -C src $(@F) + +check-security: FORCE + $(MAKE) -C src check-security + +check-symbols: FORCE + $(MAKE) -C src check-symbols + +if USE_LCOV + +baseline.info: + $(LCOV) -c -i -d $(abs_builddir)/src -o $@ + +baseline_filtered.info: baseline.info + $(LCOV) -r $< "/usr/include/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/*.h" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/boost/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gmock/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gtest/*" \ + "$(abs_builddir)/src/gtest/*" \ + "$(abs_builddir)/src/test/*" \ + "$(abs_builddir)/src/wallet/gtest/*" \ + "$(abs_builddir)/src/wallet/test/*" \ + -o $@ + +leveldb_baseline.info: baseline_filtered.info + $(LCOV) -c -i -d $(abs_builddir)/src/leveldb -b $(abs_builddir)/src/leveldb -o $@ + +leveldb_baseline_filtered.info: leveldb_baseline.info + $(LCOV) -r $< "/usr/include/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/*.h" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/boost/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gmock/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gtest/*" \ + "$(abs_builddir)/src/gtest/*" \ + "$(abs_builddir)/src/test/*" \ + "$(abs_builddir)/src/wallet/gtest/*" \ + "$(abs_builddir)/src/wallet/test/*" \ + -o $@ + +baseline_filtered_combined.info: leveldb_baseline_filtered.info baseline_filtered.info + $(LCOV) -a leveldb_baseline_filtered.info -a baseline_filtered.info -o $@ + +test_bitcoin.info: baseline_filtered_combined.info + $(MAKE) -C src/ bitcoin_test_check + $(LCOV) -c -d $(abs_builddir)/src -t test_bitcoin -o $@ + $(LCOV) -z -d $(abs_builddir)/src + $(LCOV) -z -d $(abs_builddir)/src/leveldb + +test_bitcoin_filtered.info: test_bitcoin.info + $(LCOV) -r $< "/usr/include/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/*.h" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/boost/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gmock/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gtest/*" \ + "$(abs_builddir)/src/gtest/*" \ + "$(abs_builddir)/src/test/*" \ + "$(abs_builddir)/src/wallet/gtest/*" \ + "$(abs_builddir)/src/wallet/test/*" \ + -o $@ + +zcash-gtest.info: baseline_filtered_combined.info + $(MAKE) -C src/ zcash-gtest_check + $(LCOV) -c -d $(abs_builddir)/src -t zcash-gtest -o $@ + $(LCOV) -z -d $(abs_builddir)/src + $(LCOV) -z -d $(abs_builddir)/src/leveldb + +zcash-gtest_filtered.info: zcash-gtest.info + $(LCOV) -r $< "/usr/include/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/*.h" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/boost/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gmock/*" \ + "$(abs_builddir)/depends/x86_64-pc-linux-gnu/include/gtest/*" \ + "$(abs_builddir)/src/gtest/*" \ + "$(abs_builddir)/src/test/*" \ + "$(abs_builddir)/src/wallet/gtest/*" \ + "$(abs_builddir)/src/wallet/test/*" \ + -o $@ + +test_bitcoin_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -o $@ + +zcash-gtest_coverage.info: baseline_filtered_combined.info zcash-gtest_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a zcash-gtest_filtered.info -o $@ + +total_coverage.info: baseline_filtered_combined.info test_bitcoin_filtered.info zcash-gtest_filtered.info + $(LCOV) -a baseline_filtered.info -a leveldb_baseline_filtered.info -a test_bitcoin_filtered.info -a zcash-gtest_filtered.info -o $@ | $(GREP) "\%" | $(AWK) '{ print substr($$3,2,50) "/" $$5 }' > coverage_percent.txt + +test_bitcoin.coverage/.dirstamp: test_bitcoin_coverage.info + $(GENHTML) -s $< -o $(@D) + @touch $@ + +zcash-gtest.coverage/.dirstamp: zcash-gtest_coverage.info + $(GENHTML) -s $< -o $(@D) + @touch $@ + +cov-zcash: zcash-gtest.coverage/.dirstamp + +total.coverage/.dirstamp: total_coverage.info + $(GENHTML) -s $< -o $(@D) + @touch $@ + +cov: test_bitcoin.coverage/.dirstamp cov-zcash total.coverage/.dirstamp + +endif + +dist_bin_SCRIPTS = zcutil/fetch-params.sh +dist_noinst_SCRIPTS = autogen.sh zcutil/build-debian-package.sh zcutil/build.sh + +RUST_DIST = $(top_srcdir)/.cargo $(top_srcdir)/Cargo.toml $(top_srcdir)/Cargo.lock $(top_srcdir)/rust-toolchain.toml + +EXTRA_DIST = $(top_srcdir)/share/genbuild.sh qa/pull-tester/rpc-tests.py qa/rpc-tests qa/zcash $(DIST_DOCS) $(BIN_CHECKS) $(RUST_DIST) + +install-exec-hook: + mv $(DESTDIR)$(bindir)/fetch-params.sh $(DESTDIR)$(bindir)/zcash-fetch-params + +.INTERMEDIATE: $(COVERAGE_INFO) + +DISTCHECK_CONFIGURE_FLAGS = --enable-man + +clean-local: + rm -rf test_bitcoin.coverage/ zcash-gtest.coverage/ total.coverage/ + rm -rf afl-temp + rm -rf qa/pull-tester/__pycache__ + +distclean-local: + rm -f zcutil/bin/db_* + rmdir zcutil/bin 2>/dev/null || true + +rpc-tests: $(BITCOIND_BIN) + qa/pull-tester/rpc-tests.py $(RPC_TEST) diff --git a/README.md b/README.md new file mode 100644 index 000000000..127ace633 --- /dev/null +++ b/README.md @@ -0,0 +1,83 @@ +Zcash 5.6.1 + +=========== + +What is Zcash? +-------------- + +[Zcash](https://z.cash/) is an implementation of the "Zerocash" protocol. +Initially based on Bitcoin's design, Zcash intends to offer a far +higher standard of privacy through a sophisticated zero-knowledge +proving scheme that preserves confidentiality of transaction +metadata. More technical details are available in our [Protocol +Specification](https://zips.z.cash/protocol/protocol.pdf). + +## The `zcashd` Full Node + +This repository hosts the `zcashd` software, a Zcash consensus node +implementation. It downloads and stores the entire history of Zcash +transactions. Depending on the speed of your computer and network +connection, the synchronization process could take several days. + +

+ +

+ +The `zcashd` code is derived from a source fork of +[Bitcoin Core](https://github.com/bitcoin/bitcoin). The code was forked +initially from Bitcoin Core v0.11.2, and the two codebases have diverged +substantially. + +#### :lock: Security Warnings + +See important security warnings on the +[Security Information page](https://z.cash/support/security/). + +**Zcash is experimental and a work in progress.** Use it at your own risk. + +#### :ledger: Deprecation Policy + +This release is considered deprecated 16 weeks after the release day. There +is an automatic deprecation shutdown feature which will halt the node some +time after this 16-week period. The automatic feature is based on block +height. + +## Other Zcash Implementations + +The [Zebra](https://github.com/ZcashFoundation/zebra) project offers a +different Zcash consensus node implementation, written largely from the +ground up. + +## Getting Started + +Please see our [user +guide](https://zcash.readthedocs.io/en/latest/rtd_pages/rtd_docs/user_guide.html) +for instructions on joining the main Zcash network. + +### Need Help? + +* :blue_book: See the documentation at the [ReadTheDocs](https://zcash.readthedocs.io) + for help and more information. +* :incoming_envelope: Ask for help on the [Zcash](https://forum.z.cash/) forum. +* :speech_balloon: Join our community on [Discord](https://discordapp.com/invite/PhJY6Pm) +* 🧑‍🎓: Learn at [ZecHub](https://wiki.zechub.xyz/) + +Participation in the Zcash project is subject to a +[Code of Conduct](code_of_conduct.md). + +### Building + +Build Zcash along with most dependencies from source by running the following command: + +``` +./zcutil/build.sh -j$(nproc) +``` + +Currently, Zcash is only officially supported on Debian and Ubuntu. See the +[Debian / Ubuntu build](https://zcash.readthedocs.io/en/latest/rtd_pages/Debian-Ubuntu-build.html) +for detailed instructions. + +License +------- + +For license information see the file [COPYING](COPYING). diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 000000000..0baf1be36 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,66 @@ +This page is copyright The Electric Coin Company, 2019. It is posted in order to conform to this standard: https://github.com/RD-Crypto-Spec/Responsible-Disclosure/tree/d47a5a3dafa5942c8849a93441745fdd186731e6 + +# Security Disclosures +## Receiving Disclosures + +The Electric Coin Company is committed to working with researchers who submit security vulnerability notifications to us to resolve those issues on an appropriate timeline and perform a coordinated release, giving credit to the reporter if they would like. + +Please submit issues to security@z.cash, using the following PGP key: + +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +mQENBFaegcoBCAC+G82ZBYYm1GoVn4dKa0WiLYD/Q+BuU89PS1X7A4eOOy8g9yS4 +wJKMzB0AxFsH/t85P7pPZwHw3i2gmiJKeIqEGhEBL08D3id2u6ZyCnwDuWs0i6My +MXWTwK5shvE61ZI/KPbjemoOG6MPF5QdrouNqei2Vk+4RjbRCyyS0A59GQi2dNZX +BMwTnHnUZ5qi6T0RFelqJ3dE5Nc/UwJPdAcg71c3b3dMOHjaDBMPB6+fTLBeidV6 +5B72nGO3eIYkMUNj+qCQmM/esRkmGmlDH/9WGMBOKCq7Yw3LyEoPOi5cba1m8SN2 +xFlNzkUGrlVrwZMF+1UdjvN7BGDypA3Dr/STABEBAAG0JVpjYXNoIFNlY3VyaXR5 +IFRlYW0gPHNlY3VyaXR5QHouY2FzaD6JATcEEwEIACEFAlaegcoCGwMFCwkIBwIG +FQgJCgsCBBYCAwECHgECF4AACgkQiPuLhti1poxlRAf/bZ6fhUby5bAbViAO4TzQ +yfbD0ksGeF8MHicPz7HqOYuXAE9GrKnVAOFptwRo94O+iRC5aXhW8OAP+38IWorv +gsAuag7Y8k0nlfNdrJRqqJpjyxtiuv+cd2o5dre8E9PVNE5IPv9qEJA4Zag3snmC +a+O4HAqKeXYddunFq2drLkTRlOwuFkGXJzwi3VSNVYCuuGyezFDuaD45ltmsXgid +jZSdnnc6L1BrEd9LVzahvFV0+fT4bNKQHQDk+f0RTnHed+m9NqAoC9K8ftPTQ/i4 +5+W/dXJATztWDrJ7ZevHXGR+RAhMNsT1psvnQsJzMkUz1GMdQOtk4PfuZLGSIiTM +ErkBDQRWnoHKAQgAp+w+xsPJWFdadE6Ok1aZC0Lk1J9xU/cqX1aBlkwi5SynwOkV +Eg1xNHLJMelp13bgDjLRsvaMbsseaCVk3goNln4atNbZpqz6FoM/f8pJx52LFD0j +CFFOVUlGEF0h+KdFr+3JHI+mg+3ifXTD4Dajj4lpu8kR/FQjftcxyttByz01wLRO +sK5BDC856WzHXAJuX6TpX4sGJujzKoLXR5V0SkUopqn9g4aJGnWuNh4kyOQI6fd7 +YZyPZhWDrXdgInCKAKAgq8r6hgSDMYFvmflp6+reCfeOe1VFF8q3Foio02YPIrQW +WjjH0w6nOvOKCEtxistz1sP6ZoYq4gR41LOwIQARAQABiQEfBBgBCAAJBQJWnoHK +AhsMAAoJEIj7i4bYtaaMiA4IALIy4xP/Btu86yT3b53t8cfYZddFSO8Nlg+y3EMu +1LchdSOpWgpXCvQ7d4ndWGsuBSmQ+jaRwU2UIkq2iIxf5cg63dJz9grAcF6MXCrO +t5BSowFC4m3RFaEaG6G6SjDVIA0ZEdEMFd9Gzc1ikqbVLyNuJXKmzz0evvbAJgVO +D0nht5ifwLjQxM4olvYHUwtT0wPhniH69ghFo8LQiMgncjaukDzbgANiuj07QYy/ +DlzhQUsp1qZvqZnVKqUJ3lFb86b6zoqoRNiUnvP9JB2v3kLG0T39UlcXUFnZJ/4H +CDHCrwSovQRMHtoOWZijBNobO2y1d0FkUpzNlNw44Ssw0Vo= +=6GYS +-----END PGP PUBLIC KEY BLOCK----- +``` + +## Sending Disclosures + +In the case where we become aware of security issues affecting other projects that has never affected Zcash, our intention is to inform those projects of security issues on a best effort basis. + +In the case where we fix a security issue in Zcash that also affects the following neighboring projects, our intention is to engage in responsible disclosures with them as described in https://github.com/RD-Crypto-Spec/Responsible-Disclosure, subject to the deviations described in the section at the bottom of this document. + +## Bilateral Responsible Disclosure Agreements + +We have set up agreements with the following neighboring projects to share vulnerability information, subject to the deviations described in the next section. + +Specifically, we have agreed to engage in responsible disclosures for security issues affecting this repository with the following contacts: + +- Zcash Foundation https://github.com/ZcashFoundation/zebra/security/policy +- Horizen security@horizen.io https://github.com/HorizenOfficial/zen/blob/master/SECURITY.md +- Komodo ca333@komodoplatform.com via PGP +- BitcoinABC https://github.com/Bitcoin-ABC/bitcoin-abc/blob/master/DISCLOSURE_POLICY.md + +## Deviations from the Standard + +Zcash is a technology that provides strong privacy. Notes are encrypted to their destination, and then the monetary base is kept via zero-knowledge proofs intended to only be creatable by the real holder of Zcash. If this fails, and a counterfeiting bug results, that counterfeiting bug might be exploited without any way for blockchain analyzers to identify the perpetrator or which data in the blockchain has been used to exploit the bug. Rollbacks before that point, such as have been executed in some other projects in such cases, are therefore impossible. + +The standard describes reporters of vulnerabilities including full details of an issue, in order to reproduce it. This is necessary for instance in the case of an external researcher both demonstrating and proving that there really is a security issue, and that security issue really has the impact that they say it has - allowing the development team to accurately prioritize and resolve the issue. + +In the case of a counterfeiting bug, however, just like in CVE-2019-7167, we might decide not to include those details with our reports to partners ahead of coordinated release, so long as we are sure that they are vulnerable. + diff --git a/autogen.sh b/autogen.sh new file mode 100755 index 000000000..5b2b84a09 --- /dev/null +++ b/autogen.sh @@ -0,0 +1,18 @@ +#!/bin/sh +# Copyright (c) 2016-2019 The Zcash developers +# Copyright (c) 2013-2019 The Bitcoin Core developers +# Copyright (c) 2013-2019 Bitcoin Developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +export LC_ALL=C +set -e +srcdir="$(dirname $0)" +cd "$srcdir" +if [ -z ${LIBTOOLIZE} ] && GLIBTOOLIZE="$(command -v glibtoolize)"; then + LIBTOOLIZE="${GLIBTOOLIZE}" + export LIBTOOLIZE +fi +command -v autoreconf >/dev/null || \ + (echo "configuration failed, please install autoconf first" && exit 1) +autoreconf --install --force --warnings=all diff --git a/build-aux/m4/ax_boost_base.m4 b/build-aux/m4/ax_boost_base.m4 new file mode 100644 index 000000000..66264d01a --- /dev/null +++ b/build-aux/m4/ax_boost_base.m4 @@ -0,0 +1,303 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_boost_base.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_BASE([MINIMUM-VERSION], [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND]) +# +# DESCRIPTION +# +# Test for the Boost C++ libraries of a particular version (or newer) +# +# If no path to the installed boost library is given the macro searches +# under /usr, /usr/local, /opt, /opt/local and /opt/homebrew and evaluates +# the $BOOST_ROOT environment variable. Further documentation is available +# at . +# +# This macro calls: +# +# AC_SUBST(BOOST_CPPFLAGS) / AC_SUBST(BOOST_LDFLAGS) +# +# And sets: +# +# HAVE_BOOST +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# Copyright (c) 2009 Peter Adolphs +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 51 + +# example boost program (need to pass version) +m4_define([_AX_BOOST_BASE_PROGRAM], + [AC_LANG_PROGRAM([[ +#include +]],[[ +(void) ((void)sizeof(char[1 - 2*!!((BOOST_VERSION) < ($1))])); +]])]) + +AC_DEFUN([AX_BOOST_BASE], +[ +AC_ARG_WITH([boost], + [AS_HELP_STRING([--with-boost@<:@=ARG@:>@], + [use Boost library from a standard location (ARG=yes), + from the specified location (ARG=), + or disable it (ARG=no) + @<:@ARG=yes@:>@ ])], + [ + AS_CASE([$withval], + [no],[want_boost="no";_AX_BOOST_BASE_boost_path=""], + [yes],[want_boost="yes";_AX_BOOST_BASE_boost_path=""], + [want_boost="yes";_AX_BOOST_BASE_boost_path="$withval"]) + ], + [want_boost="yes"]) + + +AC_ARG_WITH([boost-libdir], + [AS_HELP_STRING([--with-boost-libdir=LIB_DIR], + [Force given directory for boost libraries. + Note that this will override library path detection, + so use this parameter only if default library detection fails + and you know exactly where your boost libraries are located.])], + [ + AS_IF([test -d "$withval"], + [_AX_BOOST_BASE_boost_lib_path="$withval"], + [AC_MSG_ERROR([--with-boost-libdir expected directory name])]) + ], + [_AX_BOOST_BASE_boost_lib_path=""]) + +BOOST_LDFLAGS="" +BOOST_CPPFLAGS="" +AS_IF([test "x$want_boost" = "xyes"], + [_AX_BOOST_BASE_RUNDETECT([$1],[$2],[$3])]) +AC_SUBST(BOOST_CPPFLAGS) +AC_SUBST(BOOST_LDFLAGS) +]) + + +# convert a version string in $2 to numeric and affect to polymorphic var $1 +AC_DEFUN([_AX_BOOST_BASE_TONUMERICVERSION],[ + AS_IF([test "x$2" = "x"],[_AX_BOOST_BASE_TONUMERICVERSION_req="1.20.0"],[_AX_BOOST_BASE_TONUMERICVERSION_req="$2"]) + _AX_BOOST_BASE_TONUMERICVERSION_req_shorten=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\.[[0-9]]*\)'` + _AX_BOOST_BASE_TONUMERICVERSION_req_major=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '\([[0-9]]*\)'` + AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_major" = "x"], + [AC_MSG_ERROR([You should at least specify libboost major version])]) + _AX_BOOST_BASE_TONUMERICVERSION_req_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.\([[0-9]]*\)'` + AS_IF([test "x$_AX_BOOST_BASE_TONUMERICVERSION_req_minor" = "x"], + [_AX_BOOST_BASE_TONUMERICVERSION_req_minor="0"]) + _AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req : '[[0-9]]*\.[[0-9]]*\.\([[0-9]]*\)'` + AS_IF([test "X$_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor" = "X"], + [_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor="0"]) + _AX_BOOST_BASE_TONUMERICVERSION_RET=`expr $_AX_BOOST_BASE_TONUMERICVERSION_req_major \* 100000 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_minor \* 100 \+ $_AX_BOOST_BASE_TONUMERICVERSION_req_sub_minor` + AS_VAR_SET($1,$_AX_BOOST_BASE_TONUMERICVERSION_RET) +]) + +dnl Run the detection of boost should be run only if $want_boost +AC_DEFUN([_AX_BOOST_BASE_RUNDETECT],[ + _AX_BOOST_BASE_TONUMERICVERSION(WANT_BOOST_VERSION,[$1]) + succeeded=no + + + AC_REQUIRE([AC_CANONICAL_HOST]) + dnl On 64-bit systems check for system libraries in both lib64 and lib. + dnl The former is specified by FHS, but e.g. Debian does not adhere to + dnl this (as it rises problems for generic multi-arch support). + dnl The last entry in the list is chosen by default when no libraries + dnl are found, e.g. when only header-only libraries are installed! + AS_CASE([${host_cpu}], + [x86_64],[libsubdirs="lib64 libx32 lib lib64"], + [mips*64*],[libsubdirs="lib64 lib32 lib lib64"], + [ppc64|powerpc64|s390x|sparc64|aarch64|ppc64le|powerpc64le|riscv64|e2k],[libsubdirs="lib64 lib lib64"], + [libsubdirs="lib"] + ) + + dnl allow for real multi-arch paths e.g. /usr/lib/x86_64-linux-gnu. Give + dnl them priority over the other paths since, if libs are found there, they + dnl are almost assuredly the ones desired. + AS_CASE([${host_cpu}], + [i?86],[multiarch_libsubdir="lib/i386-${host_os}"], + [armv7l],[multiarch_libsubdir="lib/arm-${host_os}"], + [multiarch_libsubdir="lib/${host_cpu}-${host_os}"] + ) + + dnl first we check the system location for boost libraries + dnl this location is chosen if boost libraries are installed with the --layout=system option + dnl or if you install boost with RPM + AS_IF([test "x$_AX_BOOST_BASE_boost_path" != "x"],[ + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) includes in "$_AX_BOOST_BASE_boost_path/include"]) + AS_IF([test -d "$_AX_BOOST_BASE_boost_path/include" && test -r "$_AX_BOOST_BASE_boost_path/include"],[ + AC_MSG_RESULT([yes]) + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include" + for _AX_BOOST_BASE_boost_path_tmp in $multiarch_libsubdir $libsubdirs; do + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION) lib path in "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"]) + AS_IF([test -d "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" && test -r "$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp" ],[ + AC_MSG_RESULT([yes]) + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$_AX_BOOST_BASE_boost_path_tmp"; + break; + ], + [AC_MSG_RESULT([no])]) + done],[ + AC_MSG_RESULT([no])]) + ],[ + if test X"$cross_compiling" = Xyes; then + search_libsubdirs=$multiarch_libsubdir + else + search_libsubdirs="$multiarch_libsubdir $libsubdirs" + fi + for _AX_BOOST_BASE_boost_path_tmp in /usr /usr/local /opt /opt/local /opt/homebrew ; do + if test -d "$_AX_BOOST_BASE_boost_path_tmp/include/boost" && test -r "$_AX_BOOST_BASE_boost_path_tmp/include/boost" ; then + for libsubdir in $search_libsubdirs ; do + if ls "$_AX_BOOST_BASE_boost_path_tmp/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path_tmp/$libsubdir" + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path_tmp/include" + break; + fi + done + ]) + + dnl overwrite ld flags if we have required special directory with + dnl --with-boost-libdir parameter + AS_IF([test "x$_AX_BOOST_BASE_boost_lib_path" != "x"], + [BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_lib_path"]) + + AC_MSG_CHECKING([for boostlib >= $1 ($WANT_BOOST_VERSION)]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_REQUIRE([AC_PROG_CXX]) + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ + AC_MSG_RESULT(yes) + succeeded=yes + found_system=yes + ],[ + ]) + AC_LANG_POP([C++]) + + + + dnl if we found no boost with system layout we search for boost libraries + dnl built and installed without the --layout=system option or for a staged(not installed) version + if test "x$succeeded" != "xyes" ; then + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + BOOST_CPPFLAGS= + if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + BOOST_LDFLAGS= + fi + _version=0 + if test -n "$_AX_BOOST_BASE_boost_path" ; then + if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path"; then + for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + V_CHECK=`expr $_version_tmp \> $_version` + if test "x$V_CHECK" = "x1" ; then + _version=$_version_tmp + fi + VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path/include/boost-$VERSION_UNDERSCORE" + done + dnl if nothing found search for layout used in Windows distributions + if test -z "$BOOST_CPPFLAGS"; then + if test -d "$_AX_BOOST_BASE_boost_path/boost" && test -r "$_AX_BOOST_BASE_boost_path/boost"; then + BOOST_CPPFLAGS="-I$_AX_BOOST_BASE_boost_path" + fi + fi + dnl if we found something and BOOST_LDFLAGS was unset before + dnl (because "$_AX_BOOST_BASE_boost_lib_path" = ""), set it here. + if test -n "$BOOST_CPPFLAGS" && test -z "$BOOST_LDFLAGS"; then + for libsubdir in $libsubdirs ; do + if ls "$_AX_BOOST_BASE_boost_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$_AX_BOOST_BASE_boost_path/$libsubdir" + fi + fi + else + if test "x$cross_compiling" != "xyes" ; then + for _AX_BOOST_BASE_boost_path in /usr /usr/local /opt /opt/local /opt/homebrew ; do + if test -d "$_AX_BOOST_BASE_boost_path" && test -r "$_AX_BOOST_BASE_boost_path" ; then + for i in `ls -d $_AX_BOOST_BASE_boost_path/include/boost-* 2>/dev/null`; do + _version_tmp=`echo $i | sed "s#$_AX_BOOST_BASE_boost_path##" | sed 's/\/include\/boost-//' | sed 's/_/./'` + V_CHECK=`expr $_version_tmp \> $_version` + if test "x$V_CHECK" = "x1" ; then + _version=$_version_tmp + best_path=$_AX_BOOST_BASE_boost_path + fi + done + fi + done + + VERSION_UNDERSCORE=`echo $_version | sed 's/\./_/'` + BOOST_CPPFLAGS="-I$best_path/include/boost-$VERSION_UNDERSCORE" + if test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + for libsubdir in $libsubdirs ; do + if ls "$best_path/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + BOOST_LDFLAGS="-L$best_path/$libsubdir" + fi + fi + + if test -n "$BOOST_ROOT" ; then + for libsubdir in $libsubdirs ; do + if ls "$BOOST_ROOT/stage/$libsubdir/libboost_"* >/dev/null 2>&1 ; then break; fi + done + if test -d "$BOOST_ROOT" && test -r "$BOOST_ROOT" && test -d "$BOOST_ROOT/stage/$libsubdir" && test -r "$BOOST_ROOT/stage/$libsubdir"; then + version_dir=`expr //$BOOST_ROOT : '.*/\(.*\)'` + stage_version=`echo $version_dir | sed 's/boost_//' | sed 's/_/./g'` + stage_version_shorten=`expr $stage_version : '\([[0-9]]*\.[[0-9]]*\)'` + V_CHECK=`expr $stage_version_shorten \>\= $_version` + if test "x$V_CHECK" = "x1" && test -z "$_AX_BOOST_BASE_boost_lib_path" ; then + AC_MSG_NOTICE(We will use a staged boost library from $BOOST_ROOT) + BOOST_CPPFLAGS="-I$BOOST_ROOT" + BOOST_LDFLAGS="-L$BOOST_ROOT/stage/$libsubdir" + fi + fi + fi + fi + + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([_AX_BOOST_BASE_PROGRAM($WANT_BOOST_VERSION)],[ + AC_MSG_RESULT(yes) + succeeded=yes + found_system=yes + ],[ + ]) + AC_LANG_POP([C++]) + fi + + if test "x$succeeded" != "xyes" ; then + if test "x$_version" = "x0" ; then + AC_MSG_NOTICE([[We could not detect the boost libraries (version $1 or higher). If you have a staged boost library (still not installed) please specify \$BOOST_ROOT in your environment and do not give a PATH to --with-boost option. If you are sure you have boost installed, then check your version number looking in . See http://randspringer.de/boost for more documentation.]]) + else + AC_MSG_NOTICE([Your boost libraries seems to old (version $_version).]) + fi + # execute ACTION-IF-NOT-FOUND (if present): + ifelse([$3], , :, [$3]) + else + AC_DEFINE(HAVE_BOOST,,[define if the Boost library is available]) + # execute ACTION-IF-FOUND (if present): + ifelse([$2], , :, [$2]) + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + +]) diff --git a/build-aux/m4/ax_boost_chrono.m4 b/build-aux/m4/ax_boost_chrono.m4 new file mode 100644 index 000000000..4cd3b8604 --- /dev/null +++ b/build-aux/m4/ax_boost_chrono.m4 @@ -0,0 +1,118 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_boost_chrono.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_CHRONO +# +# DESCRIPTION +# +# Test for Chrono library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_CHRONO_LIB) +# +# And sets: +# +# HAVE_BOOST_CHRONO +# +# LICENSE +# +# Copyright (c) 2012 Xiyue Deng +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 5 + +AC_DEFUN([AX_BOOST_CHRONO], +[ + AC_ARG_WITH([boost-chrono], + AS_HELP_STRING([--with-boost-chrono@<:@=special-lib@:>@], + [use the Chrono library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-chrono=boost_chrono-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_chrono_lib="" + else + want_boost="yes" + ax_boost_user_chrono_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Chrono library is available, + ax_cv_boost_chrono, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[boost::chrono::system_clock::time_point* time = new boost::chrono::system_clock::time_point; delete time;]])], + ax_cv_boost_chrono=yes, ax_cv_boost_chrono=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_chrono" = "xyes"; then + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_CHRONO,,[define if the Boost::Chrono library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + if test "x$ax_boost_user_chrono_lib" = "x"; then + for libextension in `ls $BOOSTLIBDIR/libboost_chrono*.so* $BOOSTLIBDIR/libboost_chrono*.dylib* $BOOSTLIBDIR/libboost_chrono*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_chrono.*\)\.so.*$;\1;' -e 's;^lib\(boost_chrono.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_chrono.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + if test "x$link_chrono" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_chrono*.dll* $BOOSTLIBDIR/boost_chrono*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_chrono.*\)\.dll.*$;\1;' -e 's;^\(boost_chrono.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_chrono_lib boost_chrono-$ax_boost_user_chrono_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_CHRONO_LIB="-l$ax_lib"; AC_SUBST(BOOST_CHRONO_LIB) link_chrono="yes"; break], + [link_chrono="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Chrono library!) + fi + if test "x$link_chrono" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_boost_filesystem.m4 b/build-aux/m4/ax_boost_filesystem.m4 new file mode 100644 index 000000000..12f7bc5e2 --- /dev/null +++ b/build-aux/m4/ax_boost_filesystem.m4 @@ -0,0 +1,118 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_boost_filesystem.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_FILESYSTEM +# +# DESCRIPTION +# +# Test for Filesystem library from the Boost C++ libraries. The macro +# requires a preceding call to AX_BOOST_BASE. Further documentation is +# available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_FILESYSTEM_LIB) +# +# And sets: +# +# HAVE_BOOST_FILESYSTEM +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# Copyright (c) 2009 Michael Tindal +# Copyright (c) 2009 Roman Rybalko +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 28 + +AC_DEFUN([AX_BOOST_FILESYSTEM], +[ + AC_ARG_WITH([boost-filesystem], + AS_HELP_STRING([--with-boost-filesystem@<:@=special-lib@:>@], + [use the Filesystem library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-filesystem=boost_filesystem-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_filesystem_lib="" + else + want_boost="yes" + ax_boost_user_filesystem_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + LIBS_SAVED=$LIBS + LIBS="$LIBS $BOOST_SYSTEM_LIB" + export LIBS + + AC_CACHE_CHECK(whether the Boost::Filesystem library is available, + ax_cv_boost_filesystem, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[using namespace boost::filesystem; + path my_path( "foo/bar/data.txt" ); + return 0;]])], + ax_cv_boost_filesystem=yes, ax_cv_boost_filesystem=no) + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_filesystem" = "xyes"; then + AC_DEFINE(HAVE_BOOST_FILESYSTEM,,[define if the Boost::Filesystem library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + if test "x$ax_boost_user_filesystem_lib" = "x"; then + for libextension in `ls -r $BOOSTLIBDIR/libboost_filesystem* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + if test "x$link_filesystem" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_filesystem* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + fi + else + for ax_lib in $ax_boost_user_filesystem_lib boost_filesystem-$ax_boost_user_filesystem_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_FILESYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_FILESYSTEM_LIB) link_filesystem="yes"; break], + [link_filesystem="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Filesystem library!) + fi + if test "x$link_filesystem" != "xyes"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + LIBS="$LIBS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_boost_program_options.m4 b/build-aux/m4/ax_boost_program_options.m4 new file mode 100644 index 000000000..7d23da464 --- /dev/null +++ b/build-aux/m4/ax_boost_program_options.m4 @@ -0,0 +1,108 @@ +# ============================================================================= +# https://www.gnu.org/software/autoconf-archive/ax_boost_program_options.html +# ============================================================================= +# +# SYNOPSIS +# +# AX_BOOST_PROGRAM_OPTIONS +# +# DESCRIPTION +# +# Test for program options library from the Boost C++ libraries. The macro +# requires a preceding call to AX_BOOST_BASE. Further documentation is +# available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) +# +# And sets: +# +# HAVE_BOOST_PROGRAM_OPTIONS +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 26 + +AC_DEFUN([AX_BOOST_PROGRAM_OPTIONS], +[ + AC_ARG_WITH([boost-program-options], + AS_HELP_STRING([--with-boost-program-options@<:@=special-lib@:>@], + [use the program options library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-program-options=boost_program_options-gcc-mt-1_33_1 ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_program_options_lib="" + else + want_boost="yes" + ax_boost_user_program_options_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + export want_boost + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + AC_CACHE_CHECK([whether the Boost::Program_Options library is available], + ax_cv_boost_program_options, + [AC_LANG_PUSH(C++) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include + ]], + [[boost::program_options::error err("Error message"); + return 0;]])], + ax_cv_boost_program_options=yes, ax_cv_boost_program_options=no) + AC_LANG_POP([C++]) + ]) + if test "$ax_cv_boost_program_options" = yes; then + AC_DEFINE(HAVE_BOOST_PROGRAM_OPTIONS,,[define if the Boost::PROGRAM_OPTIONS library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + if test "x$ax_boost_user_program_options_lib" = "x"; then + for libextension in `ls $BOOSTLIBDIR/libboost_program_options*.so* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.so.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.dylib* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.dylib.*$;\1;'` `ls $BOOSTLIBDIR/libboost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^lib\(boost_program_options.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + if test "x$link_program_options" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_program_options*.dll* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_program_options.*\)\.dll.*$;\1;'` `ls $BOOSTLIBDIR/boost_program_options*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_program_options.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + fi + else + for ax_lib in $ax_boost_user_program_options_lib boost_program_options-$ax_boost_user_program_options_lib; do + AC_CHECK_LIB($ax_lib, main, + [BOOST_PROGRAM_OPTIONS_LIB="-l$ax_lib"; AC_SUBST(BOOST_PROGRAM_OPTIONS_LIB) link_program_options="yes"; break], + [link_program_options="no"]) + done + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Program_Options library!) + fi + if test "x$link_program_options" != "xyes"; then + AC_MSG_ERROR([Could not link against [$ax_lib] !]) + fi + fi + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_boost_system.m4 b/build-aux/m4/ax_boost_system.m4 new file mode 100644 index 000000000..323e2a676 --- /dev/null +++ b/build-aux/m4/ax_boost_system.m4 @@ -0,0 +1,121 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_boost_system.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_SYSTEM +# +# DESCRIPTION +# +# Test for System library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_SYSTEM_LIB) +# +# And sets: +# +# HAVE_BOOST_SYSTEM +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# Copyright (c) 2008 Michael Tindal +# Copyright (c) 2008 Daniel Casimiro +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 20 + +AC_DEFUN([AX_BOOST_SYSTEM], +[ + AC_ARG_WITH([boost-system], + AS_HELP_STRING([--with-boost-system@<:@=special-lib@:>@], + [use the System library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-system=boost_system-gcc-mt ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_system_lib="" + else + want_boost="yes" + ax_boost_user_system_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::System library is available, + ax_cv_boost_system, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + CXXFLAGS= + + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[boost::system::error_category *a = 0;]])], + ax_cv_boost_system=yes, ax_cv_boost_system=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_system" = "xyes"; then + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_SYSTEM,,[define if the Boost::System library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + if test "x$ax_boost_user_system_lib" = "x"; then + for libextension in `ls -r $BOOSTLIBDIR/libboost_system* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + if test "x$link_system" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_system* 2>/dev/null | sed 's,.*/,,' | sed -e 's,\..*,,'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_system_lib boost_system-$ax_boost_user_system_lib; do + AC_CHECK_LIB($ax_lib, exit, + [BOOST_SYSTEM_LIB="-l$ax_lib"; AC_SUBST(BOOST_SYSTEM_LIB) link_system="yes"; break], + [link_system="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::System library!) + fi + if test "x$link_system" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_boost_thread.m4 b/build-aux/m4/ax_boost_thread.m4 new file mode 100644 index 000000000..75e80e6e7 --- /dev/null +++ b/build-aux/m4/ax_boost_thread.m4 @@ -0,0 +1,187 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_boost_thread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_BOOST_THREAD +# +# DESCRIPTION +# +# Test for Thread library from the Boost C++ libraries. The macro requires +# a preceding call to AX_BOOST_BASE. Further documentation is available at +# . +# +# This macro calls: +# +# AC_SUBST(BOOST_THREAD_LIB) +# +# And sets: +# +# HAVE_BOOST_THREAD +# +# LICENSE +# +# Copyright (c) 2009 Thomas Porschberg +# Copyright (c) 2009 Michael Tindal +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 33 + +AC_DEFUN([AX_BOOST_THREAD], +[ + AC_ARG_WITH([boost-thread], + AS_HELP_STRING([--with-boost-thread@<:@=special-lib@:>@], + [use the Thread library from boost - + it is possible to specify a certain library for the linker + e.g. --with-boost-thread=boost_thread-gcc-mt ]), + [ + if test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_thread_lib="" + else + want_boost="yes" + ax_boost_user_thread_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_BUILD]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Thread library is available, + ax_cv_boost_thread, + [AC_LANG_PUSH([C++]) + CXXFLAGS_SAVE=$CXXFLAGS + + case "x$host_os" in + xsolaris ) + CXXFLAGS="-pthreads $CXXFLAGS" + break; + ;; + xmingw32 ) + CXXFLAGS="-mthreads $CXXFLAGS" + break; + ;; + *android* ) + break; + ;; + * ) + CXXFLAGS="-pthread $CXXFLAGS" + break; + ;; + esac + + AC_COMPILE_IFELSE([ + AC_LANG_PROGRAM( + [[@%:@include ]], + [[boost::thread_group thrds; + return 0;]])], + ax_cv_boost_thread=yes, ax_cv_boost_thread=no) + CXXFLAGS=$CXXFLAGS_SAVE + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_thread" = "xyes"; then + case "x$host_os" in + xsolaris ) + BOOST_CPPFLAGS="-pthreads $BOOST_CPPFLAGS" + break; + ;; + xmingw32 ) + BOOST_CPPFLAGS="-mthreads $BOOST_CPPFLAGS" + break; + ;; + *android* ) + break; + ;; + * ) + BOOST_CPPFLAGS="-pthread $BOOST_CPPFLAGS" + break; + ;; + esac + + AC_SUBST(BOOST_CPPFLAGS) + + AC_DEFINE(HAVE_BOOST_THREAD,, + [define if the Boost::Thread library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + LDFLAGS_SAVE=$LDFLAGS + case "x$host_os" in + *bsd* ) + LDFLAGS="-pthread $LDFLAGS" + break; + ;; + esac + if test "x$ax_boost_user_thread_lib" = "x"; then + for libextension in `ls -r $BOOSTLIBDIR/libboost_thread* 2>/dev/null | sed 's,.*/lib,,' | sed 's,\..*,,'`; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], + [link_thread="no"]) + done + if test "x$link_thread" != "xyes"; then + for libextension in `ls -r $BOOSTLIBDIR/boost_thread* 2>/dev/null | sed 's,.*/,,' | sed 's,\..*,,'`; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], + [link_thread="no"]) + done + fi + + else + for ax_lib in $ax_boost_user_thread_lib boost_thread-$ax_boost_user_thread_lib; do + AC_CHECK_LIB($ax_lib, exit, + [link_thread="yes"; break], + [link_thread="no"]) + done + + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Thread library!) + fi + if test "x$link_thread" = "xno"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + else + BOOST_THREAD_LIB="-l$ax_lib" + case "x$host_os" in + *bsd* ) + BOOST_LDFLAGS="-pthread $BOOST_LDFLAGS" + break; + ;; + xsolaris ) + BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread" + break; + ;; + xmingw32 ) + break; + ;; + *android* ) + break; + ;; + * ) + BOOST_THREAD_LIB="$BOOST_THREAD_LIB -lpthread" + break; + ;; + esac + AC_SUBST(BOOST_THREAD_LIB) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_boost_unit_test_framework.m4 b/build-aux/m4/ax_boost_unit_test_framework.m4 new file mode 100644 index 000000000..4cca32fcf --- /dev/null +++ b/build-aux/m4/ax_boost_unit_test_framework.m4 @@ -0,0 +1,137 @@ +# ================================================================================= +# https://www.gnu.org/software/autoconf-archive/ax_boost_unit_test_framework.html +# ================================================================================= +# +# SYNOPSIS +# +# AX_BOOST_UNIT_TEST_FRAMEWORK +# +# DESCRIPTION +# +# Test for Unit_Test_Framework library from the Boost C++ libraries. The +# macro requires a preceding call to AX_BOOST_BASE. Further documentation +# is available at . +# +# This macro calls: +# +# AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) +# +# And sets: +# +# HAVE_BOOST_UNIT_TEST_FRAMEWORK +# +# LICENSE +# +# Copyright (c) 2008 Thomas Porschberg +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 22 + +AC_DEFUN([AX_BOOST_UNIT_TEST_FRAMEWORK], +[ + AC_ARG_WITH([boost-unit-test-framework], + AS_HELP_STRING([--with-boost-unit-test-framework@<:@=special-lib@:>@], + [use the Unit_Test_Framework library from boost - it is possible to specify a certain library for the linker + e.g. --with-boost-unit-test-framework=boost_unit_test_framework-gcc ]), + [ + if test "$withval" = "no"; then + want_boost="no" + elif test "$withval" = "yes"; then + want_boost="yes" + ax_boost_user_unit_test_framework_lib="" + else + want_boost="yes" + ax_boost_user_unit_test_framework_lib="$withval" + fi + ], + [want_boost="yes"] + ) + + if test "x$want_boost" = "xyes"; then + AC_REQUIRE([AC_PROG_CC]) + CPPFLAGS_SAVED="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + export CPPFLAGS + + LDFLAGS_SAVED="$LDFLAGS" + LDFLAGS="$LDFLAGS $BOOST_LDFLAGS" + export LDFLAGS + + AC_CACHE_CHECK(whether the Boost::Unit_Test_Framework library is available, + ax_cv_boost_unit_test_framework, + [AC_LANG_PUSH([C++]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[@%:@include ]], + [[using boost::unit_test::test_suite; + test_suite* test= BOOST_TEST_SUITE( "Unit test example 1" ); if (test == NULL) { return 1; } else { return 0; }]])], + ax_cv_boost_unit_test_framework=yes, ax_cv_boost_unit_test_framework=no) + AC_LANG_POP([C++]) + ]) + if test "x$ax_cv_boost_unit_test_framework" = "xyes"; then + AC_DEFINE(HAVE_BOOST_UNIT_TEST_FRAMEWORK,,[define if the Boost::Unit_Test_Framework library is available]) + BOOSTLIBDIR=`echo $BOOST_LDFLAGS | sed -e 's/@<:@^\/@:>@*//'` + + if test "x$ax_boost_user_unit_test_framework_lib" = "x"; then + saved_ldflags="${LDFLAGS}" + for monitor_library in `ls $BOOSTLIBDIR/libboost_unit_test_framework*.so* $BOOSTLIBDIR/libboost_unit_test_framework*.dylib* $BOOSTLIBDIR/libboost_unit_test_framework*.a* 2>/dev/null` ; do + if test -r $monitor_library ; then + libextension=`echo $monitor_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.dylib.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a.*$;\1;'` + ax_lib=${libextension} + link_unit_test_framework="yes" + else + link_unit_test_framework="no" + fi + + if test "x$link_unit_test_framework" = "xyes"; then + BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib" + AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) + break + fi + done + if test "x$link_unit_test_framework" != "xyes"; then + for libextension in `ls $BOOSTLIBDIR/boost_unit_test_framework*.dll* $BOOSTLIBDIR/boost_unit_test_framework*.a* 2>/dev/null | sed 's,.*/,,' | sed -e 's;^\(boost_unit_test_framework.*\)\.dll.*$;\1;' -e 's;^\(boost_unit_test_framework.*\)\.a.*$;\1;'` ; do + ax_lib=${libextension} + AC_CHECK_LIB($ax_lib, exit, + [BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib"; AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) link_unit_test_framework="yes"; break], + [link_unit_test_framework="no"]) + done + fi + else + link_unit_test_framework="no" + saved_ldflags="${LDFLAGS}" + for ax_lib in boost_unit_test_framework-$ax_boost_user_unit_test_framework_lib $ax_boost_user_unit_test_framework_lib ; do + if test "x$link_unit_test_framework" = "xyes"; then + break; + fi + for unittest_library in `ls $BOOSTLIBDIR/lib${ax_lib}.so* $BOOSTLIBDIR/lib${ax_lib}.a* 2>/dev/null` ; do + if test -r $unittest_library ; then + libextension=`echo $unittest_library | sed 's,.*/,,' | sed -e 's;^lib\(boost_unit_test_framework.*\)\.so.*$;\1;' -e 's;^lib\(boost_unit_test_framework.*\)\.a*$;\1;'` + ax_lib=${libextension} + link_unit_test_framework="yes" + else + link_unit_test_framework="no" + fi + + if test "x$link_unit_test_framework" = "xyes"; then + BOOST_UNIT_TEST_FRAMEWORK_LIB="-l$ax_lib" + AC_SUBST(BOOST_UNIT_TEST_FRAMEWORK_LIB) + break + fi + done + done + fi + if test "x$ax_lib" = "x"; then + AC_MSG_ERROR(Could not find a version of the Boost::Unit_Test_Framework library!) + fi + if test "x$link_unit_test_framework" != "xyes"; then + AC_MSG_ERROR(Could not link against $ax_lib !) + fi + fi + + CPPFLAGS="$CPPFLAGS_SAVED" + LDFLAGS="$LDFLAGS_SAVED" + fi +]) diff --git a/build-aux/m4/ax_check_compile_flag.m4 b/build-aux/m4/ax_check_compile_flag.m4 new file mode 100644 index 000000000..ca3639715 --- /dev/null +++ b/build-aux/m4/ax_check_compile_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's compiler +# or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the current language's default +# flags (e.g. CFLAGS) when the check is done. The check is thus made with +# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to +# force the compiler to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_COMPILE_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_COMPILE_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ + ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS + _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" + AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_COMPILE_FLAGS diff --git a/build-aux/m4/ax_check_link_flag.m4 b/build-aux/m4/ax_check_link_flag.m4 new file mode 100644 index 000000000..eb01a6ce1 --- /dev/null +++ b/build-aux/m4/ax_check_link_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the linker or gives an error. +# (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the linker's default flags +# when the check is done. The check is thus made with the flags: "LDFLAGS +# EXTRA-FLAGS FLAG". This can for example be used to force the linker to +# issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_LINK_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_LINK_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl +AC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [ + ax_check_save_flags=$LDFLAGS + LDFLAGS="$LDFLAGS $4 $1" + AC_LINK_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + LDFLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_LINK_FLAGS diff --git a/build-aux/m4/ax_check_preproc_flag.m4 b/build-aux/m4/ax_check_preproc_flag.m4 new file mode 100644 index 000000000..ca1d5ee2b --- /dev/null +++ b/build-aux/m4/ax_check_preproc_flag.m4 @@ -0,0 +1,74 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_check_preproc_flag.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CHECK_PREPROC_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) +# +# DESCRIPTION +# +# Check whether the given FLAG works with the current language's +# preprocessor or gives an error. (Warnings, however, are ignored) +# +# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on +# success/failure. +# +# If EXTRA-FLAGS is defined, it is added to the preprocessor's default +# flags when the check is done. The check is thus made with the flags: +# "CPPFLAGS EXTRA-FLAGS FLAG". This can for example be used to force the +# preprocessor to issue an error when a bad flag is given. +# +# INPUT gives an alternative input source to AC_PREPROC_IFELSE. +# +# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this +# macro in sync with AX_CHECK_{COMPILE,LINK}_FLAG. +# +# LICENSE +# +# Copyright (c) 2008 Guido U. Draheim +# Copyright (c) 2011 Maarten Bosmans +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 4 + +AC_DEFUN([AX_CHECK_PREPROC_FLAG], +[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF +AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]cppflags_$4_$1])dnl +AC_CACHE_CHECK([whether _AC_LANG preprocessor accepts $1], CACHEVAR, [ + ax_check_save_flags=$CPPFLAGS + CPPFLAGS="$CPPFLAGS $4 $1" + AC_PREPROC_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], + [AS_VAR_SET(CACHEVAR,[yes])], + [AS_VAR_SET(CACHEVAR,[no])]) + CPPFLAGS=$ax_check_save_flags]) +AS_VAR_IF(CACHEVAR,yes, + [m4_default([$2], :)], + [m4_default([$3], :)]) +AS_VAR_POPDEF([CACHEVAR])dnl +])dnl AX_CHECK_PREPROC_FLAGS diff --git a/build-aux/m4/ax_cxx_compile_stdcxx.m4 b/build-aux/m4/ax_cxx_compile_stdcxx.m4 new file mode 100644 index 000000000..43087b2e6 --- /dev/null +++ b/build-aux/m4/ax_cxx_compile_stdcxx.m4 @@ -0,0 +1,951 @@ +# =========================================================================== +# https://www.gnu.org/software/autoconf-archive/ax_cxx_compile_stdcxx.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_CXX_COMPILE_STDCXX(VERSION, [ext|noext], [mandatory|optional]) +# +# DESCRIPTION +# +# Check for baseline language coverage in the compiler for the specified +# version of the C++ standard. If necessary, add switches to CXX and +# CXXCPP to enable support. VERSION may be '11' (for the C++11 standard) +# or '14' (for the C++14 standard). +# +# The second argument, if specified, indicates whether you insist on an +# extended mode (e.g. -std=gnu++11) or a strict conformance mode (e.g. +# -std=c++11). If neither is specified, you get whatever works, with +# preference for an extended mode. +# +# The third argument, if specified 'mandatory' or if left unspecified, +# indicates that baseline support for the specified C++ standard is +# required and that the macro should error out if no mode with that +# support is found. If specified 'optional', then configuration proceeds +# regardless, after defining HAVE_CXX${VERSION} if and only if a +# supporting mode is found. +# +# LICENSE +# +# Copyright (c) 2008 Benjamin Kosnik +# Copyright (c) 2012 Zack Weinberg +# Copyright (c) 2013 Roy Stogner +# Copyright (c) 2014, 2015 Google Inc.; contributed by Alexey Sokolov +# Copyright (c) 2015 Paul Norman +# Copyright (c) 2015 Moritz Klammler +# Copyright (c) 2016, 2018 Krzesimir Nowak +# Copyright (c) 2019 Enji Cooper +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 11 + +dnl This macro is based on the code from the AX_CXX_COMPILE_STDCXX_11 macro +dnl (serial version number 13). + +AC_DEFUN([AX_CXX_COMPILE_STDCXX], [dnl + m4_if([$1], [11], [ax_cxx_compile_alternatives="11 0x"], + [$1], [14], [ax_cxx_compile_alternatives="14 1y"], + [$1], [17], [ax_cxx_compile_alternatives="17 1z"], + [m4_fatal([invalid first argument `$1' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$2], [], [], + [$2], [ext], [], + [$2], [noext], [], + [m4_fatal([invalid second argument `$2' to AX_CXX_COMPILE_STDCXX])])dnl + m4_if([$3], [], [ax_cxx_compile_cxx$1_required=true], + [$3], [mandatory], [ax_cxx_compile_cxx$1_required=true], + [$3], [optional], [ax_cxx_compile_cxx$1_required=false], + [m4_fatal([invalid third argument `$3' to AX_CXX_COMPILE_STDCXX])]) + AC_LANG_PUSH([C++])dnl + ac_success=no + + m4_if([$2], [noext], [], [dnl + if test x$ac_success = xno; then + for alternative in ${ax_cxx_compile_alternatives}; do + switch="-std=gnu++${alternative}" + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + fi]) + + m4_if([$2], [ext], [], [dnl + if test x$ac_success = xno; then + dnl HP's aCC needs +std=c++11 according to: + dnl http://h21007.www2.hp.com/portal/download/files/unprot/aCxx/PDF_Release_Notes/769149-001.pdf + dnl Cray's crayCC needs "-h std=c++11" + for alternative in ${ax_cxx_compile_alternatives}; do + for switch in -std=c++${alternative} +std=c++${alternative} "-h std=c++${alternative}"; do + cachevar=AS_TR_SH([ax_cv_cxx_compile_cxx$1_$switch]) + AC_CACHE_CHECK(whether $CXX supports C++$1 features with $switch, + $cachevar, + [ac_save_CXX="$CXX" + CXX="$CXX $switch" + AC_COMPILE_IFELSE([AC_LANG_SOURCE([_AX_CXX_COMPILE_STDCXX_testbody_$1])], + [eval $cachevar=yes], + [eval $cachevar=no]) + CXX="$ac_save_CXX"]) + if eval test x\$$cachevar = xyes; then + CXX="$CXX $switch" + if test -n "$CXXCPP" ; then + CXXCPP="$CXXCPP $switch" + fi + ac_success=yes + break + fi + done + if test x$ac_success = xyes; then + break + fi + done + fi]) + AC_LANG_POP([C++]) + if test x$ax_cxx_compile_cxx$1_required = xtrue; then + if test x$ac_success = xno; then + AC_MSG_ERROR([*** A compiler with support for C++$1 language features is required.]) + fi + fi + if test x$ac_success = xno; then + HAVE_CXX$1=0 + AC_MSG_NOTICE([No compiler with C++$1 support was found]) + else + HAVE_CXX$1=1 + AC_DEFINE(HAVE_CXX$1,1, + [define if the compiler supports basic C++$1 syntax]) + fi + AC_SUBST(HAVE_CXX$1) +]) + + +dnl Test body for checking C++11 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_11], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 +) + + +dnl Test body for checking C++14 support + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_14], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 +) + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_17], + _AX_CXX_COMPILE_STDCXX_testbody_new_in_11 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_14 + _AX_CXX_COMPILE_STDCXX_testbody_new_in_17 +) + +dnl Tests for new features in C++11 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_11], [[ + +// If the compiler admits that it is not ready for C++11, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201103L + +#error "This is not a C++11 compiler" + +#else + +namespace cxx11 +{ + + namespace test_static_assert + { + + template + struct check + { + static_assert(sizeof(int) <= sizeof(T), "not big enough"); + }; + + } + + namespace test_final_override + { + + struct Base + { + virtual ~Base() {} + virtual void f() {} + }; + + struct Derived : public Base + { + virtual ~Derived() override {} + virtual void f() override {} + }; + + } + + namespace test_double_right_angle_brackets + { + + template < typename T > + struct check {}; + + typedef check single_type; + typedef check> double_type; + typedef check>> triple_type; + typedef check>>> quadruple_type; + + } + + namespace test_decltype + { + + int + f() + { + int a = 1; + decltype(a) b = 2; + return a + b; + } + + } + + namespace test_type_deduction + { + + template < typename T1, typename T2 > + struct is_same + { + static const bool value = false; + }; + + template < typename T > + struct is_same + { + static const bool value = true; + }; + + template < typename T1, typename T2 > + auto + add(T1 a1, T2 a2) -> decltype(a1 + a2) + { + return a1 + a2; + } + + int + test(const int c, volatile int v) + { + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == false, ""); + auto ac = c; + auto av = v; + auto sumi = ac + av + 'x'; + auto sumf = ac + av + 1.0; + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == true, ""); + static_assert(is_same::value == false, ""); + static_assert(is_same::value == true, ""); + return (sumf > 0.0) ? sumi : add(c, v); + } + + } + + namespace test_noexcept + { + + int f() { return 0; } + int g() noexcept { return 0; } + + static_assert(noexcept(f()) == false, ""); + static_assert(noexcept(g()) == true, ""); + + } + + namespace test_constexpr + { + + template < typename CharT > + unsigned long constexpr + strlen_c_r(const CharT *const s, const unsigned long acc) noexcept + { + return *s ? strlen_c_r(s + 1, acc + 1) : acc; + } + + template < typename CharT > + unsigned long constexpr + strlen_c(const CharT *const s) noexcept + { + return strlen_c_r(s, 0UL); + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("1") == 1UL, ""); + static_assert(strlen_c("example") == 7UL, ""); + static_assert(strlen_c("another\0example") == 7UL, ""); + + } + + namespace test_rvalue_references + { + + template < int N > + struct answer + { + static constexpr int value = N; + }; + + answer<1> f(int&) { return answer<1>(); } + answer<2> f(const int&) { return answer<2>(); } + answer<3> f(int&&) { return answer<3>(); } + + void + test() + { + int i = 0; + const int c = 0; + static_assert(decltype(f(i))::value == 1, ""); + static_assert(decltype(f(c))::value == 2, ""); + static_assert(decltype(f(0))::value == 3, ""); + } + + } + + namespace test_uniform_initialization + { + + struct test + { + static const int zero {}; + static const int one {1}; + }; + + static_assert(test::zero == 0, ""); + static_assert(test::one == 1, ""); + + } + + namespace test_lambdas + { + + void + test1() + { + auto lambda1 = [](){}; + auto lambda2 = lambda1; + lambda1(); + lambda2(); + } + + int + test2() + { + auto a = [](int i, int j){ return i + j; }(1, 2); + auto b = []() -> int { return '0'; }(); + auto c = [=](){ return a + b; }(); + auto d = [&](){ return c; }(); + auto e = [a, &b](int x) mutable { + const auto identity = [](int y){ return y; }; + for (auto i = 0; i < a; ++i) + a += b--; + return x + identity(a + b); + }(0); + return a + b + c + d + e; + } + + int + test3() + { + const auto nullary = [](){ return 0; }; + const auto unary = [](int x){ return x; }; + using nullary_t = decltype(nullary); + using unary_t = decltype(unary); + const auto higher1st = [](nullary_t f){ return f(); }; + const auto higher2nd = [unary](nullary_t f1){ + return [unary, f1](unary_t f2){ return f2(unary(f1())); }; + }; + return higher1st(nullary) + higher2nd(nullary)(unary); + } + + } + + namespace test_variadic_templates + { + + template + struct sum; + + template + struct sum + { + static constexpr auto value = N0 + sum::value; + }; + + template <> + struct sum<> + { + static constexpr auto value = 0; + }; + + static_assert(sum<>::value == 0, ""); + static_assert(sum<1>::value == 1, ""); + static_assert(sum<23>::value == 23, ""); + static_assert(sum<1, 2>::value == 3, ""); + static_assert(sum<5, 5, 11>::value == 21, ""); + static_assert(sum<2, 3, 5, 7, 11, 13>::value == 41, ""); + + } + + // http://stackoverflow.com/questions/13728184/template-aliases-and-sfinae + // Clang 3.1 fails with headers of libstd++ 4.8.3 when using std::function + // because of this. + namespace test_template_alias_sfinae + { + + struct foo {}; + + template + using member = typename T::member_type; + + template + void func(...) {} + + template + void func(member*) {} + + void test(); + + void test() { func(0); } + + } + +} // namespace cxx11 + +#endif // __cplusplus >= 201103L + +]]) + + +dnl Tests for new features in C++14 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_14], [[ + +// If the compiler admits that it is not ready for C++14, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201402L + +#error "This is not a C++14 compiler" + +#else + +namespace cxx14 +{ + + namespace test_polymorphic_lambdas + { + + int + test() + { + const auto lambda = [](auto&&... args){ + const auto istiny = [](auto x){ + return (sizeof(x) == 1UL) ? 1 : 0; + }; + const int aretiny[] = { istiny(args)... }; + return aretiny[0]; + }; + return lambda(1, 1L, 1.0f, '1'); + } + + } + + namespace test_binary_literals + { + + constexpr auto ivii = 0b0000000000101010; + static_assert(ivii == 42, "wrong value"); + + } + + namespace test_generalized_constexpr + { + + template < typename CharT > + constexpr unsigned long + strlen_c(const CharT *const s) noexcept + { + auto length = 0UL; + for (auto p = s; *p; ++p) + ++length; + return length; + } + + static_assert(strlen_c("") == 0UL, ""); + static_assert(strlen_c("x") == 1UL, ""); + static_assert(strlen_c("test") == 4UL, ""); + static_assert(strlen_c("another\0test") == 7UL, ""); + + } + + namespace test_lambda_init_capture + { + + int + test() + { + auto x = 0; + const auto lambda1 = [a = x](int b){ return a + b; }; + const auto lambda2 = [a = lambda1(x)](){ return a; }; + return lambda2(); + } + + } + + namespace test_digit_separators + { + + constexpr auto ten_million = 100'000'000; + static_assert(ten_million == 100000000, ""); + + } + + namespace test_return_type_deduction + { + + auto f(int& x) { return x; } + decltype(auto) g(int& x) { return x; } + + template < typename T1, typename T2 > + struct is_same + { + static constexpr auto value = false; + }; + + template < typename T > + struct is_same + { + static constexpr auto value = true; + }; + + int + test() + { + auto x = 0; + static_assert(is_same::value, ""); + static_assert(is_same::value, ""); + return x; + } + + } + +} // namespace cxx14 + +#endif // __cplusplus >= 201402L + +]]) + + +dnl Tests for new features in C++17 + +m4_define([_AX_CXX_COMPILE_STDCXX_testbody_new_in_17], [[ + +// If the compiler admits that it is not ready for C++17, why torture it? +// Hopefully, this will speed up the test. + +#ifndef __cplusplus + +#error "This is not a C++ compiler" + +#elif __cplusplus < 201703L + +#error "This is not a C++17 compiler" + +#else + +#include +#include +#include + +namespace cxx17 +{ + + namespace test_constexpr_lambdas + { + + constexpr int foo = [](){return 42;}(); + + } + + namespace test::nested_namespace::definitions + { + + } + + namespace test_fold_expression + { + + template + int multiply(Args... args) + { + return (args * ... * 1); + } + + template + bool all(Args... args) + { + return (args && ...); + } + + } + + namespace test_extended_static_assert + { + + static_assert (true); + + } + + namespace test_auto_brace_init_list + { + + auto foo = {5}; + auto bar {5}; + + static_assert(std::is_same, decltype(foo)>::value); + static_assert(std::is_same::value); + } + + namespace test_typename_in_template_template_parameter + { + + template typename X> struct D; + + } + + namespace test_fallthrough_nodiscard_maybe_unused_attributes + { + + int f1() + { + return 42; + } + + [[nodiscard]] int f2() + { + [[maybe_unused]] auto unused = f1(); + + switch (f1()) + { + case 17: + f1(); + [[fallthrough]]; + case 42: + f1(); + } + return f1(); + } + + } + + namespace test_extended_aggregate_initialization + { + + struct base1 + { + int b1, b2 = 42; + }; + + struct base2 + { + base2() { + b3 = 42; + } + int b3; + }; + + struct derived : base1, base2 + { + int d; + }; + + derived d1 {{1, 2}, {}, 4}; // full initialization + derived d2 {{}, {}, 4}; // value-initialized bases + + } + + namespace test_general_range_based_for_loop + { + + struct iter + { + int i; + + int& operator* () + { + return i; + } + + const int& operator* () const + { + return i; + } + + iter& operator++() + { + ++i; + return *this; + } + }; + + struct sentinel + { + int i; + }; + + bool operator== (const iter& i, const sentinel& s) + { + return i.i == s.i; + } + + bool operator!= (const iter& i, const sentinel& s) + { + return !(i == s); + } + + struct range + { + iter begin() const + { + return {0}; + } + + sentinel end() const + { + return {5}; + } + }; + + void f() + { + range r {}; + + for (auto i : r) + { + [[maybe_unused]] auto v = i; + } + } + + } + + namespace test_lambda_capture_asterisk_this_by_value + { + + struct t + { + int i; + int foo() + { + return [*this]() + { + return i; + }(); + } + }; + + } + + namespace test_enum_class_construction + { + + enum class byte : unsigned char + {}; + + byte foo {42}; + + } + + namespace test_constexpr_if + { + + template + int f () + { + if constexpr(cond) + { + return 13; + } + else + { + return 42; + } + } + + } + + namespace test_selection_statement_with_initializer + { + + int f() + { + return 13; + } + + int f2() + { + if (auto i = f(); i > 0) + { + return 3; + } + + switch (auto i = f(); i + 4) + { + case 17: + return 2; + + default: + return 1; + } + } + + } + + namespace test_template_argument_deduction_for_class_templates + { + + template + struct pair + { + pair (T1 p1, T2 p2) + : m1 {p1}, + m2 {p2} + {} + + T1 m1; + T2 m2; + }; + + void f() + { + [[maybe_unused]] auto p = pair{13, 42u}; + } + + } + + namespace test_non_type_auto_template_parameters + { + + template + struct B + {}; + + B<5> b1; + B<'a'> b2; + + } + + namespace test_structured_bindings + { + + int arr[2] = { 1, 2 }; + std::pair pr = { 1, 2 }; + + auto f1() -> int(&)[2] + { + return arr; + } + + auto f2() -> std::pair& + { + return pr; + } + + struct S + { + int x1 : 2; + volatile double y1; + }; + + S f3() + { + return {}; + } + + auto [ x1, y1 ] = f1(); + auto& [ xr1, yr1 ] = f1(); + auto [ x2, y2 ] = f2(); + auto& [ xr2, yr2 ] = f2(); + const auto [ x3, y3 ] = f3(); + + } + + namespace test_exception_spec_type_system + { + + struct Good {}; + struct Bad {}; + + void g1() noexcept; + void g2(); + + template + Bad + f(T*, T*); + + template + Good + f(T1*, T2*); + + static_assert (std::is_same_v); + + } + + namespace test_inline_variables + { + + template void f(T) + {} + + template inline T g(T) + { + return T{}; + } + + template<> inline void f<>(int) + {} + + template<> int g<>(int) + { + return 5; + } + + } + +} // namespace cxx17 + +#endif // __cplusplus < 201703L + +]]) diff --git a/build-aux/m4/ax_gcc_func_attribute.m4 b/build-aux/m4/ax_gcc_func_attribute.m4 new file mode 100644 index 000000000..02b597357 --- /dev/null +++ b/build-aux/m4/ax_gcc_func_attribute.m4 @@ -0,0 +1,223 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_gcc_func_attribute.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_GCC_FUNC_ATTRIBUTE(ATTRIBUTE) +# +# DESCRIPTION +# +# This macro checks if the compiler supports one of GCC's function +# attributes; many other compilers also provide function attributes with +# the same syntax. Compiler warnings are used to detect supported +# attributes as unsupported ones are ignored by default so quieting +# warnings when using this macro will yield false positives. +# +# The ATTRIBUTE parameter holds the name of the attribute to be checked. +# +# If ATTRIBUTE is supported define HAVE_FUNC_ATTRIBUTE_. +# +# The macro caches its result in the ax_cv_have_func_attribute_ +# variable. +# +# The macro currently supports the following function attributes: +# +# alias +# aligned +# alloc_size +# always_inline +# artificial +# cold +# const +# constructor +# constructor_priority for constructor attribute with priority +# deprecated +# destructor +# dllexport +# dllimport +# error +# externally_visible +# flatten +# format +# format_arg +# gnu_inline +# hot +# ifunc +# leaf +# malloc +# noclone +# noinline +# nonnull +# noreturn +# nothrow +# optimize +# pure +# unused +# used +# visibility +# warning +# warn_unused_result +# weak +# weakref +# +# Unsupported function attributes will be tested with a prototype returning +# an int and not accepting any arguments and the result of the check might +# be wrong or meaningless so use with care. +# +# LICENSE +# +# Copyright (c) 2013 Gabriele Svelto +# +# Copying and distribution of this file, with or without modification, are +# permitted in any medium without royalty provided the copyright notice +# and this notice are preserved. This file is offered as-is, without any +# warranty. + +#serial 3 + +AC_DEFUN([AX_GCC_FUNC_ATTRIBUTE], [ + AS_VAR_PUSHDEF([ac_var], [ax_cv_have_func_attribute_$1]) + + AC_CACHE_CHECK([for __attribute__(($1))], [ac_var], [ + AC_LINK_IFELSE([AC_LANG_PROGRAM([ + m4_case([$1], + [alias], [ + int foo( void ) { return 0; } + int bar( void ) __attribute__(($1("foo"))); + ], + [aligned], [ + int foo( void ) __attribute__(($1(32))); + ], + [alloc_size], [ + void *foo(int a) __attribute__(($1(1))); + ], + [always_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [artificial], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [cold], [ + int foo( void ) __attribute__(($1)); + ], + [const], [ + int foo( void ) __attribute__(($1)); + ], + [constructor_priority], [ + int foo( void ) __attribute__((__constructor__(65535/2))); + ], + [constructor], [ + int foo( void ) __attribute__(($1)); + ], + [deprecated], [ + int foo( void ) __attribute__(($1(""))); + ], + [destructor], [ + int foo( void ) __attribute__(($1)); + ], + [dllexport], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [dllimport], [ + int foo( void ) __attribute__(($1)); + ], + [error], [ + int foo( void ) __attribute__(($1(""))); + ], + [externally_visible], [ + int foo( void ) __attribute__(($1)); + ], + [flatten], [ + int foo( void ) __attribute__(($1)); + ], + [format], [ + int foo(const char *p, ...) __attribute__(($1(printf, 1, 2))); + ], + [format_arg], [ + char *foo(const char *p) __attribute__(($1(1))); + ], + [gnu_inline], [ + inline __attribute__(($1)) int foo( void ) { return 0; } + ], + [hot], [ + int foo( void ) __attribute__(($1)); + ], + [ifunc], [ + int my_foo( void ) { return 0; } + static int (*resolve_foo(void))(void) { return my_foo; } + int foo( void ) __attribute__(($1("resolve_foo"))); + ], + [leaf], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [malloc], [ + void *foo( void ) __attribute__(($1)); + ], + [noclone], [ + int foo( void ) __attribute__(($1)); + ], + [noinline], [ + __attribute__(($1)) int foo( void ) { return 0; } + ], + [nonnull], [ + int foo(char *p) __attribute__(($1(1))); + ], + [noreturn], [ + void foo( void ) __attribute__(($1)); + ], + [nothrow], [ + int foo( void ) __attribute__(($1)); + ], + [optimize], [ + __attribute__(($1(3))) int foo( void ) { return 0; } + ], + [pure], [ + int foo( void ) __attribute__(($1)); + ], + [unused], [ + int foo( void ) __attribute__(($1)); + ], + [used], [ + int foo( void ) __attribute__(($1)); + ], + [visibility], [ + int foo_def( void ) __attribute__(($1("default"))); + int foo_hid( void ) __attribute__(($1("hidden"))); + int foo_int( void ) __attribute__(($1("internal"))); + int foo_pro( void ) __attribute__(($1("protected"))); + ], + [warning], [ + int foo( void ) __attribute__(($1(""))); + ], + [warn_unused_result], [ + int foo( void ) __attribute__(($1)); + ], + [weak], [ + int foo( void ) __attribute__(($1)); + ], + [weakref], [ + static int foo( void ) { return 0; } + static int bar( void ) __attribute__(($1("foo"))); + ], + [ + m4_warn([syntax], [Unsupported attribute $1, the test may fail]) + int foo( void ) __attribute__(($1)); + ] + )], []) + ], + dnl GCC doesn't exit with an error if an unknown attribute is + dnl provided but only outputs a warning, so accept the attribute + dnl only if no warning were issued. + [AS_IF([test -s conftest.err], + [AS_VAR_SET([ac_var], [no])], + [AS_VAR_SET([ac_var], [yes])])], + [AS_VAR_SET([ac_var], [no])]) + ]) + + AS_IF([test yes = AS_VAR_GET([ac_var])], + [AC_DEFINE_UNQUOTED(AS_TR_CPP(HAVE_FUNC_ATTRIBUTE_$1), 1, + [Define to 1 if the system has the `$1' function attribute])], []) + + AS_VAR_POPDEF([ac_var]) +]) diff --git a/build-aux/m4/ax_pthread.m4 b/build-aux/m4/ax_pthread.m4 new file mode 100644 index 000000000..d218d1af7 --- /dev/null +++ b/build-aux/m4/ax_pthread.m4 @@ -0,0 +1,485 @@ +# =========================================================================== +# http://www.gnu.org/software/autoconf-archive/ax_pthread.html +# =========================================================================== +# +# SYNOPSIS +# +# AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]]) +# +# DESCRIPTION +# +# This macro figures out how to build C programs using POSIX threads. It +# sets the PTHREAD_LIBS output variable to the threads library and linker +# flags, and the PTHREAD_CFLAGS output variable to any special C compiler +# flags that are needed. (The user can also force certain compiler +# flags/libs to be tested by setting these environment variables.) +# +# Also sets PTHREAD_CC to any special C compiler that is needed for +# multi-threaded programs (defaults to the value of CC otherwise). (This +# is necessary on AIX to use the special cc_r compiler alias.) +# +# NOTE: You are assumed to not only compile your program with these flags, +# but also to link with them as well. For example, you might link with +# $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS +# +# If you are only building threaded programs, you may wish to use these +# variables in your default LIBS, CFLAGS, and CC: +# +# LIBS="$PTHREAD_LIBS $LIBS" +# CFLAGS="$CFLAGS $PTHREAD_CFLAGS" +# CC="$PTHREAD_CC" +# +# In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant +# has a nonstandard name, this macro defines PTHREAD_CREATE_JOINABLE to +# that name (e.g. PTHREAD_CREATE_UNDETACHED on AIX). +# +# Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the +# PTHREAD_PRIO_INHERIT symbol is defined when compiling with +# PTHREAD_CFLAGS. +# +# ACTION-IF-FOUND is a list of shell commands to run if a threads library +# is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it +# is not found. If ACTION-IF-FOUND is not specified, the default action +# will define HAVE_PTHREAD. +# +# Please let the authors know if this macro fails on any platform, or if +# you have any other suggestions or comments. This macro was based on work +# by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help +# from M. Frigo), as well as ac_pthread and hb_pthread macros posted by +# Alejandro Forero Cuervo to the autoconf macro repository. We are also +# grateful for the helpful feedback of numerous users. +# +# Updated for Autoconf 2.68 by Daniel Richard G. +# +# LICENSE +# +# Copyright (c) 2008 Steven G. Johnson +# Copyright (c) 2011 Daniel Richard G. +# +# This program is free software: you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by the +# Free Software Foundation, either version 3 of the License, or (at your +# option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General +# Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program. If not, see . +# +# As a special exception, the respective Autoconf Macro's copyright owner +# gives unlimited permission to copy, distribute and modify the configure +# scripts that are the output of Autoconf when processing the Macro. You +# need not follow the terms of the GNU General Public License when using +# or distributing such scripts, even though portions of the text of the +# Macro appear in them. The GNU General Public License (GPL) does govern +# all other use of the material that constitutes the Autoconf Macro. +# +# This special exception to the GPL applies to versions of the Autoconf +# Macro released by the Autoconf Archive. When you make and distribute a +# modified version of the Autoconf Macro, you may extend this special +# exception to the GPL to apply to your modified version as well. + +#serial 22 + +AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) +AC_DEFUN([AX_PTHREAD], [ +AC_REQUIRE([AC_CANONICAL_HOST]) +AC_REQUIRE([AC_PROG_CC]) +AC_REQUIRE([AC_PROG_SED]) +AC_LANG_PUSH([C]) +ax_pthread_ok=no + +# We used to check for pthread.h first, but this fails if pthread.h +# requires special compiler flags (e.g. on Tru64 or Sequent). +# It gets checked for in the link test anyway. + +# First of all, check if the user has set any of the PTHREAD_LIBS, +# etcetera environment variables, and if threads linking works using +# them: +if test "x$PTHREAD_CFLAGS$PTHREAD_LIBS" != "x"; then + ax_pthread_save_CC="$CC" + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + AS_IF([test "x$PTHREAD_CC" != "x"], [CC="$PTHREAD_CC"]) + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + AC_MSG_CHECKING([for pthread_join using $CC $PTHREAD_CFLAGS $PTHREAD_LIBS]) + AC_LINK_IFELSE([AC_LANG_CALL([], [pthread_join])], [ax_pthread_ok=yes]) + AC_MSG_RESULT([$ax_pthread_ok]) + if test "x$ax_pthread_ok" = "xno"; then + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" + fi + CC="$ax_pthread_save_CC" + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" +fi + +# We must check for the threads library under a number of different +# names; the ordering is very important because some systems +# (e.g. DEC) have both -lpthread and -lpthreads, where one of the +# libraries is broken (non-POSIX). + +# Create a list of thread flags to try. Items starting with a "-" are +# C compiler flags, and other items are library names, except for "none" +# which indicates that we try without any flags at all, and "pthread-config" +# which is a program returning the flags for the Pth emulation library. + +ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" + +# The ordering *is* (sometimes) important. Some notes on the +# individual items follow: + +# pthreads: AIX (must check this before -lpthread) +# none: in case threads are in libc; should be tried before -Kthread and +# other compiler flags to prevent continual compiler warnings +# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h) +# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads), Tru64 +# (Note: HP C rejects this with "bad form for `-t' option") +# -pthreads: Solaris/gcc (Note: HP C also rejects) +# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it +# doesn't hurt to check since this sometimes defines pthreads and +# -D_REENTRANT too), HP C (must be checked before -lpthread, which +# is present but should not be used directly; and before -mthreads, +# because the compiler interprets this as "-mt" + "-hreads") +# -mthreads: Mingw32/gcc, Lynx/gcc +# pthread: Linux, etcetera +# --thread-safe: KAI C++ +# pthread-config: use pthread-config program (for GNU Pth library) + +case $host_os in + + freebsd*) + + # -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able) + # lthread: LinuxThreads port on FreeBSD (also preferred to -pthread) + + ax_pthread_flags="-kthread lthread $ax_pthread_flags" + ;; + + hpux*) + + # From the cc(1) man page: "[-mt] Sets various -D flags to enable + # multi-threading and also sets -lpthread." + + ax_pthread_flags="-mt -pthread pthread $ax_pthread_flags" + ;; + + openedition*) + + # IBM z/OS requires a feature-test macro to be defined in order to + # enable POSIX threads at all, so give the user a hint if this is + # not set. (We don't define these ourselves, as they can affect + # other portions of the system API in unpredictable ways.) + + AC_EGREP_CPP([AX_PTHREAD_ZOS_MISSING], + [ +# if !defined(_OPEN_THREADS) && !defined(_UNIX03_THREADS) + AX_PTHREAD_ZOS_MISSING +# endif + ], + [AC_MSG_WARN([IBM z/OS requires -D_OPEN_THREADS or -D_UNIX03_THREADS to enable pthreads support.])]) + ;; + + solaris*) + + # On Solaris (at least, for some versions), libc contains stubbed + # (non-functional) versions of the pthreads routines, so link-based + # tests will erroneously succeed. (N.B.: The stubs are missing + # pthread_cleanup_push, or rather a function called by this macro, + # so we could check for that, but who knows whether they'll stub + # that too in a future libc.) So we'll check first for the + # standard Solaris way of linking pthreads (-mt -lpthread). + + ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ;; +esac + +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) + +AS_IF([test "x$GCC" = "xyes"], + [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) + +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled + +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; + + aix* | freebsd*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + + *) + ax_pthread_check_macro="--" + ;; +esac +AS_IF([test "x$ax_pthread_check_macro" = "x--"], + [ax_pthread_check_cond=0], + [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) + +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + +ax_pthread_clang_warning=no + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + PTHREAD_CFLAGS="-pthread" + PTHREAD_LIBS= + + ax_pthread_ok=yes + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + AC_CACHE_CHECK([whether Clang needs flag to prevent "argument unused" warning when linking with -pthread], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG], + [ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + AS_IF([test "x$ax_pthread_try" = "xunknown"], [break]) + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [ac_link="$ax_pthread_2step_ac_link" + AC_LINK_IFELSE([AC_LANG_SOURCE([[int main(void){return 0;}]])], + [break]) + ]) + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + AS_IF([test "x$ax_pthread_try" = "x"], [ax_pthread_try=no]) + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + ]) + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + -mt,pthread) + AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) + PTHREAD_CFLAGS="-mt" + PTHREAD_LIBS="-lpthread" + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void routine(void *a) { a = 0; } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi + +# Various other checks: +if test "x$ax_pthread_ok" = "xyes"; then + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Detect AIX lossage: JOINABLE attribute is called UNDETACHED. + AC_CACHE_CHECK([for joinable pthread attribute], + [ax_cv_PTHREAD_JOINABLE_ATTR], + [ax_cv_PTHREAD_JOINABLE_ATTR=unknown + for ax_pthread_attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include ], + [int attr = $ax_pthread_attr; return attr /* ; */])], + [ax_cv_PTHREAD_JOINABLE_ATTR=$ax_pthread_attr; break], + []) + done + ]) + AS_IF([test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xunknown" && \ + test "x$ax_cv_PTHREAD_JOINABLE_ATTR" != "xPTHREAD_CREATE_JOINABLE" && \ + test "x$ax_pthread_joinable_attr_defined" != "xyes"], + [AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], + [$ax_cv_PTHREAD_JOINABLE_ATTR], + [Define to necessary symbol if this constant + uses a non-standard name on your system.]) + ax_pthread_joinable_attr_defined=yes + ]) + + AC_CACHE_CHECK([whether more special flags are required for pthreads], + [ax_cv_PTHREAD_SPECIAL_FLAGS], + [ax_cv_PTHREAD_SPECIAL_FLAGS=no + case $host_os in + solaris*) + ax_cv_PTHREAD_SPECIAL_FLAGS="-D_POSIX_PTHREAD_SEMANTICS" + ;; + esac + ]) + AS_IF([test "x$ax_cv_PTHREAD_SPECIAL_FLAGS" != "xno" && \ + test "x$ax_pthread_special_flags_added" != "xyes"], + [PTHREAD_CFLAGS="$ax_cv_PTHREAD_SPECIAL_FLAGS $PTHREAD_CFLAGS" + ax_pthread_special_flags_added=yes]) + + AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], + [ax_cv_PTHREAD_PRIO_INHERIT], + [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[int i = PTHREAD_PRIO_INHERIT;]])], + [ax_cv_PTHREAD_PRIO_INHERIT=yes], + [ax_cv_PTHREAD_PRIO_INHERIT=no]) + ]) + AS_IF([test "x$ax_cv_PTHREAD_PRIO_INHERIT" = "xyes" && \ + test "x$ax_pthread_prio_inherit_defined" != "xyes"], + [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.]) + ax_pthread_prio_inherit_defined=yes + ]) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + # More AIX lossage: compile with *_r variant + if test "x$GCC" != "xyes"; then + case $host_os in + aix*) + AS_CASE(["x/$CC"], + [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6], + [#handle absolute path differently from PATH based program lookup + AS_CASE(["x$CC"], + [x/*], + [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC="${CC}_r"])], + [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])]) + ;; + esac + fi +fi + +test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" + +AC_SUBST([PTHREAD_LIBS]) +AC_SUBST([PTHREAD_CFLAGS]) +AC_SUBST([PTHREAD_CC]) + +# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND: +if test "x$ax_pthread_ok" = "xyes"; then + ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1]) + : +else + ax_pthread_ok=no + $2 +fi +AC_LANG_POP +])dnl AX_PTHREAD diff --git a/build-aux/m4/bitcoin_find_bdb.m4 b/build-aux/m4/bitcoin_find_bdb.m4 new file mode 100644 index 000000000..e6c365271 --- /dev/null +++ b/build-aux/m4/bitcoin_find_bdb.m4 @@ -0,0 +1,72 @@ +dnl Copyright (c) 2016-2019 The Zcash developers +dnl Copyright (c) 2013-2019 The Bitcoin Core developers +dnl Copyright (c) 2013-2019 Bitcoin Developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or https://www.opensource.org/licenses/mit-license.php . + +AC_DEFUN([BITCOIN_FIND_BDB62],[ + AC_MSG_CHECKING([for Berkeley DB C++ headers]) + BDB_CPPFLAGS= + BDB_LIBS= + bdbpath=X + bdb62path=X + bdbdirlist= + for _vn in 6.2 62 6 ''; do + for _pfx in b lib ''; do + bdbdirlist="$bdbdirlist ${_pfx}db${_vn}" + done + done + for searchpath in $bdbdirlist ''; do + test -n "${searchpath}" && searchpath="${searchpath}/" + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !((DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR >= 2) || DB_VERSION_MAJOR > 6) + #error "failed to find bdb 6.2+" + #endif + ]])],[ + if test "x$bdbpath" = "xX"; then + bdbpath="${searchpath}" + fi + ],[ + continue + ]) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include <${searchpath}db_cxx.h> + ]],[[ + #if !(DB_VERSION_MAJOR == 6 && DB_VERSION_MINOR == 2) + #error "failed to find bdb 6.2" + #endif + ]])],[ + bdb62path="${searchpath}" + break + ],[]) + done + if test "x$bdbpath" = "xX"; then + AC_MSG_RESULT([no]) + AC_MSG_ERROR([libdb_cxx headers missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + elif test "x$bdb62path" = "xX"; then + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdbpath}],db_cxx) + AC_ARG_WITH([incompatible-bdb],[AS_HELP_STRING([--with-incompatible-bdb], [allow using a bdb version other than 6.2])],[ + AC_MSG_WARN([Found Berkeley DB other than 6.2; wallets opened by this build will not be portable!]) + ],[ + AC_MSG_ERROR([Found Berkeley DB other than 6.2, required for portable wallets (--with-incompatible-bdb to ignore or --disable-wallet to disable wallet functionality)]) + ]) + else + BITCOIN_SUBDIR_TO_INCLUDE(BDB_CPPFLAGS,[${bdb62path}],db_cxx) + bdbpath="${bdb62path}" + fi + AC_SUBST(BDB_CPPFLAGS) + + # TODO: Ideally this could find the library version and make sure it matches the headers being used + for searchlib in db_cxx-6.2 db_cxx; do + AC_CHECK_LIB([$searchlib],[main],[ + BDB_LIBS="-l${searchlib}" + break + ]) + done + if test "x$BDB_LIBS" = "x"; then + AC_MSG_ERROR([libdb_cxx missing, Bitcoin Core requires this library for wallet functionality (--disable-wallet to disable wallet functionality)]) + fi + AC_SUBST(BDB_LIBS) +]) diff --git a/build-aux/m4/bitcoin_subdir_to_include.m4 b/build-aux/m4/bitcoin_subdir_to_include.m4 new file mode 100644 index 000000000..52da5ef9f --- /dev/null +++ b/build-aux/m4/bitcoin_subdir_to_include.m4 @@ -0,0 +1,20 @@ +dnl Copyright (c) 2016-2019 The Zcash developers +dnl Copyright (c) 2013-2019 The Bitcoin Core developers +dnl Copyright (c) 2013-2019 Bitcoin Developers +dnl Distributed under the MIT software license, see the accompanying +dnl file COPYING or https://www.opensource.org/licenses/mit-license.php . + +dnl BITCOIN_SUBDIR_TO_INCLUDE([CPPFLAGS-VARIABLE-NAME],[SUBDIRECTORY-NAME],[HEADER-FILE]) +dnl SUBDIRECTORY-NAME must end with a path separator +AC_DEFUN([BITCOIN_SUBDIR_TO_INCLUDE],[ + if test "x$2" = "x"; then + AC_MSG_RESULT([default]) + else + echo "#include <$2$3.h>" >conftest.cpp + newinclpath=`${CXXCPP} ${CPPFLAGS} -M conftest.cpp 2>/dev/null | [ tr -d '\\n\\r\\\\' | sed -e 's/^.*[[:space:]:]\(\/[^[:space:]]*\)]$3[\.h[[:space:]].*$/\1/' -e t -e d`] + AC_MSG_RESULT([${newinclpath}]) + if test "x${newinclpath}" != "x"; then + eval "$1=\"\$$1\"' -I${newinclpath}'" + fi + fi +]) diff --git a/build-aux/m4/l_atomic.m4 b/build-aux/m4/l_atomic.m4 new file mode 100644 index 000000000..75c43f9a9 --- /dev/null +++ b/build-aux/m4/l_atomic.m4 @@ -0,0 +1,46 @@ +dnl Copyright (c) 2015 Tim Kosse +dnl Copying and distribution of this file, with or without modification, are +dnl permitted in any medium without royalty provided the copyright notice +dnl and this notice are preserved. This file is offered as-is, without any +dnl warranty. + +# Some versions of gcc/libstdc++ require linking with -latomic if +# using the C++ atomic library. +# +# Sourced from http://bugs.debian.org/797228 + +m4_define([_CHECK_ATOMIC_testbody], [[ + #include + #include + + int main() { + std::atomic a{}; + + int64_t v = 5; + int64_t r = a.fetch_add(v); + return static_cast(r); + } +]]) + +AC_DEFUN([CHECK_ATOMIC], [ + + AC_LANG_PUSH(C++) + + AC_MSG_CHECKING([whether std::atomic can be used without link library]) + + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + LIBS="$LIBS -latomic" + AC_MSG_CHECKING([whether std::atomic needs -latomic]) + AC_LINK_IFELSE([AC_LANG_SOURCE([_CHECK_ATOMIC_testbody])],[ + AC_MSG_RESULT([yes]) + ],[ + AC_MSG_RESULT([no]) + AC_MSG_FAILURE([cannot figure out how to use std::atomic]) + ]) + ]) + + AC_LANG_POP +]) diff --git a/code_of_conduct.md b/code_of_conduct.md new file mode 100644 index 000000000..07e751de7 --- /dev/null +++ b/code_of_conduct.md @@ -0,0 +1,65 @@ +# Contributor Code of Conduct + +As contributors and maintainers of this project, and in the interest of +fostering an open and welcoming community, we pledge to respect all people who +contribute through reporting issues, posting feature requests, updating +documentation, submitting pull requests or patches, and other activities. + +We are committed to making participation in this project a harassment-free +experience for everyone, regardless of level of experience, gender, gender +identity and expression, sexual orientation, disability, personal appearance, +body size, race, ethnicity, age, religion, or nationality. + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery +* The use of language or imagery that originates with, or has been + adopted as a symbol or "dog-whistle" for, any of: right-wing extremism, + anti-Semitism, Islamophobia, white supremacism, eugenics, homophobia, or + transphobia (whether or not the use by itself falls into those categories) +* Personal attacks +* Trolling or insulting/derogatory comments +* Public or private harassment +* Publishing other's private information, such as physical or electronic + addresses, without explicit permission +* Other unethical or unprofessional conduct + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. Note that contributors may be volunteers +who do not represent Electric Coin Company. They are free to express their own +opinions so long as they adhere to these guidelines. + +By adopting this Code of Conduct, project maintainers commit themselves to +fairly and consistently applying these principles to every aspect of managing +this project. Project maintainers who do not follow or enforce the Code of +Conduct may be permanently removed from the project team. + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting a project maintainer (see below). All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. Maintainers are +obligated to maintain confidentiality with regard to the reporter of an +incident. + +You may send reports to [our Conduct email](mailto:conduct@z.cash). + +If you wish to contact specific maintainers directly, the following have made +themselves available for conduct issues: + +- Daira Hopwood (daira at z.cash) +- Sean Bowe (sean at z.cash) + + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 1.3.0, available at +[https://www.contributor-covenant.org/version/1/3/0/][version] + +[homepage]: https://www.contributor-covenant.org +[version]: https://www.contributor-covenant.org/version/1/3/0/ + diff --git a/configure.ac b/configure.ac new file mode 100644 index 000000000..e7c4df818 --- /dev/null +++ b/configure.ac @@ -0,0 +1,1324 @@ +dnl require autoconf 2.60 (AS_ECHO/AS_ECHO_N) +AC_PREREQ([2.60]) +define(_CLIENT_VERSION_MAJOR, 5) +define(_CLIENT_VERSION_MINOR, 6) +define(_CLIENT_VERSION_REVISION, 1) +define(_CLIENT_VERSION_BUILD, 50) +define(_ZC_BUILD_VAL, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, m4_incr(_CLIENT_VERSION_BUILD), m4_eval(_CLIENT_VERSION_BUILD < 50), 1, m4_eval(_CLIENT_VERSION_BUILD - 24), m4_eval(_CLIENT_VERSION_BUILD == 50), 1, , m4_eval(_CLIENT_VERSION_BUILD - 50))) +define(_CLIENT_VERSION_SUFFIX, m4_if(m4_eval(_CLIENT_VERSION_BUILD < 25), 1, _CLIENT_VERSION_REVISION-beta$1, m4_eval(_CLIENT_VERSION_BUILD < 50), 1, _CLIENT_VERSION_REVISION-rc$1, m4_eval(_CLIENT_VERSION_BUILD == 50), 1, _CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION-$1))) +define(_CLIENT_VERSION_IS_RELEASE, true) +define(_COPYRIGHT_YEAR, 2023) +AC_INIT([Zcash],[_CLIENT_VERSION_MAJOR._CLIENT_VERSION_MINOR._CLIENT_VERSION_SUFFIX(_ZC_BUILD_VAL)],[https://github.com/zcash/zcash/issues],[zcash]) +AC_CONFIG_SRCDIR([src/main.cpp]) +AC_CONFIG_HEADERS([src/config/bitcoin-config.h]) +AC_CONFIG_AUX_DIR([build-aux]) +AC_CONFIG_MACRO_DIR([build-aux/m4]) + +BITCOIN_DAEMON_NAME=zcashd +BITCOIN_CLI_NAME=zcash-cli +BITCOIN_TX_NAME=zcash-tx + +dnl Unless the user specified ARFLAGS, force it to be cr +AC_ARG_VAR(ARFLAGS, [Flags for the archiver, defaults to if not set]) +if test "x${ARFLAGS+set}" != "xset"; then + ARFLAGS="cr" +fi + +AC_CANONICAL_HOST + +AH_TOP([#ifndef BITCOIN_CONFIG_H]) +AH_TOP([#define BITCOIN_CONFIG_H]) +AH_BOTTOM([#endif //BITCOIN_CONFIG_H]) + +dnl faketime breaks configure and is only needed for make. Disable it here. +unset FAKETIME + +dnl Automake init set-up and checks +AM_INIT_AUTOMAKE([no-define subdir-objects foreign tar-pax]) + +dnl faketime messes with timestamps and causes configure to be re-run. +dnl --disable-maintainer-mode can be used to bypass this. +AM_MAINTAINER_MODE([enable]) + +dnl make the compilation flags quiet unless V=1 is used +m4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])]) + +dnl Compiler checks (here before libtool). +if test "x${CXXFLAGS+set}" = "xset"; then + CXXFLAGS_overridden=yes +else + CXXFLAGS_overridden=no +fi + +AC_PROG_CXX +m4_ifdef([AC_PROG_OBJCXX],[AC_PROG_OBJCXX]) + +dnl By default, libtool for mingw refuses to link static libs into a dll for +dnl fear of mixing pic/non-pic objects, and import/export complications. Since +dnl we have those under control, re-enable that functionality. +case $host in + *mingw*) + lt_cv_deplibs_check_method="pass_all" + ;; +esac +dnl Require C++17 compiler (no GNU extensions) +AX_CXX_COMPILE_STDCXX([17], [noext], [mandatory]) +dnl Check if -latomic is required for +CHECK_ATOMIC + +dnl Libtool init checks. +LT_INIT([pic-only]) + +dnl Zcash macros for required programs. Configure exits with error if +dnl they are not detected. +AC_DEFUN( + ZC_REQUIRE_TOOL, + [ + AC_PATH_TOOL($1, $2, $2_notfound) + if test x${$1} = x$2_notfound + then + AC_MSG_ERROR("Required tool $2 was not found") + fi + ] +) + +AC_DEFUN( + ZC_REQUIRE_PROG, + [ + AC_PATH_PROG($1, $2, $2_notfound) + if test x${$1} = x$2_notfound + then + AC_MSG_ERROR("Required program $2 was not found") + fi + ] +) + +dnl Check/return PATH for base programs. +dnl Required tools and programs: +ZC_REQUIRE_TOOL(AR, ar) +ZC_REQUIRE_TOOL(RANLIB, ranlib) +ZC_REQUIRE_TOOL(STRIP, strip) +ZC_REQUIRE_PROG([GIT], [git]) +ZC_REQUIRE_PROG(RUSTC, rustc) +ZC_REQUIRE_PROG(CARGO, cargo) +ZC_REQUIRE_PROG(CXXBRIDGE, cxxbridge) +dnl This one is still optional and checked by complicated logic below: +AC_PATH_PROG(CCACHE,ccache) +dnl This one is not currently used anywhere, thus not required: +AC_PATH_PROG(XGETTEXT,xgettext) +ZC_REQUIRE_PROG(HEXDUMP,hexdump) +AC_PATH_PROG(READELF,readelf) +ZC_REQUIRE_TOOL(CPPFILT,c++filt) + +AC_ARG_ENABLE([online-rust], + [AS_HELP_STRING([--enable-online-rust], + [enable Rust to fetch dependencies from the network (default is to use vendored dependencies)])], + [enable_online_rust=$enableval], + [enable_online_rust=no]) +AM_CONDITIONAL(ENABLE_ONLINE_RUST, test "$enable_online_rust" != no) + +# Enable wallet +AC_ARG_ENABLE([wallet], + [AS_HELP_STRING([--disable-wallet], + [disable wallet (enabled by default)])], + [enable_wallet=$enableval], + [enable_wallet=yes]) + +AC_ARG_ENABLE([mining], + [AS_HELP_STRING([--enable-mining], + [enable mining (default is yes)])], + [enable_mining=$enableval], + [enable_mining=yes]) + +AC_ARG_ENABLE(tests, + AS_HELP_STRING([--disable-tests],[do not compile tests (default is to compile)]), + [use_tests=$enableval], + [use_tests=yes]) + +AC_ARG_ENABLE(bench, + AS_HELP_STRING([--enable-bench],[compile benchmarks (default is yes)]), + [use_bench=$enableval], + [use_bench=yes]) + +AC_ARG_ENABLE([fuzz-main], + [AS_HELP_STRING([--enable-fuzz-main], + [Replace main() with a stub for fuzzing (default is no)])], + [use_fuzz_main=$enableval], + [use_fuzz_main=no]) + +AC_ARG_ENABLE([hardening], + [AS_HELP_STRING([--disable-hardening], + [do not attempt to harden the resulting executables (default is to harden when possible)])], + [use_hardening=$enableval], + [use_hardening=auto]) + +AC_ARG_ENABLE([reduce-exports], + [AS_HELP_STRING([--enable-reduce-exports], + [attempt to reduce exported symbols in the resulting executables (default is no)])], + [use_reduce_exports=$enableval], + [use_reduce_exports=no]) + +AC_ARG_ENABLE([ccache], + [AS_HELP_STRING([--disable-ccache], + [do not use ccache for building (default is to use if found)])], + [use_ccache=$enableval], + [use_ccache=auto]) + +AC_ARG_ENABLE([lcov], + [AS_HELP_STRING([--enable-lcov], + [enable lcov testing (default is no)])], + [use_lcov=yes], + [use_lcov=no]) + +AC_ARG_ENABLE([glibc-back-compat], + [AS_HELP_STRING([--enable-glibc-back-compat], + [enable backwards compatibility with glibc])], + [use_glibc_compat=$enableval], + [use_glibc_compat=no]) + +AC_ARG_ENABLE([asm], + [AS_HELP_STRING([--disable-asm], + [disable assembly routines (enabled by default)])], + [use_asm=$enableval], + [use_asm=yes]) + +if test "x$use_asm" = xyes; then + AC_DEFINE(USE_ASM, 1, [Define this symbol to build in assembly routines]) +fi + +AC_ARG_ENABLE([zmq], + [AS_HELP_STRING([--disable-zmq], + [disable ZMQ notifications])], + [use_zmq=$enableval], + [use_zmq=yes]) + +AC_ARG_WITH([protoc-bindir],[AS_HELP_STRING([--with-protoc-bindir=BIN_DIR],[specify protoc bin path])], [protoc_bin_path=$withval], []) + +AC_ARG_ENABLE(man, + [AS_HELP_STRING([--disable-man], + [do not install man pages (default is to install)])],, + enable_man=yes) +AM_CONDITIONAL(ENABLE_MAN, test "$enable_man" != no) + +# Enable debug +AC_ARG_ENABLE([debug], + [AS_HELP_STRING([--enable-debug], + [use compiler flags and macros suited for debugging (default is no)])], + [enable_debug=$enableval], + [enable_debug=no]) + +# Enable different -fsanitize options +AC_ARG_WITH([sanitizers], + [AS_HELP_STRING([--with-sanitizers], + [comma separated list of extra sanitizers to build with (default is none enabled)])], + [use_sanitizers=$withval]) + +# Enable gprof profiling +AC_ARG_ENABLE([gprof], + [AS_HELP_STRING([--enable-gprof], + [use gprof profiling compiler flags (default is no)])], + [enable_gprof=$enableval], + [enable_gprof=no]) + +# Turn warnings into errors +AC_ARG_ENABLE([werror], + [AS_HELP_STRING([--enable-werror], + [Treat all compiler warnings as errors (default is yes)])], + [enable_werror=$enableval], + [enable_werror=yes]) + +AC_LANG_PUSH([C++]) +AX_CHECK_COMPILE_FLAG([-Werror],[CXXFLAG_WERROR="-Werror"],[CXXFLAG_WERROR=""]) + +if test "x$enable_debug" = xyes; then + # Clear default -g -O2 flags + if test "x$CXXFLAGS_overridden" = xno; then + CXXFLAGS="" + fi + + # Disable all optimizations + AX_CHECK_COMPILE_FLAG([-O0], [[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -O0"]],,[[$CXXFLAG_WERROR]]) + + # Prefer -g3, fall back to -g if that is unavailable. + AX_CHECK_COMPILE_FLAG( + [-g3], + [[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g3"]], + [AX_CHECK_COMPILE_FLAG([-g],[[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g"]],,[[$CXXFLAG_WERROR]])], + [[$CXXFLAG_WERROR]]) + + AX_CHECK_PREPROC_FLAG([-DDEBUG],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG"]],,[[$CXXFLAG_WERROR]]) + AX_CHECK_PREPROC_FLAG([-DDEBUG_LOCKORDER],[[DEBUG_CPPFLAGS="$DEBUG_CPPFLAGS -DDEBUG_LOCKORDER"]],,[[$CXXFLAG_WERROR]]) + AX_CHECK_COMPILE_FLAG([-ftrapv],[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -ftrapv"],,[[$CXXFLAG_WERROR]]) +else + # Even with enable_debug=no we build with standard debug symbols + AX_CHECK_COMPILE_FLAG([-g],[[DEBUG_CXXFLAGS="$DEBUG_CXXFLAGS -g"]],,[[$CXXFLAG_WERROR]]) + + # -ftrapv and -fwrapv conflict, so we only set this if enable_debug=no + AX_CHECK_COMPILE_FLAG([-fwrapv],[CXXFLAGS="$CXXFLAGS -fwrapv"],,[[$CXXFLAG_WERROR]]) +fi + +if test x$use_sanitizers != x; then + # First check if the compiler accepts flags. If an incompatible pair like + # -fsanitize=address,thread is used here, this check will fail. This will also + # fail if a bad argument is passed, e.g. -fsanitize=undfeined + AX_CHECK_COMPILE_FLAG( + [[-fsanitize=$use_sanitizers]], + [[SANITIZER_CXXFLAGS=-fsanitize=$use_sanitizers]], + [AC_MSG_ERROR([compiler did not accept requested flags])]) + + # Some compilers (e.g. GCC) require additional libraries like libasan, + # libtsan, libubsan, etc. Make sure linking still works with the sanitize + # flag. This is a separate check so we can give a better error message when + # the sanitize flags are supported by the compiler but the actual sanitizer + # libs are missing. + AX_CHECK_LINK_FLAG( + [[-fsanitize=$use_sanitizers]], + [[SANITIZER_LDFLAGS=-fsanitize=$use_sanitizers]], + [AC_MSG_ERROR([linker did not accept requested flags, you are missing required libraries])]) + + AX_CHECK_COMPILE_FLAG( + [-fno-omit-frame-pointer], + [SANITIZER_CXXFLAGS="$SANITIZER_CXXFLAGS -fno-omit-frame-pointer"], + [AC_MSG_ERROR(Cannot enable -fno-omit-frame-pointer)]) + + # libc/libstdc++ static linking is not supported for TSan + case $use_sanitizers in + *thread*) + ;; + *) + AX_CHECK_LINK_FLAG( + [-static-libstdc++], + [SANITIZER_LDFLAGS="$SANITIZER_LDFLAGS -static-libstdc++"], + [AC_MSG_ERROR(Cannot statically link -static-libstdc++)]) + ;; + esac + + case $use_sanitizers in + *address*) + AX_CHECK_LINK_FLAG( + [-static-libasan], + [SANITIZER_LDFLAGS="$SANITIZER_LDFLAGS -static-libasan"], + [AC_MSG_ERROR(Cannot statically link -static-libasan)]) + ;; + *) + ;; + esac +fi + +ERROR_CXXFLAGS= +if test "x$enable_werror" = "xyes"; then + if test "x$CXXFLAG_WERROR" = "x"; then + AC_MSG_ERROR("enable-werror set but -Werror is not usable") + fi + ERROR_CXXFLAGS="$ERROR_CXXFLAGS -Werror" +fi + + +# This enables all warnings and selectively disables some. Individual warnings should be +# 1. fixed, +# 2. locally silenced with an explanatory comment, or +# 3. globally silenced here with an explanatory comment. +# +# Justifications +# • `-Wno-aix-compat`: we don’t want to maintain compatibility with IBM AIX compilers +# • `-Wno-c++-compat`: this warns about an ABI layout incompatibility between C and C++, +# but we don’t need such compatibility except where we use `extern "C"` +# • `-W*c++*-compat-pedantic`: disables warnings about compatibility with older versions of C++ and +# enables warnings about compatibility with newer versions of C++ (we need the explicit enabling, +# even with `-Weverything`, because the earlier disabling of older versions removes some warnings +# that we do want) +DESIRED_WARNING_CXXFLAGS="\ + --system-header-prefix=boost --system-header-prefix=crypto/ctaes --system-header-prefix=db_cxx \ + --system-header-prefix=event2 --system-header-prefix=gmock --system-header-prefix=gtest \ + --system-header-prefix=leveldb --system-header-prefix=rust --system-header-prefix=sodium \ + --system-header-prefix=univalue --system-header-prefix=zmq \ + -Weverything \ + -Wno-aix-compat -Wno-c++-compat \ + -Wno-c++98-compat-pedantic -Wno-c++11-compat-pedantic -Wno-c++14-compat-pedantic \ + -Wc++17-compat-pedantic -Wc++20-compat-pedantic" + +# This list should be incrementally pruned. Each flag should either be enabled or moved to +# `DESIRED_WARNING_CXXFLAGS` with an explanation as to why it remains disabled. +# +# Guidelines for fixing warnings: +# • fix a small number (perhaps one) at a time +# • change `-Wno-foo` to `-Wno-error=foo` locally to get the full report of the warning you enabled +# (but be careful, as re-running `make` will not recompile files that only warned). +# +# Potential justifications: +# • `-Wno-format-nonliteral`: Bitcoin i18n +# • `-Wno-old-style-cast`: do after `-W*-conversion` to avoid introducing more conversions +# • `-Wno-padded`: is this worth the noise of rearranging fields & adding anonymous bitfields? +# • `-Wno-shadow-field`: conflicts with our style of naming constructor arguments the same as fields +# • `-Wno-shadow-field-in-constructor`: conflicts with our style of naming constructor arguments the +# same as fields +# • `-Wno-string-conversion`: currently abused to `assert` on strings +# • `-Wno-tautological-type-limit-compare`: I think isn’t portable because of numeric type sizing +DISABLED_WARNING_CXXFLAGS="\ + -Wno-c++20-compat -Wno-cast-align -Wno-cast-qual -Wno-comma -Wno-conditional-uninitialized \ + -Wno-covered-switch-default -Wno-ctad-maybe-unsupported \ + -Wno-delete-non-abstract-non-virtual-dtor -Wno-deprecated-copy -Wno-deprecated-copy-dtor \ + -Wno-deprecated-dynamic-exception-spec -Wno-disabled-macro-expansion -Wno-documentation \ + -Wno-documentation-unknown-command -Wno-double-promotion -Wno-exit-time-destructors \ + -Wno-extra-semi -Wno-extra-semi-stmt -Wno-float-conversion -Wno-float-equal \ + -Wno-format-nonliteral -Wno-global-constructors -Wno-header-hygiene -Wno-ignored-qualifiers \ + -Wno-implicit-fallthrough -Wno-implicit-int-conversion -Wno-implicit-int-float-conversion \ + -Wno-inconsistent-missing-destructor-override -Wno-logical-op-parentheses \ + -Wno-misleading-indentation -Wno-mismatched-tags -Wno-missing-noreturn -Wno-missing-prototypes \ + -Wno-missing-variable-declarations -Wno-newline-eof -Wno-non-virtual-dtor -Wno-old-style-cast \ + -Wno-overloaded-virtual -Wno-padded -Wno-pedantic -Wno-range-loop-construct \ + -Wno-redundant-parens -Wno-reorder-ctor -Wno-reserved-id-macro -Wno-reserved-identifier \ + -Wno-return-type -Wno-shadow -Wno-shadow-field -Wno-shadow-field-in-constructor \ + -Wno-shift-sign-overflow -Wno-shorten-64-to-32 -Wno-sign-compare -Wno-sign-conversion \ + -Wno-string-conversion -Wno-suggest-destructor-override -Wno-suggest-override -Wno-switch-enum \ + -Wno-tautological-type-limit-compare -Wno-tautological-unsigned-enum-zero-compare \ + -Wno-tautological-unsigned-zero-compare -Wno-thread-safety-attributes \ + -Wno-thread-safety-negative -Wno-undef -Wno-undefined-func-template -Wno-uninitialized \ + -Wno-unreachable-code -Wno-unreachable-code-break -Wno-unreachable-code-return \ + -Wno-unused-but-set-variable -Wno-unused-exception-parameter -Wno-unused-function \ + -Wno-unused-macros -Wno-unused-member-function -Wno-unused-parameter -Wno-unused-private-field \ + -Wno-unused-template -Wno-unused-variable -Wno-used-but-marked-unused -Wno-weak-vtables \ + -Wno-zero-as-null-pointer-constant" + +# These are sub-flags of those in `DISABLED_WARNING_CXXFLAGS` that allow us to temporarily +# re-enable pieces until the disabling flags are removed. +REENABLED_WARNING_CXXFLAGS="\ + -Wbit-int-extension -Wc++11-extra-semi -Wc++11-long-long -Wc++14-attribute-extensions \ + -Wc++14-binary-literal -Wc++17-attribute-extensions -Wc++20-attribute-extensions \ + -Wc11-extensions -Wcomplex-component-init -Wdelimited-escape-sequence-extension \ + -Wdocumentation-deprecated-sync -Wdocumentation-html -Wembedded-directive -Wempty-init-stmt \ + -Wempty-translation-unit -Wfixed-enum-extension -Wflexible-array-extensions \ + -Wfloat-overflow-conversion -Wfloat-zero-conversion -Wfuture-attribute-extensions \ + -Wgnu-auto-type -Wgnu-binary-literal -Wgnu-case-range -Wgnu-complex-integer \ + -Wgnu-compound-literal-initializer -Wgnu-conditional-omitted-operand -Wgnu-empty-initializer \ + -Wgnu-empty-struct -Wgnu-flexible-array-initializer -Wgnu-flexible-array-union-member \ + -Wgnu-imaginary-constant -Wgnu-include-next -Wgnu-label-as-value -Wgnu-line-marker \ + -Wgnu-null-pointer-arithmetic -Wgnu-pointer-arith -Wgnu-redeclared-enum \ + -Wgnu-statement-expression -Wgnu-union-cast -Wgnu-zero-line-directive \ + -Wignored-reference-qualifiers -Wimplicit-const-int-float-conversion \ + -Wimplicit-fallthrough-per-function -Wimport-preprocessor-directive-pedantic -Winvalid-utf8 \ + -Wkeyword-macro -Wlanguage-extension-token -Wlong-long -Wmicrosoft-charize \ + -Wmicrosoft-comment-paste -Wmicrosoft-cpp-macro -Wmicrosoft-end-of-file -Wmicrosoft-enum-value \ + -Wmicrosoft-fixed-enum -Wmicrosoft-flexible-array -Wmicrosoft-redeclare-static \ + -Wnested-anon-types -Wnullability-extension -Wobjc-signed-char-bool-implicit-int-conversion \ + -Woverlength-strings -Wpre-c++2b-compat -Wretained-language-linkage \ + -Wshadow-field-in-constructor-modified -Wshadow-ivar -Wsometimes-uninitialized \ + -Wstatic-self-init -Wundefined-internal-type -Wunneeded-member-function \ + -Wunreachable-code-fallthrough -Wunreachable-code-generic-assoc -Wunreachable-code-loop-increment" + +WARNING_CXXFLAGS="$DESIRED_WARNING_CXXFLAGS $DISABLED_WARNING_CXXFLAGS $REENABLED_WARNING_CXXFLAGS" + +enable_sse42=no +enable_sse41=no +enable_avx2=no +enable_shani=no + +if test "x$use_asm" = "xyes"; then + +# Check for optional instruction set support. Enabling these does _not_ imply that all code will +# be compiled with them, rather that specific objects/libs may use them after checking for runtime +# compatibility. + +dnl x86 +AX_CHECK_COMPILE_FLAG([-msse4.2],[[SSE42_CXXFLAGS="-msse4.2"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-msse4.1],[[SSE41_CXXFLAGS="-msse4.1"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-mavx -mavx2],[[AVX2_CXXFLAGS="-mavx -mavx2"]],,[[$CXXFLAG_WERROR]]) +AX_CHECK_COMPILE_FLAG([-msse4 -msha],[[SHANI_CXXFLAGS="-msse4 -msha"]],,[[$CXXFLAG_WERROR]]) + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SSE42_CXXFLAGS" +AC_MSG_CHECKING(for SSE4.2 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #if defined(_MSC_VER) + #include + #elif defined(__GNUC__) && defined(__SSE4_2__) + #include + #endif + ]],[[ + uint64_t l = 0; + l = _mm_crc32_u8(l, 0); + l = _mm_crc32_u32(l, 0); + l = _mm_crc32_u64(l, 0); + return l; + ]])], + [ AC_MSG_RESULT(yes); enable_sse42=yes], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SSE41_CXXFLAGS" +AC_MSG_CHECKING(for SSE4.1 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m128i l = _mm_set1_epi32(0); + return _mm_extract_epi32(l, 3); + ]])], + [ AC_MSG_RESULT(yes); enable_sse41=yes; AC_DEFINE(ENABLE_SSE41, 1, [Define this symbol to build code that uses SSE4.1 intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $AVX2_CXXFLAGS" +AC_MSG_CHECKING(for AVX2 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m256i l = _mm256_set1_epi32(0); + return _mm256_extract_epi32(l, 7); + ]])], + [ AC_MSG_RESULT(yes); enable_avx2=yes; AC_DEFINE(ENABLE_AVX2, 1, [Define this symbol to build code that uses AVX2 intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $SHANI_CXXFLAGS" +AC_MSG_CHECKING(for SHA-NI intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __m128i i = _mm_set1_epi32(0); + __m128i j = _mm_set1_epi32(1); + __m128i k = _mm_set1_epi32(2); + return _mm_extract_epi32(_mm_sha256rnds2_epu32(i, i, k), 0); + ]])], + [ AC_MSG_RESULT(yes); enable_shani=yes; AC_DEFINE(ENABLE_SHANI, 1, [Define this symbol to build code that uses SHA-NI intrinsics]) ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +# ARM +AX_CHECK_COMPILE_FLAG([-march=armv8-a+crc+crypto],[[ARM_CRC_CXXFLAGS="-march=armv8-a+crc+crypto"]],,[[$CXXFLAG_WERROR]]) + +TEMP_CXXFLAGS="$CXXFLAGS" +CXXFLAGS="$CXXFLAGS $ARM_CRC_CXXFLAGS" +AC_MSG_CHECKING(for ARM CRC32 intrinsics) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + ]],[[ + __crc32cb(0, 0); __crc32ch(0, 0); __crc32cw(0, 0); __crc32cd(0, 0); + vmull_p64(0, 0); + ]])], + [ AC_MSG_RESULT(yes); enable_arm_crc=yes; ], + [ AC_MSG_RESULT(no)] +) +CXXFLAGS="$TEMP_CXXFLAGS" + +fi + +CPPFLAGS="$CPPFLAGS -DHAVE_BUILD_INFO -D__STDC_FORMAT_MACROS" + +AC_ARG_WITH([utils], + [AS_HELP_STRING([--with-utils], + [build zcash-cli zcash-tx (default=yes)])], + [build_bitcoin_utils=$withval], + [build_bitcoin_utils=yes]) + +AC_ARG_WITH([libs], + [AS_HELP_STRING([--with-libs], + [build libraries (default=no)])], + [build_bitcoin_libs=$withval], + [build_bitcoin_libs=no]) + +AC_ARG_WITH([daemon], + [AS_HELP_STRING([--with-daemon], + [build bitcoind daemon (default=yes)])], + [build_bitcoind=$withval], + [build_bitcoind=yes]) + +use_pkgconfig=yes +case $host in + *mingw*) + + dnl pkgconfig does more harm than good with MinGW + use_pkgconfig=no + + TARGET_OS=windows + AC_CHECK_LIB([kernel32], [GetModuleFileNameA],, AC_MSG_ERROR(libkernel32 missing)) + AC_CHECK_LIB([user32], [main],, AC_MSG_ERROR(libuser32 missing)) + AC_CHECK_LIB([gdi32], [main],, AC_MSG_ERROR(libgdi32 missing)) + AC_CHECK_LIB([comdlg32], [main],, AC_MSG_ERROR(libcomdlg32 missing)) + AC_CHECK_LIB([winmm], [main],, AC_MSG_ERROR(libwinmm missing)) + AC_CHECK_LIB([shell32], [SHGetSpecialFolderPathW],, AC_MSG_ERROR(libshell32 missing)) + AC_CHECK_LIB([comctl32], [main],, AC_MSG_ERROR(libcomctl32 missing)) + AC_CHECK_LIB([ole32], [CoCreateInstance],, AC_MSG_ERROR(libole32 missing)) + AC_CHECK_LIB([oleaut32], [main],, AC_MSG_ERROR(liboleaut32 missing)) + AC_CHECK_LIB([uuid], [main],, AC_MSG_ERROR(libuuid missing)) + AC_CHECK_LIB([advapi32], [CryptAcquireContextW],, AC_MSG_ERROR(libadvapi32 missing)) + AC_CHECK_LIB([ws2_32], [WSAStartup],, AC_MSG_ERROR(libws2_32 missing)) + AC_CHECK_LIB([shlwapi], [PathRemoveFileSpecW],, AC_MSG_ERROR(libshlwapi missing)) + AC_CHECK_LIB([iphlpapi], [GetAdaptersAddresses],, AC_MSG_ERROR(libiphlpapi missing)) + AC_CHECK_LIB([ntdll], [main],, AC_MSG_ERROR(libntdll missing)) + AC_CHECK_LIB([bcrypt], [main],, AC_MSG_ERROR(libbcrypt missing)) + + dnl -static is interpreted by libtool, where it has a different meaning. + dnl In libtool-speak, it's -all-static. + AX_CHECK_LINK_FLAG([[-static]],[LIBTOOL_APP_LDFLAGS="$LIBTOOL_APP_LDFLAGS -all-static"]) + + AC_PATH_PROG([MAKENSIS], [makensis], none) + if test x$MAKENSIS = xnone; then + AC_MSG_WARN("makensis not found. Cannot create installer.") + fi + + ZC_REQUIRE_TOOL(WINDRES, windres) + + CPPFLAGS="$CPPFLAGS -D_MT -DWIN32 -D_WINDOWS -DBOOST_THREAD_USE_LIB -D_WIN32_WINNT=0x0601 -D_WIN32_IE=0x0501 -DWIN32_LEAN_AND_MEAN" + + dnl libtool insists upon adding -nostdlib and a list of objects/libs to link against. + dnl That breaks our ability to build dll's with static libgcc/libstdc++/libssp. Override + dnl its command here, with the predeps/postdeps removed, and -static inserted. Postdeps are + dnl also overridden to prevent their insertion later. + dnl This should only affect dll's. + archive_cmds_CXX="\$CC -shared \$libobjs \$deplibs \$compiler_flags -static -o \$output_objdir/\$soname \${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker \$lib" + postdeps_CXX= + + dnl We require Windows 7 (NT 6.1) or later + AX_CHECK_LINK_FLAG([[-Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1]],[LDFLAGS="$LDFLAGS -Wl,--major-subsystem-version -Wl,6 -Wl,--minor-subsystem-version -Wl,1"],,[[$LDFLAG_WERROR]]) + ;; + *darwin*) + TARGET_OS=darwin + if test x$cross_compiling != xyes; then + BUILD_OS=darwin + AC_CHECK_PROG([PORT],port, port) + if test x$PORT = xport; then + dnl add default macports paths + CPPFLAGS="$CPPFLAGS -isystem /opt/local/include" + LIBS="$LIBS -L/opt/local/lib" + if test -d /opt/local/include/db62; then + CPPFLAGS="$CPPFLAGS -I/opt/local/include/db62" + LIBS="$LIBS -L/opt/local/lib/db62" + fi + fi + + AC_CHECK_PROG([BREW],brew, brew) + if test x$BREW = xbrew; then + dnl These Homebrew packages may be keg-only, meaning that they won't be found + dnl in expected paths because they may conflict with system files. Ask + dnl Homebrew where each one is located, then adjust paths accordingly. + dnl It's safe to add these paths even if the functionality is disabled by + dnl the user (--without-wallet for example). + + bdb_prefix=`$BREW --prefix berkeley-db4 2>/dev/null` + if test x$bdb_prefix != x; then + CPPFLAGS="$CPPFLAGS -I$bdb_prefix/include" + LIBS="$LIBS -L$bdb_prefix/lib" + fi + fi + else + case $build_os in + *darwin*) + BUILD_OS=darwin + ;; + *) + AC_PATH_TOOL([INSTALLNAMETOOL], [install_name_tool], install_name_tool) + AC_PATH_TOOL([OTOOL], [otool], otool) + AC_PATH_PROGS([GENISOIMAGE], [genisoimage mkisofs],genisoimage) + + dnl libtool will try to strip the static lib, which is a problem for + dnl cross-builds because strip attempts to call a hard-coded ld, + dnl which may not exist in the path. Stripping the .a is not + dnl necessary, so just disable it. + old_striplib= + ;; + esac + fi + + AX_CHECK_LINK_FLAG([[-Wl,-headerpad_max_install_names]], [LDFLAGS="$LDFLAGS -Wl,-headerpad_max_install_names"]) + CPPFLAGS="$CPPFLAGS -DMAC_OSX" + OBJCXXFLAGS="$CXXFLAGS" + ;; + *android*) + dnl make sure android stays above linux for hosts like *linux-android* + TARGET_OS=android + ;; + *linux*) + TARGET_OS=linux + ;; +esac + +if test x$use_pkgconfig = xyes; then + m4_ifndef([PKG_PROG_PKG_CONFIG], [AC_MSG_ERROR(PKG_PROG_PKG_CONFIG macro not found. Please install pkg-config and re-run autogen.sh.)]) + m4_ifdef([PKG_PROG_PKG_CONFIG], [ + PKG_PROG_PKG_CONFIG + if test x"$PKG_CONFIG" = "x"; then + AC_MSG_ERROR(pkg-config not found.) + fi + ]) +fi + +if test x$use_lcov = xyes; then + ZC_REQUIRE_TOOL(GCOV, gcov) + ZC_REQUIRE_PROG(LCOV, lcov) + ZC_REQUIRE_PROG(GENHTML, genhtml) + + LCOV="$LCOV --gcov-tool=$GCOV --rc lcov_branch_coverage=1" + GENHTML="$GENHTML --branch-coverage" + AX_CHECK_COMPILE_FLAG([--coverage],[CXXFLAGS="$CXXFLAGS --coverage"], + [AC_MSG_ERROR("lcov testing requested but --coverage flag does not work")]) +fi + +dnl Check for endianness +AC_C_BIGENDIAN + +dnl Check for pthread compile/link requirements +AX_PTHREAD + +# The following macro will add the necessary defines to bitcoin-config.h, but +# they also need to be passed down to any subprojects. Pull the results out of +# the cache and add them to CPPFLAGS. +AC_SYS_LARGEFILE +# detect POSIX or GNU variant of strerror_r +AC_FUNC_STRERROR_R + +if test x$ac_cv_sys_file_offset_bits != x && + test x$ac_cv_sys_file_offset_bits != xno && + test x$ac_cv_sys_file_offset_bits != xunknown; then + CPPFLAGS="$CPPFLAGS -D_FILE_OFFSET_BITS=$ac_cv_sys_file_offset_bits" +fi + +if test x$ac_cv_sys_large_files != x && + test x$ac_cv_sys_large_files != xno && + test x$ac_cv_sys_large_files != xunknown; then + CPPFLAGS="$CPPFLAGS -D_LARGE_FILES=$ac_cv_sys_large_files" +fi + +AX_GCC_FUNC_ATTRIBUTE([visibility]) +AX_GCC_FUNC_ATTRIBUTE([dllexport]) +AX_GCC_FUNC_ATTRIBUTE([dllimport]) + +if test x$use_glibc_compat != xno; then + + #glibc absorbed clock_gettime in 2.17. librt (its previous location) is safe to link + #in anyway for back-compat. + AC_CHECK_LIB([rt],[clock_gettime],, AC_MSG_ERROR(lib missing)) + + #__fdelt_chk's params and return type have changed from long unsigned int to long int. + # See which one is present here. + AC_MSG_CHECKING(__fdelt_chk type) + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#ifdef _FORTIFY_SOURCE + #undef _FORTIFY_SOURCE + #endif + #define _FORTIFY_SOURCE 2 + #include + extern "C" long unsigned int __fdelt_warn(long unsigned int);]],[[]])], + [ fdelt_type="long unsigned int"], + [ fdelt_type="long int"]) + AC_MSG_RESULT($fdelt_type) + AC_DEFINE_UNQUOTED(FDELT_TYPE, $fdelt_type,[parameter and return value type for __fdelt_chk]) +else + AC_SEARCH_LIBS([clock_gettime],[rt]) +fi + +if test "x$enable_gprof" = xyes; then + dnl -pg is incompatible with -pie. Since hardening and profiling together doesn't make sense, + dnl we simply make them mutually exclusive here. Additionally, hardened toolchains may force + dnl -pie by default, in which case it needs to be turned off with -no-pie. + + if test x$use_hardening = xyes; then + AC_MSG_ERROR(gprof profiling is not compatible with hardening. Reconfigure with --disable-hardening or --disable-gprof) + fi + use_hardening=no + AX_CHECK_COMPILE_FLAG([-pg],[GPROF_CXXFLAGS="-pg"], + [AC_MSG_ERROR(gprof profiling requested but not available)], [[$CXXFLAG_WERROR]]) + + AX_CHECK_LINK_FLAG([[-no-pie]], [GPROF_LDFLAGS="-no-pie"]) + AX_CHECK_LINK_FLAG([[-pg]],[GPROF_LDFLAGS="$GPROF_LDFLAGS -pg"], + [AC_MSG_ERROR(gprof profiling requested but not available)], [[$GPROF_LDFLAGS]]) +fi + +if test x$TARGET_OS != xwindows; then + # All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIC],[PIC_FLAGS="-fPIC"]) +fi + +if test x$use_fuzz_main == xyes; then + CFLAGS="$CFLAGS -DZCASH_FUZZ=1" + CXXFLAGS="$CXXFLAGS -DZCASH_FUZZ=1" +fi + +if test x$use_hardening != xno; then + use_hardening=yes + AX_CHECK_COMPILE_FLAG([-Wformat],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat"],[AC_MSG_ERROR(Cannot enable -Wformat)]) + AX_CHECK_COMPILE_FLAG([-Wformat-security],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wformat-security"],[AC_MSG_ERROR(Cannot enable -Wformat-security)],[-Wformat]) + AX_CHECK_COMPILE_FLAG([-Wstack-protector],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wstack-protector"],[AC_MSG_ERROR(Cannot enable -Wstack-protector)]) + AX_CHECK_COMPILE_FLAG([-fstack-protector-all],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -fstack-protector-all"],[AC_MSG_ERROR(Cannot enable -fstack-protector-all)]) + AX_CHECK_COMPILE_FLAG([-Wthread-safety-analysis],[HARDENED_CXXFLAGS="$HARDENED_CXXFLAGS -Wthread-safety-analysis"],[AC_MSG_ERROR(Cannot enable -Wthread-safety-analysis)]) + + AX_CHECK_PREPROC_FLAG([-D_FORTIFY_SOURCE=2],[ + AX_CHECK_PREPROC_FLAG([-U_FORTIFY_SOURCE],[ + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -U_FORTIFY_SOURCE" + ],[AC_MSG_ERROR(Cannot enable -U_FORTIFY_SOURCE)]) + HARDENED_CPPFLAGS="$HARDENED_CPPFLAGS -D_FORTIFY_SOURCE=2" + ],[AC_MSG_ERROR(Cannot enable -D_FORTIFY_SOURCE=2)]) + + if test x$TARGET_OS = xdarwin || test x$TARGET_OS = xwindows; then + # Xcode's ld (at least ld64-302.3) doesn't support -z + # mingw-w64's ld (at least mingw-w64 4.0.4-2) also appears to not support -z + AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_WARN(Cannot enable RELRO)]) + AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_WARN(Cannot enable BIND_NOW)]) + else + AX_CHECK_LINK_FLAG([[-Wl,-z,relro]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,relro"],[AC_MSG_ERROR(Cannot enable RELRO)]) + AX_CHECK_LINK_FLAG([[-Wl,-z,now]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-z,now"],[AC_MSG_ERROR(Cannot enable BIND_NOW)]) + fi + + if test x$TARGET_OS != xwindows; then + # All windows code is PIC, forcing it on just adds useless compile warnings + AX_CHECK_COMPILE_FLAG([-fPIE],[PIE_FLAGS="-fPIE"],[AC_MSG_ERROR(Cannot enable -fPIE)]) + if test x$BUILD_OS = xdarwin; then + AX_CHECK_LINK_FLAG([[-Wl,-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,-pie"],[AC_MSG_ERROR(Cannot enable -Wl,-pie)]) + # Justifications: + # • `-Wno-return-std-move-in-c++11`: This causes failure in CI if treated as an error, + # despite not being documented to exist in any version of Clang (it does not exist on the + # Clang used by our other builds). + # • `-Wno-unknown-warning-option`: The macOS build uses Xcode’s clang, which is relatively old + # and doesn’t support all the warnings that other platforms do, so we ignore complaints + # about unsupported warnings. + WARNING_CXXFLAGS="$WARNING_CXXFLAGS -Wno-return-std-move-in-c++11 -Wno-unknown-warning-option" + else + AX_CHECK_LINK_FLAG([[-pie]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -pie"],[AC_MSG_ERROR(Cannot enable -pie)]) + fi + else + # These are only available on Windows. + AX_CHECK_LINK_FLAG([[-Wl,--dynamicbase]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--dynamicbase"],[AC_MSG_ERROR(Cannot enable --dynamicbase)]) + AX_CHECK_LINK_FLAG([[-Wl,--nxcompat]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--nxcompat"],[AC_MSG_ERROR(Cannot enable --nxcompat)]) + AX_CHECK_LINK_FLAG([[-Wl,--high-entropy-va]], [HARDENED_LDFLAGS="$HARDENED_LDFLAGS -Wl,--high-entropy-va"],[AC_MSG_ERROR(Cannot enable ASLR)]) + fi + + case $host in + *mingw*) + AC_CHECK_LIB([ssp], [main],, AC_MSG_ERROR(lib missing)) + ;; + esac +fi + +dnl this flag screws up non-darwin gcc even when the check fails. special-case it. +if test x$TARGET_OS = xdarwin; then + AX_CHECK_LINK_FLAG([[-Wl,-dead_strip]], [LDFLAGS="$LDFLAGS -Wl,-dead_strip"]) +fi + +AC_CHECK_HEADERS([endian.h sys/endian.h byteswap.h stdio.h stdlib.h unistd.h strings.h sys/types.h sys/stat.h sys/select.h sys/prctl.h]) +AC_SEARCH_LIBS([getaddrinfo_a], [anl], [AC_DEFINE(HAVE_GETADDRINFO_A, 1, [Define this symbol if you have getaddrinfo_a])]) +AC_SEARCH_LIBS([inet_pton], [nsl resolv], [AC_DEFINE(HAVE_INET_PTON, 1, [Define this symbol if you have inet_pton])]) + +AC_CHECK_DECLS([strnlen]) + +AC_CHECK_DECLS([le16toh, le32toh, le64toh, htole16, htole32, htole64, be16toh, be32toh, be64toh, htobe16, htobe32, htobe64],,, + [#if HAVE_ENDIAN_H + #include + #elif HAVE_SYS_ENDIAN_H + #include + #endif]) + +AC_CHECK_DECLS([bswap_16, bswap_32, bswap_64],,, + [#if HAVE_BYTESWAP_H + #include + #endif]) + +AC_CHECK_DECLS([__builtin_clz, __builtin_clzl, __builtin_clzll]) + +dnl Check for MSG_NOSIGNAL +AC_MSG_CHECKING(for MSG_NOSIGNAL) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ int f = MSG_NOSIGNAL; ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_MSG_NOSIGNAL, 1,[Define this symbol if you have MSG_NOSIGNAL]) ], + [ AC_MSG_RESULT(no)] +) + +dnl check for gmtime_r(), fallback to gmtime_s() if that is unavailable +dnl fail if neither are available. +AC_MSG_CHECKING(for gmtime_r) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ gmtime_r((const time_t *) nullptr, (struct tm *) nullptr); ]])], + [ AC_MSG_RESULT(yes); AC_DEFINE(HAVE_GMTIME_R, 1, [Define this symbol if gmtime_r is available]) ], + [ AC_MSG_RESULT(no); + AC_MSG_CHECKING(for gmtime_s); + AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ gmtime_s((struct tm *) nullptr, (const time_t *) nullptr); ]])], + [ AC_MSG_RESULT(yes)], + [ AC_MSG_RESULT(no); AC_MSG_ERROR(Both gmtime_r and gmtime_s are unavailable) ] + ) + ] +) + +AC_MSG_CHECKING([for visibility attribute]) +AC_LINK_IFELSE([AC_LANG_SOURCE([ + int foo_def( void ) __attribute__((visibility("default"))); + int main(){} + ])], + [ + AC_DEFINE(HAVE_VISIBILITY_ATTRIBUTE,1,[Define if the visibility attribute is supported.]) + AC_MSG_RESULT(yes) + ], + [ + AC_MSG_RESULT(no) + if test x$use_reduce_exports = xyes; then + AC_MSG_ERROR([Cannot find a working visibility attribute. Use --disable-reduce-exports.]) + fi + ] +) + +TEMP_LDFLAGS="$LDFLAGS" +LDFLAGS="$TEMP_LDFLAGS $PTHREAD_CFLAGS" +AC_MSG_CHECKING([for thread_local support]) +AC_LINK_IFELSE([AC_LANG_SOURCE([ + #include + static thread_local int foo = 0; + static void run_thread() { foo++;} + int main(){ + for(int i = 0; i < 10; i++) { std::thread(run_thread).detach();} + return foo; + } + ])], + [ + AC_DEFINE(HAVE_THREAD_LOCAL,1,[Define if thread_local is supported.]) + AC_MSG_RESULT(yes) + ], + [ + AC_MSG_RESULT(no) + ] +) +LDFLAGS="$TEMP_LDFLAGS" + +dnl LevelDB platform checks +AC_MSG_CHECKING(for fdatasync) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ fdatasync(0); ]])], + [ AC_MSG_RESULT(yes); HAVE_FDATASYNC=1 ], + [ AC_MSG_RESULT(no); HAVE_FDATASYNC=0 ] +) + +AC_MSG_CHECKING(for F_FULLFSYNC) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ fcntl(0, F_FULLFSYNC, 0); ]])], + [ AC_MSG_RESULT(yes); HAVE_FULLFSYNC=1 ], + [ AC_MSG_RESULT(no); HAVE_FULLFSYNC=0 ] +) + +AC_MSG_CHECKING(for O_CLOEXEC) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], + [[ open("", O_CLOEXEC); ]])], + [ AC_MSG_RESULT(yes); HAVE_O_CLOEXEC=1 ], + [ AC_MSG_RESULT(no); HAVE_O_CLOEXEC=0 ] +) + +dnl crc32c platform checks +AC_MSG_CHECKING(for __builtin_prefetch) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[ + char data = 0; + const char* address = &data; + __builtin_prefetch(address, 0, 0); + ]])], + [ AC_MSG_RESULT(yes); HAVE_BUILTIN_PREFETCH=1 ], + [ AC_MSG_RESULT(no); HAVE_BUILTIN_PREFETCH=0 ] +) + +AC_MSG_CHECKING(for _mm_prefetch) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include ]], [[ + char data = 0; + const char* address = &data; + _mm_prefetch(address, _MM_HINT_NTA); + ]])], + [ AC_MSG_RESULT(yes); HAVE_MM_PREFETCH=1 ], + [ AC_MSG_RESULT(no); HAVE_MM_PREFETCH=0 ] +) + +AC_MSG_CHECKING(for strong getauxval support in the system headers) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + #include + #include + #include + ]], [[ + getauxval(AT_HWCAP); + ]])], + [ AC_MSG_RESULT(yes); HAVE_STRONG_GETAUXVAL=1 ], + [ AC_MSG_RESULT(no); HAVE_STRONG_GETAUXVAL=0 ] +) + +AC_MSG_CHECKING(for weak getauxval support in the compiler) +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ + unsigned long getauxval(unsigned long type) __attribute__((weak)); + #define AT_HWCAP 16 + ]], [[ + getauxval(AT_HWCAP); + ]])], + [ AC_MSG_RESULT(yes); HAVE_WEAK_GETAUXVAL=1 ], + [ AC_MSG_RESULT(no); HAVE_WEAK_GETAUXVAL=0 ] +) + +dnl Check for reduced exports +if test x$use_reduce_exports = xyes; then + AX_CHECK_COMPILE_FLAG([-fvisibility=hidden],[RE_CXXFLAGS="-fvisibility=hidden"], + [AC_MSG_ERROR([Cannot set default symbol visibility. Use --disable-reduce-exports.])]) +fi + +LEVELDB_CPPFLAGS= +LIBLEVELDB= +LIBMEMENV= +AM_CONDITIONAL([EMBEDDED_LEVELDB],[true]) +AC_SUBST(LEVELDB_CPPFLAGS) +AC_SUBST(LIBLEVELDB) +AC_SUBST(LIBMEMENV) + +if test x$enable_wallet != xno; then + dnl Check for libdb_cxx only if wallet enabled + BITCOIN_FIND_BDB62 +fi + +if test x$build_bitcoin_utils$build_bitcoind$use_tests = xnonono; then + use_boost=no +else + use_boost=yes +fi + +if test x$use_boost = xyes; then + +dnl Check for boost libs +dnl We need Boost >= 1.62 to fix a potential security bug (https://github.com/zcash/zcash/issues/1241) +dnl We need Boost >= 1.77 to fix usage of statx on Docker (https://github.com/zcash/zcash/issues/4945) +AX_BOOST_BASE([1.77]) +AX_BOOST_SYSTEM +AX_BOOST_FILESYSTEM +AX_BOOST_PROGRAM_OPTIONS +AX_BOOST_THREAD +AX_BOOST_CHRONO + +fi + +if test x$use_reduce_exports = xyes; then + CXXFLAGS="$CXXFLAGS $RE_CXXFLAGS" + AX_CHECK_LINK_FLAG([[-Wl,--exclude-libs,ALL]], [RELDFLAGS="-Wl,--exclude-libs,ALL"]) +fi + +if test x$use_tests = xyes; then + + if test x$HEXDUMP = x; then + AC_MSG_ERROR(hexdump is required for tests) + fi + + + if test x$use_boost = xyes; then + + AX_BOOST_UNIT_TEST_FRAMEWORK + + dnl Determine if -DBOOST_TEST_DYN_LINK is needed + AC_MSG_CHECKING([for dynamic linked boost test]) + TEMP_LIBS="$LIBS" + LIBS="$LIBS $BOOST_LDFLAGS $BOOST_UNIT_TEST_FRAMEWORK_LIB" + TEMP_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $BOOST_CPPFLAGS" + AC_LINK_IFELSE([AC_LANG_SOURCE([ + #define BOOST_TEST_DYN_LINK + #define BOOST_TEST_MAIN + #include + + ])], + [AC_MSG_RESULT(yes)] + [TESTDEFS="$TESTDEFS -DBOOST_TEST_DYN_LINK"], + [AC_MSG_RESULT(no)]) + LIBS="$TEMP_LIBS" + CPPFLAGS="$TEMP_CPPFLAGS" + + fi +fi + +if test x$use_boost = xyes; then +BOOST_LIBS="$BOOST_LDFLAGS $BOOST_SYSTEM_LIB $BOOST_FILESYSTEM_LIB $BOOST_PROGRAM_OPTIONS_LIB $BOOST_THREAD_LIB $BOOST_CHRONO_LIB" +fi + +if test x$use_pkgconfig = xyes; then + : dnl + m4_ifdef( + [PKG_CHECK_MODULES], + [ + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + PKG_CHECK_MODULES([EVENT], [libevent],, [AC_MSG_ERROR(libevent not found.)]) + if test x$TARGET_OS != xwindows; then + PKG_CHECK_MODULES([EVENT_PTHREADS], [libevent_pthreads],, [AC_MSG_ERROR(libevent_pthreads not found.)]) + fi + fi + + if test "x$use_zmq" = "xyes"; then + PKG_CHECK_MODULES([ZMQ],[libzmq >= 4], + [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], + [AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + AC_MSG_WARN([libzmq version 4.x or greater not found, disabling]) + use_zmq=no]) + else + AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + fi + ] + ) +else + + if test x$build_bitcoin_utils$build_bitcoind$bitcoin_enable_qt$use_tests != xnononono; then + AC_CHECK_HEADER([event2/event.h],, AC_MSG_ERROR(libevent headers missing),) + AC_CHECK_LIB([event],[main],EVENT_LIBS=-levent,AC_MSG_ERROR(libevent missing)) + if test x$TARGET_OS != xwindows; then + AC_CHECK_LIB([event_pthreads],[main],EVENT_PTHREADS_LIBS=-levent_pthreads,AC_MSG_ERROR(libevent_pthreads missing)) + fi + fi + + if test "x$use_zmq" = "xyes"; then + AC_CHECK_HEADER([zmq.h], + [AC_DEFINE([ENABLE_ZMQ],[1],[Define to 1 to enable ZMQ functions])], + [AC_MSG_WARN([zmq.h not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + AC_CHECK_LIB([zmq],[zmq_ctx_shutdown],ZMQ_LIBS=-lzmq, + [AC_MSG_WARN([libzmq >= 4.0 not found, disabling zmq support]) + use_zmq=no + AC_DEFINE([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions])]) + else + AC_DEFINE_UNQUOTED([ENABLE_ZMQ],[0],[Define to 1 to enable ZMQ functions]) + fi + + if test "x$use_zmq" = "xyes"; then + dnl Assume libzmq was built for static linking + case $host in + *mingw*) + ZMQ_CFLAGS="$ZMQ_CFLAGS -DZMQ_STATIC" + ;; + esac + fi +fi + +RUST_LIBS="" +case $host in + *mingw*) + RUST_LIBS="$RUST_LIBS -luserenv" + ;; + *) + RUST_LIBS="$RUST_LIBS -ldl" + ;; +esac + +# Additional Zcash flags +AX_CHECK_COMPILE_FLAG([-fno-strict-aliasing],[CXXFLAGS="$CXXFLAGS -fno-strict-aliasing"]) +AX_CHECK_COMPILE_FLAG([-Wno-builtin-declaration-mismatch],[CXXFLAGS="$CXXFLAGS -Wno-builtin-declaration-mismatch"],,[[$CXXFLAG_WERROR]]) + +LIBZCASH_LIBS="$BOOST_SYSTEM_LIB -lsodium $RUST_LIBS" + +AC_MSG_CHECKING([whether to build bitcoind]) +AM_CONDITIONAL([BUILD_BITCOIND], [test x$build_bitcoind = xyes]) +AC_MSG_RESULT($build_bitcoind) + +AC_MSG_CHECKING([whether to build utils (zcash-cli zcash-tx)]) +AM_CONDITIONAL([BUILD_BITCOIN_UTILS], [test x$build_bitcoin_utils = xyes]) +AC_MSG_RESULT($build_bitcoin_utils) + +AC_MSG_CHECKING([whether to build libraries]) +AM_CONDITIONAL([BUILD_BITCOIN_LIBS], [test x$build_bitcoin_libs = xyes]) +if test x$build_bitcoin_libs = xyes; then + AC_DEFINE(HAVE_SCRIPT_LIB, 1, [Define this symbol if the script lib has been built]) + AC_CONFIG_FILES([libzcash_script.pc:libzcash_script.pc.in]) +fi + +AC_MSG_RESULT($build_bitcoin_libs) + +AC_LANG_POP + +if test "x$use_ccache" != "xno"; then + AC_MSG_CHECKING(if ccache should be used) + if test x$CCACHE = x; then + if test "x$use_ccache" = "xyes"; then + AC_MSG_ERROR([ccache not found.]); + else + use_ccache=no + fi + else + use_ccache=yes + CC="$ac_cv_path_CCACHE $CC" + CXX="$ac_cv_path_CCACHE $CXX" + fi + AC_MSG_RESULT($use_ccache) +fi +if test "x$use_ccache" = "xyes"; then + AX_CHECK_PREPROC_FLAG([-Qunused-arguments],[CPPFLAGS="-Qunused-arguments $CPPFLAGS"]) +fi + +dnl enable wallet +AC_MSG_CHECKING([if wallet should be enabled]) +if test x$enable_wallet != xno; then + AC_MSG_RESULT(yes) + AC_DEFINE_UNQUOTED([ENABLE_WALLET],[1],[Define to 1 to enable wallet functions]) + +else + AC_MSG_RESULT(no) +fi + +dnl enable mining +AC_MSG_CHECKING([if mining should be enabled]) +if test x$enable_mining != xno; then + AC_MSG_RESULT(yes) + AC_DEFINE(ENABLE_MINING, 1, [Define to 1 to enable mining functions]) + +else + AC_MSG_RESULT(no) +fi + +AM_CONDITIONAL([ENABLE_ZMQ], [test "x$use_zmq" = "xyes"]) + +AC_MSG_CHECKING([whether to build test_bitcoin]) +if test x$use_tests = xyes; then + AC_MSG_RESULT([yes]) + BUILD_TEST="yes" +else + AC_MSG_RESULT([no]) + BUILD_TEST="" +fi + +AC_MSG_CHECKING([whether to reduce exports]) +if test x$use_reduce_exports = xyes; then + AC_MSG_RESULT([yes]) +else + AC_MSG_RESULT([no]) +fi + +if test x$build_bitcoin_utils$build_bitcoin_libs$build_bitcoind$use_tests = xnononono; then + AC_MSG_ERROR([No targets! Please specify at least one of: --with-utils --with-libs --with-daemon or --enable-tests]) +fi + +AM_CONDITIONAL([TARGET_DARWIN], [test x$TARGET_OS = xdarwin]) +AM_CONDITIONAL([BUILD_DARWIN], [test x$BUILD_OS = xdarwin]) +AM_CONDITIONAL([TARGET_WINDOWS], [test x$TARGET_OS = xwindows]) +AM_CONDITIONAL([ENABLE_WALLET],[test x$enable_wallet = xyes]) +AM_CONDITIONAL([ENABLE_MINING],[test x$enable_mining = xyes]) +AM_CONDITIONAL([ENABLE_TESTS],[test x$BUILD_TEST = xyes]) +AM_CONDITIONAL([ENABLE_BENCH],[test x$use_bench = xyes]) +AM_CONDITIONAL([USE_LCOV],[test x$use_lcov = xyes]) +AM_CONDITIONAL([GLIBC_BACK_COMPAT],[test x$use_glibc_compat = xyes]) +AM_CONDITIONAL([HARDEN],[test x$use_hardening = xyes]) +AM_CONDITIONAL([ENABLE_SSE42],[test x$enable_sse42 = xyes]) +AM_CONDITIONAL([ENABLE_SSE41],[test x$enable_sse41 = xyes]) +AM_CONDITIONAL([ENABLE_AVX2],[test x$enable_avx2 = xyes]) +AM_CONDITIONAL([ENABLE_SHANI],[test x$enable_shani = xyes]) +AM_CONDITIONAL([ENABLE_ARM_CRC],[test x$enable_arm_crc = xyes]) +AM_CONDITIONAL([USE_ASM],[test x$use_asm = xyes]) +AM_CONDITIONAL([WORDS_BIGENDIAN],[test x$ac_cv_c_bigendian = xyes]) + +AC_DEFINE(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR, [Major version]) +AC_DEFINE(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR, [Minor version]) +AC_DEFINE(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION, [Build revision]) +AC_DEFINE(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD, [Version Build]) +AC_DEFINE(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE, [Version is release]) +AC_DEFINE(COPYRIGHT_YEAR, _COPYRIGHT_YEAR, [Version is release]) +AC_SUBST(CLIENT_VERSION_MAJOR, _CLIENT_VERSION_MAJOR) +AC_SUBST(CLIENT_VERSION_MINOR, _CLIENT_VERSION_MINOR) +AC_SUBST(CLIENT_VERSION_REVISION, _CLIENT_VERSION_REVISION) +AC_SUBST(CLIENT_VERSION_BUILD, _CLIENT_VERSION_BUILD) +AC_SUBST(CLIENT_VERSION_IS_RELEASE, _CLIENT_VERSION_IS_RELEASE) +AC_SUBST(COPYRIGHT_YEAR, _COPYRIGHT_YEAR) +AC_SUBST(BITCOIN_DAEMON_NAME) +AC_SUBST(BITCOIN_CLI_NAME) +AC_SUBST(BITCOIN_TX_NAME) + +AC_SUBST(RUST_TARGET) +AC_SUBST(RUST_VENDORED_SOURCES) +AC_SUBST(RELDFLAGS) +AC_SUBST(DEBUG_CPPFLAGS) +AC_SUBST(DEBUG_CXXFLAGS) +AC_SUBST(WARNING_CXXFLAGS) +AC_SUBST(ERROR_CXXFLAGS) +AC_SUBST(GPROF_CXXFLAGS) +AC_SUBST(GPROF_LDFLAGS) +AC_SUBST(HARDENED_CXXFLAGS) +AC_SUBST(HARDENED_CPPFLAGS) +AC_SUBST(HARDENED_LDFLAGS) +AC_SUBST(PIC_FLAGS) +AC_SUBST(PIE_FLAGS) +AC_SUBST(SANITIZER_CXXFLAGS) +AC_SUBST(SANITIZER_LDFLAGS) +AC_SUBST(SSE42_CXXFLAGS) +AC_SUBST(SSE41_CXXFLAGS) +AC_SUBST(AVX2_CXXFLAGS) +AC_SUBST(SHANI_CXXFLAGS) +AC_SUBST(ARM_CRC_CXXFLAGS) +AC_SUBST(LIBTOOL_APP_LDFLAGS) +AC_SUBST(BOOST_LIBS) +AC_SUBST(TESTDEFS) +AC_SUBST(EVENT_LIBS) +AC_SUBST(EVENT_PTHREADS_LIBS) +AC_SUBST(ZMQ_LIBS) +AC_SUBST(HAVE_GMTIME_R) +AC_SUBST(LIBZCASH_LIBS) +AC_SUBST(HAVE_FDATASYNC) +AC_SUBST(HAVE_FULLFSYNC) +AC_SUBST(HAVE_O_CLOEXEC) +AC_SUBST(HAVE_BUILTIN_PREFETCH) +AC_SUBST(HAVE_MM_PREFETCH) +AC_SUBST(HAVE_STRONG_GETAUXVAL) +AC_SUBST(HAVE_WEAK_GETAUXVAL) +AC_CONFIG_FILES([Makefile src/Makefile doc/man/Makefile src/test/buildenv.py]) +AC_CONFIG_FILES([qa/pull-tester/tests_config.ini],[chmod +x qa/pull-tester/tests_config.ini]) +AC_CONFIG_LINKS([qa/pull-tester/rpc-tests.py:qa/pull-tester/rpc-tests.py]) + +dnl boost's m4 checks do something really nasty: they export these vars. As a +dnl result, they leak into secp256k1's configure and crazy things happen. +dnl Until this is fixed upstream and we've synced, we'll just un-export them. +CPPFLAGS_TEMP="$CPPFLAGS" +unset CPPFLAGS +CPPFLAGS="$CPPFLAGS_TEMP" + +LDFLAGS_TEMP="$LDFLAGS" +unset LDFLAGS +LDFLAGS="$LDFLAGS_TEMP" + +LIBS_TEMP="$LIBS" +unset LIBS +LIBS="$LIBS_TEMP" + +ac_configure_args="${ac_configure_args} --disable-shared --with-pic --enable-benchmark=no --enable-module-recovery" +AC_CONFIG_SUBDIRS([src/secp256k1 src/univalue]) + +AC_OUTPUT + +dnl Taken from https://wiki.debian.org/RpathIssue +case $host in + *-*-linux-gnu) + AC_MSG_RESULT([Fixing libtool for -rpath problems.]) + sed < libtool > libtool-2 \ + 's/^hardcode_libdir_flag_spec.*$'/'hardcode_libdir_flag_spec=" -D__LIBTOOL_IS_A_FOOL__ "/' + mv libtool-2 libtool + chmod 755 libtool + ;; +esac + +dnl Replace the BUILDDIR path with the correct Windows path if compiling on Native Windows +case ${OS} in + *Windows*) + sed 's/BUILDDIR="\/\([[a-z]]\)/BUILDDIR="\1:/' qa/pull-tester/tests_config.py > qa/pull-tester/tests_config-2.py + mv qa/pull-tester/tests_config-2.py qa/pull-tester/tests_config.py + chmod +x qa/pull-tester/tests_config.py + ;; +esac + +echo +echo "Options used to compile and link:" +echo " with wallet = $enable_wallet" +echo " with zmq = $use_zmq" +echo " with test = $use_tests" +echo " use asm = $use_asm" +echo " sanitizers = $use_sanitizers" +echo " debug enabled = $enable_debug" +echo " gprof enabled = $enable_gprof" +echo " werror = $enable_werror" +echo +echo " target os = $TARGET_OS" +echo " build os = $BUILD_OS" +echo +echo " CC = $CC" +echo " CFLAGS = $CFLAGS" +echo " CPPFLAGS = $DEBUG_CPPFLAGS $HARDENED_CPPFLAGS $CPPFLAGS" +echo " CXX = $CXX" +echo " CXXFLAGS = $DEBUG_CXXFLAGS $HARDENED_CXXFLAGS $ERROR_CXXFLAGS $GPROF_CXXFLAGS $CXXFLAGS" +echo " LDFLAGS = $PTHREAD_CFLAGS $HARDENED_LDFLAGS $GPROF_LDFLAGS $LDFLAGS" +echo " ARFLAGS = $ARFLAGS" +echo diff --git a/contrib/README.md b/contrib/README.md new file mode 100644 index 000000000..4ec9fffa5 --- /dev/null +++ b/contrib/README.md @@ -0,0 +1,43 @@ +*** Warning: This document has not been updated for Zcash and may be inaccurate. *** + +Wallet Tools +--------------------- + +### [BitRPC](/contrib/bitrpc) ### +Allows for sending of all standard Bitcoin commands via RPC rather than as command line args. + +Repository Tools +--------------------- + +### [Developer tools](/contrib/devtools) ### +Specific tools for developers working on this repository. +Contains the script `github-merge.sh` for merging github pull requests securely and signing them using GPG. + +### [Linearize](/contrib/linearize) ### +Construct a linear, no-fork, best version of the blockchain. + +### [Qos](/contrib/qos) ### + +A Linux bash script that will set up traffic control (tc) to limit the outgoing bandwidth for connections to the Bitcoin network. This means one can have an always-on bitcoind instance running, and another local bitcoind/bitcoin-qt instance which connects to this node and receives blocks from it. + +### [Seeds](/contrib/seeds) ### +Utility to generate the pnSeed[] array that is compiled into the client. + +Build Tools and Keys +--------------------- + +### [Debian](/contrib/debian) ### +Contains files used to package bitcoind/bitcoin-qt +for Debian-based Linux systems. If you compile bitcoind/bitcoin-qt yourself, there are some useful files here. + +### [Gitian-descriptors](/contrib/gitian-descriptors) ### +Gavin's notes on getting gitian builds up and running using KVM. + +### [Gitian-downloader](/contrib/gitian-downloader) +Various PGP files of core developers. + +Test and Verify Tools +--------------------- + +### [TestGen](/contrib/testgen) ### +Utilities to generate test vectors for the data-driven Bitcoin tests. \ No newline at end of file diff --git a/contrib/bitrpc/README.md b/contrib/bitrpc/README.md new file mode 100644 index 000000000..f5ef2f040 --- /dev/null +++ b/contrib/bitrpc/README.md @@ -0,0 +1,8 @@ +### BitRPC +Allows for sending of all standard Bitcoin commands via RPC rather than as command line args. + +### Looking for Wallet Tools? +BitRPC.py is able to do the exact same thing as `walletchangepass.py` and `walletunlock.py`. Their respective commands in BitRPC.py are: + + bitrpc.py walletpassphrasechange + bitrpc.py walletpassphrase \ No newline at end of file diff --git a/contrib/bitrpc/bitrpc.py b/contrib/bitrpc/bitrpc.py new file mode 100644 index 000000000..1c3d40f22 --- /dev/null +++ b/contrib/bitrpc/bitrpc.py @@ -0,0 +1,335 @@ +from jsonrpc import ServiceProxy +import sys +import string +import getpass + +# ===== BEGIN USER SETTINGS ===== +# if you do not set these you will be prompted for a password for every command +rpcuser = "" +rpcpass = "" +# ====== END USER SETTINGS ====== + + +if rpcpass == "": + access = ServiceProxy("http://127.0.0.1:8232") +else: + access = ServiceProxy("http://"+rpcuser+":"+rpcpass+"@127.0.0.1:8232") +cmd = sys.argv[1].lower() + +if cmd == "backupwallet": + try: + path = raw_input("Enter destination path/filename: ") + print access.backupwallet(path) + except Exception as inst: + print inst + +elif cmd == "encryptwallet": + try: + pwd = getpass.getpass(prompt="Enter passphrase: ") + pwd2 = getpass.getpass(prompt="Repeat passphrase: ") + if pwd == pwd2: + access.encryptwallet(pwd) + print "\n---Wallet encrypted. Server stopping, restart to run with encrypted wallet---\n" + else: + print "\n---Passphrases do not match---\n" + except Exception as inst: + print inst + +elif cmd == "getaccount": + try: + addr = raw_input("Enter a Bitcoin address: ") + print access.getaccount(addr) + except Exception as inst: + print inst + +elif cmd == "getaccountaddress": + try: + acct = raw_input("Enter an account name: ") + print access.getaccountaddress(acct) + except Exception as inst: + print inst + +elif cmd == "getaddressesbyaccount": + try: + acct = raw_input("Enter an account name: ") + print access.getaddressesbyaccount(acct) + except Exception as inst: + print inst + +elif cmd == "getbalance": + try: + acct = raw_input("Enter an account (optional): ") + mc = raw_input("Minimum confirmations (optional): ") + try: + print access.getbalance(acct, mc) + except: + print access.getbalance() + except Exception as inst: + print inst + +elif cmd == "getblockbycount": + try: + height = raw_input("Height: ") + print access.getblockbycount(height) + except Exception as inst: + print inst + +elif cmd == "getblockcount": + try: + print access.getblockcount() + except Exception as inst: + print inst + +elif cmd == "getblocknumber": + try: + print access.getblocknumber() + except Exception as inst: + print inst + +elif cmd == "getconnectioncount": + try: + print access.getconnectioncount() + except Exception as inst: + print inst + +elif cmd == "getdifficulty": + try: + print access.getdifficulty() + except Exception as inst: + print inst + +elif cmd == "getgenerate": + try: + print access.getgenerate() + except Exception as inst: + print inst + +elif cmd == "gethashespersec": + try: + print access.gethashespersec() + except Exception as inst: + print inst + +elif cmd == "getinfo": + try: + print access.getinfo() + except Exception as inst: + print inst + +elif cmd == "getnewaddress": + try: + acct = raw_input("Enter an account name: ") + try: + print access.getnewaddress(acct) + except: + print access.getnewaddress() + except Exception as inst: + print inst + +elif cmd == "getreceivedbyaccount": + try: + acct = raw_input("Enter an account (optional): ") + mc = raw_input("Minimum confirmations (optional): ") + try: + print access.getreceivedbyaccount(acct, mc) + except: + print access.getreceivedbyaccount() + except Exception as inst: + print inst + +elif cmd == "getreceivedbyaddress": + try: + addr = raw_input("Enter a Bitcoin address (optional): ") + mc = raw_input("Minimum confirmations (optional): ") + try: + print access.getreceivedbyaddress(addr, mc) + except: + print access.getreceivedbyaddress() + except Exception as inst: + print inst + +elif cmd == "gettransaction": + try: + txid = raw_input("Enter a transaction ID: ") + print access.gettransaction(txid) + except Exception as inst: + print inst + +elif cmd == "getwork": + try: + data = raw_input("Data (optional): ") + try: + print access.gettransaction(data) + except: + print access.gettransaction() + except Exception as inst: + print inst + +elif cmd == "help": + try: + cmd = raw_input("Command (optional): ") + try: + print access.help(cmd) + except: + print access.help() + except Exception as inst: + print inst + +elif cmd == "listaccounts": + try: + mc = raw_input("Minimum confirmations (optional): ") + try: + print access.listaccounts(mc) + except: + print access.listaccounts() + except Exception as inst: + print inst + +elif cmd == "listreceivedbyaccount": + try: + mc = raw_input("Minimum confirmations (optional): ") + incemp = raw_input("Include empty? (true/false, optional): ") + try: + print access.listreceivedbyaccount(mc, incemp) + except: + print access.listreceivedbyaccount() + except Exception as inst: + print inst + +elif cmd == "listreceivedbyaddress": + try: + mc = raw_input("Minimum confirmations (optional): ") + incemp = raw_input("Include empty? (true/false, optional): ") + try: + print access.listreceivedbyaddress(mc, incemp) + except: + print access.listreceivedbyaddress() + except Exception as inst: + print inst + +elif cmd == "listtransactions": + try: + acct = raw_input("Account (optional): ") + count = raw_input("Number of transactions (optional): ") + frm = raw_input("Skip (optional):") + try: + print access.listtransactions(acct, count, frm) + except: + print access.listtransactions() + except Exception as inst: + print inst + +elif cmd == "move": + try: + frm = raw_input("From: ") + to = raw_input("To: ") + amt = raw_input("Amount:") + mc = raw_input("Minimum confirmations (optional): ") + comment = raw_input("Comment (optional): ") + try: + print access.move(frm, to, amt, mc, comment) + except: + print access.move(frm, to, amt) + except Exception as inst: + print inst + +elif cmd == "sendfrom": + try: + frm = raw_input("From: ") + to = raw_input("To: ") + amt = raw_input("Amount:") + mc = raw_input("Minimum confirmations (optional): ") + comment = raw_input("Comment (optional): ") + commentto = raw_input("Comment-to (optional): ") + try: + print access.sendfrom(frm, to, amt, mc, comment, commentto) + except: + print access.sendfrom(frm, to, amt) + except Exception as inst: + print inst + +elif cmd == "sendmany": + try: + frm = raw_input("From: ") + to = raw_input("To (in format address1:amount1,address2:amount2,...): ") + mc = raw_input("Minimum confirmations (optional): ") + comment = raw_input("Comment (optional): ") + try: + print access.sendmany(frm,to,mc,comment) + except: + print access.sendmany(frm,to) + except Exception as inst: + print inst + +elif cmd == "sendtoaddress": + try: + to = raw_input("To (in format address1:amount1,address2:amount2,...): ") + amt = raw_input("Amount:") + comment = raw_input("Comment (optional): ") + commentto = raw_input("Comment-to (optional): ") + try: + print access.sendtoaddress(to,amt,comment,commentto) + except: + print access.sendtoaddress(to,amt) + except Exception as inst: + print inst + +elif cmd == "setaccount": + try: + addr = raw_input("Address: ") + acct = raw_input("Account:") + print access.setaccount(addr,acct) + except Exception as inst: + print inst + +elif cmd == "setgenerate": + try: + gen= raw_input("Generate? (true/false): ") + cpus = raw_input("Max processors/cores (-1 for unlimited, optional):") + try: + print access.setgenerate(gen, cpus) + except: + print access.setgenerate(gen) + except Exception as inst: + print inst + +elif cmd == "settxfee": + try: + amt = raw_input("Amount:") + print access.settxfee(amt) + except Exception as inst: + print inst + +elif cmd == "stop": + try: + print access.stop() + except Exception as inst: + print inst + +elif cmd == "validateaddress": + try: + addr = raw_input("Address: ") + print access.validateaddress(addr) + except Exception as inst: + print inst + +elif cmd == "walletpassphrase": + try: + pwd = getpass.getpass(prompt="Enter wallet passphrase: ") + access.walletpassphrase(pwd, 60) + print "\n---Wallet unlocked---\n" + except Exception as inst: + print inst + +elif cmd == "walletpassphrasechange": + try: + pwd = getpass.getpass(prompt="Enter old wallet passphrase: ") + pwd2 = getpass.getpass(prompt="Enter new wallet passphrase: ") + access.walletpassphrasechange(pwd, pwd2) + print + print "\n---Passphrase changed---\n" + except Exception as inst: + print inst + +else: + print "Command not found or not supported" diff --git a/contrib/ci-builders/buildbot/Dockerfile-bbworker.apt b/contrib/ci-builders/buildbot/Dockerfile-bbworker.apt new file mode 100644 index 000000000..40ee4b8a4 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-bbworker.apt @@ -0,0 +1,42 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG=latest +FROM electriccoinco/zcashd-build-$FROMBASEOS$FROMBASEOS_BUILD_TAG + +ARG DUMBINIT_VERSION=1.2.2 +RUN wget -O /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v${DUMBINIT_VERSION}/dumb-init_${DUMBINIT_VERSION}_amd64 +RUN chmod +x /usr/bin/dumb-init + +# Buildbot user +ARG BUILDBOT_USER=zcbbworker +ARG BUILDBOT_UID=2001 +RUN useradd --home-dir /home/$BUILDBOT_USER \ + --shell /bin/bash \ + --create-home \ + --uid $BUILDBOT_UID\ + $BUILDBOT_USER + +USER $BUILDBOT_USER +WORKDIR /home/$BUILDBOT_USER + +ADD bbworker-requirements.txt requirements.txt +RUN python -m venv venv \ + && . venv/bin/activate \ + && python -m pip install wheel \ + && python -m pip install -r requirements.txt + +# Buildbot worker +ARG BASEOS +ENV BUILDBOT_WORKER_NAME=$BASEOS-docker +ENV BUILDBOT_WORKER_PASS=thisgetssetwhenpodisstarted +ENV BUILDBOT_MASTER_HOST=dev-ci.z.cash +ENV BUILDBOT_MASTER_PORT=9899 + +WORKDIR /home/$BUILDBOT_USER +RUN venv/bin/buildbot-worker create-worker $BUILDBOT_WORKER_NAME \ + $BUILDBOT_MASTER_HOST:$BUILDBOT_MASTER_PORT \ + $BUILDBOT_WORKER_NAME $BUILDBOT_WORKER_PASS \ + && echo "OS: $BASEOS" > $BUILDBOT_WORKER_NAME/info/host +ADD bbworker-buildbot.tac $BUILDBOT_WORKER_NAME/buildbot.tac + +WORKDIR /home/$BUILDBOT_USER/$BUILDBOT_WORKER_NAME +CMD ["/usr/bin/dumb-init", "../venv/bin/twistd", "--pidfile=", "-ny", "buildbot.tac"] diff --git a/contrib/ci-builders/buildbot/Dockerfile-bbworker.arch b/contrib/ci-builders/buildbot/Dockerfile-bbworker.arch new file mode 100644 index 000000000..c3e6ff9d7 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-bbworker.arch @@ -0,0 +1,35 @@ +FROM electriccoinco/zcashd-build-arch + +# Buildbot user +ARG BUILDBOT_USER=zcbbworker +ARG BUILDBOT_UID=2001 +RUN useradd --home-dir /home/$BUILDBOT_USER \ + --shell /bin/bash \ + --create-home \ + --uid $BUILDBOT_UID\ + $BUILDBOT_USER + +USER $BUILDBOT_USER +WORKDIR /home/$BUILDBOT_USER + +ADD bbworker-requirements.txt requirements.txt +RUN python -m venv venv \ + && . venv/bin/activate \ + && python -m pip install wheel \ + && python -m pip install -r requirements.txt + +# Buildbot worker +ARG BUILDBOT_WORKER_NAME=arch-docker +ARG BUILDBOT_WORKER_PASS=thisgetssetwhenpodisstarted +ARG BUILDBOT_MASTER_HOST=dev-ci.z.cash +ARG BUILDBOT_MASTER_PORT=9899 + +WORKDIR /home/$BUILDBOT_USER +RUN venv/bin/buildbot-worker create-worker $BUILDBOT_WORKER_NAME \ + $BUILDBOT_MASTER_HOST:$BUILDBOT_MASTER_PORT \ + $BUILDBOT_WORKER_NAME $BUILDBOT_WORKER_PASS \ + && echo "OS: Centos 8" > $BUILDBOT_WORKER_NAME/info/host +ADD bbworker-buildbot.tac $BUILDBOT_WORKER_NAME/buildbot.tac + +WORKDIR /home/$BUILDBOT_USER/$BUILDBOT_WORKER_NAME +CMD ["/usr/bin/dumb-init", "../venv/bin/twistd", "--pidfile=", "-ny", "buildbot.tac"] diff --git a/contrib/ci-builders/buildbot/Dockerfile-bbworker.centos8 b/contrib/ci-builders/buildbot/Dockerfile-bbworker.centos8 new file mode 100644 index 000000000..fbc02101b --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-bbworker.centos8 @@ -0,0 +1,35 @@ +FROM electriccoinco/zcashd-build-centos8 + +# Buildbot user +ARG BUILDBOT_USER=zcbbworker +ARG BUILDBOT_UID=2001 +RUN useradd --home-dir /home/$BUILDBOT_USER \ + --shell /bin/bash \ + --create-home \ + --uid $BUILDBOT_UID\ + $BUILDBOT_USER + +USER $BUILDBOT_USER +WORKDIR /home/$BUILDBOT_USER + +ADD bbworker-requirements.txt requirements.txt +RUN python3 -m venv venv \ + && . venv/bin/activate \ + && python -m pip install wheel \ + && python -m pip install -r requirements.txt + +# Buildbot worker +ARG BUILDBOT_WORKER_NAME=centos8-docker +ARG BUILDBOT_WORKER_PASS=thisgetssetwhenpodisstarted +ARG BUILDBOT_MASTER_HOST=dev-ci.z.cash +ARG BUILDBOT_MASTER_PORT=9899 + +WORKDIR /home/$BUILDBOT_USER +RUN venv/bin/buildbot-worker create-worker $BUILDBOT_WORKER_NAME \ + $BUILDBOT_MASTER_HOST:$BUILDBOT_MASTER_PORT \ + $BUILDBOT_WORKER_NAME $BUILDBOT_WORKER_PASS \ + && echo "OS: Centos 8" > $BUILDBOT_WORKER_NAME/info/host +ADD bbworker-buildbot.tac $BUILDBOT_WORKER_NAME/buildbot.tac + +WORKDIR /home/$BUILDBOT_USER/$BUILDBOT_WORKER_NAME +CMD ["/usr/bin/dumb-init", "../venv/bin/twistd", "--pidfile=", "-ny", "buildbot.tac"] diff --git a/contrib/ci-builders/buildbot/Dockerfile-build-python.apt b/contrib/ci-builders/buildbot/Dockerfile-build-python.apt new file mode 100644 index 000000000..8b73e9bb7 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-build-python.apt @@ -0,0 +1,30 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG +FROM $FROMBASEOS:$FROMBASEOS_BUILD_TAG +ARG DEBIAN_FRONTEND=noninteractive + +ADD apt-package-list.txt /tmp/apt-package-list.txt +RUN apt-get update \ + && apt-get install -y $(tr "\n" " " < /tmp/apt-package-list.txt) \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3 1 + +ARG PYTHONVERSION=3.7.5 +RUN apt-get install -y \ + build-essential \ + zlib1g-dev \ + libncurses5-dev \ + libgdbm-dev \ + libnss3-dev \ + libssl-dev \ + libreadline-dev \ + libffi-dev \ + curl +WORKDIR /tmp +RUN curl https://www.python.org/ftp/python/$PYTHONVERSION/Python-$PYTHONVERSION.tar.xz -o python.tar.xz \ + && tar -xf python.tar.xz \ + && cd Python-$PYTHONVERSION \ + && ./configure --enable-optimizations \ + && make -j 8 \ + && make altinstall \ + && update-alternatives --install /usr/bin/python python /usr/local/bin/python3.7 1 +RUN update-alternatives --install /usr/bin/python3 python3 /usr/local/bin/python3.7 1 \ No newline at end of file diff --git a/contrib/ci-builders/buildbot/Dockerfile-build.apt b/contrib/ci-builders/buildbot/Dockerfile-build.apt new file mode 100644 index 000000000..3b7fd9541 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-build.apt @@ -0,0 +1,9 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG +FROM $FROMBASEOS:$FROMBASEOS_BUILD_TAG +ARG DEBIAN_FRONTEND=noninteractive + +ADD apt-package-list.txt /tmp/apt-package-list.txt +RUN apt-get update \ + && apt-get install -y $(tr "\n" " " < /tmp/apt-package-list.txt) \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3 1 diff --git a/contrib/ci-builders/buildbot/Dockerfile-build.arch b/contrib/ci-builders/buildbot/Dockerfile-build.arch new file mode 100644 index 000000000..c75f5a190 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-build.arch @@ -0,0 +1,23 @@ +ARG ARCHLINUX_TAG +FROM archlinux:$ARCHLINUX_TAG + +RUN pacman -Syyu --noconfirm \ + && pacman -S --noconfirm \ + base-devel \ + git \ + python3 \ + python-pip \ + wget + +RUN wget -O /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64 +RUN chmod +x /usr/bin/dumb-init +RUN python -m pip install virtualenv +# AUR for libtinfo5 Source: https://dev.to/cloudx/testing-our-package-build-in-the-docker-world-34p0 +RUN useradd builduser -m \ + && passwd -d builduser \ + && cd /home/builduser \ + && git clone "https://aur.archlinux.org/ncurses5-compat-libs.git" ncurses5-compat-libs \ + && chown builduser -R ncurses5-compat-libs \ + && (printf 'builduser ALL=(ALL) ALL\n' | tee -a /etc/sudoers) \ + && sudo -u builduser bash -c 'gpg --keyserver pool.sks-keyservers.net --recv-keys 702353E0F7E48EDB' \ + && sudo -u builduser bash -c 'cd ~/ncurses5-compat-libs && makepkg -si --noconfirm' \ No newline at end of file diff --git a/contrib/ci-builders/buildbot/Dockerfile-build.centos8 b/contrib/ci-builders/buildbot/Dockerfile-build.centos8 new file mode 100644 index 000000000..b5fb3eb20 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-build.centos8 @@ -0,0 +1,14 @@ +FROM centos:8 + +RUN yum update -y \ + && dnf group install -y "Development Tools" \ + && yum install -y \ + ncurses-compat-libs \ + python3 \ + python3-devel \ + wget + +RUN wget -O /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64 +RUN chmod +x /usr/bin/dumb-init +RUN alternatives --set python /usr/bin/python3 \ + && python3 -m pip install virtualenv diff --git a/contrib/ci-builders/buildbot/Dockerfile-gitian.apt b/contrib/ci-builders/buildbot/Dockerfile-gitian.apt new file mode 100644 index 000000000..5ca2a8757 --- /dev/null +++ b/contrib/ci-builders/buildbot/Dockerfile-gitian.apt @@ -0,0 +1,8 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG=latest +FROM electriccoinco/zcashd-build-$FROMBASEOS$FROMBASEOS_BUILD_TAG + +RUN useradd -ms /bin/bash -U debian +USER debian:debian +WORKDIR /home/debian +CMD ["sleep", "infinity"] \ No newline at end of file diff --git a/contrib/ci-builders/buildbot/README.md b/contrib/ci-builders/buildbot/README.md new file mode 100644 index 000000000..46cd3affb --- /dev/null +++ b/contrib/ci-builders/buildbot/README.md @@ -0,0 +1,42 @@ +# zcashd ci Docker images + +These Dockerfiles can be used to build zcashd. + +The current objective is to build a base image for each distribution that includes the system packages to build zcashd. From `build` images, more targeted images are created. + +The process is meant to be automated, but an example `docker-build.sh` script is included. + + +## build images +`apt-package-list.txt` contains the required packages for debian based systems. + +`Dockerfile-build.apt` uses that file, and some build time arguments, to build apt based build images. + +Currently available images are hosted at +https://hub.docker.com/r/electriccoinco/zcashd-build/tags + + +## gitian images + +`Dockerfile-gitian.apt` uses the build images to generate images for use with [gitian-builder](https://github.com/devrandom/gitian-builder) + +Currently available images are hosted at https://hub.docker.com/r/electriccoinco/zcashd-gitian/tags + + +## bbworker images + +`Dockerfile-bbworker.apt` uses the build images for use with [buildbot](https://buildbot.net) + +- bbworker-buildbot.tac is a required worker boot file (most is overridden at instancitation) +- bbworker-requirements.txt is the python package requirements for the buildbot worker + +Currently available images are hosted at https://hub.docker.com/r/electriccoinco/zcashd-bbworker/tags + + +### Stand alone, best effort images + +Additional buildbot workers for Centos8 and Arch. + +- Dockerfile-bbworker.arch +- Dockerfile-bbworker.centos8 + diff --git a/contrib/ci-builders/buildbot/apt-package-list.txt b/contrib/ci-builders/buildbot/apt-package-list.txt new file mode 100644 index 000000000..484f31953 --- /dev/null +++ b/contrib/ci-builders/buildbot/apt-package-list.txt @@ -0,0 +1,23 @@ +autoconf +bsdmainutils +build-essential +cmake +curl +g++-aarch64-linux-gnu +git +lcov +libcap-dev +libffi-dev +libtinfo5 +libtool +libssl-dev +libz-dev +libbz2-dev +mingw-w64 +pkg-config +python3 +python3-dev +python3-venv +valgrind +wget +zstd diff --git a/contrib/ci-builders/buildbot/bbworker-buildbot.tac b/contrib/ci-builders/buildbot/bbworker-buildbot.tac new file mode 100644 index 000000000..477ae27d3 --- /dev/null +++ b/contrib/ci-builders/buildbot/bbworker-buildbot.tac @@ -0,0 +1,40 @@ +import fnmatch +import os +import sys + +from twisted.application import service +from twisted.python.log import FileLogObserver +from twisted.python.log import ILogObserver + +from buildbot_worker.bot import Worker + +# setup worker +basedir = os.environ.get("BUILDBOT_BASEDIR", + os.path.abspath(os.path.dirname(__file__))) +application = service.Application('buildbot-worker') + + +application.setComponent(ILogObserver, FileLogObserver(sys.stdout).emit) +# and worker on the same process! +buildmaster_host = os.environ.get("BUILDMASTER", 'localhost') +port = int(os.environ.get("BUILDMASTER_PORT", 9989)) +workername = os.environ.get("WORKERNAME", 'docker') +passwd = os.environ.get("WORKERPASS") + +# delete the password from the environ so that it is not leaked in the log +blacklist = os.environ.get("WORKER_ENVIRONMENT_BLACKLIST", "WORKERPASS").split() +for name in list(os.environ.keys()): + for toremove in blacklist: + if fnmatch.fnmatch(name, toremove): + del os.environ[name] + +keepalive = 600 +umask = None +maxdelay = 300 +allow_shutdown = None +maxretries = 10 + +s = Worker(buildmaster_host, port, workername, passwd, basedir, + keepalive, umask=umask, maxdelay=maxdelay, + allow_shutdown=allow_shutdown, maxRetries=maxretries) +s.setServiceParent(application) diff --git a/contrib/ci-builders/buildbot/bbworker-requirements.txt b/contrib/ci-builders/buildbot/bbworker-requirements.txt new file mode 100644 index 000000000..012268cae --- /dev/null +++ b/contrib/ci-builders/buildbot/bbworker-requirements.txt @@ -0,0 +1,9 @@ +buildbot-worker +pyblake2 +pyflakes +pyutil +pyzmq +requests +simplejson +twisted[tls] +wheel diff --git a/contrib/ci-builders/buildbot/docker-build.sh b/contrib/ci-builders/buildbot/docker-build.sh new file mode 100755 index 000000000..fb806e8dc --- /dev/null +++ b/contrib/ci-builders/buildbot/docker-build.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash + +export LC_ALL=C +set -exo pipefail + +# Debian 9 +docker build . -f Dockerfile-build-python.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=9 -t electriccoinco/zcashd-build-debian9 +docker push electriccoinco/zcashd-build-debian9 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=debian --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=9 -t electriccoinco/zcashd-bbworker-debian9 +docker push electriccoinco/zcashd-bbworker-debian9 + +# Debian 10 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=10 -t electriccoinco/zcashd-build-debian10 +docker push electriccoinco/zcashd-build-debian10 +docker build . -f Dockerfile-gitian.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=10 -t electriccoinco/zcashd-gitian-debian10 +docker push electriccoinco/zcashd-gitian-debian10 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=debian --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=10 -t electriccoinco/zcashd-bbworker-debian10 +docker push electriccoinco/zcashd-bbworker-debian10 + +# Debian 11 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=bullseye -t electriccoinco/zcashd-build-debian11 +docker push electriccoinco/zcashd-build-debian11 +docker build . -f Dockerfile-gitian.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=bullseye -t electriccoinco/zcashd-gitian-debian11 +docker push electriccoinco/zcashd-gitian-debian11 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=debian --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=bullseye -t electriccoinco/zcashd-bbworker-debian11 +docker push electriccoinco/zcashd-bbworker-debian11 + +# Ubuntu 16.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=16.04 -t electriccoinco/zcashd-build-ubuntu1604 +docker push electriccoinco/zcashd-build-ubuntu1604 +docker build . -f Dockerfile-gitian.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1604 -t electriccoinco/zcashd-gitian-ubuntu1604 +docker push electriccoinco/zcashd-gitian-ubuntu1604 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1604 -t electriccoinco/zcashd-bbworker-ubuntu1604 +docker push electriccoinco/zcashd-bbworker-ubuntu1604 + +# Ubuntu 18.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=18.04 -t electriccoinco/zcashd-build-ubuntu1804 +docker push electriccoinco/zcashd-build-ubuntu1804 +docker build . -f Dockerfile-gitian.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1804 -t electriccoinco/zcashd-gitian-ubuntu1804 +docker push electriccoinco/zcashd-gitian-ubuntu1804 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1804 -t electriccoinco/zcashd-bbworker-ubuntu1804 +docker push electriccoinco/zcashd-bbworker-ubuntu1804 + +# Ubuntu 20.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=20.04 -t electriccoinco/zcashd-build-ubuntu2004 +docker push electriccoinco/zcashd-build-ubuntu2004 +docker build . -f Dockerfile-gitian.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=2004 -t electriccoinco/zcashd-gitian-ubuntu2004 +docker push electriccoinco/zcashd-gitian-ubuntu2004 +docker build . -f Dockerfile-bbworker.apt --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=2004 -t electriccoinco/zcashd-bbworker-ubuntu2004 +docker push electriccoinco/zcashd-bbworker-ubuntu2004 + +# Centos8 +docker build . -f Dockerfile-build.centos8 -t electriccoinco/zcashd-build-centos8 +docker build . -f Dockerfile-bbworker.centos8 -t electriccoinco/zcashd-bbworker-centos8 +docker push electriccoinco/zcashd-build-centos8 +docker push electriccoinco/zcashd-bbworker-centos8 + +# Arch 20200908 +docker build . -f Dockerfile-build.arch --build-arg ARCHLINUX_TAG=20200908 -t electriccoinco/zcashd-build-arch +docker build . -f Dockerfile-bbworker.arch -t electriccoinco/zcashd-bbworker-arch +docker push electriccoinco/zcashd-build-arch +docker push electriccoinco/zcashd-bbworker-arch \ No newline at end of file diff --git a/contrib/ci-builders/tekton/Dockerfile-build.apt b/contrib/ci-builders/tekton/Dockerfile-build.apt new file mode 100644 index 000000000..3b7fd9541 --- /dev/null +++ b/contrib/ci-builders/tekton/Dockerfile-build.apt @@ -0,0 +1,9 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG +FROM $FROMBASEOS:$FROMBASEOS_BUILD_TAG +ARG DEBIAN_FRONTEND=noninteractive + +ADD apt-package-list.txt /tmp/apt-package-list.txt +RUN apt-get update \ + && apt-get install -y $(tr "\n" " " < /tmp/apt-package-list.txt) \ + && update-alternatives --install /usr/bin/python python /usr/bin/python3 1 diff --git a/contrib/ci-builders/tekton/Dockerfile-build.arch b/contrib/ci-builders/tekton/Dockerfile-build.arch new file mode 100644 index 000000000..f1a1666b2 --- /dev/null +++ b/contrib/ci-builders/tekton/Dockerfile-build.arch @@ -0,0 +1,14 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG +FROM $FROMBASEOS:$FROMBASEOS_BUILD_TAG + +RUN pacman -Syyu --noconfirm \ + && pacman -S --noconfirm \ + base-devel \ + git \ + python3 \ + python-pip \ + ncurses \ + wget + +RUN sudo link /lib/libtinfo.so.6 /lib/libtinfo.so.5 diff --git a/contrib/ci-builders/tekton/Dockerfile-build.centos8 b/contrib/ci-builders/tekton/Dockerfile-build.centos8 new file mode 100644 index 000000000..b5fb3eb20 --- /dev/null +++ b/contrib/ci-builders/tekton/Dockerfile-build.centos8 @@ -0,0 +1,14 @@ +FROM centos:8 + +RUN yum update -y \ + && dnf group install -y "Development Tools" \ + && yum install -y \ + ncurses-compat-libs \ + python3 \ + python3-devel \ + wget + +RUN wget -O /usr/bin/dumb-init https://github.com/Yelp/dumb-init/releases/download/v1.2.2/dumb-init_1.2.2_amd64 +RUN chmod +x /usr/bin/dumb-init +RUN alternatives --set python /usr/bin/python3 \ + && python3 -m pip install virtualenv diff --git a/contrib/ci-builders/tekton/Dockerfile-tekton-worker b/contrib/ci-builders/tekton/Dockerfile-tekton-worker new file mode 100644 index 000000000..6e880dd46 --- /dev/null +++ b/contrib/ci-builders/tekton/Dockerfile-tekton-worker @@ -0,0 +1,11 @@ +ARG FROMBASEOS +ARG FROMBASEOS_BUILD_TAG +FROM electriccoinco/zcashd-build-$FROMBASEOS$FROMBASEOS_BUILD_TAG + +ADD requirements.txt requirements.txt +RUN python -m venv venv \ + && . venv/bin/activate \ + && pip install --upgrade pip \ + && python -m pip install -r requirements.txt + +ADD ./zcash-params /home/.zcash-params diff --git a/contrib/ci-builders/tekton/README.md b/contrib/ci-builders/tekton/README.md new file mode 100644 index 000000000..667caf5ab --- /dev/null +++ b/contrib/ci-builders/tekton/README.md @@ -0,0 +1,35 @@ +# zcashd ci Docker images + +These Dockerfiles can be used to build zcashd. + +The current objective is to build a base image for each distribution that includes the system packages to build zcashd. From `build` images, more targeted images are created. + +The process is meant to be automated, but an example `docker-build.sh` script is included. + + +## build images +`apt-package-tekton-list.txt` contains the required packages for debian based systems. + +`Dockerfile-build.apt` uses that file, and some build time arguments, to build apt based build images. + +Currently available images are hosted at +https://hub.docker.com/r/electriccoinco/zcashd-build/tags + + + +## Tekton worker images + +`Dockerfile-tekton-worker` uses the above build images as a base and layers on toolchains needed for testing + +- requirements.txt is the python package requirements for the tekton worker + +Currently available images are hosted at https://hub.docker.com/r/electriccoinco + + +### Stand alone, best effort images + +Additional Tekton base builders for Centos8 and Arch. Can be used with `Dockerfile-tekton-worker` to create Tekton workers. + +- Dockerfile-build.arch +- Dockerfile-build.centos8 + diff --git a/contrib/ci-builders/tekton/apt-package-tekton-list.txt b/contrib/ci-builders/tekton/apt-package-tekton-list.txt new file mode 100644 index 000000000..002363de3 --- /dev/null +++ b/contrib/ci-builders/tekton/apt-package-tekton-list.txt @@ -0,0 +1,24 @@ +autoconf +bsdmainutils +build-essential +cmake +curl +g++-aarch64-linux-gnu +git +lcov +libcap-dev +libffi-dev +libtinfo5 +libtool +libssl-dev +libz-dev +libbz2-dev +mingw-w64 +pkg-config +python3 +python3-pip +python3-dev +python3-venv +valgrind +wget +zstd diff --git a/contrib/ci-builders/tekton/docker-build.sh b/contrib/ci-builders/tekton/docker-build.sh new file mode 100755 index 000000000..1f7c4eb8f --- /dev/null +++ b/contrib/ci-builders/tekton/docker-build.sh @@ -0,0 +1,60 @@ +#!/usr/bin/env bash + +export LC_ALL=C +set -exo pipefail + +# Debian 9 +docker build . -f Dockerfile-build-python.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=9 -t electriccoinco/zcashd-build-debian9 +docker push electriccoinco/zcashd-build-debian9 + +docker build . -f Dockerfile-tekton-worker --build-arg BASEOS=debian --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=9 -t electriccoinco/zcashd-worker-debian9 +docker push electriccoinco/zcashd-worker-debian9 + +# Debian 10 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=10 -t electriccoinco/zcashd-build-debian10 +docker push electriccoinco/zcashd-build-debian10 + +docker build . -f Dockerfile-tekton-worker --build-arg BASEOS=debian --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=10 -t electriccoinco/zcashd-worker-debian10 +docker push electriccoinco/zcashd-worker-debian10 + +# Debian 11 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=bullseye -t electriccoinco/zcashd-build-debian11 +docker push electriccoinco/zcashd-build-debian11 + +docker build . -f Dockerfile-tekton-worker --build-arg FROMBASEOS=debian --build-arg FROMBASEOS_BUILD_TAG=11 -t electriccoinco/zcashd-worker-debian11 +docker push electriccoinco/zcashd-worker-debian11 + +# Ubuntu 16.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=16.04 -t electriccoinco/zcashd-build-ubuntu1604 +docker push electriccoinco/zcashd-build-ubuntu1604 + +docker build . -f Dockerfile-tekton-worker --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1604 -t electriccoinco/zcashd-worker-ubuntu1604 +docker push electriccoinco/zcashd-worker-ubuntu1604 + +# Ubuntu 18.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=18.04 -t electriccoinco/zcashd-build-ubuntu1804 +docker push electriccoinco/zcashd-build-ubuntu1804 + +docker build . -f Dockerfile-tekton-worker --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=1804 -t electriccoinco/zcashd-worker-ubuntu1804 +docker push electriccoinco/zcashd-worker-ubuntu1804 + +# Ubuntu 20.04 +docker build . -f Dockerfile-build.apt --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=20.04 -t electriccoinco/zcashd-build-ubuntu2004 +docker push electriccoinco/zcashd-build-ubuntu2004 + +docker build . -f Dockerfile-tekton-worker --build-arg BASEOS=ubuntu --build-arg FROMBASEOS=ubuntu --build-arg FROMBASEOS_BUILD_TAG=2004 -t electriccoinco/zcashd-worker-ubuntu2004 +docker push electriccoinco/zcashd-worker-ubuntu2004 + +# Centos8 +docker build . -f Dockerfile-build.centos8 -t electriccoinco/zcashd-build-centos8 +docker push electriccoinco/zcashd-build-centos8 + +docker build . -f Dockerfile-tekton-worker --build-arg FROMBASEOS=centos --build-arg FROMBASEOS_BUILD_TAG=8 -t electriccoinco/zcashd-worker-centos8 +docker push electriccoinco/zcashd-worker-centos8 + +# Arch 20210418.0.20194 +docker build . -f Dockerfile-build.arch --build-arg FROMBASEOS=archlinux --build-arg FROMBASEOS_BUILD_TAG=base-20210418.0.20194 -t electriccoinco/zcashd-build-archlinux +docker push electriccoinco/zcashd-build-archlinux + +docker build . -f Dockerfile-tekton-worker --build-arg FROMBASEOS=archlinux -t electriccoinco/zcashd-worker-archlinux +docker push electriccoinco/zcashd-worker-archlinux \ No newline at end of file diff --git a/contrib/ci-builders/tekton/requirements.txt b/contrib/ci-builders/tekton/requirements.txt new file mode 100644 index 000000000..14f84708a --- /dev/null +++ b/contrib/ci-builders/tekton/requirements.txt @@ -0,0 +1,8 @@ +wheel +pyblake2 +pyflakes +pyutil +pyzmq +requests +simplejson +twisted[tls] diff --git a/contrib/ci-builders/tekton/tekton-labs/README.md b/contrib/ci-builders/tekton/tekton-labs/README.md new file mode 100644 index 000000000..4603c4e97 --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/README.md @@ -0,0 +1,89 @@ +# infra-tekton-labs +Examples of CI/CD used to support Zcash build and testing + +# Environment Tooling Setup (Pre-Install/Install) +### Install Docker +https://docs.docker.com/engine/install/ + +#### Setup Docker +If you are installing Docker for the first time, to run `docker` without `sudo` privilege for every docker command: + + - Check if Docker group already exists: + - `cat /etc/group | grep docker` + - How to create docker group: + - `sudo groupadd docker` + - Add current user to docker group + - `sudo usermod -a -G docker $CURR_USER` + - Validate current user was added: + - `cat /etc/group | grep docker` + - Restart system to persist changes and graceful setup (had issues with just logout/login) + +### Install Kind +https://kind.sigs.k8s.io/ + +### Install Kubctl +https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/ + +### Install Tkn +https://tekton.dev/docs/cli/ + +# Setup Local Zcash CI Environment +Follow the steps below 1-3 to complete a local Zcash Tekton installation, assuming the above dependencies are installed. + +### Create cluster (e.g. micro k8, kind, minicube) +1. `kind create cluster --name zcash-tekton-lab` + + Other Useful commands + - Validate cluster creation & context: `kubectl cluster-info --context kind-zcash-tekton-lab` + + - Delete cluster: `kind delete cluster --name zcash-tekton-lab || true` + + - List Kube contexts: `kubectl config get-contexts` + + - Delete Kube contexts: `kubectl config delete-context ` + + - Setup Kube context: `kubectl config current-context` + + - Create new Kube context: `kubectl config set-context zcash_local_ci --user=cluster-admin` + + - Switch to new context: `kubectl config use-context zcash_local_ci` + +### Create Tekton Pipeline in cluster +See: https://github.com/tektoncd/pipeline for recent version + +2. `kubectl apply -f releases/tekton-pipeline-v0.37.0.yaml` + + (Alternative) + + `kubectl apply -f https://storage.googleapis.com/tekton-releases/pipeline/previous/v0.37.0/release.yaml` + +### Create Tekton Dashboard in cluster +See: https://github.com/tektoncd/dashboard for recent version + +3. `kubectl apply -f releases/tekton-dashboard-readonly-v0.27.0.yaml` + + Validate deployment of Tekton Dashboard & Pipeline + + `kubectl get pods --namespace tekton-pipelines` + + Forward Tekton Dashboard: + + `kubectl --namespace tekton-pipelines port-forward svc/tekton-dashboard 9097:9097 &` + + View Dashboard in Browser: + + `http://localhost:9097/` + +## Create Tekton Task +kubectl apply -f ./tasks/zcash-build.yml + +tkn task start --showlog zcash-build + +tkn task delete zcash-build + +## Create Tekton Pipeline +kubectl apply -f ./pipeline/zcash-build-pipeline.yml + +tkn pipeline start --showlog zcash-build-pipeline + +tkn pipeline delete zcash-build-pipeline diff --git a/contrib/ci-builders/tekton/tekton-labs/releases/tekton-dashboard-readonly-v0.27.0.yaml b/contrib/ci-builders/tekton/tekton-labs/releases/tekton-dashboard-readonly-v0.27.0.yaml new file mode 100644 index 000000000..8013169e3 --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/releases/tekton-dashboard-readonly-v0.27.0.yaml @@ -0,0 +1,334 @@ +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: extensions.dashboard.tekton.dev +spec: + group: dashboard.tekton.dev + names: + categories: + - tekton + - tekton-dashboard + kind: Extension + plural: extensions + shortNames: + - ext + - exts + preserveUnknownFields: false + scope: Namespaced + versions: + - additionalPrinterColumns: + - jsonPath: .spec.apiVersion + name: API version + type: string + - jsonPath: .spec.name + name: Kind + type: string + - jsonPath: .spec.displayname + name: Display name + type: string + - jsonPath: .metadata.creationTimestamp + name: Age + type: date + name: v1alpha1 + schema: + openAPIV3Schema: + type: object + x-kubernetes-preserve-unknown-fields: true + served: true + storage: true + subresources: + status: {} +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: tekton-dashboard + namespace: tekton-pipelines +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: tekton-dashboard-info + namespace: tekton-pipelines +rules: + - apiGroups: + - "" + resourceNames: + - dashboard-info + resources: + - configmaps + verbs: + - get +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: tekton-dashboard-backend +rules: + - apiGroups: + - apiextensions.k8s.io + resources: + - customresourcedefinitions + verbs: + - get + - list + - apiGroups: + - security.openshift.io + resources: + - securitycontextconstraints + verbs: + - use + - apiGroups: + - tekton.dev + resources: + - clustertasks + - clustertasks/status + verbs: + - get + - list + - watch + - apiGroups: + - triggers.tekton.dev + resources: + - clusterinterceptors + - clustertriggerbindings + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: tekton-dashboard-tenant +rules: + - apiGroups: + - dashboard.tekton.dev + resources: + - extensions + verbs: + - get + - list + - watch + - apiGroups: + - "" + resources: + - events + - namespaces + - pods + - pods/log + verbs: + - get + - list + - watch + - apiGroups: + - tekton.dev + resources: + - tasks + - taskruns + - pipelines + - pipelineruns + - pipelineresources + - conditions + - tasks/status + - taskruns/status + - pipelines/status + - pipelineruns/status + - taskruns/finalizers + - pipelineruns/finalizers + verbs: + - get + - list + - watch + - apiGroups: + - triggers.tekton.dev + resources: + - eventlisteners + - triggerbindings + - triggers + - triggertemplates + verbs: + - get + - list + - watch +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: tekton-dashboard-info + namespace: tekton-pipelines +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: tekton-dashboard-info +subjects: + - apiGroup: rbac.authorization.k8s.io + kind: Group + name: system:authenticated +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + rbac.dashboard.tekton.dev/subject: tekton-dashboard + name: tekton-dashboard-backend +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: tekton-dashboard-backend +subjects: + - kind: ServiceAccount + name: tekton-dashboard + namespace: tekton-pipelines +--- +apiVersion: v1 +data: + version: v0.27.0 +kind: ConfigMap +metadata: + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + name: dashboard-info + namespace: tekton-pipelines +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app: tekton-dashboard + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/name: dashboard + app.kubernetes.io/part-of: tekton-dashboard + app.kubernetes.io/version: v0.27.0 + dashboard.tekton.dev/release: v0.27.0 + version: v0.27.0 + name: tekton-dashboard + namespace: tekton-pipelines +spec: + ports: + - name: http + port: 9097 + protocol: TCP + targetPort: 9097 + selector: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/name: dashboard + app.kubernetes.io/part-of: tekton-dashboard +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + labels: + app: tekton-dashboard + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/name: dashboard + app.kubernetes.io/part-of: tekton-dashboard + app.kubernetes.io/version: v0.27.0 + dashboard.tekton.dev/release: v0.27.0 + version: v0.27.0 + name: tekton-dashboard + namespace: tekton-pipelines +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/name: dashboard + app.kubernetes.io/part-of: tekton-dashboard + template: + metadata: + labels: + app: tekton-dashboard + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/name: dashboard + app.kubernetes.io/part-of: tekton-dashboard + app.kubernetes.io/version: v0.27.0 + name: tekton-dashboard + spec: + containers: + - args: + - --port=9097 + - --logout-url= + - --pipelines-namespace=tekton-pipelines + - --triggers-namespace=tekton-pipelines + - --read-only=true + - --log-level=info + - --log-format=json + - --namespace= + - --stream-logs=true + - --external-logs= + env: + - name: INSTALLED_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + image: gcr.io/tekton-releases/github.com/tektoncd/dashboard/cmd/dashboard:v0.27.0@sha256:d57860eb2ff1f97ca1b657eda6ec640584ec8b756e80a5f888c98b7b056c14c1 + livenessProbe: + httpGet: + path: /health + port: 9097 + name: tekton-dashboard + ports: + - containerPort: 9097 + readinessProbe: + httpGet: + path: /readiness + port: 9097 + nodeSelector: + kubernetes.io/os: linux + securityContext: + runAsNonRoot: true + runAsUser: 65532 + serviceAccountName: tekton-dashboard + volumes: [] + +--- +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + labels: + app.kubernetes.io/component: dashboard + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-dashboard + rbac.dashboard.tekton.dev/subject: tekton-dashboard + name: tekton-dashboard-tenant +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: ClusterRole + name: tekton-dashboard-tenant +subjects: + - kind: ServiceAccount + name: tekton-dashboard + namespace: tekton-pipelines diff --git a/contrib/ci-builders/tekton/tekton-labs/releases/tekton-pipeline-v0.37.0.yaml b/contrib/ci-builders/tekton/tekton-labs/releases/tekton-pipeline-v0.37.0.yaml new file mode 100644 index 000000000..f65f240bb --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/releases/tekton-pipeline-v0.37.0.yaml @@ -0,0 +1,2222 @@ +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Namespace +metadata: + name: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: policy/v1beta1 +kind: PodSecurityPolicy +metadata: + name: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + annotations: + seccomp.security.alpha.kubernetes.io/allowedProfileNames: 'docker/default,runtime/default' + seccomp.security.alpha.kubernetes.io/defaultProfileName: 'runtime/default' + apparmor.security.beta.kubernetes.io/allowedProfileNames: 'runtime/default' + apparmor.security.beta.kubernetes.io/defaultProfileName: 'runtime/default' +spec: + privileged: false + allowPrivilegeEscalation: false + requiredDropCapabilities: + - ALL + volumes: + - 'emptyDir' + - 'configMap' + - 'secret' + hostNetwork: false + hostIPC: false + hostPID: false + runAsUser: + rule: 'MustRunAsNonRoot' + runAsGroup: + rule: 'MustRunAs' + ranges: + - min: 1 + max: 65535 + seLinux: + rule: 'RunAsAny' + supplementalGroups: + rule: 'MustRunAs' + ranges: + - min: 1 + max: 65535 + fsGroup: + rule: 'MustRunAs' + ranges: + - min: 1 + max: 65535 + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tekton-pipelines-controller-cluster-access + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + - apiGroups: [""] + # Controller needs to watch Pods created by TaskRuns to see them progress. + resources: ["pods"] + verbs: ["list", "watch"] + # Controller needs cluster access to all of the CRDs that it is responsible for + # managing. + - apiGroups: ["tekton.dev"] + resources: ["tasks", "clustertasks", "taskruns", "pipelines", "pipelineruns", "pipelineresources", "conditions", "runs"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["tekton.dev"] + resources: ["taskruns/finalizers", "pipelineruns/finalizers", "runs/finalizers"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + - apiGroups: ["tekton.dev"] + resources: ["tasks/status", "clustertasks/status", "taskruns/status", "pipelines/status", "pipelineruns/status", "pipelineresources/status", "runs/status"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + # This is the access that the controller needs on a per-namespace basis. + name: tekton-pipelines-controller-tenant-access + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + # Read-write access to create Pods and PVCs (for Workspaces) + - apiGroups: [""] + resources: ["pods", "persistentvolumeclaims"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + # Write permissions to publish events. + - apiGroups: [""] + resources: ["events"] + verbs: ["create", "update", "patch"] + # Read-only access to these. + - apiGroups: [""] + resources: ["configmaps", "limitranges", "secrets", "serviceaccounts"] + verbs: ["get", "list", "watch"] + # Read-write access to StatefulSets for Affinity Assistant. + - apiGroups: ["apps"] + resources: ["statefulsets"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] + # Read-write access to ResolutionRequest for remote resolution. + - apiGroups: ["resolution.tekton.dev"] + resources: ["resolutionrequests"] + verbs: ["get", "list", "watch", "create", "delete"] +--- +kind: ClusterRole +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tekton-pipelines-webhook-cluster-access + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + # The webhook needs to be able to get and update customresourcedefinitions, + # mainly to update the webhook certificates. + - apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions", "customresourcedefinitions/status"] + verbs: ["get", "update", "patch"] + resourceNames: + - pipelines.tekton.dev + - pipelineruns.tekton.dev + - runs.tekton.dev + - tasks.tekton.dev + - clustertasks.tekton.dev + - taskruns.tekton.dev + - pipelineresources.tekton.dev + - conditions.tekton.dev + # knative.dev/pkg needs list/watch permissions to set up informers for the webhook. + - apiGroups: ["apiextensions.k8s.io"] + resources: ["customresourcedefinitions"] + verbs: ["list", "watch"] + - apiGroups: ["admissionregistration.k8s.io"] + # The webhook performs a reconciliation on these two resources and continuously + # updates configuration. + resources: ["mutatingwebhookconfigurations", "validatingwebhookconfigurations"] + # knative starts informers on these things, which is why we need get, list and watch. + verbs: ["list", "watch"] + - apiGroups: ["admissionregistration.k8s.io"] + resources: ["mutatingwebhookconfigurations"] + # This mutating webhook is responsible for applying defaults to tekton objects + # as they are received. + resourceNames: ["webhook.pipeline.tekton.dev"] + # When there are changes to the configs or secrets, knative updates the mutatingwebhook config + # with the updated certificates or the refreshed set of rules. + verbs: ["get", "update", "delete"] + - apiGroups: ["admissionregistration.k8s.io"] + resources: ["validatingwebhookconfigurations"] + # validation.webhook.pipeline.tekton.dev performs schema validation when you, for example, create TaskRuns. + # config.webhook.pipeline.tekton.dev validates the logging configuration against knative's logging structure + resourceNames: ["validation.webhook.pipeline.tekton.dev", "config.webhook.pipeline.tekton.dev"] + # When there are changes to the configs or secrets, knative updates the validatingwebhook config + # with the updated certificates or the refreshed set of rules. + verbs: ["get", "update", "delete"] + - apiGroups: ["policy"] + resources: ["podsecuritypolicies"] + resourceNames: ["tekton-pipelines"] + verbs: ["use"] + - apiGroups: [""] + resources: ["namespaces"] + verbs: ["get"] + # The webhook configured the namespace as the OwnerRef on various cluster-scoped resources, + # which requires we can Get the system namespace. + resourceNames: ["tekton-pipelines"] + - apiGroups: [""] + resources: ["namespaces/finalizers"] + verbs: ["update"] + # The webhook configured the namespace as the OwnerRef on various cluster-scoped resources, + # which requires we can update the system namespace finalizers. + resourceNames: ["tekton-pipelines"] + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tekton-pipelines-controller + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + - apiGroups: [""] + resources: ["configmaps"] + verbs: ["list", "watch"] + # The controller needs access to these configmaps for logging information and runtime configuration. + - apiGroups: [""] + resources: ["configmaps"] + verbs: ["get"] + resourceNames: ["config-logging", "config-observability", "config-artifact-bucket", "config-artifact-pvc", "feature-flags", "config-leader-election", "config-registry-cert"] + - apiGroups: ["policy"] + resources: ["podsecuritypolicies"] + resourceNames: ["tekton-pipelines"] + verbs: ["use"] +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + - apiGroups: [""] + resources: ["configmaps"] + verbs: ["list", "watch"] + # The webhook needs access to these configmaps for logging information. + - apiGroups: [""] + resources: ["configmaps"] + verbs: ["get"] + resourceNames: ["config-logging", "config-observability", "config-leader-election", "feature-flags"] + - apiGroups: [""] + resources: ["secrets"] + verbs: ["list", "watch"] + # The webhook daemon makes a reconciliation loop on webhook-certs. Whenever + # the secret changes it updates the webhook configurations with the certificates + # stored in the secret. + - apiGroups: [""] + resources: ["secrets"] + verbs: ["get", "update"] + resourceNames: ["webhook-certs"] + - apiGroups: ["policy"] + resources: ["podsecuritypolicies"] + resourceNames: ["tekton-pipelines"] + verbs: ["use"] +--- +kind: Role +apiVersion: rbac.authorization.k8s.io/v1 +metadata: + name: tekton-pipelines-leader-election + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + # We uses leases for leaderelection + - apiGroups: ["coordination.k8s.io"] + resources: ["leases"] + verbs: ["get", "list", "create", "update", "delete", "patch", "watch"] +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: Role +metadata: + name: tekton-pipelines-info + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +rules: + # All system:authenticated users needs to have access + # of the pipelines-info ConfigMap even if they don't + # have access to the other resources present in the + # installed namespace. + - apiGroups: [""] + resources: ["configmaps"] + resourceNames: ["pipelines-info"] + verbs: ["get"] + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +apiVersion: v1 +kind: ServiceAccount +metadata: + name: tekton-pipelines-controller + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +--- +apiVersion: v1 +kind: ServiceAccount +metadata: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: tekton-pipelines-controller-cluster-access + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-controller + namespace: tekton-pipelines +roleRef: + kind: ClusterRole + name: tekton-pipelines-controller-cluster-access + apiGroup: rbac.authorization.k8s.io +--- +# If this ClusterRoleBinding is replaced with a RoleBinding +# then the ClusterRole would be namespaced. The access described by +# the tekton-pipelines-controller-tenant-access ClusterRole would +# be scoped to individual tenant namespaces. +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: tekton-pipelines-controller-tenant-access + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-controller + namespace: tekton-pipelines +roleRef: + kind: ClusterRole + name: tekton-pipelines-controller-tenant-access + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRoleBinding +metadata: + name: tekton-pipelines-webhook-cluster-access + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-webhook + namespace: tekton-pipelines +roleRef: + kind: ClusterRole + name: tekton-pipelines-webhook-cluster-access + apiGroup: rbac.authorization.k8s.io + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: tekton-pipelines-controller + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-controller + namespace: tekton-pipelines +roleRef: + kind: Role + name: tekton-pipelines-controller + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-webhook + namespace: tekton-pipelines +roleRef: + kind: Role + name: tekton-pipelines-webhook + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: tekton-pipelines-controller-leaderelection + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-controller + namespace: tekton-pipelines +roleRef: + kind: Role + name: tekton-pipelines-leader-election + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: tekton-pipelines-webhook-leaderelection + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + - kind: ServiceAccount + name: tekton-pipelines-webhook + namespace: tekton-pipelines +roleRef: + kind: Role + name: tekton-pipelines-leader-election + apiGroup: rbac.authorization.k8s.io +--- +apiVersion: rbac.authorization.k8s.io/v1 +kind: RoleBinding +metadata: + name: tekton-pipelines-info + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +subjects: + # Giving all system:authenticated users the access of the + # ConfigMap which contains version information. + - kind: Group + name: system:authenticated + apiGroup: rbac.authorization.k8s.io +roleRef: + apiGroup: rbac.authorization.k8s.io + kind: Role + name: tekton-pipelines-info + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: clustertasks.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: false + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + - name: v1beta1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: ClusterTask + plural: clustertasks + singular: clustertask + categories: + - tekton + - tekton-pipelines + scope: Cluster + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: ["v1beta1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: pipelines.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: false + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + - name: v1beta1 + served: true + storage: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + names: + kind: Pipeline + plural: pipelines + singular: pipeline + categories: + - tekton + - tekton-pipelines + scope: Namespaced + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: ["v1beta1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: pipelineruns.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: false + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].reason" + - name: StartTime + type: date + jsonPath: .status.startTime + - name: CompletionTime + type: date + jsonPath: .status.completionTime + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + - name: v1beta1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].reason" + - name: StartTime + type: date + jsonPath: .status.startTime + - name: CompletionTime + type: date + jsonPath: .status.completionTime + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: PipelineRun + plural: pipelineruns + singular: pipelinerun + categories: + - tekton + - tekton-pipelines + shortNames: + - pr + - prs + scope: Namespaced + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: ["v1beta1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + +--- +# Copyright 2022 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: resolutionrequests.resolution.tekton.dev + labels: + resolution.tekton.dev/release: devel +spec: + group: resolution.tekton.dev + scope: Namespaced + names: + kind: ResolutionRequest + plural: resolutionrequests + singular: resolutionrequest + categories: + - all + - tekton + versions: + - name: v1alpha1 + served: true + storage: true + subresources: + status: {} + schema: + openAPIV3Schema: + type: object + properties: + spec: + description: Spec holds the parameters for the request. + type: object + properties: + params: + type: object + x-kubernetes-preserve-unknown-fields: true + status: + description: Status receives the data of a completed request. + type: object + properties: + data: + description: The resolved contents of the requested resource in-lined as a string. + type: string + annotations: + description: Annotations is additional Status fields for the Resource to save some additional State as well as convey more information to the user. This is roughly akin to Annotations on any k8s resource, just the reconciler conveying richer information outwards. + type: object + x-kubernetes-preserve-unknown-fields: true + conditions: + description: Conditions the latest available observations of a resource's current state. + type: array + items: + description: Conditions describe the success and completion state of the resource request. + type: object + required: + - status + - type + properties: + lastTransitionTime: + description: LastTransitionTime is the last time the condition transitioned from one status to another. We use VolatileTime in place of metav1.Time to exclude this from creating equality.Semantic differences (all other things held constant). + type: string + format: date-time + message: + description: A human readable message indicating details about the transition. + type: string + reason: + description: The reason for the condition's last transition. + type: string + severity: + description: Severity with which to treat failures of this type of condition. When this is not specified, it defaults to Error. + type: string + status: + description: Status of the condition, one of True, False, Unknown. + type: string + type: + description: Type of condition. + type: string + observedGeneration: + description: ObservedGeneration is the 'Generation' of the Service that was last processed by the controller. + type: integer + format: int64 + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type=='Succeeded')].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type=='Succeeded')].reason" + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: pipelineresources.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + versions: + - name: v1alpha1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: PipelineResource + plural: pipelineresources + singular: pipelineresource + categories: + - tekton + - tekton-pipelines + scope: Namespaced + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: runs.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].reason" + - name: StartTime + type: date + jsonPath: .status.startTime + - name: CompletionTime + type: date + jsonPath: .status.completionTime + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: Run + plural: runs + singular: run + categories: + - tekton + - tekton-pipelines + scope: Namespaced + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: tasks.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: false + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + - name: v1beta1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: Task + plural: tasks + singular: task + categories: + - tekton + - tekton-pipelines + scope: Namespaced + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: ["v1beta1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apiextensions.k8s.io/v1 +kind: CustomResourceDefinition +metadata: + name: taskruns.tekton.dev + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" + version: "v0.37.0" +spec: + group: tekton.dev + preserveUnknownFields: false + versions: + - name: v1alpha1 + served: true + storage: false + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].reason" + - name: StartTime + type: date + jsonPath: .status.startTime + - name: CompletionTime + type: date + jsonPath: .status.completionTime + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + - name: v1beta1 + served: true + storage: true + schema: + openAPIV3Schema: + type: object + # One can use x-kubernetes-preserve-unknown-fields: true + # at the root of the schema (and inside any properties, additionalProperties) + # to get the traditional CRD behaviour that nothing is pruned, despite + # setting spec.preserveUnknownProperties: false. + # + # See https://kubernetes.io/blog/2019/06/20/crd-structural-schema/ + # See issue: https://github.com/knative/serving/issues/912 + x-kubernetes-preserve-unknown-fields: true + additionalPrinterColumns: + - name: Succeeded + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].status" + - name: Reason + type: string + jsonPath: ".status.conditions[?(@.type==\"Succeeded\")].reason" + - name: StartTime + type: date + jsonPath: .status.startTime + - name: CompletionTime + type: date + jsonPath: .status.completionTime + # Opt into the status subresource so metadata.generation + # starts to increment + subresources: + status: {} + names: + kind: TaskRun + plural: taskruns + singular: taskrun + categories: + - tekton + - tekton-pipelines + shortNames: + - tr + - trs + scope: Namespaced + conversion: + strategy: Webhook + webhook: + conversionReviewVersions: ["v1beta1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: Secret +metadata: + name: webhook-certs + namespace: tekton-pipelines + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" +# The data is populated at install time. +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + name: validation.webhook.pipeline.tekton.dev + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" +webhooks: + - admissionReviewVersions: ["v1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + failurePolicy: Fail + sideEffects: None + name: validation.webhook.pipeline.tekton.dev +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: MutatingWebhookConfiguration +metadata: + name: webhook.pipeline.tekton.dev + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" +webhooks: + - admissionReviewVersions: ["v1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + failurePolicy: Fail + sideEffects: None + name: webhook.pipeline.tekton.dev +--- +apiVersion: admissionregistration.k8s.io/v1 +kind: ValidatingWebhookConfiguration +metadata: + name: config.webhook.pipeline.tekton.dev + labels: + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + pipeline.tekton.dev/release: "v0.37.0" +webhooks: + - admissionReviewVersions: ["v1"] + clientConfig: + service: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + failurePolicy: Fail + sideEffects: None + name: config.webhook.pipeline.tekton.dev + objectSelector: + matchLabels: + app.kubernetes.io/part-of: tekton-pipelines + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: tekton-aggregate-edit + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + rbac.authorization.k8s.io/aggregate-to-edit: "true" + rbac.authorization.k8s.io/aggregate-to-admin: "true" +rules: + - apiGroups: + - tekton.dev + resources: + - tasks + - taskruns + - pipelines + - pipelineruns + - pipelineresources + - conditions + verbs: + - create + - delete + - deletecollection + - get + - list + - patch + - update + - watch + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: rbac.authorization.k8s.io/v1 +kind: ClusterRole +metadata: + name: tekton-aggregate-view + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + rbac.authorization.k8s.io/aggregate-to-view: "true" +rules: + - apiGroups: + - tekton.dev + resources: + - tasks + - taskruns + - pipelines + - pipelineruns + - pipelineresources + - conditions + verbs: + - get + - list + - watch + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-artifact-bucket + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +# data: +# # location of the gcs bucket to be used for artifact storage +# location: "gs://bucket-name" +# # name of the secret that will contain the credentials for the service account +# # with access to the bucket +# bucket.service.account.secret.name: +# # The key in the secret with the required service account json +# bucket.service.account.secret.key: +# # The field name that should be used for the service account +# # Valid values: GOOGLE_APPLICATION_CREDENTIALS, BOTO_CONFIG. +# bucket.service.account.field.name: GOOGLE_APPLICATION_CREDENTIALS + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-artifact-pvc + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +# data: +# # size of the PVC volume +# size: 5Gi +# +# # storage class of the PVC volume +# storageClassName: storage-class-name + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-defaults + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + default-timeout-minutes: "120" + _example: | + default-timeout-minutes: "120" + ################################ + # # + # EXAMPLE CONFIGURATION # + # # + ################################ + + # This block is not actually functional configuration, + # but serves to illustrate the available configuration + # options and document them in a way that is accessible + # to users that `kubectl edit` this config map. + # + # These sample configuration options may be copied out of + # this example block and unindented to be in the data block + # to actually change the configuration. + + # default-timeout-minutes contains the default number of + # minutes to use for TaskRun and PipelineRun, if none is specified. + default-timeout-minutes: "0" # 60 minutes + + # default-service-account contains the default service account name + # to use for TaskRun and PipelineRun, if none is specified. + default-service-account: "default" + + # default-managed-by-label-value contains the default value given to the + # "app.kubernetes.io/managed-by" label applied to all Pods created for + # TaskRuns. If a user's requested TaskRun specifies another value for this + # label, the user's request supercedes. + default-managed-by-label-value: "tekton-pipelines" + + # default-pod-template contains the default pod template to use for + # TaskRun and PipelineRun. If a pod template is specified on the + # PipelineRun, the default-pod-template is merged with that one. + # default-pod-template: + + # default-affinity-assistant-pod-template contains the default pod template + # to use for affinity assistant pods. If a pod template is specified on the + # PipelineRun, the default-affinity-assistant-pod-template is merged with + # that one. + # default-affinity-assistant-pod-template: + + # default-cloud-events-sink contains the default CloudEvents sink to be + # used for TaskRun and PipelineRun, when no sink is specified. + # Note that right now it is still not possible to set a PipelineRun or + # TaskRun specific sink, so the default is the only option available. + # If no sink is specified, no CloudEvent is generated + # default-cloud-events-sink: + + # default-task-run-workspace-binding contains the default workspace + # configuration provided for any Workspaces that a Task declares + # but that a TaskRun does not explicitly provide. + # default-task-run-workspace-binding: | + # emptyDir: {} + + # default-max-matrix-combinations-count contains the default maximum number + # of combinations from a Matrix, if none is specified. + default-max-matrix-combinations-count: "256" + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: feature-flags + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + # Setting this flag to "true" will prevent Tekton to create an + # Affinity Assistant for every TaskRun sharing a PVC workspace + # + # The default behaviour is for Tekton to create Affinity Assistants + # + # See more in the workspace documentation about Affinity Assistant + # https://github.com/tektoncd/pipeline/blob/main/docs/workspaces.md#affinity-assistant-and-specifying-workspace-order-in-a-pipeline + # or https://github.com/tektoncd/pipeline/pull/2630 for more info. + disable-affinity-assistant: "false" + # Setting this flag to "true" will prevent Tekton scanning attached + # service accounts and injecting any credentials it finds into your + # Steps. + # + # The default behaviour currently is for Tekton to search service + # accounts for secrets matching a specified format and automatically + # mount those into your Steps. + # + # Note: setting this to "true" will prevent PipelineResources from + # working. + # + # See https://github.com/tektoncd/pipeline/issues/2791 for more + # info. + disable-creds-init: "false" + # This option should be set to false when Pipelines is running in a + # cluster that does not use injected sidecars such as Istio. Setting + # it to false should decrease the time it takes for a TaskRun to start + # running. For clusters that use injected sidecars, setting this + # option to false can lead to unexpected behavior. + # + # See https://github.com/tektoncd/pipeline/issues/2080 for more info. + running-in-environment-with-injected-sidecars: "true" + # Setting this flag to "true" will require that any Git SSH Secret + # offered to Tekton must have known_hosts included. + # + # See https://github.com/tektoncd/pipeline/issues/2981 for more + # info. + require-git-ssh-secret-known-hosts: "false" + # Setting this flag to "true" enables the use of Tekton OCI bundle. + # This is an experimental feature and thus should still be considered + # an alpha feature. + enable-tekton-oci-bundles: "false" + # Setting this flag to "true" enables the use of custom tasks from + # within pipelines. + # This is an experimental feature and thus should still be considered + # an alpha feature. + enable-custom-tasks: "false" + # Setting this flag will determine which gated features are enabled. + # Acceptable values are "stable" or "alpha". + enable-api-fields: "stable" + # Setting this flag to "true" enables CloudEvents for Runs, as long as a + # CloudEvents sink is configured in the config-defaults config map + send-cloudevents-for-runs: "false" + +--- +# Copyright 2021 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: pipelines-info + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + # Contains pipelines version which can be queried by external + # tools such as CLI. Elevated permissions are already given to + # this ConfigMap such that even if we don't have access to + # other resources in the namespace we still can have access to + # this ConfigMap. + version: "v0.37.0" + +--- +# Copyright 2020 Tekton Authors LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-leader-election + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + # An inactive but valid configuration follows; see example. + lease-duration: "60s" + renew-deadline: "40s" + retry-period: "10s" + +--- +# Copyright 2019 Tekton Authors LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-logging + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + # Common configuration for all knative codebase + zap-logger-config: | + { + "level": "info", + "development": false, + "sampling": { + "initial": 100, + "thereafter": 100 + }, + "outputPaths": ["stdout"], + "errorOutputPaths": ["stderr"], + "encoding": "json", + "encoderConfig": { + "timeKey": "ts", + "levelKey": "level", + "nameKey": "logger", + "callerKey": "caller", + "messageKey": "msg", + "stacktraceKey": "stacktrace", + "lineEnding": "", + "levelEncoder": "", + "timeEncoder": "iso8601", + "durationEncoder": "", + "callerEncoder": "" + } + } + # Log level overrides + loglevel.controller: "info" + loglevel.webhook: "info" + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-observability + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +data: + _example: | + ################################ + # # + # EXAMPLE CONFIGURATION # + # # + ################################ + + # This block is not actually functional configuration, + # but serves to illustrate the available configuration + # options and document them in a way that is accessible + # to users that `kubectl edit` this config map. + # + # These sample configuration options may be copied out of + # this example block and unindented to be in the data block + # to actually change the configuration. + + # metrics.backend-destination field specifies the system metrics destination. + # It supports either prometheus (the default) or stackdriver. + # Note: Using Stackdriver will incur additional charges. + metrics.backend-destination: prometheus + + # metrics.stackdriver-project-id field specifies the Stackdriver project ID. This + # field is optional. When running on GCE, application default credentials will be + # used and metrics will be sent to the cluster's project if this field is + # not provided. + metrics.stackdriver-project-id: "" + + # metrics.allow-stackdriver-custom-metrics indicates whether it is allowed + # to send metrics to Stackdriver using "global" resource type and custom + # metric type. Setting this flag to "true" could cause extra Stackdriver + # charge. If metrics.backend-destination is not Stackdriver, this is + # ignored. + metrics.allow-stackdriver-custom-metrics: "false" + metrics.taskrun.level: "task" + metrics.taskrun.duration-type: "histogram" + metrics.pipelinerun.level: "pipeline" + metrics.pipelinerun.duration-type: "histogram" + +--- +# Copyright 2020 Tekton Authors LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: v1 +kind: ConfigMap +metadata: + name: config-registry-cert + namespace: tekton-pipelines + labels: + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines +# data: +# # Registry's self-signed certificate +# cert: | + +--- +# Copyright 2019 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1 +kind: Deployment +metadata: + name: tekton-pipelines-controller + namespace: tekton-pipelines + labels: + app.kubernetes.io/name: controller + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + version: "v0.37.0" +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: controller + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + template: + metadata: + labels: + app.kubernetes.io/name: controller + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + app: tekton-pipelines-controller + version: "v0.37.0" + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: NotIn + values: + - windows + serviceAccountName: tekton-pipelines-controller + containers: + - name: tekton-pipelines-controller + image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/controller:v0.37.0@sha256:2a5239e0e458134870db8541008f358618a35d24247044a0041ab9ecb9ab2413 + args: [ + # These images are built on-demand by `ko resolve` and are replaced + # by image references by digest. + "-kubeconfig-writer-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/kubeconfigwriter:v0.37.0@sha256:93f5ceecf1776ce8cfa7384df970152654c0f7b301c869c1fcba6a12b4fa2171", "-git-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/git-init:v0.37.0@sha256:ec618dfa0fc23ae90105135be96bb8c0f9250bfd7682d9d5bab845ab6fd50528", "-entrypoint-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/entrypoint:v0.37.0@sha256:599c0447b1e25edf27bb3599616b7315b28fb0a9bd01cf36843cb786cb475908", "-nop-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/nop:v0.37.0@sha256:b27e010534e395bc9bec982858c8012ce065df6058038d7a649ed8be708b9aa4", "-imagedigest-exporter-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/imagedigestexporter:v0.37.0@sha256:cf0a3e0a9e90201626bd1ae805386e3977c744d8e099911f825d33501d2f8f33", "-pr-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/pullrequest-init:v0.37.0@sha256:bce6c45c9485982099bd6f66d00e96337a8ab5c19de4699414a0730581dcf0ec", "-workingdirinit-image", "gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/workingdirinit:v0.37.0@sha256:dbe778e14ebb4be0a81e917385b79687aba3e278e38e78a3290ae7c32f0a46e8", + # This is gcr.io/google.com/cloudsdktool/cloud-sdk:302.0.0-slim + "-gsutil-image", "gcr.io/google.com/cloudsdktool/cloud-sdk@sha256:27b2c22bf259d9bc1a291e99c63791ba0c27a04d2db0a43241ba0f1f20f4067f", + # The shell image must allow root in order to create directories and copy files to PVCs. + # ghcr.io/distroless/busybox as of April 14 2022 + # image shall not contains tag, so it will be supported on a runtime like cri-o + "-shell-image", "ghcr.io/distroless/busybox@sha256:19f02276bf8dbdd62f069b922f10c65262cc34b710eea26ff928129a736be791", + # for script mode to work with windows we need a powershell image + # pinning to nanoserver tag as of July 15 2021 + "-shell-image-win", "mcr.microsoft.com/powershell:nanoserver@sha256:b6d5ff841b78bdf2dfed7550000fd4f3437385b8fa686ec0f010be24777654d6"] + volumeMounts: + - name: config-logging + mountPath: /etc/config-logging + - name: config-registry-cert + mountPath: /etc/config-registry-cert + env: + - name: SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + # If you are changing these names, you will also need to update + # the controller's Role in 200-role.yaml to include the new + # values in the "configmaps" "get" rule. + - name: CONFIG_DEFAULTS_NAME + value: config-defaults + - name: CONFIG_LOGGING_NAME + value: config-logging + - name: CONFIG_OBSERVABILITY_NAME + value: config-observability + - name: CONFIG_ARTIFACT_BUCKET_NAME + value: config-artifact-bucket + - name: CONFIG_ARTIFACT_PVC_NAME + value: config-artifact-pvc + - name: CONFIG_FEATURE_FLAGS_NAME + value: feature-flags + - name: CONFIG_LEADERELECTION_NAME + value: config-leader-election + - name: SSL_CERT_FILE + value: /etc/config-registry-cert/cert + - name: SSL_CERT_DIR + value: /etc/ssl/certs + - name: METRICS_DOMAIN + value: tekton.dev/pipeline + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - all + # User 65532 is the distroless nonroot user ID + runAsUser: 65532 + runAsGroup: 65532 + ports: + - name: metrics + containerPort: 9090 + - name: profiling + containerPort: 8008 + - name: probes + containerPort: 8080 + livenessProbe: + httpGet: + path: /health + port: probes + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /readiness + port: probes + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + volumes: + - name: config-logging + configMap: + name: config-logging + - name: config-registry-cert + configMap: + name: config-registry-cert +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: controller + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + app: tekton-pipelines-controller + version: "v0.37.0" + name: tekton-pipelines-controller + namespace: tekton-pipelines +spec: + ports: + - name: http-metrics + port: 9090 + protocol: TCP + targetPort: 9090 + - name: http-profiling + port: 8008 + targetPort: 8008 + - name: probes + port: 8080 + selector: + app.kubernetes.io/name: controller + app.kubernetes.io/component: controller + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: autoscaling/v2beta1 +kind: HorizontalPodAutoscaler +metadata: + name: tekton-pipelines-webhook + namespace: tekton-pipelines + labels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + version: "v0.37.0" +spec: + minReplicas: 1 + maxReplicas: 5 + scaleTargetRef: + apiVersion: apps/v1 + kind: Deployment + name: tekton-pipelines-webhook + metrics: + - type: Resource + resource: + name: cpu + targetAverageUtilization: 100 + +--- +# Copyright 2020 The Tekton Authors +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +apiVersion: apps/v1 +kind: Deployment +metadata: + # Note: the Deployment name must be the same as the Service name specified in + # config/400-webhook-service.yaml. If you change this name, you must also + # change the value of WEBHOOK_SERVICE_NAME below. + name: tekton-pipelines-webhook + namespace: tekton-pipelines + labels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + version: "v0.37.0" +spec: + replicas: 1 + selector: + matchLabels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + template: + metadata: + labels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + app: tekton-pipelines-webhook + version: "v0.37.0" + spec: + affinity: + nodeAffinity: + requiredDuringSchedulingIgnoredDuringExecution: + nodeSelectorTerms: + - matchExpressions: + - key: kubernetes.io/os + operator: NotIn + values: + - windows + podAntiAffinity: + preferredDuringSchedulingIgnoredDuringExecution: + - podAffinityTerm: + labelSelector: + matchLabels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + topologyKey: kubernetes.io/hostname + weight: 100 + serviceAccountName: tekton-pipelines-webhook + containers: + - name: webhook + # This is the Go import path for the binary that is containerized + # and substituted here. + image: gcr.io/tekton-releases/github.com/tektoncd/pipeline/cmd/webhook:v0.37.0@sha256:5fe6aa767279b53b304d2203d645a3a88ea41825cca28ca678bbf5f952044446 + # Resource request required for autoscaler to take any action for a metric + resources: + requests: + cpu: 100m + memory: 100Mi + limits: + cpu: 500m + memory: 500Mi + env: + - name: SYSTEM_NAMESPACE + valueFrom: + fieldRef: + fieldPath: metadata.namespace + # If you are changing these names, you will also need to update + # the webhook's Role in 200-role.yaml to include the new + # values in the "configmaps" "get" rule. + - name: CONFIG_LOGGING_NAME + value: config-logging + - name: CONFIG_OBSERVABILITY_NAME + value: config-observability + - name: CONFIG_LEADERELECTION_NAME + value: config-leader-election + - name: CONFIG_FEATURE_FLAGS_NAME + value: feature-flags + - name: WEBHOOK_SERVICE_NAME + value: tekton-pipelines-webhook + - name: WEBHOOK_SECRET_NAME + value: webhook-certs + - name: METRICS_DOMAIN + value: tekton.dev/pipeline + securityContext: + allowPrivilegeEscalation: false + capabilities: + drop: + - all + # User 65532 is the distroless nonroot user ID + runAsUser: 65532 + runAsGroup: 65532 + ports: + - name: metrics + containerPort: 9090 + - name: profiling + containerPort: 8008 + - name: https-webhook + containerPort: 8443 + - name: probes + containerPort: 8080 + livenessProbe: + httpGet: + path: /health + port: probes + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 + readinessProbe: + httpGet: + path: /readiness + port: probes + scheme: HTTP + initialDelaySeconds: 5 + periodSeconds: 10 + timeoutSeconds: 5 +--- +apiVersion: v1 +kind: Service +metadata: + labels: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/version: "v0.37.0" + app.kubernetes.io/part-of: tekton-pipelines + # tekton.dev/release value replaced with inputs.params.versionTag in pipeline/tekton/publish.yaml + pipeline.tekton.dev/release: "v0.37.0" + # labels below are related to istio and should not be used for resource lookup + app: tekton-pipelines-webhook + version: "v0.37.0" + name: tekton-pipelines-webhook + namespace: tekton-pipelines +spec: + ports: + # Define metrics and profiling for them to be accessible within service meshes. + - name: http-metrics + port: 9090 + targetPort: 9090 + - name: http-profiling + port: 8008 + targetPort: 8008 + - name: https-webhook + port: 443 + targetPort: 8443 + - name: probes + port: 8080 + selector: + app.kubernetes.io/name: webhook + app.kubernetes.io/component: webhook + app.kubernetes.io/instance: default + app.kubernetes.io/part-of: tekton-pipelines + +--- diff --git a/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-bench.yml b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-bench.yml new file mode 100644 index 000000000..0bb721b77 --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-bench.yml @@ -0,0 +1,218 @@ +--- +apiVersion: tekton.dev/v1beta1 +kind: Task +metadata: + name: zcash-build-bench +spec: + params: + - name: JOBS + default: "4" + type: string + - name: BUILD_FOR_HOST + default: x86_64-pc-linux-gnu + type: string + - name: CONFIGURE_FLAGS + default: "" + type: string + - name: BUILD_CONTAINER + default: electriccoinco/zcashd-bench-debian10 + type: string + - name: TEST_TARGET + default: "" + type: string + resources: + inputs: + - name: source + type: git + steps: + - name: build + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cd workspace/source + echo $(git rev-parse HEAD) + echo $(git rev-parse --short HEAD) + + if [ "$(params.BUILD_FOR_HOST)" == "x86_64-apple-darwin18" ] + then + mkdir -p depends/SDKs + curl -fs https://ecc.mypinata.cloud/ipfs/QmeSwckvSCGL9SXGdEHoAyqXdzD7T9HYTwsC34Bj5EVDF5 \ + -o depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz + tar zxvf depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz \ + -C depends/SDKs + fi + + CONFIGURE_FLAGS=$(params.CONFIGURE_FLAGS) HOST=$(params.BUILD_FOR_HOST) ./zcutil/build.sh -j$(params.JOBS) + + - name: bench-sleep + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time sleep | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-createsaplingspend + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time createsaplingspend | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-verifysaplingspend + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time verifysaplingspend | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-createsaplingoutput + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time createsaplingoutput | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-verifysaplingoutput + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time verifysaplingoutput | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-createjoinsplit + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time createjoinsplit | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-verifyjoinsplit + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time verifyjoinsplit | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-verifyequihash + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time verifyequihash | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-loadwallet-200k-recv + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/benchmark-200k-UTXOs.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time loadwallet 200k-recv | sed 1d | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-loadwallet-200k-send + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/benchmark-200k-UTXOs.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time loadwallet 200k-send | sed 1d | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-listunspent-200k-recv + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/benchmark-200k-UTXOs.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time listunspent 200k-recv | sed 1d | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-listunspent-200k-send + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/benchmark-200k-UTXOs.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time listunspent 200k-send | sed 1d | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-connectblocksapling + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/block-1723244.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time connectblocksapling | sed -n '2,$p' | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-connectblockorchard + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/block-1708048.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time connectblockorchard | sed -n '2,$p' | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py + + - name: bench-connectblockslow + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cp -a /home/.zcash-params $HOME/ + cp -r /home/block-107134.tar.xz /workspace/source + cp /home/perf_metrics.py /workspace/source + cd /workspace/source + + ./qa/zcash/performance-measurements.sh time connectblockslow | sed -n '2,$p' | jq '.[]|.runningtime | tonumber' | python ./perf_metrics.py diff --git a/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml new file mode 100644 index 000000000..2934fcafe --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml @@ -0,0 +1,57 @@ +--- +apiVersion: tekton.dev/v1beta1 +kind: Task +metadata: + name: zcash-build-test +spec: + params: + - name: JOBS + default: "4" + type: string + - name: BUILD_FOR_HOST + default: x86_64-pc-linux-gnu + type: string + - name: CONFIGURE_FLAGS + default: "" + type: string + - name: BUILD_CONTAINER + default: electriccoinco/zcashd-worker-ubuntu2004v2 + type: string + - name: TEST_TARGET + default: "" + type: string + resources: + inputs: + - name: source + type: git + steps: + - name: build + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cd workspace/source + echo $(git rev-parse HEAD) + echo $(git rev-parse --short HEAD) + + if [ "$(params.BUILD_FOR_HOST)" == "x86_64-apple-darwin18" ] + then + mkdir -p depends/SDKs + curl -fs https://ecc.mypinata.cloud/ipfs/QmeSwckvSCGL9SXGdEHoAyqXdzD7T9HYTwsC34Bj5EVDF5 \ + -o depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz + tar zxvf depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz \ + -C depends/SDKs + fi + + CONFIGURE_FLAGS=$(params.CONFIGURE_FLAGS) HOST=$(params.BUILD_FOR_HOST) ./zcutil/build.sh -j$(params.JOBS) + + - name: test + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + python -m pip install pyblake2 pyflakes python-qpid-proton pyutil pyzmq requests simplejson + cp -a /home/.zcash-params $HOME/ + echo $(git rev-parse HEAD) + echo $(git rev-parse --short HEAD) + HOST=x86_64-pc-linux-gnu /workspace/source/qa/zcash/full_test_suite.py $(params.TEST_TARGET) \ No newline at end of file diff --git a/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml new file mode 100644 index 000000000..0e46e1f14 --- /dev/null +++ b/contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml @@ -0,0 +1,51 @@ +--- +apiVersion: tekton.dev/v1beta1 +kind: Task +metadata: + name: zcash-build +spec: + params: + - name: JOBS + default: "4" + type: string + - name: BUILD_FOR_HOST + default: x86_64-pc-linux-gnu + type: string + - name: CONFIGURE_FLAGS + default: "" + type: string + - name: BUILD_CONTAINER + default: electriccoinco/zcashd-worker-ubuntu2004v2 + type: string + resources: + inputs: + - name: source + type: git + steps: + - name: setup-venv + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -e -o pipefail + python3 -m venv /venv/zcash-build-venv + source /venv/zcash-build-venv/bin/activate + python -m pip install pyblake2 pyflakes python-qpid-proton pyutil pyzmq requests simplejson + + - name: build + image: $(params.BUILD_CONTAINER) + script: | + #!/bin/bash + set -o pipefail + cd workspace/source + echo $(git rev-parse HEAD) + echo $(git rev-parse --short HEAD) + if [ "$(params.BUILD_FOR_HOST)" == "x86_64-apple-darwin18" ] + then + mkdir -p depends/SDKs + curl -fs https://ecc.mypinata.cloud/ipfs/QmeSwckvSCGL9SXGdEHoAyqXdzD7T9HYTwsC34Bj5EVDF5 \ + -o depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz + tar zxvf depends/SDKs/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz \ + -C depends/SDKs + fi + + CONFIGURE_FLAGS=$(params.CONFIGURE_FLAGS) HOST=$(params.BUILD_FOR_HOST) ./zcutil/build.sh -j$(params.JOBS) diff --git a/contrib/ci-workers/README.md b/contrib/ci-workers/README.md new file mode 100644 index 000000000..8ce9dc764 --- /dev/null +++ b/contrib/ci-workers/README.md @@ -0,0 +1,62 @@ +# Zcash CI workers + +This folder contains the Ansible playbooks for configuring a fresh OS +installation for use as a Buildbot worker in Zcash's CI. + +# Criteria for Adding Workers + +a. Don't add workers until users complain about a problem on a platform that + doesn't yet have workers. However, if we anticipate many users will use a + platform, we may pre-emptively add an unsupported worker for it. + +b. Prioritize the platforms that seem to have the most users. + +c. When adding workers, start by adding workers for the "most common" variant of + any distro. Then if users later encounter problems with a sub-variant, we can + consider adding new workers at that point. Example: add Ubuntu Desktop before + Xubuntu, on the assumption the former has a larger population base, and the + latter only materially differs in the GUI. + +# Setting up a latent worker on Amazon EC2 + +1. Add a regular (non-latent) worker to the master.cfg for dev-ci.z.cash, and + deploy the changes. + - This enables the Ansible playbook to run to completion, ending in the worker + connecting to the master. + +2. Start a basic EC2 instance using the template AMI for the target OS. + - Choose the smallest instance size, it won't be used for building Zcash. + +3. Figure out which user to log into the instance with. + - E.g. for the Ubuntu template, use "ubuntu" instead of "root" + - If you get an Ansible error later with a message like "Failed to connect to + the host via ssh: Received message too long 1349281121\r\n", that means the + instance is sending a text string in response to the SSH connection, and the + Ansible protocol is balking. Try manually logging in with the same + credentials to diagnose. + +4. Create `inventory/hosts` containing the following: + + [zcash-ci-worker-unix] + some-name ansible_host= ansible_ssh_user= + +5. Run `ansible-playbook -e buildbot_worker_host_template=templates/host.ec2.j2 -i inventory/hosts unix.yml`, + passing in the worker's Buildbot name and password. + - After a successful run, the worker should be connected to dev-ci.z.cash and + visible in its worker list. + +6. Create an AMI from the instance. This is the worker AMI to put into the + master.cfg for dev-ci.z.cash. + - 16 GB of storage should be sufficient. + +7. SSH into the instance, and edit the worker config to connect to ci.z.cash. + +8. Create an AMI from the instance. This is the worker AMI to put into the + master.cfg for ci.z.cash. + - 16 GB of storage should be sufficient. + +9. Delete the instance (it is no longer needed). + +10. Edit the master.cfg to turn the new worker into a latent (using the new AMI + IDs), add it to the appropriate worker groups, set up new builders etc. + - Deploy this via the normal PR review process. diff --git a/contrib/ci-workers/ansible.cfg b/contrib/ci-workers/ansible.cfg new file mode 100644 index 000000000..c58fea3c0 --- /dev/null +++ b/contrib/ci-workers/ansible.cfg @@ -0,0 +1,2 @@ +[ssh_connection] +pipelining = True diff --git a/contrib/ci-workers/files/bashrc b/contrib/ci-workers/files/bashrc new file mode 100644 index 000000000..aaad18b92 --- /dev/null +++ b/contrib/ci-workers/files/bashrc @@ -0,0 +1,2 @@ +export PATH=$HOME/venv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin +export EDITOR=vim diff --git a/contrib/ci-workers/grind.yml b/contrib/ci-workers/grind.yml new file mode 100644 index 000000000..ef7e5758e --- /dev/null +++ b/contrib/ci-workers/grind.yml @@ -0,0 +1,27 @@ +--- +# Configure a Buildbot worker +- include: unix.yml + +- name: Install grind-specific worker dependencies + hosts: zcash-ci-worker-unix + become: true + + vars_files: + - vars/default.yml + + tasks: + - name: Get dependencies for distribution + include_vars: "{{ item }}" + with_first_found: + - files: + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml" + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int }}.yml" + - "vars/{{ ansible_distribution }}.yml" + - "vars/{{ ansible_os_family }}.yml" + skip: true + + - name: Install required packages + package: + name: "{{ item }}" + state: present + with_items: "{{ grind_deps }}" diff --git a/contrib/ci-workers/tasks/install-brew.yml b/contrib/ci-workers/tasks/install-brew.yml new file mode 100644 index 000000000..5faedad0b --- /dev/null +++ b/contrib/ci-workers/tasks/install-brew.yml @@ -0,0 +1,10 @@ +--- +- name: Check if brew is installed + stat: + path: /usr/local/bin/brew + register: brew_check + +- name: Fail if brew is unavailable + fail: + msg: 'brew is not installed! Please install Homebrew: https://docs.brew.sh/Installation.html' + when: not brew_check.stat.exists diff --git a/contrib/ci-workers/tasks/install-pip.yml b/contrib/ci-workers/tasks/install-pip.yml new file mode 100644 index 000000000..8beff50ef --- /dev/null +++ b/contrib/ci-workers/tasks/install-pip.yml @@ -0,0 +1,8 @@ +--- +- name: Fetch pip installer + get_url: + url: https://bootstrap.pypa.io/get-pip.py + dest: /tmp/get-pip.py + +- name: Install pip + command: "{{ ansible_python.executable }} /tmp/get-pip.py" diff --git a/contrib/ci-workers/templates/buildbot-worker.plist.j2 b/contrib/ci-workers/templates/buildbot-worker.plist.j2 new file mode 100644 index 000000000..225c73b8a --- /dev/null +++ b/contrib/ci-workers/templates/buildbot-worker.plist.j2 @@ -0,0 +1,23 @@ + + + + + Label + net.buildbot.worker + ProgramArguments + + {{ buildbot_worker_dir }}/venv/bin/buildbot-worker + start + {{ buildbot_worker_name }} + + WorkingDirectory + {{ buildbot_worker_dir }} + UserName + {{ buildbot_worker_user }} + KeepAlive + + NetworkState + + + + diff --git a/contrib/ci-workers/templates/buildbot-worker.service.j2 b/contrib/ci-workers/templates/buildbot-worker.service.j2 new file mode 100644 index 000000000..625323be6 --- /dev/null +++ b/contrib/ci-workers/templates/buildbot-worker.service.j2 @@ -0,0 +1,17 @@ +[Unit] +Description=Buildbot worker +Wants=network.target +After=network.target + +[Service] +Type=forking +PIDFile={{ buildbot_worker_dir }}/{{ buildbot_worker_name }}/twistd.pid +WorkingDirectory={{ buildbot_worker_dir }} +ExecStart={{ buildbot_worker_dir }}/venv/bin/buildbot-worker start {{ buildbot_worker_name }} +ExecReload={{ buildbot_worker_dir }}/venv/bin/buildbot-worker restart {{ buildbot_worker_name }} +ExecStop={{ buildbot_worker_dir }}/venv/bin/buildbot-worker stop {{ buildbot_worker_name }} +Restart=always +User={{ buildbot_worker_user }} + +[Install] +WantedBy=multi-user.target diff --git a/contrib/ci-workers/templates/host.ec2.j2 b/contrib/ci-workers/templates/host.ec2.j2 new file mode 100644 index 000000000..dee692e02 --- /dev/null +++ b/contrib/ci-workers/templates/host.ec2.j2 @@ -0,0 +1 @@ +OS: {{ ansible_distribution }} {{ ansible_distribution_version }} diff --git a/contrib/ci-workers/templates/host.j2 b/contrib/ci-workers/templates/host.j2 new file mode 100644 index 000000000..65c4cb709 --- /dev/null +++ b/contrib/ci-workers/templates/host.j2 @@ -0,0 +1,3 @@ +OS: {{ ansible_distribution }} {{ ansible_distribution_version }} +Memory: {{ ansible_memtotal_mb }} MB +CPU: {{ ansible_processor if ansible_processor is string else ansible_processor[1] }} ({{ ansible_processor_cores }} cores) diff --git a/contrib/ci-workers/unix.yml b/contrib/ci-workers/unix.yml new file mode 100644 index 000000000..cbb693401 --- /dev/null +++ b/contrib/ci-workers/unix.yml @@ -0,0 +1,209 @@ +--- +- name: Configure a Buildbot worker for Zcash CI + hosts: zcash-ci-worker-unix + become: true + gather_facts: False + + vars_files: + - vars/default.yml + - vars/buildbot.yml + + vars_prompt: + - name: "buildbot_worker_admin" + prompt: "Admin details" + default: "Zcash " + - name: "buildbot_worker_name" + prompt: "Buildbot worker name (provided by ZECC)" + private: no + - name: "buildbot_worker_password" + prompt: "Buildbot worker password (provided by ZECC)" + + pre_tasks: + - name: Install Python 2.7 for Ansible and Buildbot + raw: test -e /usr/bin/python || test -e /usr/bin/python2 || test -e /usr/bin/python2.7 || test -e /usr/local/bin/python2.7 || (test -e /usr/bin/apt && apt -qqy update && apt install -qqy python) || (test -e /usr/bin/dnf && dnf install -qqy python2) || (test -e /usr/sbin/pkg && pkg install -qqy python2) + register: output + changed_when: + - output.stdout != "" + - output.stdout != "\r\n" + + - name: Check if Python is in the configured location + raw: test -e {{ ansible_python_interpreter }} + ignore_errors: true + register: python_check + when: ansible_python_interpreter is defined + + - name: Fail if configured Python is unavailable + fail: + msg: "Python is not accessible at {{ ansible_python_interpreter }} on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary." + when: ansible_python_interpreter is defined and python_check.rc == 1 + + - name: Check if Python is in the default location + raw: test -e /usr/bin/python + ignore_errors: true + register: python_check + when: ansible_python_interpreter is undefined + + - name: Fail if default Python is unavailable + fail: + msg: Python is not accessible at /usr/bin/python on this host! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary. + when: ansible_python_interpreter is undefined and python_check.rc == 1 + + - name: Gathering Facts + setup: + tags: deps + + - name: Fail if Python is the wrong version + fail: + msg: "The Python binary at {{ ansible_python.executable }} is version {{ ansible_python_version }}! Please set the inventory variable 'ansible_python_interpreter' to the location of the Python 2.7 binary." + when: ansible_python.version.major != 2 or ansible_python.version.minor != 7 + + tasks: + - name: Get dependencies for distribution + include_vars: "{{ item }}" + with_first_found: + - files: + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml" + - "vars/{{ ansible_distribution }}-{{ ansible_distribution_major_version | int }}.yml" + - "vars/{{ ansible_distribution }}.yml" + - "vars/{{ ansible_os_family }}.yml" + skip: true + tags: deps + + - name: Collate dependencies + set_fact: + package_deps: "{{ buildbot_deps + fetch_deps + conf_deps + build_deps + link_deps + dist_deps }}" + python_modules: "{{ buildbot_modules + rpc_test_modules }}" + tags: deps + + - name: Install Homebrew [MacOSX] + include: tasks/install-brew.yml + when: ansible_distribution == 'MacOSX' + tags: deps + + - name: Update rolling release [Arch Linux] + pacman: + update_cache: yes + upgrade: yes + when: ansible_distribution == 'Archlinux' + tags: deps + + - name: Install required packages + package: + name: "{{ item }}" + state: present + with_items: "{{ package_deps }}" + become_user: "{{ ansible_ssh_user if ansible_distribution == 'MacOSX' else 'root' }}" + tags: deps + + - name: Install pip [CentOS, MacOSX] + include: tasks/install-pip.yml + when: ansible_distribution in ['CentOS', 'MacOSX'] + + - name: Install required Python system modules + pip: + name: "{{ item }}" + state: latest + executable: "{{ '/usr/local/bin/pip' if ansible_distribution == 'MacOSX' else omit }}" + with_items: "{{ system_modules }}" + + - name: Set up the Buildbot worker user + user: + name: "{{ buildbot_worker_user }}" + comment: Buildbot worker + shell: /bin/bash + state: present + + - name: Get absolute path to Buildbot worker home directory + command: echo ~ + register: homedir + become_user: "{{ buildbot_worker_user }}" + + - name: Save absolute path to Buildbot worker home directory + set_fact: + buildbot_worker_dir: "{{ homedir.stdout }}" + + - name: Install required Python modules + pip: + name: "{{ item }}" + state: latest + virtualenv: "~{{ buildbot_worker_user }}/venv" + virtualenv_command: "{{ '/usr/local/bin/virtualenv' if ansible_distribution == 'MacOSX' else omit }}" + with_items: "{{ python_modules }}" + become_user: "{{ buildbot_worker_user }}" + notify: restart buildbot-worker + + - name: Create Buildbot worker + command: > + ~{{ buildbot_worker_user }}/venv/bin/buildbot-worker create-worker ~/{{ buildbot_worker_name }} + {{ buildbot_master_host }}:{{ buildbot_master_port }} + {{ buildbot_worker_name|quote }} {{ buildbot_worker_password|quote }} + args: + creates: "~/{{ buildbot_worker_name }}/buildbot.tac" + become_user: "{{ buildbot_worker_user }}" + + - name: Set admin details for Buildbot worker + copy: + content: "{{ buildbot_worker_admin }}" + dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/admin" + owner: "{{ buildbot_worker_user }}" + group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}" + mode: "0644" + + - name: Set host details for Buildbot worker + template: + src: "{{ buildbot_worker_host_template }}" + dest: "~{{ buildbot_worker_user }}/{{ buildbot_worker_name }}/info/host" + owner: "{{ buildbot_worker_user }}" + group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}" + mode: "0644" + + - name: Install custom bashrc for virtualenv + copy: + src: bashrc + dest: "~{{ buildbot_worker_user }}/.bashrc" + owner: "{{ buildbot_worker_user }}" + group: "{{ omit if ansible_distribution == 'MacOSX' else buildbot_worker_user }}" + mode: "0644" + + - name: Copy Buildbot worker systemd service unit + template: + src: templates/buildbot-worker.service.j2 + dest: "/etc/systemd/system/buildbot-worker.service" + owner: root + group: root + mode: "0644" + when: ansible_distribution != 'MacOSX' + notify: reload systemd + + - name: Copy Buildbot worker launchd service unit + template: + src: templates/buildbot-worker.plist.j2 + dest: "/Library/LaunchDaemons/net.buildbot.worker.plist" + owner: root + group: wheel + mode: "0644" + when: ansible_distribution == 'MacOSX' + + - name: Start Buildbot worker + service: + name: buildbot-worker + state: started + enabled: yes + when: ansible_distribution != 'MacOSX' + + - name: Load Buildbot worker service [MacOSX] + command: launchctl load /Library/LaunchDaemons/net.buildbot.worker.plist + when: ansible_distribution == 'MacOSX' + + - name: Start Buildbot worker [MacOSX] + command: launchctl start net.buildbot.worker + when: ansible_distribution == 'MacOSX' + + handlers: + - name: restart buildbot-worker + service: + name: buildbot-worker + state: restarted + + - name: reload systemd + command: /bin/systemctl daemon-reload diff --git a/contrib/ci-workers/vars/Archlinux.yml b/contrib/ci-workers/vars/Archlinux.yml new file mode 100644 index 000000000..50e5577c3 --- /dev/null +++ b/contrib/ci-workers/vars/Archlinux.yml @@ -0,0 +1,7 @@ +--- +buildbot_deps: + - python2-pip +build_deps: + - cmake + - multilib/gcc + - make diff --git a/contrib/ci-workers/vars/CentOS.yml b/contrib/ci-workers/vars/CentOS.yml new file mode 100644 index 000000000..f577af5c0 --- /dev/null +++ b/contrib/ci-workers/vars/CentOS.yml @@ -0,0 +1,13 @@ +--- +buildbot_deps: [] # Empty to remove python-pip +build_deps: + - bzip2 + - cmake + - gcc + - gcc-c++ + - make + - patch +dist_deps: + - pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in + - python-devel + - redhat-rpm-config diff --git a/contrib/ci-workers/vars/Debian.yml b/contrib/ci-workers/vars/Debian.yml new file mode 100644 index 000000000..b6a46f0cd --- /dev/null +++ b/contrib/ci-workers/vars/Debian.yml @@ -0,0 +1,6 @@ +--- +build_deps: + - build-essential # Depends on g++, libc6-dev, make + - cmake +dist_deps: + - python-dev diff --git a/contrib/ci-workers/vars/Fedora.yml b/contrib/ci-workers/vars/Fedora.yml new file mode 100644 index 000000000..2a7351c69 --- /dev/null +++ b/contrib/ci-workers/vars/Fedora.yml @@ -0,0 +1,11 @@ +--- +build_deps: + - cmake + - gcc + - gcc-c++ + - make + - patch +dist_deps: + - pkgconfig # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in + - python-devel + - redhat-rpm-config diff --git a/contrib/ci-workers/vars/FreeBSD.yml b/contrib/ci-workers/vars/FreeBSD.yml new file mode 100644 index 000000000..4b1f01997 --- /dev/null +++ b/contrib/ci-workers/vars/FreeBSD.yml @@ -0,0 +1,10 @@ +--- +buildbot_deps: + - py27-pip +build_deps: + - cmake + - gcc + - gmake +dist_deps: + - bash + - pkgconf # Required until b556beda264308e040f8d88aca4f2f386a0183d9 is pulled in diff --git a/contrib/ci-workers/vars/MacOSX.yml b/contrib/ci-workers/vars/MacOSX.yml new file mode 100644 index 000000000..80b1ae608 --- /dev/null +++ b/contrib/ci-workers/vars/MacOSX.yml @@ -0,0 +1,6 @@ +--- +buildbot_deps: + - coreutils # For gnproc etc. +# Most are already installed +build_deps: + - cmake diff --git a/contrib/ci-workers/vars/Ubuntu.yml b/contrib/ci-workers/vars/Ubuntu.yml new file mode 100644 index 000000000..0d0f584b4 --- /dev/null +++ b/contrib/ci-workers/vars/Ubuntu.yml @@ -0,0 +1,4 @@ +--- +build_deps: + - build-essential # Depends on g++, libc6-dev, make + - cmake diff --git a/contrib/ci-workers/vars/buildbot.yml b/contrib/ci-workers/vars/buildbot.yml new file mode 100644 index 000000000..38e3fd25a --- /dev/null +++ b/contrib/ci-workers/vars/buildbot.yml @@ -0,0 +1,5 @@ +--- +buildbot_worker_user: zcbbworker +buildbot_master_host: dev-ci.z.cash +buildbot_master_port: 9899 +buildbot_worker_host_template: templates/host.j2 diff --git a/contrib/ci-workers/vars/default.yml b/contrib/ci-workers/vars/default.yml new file mode 100644 index 000000000..a0b0da9e6 --- /dev/null +++ b/contrib/ci-workers/vars/default.yml @@ -0,0 +1,53 @@ +--- +# These variables can be overridden in distribution files. + +# Dependencies required to install Buildbot +buildbot_deps: + - python-pip # So we can install Python modules + +# Dependencies required to download files +fetch_deps: + - curl # For depends/ + - git + - wget # For zcutil/fetch-params.sh + +# Dependencies required to configure Zcash +conf_deps: + - autoconf + - automake + - m4 + - pkg-config + +# Dependencies required to compile Zcash +build_deps: + - cmake + - g++ + - gcc + - make + +# Dependencies required to link Zcash +link_deps: + - libtool + +# Additional distribution-specific dependencies +dist_deps: [] + +# Additional grind-specific dependencies +grind_deps: + - lcov + - valgrind + +# Python modules required on the system +system_modules: + - virtualenv + +# Python modules required for a Zcash Buildbot worker +buildbot_modules: + - pip # Needs to be updated first so Buildbot installs + - buildbot-worker + - pyflakes + +# Python modules required to run the Zcash RPC test suite +rpc_test_modules: + - pyblake2 + - pyzmq diff --git a/contrib/debian/changelog b/contrib/debian/changelog new file mode 100644 index 000000000..a3ece73e0 --- /dev/null +++ b/contrib/debian/changelog @@ -0,0 +1,743 @@ +zcash (5.6.1) stable; urgency=medium + + * 5.6.1 release. + + -- Electric Coin Company Wed, 21 Jun 2023 14:41:09 -0600 + +zcash (5.6.0) stable; urgency=medium + + * 5.6.0 release. + + -- Electric Coin Company Wed, 14 Jun 2023 16:01:24 -0600 + +zcash (5.6.0~rc1) stable; urgency=medium + + * 5.6.0-rc1 release. + + -- Electric Coin Company Wed, 07 Jun 2023 18:36:54 -0600 + +zcash (5.5.1) stable; urgency=medium + + * 5.5.1 release. + + -- Electric Coin Company Tue, 16 May 2023 11:20:05 -0600 + +zcash (5.5.0) stable; urgency=medium + + * 5.5.0 release. + + -- Electric Coin Company Thu, 27 Apr 2023 16:17:00 -0600 + +zcash (5.5.0~rc3) stable; urgency=medium + + * 5.5.0-rc3 release. + + -- Electric Coin Company Wed, 26 Apr 2023 22:41:41 -0600 + +zcash (5.5.0~rc2) stable; urgency=medium + + * 5.5.0-rc2 release. + + -- Electric Coin Company Tue, 25 Apr 2023 18:30:53 +0000 + +zcash (5.5.0~rc1) stable; urgency=medium + + * 5.5.0-rc1 release. + + -- Electric Coin Company Thu, 20 Apr 2023 22:19:50 +0000 + +zcash (5.4.2) stable; urgency=high + + * 5.4.2 release. + + -- Electric Coin Company Mon, 20 Feb 2023 20:04:31 -0700 + +zcash (5.4.1) stable; urgency=medium + + * 5.4.1 release. + + -- Electric Coin Company Mon, 13 Feb 2023 18:10:07 +0000 + +zcash (5.4.0) stable; urgency=medium + + * 5.4.0 release. + + -- Electric Coin Company Wed, 08 Feb 2023 17:21:10 +0000 + +zcash (5.4.0~rc4) stable; urgency=medium + + * 5.4.0-rc4 release. + + -- Electric Coin Company Wed, 01 Feb 2023 17:37:55 -0700 + +zcash (5.4.0~rc3) stable; urgency=medium + + * 5.4.0-rc3 release. + + -- Electric Coin Company Fri, 27 Jan 2023 15:07:19 -0700 + +zcash (5.4.0~rc2) stable; urgency=medium + + * 5.4.0-rc2 release. + + -- Electric Coin Company Tue, 24 Jan 2023 00:04:35 +0000 + +zcash (5.4.0~rc1) stable; urgency=medium + + * 5.4.0-rc1 release. + + -- Electric Coin Company Thu, 19 Jan 2023 22:57:59 +0000 + +zcash (5.3.3) stable; urgency=high + + * 5.3.3 release. + + -- Electric Coin Company Mon, 20 Feb 2023 19:47:26 -0700 + +zcash (5.3.2) stable; urgency=medium + + * 5.3.2 release. + + -- Electric Coin Company Sat, 03 Dec 2022 19:58:44 +0000 + +zcash (5.3.1) stable; urgency=medium + + * 5.3.1 release. + + -- Electric Coin Company Fri, 02 Dec 2022 02:46:42 +0000 + +zcash (5.3.1~rc1) stable; urgency=medium + + * 5.3.1-rc1 release. + + -- Electric Coin Company Wed, 23 Nov 2022 22:18:55 -0700 + +zcash (5.3.0) stable; urgency=medium + + * 5.3.0 release. + + -- Electric Coin Company Thu, 20 Oct 2022 10:52:37 -0600 + +zcash (5.3.0~rc1) stable; urgency=medium + + * 5.3.0-rc1 release. + + -- Electric Coin Company Tue, 11 Oct 2022 11:30:02 +0000 + +zcash (5.2.0) stable; urgency=medium + + * 5.2.0 release. + + -- Electric Coin Company Mon, 25 Jul 2022 12:42:25 -0600 + +zcash (5.2.0~rc1) stable; urgency=medium + + * 5.2.0-rc1 release. + + -- Electric Coin Company Fri, 22 Jul 2022 15:07:59 -0600 + +zcash (5.1.0) stable; urgency=medium + + * 5.1.0 release. + + -- Electric Coin Company Fri, 08 Jul 2022 03:01:54 +0000 + +zcash (5.1.0~rc1) stable; urgency=medium + + * 5.1.0-rc1 release. + + -- Electric Coin Company Tue, 05 Jul 2022 22:25:25 +0000 + +zcash (5.0.0) stable; urgency=medium + + * 5.0.0 release. + + -- Electric Coin Company Tue, 10 May 2022 19:52:28 -0600 + +zcash (5.0.0~rc1) stable; urgency=medium + + * 5.0.0-rc1 release. + + -- Electric Coin Company Mon, 09 May 2022 15:35:33 +0000 + +zcash (4.7.0) stable; urgency=medium + + * 4.7.0 release. + + -- Electric Coin Company Wed, 13 Apr 2022 22:04:00 -0600 + +zcash (4.6.0+2) stable; urgency=medium + + * 4.6.0-2 release. + + -- Electric Coin Company Mon, 04 Apr 2022 21:53:34 +0000 + +zcash (4.7.0~rc1) stable; urgency=medium + + * 4.7.0-rc1 release. + + -- Electric Coin Company Tue, 22 Mar 2022 21:14:02 +0000 + +zcash (4.6.0+1) stable; urgency=medium + + * 4.6.0-1 release. + + -- Electric Coin Company Wed, 05 Jan 2022 20:18:43 +0000 + +zcash (4.6.0) stable; urgency=medium + + * 4.6.0 release. + + -- Electric Coin Company Thu, 23 Dec 2021 00:35:41 +0000 + +zcash (4.6.0~rc1) stable; urgency=medium + + * 4.6.0-rc1 release. + + -- Electric Coin Company Sat, 18 Dec 2021 04:25:50 +0000 + +zcash (4.5.1+1) stable; urgency=medium + + * 4.5.1-1 release. + + -- Electric Coin Company Fri, 08 Oct 2021 17:03:31 +0000 + +zcash (4.5.1) stable; urgency=medium + + * 4.5.1 release. + + -- Electric Coin Company Wed, 29 Sep 2021 01:49:51 +0100 + +zcash (4.5.0) stable; urgency=medium + + * 4.5.0 release. + + -- Electric Coin Company Thu, 23 Sep 2021 04:20:16 +0100 + +zcash (4.5.0~rc1) stable; urgency=medium + + * 4.5.0-rc1 release. + + -- Electric Coin Company Thu, 16 Sep 2021 23:34:14 +0100 + +zcash (4.4.1) stable; urgency=medium + + * 4.4.1 release. + + -- Electric Coin Company Wed, 09 Jun 2021 23:19:49 +0100 + +zcash (4.4.1~rc1) stable; urgency=medium + + * 4.4.1-rc1 release. + + -- Electric Coin Company Tue, 08 Jun 2021 22:45:20 +0100 + +zcash (4.4.0) stable; urgency=medium + + * 4.4.0 release. + + -- Electric Coin Company Thu, 15 Apr 2021 16:55:39 +1200 + +zcash (4.4.0~rc1) stable; urgency=medium + + * 4.4.0-rc1 release. + + -- Electric Coin Company Fri, 09 Apr 2021 17:40:36 +1200 + +zcash (4.3.0) stable; urgency=medium + + * 4.3.0 release. + + -- Electric Coin Company Wed, 24 Feb 2021 20:17:10 +0000 + +zcash (4.3.0~rc1) stable; urgency=medium + + * 4.3.0-rc1 release. + + -- Electric Coin Company Fri, 19 Feb 2021 22:05:06 +0000 + +zcash (4.2.0) stable; urgency=medium + + * 4.2.0 release. + + -- Electric Coin Company Mon, 21 Dec 2020 12:55:52 -0700 + +zcash (4.2.0~rc1) stable; urgency=medium + + * 4.2.0-rc1 release. + + -- Electric Coin Company Sat, 19 Dec 2020 09:53:28 -0700 + +zcash (4.1.1) stable; urgency=medium + + * 4.1.1 release. + + -- Electric Coin Company Mon, 16 Nov 2020 10:23:40 -0700 + +zcash (4.1.0) stable; urgency=medium + + * 4.1.0 release. + + -- Electric Coin Company Mon, 02 Nov 2020 13:40:54 -0700 + +zcash (4.1.0~rc1) stable; urgency=medium + + * 4.1.0-rc1 release. + + -- Electric Coin Company Wed, 28 Oct 2020 02:51:45 +0800 + +zcash (4.0.0) stable; urgency=medium + + * 4.0.0 release. + + -- Electric Coin Company Tue, 01 Sep 2020 13:31:19 -0600 + +zcash (4.0.0~rc1) stable; urgency=medium + + * 4.0.0-rc1 release. + + -- Electric Coin Company Wed, 26 Aug 2020 10:17:07 -0600 + +zcash (3.1.0) stable; urgency=medium + + * 3.1.0 release. + + -- Electric Coin Company Tue, 28 Jul 2020 07:02:06 +0800 + +zcash (3.1.0~rc2) stable; urgency=medium + + * 3.1.0-rc2 release. + + -- Electric Coin Company Wed, 15 Jul 2020 21:51:09 +0800 + +zcash (3.1.0~rc1) stable; urgency=medium + + * 3.1.0-rc1 release. + + -- Electric Coin Company Tue, 14 Jul 2020 14:38:11 +0800 + +zcash (3.0.0) stable; urgency=medium + + * 3.0.0 release. + + -- Electric Coin Company Fri, 22 May 2020 11:48:24 -0600 + +zcash (3.0.0~rc1) stable; urgency=medium + + * 3.0.0-rc1 release. + + -- Electric Coin Company Thu, 21 May 2020 07:34:53 -0600 + +zcash (2.1.2+3) stable; urgency=medium + + * 2.1.2-3 release. + + -- Electric Coin Company Fri, 08 May 2020 12:41:23 -0600 + +zcash (2.1.2+2) stable; urgency=medium + + * 2.1.2-2 release. + + -- Electric Coin Company Fri, 08 May 2020 11:43:55 -0600 + +zcash (2.1.2+1) stable; urgency=medium + + * 2.1.2-1 release. + + -- Electric Coin Company Wed, 06 May 2020 10:52:57 -0600 + +zcash (2.1.2) stable; urgency=medium + + * 2.1.2 release. + + -- Electric Coin Company Wed, 22 Apr 2020 10:46:06 -0600 + +zcash (2.1.2~rc1) stable; urgency=medium + + * 2.1.2-rc1 release. + + -- Electric Coin Company Wed, 15 Apr 2020 17:47:45 -0600 + +zcash (2.1.1+1) stable; urgency=critical + + * 2.1.1-1 release. + + -- Electric Coin Company Thu, 06 Feb 2020 16:53:19 -0700 + +zcash (2.1.1) stable; urgency=medium + + * 2.1.1 release. + + -- Electric Coin Company Fri, 17 Jan 2020 10:27:31 -0700 + +zcash (2.1.1~rc2) stable; urgency=medium + + * 2.1.1-rc2 release. + + -- Electric Coin Company Mon, 13 Jan 2020 17:56:29 -0700 + +zcash (2.1.1~rc1) stable; urgency=medium + + * 2.1.1-rc1 release. + + -- Electric Coin Company Tue, 07 Jan 2020 20:13:52 -0700 + +zcash (2.1.0+1) stable; urgency=medium + + * 2.1.0-1 release. + + -- Electric Coin Company Fri, 08 Nov 2019 18:56:32 +0000 + +zcash (2.1.0) stable; urgency=medium + + * 2.1.0 release. + + -- Electric Coin Company Sat, 02 Nov 2019 11:01:00 -0600 + +zcash (2.1.0~rc1) stable; urgency=medium + + * 2.1.0-rc1 release. + + -- Electric Coin Company Tue, 22 Oct 2019 14:52:02 -0600 + +zcash (2.0.7+3) stable; urgency=critical + + * 2.0.7-3 release. + + -- Electric Coin Company Tue, 24 Sep 2019 21:01:13 +0100 + +zcash (2.0.7+2) stable; urgency=medium + + * 2.0.7-2 release. + + -- Electric Coin Company Fri, 30 Aug 2019 17:47:52 -0600 + +zcash (2.0.7+1) stable; urgency=medium + + * 2.0.7-1 release. + + -- Electric Coin Company Thu, 29 Aug 2019 13:07:52 -0600 + +zcash (2.0.7) stable; urgency=medium + + * 2.0.7 release. + + -- Electric Coin Company Mon, 19 Aug 2019 15:09:14 -0600 + +zcash (2.0.7~rc1) stable; urgency=medium + + * 2.0.7-rc1 release. + + -- Electric Coin Company Fri, 09 Aug 2019 17:05:51 -0600 + +zcash (2.0.6) stable; urgency=medium + + * 2.0.6 release. + + -- Electric Coin Company Wed, 19 Jun 2019 00:28:06 +0100 + +zcash (2.0.6~rc1) stable; urgency=medium + + * 2.0.6-rc1 release. + + -- Electric Coin Company Wed, 12 Jun 2019 16:36:57 +0100 + +zcash (2.0.5+2) stable; urgency=medium + + * 2.0.5-2 release. + + -- Electric Coin Company Wed, 15 May 2019 09:56:01 -0600 + +zcash (2.0.5+1) stable; urgency=medium + + * 2.0.5-1 release. + + -- Electric Coin Company Wed, 08 May 2019 06:57:28 -0600 + +zcash (2.0.5) stable; urgency=medium + + * 2.0.5 release. + + -- Electric Coin Company Fri, 03 May 2019 16:35:30 -0600 + +zcash (2.0.5~rc1) stable; urgency=medium + + * 2.0.5-rc1 release. + + -- Electric Coin Company Wed, 01 May 2019 14:16:08 -0600 + +zcash (2.0.4) stable; urgency=medium + + * 2.0.4 release. + + -- Electric Coin Company Tue, 26 Mar 2019 11:29:21 -0700 + +zcash (2.0.4~rc1) stable; urgency=medium + + * 2.0.4-rc1 release. + + -- Zcash Company Wed, 20 Mar 2019 09:39:43 -0700 + +zcash (2.0.3) stable; urgency=medium + + * 2.0.3 release. + + -- Zcash Company Mon, 11 Feb 2019 09:16:09 -0800 + +zcash (2.0.3~rc1) stable; urgency=medium + + * 2.0.3-rc1 release. + + -- Zcash Company Mon, 04 Feb 2019 12:05:43 -0800 + +zcash (2.0.2) stable; urgency=medium + + * 2.0.2 release. + + -- Zcash Company Wed, 28 Nov 2018 11:09:08 -0800 + +zcash (2.0.2~rc1) stable; urgency=medium + + * 2.0.2-rc1 release. + + -- Zcash Company Sun, 18 Nov 2018 10:19:49 -0800 + +zcash (2.0.1) stable; urgency=medium + + * 2.0.1 release. + + -- Zcash Company Sun, 14 Oct 2018 13:40:30 -0700 + +zcash (2.0.1~rc1) stable; urgency=medium + + * 2.0.1-rc1 release. + + -- Zcash Company Mon, 08 Oct 2018 12:40:54 -0700 + +zcash (2.0.0) stable; urgency=medium + + * 2.0.0 release. + + -- Zcash Company Wed, 15 Aug 2018 17:57:50 -0700 + +zcash (2.0.0~rc1) stable; urgency=medium + + * 2.0.0-rc1 release. + + -- Zcash Company Thu, 09 Aug 2018 16:56:56 +0000 + +zcash (1.1.2) stable; urgency=medium + + * 1.1.2 release. + + -- Zcash Company Sun, 01 Jul 2018 20:12:33 -0700 + +zcash (1.1.2~rc1) stable; urgency=medium + + * 1.1.2-rc1 release. + + -- Zcash Company Fri, 22 Jun 2018 17:03:41 -0700 + +zcash (1.1.1) stable; urgency=medium + + * 1.1.1 release. + + -- Zcash Company Fri, 25 May 2018 15:49:34 +1200 + +zcash (1.1.1~rc2) stable; urgency=medium + + * 1.1.1-rc2 release. + + -- Zcash Company Wed, 23 May 2018 09:28:50 -0700 + +zcash (1.1.1~rc1) stable; urgency=medium + + * 1.1.1-rc1 release. + + -- Zcash Company Sat, 19 May 2018 10:16:14 +1200 + +zcash (1.1.0) stable; urgency=medium + + * 1.1.0 release. + + -- Zcash Company Wed, 11 Apr 2018 20:15:29 -0600 + +zcash (1.1.0~rc1) stable; urgency=medium + + * 1.1.0-rc1 release. + + -- Zcash Company Thu, 05 Apr 2018 03:26:17 +0100 + +zcash (1.0.15) stable; urgency=medium + + * 1.0.15 release. + + -- Zcash Company Wed, 28 Feb 2018 16:58:19 +0000 + +zcash (1.0.15~rc1) stable; urgency=medium + + * 1.0.15-rc1 release. + + -- Zcash Company Sat, 24 Feb 2018 04:20:05 +0000 + +zcash (1.0.14) stable; urgency=medium + + * 1.0.14 release. + + -- Zcash Company Wed, 03 Jan 2018 23:54:16 +0100 + +zcash (1.0.14~rc1) stable; urgency=medium + + * 1.0.14-rc1 release. + + -- Zcash Company Fri, 22 Dec 2017 10:12:41 +0000 + +zcash (1.0.13) stable; urgency=medium + + * 1.0.13 release. + + -- Zcash Company Mon, 20 Nov 2017 12:31:53 +0000 + +zcash (1.0.13~rc2) stable; urgency=medium + + * 1.0.13-rc2 release. + + -- Zcash Company Fri, 17 Nov 2017 18:01:08 +0000 + +zcash (1.0.13~rc1) stable; urgency=medium + + * 1.0.13-rc1 release. + + -- Zcash Company Wed, 15 Nov 2017 00:02:21 +0000 + +zcash (1.0.12) stable; urgency=medium + + * 1.0.12 release. + + -- Zcash Company Thu, 28 Sep 2017 01:26:44 +0100 + +zcash (1.0.12~rc1) stable; urgency=medium + + * 1.0.12-rc1 release. + + -- Zcash Company Sat, 23 Sep 2017 10:51:36 +0100 + +zcash (1.0.11) stable; urgency=medium + + * 1.0.11 release. + + -- Zcash Company Tue, 15 Aug 2017 10:06:25 +0100 + +zcash (1.0.11~rc1) stable; urgency=medium + + * 1.0.11-rc1 release. + + -- Zcash Company Tue, 01 Aug 2017 17:12:52 +0200 + +zcash (1.0.10+1) stable; urgency=medium + + * 1.0.10-1 release. + + -- Zcash Company Fri, 23 Jun 2017 19:50:41 -0700 + +zcash (1.0.10) stable; urgency=medium + + * 1.0.10 release. + + -- Zcash Company Thu, 22 Jun 2017 15:13:04 +1200 + +zcash (1.0.9) stable; urgency=medium + + * 1.0.9 release. + + -- Zcash Company Wed, 24 May 2017 12:51:06 -0700 + +zcash (1.0.8+1) jessie; urgency=high + + * 1.0.8-1 release. + + -- Zcash Company Thu, 13 Apr 2017 20:20:37 -0700 + +zcash (1.0.8) jessie; urgency=medium + + * 1.0.8 release. + + -- Zcash Company Mon, 27 Mar 2017 21:30:07 +0100 + +zcash (1.0.7+1) jessie; urgency=medium + + * 1.0.7-1 release. + + -- Zcash Company Wed, 08 Mar 2017 13:51:11 -0800 + +zcash (1.0.7) jessie; urgency=medium + + * 1.0.7 release. + + -- Zcash Company Fri, 03 Mar 2017 20:55:04 -0800 + +zcash (1.0.6) jessie; urgency=medium + + * 1.0.6 release. + + -- Zcash Company Fri, 10 Feb 2017 10:23:00 -0800 + +zcash (1.0.5) jessie; urgency=medium + + * 1.0.5 release. + + -- Zcash Company Thu, 19 Jan 2017 19:23:40 -0700 + +zcash (1.0.4) jessie; urgency=medium + + * 1.0.4 release. + + -- Zcash Company Thu, 15 Dec 2016 16:46:14 +1300 + +zcash (1.0.3) jessie; urgency=medium + + * 1.0.3 release. + + -- Zcash Company Wed, 17 Nov 2016 15:56:00 -0700 + +zcash (1.0.2) jessie; urgency=medium + + * 1.0.2 release. + + -- Zcash Company Mon, 07 Nov 2016 19:01:35 -0600 + +zcash (1.0.1) jessie; urgency=medium + + * 1.0.1 release. + + -- Zcash Company Thu, 03 Nov 2016 23:21:09 -0500 + +zcash (1.0.0-sprout) jessie; urgency=medium + + * 1.0.0 release. + + -- Zcash Company Fri, 28 Oct 2016 03:00:50 -0700 + +zcash (1.0.0-rc4) jessie; urgency=medium + + * 1.0.0-rc4 release. + + -- Zcash Company Thu, 27 Oct 2016 13:36:00 +0100 + +zcash (1.0.0-rc3) jessie; urgency=medium + + * 1.0.0-rc3 release. + + -- Zcash Company Wed, 26 Oct 2016 23:17:03 +0100 + +zcash (1.0.0-rc2) jessie; urgency=medium + + * 1.0.0-rc2 release. + + -- Zcash Company Sun, 23 Oct 2016 01:51:27 +0100 + +zcash (1.0.0-rc1) jessie; urgency=medium + + * Initial packaging for Debian. + + -- Zcash Company Mon, 17 Oct 2016 11:47:02 -0700 diff --git a/contrib/debian/compat b/contrib/debian/compat new file mode 100644 index 000000000..b1bd38b62 --- /dev/null +++ b/contrib/debian/compat @@ -0,0 +1 @@ +13 diff --git a/contrib/debian/control b/contrib/debian/control new file mode 100644 index 000000000..31f40c2c8 --- /dev/null +++ b/contrib/debian/control @@ -0,0 +1,22 @@ +Source: zcash +Section: utils +Priority: optional +Maintainer: Electric Coin Company +Homepage: https://z.cash +Build-Depends: autoconf, automake, bsdmainutils, build-essential, + git, g++-multilib, libc6-dev, libtool, + m4, ncurses-dev, pkg-config, python, + unzip, wget, zlib1g-dev +Vcs-Git: https://github.com/zcash/zcash.git +Vcs-Browser: https://github.com/zcash/zcash + +Package: zcash +Architecture: amd64 +Depends: ${shlibs:Depends} +Description: Zcash libraries and tools + Based on Bitcoin's code, it intends to offer a far higher standard + of privacy and anonymity through a sophisticiated zero-knowledge + proving scheme which preserves confidentiality of transaction metadata. + Think of it as HTTPS for money. + This package provides the daemon, zcashd, and the CLI tool, + zcash-cli, to interact with the daemon. diff --git a/contrib/debian/copyright b/contrib/debian/copyright new file mode 100644 index 000000000..e79d337f2 --- /dev/null +++ b/contrib/debian/copyright @@ -0,0 +1,1971 @@ +Format: http://svn.debian.org/wsvn/dep/web/deps/dep5.mdwn?rev=174 +Upstream-Name: Zcash +Upstream-Contact: Electric Coin Company +Source: https://github.com/zcash/zcash + +Files: * +Copyright: 2016-2023, The Zcash developers + 2009-2023, The Bitcoin Core developers + 2009-2023, Bitcoin Developers +License: Expat +Comment: The Bitcoin Core developers encompasses the current developers listed on + bitcoin.org, as well as the numerous contributors to the project. + The Zcash developers are listed at https://z.cash/team.html and in doc/authors.md. + This copyright entry excludes files explicitly listed below. + We do not explicitly list Rust crates that have Expat/MIT as a licensing option + (as determined by "cargo license"). + +Files: build-aux/m4/ax_boost_base.m4 +Copyright: 2008, Thomas Porschberg + 2009, Peter Adolphs +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_chrono.m4 +Copyright: 2012, Xiyue Deng +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_filesystem.m4 +Copyright: 2009, Thomas Porschberg + 2009, Michael Tindal + 2009, Roman Rybalko +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_program_options.m4 +Copyright: 2009, Thomas Porschberg +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_system.m4 +Copyright: 2008, Thomas Porschberg + 2008, Michael Tindal + 2008, Daniel Casimiro +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_thread.m4 +Copyright: 2009, Thomas Porschberg + 2009, Michael Tindal +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_boost_unit_test_framework.m4 +Copyright: 2008, Thomas Porschberg +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_cxx_compile_stdcxx.m4 +Copyright: 2008, Benjamin Kosnik + 2012, Zack Weinberg + 2013, Roy Stogner + 2014-2015, Google Inc.; contributed by Alexey Sokolov + 2015, Paul Norman + 2015, Moritz Klammler + 2016, 2018 Krzesimir Nowak + 2019 Enji Cooper +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_gcc_func_attribute.m4 +Copyright: 2013, Gabriele Svelto +License: GNU-All-permissive-License + +Files: build-aux/m4/l_atomic.m4 +Copyright: 2015, Tim Kosse +License: GNU-All-permissive-License + +Files: build-aux/m4/ax_check_compile_flag.m4 + build-aux/m4/ax_check_link_flag.m4 + build-aux/m4/ax_check_preproc_flag.m4 +Copyright: 2008, Guido U. Draheim + 2011, Maarten Bosmans +License: GPL-3+ with Autoconf exception + +Files: build-aux/m4/ax_pthread.m4 +Copyright: 2008, Steven G. Johnson + 2011, Daniel Richard G. +License: GPL-3+ with Autoconf exception + +Files: build-aux/m4/libtool.m4 +Copyright: 1996-2001, 2003-2015 Free Software Foundation, Inc. + Written by Gordon Matzigkeit, 1996 +License: GNU-All-permissive-License or GPL-2+ with Libtool exception + +Files: build-aux/m4/lt~obsolete.m4 +Copyright: 2004-2005, 2007, 2009, 2011-2015 Free Software Foundation, Inc. + Written by Scott James Remnant, 2004. +License: GNU-All-permissive-License + +Files: build-aux/m4/ltoptions.m4 + build-aux/m4/ltsugar.m4 +Copyright: 2004-2005, 2007-2009, 2011-2015 Free Software Foundation, Inc. + Written by Gary V. Vaughan, 2004 +License: GNU-All-permissive-License + +Files: build-aux/m4/ltversion.m4 +Copyright: 2004, 2011-2015 Free Software Foundation, Inc. + Written by Scott James Remnant, 2004 +License: GNU-All-permissive-License + +Files: qa/zcash/checksec.sh +Copyright: 2014-2015, Brian Davis + 2013, Robin David + 2009-2011, Tobias Klein +License: BSD-3-clause-Tobias-Klein + +Files: depends/sources/libsodium-*.tar.gz + depends/patches/libsodium/* +Copyright: 2013-2022 Frank Denis +License: ISC + +Files: depends/sources/boost_*.tar.gz +Copyright: 2008 Beman Dawes +License: Boost-Software-License-1.0 + +Files: depends/sources/clang-llvm-*.tar.xz +Copyright: The libc++ Authors +License: Apache-2 with LLVM exception +Comment: This entry is specifically for the libc++ library. The libc++ Authors + are listed in https://github.com/llvm/llvm-project/blob/main/libcxx/CREDITS.TXT . + +Files: depends/sources/db-*.tar.gz + depends/patches/bdb/* +Copyright: 1990, 2016 Oracle and/or its affiliates; + 1990, 1993, 1994, 1995 The Regents of the University of California; + 1995, 1996 The President and Fellows of Harvard University; + 2000-2005 INRIA, France Telecom +License: BDB + +Files: depends/sources/libevent-*.tar.gz + depends/patches/libevent/* +Copyright: 2000-2007 Niels Provos + 2007-2012 Niels Provos and Nick Mathewson + 2000 Dug Song + 1993 The Regents of the University of California. + 1998 Todd C. Miller + 2003 Michael A. Davis + 2007 Sun Microsystems + 2002 Christopher Clark + 2006 Maxim Yegorushkin +License: BSD-3-clause + +Files: depends/sources/zeromq-*.tar.gz + depends/patches/zeromq/* +Copyright: 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005, 2006, 2007 Free Software Foundation, Inc. + 2007-2014 iMatix Corporation + 2009-2011 250bpm s.r.o. + 2010-2011 Miru Limited + 2011 VMware, Inc. + 2012 Spotify AB + 2013 Ericsson AB + 2014 AppDynamics Inc. + 2015-2016 Brocade Communications Systems Inc. +License: LGPL-3+ with ZeroMQ exception + +Files: depends/sources/google*.tar.gz +Copyright: 2008 Google Inc. +License: BSD-3-clause-Google + +Files: depends/sources/utfcpp-*.tar.gz +Copyright: 2006 Nemanja Trifunovic +License: Boost-Software-License-1.0 + +Files: depends/sources/tl-expected-*.tar.gz + depends/patches/tl_expected/* +Copyright: 2017-2022 Sy Brand (@TartanLlama), 2022 The Zcash developers +License: CC0-1.0 +Comment: Other contributors are Simon Truscott (@bobbleclank), Kévin Alexandre Boissonneault (@KABoissonneault), + and Björn Fahller (@rollbear). + +Files: depends/*/vendored-sources/orchard/* +Copyright: 2020-2022 The Electric Coin Company +License: BOSL-1+ with Zcash exception + +Files: depends/*/vendored-sources/sketches-ddsketch/* +Copyright: 2019-2020 Mike Heffner +License: Apache-2.0 + +Files: depends/*/vendored-sources/arrayref/* +Copyright: 2015-2022 David Roundy +License: BSD-2-clause + +Files: depends/*/vendored-sources/mach/* +Copyright: 2015-2022 Nick Fitzgerald +License: BSD-2-clause + +Files: depends/*/vendored-sources/curve25519-dalek/* +Copyright: 2016-2021 isis agora lovecruft + 2016-2021 Henry de Valence + 2012-2017 Adam Langley + 2012 The Go Authors +License: BSD-3-clause and BSD-3-clause-Google + +Files: depends/*/vendored-sources/instant/* +Copyright: 2019 Sébastien Crozet +License: BSD-3-clause + +Files: depends/*/vendored-sources/parity-scale-codec/* +Copyright: 2018-2022 Parity Technologies +License: Apache-2.0 + +Files: depends/*/vendored-sources/parity-scale-codec-derive/* +Copyright: 2018-2022 Parity Technologies +License: Apache-2.0 + +Files: depends/*/vendored-sources/subtle/* +Copyright: 2016-2017 isis agora lovecruft, Henry de Valence +License: BSD-3-clause + +Files: depends/*/vendored-sources/constant_time_eq/* +Copyright: 2015-2022 Cesar Eduardo Barros +License: CC0-1.0 + +Files: depends/*/vendored-sources/secp256k1/* +Copyright: 2014-2022 Dawid Ciężarkiewicz , Andrew Poelstra +License: CC0-1.0 + +Files: depends/*/vendored-sources/secp256k1-sys/* +Copyright: 2014-2022 Dawid Ciężarkiewicz , Andrew Poelstra , Steven Roose +License: CC0-1.0 + +Files: depends/*/vendored-sources/untrusted/* +Copyright: 2015-2016 Brian Smith +License: ISC + +Files: depends/*/vendored-sources/ring/* +Copyright: 2015-2016 Brian Smith + 1998-2011 The OpenSSL Project + 1995-1998 Eric Young + 2015 Google Inc. + 2015-2016 the fiat-crypto authors +License: Ring-BoringSSL + +Files: depends/*/vendored-sources/terminfo/* +Copyright: 2016-2020 meh +License: WTFPL + +Files: depends/*/vendored-sources/unicode-ident/src/tables.rs +Copyright: 1991-2022 Unicode, Inc +License: Unicode +Comment: This entry is for code in the unicode-ident crate generated from Unicode data tables. + The license of the unicode-ident crate itself is MIT/Expat or Apache-2.0. + +Files: src/crypto/ctaes/* +Copyright: 2016 Pieter Wuille +License: Expat + +Files: src/rust/include/rust/map.h +Copyright: 2012 William Swanson + 2020 The Zcash developers +License: Expat-with-advertising-clause + +Files: src/rust/include/rust/VA_OPT.hpp +Copyright: 2019 Will Wray + 2020 The Zcash developers +License: Boost-Software-License-1.0 + +Files: src/secp256k1/* +Copyright: 2013-2023 Pieter Wuille, Thomas Daede, Peter Dettman, Cory Fields, Diederik Huys, Gregory Maxwell, Jonas Nick, Russell O'Connor, + Andrew Poelstra, Wladimir J. van der Laan +License: Expat +Comment: This copyright entry excludes files explicitly listed below. Pieter Wuille is given as the overall copyright holder; the names + in the Copyright field are the union of those listed in files under src/secp256k1 at the commit corresponding to upstream version 0.2.0. + +Files: src/secp256k1/examples/* +Copyright: 2013-2023 The Bitcoin Core developers, Elichai Turkel +License: CC0-1.0 + +Files: src/secp256k1/build-aux/m4/ax_jni_include_dir.m4 +Copyright: 2008 Don Anderson +License: GNU-All-permissive-License + +Files: src/secp256k1/build-aux/m4/ax_prog_cc_for_build.m4 +Copyright: 2008 Paolo Bonzini +License: GNU-All-permissive-License + +Files: src/leveldb/* +Copyright: 2011 The LevelDB Authors +License: BSD-3-clause-Google +Comment: The LevelDB Authors are listed in src/leveldb/AUTHORS. + +Files: src/crc32c/* +Copyright: 2017 The CRC32C Authors +License: BSD-3-clause-Google +Comment: The CRC32C Authors are listed in src/crc32c/AUTHORS. + +License: Apache-2.0 + On Debian systems, the full text of the Apache License v2.0 can be found in the + file `/usr/share/common-licenses/Apache-2.0`. + +License: Apache-2 with LLVM exception + ============================================================================== + The LLVM Project is under the Apache License v2.0 with LLVM Exceptions: + ============================================================================== + . + On Debian systems, the full text of the Apache License v2.0 can be found in the + file `/usr/share/common-licenses/Apache-2.0`. + . + ---- LLVM Exceptions to the Apache 2.0 License ---- + . + As an exception, if, as a result of your compiling your source code, portions + of this Software are embedded into an Object form of such source code, you + may redistribute such embedded portions in such Object form without complying + with the conditions of Sections 4(a), 4(b) and 4(d) of the License. + . + In addition, if you combine or link compiled forms of this Software with + software that is licensed under the GPLv2 ("Combined Software") and if a + court of competent jurisdiction determines that the patent provision (Section + 3), the indemnity provision (Section 9) or other Section of the License + conflicts with the conditions of the GPLv2, you may retroactively and + prospectively choose to deem waived or otherwise exclude such Section(s) of + the License, but only in their entirety and only with respect to the Combined + Software. + +License: Boost-Software-License-1.0 + Permission is hereby granted, free of charge, to any person or organization + obtaining a copy of the software and accompanying documentation covered by + this license (the "Software") to use, reproduce, display, distribute, + execute, and transmit the Software, and to prepare derivative works of the + Software, and to permit third-parties to whom the Software is furnished to + do so, all subject to the following: + . + The copyright notices in the Software and this entire statement, including + the above license grant, this restriction and the following disclaimer, + must be included in all copies of the Software, in whole or in part, and + all derivative works of the Software, unless such copies or derivative + works are solely in the form of machine-executable object code generated by + a source language processor. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT + SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE + FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, + ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER + DEALINGS IN THE SOFTWARE. + +License: BDB + /* + * The Oracle Berkeley DB product is licensed + * under the GNU AFFERO GENERAL PUBLIC LICENSE: + * + * + * GNU AFFERO GENERAL PUBLIC LICENSE + * Version 3, 19 November 2007 + * + * Copyright (C) 2007 Free Software Foundation, Inc. + * Everyone is permitted to copy and distribute verbatim copies + * of this license document, but changing it is not allowed. + * + * Preamble + * + * The GNU Affero General Public License is a free, copyleft license for + * software and other kinds of works, specifically designed to ensure + * cooperation with the community in the case of network server software. + * + * The licenses for most software and other practical works are designed + * to take away your freedom to share and change the works. By contrast, + * our General Public Licenses are intended to guarantee your freedom to + * share and change all versions of a program--to make sure it remains free + * software for all its users. + * + * When we speak of free software, we are referring to freedom, not + * price. Our General Public Licenses are designed to make sure that you + * have the freedom to distribute copies of free software (and charge for + * them if you wish), that you receive source code or can get it if you + * want it, that you can change the software or use pieces of it in new + * free programs, and that you know you can do these things. + * + * Developers that use our General Public Licenses protect your rights + * with two steps: (1) assert copyright on the software, and (2) offer + * you this License which gives you legal permission to copy, distribute + * and/or modify the software. + * + * A secondary benefit of defending all users' freedom is that + * improvements made in alternate versions of the program, if they + * receive widespread use, become available for other developers to + * incorporate. Many developers of free software are heartened and + * encouraged by the resulting cooperation. However, in the case of + * software used on network servers, this result may fail to come about. + * The GNU General Public License permits making a modified version and + * letting the public access it on a server without ever releasing its + * source code to the public. + * + * The GNU Affero General Public License is designed specifically to + * ensure that, in such cases, the modified source code becomes available + * to the community. It requires the operator of a network server to + * provide the source code of the modified version running there to the + * users of that server. Therefore, public use of a modified version, on + * a publicly accessible server, gives the public access to the source + * code of the modified version. + * + * An older license, called the Affero General Public License and + * published by Affero, was designed to accomplish similar goals. This is + * a different license, not a version of the Affero GPL, but Affero has + * released a new version of the Affero GPL which permits relicensing under + * this license. + * + * The precise terms and conditions for copying, distribution and + * modification follow. + * + * TERMS AND CONDITIONS + * + * 0. Definitions. + * + * "This License" refers to version 3 of the GNU Affero General Public License. + * + * "Copyright" also means copyright-like laws that apply to other kinds of + * works, such as semiconductor masks. + * + * "The Program" refers to any copyrightable work licensed under this + * License. Each licensee is addressed as "you". "Licensees" and + * "recipients" may be individuals or organizations. + * + * To "modify" a work means to copy from or adapt all or part of the work + * in a fashion requiring copyright permission, other than the making of an + * exact copy. The resulting work is called a "modified version" of the + * earlier work or a work "based on" the earlier work. + * + * A "covered work" means either the unmodified Program or a work based + * on the Program. + * + * To "propagate" a work means to do anything with it that, without + * permission, would make you directly or secondarily liable for + * infringement under applicable copyright law, except executing it on a + * computer or modifying a private copy. Propagation includes copying, + * distribution (with or without modification), making available to the + * public, and in some countries other activities as well. + * + * To "convey" a work means any kind of propagation that enables other + * parties to make or receive copies. Mere interaction with a user through + * a computer network, with no transfer of a copy, is not conveying. + * + * An interactive user interface displays "Appropriate Legal Notices" + * to the extent that it includes a convenient and prominently visible + * feature that (1) displays an appropriate copyright notice, and (2) + * tells the user that there is no warranty for the work (except to the + * extent that warranties are provided), that licensees may convey the + * work under this License, and how to view a copy of this License. If + * the interface presents a list of user commands or options, such as a + * menu, a prominent item in the list meets this criterion. + * + * 1. Source Code. + * + * The "source code" for a work means the preferred form of the work + * for making modifications to it. "Object code" means any non-source + * form of a work. + * + * A "Standard Interface" means an interface that either is an official + * standard defined by a recognized standards body, or, in the case of + * interfaces specified for a particular programming language, one that + * is widely used among developers working in that language. + * + * The "System Libraries" of an executable work include anything, other + * than the work as a whole, that (a) is included in the normal form of + * packaging a Major Component, but which is not part of that Major + * Component, and (b) serves only to enable use of the work with that + * Major Component, or to implement a Standard Interface for which an + * implementation is available to the public in source code form. A + * "Major Component", in this context, means a major essential component + * (kernel, window system, and so on) of the specific operating system + * (if any) on which the executable work runs, or a compiler used to + * produce the work, or an object code interpreter used to run it. + * + * The "Corresponding Source" for a work in object code form means all + * the source code needed to generate, install, and (for an executable + * work) run the object code and to modify the work, including scripts to + * control those activities. However, it does not include the work's + * System Libraries, or general-purpose tools or generally available free + * programs which are used unmodified in performing those activities but + * which are not part of the work. For example, Corresponding Source + * includes interface definition files associated with source files for + * the work, and the source code for shared libraries and dynamically + * linked subprograms that the work is specifically designed to require, + * such as by intimate data communication or control flow between those + * subprograms and other parts of the work. + * + * The Corresponding Source need not include anything that users + * can regenerate automatically from other parts of the Corresponding + * Source. + * + * The Corresponding Source for a work in source code form is that + * same work. + * + * 2. Basic Permissions. + * + * All rights granted under this License are granted for the term of + * copyright on the Program, and are irrevocable provided the stated + * conditions are met. This License explicitly affirms your unlimited + * permission to run the unmodified Program. The output from running a + * covered work is covered by this License only if the output, given its + * content, constitutes a covered work. This License acknowledges your + * rights of fair use or other equivalent, as provided by copyright law. + * + * You may make, run and propagate covered works that you do not + * convey, without conditions so long as your license otherwise remains + * in force. You may convey covered works to others for the sole purpose + * of having them make modifications exclusively for you, or provide you + * with facilities for running those works, provided that you comply with + * the terms of this License in conveying all material for which you do + * not control copyright. Those thus making or running the covered works + * for you must do so exclusively on your behalf, under your direction + * and control, on terms that prohibit them from making any copies of + * your copyrighted material outside their relationship with you. + * + * Conveying under any other circumstances is permitted solely under + * the conditions stated below. Sublicensing is not allowed; section 10 + * makes it unnecessary. + * + * 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + * + * No covered work shall be deemed part of an effective technological + * measure under any applicable law fulfilling obligations under article + * 11 of the WIPO copyright treaty adopted on 20 December 1996, or + * similar laws prohibiting or restricting circumvention of such + * measures. + * + * When you convey a covered work, you waive any legal power to forbid + * circumvention of technological measures to the extent such circumvention + * is effected by exercising rights under this License with respect to + * the covered work, and you disclaim any intention to limit operation or + * modification of the work as a means of enforcing, against the work's + * users, your or third parties' legal rights to forbid circumvention of + * technological measures. + * + * 4. Conveying Verbatim Copies. + * + * You may convey verbatim copies of the Program's source code as you + * receive it, in any medium, provided that you conspicuously and + * appropriately publish on each copy an appropriate copyright notice; + * keep intact all notices stating that this License and any + * non-permissive terms added in accord with section 7 apply to the code; + * keep intact all notices of the absence of any warranty; and give all + * recipients a copy of this License along with the Program. + * + * You may charge any price or no price for each copy that you convey, + * and you may offer support or warranty protection for a fee. + * + * 5. Conveying Modified Source Versions. + * + * You may convey a work based on the Program, or the modifications to + * produce it from the Program, in the form of source code under the + * terms of section 4, provided that you also meet all of these conditions: + * + * a) The work must carry prominent notices stating that you modified + * it, and giving a relevant date. + * + * b) The work must carry prominent notices stating that it is + * released under this License and any conditions added under section + * 7. This requirement modifies the requirement in section 4 to + * "keep intact all notices". + * + * c) You must license the entire work, as a whole, under this + * License to anyone who comes into possession of a copy. This + * License will therefore apply, along with any applicable section 7 + * additional terms, to the whole of the work, and all its parts, + * regardless of how they are packaged. This License gives no + * permission to license the work in any other way, but it does not + * invalidate such permission if you have separately received it. + * + * d) If the work has interactive user interfaces, each must display + * Appropriate Legal Notices; however, if the Program has interactive + * interfaces that do not display Appropriate Legal Notices, your + * work need not make them do so. + * + * A compilation of a covered work with other separate and independent + * works, which are not by their nature extensions of the covered work, + * and which are not combined with it such as to form a larger program, + * in or on a volume of a storage or distribution medium, is called an + * "aggregate" if the compilation and its resulting copyright are not + * used to limit the access or legal rights of the compilation's users + * beyond what the individual works permit. Inclusion of a covered work + * in an aggregate does not cause this License to apply to the other + * parts of the aggregate. + * + * 6. Conveying Non-Source Forms. + * + * You may convey a covered work in object code form under the terms + * of sections 4 and 5, provided that you also convey the + * machine-readable Corresponding Source under the terms of this License, + * in one of these ways: + * + * a) Convey the object code in, or embodied in, a physical product + * (including a physical distribution medium), accompanied by the + * Corresponding Source fixed on a durable physical medium + * customarily used for software interchange. + * + * b) Convey the object code in, or embodied in, a physical product + * (including a physical distribution medium), accompanied by a + * written offer, valid for at least three years and valid for as + * long as you offer spare parts or customer support for that product + * model, to give anyone who possesses the object code either (1) a + * copy of the Corresponding Source for all the software in the + * product that is covered by this License, on a durable physical + * medium customarily used for software interchange, for a price no + * more than your reasonable cost of physically performing this + * conveying of source, or (2) access to copy the + * Corresponding Source from a network server at no charge. + * + * c) Convey individual copies of the object code with a copy of the + * written offer to provide the Corresponding Source. This + * alternative is allowed only occasionally and noncommercially, and + * only if you received the object code with such an offer, in accord + * with subsection 6b. + * + * d) Convey the object code by offering access from a designated + * place (gratis or for a charge), and offer equivalent access to the + * Corresponding Source in the same way through the same place at no + * further charge. You need not require recipients to copy the + * Corresponding Source along with the object code. If the place to + * copy the object code is a network server, the Corresponding Source + * may be on a different server (operated by you or a third party) + * that supports equivalent copying facilities, provided you maintain + * clear directions next to the object code saying where to find the + * Corresponding Source. Regardless of what server hosts the + * Corresponding Source, you remain obligated to ensure that it is + * available for as long as needed to satisfy these requirements. + * + * e) Convey the object code using peer-to-peer transmission, provided + * you inform other peers where the object code and Corresponding + * Source of the work are being offered to the general public at no + * charge under subsection 6d. + * + * A separable portion of the object code, whose source code is excluded + * from the Corresponding Source as a System Library, need not be + * included in conveying the object code work. + * + * A "User Product" is either (1) a "consumer product", which means any + * tangible personal property which is normally used for personal, family, + * or household purposes, or (2) anything designed or sold for incorporation + * into a dwelling. In determining whether a product is a consumer product, + * doubtful cases shall be resolved in favor of coverage. For a particular + * product received by a particular user, "normally used" refers to a + * typical or common use of that class of product, regardless of the status + * of the particular user or of the way in which the particular user + * actually uses, or expects or is expected to use, the product. A product + * is a consumer product regardless of whether the product has substantial + * commercial, industrial or non-consumer uses, unless such uses represent + * the only significant mode of use of the product. + * + * "Installation Information" for a User Product means any methods, + * procedures, authorization keys, or other information required to install + * and execute modified versions of a covered work in that User Product from + * a modified version of its Corresponding Source. The information must + * suffice to ensure that the continued functioning of the modified object + * code is in no case prevented or interfered with solely because + * modification has been made. + * + * If you convey an object code work under this section in, or with, or + * specifically for use in, a User Product, and the conveying occurs as + * part of a transaction in which the right of possession and use of the + * User Product is transferred to the recipient in perpetuity or for a + * fixed term (regardless of how the transaction is characterized), the + * Corresponding Source conveyed under this section must be accompanied + * by the Installation Information. But this requirement does not apply + * if neither you nor any third party retains the ability to install + * modified object code on the User Product (for example, the work has + * been installed in ROM). + * + * The requirement to provide Installation Information does not include a + * requirement to continue to provide support service, warranty, or updates + * for a work that has been modified or installed by the recipient, or for + * the User Product in which it has been modified or installed. Access to a + * network may be denied when the modification itself materially and + * adversely affects the operation of the network or violates the rules and + * protocols for communication across the network. + * + * Corresponding Source conveyed, and Installation Information provided, + * in accord with this section must be in a format that is publicly + * documented (and with an implementation available to the public in + * source code form), and must require no special password or key for + * unpacking, reading or copying. + * + * 7. Additional Terms. + * + * "Additional permissions" are terms that supplement the terms of this + * License by making exceptions from one or more of its conditions. + * Additional permissions that are applicable to the entire Program shall + * be treated as though they were included in this License, to the extent + * that they are valid under applicable law. If additional permissions + * apply only to part of the Program, that part may be used separately + * under those permissions, but the entire Program remains governed by + * this License without regard to the additional permissions. + * + * When you convey a copy of a covered work, you may at your option + * remove any additional permissions from that copy, or from any part of + * it. (Additional permissions may be written to require their own + * removal in certain cases when you modify the work.) You may place + * additional permissions on material, added by you to a covered work, + * for which you have or can give appropriate copyright permission. + * + * Notwithstanding any other provision of this License, for material you + * add to a covered work, you may (if authorized by the copyright holders of + * that material) supplement the terms of this License with terms: + * + * a) Disclaiming warranty or limiting liability differently from the + * terms of sections 15 and 16 of this License; or + * + * b) Requiring preservation of specified reasonable legal notices or + * author attributions in that material or in the Appropriate Legal + * Notices displayed by works containing it; or + * + * c) Prohibiting misrepresentation of the origin of that material, or + * requiring that modified versions of such material be marked in + * reasonable ways as different from the original version; or + * + * d) Limiting the use for publicity purposes of names of licensors or + * authors of the material; or + * + * e) Declining to grant rights under trademark law for use of some + * trade names, trademarks, or service marks; or + * + * f) Requiring indemnification of licensors and authors of that + * material by anyone who conveys the material (or modified versions of + * it) with contractual assumptions of liability to the recipient, for + * any liability that these contractual assumptions directly impose on + * those licensors and authors. + * + * All other non-permissive additional terms are considered "further + * restrictions" within the meaning of section 10. If the Program as you + * received it, or any part of it, contains a notice stating that it is + * governed by this License along with a term that is a further + * restriction, you may remove that term. If a license document contains + * a further restriction but permits relicensing or conveying under this + * License, you may add to a covered work material governed by the terms + * of that license document, provided that the further restriction does + * not survive such relicensing or conveying. + * + * If you add terms to a covered work in accord with this section, you + * must place, in the relevant source files, a statement of the + * additional terms that apply to those files, or a notice indicating + * where to find the applicable terms. + * + * Additional terms, permissive or non-permissive, may be stated in the + * form of a separately written license, or stated as exceptions; + * the above requirements apply either way. + * + * 8. Termination. + * + * You may not propagate or modify a covered work except as expressly + * provided under this License. Any attempt otherwise to propagate or + * modify it is void, and will automatically terminate your rights under + * this License (including any patent licenses granted under the third + * paragraph of section 11). + * + * However, if you cease all violation of this License, then your + * license from a particular copyright holder is reinstated (a) + * provisionally, unless and until the copyright holder explicitly and + * finally terminates your license, and (b) permanently, if the copyright + * holder fails to notify you of the violation by some reasonable means + * prior to 60 days after the cessation. + * + * Moreover, your license from a particular copyright holder is + * reinstated permanently if the copyright holder notifies you of the + * violation by some reasonable means, this is the first time you have + * received notice of violation of this License (for any work) from that + * copyright holder, and you cure the violation prior to 30 days after + * your receipt of the notice. + * + * Termination of your rights under this section does not terminate the + * licenses of parties who have received copies or rights from you under + * this License. If your rights have been terminated and not permanently + * reinstated, you do not qualify to receive new licenses for the same + * material under section 10. + * + * 9. Acceptance Not Required for Having Copies. + * + * You are not required to accept this License in order to receive or + * run a copy of the Program. Ancillary propagation of a covered work + * occurring solely as a consequence of using peer-to-peer transmission + * to receive a copy likewise does not require acceptance. However, + * nothing other than this License grants you permission to propagate or + * modify any covered work. These actions infringe copyright if you do + * not accept this License. Therefore, by modifying or propagating a + * covered work, you indicate your acceptance of this License to do so. + * + * 10. Automatic Licensing of Downstream Recipients. + * + * Each time you convey a covered work, the recipient automatically + * receives a license from the original licensors, to run, modify and + * propagate that work, subject to this License. You are not responsible + * for enforcing compliance by third parties with this License. + * + * An "entity transaction" is a transaction transferring control of an + * organization, or substantially all assets of one, or subdividing an + * organization, or merging organizations. If propagation of a covered + * work results from an entity transaction, each party to that + * transaction who receives a copy of the work also receives whatever + * licenses to the work the party's predecessor in interest had or could + * give under the previous paragraph, plus a right to possession of the + * Corresponding Source of the work from the predecessor in interest, if + * the predecessor has it or can get it with reasonable efforts. + * + * You may not impose any further restrictions on the exercise of the + * rights granted or affirmed under this License. For example, you may + * not impose a license fee, royalty, or other charge for exercise of + * rights granted under this License, and you may not initiate litigation + * (including a cross-claim or counterclaim in a lawsuit) alleging that + * any patent claim is infringed by making, using, selling, offering for + * sale, or importing the Program or any portion of it. + * + * 11. Patents. + * + * A "contributor" is a copyright holder who authorizes use under this + * License of the Program or a work on which the Program is based. The + * work thus licensed is called the contributor's "contributor version". + * + * A contributor's "essential patent claims" are all patent claims + * owned or controlled by the contributor, whether already acquired or + * hereafter acquired, that would be infringed by some manner, permitted + * by this License, of making, using, or selling its contributor version, + * but do not include claims that would be infringed only as a + * consequence of further modification of the contributor version. For + * purposes of this definition, "control" includes the right to grant + * patent sublicenses in a manner consistent with the requirements of + * this License. + * + * Each contributor grants you a non-exclusive, worldwide, royalty-free + * patent license under the contributor's essential patent claims, to + * make, use, sell, offer for sale, import and otherwise run, modify and + * propagate the contents of its contributor version. + * + * In the following three paragraphs, a "patent license" is any express + * agreement or commitment, however denominated, not to enforce a patent + * (such as an express permission to practice a patent or covenant not to + * sue for patent infringement). To "grant" such a patent license to a + * party means to make such an agreement or commitment not to enforce a + * patent against the party. + * + * If you convey a covered work, knowingly relying on a patent license, + * and the Corresponding Source of the work is not available for anyone + * to copy, free of charge and under the terms of this License, through a + * publicly available network server or other readily accessible means, + * then you must either (1) cause the Corresponding Source to be so + * available, or (2) arrange to deprive yourself of the benefit of the + * patent license for this particular work, or (3) arrange, in a manner + * consistent with the requirements of this License, to extend the patent + * license to downstream recipients. "Knowingly relying" means you have + * actual knowledge that, but for the patent license, your conveying the + * covered work in a country, or your recipient's use of the covered work + * in a country, would infringe one or more identifiable patents in that + * country that you have reason to believe are valid. + * + * If, pursuant to or in connection with a single transaction or + * arrangement, you convey, or propagate by procuring conveyance of, a + * covered work, and grant a patent license to some of the parties + * receiving the covered work authorizing them to use, propagate, modify + * or convey a specific copy of the covered work, then the patent license + * you grant is automatically extended to all recipients of the covered + * work and works based on it. + * + * A patent license is "discriminatory" if it does not include within + * the scope of its coverage, prohibits the exercise of, or is + * conditioned on the non-exercise of one or more of the rights that are + * specifically granted under this License. You may not convey a covered + * work if you are a party to an arrangement with a third party that is + * in the business of distributing software, under which you make payment + * to the third party based on the extent of your activity of conveying + * the work, and under which the third party grants, to any of the + * parties who would receive the covered work from you, a discriminatory + * patent license (a) in connection with copies of the covered work + * conveyed by you (or copies made from those copies), or (b) primarily + * for and in connection with specific products or compilations that + * contain the covered work, unless you entered into that arrangement, + * or that patent license was granted, prior to 28 March 2007. + * + * Nothing in this License shall be construed as excluding or limiting + * any implied license or other defenses to infringement that may + * otherwise be available to you under applicable patent law. + * + * 12. No Surrender of Others' Freedom. + * + * If conditions are imposed on you (whether by court order, agreement or + * otherwise) that contradict the conditions of this License, they do not + * excuse you from the conditions of this License. If you cannot convey a + * covered work so as to satisfy simultaneously your obligations under this + * License and any other pertinent obligations, then as a consequence you may + * not convey it at all. For example, if you agree to terms that obligate you + * to collect a royalty for further conveying from those to whom you convey + * the Program, the only way you could satisfy both those terms and this + * License would be to refrain entirely from conveying the Program. + * + * 13. Remote Network Interaction; Use with the GNU General Public License. + * + * Notwithstanding any other provision of this License, if you modify the + * Program, your modified version must prominently offer all users + * interacting with it remotely through a computer network (if your version + * supports such interaction) an opportunity to receive the Corresponding + * Source of your version by providing access to the Corresponding Source + * from a network server at no charge, through some standard or customary + * means of facilitating copying of software. This Corresponding Source + * shall include the Corresponding Source for any work covered by version 3 + * of the GNU General Public License that is incorporated pursuant to the + * following paragraph. + * + * Notwithstanding any other provision of this License, you have + * permission to link or combine any covered work with a work licensed + * under version 3 of the GNU General Public License into a single + * combined work, and to convey the resulting work. The terms of this + * License will continue to apply to the part which is the covered work, + * but the work with which it is combined will remain governed by version + * 3 of the GNU General Public License. + * + * 14. Revised Versions of this License. + * + * The Free Software Foundation may publish revised and/or new versions of + * the GNU Affero General Public License from time to time. Such new versions + * will be similar in spirit to the present version, but may differ in detail to + * address new problems or concerns. + * + * Each version is given a distinguishing version number. If the + * Program specifies that a certain numbered version of the GNU Affero General + * Public License "or any later version" applies to it, you have the + * option of following the terms and conditions either of that numbered + * version or of any later version published by the Free Software + * Foundation. If the Program does not specify a version number of the + * GNU Affero General Public License, you may choose any version ever published + * by the Free Software Foundation. + * + * If the Program specifies that a proxy can decide which future + * versions of the GNU Affero General Public License can be used, that proxy's + * public statement of acceptance of a version permanently authorizes you + * to choose that version for the Program. + * + * Later license versions may give you additional or different + * permissions. However, no additional obligations are imposed on any + * author or copyright holder as a result of your choosing to follow a + * later version. + * + * 15. Disclaimer of Warranty. + * + * THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY + * APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + * HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY + * OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, + * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM + * IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF + * ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + * + * 16. Limitation of Liability. + * + * IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING + * WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS + * THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY + * GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE + * USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + * DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD + * PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), + * EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGES. + * + * 17. Interpretation of Sections 15 and 16. + * + * If the disclaimer of warranty and limitation of liability provided + * above cannot be given local legal effect according to their terms, + * reviewing courts shall apply local law that most closely approximates + * an absolute waiver of all civil liability in connection with the + * Program, unless a warranty or assumption of liability accompanies a + * copy of the Program in return for a fee. + * + * END OF TERMS AND CONDITIONS + * + * How to Apply These Terms to Your New Programs + * + * If you develop a new program, and you want it to be of the greatest + * possible use to the public, the best way to achieve this is to make it + * free software which everyone can redistribute and change under these terms. + * + * To do so, attach the following notices to the program. It is safest + * to attach them to the start of each source file to most effectively + * state the exclusion of warranty; and each file should have at least + * the "copyright" line and a pointer to where the full notice is found. + * + * + * Copyright (C) + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + * + * Also add information on how to contact you by electronic and paper mail. + * + * If your software can interact with users remotely through a computer + * network, you should also make sure that it provides a way for users to + * get its source. For example, if your program is a web application, its + * interface could display a "Source" link that leads users to an archive + * of the code. There are many ways you could offer source, and different + * solutions will be better for different programs; see section 13 for the + * specific requirements. + * + * You should also get your employer (if you work as a programmer) or school, + * if any, to sign a "copyright disclaimer" for the program, if necessary. + * For more information on this, and how to apply and follow the GNU AGPL, see + * . + */ + . + ADDITIONAL THIRD PARTY NOTICES: + . + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + /* + * Copyright (c) 1990, 1993, 1994, 1995 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + /* + * Copyright (c) 1995, 1996 + * The President and Fellows of Harvard University. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY HARVARD AND ITS CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL HARVARD OR ITS CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= + /*** + * ASM: a very small and fast Java bytecode manipulation framework + * Copyright (c) 2000-2005 INRIA, France Telecom + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF + * THE POSSIBILITY OF SUCH DAMAGE. + */ + +License: BSD-2-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + . + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the + distribution. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License: BSD-3-clause + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * The name of the author may not be used to endorse or promote products + derived from this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +License: Expat + Permission is hereby granted, free of charge, to any person obtaining a + copy of this software and associated documentation files (the + "Software"), to deal in the Software without restriction, including + without limitation the rights to use, copy, modify, merge, publish, + distribute, sublicense, and/or sell copies of the Software, and to + permit persons to whom the Software is furnished to do so, subject to + the following conditions: + . + The above copyright notice and this permission notice shall be included + in all copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS + OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, + TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE + SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +License: BSD-3-clause-Google + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are + met: + . + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above + copyright notice, this list of conditions and the following disclaimer + in the documentation and/or other materials provided with the + distribution. + * Neither the name of Google Inc. nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +License: BSD-3-clause-Tobias-Klein + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + . + * Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + * Neither the name of Tobias Klein nor the name of trapkit.de may be used + to endorse or promote products derived from this software without specific + prior written permission. + . + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. + +License: ISC + Permission to use, copy, modify, and distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + . + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL + WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED + WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR + BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES + OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, + WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, + ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS + SOFTWARE. + +License: LGPL + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + . + On Debian systems the GNU Lesser General Public License (LGPL) is + located in '/usr/share/common-licenses/LGPL'. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. +Comment: + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +License: LGPL-3+ with ZeroMQ exception + GNU LESSER GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + . + On Debian systems the GNU Lesser General Public License (LGPL) is + located in '/usr/share/common-licenses/LGPL'. + . + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + -------------------------------------------------------------------------------- + SPECIAL EXCEPTION GRANTED BY COPYRIGHT HOLDERS + . + As a special exception, copyright holders give you permission to link this + library with independent modules to produce an executable, regardless of + the license terms of these independent modules, and to copy and distribute + the resulting executable under terms of your choice, provided that you also + meet, for each linked independent module, the terms and conditions of + the license of that module. An independent module is a module which is not + derived from or based on this library. If you modify this library, you must + extend this exception to your version of the library. + + Note: this exception relieves you of any obligations under sections 4 and 5 + of this license, and section 6 of the GNU General Public License. +Comment: + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +License: GNU-All-permissive-License + Copying and distribution of this file, with or without modification, are + permitted in any medium without royalty provided the copyright notice + and this notice are preserved. This file is offered as-is, without any + warranty. + +License: GPL-3+ with Autoconf exception + This program is free software: you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation, either version 3 of the License, or (at your + option) any later version. + . + This program is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General + Public License for more details. + . + You should have received a copy of the GNU General Public License along + with this program. If not, see . + . + On Debian systems, the full text of the GNU General Public License + version 3 can be found in the file `/usr/share/common-licenses/GPL-3'. + . + As a special exception, the respective Autoconf Macro's copyright owner + gives unlimited permission to copy, distribute and modify the configure + scripts that are the output of Autoconf when processing the Macro. You + need not follow the terms of the GNU General Public License when using + or distributing such scripts, even though portions of the text of the + Macro appear in them. The GNU General Public License (GPL) does govern + all other use of the material that constitutes the Autoconf Macro. + . + This special exception to the GPL applies to versions of the Autoconf + Macro released by the Autoconf Archive. When you make and distribute a + modified version of the Autoconf Macro, you may extend this special + exception to the GPL to apply to your modified version as well. +Comment: + The "special exception" is extended to the versions of files covered by + this license that are distributed with this software. + +License: GPL-2+ with Libtool exception + This is free software; see the source for copying conditions. There is NO + warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + . + GNU Libtool is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of of the License, or + (at your option) any later version. + . + As a special exception to the GNU General Public License, if you + distribute this file as part of a program or library that is built + using GNU Libtool, you may include this file under the same + distribution terms that you use for the rest of that program. + . + GNU Libtool is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + . + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +License: Expat-with-advertising-clause + Permission is hereby granted, free of charge, to any person + obtaining a copy of this software and associated documentation + files (the "Software"), to deal in the Software without + restriction, including without limitation the rights to use, copy, + modify, merge, publish, distribute, sublicense, and/or sell copies + of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be + included in all copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF + CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION + WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + Except as contained in this notice, the names of the authors or + their institutions shall not be used in advertising or otherwise to + promote the sale, use or other dealings in this Software without + prior written authorization from the authors. + +License: CC0-1.0 + Creative Commons Legal Code + . + CC0 1.0 Universal + . + CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE + LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN + ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS + INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES + REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS + PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM + THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED + HEREUNDER. + . + Statement of Purpose + . + The laws of most jurisdictions throughout the world automatically confer + exclusive Copyright and Related Rights (defined below) upon the creator + and subsequent owner(s) (each and all, an "owner") of an original work of + authorship and/or a database (each, a "Work"). + . + Certain owners wish to permanently relinquish those rights to a Work for + the purpose of contributing to a commons of creative, cultural and + scientific works ("Commons") that the public can reliably and without fear + of later claims of infringement build upon, modify, incorporate in other + works, reuse and redistribute as freely as possible in any form whatsoever + and for any purposes, including without limitation commercial purposes. + These owners may contribute to the Commons to promote the ideal of a free + culture and the further production of creative, cultural and scientific + works, or to gain reputation or greater distribution for their Work in + part through the use and efforts of others. + . + For these and/or other purposes and motivations, and without any + expectation of additional consideration or compensation, the person + associating CC0 with a Work (the "Affirmer"), to the extent that he or she + is an owner of Copyright and Related Rights in the Work, voluntarily + elects to apply CC0 to the Work and publicly distribute the Work under its + terms, with knowledge of his or her Copyright and Related Rights in the + Work and the meaning and intended legal effect of CC0 on those rights. + . + 1. Copyright and Related Rights. A Work made available under CC0 may be + protected by copyright and related or neighboring rights ("Copyright and + Related Rights"). Copyright and Related Rights include, but are not + limited to, the following: + . + i. the right to reproduce, adapt, distribute, perform, display, + communicate, and translate a Work; + ii. moral rights retained by the original author(s) and/or performer(s); + iii. publicity and privacy rights pertaining to a person's image or + likeness depicted in a Work; + iv. rights protecting against unfair competition in regards to a Work, + subject to the limitations in paragraph 4(a), below; + v. rights protecting the extraction, dissemination, use and reuse of data + in a Work; + vi. database rights (such as those arising under Directive 96/9/EC of the + European Parliament and of the Council of 11 March 1996 on the legal + protection of databases, and under any national implementation + thereof, including any amended or successor version of such + directive); and + vii. other similar, equivalent or corresponding rights throughout the + world based on applicable law or treaty, and any national + implementations thereof. + . + 2. Waiver. To the greatest extent permitted by, but not in contravention + of, applicable law, Affirmer hereby overtly, fully, permanently, + irrevocably and unconditionally waives, abandons, and surrenders all of + Affirmer's Copyright and Related Rights and associated claims and causes + of action, whether now known or unknown (including existing as well as + future claims and causes of action), in the Work (i) in all territories + worldwide, (ii) for the maximum duration provided by applicable law or + treaty (including future time extensions), (iii) in any current or future + medium and for any number of copies, and (iv) for any purpose whatsoever, + including without limitation commercial, advertising or promotional + purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each + member of the public at large and to the detriment of Affirmer's heirs and + successors, fully intending that such Waiver shall not be subject to + revocation, rescission, cancellation, termination, or any other legal or + equitable action to disrupt the quiet enjoyment of the Work by the public + as contemplated by Affirmer's express Statement of Purpose. + . + 3. Public License Fallback. Should any part of the Waiver for any reason + be judged legally invalid or ineffective under applicable law, then the + Waiver shall be preserved to the maximum extent permitted taking into + account Affirmer's express Statement of Purpose. In addition, to the + extent the Waiver is so judged Affirmer hereby grants to each affected + person a royalty-free, non transferable, non sublicensable, non exclusive, + irrevocable and unconditional license to exercise Affirmer's Copyright and + Related Rights in the Work (i) in all territories worldwide, (ii) for the + maximum duration provided by applicable law or treaty (including future + time extensions), (iii) in any current or future medium and for any number + of copies, and (iv) for any purpose whatsoever, including without + limitation commercial, advertising or promotional purposes (the + "License"). The License shall be deemed effective as of the date CC0 was + applied by Affirmer to the Work. Should any part of the License for any + reason be judged legally invalid or ineffective under applicable law, such + partial invalidity or ineffectiveness shall not invalidate the remainder + of the License, and in such case Affirmer hereby affirms that he or she + will not (i) exercise any of his or her remaining Copyright and Related + Rights in the Work or (ii) assert any associated claims and causes of + action with respect to the Work, in either case contrary to Affirmer's + express Statement of Purpose. + . + 4. Limitations and Disclaimers. + . + a. No trademark or patent rights held by Affirmer are waived, abandoned, + surrendered, licensed or otherwise affected by this document. + b. Affirmer offers the Work as-is and makes no representations or + warranties of any kind concerning the Work, express, implied, + statutory or otherwise, including without limitation warranties of + title, merchantability, fitness for a particular purpose, non + infringement, or the absence of latent or other defects, accuracy, or + the present or absence of errors, whether or not discoverable, all to + the greatest extent permissible under applicable law. + c. Affirmer disclaims responsibility for clearing rights of other persons + that may apply to the Work or any use thereof, including without + limitation any person's Copyright and Related Rights in the Work. + Further, Affirmer disclaims responsibility for obtaining any necessary + consents, permissions or other rights required for any use of the + Work. + d. Affirmer understands and acknowledges that Creative Commons is not a + party to this document and has no duty or obligation with respect to + this CC0 or use of the Work. + +License: WTFPL + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + Version 2, December 2004 + . + Copyright (C) 2004 Sam Hocevar + . + Everyone is permitted to copy and distribute verbatim or modified + copies of this license document, and changing it is allowed as long + as the name is changed. + . + DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + . + 0. You just DO WHAT THE FUCK YOU WANT TO. + +License: Ring-BoringSSL + Note that it is easy for this file to get out of sync with the licenses in the + source code files. It's recommended to compare the licenses in the source code + with what's mentioned here. + . + *ring* is derived from BoringSSL, so the licensing situation in *ring* is + similar to BoringSSL. + . + *ring* uses an ISC-style license like BoringSSL for code in new files, + including in particular all the Rust code: + . + Copyright 2015-2016 Brian Smith. + . + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + . + THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY + SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + . + BoringSSL is a fork of OpenSSL. As such, large parts of it fall under OpenSSL + licensing. Files that are completely new have a Google copyright and an ISC + license. This license is reproduced at the bottom of this file. + . + Contributors to BoringSSL are required to follow the CLA rules for Chromium: + https://cla.developers.google.com/clas + . + Files in third_party/ have their own licenses, as described therein. The MIT + license, for third_party/fiat, which, unlike other third_party directories, is + compiled into non-test libraries, is included below. + . + The OpenSSL toolkit stays under a dual license, i.e. both the conditions of the + OpenSSL License and the original SSLeay license apply to the toolkit. See below + for the actual license texts. Actually both licenses are BSD-style Open Source + licenses. In case of any license issues related to OpenSSL please contact + openssl-core@openssl.org. + . + The following are Google-internal bug numbers where explicit permission from + some authors is recorded for use of their work: + 27287199 + 27287880 + 27287883 + . + OpenSSL License + --------------- + . + /* ==================================================================== + * Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * 3. All advertising materials mentioning features or use of this + * software must display the following acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" + * + * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to + * endorse or promote products derived from this software without + * prior written permission. For written permission, please contact + * openssl-core@openssl.org. + * + * 5. Products derived from this software may not be called "OpenSSL" + * nor may "OpenSSL" appear in their names without prior written + * permission of the OpenSSL Project. + * + * 6. Redistributions of any form whatsoever must retain the following + * acknowledgment: + * "This product includes software developed by the OpenSSL Project + * for use in the OpenSSL Toolkit (http://www.openssl.org/)" + * + * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY + * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR + * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * OF THE POSSIBILITY OF SUCH DAMAGE. + * ==================================================================== + * + * This product includes cryptographic software written by Eric Young + * (eay@cryptsoft.com). This product includes software written by Tim + * Hudson (tjh@cryptsoft.com). + * + */ + . + Original SSLeay License + ----------------------- + . + /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) + * All rights reserved. + * + * This package is an SSL implementation written + * by Eric Young (eay@cryptsoft.com). + * The implementation was written so as to conform with Netscapes SSL. + * + * This library is free for commercial and non-commercial use as long as + * the following conditions are aheared to. The following conditions + * apply to all code found in this distribution, be it the RC4, RSA, + * lhash, DES, etc., code; not just the SSL code. The SSL documentation + * included with this distribution is covered by the same copyright terms + * except that the holder is Tim Hudson (tjh@cryptsoft.com). + * + * Copyright remains Eric Young's, and as such any Copyright notices in + * the code are not to be removed. + * If this package is used in a product, Eric Young should be given attribution + * as the author of the parts of the library used. + * This can be in the form of a textual message at program startup or + * in documentation (online or textual) provided with the package. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * "This product includes cryptographic software written by + * Eric Young (eay@cryptsoft.com)" + * The word 'cryptographic' can be left out if the rouines from the library + * being used are not cryptographic related :-). + * 4. If you include any Windows specific code (or a derivative thereof) from + * the apps directory (application code) you must include an acknowledgement: + * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" + * + * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + * + * The licence and distribution terms for any publically available version or + * derivative of this code cannot be changed. i.e. this code cannot simply be + * copied and put under another distribution licence + * [including the GNU Public Licence.] + */ + . + ISC license used for completely new code in BoringSSL: + . + /* Copyright (c) 2015, Google Inc. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY + * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION + * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ + . + The code in third_party/fiat carries the MIT license: + . + Copyright (c) 2015-2016 the fiat-crypto authors (see + https://github.com/mit-plv/fiat-crypto/blob/master/AUTHORS). + . + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + . + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + . + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. + +License: BOSL-1+ with Zcash exception + This package ("Original Work") is licensed under the terms of the Bootstrap Open + Source License, version 1.0, or at your option, any later version ("BOSL"). See + the file ./LICENSE-BOSL for the terms of the Bootstrap Open Source Licence, + version 1.0. + . + Only if this Original Work is included as part of the distribution of one of the + following (each, the "Project"): + . + - The Zcash projects published by the Electric Coin Company; + - The Zebra project published by the Zcash Foundation; + - A project that is designed to integrate with Zcash and provides additional + functionality or utility to the Zcash network and holders of the ZEC coin; or + - A blockchain that descends from the Zcash blockchain and that is forked + within 100 blocks of the current block height of the Zcash blockchain at the + time of the code fork; + . + then License is granted to use the Original Work under the BOSL as modified by + the following clarification and special exception. This exception applies only + to the Original Work when linked or combined with the Project and not to the + Original Work when linked, combined, or included in or with any other software + or project or on a standalone basis. + . + Under the terms of the BOSL, linking or combining this Original Work with + the Project creates a Derivative Work based upon the Original Work and the + terms of the BOSL thus apply to both the Original Work and that Derivative + Work. As a special exception to the BOSL, and to allow this Original Work to + be linked and combined with the Project without having to apply the BOSL to + the other portions of the Project, you are granted permission to link or + combine this Original Work with the Project and to copy and distribute the + resulting work ("Resulting Work") under the open source license applicable + to the Project ("Project License"), provided that any portions of this + Original Work included in the Resulting Work remain subject to the BOSL. For + clarity, you may continue to treat all other portions of the Project under + the Project License, provided that you comply with the BOSL with respect to + the Original Work. If you modify this Original Work, your version of the + Original Work must remain under the BOSL. You may also extend this exception + to your version, but you are not obligated to do so. If you do not wish to + do so, delete this exception statement from your version. + +License: BOSL-1 + ======================================================= + Bootstrap Open Source Licence ("BOSL") v. 1.0 + ======================================================= + This Bootstrap Open Source Licence (the "License") applies to any original work + of authorship (the "Original Work") whose owner (the "Licensor") has placed the + following licensing notice adjacent to the copyright notice for the Original + Work: + . + *Licensed under the Bootstrap Open Source Licence version 1.0* + . + 1. **Grant of Copyright License.** Licensor grants You a worldwide, + royalty-free, non-exclusive, sublicensable license, for the duration of the + copyright in the Original Work, to do the following: + . + a. to reproduce the Original Work in copies, either alone or as part of + a collective work; + . + b. to translate, adapt, alter, transform, modify, or arrange the + Original Work, thereby creating derivative works ("Derivative Works") + based upon the Original Work; + . + c. to distribute or communicate copies of the Original Work and + Derivative Works to the public, provided that prior to any such + distribution or communication You first place a machine-readable copy + of the Source Code of the Original Work and such Derivative Works that + You intend to distribute or communicate in an information repository + reasonably calculated to permit inexpensive and convenient access + thereto by the public (“Information Repository”) for as long as You + continue to distribute or communicate said copies, accompanied by an + irrevocable offer to license said copies to the public free of charge + under this License, said offer valid starting no later than 12 months + after You first distribute or communicate said copies; + . + d. to perform the Original Work publicly; and + . + e. to display the Original Work publicly. + . + 2. **Grant of Patent License.** Licensor grants You a worldwide, royalty-free, + non-exclusive, sublicensable license, under patent claims owned or controlled + by the Licensor that are embodied in the Original Work as furnished by the + Licensor, for the duration of the patents, to make, use, sell, offer for sale, + have made, and import the Original Work and Derivative Works. + . + 3. **Grant of Source Code License.** The "Source Code" for a work means the + preferred form of the work for making modifications to it and all available + documentation describing how to modify the work. Licensor agrees to provide a + machine-readable copy of the Source Code of the Original Work along with each + copy of the Original Work that Licensor distributes. Licensor reserves the + right to satisfy this obligation by placing a machine-readable copy of said + Source Code in an Information Repository for as long as Licensor continues to + distribute the Original Work. + . + 4. **Exclusions From License Grant.** Neither the names of Licensor, nor the + names of any contributors to the Original Work, nor any of their trademarks or + service marks, may be used to endorse or promote products derived from this + Original Work without express prior permission of the Licensor. Except as + expressly stated herein, nothing in this License grants any license to + Licensor's trademarks, copyrights, patents, trade secrets or any other + intellectual property. No patent license is granted to make, use, sell, offer + for sale, have made, or import embodiments of any patent claims other than the + licensed claims defined in Section 2. No license is granted to the trademarks + of Licensor even if such marks are included in the Original Work. Nothing in + this License shall be interpreted to prohibit Licensor from licensing under + terms different from this License any Original Work that Licensor otherwise + would have a right to license. + . + 5. **External Deployment.** The term "External Deployment" means the use, + distribution, or communication of the Original Work or Derivative Works in any + way such that the Original Work or Derivative Works may be used by anyone other + than You, whether those works are distributed or communicated to those persons + or made available as an application intended for use over a network. As an + express condition for the grants of license hereunder, You must treat any + External Deployment by You of the Original Work or a Derivative Work as a + distribution under section 1(c). + . + 6. **Attribution Rights.** You must retain, in the Source Code of any + Derivative Works that You create, all copyright, patent, or trademark notices + from the Source Code of the Original Work, as well as any notices of licensing + and any descriptive text identified therein as an "Attribution Notice." You + must cause the Source Code for any Derivative Works that You create to carry a + prominent Attribution Notice reasonably calculated to inform recipients that + You have modified the Original Work. + . + 7. **Warranty of Provenance and Disclaimer of Warranty.** Licensor warrants + that the copyright in and to the Original Work and the patent rights granted + herein by Licensor are owned by the Licensor or are sublicensed to You under + the terms of this License with the permission of the contributor(s) of those + copyrights and patent rights. Except as expressly stated in the immediately + preceding sentence, the Original Work is provided under this License on an "AS + IS" BASIS and WITHOUT WARRANTY, either express or implied, including, without + limitation, the warranties of non-infringement, merchantability or fitness for + a particular purpose. THE ENTIRE RISK AS TO THE QUALITY OF THE ORIGINAL WORK IS + WITH YOU. This DISCLAIMER OF WARRANTY constitutes an essential part of this + License. No license to the Original Work is granted by this License except + under this disclaimer. + . + 8. **Limitation of Liability.** Under no circumstances and under no legal + theory, whether in tort (including negligence), contract, or otherwise, shall + the Licensor be liable to anyone for any indirect, special, incidental, or + consequential damages of any character arising as a result of this License or + the use of the Original Work including, without limitation, damages for loss of + goodwill, work stoppage, computer failure or malfunction, or any and all other + commercial damages or losses. This limitation of liability shall not apply to + the extent applicable law prohibits such limitation. + . + 9. **Acceptance and Termination.** If, at any time, You expressly assented to + this License, that assent indicates your clear and irrevocable acceptance of + this License and all of its terms and conditions. If You distribute or + communicate copies of the Original Work or a Derivative Work, You must make a + reasonable effort under the circumstances to obtain the express assent of + recipients to the terms of this License. This License conditions your rights to + undertake the activities listed in Section 1, including your right to create + Derivative Works based upon the Original Work, and doing so without honoring + these terms and conditions is prohibited by copyright law and international + treaty. Nothing in this License is intended to affect copyright exceptions and + limitations (including 'fair use' or 'fair dealing'). This License shall + terminate immediately and You may no longer exercise any of the rights granted + to You by this License upon your failure to honor the conditions in Section + 1(c). + . + 10. **Termination for Patent Action.** This License shall terminate + automatically and You may no longer exercise any of the rights granted to You + by this License as of the date You commence an action, including a cross-claim + or counterclaim, against Licensor or any licensee alleging that the Original + Work infringes a patent. This termination provision shall not apply for an + action alleging patent infringement by combinations of the Original Work with + other software or hardware. + . + 11. **Jurisdiction, Venue and Governing Law.** Any action or suit relating to + this License may be brought only in the courts of a jurisdiction wherein the + Licensor resides or in which Licensor conducts its primary business, and under + the laws of that jurisdiction excluding its conflict-of-law provisions. The + application of the United Nations Convention on Contracts for the International + Sale of Goods is expressly excluded. Any use of the Original Work outside the + scope of this License or after its termination shall be subject to the + requirements and penalties of copyright or patent law in the appropriate + jurisdiction. This section shall survive the termination of this License. + . + 12. **Attorneys' Fees.** In any action to enforce the terms of this License or + seeking damages relating thereto, the prevailing party shall be entitled to + recover its costs and expenses, including, without limitation, reasonable + attorneys' fees and costs incurred in connection with such action, including + any appeal of such action. This section shall survive the termination of this + License. + . + 13. **Miscellaneous.** If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent necessary to + make it enforceable. + . + 14. **Definition of "You" in This License.** "You" throughout this License, + whether in upper or lower case, means an individual or a legal entity + exercising rights under, and complying with all of the terms of, this License. + For legal entities, "You" includes any entity that controls, is controlled by, + or is under common control with you. For purposes of this definition, "control" + means (i) the power, direct or indirect, to cause the direction or management + of such entity, whether by contract or otherwise, or (ii) ownership of fifty + percent (50%) or more of the outstanding shares, or (iii) beneficial ownership + of such entity. + . + 15. **Right to Use.** You may use the Original Work in all ways not otherwise + restricted or conditioned by this License or by law, and Licensor promises not + to interfere with or be responsible for such uses by You. + . + 16. **Modification of This License.** This License is Copyright © 2021-2022 Electric Coin Company. + Permission is granted to copy, distribute, or communicate this + License without modification. Nothing in this License permits You to modify + this License as applied to the Original Work or to Derivative Works. However, + You may modify the text of this License and copy, distribute or communicate + your modified version (the "Modified License") and apply it to other original + works of authorship subject to the following conditions: (i) You may not + indicate in any way that your Modified License is the "Bootstrap Open Source + Licence" or "BOSL" and you may not use those names in the name of your Modified + License; and (ii) You must replace the notice specified in the first paragraph + above with the notice "Licensed under " or with + a notice of your own that is not confusingly similar to the notice in this + License. + +License: Unicode + UNICODE, INC. LICENSE AGREEMENT - DATA FILES AND SOFTWARE + . + See Terms of Use + for definitions of Unicode Inc.’s Data Files and Software. + . + NOTICE TO USER: Carefully read the following legal agreement. + BY DOWNLOADING, INSTALLING, COPYING OR OTHERWISE USING UNICODE INC.'S + DATA FILES ("DATA FILES"), AND/OR SOFTWARE ("SOFTWARE"), + YOU UNEQUIVOCALLY ACCEPT, AND AGREE TO BE BOUND BY, ALL OF THE + TERMS AND CONDITIONS OF THIS AGREEMENT. + IF YOU DO NOT AGREE, DO NOT DOWNLOAD, INSTALL, COPY, DISTRIBUTE OR USE + THE DATA FILES OR SOFTWARE. + . + COPYRIGHT AND PERMISSION NOTICE + . + Copyright © 1991-2022 Unicode, Inc. All rights reserved. + Distributed under the Terms of Use in https://www.unicode.org/copyright.html. + . + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Unicode data files and any associated documentation + (the "Data Files") or Unicode software and any associated documentation + (the "Software") to deal in the Data Files or Software + without restriction, including without limitation the rights to use, + copy, modify, merge, publish, distribute, and/or sell copies of + the Data Files or Software, and to permit persons to whom the Data Files + or Software are furnished to do so, provided that either + (a) this copyright and permission notice appear with all copies + of the Data Files or Software, or + (b) this copyright and permission notice appear in associated + Documentation. + . + THE DATA FILES AND SOFTWARE ARE PROVIDED "AS IS", WITHOUT WARRANTY OF + ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE + WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + NONINFRINGEMENT OF THIRD PARTY RIGHTS. + IN NO EVENT SHALL THE COPYRIGHT HOLDER OR HOLDERS INCLUDED IN THIS + NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL + DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, + DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER + TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + PERFORMANCE OF THE DATA FILES OR SOFTWARE. + . + Except as contained in this notice, the name of a copyright holder + shall not be used in advertising or otherwise to promote the sale, + use or other dealings in these Data Files or Software without prior + written authorization of the copyright holder. diff --git a/contrib/debian/examples/zcash.conf b/contrib/debian/examples/zcash.conf new file mode 100644 index 000000000..c01332d85 --- /dev/null +++ b/contrib/debian/examples/zcash.conf @@ -0,0 +1,133 @@ +## +## zcash.conf configuration file. Lines beginning with # are comments. +## + +## +## Network-related settings +## + +# Run on the test network instead of the real zcash network. +#testnet=0 + +# Run a regression test network +#regtest=0 + +# Connect via a SOCKS5 proxy +#proxy=127.0.0.1:9050 + +# Bind to given address and always listen on it. Use [host]:port notation for IPv6 +#bind= + +# Bind to given address and whitelist peers connecting to it. Use [host]:port notation for IPv6 +#whitebind= + +############################################################## +## Quick Primer on addnode vs connect ## +## Let's say for instance you use addnode=4.2.2.4 ## +## addnode will connect you to and tell you about the ## +## nodes connected to 4.2.2.4. In addition it will tell ## +## the other nodes connected to it that you exist so ## +## they can connect to you. ## +## connect will not do the above when you 'connect' to it. ## +## It will *only* connect you to 4.2.2.4 and no one else.## +## ## +## So if you're behind a firewall, or have other problems ## +## finding nodes, add some using 'addnode'. ## +## ## +## If you want to stay private, use 'connect' to only ## +## connect to "trusted" nodes. ## +## ## +## If you run multiple nodes on a LAN, there's no need for ## +## all of them to open lots of connections. Instead ## +## 'connect' them all to one node that is port forwarded ## +## and has lots of connections. ## +## Thanks goes to [Noodle] on Freenode. ## +############################################################## + +# Use as many addnode= settings as you like to connect to specific peers +#addnode=69.164.218.197 +#addnode=10.0.0.2:8233 + +# Alternatively use as many connect= settings as you like to connect ONLY to specific peers +#connect=69.164.218.197 +#connect=10.0.0.1:8233 + +# Listening mode, enabled by default except when 'connect' is being used +#listen=1 + +# Maximum number of inbound+outbound connections. +#maxconnections= + +## +## JSON-RPC options (for controlling a running Zcash/zcashd process) +## + +# server=1 tells zcashd to accept JSON-RPC commands (set as default if not specified) +#server=1 + +# Bind to given address to listen for JSON-RPC connections. Use [host]:port notation for IPv6. +# This option can be specified multiple times (default: bind to all interfaces) +#rpcbind= + +# You must set rpcuser and rpcpassword to secure the JSON-RPC api +#rpcuser=Ulysses +#rpcpassword=YourSuperGreatPasswordNumber_DO_NOT_USE_THIS_OR_YOU_WILL_GET_ROBBED_385593 + +# How many seconds zcash will wait for a complete RPC HTTP request. +# after the HTTP connection is established. +#rpcclienttimeout=30 + +# By default, only RPC connections from localhost are allowed. +# Specify as many rpcallowip= settings as you like to allow connections from other hosts, +# either as a single IPv4/IPv6 or with a subnet specification. + +# NOTE: opening up the RPC port to hosts outside your local trusted network is NOT RECOMMENDED, +# because the rpcpassword is transmitted over the network unencrypted and also because anyone +# that can authenticate on the RPC port can steal your keys + take over the account running zcashd +# For more information see https://github.com/zcash/zcash/issues/1497 + +#rpcallowip=10.1.1.34/255.255.255.0 +#rpcallowip=1.2.3.4/24 +#rpcallowip=2001:db8:85a3:0:0:8a2e:370:7334/96 + +# Listen for RPC connections on this TCP port: +#rpcport=8232 + +# You can use zcash-cli to send commands to zcashd running on another host using +# this option: +#rpcconnect=127.0.0.1 + +## +## Transaction creation options for 'z_*' APIs. +## + +# Set the maximum number of Orchard actions permitted in a transaction. +#orchardactionlimit=50 + +## +## Transaction creation options for legacy APIs (sendtoaddress, sendmany, +## and fundrawtransaction). +## + +# The preferred fee rate (in ZEC per 1000 bytes) used for transactions +# created by legacy APIs. If the transaction is less than 1000 bytes then +# the fee rate is applied as though it were 1000 bytes. +#paytxfee= + +## +## Miscellaneous options +## + +# Enable attempt to CPU-mine zcash. This is only useful on testnet. +#gen=0 + +# Set the number of threads to be used for mining zcash (-1 = all cores). +#genproclimit=1 + +# Specify a different Equihash solver (e.g. "tromp") to try to mine zcash +# faster when gen=1. +#equihashsolver=default + +# Pre-generate this many public/private key pairs, so wallet backups will be valid for +# both prior transactions and several dozen future transactions. +#keypool=100 diff --git a/contrib/debian/postinst b/contrib/debian/postinst new file mode 100755 index 000000000..2e6ff8a8d --- /dev/null +++ b/contrib/debian/postinst @@ -0,0 +1,39 @@ +#!/bin/sh +# postinst script for zcash +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `configure' +# * `abort-upgrade' +# * `abort-remove' `in-favour' +# +# * `abort-remove' +# * `abort-deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + configure) + ;; + + abort-upgrade|abort-remove|abort-deconfigure) + ;; + + *) + echo "postinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/contrib/debian/postrm b/contrib/debian/postrm new file mode 100755 index 000000000..bb442a682 --- /dev/null +++ b/contrib/debian/postrm @@ -0,0 +1,37 @@ +#!/bin/sh +# postrm script for zcash +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `purge' +# * `upgrade' +# * `failed-upgrade' +# * `abort-install' +# * `abort-install' +# * `abort-upgrade' +# * `disappear' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + purge|remove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear) + ;; + + *) + echo "postrm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/contrib/debian/preinst b/contrib/debian/preinst new file mode 100755 index 000000000..7587b4a88 --- /dev/null +++ b/contrib/debian/preinst @@ -0,0 +1,35 @@ +#!/bin/sh +# preinst script for zcash +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `install' +# * `install' +# * `upgrade' +# * `abort-upgrade' +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + install|upgrade) + ;; + + abort-upgrade) + ;; + + *) + echo "preinst called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/contrib/debian/prerm b/contrib/debian/prerm new file mode 100755 index 000000000..6a4f8c033 --- /dev/null +++ b/contrib/debian/prerm @@ -0,0 +1,38 @@ +#!/bin/sh +# prerm script for zcash +# +# see: dh_installdeb(1) + +set -e + +# summary of how this script can be called: +# * `remove' +# * `upgrade' +# * `failed-upgrade' +# * `remove' `in-favour' +# * `deconfigure' `in-favour' +# `removing' +# +# for details, see https://www.debian.org/doc/debian-policy/ or +# the debian-policy package + + +case "$1" in + remove|upgrade|deconfigure) + ;; + + failed-upgrade) + ;; + + *) + echo "prerm called with unknown argument \`$1'" >&2 + exit 1 + ;; +esac + +# dh_installdeb will replace this with shell code automatically +# generated by other debhelper scripts. + +#DEBHELPER# + +exit 0 diff --git a/contrib/debian/rules b/contrib/debian/rules new file mode 100755 index 000000000..b79cce595 --- /dev/null +++ b/contrib/debian/rules @@ -0,0 +1,25 @@ +#!/usr/bin/make -f +# See debhelper(7) (uncomment to enable) +# output every command that modifies files on the build system. +#export DH_VERBOSE = 1 + + +# see FEATURE AREAS in dpkg-buildflags(1) +#export DEB_BUILD_MAINT_OPTIONS = hardening=+all + +# see ENVIRONMENT in dpkg-buildflags(1) +# package maintainers to append CFLAGS +#export DEB_CFLAGS_MAINT_APPEND = -Wall -pedantic +# package maintainers to append LDFLAGS +#export DEB_LDFLAGS_MAINT_APPEND = -Wl,--as-needed + + +%: + dh $@ --with autotools_dev + + +# dh_make generated override targets +# This is example for Cmake (See https://bugs.debian.org/641051 ) +#override_dh_auto_configure: +# dh_auto_configure -- # -DCMAKE_LIBRARY_PATH=$(DEB_HOST_MULTIARCH) + diff --git a/contrib/debian/zcash.examples b/contrib/debian/zcash.examples new file mode 100644 index 000000000..924659c02 --- /dev/null +++ b/contrib/debian/zcash.examples @@ -0,0 +1 @@ +DEBIAN/examples/zcash.conf diff --git a/contrib/debian/zcash.install b/contrib/debian/zcash.install new file mode 100644 index 000000000..b39eaeeb3 --- /dev/null +++ b/contrib/debian/zcash.install @@ -0,0 +1,3 @@ +usr/bin/zcashd +usr/bin/zcash-cli +usr/bin/zcash-fetch-params diff --git a/contrib/debian/zcash.manpages b/contrib/debian/zcash.manpages new file mode 100644 index 000000000..a1115f679 --- /dev/null +++ b/contrib/debian/zcash.manpages @@ -0,0 +1,2 @@ +DEBIAN/manpages/zcash-cli.1 +DEBIAN/manpages/zcashd.1 diff --git a/contrib/devtools/README.md b/contrib/devtools/README.md new file mode 100644 index 000000000..e16e6b5b0 --- /dev/null +++ b/contrib/devtools/README.md @@ -0,0 +1,102 @@ +Contents +=========== +This directory contains tools for developers working on this repository. + +github-merge.sh +================== + +A small script to automate merging pull-requests securely and sign them with GPG. + +For example: + + ./github-merge.sh bitcoin/bitcoin 3077 + +(in any git repository) will help you merge pull request #3077 for the +bitcoin/bitcoin repository. + +What it does: +* Fetch master and the pull request. +* Locally construct a merge commit. +* Show the diff that merge results in. +* Ask you to verify the resulting source tree (so you can do a make +check or whatever). +* Ask you whether to GPG sign the merge commit. +* Ask you whether to push the result upstream. + +This means that there are no potential race conditions (where a +pullreq gets updated while you're reviewing it, but before you click +merge), and when using GPG signatures, that even a compromised github +couldn't mess with the sources. + +Setup +--------- +Configuring the github-merge tool for the bitcoin repository is done in the following way: + + git config githubmerge.repository bitcoin/bitcoin + git config githubmerge.testcmd "make -j4 check" (adapt to whatever you want to use for testing) + git config --global user.signingkey mykeyid (if you want to GPG sign) + +fix-copyright-headers.py +=========================== + +Every year newly updated files need to have its copyright headers updated to reflect the current year. +If you run this script from src/ it will automatically update the year on the copyright header for all +.cpp and .h files if these have a git commit from the current year. + +For example a file changed in 2014 (with 2014 being the current year): +```// Copyright (c) 2009-2013 The Bitcoin Core developers``` + +would be changed to: +```// Copyright (c) 2009-2014 The Bitcoin Core developers``` + +symbol-check.py +================== + +A script to check that the (Linux) executables produced by gitian only contain +allowed gcc, glibc and libstdc++ version symbols. This makes sure they are +still compatible with the minimum supported Linux distribution versions. + +Example usage after a gitian build: + + find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py + +If only supported symbols are used the return value will be 0 and the output will be empty. + +If there are 'unsupported' symbols, the return value will be 1 a list like this will be printed: + + .../64/test_bitcoin: symbol memcpy from unsupported version GLIBC_2.14 + .../64/test_bitcoin: symbol __fdelt_chk from unsupported version GLIBC_2.15 + .../64/test_bitcoin: symbol std::out_of_range::~out_of_range() from unsupported version GLIBCXX_3.4.15 + .../64/test_bitcoin: symbol _ZNSt8__detail15_List_nod from unsupported version GLIBCXX_3.4.15 + +update-translations.py +======================= + +Run this script from the root of the repository to update all translations from transifex. +It will do the following automatically: + +- fetch all translations +- post-process them into valid and committable format +- add missing translations to the build system (TODO) + +See doc/translation-process.md for more information. + +gen-manpages.sh +=============== + +A small script to automatically create manpages in ../../doc/man by running the release binaries with the -help option. +This requires help2man which can be found at: https://www.gnu.org/software/help2man/ + +git-subtree-check.sh +==================== + +Run this script from the root of the repository to verify that a subtree matches the contents of +the commit it claims to have been updated to. + +To use, make sure that you have fetched the upstream repository branch in which the subtree is +maintained: +* for src/secp256k1: https://github.com/bitcoin/secp256k1.git (branch master) +* for sec/leveldb: https://github.com/bitcoin/leveldb.git (branch bitcoin-fork) + +Usage: git-subtree-check.sh DIR COMMIT +COMMIT may be omitted, in which case HEAD is used. diff --git a/contrib/devtools/fix-copyright-headers.sh b/contrib/devtools/fix-copyright-headers.sh new file mode 100755 index 000000000..6ff0aa96a --- /dev/null +++ b/contrib/devtools/fix-copyright-headers.sh @@ -0,0 +1,29 @@ +#!/usr/bin/env bash + +current_year=$(date +%Y) + +read -r -d '' VERIFY_SCRIPT << EOS +for party in "The Zcash developers" "The Bitcoin Core developers" "Bitcoin Developers"; do + sed -i"" -e "s#Copyright (c) \([0-9]\{4\}\)\(-[0-9]\{4\}\)\? \$party#Copyright (c) \1-$current_year \$party#" COPYING + sed -i"" -e "s#\(.*\)\([0-9]\{4\}\)\(-[0-9]\{4\}\)\, \$party#\1\2-$current_year, \$party#" contrib/debian/copyright +done + +sed -i"" -e "s/define(_COPYRIGHT_YEAR, [0-9]\{4\})/define(_COPYRIGHT_YEAR, $current_year)/" configure.ac +sed -i"" -e "s/#define COPYRIGHT_YEAR [0-9]\{4\}/#define COPYRIGHT_YEAR $current_year/" src/clientversion.h + +git grep "^// Copyright (c) .* The Zcash developers" \\ + | awk -F ':' '{print \$1}' \\ + | xargs -I {} sed -i"" -e "s#// Copyright (c) \([0-9]\{4\}\)\(-[0-9]\{4\}\)\? The Zcash developers#// Copyright (c) \1-$current_year The Zcash developers#" {} +EOS + +bash << EOB +$VERIFY_SCRIPT +EOB + +git commit -a -F - << EOS +scripted-diff: Update Zcash copyrights to $current_year + +-BEGIN VERIFY SCRIPT- +$VERIFY_SCRIPT +-END VERIFY SCRIPT- +EOS diff --git a/contrib/devtools/gen-manpages.sh b/contrib/devtools/gen-manpages.sh new file mode 100755 index 000000000..607c40181 --- /dev/null +++ b/contrib/devtools/gen-manpages.sh @@ -0,0 +1,40 @@ +#!/usr/bin/env bash + +export LC_ALL=C +TOPDIR=${TOPDIR:-$(git rev-parse --show-toplevel)} +SRCDIR=${SRCDIR:-$TOPDIR/src} +MANDIR=${MANDIR:-$TOPDIR/doc/man} + +ZCASHD=${ZCASHD:-$SRCDIR/zcashd} +ZCASHD_WALLET_TOOL=${ZCASHD_WALLET_TOOL:-$SRCDIR/zcashd-wallet-tool} +ZCASHCLI=${ZCASHCLI:-$SRCDIR/zcash-cli} +ZCASHTX=${ZCASHTX:-$SRCDIR/zcash-tx} + +[ ! -x $ZCASHD ] && echo "$ZCASHD not found or not executable." && exit 1 + +# The autodetected version git tag can screw up manpage output a little bit +read -r -a ZECVERSTR <<< "$($ZCASHCLI --version | head -n1 | awk '{ print $NF }')" +read -r -a ZECVER <<< "$(echo ${ZECVERSTR[0]} | awk -F- '{ OFS="-"; NF--; print $0; }')" +read -r -a ZECCOMMIT <<< "$(echo ${ZECVERSTR[0]} | awk -F- '{ print $NF }')" + +# Create a footer file with copyright content. +# This gets autodetected fine for zcashd if --version-string is not set, +# but has different outcomes for zcash-cli. +echo "[COPYRIGHT]" > footer.h2m +$ZCASHD --version | sed -n '1!p' >> footer.h2m +grep -v "Bitcoin Core Developers" footer.h2m >footer-no-bitcoin-copyright.h2m + +for cmd in $ZCASHD $ZCASHCLI $ZCASHTX; do + cmdname="${cmd##*/}" + help2man -N --version-string=${ZECVER[0]} --include=footer.h2m -o ${MANDIR}/${cmdname}.1 ${cmd} + sed -i "s/\\\-${ZECCOMMIT[0]}//g" ${MANDIR}/${cmdname}.1 +done + +for cmd in $ZCASHD_WALLET_TOOL; do + cmdname="${cmd##*/}" + help2man -N --version-string=${ZECVER[0]} --include=footer-no-bitcoin-copyright.h2m -o ${MANDIR}/${cmdname}.1 ${cmd} + sed -i "s/\\\-${ZECCOMMIT[0]}//g" ${MANDIR}/${cmdname}.1 +done + +rm -f footer.h2m +rm -f footer-no-bitcoin-copyright.h2m diff --git a/contrib/devtools/github-merge.sh b/contrib/devtools/github-merge.sh new file mode 100755 index 000000000..ec7a1f4c4 --- /dev/null +++ b/contrib/devtools/github-merge.sh @@ -0,0 +1,181 @@ +#!/bin/bash + +# This script will locally construct a merge commit for a pull request on a +# github repository, inspect it, sign it and optionally push it. + +# The following temporary branches are created/overwritten and deleted: +# * pull/$PULL/base (the current master we're merging onto) +# * pull/$PULL/head (the current state of the remote pull request) +# * pull/$PULL/merge (github's merge) +# * pull/$PULL/local-merge (our merge) + +# In case of a clean merge that is accepted by the user, the local branch with +# name $BRANCH is overwritten with the merged result, and optionally pushed. + +REPO="$(git config --get githubmerge.repository)" +if [[ "d$REPO" == "d" ]]; then + echo "ERROR: No repository configured. Use this command to set:" >&2 + echo "git config githubmerge.repository /" >&2 + echo "In addition, you can set the following variables:" >&2 + echo "- githubmerge.host (default git@github.com)" >&2 + echo "- githubmerge.branch (default master)" >&2 + echo "- githubmerge.testcmd (default none)" >&2 + exit 1 +fi + +HOST="$(git config --get githubmerge.host)" +if [[ "d$HOST" == "d" ]]; then + HOST="git@github.com" +fi + +BRANCH="$(git config --get githubmerge.branch)" +if [[ "d$BRANCH" == "d" ]]; then + BRANCH="master" +fi + +TESTCMD="$(git config --get githubmerge.testcmd)" + +PULL="$1" + +if [[ "d$PULL" == "d" ]]; then + echo "Usage: $0 pullnumber [branch]" >&2 + exit 2 +fi + +if [[ "d$2" != "d" ]]; then + BRANCH="$2" +fi + +# Initialize source branches. +git checkout -q "$BRANCH" +if git fetch -q "$HOST":"$REPO" "+refs/pull/$PULL/*:refs/heads/pull/$PULL/*"; then + if ! git log -q -1 "refs/heads/pull/$PULL/head" >/dev/null 2>&1; then + echo "ERROR: Cannot find head of pull request #$PULL on $HOST:$REPO." >&2 + exit 3 + fi + if ! git log -q -1 "refs/heads/pull/$PULL/merge" >/dev/null 2>&1; then + echo "ERROR: Cannot find merge of pull request #$PULL on $HOST:$REPO." >&2 + exit 3 + fi +else + echo "ERROR: Cannot find pull request #$PULL on $HOST:$REPO." >&2 + exit 3 +fi +if git fetch -q "$HOST":"$REPO" +refs/heads/"$BRANCH":refs/heads/pull/"$PULL"/base; then + true +else + echo "ERROR: Cannot find branch $BRANCH on $HOST:$REPO." >&2 + exit 3 +fi +git checkout -q pull/"$PULL"/base +git branch -q -D pull/"$PULL"/local-merge 2>/dev/null +git checkout -q -b pull/"$PULL"/local-merge +TMPDIR="$(mktemp -d -t ghmXXXXX)" + +function cleanup() { + git checkout -q "$BRANCH" + git branch -q -D pull/"$PULL"/head 2>/dev/null + git branch -q -D pull/"$PULL"/base 2>/dev/null + git branch -q -D pull/"$PULL"/merge 2>/dev/null + git branch -q -D pull/"$PULL"/local-merge 2>/dev/null + rm -rf "$TMPDIR" +} + +# Create unsigned merge commit. +( + echo "Merge pull request #$PULL" + echo "" + git log --no-merges --topo-order --pretty='format:%h %s (%an)' pull/"$PULL"/base..pull/"$PULL"/head +)>"$TMPDIR/message" +if git merge -q --commit --no-edit --no-ff -m "$(<"$TMPDIR/message")" pull/"$PULL"/head; then + if [ "d$(git log --pretty='format:%s' -n 1)" != "dMerge pull request #$PULL" ]; then + echo "ERROR: Creating merge failed (already merged?)." >&2 + cleanup + exit 4 + fi +else + echo "ERROR: Cannot be merged cleanly." >&2 + git merge --abort + cleanup + exit 4 +fi + +# Run test command if configured. +if [[ "d$TESTCMD" != "d" ]]; then + # Go up to the repository's root. + while [ ! -d .git ]; do cd ..; done + if ! $TESTCMD; then + echo "ERROR: Running $TESTCMD failed." >&2 + cleanup + exit 5 + fi + # Show the created merge. + git diff pull/"$PULL"/merge..pull/"$PULL"/local-merge >"$TMPDIR"/diff + git diff pull/"$PULL"/base..pull/"$PULL"/local-merge + if [[ "$(<"$TMPDIR"/diff)" != "" ]]; then + echo "WARNING: merge differs from github!" >&2 + read -p "Type 'ignore' to continue. " -r >&2 + if [[ "d$REPLY" =~ ^d[iI][gG][nN][oO][rR][eE]$ ]]; then + echo "Difference with github ignored." >&2 + else + cleanup + exit 6 + fi + fi + read -p "Press 'd' to accept the diff. " -n 1 -r >&2 + echo + if [[ "d$REPLY" =~ ^d[dD]$ ]]; then + echo "Diff accepted." >&2 + else + echo "ERROR: Diff rejected." >&2 + cleanup + exit 6 + fi +else + # Verify the result. + echo "Dropping you on a shell so you can try building/testing the merged source." >&2 + echo "Run 'git diff HEAD~' to show the changes being merged." >&2 + echo "Type 'exit' when done." >&2 + if [[ -f /etc/debian_version ]]; then # Show pull number in prompt on Debian default prompt + export debian_chroot="$PULL" + fi + bash -i + read -p "Press 'm' to accept the merge. " -n 1 -r >&2 + echo + if [[ "d$REPLY" =~ ^d[Mm]$ ]]; then + echo "Merge accepted." >&2 + else + echo "ERROR: Merge rejected." >&2 + cleanup + exit 7 + fi +fi + +# Sign the merge commit. +read -p "Press 's' to sign off on the merge. " -n 1 -r >&2 +echo +if [[ "d$REPLY" =~ ^d[Ss]$ ]]; then + if [[ "$(git config --get user.signingkey)" == "" ]]; then + echo "ERROR: No GPG signing key set, not signing. Set one using:" >&2 + echo "git config --global user.signingkey " >&2 + cleanup + exit 1 + else + git commit -q --gpg-sign --amend --no-edit + fi +else + echo "Not signing off on merge, exiting." + cleanup + exit 1 +fi + +# Clean up temporary branches, and put the result in $BRANCH. +git checkout -q "$BRANCH" +git reset -q --hard pull/"$PULL"/local-merge +cleanup + +# Push the result. +read -p "Type 'push' to push the result to $HOST:$REPO, branch $BRANCH. " -r >&2 +if [[ "d$REPLY" =~ ^d[Pp][Uu][Ss][Hh]$ ]]; then + git push "$HOST":"$REPO" refs/heads/"$BRANCH" +fi diff --git a/contrib/devtools/optimize-pngs.py b/contrib/devtools/optimize-pngs.py new file mode 100755 index 000000000..3cfd10d24 --- /dev/null +++ b/contrib/devtools/optimize-pngs.py @@ -0,0 +1,73 @@ +#!/usr/bin/env python3 + +import os +import sys +import subprocess +import hashlib +from PIL import Image + +def file_hash(filename): + '''Return hash of raw file contents''' + with open(filename, 'rb') as f: + return hashlib.sha256(f.read()).hexdigest() + +def content_hash(filename): + '''Return hash of RGBA contents of image''' + i = Image.open(filename) + i = i.convert('RGBA') + data = i.tostring() + return hashlib.sha256(data).hexdigest() + +#optimize png, remove various color profiles, remove ancillary chunks (alla) and text chunks (text) +#pngcrush -brute -ow -rem gAMA -rem cHRM -rem iCCP -rem sRGB -rem alla -rem text + +pngcrush = 'pngcrush' +git = 'git' +folders = ["src/qt/res/movies", "src/qt/res/icons", "src/qt/res/images"] +basePath = subprocess.check_output([git, 'rev-parse', '--show-toplevel']).rstrip('\n') +totalSaveBytes = 0 + +outputArray = [] +for folder in folders: + absFolder=os.path.join(basePath, folder) + for file in os.listdir(absFolder): + extension = os.path.splitext(file)[1] + if extension.lower() == '.png': + print("optimizing "+file+"..."), + file_path = os.path.join(absFolder, file) + fileMetaMap = {'file' : file, 'osize': os.path.getsize(file_path), 'sha256Old' : file_hash(file_path)}; + fileMetaMap['contentHashPre'] = content_hash(file_path) + + pngCrushOutput = "" + try: + pngCrushOutput = subprocess.check_output( + [pngcrush, "-brute", "-ow", "-rem", "gAMA", "-rem", "cHRM", "-rem", "iCCP", "-rem", "sRGB", "-rem", "alla", "-rem", "text", file_path], + stderr=subprocess.STDOUT).rstrip('\n') + except: + print("pngcrush is not installed, aborting...") + sys.exit(0) + + #verify + if "Not a PNG file" in subprocess.check_output([pngcrush, "-n", "-v", file_path], stderr=subprocess.STDOUT): + print("PNG file "+file+" is corrupted after crushing, check out pngcursh version") + sys.exit(1) + + fileMetaMap['sha256New'] = file_hash(file_path) + fileMetaMap['contentHashPost'] = content_hash(file_path) + + if fileMetaMap['contentHashPre'] != fileMetaMap['contentHashPost']: + print("Image contents of PNG file "+file+" before and after crushing don't match") + sys.exit(1) + + fileMetaMap['psize'] = os.path.getsize(file_path) + outputArray.append(fileMetaMap) + print("done\n"), + +print("summary:\n+++++++++++++++++") +for fileDict in outputArray: + oldHash = fileDict['sha256Old'] + newHash = fileDict['sha256New'] + totalSaveBytes += fileDict['osize'] - fileDict['psize'] + print(fileDict['file']+"\n size diff from: "+str(fileDict['osize'])+" to: "+str(fileDict['psize'])+"\n old sha256: "+oldHash+"\n new sha256: "+newHash+"\n") + +print("completed. Total reduction: "+str(totalSaveBytes)+" bytes") diff --git a/contrib/devtools/rust-deps-graph.sh b/contrib/devtools/rust-deps-graph.sh new file mode 100755 index 000000000..7e7804f1c --- /dev/null +++ b/contrib/devtools/rust-deps-graph.sh @@ -0,0 +1,18 @@ +#!/usr/bin/env bash + +export LC_ALL=C + +# default arguments are --no-transitive-deps +ARGS="${*:---no-transitive-deps}" +echo "Using args: $ARGS" + +cargo deps $ARGS | dot \ + -Earrowhead=vee \ + -Gratio=0.45 \ + -Gsize=50 \ + -Nheight=0.8 \ + -Nfillcolor=LavenderBlush \ + -Nstyle=filled \ + -Nfontsize=18 \ + -Nmargin=0.05,0.05 \ + -Tpng > rust-dependency-graph.png diff --git a/contrib/devtools/security-check.py b/contrib/devtools/security-check.py new file mode 100755 index 000000000..ca1a6e0ea --- /dev/null +++ b/contrib/devtools/security-check.py @@ -0,0 +1,224 @@ +#!/usr/bin/env python +''' +Perform basic ELF security checks on a series of executables. +Exit status will be 0 if successful, and the program will be silent. +Otherwise the exit status will be 1 and it will log which executables failed which checks. +Needs `readelf` (for ELF) and `objdump` (for PE). +''' +from __future__ import division,print_function,unicode_literals +import struct +import subprocess +import sys +import os + +READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') +OBJDUMP_CMD = os.getenv('OBJDUMP', '/usr/bin/objdump') +NONFATAL = {'HIGH_ENTROPY_VA'} # checks which are non-fatal for now but only generate a warning + +def check_ELF_PIE(executable): + ''' + Check for position independent executable (PIE), allowing for address space randomization. + ''' + p = subprocess.Popen([READELF_CMD, '-h', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + + ok = False + for line in stdout.split(b'\n'): + line = line.split() + if len(line)>=2 and line[0] == b'Type:' and line[1] == b'DYN': + ok = True + return ok + +def get_ELF_program_headers(executable): + '''Return type and flags for ELF program headers''' + p = subprocess.Popen([READELF_CMD, '-l', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + in_headers = False + count = 0 + headers = [] + for line in stdout.split(b'\n'): + if line.startswith(b'Program Headers:'): + in_headers = True + if line == b'': + in_headers = False + if in_headers: + if count == 1: # header line + ofs_typ = line.find(b'Type') + ofs_offset = line.find(b'Offset') + ofs_flags = line.find(b'Flg') + ofs_align = line.find(b'Align') + if ofs_typ == -1 or ofs_offset == -1 or ofs_flags == -1 or ofs_align == -1: + raise ValueError('Cannot parse elfread -lW output') + elif count > 1: + typ = line[ofs_typ:ofs_offset].rstrip() + flags = line[ofs_flags:ofs_align].rstrip() + headers.append((typ, flags)) + count += 1 + return headers + +def check_ELF_NX(executable): + ''' + Check that no sections are writable and executable (including the stack) + ''' + have_wx = False + have_gnu_stack = False + for (typ, flags) in get_ELF_program_headers(executable): + if typ == b'GNU_STACK': + have_gnu_stack = True + if b'W' in flags and b'E' in flags: # section is both writable and executable + have_wx = True + return have_gnu_stack and not have_wx + +def check_ELF_RELRO(executable): + ''' + Check for read-only relocations. + GNU_RELRO program header must exist + Dynamic section must have BIND_NOW flag + ''' + have_gnu_relro = False + for (typ, flags) in get_ELF_program_headers(executable): + # Note: not checking flags == 'R': here as linkers set the permission differently + # This does not affect security: the permission flags of the GNU_RELRO program header are ignored, the PT_LOAD header determines the effective permissions. + # However, the dynamic linker need to write to this area so these are RW. + # Glibc itself takes care of mprotecting this area R after relocations are finished. + # See also http://permalink.gmane.org/gmane.comp.gnu.binutils/71347 + if typ == b'GNU_RELRO': + have_gnu_relro = True + + have_bindnow = False + p = subprocess.Popen([READELF_CMD, '-d', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + for line in stdout.split(b'\n'): + tokens = line.split() + if len(tokens)>1 and tokens[1] == b'(BIND_NOW)' or (len(tokens)>2 and tokens[1] == b'(FLAGS)' and b'BIND_NOW' in tokens[2:]): + have_bindnow = True + return have_gnu_relro and have_bindnow + +def check_ELF_Canary(executable): + ''' + Check for use of stack canary + ''' + p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + ok = False + for line in stdout.split(b'\n'): + if b'__stack_chk_fail' in line: + ok = True + return ok + +def get_PE_dll_characteristics(executable): + ''' + Get PE DllCharacteristics bits. + Returns a tuple (arch,bits) where arch is 'i386:x86-64' or 'i386' + and bits is the DllCharacteristics value. + ''' + p = subprocess.Popen([OBJDUMP_CMD, '-x', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + arch = '' + bits = 0 + for line in stdout.split('\n'): + tokens = line.split() + if len(tokens)>=2 and tokens[0] == 'architecture:': + arch = tokens[1].rstrip(',') + if len(tokens)>=2 and tokens[0] == 'DllCharacteristics': + bits = int(tokens[1],16) + return (arch,bits) + +IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA = 0x0020 +IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE = 0x0040 +IMAGE_DLL_CHARACTERISTICS_NX_COMPAT = 0x0100 + +def check_PE_DYNAMIC_BASE(executable): + '''PIE: DllCharacteristics bit 0x40 signifies dynamicbase (ASLR)''' + (arch,bits) = get_PE_dll_characteristics(executable) + reqbits = IMAGE_DLL_CHARACTERISTICS_DYNAMIC_BASE + return (bits & reqbits) == reqbits + +# On 64 bit, must support high-entropy 64-bit address space layout randomization in addition to DYNAMIC_BASE +# to have secure ASLR. +def check_PE_HIGH_ENTROPY_VA(executable): + '''PIE: DllCharacteristics bit 0x20 signifies high-entropy ASLR''' + (arch,bits) = get_PE_dll_characteristics(executable) + if arch == 'i386:x86-64': + reqbits = IMAGE_DLL_CHARACTERISTICS_HIGH_ENTROPY_VA + else: # Unnecessary on 32-bit + assert(arch == 'i386') + reqbits = 0 + return (bits & reqbits) == reqbits + +def check_PE_NX(executable): + '''NX: DllCharacteristics bit 0x100 signifies nxcompat (DEP)''' + (arch,bits) = get_PE_dll_characteristics(executable) + return (bits & IMAGE_DLL_CHARACTERISTICS_NX_COMPAT) == IMAGE_DLL_CHARACTERISTICS_NX_COMPAT + +CHECKS = { +'ELF': [ + ('PIE', check_ELF_PIE), + ('NX', check_ELF_NX), + ('RELRO', check_ELF_RELRO), + ('Canary', check_ELF_Canary) +], +'PE': [ + ('DYNAMIC_BASE', check_PE_DYNAMIC_BASE), + ('HIGH_ENTROPY_VA', check_PE_HIGH_ENTROPY_VA), + ('NX', check_PE_NX) +], +'MachO64': [ +] +} + +def identify_executable(executable): + with open(filename, 'rb') as f: + magic = f.read(4) + if magic.startswith(b'MZ'): + return 'PE' + elif magic.startswith(b'\x7fELF'): + return 'ELF' + elif struct.unpack('I', magic)[0] == 0xFEEDFACF: + return 'MachO64' + return None + +if __name__ == '__main__': + args = sys.argv[1:] + allow_no_canary = "--allow-no-canary" in args + files = [arg for arg in args if not arg.startswith("--")] + + retval = 0 + for filename in files: + try: + etype = identify_executable(filename) + if etype is None: + print('%s: unknown format' % filename) + retval = 1 + continue + + failed = [] + warning = [] + for (name, func) in CHECKS[etype]: + if name == "Canary" and allow_no_canary: + continue + if not func(filename): + if name in NONFATAL: + warning.append(name) + else: + failed.append(name) + if failed: + print('%s: failed %s' % (filename, ' '.join(failed))) + retval = 1 + if warning: + print('%s: warning %s' % (filename, ' '.join(warning))) + except IOError: + print('%s: cannot open' % filename) + retval = 1 + exit(retval) + diff --git a/contrib/devtools/split-debug.sh b/contrib/devtools/split-debug.sh new file mode 100755 index 000000000..16fda3005 --- /dev/null +++ b/contrib/devtools/split-debug.sh @@ -0,0 +1,10 @@ +#!/bin/sh + +if [ $# -ne 3 ]; + then echo "usage: $0 " +fi + +/usr/bin/objcopy --enable-deterministic-archives -p --only-keep-debug $1 $3 +/usr/bin/objcopy --enable-deterministic-archives -p --strip-debug $1 $2 +/usr/bin/strip --enable-deterministic-archives -p -s $2 +/usr/bin/objcopy --enable-deterministic-archives -p --add-gnu-debuglink=$3 $2 diff --git a/contrib/devtools/symbol-check.py b/contrib/devtools/symbol-check.py new file mode 100755 index 000000000..006d06b88 --- /dev/null +++ b/contrib/devtools/symbol-check.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python +# Copyright (c) 2014 Wladimir J. van der Laan +# Copyright (c) 2016-2020 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +''' +A script to check that the (Linux) executables produced by gitian only contain +allowed gcc and glibc version symbols. This makes sure they are still compatible +with the minimum supported Linux distribution versions. + +Example usage: + + find ../gitian-builder/build -type f -executable | xargs python contrib/devtools/symbol-check.py +''' +from __future__ import division, print_function +import subprocess +import re +import sys +import os + +# Ubuntu 20.04 LTS (Focal Fossa; End of Support April 2025) has: +# +# - g++ version 9.3.0 (https://packages.ubuntu.com/search?suite=all&searchon=names&keywords=g%2B%2B) +# - libc6 version 2.31 (https://packages.ubuntu.com/search?suite=all&searchon=names&keywords=libc6) +# +# Debian 10 (Buster; LTS EOL June 2024) has: +# +# - g++ version 8.3.0 (https://packages.debian.org/search?suite=default§ion=all&arch=any&searchon=names&keywords=g%2B%2B) +# - libc6 version 2.28 (https://packages.debian.org/search?suite=default§ion=all&arch=any&searchon=names&keywords=libc6) +# +# RedHat Enterprise Linux 8 (EOL: long and complicated) is based on Fedora 28 (EOL 2019-05-28) and uses the same base packages: +# +# - g++ version 8.0.1 (https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/28/Everything/x86_64/os/Packages/g/ search for gcc-) +# - libc6 version 2.27 (https://archives.fedoraproject.org/pub/archive/fedora/linux/releases/28/Everything/x86_64/os/Packages/g/ search for glibc) +# +# Fedora 31 (EOL ~November 2020) has: +# +# - g++ version 9.2.1 (https://dl.fedoraproject.org/pub/fedora/linux/releases/31/Everything/x86_64/os/Packages/g/ search for gcc-) +# - libc6 version 2.30 (https://dl.fedoraproject.org/pub/fedora/linux/releases/31/Everything/x86_64/os/Packages/g/ search for glibc) +# +# Arch is a rolling release, and as of October 2020 has packages for: +# +# - g++ version 8.4.0 / 9.3.0 / 10.2.0 (https://www.archlinux.org/packages/?q=gcc) +# - libc6 version 2.32 (https://www.archlinux.org/packages/?q=glibc) +# +# We take the minimum of these as our target. In practice, if we build on Buster without +# upgrading GCC or libc, then we should get a binary that works for all these systems, and +# later ones. +# +# According to the GNU ABI document (https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html) this corresponds to: +# GCC 8.0.0: GCC_8.0.0, GLIBCXX_3.4.24, CXXABI_1.3.11 +# libc6: GLIBC_2_27 + +# We statically link libc++ and libc++abi in our builds. Set this to allow dynamic linking to libstdc++. +ALLOW_DYNAMIC_LIBSTDCXX = False + +MAX_VERSIONS = { + 'GCC': (8,0,0), + 'GLIBC': (2,27), +} +if ALLOW_DYNAMIC_LIBSTDCXX: + MAX_VERSIONS.update({ + 'GLIBCXX': (3,4,14), + 'CXXABI': (1,3,4), + }) + +# See here for a description of _IO_stdin_used: +# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=634261#109 + +# Ignore symbols that are exported as part of every executable +IGNORE_EXPORTS = { + '_edata', '_end', '_init', '__bss_start', '_fini', '_IO_stdin_used' +} +READELF_CMD = os.getenv('READELF', '/usr/bin/readelf') +CPPFILT_CMD = os.getenv('CPPFILT', '/usr/bin/c++filt') + +# Allowed NEEDED libraries +ALLOWED_LIBRARIES = { + # zcashd + 'libgcc_s.so.1', # GCC support library (also used by clang) + 'libc.so.6', # C library + 'libpthread.so.0', # threading + 'libanl.so.1', # DNS resolver + 'libm.so.6', # math library + 'librt.so.1', # real-time (POSIX compatibility) + 'ld-linux-x86-64.so.2', # 64-bit dynamic linker + 'ld-linux.so.2', # 32-bit dynamic linker + 'libdl.so.2' # programming interface to dynamic linker +} +if ALLOW_DYNAMIC_LIBSTDCXX: + ALLOWED_LIBRARIES.add('libstdc++.so.6') # C++ standard library + + +class CPPFilt(object): + ''' + Demangle C++ symbol names. + + Use a pipe to the 'c++filt' command. + ''' + def __init__(self): + self.proc = subprocess.Popen(CPPFILT_CMD, stdin=subprocess.PIPE, stdout=subprocess.PIPE) + + def __call__(self, mangled): + self.proc.stdin.write(mangled + '\n') + return self.proc.stdout.readline().rstrip() + + def close(self): + self.proc.stdin.close() + self.proc.stdout.close() + self.proc.wait() + +def read_symbols(executable, imports=True): + ''' + Parse an ELF executable and return a list of (symbol,version) tuples + for dynamic, imported symbols. + ''' + p = subprocess.Popen([READELF_CMD, '--dyn-syms', '-W', executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Could not read symbols for %s: %s' % (executable, stderr.strip())) + syms = [] + for line in stdout.split('\n'): + line = line.split() + if len(line)>7 and re.match('[0-9]+:$', line[0]): + (sym, _, version) = line[7].partition('@') + is_import = line[6] == 'UND' + if version.startswith('@'): + version = version[1:] + if is_import == imports: + syms.append((sym, version)) + return syms + +def check_version(max_versions, version): + if '_' in version: + (lib, _, ver) = version.rpartition('_') + else: + lib = version + ver = '0' + ver = tuple([int(x) for x in ver.split('.')]) + if not lib in max_versions: + return False + return ver <= max_versions[lib] + +def read_libraries(filename): + p = subprocess.Popen([READELF_CMD, '-d', '-W', filename], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE) + (stdout, stderr) = p.communicate() + if p.returncode: + raise IOError('Error opening file') + libraries = [] + for line in stdout.split('\n'): + tokens = line.split() + if len(tokens)>2 and tokens[1] == '(NEEDED)': + match = re.match('^Shared library: \[(.*)\]$', ' '.join(tokens[2:])) + if match: + libraries.append(match.group(1)) + else: + raise ValueError('Unparseable (NEEDED) specification') + return libraries + +if __name__ == '__main__': + cppfilt = CPPFilt() + retval = 0 + for filename in sys.argv[1:]: + print("Checking %s..." % (filename,)) + # Check imported symbols + for sym,version in read_symbols(filename, True): + if version and not check_version(MAX_VERSIONS, version): + print('%s: symbol %s from unsupported version %s' % (filename, cppfilt(sym), version)) + retval = 1 + # Check exported symbols + for sym,version in read_symbols(filename, False): + if sym in IGNORE_EXPORTS: + continue + print('%s: export of symbol %s not allowed' % (filename, cppfilt(sym))) + retval = 1 + # Check dependency libraries + for library_name in read_libraries(filename): + if library_name not in ALLOWED_LIBRARIES: + print('%s: NEEDED library %s is not allowed' % (filename, library_name)) + retval = 1 + print() + + if retval == 0: + print("Everything OK") + else: + print("Note: this script is intended to ensure that Gitian builds meet our compatibility policy.") + print("The above warnings do not necessarily mean the program(s) will not work on your system.") + + exit(retval) diff --git a/contrib/devtools/test-security-check.py b/contrib/devtools/test-security-check.py new file mode 100755 index 000000000..b16d9aee3 --- /dev/null +++ b/contrib/devtools/test-security-check.py @@ -0,0 +1,62 @@ +#!/usr/bin/env python3 +# Copyright (c) 2015-2017 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +''' +Test script for security-check.py +''' +import subprocess +import sys +import unittest + +def write_testcode(filename): + with open(filename, 'w', encoding="utf8") as f: + f.write(''' + #include + int main() + { + printf("the quick brown fox jumps over the lazy god\\n"); + return 0; + } + ''') + +def call_security_check(cc, source, executable, options): + subprocess.check_call([cc,source,'-o',executable] + options) + p = subprocess.Popen(['./security-check.py',executable], stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE, universal_newlines=True) + (stdout, stderr) = p.communicate() + return (p.returncode, stdout.rstrip()) + +class TestSecurityChecks(unittest.TestCase): + def test_ELF(self): + source = 'test1.c' + executable = 'test1' + cc = 'gcc' + write_testcode(source) + + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-zexecstack','-fno-stack-protector','-Wl,-znorelro']), + (1, executable+': failed PIE NX RELRO Canary')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fno-stack-protector','-Wl,-znorelro']), + (1, executable+': failed PIE RELRO Canary')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro']), + (1, executable+': failed PIE RELRO')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-znorelro','-pie','-fPIE']), + (1, executable+': failed RELRO')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,-znoexecstack','-fstack-protector-all','-Wl,-zrelro','-Wl,-z,now','-pie','-fPIE']), + (0, '')) + + def test_PE(self): + source = 'test1.c' + executable = 'test1.exe' + cc = 'i686-w64-mingw32-gcc' + write_testcode(source) + + self.assertEqual(call_security_check(cc, source, executable, []), + (1, executable+': failed PIE NX')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat']), + (1, executable+': failed PIE')) + self.assertEqual(call_security_check(cc, source, executable, ['-Wl,--nxcompat','-Wl,--dynamicbase']), + (0, '')) + +if __name__ == '__main__': + unittest.main() + diff --git a/contrib/devtools/update-clang-hashes.sh b/contrib/devtools/update-clang-hashes.sh new file mode 100755 index 000000000..cf682392f --- /dev/null +++ b/contrib/devtools/update-clang-hashes.sh @@ -0,0 +1,47 @@ +#!/usr/bin/env bash + +export LC_ALL=C +set -o pipefail + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +CLANG_PACKAGE="$SCRIPT_DIR/../../depends/packages/native_clang.mk" +LIBCXX_PACKAGE="$SCRIPT_DIR/../../depends/packages/libcxx.mk" + +CLANG_VERSION=$( grep -v _major_version $CLANG_PACKAGE | grep -oP "_version=\K.*" ) +LIBCXX_MSYS2_VERSION=$( grep -oP "_msys2_version=\K.*" $LIBCXX_PACKAGE ) + +update_clang_hash() { + url="https://github.com/llvm/llvm-project/releases/download/llvmorg-$CLANG_VERSION/clang+llvm-$CLANG_VERSION-$1.tar.xz" + echo "Fetching $url" + hash=$( curl -fL $url | sha256sum | awk '{print $1}' ) + retVal=$? + if [ $retVal -ne 0 ]; then + if [ $retVal -eq 22 ]; then + echo + echo "The LLVM project has not published a $CLANG_VERSION build for $1." + echo "You will need to manually fix the Makefile to use a different version." + echo + fi + else + sed -i "/\$(package)_sha256_hash_$2=/c\\\$(package)_sha256_hash_$2=$hash" $CLANG_PACKAGE + sed -i "/\$(package)_sha256_hash_$2=/c\\\$(package)_sha256_hash_$2=$hash" $LIBCXX_PACKAGE + fi +} + +update_libcxx_msys2_hash() { + url="https://repo.msys2.org/mingw/x86_64/mingw-w64-x86_64-$1-$LIBCXX_MSYS2_VERSION-any.pkg.tar.zst" + echo "Fetching $url" + hash=$( curl -fL $url | sha256sum | awk '{print $1}' ) + sed -i "/\$(package)_$2=/c\\\$(package)_$2=$hash" $LIBCXX_PACKAGE +} + +# For native targets +# update_clang_hash CLANG_COMPILED_TARGET MAKEFILE_PACKAGE_IDENTIFIER +update_clang_hash aarch64-linux-gnu aarch64_linux +update_clang_hash x86_64-apple-darwin darwin +update_clang_hash x86_64-linux-gnu-ubuntu-18.04 linux +update_clang_hash amd64-unknown-freebsd12 freebsd + +# For Windows cross-compilation +# update_libcxx_msys2_hash LIBCXX_LIBRARY MAKEFILE_HASH_SUFFIX +update_libcxx_msys2_hash libc++ sha256_hash diff --git a/contrib/devtools/update-rust-hashes.sh b/contrib/devtools/update-rust-hashes.sh new file mode 100755 index 000000000..2073439ff --- /dev/null +++ b/contrib/devtools/update-rust-hashes.sh @@ -0,0 +1,37 @@ +#!/usr/bin/env bash + +export LC_ALL=C + +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) +RUST_PACKAGE="$SCRIPT_DIR/../../depends/packages/native_rust.mk" + +RUST_VERSION=$( grep -oP "_version=\K.*" $RUST_PACKAGE ) + +update_hash() { + url="https://static.rust-lang.org/dist/$1-$RUST_VERSION-$2.tar.gz" + echo "Fetching $url" + hash=$( curl $url | sha256sum | awk '{print $1}' ) + sed -i "/\$(package)_$3_$4=/c\\\$(package)_$3_$4=$hash" $RUST_PACKAGE +} + +update_rust_hash() { + update_hash rust $1 sha256_hash $2 +} + +update_stdlib_hash() { + update_hash rust-std $1 rust_std_sha256_hash $1 +} + +# For native targets +# update_rust_hash RUST_TARGET MAKEFILE_PACKAGE_IDENTIFIER +update_rust_hash aarch64-unknown-linux-gnu aarch64_linux +update_rust_hash x86_64-apple-darwin darwin +update_rust_hash x86_64-unknown-linux-gnu linux +update_rust_hash x86_64-unknown-freebsd freebsd + +# For cross-compilation targets +# update_stdlib_hash RUST_TARGET +update_stdlib_hash aarch64-unknown-linux-gnu +update_stdlib_hash x86_64-apple-darwin +update_stdlib_hash x86_64-pc-windows-gnu +update_stdlib_hash x86_64-unknown-freebsd diff --git a/contrib/docker/.dockerignore b/contrib/docker/.dockerignore new file mode 100644 index 000000000..4e5cdf953 --- /dev/null +++ b/contrib/docker/.dockerignore @@ -0,0 +1,2 @@ +./zcash-data-dir/ +./zcash-params-dir/ diff --git a/contrib/docker/.env.example b/contrib/docker/.env.example new file mode 100644 index 000000000..52321b17e --- /dev/null +++ b/contrib/docker/.env.example @@ -0,0 +1,12 @@ +ZCASHD_NETWORK=testnet +ZCASHD_LOGIPS=1 +ZCASHD_EXPERIMENTALFEATURES=1 +ZCASHD_GEN=0 +ZCASHD_RPCUSER=zcashrpc +ZCASHD_RPCPASSWORD=notsecure +ZCASHD_RPCBIND=0.0.0.0 +ZCASHD_ALLOWIP=0.0.0.0/0 +ZCASHD_TXINDEX=1 +ZCASHD_INSIGHTEXPLORER=1 +ZCASHD_ZMQPORT=9994 +ZCASHD_ZMQBIND=0.0.0.0 diff --git a/contrib/docker/.gitignore b/contrib/docker/.gitignore new file mode 100644 index 000000000..6c33f2d41 --- /dev/null +++ b/contrib/docker/.gitignore @@ -0,0 +1,3 @@ +./zcash-data-dir/ +./zcash-params-dir/ +.env diff --git a/contrib/docker/Dockerfile b/contrib/docker/Dockerfile new file mode 100644 index 000000000..1062a87a0 --- /dev/null +++ b/contrib/docker/Dockerfile @@ -0,0 +1,37 @@ +FROM debian:11 + +RUN apt-get update \ + && apt-get install -y gnupg2 apt-transport-https curl + +ARG ZCASH_SIGNING_KEY_ID=6DEF3BAF272766C0 + +ARG ZCASH_VERSION= +# The empty string for ZCASH_VERSION will install the apt default version, +# which should be the latest stable release. To install a specific +# version, pass `--build-arg 'ZCASH_VERSION='` to `docker build`. + +ARG ZCASHD_USER=zcashd +ARG ZCASHD_UID=2001 + +RUN apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys $ZCASH_SIGNING_KEY_ID \ + && echo "deb [arch=amd64] https://apt.z.cash/ bullseye main" > /etc/apt/sources.list.d/zcash.list \ + && apt-get update + +RUN if [ -z "$ZCASH_VERSION" ]; \ + then apt-get install -y zcash; \ + else apt-get install -y zcash=$ZCASH_VERSION; \ + fi; \ + zcashd --version + +RUN useradd --home-dir /srv/$ZCASHD_USER \ + --shell /bin/bash \ + --create-home \ + --uid $ZCASHD_UID\ + $ZCASHD_USER +USER $ZCASHD_USER +WORKDIR /srv/$ZCASHD_USER +RUN mkdir -p /srv/$ZCASHD_USER/.zcash/ \ + && touch /srv/$ZCASHD_USER/.zcash/zcash.conf + +ADD entrypoint.sh /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] diff --git a/contrib/docker/README.md b/contrib/docker/README.md new file mode 100644 index 000000000..69f5b7e9d --- /dev/null +++ b/contrib/docker/README.md @@ -0,0 +1,87 @@ +# zcash Dockerfile + +This is an example Dockerfile to run the zcashd daemon in a containerized Debian base OS. The image pulls the apt package built by Electric Coin Company. + +The output of building this image should be accessible at https://hub.docker.com/r/electriccoinco/zcashd + +## Defaults + +The image will run as a non-root user, `zcashd` with uid `2001`. When mapping volumes from the host into the container, these permissions must be used, or rebuild the image with your custom values. + +## Run time configuration + +The goal is to follow the default zcashd startup behavior as closely as possible. + +At startup, the image will execute the [./entrypoint.sh](./entrypoint.sh) script. This script uses environmental variables to configure the command line parameters, do a little house cleaning, and start zcashd. + +### Available environment variables + +If defined, the value is assigned to the value of the corresponding flag. + +``` +ZCASHD_NETWORK +ZCASHD_LOGIPS +ZCASHD_EXPERIMENTALFEATURES +ZCASHD_GEN +ZCASHD_ZSHIELDCOINBASE +ZCASHD_RPCUSER +ZCASHD_RPCPASSWORD +ZCASHD_RPCBIND +ZCASHD_ALLOWIP +ZCASHD_TXINDEX +ZCASHD_INSIGHTEXPLORER +ZCASHD_ZMQPORT +ZCASHD_ZMQBIND +``` + +### Additional configuration + +Any provided command line parameters are passed from the entrypoint.sh script to zcashd. + +You can skip using environmental variables at all, and instead provide a fully configured `zcash.conf` file and map to `/srv/zcashd/.zcash/zcash.conf` at startup. + +## Examples + +### See the installed version + +This command will create a container, print the version information of the zcashd software installed and then exit and remove the container. + +Run +``` +docker run --rm electriccoinco/zcashd --version +``` + +Output +``` +Zcash Daemon version v2.1.0-1 + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + +Copyright (C) 2009-2019 The Bitcoin Core Developers +Copyright (C) 2015-2019 The Zcash Developers + +This is experimental software. + +Distributed under the MIT software license, see the accompanying file COPYING +or . +``` + +### Persist data to the host + +For this example, we'll create a place for zcashd to store the blockchain data, create a new container that uses that location, and run it in the background. + +``` +mkdir {./zcash-params-dir,./zcash-data-dir} +sudo chown -R 2001.2001 {./zcash-params-dir,./zcash-data-dir} +docker run -d --name my_zcashd \ + -v $(pwd)/zcash-data-dir:/srv/zcashd/.zcash \ + -v $(pwd)/zcash-params-dir:/srv/zcashd/.zcash-params \ + electriccoinco/zcashd +``` + +Follow the logs to see its activity. + +``` +docker logs -f my_zcashd +``` diff --git a/contrib/docker/docker-compose.yml b/contrib/docker/docker-compose.yml new file mode 100644 index 000000000..7d0bf5fee --- /dev/null +++ b/contrib/docker/docker-compose.yml @@ -0,0 +1,11 @@ +--- +version: '3' + +services: + zcashd: + build: . + env_file: + - .env + volumes: + - ./zcash-params-dir:/srv/zcashd/.zcash-params + - ./zcash-data-dir:/srv/zcashd/.zcash diff --git a/contrib/docker/entrypoint.sh b/contrib/docker/entrypoint.sh new file mode 100755 index 000000000..8e7d0b829 --- /dev/null +++ b/contrib/docker/entrypoint.sh @@ -0,0 +1,58 @@ +#!/usr/bin/env bash + +export LC_ALL=C +set -eo pipefail + +if [[ ${1} == "--version" ]];then + zcashd --version + exit 0 +fi + +env | sort | grep ZCASHD || true +export ZCASHD_CMD=('zcashd' '-printtoconsole') + +if [[ -z ${ZCASHD_NETWORK} ]];then + export ZCASHD_NETWORK=mainnet +fi + +case ${ZCASHD_NETWORK} in + testnet) + ZCASHD_CMD+=("-testnet" "-addnode=testnet.z.cash") + ;; + mainnet) + ZCASHD_CMD+=("-addnode=mainnet.z.cash") + ;; + *) + echo "Error, unknown network: ${ZCASHD_NETWORK}" + exit 1 + ;; +esac + +if [[ -n "${ZCASHD_SHOWMETRICS}" ]];then ZCASHD_CMD+=("-showmetrics=${ZCASHD_SHOWMETRICS}");fi +if [[ -n "${ZCASHD_LOGIPS}" ]];then ZCASHD_CMD+=("-logips=${ZCASHD_LOGIPS}");fi +if [[ -n "${ZCASHD_EXPERIMENTALFEATURES}" ]];then ZCASHD_CMD+=("-experimentalfeatures=${ZCASHD_EXPERIMENTALFEATURES}");fi +if [[ -n "${ZCASHD_GEN}" ]];then ZCASHD_CMD+=("-gen=${ZCASHD_GEN}");fi +if [[ -n "${ZCASHD_EQUIHASHSOLVER}" ]];then ZCASHD_CMD+=("-equihashsolver=${ZCASHD_EQUIHASHSOLVER}");fi +if [[ -n "${ZCASHD_GENPROCLIMIT}" ]];then ZCASHD_CMD+=("-genproclimit=${ZCASHD_GENPROCLIMIT}");fi +if [[ -n "${ZCASHD_ZSHIELDCOINBASE}" ]];then ZCASHD_CMD+=("-zshieldcoinbase=${ZCASHD_ZSHIELDCOINBASE}");fi +if [[ -n "${ZCASHD_RPCUSER}" ]];then ZCASHD_CMD+=("-rpcuser=${ZCASHD_RPCUSER}");fi +if [[ -n "${ZCASHD_RPCPASSWORD}" ]];then ZCASHD_CMD+=("-rpcpassword=${ZCASHD_RPCPASSWORD}");fi +if [[ -n "${ZCASHD_RPCBIND}" ]];then ZCASHD_CMD+=("-rpcbind=${ZCASHD_RPCBIND}");fi +if [[ -n "${ZCASHD_RPCPORT}" ]];then ZCASHD_CMD+=("-rpcport=${ZCASHD_RPCPORT}");fi +if [[ -n "${ZCASHD_ALLOWIP}" ]];then ZCASHD_CMD+=("-rpcallowip=${ZCASHD_ALLOWIP}");fi +if [[ -n "${ZCASHD_TXINDEX}" ]];then ZCASHD_CMD+=("-txindex");fi +if [[ -n "${ZCASHD_INSIGHTEXPLORER}" ]];then ZCASHD_CMD+=("-insightexplorer");fi +if [[ -n "${ZCASHD_PROMETHEUSPORT}" ]];then ZCASHD_CMD+=("-prometheusport=${ZCASHD_PROMETHEUSPORT}");fi +if [[ -n "${ZCASHD_METRICSIP}" ]];then ZCASHD_CMD+=("-metricsallowip=${ZCASHD_METRICSIP}");fi +if [[ -n "${ZCASHD_ZMQPORT}" && -n "${ZCASHD_ZMQBIND}" ]];then + ZCASHD_CMD+=("-zmqpubhashblock=tcp://${ZCASHD_ZMQBIND}:${ZCASHD_ZMQPORT}" \ + "-zmqpubhashtx=tcp://${ZCASHD_ZMQBIND}:${ZCASHD_ZMQPORT}" \ + "-zmqpubrawblock=tcp://${ZCASHD_ZMQBIND}:${ZCASHD_ZMQPORT}" \ + "-zmqpubrawtx=tcp://${ZCASHD_ZMQBIND}:${ZCASHD_ZMQPORT}" \ + "-zmqpubhashblock=tcp://${ZCASHD_ZMQBIND}:${ZCASHD_ZMQPORT}") +fi + +zcash-fetch-params +touch .zcash/zcash.conf +echo "Starting: ${ZCASHD_CMD[*]}" +exec "${ZCASHD_CMD[@]}" "${@}" diff --git a/contrib/gitian-descriptors/README.md b/contrib/gitian-descriptors/README.md new file mode 100644 index 000000000..8ca2347e0 --- /dev/null +++ b/contrib/gitian-descriptors/README.md @@ -0,0 +1,65 @@ +### Gavin's notes on getting gitian builds up and running using KVM + +These instructions distilled from +[https://help.ubuntu.com/community/KVM/Installation](https://help.ubuntu.com/community/KVM/Installation). + +You need the right hardware: you need a 64-bit-capable CPU with hardware virtualization support (Intel VT-x or AMD-V). Not all modern CPUs support hardware virtualization. + +You probably need to enable hardware virtualization in your machine's BIOS. + +You need to be running a recent version of 64-bit-Ubuntu, and you need to install several prerequisites: + + sudo apt-get install ruby apache2 git apt-cacher-ng python-vm-builder qemu-kvm + +Sanity checks: + + sudo service apt-cacher-ng status # Should return apt-cacher-ng is running + ls -l /dev/kvm # Should show a /dev/kvm device + + +Once you've got the right hardware and software: + + git clone git://github.com/bitcoin/bitcoin.git + git clone git://github.com/devrandom/gitian-builder.git + mkdir gitian-builder/inputs + cd gitian-builder/inputs + + # Create base images + cd gitian-builder + bin/make-base-vm --suite trusty --arch amd64 + cd .. + + # Get inputs (see doc/release-process.md for exact inputs needed and where to get them) + ... + + # For further build instructions see doc/release-process.md + ... + +--------------------- + +`gitian-builder` now also supports building using LXC. See +[help.ubuntu.com](https://ubuntu.com/server/docs/containers-lxc) +for how to get LXC up and running under Ubuntu. + +If your main machine is a 64-bit Mac or PC with a few gigabytes of memory +and at least 10 gigabytes of free disk space, you can `gitian-build` using +LXC running inside a virtual machine. + +Here's a description of Gavin's setup on OSX 10.6: + +1. Download and install VirtualBox from [https://www.virtualbox.org/](https://www.virtualbox.org/) + +2. Download the 64-bit Ubuntu Desktop 12.04 LTS .iso CD image from + [https://ubuntu.com/](https://ubuntu.com) + +3. Run VirtualBox and create a new virtual machine, using the Ubuntu .iso (see the [VirtualBox documentation](https://www.virtualbox.org/wiki/Documentation) for details). Create it with at least 2 gigabytes of memory and a disk that is at least 20 gigabytes big. + +4. Inside the running Ubuntu desktop, install: + + sudo apt-get install debootstrap lxc ruby apache2 git apt-cacher-ng python-vm-builder + +5. Still inside Ubuntu, tell gitian-builder to use LXC, then follow the "Once you've got the right hardware and software" instructions above: + + export USE_LXC=1 + git clone git://github.com/bitcoin/bitcoin.git + ... etc diff --git a/contrib/gitian-descriptors/gitian-linux-parallel.yml b/contrib/gitian-descriptors/gitian-linux-parallel.yml new file mode 100644 index 000000000..d6ba82a95 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-linux-parallel.yml @@ -0,0 +1,142 @@ +--- +name: "zcash-5.6.1" +enable_cache: true +distro: "debian" +suites: +- "buster" +- "bullseye" +architectures: +- "amd64" +packages: +- "curl" +- "autoconf" +- "automake" +- "bsdmainutils" +- "binutils-gold" +- "ca-certificates" +- "faketime" +- "g++-multilib" +- "git-core" +- "libc6-dev" +- "libtinfo5" +- "libtool" +- "libxml2" +- "m4" +- "ncurses-dev" +- "pkg-config" +- "python" +- "unzip" +- "wget" +- "zlib1g-dev" +remotes: +- "url": "https://github.com/zcash/zcash.git" + "dir": "zcash" +files: [] +script: | + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-linux-gnu" + CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --enable-hardening --enable-werror" + MAKEOPTS="V=1 -j$(nproc)" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="date ar ranlib nm strip objcopy" + HOST_CFLAGS="" + HOST_CXXFLAGS="" + HOST_LDFLAGS=-static-libstdc++ + + export QT_RCC_TEST=0 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR="$PWD" + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + function create_global_faketime_wrappers { + for prog in ${FAKETIME_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + } + + function create_per-host_faketime_wrappers { + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + export PATH=${WRAP_DIR}:${PATH} + + # Faketime for depends so intermediate results are comparable + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + + cd zcash + BASEPREFIX="${PWD}/depends" + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Faketime for binaries + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + CONFIG_SITE=${BASEPREFIX}/$(echo "${HOSTS}" | awk '{print $1;}')/share/config.site ./configure --prefix=/ + make dist + SOURCEDIST=$(echo zcash-*.tar.gz) + DISTNAME=${SOURCEDIST/%.tar.gz} + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find zcash* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH="${PWD}/installed/${DISTNAME}" + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + 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 + make install DESTDIR=${INSTALLPATH} + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find ${DISTNAME}/bin -type f -executable -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; + # Commented out while we don't build any libraries + #find ${DISTNAME}/lib -type f -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; + find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz + cd ../../ + rm -rf distsrc-${i} + done + mkdir -p $OUTDIR/src + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.tar.gz ${OUTDIR}/${DISTNAME}-linux64-debug.tar.gz + mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-linux64.tar.gz diff --git a/contrib/gitian-descriptors/gitian-linux.yml b/contrib/gitian-descriptors/gitian-linux.yml new file mode 100644 index 000000000..8fcc67965 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-linux.yml @@ -0,0 +1,142 @@ +--- +name: "zcash-5.6.1" +enable_cache: true +distro: "debian" +suites: +- "buster" +- "bullseye" +architectures: +- "amd64" +packages: +- "curl" +- "autoconf" +- "automake" +- "bsdmainutils" +- "binutils-gold" +- "ca-certificates" +- "faketime" +- "g++-multilib" +- "git-core" +- "libc6-dev" +- "libtinfo5" +- "libtool" +- "libxml2" +- "m4" +- "ncurses-dev" +- "pkg-config" +- "python" +- "unzip" +- "wget" +- "zlib1g-dev" +remotes: +- "url": "https://github.com/zcash/zcash.git" + "dir": "zcash" +files: [] +script: | + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-linux-gnu" + CONFIGFLAGS="--enable-glibc-back-compat --enable-reduce-exports --disable-bench --enable-hardening --enable-werror" + MAKEOPTS="V=1" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="date ar ranlib nm strip objcopy" + HOST_CFLAGS="" + HOST_CXXFLAGS="" + HOST_LDFLAGS=-static-libstdc++ + + export QT_RCC_TEST=0 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR="$PWD" + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + function create_global_faketime_wrappers { + for prog in ${FAKETIME_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + } + + function create_per-host_faketime_wrappers { + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + export PATH=${WRAP_DIR}:${PATH} + + # Faketime for depends so intermediate results are comparable + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + + cd zcash + BASEPREFIX="${PWD}/depends" + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Faketime for binaries + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + CONFIG_SITE=${BASEPREFIX}/$(echo "${HOSTS}" | awk '{print $1;}')/share/config.site ./configure --prefix=/ + make dist + SOURCEDIST=$(echo zcash-*.tar.gz) + DISTNAME=${SOURCEDIST/%.tar.gz} + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find zcash* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH="${PWD}/installed/${DISTNAME}" + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + 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 + make install DESTDIR=${INSTALLPATH} + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find ${DISTNAME}/bin -type f -executable -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; + # Commented out while we don't build any libraries + #find ${DISTNAME}/lib -type f -exec objcopy --only-keep-debug {} {}.dbg \; -exec strip -s {} \; -exec objcopy --add-gnu-debuglink={}.dbg {} \; + find ${DISTNAME} -not -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + find ${DISTNAME} -name "*.dbg" | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}-debug.tar.gz + cd ../../ + rm -rf distsrc-${i} + done + mkdir -p $OUTDIR/src + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*-debug.tar.gz ${OUTDIR}/${DISTNAME}-linux64-debug.tar.gz + mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-linux64.tar.gz diff --git a/contrib/gitian-descriptors/gitian-osx-signer.yml b/contrib/gitian-descriptors/gitian-osx-signer.yml new file mode 100644 index 000000000..4c2a2dd83 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-osx-signer.yml @@ -0,0 +1,37 @@ +--- +name: "bitcoin-dmg-signer" +suites: +- "trusty" +architectures: +- "amd64" +packages: +- "libc6:i386" +- "faketime" +remotes: +- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git" + "dir": "signature" +files: +- "bitcoin-osx-unsigned.tar.gz" +script: | + WRAP_DIR=$HOME/wrapped + mkdir -p ${WRAP_DIR} + export PATH="$PWD":$PATH + FAKETIME_PROGS="dmg genisoimage" + + # Create global faketime wrappers + for prog in ${FAKETIME_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"${REFERENCE_DATETIME}\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + + UNSIGNED=bitcoin-osx-unsigned.tar.gz + SIGNED=bitcoin-osx-signed.dmg + + tar -xf ${UNSIGNED} + ./detached-sig-apply.sh ${UNSIGNED} signature/osx + ${WRAP_DIR}/genisoimage -no-cache-inodes -D -l -probe -V "Bitcoin-Core" -no-pad -r -apple -o uncompressed.dmg signed-app + ${WRAP_DIR}/dmg dmg uncompressed.dmg ${OUTDIR}/${SIGNED} diff --git a/contrib/gitian-descriptors/gitian-osx.yml b/contrib/gitian-descriptors/gitian-osx.yml new file mode 100644 index 000000000..723b83c51 --- /dev/null +++ b/contrib/gitian-descriptors/gitian-osx.yml @@ -0,0 +1,146 @@ +--- +name: "bitcoin-osx-0.11" +enable_cache: true +suites: +- "trusty" +architectures: +- "amd64" +packages: +- "g++" +- "git-core" +- "pkg-config" +- "autoconf" +- "libtool" +- "automake" +- "faketime" +- "bsdmainutils" +- "cmake" +- "libcap-dev" +- "libz-dev" +- "libbz2-dev" +- "ca-certificates" +- "python" +remotes: +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" +files: +- "Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz" +script: | + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-apple-darwin18" + CONFIGFLAGS="--enable-reduce-exports --disable-bench GENISOIMAGE=$WRAP_DIR/genisoimage" + FAKETIME_HOST_PROGS="" + FAKETIME_PROGS="ar ranlib date dmg genisoimage" + + export QT_RCC_TEST=1 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR="$PWD" + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + export ZERO_AR_DATE=1 + + function create_global_faketime_wrappers { + for prog in ${FAKETIME_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + } + + function create_per-host_faketime_wrappers { + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + export PATH=${WRAP_DIR}:${PATH} + + # Faketime for depends so intermediate results are comparable + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + + cd bitcoin + BASEPREFIX="${PWD}/depends" + + mkdir -p ${BASEPREFIX}/SDKs + tar -C ${BASEPREFIX}/SDKs -xf ${BUILD_DIR}/Xcode-11.3.1-11C505-extracted-SDK-with-libcxx-headers.tar.gz + + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Faketime for binaries + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + CONFIG_SITE=${BASEPREFIX}/$(echo "${HOSTS}" | awk '{print $1;}')/share/config.site ./configure --prefix=/ + make dist + SOURCEDIST=$(echo bitcoin-*.tar.gz) + DISTNAME=${SOURCEDIST/%.tar.gz} + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH="${PWD}/installed/${DISTNAME}" + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + 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} + + make deploydir + mkdir -p unsigned-app-${i} + cp contrib/macdeploy/detached-sig-apply.sh unsigned-app-${i} + cp contrib/macdeploy/detached-sig-create.sh unsigned-app-${i} + cp ${BASEPREFIX}/${i}/native/bin/dmg ${BASEPREFIX}/${i}/native/bin/genisoimage unsigned-app-${i} + cp ${BASEPREFIX}/${i}/native/bin/${i}-codesign_allocate unsigned-app-${i}/codesign_allocate + cp ${BASEPREFIX}/${i}/native/bin/${i}-pagestuff unsigned-app-${i}/pagestuff + mv dist unsigned-app-${i} + pushd unsigned-app-${i} + find . | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-osx-unsigned.tar.gz + popd + + make deploy + ${WRAP_DIR}/dmg dmg Bitcoin-Core.dmg ${OUTDIR}/${DISTNAME}-osx-unsigned.dmg + + cd installed + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find ${DISTNAME} | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ${OUTDIR}/${DISTNAME}-${i}.tar.gz + cd ../../ + done + mkdir -p $OUTDIR/src + mv $SOURCEDIST $OUTDIR/src + mv ${OUTDIR}/${DISTNAME}-x86_64-*.tar.gz ${OUTDIR}/${DISTNAME}-osx64.tar.gz diff --git a/contrib/gitian-descriptors/gitian-win-signer.yml b/contrib/gitian-descriptors/gitian-win-signer.yml new file mode 100644 index 000000000..3f2c540ae --- /dev/null +++ b/contrib/gitian-descriptors/gitian-win-signer.yml @@ -0,0 +1,38 @@ +--- +name: "bitcoin-win-signer" +suites: +- "trusty" +architectures: +- "amd64" +packages: +- "libssl-dev" +- "autoconf" +remotes: +- "url": "https://github.com/bitcoin/bitcoin-detached-sigs.git" + "dir": "signature" +files: +- "osslsigncode-1.7.1.tar.gz" +- "osslsigncode-Backports-to-1.7.1.patch" +- "bitcoin-win-unsigned.tar.gz" +script: | + BUILD_DIR="$PWD" + SIGDIR=${BUILD_DIR}/signature/win + UNSIGNED_DIR=${BUILD_DIR}/unsigned + + echo "f9a8cdb38b9c309326764ebc937cba1523a3a751a7ab05df3ecc99d18ae466c9 osslsigncode-1.7.1.tar.gz" | sha256sum -c + echo "a8c4e9cafba922f89de0df1f2152e7be286aba73f78505169bc351a7938dd911 osslsigncode-Backports-to-1.7.1.patch" | sha256sum -c + + mkdir -p ${UNSIGNED_DIR} + tar -C ${UNSIGNED_DIR} -xf bitcoin-win-unsigned.tar.gz + + tar xf osslsigncode-1.7.1.tar.gz + cd osslsigncode-1.7.1 + patch -p1 < ${BUILD_DIR}/osslsigncode-Backports-to-1.7.1.patch + + ./configure --without-gsf --without-curl --disable-dependency-tracking + make + find ${UNSIGNED_DIR} -name "*-unsigned.exe" | while read i; do + INFILE="$(basename "${i}")" + OUTFILE="${INFILE/%-unsigned}" + ./osslsigncode attach-signature -in "${i}" -out "${OUTDIR}/${OUTFILE}" -sigin "${SIGDIR}/${INFILE}.pem" + done diff --git a/contrib/gitian-descriptors/gitian-win.yml b/contrib/gitian-descriptors/gitian-win.yml new file mode 100644 index 000000000..fb65863ef --- /dev/null +++ b/contrib/gitian-descriptors/gitian-win.yml @@ -0,0 +1,166 @@ +--- +name: "bitcoin-win-0.11" +enable_cache: true +suites: +- "trusty" +architectures: +- "amd64" +packages: +- "g++" +- "git-core" +- "pkg-config" +- "autoconf" +- "libtool" +- "automake" +- "faketime" +- "bsdmainutils" +- "mingw-w64" +- "g++-mingw-w64" +- "nsis" +- "zip" +- "ca-certificates" +- "python" +remotes: +- "url": "https://github.com/bitcoin/bitcoin.git" + "dir": "bitcoin" +files: [] +script: | + WRAP_DIR=$HOME/wrapped + HOSTS="x86_64-w64-mingw32 i686-w64-mingw32" + CONFIGFLAGS="--enable-reduce-exports --disable-bench" + FAKETIME_HOST_PROGS="g++ ar ranlib nm windres strip objcopy" + FAKETIME_PROGS="date makensis zip" + HOST_CFLAGS="-O2 -g" + HOST_CXXFLAGS="-O2 -g" + + export QT_RCC_TEST=1 + export GZIP="-9n" + export TAR_OPTIONS="--mtime="$REFERENCE_DATE\\\ $REFERENCE_TIME"" + export TZ="UTC" + export BUILD_DIR="$PWD" + mkdir -p ${WRAP_DIR} + if test -n "$GBUILD_CACHE_ENABLED"; then + export SOURCES_PATH=${GBUILD_COMMON_CACHE} + export BASE_CACHE=${GBUILD_PACKAGE_CACHE} + mkdir -p ${BASE_CACHE} ${SOURCES_PATH} + fi + + function create_global_faketime_wrappers { + for prog in ${FAKETIME_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${prog} + echo "REAL=\`which -a ${prog} | grep -v ${WRAP_DIR}/${prog} | head -1\`" >> ${WRAP_DIR}/${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${prog} + chmod +x ${WRAP_DIR}/${prog} + done + } + + function create_per-host_faketime_wrappers { + for i in $HOSTS; do + for prog in ${FAKETIME_HOST_PROGS}; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + function create_per-host_linker_wrapper { + # This is only needed for trusty, as the mingw linker leaks a few bytes of + # heap, causing non-determinism. See discussion in https://github.com/bitcoin/bitcoin/pull/6900 + for i in $HOSTS; do + mkdir -p ${WRAP_DIR}/${i} + for prog in collect2; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}/${prog} + REAL=$(${i}-gcc -print-prog-name=${prog}) + echo "export MALLOC_PERTURB_=255" >> ${WRAP_DIR}/${i}/${prog} + echo "${REAL} \$@" >> $WRAP_DIR/${i}/${prog} + chmod +x ${WRAP_DIR}/${i}/${prog} + done + for prog in gcc g++; do + echo '#!/usr/bin/env bash' > ${WRAP_DIR}/${i}-${prog} + echo "REAL=\`which -a ${i}-${prog} | grep -v ${WRAP_DIR}/${i}-${prog} | head -1\`" >> ${WRAP_DIR}/${i}-${prog} + echo 'export LD_PRELOAD=/usr/lib/x86_64-linux-gnu/faketime/libfaketime.so.1' >> ${WRAP_DIR}/${i}-${prog} + echo "export FAKETIME=\"$1\"" >> ${WRAP_DIR}/${i}-${prog} + echo "export COMPILER_PATH=${WRAP_DIR}/${i}" >> ${WRAP_DIR}/${i}-${prog} + echo "\$REAL \$@" >> $WRAP_DIR/${i}-${prog} + chmod +x ${WRAP_DIR}/${i}-${prog} + done + done + } + + export PATH=${WRAP_DIR}:${PATH} + + # Faketime for depends so intermediate results are comparable + create_global_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_faketime_wrappers "2000-01-01 12:00:00" + create_per-host_linker_wrapper "2000-01-01 12:00:00" + + cd bitcoin + BASEPREFIX="${PWD}/depends" + # Build dependencies for each host + for i in $HOSTS; do + make ${MAKEOPTS} -C ${BASEPREFIX} HOST="${i}" + done + + # Faketime for binaries + create_global_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_faketime_wrappers "${REFERENCE_DATETIME}" + create_per-host_linker_wrapper "${REFERENCE_DATETIME}" + + # Create the release tarball using (arbitrarily) the first host + ./autogen.sh + CONFIG_SITE=${BASEPREFIX}/$(echo "${HOSTS}" | awk '{print $1;}')/share/config.site ./configure --prefix=/ + make dist + SOURCEDIST=$(echo bitcoin-*.tar.gz) + DISTNAME=${SOURCEDIST/%.tar.gz} + + # Correct tar file order + mkdir -p temp + pushd temp + tar xf ../$SOURCEDIST + find bitcoin-* | sort | tar --no-recursion --mode='u+rw,go+r-w,a+X' --owner=0 --group=0 -c -T - | gzip -9n > ../$SOURCEDIST + mkdir -p $OUTDIR/src + cp ../$SOURCEDIST $OUTDIR/src + popd + + ORIGPATH="$PATH" + # Extract the release tarball into a dir for each host and build + for i in ${HOSTS}; do + export PATH=${BASEPREFIX}/${i}/native/bin:${ORIGPATH} + mkdir -p distsrc-${i} + cd distsrc-${i} + INSTALLPATH="${PWD}/installed/${DISTNAME}" + mkdir -p ${INSTALLPATH} + tar --strip-components=1 -xf ../$SOURCEDIST + + 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} + cp -f bitcoin-*setup*.exe $OUTDIR/ + cd installed + mv ${DISTNAME}/bin/*.dll ${DISTNAME}/lib/ + find . -name "lib*.la" -delete + find . -name "lib*.a" -delete + rm -rf ${DISTNAME}/lib/pkgconfig + find ${DISTNAME}/bin -type f -executable -exec ${i}-objcopy --only-keep-debug {} {}.dbg \; -exec ${i}-strip -s {} \; -exec ${i}-objcopy --add-gnu-debuglink={}.dbg {} \; + # Commented out while we don't build any libraries + #find ${DISTNAME}/lib -type f -exec ${i}-objcopy --only-keep-debug {} {}.dbg \; -exec ${i}-strip -s {} \; -exec ${i}-objcopy --add-gnu-debuglink={}.dbg {} \; + find ${DISTNAME} -not -name "*.dbg" -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}.zip + find ${DISTNAME} -name "*.dbg" -type f | sort | zip -X@ ${OUTDIR}/${DISTNAME}-${i}-debug.zip + 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 + 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 + mv ${OUTDIR}/${DISTNAME}-i686-*.zip ${OUTDIR}/${DISTNAME}-win32.zip diff --git a/contrib/gitian-downloader/daira.asc b/contrib/gitian-downloader/daira.asc new file mode 100644 index 000000000..e60a2bbcb --- /dev/null +++ b/contrib/gitian-downloader/daira.asc @@ -0,0 +1,70 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: pgp.mit.edu + +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 +eCJPlVdlz6Oj1tV2kw== +=E8LJ +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/jack.asc b/contrib/gitian-downloader/jack.asc new file mode 100644 index 000000000..db9967233 --- /dev/null +++ b/contrib/gitian-downloader/jack.asc @@ -0,0 +1,449 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +HifqTn/z+qdV2A== +=phy7 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/kevin.asc b/contrib/gitian-downloader/kevin.asc new file mode 100644 index 000000000..13a39ee7f --- /dev/null +++ b/contrib/gitian-downloader/kevin.asc @@ -0,0 +1,171 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=qSqw +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/nathan.asc b/contrib/gitian-downloader/nathan.asc new file mode 100644 index 000000000..2a2be1ee9 --- /dev/null +++ b/contrib/gitian-downloader/nathan.asc @@ -0,0 +1,52 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v1 + +mQINBFfPXJsBEACwNO57V3pX47/GfSU6QUBwNUpm3tw4nAafd8KSyclw0LlPSfaD +yu4UG5Jp/YCtLu1cnlCjd7tOcFISMSmrzmD+83qjUfoy6Q6y0kC80/e9n4s6tTqA +c5SRZkuKFeBj+QCAqgEOoO00e7StvhFTk3NAHgeh7p0a76eLzrg+ectn8KM1iqwY +7pJiqqsfdsREWWlABCT6TM1B7qCOlIVNEL6vmwdy0iG0NhLyl4dN/BJnwIlj/EnZ +iuNOUHJc/4V5+22Mzbx7E/vODtJf466rSaE6j02JtngBfYhG7FJfaU4J7fZtV7CX +HwSYoFKLCZR5/xS4fWrtj5PPnvO8fFYLaV0dgC/TBdlJ4qTFE3BOLp+U1ZyNBVdL +um5VBVopdjNJzMN5jX+4KkQeRcStFPbABzdyWHkaHPtzLOjcmq17ZCtyi9/s3ZKB +frmFwftJhzj8MLSJu6mSyx1AxAoeynsqRhki4ppZrXUB1oZQKdUSo66PiI9c37bm +CpfFgAEVfba8cmRsNYo566R0QmVjtuFNAHdT/SIxTx7U5cL9qK0Xg9ceInIQ425k +kMC1e4DJSbqh0CcMmc9e+NFhsib6uXeVRMDzzJaHZywpCmBAgHBzPjW6ZrJRELn6 +hy0x7zYPu6dz27W0h3N2+HaEt9Brdo378eKm8BIXx/XIYb/TF0X65kFjYQARAQAB +tB1OYXRoYW4gV2lsY294IDxuYXRoYW5Aei5jYXNoPokCPgQTAQIAKAUCV89cmwIb +AwUJAeEzgAYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AACgkQ7UF/vnnJnoxXdw/9 +GByxP6J7zybTAeiByNEh+nIhNchhk5h47MPcyb/eLABif3puccjWYTbbClay/Eci +Sj7Bfiq4lFuerdydhqMBmdjUC7oACyr5yNbJqlIlAuBLgVcsRYCM0tZrXuHIMY6a +YCfSZsewK9f+tY5RlVuTCG0GzPGyFwMJpiY0WItZfrqi4bZ36KQxOEbrWqNq2+VZ +0y5imSy0uyw2twfocxLiofVD/PS35iVZauK4p7lK816cWNUZPS/XEiBR+3HrGI/d +sphn+IDJPifkImsk4LnE+Ek1lYlxC9HKkvjwBfNGS9h5EJmQwlPRn+emETnj2or+ +Ynxc274mvIxJzh9C3usmPKKRM67zqh2J7NvUi4zJQX3oanY+nYZphPpPYiosWhfh +5c8j/h6W/YX79/KtxUwWe+Owxyeo3gUpryftDo9oYhUYzv2Cc7RxjKKiDJgIqf2g +4Ni0NE8VpIryYB21m70fnuBcmNw0sRrbsz0TbRboTcCh7dsN1nAyudQj7khHj88D +FbVPZ53FifBVyEX+WDv1nDNE0B3SLVGLzPSVLA3G+iptr3uy+GHmB+IzQU2j4bLq +vMn/b6DkvAgDnzsRanHHYZNgeuEVvTeY+aiQ9id66JE5QOLPWwwLg6ZanD5So2Rs +n+4joCXv7Ybj5e1uaw7gtCpwnbLAyvLoZVOD93h7rGO5Ag0EV89cmwEQAOBqIdl8 +109TmyQqAZLGpTo5i6ogpe5jI1KKKOhLZwpvGNKSnLIq2s8m1mTMhJrhGuPDf5US +LTkR3JeaKAnCI9b1tYxoumSuiu4efCVrmBRA3yOfbqsWFlPF5mF4Ih8YSbfEZVtC +2VTJXAl00M24xPMKk7sUn/vvs2Go8v1dJtWizwNHTkvjdp9gMzCgLh7oh/0Dl24W +IrNSer0076GLvmUFPgyfabKtZ+E4oMczbDN0R7KoMRNB10FfYjO+JQfyZOZYTKeJ +KA3IfRW2fp6YDvQlMKCBy+zK6aDu9gPmudWzVIHrXJESY1e/zXwqDg2wpt6IuxpN +IOrHI64AB4vRRGlJvPrIm5JRrr1QekJUf/vjy4VTC/r9LNXFwa5FdINoiEHyq3sG +IHgXobruF86pYQIyRaeuiJFTDFg7I57F82/Ck0/uq+hkFoYxfuAkyX1W9UzgBCTd +D1lGF4xzTuQMDZqRvOZWbA0BlZlENV7oYvL/6tX86Ei6BFb48x9sy3WHXzwfmQlD +agMzodkAjrpEHKuHkmJz+B+BvKhWmYjMgAOaMFcV+9yje0+/FIWdQaks7zjumO0/ +OpPh5nnIxM6kJr8mCT0YpGBvHh5x5Sxp/CYMMqNrbYarIa5V4JzawUMX2Qb1m50x +dysa1F3+56OYzqDfzcf7nroCKa6+8LnsMtZtABEBAAGJAiUEGAECAA8FAlfPXJsC +GwwFCQHhM4AACgkQ7UF/vnnJnoxrZw//TuIsITFk0YPlWZRFawt2SFF7XzuAgCZX +xA8hf4i+eulKpqM4qxW/yaCLTTCtxTtF09WgPXfYOa7OuPADzYmawzjwn8oJhcVb +d3AN9NmRXIrSdO+ZEph29U65U3owbrcGkYqokt2ipeYmWpT0BvUesOxKxBM5FZBT +GWb/OXZhRyw6N3dKbT4N/BU/JWohSRtx87D5TL1AocsAJ9Nt+2TGYyGlHZ1kMhUY +sGciY/eClvKU1x4e0ynR8Pqe/WmlJIcjsH5azBPHrWYVgExjczo4uHxx/fJItdjr +Jq93Pr+OoJL8sT3/V3v892czKr2i2Cm30xVwdjytLyyDnBZZzYa1+CojL5zQOlQg +ne0/YxvU2siUTzIiwzzIvTCsG9q09cgpUWN7V4zw3wEueT2G5AoQEaeCvu79v4P8 +2DQ9H5qtyriqqlrKfyeiUO27ZnjmUsn1VxbuKW6NqhegYHyMfEW/TQutt3ktnf99 +O8JCtCwnAo+PINpW0zd8PhCbQmDsnA6Xz3ejDlidk5qA9M9t8tZEFCVeYSmsnwex +9gtZ+x/FMBGC4zx2kcvAMSUz4jFCYD/S+YCDVPBoNynnnjBpCP1mX7ogmoDQAFbj +jXMXFZogTinHxjJBfoSUy1lZYRx4I2dj0F6u2qt4WSKAqFc/99b/FV5sPgw9HAIj +JfmuGLm2Czs= +=kUB4 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/sean.asc b/contrib/gitian-downloader/sean.asc new file mode 100644 index 000000000..9b710ff5f --- /dev/null +++ b/contrib/gitian-downloader/sean.asc @@ -0,0 +1,51 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: GnuPG v2 + +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 +=0DUx +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/gitian-downloader/simon.asc b/contrib/gitian-downloader/simon.asc new file mode 100644 index 000000000..3cbf0f57c --- /dev/null +++ b/contrib/gitian-downloader/simon.asc @@ -0,0 +1,47 @@ +-----BEGIN PGP PUBLIC KEY BLOCK----- +Version: SKS 1.1.5 +Comment: Hostname: pgp.mit.edu + +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 +=nZf9 +-----END PGP PUBLIC KEY BLOCK----- diff --git a/contrib/linearize/README.md b/contrib/linearize/README.md new file mode 100644 index 000000000..06f278f3b --- /dev/null +++ b/contrib/linearize/README.md @@ -0,0 +1,33 @@ +# Linearize +Construct a linear, no-fork, best version of the blockchain. + +## Step 1: Download hash list + + $ ./linearize-hashes.py linearize.cfg > hashlist.txt + +Required configuration file settings for linearize-hashes: +* RPC: rpcuser, rpcpassword + +Optional config file setting for linearize-hashes: +* RPC: host, port +* Block chain: min_height, max_height + +## Step 2: Copy local block data + + $ ./linearize-data.py linearize.cfg + +Required configuration file settings: +* "input": bitcoind blocks/ directory containing blkNNNNN.dat +* "hashlist": text file containing list of block hashes, linearized-hashes.py +output. +* "output_file": bootstrap.dat + or +* "output": output directory for linearized blocks/blkNNNNN.dat output + +Optional config file setting for linearize-data: +* "netmagic": network magic number +* "max_out_sz": maximum output file size (default `1000*1000*1000`) +* "split_timestamp": Split files when a new month is first seen, in addition to +reaching a maximum file size. +* "file_timestamp": Set each file's last-modified time to that of the +most recent block in that file. diff --git a/contrib/linearize/example-linearize.cfg b/contrib/linearize/example-linearize.cfg new file mode 100644 index 000000000..f0dea1dcb --- /dev/null +++ b/contrib/linearize/example-linearize.cfg @@ -0,0 +1,29 @@ + +# bitcoind RPC settings (linearize-hashes) +rpcuser=someuser +rpcpassword=somepassword +host=127.0.0.1 +port=8232 +#port=18232 + +# bootstrap.dat hashlist settings (linearize-hashes) +max_height=313000 + +# bootstrap.dat input/output settings (linearize-data) + +# mainnet +netmagic=f9beb4d9 +genesis=000000000019d6689c085ae165831e934ff763ae46a2a6c172b3f1b60a8ce26f +input=/home/example/.bitcoin/blocks + +# testnet +#netmagic=0b110907 +#genesis=000000000933ea01ad0ee984209779baaec3ced90fa3f408719526f8d77f4943 +#input=/home/example/.bitcoin/testnet3/blocks + +output_file=/home/example/Downloads/bootstrap.dat +hashlist=hashlist.txt +split_year=1 + +# Maximum size in bytes of out-of-order blocks cache in memory +out_of_order_cache_sz = 100000000 diff --git a/contrib/linearize/linearize-data.py b/contrib/linearize/linearize-data.py new file mode 100755 index 000000000..bd2fd3b5d --- /dev/null +++ b/contrib/linearize/linearize-data.py @@ -0,0 +1,303 @@ +#!/usr/bin/env python +# +# linearize-data.py: Construct a linear, no-fork version of the chain. +# +# Copyright (c) 2013-2014 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +# + +from __future__ import print_function, division +import json +import struct +import re +import os +import os.path +import base64 +import httplib +import sys +import hashlib +import datetime +import time +from collections import namedtuple + +settings = {} + +def uint32(x): + return x & 0xffffffffL + +def bytereverse(x): + return uint32(( ((x) << 24) | (((x) << 8) & 0x00ff0000) | + (((x) >> 8) & 0x0000ff00) | ((x) >> 24) )) + +def bufreverse(in_buf): + out_words = [] + for i in range(0, len(in_buf), 4): + word = struct.unpack('@I', in_buf[i:i+4])[0] + out_words.append(struct.pack('@I', bytereverse(word))) + return ''.join(out_words) + +def wordreverse(in_buf): + out_words = [] + for i in range(0, len(in_buf), 4): + out_words.append(in_buf[i:i+4]) + out_words.reverse() + return ''.join(out_words) + +def calc_hdr_hash(blk_hdr): + hash1 = hashlib.sha256() + hash1.update(blk_hdr) + hash1_o = hash1.digest() + + hash2 = hashlib.sha256() + hash2.update(hash1_o) + hash2_o = hash2.digest() + + return hash2_o + +def calc_hash_str(blk_hdr): + hash = calc_hdr_hash(blk_hdr) + hash = bufreverse(hash) + hash = wordreverse(hash) + hash_str = hash.encode('hex') + return hash_str + +def get_blk_dt(blk_hdr): + members = struct.unpack(" self.maxOutSz): + self.outF.close() + if self.setFileTime: + os.utime(outFname, (int(time.time()), highTS)) + self.outF = None + self.outFname = None + self.outFn = self.outFn + 1 + self.outsz = 0 + + (blkDate, blkTS) = get_blk_dt(blk_hdr) + if self.timestampSplit and (blkDate > self.lastDate): + print("New month " + blkDate.strftime("%Y-%m") + " @ " + hash_str) + lastDate = blkDate + if outF: + outF.close() + if setFileTime: + os.utime(outFname, (int(time.time()), highTS)) + self.outF = None + self.outFname = None + self.outFn = self.outFn + 1 + self.outsz = 0 + + if not self.outF: + if self.fileOutput: + outFname = self.settings['output_file'] + else: + outFname = os.path.join(self.settings['output'], "blk%05d.dat" % self.outFn) + print("Output file " + outFname) + self.outF = open(outFname, "wb") + + self.outF.write(inhdr) + self.outF.write(blk_hdr) + self.outF.write(rawblock) + self.outsz = self.outsz + len(inhdr) + len(blk_hdr) + len(rawblock) + + self.blkCountOut = self.blkCountOut + 1 + if blkTS > self.highTS: + self.highTS = blkTS + + if (self.blkCountOut % 1000) == 0: + print('%i blocks scanned, %i blocks written (of %i, %.1f%% complete)' % + (self.blkCountIn, self.blkCountOut, len(self.blkindex), 100.0 * self.blkCountOut / len(self.blkindex))) + + def inFileName(self, fn): + return os.path.join(self.settings['input'], "blk%05d.dat" % fn) + + def fetchBlock(self, extent): + '''Fetch block contents from disk given extents''' + with open(self.inFileName(extent.fn), "rb") as f: + f.seek(extent.offset) + return f.read(extent.size) + + def copyOneBlock(self): + '''Find the next block to be written in the input, and copy it to the output.''' + extent = self.blockExtents.pop(self.blkCountOut) + if self.blkCountOut in self.outOfOrderData: + # If the data is cached, use it from memory and remove from the cache + rawblock = self.outOfOrderData.pop(self.blkCountOut) + self.outOfOrderSize -= len(rawblock) + else: # Otherwise look up data on disk + rawblock = self.fetchBlock(extent) + + self.writeBlock(extent.inhdr, extent.blkhdr, rawblock) + + def run(self): + while self.blkCountOut < len(self.blkindex): + if not self.inF: + fname = self.inFileName(self.inFn) + print("Input file " + fname) + try: + self.inF = open(fname, "rb") + except IOError: + print("Premature end of block data") + return + + inhdr = self.inF.read(8) + if (not inhdr or (inhdr[0] == "\0")): + self.inF.close() + self.inF = None + self.inFn = self.inFn + 1 + continue + + inMagic = inhdr[:4] + if (inMagic != self.settings['netmagic']): + print("Invalid magic: " + inMagic.encode('hex')) + return + inLenLE = inhdr[4:] + su = struct.unpack(" corresponding to /root/bazdir + foo/bar/qux -> corresponding to /root/bazdir/qux + + """ + def change_tarinfo_base(tarinfo): + if tarinfo.name and tarinfo.name.startswith("./"): + tarinfo.name = str(pathlib.Path(alt_base_dir, tarinfo.name)) + if tarinfo.linkname and tarinfo.linkname.startswith("./"): + tarinfo.linkname = str(pathlib.Path(alt_base_dir, tarinfo.linkname)) + return tarinfo + with cd(dir_to_add): + tarfp.add(".", recursive=True, filter=change_tarinfo_base) + + print("Creating output .tar.gz file...") + with out_sdktgz_path.open("wb") as fp: + with gzip.GzipFile(fileobj=fp, compresslevel=9, mtime=0) as gzf: + with tarfile.open(mode="w", fileobj=gzf) as tarfp: + print("Adding MacOSX SDK {} files...".format(sdk_version)) + tarfp_add_with_base_change(tarfp, sdk_dir, out_name) + print("Adding libc++ headers...") + tarfp_add_with_base_change(tarfp, xcode_libcxx_dir, "{}/usr/include/c++/v1".format(out_name)) + print("Done! Find the resulting gzipped tarball at:") + print(out_sdktgz_path.resolve()) + +if __name__ == '__main__': + run() diff --git a/contrib/metrics/docker-compose.yml b/contrib/metrics/docker-compose.yml new file mode 100644 index 000000000..b8984f9f7 --- /dev/null +++ b/contrib/metrics/docker-compose.yml @@ -0,0 +1,52 @@ +version: "3.7" + +services: + grafana: + image: grafana/grafana + container_name: zcashd-grafana + depends_on: + - prometheus + environment: + GF_SERVER_HTTP_PORT: "3030" + ports: + - "3030:3030" + volumes: + - type: volume + source: grafana-storage + target: /var/lib/grafana + - type: bind + source: ./grafana/grafana.ini + target: /etc/grafana/grafana.ini + - type: bind + source: ./grafana/provisioning + target: /etc/grafana/provisioning + - type: bind + source: ./grafana/dashboards + target: /etc/grafana/dashboards + networks: + - zcashd-metrics + + prometheus: + image: prom/prometheus + container_name: zcashd-prometheus + ports: + - "9090:9090" + volumes: + - type: volume + source: prometheus-storage + target: /prometheus + - type: bind + source: ./prometheus.yaml + target: /etc/prometheus/prometheus.yml + read_only: true + networks: + - zcashd-metrics + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + grafana-storage: + prometheus-storage: + +networks: + zcashd-metrics: diff --git a/contrib/metrics/grafana/dashboards/zcashd-metrics.json b/contrib/metrics/grafana/dashboards/zcashd-metrics.json new file mode 100644 index 000000000..bf86d172c --- /dev/null +++ b/contrib/metrics/grafana/dashboards/zcashd-metrics.json @@ -0,0 +1,911 @@ +{ + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": { + "type": "datasource", + "uid": "grafana" + }, + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "target": { + "limit": 100, + "matchAny": false, + "tags": [], + "type": "dashboard" + }, + "type": "dashboard" + } + ] + }, + "editable": true, + "fiscalYearStartMonth": 0, + "graphTooltip": 0, + "id": 2, + "links": [], + "liveNow": false, + "panels": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 0, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + } + ] + } + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 0 + }, + "id": 2, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "editorMode": "code", + "expr": "zcash_chain_verified_block_height", + "interval": "", + "legendFormat": "Chain tip", + "range": true, + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "editorMode": "builder", + "expr": "zcashd_wallet_synced_block_height", + "hide": false, + "legendFormat": "Wallet", + "range": true, + "refId": "B" + } + ], + "title": "Block height", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "log": 2, + "type": "log" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "s" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 0 + }, + "id": 12, + "interval": "", + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_chain_verified_block_seconds", + "format": "time_series", + "interval": "", + "legendFormat": "{{quantile}}", + "refId": "A" + } + ], + "title": "Block verification", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + } + }, + "overrides": [ + { + "matcher": { + "id": "byFrameRefID", + "options": "Heap Usage" + }, + "properties": [ + { + "id": "custom.axisPlacement", + "value": "right" + }, + { + "id": "unit", + "value": "bytes" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 8 + }, + "id": 16, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "single", + "sort": "none" + } + }, + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "editorMode": "builder", + "expr": "zcashd_wallet_batchscanner_size_transactions", + "hide": false, + "legendFormat": "Transactions", + "range": true, + "refId": "Transactions" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "editorMode": "builder", + "expr": "avg_over_time(zcashd_wallet_batchscanner_usage_byes[$__interval])", + "hide": false, + "legendFormat": "Heap usage", + "range": true, + "refId": "Heap Usage" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "editorMode": "builder", + "expr": "rate(zcashd_wallet_batchscanner_outputs_scanned[$__rate_interval])", + "legendFormat": "{{kind}}", + "range": true, + "refId": "Output Rate" + } + ], + "title": "Wallet batch scanner", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "decimals": 0, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "txs" + }, + "overrides": [ + { + "matcher": { + "id": "byName", + "options": "Size" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + } + ] + }, + { + "matcher": { + "id": "byName", + "options": "Usage" + }, + "properties": [ + { + "id": "unit", + "value": "bytes" + } + ] + } + ] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 8 + }, + "id": 10, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_mempool_size_transactions", + "interval": "", + "legendFormat": "Count", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_mempool_size_bytes", + "interval": "", + "legendFormat": "Size", + "refId": "B" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_mempool_usage_bytes", + "interval": "", + "legendFormat": "Usage", + "refId": "C" + } + ], + "title": "Mempool", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 16 + }, + "id": 4, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "rate(zcash_net_in_bytes[5m])", + "interval": "", + "legendFormat": "{{command}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "rate(zcash_net_in_bytes_total[5m])", + "interval": "", + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Inbound messages", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "ZEC" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 16 + }, + "id": 8, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_pool_value_zatoshis/100000000", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Shielded pools", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "binBps" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 24 + }, + "id": 6, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "rate(zcash_net_out_bytes[5m])", + "interval": "", + "legendFormat": "{{command}}", + "refId": "A" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "rate(zcash_net_out_bytes_total[5m])", + "interval": "", + "legendFormat": "Total", + "refId": "B" + } + ], + "title": "Outbound messages", + "type": "timeseries" + }, + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "fieldConfig": { + "defaults": { + "color": { + "mode": "palette-classic" + }, + "custom": { + "axisCenteredZero": false, + "axisColorMode": "text", + "axisLabel": "", + "axisPlacement": "auto", + "barAlignment": 0, + "drawStyle": "line", + "fillOpacity": 10, + "gradientMode": "none", + "hideFrom": { + "legend": false, + "tooltip": false, + "viz": false + }, + "lineInterpolation": "linear", + "lineWidth": 1, + "pointSize": 5, + "scaleDistribution": { + "type": "linear" + }, + "showPoints": "never", + "spanNulls": false, + "stacking": { + "group": "A", + "mode": "none" + }, + "thresholdsStyle": { + "mode": "off" + } + }, + "mappings": [], + "thresholds": { + "mode": "absolute", + "steps": [ + { + "color": "green", + "value": null + }, + { + "color": "red", + "value": 80 + } + ] + }, + "unit": "short" + }, + "overrides": [] + }, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 24 + }, + "id": 14, + "options": { + "legend": { + "calcs": [], + "displayMode": "list", + "placement": "bottom", + "showLegend": true + }, + "tooltip": { + "mode": "multi", + "sort": "none" + } + }, + "pluginVersion": "9.1.6", + "targets": [ + { + "datasource": { + "type": "prometheus", + "uid": "T9XAoUn4k" + }, + "expr": "zcash_pool_notes_created", + "interval": "", + "legendFormat": "{{name}}", + "refId": "A" + } + ], + "title": "Commitment tree sizes", + "type": "timeseries" + } + ], + "refresh": "5s", + "schemaVersion": 37, + "style": "dark", + "tags": [], + "templating": { + "list": [] + }, + "time": { + "from": "now-5m", + "to": "now" + }, + "timepicker": {}, + "timezone": "", + "title": "zcashd metrics", + "uid": "U4U58t-Gk", + "version": 1, + "weekStart": "" +} diff --git a/contrib/metrics/grafana/grafana.ini b/contrib/metrics/grafana/grafana.ini new file mode 100644 index 000000000..0066b7f78 --- /dev/null +++ b/contrib/metrics/grafana/grafana.ini @@ -0,0 +1,2 @@ +[paths] +provisioning = /etc/grafana/provisioning diff --git a/contrib/metrics/grafana/provisioning/dashboards/zcash.yaml b/contrib/metrics/grafana/provisioning/dashboards/zcash.yaml new file mode 100644 index 000000000..37546c9a8 --- /dev/null +++ b/contrib/metrics/grafana/provisioning/dashboards/zcash.yaml @@ -0,0 +1,18 @@ +--- +apiVersion: 1 + +providers: + - name: 'Zcash metrics' + # provider type. Default to 'file' + type: file + # disable dashboard deletion + disableDeletion: false + # how often Grafana will scan for changed dashboards + updateIntervalSeconds: 10 + # allow updating provisioned dashboards from the UI + allowUiUpdates: false + options: + # path to dashboard files on disk. Required when using the 'file' type + path: /etc/grafana/dashboards + # use folder names from filesystem to create folders in Grafana + foldersFromFilesStructure: true diff --git a/contrib/metrics/grafana/provisioning/datasources/prometheus.yaml b/contrib/metrics/grafana/provisioning/datasources/prometheus.yaml new file mode 100644 index 000000000..d9f0cc3a9 --- /dev/null +++ b/contrib/metrics/grafana/provisioning/datasources/prometheus.yaml @@ -0,0 +1,12 @@ +--- +apiVersion: 1 +datasources: + - + access: proxy + editable: false + name: Prometheus + orgId: 1 + type: prometheus + uid: T9XAoUn4k + url: "http://prometheus:9090" + version: 1 diff --git a/contrib/metrics/prometheus.yaml b/contrib/metrics/prometheus.yaml new file mode 100644 index 000000000..d3a286620 --- /dev/null +++ b/contrib/metrics/prometheus.yaml @@ -0,0 +1,6 @@ +scrape_configs: + - job_name: 'zcashd' + scrape_interval: 500ms + metrics_path: '/' + static_configs: + - targets: ['host.docker.internal:9969'] diff --git a/contrib/metrics/pyproject.toml b/contrib/metrics/pyproject.toml new file mode 100644 index 000000000..3d27cf6ff --- /dev/null +++ b/contrib/metrics/pyproject.toml @@ -0,0 +1,29 @@ +[tool.poetry] +name = "zcash-metrics" +version = "0.1.0" +description = "Zcash Metrics" +authors = [ + "Jack Grigg ", + "Daira Hopwood ", + "Kris Nuttycombe ", +] +license = "MIT OR Apache-2.0" +readme = "README.md" +homepage = "https://github.com/zcash/zcash/" +repository = "https://github.com/zcash/zcash/" +documentation = "https://github.com/zcash/zcash/" +classifiers = [ + "Private :: Do Not Upload", +] +packages = [ + { include = "supply_check" } +] + +[tool.poetry.dependencies] +python = "^3.7" +slick-bitcoinrpc = "0.1.4" +progressbar2 = "4.2.0" + +[tool.poetry.scripts] +supply-check = "supply_check:main" + diff --git a/contrib/metrics/supply_check/__init__.py b/contrib/metrics/supply_check/__init__.py new file mode 100644 index 000000000..74ded28f2 --- /dev/null +++ b/contrib/metrics/supply_check/__init__.py @@ -0,0 +1,102 @@ +#!/usr/bin/env python3 + +import os +import progressbar +from slickrpc.rpc import Proxy + +from .deltas_mainnet import MainnetSupplyDeltas +from .theoretical import Network, MAINNET + +COIN=100000000 + +TXIDS_ONLY=1 +FULL_TX_DATA=2 + +# Returns the theoretical supply, the total block rewards claimed, +# and the block at the given height. +# +# - `zcashd` a slickrpc.rpc.Proxy that can be used to access zcashd +# - `deltas` a SupplyDeltas object tracking the deltas observed +# - `height` the block height to consider +# - `flag` Either `TXIDS_ONLY` or `FULL_TX_DATA`. This flag will be provided to +# the getblock RPC call to indicate how much data should be returned. When +# `TXIDS_ONLY` is provided, data for transactions in the block will be limited +# to transaction identifiers; when `FULL_TX_DATA` is provided full transaction +# data will be returned for each transaction in the block. +def TheoreticalAndEmpirical(zcashd, deltas, height, flag): + theoreticalSupply = Network(MAINNET).SupplyAfterHeight(height) + block = zcashd.getblock(str(height), flag) + measuredSupply = block['chainSupply']['chainValueZat'] + empiricalMaximum = measuredSupply + deltas.DeviationUpToHeight(height) + return (theoreticalSupply, empiricalMaximum, block) + +# Returns `True` if the theoretical supply matches the empirically +# determined supply after accounting for known deltas over the specified +# range, or `False` if it was not possible to determine a miner address +# for a block containing unclaimed fee and/or block reward amounts. +# +# - `startHeight` The block height at which to begin checking +# - `endHeight` The end of the block height range to check (inclusive) +def Bisect(bar, zcashd, deltas, startHeight, endHeight): + assert startHeight <= endHeight + bar.update(startHeight) + + flag = FULL_TX_DATA if startHeight == endHeight else TXIDS_ONLY + (theoretical, empirical, block) = TheoreticalAndEmpirical(zcashd, deltas, endHeight, flag) + if theoretical == empirical: + return True + elif startHeight == endHeight: + return deltas.SaveMismatch(block, theoretical, empirical) + else: + midpoint = (startHeight + endHeight) // 2 + return (Bisect(bar, zcashd, deltas, startHeight, midpoint) and + Bisect(bar, zcashd, deltas, midpoint + 1, endHeight)) + + +def main(): + missing_env = [] + if os.environ.get('ZCASHD_RPC_USER') is None: + missing_env.append(' ZCASHD_RPC_USER: username for accessing the zcashd RPC API') + if os.environ.get('ZCASHD_RPC_PASS') is None: + missing_env.append(' ZCASHD_RPC_PASS: RPC API password for ') + if os.environ.get('ZCASHD_RPC_HOST') is None: + missing_env.append(' ZCASHD_RPC_HOST: hostname where zcashd is running') + if os.environ.get('ZCASHD_RPC_PORT') is None: + missing_env.append(' ZCASHD_RPC_PORT: zcashd RPC API port (usually 8232 for mainnet)') + + if len(missing_env) > 0: + print("Please ensure that the following environment variables have been set:") + for v in missing_env: + print(v) + return + + zcashd = Proxy('http://{rpc_user}:{rpc_pass}@{rpc_host}:{rpc_port}'.format( + rpc_user=os.environ['ZCASHD_RPC_USER'], + rpc_pass=os.environ['ZCASHD_RPC_PASS'], + rpc_host=os.environ['ZCASHD_RPC_HOST'], + rpc_port=os.environ['ZCASHD_RPC_PORT'], + )) + + latestHeight = zcashd.getblockchaininfo()['blocks'] + deltas = MainnetSupplyDeltas() + (theoretical, empirical, block) = TheoreticalAndEmpirical(zcashd, deltas, latestHeight, TXIDS_ONLY) + interrupted = False + if theoretical != empirical: + with progressbar.ProgressBar(max_value = latestHeight, redirect_stdout = True) as bar: + try: + Bisect(bar, zcashd, deltas, 0, latestHeight) + except KeyboardInterrupt: + interrupted = True + pass + deltas.PrintDeltas() + print("Block height: {}".format(latestHeight)) + print("Chain total value: {} ZEC".format(block['chainSupply']['chainValueZat'] / COIN)) + print("Theoretical maximum supply: {} ZEC".format(theoretical / COIN)) + if interrupted: + print("Supply check was interrupted; supply delta evaluation incomplete.") + else: + print("Blocks with unclaimed balance: {}".format(len(deltas.delta_cache))) + print("Unclaimed total: {} ZEC".format(deltas.delta_total / COIN)) + +if __name__ == "__main__": + main() diff --git a/contrib/metrics/supply_check/deltas_mainnet.py b/contrib/metrics/supply_check/deltas_mainnet.py new file mode 100644 index 000000000..f42b27294 --- /dev/null +++ b/contrib/metrics/supply_check/deltas_mainnet.py @@ -0,0 +1,15529 @@ +from .funding_streams_mainnet import fr_addrs +from .supply_deltas import SupplyDeltas + +def MainnetSupplyDeltas(): + return SupplyDeltas( + fr_addrs, +{'t1JQN9RSyrYDRVnx9PsoyA1KYq4JCdooGj5': [(1440508, 31250), (1440629, 31250)], + 't1K3HfLpbqzoWx1sv7wHAHjjyrPYyzacZUq': [(514, 10000), (557, 20000), + (561, 10000), (703, 10000), + (785, 10000), (804, 95250), + (805, 10000), (807, 29020), + (816, 20000), (829, 10000), + (876, 40000), (881, 103059), + (890, 81130), (906, 170960), + (933, 20000), (1011, 30000), + (1170, 79065), (1654, 10000), + (1658, 30000), (1659, 30000), + (2038, 10960), (2067, 60000), + (2086, 10000), (2089, 10000), + (2112, 40000), (2133, 10000), + (2148, 70000), (2177, 10000), + (2183, 10000), (2230, 30000), + (2272, 10000), (2275, 23430), + (2279, 10000), (2322, 103967), + (2365, 112922), (2419, 22715), + (2424, 18436), (2425, 299670), + (2444, 40000), (2452, 10000), + (2458, 42375), (2473, 60000), + (2542, 120913), (2543, 20000), + (2560, 107129), (2661, 238802), + (2718, 72878), (2757, 10000), + (3308, 20000), (3316, 49352), + (3333, 81158), (3360, 49638), + (3379, 1460810), (3395, 58381), + (3460, 162855), (3497, 10000), + (3856, 60000), (4370, 103896), + (5178, 20000), (5292, 93071), + (5460, 10000), (5777, 20000), + (5924, 10000), (5992, 40000), + (6035, 12676), (6049, 10000), + (8206, 91511), (8311, 13079), + (10546, 10000), (10561, 30000), + (10600, 31925), (12169, 10000), + (15378, 16124), (21457, 10000), + (23968, 13084), (24130, 19159), + (26822, 40000), (27778, 46000), + (27831, 10000)], + 't1M3SDBnPhFNpyQfsc7qGfJ3McViE8ngYjf': [(1550681, 1562500), (1551324, 1562500), + (1551622, 1562500), (1551924, 1562500), + (1552274, 1562500), (1552622, 1562500), + (1552993, 1562500), (1553900, 1562500), + (1554475, 1562500), + (1555532, 1562500)], + 't1Q4wCR4UmiUDH2yzNEszKrEvC1wR37sCVv': [(540938, 125000), (552062, 125000)], + 't1QGNftnPTNC6jaYEMqhPjnK7TjVB4GV1vd': [(1431310, 50000000), + (1435498, 50000000), + (1436703, 50000000)], + 't1SaATQbzURpG1qU3vz9Wfn3pwXoTqFtTq2': [(432, 10000), (435, 10000), + (468, 10000), (481, 10000), + (482, 10000), (483, 10000), + (532, 10000), (533, 10000), + (541, 20000), (546, 10000), + (548, 20000), (554, 20000), + (555, 1130), (564, 68750), + (570, 40000), (572, 165667), + (573, 73220), (574, 10000), + (575, 11130), (579, 10000), + (586, 10000), (597, 120000), + (600, 51125), (604, 22605), + (613, 10000), (616, 2605), + (619, 11130), (637, 52255), + (642, 10000), (647, 40000), + (653, 20000), (654, 50000), + (657, 31130), (675, 30000), + (679, 10000), (684, 30000), + (694, 10000), (696, 10000), + (717, 10000), (724, 1130), + (726, 30000), (730, 10000), + (753, 10000), (772, 53340), + (776, 30000), (786, 1865), + (797, 10000), (803, 10000), + (813, 10000), (814, 10000), + (827, 36125), (828, 61000), + (830, 20000), (832, 20000), + (849, 10000), (855, 60000), + (856, 20000), (857, 20000), + (859, 61870), (860, 10000), + (868, 163730), (887, 100000), + (889, 40000), (896, 20000), + (897, 60000), (917, 10000), + (927, 40000), (930, 10000), + (943, 20000), (948, 60000), + (957, 60000), (968, 201130), + (974, 56065), (980, 145653), + (992, 35000), (1002, 52676), + (1013, 120000), (1025, 40000), + (1042, 32402), (1045, 119082), + (1050, 88789), (1057, 274434), + (1062, 70000), (1067, 20000), + (1070, 74586), (1084, 10000), + (1085, 35365), (1092, 80000), + (1098, 61160), (1102, 11865), + (1103, 101055), (1107, 103673), + (1108, 31155), (1112, 10000), + (1121, 10000), (1127, 10000), + (1133, 10000), (1134, 152668), + (1137, 10000), (1138, 50000), + (1140, 20000), (1141, 120220), + (1143, 41000), (1152, 20000), + (1161, 30000), (1163, 20000), + (1164, 10000), (1168, 20000), + (1173, 10000), (1176, 240272), + (1182, 10000), (1184, 10000), + (1192, 168162), (1199, 102045), + (1200, 21160), (1210, 20000), + (1211, 156580), (1213, 10000), + (1214, 62145), (1215, 102042), + (1220, 22945), (1223, 102500), + (1226, 40000), (1232, 51160), + (1235, 41914), (1237, 10000), + (1239, 41870), (1244, 40000), + (1251, 31940), (1254, 70522), + (1257, 56518), (1258, 115349), + (1263, 25721), (1268, 30000), + (1269, 45414), (1275, 72750), + (1280, 20000), (1281, 30000), + (1282, 100751), (1283, 10000), + (1286, 10000), (1287, 10000), + (1288, 20000), (1289, 39070), + (1295, 63445), (1297, 20000), + (1299, 30000), (1302, 210766), + (1303, 20000), (1307, 40000), + (1308, 30000), (1309, 10000), + (1311, 26168), (1312, 30000), + (1314, 149549), (1318, 30000), + (1325, 14183), (1326, 30000), + (1328, 10000), (1332, 10000), + (1342, 20000), (1346, 80000), + (1352, 10000), (1361, 10000), + (1362, 10000), (1363, 20000), + (1364, 92258), (1365, 10000), + (1366, 22535), (1367, 10000), + (1368, 95430), (1369, 40000), + (1375, 60000), (1376, 10000), + (1377, 40000), (1379, 20000), + (1381, 3439), (1382, 10000), + (1384, 10000), (1385, 20000), + (1392, 250710), (1393, 66328), + (1396, 10000), (1398, 10000), + (1400, 18028), (1402, 163954), + (1404, 20000), (1407, 23433), + (1408, 107899), (1409, 10000), + (1410, 21914), (1411, 35347), + (1412, 20000), (1413, 10000), + (1415, 123428), (1416, 20000), + (1417, 20000), (1419, 41278), + (1420, 169576), (1421, 93411), + (1422, 30000), (1423, 41914), + (1425, 10000), (1427, 76113), + (1431, 10000), (1434, 10000), + (1439, 167912), (1441, 10000), + (1443, 25516), (1454, 20000), + (1455, 116113), (1456, 23893), + (1457, 65000), (1461, 10000), + (1462, 40000), (1463, 30000), + (1465, 20000), (1470, 20000), + (1471, 40000), (1472, 62763), + (1473, 20960), (1475, 54314), + (1478, 207578), (1479, 10000), + (1481, 111832), (1488, 50000), + (1494, 92318), (1495, 69428), + (1496, 20000), (1497, 41160), + (1499, 20000), (1500, 10000), + (1501, 134195), (1503, 30000), + (1504, 10000), (1505, 122933), + (1506, 90162), (1508, 31914), + (1510, 20000), (1515, 10000), + (1521, 40000), (1523, 20000), + (1524, 10000), (1526, 245967), + (1527, 167201), (1528, 20980), + (1530, 16000), (1533, 30000), + (1537, 20000), (1542, 110000), + (1543, 10000), (1548, 126819), + (1551, 166387), (1553, 11914), + (1556, 113414), (1557, 73472), + (1560, 29492), (1562, 470063), + (1567, 11159), (1573, 177584), + (1574, 10000), (1577, 10000), + (1578, 33432), (1579, 11154), + (1582, 10000), (1583, 50000), + (1584, 20000), (1589, 149007), + (1592, 115468), (1594, 10000), + (1595, 143240), (1596, 10000), + (1598, 10000), (1599, 40000), + (1600, 93519), (1601, 17159), + (1604, 20000), (1605, 10000), + (1612, 10000), (1615, 10000), + (1616, 10000), (1617, 20000), + (1619, 54186), (1621, 95222), + (1623, 20000), (1625, 10000), + (1626, 90000), (1628, 99108), + (1629, 10000), (1630, 10000), + (1631, 40000), (1632, 10000), + (1634, 20000), (1636, 324253), + (1637, 90038), (1638, 30000), + (1640, 10000), (1645, 143042), + (1646, 10000), (1649, 88098), + (1650, 133256), (1653, 10000), + (1661, 20000), (1663, 10000), + (1665, 20000), (1670, 20000), + (1671, 31918), (1672, 20000), + (1675, 170956), (1677, 32673), + (1678, 50000), (1679, 30000), + (1682, 5000), (1683, 76159), + (1684, 29257), (1694, 30000), + (1695, 21540), (1696, 20000), + (1697, 10000), (1699, 10000), + (1701, 11130), (1706, 53477), + (1707, 56206), (1708, 10000), + (1709, 30000), (1710, 60000), + (1711, 40000), (1713, 20000), + (1715, 10000), (1718, 41154), + (1722, 30000), (1724, 10000), + (1725, 90000), (1728, 40000), + (1730, 20000), (1733, 10000), + (1734, 20000), (1736, 190189), + (1739, 191718), (1742, 132000), + (1743, 20000), (1744, 20000), + (1746, 68356), (1749, 36453), + (1751, 30000), (1753, 50000), + (1759, 40000), (1760, 10000), + (1763, 10000), (1765, 10000), + (1767, 20000), (1768, 12091), + (1769, 20000), (1770, 20000), + (1771, 11914), (1775, 10000), + (1776, 73308), (1779, 10000), + (1781, 126835), (1782, 10000), + (1783, 30000), (1784, 106805), + (1786, 23431), (1789, 20000), + (1790, 40000), (1795, 10000), + (1799, 10000), (1804, 20000), + (1805, 11000), (1807, 60000), + (1809, 11914), (1811, 20000), + (1812, 71159), (1813, 20000), + (1814, 10000), (1815, 30000), + (1816, 64585), (1818, 10000), + (1819, 13420), (1820, 34990), + (1825, 71085), (1828, 112952), + (1829, 30000), (1830, 10000), + (1834, 85458), (1835, 20000), + (1837, 61736), (1838, 61154), + (1839, 20000), (1840, 20000), + (1842, 20000), (1843, 20000), + (1844, 111080), (1845, 100000), + (1846, 41159), (1849, 89470), + (1850, 10000), (1851, 30000), + (1855, 10000), (1856, 30000), + (1857, 10000), (1858, 40000), + (1861, 50000), (1862, 35785), + (1865, 10000), (1871, 30180), + (1873, 82554), (1874, 10000), + (1876, 10000), (1877, 21914), + (1878, 10000), (1880, 30000), + (1883, 10000), (1884, 20000), + (1886, 10000), (1887, 20000), + (1888, 30000), (1891, 37294), + (1892, 20000), (1893, 30000), + (1894, 10000), (1895, 30000), + (1896, 10000), (1897, 80000), + (1902, 10000), (1903, 60000), + (1904, 10000), (1906, 10000), + (1907, 11914), (1911, 10000), + (1912, 110000), (1913, 40000), + (1915, 10000), (1916, 56206), + (1917, 20000), (1920, 30000), + (1921, 30000), (1926, 10000), + (1930, 50000), (1931, 40000), + (1932, 20000), (1933, 20000), + (1934, 40000), (1935, 10000), + (1936, 20100), (1940, 10000), + (1942, 10000), (1943, 90000), + (1944, 667103), (1946, 20000), + (1947, 32671), (1949, 10000), + (1952, 10000), (1956, 70000), + (1960, 10000), (1961, 10000), + (1963, 20000), (1967, 30000), + (1969, 26000), (1971, 20000), + (1972, 40000), (1974, 93345), + (1975, 50000), (1976, 20000), + (1980, 115138), (1981, 32660), + (1982, 20000), (1983, 46937), + (1987, 60000), (1988, 10000), + (1990, 10000), (1993, 11158), + (1996, 51912), (1997, 10000), + (1998, 30000), (2000, 61158), + (2004, 10000), (2006, 30000), + (2007, 93424), (2008, 72140), + (2009, 20000), (2011, 52120), + (2012, 20000), (2013, 50965), + (2014, 10000), (2017, 20824), + (2019, 90000), (2020, 50000), + (2021, 20000), (2023, 10000), + (2025, 311119), (2028, 136000), + (2029, 40000), (2030, 10000), + (2031, 10000), (2035, 40000), + (2039, 15685), (2040, 20000), + (2041, 10000), (2043, 50809), + (2044, 50000), (2045, 116955), + (2046, 50000), (2047, 70000), + (2048, 30000), (2050, 20000), + (2051, 50000), (2053, 20000), + (2055, 59224), (2065, 38689), + (2073, 10000), (2074, 40000), + (2078, 10000), (2079, 10000), + (2081, 10000), (2083, 1158), + (2087, 10000), (2088, 10000), + (2093, 10000), (2094, 30000), + (2098, 20000), (2101, 20000), + (2102, 50000), (2104, 27294), + (2105, 31158), (2107, 10000), + (2108, 10000), (2116, 20000), + (2118, 10000), (2119, 10000), + (2120, 11130), (2121, 33074), + (2122, 408857), (2123, 10000), + (2124, 40000), (2125, 1911), + (2126, 20000), (2130, 114080), + (2134, 1914), (2137, 10000), + (2138, 20000), (2140, 10000), + (2141, 22674), (2143, 10000), + (2144, 20000), (2145, 41019), + (2162, 10000), (2166, 10000), + (2172, 10000), (2174, 10000), + (2178, 10000), (2179, 10000), + (2185, 10000), (2188, 20000), + (2192, 75162), (2193, 41000), + (2194, 6000), (2213, 20000), + (2214, 10000), (2215, 10000), + (2218, 73502), (2219, 6684), + (2221, 10000), (2222, 10000), + (2224, 20000), (2228, 124975), + (2229, 216253), (2235, 10000), + (2244, 10000), (2246, 20000), + (2249, 40000), (2251, 10000), + (2252, 10000), (2253, 60141), + (2255, 31917), (2262, 14183), + (2266, 1159), (2267, 22677), + (2273, 12202), (2274, 217914), + (2281, 10000), (2284, 31682), + (2285, 197528), (2291, 321297), + (2294, 257232), (2298, 40000), + (2299, 10000), (2300, 137513), + (2304, 10000), (2308, 143918), + (2310, 30000), (2312, 73144), + (2314, 75586), (2315, 20000), + (2321, 39700), (2324, 38011), + (2329, 112350), (2332, 10000), + (2333, 10000), (2335, 26000), + (2339, 46103), (2341, 10000), + (2342, 1158), (2343, 20000), + (2348, 247652), (2350, 235854), + (2351, 22654), (2353, 210697), + (2354, 10000), (2356, 44595), + (2357, 10000), (2362, 14805), + (2367, 10000), (2368, 95344), + (2375, 122672), (2376, 10000), + (2378, 10000), (2384, 10000), + (2387, 10000), (2389, 10000), + (2391, 10000), (2393, 130000), + (2397, 30000), (2400, 13077), + (2401, 60000), (2404, 10000), + (2407, 10000), (2408, 30000), + (2411, 10000), (2413, 10000), + (2418, 101282), (2420, 10000), + (2426, 34185), (2427, 122183), + (2428, 33320), (2429, 68628), + (2430, 20000), (2431, 147554), + (2433, 10000), (2435, 68003), + (2436, 41913), (2438, 30000), + (2441, 50000), (2443, 87357), + (2454, 30000), (2456, 72317), + (2457, 100), (2459, 21494), + (2460, 30000), (2461, 90208), + (2463, 10000), (2465, 61878), + (2466, 14195), (2467, 21154), + (2468, 30000), (2469, 30000), + (2470, 20000), (2472, 21000), + (2474, 124995), (2475, 11159), + (2476, 73269), (2480, 50000), + (2492, 79381), (2493, 20631), + (2496, 10000), (2497, 40000), + (2500, 10000), (2509, 76244), + (2516, 31159), (2518, 10000), + (2520, 53831), (2523, 20000), + (2528, 37913), (2529, 69112), + (2530, 80333), (2531, 10000), + (2535, 74431), (2539, 26457), + (2540, 30000), (2547, 184223), + (2549, 10000), (2562, 73190), + (2563, 208429), (2565, 10000), + (2566, 227340), (2567, 32667), + (2568, 10000), (2570, 121260), + (2572, 195986), (2573, 86455), + (2583, 107564), (2598, 129976), + (2601, 21914), (2604, 70960), + (2606, 20000), (2611, 21159), + (2616, 10000), (2618, 10000), + (2621, 35568), (2626, 48599), + (2628, 10000), (2630, 10000), + (2632, 60500), (2635, 13970), + (2653, 10000), (2657, 10000), + (2659, 10000), (2662, 15344), + (2666, 48011), (2668, 63327), + (2671, 43420), (2672, 11158), + (2677, 254337), (2688, 26130), + (2697, 12565), (2700, 10000), + (2711, 311341), (2715, 10000), + (2717, 10000), (2721, 43356), + (2728, 10000), (2729, 75925), + (2730, 133164), (2735, 80000), + (2736, 65111), (2746, 10000), + (2747, 40000), (2759, 10000), + (2769, 79183), (2770, 10000), + (2776, 20000), (2784, 10000), + (2800, 10000), (2802, 20000), + (2809, 60000), (2816, 10000), + (2818, 10000), (2819, 50678), + (2821, 30000), (2830, 31000), + (2833, 182477), (2836, 255694), + (2840, 138722), (2843, 41410), + (2844, 112094), (2847, 201971), + (2850, 204961), (2854, 40000), + (2860, 113661), (2862, 71159), + (2882, 10000), (2889, 104945), + (2892, 87681), (2894, 32989), + (2898, 113828), (2907, 20000), + (2909, 10000), (2910, 20000), + (2919, 70278), (2920, 44935), + (2924, 41918), (2926, 10000), + (2927, 30000), (2929, 456588), + (2936, 21159), (2937, 61159), + (2945, 10000), (2949, 40327), + (2954, 70000), (2955, 20000), + (2956, 44175), (2957, 111159), + (2959, 80854), (2962, 30000), + (2964, 109246), (2966, 10000), + (2976, 60840), (2980, 18361), + (2982, 38342), (2983, 10000), + (2991, 60000), (2993, 88453), + (2998, 70000), (2999, 10000), + (3002, 10000), (3004, 113477), + (3006, 10000), (3008, 33826), + (3009, 40000), (3010, 52027), + (3013, 20000), (3015, 20000), + (3026, 20000), (3037, 48375), + (3038, 140763), (3050, 51159), + (3052, 21159), (3055, 64185), + (3061, 52598), (3069, 20000), + (3079, 110000), (3080, 20000), + (3091, 30000), (3092, 40000), + (3104, 31158), (3107, 40000), + (3110, 40000), (3118, 44176), + (3119, 22580), (3120, 30000), + (3122, 138586), (3123, 71905), + (3125, 35572), (3127, 25689), + (3133, 30000), (3135, 133558), + (3136, 10000), (3137, 10000), + (3148, 33828), (3149, 60861), + (3151, 64176), (3152, 243155), + (3153, 50000), (3159, 10000), + (3161, 2670), (3170, 20000), + (3177, 51158), (3180, 10000), + (3181, 41911), (3182, 30000), + (3186, 40000), (3192, 40000), + (3201, 20000), (3205, 10000), + (3209, 20000), (3223, 106880), + (3225, 10000), (3236, 86248), + (3249, 20000), (3252, 40000), + (3255, 136830), (3272, 40000), + (3277, 10000), (3279, 30000), + (3285, 21158), (3290, 67658), + (3298, 18777), (3299, 60000), + (3300, 20000), (3302, 684880), + (3309, 20000), (3320, 20000), + (3335, 143104), (3340, 21130), + (3349, 20000), (3351, 30000), + (3359, 142289), (3363, 50000), + (3368, 20000), (3374, 171863), + (3381, 200294), (3385, 20000), + (3387, 154583), (3388, 50763), + (3389, 90000), (3394, 1902521), + (3398, 30000), (3403, 10000), + (3404, 70000), (3410, 99891), + (3414, 10000), (3426, 20000), + (3429, 69488), (3432, 11910), + (3433, 40000), (3435, 20000), + (3459, 223040), (3462, 21915), + (3464, 40000), (3465, 73067), + (3466, 30000), (3481, 846682), + (3483, 40000), (3489, 129956), + (3490, 193093), (3499, 10000), + (3501, 30955), (3503, 91260), + (3513, 20000), (3514, 1910), + (3515, 21153), (3528, 10000), + (3529, 188028), (3544, 54741), + (3545, 43432), (3551, 31911), + (3571, 194724), (3573, 2669), + (3576, 81530), (3580, 30000), + (3581, 127079), (3583, 31157), + (3587, 536436), (3588, 37287), + (3591, 44762), (3595, 80852), + (3597, 2980917), (3602, 23078), + (3603, 129396), (3604, 26090), + (3605, 10000), (3607, 30000), + (3608, 30000), (3609, 30000), + (3611, 91730), (3613, 20000), + (3614, 50000), (3615, 10000), + (3616, 18706), (3621, 10000), + (3622, 10000), (3630, 105175), + (3633, 10000), (3635, 71605), + (3641, 50000), (3643, 1527490), + (3644, 10000), (3648, 60000), + (3653, 131572), (3662, 30000), + (3663, 21153), (3666, 20000), + (3671, 20983), (3676, 30000), + (3681, 90000), (3682, 44580), + (3683, 20000), (3692, 70000), + (3704, 1776812), (3705, 10000), + (3718, 30000), (3719, 30000), + (3744, 3111362), (3750, 64920), + (3752, 59866), (3758, 26901), + (3760, 41906), (3774, 10000), + (3796, 2669), (3800, 109531), + (3834, 20000), (3846, 30000), + (3849, 30000), (3860, 20000), + (3868, 42668), (3884, 81865), + (3889, 80000), (3890, 10000), + (3895, 50000), (3898, 19000), + (3899, 20000), (3907, 626819), + (3912, 67994), (3913, 10000), + (3918, 140769), (3921, 88944), + (3924, 136154), (3926, 109994), + (3929, 257249), (3934, 40000), + (3939, 192126), (3940, 70816), + (3947, 2663), (3948, 1910), + (3949, 10000), (3954, 70000), + (3958, 22717), (3959, 40000), + (3979, 25000), (3991, 74590), + (3996, 31157), (4008, 10000), + (4010, 106519), (4017, 71916), + (4018, 30000), (4053, 127735), + (4055, 10000), (4056, 301194), + (4057, 21152), (4058, 10000), + (4063, 481574), (4068, 31153), + (4071, 50000), (4078, 56000), + (4087, 53757), (4095, 40000), + (4098, 30000), (4101, 20000), + (4103, 110347), (4108, 12600), + (4114, 85508), (4120, 296702), + (4132, 40000), (4139, 89197), + (4142, 10000), (4145, 70000), + (4148, 90000), (4150, 70000), + (4158, 83071), (4166, 103730), + (4171, 12222), (4175, 20000), + (4179, 102911), (4182, 20000), + (4184, 61153), (4199, 11158), + (4200, 46677), (4209, 70000), + (4210, 40000), (4212, 10000), + (4215, 358639), (4221, 15000), + (4244, 132670), (4246, 95803), + (4251, 20000), (4262, 30000), + (4268, 22494), (4269, 50000), + (4270, 145368), (4271, 102636), + (4280, 30000), (4285, 60000), + (4290, 181583), (4292, 51158), + (4311, 11911), (4319, 10000), + (4321, 419098), (4323, 12302), + (4346, 26449), (4366, 108450), + (4371, 92005), (4378, 1912), + (4381, 10000), (4385, 16201), + (4402, 70000), (4411, 110000), + (4418, 50000), (4422, 10000), + (4423, 50000), (4437, 111951), + (4444, 20000), (4450, 20000), + (4455, 152672), (4461, 50000), + (4462, 32468), (4463, 128491), + (4465, 30000), (4470, 43000), + (4478, 70000), (4479, 50544), + (4488, 92430), (4494, 81269), + (4497, 20000), (4506, 120000), + (4512, 171122), (4519, 129688), + (4522, 15000), (4536, 55935), + (4545, 81738), (4547, 50000), + (4548, 35000), (4563, 120883), + (4565, 10000), (4566, 40000), + (4580, 34400), (4585, 70000), + (4610, 10000), (4619, 36753), + (4620, 71870), (4631, 45000), + (4632, 40000), (4634, 10000), + (4642, 133310), (4645, 20000), + (4650, 131738), (4655, 36457), + (4657, 10000), (4658, 88320), + (4668, 83888), (4679, 71130), + (4683, 20000), (4687, 111154), + (4695, 120000), (4714, 51744), + (4718, 117520), (4748, 50000), + (4749, 20000), (4751, 62666), + (4753, 40000), (4764, 60000), + (4767, 52667), (4769, 69465), + (4774, 10000), (4775, 10000), + (4779, 166541), (4799, 20000), + (4801, 176211), (4802, 30000), + (4806, 181284), (4811, 40000), + (4822, 20000), (4829, 45000), + (4835, 20000), (4839, 40000), + (4845, 21865), (4853, 25000), + (4860, 84181), (4862, 45439), + (4864, 10000), (4866, 20000), + (4868, 55000), (4870, 69000), + (4885, 21913), (4893, 103888), + (4897, 83792), (4902, 60000), + (4909, 26852), (4910, 34590), + (4913, 210050), (4915, 10000), + (4925, 54010), (4939, 95385), + (4941, 34080), (4946, 398049), + (4957, 42332), (4958, 103340), + (4960, 15000), (4961, 55000), + (4969, 10000), (4976, 50000), + (4979, 22666), (4980, 20000), + (4984, 52676), (4986, 42600), + (4990, 40000), (4992, 40000), + (4993, 23738), (4995, 56202), + (5001, 50000), (5015, 80412), + (5020, 51870), (5021, 20000), + (5033, 103814), (5048, 35337), + (5049, 20000), (5054, 45000), + (5057, 70979), (5059, 120000), + (5071, 10000), (5080, 43956), + (5100, 10000), (5101, 329580), + (5121, 80000), (5122, 5874), + (5126, 121750), (5130, 75000), + (5132, 34185), (5138, 40000), + (5146, 10000), (5149, 10000), + (5166, 222757), (5167, 120000), + (5171, 10000), (5174, 48524), + (5177, 90000), (5200, 10000), + (5205, 125918), (5206, 120000), + (5231, 10000), (5233, 10416), + (5247, 20000), (5261, 10000), + (5262, 150710), (5265, 167904), + (5284, 80000), (5286, 15790), + (5296, 137270), (5310, 10000), + (5311, 60000), (5323, 60000), + (5329, 59000), (5337, 50000), + (5347, 62671), (5355, 20000), + (5367, 151100), (5379, 70000), + (5384, 75000), (5387, 50000), + (5389, 30000), (5400, 10000), + (5402, 104732), (5403, 183825), + (5408, 40000), (5412, 10000), + (5413, 21000), (5440, 10000), + (5441, 155508), (5462, 10000), + (5466, 20000), (5467, 10000), + (5468, 10000), (5471, 60000), + (5477, 10000), (5483, 60215), + (5484, 20000), (5486, 61912), + (5492, 46794), (5497, 150000), + (5505, 40622), (5506, 55550), + (5507, 30000), (5516, 20000), + (5521, 20000), (5523, 50000), + (5534, 50000), (5546, 113060), + (5552, 177248), (5555, 74183), + (5583, 107602), (5587, 22666), + (5591, 20000), (5592, 40000), + (5593, 27655), (5594, 80000), + (5604, 179245), (5607, 10000), + (5614, 207122), (5618, 10000), + (5623, 20000), (5625, 10000), + (5645, 20000), (5646, 28712), + (5650, 74258), (5660, 180000), + (5677, 87778), (5680, 51159), + (5684, 25689), (5690, 10000), + (5697, 80000), (5736, 10000), + (5738, 108611), (5745, 163654), + (5768, 29629), (5771, 90000), + (5773, 24935), (5775, 33437), + (5776, 10000), (5781, 160000), + (5786, 90000), (5791, 25689), + (5807, 120000), (5813, 30000), + (5817, 80000), (5823, 134231), + (5840, 40000), (5842, 50000), + (5849, 140000), (5853, 60000), + (5857, 60000), (5858, 20000), + (5861, 42348), (5865, 167560), + (5867, 31913), (5872, 40000), + (5874, 130000), (5882, 40000), + (5886, 10000), (5887, 110000), + (5888, 429627), (5899, 30000), + (5907, 93477), (5927, 60000), + (5948, 20000), (5952, 84934), + (5963, 10000), (5970, 90000), + (5978, 51159), (5982, 45000), + (5985, 10000), (5987, 50000), + (5995, 20000), (5996, 33425), + (5997, 20000), (5998, 40000), + (6003, 10000), (6006, 120000), + (6010, 40000), (6011, 50000), + (6014, 10000), (6015, 30000), + (6027, 200000), (6029, 89559), + (6031, 20000), (6039, 228016), + (6040, 163829), (6044, 198645), + (6046, 75992), (6051, 99000), + (6053, 24178), (6054, 10000), + (6058, 74954), (6060, 10000), + (6085, 40000), (6086, 80000), + (6118, 128486), (6120, 50000), + (6121, 21917), (6135, 52030), + (6136, 72671), (6149, 204750), + (6150, 152752), (6152, 10000), + (6153, 255828), (6159, 35501), + (6167, 18873), (6171, 60000), + (6185, 10000), (6191, 43188), + (6216, 30000), (6218, 10000), + (6219, 66098), (6224, 45096), + (6228, 32313), (6232, 20000), + (6236, 30000), (6237, 66424), + (6247, 41508), (6257, 31154), + (6258, 43995), (6276, 1333), + (6281, 29159), (6282, 10000), + (6287, 20000), (6299, 31492), + (6313, 32841), (6316, 58850), + (6319, 37841), (6331, 30000), + (6336, 30000), (6351, 10000), + (6356, 90000), (6363, 31508), + (6370, 253211), (6377, 10000), + (6378, 10000), (6381, 10000), + (6404, 10000), (6417, 85873), + (6421, 71682), (6434, 53073), + (6437, 254768), (6442, 11159), + (6447, 32667), (6449, 52397), + (6451, 50000), (6455, 27491), + (6468, 66000), (6472, 97967), + (6489, 10000), (6497, 21334), + (6511, 10000), (6520, 51159), + (6521, 31329), (6550, 70000), + (6558, 30000), (6559, 63480), + (6563, 10000), (6570, 11160), + (6581, 10000), (6584, 57249), + (6586, 10000), (6587, 11334), + (6597, 98657), (6602, 32975), + (6603, 81154), (6610, 67251), + (6626, 11155), (6630, 10000), + (6638, 34757), (6641, 10000), + (6648, 12674), (6671, 5613), + (6672, 11329), (6673, 39139), + (6674, 32475), (6677, 71155), + (6685, 10000), (6688, 70019), + (6693, 10000), (6698, 40635), + (6706, 21155), (6708, 40000), + (6710, 114404), (6721, 10000), + (6727, 53697), (6739, 330816), + (6749, 28451), (6753, 4190), + (6754, 54754), (6756, 88969), + (6761, 57827), (6766, 51160), + (6777, 89979), (6780, 53097), + (6782, 24584), (6793, 22089), + (6808, 43481), (6817, 10000), + (6823, 48490), (6825, 56435), + (6828, 143261), (6839, 50000), + (6841, 20000), (6848, 10000), + (6854, 32211), (6855, 91865), + (6859, 10000), (6868, 31807), + (6870, 20000), (6881, 10000), + (6885, 10000), (6886, 20000), + (6904, 112070), (6909, 111190), + (6910, 16690), (6913, 34180), + (6923, 10000), (6929, 10000), + (6932, 202541), (6933, 143368), + (6934, 17495), (6939, 62495), + (6942, 90000), (6947, 20000), + (6959, 10000), (6960, 49590), + (6977, 2315), (6981, 40000), + (6985, 50000), (7004, 20501), + (7007, 10000), (7008, 33250), + (7011, 59783), (7013, 134085), + (7022, 65262), (7023, 149418), + (7031, 23512), (7032, 59896), + (7038, 10000), (7040, 101005), + (7045, 69185), (7052, 85685), + (7053, 10000), (7063, 76921), + (7074, 28321), (7087, 60000), + (7092, 10000), (7109, 10000), + (7132, 123931), (7143, 10000), + (7154, 114808), (7187, 31504), + (7197, 10000), (7213, 9755), + (7214, 53720), (7216, 10000), + (7217, 48490), (7229, 27210), + (7237, 21335), (7252, 44530), + (7260, 20000), (7271, 50000), + (7273, 50000), (7296, 21160), + (7302, 95695), (7306, 10000), + (7314, 143826), (7321, 52315), + (7322, 30160), (7329, 92650), + (7341, 117168), (7357, 88278), + (7371, 6155), (7375, 48171), + (7376, 45652), (7377, 386856), + (7385, 112090), (7390, 11160), + (7399, 40300), (7405, 22290), + (7406, 10000), (7407, 10000), + (7413, 32665), (7417, 68170), + (7427, 10000), (7428, 31160), + (7432, 117646), (7442, 52465), + (7443, 16916), (7444, 60000), + (7446, 32270), (7453, 13650), + (7459, 96074), (7462, 10000), + (7464, 10000), (7466, 10000), + (7495, 10000), (7496, 62495), + (7501, 37821), (7503, 24771), + (7505, 30000), (7508, 90000), + (7519, 61330), (7520, 20000), + (7540, 45000), (7541, 53432), + (7547, 86924), (7550, 10000), + (7561, 10000), (7566, 80000), + (7567, 135917), (7594, 73478), + (7595, 1161), (7612, 33251), + (7622, 10000), (7625, 21161), + (7654, 10000), (7658, 10000), + (7685, 10000), (7689, 60000), + (7691, 89000), (7716, 31336), + (7722, 102259), (7731, 10000), + (7732, 10000), (7738, 7675), + (7741, 78422), (7747, 10000), + (7756, 10000), (7761, 24749), + (7780, 10000), (7783, 10000), + (7786, 51715), (7798, 104883), + (7805, 10000), (7818, 37806), + (7820, 20000), (7831, 10000), + (7836, 79515), (7860, 10000), + (7883, 30000), (7888, 83543), + (7893, 23828), (7894, 13032), + (7918, 52503), (7934, 21336), + (7937, 140698), (7948, 35344), + (7956, 33456), (7964, 76632), + (7966, 31336), (7968, 23253), + (7973, 11922), (7976, 31341), + (7979, 12497), (7981, 2497), + (8006, 21156), (8009, 10000), + (8016, 21161), (8017, 10000), + (8029, 21161), (8045, 77846), + (8050, 43647), (8055, 10000), + (8089, 40820), (8095, 37101), + (8102, 21161), (8103, 70000), + (8112, 91511), (8118, 20000), + (8121, 196631), (8122, 10000), + (8131, 33660), (8134, 31156), + (8142, 10000), (8144, 10000), + (8159, 72324), (8163, 64991), + (8181, 63248), (8187, 54432), + (8216, 61169), (8223, 83434), + (8229, 10000), (8241, 60000), + (8304, 22498), (8310, 20000), + (8315, 20000), (8318, 60000), + (8321, 10000), (8330, 10000), + (8339, 141077), (8352, 68024), + (8355, 28143), (8360, 10000), + (8378, 168233), (8383, 302147), + (8384, 76686), (8396, 10000), + (8398, 3836), (8402, 40000), + (8406, 84768), (8426, 10000), + (8428, 69608), (8432, 55728), + (8434, 10000), (8442, 51162), + (8447, 10000), (8450, 11162), + (8451, 47337), (8456, 20000), + (8460, 10000), (8468, 35349), + (8475, 16501), (8477, 10000), + (8484, 52981), (8493, 173327), + (8507, 1160), (8508, 29315), + (8519, 11162), (8529, 75750), + (8532, 106917), (8534, 158074), + (8539, 83651), (8546, 56162), + (8549, 10000), (8554, 62494), + (8555, 10000), (8560, 11162), + (8562, 10000), (8563, 20000), + (8565, 62684), (8567, 55531), + (8592, 10000), (8598, 10000), + (8607, 84408), (8620, 231783), + (8627, 33085), (8628, 10000), + (8635, 88497), (8642, 1337), + (8684, 52679), (8702, 20000), + (8725, 13311), (8732, 30000), + (8733, 202555), (8746, 51157), + (8750, 20000), (8790, 60000), + (8792, 10000), (8801, 21687), + (8811, 1162), (8820, 88054), + (8864, 10000), (8897, 273225), + (8902, 103326), (8903, 10000), + (8905, 1162), (8909, 107319), + (8913, 47047), (8926, 10000), + (8927, 22499), (8931, 109201), + (8938, 10000), (8939, 1162), + (8943, 95284), (8945, 30000), + (8957, 10000), (8960, 10000), + (8962, 96931), (8981, 10000), + (8986, 40000), (9009, 32314), + (9010, 40000), (9011, 15213), + (9021, 10000), (9037, 33086), + (9039, 31162), (9064, 138402), + (9087, 149657), (9090, 10000), + (9100, 11162), (9107, 127283), + (9110, 61532), (9111, 10000), + (9112, 52306), (9124, 21924), + (9125, 84624), (9129, 11162), + (9130, 10000), (9138, 46183), + (9147, 16419), (9154, 10000), + (9165, 7421600), (9171, 10000), + (9187, 11162), (9204, 41494), + (9206, 44471), (9212, 59400), + (9215, 10000), (9217, 89696), + (9227, 37519), (9228, 53085), + (9231, 10000), (9237, 23426), + (9256, 10000), (9259, 59472), + (9260, 1130), (9261, 79000), + (9268, 65527), (9285, 7481502), + (9286, 3363877), (9291, 13834), + (9295, 36729), (9304, 11924), + (9306, 48390), (9310, 31338), + (9311, 16508), (9338, 112185), + (9340, 10000), (9358, 10000), + (9367, 2321), (9370, 7462323), + (9380, 63396), (9382, 117803), + (9390, 11163), (9414, 48683), + (9416, 7412520), (9417, 3745690), + (9420, 36737), (9430, 11924), + (9442, 100577), (9448, 20000), + (9488, 21338), (9495, 30000), + (9497, 10000), (9503, 83839), + (9520, 20000), (9540, 1163), + (9548, 10000), (9556, 69367), + (9561, 99149), (9571, 10000), + (9574, 20889), (9579, 11158), + (9592, 22326), (9594, 88198), + (9627, 10000), (9633, 91622), + (9640, 10000), (9647, 31163), + (9649, 76537), (9654, 53027), + (9681, 194882), (9690, 16567), + (9726, 20000), (9730, 58763), + (9748, 106819), (9755, 73505), + (9769, 10000), (9775, 22326), + (9780, 70196), (9784, 88792), + (9788, 104484), (9789, 10000), + (9791, 160611), (9793, 10000), + (9801, 21688), (9814, 54997), + (9828, 66629), (9831, 10000), + (9835, 84596), (9851, 77270), + (9887, 10000), (9888, 10000), + (9892, 113079), (9899, 2496), + (9910, 10000), (9920, 71880), + (9927, 62429), (9929, 39835), + (9931, 43652), (9954, 73658), + (9957, 93258), (9962, 95188), + (9984, 26742), (10007, 174489), + (10012, 10000), (10015, 20000), + (10016, 159912), (10023, 51163), + (10033, 11688), (10047, 11676), + (10057, 42431), (10059, 122714), + (10073, 50000), (10074, 108014), + (10076, 83911), (10077, 64353), + (10082, 53664), (10087, 10000), + (10090, 7453313), (10092, 3476699), + (10100, 26016), (10113, 28694), + (10120, 10000), (10132, 1158), + (10164, 10000), (10186, 1688), + (10197, 148270), (10239, 41163), + (10243, 5000), (10264, 53083), + (10268, 25000), (10269, 31925), + (10276, 10000), (10280, 10000), + (10281, 20000), (10283, 31163), + (10286, 10000), (10292, 10000), + (10294, 29202), (10301, 61158), + (10309, 21920), (10318, 296621), + (10320, 10000), (10322, 10000), + (10341, 61783), (10342, 24475), + (10347, 10000), (10349, 16406), + (10363, 11508), (10367, 56088), + (10375, 10000), (10387, 93632), + (10404, 66659), (10442, 20000), + (10447, 60420), (10448, 186508), + (10449, 11163), (10450, 13252), + (10455, 10000), (10465, 78812), + (10476, 39281), (10481, 11513), + (10497, 191163), (10498, 30000), + (10506, 43664), (10550, 60000), + (10554, 105000), (10572, 103834), + (10576, 9117), (10583, 50255), + (10585, 10000), (10596, 41163), + (10624, 21333), (10632, 12321), + (10633, 11338), (10646, 20000), + (10696, 21863), (10697, 10000), + (10706, 11158), (10710, 7446988), + (10711, 7422860), (10714, 10000), + (10734, 47896), (10748, 31163), + (10769, 65047), (10788, 80183), + (10797, 44493), (10829, 10000), + (10833, 10000), (10839, 11925), + (10843, 116916), (10844, 10000), + (10846, 86068), (10854, 30000), + (10859, 48287), (10862, 60710), + (10882, 90371), (10895, 34962), + (10916, 80331), (10918, 10000), + (10950, 143927), (10954, 20000), + (10961, 20000), (10976, 1925), + (10996, 129797), (11006, 98685), + (11019, 93111), (11051, 10000), + (11069, 71513), (11085, 49000), + (11087, 20000), (11107, 2260993), + (11109, 29000), (11115, 21163), + (11120, 50315), (11123, 10000), + (11127, 10000), (11135, 31163), + (11138, 35725), (11140, 10000), + (11149, 10000), (11158, 9537), + (11160, 13434), (11164, 16697), + (11183, 45000), (11191, 7430208), + (11197, 7434613), (11203, 7435352), + (11224, 10000), (11229, 110044), + (11231, 10000), (11235, 41163), + (11236, 31163), (11241, 32901), + (11252, 20000), (11272, 110000), + (11273, 10000), (11289, 55414), + (11294, 29956), (11296, 10000), + (11300, 63940), (11301, 21163), + (11306, 10000), (11319, 22671), + (11324, 27186), (11334, 1338), + (11349, 21338), (11352, 118753), + (11364, 67000), (11371, 11163), + (11374, 10000), (11376, 30000), + (11382, 10000), (11384, 10000), + (11399, 10000), (11414, 107956), + (11415, 50000), (11423, 22666), + (11427, 365577), (11429, 100000), + (11434, 57999), (11437, 10000), + (11443, 10000), (11453, 74209), + (11455, 215295), (11458, 84184), + (11473, 10000), (11477, 40000), + (11480, 41163), (11481, 20000), + (11492, 80000), (11497, 10000), + (11500, 10000), (11516, 10000), + (11532, 44029), (11543, 10000), + (11557, 64245), (11576, 106104), + (11593, 39000), (11613, 60000), + (11619, 10000), (11620, 10000), + (11624, 11333), (11625, 61163), + (11630, 38970), (11631, 10000), + (11643, 37516), (11659, 61163), + (11662, 10000), (11671, 11158), + (11672, 10000), (11678, 10000), + (11680, 30000), (11685, 148285), + (11696, 20000), (11711, 10000), + (11743, 23846), (11760, 24000), + (11774, 71163), (11791, 72497), + (11818, 10000), (11833, 7415603), + (11851, 64603), (11853, 10000), + (11858, 7413890), (11862, 7433410), + (11867, 7412770), (11872, 7412470), + (11874, 7479690), (11877, 7433710), + (11891, 7413840), (11894, 7413860), + (11910, 7413740), (11915, 7412530), + (11921, 7422170), (11923, 7422290), + (11932, 7421260), (11936, 288745), + (11963, 23445), (11973, 10000), + (11976, 21300), (11982, 37652), + (11996, 77555), (12012, 1163), + (12045, 10000), (12055, 98440), + (12063, 10000), (12068, 10000), + (12079, 74592), (12084, 60957), + (12087, 87438), (12100, 3770), + (12109, 11339), (12150, 83198), + (12163, 82095), (12177, 13845), + (12191, 10000), (12198, 32316), + (12221, 30000), (12252, 44719), + (12263, 54597), (12264, 20000), + (12267, 58824), (12286, 11163), + (12287, 10000), (12307, 7412780), + (12312, 7412650), (12317, 7416632), + (12335, 20000), (12337, 20000), + (12339, 16692), (12340, 7413970), + (12347, 7442990), (12349, 7466085), + (12363, 10000), (12377, 40000), + (12392, 7444573), (12393, 7427661), + (12395, 7437979), (12400, 7433310), + (12408, 7476052), (12411, 7411920), + (12413, 7451600), (12438, 51532), + (12462, 19458), (12463, 69998), + (12465, 10000), (12466, 10000), + (12476, 10000), (12482, 70000), + (12488, 93078), (12498, 7413630), + (12500, 7433800), (12507, 7492220), + (12550, 10000), (12552, 50000), + (12553, 50000), (12555, 30780), + (12558, 32512), (12564, 30000), + (12565, 20000), (12570, 25000), + (12571, 20000), (12579, 10000), + (12594, 100000), (12597, 134985), + (12629, 20000), (12636, 20000), + (12664, 181162), (12682, 20000), + (12728, 433968), (12737, 75096), + (12743, 117300), (12744, 263786), + (12758, 20000), (12769, 51924), + (12777, 45727), (12787, 7424810), + (12818, 5714), (12829, 10000), + (12856, 11919), (12858, 28395), + (12876, 77212), (12880, 20000), + (12887, 7413960), (12908, 7441100), + (12913, 40000), (12929, 53843), + (12931, 30000), (12940, 6882), + (12942, 21338), (12954, 12676), + (12985, 4194857), (13010, 56317), + (13022, 10000), (13040, 10000), + (13050, 12321), (13096, 36163), + (13116, 41163), (13125, 50000), + (13126, 30000), (13135, 10000), + (13144, 61513), (13163, 10000), + (13186, 62326), (13205, 74513), + (13208, 10000), (13229, 77768), + (13234, 20000), (13236, 53935), + (13240, 20000), (13260, 94261), + (13264, 10000), (13265, 24082), + (13267, 10000), (13279, 169983), + (13290, 446791), (13291, 10000), + (13296, 10000), (13297, 10000), + (13310, 55975), (13318, 10000), + (13326, 55000), (13327, 40000), + (13339, 5000), (13360, 1163), + (13361, 10000), (13396, 87933), + (13399, 9960), (13402, 42321), + (13407, 53659), (13411, 83697), + (13414, 80265), (13416, 30000), + (13427, 236457), (13432, 10000), + (13436, 70000), (13461, 10000), + (13480, 61589), (13492, 92025), + (13498, 61510), (13515, 10000), + (13518, 10000), (13523, 21163), + (13536, 81513), (13546, 108011), + (13554, 55589), (13555, 26300), + (13556, 79426), (13585, 7459188), + (13595, 6431300), (13597, 7412390), + (13607, 7421770), (13609, 7472428), + (13614, 41163), (13615, 11163), + (13618, 10000), (13628, 98433), + (13647, 71807), (13675, 30000), + (13679, 61338), (13693, 102326), + (13714, 81158), (13722, 10000), + (13727, 101513), (13732, 23438), + (13746, 31163), (13751, 61163), + (13752, 40000), (13756, 40000), + (13761, 31338), (13766, 51158), + (13774, 92346), (13779, 32502), + (13780, 41163), (13784, 105190), + (13785, 132682), (13791, 49391), + (13824, 66647), (13844, 10000), + (13854, 40000), (13863, 10000), + (13894, 10000), (13904, 94242), + (13906, 43484), (13907, 10000), + (13912, 44000), (13913, 100518), + (13925, 93705), (13932, 41163), + (13939, 40000), (13949, 11158), + (13953, 41163), (13966, 30000), + (13968, 107131), (13972, 13089), + (13978, 21926), (13984, 95895), + (13985, 83084), (14006, 67222), + (14009, 10000), (14044, 46000), + (14060, 31163), (14103, 1163), + (14114, 30520), (14118, 87100), + (14125, 20000), (14126, 53670), + (14127, 10000), (14138, 54719), + (14140, 22205), (14155, 240256), + (14165, 95925), (14188, 92326), + (14211, 20000), (14212, 10000), + (14214, 10000), (14225, 63834), + (14230, 39871), (14241, 109547), + (14252, 145613), (14265, 52675), + (14288, 114704), (14292, 35541), + (14295, 66158), (14300, 90477), + (14309, 20000), (14311, 10000), + (14330, 143122), (14336, 131169), + (14340, 20330), (14369, 45000), + (14373, 40000), (14411, 10000), + (14413, 120689), (14416, 10000), + (14444, 90000), (14445, 10000), + (14447, 81163), (14449, 10000), + (14454, 45771), (14464, 33845), + (14468, 10000), (14473, 20000), + (14516, 30000), (14539, 10000), + (14543, 84642), (14547, 92340), + (14552, 20000), (14565, 20000), + (14575, 1163), (14591, 10000), + (14593, 130000), (14594, 95961), + (14595, 43767), (14624, 10000), + (14640, 10000), (14674, 10000), + (14679, 30373), (14682, 52321), + (14707, 21158), (14729, 123642), + (14748, 31158), (14762, 1339), + (14773, 151339), (14774, 261337), + (14811, 30000), (14821, 50000), + (14825, 32507), (14837, 11163), + (14844, 107654), (14866, 31163), + (14882, 60000), (14884, 20000), + (14907, 10000), (14909, 10000), + (14923, 221904), (14924, 101333), + (14925, 99190), (14948, 32090), + (14958, 1163), (14983, 107629), + (15008, 78047), (15016, 10000), + (15039, 15000), (15051, 11339), + (15058, 31163), (15081, 10000), + (15089, 104444), (15124, 87442), + (15155, 64489), (15164, 10000), + (15188, 10000), (15190, 50000), + (15207, 10000), (15215, 11339), + (15223, 35398), (15259, 282344), + (15291, 105622), (15304, 10000), + (15307, 64981), (15317, 78640), + (15329, 20000), (15345, 70776), + (15361, 58676), (15370, 10000), + (15385, 30000), (15405, 10000), + (15451, 10000), (15452, 60000), + (15454, 30000), (15456, 65000), + (15457, 52258), (15469, 67379), + (15477, 3085), (15489, 113360), + (15490, 20000), (15495, 106543), + (15506, 10000), (15516, 28014), + (15524, 10000), (15525, 10000), + (15530, 40000), (15537, 10000), + (15544, 128812), (15558, 105117), + (15565, 102077), (15566, 74604), + (15575, 77028), (15625, 92593), + (15630, 110557), (15634, 20000), + (15666, 51158), (15675, 31158), + (15693, 152328), (15697, 40000), + (15721, 33542), (15731, 69417), + (15761, 100334), (15772, 31164), + (15800, 11164), (15833, 121729), + (15866, 10000), (15880, 46877), + (15914, 20000), (15963, 1921), + (15964, 83560), (15965, 156609), + (15966, 4280), (15976, 200766), + (15982, 70000), (15984, 110196), + (16000, 40000), (16044, 433525), + (16065, 418133), (16082, 20000), + (16098, 45712), (16104, 66257), + (16105, 20000), (16127, 100), + (16136, 61164), (16142, 141425), + (16154, 1164), (16167, 101290), + (16197, 10000), (16198, 50000), + (16226, 79325), (16248, 40000), + (16293, 318486), (16346, 30000), + (16349, 20000), (16352, 46479), + (16353, 78610), (16355, 123547), + (16361, 10000), (16363, 81158), + (16368, 10000), (16401, 41163), + (16407, 88165), (16408, 21163), + (16410, 99177), (16431, 68806), + (16518, 3251), (16523, 30000), + (16538, 71420), (16542, 230564), + (16575, 164510), (16578, 10000), + (16584, 10000), (16588, 30373), + (16601, 142450), (16650, 5000), + (16664, 10000), (16682, 103190), + (16684, 9503), (16701, 10000), + (16711, 23913), (16732, 41042), + (16737, 20000), (16770, 54969), + (16778, 10000), (16827, 10000), + (16835, 1334), (16836, 100722), + (16905, 100953), (16913, 32328), + (16930, 10000), (16933, 60000), + (16967, 62323), (16984, 79185), + (17005, 1164), (17026, 30000), + (17055, 10000), (17093, 20000), + (17121, 10000), (17147, 90000), + (17191, 10000), (17211, 60000), + (17214, 173802), (17217, 72323), + (17221, 1927), (17229, 41922), + (17231, 6514), (17243, 10000), + (17267, 18442), (17268, 10000), + (17289, 1164), (17367, 105164), + (17411, 11926), (17413, 20000), + (17456, 21921), (17493, 10000), + (17506, 7414604), (17524, 1801000), + (17539, 36164), (17548, 20000), + (17549, 11339), (17554, 38000), + (17568, 10000), (17572, 11334), + (17578, 25000), (17581, 50842), + (17582, 10000), (17596, 2328), + (17606, 89574), (17621, 31927), + (17629, 10000), (17632, 123081), + (17645, 121857), (17646, 31159), + (17670, 74891), (17690, 62681), + (17699, 20000), (17703, 47505), + (17704, 12686), (17756, 101165), + (17771, 149637), (17781, 53581), + (17820, 46356), (17821, 14489), + (17838, 16886), (17848, 65365), + (17849, 50000), (17862, 157159), + (17876, 60000), (17908, 283083), + (17909, 30000), (17911, 40000), + (17957, 30000), (17967, 10000), + (17973, 15000), (17990, 11165), + (18043, 30000), (18047, 10000), + (18055, 10000), (18062, 10000), + (18065, 42686), (18069, 110255), + (18095, 761310), (18097, 30000), + (18110, 10000), (18143, 55954), + (18170, 74650), (18171, 1043240), + (18175, 176703), (18176, 26165), + (18182, 1165), (18211, 30000), + (18220, 95583), (18250, 1020000), + (18254, 56828), (18260, 123834), + (18270, 11165), (18297, 20000), + (18299, 10000), (18302, 10000), + (18307, 10000), (18311, 17675), + (18364, 102982), (18392, 20000), + (18394, 20000), (18395, 1165), + (18418, 30000), (18433, 20000), + (18458, 83851), (18469, 10000), + (18500, 99959), (18513, 50000), + (18514, 158906), (18518, 10000), + (18528, 47165), (18533, 33681), + (18549, 122927), (18593, 31165), + (18607, 10000), (18646, 7411870), + (18649, 10000), (18674, 51159), + (18676, 10000), (18682, 31917), + (18683, 42760), (18688, 1021165), + (18707, 11335), (18710, 10000), + (18719, 11160), (18728, 30000), + (18733, 70000), (18735, 113841), + (18747, 115955), (18766, 44901), + (18768, 1052325), (18778, 16165), + (18781, 11160), (18795, 1115263), + (18858, 31928), (18868, 91884), + (18872, 112066), (18904, 10000), + (18924, 44418), (18935, 60000), + (18991, 13325), (19013, 11165), + (19045, 23083), (19066, 63496), + (19071, 10000), (19082, 42856), + (19092, 181596), (19107, 69547), + (19108, 21491), (19137, 11165), + (19160, 90000), (19169, 51160), + (19202, 10000), (19204, 31165), + (19211, 45000), (19250, 32325), + (19275, 419055), (19291, 1335), + (19320, 35000), (19325, 63439), + (19328, 10000), (19358, 72325), + (19361, 43490), (19371, 1014243), + (19396, 173842), (19410, 11165), + (19432, 1031200), (19438, 31160), + (19440, 30000), (19459, 63704), + (19485, 22505), (19486, 30000), + (19494, 347841), (19497, 96503), + (19525, 26335), (19529, 10000), + (19537, 10000), (19592, 141633), + (19601, 60000), (19623, 10000), + (19630, 51165), (19640, 67598), + (19642, 31165), (19643, 10000), + (19646, 10000), (19680, 21160), + (19697, 10000), (19728, 131165), + (19738, 20000), (19748, 115112), + (19764, 20000), (19841, 1090100), + (19877, 20000), (19904, 20000), + (19908, 73846), (19923, 55000), + (19929, 34472), (19949, 10000), + (19952, 1165), (19962, 10000), + (19982, 1050000), (19985, 20000), + (20005, 21160), (20009, 70963), + (20011, 10000), (20040, 74253), + (20114, 1206181), (20150, 40000), + (20153, 50000), (20164, 10000), + (20165, 1160), (20216, 111165), + (20218, 131165), (20233, 1165), + (20251, 10000), (20254, 10000), + (20261, 30000), (20269, 10000), + (20292, 42330), (20302, 32330), + (20320, 116875), (20338, 105398), + (20347, 10000), (20353, 10000), + (20359, 5897), (20360, 10000), + (20376, 20000), (20381, 10000), + (20387, 61165), (20390, 41159), + (20391, 56030), (20393, 20000), + (20400, 10000), (20427, 98747), + (20450, 10000), (20451, 1132513), + (20452, 62330), (20481, 59658), + (20485, 56493), (20495, 46929), + (20526, 15000), (20536, 1110333), + (20540, 41000), (20559, 1152347), + (20595, 160000), (20603, 21165), + (20611, 1927), (20621, 10000), + (20624, 41340), (20625, 30000), + (20628, 10000), (20634, 10000), + (20639, 12505), (20643, 20000), + (20658, 313458), (20665, 32330), + (20672, 1092330), (20699, 30000), + (20706, 189837), (20750, 10000), + (20770, 10000), (20774, 64801), + (20789, 1126544), (20805, 10000), + (20827, 26334), (20849, 10000), + (20856, 10000), (20892, 10000), + (20899, 84905), (20900, 26200), + (20906, 10000), (20909, 89835), + (20918, 10000), (20924, 10000), + (20931, 10000), (20953, 7432330), + (20974, 21334), (20981, 51164), + (21011, 76382), (21036, 41164), + (21053, 7414690), (21061, 7434396), + (21062, 7452780), (21064, 7142809), + (21099, 20000), (21102, 20000), + (21103, 6165), (21112, 53930), + (21125, 22330), (21127, 21165), + (21148, 10000), (21183, 36125), + (21218, 30000), (21252, 30000), + (21258, 201159), (21275, 10000), + (21286, 20000), (21300, 10000), + (21316, 90000), (21327, 90000), + (21328, 21340), (21383, 5000), + (21448, 1057323), (21450, 40000), + (21463, 30000), (21466, 32328), + (21476, 61916), (21480, 51164), + (21483, 10000), (21496, 12679), + (21517, 99159), (21552, 10000), + (21556, 52684), (21567, 157680), + (21575, 30000), (21590, 95621), + (21630, 10000), (21637, 10000), + (21654, 37073), (21659, 32915), + (21670, 20000), (21688, 53724), + (21720, 70000), (21730, 10000), + (21756, 161111), (21764, 30000), + (21767, 30000), (21794, 109108), + (21804, 25000), (21837, 46038), + (21839, 20000), (21840, 20000), + (21859, 85141), (21893, 12498), + (21963, 48467), (21983, 10000), + (21984, 50000), (21989, 20000), + (21990, 10000), (22010, 20000), + (22026, 30000), (22029, 10000), + (22032, 10000), (22043, 45520), + (22045, 50000), (22055, 20000), + (22064, 7465864), (22065, 7444140), + (22067, 7434629), (22073, 7412540), + (22108, 10000), (22113, 15000), + (22114, 10000), (22118, 23842), + (22134, 76104), (22136, 1164), + (22170, 312102), (22199, 10000), + (22200, 42859), (22202, 1080000), + (22229, 10000), (22236, 62525), + (22247, 21164), (22248, 10000), + (22285, 10000), (22286, 10000), + (22296, 22328), (22301, 10000), + (22302, 122506), (22304, 20000), + (22323, 30000), (22324, 52328), + (22330, 31339), (22393, 10000), + (22397, 10000), (22414, 10000), + (22433, 200271), (22447, 4962), + (22475, 20000), (22479, 1142323), + (22481, 10000), (22518, 128918), + (22552, 33884), (22554, 10000), + (22563, 30000), (22609, 7430890), + (22633, 81164), (22635, 42668), + (22654, 10000), (22663, 11164), + (22714, 10000), (22743, 10000), + (22754, 31917), (22765, 1164), + (22766, 33266), (22767, 20000), + (22774, 55000), (22777, 10000), + (22806, 94250), (22814, 41922), + (22823, 22509), (22845, 21869), + (22848, 55786), (22853, 32323), + (22854, 10000), (22880, 41334), + (22881, 10000), (22904, 136355), + (22953, 135035), (22971, 10000), + (22987, 10000), (22991, 30000), + (23035, 3085), (23040, 64853), + (23091, 10000), (23092, 20000), + (23093, 15000), (23098, 75600), + (23101, 30000), (23124, 63668), + (23126, 61164), (23130, 60000), + (23132, 10000), (23151, 37990), + (23157, 20000), (23160, 59315), + (23161, 10000), (23200, 1164), + (23206, 191339), (23212, 10000), + (23224, 64714), (23233, 185838), + (23247, 60000), (23271, 31164), + (23288, 1089562), (23289, 10000), + (23294, 10000), (23296, 83486), + (23317, 100000), (23320, 10000), + (23325, 2673), (23329, 11164), + (23331, 82322), (23333, 10000), + (23347, 60000), (23369, 320158), + (23424, 50174), (23436, 10000), + (23451, 10000), (23457, 31158), + (23465, 10000), (23474, 171606), + (23477, 21158), (23488, 20000), + (23489, 96272), (23490, 136958), + (23499, 49978), (23502, 20000), + (23508, 21333), (23535, 10000), + (23543, 30000), (23545, 10000), + (23586, 10000), (23618, 30000), + (23647, 43051), (23685, 10000), + (23746, 20000), (23751, 20100), + (23767, 20000), (23768, 20000), + (23777, 10000), (23814, 20000), + (23846, 12513), (23857, 46158), + (23872, 10000), (23873, 77988), + (23876, 40000), (23879, 72083), + (23880, 30000), (23882, 20000), + (23884, 30000), (23890, 21158), + (23906, 10000), (23908, 10000), + (23917, 10000), (23919, 10000), + (23933, 60000), (23948, 10000), + (23977, 69805), (23984, 80000), + (24004, 50000), (24030, 10000), + (24063, 15000), (24096, 22503), + (24137, 10000), (24139, 22684), + (24145, 62328), (24146, 57248), + (24210, 20000), (24213, 10000), + (24217, 106580), (24218, 30000), + (24227, 30000), (24229, 10000), + (24235, 53853), (24247, 72323), + (24251, 30347), (24276, 10000), + (24279, 5000), (24281, 30000), + (24294, 1339), (24296, 10000), + (24336, 20000), (24337, 10000), + (24339, 20000), (24400, 20000), + (24412, 10000), (24438, 63037), + (24448, 74991), (24484, 30000), + (24554, 20000), (24562, 406), + (24570, 1927), (24572, 40000), + (24579, 30000), (24616, 10000), + (24633, 10000), (24686, 102250), + (24715, 1159), (24716, 10000), + (24718, 10000), (24739, 64070), + (24765, 20000), (24767, 10000), + (24774, 21159), (24778, 60000), + (24797, 43487), (24799, 20000), + (24809, 10000), (24841, 87439), + (24842, 10000), (24847, 31164), + (24890, 41164), (24895, 12509), + (24926, 20000), (24961, 31159), + (24972, 10000), (24976, 50000), + (24980, 76164), (24986, 149168), + (24990, 30000), (25008, 85000), + (25030, 10000), (25040, 25000), + (25041, 54611), (25091, 10000), + (25153, 84487), (25181, 10000), + (25199, 179207), (25216, 160311), + (25228, 23437), (25229, 10000), + (25247, 96740), (25273, 20000), + (25282, 10000), (25286, 10000), + (25308, 30000), (25309, 10000), + (25323, 1160), (25324, 20000), + (25371, 1928), (25372, 10000), + (25392, 11165), (25411, 70440), + (25420, 10000), (25451, 3835), + (25453, 1165), (25459, 29000), + (25462, 10000), (25474, 124399), + (25486, 10000), (25487, 20000), + (25551, 39183), (25630, 103375), + (25648, 10000), (25658, 75773), + (25659, 30000), (25666, 10000), + (25677, 10000), (25697, 10000), + (25714, 10000), (25720, 10000), + (25722, 30000), (25743, 10000), + (25745, 505875), (25749, 41647), + (25771, 530650), (25776, 592990), + (25778, 10000), (25783, 20000), + (25798, 65857), (25803, 21335), + (25837, 10000), (25839, 10000), + (25858, 837375), (25862, 10000), + (25885, 104578), (25889, 50819), + (25894, 41340), (25895, 10000), + (25896, 41165), (25902, 10000), + (25913, 20000), (25937, 56335), + (25940, 10000), (25960, 47971), + (25961, 10000), (25964, 10000), + (25973, 11165), (25993, 10000), + (25994, 52330), (26031, 71563), + (26047, 10000), (26066, 10000), + (26067, 30000), (26075, 156275), + (26077, 40000), (26085, 30000), + (26122, 20000), (26141, 22323), + (26153, 22318), (26206, 68042), + (26211, 73086), (26253, 10000), + (26273, 10192), (26287, 43086), + (26315, 52006), (26317, 95013), + (26326, 20000), (26330, 10000), + (26354, 71922), (26381, 41668), + (26391, 57550), (26406, 31164), + (26418, 84785), (26422, 36340), + (26440, 338094), (26465, 20000), + (26486, 76164), (26493, 10000), + (26496, 79200), (26497, 21515), + (26502, 50000), (26510, 30000), + (26511, 118833), (26529, 20000), + (26530, 183091), (26538, 32428), + (26563, 20000), (26572, 10000), + (26575, 20000), (26583, 30218), + (26620, 1164), (26655, 21164), + (26662, 50000), (26666, 10000), + (26667, 10000), (26670, 10000), + (26674, 112663), (26687, 49505), + (26690, 52272), (26698, 43667), + (26707, 40000), (26708, 10000), + (26713, 82492), (26718, 32323), + (26738, 10000), (26766, 10192), + (26774, 10000), (26800, 1164), + (26805, 11921), (26831, 19536), + (26835, 11164), (26852, 1159), + (26869, 1164), (26884, 1164), + (26893, 26164), (26897, 51164), + (26925, 11158), (26936, 57409), + (26952, 31164), (26956, 10000), + (26994, 10000), (27000, 30000), + (27001, 62121), (27015, 41164), + (27016, 30000), (27019, 10000), + (27024, 10000), (27042, 40000), + (27045, 15000), (27047, 20000), + (27080, 11164), (27100, 10000), + (27135, 84254), (27147, 10000), + (27164, 10000), (27175, 10000), + (27178, 60000), (27184, 20000), + (27188, 107046), (27189, 40000), + (27197, 90000), (27202, 223907), + (27215, 10000), (27222, 344114), + (27233, 29000), (27253, 101158), + (27293, 32503), (27302, 51921), + (27307, 21159), (27314, 10000), + (27323, 42513), (27329, 59529), + (27332, 179143), (27334, 30000), + (27358, 156450), (27361, 56695), + (27365, 10000), (27369, 668147), + (27377, 30000), (27380, 30000), + (27381, 30000), (27411, 61095), + (27423, 141482), (27424, 10000), + (27425, 56145), (27451, 23028), + (27457, 21514), (27463, 34671), + (27470, 2688), (27472, 10000), + (27479, 121861), (27491, 27470), + (27494, 86944), (27522, 10000), + (27529, 31808), (27530, 10000), + (27566, 20000), (27567, 51678), + (27569, 70000), (27590, 71334), + (27595, 107722), (27601, 42318), + (27606, 42493), (27607, 23441), + (27666, 20000), (27694, 40000), + (27704, 125542), (27705, 30000), + (27738, 121158), (27740, 10000), + (27744, 10000), (27745, 21158), + (27751, 10000), (27760, 30158), + (27773, 84022), (27776, 2678), + (27779, 1926), (27786, 20000), + (27792, 109168), (27814, 1164), + (27815, 1164), (27817, 20000), + (27824, 40000), (27827, 51926), + (27828, 30000), (27829, 10000), + (27862, 41925), (27896, 40000), + (27899, 22678), (27900, 20000), + (27901, 12688), (27911, 20000), + (27952, 20000), (27963, 30000), + (27975, 36000), (27981, 60000), + (27982, 30000), (27991, 11163), + (28006, 10000), (28046, 60000), + (28056, 10000), (28057, 88999), + (28066, 192632), (28099, 40000), + (28107, 49374), (28113, 250591), + (28117, 10000), (28118, 63412), + (28123, 10000), (28124, 69686), + (28127, 10000), (28133, 41105), + (28149, 50000), (28153, 10000), + (28157, 20000), (28169, 68215), + (28175, 21164), (28178, 41334), + (28204, 5000), (28209, 10000), + (28213, 40000), (28238, 30774), + (28252, 36383), (28253, 20000), + (28272, 10000), (28302, 30000), + (28305, 722699), (28310, 59462), + (28316, 10000), (28320, 20000), + (28321, 10000), (28326, 20000), + (28333, 121683), (28336, 10000), + (28338, 62282), (28340, 10000), + (28341, 10000), (28348, 108886), + (28349, 20000), (28383, 32322), + (28386, 40000), (28411, 10000), + (28413, 10000), (28424, 63914), + (28429, 10000), (28443, 48253), + (28455, 40000), (28468, 152503), + (28471, 724910), (28500, 41164), + (28507, 35816), (28510, 21159), + (28520, 31159), (28522, 10000), + (28524, 83168), (28533, 10000), + (28546, 1339), (28560, 11164), + (28562, 11916), (28564, 44195), + (28567, 91164), (28602, 87040), + (28624, 74969), (28630, 10000), + (28634, 156361), (28635, 30000), + (28637, 21164), (28640, 61164), + (28649, 10000), (28662, 10000), + (28672, 36164), (28680, 41164), + (28695, 30000), (28706, 31339), + (28707, 10000), (28718, 98320), + (28719, 100000), (28721, 10000), + (28722, 10000), (28729, 18054), + (28740, 102534), (28742, 30000), + (28744, 51937), (28792, 110000), + (28793, 44792), (28797, 10000), + (28802, 10000), (28805, 4964), + (28806, 10000), (28837, 10000), + (28848, 248918), (28849, 10000), + (28851, 80000), (28852, 10100), + (28881, 10000), (28884, 60000), + (28891, 22689), (28902, 76888), + (28931, 50010), (28932, 20000), + (28934, 30000), (28957, 10000), + (28963, 10000), (28967, 20000), + (29005, 31474), (29013, 10000), + (29014, 21339), (29015, 10000), + (29044, 45424), (29064, 69299), + (29068, 736008), (29084, 20000), + (29097, 20000), (29133, 81746), + (29142, 62508), (29164, 70000), + (29198, 20000), (29212, 31334), + (29219, 30000), (29237, 10000), + (29249, 10000), (29251, 10000), + (29256, 40226), (29262, 64542), + (29269, 30238), (29272, 10000), + (29278, 110000), (29292, 43143), + (29296, 30191), (29326, 10000), + (29334, 41163), (29343, 50000), + (29363, 20000), (29397, 37248), + (29402, 80000), (29416, 20000), + (29420, 38326), (29423, 30000), + (29476, 10000), (29480, 20000), + (29482, 40000), (29495, 10000), + (29497, 10000), (29503, 10000), + (29506, 59360), (29515, 7770), + (29520, 10000), (29553, 10000), + (29554, 20000), (29562, 10000), + (29565, 51158), (29573, 32096), + (29577, 77478), (29592, 10000), + (29599, 189053), (29602, 10000), + (29609, 167733), (29612, 21334), + (29615, 20000), (29635, 10000), + (29643, 20702), (29650, 10000), + (29669, 30000), (29690, 1163), + (29706, 30599), (29707, 10000), + (29710, 10000), (29716, 10000), + (29742, 26646), (29771, 20000), + (29800, 20747), (29818, 36652), + (29826, 12678), (29827, 58850), + (29834, 10000), (29835, 10000), + (29856, 10000), (29884, 20000), + (29891, 20000), (29897, 21000), + (29901, 45428), (29905, 31405), + (29913, 10000), (29915, 16860), + (29921, 87480), (29923, 10000), + (29932, 100000), (29935, 20000), + (29937, 9192), (29938, 30226), + (29942, 10000), (29949, 80226), + (29950, 10522), (29958, 70430), + (29965, 20000), (29970, 16285), + (29974, 99782), (29982, 66173), + (29984, 10000), (29993, 21942), + (29994, 10000), (29998, 10000), + (30000, 10000), (30004, 7333), + (30022, 49000), (30039, 19801), + (30045, 10000), (30068, 40000), + (30095, 10000), (30111, 30000), + (30123, 20000), (30124, 85789), + (30137, 60373), (30143, 40000), + (30146, 30000), (30150, 23515), + (30155, 10000), (30169, 78156), + (30181, 20260), (30186, 20000), + (30201, 10000), (30212, 20669), + (30221, 57140), (30224, 10000), + (30225, 477530), (30235, 20000), + (30238, 126788), (30272, 55000), + (30278, 60260), (30296, 30000), + (30300, 10000), (30313, 30964), + (30320, 40000), (30331, 50782), + (30332, 51865), (30335, 10000), + (30338, 98386), (30339, 58745), + (30341, 10000), (30343, 10374), + (30351, 100000), (30356, 60678), + (30388, 30226), (30418, 226), + (30424, 30848), (30433, 102328), + (30455, 56140), (30463, 55000), + (30472, 100000), (30491, 26345), + (30493, 10000), (30499, 30000), + (30524, 30000), (30541, 10000), + (30542, 20000), (30548, 51637), + (30549, 30000), (30552, 10000), + (30554, 20000), (30565, 10000), + (30592, 10000), (30595, 10000), + (30603, 10000), (30606, 10000), + (30621, 10225), (30625, 30000), + (30629, 30000), (30658, 39000), + (30685, 20000), (30692, 30395), + (30694, 25912), (30698, 56571), + (30748, 30226), (30749, 21994), + (30757, 45485), (30761, 87817), + (30770, 107298), (30785, 139298), + (30808, 10000), (30812, 26844), + (30816, 20892), (30817, 10000), + (30819, 10225), (30826, 30000), + (30833, 374), (30848, 30000), + (30849, 30000), (30861, 71867), + (30864, 21865), (30884, 10711), + (30897, 20000), (30928, 69677), + (30937, 452), (30938, 91508), + (30949, 60000), (30966, 16671), + (30969, 20000), (30977, 10000), + (30978, 226), (30985, 36945), + (30986, 10000), (31007, 71198), + (31015, 110520), (31026, 43496), + (31044, 131503), (31049, 80599), + (31052, 22610), (31055, 40677), + (31056, 10000), (31063, 60000), + (31065, 10000), (31091, 130550), + (31108, 26141), (31111, 20225), + (31143, 20000), (31145, 70000), + (31148, 20000), (31174, 226), + (31175, 89245), (31182, 30000), + (31184, 10595), (31196, 10000), + (31200, 50000), (31204, 50000), + (31216, 37765), (31221, 70000), + (31222, 30000), (31225, 10000), + (31227, 216869), (31275, 20000), + (31276, 10000), (31279, 60000), + (31287, 132540), (31302, 340452), + (31303, 80000), (31311, 115776), + (31312, 20000), (31317, 10000), + (31319, 96570), (31323, 25564), + (31325, 189587), (31326, 10000), + (31363, 51009), (31387, 60618), + (31395, 10000), (31400, 1454425), + (31411, 10000), (31415, 70486), + (31416, 10000), (31417, 10226), + (31425, 155830), (31430, 40000), + (31434, 10000), (31442, 104136), + (31445, 10000), (31463, 20612), + (31468, 70007), (31474, 215751), + (31492, 56226), (31502, 226), + (31510, 90520), (31527, 10000), + (31536, 452), (31537, 130962), + (31544, 5734), (31548, 91112), + (31563, 20000), (31564, 20000), + (31567, 20609), (31611, 10000), + (31612, 106312), (31615, 20668), + (31624, 10000), (31634, 20452), + (31637, 24296), (31646, 94556), + (31647, 50599), (31653, 50622), + (31656, 165688), (31658, 20000), + (31659, 20000), (31663, 50677), + (31694, 11355), (31725, 10000), + (31743, 10000), (31758, 60034), + (31765, 85371), (31767, 39000), + (31777, 1470), (31784, 30000), + (31789, 10000), (31790, 60780), + (31791, 485), (31795, 67273), + (31798, 40226), (31806, 20000), + (31812, 10000), (31817, 40225), + (31832, 85438), (31854, 50225), + (31871, 7118), (31880, 40000), + (31887, 10000), (31901, 33780), + (31921, 71226), (31941, 10226), + (31942, 72000), (31961, 677), + (31970, 10000), (31972, 20000), + (31986, 35000), (31999, 20485), + (32002, 40000), (32033, 74815), + (32034, 50000), (32048, 41950), + (32063, 10000), (32074, 69045), + (32095, 110972), (32105, 125772), + (32139, 73840), (32165, 57104), + (32168, 100000), (32183, 10000), + (32195, 20408), (32197, 10225), + (32206, 16822), (32208, 55520), + (32211, 10000), (32222, 20000), + (32223, 120226), (32236, 70701), + (32254, 10000), (32264, 20000), + (32280, 20000), (32285, 19862), + (32289, 10000), (32294, 10226), + (32314, 10000), (32357, 53460), + (32361, 78441), (32375, 90406), + (32381, 10408), (32391, 10614), + (32405, 20260), (32412, 117783), + (32433, 485), (32439, 10000), + (32455, 10000), (32461, 50226), + (32469, 29000), (32477, 10000), + (32486, 31198), (32487, 10000), + (32493, 10000), (32497, 30327), + (32499, 52828), (32528, 40000), + (32543, 73805), (32587, 40000), + (32617, 50226), (32625, 20000), + (32636, 21847), (32640, 26806), + (32652, 1570), (32656, 10000), + (32660, 20520), (32671, 10000), + (32691, 10748), (32706, 9000), + (32715, 30000), (32740, 25780), + (32742, 40000), (32743, 35000), + (32746, 23485), (32757, 10000), + (32769, 10000), (32773, 187126), + (32777, 73800), (32782, 36226), + (32789, 20000), (32801, 20000), + (32804, 10000), (32809, 10000), + (32812, 10000), (32815, 20000), + (32823, 10000), (32827, 20521), + (32833, 226), (32840, 93483), + (32866, 156529), (32917, 80655), + (32924, 74479), (32941, 10000), + (32943, 15677), (32944, 20521), + (32945, 131393), (32953, 20000), + (32966, 73728), (32984, 9225), + (32990, 60000), (32996, 10000), + (33011, 6000), (33013, 29000), + (33020, 87727), (33024, 101337), + (33028, 20225), (33029, 22595), + (33032, 20000), (33050, 98442), + (33053, 40000), (33069, 69711), + (33083, 100000), (33086, 20374), + (33097, 9646), (33105, 60374), + (33108, 1885643), (33113, 10000), + (33159, 20000), (33161, 40000), + (33180, 225), (33189, 115975), + (33191, 30746), (33201, 60451), + (33208, 47264), (33211, 30226), + (33214, 10000), (33242, 10000), + (33249, 70000), (33253, 30226), + (33255, 22677), (33273, 10000), + (33283, 79372), (33286, 226), + (33302, 83836), (33312, 127051), + (33330, 10000), (33331, 10226), + (33337, 81401), (33346, 10000), + (33347, 40328), (33357, 10000), + (33366, 10000), (33367, 21065), + (33384, 20000), (33391, 30225), + (33396, 66300), (33419, 10000), + (33452, 20000), (33453, 10000), + (33458, 84551), (33464, 10000), + (33468, 657), (33469, 43804), + (33489, 10000), (33498, 65406), + (33505, 30000), (33511, 10000), + (33518, 10000), (33519, 90816), + (33522, 50226), (33526, 20000), + (33551, 33766), (33553, 95586), + (33557, 40938), (33576, 20000), + (33577, 20000), (33578, 11158), + (33599, 10000), (33606, 46470), + (33609, 10000), (33613, 66751), + (33617, 20442), (33620, 94512), + (33649, 10000), (33657, 10000), + (33663, 20000), (33665, 636666), + (33666, 40000), (33675, 20000), + (33685, 60000), (33690, 10000), + (33697, 20000), (33713, 10000), + (33715, 20617), (33716, 20000), + (33722, 64906), (33731, 40452), + (33750, 45538), (33754, 110408), + (33757, 43565), (33760, 21123), + (33774, 49000), (33777, 10000), + (33778, 10000), (33779, 30669), + (33783, 10000), (33784, 30000), + (33793, 6850), (33798, 226), + (33802, 30226), (33817, 10000), + (33838, 30000), (33845, 70294), + (33856, 5947), (33862, 44339), + (33864, 10000), (33894, 95915), + (33895, 100373), (33897, 20000), + (33898, 40000), (33903, 10000), + (33907, 32569), (33929, 10000), + (33933, 100260), (33934, 10000), + (33943, 260), (33944, 20000), + (33945, 11130), (33956, 20000), + (33960, 16402), (33966, 17891), + (33972, 70486), (33975, 40374), + (34002, 20260), (34006, 26719), + (34015, 10000), (34025, 89806), + (34027, 23970), (34075, 17094), + (34088, 80000), (34099, 10000), + (34108, 25529), (34113, 20000), + (34116, 10000), (34120, 106311), + (34127, 226), (34128, 4884), + (34129, 26889), (34134, 21260), + (34135, 10000), (34139, 30000), + (34153, 451), (34161, 20000), + (34165, 110858), (34176, 63571), + (34182, 10000), (34190, 51157), + (34201, 30000), (34222, 10000), + (34228, 51768), (34234, 20294), + (34238, 67961), (34251, 25255), + (34266, 66479), (34287, 20000), + (34311, 1448), (34312, 26815), + (34333, 96991), (34374, 60260), + (34391, 20260), (34408, 20000), + (34431, 10000), (34438, 50000), + (34449, 40982), (34451, 723880), + (34456, 20000), (34467, 80374), + (34491, 30294), (34492, 20000), + (34495, 10000), (34506, 5881), + (34522, 20225), (34528, 11113), + (34533, 10000), (34559, 40000), + (34562, 20000), (34564, 3730), + (34568, 7738), (34595, 10000), + (34596, 10000), (34599, 30000), + (34602, 113468), (34612, 40226), + (34614, 10000), (34619, 40600), + (34622, 30000), (34633, 10226), + (34634, 10000), (34642, 10000), + (34643, 20000), (34648, 30000), + (34650, 10000), (34670, 21482), + (34677, 30226), (34678, 111636), + (34693, 60000), (34698, 10000), + (34703, 20000), (34717, 10000), + (34721, 66867), (34736, 32341), + (34764, 60000), (34779, 26335), + (34786, 15000), (34825, 20226), + (34853, 11412), (34858, 40000), + (34865, 70519), (34872, 108504), + (34874, 20000), (34879, 10000), + (34881, 42801), (34882, 33184), + (34884, 80838), (34897, 10000), + (34902, 105573), (34940, 205450), + (34948, 57324), (34953, 10000), + (34961, 23406), (34990, 100225), + (35006, 24634), (35008, 10000), + (35021, 40000), (35024, 10000), + (35028, 123272), (35030, 20000), + (35031, 10000), (35033, 130000), + (35040, 30000), (35069, 42875), + (35078, 48000), (35103, 157267), + (35138, 80000), (35146, 50000), + (35150, 60373), (35152, 10407), + (35158, 226), (35164, 10000), + (35169, 10485), (35178, 30452), + (35190, 10000), (35199, 13916), + (35207, 15508), (35214, 20225), + (35217, 30374), (35272, 226), + (35295, 17387), (35297, 40000), + (35298, 9962), (35322, 10000), + (35326, 129272), (35327, 10000), + (35337, 10000), (35350, 20000), + (35354, 19760), (35372, 10000), + (35386, 10225), (35388, 152345), + (35401, 21654), (35424, 61852), + (35459, 10000), (35466, 20000), + (35469, 1182650), (35488, 10000), + (35510, 1754), (35512, 40000), + (35515, 42729), (35524, 1042800), + (35532, 155200), (35541, 30000), + (35547, 10000), (35556, 120746), + (35562, 1617148), (35590, 36774), + (35600, 10000), (35601, 20000), + (35603, 22610), (35611, 80988), + (35615, 100000), (35616, 120000), + (35635, 10000), (35641, 10000), + (35688, 21187), (35726, 240000), + (35742, 10000), (35757, 12796), + (35766, 10000), (35778, 52015), + (35820, 100225), (35832, 33191), + (35841, 226), (35843, 20000), + (35846, 40000), (35851, 10000), + (35923, 20226), (35938, 6000), + (35941, 26770), (35952, 10000), + (35957, 40000), (35976, 1068270), + (35986, 372022), (35987, 10000), + (35991, 10000), (35998, 11378), + (36002, 10000), (36005, 41631), + (36006, 14569), (36021, 10000), + (36023, 220000), (36052, 61083), + (36053, 10000), (36060, 30000), + (36064, 50368), (36069, 78741), + (36083, 11602), (36089, 20522), + (36094, 51378), (36106, 30000), + (36138, 10000), (36139, 6223), + (36147, 14810), (36153, 10000), + (36162, 225), (36168, 50226), + (36187, 20000), (36193, 20226), + (36204, 21260), (36211, 226), + (36236, 20000), (36241, 46073), + (36261, 60452), (36276, 20000), + (36283, 10000), (36290, 31903), + (36294, 10000), (36297, 169050), + (36298, 16000), (36309, 30964), + (36318, 10000), (36332, 51466), + (36338, 10000), (36343, 20000), + (36344, 1419), (36348, 10225), + (36350, 59014), (36358, 10000), + (36370, 65260), (36373, 30000), + (36375, 20226), (36387, 30000), + (36389, 10000), (36396, 37580), + (36419, 5495), (36429, 10000), + (36436, 20964), (36439, 10000), + (36452, 6039), (36476, 16311), + (36479, 30000), (36480, 10000), + (36483, 10000), (36504, 39598), + (36508, 110000), (36514, 21399), + (36519, 60000), (36527, 151320), + (36540, 15768), (36541, 20000), + (36556, 40000), (36570, 10966), + (36578, 30000), (36580, 30000), + (36584, 130597), (36603, 893), + (36604, 20000), (36620, 20000), + (36624, 50000), (36628, 40226), + (36651, 60000), (36656, 10000), + (36663, 54828), (36666, 10000), + (36671, 56000), (36676, 10000), + (36689, 10000), (36690, 50000), + (36691, 30000), (36693, 51448), + (36694, 10000), (36702, 10000), + (36713, 60226), (36715, 40225), + (36716, 20000), (36730, 50225), + (36742, 100260), (36749, 20818), + (36752, 10000), (36785, 30226), + (36788, 40000), (36792, 30053), + (36793, 10000), (36795, 26755), + (36801, 10000), (36802, 30226), + (36813, 60519), (36828, 31949), + (36831, 60000), (36840, 10000), + (36867, 77777), (36870, 20000), + (36879, 10000), (36889, 10000), + (36920, 10000), (36922, 20000), + (36924, 32831), (36925, 10000), + (36933, 35224), (36942, 10000), + (36955, 10226), (36962, 59931), + (37080, 10000), (37085, 1414), + (37094, 40451), (37113, 330000), + (37156, 266095), (37161, 13633), + (37193, 40260), (37204, 16685), + (37208, 10000), (37214, 26492), + (37235, 115226), (37283, 30000), + (37284, 10000), (37299, 70000), + (37307, 30091), (37312, 190000), + (37313, 10000), (37314, 10000), + (37339, 10000), (37368, 5000), + (37370, 50915), (37383, 10226), + (37388, 10000), (37393, 130000), + (37399, 80000), (37404, 225), + (37405, 20848), (37414, 13210), + (37417, 10225), (37418, 10000), + (37428, 40000), (37453, 50963), + (37461, 40259), (37466, 30000), + (37473, 20000), (37476, 10000), + (37477, 40000), (37489, 10000), + (37505, 20000), (37520, 10000), + (37533, 20000), (37534, 38012), + (37540, 10000), (37556, 20000), + (37564, 60000), (37575, 10000), + (37578, 10000), (37580, 40226), + (37590, 10000), (37591, 26890), + (37623, 20000), (37667, 26347), + (37669, 20000), (37678, 40867), + (37684, 20000), (37690, 60000), + (37693, 68351), (37701, 30000), + (37703, 10451), (37713, 40639), + (37718, 30000), (37746, 10677), + (37754, 20000), (37772, 20374), + (37775, 70000), (37776, 10000), + (37789, 10000), (37808, 261006), + (37815, 10000), (37817, 36436), + (37820, 30000), (37837, 20226), + (37839, 77017), (37840, 10000), + (37845, 10000), (37847, 30226), + (37864, 20000), (37888, 10373), + (37893, 31960), (37901, 75600), + (37903, 60000), (37911, 40000), + (37919, 10000), (37931, 40000), + (37937, 10000), (37949, 4726), + (37953, 30000), (37957, 10000), + (37976, 10226), (37998, 60000), + (38019, 30000), (38031, 15000), + (38035, 20000), (38041, 20542), + (38050, 20000), (38056, 10000), + (38067, 40000), (38091, 30000), + (38095, 20000), (38096, 10000), + (38099, 92652), (38101, 10000), + (38104, 10226), (38105, 36949), + (38108, 374), (38123, 110000), + (38128, 190000), (38156, 10000), + (38163, 10000), (38167, 642), + (38171, 10000), (38172, 22831), + (38176, 20000), (38187, 59889), + (38204, 82453)], + 't1ShwyK2o1Pj2qTpz33tqG8aEMszcxxmax8': [(776349, 125009080), + (776359, 125000624), + (776510, 125620728), + (776560, 125100000), + (776572, 125140182), + (776580, 125081290), + (776604, 125224540), + (776732, 125024900), + (776817, 125055236), + (776856, 125014894), + (776863, 125042786), + (776876, 125000490), + (776961, 125282900), + (777003, 125034110), + (777132, 125025598), + (777141, 125206190), + (777150, 125000000), + (777330, 125000000), + (777343, 125064542), + (777357, 125000000), + (777360, 125034568), + (777376, 125025720), + (777383, 125000000), + (777427, 125000000), + (777430, 125020000), + (777443, 125041800), + (777454, 125000200), + (777461, 125274962), + (777470, 125013400), + (777482, 125031160), + (777485, 125000000), + (777488, 125028404), + (777492, 125000000), + (777498, 125118600), + (777503, 125069280), + (777515, 125000000), + (777528, 125014944), + (777574, 125004700), + (777592, 125012020), + (777601, 130623420), + (777607, 125209080), + (777624, 125060200), + (777625, 125578520), + (777643, 125020000), + (777644, 125000000), + (777646, 125127200), + (777650, 125311278), + (777656, 125040000), + (777664, 125258360), + (777670, 125020000), + (777677, 125072180), + (777680, 125004740), + (777689, 125012380), + (777697, 125000000), + (777704, 125000226), + (777706, 125004540), + (777762, 125004860), + (777770, 125216096), + (777773, 125000000), + (777778, 125010028), + (777816, 125000000), + (777832, 125044540), + (777842, 125000000), + (777844, 125044540), + (777876, 125020000), + (777888, 125071160), + (777895, 125000000), + (777897, 125006960), + (777899, 125008332), + (777927, 125020000), + (777938, 125155656), + (777950, 125000000), + (777981, 125000000), + (777982, 125012720), + (777987, 125000000), + (777993, 125044120), + (778011, 125035700), + (778033, 125023590), + (778047, 125074212), + (778059, 125000000), + (778064, 125000000), + (778073, 125000000), + (778103, 125000000), + (778107, 125086988), + (778112, 125055860), + (778115, 125004540), + (778120, 125845828), + (778128, 125134354), + (778141, 125080900), + (778146, 125009080), + (778151, 125000000), + (778153, 125009070), + (778156, 125009880), + (778158, 125024068), + (778162, 125060484), + (778165, 125214438), + (778171, 125029240), + (778186, 125000000), + (778227, 125090694), + (778233, 125120736), + (778257, 125114962), + (778313, 125009080), + (778315, 125040000), + (778333, 125145040), + (778350, 125102320), + (778355, 125172870), + (778367, 125067682), + (778373, 125319914), + (778377, 125000000), + (778383, 125007480), + (778396, 125046430), + (778412, 125066360), + (778418, 125004540), + (778427, 125134420), + (778428, 125131104), + (778429, 125038300), + (778433, 125000000), + (778441, 125029702), + (778444, 125288710), + (778446, 125024550), + (778473, 125078276), + (778474, 125020000), + (778475, 125020000), + (778485, 125024550), + (778493, 125000000), + (778495, 125050604), + (778496, 125000000), + (778497, 125123956), + (778503, 125104540), + (778510, 125304540), + (778513, 125009432), + (778535, 125240300), + (778542, 125000000), + (778543, 125085182), + (778549, 125643072), + (778572, 125159950), + (778574, 125192658), + (778608, 125047708), + (778636, 125064550), + (778648, 125036180), + (778650, 125020000), + (778653, 125215000), + (778669, 125099430), + (778682, 125040000), + (778709, 125000000), + (778712, 125040000), + (778714, 125055708), + (778717, 125000000), + (778734, 125004540), + (778742, 125020000), + (778744, 125089016)], + 't1W6x554SHTEQEkUUUunKgi7JgmCHPgX9P3': [(1047422, 87404), (1048265, 413659), + (1051436, 71902), (1052241, 188988), + (1052282, 20810), (1052938, 12283), + (1052956, 10000), (1053928, 210619), + (1055198, 23799), (1055829, 73434), + (1057381, 12450), (1057842, 150886), + (1058087, 117154), (1058332, 10000), + (1058508, 10000), (1059521, 10071), + (1059565, 1126), (1060911, 10000), + (1061223, 15630), (1062633, 22450), + (1062683, 28192), (1063667, 59442), + (1063854, 42085), (1063936, 6780), + (1064022, 21453), (1064070, 2350), + (1064492, 80239), (1064501, 94701), + (1064652, 404567), (1064719, 84292), + (1065979, 30676), (1066259, 12695), + (1066335, 245), (1066465, 10000), + (1067148, 10000), (1067430, 4462), + (1067621, 390154), (1067755, 37860), + (1068010, 48443), (1068344, 10000), + (1068801, 20000), (1069582, 101160), + (1069992, 510000), (1070201, 18261), + (1070237, 10000), (1070582, 48747), + (1070838, 2486), (1070957, 80000), + (1071305, 27945), (1071627, 3276), + (1071974, 13347), (1074132, 244), + (1074187, 10000), (1074978, 9736), + (1075436, 28030), (1075571, 2450), + (1076304, 30499), (1076396, 20000), + (1076503, 28030), (1076517, 106890), + (1076629, 3840), (1076939, 14635), + (1077090, 2966), (1077486, 11453), + (1077500, 40000), (1077711, 10345), + (1078087, 37277), (1078162, 80000), + (1078462, 13450), (1078469, 31160), + (1078967, 2450), (1079657, 21573), + (1079977, 422742), (1080515, 1740265), + (1080618, 10000), (1081034, 4690), + (1081127, 18972), (1082040, 245), + (1082492, 10000), (1083081, 58943), + (1083088, 72320), (1083380, 19588), + (1083389, 24267), (1083496, 19985), + (1084383, 2000), (1084666, 111130), + (1084712, 2450), (1085656, 170860), + (1085756, 5320), (1085870, 10000), + (1086007, 2446), (1087421, 151232), + (1088642, 95499), (1089229, 19284), + (1090892, 3205), (1090944, 76760), + (1091138, 111435), (1091455, 34203), + (1091950, 1), (1092186, 1920), + (1093224, 279233), (1094024, 4186), + (1094043, 24763), (1097130, 31473), + (1097682, 14020), (1098572, 15335), + (1099175, 14078), (1099867, 13960), + (1100206, 50663), (1100415, 25084), + (1101195, 157201), (1103915, 1000), + (1104647, 9450), (1106648, 157436), + (1107992, 207753), (1108066, 342090), + (1108381, 431114), (1109265, 185310), + (1109763, 102796), (1110685, 117122), + (1110801, 71), (1111025, 10000), + (1111617, 329085), (1111972, 109149), + (1112544, 49711), (1112771, 6240), + (1113547, 93507), (1113876, 18115), + (1114521, 14635), (1114804, 5880), + (1115376, 23887), (1116101, 362503), + (1117240, 2350), (1117559, 11865), + (1118275, 207535), (1118553, 4560), + (1118707, 2450), (1119034, 28040), + (1119399, 23691), (1119680, 37910), + (1119747, 10515), (1120629, 232450), + (1120633, 398560), (1120986, 7449), + (1121859, 7450), (1126630, 99051), + (1129794, 1553311), (1131038, 3072), + (1132877, 2349), (1133152, 11316), + (1133189, 32364), (1133406, 18000), + (1133549, 4558), (1135038, 12655), + (1135377, 3317), (1135797, 219336), + (1136290, 24799), (1137024, 1000), + (1137471, 207911), (1137755, 10898), + (1140140, 24450), (1140525, 129619), + (1140737, 49732), (1140912, 3400), + (1141309, 35116), (1141565, 57258), + (1143008, 52029), (1143747, 224961), + (1143931, 861930), (1145472, 298321), + (1145767, 17000), (1145993, 127326), + (1146553, 133573), (1146635, 699606), + (1147420, 98295), (1147589, 15703), + (1147908, 11000), (1147946, 100), + (1150726, 85770), (1151216, 489480), + (1151968, 110416)], + 't1XaGwhvB3nXryeK5VVgejaSmXGgNkqFfJd': [(616258, 16510)], + 't1ZW8mX1UR2YQXafSxriuK2Bz1wxqzskGQq,t1gbAeQB1nWC7yhKZeTjhoFLg9NHEhBs5qw': [(400, + 5000000), + (401, + 5012500), + (428, + 5350000), + (430, + 5375000), + (442, + 5525000), + (459, + 5737500), + (461, + 5762500), + (463, + 5787500), + (465, + 5812500), + (473, + 5912500), + (476, + 5950000), + (490, + 6125000), + (513, + 6412500), + (521, + 6512500), + (677, + 8462500), + (695, + 8687500), + (698, + 8725000), + (704, + 8800000), + (708, + 8850000), + (712, + 8900000), + (714, + 8925000), + (738, + 9225000), + (741, + 9262500), + (744, + 9300000), + (748, + 9350000), + (749, + 9362500), + (751, + 9387500), + (752, + 9400000), + (758, + 9475000), + (763, + 9537500), + (764, + 9550000), + (765, + 9562500), + (766, + 9575000), + (767, + 9587500), + (771, + 9637500), + (775, + 9687500), + (779, + 9737500), + (792, + 9900000), + (793, + 9912500), + (809, + 10112500), + (810, + 10125000), + (818, + 10225000), + (851, + 10637500), + (914, + 11425000), + (953, + 11912500), + (988, + 12350000), + (1021, + 12762500), + (1077, + 13462500), + (1078, + 13475000), + (1111, + 13887500), + (1120, + 14000000), + (1142, + 14275000), + (1146, + 14325000), + (1153, + 14412500), + (1156, + 14450000), + (1162, + 14525000), + (1165, + 14562500), + (1208, + 15100000), + (1231, + 15387500), + (1241, + 15512500), + (1259, + 15737500), + (1284, + 16050000), + (1298, + 16225000), + (1340, + 16750000), + (1359, + 16987500), + (1446, + 18075000), + (1447, + 18087500), + (1448, + 18100000), + (1450, + 18125000), + (1452, + 18150000), + (1469, + 18362500), + (1484, + 18550000), + (1485, + 18562500), + (1519, + 18987500), + (1554, + 19425000), + (1558, + 19475000), + (1563, + 19537500), + (1566, + 19575000), + (1639, + 20487500), + (1641, + 20512500), + (1657, + 20712500), + (1662, + 20775000), + (1673, + 20912500), + (1680, + 21000000), + (1700, + 21250000), + (1727, + 21587500), + (1732, + 21650000), + (1748, + 21850000), + (1869, + 23362500), + (1879, + 23487500), + (1908, + 23850000), + (1924, + 24050000), + (1955, + 24437500), + (1962, + 24525000), + (1986, + 24825000), + (1992, + 24900000), + (2016, + 25200000), + (2064, + 25800000), + (2066, + 25825000), + (2070, + 25875000), + (2095, + 26187500), + (2096, + 26200000), + (2152, + 26900000), + (2189, + 27362500), + (2191, + 27387500), + (2206, + 27575000), + (2211, + 27637500), + (2217, + 27712500), + (2238, + 27975000), + (2254, + 28175000), + (2256, + 28200000), + (2261, + 28262500), + (2280, + 28500000), + (2336, + 29200000), + (2373, + 29662500), + (2442, + 30525000), + (2462, + 30775000), + (2499, + 31237500), + (2522, + 31525000), + (2555, + 31937500), + (2557, + 31962500), + (2576, + 32200000), + (2602, + 32525000), + (2609, + 32612500), + (2652, + 33150000), + (2658, + 33225000), + (2660, + 33250000), + (2722, + 34025000), + (2741, + 34262500), + (2749, + 34362500), + (2758, + 34475000), + (2790, + 34875000), + (2824, + 35300000), + (2863, + 35787500), + (2870, + 35875000), + (2872, + 35900000), + (2914, + 36425000), + (2944, + 36800000), + (2947, + 36837500), + (3025, + 37812500), + (3028, + 37850000), + (3068, + 38350000), + (3077, + 38462500), + (3106, + 38825000), + (3189, + 39862500), + (3301, + 41262500), + (3376, + 42200000), + (3396, + 42450000), + (3419, + 42737500), + (3446, + 43075000), + (3458, + 43225000), + (3484, + 43550000), + (3577, + 44712500), + (3599, + 44987500), + (3675, + 45937500), + (3687, + 46087500), + (3804, + 47550000), + (3851, + 48137500), + (3855, + 48187500), + (3877, + 48462500), + (3892, + 48650000), + (3989, + 49862500), + (4089, + 51112500), + (4106, + 51325000), + (4112, + 51400000), + (4167, + 52087500), + (4188, + 52350000), + (4218, + 52725000), + (4224, + 52800000), + (4252, + 53150000), + (4356, + 54450000), + (4367, + 54587500), + (4388, + 54850000), + (4474, + 55925000), + (4482, + 56025000), + (4511, + 56387500), + (4557, + 56962500), + (4622, + 57775000), + (4684, + 58550000), + (4700, + 58750000), + (4722, + 59025000), + (4735, + 59187500), + (4940, + 61750000), + (4944, + 61800000), + (4963, + 62037500), + (4975, + 62187500), + (4998, + 62475000), + (5051, + 63137500), + (5115, + 63937500), + (5117, + 63962500), + (5155, + 64437500), + (5157, + 64462500), + (5161, + 64512500), + (5162, + 64525000), + (5190, + 64875000), + (5195, + 64937500), + (5199, + 64987500), + (5212, + 65150000), + (5252, + 65650000), + (5279, + 65987500), + (5295, + 66187500), + (5314, + 66425000), + (5326, + 66575000), + (5414, + 67675000), + (5493, + 68662500), + (5526, + 69075000), + (5639, + 70487500), + (5710, + 71375000), + (5795, + 72437500), + (5931, + 74137500), + (6033, + 75412500), + (6081, + 76012500), + (6119, + 76487500), + (6127, + 76587500), + (6245, + 78062500), + (6300, + 78750000), + (6315, + 78937500), + (6317, + 78962500), + (6408, + 80100000), + (6416, + 80200000), + (6496, + 81200000), + (6637, + 82962500), + (6863, + 85787500), + (7076, + 88450000), + (7234, + 90425000), + (7305, + 91312500), + (7426, + 92825000), + (7555, + 94437500), + (7630, + 95375000), + (7710, + 96375000), + (7711, + 96387500), + (7974, + 99675000), + (8053, + 100662500), + (8135, + 101687500), + (8226, + 102825000), + (8237, + 102962500), + (8257, + 103212500), + (8455, + 105687500), + (8474, + 105925000), + (8726, + 109075000), + (8796, + 109950000), + (8802, + 110025000), + (9067, + 113337500), + (9121, + 114012500), + (9133, + 114162500), + (9163, + 114537500), + (9236, + 115450000), + (9280, + 116000000), + (9288, + 116100000), + (9525, + 119062500), + (9532, + 119150000), + (9584, + 119800000), + (9596, + 119950000), + (9672, + 120900000), + (9860, + 123250000), + (9988, + 124850000), + (9990, + 124875000), + (10014, + 125187500), + (10101, + 126275000), + (10244, + 128062500), + (10247, + 128100000), + (10729, + 134125000), + (10894, + 136187500), + (11092, + 138662500), + (12021, + 150275000), + (12098, + 151237500), + (12530, + 156637500), + (12903, + 161300000), + (13324, + 166562500), + (13466, + 168337500), + (13506, + 168837500), + (13507, + 168850000), + (13662, + 170787500), + (14708, + 183862500), + (15052, + 188162500), + (15622, + 195287500), + (15961, + 199525000)], + 't1ZYZS6ynUDbvht7vH3dMiM3rsAJ1p6EGWC': [(76617, 10000)], + 't1ZpiX2XapchHjS3LgXBuY6ccCbWBgJQink': [(1390978, 259842), (1391354, 230000), + (1391365, 31516), (1395922, 50), + (1395946, 79278), (1399998, 77542), + (1400180, 34350), (1400937, 22553), + (1406566, 15580), (1412181, 3450), + (1432458, 195333), (1452172, 7318), + (1469231, 52607), (1470087, 3451), + (1470101, 115861), (1471162, 31747), + (1476791, 60), (1482737, 2340), + (1482875, 119283)], + 't1a9Lh8Bmn4joPbZxs8Fh4QpT35mbahmZau': [(710746, 4540), (711692, 28030), + (713287, 38823), (720911, 2260), + (722228, 13066), (723119, 17270), + (724732, 143474), (725477, 3330), + (725839, 6741), (1240799, 79296), + (1294030, 34161), (1296140, 67724), + (1296298, 52241), (1305215, 15478), + (1320813, 5757), (1321718, 257236), + (1325778, 2284), (1332323, 205114), + (1333881, 2349), (1338368, 119), + (1343558, 5520), (1347556, 280060), + (1349271, 46827), (1352714, 4608), + (1354335, 4646), (1354390, 180054), + (1359180, 449), (1360564, 415548), + (1364388, 416809), (1365156, 25139), + (1379805, 47771)], + 't1arthoEup9p4wgX8d7AVLNHDRM4bYA7iWb,t1brtadGbgvwBaNYrQGMErJwMSWAdDbiGq5,t1crtttrMXByViQsWh1vGo2msxW5zGSZ8tg': [(498, + 1), + (624, + 1)], + 't1bBPqfvfyzWFSnp1AMcrSYGqB6gKFUGXMg': [(1755121, 19000), (1755630, 2000), + (1756192, 1275), (1756781, 2000), + (1756828, 6000), (1757001, 10000), + (1757147, 2240), (1757783, 1408), + (1758822, 8000), (1758845, 3759), + (1759158, 19520)], + 't1bEGpCsvYenFdw3YqSFJazJBefNGnY5TK3': [(956522, 578707), (956629, 39823), + (956687, 1558487), (956689, 21041), + (956705, 27108), (956857, 250), + (956961, 62320), (957079, 7757), + (957114, 285729), (957257, 5000), + (957306, 1285903), (957356, 793146), + (957375, 4086), (957383, 2270), + (957429, 20481), (957466, 96985), + (957488, 36100), (957528, 16720), + (957602, 417727), (957637, 46832), + (957656, 12047), (957670, 70000), + (957681, 607098), (957765, 2039), + (957770, 10000), (957822, 17670), + (957893, 27947), (958019, 10000), + (958095, 129557), (958174, 167085), + (958377, 12085), (958420, 10000), + (958526, 8579), (958597, 10000), + (958631, 182714), (958688, 17584), + (958898, 74247), (959048, 107125), + (959115, 204065), (959166, 3386), + (959176, 45752), (959309, 17175), + (959374, 142528), (959512, 12262), + (959731, 34086), (959752, 12043), + (959903, 10215), (959943, 226253), + (959946, 803650), (959951, 28634), + (960034, 27663), (960074, 2043), + (960194, 59471), (960209, 49876), + (960229, 2194731), (960251, 1920), + (960320, 10000), (960444, 18387), + (960475, 73110), (960484, 15160), + (960485, 698471), (960520, 27796), + (960522, 236076), (960545, 145493), + (960648, 20703), (960735, 2046), + (960745, 9451), (960777, 60021), + (960805, 35567), (960824, 3740), + (960826, 36630), (960877, 947461), + (960939, 86490), (961010, 2450), + (961039, 103930), (961086, 13596), + (961105, 10000), (961136, 30378), + (961153, 102739), (961171, 12046), + (961228, 188293), (961320, 38116), + (961377, 40277), (961425, 23080), + (961444, 4948), (961460, 10000), + (961479, 443495), (961497, 95438), + (961514, 22331), (961519, 1278613), + (961658, 104474), (961663, 18356), + (961664, 40687), (961666, 11536), + (961710, 10000), (961725, 106740), + (961752, 194562), (961785, 2450), + (961788, 62783), (961795, 115537), + (961799, 5533), (961805, 241150), + (961811, 85749), (961835, 6129), + (961838, 71), (961877, 20624), + (961899, 15620), (961918, 7250), + (961934, 40396), (961953, 143801), + (961959, 83374), (962034, 28387), + (962048, 103583), (962123, 20000), + (962137, 20807), (962138, 4086), + (962160, 89340), (962165, 26344), + (962204, 42531), (962230, 60547), + (962269, 197399), (962315, 12350), + (962329, 68413), (962339, 66583), + (962382, 10000), (962404, 157470), + (962409, 17378), (962412, 20000), + (962440, 10000), (962444, 10000), + (962449, 24767), (962466, 10000), + (962490, 10000), (962509, 22450), + (962520, 39912), (962529, 21973), + (962570, 10000), (962579, 13267), + (962591, 18479), (962602, 48992), + (962612, 245510), (962614, 10030), + (962617, 10000), (962645, 496457), + (962655, 145580), (962668, 17627), + (962714, 26444), (962715, 10658), + (962718, 443927), (962754, 162531), + (962787, 221144), (962788, 32258), + (962797, 454677), (962830, 26474), + (962838, 52255), (962844, 10000), + (962845, 76872), (962849, 182622), + (962864, 22039), (962899, 40000), + (962909, 48085), (962938, 292856), + (962953, 22085), (962989, 127535), + (962998, 202836), (963026, 116141), + (963036, 106976), (963050, 64397), + (963051, 90682), (963055, 32473), + (963067, 54760), (963068, 45131), + (963098, 8359), (963102, 22047), + (963112, 10000), (963117, 114728), + (963131, 18359), (963140, 15315), + (963147, 553800), (963159, 38156), + (963193, 67111), (963199, 100000), + (963205, 20144), (963208, 21896), + (963221, 44980), (963232, 30000), + (963253, 20000), (963267, 22260), + (963270, 40000), (963273, 26016), + (963276, 50999), (963300, 20000), + (963307, 20279), (963315, 22143), + (963321, 10245), (963329, 10000), + (963331, 38829), (963337, 12043), + (963346, 194879), (963358, 12043), + (963373, 30000), (963376, 2043), + (963397, 12043), (963437, 18359), + (963480, 10000), (963488, 16780), + (963515, 22147), (963518, 10000), + (963546, 71970), (963552, 2043), + (963554, 42445), (963569, 506470), + (963571, 301731), (963613, 47409), + (963649, 632353), (963676, 10000), + (963684, 156660), (963692, 10000), + (963695, 8359), (963699, 61115), + (963701, 4513), (963708, 10000), + (963714, 22047), (963735, 22435), + (963738, 131044), (963740, 130839), + (963750, 118172), (963755, 18091), + (963785, 175146), (963809, 6536), + (963818, 2350), (963824, 46740), + (963826, 23196), (963834, 152289), + (963835, 340906), (963836, 126397), + (963858, 23938), (963878, 204410), + (963897, 18198), (963911, 93588), + (963917, 113076), (963923, 77767), + (963944, 28043), (963953, 50000), + (963956, 36813), (963959, 12047), + (963966, 112481), (963970, 310000), + (964000, 92148), (964005, 104110), + (964012, 34872), (964018, 22499), + (964025, 149431), (964063, 3983), + (964087, 143669), (964100, 157284), + (964105, 98974), (964109, 20128), + (964140, 66440), (964197, 40809), + (964202, 24090), (964239, 30000), + (964243, 48808), (964259, 12038), + (964268, 88891), (964298, 14086), + (964310, 74072), (964329, 217637), + (964339, 10000), (964354, 166411), + (964357, 186052), (964360, 10000), + (964361, 10000), (964365, 27508), + (964376, 19834), (964418, 522331), + (964430, 21594), (964436, 13740), + (964461, 140922), (964468, 64630), + (964487, 50142), (964496, 134878), + (964529, 65786), (964544, 34812), + (964549, 16536), (964553, 21340), + (964562, 10000), (964572, 35887), + (964582, 10000), (964593, 23958), + (964646, 10300), (964673, 322996), + (964676, 10000), (964682, 45386), + (964697, 10361), (964703, 73804), + (964704, 20976), (964711, 32043), + (964712, 116900), (964720, 21496), + (964732, 148621), (964735, 18356), + (964737, 30678), (964747, 10000), + (964753, 324318), (964756, 12047), + (964777, 107933), (964781, 48356), + (964782, 32598), (964795, 10000), + (964811, 163278), (964828, 216433), + (964836, 44193), (964854, 22085), + (964858, 33193), (964860, 53520), + (964885, 215647), (964902, 1920), + (964926, 161764), (964927, 6129), + (964930, 36800), (964947, 21220), + (964962, 134245), (964964, 16282), + (964968, 31410), (964974, 113678), + (964975, 13275), (964977, 115131), + (964989, 78519), (964990, 44086), + (964993, 34086), (965009, 58907), + (965012, 93735), (965014, 46740), + (965021, 20678), (965033, 34250), + (965035, 20403), (965036, 14303), + (965041, 57671), (965044, 53400), + (965051, 325723), (965054, 13740), + (965064, 250), (965065, 72094), + (965066, 104023), (965082, 250), + (965084, 127320), (965086, 250), + (965109, 12430), (965138, 42043), + (965140, 20000), (965151, 10000), + (965159, 10000), (965177, 40000), + (965180, 52262), (965183, 101779), + (965199, 40000), (965204, 57707), + (965206, 45580), (965210, 162443), + (965224, 46133), (965230, 82470), + (965254, 231033), (965260, 51072), + (965263, 192263), (965271, 274906), + (965281, 89463), (965291, 81015), + (965319, 50215), (965338, 28043), + (965340, 2043), (965344, 14086), + (965356, 179531), (965385, 91275), + (965386, 22881), (965405, 30622), + (965408, 191310), (965415, 30253), + (965428, 106856), (965454, 2450), + (965457, 26536), (965470, 47623), + (965485, 63468), (965488, 27500), + (965509, 6129), (965528, 2260), + (965564, 134900), (965571, 24086), + (965583, 24301), (965597, 1308353), + (965604, 8176), (965615, 40000), + (965627, 95038), (965647, 157181), + (965657, 232021), (965685, 16129), + (965696, 725652), (965697, 46086), + (965699, 18357), (965703, 55676), + (965709, 2043), (965722, 24043), + (965723, 144348), (965728, 10000), + (965749, 42529), (965762, 18356), + (965770, 194965), (965787, 51811), + (965802, 10000), (965810, 2899), + (965822, 10000), (965832, 10000), + (965864, 12260), (965918, 32450), + (965934, 36129), (965941, 17830), + (965949, 32845), (965962, 112174), + (965963, 33962), (966005, 388423), + (966010, 250), (966014, 2047), + (966021, 61346), (966023, 111951), + (966049, 42250), (966060, 13969), + (966076, 34086), (966077, 6581), + (966097, 158569), (966098, 75032), + (966105, 32443), (966128, 14086), + (966141, 25856), (966145, 4493), + (966149, 24488), (966169, 12043), + (966173, 283964), (966176, 2043), + (966219, 10000), (966241, 111354), + (966245, 235508), (966297, 9187), + (966298, 466856), (966299, 32047), + (966316, 97576), (966341, 20000), + (966350, 119666), (966382, 35342), + (966386, 50516), (966412, 16129), + (966436, 10082576), (966468, 100984), + (966486, 2043), (966493, 72876), + (966499, 102843), (966526, 24378), + (966544, 14086), (966552, 32357), + (966555, 6555), (966558, 10000), + (966578, 185477), (966599, 10000), + (966614, 35799), (966637, 128132), + (966644, 173043), (966648, 42447), + (966660, 10000), (966674, 157006), + (966682, 71193), (966683, 72135), + (966686, 30399), (966694, 6129), + (966703, 32135), (966733, 4086), + (966743, 16129), (966747, 12043), + (966757, 2043), (966760, 40399), + (966771, 78895), (966777, 107454), + (966784, 64556), (966787, 170209), + (966818, 10000), (966823, 443915), + (966850, 28172), (966858, 1380519), + (966860, 26915), (966863, 13301), + (966885, 75320), (966900, 11000), + (966909, 4086), (966913, 41916), + (966927, 25417), (966938, 12260), + (966942, 112584), (966951, 126609), + (966956, 10000), (966963, 26112), + (966976, 192047), (966982, 21164), + (966992, 24094), (967002, 27520), + (967017, 210666), (967018, 10000), + (967023, 8290), (967031, 86631), + (967033, 89423), (967040, 77326), + (967047, 43384), (967050, 216687), + (967055, 8356), (967061, 69128), + (967064, 4086), (967069, 62844), + (967081, 10000), (967084, 13500), + (967087, 10248), (967103, 18456), + (967104, 2350), (967122, 106423), + (967126, 10000), (967133, 67666), + (967145, 60036), (967149, 20000), + (967152, 7108), (967165, 125108), + (967167, 10215), (967170, 49724), + (967172, 22043), (967173, 142644), + (967181, 10000), (967192, 20000), + (967216, 28357), (967224, 20000), + (967276, 186079), (967284, 46740), + (967292, 59696), (967308, 12664), + (967311, 219570), (967315, 3963), + (967319, 25601), (967340, 129264), + (967346, 8669), (967350, 2047), + (967357, 226422), (967359, 10000), + (967365, 46436), (967372, 347991), + (967379, 22700), (967390, 40077), + (967399, 147200), (967402, 20471), + (967407, 38837), (967417, 21009), + (967440, 38857), (967460, 8357), + (967471, 146733), (967477, 10000), + (967479, 10000), (967486, 5749), + (967489, 220000), (967492, 87367), + (967497, 55775), (967503, 12043), + (967518, 9689), (967527, 161806), + (967530, 320869), (967531, 10000), + (967544, 2043), (967552, 414667), + (967554, 4303), (967560, 10399), + (967567, 2047), (967568, 3275), + (967569, 38798), (967579, 105046), + (967603, 10000), (967624, 66731), + (967629, 76349), (967636, 39153), + (967637, 159389), (967638, 1920), + (967640, 784832), (967642, 26481), + (967654, 10000), (967657, 25580), + (967662, 50961), (967691, 72076), + (967702, 10000), (967707, 20706), + (967710, 12043), (967714, 54350), + (967715, 54781), (967733, 10000), + (967744, 10000), (967749, 6129), + (967785, 178207), (967797, 22450), + (967802, 143211), (967805, 16215), + (967810, 75446), (967818, 69705), + (967822, 165891), (967834, 22085), + (967856, 34034), (967861, 66592), + (967867, 74887), (967878, 13456), + (967894, 34090), (967898, 18085), + (967900, 14171), (967909, 77658), + (967918, 157301), (967938, 280711), + (967939, 177068), (967944, 13121), + (967946, 108330), (967948, 136113), + (967954, 17892), (967955, 29660), + (967963, 20000), (967967, 44493), + (967984, 115834), (967987, 112737), + (967992, 213289), (967996, 14520), + (968002, 26120), (968015, 67171), + (968024, 10000), (968034, 345809), + (968040, 248907), (968083, 58233), + (968084, 139324), (968088, 16017), + (968093, 112377), (968110, 36000), + (968120, 29621), (968131, 10000), + (968140, 92063), (968149, 42857), + (968154, 3740), (968167, 4303), + (968178, 16314), (968185, 28356), + (968189, 12043), (968196, 178550), + (968198, 82428), (968200, 2043), + (968201, 12705), (968212, 315326), + (968213, 67380), (968222, 42485), + (968225, 56959), (968226, 12450), + (968231, 53754), (968236, 18243), + (968248, 125944), (968249, 2361), + (968254, 10000), (968259, 1245716), + (968261, 748), (968271, 30094), + (968273, 30707), (968276, 76848), + (968312, 10000), (968318, 26828), + (968319, 53357), (968343, 18357), + (968361, 83996), (968364, 70645), + (968368, 16171), (968370, 10000), + (968382, 2232953), (968386, 15580), + (968387, 166920), (968395, 10000), + (968406, 3990), (968413, 39517), + (968421, 255863), (968427, 60), + (968428, 89051), (968429, 250), + (968450, 115671), (968463, 118129), + (968467, 15580), (968473, 101958), + (968477, 46383), (968478, 6000), + (968487, 2297), (968493, 4086), + (968501, 54411), (968517, 10000), + (968530, 16436), (968532, 4086), + (968540, 88891), (968545, 38516), + (968548, 25333), (968550, 12785), + (968554, 88891), (968575, 25952), + (968599, 3275), (968618, 91341), + (968623, 13406), (968631, 84844), + (968643, 58996), (968647, 43472), + (968652, 2028), (968672, 68886), + (968677, 14090), (968679, 212437), + (968680, 36862), (968708, 6133), + (968716, 73202), (968725, 10000), + (968743, 102390), (968761, 4086), + (968767, 5225), (968776, 12043), + (968779, 6129), (968781, 2043), + (968800, 41625), (968802, 86546), + (968817, 546540), (968829, 95943), + (968833, 86468), (968834, 81467), + (968845, 12043), (968846, 161026), + (968848, 110982), (968849, 16943), + (968850, 66856), (968855, 36455), + (968863, 29371), (968865, 24374), + (968870, 306042), (968873, 46505), + (968877, 112700), (968895, 8357), + (968896, 17623), (968920, 18357), + (968921, 59538), (968943, 30452), + (968953, 24393), (968967, 20000), + (968983, 4086), (968988, 22293), + (968992, 38189), (968998, 104571), + (969007, 10663), (969015, 72060), + (969019, 2043), (969041, 110070), + (969045, 10622), (969047, 4086), + (969050, 634259), (969067, 198872), + (969089, 821370), (969090, 35840), + (969097, 1716052), (969101, 122126), + (969102, 10000), (969107, 16346), + (969108, 22278), (969109, 93178), + (969115, 138803), (969143, 24301), + (969169, 83744), (969178, 84809), + (969184, 2350), (969206, 27788), + (969207, 18260), (969225, 15339), + (969232, 12143), (969234, 136973), + (969239, 10000), (969291, 80461), + (969319, 118), (969324, 50240), + (969325, 10000), (969329, 25845), + (969330, 2430), (969354, 179930), + (969362, 15580), (969365, 73731), + (969370, 38478), (969385, 86898), + (969410, 2260), (969418, 7096), + (969419, 98946), (969420, 21885), + (969425, 12615), (969439, 10000), + (969440, 14223), (969443, 167700), + (969455, 70255), (969459, 16843), + (969465, 76617), (969470, 92981), + (969481, 10000), (969490, 10000), + (969498, 33490), (969521, 59154), + (969536, 17707), (969538, 4104), + (969563, 140769), (969567, 14484), + (969571, 6129), (969578, 104807), + (969591, 34089), (969592, 30260), + (969624, 4377), (969625, 212302), + (969629, 121723), (969636, 2043), + (969642, 2038), (969658, 2043), + (969671, 3467), (969673, 76870), + (969675, 16286), (969676, 128116), + (969691, 86840), (969698, 31013), + (969701, 131538), (969709, 24535), + (969717, 10000), (969722, 512161), + (969723, 120000), (969730, 2030), + (969735, 8167), (969749, 6536), + (969764, 23969), (969778, 90643), + (969811, 41874), (969819, 98501), + (969825, 8354), (969827, 16129), + (969828, 28172), (969835, 17904), + (969843, 82412), (969847, 26780), + (969850, 10000), (969851, 86033), + (969853, 48290), (969865, 37693), + (969872, 123083), (969876, 14711), + (969897, 29852), (969904, 5977), + (969907, 8172), (969914, 66747), + (969935, 14902), (969939, 110505), + (969945, 10263), (969961, 30000), + (969982, 10000), (969992, 66610), + (970007, 2043), (970014, 105038), + (970031, 2330), (970033, 186708), + (970042, 27580), (970049, 12440), + (970052, 103828), (970071, 97444), + (970074, 2350), (970075, 6129), + (970084, 4086), (970110, 93342), + (970129, 69964), (970144, 2043), + (970147, 95744), (970156, 10000), + (970169, 110000), (970177, 4896), + (970188, 20000), (970197, 26129), + (970204, 3100000), (970210, 70225), + (970215, 70926), (970216, 19376), + (970234, 16536), (970243, 4393), + (970247, 14086), (970254, 20000), + (970262, 24373), (970267, 29104), + (970268, 11755), (970275, 26046), + (970281, 100000), (970282, 2185351), + (970285, 30), (970292, 1325096), + (970293, 10000), (970295, 111138), + (970298, 17675), (970306, 71436), + (970311, 128409), (970313, 46168), + (970321, 5004), (970323, 29938), + (970361, 10000), (970367, 12078), + (970373, 65287), (970385, 20558), + (970408, 132001), (970411, 18438), + (970417, 103687), (970441, 117388), + (970458, 12049), (970463, 10000), + (970470, 20000), (970471, 2661), + (970475, 110965), (970488, 11057), + (970489, 30000), (970490, 14265), + (970514, 166828), (970517, 4698), + (970527, 9149), (970531, 8370), + (970537, 1308775), (970544, 18941), + (970547, 1000), (970575, 2051), + (970579, 14303), (970581, 100030), + (970582, 93443), (970607, 218103), + (970613, 26361), (970614, 7051), + (970619, 36555), (970631, 8375), + (970637, 1029346), (970648, 10000), + (970687, 38630), (970691, 401721), + (970700, 43509), (970722, 107638), + (970727, 133342), (970744, 166732), + (970746, 148186), (970748, 27750), + (970758, 24263), (970802, 20000), + (970803, 10000), (970813, 8388), + (970818, 10000), (970821, 14395), + (970827, 84132), (970829, 48072), + (970831, 26293), (970837, 10000), + (970839, 10000), (970845, 12441), + (970856, 22698), (970857, 140610), + (970860, 44704), (970861, 2349), + (970872, 2350), (970873, 199217), + (970877, 14028), (970878, 8390), + (970883, 38392), (970886, 12341), + (970890, 95149), (970899, 31904), + (970906, 4609), (970908, 10000), + (970909, 42729), (970923, 2430), + (970935, 20000), (970936, 54405), + (970967, 103176), (970968, 37980), + (970979, 100200), (970986, 118394), + (970989, 10000), (970994, 3105), + (970996, 206245), (970999, 15967), + (971002, 12349), (971003, 10000), + (971008, 77160), (971024, 2349), + (971026, 250), (971040, 10000), + (971047, 12085), (971057, 10000), + (971082, 6330), (971087, 6279), + (971095, 75169), (971096, 22349), + (971117, 61912), (971121, 76040), + (971129, 119377), (971133, 12349), + (971135, 354842), (971155, 248220), + (971168, 37503), (971174, 16720), + (971177, 2057), (971182, 54196), + (971194, 43349), (971195, 16848), + (971197, 10000), (971203, 14698), + (971209, 18401), (971224, 55972), + (971229, 2450), (971253, 12349), + (971315, 63168), (971316, 14188), + (971317, 18208), (971318, 158965), + (971322, 28841), (971346, 121432), + (971347, 2349), (971350, 69405), + (971353, 10000), (971354, 23449), + (971356, 339396), (971361, 32505), + (971367, 14399), (971372, 125837), + (971402, 125113), (971411, 20000), + (971412, 766420), (971420, 10000), + (971430, 9870), (971435, 293005), + (971436, 8349), (971438, 48177), + (971443, 1920), (971450, 178911), + (971463, 34014), (971475, 63205), + (971493, 67388), (971497, 10000), + (971511, 18410), (971530, 10000), + (971541, 12346), (971565, 10000), + (971572, 124950), (971604, 12349), + (971605, 79656), (971606, 10000), + (971612, 10000), (971617, 241236), + (971622, 10670), (971632, 4660), + (971634, 288702), (971643, 19647), + (971651, 74585), (971656, 80627), + (971657, 2052), (971700, 20187), + (971701, 4321), (971712, 2043), + (971713, 2060), (971716, 14124), + (971728, 270159), (971730, 2349), + (971741, 31719), (971742, 104243), + (971754, 13911), (971766, 16089), + (971778, 203842), (971797, 35972), + (971808, 137660), (971826, 203788), + (971829, 46482), (971836, 21072), + (971844, 29366), (971848, 10000), + (971852, 40452), (971874, 15105), + (971876, 2350), (971883, 69026), + (971892, 45306), (971900, 6000), + (971904, 117471), (971915, 7047), + (971918, 110275), (971925, 127450), + (971927, 423240), (971933, 899802), + (971956, 499952), (971958, 36836), + (971961, 22375), (971964, 41018), + (971976, 4322), (971984, 183294), + (971985, 149909), (971997, 12260), + (971998, 389080), (972007, 326172), + (972013, 1136369), (972016, 81449), + (972021, 28419), (972027, 71476), + (972035, 20000), (972040, 121460), + (972043, 68577), (972064, 2260), + (972085, 79422), (972089, 2349), + (972090, 339028), (972096, 2349), + (972099, 77360), (972108, 4698), + (972110, 42635), (972131, 124698), + (972132, 223762), (972133, 38545), + (972138, 10000), (972139, 28098), + (972144, 93972), (972151, 100023), + (972165, 1582), (972167, 27048), + (972168, 26761), (972169, 116130), + (972170, 204887), (972175, 20000), + (972185, 164734), (972188, 27148), + (972200, 10000), (972205, 32915), + (972207, 4106), (972225, 163032), + (972238, 20000), (972244, 116441), + (972272, 79419), (972287, 192011), + (972300, 28763), (972302, 17830), + (972303, 10000), (972304, 47623), + (972322, 4395), (972330, 20000), + (972334, 141268), (972336, 19850), + (972343, 8421), (972352, 92922), + (972368, 10000), (972369, 10000), + (972379, 119407), (972391, 24187), + (972397, 33060), (972404, 2349), + (972409, 103873), (972423, 30000), + (972428, 116032), (972432, 8422), + (972433, 4698), (972436, 88729), + (972441, 8422), (972469, 22430), + (972472, 107266), (972473, 12260), + (972478, 99725), (972488, 71973), + (972495, 1012349), (972502, 1920), + (972507, 68889), (972520, 285831), + (972522, 22063), (972537, 4126), + (972540, 156231), (972542, 35105), + (972551, 2063), (972554, 32038), + (972560, 18286), (972567, 116070), + (972577, 81653), (972578, 12064), + (972584, 57912), (972587, 816122), + (972589, 57800), (972590, 267932), + (972593, 16000), (972607, 89826), + (972609, 12349), (972614, 34000), + (972615, 168971), (972640, 32054), + (972641, 120672), (972650, 51547), + (972652, 49292), (972664, 5220), + (972669, 32600), (972671, 550643), + (972674, 7000), (972684, 3387241), + (972686, 10000), (972687, 2685), + (972688, 401497), (972697, 236603), + (972702, 10000), (972709, 2349), + (972725, 12063), (972737, 28795), + (972744, 250), (972746, 81924), + (972753, 10000), (972757, 347520), + (972759, 26349), (972764, 105830), + (972774, 10000), (972789, 101512), + (972791, 123779), (972798, 10000), + (972803, 6378), (972810, 25374), + (972811, 216628), (972818, 125848), + (972819, 30826), (972821, 113779), + (972822, 23532), (972826, 12450), + (972830, 118226), (972838, 49660), + (972841, 53774), (972845, 133988), + (972877, 40000), (972882, 5470), + (972892, 92764), (972900, 17000), + (972901, 10000), (972911, 25558), + (972912, 190878), (972913, 9314), + (972929, 176021), (972932, 12055), + (972933, 32350), (972936, 104208), + (972943, 2450), (972946, 10000), + (972954, 27328), (972955, 189116), + (972971, 14520), (972984, 10000), + (972997, 32063), (973000, 113227), + (973001, 206383), (973016, 43215), + (973028, 167206), (973031, 135361), + (973032, 10000), (973052, 118245), + (973054, 127830), (973057, 155820), + (973065, 307961), (973071, 574822), + (973078, 235812), (973080, 30000), + (973081, 17452), (973084, 244724), + (973086, 172013), (973089, 40868), + (973090, 120000), (973098, 142238), + (973100, 10000), (973101, 152109), + (973108, 10000), (973111, 90984), + (973113, 30000), (973117, 148116), + (973123, 298771), (973124, 12929), + (973126, 1372942), (973129, 20000), + (973130, 10000), (973134, 138458), + (973136, 77400), (973141, 25660), + (973143, 133943), (973145, 143570), + (973146, 77392), (973155, 2349), + (973158, 22043), (973165, 79293), + (973169, 14799), (973173, 22651), + (973179, 22085), (973180, 267229), + (973187, 10000), (973189, 12000), + (973191, 274757), (973193, 167543), + (973195, 140170), (973204, 43357), + (973222, 12349), (973227, 167663), + (973228, 10773), (973230, 54066), + (973232, 91745), (973236, 16025), + (973238, 32826), (973241, 126339), + (973248, 39097), (973249, 20000), + (973260, 2349), (973263, 19272), + (973271, 2349), (973289, 118462), + (973290, 146029), (973296, 15795), + (973300, 67392), (973312, 39729), + (973313, 10071), (973322, 12349), + (973325, 12349), (973344, 36848), + (973346, 12349), (973347, 6360), + (973353, 2655), (973363, 145941), + (973372, 127462), (973376, 83944), + (973382, 24345), (973383, 2379), + (973387, 111976), (973389, 34128), + (973390, 20000), (973401, 10000), + (973402, 10000), (973404, 66884), + (973407, 10000), (973413, 45631), + (973417, 10000), (973420, 91167), + (973422, 67929), (973423, 4698), + (973434, 18425), (973436, 98877), + (973437, 92199), (973462, 108602), + (973464, 22064), (973466, 18425), + (973468, 47244), (973471, 20000), + (973475, 10000), (973477, 10000), + (973481, 90854), (973482, 2055), + (973499, 10000), (973506, 12063), + (973507, 17889), (973514, 3010), + (973515, 55872), (973519, 150929), + (973522, 2349), (973524, 50905), + (973525, 472104), (973533, 247955), + (973546, 14434), (973547, 25105), + (973567, 20000), (973573, 49498), + (973577, 136685), (973588, 30299), + (973591, 14106), (973604, 20000), + (973608, 129216), (973611, 23332), + (973612, 68181), (973613, 7872), + (973624, 63412), (973626, 47948), + (973628, 12349), (973630, 10000), + (973634, 76952), (973636, 10000), + (973638, 2450), (973642, 33817), + (973651, 225896), (973654, 2349), + (973657, 46961), (973661, 219977), + (973665, 106760), (973669, 4075), + (973671, 25003), (973673, 102435), + (973685, 20000), (973692, 79086), + (973695, 22968), (973712, 181303), + (973713, 136294), (973727, 34750), + (973731, 10000), (973742, 12341), + (973748, 10000), (973752, 10000), + (973753, 10000), (973759, 12055), + (973766, 12014), (973768, 32063), + (973769, 29735), (973770, 44118), + (973774, 26520), (973775, 2063), + (973777, 23400), (973780, 10000), + (973781, 28424), (973783, 522055), + (973785, 116544), (973787, 35180), + (973789, 32063), (973796, 2124229), + (973803, 10000), (973822, 20000), + (973823, 15580), (973841, 2063), + (973847, 42624), (973860, 10000), + (973875, 37670), (973878, 326939), + (973882, 2260), (973889, 78384), + (973895, 31920), (973897, 245), + (973904, 121335), (973906, 2124641), + (973921, 10000), (973937, 82600), + (973943, 10245), (973948, 34000), + (973949, 949531), (973955, 10000), + (973959, 148600), (973972, 77246), + (973973, 10000), (973975, 244), + (973981, 42000), (973982, 10276), + (974000, 10279), (974001, 161155), + (974002, 20000), (974003, 160790), + (974013, 10276), (974024, 107656), + (974037, 42450), (974054, 71340), + (974057, 10000), (974061, 15410), + (974081, 10000), (974102, 10000), + (974115, 24800), (974119, 10000), + (974124, 36000), (974132, 22260), + (974145, 232027), (974152, 20577), + (974154, 10619), (974156, 214603), + (974160, 12695), (974162, 341160), + (974167, 730958), (974170, 31410), + (974172, 47495), (974187, 102770), + (974194, 21148), (974212, 35052), + (974218, 10000), (974224, 2610), + (974225, 120000), (974227, 90477), + (974231, 10000), (974233, 55573), + (974235, 200228), (974237, 45609), + (974246, 24468), (974247, 245), + (974250, 111920), (974257, 66665), + (974266, 2019600), (974274, 20000), + (974276, 107118), (974279, 100250), + (974280, 250), (974286, 32071), + (974297, 10000), (974298, 10000), + (974300, 22662), (974301, 42633), + (974302, 2260), (974315, 14763), + (974324, 71582), (974325, 20000), + (974328, 41920), (974330, 10000), + (974332, 136000), (974335, 20520), + (974336, 3740), (974340, 10000), + (974353, 35162), (974355, 244), + (974357, 49051), (974361, 29988), + (974374, 20000), (974376, 123039), + (974377, 11391), (974390, 244), + (974400, 10000), (974405, 1713037), + (974411, 15580), (974420, 10071), + (974433, 100), (974434, 38450), + (974444, 10000), (974445, 18711), + (974452, 350391), (974455, 20000), + (974457, 10000), (974458, 12521), + (974470, 13333), (974472, 64863), + (974475, 159661), (974484, 21385), + (974486, 59342), (974491, 10000), + (974494, 12450), (974496, 22361), + (974497, 22971), (974504, 178109), + (974505, 50520), (974513, 456503), + (974514, 81732), (974519, 111708), + (974520, 74953), (974522, 166341), + (974535, 18792), (974537, 104548), + (974543, 61950), (974548, 23496), + (974551, 30244), (974554, 31978), + (974555, 11920), (974564, 193839), + (974574, 23267), (974591, 18711), + (974596, 245), (974612, 13204), + (974615, 24175), (974616, 165520), + (974631, 48711), (974643, 10000), + (974646, 90000), (974656, 56410), + (974670, 25580), (974676, 12450), + (974682, 90541), (974683, 20836), + (974685, 13264), (974692, 20000), + (974694, 22697), (974733, 18960), + (974740, 19850), (974754, 135410), + (974755, 22960), (974760, 3573), + (974778, 20000), (974781, 10000), + (974786, 110688), (974789, 30873), + (974791, 51634), (974810, 12936), + (974813, 14799), (974816, 22935), + (974817, 2936), (974845, 55312), + (974860, 864596), (974868, 20000), + (974875, 36645), (974876, 92451), + (974888, 3841), (974889, 20000), + (974899, 10000), (974906, 61935), + (974907, 30276), (974909, 42694), + (974913, 332960), (974927, 652240), + (974930, 114382), (974933, 31560), + (974934, 347), (974936, 3596), + (974943, 8202), (974945, 154960), + (974953, 79949), (974963, 20245), + (974976, 52280), (974982, 40245), + (974983, 151853), (974990, 10793), + (974998, 574540), (975002, 30000), + (975009, 20000), (975012, 1521), + (975040, 2145447), (975049, 129120), + (975056, 3267), (975059, 36000), + (975061, 10000), (975079, 33679), + (975082, 2093359), (975085, 26700), + (975089, 20000), (975090, 2961), + (975098, 48245), (975108, 195561), + (975110, 71352), (975112, 55046), + (975120, 35403), (975129, 20521), + (975134, 60245), (975136, 36504), + (975141, 42278), (975145, 155324), + (975152, 10000), (975153, 15207), + (975157, 34784), (975164, 6904), + (975165, 12726), (975172, 623), + (975178, 12960), (975179, 68526), + (975186, 13400), (975193, 61878), + (975195, 250), (975196, 25900), + (975197, 53720), (975200, 32290), + (975205, 112963), (975222, 36830), + (975229, 38334), (975234, 60677), + (975246, 20245), (975260, 16801), + (975276, 3076), (975295, 49556), + (975298, 80000), (975300, 71), + (975314, 106370), (975316, 276), + (975318, 157398), (975319, 44311), + (975329, 134433), (975336, 518419), + (975353, 10000), (975357, 10000), + (975366, 30460), (975369, 712), + (975371, 3980960), (975382, 284994), + (975383, 52835), (975401, 100000), + (975403, 201237), (975404, 16452), + (975410, 10205), (975413, 10000), + (975425, 90226), (975440, 22375), + (975446, 10000), (975447, 29921), + (975450, 2960), (975455, 3733), + (975456, 12450), (975459, 21044), + (975460, 67526), (975473, 22960), + (975477, 125418), (975479, 10276), + (975480, 17447), (975494, 130245), + (975496, 7583), (975522, 98864), + (975523, 112765), (975533, 245), + (975538, 23466), (975553, 279), + (975570, 50877), (975573, 52073), + (975578, 31060), (975580, 11671), + (975581, 106610), (975589, 79724), + (975592, 8234), (975604, 25877), + (975605, 61239), (975611, 20551), + (975629, 583), (975644, 26212), + (975645, 12967), (975647, 24356), + (975648, 153067), (975650, 10449), + (975652, 657), (975653, 54760), + (975654, 2350), (975655, 15268), + (975662, 36667), (975669, 38782), + (975673, 81760), (975675, 34403), + (975677, 13552), (975679, 81920), + (975686, 67031), (975689, 120225), + (975692, 30660), (975694, 10380), + (975698, 415), (975699, 17005), + (975705, 34375), (975714, 13544), + (975726, 414), (975728, 20415), + (975729, 55951), (975731, 76073), + (975756, 20000), (975763, 10607), + (975767, 16941), (975774, 10761), + (975784, 275), (975803, 52092), + (975805, 279), (975809, 11942), + (975811, 10000), (975817, 16129), + (975828, 380), (975840, 23884), + (975852, 36238), (975854, 1920), + (975857, 10312), (975862, 39616), + (975865, 80631), (975866, 10448), + (975873, 32749), (975882, 46529), + (975883, 10000), (975892, 24774), + (975899, 120868), (975901, 11384), + (975912, 11288), (975917, 245), + (975934, 19686), (975935, 20347), + (975939, 237015), (975945, 38362), + (975946, 34277), (975948, 16391), + (975971, 10837), (975986, 3409), + (975987, 985), (975989, 78185), + (975990, 347), (975995, 10552), + (976004, 65312), (976005, 43241), + (976010, 48536), (976013, 56020), + (976014, 2960), (976017, 10000), + (976018, 540), (976027, 226), + (976029, 4781), (976038, 547710), + (976040, 27003), (976044, 10000), + (976048, 3930), (976053, 10000), + (976055, 120307), (976058, 30645), + (976064, 30000), (976077, 13963), + (976079, 10000), (976081, 344), + (976090, 16346), (976094, 30000), + (976096, 12450), (976103, 20984), + (976106, 16067), (976109, 105905), + (976127, 245), (976141, 45172), + (976147, 16000), (976149, 200689), + (976151, 10000), (976153, 12909), + (976155, 20245), (976163, 12960), + (976175, 10000), (976177, 10000), + (976189, 47301), (976190, 10000), + (976192, 87820), (976195, 36583), + (976203, 8226), (976214, 33051), + (976218, 147300), (976228, 75205), + (976231, 57720), (976234, 10000), + (976247, 245), (976250, 61450), + (976253, 20000), (976260, 36029), + (976262, 112960), (976263, 11582), + (976277, 20373), (976278, 2960), + (976282, 20244), (976284, 32502), + (976301, 30250), (976303, 34835), + (976315, 86921), (976325, 85929), + (976326, 145583), (976327, 106829), + (976330, 15999), (976334, 15681), + (976336, 10000), (976343, 26251), + (976357, 30564), (976360, 23647), + (976369, 30315), (976372, 12450), + (976373, 22546), (976380, 68412), + (976386, 33573), (976411, 10000), + (976412, 23049), (976415, 33215), + (976421, 1920), (976426, 24320), + (976427, 1129), (976451, 131630), + (976455, 42960), (976459, 254024), + (976460, 206444), (976470, 10443), + (976474, 91239), (976481, 129503), + (976488, 2910), (976489, 47920), + (976492, 202574), (976496, 53629), + (976512, 10000), (976526, 25025), + (976531, 26000), (976533, 10717), + (976536, 2928), (976541, 19660), + (976552, 780), (976553, 79497), + (976557, 779), (976565, 10245), + (976571, 133859), (976579, 56718), + (976584, 85868), (976591, 2450), + (976604, 23897), (976612, 30505), + (976619, 10000), (976621, 10000), + (976637, 66438), (976642, 66702), + (976644, 36451), (976645, 112925), + (976646, 168837), (976654, 259051), + (976658, 871), (976661, 29056), + (976666, 42459), (976667, 37466), + (976673, 71067), (976689, 70740), + (976691, 3558), (976694, 33285), + (976697, 42949), (976709, 65006), + (976721, 7767), (976728, 2450), + (976731, 73705), (976734, 425863), + (976736, 3321), (976745, 91865), + (976754, 82436), (976761, 10044072), + (976768, 32504), (976783, 48151), + (976791, 10000), (976793, 1410), + (976802, 115980), (976809, 10000), + (976817, 96887), (976818, 10000), + (976824, 32334), (976826, 29363), + (976833, 20000), (976835, 57938), + (976840, 33573), (976842, 34880), + (976857, 20893), (976860, 20000), + (976863, 44644), (976866, 28540), + (976867, 26726), (976868, 45717), + (976873, 12260), (976889, 44098), + (976896, 25410), (976898, 32496), + (976901, 23243), (976902, 38342), + (976905, 10000), (976911, 34063), + (976921, 4063), (976922, 31135), + (976924, 34063), (976925, 38928), + (976927, 10000), (976928, 10000), + (976930, 15580), (976933, 23267), + (976937, 68414), (976941, 34063), + (976948, 1480326), (976966, 30845), + (976969, 20000), (976980, 150147), + (976987, 32430), (977008, 153472), + (977016, 16100), (977021, 192430), + (977022, 10000), (977028, 521920), + (977042, 3879), (977054, 40000), + (977072, 10000), (977079, 30000), + (977080, 20000), (977091, 74133), + (977098, 41402), (977106, 13879), + (977109, 10000), (977115, 39543), + (977116, 10000), (977135, 76206), + (977136, 266790), (977141, 924203), + (977144, 42595), (977146, 83542), + (977155, 3149495), (977158, 618838), + (977168, 20000), (977170, 18103), + (977182, 22960), (977188, 10000), + (977206, 131299), (977218, 7862), + (977219, 71), (977222, 10000), + (977224, 276), (977227, 19390), + (977228, 192000), (977238, 32080), + (977247, 13573), (977249, 975), + (977254, 34646), (977258, 2260), + (977276, 15360), (977277, 50802), + (977300, 46900), (977307, 12345), + (977313, 20000), (977334, 22349), + (977339, 33985), (977350, 29400), + (977351, 120000), (977353, 10000), + (977358, 32805), (977390, 1920), + (977391, 23573), (977392, 110000), + (977393, 392), (977397, 203913), + (977405, 134638), (977412, 20000), + (977420, 150010), (977421, 71542), + (977425, 98316), (977429, 110772), + (977431, 45433), (977436, 57108), + (977438, 10000), (977440, 3571), + (977453, 22960), (977469, 53482), + (977472, 93978), (977475, 7320), + (977479, 174729), (977481, 56445), + (977485, 47725), (977493, 2260), + (977502, 10000), (977511, 1582), + (977512, 12110), (977513, 32960), + (977518, 65451), (977524, 15385), + (977545, 24730), (977547, 147057), + (977561, 36743), (977570, 53844), + (977577, 39809), (977578, 44289), + (977580, 50390), (977589, 56866), + (977594, 14370), (977599, 89494), + (977605, 10000), (977614, 45914), + (977622, 254088), (977624, 224795), + (977629, 38000), (977634, 64760), + (977637, 10000), (977644, 2960), + (977647, 102702), (977650, 7858), + (977655, 28250), (977656, 212862), + (977659, 27376), (977660, 18709), + (977664, 63788), (977665, 10000), + (977666, 10226), (977667, 24727), + (977674, 28000), (977678, 23529), + (977679, 57545), (977681, 41924), + (977684, 2960), (977685, 11600), + (977688, 239493), (977690, 152075), + (977697, 22536), (977703, 493208), + (977706, 20168), (977710, 65980), + (977723, 10000), (977729, 6416), + (977730, 10000), (977731, 247461), + (977734, 58728), (977737, 12960), + (977739, 84482), (977750, 95299), + (977770, 6864), (977779, 128725), + (977782, 12960), (977789, 22960), + (977796, 10000), (977803, 33922), + (977805, 119728), (977808, 1454213), + (977815, 16026), (977830, 12768), + (977835, 53589), (977836, 10000), + (977846, 32960), (977850, 105032), + (977851, 136410), (977852, 20000), + (977858, 17040), (977860, 25572), + (977878, 12960), (977886, 87800), + (977912, 85422), (977930, 15580), + (977942, 21560), (977959, 10000), + (977961, 84760), (977962, 38709), + (977967, 10000), (977973, 122085), + (977981, 20000), (977984, 2450), + (977985, 46772), (977996, 20401), + (977997, 16780), (977998, 50000), + (978005, 10000), (978008, 59226), + (978010, 22450), (978022, 40000), + (978024, 1000), (978030, 10000), + (978033, 20000), (978062, 53279), + (978063, 80000), (978072, 10000), + (978076, 10452), (978091, 10347), + (978094, 20000), (978096, 10000), + (978101, 20276), (978102, 40844), + (978107, 57348), (978111, 77088), + (978124, 13573), (978126, 92450), + (978127, 20000), (978133, 39267), + (978135, 25045), (978139, 13724), + (978141, 10000), (978144, 184852), + (978156, 100000), (978162, 173065), + (978166, 30000), (978169, 10000), + (978170, 32960), (978183, 49215), + (978191, 13573), (978196, 139916), + (978199, 10000), (978210, 6437), + (978213, 89150), (978223, 12574), + (978228, 170290), (978239, 10000), + (978244, 30000), (978246, 12595), + (978258, 42229), (978259, 70649), + (978262, 10000), (978266, 22480), + (978275, 113076), (978277, 10000), + (978278, 10000), (978289, 37860), + (978291, 496461), (978293, 314471), + (978305, 245), (978307, 204330), + (978308, 24805), (978316, 146584), + (978319, 413653), (978325, 22910), + (978327, 90623), (978339, 3267), + (978343, 8910), (978345, 2960), + (978347, 22450), (978351, 33105), + (978359, 4000), (978380, 56552), + (978382, 250), (978386, 2325), + (978387, 30000), (978390, 28186), + (978392, 42260), (978393, 41509), + (978395, 201005), (978396, 25858), + (978397, 69949), (978399, 51203), + (978403, 12260), (978416, 31290), + (978426, 105251), (978443, 100), + (978452, 21631), (978454, 19830), + (978455, 144714), (978467, 42282), + (978468, 61223), (978482, 10001), + (978485, 54827), (978494, 22085), + (978513, 165366), (978524, 106458), + (978536, 19620), (978542, 30000), + (978543, 20000), (978549, 40986), + (978559, 223437), (978585, 58004), + (978591, 18388), (978593, 3000), + (978596, 12085), (978598, 141900), + (978602, 32758), (978605, 12450), + (978610, 125430), (978640, 10000), + (978651, 5860), (978654, 3979), + (978659, 123865), (978677, 25452), + (978678, 100000), (978679, 91582), + (978694, 100), (978697, 102348), + (978704, 26171), (978706, 7021), + (978719, 17019), (978722, 34679), + (978725, 173296), (978728, 10000), + (978731, 100), (978734, 53543), + (978751, 10000), (978754, 28146), + (978755, 44126), (978757, 170680), + (978761, 30000), (978771, 141293), + (978773, 52879), (978775, 46740), + (978780, 75640), (978791, 37340), + (978793, 24829), (978798, 30250), + (978799, 50000), (978801, 10000), + (978807, 32985), (978816, 314202), + (978825, 170875), (978826, 47854), + (978833, 12450), (978840, 10894), + (978856, 33980), (978876, 112112), + (978881, 209421), (978882, 22450), + (978885, 10000), (978889, 261059), + (978899, 91903), (978905, 9756), + (978906, 12690), (978914, 10000), + (978916, 169933), (978927, 16720), + (978945, 50000), (978950, 142231), + (978959, 133445), (978960, 12092), + (978966, 20000), (978972, 12260), + (978986, 104992), (978996, 152260), + (979026, 10000), (979027, 46217), + (979033, 20623), (979045, 101869), + (979058, 68304), (979059, 62083), + (979062, 12091), (979069, 159545), + (979074, 11000), (979080, 34508), + (979084, 7056), (979089, 18538), + (979095, 74206), (979096, 3252), + (979097, 30000), (979098, 21498), + (979104, 10000), (979107, 30000), + (979110, 66999), (979114, 99727), + (979118, 142291), (979135, 30000), + (979138, 37749), (979145, 34751), + (979164, 92165), (979169, 25429), + (979177, 1920), (979179, 10000), + (979183, 8538), (979185, 88814), + (979192, 10100), (979196, 73571), + (979200, 14386), (979204, 38451), + (979207, 158269), (979213, 11499), + (979230, 16515), (979238, 45406), + (979239, 10000), (979263, 110861), + (979265, 416451), (979267, 40000), + (979275, 245), (979281, 115130), + (979285, 150713), (979290, 10000), + (979296, 10000), (979301, 63617), + (979309, 40000), (979314, 96878), + (979316, 27812), (979318, 78896), + (979344, 26254), (979360, 43267), + (979365, 23740), (979366, 10000), + (979376, 120000), (979377, 62596), + (979388, 151765), (979392, 1069537), + (979395, 30860), (979399, 3404331), + (979403, 1467), (979412, 20282), + (979418, 284325), (979419, 10000), + (979421, 126156), (979427, 36434), + (979434, 1296148), (979442, 222560), + (979450, 90000), (979455, 12108), + (979457, 79800), (979458, 255353), + (979465, 3267), (979482, 13267), + (979494, 22597), (979496, 24873), + (979499, 22960), (979516, 10000), + (979517, 12160), (979542, 13236), + (979546, 79230), (979564, 28861), + (979575, 9832), (979576, 19242), + (979592, 10000), (979597, 1298403), + (979598, 15740), (979603, 44731), + (979605, 10000), (979607, 29194), + (979608, 393), (979610, 141765), + (979612, 74660), (979615, 62656), + (979623, 60625), (979624, 34000), + (979635, 10000), (979646, 10000), + (979652, 10000), (979656, 20276), + (979673, 22450), (979674, 133451), + (979675, 23336), (979686, 10245), + (979689, 298359), (979706, 148112), + (979708, 2260), (979709, 167340), + (979711, 10493), (979713, 10828), + (979714, 22450), (979716, 22960), + (979721, 18171), (979726, 167525), + (979729, 12260), (979736, 66083), + (979752, 125948), (979756, 103571), + (979761, 80250), (979771, 39660), + (979776, 25855), (979780, 51943), + (979782, 31670), (979786, 186767), + (979787, 12085), (979794, 250), + (979801, 18126), (979813, 18506), + (979814, 10000), (979823, 14845), + (979824, 250834), (979832, 53064), + (979833, 96014), (979834, 10000), + (979837, 2450), (979861, 30047), + (979873, 26800), (979877, 25220), + (979881, 60670), (979882, 191548), + (979894, 65543), (979900, 180532), + (979910, 33450), (979916, 20000), + (979920, 10000), (979924, 85280), + (979925, 309373), (979934, 315097), + (979940, 58395), (979941, 10000), + (979945, 76316), (979953, 64791), + (979954, 15410), (979960, 5850), + (979970, 462869), (979979, 83943), + (979980, 103105), (979986, 67060), + (979992, 10000), (979998, 19133), + (980002, 154076), (980009, 38540), + (980011, 159293), (980017, 79746), + (980039, 133330), (980040, 42521), + (980041, 339985), (980043, 35867), + (980066, 16087), (980072, 17344), + (980073, 12450), (980079, 30000), + (980083, 23787), (980088, 31524), + (980091, 50000), (980095, 42480), + (980097, 4168), (980098, 91603), + (980106, 3267), (980111, 20000), + (980114, 248335), (980115, 68336), + (980116, 15770), (980118, 10000), + (980134, 234840), (980146, 181771), + (980154, 52655), (980158, 34000), + (980164, 18542), (980181, 1920), + (980188, 138663), (980189, 20000), + (980194, 47290), (980197, 20636), + (980213, 229775), (980227, 6890), + (980233, 95513), (980237, 251284), + (980238, 92300), (980242, 17858), + (980245, 10000), (980248, 10000), + (980256, 10000), (980264, 8544), + (980267, 27012), (980268, 69803), + (980269, 20000), (980284, 1565237), + (980287, 98997), (980292, 38544), + (980293, 110214), (980307, 39511), + (980310, 32960), (980311, 10000), + (980313, 97337), (980316, 866135), + (980319, 95659), (980320, 122293), + (980321, 20000), (980323, 57797), + (980327, 28299), (980336, 2450), + (980338, 26279), (980341, 10900), + (980356, 10000), (980359, 11146), + (980372, 21700), (980375, 1350109), + (980379, 166498), (980384, 1303306), + (980387, 2093), (980394, 41529), + (980401, 522233), (980405, 122196), + (980414, 35807), (980420, 10000), + (980423, 2960), (980427, 17231), + (980434, 2350), (980442, 6278), + (980446, 36950), (980458, 814704), + (980482, 697604), (980485, 24753), + (980489, 909501), (980490, 453160), + (980491, 48000), (980492, 21076), + (980495, 24880), (980502, 35194), + (980509, 5137), (980523, 130839), + (980524, 732199), (980525, 959), + (980529, 41955), (980530, 30000), + (980531, 15862), (980534, 31389), + (980535, 364896), (980544, 10000), + (980546, 40860), (980549, 12450), + (980550, 276), (980551, 22960), + (980552, 10000), (980562, 26954), + (980566, 357984), (980567, 218445), + (980573, 58205), (980580, 41505), + (980581, 137783), (980586, 88360), + (980591, 78309), (980604, 22450), + (980607, 10000), (980609, 33267), + (980612, 779056), (980614, 82746), + (980615, 20000), (980616, 50495), + (980619, 313), (980622, 165971), + (980628, 64680), (980631, 10000), + (980632, 91802), (980641, 6000), + (980656, 30000), (980669, 106709), + (980671, 10960), (980677, 15005), + (980682, 22384), (980691, 10313), + (980704, 174413), (980707, 97806), + (980709, 106865), (980715, 20000), + (980717, 20276), (980720, 67700), + (980739, 36267), (980770, 29453), + (980772, 23660), (980781, 32196), + (980793, 212827), (980805, 10000), + (980806, 42170), (980809, 25980), + (980812, 108404), (980815, 21059), + (980825, 194870), (980841, 31920), + (980856, 30713), (980866, 19855), + (980883, 6000), (980885, 8545), + (980891, 12384), (980911, 30250), + (980922, 22085), (980934, 22085), + (980951, 166099), (980953, 20000), + (980955, 37894), (980964, 49549), + (980966, 30000), (980969, 102430), + (980978, 48218), (980990, 233929), + (981007, 266912), (981008, 66207), + (981013, 49384), (981029, 14870), + (981044, 46875), (981049, 70630), + (981062, 2171475), (981065, 94867), + (981077, 98314), (981079, 32985), + (981091, 132864), (981092, 45045), + (981096, 5197), (981102, 12085), + (981110, 71507), (981115, 599376), + (981165, 2094), (981167, 17940), + (981170, 12384), (981172, 10000), + (981175, 10000), (981178, 225373), + (981215, 55980), (981223, 22438), + (981226, 2376), (981251, 178530), + (981257, 20000), (981267, 20000), + (981275, 59079), (981278, 10000), + (981286, 56252), (981287, 86273), + (981291, 12094), (981293, 12450), + (981298, 83138), (981326, 92021), + (981327, 70060), (981328, 250), + (981331, 24544), (981345, 88814), + (981355, 33204), (981356, 180827), + (981378, 7884), (981405, 114535), + (981406, 30000), (981411, 194529), + (981412, 10000), (981417, 10000), + (981422, 10000), (981425, 129133), + (981429, 50545), (981435, 20638), + (981437, 10000), (981439, 155450), + (981442, 196332), (981446, 58280), + (981455, 50134), (981474, 49628), + (981476, 20000), (981478, 12960), + (981483, 28615), (981485, 18544), + (981494, 23982), (981497, 422845), + (981501, 41500), (981508, 113770), + (981512, 74148), (981515, 62960), + (981525, 34325), (981535, 4229), + (981538, 46740), (981545, 283583), + (981548, 10000), (981560, 167834), + (981566, 42793), (981571, 8545), + (981574, 16910), (981583, 40483), + (981588, 10000), (981601, 78413), + (981612, 8545), (981629, 12674), + (981630, 120000), (981631, 2093), + (981633, 20000), (981635, 26184), + (981636, 125228), (981640, 12665), + (981668, 28545), (981672, 60252), + (981673, 10000), (981676, 72396), + (981681, 12384), (981683, 465021), + (981684, 45320), (981685, 347558), + (981688, 6252), (981693, 14417), + (981712, 25972), (981719, 40370), + (981720, 1512141), (981725, 11146), + (981726, 25850), (981733, 27137), + (981734, 3740), (981742, 22450), + (981747, 2085), (981752, 44542), + (981753, 589026), (981755, 19320), + (981764, 8960), (981775, 35386), + (981778, 591358), (981785, 48126), + (981807, 12960), (981808, 20000), + (981827, 25390), (981848, 92093), + (981870, 202834), (981878, 12367), + (981880, 16893), (981881, 373155), + (981884, 22000), (981889, 1582), + (981897, 20000), (981905, 25689), + (981910, 32948), (981916, 110639), + (981921, 108222), (981922, 22028), + (981924, 81678), (981934, 31573), + (981936, 7476), (981938, 24667), + (981939, 159547), (981953, 10000), + (981961, 31211), (981965, 20250), + (981980, 91180), (981988, 10000), + (981994, 181777), (982011, 10000), + (982012, 20000), (982019, 89504), + (982030, 16965), (982034, 250), + (982036, 49320), (982041, 60223), + (982057, 10000), (982066, 152960), + (982067, 96896), (982074, 82679), + (982075, 33854), (982076, 20656), + (982081, 70653), (982082, 92447), + (982088, 10000), (982089, 17310), + (982091, 296000), (982096, 228860), + (982116, 19878), (982118, 115989), + (982125, 5410), (982137, 221170), + (982138, 15742), (982143, 11728), + (982150, 158482), (982152, 39530), + (982155, 2186), (982156, 10000), + (982158, 12666), (982174, 53149), + (982178, 78360), (982179, 12384), + (982180, 112953), (982189, 34794), + (982194, 22965), (982195, 110642), + (982202, 187096), (982206, 375715), + (982208, 31160), (982216, 27000), + (982227, 92538), (982229, 169023), + (982249, 192141), (982255, 156580), + (982256, 78674), (982261, 43766), + (982265, 57289), (982276, 5933), + (982281, 204946), (982287, 1582), + (982290, 12384), (982295, 10000), + (982298, 267393), (982301, 42674), + (982304, 15724), (982307, 145017), + (982312, 10000), (982319, 10000), + (982320, 2960), (982322, 30285), + (982327, 85470), (982336, 96758), + (982348, 10000), (982351, 149315), + (982354, 117489), (982361, 3267), + (982362, 97481), (982363, 10000), + (982371, 10000), (982379, 42258), + (982382, 14905), (982386, 33156), + (982397, 75099), (982399, 24468), + (982403, 22093), (982407, 20000), + (982408, 11000), (982422, 10000), + (982428, 22960), (982430, 113174), + (982439, 43390), (982445, 8543), + (982454, 78344), (982457, 12085), + (982459, 72477), (982462, 24373), + (982463, 121810), (982464, 84168), + (982469, 45758), (982499, 30000), + (982500, 2366), (982504, 342776), + (982509, 48093), (982525, 13267), + (982526, 47503), (982529, 583), + (982538, 23330), (982541, 44487), + (982545, 109780), (982548, 20000), + (982571, 409330), (982577, 20000), + (982584, 53884), (982586, 73500), + (982588, 276705), (982591, 2093), + (982596, 10000), (982600, 52598), + (982603, 235655), (982606, 15580), + (982608, 30624), (982617, 40000), + (982623, 71346), (982624, 47529), + (982629, 10000), (982632, 76226), + (982640, 17673), (982645, 136845), + (982655, 224331), (982666, 31955), + (982672, 68344), (982673, 22960), + (982684, 31394), (982687, 43833), + (982692, 10000), (982694, 24880), + (982704, 17838), (982707, 96177), + (982708, 32960), (982711, 1387373), + (982714, 134002), (982725, 22085), + (982730, 2430), (982736, 6890), + (982740, 10000), (982743, 3400), + (982747, 56138), (982751, 10000), + (982752, 130111), (982757, 81564), + (982767, 24971), (982772, 30000), + (982773, 61264), (982774, 69916), + (982791, 39400), (982807, 8108), + (982808, 3573), (982810, 2093), + (982847, 178976), (982864, 319323), + (982875, 10447), (982885, 10000), + (982891, 30000), (982893, 11826), + (982899, 143718), (982913, 6000), + (982914, 22324), (982927, 540513), + (982934, 2102978), (982935, 10000), + (982945, 80000), (982948, 12628), + (982950, 61172), (982954, 10000), + (982966, 1422), (982967, 29291), + (982968, 2260), (982974, 69368), + (982979, 5578), (982991, 243932), + (983005, 34849), (983006, 279), + (983014, 10278), (983017, 10000), + (983024, 3400), (983058, 73651), + (983060, 195088), (983062, 78697), + (983065, 93647), (983069, 24710), + (983075, 118183), (983087, 181332), + (983089, 22573), (983095, 154177), + (983101, 10071), (983119, 23897), + (983124, 570032), (983143, 11146), + (983168, 1407523), (983178, 1390), + (983183, 20000), (983197, 276771), + (983200, 14500), (983212, 10000), + (983213, 282208), (983218, 50000), + (983222, 35299), (983227, 75196), + (983242, 4106), (983256, 86653), + (983273, 58185), (983284, 82615), + (983292, 32341), (983299, 7330), + (983301, 76225), (983302, 28180), + (983308, 149078), (983311, 2083), + (983314, 86502), (983319, 12960), + (983323, 2450), (983329, 65639), + (983338, 37891), (983340, 31160), + (983344, 66672), (983348, 2260), + (983368, 29910), (983377, 88320), + (983380, 12715), (983383, 40632), + (983387, 236755), (983389, 55043), + (983396, 8540), (983405, 10000), + (983409, 10000), (983410, 415179), + (983416, 10000), (983417, 68320), + (983419, 35728), (983426, 59623), + (983434, 72114), (983435, 88328), + (983449, 14352), (983476, 172834), + (983477, 158712), (983478, 14880), + (983481, 113280), (983504, 166716), + (983507, 28542), (983513, 10000), + (983514, 25580), (983515, 20625), + (983518, 39334), (983525, 144561), + (983526, 268877), (983535, 25256), + (983542, 10000), (983545, 279120), + (983554, 137092), (983555, 61043), + (983562, 23502), (983567, 10516), + (983569, 80400), (983570, 48000), + (983578, 26361), (983601, 168093), + (983603, 12028), (983607, 20000), + (983613, 71442), (983629, 2960), + (983633, 229869), (983635, 12430), + (983644, 45045), (983646, 211285), + (983650, 18188), (983660, 20000), + (983671, 84220), (983674, 11146), + (983675, 39689), (983681, 28540), + (983689, 10000), (983695, 1146), + (983698, 1791953), (983713, 20000), + (983718, 281778), (983721, 10000), + (983725, 6780), (983726, 101636), + (983732, 43953), (983743, 180229), + (983756, 77082), (983760, 32960), + (983762, 127964), (983765, 131314), + (983771, 22085), (983785, 2260), + (983787, 75580), (983792, 156608), + (983803, 195873), (983815, 36000), + (983816, 10000), (983826, 222174), + (983828, 22085), (983830, 11233), + (983833, 149173), (983842, 8543), + (983843, 20000), (983845, 85570), + (983850, 6780), (983852, 78344), + (983853, 10000), (983856, 96916), + (983859, 2960), (983862, 131434), + (983864, 10000), (983866, 107443), + (983897, 10000), (983898, 6313), + (983919, 14315), (983930, 6791), + (983931, 72616), (983933, 10000), + (983960, 20894), (983969, 254471), + (983970, 30000), (983975, 15410), + (983986, 20894), (983987, 50430), + (983989, 363165), (983998, 46299), + (983999, 693440), (984001, 97580), + (984008, 1512940), (984011, 200960), + (984021, 107529), (984030, 78650), + (984032, 10000), (984046, 2383), + (984054, 7000), (984065, 18544), + (984071, 40000), (984081, 13438), + (984083, 45555), (984085, 674394), + (984086, 80048), (984093, 55045), + (984095, 1920), (984103, 30000), + (984104, 175828), (984111, 1146), + (984121, 20000), (984132, 38093), + (984153, 157990), (984158, 10000), + (984164, 4552), (984168, 77647), + (984176, 13509), (984180, 2093), + (984182, 4185), (984183, 60000), + (984197, 58965), (984203, 47492), + (984204, 12957), (984208, 14515), + (984211, 129005), (984234, 600), + (984235, 12093), (984239, 25045), + (984243, 1080), (984245, 13260), + (984246, 2061), (984253, 3267), + (984254, 51199), (984262, 18137), + (984263, 20000), (984274, 55310), + (984279, 20000), (984285, 27200), + (984296, 159943), (984297, 10000), + (984303, 35399), (984304, 10836), + (984331, 34500), (984332, 236317), + (984334, 5020), (984339, 7840), + (984345, 10898), (984354, 108350), + (984357, 2910), (984358, 45008), + (984359, 118030), (984361, 23074), + (984367, 35616), (984368, 1417876), + (984370, 11185), (984371, 150357), + (984372, 124355), (984379, 1146), + (984380, 134584), (984381, 11252), + (984386, 131879), (984387, 11146), + (984388, 77964), (984392, 34240), + (984393, 45310), (984394, 34900), + (984397, 33594), (984411, 82881), + (984413, 40000), (984419, 10000), + (984424, 20000), (984429, 2092), + (984431, 97019), (984443, 27946), + (984445, 122678), (984450, 10000), + (984452, 172642), (984463, 85402), + (984465, 5874042), (984467, 17905), + (984471, 17780), (984473, 37960), + (984479, 85800), (984484, 12260), + (984485, 8542), (984518, 20000), + (984520, 15580), (984523, 25072), + (984524, 71237), (984532, 38154), + (984549, 31146), (984555, 22014), + (984561, 162781), (984566, 3920588), + (984570, 7124), (984571, 22960), + (984578, 2092), (984588, 2960), + (984591, 36120), (984608, 49170), + (984610, 20071), (984617, 56663), + (984618, 45320), (984628, 10568), + (984635, 2453), (984640, 96851), + (984642, 19720), (984651, 10000), + (984658, 195940), (984661, 46871), + (984667, 22960), (984670, 69369), + (984676, 14609), (984683, 23247), + (984684, 33135), (984695, 167863), + (984708, 32987), (984710, 88296), + (984711, 75774), (984714, 10000), + (984718, 154991), (984726, 9293), + (984734, 76163), (984735, 1146), + (984737, 123598), (984738, 10000), + (984742, 2260), (984750, 24174), + (984756, 3237), (984759, 65205), + (984765, 11146), (984767, 64075), + (984768, 28538), (984772, 82579), + (984774, 52822), (984778, 2960), + (984786, 10074234), (984788, 104872), + (984791, 37751), (984793, 315666), + (984799, 2260), (984800, 20430), + (984802, 107384), (984804, 10000), + (984813, 98780), (984818, 10000), + (984823, 120000), (984830, 22450), + (984832, 129930), (984835, 98312), + (984846, 10000), (984851, 2673), + (984865, 16360), (984868, 205739), + (984873, 208331), (984877, 15026), + (984888, 31499), (984901, 80572), + (984916, 37433), (984930, 36460), + (984935, 59320), (984940, 78180), + (984952, 12092), (984972, 70387), + (984980, 10000), (984986, 79907), + (984990, 179680), (984991, 43080), + (984997, 27958), (985010, 10000), + (985022, 10000), (985026, 42960), + (985035, 51500), (985042, 35043), + (985069, 82960), (985079, 12000), + (985082, 50541), (985092, 3267), + (985095, 88328), (985105, 135779), + (985108, 42960), (985122, 10000), + (985126, 10000), (985148, 567745), + (985149, 137622), (985151, 148080), + (985155, 20000), (985159, 25665), + (985167, 8450), (985168, 23267), + (985171, 1100000), (985172, 18541), + (985175, 391705), (985185, 30000), + (985188, 71188), (985198, 10000), + (985203, 292733), (985208, 91440), + (985209, 2869570), (985211, 10000), + (985214, 20000), (985217, 27995), + (985230, 20000), (985236, 118541), + (985238, 179399), (985239, 33351), + (985242, 10000), (985254, 8541), + (985255, 10123), (985256, 1582), + (985275, 47268), (985293, 43225), + (985305, 10000), (985306, 26399), + (985320, 128243), (985329, 1321293), + (985333, 28677), (985334, 1146), + (985336, 40000), (985337, 127758), + (985349, 80114), (985356, 20000), + (985360, 10000), (985364, 40000), + (985365, 32960), (985375, 44155), + (985379, 3267), (985388, 123480), + (985392, 1286228), (985398, 34209), + (985403, 282298), (985409, 78021), + (985410, 10000), (985411, 14680), + (985436, 141658), (985451, 95841), + (985452, 18282), (985455, 10000), + (985456, 168199), (985457, 30000), + (985466, 12350), (985471, 10244), + (985475, 72536), (985493, 6000), + (985497, 60361), (985498, 60245), + (985503, 2960), (985505, 28251), + (985506, 77080), (985511, 15220), + (985513, 21401), (985522, 1146), + (985525, 79518), (985526, 206821), + (985536, 135943), (985537, 2092), + (985545, 20000), (985546, 80000), + (985550, 415), (985553, 15867), + (985557, 156885), (985561, 14730), + (985562, 130625), (985565, 2092), + (985575, 10000), (985582, 97180), + (985584, 19831), (985591, 22960), + (985593, 38540), (985595, 21589), + (985596, 2695), (985605, 20000), + (985606, 40000), (985607, 42450), + (985614, 17044), (985634, 37148), + (985645, 10000), (985646, 301220), + (985650, 1146), (985659, 285040), + (985661, 11950), (985674, 20220), + (985676, 19932), (985677, 34611), + (985678, 10000), (985680, 28587), + (985688, 121831), (985697, 98465), + (985698, 70026), (985699, 24000), + (985703, 15035), (985715, 64228), + (985717, 14880), (985722, 70000), + (985731, 21808), (985733, 81368), + (985739, 12960), (985742, 22028), + (985769, 14832), (985770, 132450), + (985772, 26857), (985789, 18339), + (985792, 19762), (985796, 2260), + (985811, 13312), (985815, 13400), + (985818, 12350), (985825, 29162), + (985827, 97204), (985830, 1582), + (985857, 39872), (985859, 19267), + (985860, 54867), (985866, 109182), + (985867, 11809), (985873, 96702), + (985889, 27117), (985906, 12960), + (985921, 141146), (985945, 56906), + (985949, 36602), (985950, 75354), + (985951, 10000), (985962, 47466), + (985963, 30000), (985968, 41323), + (985973, 10000), (985975, 33573), + (985983, 27684), (985984, 38960), + (985985, 100000), (985987, 12383), + (985991, 10000), (985994, 110360), + (985999, 14880), (986000, 106429), + (986007, 62641), (986015, 10000), + (986017, 84566), (986018, 243896), + (986028, 20000), (986035, 61643), + (986042, 18544), (986054, 7000), + (986057, 106542), (986067, 178551), + (986070, 10000), (986074, 10000), + (986077, 20000), (986080, 135252), + (986081, 6700), (986087, 10000), + (986093, 33954), (986105, 10000), + (986114, 146224), (986127, 10000), + (986133, 8640), (986134, 1417882), + (986135, 108885), (986144, 122450), + (986145, 3573), (986146, 62783), + (986147, 39004), (986153, 10000), + (986154, 10000), (986155, 12960), + (986166, 94248), (986167, 6700), + (986172, 3267), (986180, 187771), + (986183, 10000), (986199, 6780), + (986205, 13267), (986212, 182546), + (986217, 2450), (986219, 2450), + (986223, 1023954), (986225, 77930), + (986227, 2092), (986228, 110421), + (986229, 30192), (986237, 50099), + (986240, 12960), (986252, 27930), + (986263, 84069), (986265, 11930), + (986272, 15220), (986277, 22960), + (986283, 9997), (986288, 12383), + (986299, 46850), (986301, 31124), + (986303, 120697), (986307, 11827), + (986309, 12350), (986311, 88320), + (986314, 97241), (986315, 54343), + (986324, 143788), (986326, 10000), + (986328, 13573), (986329, 269272), + (986340, 8377), (986347, 112519), + (986356, 95639), (986358, 62960), + (986372, 12960), (986373, 10000), + (986384, 8538), (986389, 10000), + (986392, 32533), (986395, 124171), + (986399, 98296), (986402, 33400), + (986403, 102226), (986404, 8538), + (986407, 10000), (986416, 51479), + (986418, 78304), (986425, 10000), + (986430, 10000), (986438, 56841), + (986441, 33436), (986444, 18538), + (986445, 81896), (986452, 28960), + (986454, 78404), (986460, 10000), + (986465, 10000), (986469, 46151), + (986481, 143804), (986483, 10000), + (986498, 20000), (986505, 12960), + (986512, 1320200), (986514, 32415), + (986515, 13004), (986519, 13204), + (986533, 5866), (986534, 16000), + (986538, 202960), (986545, 20100), + (986547, 82083), (986550, 20000), + (986556, 10000), (986560, 39430), + (986570, 2092), (986579, 30000), + (986580, 2242996), (986581, 20276), + (986587, 2092), (986598, 18036), + (986609, 85601), (986622, 20000), + (986624, 7001), (986631, 60), + (986637, 10000), (986638, 10000), + (986642, 1920), (986654, 72316), + (986665, 10000), (986668, 5410), + (986680, 12450), (986696, 12665), + (986698, 130276), (986701, 167023), + (986706, 276), (986708, 10000), + (986710, 17140), (986713, 35957), + (986717, 207900), (986739, 21920), + (986742, 11279), (986749, 10000), + (986751, 22960), (986756, 10000), + (986764, 33400), (986767, 179126), + (986768, 214693), (986769, 11262), + (986781, 10000), (986804, 10000), + (986805, 14542), (986807, 57942), + (986810, 109670), (986816, 28542), + (986817, 149967), (986819, 26000), + (986824, 10000), (986826, 22960), + (986834, 13357), (986836, 16780), + (986853, 2084), (986856, 106421), + (986880, 7594), (986883, 462208), + (986888, 94880), (986889, 415437), + (986892, 158738), (986899, 50636), + (986907, 53609), (986912, 20000), + (986917, 20000), (986928, 145610), + (986936, 20000), (986939, 2382), + (986944, 20000), (986948, 35247), + (986950, 12092), (986956, 26096), + (986959, 10000), (986967, 129727), + (986969, 28620), (986983, 7438), + (986993, 11140), (986995, 30688), + (986996, 18542), (987000, 10000), + (987006, 2260), (987033, 10000), + (987034, 203544), (987042, 77061), + (987043, 1871057), (987048, 8542), + (987054, 114313), (987078, 8542), + (987091, 10000), (987094, 94169), + (987107, 64517), (987115, 7670), + (987120, 614793), (987127, 8543), + (987135, 32020), (987144, 39147), + (987147, 78462), (987148, 12960), + (987150, 15580), (987162, 11920), + (987174, 25676), (987186, 10000), + (987187, 119222), (987192, 14333), + (987193, 70820), (987196, 10000), + (987201, 37222), (987226, 20000), + (987228, 95416), (987233, 98841), + (987260, 145914), (987264, 58370), + (987282, 95580), (987288, 10279), + (987298, 24224), (987307, 15496), + (987309, 13267), (987313, 20000), + (987320, 6738), (987324, 10000), + (987326, 52960), (987327, 30000), + (987333, 12350), (987336, 330554), + (987338, 61359), (987347, 26210), + (987367, 57763), (987372, 27915), + (987377, 64412), (987383, 22960), + (987386, 48592), (987391, 10000), + (987395, 22960), (987408, 18543), + (987409, 11920), (987410, 215843), + (987420, 59537), (987421, 11582), + (987427, 46437), (987430, 177740), + (987431, 117636), (987439, 16261), + (987440, 16726), (987445, 1830058), + (987447, 11572), (987481, 3740), + (987491, 409372), (987495, 33445), + (987498, 2269778), (987500, 23879), + (987506, 11648), (987513, 10000), + (987514, 33810), (987518, 38544), + (987527, 166634), (987535, 10894), + (987536, 104841), (987542, 40372), + (987546, 12093), (987553, 74233), + (987557, 24266), (987561, 10000), + (987582, 3267), (987591, 6700), + (987599, 411243), (987600, 12260), + (987606, 20000), (987607, 193140), + (987611, 13060), (987622, 97116), + (987632, 22386), (987634, 33740), + (987638, 143384), (987640, 16149), + (987642, 111500), (987647, 40450), + (987654, 12350), (987668, 31401), + (987671, 106871), (987678, 13400), + (987679, 52836), (987687, 82236), + (987688, 49505), (987690, 117321), + (987699, 1146), (987708, 102841), + (987713, 2093), (987721, 36271), + (987728, 51528), (987733, 971314), + (987735, 264722), (987739, 2260), + (987740, 135723), (987742, 30000), + (987747, 152591), (987748, 10000), + (987749, 15657), (987760, 30000), + (987768, 19652), (987778, 21504), + (987783, 12093), (987785, 16464), + (987787, 10000), (987791, 58457), + (987801, 206771), (987814, 16328), + (987816, 11740), (987822, 104996), + (987842, 5220), (987854, 96642), + (987878, 179929), (987881, 12176), + (987883, 264471), (987902, 3349), + (987911, 15580), (987922, 195159), + (987924, 123324), (987934, 2093), + (987935, 18545), (987936, 88178), + (987937, 12960), (987941, 13400), + (987950, 30000), (987959, 1617072), + (987960, 714828), (987962, 22260), + (987963, 110000), (987965, 19930), + (987975, 416300), (987981, 41403), + (987990, 569457), (987991, 3357), + (988003, 271261), (988007, 2093), + (988012, 160116), (988025, 10919), + (988029, 14186), (988030, 44520), + (988037, 30000), (988039, 12960), + (988042, 20000), (988046, 41641), + (988050, 10000), (988063, 22857), + (988065, 10071), (988073, 39366), + (988079, 220223), (988088, 244917), + (988094, 59960), (988098, 64238), + (988100, 10000), (988102, 59980), + (988104, 10000), (988109, 17935), + (988124, 9740), (988127, 11053), + (988131, 2960), (988132, 132960), + (988135, 10000), (988140, 20000), + (988151, 73666), (988154, 13267), + (988157, 7840), (988173, 113218), + (988174, 13141), (988184, 19375), + (988191, 32915), (988204, 5610), + (988216, 283596), (988228, 10000), + (988231, 83750), (988235, 15556), + (988242, 2084), (988247, 5556), + (988262, 2450), (988272, 116318), + (988282, 72051), (988292, 119545), + (988296, 102695), (988314, 188841), + (988315, 62682), (988320, 15649), + (988328, 2960), (988335, 12375), + (988348, 3573), (988358, 10723), + (988367, 113568), (988368, 13790), + (988394, 146153), (988412, 11505), + (988417, 126360), (988418, 23930), + (988419, 8545), (988432, 18540), + (988452, 2076), (988455, 2093), + (988456, 20595), (988459, 92523), + (988460, 231564), (988472, 2350), + (988475, 40638), (988479, 46395), + (988487, 6329), (988500, 12960), + (988502, 927069), (988506, 161577), + (988511, 278769), (988519, 94413), + (988524, 31003), (988530, 2093), + (988551, 114917), (988590, 10000), + (988592, 13960), (988593, 10000), + (988598, 47092), (988599, 92625), + (988601, 108093), (988606, 106972), + (988609, 28780), (988618, 1045533), + (988619, 10465), (988622, 163675), + (988623, 1086870), (988624, 33879), + (988647, 38980), (988649, 8430), + (988651, 98368), (988653, 110505), + (988664, 311146), (988670, 20000), + (988676, 10895), (988685, 91112), + (988692, 141537), (988701, 8545), + (988706, 68360), (988712, 98629), + (988713, 10000), (988714, 12118), + (988727, 100000), (988730, 37976), + (988734, 10000), (988736, 115569), + (988742, 514304), (988750, 21016), + (988752, 57182), (988755, 100000), + (988775, 10000), (988790, 10000), + (988791, 20539), (988811, 100), + (988814, 120830), (988831, 2260), + (988835, 38545), (988837, 10000), + (988838, 15830), (988840, 101660), + (988842, 1307516), (988843, 37471), + (988844, 10250), (988845, 14063), + (988846, 84850), (988852, 100), + (988854, 125803), (988869, 8545), + (988873, 17060), (988877, 15580), + (988880, 34406), (988885, 87503), + (988893, 10000), (988894, 94794), + (988896, 18000), (988899, 45220), + (988904, 9655), (988906, 116425), + (988909, 18844), (988921, 389083), + (988924, 56516), (988934, 124200), + (988937, 34951), (988940, 8545), + (988952, 20000), (988963, 25390), + (988964, 317660), (988967, 93870), + (988975, 17760), (988978, 2260), + (989002, 2483), (989004, 20993), + (989013, 200445), (989015, 151179), + (989020, 194143), (989029, 10000), + (989031, 358757), (989037, 236201), + (989049, 3573), (989059, 17880), + (989069, 60180), (989071, 127210), + (989077, 160955), (989083, 6078), + (989085, 6247), (989092, 10000), + (989101, 250), (989106, 10000), + (989110, 888854), (989120, 10000), + (989122, 16186), (989124, 14711), + (989133, 250), (989144, 30355), + (989158, 22085), (989160, 11920), + (989168, 310817), (989178, 107233), + (989179, 98257), (989182, 120685), + (989185, 100272), (989189, 177186), + (989196, 10667), (989213, 60804), + (989226, 110000), (989231, 5320), + (989237, 119441), (989238, 49832), + (989248, 3267), (989249, 8544), + (989253, 163206), (989254, 233017), + (989262, 22851), (989263, 26728), + (989266, 8544), (989273, 1050), + (989274, 106754), (989279, 59177), + (989283, 2366), (989284, 86109), + (989289, 166450), (989300, 10000), + (989302, 3267), (989304, 10000), + (989306, 390302), (989320, 8505), + (989322, 98120), (989345, 119954), + (989359, 20120), (989361, 10000), + (989366, 33597), (989373, 10000), + (989381, 30419), (989384, 24458), + (989386, 2634), (989387, 71627), + (989391, 33857), (989398, 384621), + (989400, 128745), (989403, 11505), + (989417, 3002), (989421, 28000), + (989426, 143747), (989428, 40434), + (989445, 451754), (989452, 857466), + (989456, 106652), (989457, 73123), + (989462, 2293), (989466, 284495), + (989475, 10000), (989484, 82382), + (989492, 216090), (989495, 19396), + (989497, 107423), (989508, 1146), + (989513, 30000), (989517, 20000), + (989527, 70265), (989532, 2450), + (989540, 11715), (989556, 73499), + (989557, 10000), (989558, 90392), + (989569, 135077), (989576, 8960), + (989589, 9408), (989603, 14654), + (989612, 23361), (989614, 32450), + (989625, 11712), (989633, 143496), + (989635, 97022), (989636, 9408), + (989637, 10000), (989638, 12450), + (989642, 76410), (989646, 15390), + (989655, 103267), (989661, 10000), + (989664, 10000), (989669, 79874), + (989670, 116908), (989672, 157209), + (989678, 2450), (989681, 10000), + (989682, 10000), (989686, 46378), + (989688, 113255), (989690, 102772), + (989699, 32372), (989718, 2350), + (989722, 120060), (989725, 10000), + (989726, 109441), (989727, 12960), + (989728, 37852), (989731, 199328), + (989741, 23168), (989743, 14452), + (989746, 1915604), (989754, 1553915), + (989760, 87270), (989777, 10000), + (989779, 247204), (989787, 120270), + (989798, 34349), (989800, 22960), + (989804, 172567), (989815, 134400), + (989817, 10000), (989818, 8052), + (989820, 24000), (989821, 25410), + (989822, 14022), (989825, 21864), + (989826, 619020), (989827, 10000), + (989828, 11720), (989833, 3267), + (989834, 14169), (989835, 155073), + (989838, 127880), (989840, 32590), + (989845, 33641), (989847, 120720), + (989848, 2627), (989856, 24226), + (989865, 37273), (989870, 19413), + (989874, 33791), (989880, 10000), + (989885, 127859), (989888, 19000), + (989890, 119704), (989892, 212784), + (989893, 132960), (989898, 20000), + (989903, 124563), (989913, 24900), + (989917, 10000), (989924, 85092), + (989927, 93237), (989939, 42941), + (989940, 115265), (989946, 75280), + (989948, 34390), (989955, 76565), + (989965, 52872), (989966, 18960), + (989971, 12960), (989972, 49433), + (989978, 135008), (989979, 10000), + (989982, 74880), (989986, 36440), + (989989, 14185), (989995, 10000), + (989998, 85808), (990005, 12977), + (990006, 209388), (990010, 3381), + (990020, 54753), (990022, 36380), + (990032, 10000), (990033, 2960), + (990039, 40000), (990058, 41103), + (990070, 68960), (990075, 3000000), + (990080, 28036), (990083, 1617118), + (990086, 128393), (990089, 37633), + (990090, 2303), (990098, 10000), + (990099, 148303), (990109, 102960), + (990118, 35710), (990126, 30470), + (990130, 1950), (990138, 19046), + (990140, 31332), (990144, 42450), + (990145, 42580), (990150, 97734), + (990156, 187263), (990157, 26478), + (990161, 25605), (990174, 36206), + (990176, 75587), (990180, 10000), + (990184, 33230), (990187, 112323), + (990189, 315320), (990199, 22176), + (990200, 236302), (990205, 83392), + (990207, 10000), (990216, 24113), + (990220, 28540), (990224, 30000), + (990236, 477619), (990246, 10000), + (990247, 92748), (990250, 4780933), + (990254, 33740), (990258, 21705), + (990259, 89770), (990273, 6386), + (990291, 165065), (990297, 167733), + (990298, 15664), (990307, 114889), + (990310, 273149), (990311, 115310), + (990317, 1000), (990320, 42302), + (990322, 38802), (990323, 252532), + (990326, 3879), (990327, 340180), + (990355, 10000), (990357, 24660), + (990364, 10210), (990366, 121366), + (990375, 15082), (990398, 35580), + (990405, 12260), (990407, 22621), + (990409, 10000), (990412, 138231), + (990420, 6000), (990421, 10000), + (990423, 20000), (990424, 191010), + (990428, 40015), (990429, 2910), + (990430, 2302), (990434, 81014), + (990436, 10000), (990437, 233160), + (990440, 9600), (990442, 49398), + (990462, 10000), (990466, 97112), + (990467, 151724), (990485, 110357), + (990488, 12303), (990490, 59711), + (990493, 14880), (990494, 43845), + (990499, 193491), (990502, 48560), + (990505, 314993), (990506, 191440), + (990517, 10067309), (990528, 20000), + (990533, 85208), (990535, 108398), + (990552, 2302), (990558, 16712), + (990559, 157947), (990566, 10000), + (990569, 28572), (990571, 80134), + (990572, 427155), (990576, 121779), + (990583, 42741), (990584, 106230), + (990599, 30000), (990600, 3267), + (990614, 15580), (990625, 53731), + (990626, 19188), (990627, 12450), + (990632, 109504), (990635, 10000), + (990637, 2622), (990640, 71811), + (990645, 44392), (990654, 5000), + (990658, 19399), (990660, 146775), + (990661, 246481), (990670, 13400), + (990672, 10000), (990688, 152782), + (990691, 2028), (990695, 33082), + (990712, 13847), (990715, 18251), + (990717, 75580), (990730, 20000), + (990739, 11319), (990742, 58978), + (990745, 816), (990746, 72507), + (990748, 12021), (990750, 4500), + (990758, 2923), (990763, 48000), + (990772, 136019), (990773, 27840), + (990774, 153020), (990775, 10000), + (990791, 35373), (990793, 107446), + (990802, 12302), (990803, 26901), + (990806, 154207), (990823, 11850), + (990831, 57799), (990837, 10000), + (990846, 10000), (990856, 199690), + (990864, 73900), (990867, 2012446), + (990874, 1999014), (990878, 117950), + (990884, 47366), (990889, 12331), + (990892, 26760), (990895, 12303), + (990899, 24525), (990900, 6194), + (990901, 1752297), (990902, 4606), + (990907, 190570), (990914, 312756), + (990916, 2350), (990920, 130587), + (990923, 82447), (990941, 114718), + (990943, 10000), (990956, 245124), + (990966, 22390), (990967, 407810), + (990975, 15446), (990985, 38540), + (990987, 19399), (990988, 9399), + (990990, 176684), (990997, 19380), + (991002, 3684), (991004, 145667), + (991011, 104593), (991014, 10000), + (991022, 542780), (991034, 19635), + (991041, 204262), (991045, 40000), + (991052, 201108), (991055, 35401), + (991067, 27239), (991090, 49217), + (991093, 86851), (991095, 113085), + (991096, 10000), (991100, 26780), + (991110, 12375), (991111, 25458), + (991112, 12302), (991123, 19469), + (991125, 2450), (991132, 9866), + (991135, 30000), (991138, 19984), + (991140, 150852), (991142, 58111), + (991146, 26820), (991149, 38000), + (991153, 91692), (991161, 100214), + (991167, 54167), (991170, 78623), + (991172, 29000), (991175, 62375), + (991177, 223653), (991180, 79207), + (991181, 10000), (991182, 218966), + (991189, 120000), (991190, 29911), + (991192, 119876), (991195, 4562), + (991199, 22363), (991211, 152853), + (991224, 85144), (991231, 77026), + (991233, 10167), (991234, 412000), + (991236, 65457), (991238, 40000), + (991250, 51490), (991259, 335530), + (991260, 31716), (991265, 13280), + (991267, 36790), (991274, 39081), + (991281, 16485), (991287, 5701), + (991292, 20100), (991301, 15900), + (991302, 106473), (991307, 23133), + (991310, 72118), (991311, 32635), + (991312, 147940), (991317, 55903), + (991325, 222469), (991333, 34472), + (991341, 2301), (991348, 177252), + (991350, 84465), (991367, 20000), + (991368, 22960), (991369, 54576), + (991373, 10000), (991378, 10000), + (991379, 59042), (991384, 225609), + (991387, 12350), (991395, 66024), + (991396, 122430), (991405, 100000), + (991406, 183108), (991409, 20401), + (991411, 151193), (991416, 10000), + (991420, 38311), (991423, 197730), + (991427, 202352), (991428, 61181), + (991431, 51694), (991435, 42496), + (991439, 123452), (991440, 58994), + (991447, 26717), (991453, 253398), + (991455, 72490), (991460, 3030), + (991474, 131617), (991485, 206307), + (991491, 218987), (991500, 40000), + (991501, 10000), (991505, 233985), + (991506, 72855), (991509, 2350), + (991511, 16292), (991512, 150637), + (991519, 176651), (991522, 10000), + (991526, 21688), (991537, 168936), + (991543, 122260), (991546, 52562), + (991550, 54345), (991554, 22729), + (991564, 318349), (991575, 2299), + (991577, 20000), (991578, 10000), + (991579, 404680), (991582, 2618), + (991597, 20000), (991598, 122077), + (991600, 11836), (991601, 238557), + (991604, 21836), (991605, 20000), + (991612, 10000), (991620, 77762), + (991622, 34796), (991624, 28521), + (991628, 41306), (991636, 15987), + (991641, 2960), (991643, 10000), + (991648, 11920), (991653, 20460), + (991656, 10000), (991665, 39046), + (991668, 19386), (991670, 12450), + (991671, 36505), (991679, 21920), + (991680, 293537), (991681, 26387), + (991686, 98442), (991691, 26662), + (991698, 155775), (991700, 250), + (991702, 31684), (991705, 250), + (991707, 110000), (991710, 101235), + (991714, 7147), (991719, 14800), + (991722, 383518), (991731, 10000), + (991732, 213384), (991735, 562060), + (991738, 35030), (991741, 109648), + (991743, 50000), (991744, 72821), + (991780, 10000), (991781, 10000), + (991782, 163280), (991784, 10000), + (991788, 22298), (991790, 49078), + (991796, 60326), (991797, 10537), + (991801, 322983), (991808, 104998), + (991809, 10000), (991824, 181634), + (991827, 22299), (991831, 46700), + (991834, 48030), (991848, 33198), + (991850, 9398), (991851, 20000), + (991852, 20000), (991856, 20000), + (991862, 12299), (991869, 20000), + (991876, 20000), (991881, 37955), + (991897, 12590), (991903, 90400), + (991911, 10000), (991913, 50538), + (991914, 205763), (991921, 138046), + (991923, 3400), (991929, 20000), + (991955, 25335), (991959, 10000), + (991963, 30000), (991965, 12450), + (991971, 1892410), (991972, 1146), + (991979, 41325), (991982, 19228), + (991994, 10000), (992000, 71688), + (992007, 13879), (992009, 126340), + (992016, 23283), (992017, 81341), + (992023, 53181), (992024, 104204), + (992032, 117277), (992043, 1663045), + (992044, 19178), (992056, 128218), + (992059, 19219), (992065, 235367), + (992070, 8270), (992074, 49010), + (992087, 2350), (992089, 2290), + (992096, 296343), (992098, 100), + (992103, 16329), (992105, 365038), + (992108, 29219), (992112, 19080), + (992113, 13078), (992125, 202029), + (992142, 116723), (992149, 134878), + (992153, 40150), (992166, 104755), + (992175, 13573), (992184, 952), + (992185, 135882), (992195, 34947), + (992206, 43689), (992208, 127445), + (992214, 30000), (992215, 171868), + (992216, 116516), (992228, 27161), + (992238, 122986), (992244, 2260), + (992251, 65256), (992267, 10492), + (992274, 10000), (992285, 39350), + (992292, 117831), (992293, 47052), + (992301, 35140), (992312, 126229), + (992314, 2430), (992315, 38888), + (992317, 20000), (992325, 20000), + (992332, 115913), (992337, 32450), + (992342, 10000), (992343, 10000), + (992344, 98052), (992347, 15260), + (992348, 3400), (992362, 402609), + (992363, 63783), (992366, 222761), + (992369, 10268), (992380, 480), + (992389, 32960), (992390, 10000), + (992410, 664747), (992421, 1445346), + (992430, 23960), (992433, 8180), + (992443, 35580), (992445, 133280), + (992450, 139940), (992456, 250390), + (992468, 68759), (992470, 122131), + (992478, 6000), (992480, 46021), + (992486, 14560), (992489, 12987), + (992492, 378466), (992497, 10000), + (992506, 40960), (992512, 36000), + (992521, 1920), (992524, 234386), + (992536, 219350), (992539, 35243), + (992540, 30000), (992541, 44000), + (992542, 89430), (992550, 53394), + (992551, 304992), (992555, 422562), + (992557, 2302), (992558, 159796), + (992561, 145101), (992563, 10000), + (992582, 2960), (992587, 2960), + (992592, 10000), (992594, 112960), + (992600, 425625), (992602, 445149), + (992614, 2620), (992617, 119911), + (992627, 40000), (992633, 52450), + (992634, 110000), (992655, 127520), + (992665, 23882), (992675, 19261), + (992676, 25817), (992689, 23400), + (992691, 586584), (992699, 146148), + (992704, 142209), (992705, 84301), + (992706, 11921), (992712, 119304), + (992727, 79343), (992749, 77720), + (992768, 310355), (992774, 59180), + (992776, 15240), (992779, 145831), + (992792, 1596), (992793, 133051), + (992795, 32960), (992799, 32350), + (992801, 12350), (992803, 149544), + (992821, 62067), (992823, 49253), + (992830, 17329), (992834, 4690), + (992837, 8180), (992849, 78618), + (992852, 23790), (992855, 191787), + (992863, 6000), (992867, 34005), + (992871, 12260), (992873, 10000), + (992874, 4550), (992880, 163993), + (992882, 10000), (992889, 10000), + (992893, 2960), (992899, 25527), + (992902, 11582), (992912, 44604), + (992917, 73240), (992924, 155475), + (992927, 12475), (992929, 55250), + (992942, 117325), (992943, 85176), + (992945, 89054), (992947, 250), + (992948, 22430), (992951, 15580), + (992955, 24743), (992964, 28920), + (992967, 204667), (992969, 109687), + (992979, 76000), (992989, 107838), + (993004, 27531), (993006, 10000), + (993007, 44594), (993008, 33094), + (993021, 10000), (993036, 6487), + (993040, 42430), (993044, 10000), + (993049, 87634), (993051, 173243), + (993058, 23740), (993059, 4595), + (993060, 10000), (993063, 10000), + (993069, 12960), (993078, 35580), + (993079, 10000), (993083, 20000), + (993086, 2960), (993089, 146345), + (993090, 67535), (993093, 28503), + (993095, 138187), (993098, 22196), + (993099, 490948), (993103, 22960), + (993107, 105180), (993116, 12910), + (993119, 22960), (993128, 20000), + (993136, 10000), (993137, 60765), + (993168, 66310), (993173, 1800000), + (993174, 1210393), (993181, 14880), + (993187, 91958), (993192, 530275), + (993193, 20098), (993194, 38450), + (993195, 71614), (993203, 23103), + (993210, 29600), (993213, 10000), + (993217, 160565), (993219, 12695), + (993221, 10244), (993228, 2450), + (993230, 147248), (993231, 102960), + (993240, 20000), (993243, 9203), + (993246, 244), (993260, 132450), + (993261, 85554), (993268, 3573), + (993273, 699998), (993282, 38439), + (993283, 13267), (993284, 257700), + (993290, 16405), (993292, 52350), + (993297, 13164), (993298, 76470), + (993304, 20653), (993313, 42260), + (993315, 33353), (993316, 8679), + (993319, 30000), (993320, 132245), + (993322, 43843), (993324, 23450), + (993327, 10000), (993328, 20000), + (993340, 10000), (993356, 2260), + (993366, 110580), (993372, 29880), + (993376, 49919), (993378, 1389279), + (993384, 2284), (993394, 180026), + (993401, 8153), (993402, 20000), + (993416, 12960), (993425, 25410), + (993457, 200614), (993464, 10000), + (993474, 13416), (993475, 1344), + (993478, 10000), (993481, 37980), + (993490, 27129), (993494, 2450), + (993496, 102094), (993506, 291923), + (993507, 15883), (993525, 25873), + (993529, 44491), (993543, 38213), + (993544, 51969), (993545, 102094), + (993547, 362548), (993548, 101763), + (993551, 14185), (993554, 49153), + (993556, 10000), (993565, 187870), + (993566, 78408), (993573, 12260), + (993581, 107197), (993585, 654260), + (993587, 10000), (993601, 54424), + (993602, 10000), (993616, 12902), + (993628, 6329), (993629, 22450), + (993641, 20659), (993657, 15580), + (993658, 389895), (993664, 124906), + (993665, 11755), (993667, 3102), + (993669, 31512), (993672, 144311), + (993675, 9021), (993684, 22450), + (993694, 167038), (993697, 50000), + (993700, 10000), (993702, 20000), + (993705, 192845), (993706, 51875), + (993710, 1279918), (993713, 10000), + (993715, 8553), (993717, 51707), + (993718, 100614), (993721, 155083), + (993724, 2117), (993729, 12377), + (993730, 10000), (993731, 20000), + (993750, 152849), (993761, 2960), + (993765, 60257), (993766, 22086), + (993775, 30000), (993785, 16713), + (993803, 14836), (993809, 27298), + (993821, 27150), (993822, 116572), + (993824, 18440), (993825, 2960), + (993835, 34988), (993840, 30000), + (993841, 104172), (993842, 2960), + (993843, 10000), (993845, 2094), + (993847, 32890), (993852, 25580), + (993860, 46600), (993879, 10000), + (993896, 33266), (993899, 63948), + (993911, 20000), (993922, 112656), + (993926, 32960), (993929, 93879), + (993930, 124520), (993932, 40000), + (993934, 4185), (993939, 23573), + (993942, 45600), (993943, 84015), + (993948, 12960), (993955, 122094), + (993977, 10000), (993978, 112257), + (993982, 538), (993984, 34557), + (993987, 125717), (993991, 1920), + (993992, 32450), (993993, 49542), + (993995, 62026), (994000, 2450), + (994007, 6280), (994011, 120243), + (994027, 103760), (994029, 2450), + (994030, 12685), (994031, 7868), + (994041, 110000), (994045, 13161), + (994053, 31146), (994055, 84199), + (994058, 3792), (994062, 46842), + (994070, 10000), (994076, 14185), + (994085, 10245), (994089, 9977), + (994094, 20000), (994105, 17936), + (994115, 30030), (994124, 43060), + (994145, 27765), (994148, 13865), + (994151, 257345), (994159, 15580), + (994184, 12960), (994187, 10000), + (994194, 20000), (994203, 10000), + (994218, 20000), (994219, 5410), + (994240, 92960), (994244, 27821), + (994245, 3480), (994246, 12450), + (994263, 28887), (994273, 211275), + (994283, 99345), (994286, 193740), + (994287, 10244), (994294, 10552), + (994305, 6360), (994307, 10000), + (994313, 10245), (994320, 37855), + (994321, 734), (994322, 41581), + (994324, 10000), (994328, 978), + (994329, 146478), (994331, 22960), + (994335, 20000), (994340, 10000), + (994366, 13204), (994375, 127000), + (994376, 52350), (994379, 23512), + (994380, 22513), (994383, 20344), + (994385, 25410), (994388, 55780), + (994392, 10000), (994399, 10000), + (994402, 98157), (994409, 9619), + (994414, 141310), (994418, 205387), + (994419, 10000), (994422, 37716), + (994426, 30501), (994444, 101950), + (994450, 27645), (994454, 231426), + (994455, 1410718), (994457, 28897), + (994461, 72337), (994467, 245), + (994477, 13449), (994479, 102932), + (994486, 29072), (994489, 20000), + (994490, 125911), (994501, 45172), + (994502, 56220), (994507, 80000), + (994524, 20000), (994525, 595813), + (994530, 102838), (994535, 63173), + (994539, 94277), (994540, 116040), + (994549, 2960), (994554, 28847), + (994555, 112269), (994556, 12960), + (994566, 19093), (994569, 41950), + (994578, 414), (994584, 44240), + (994589, 20000), (994600, 1920), + (994603, 306765), (994608, 46341), + (994610, 10245), (994612, 2260), + (994616, 353299), (994619, 15144), + (994620, 10200), (994621, 20000), + (994627, 25757), (994640, 13494), + (994654, 50880), (994655, 245), + (994663, 19551), (994673, 18180), + (994690, 267160), (994691, 10000), + (994698, 10000), (994700, 1221996), + (994703, 63908), (994705, 146041), + (994706, 169181), (994717, 20000), + (994719, 10000), (994724, 83551), + (994727, 2219601), (994738, 20000), + (994741, 459624), (994743, 48000), + (994747, 7662), (994753, 8555), + (994761, 10000), (994763, 10000), + (994765, 32170), (994768, 250), + (994773, 10000), (994774, 19952), + (994775, 32450), (994784, 122705), + (994791, 47985), (994806, 15937), + (994813, 40133), (994823, 32906), + (994826, 191152), (994841, 210730), + (994846, 114761), (994850, 8555), + (994851, 29207), (994856, 116345), + (994862, 13680), (994863, 136776), + (994868, 108160), (994869, 16780), + (994872, 194753), (994876, 82310), + (994882, 34834), (994884, 9377), + (994894, 4028), (994901, 106366), + (994905, 144368), (994906, 20652), + (994913, 12690), (994915, 38410), + (994916, 10000), (994923, 14800), + (994939, 64200), (994942, 200000), + (994943, 104938), (994948, 8557), + (994956, 40217), (994958, 122688), + (994967, 330920), (994971, 85672), + (994979, 193668), (994980, 127464), + (994983, 14270), (994989, 131976), + (994993, 20000), (994996, 8556), + (995002, 45717), (995007, 96759), + (995012, 11220), (995016, 38557), + (995018, 53376), (995021, 36880), + (995022, 16779), (995025, 8556), + (995031, 21728), (995036, 20000), + (995046, 33619), (995055, 23840), + (995057, 33327), (995062, 55241), + (995066, 161548), (995075, 103073), + (995080, 30020), (995083, 10000), + (995085, 2260), (995090, 45418), + (995092, 2301194), (995102, 2960), + (995103, 10000), (995109, 186376), + (995111, 8836), (995118, 30157), + (995119, 21514), (995120, 157011), + (995124, 28770), (995126, 30000), + (995130, 35220), (995131, 10000), + (995132, 11920), (995138, 42433), + (995139, 22260), (995144, 147701), + (995150, 2260), (995152, 7000), + (995162, 7000), (995168, 1056045), + (995178, 103842), (995196, 24473), + (995200, 47080), (995206, 74450), + (995212, 54450), (995215, 257108), + (995216, 2260), (995223, 2260), + (995232, 67329), (995235, 100726), + (995238, 159606), (995240, 73546), + (995248, 19836), (995249, 86424), + (995252, 25410), (995260, 30800), + (995261, 78432), (995271, 3361), + (995284, 27313), (995285, 38554), + (995288, 12960), (995289, 83188), + (995295, 10000), (995299, 78432), + (995311, 10000), (995326, 30748), + (995327, 12086), (995333, 20000), + (995335, 11920), (995336, 1920), + (995337, 12450), (995356, 10000), + (995365, 20000), (995372, 20923), + (995381, 147618), (995385, 10000), + (995390, 3267), (995391, 30215), + (995395, 10000), (995398, 131105), + (995402, 90644), (995407, 108290), + (995419, 25580), (995423, 12960), + (995430, 28554), (995456, 89961), + (995467, 47364), (995480, 1434913), + (995484, 10000), (995489, 61582), + (995497, 50041), (995498, 10000), + (995499, 10000), (995509, 41175), + (995523, 2581885), (995531, 20000), + (995542, 24520), (995545, 4520), + (995552, 4690), (995554, 145853), + (995558, 614098), (995559, 29348), + (995566, 293572), (995572, 83602), + (995575, 510000), (995593, 76000), + (995598, 42430), (995600, 18121), + (995607, 10000), (995608, 8558), + (995612, 110000), (995623, 93802), + (995628, 10000), (995639, 14629), + (995643, 15056), (995654, 300000), + (995664, 9786), (995674, 178145), + (995677, 17888), (995678, 44085), + (995690, 130634), (995695, 28589), + (995700, 77500), (995703, 90914), + (995710, 3740), (995712, 10000), + (995713, 11920), (995723, 25836), + (995726, 12096), (995729, 10000), + (995735, 181616), (995743, 95862), + (995744, 24000), (995746, 59192), + (995761, 22118), (995773, 66083), + (995777, 232971), (995778, 80400), + (995787, 166653), (995788, 10000), + (995789, 10000), (995793, 130142), + (995796, 10923), (995798, 162397), + (995801, 21594), (995806, 20000), + (995807, 58021), (995813, 26962), + (995818, 208668), (995828, 2095), + (995845, 38388), (995852, 18554), + (995866, 79777), (995867, 2260), + (995875, 451900), (995877, 30554), + (995884, 16000), (995895, 10000), + (995903, 40563), (995906, 19267), + (995907, 2450), (995915, 110200), + (995930, 240313), (995934, 66060), + (995941, 6), (995942, 33214), + (995944, 120000), (995964, 4985), + (995972, 95666), (995974, 36573), + (995977, 459276), (996004, 157390), + (996011, 10000), (996016, 3573), + (996019, 53468), (996023, 12000), + (996035, 569644), (996039, 46556), + (996046, 27869), (996054, 152590), + (996058, 478559), (996062, 49635), + (996085, 2260), (996095, 24159), + (996101, 133117), (996108, 2287), + (996111, 142099), (996119, 132981), + (996123, 47576), (996138, 145117), + (996148, 10000), (996156, 74704), + (996160, 24919), (996195, 4710), + (996215, 5873), (996219, 12960), + (996225, 1000), (996228, 63342), + (996240, 288529), (996249, 92680), + (996253, 10092620), (996256, 33601), + (996257, 204950), (996267, 2521), + (996291, 24199), (996295, 173863), + (996298, 20000), (996304, 26800), + (996322, 9343), (996323, 100000), + (996324, 2260), (996326, 89798), + (996329, 23222), (996336, 17147), + (996342, 54900), (996343, 98152), + (996344, 26906), (996345, 2598), + (996346, 11920), (996348, 89720), + (996354, 94288), (996355, 8297), + (996359, 2028), (996363, 10000), + (996366, 350057), (996369, 17845), + (996375, 31695), (996378, 19153), + (996391, 20401), (996397, 101741), + (996401, 14626), (996402, 24227), + (996403, 54658), (996410, 5240), + (996411, 5028), (996417, 37700), + (996421, 22982), (996423, 2450), + (996448, 44310), (996450, 10071), + (996451, 57162), (996455, 97058), + (996458, 59421), (996463, 88524), + (996464, 6717), (996470, 14210), + (996476, 367214), (996477, 102271), + (996493, 2608), (996496, 55697), + (996502, 132264), (996503, 35339), + (996512, 10000), (996519, 9352), + (996527, 19403), (996538, 25580), + (996540, 8010), (996547, 11643), + (996548, 102741), (996557, 162344), + (996560, 19701), (996579, 91019), + (996583, 45549), (996589, 100392), + (996592, 10000), (996596, 206206), + (996609, 4584), (996615, 235078), + (996634, 26530), (996636, 613174), + (996654, 23097), (996658, 212899), + (996667, 12375), (996670, 2260), + (996674, 84848), (996693, 553142), + (996694, 38709), (996702, 6780), + (996709, 5220), (996717, 1295439), + (996719, 786264), (996720, 14698), + (996722, 71767), (996726, 100000), + (996728, 32292), (996733, 16000), + (996739, 12602), (996748, 10000), + (996764, 138343), (996772, 2000), + (996788, 2960), (996791, 143757), + (996792, 74488), (996794, 2960), + (996799, 10000), (996809, 123152), + (996813, 3248), (996829, 5923), + (996844, 87578), (996847, 2260), + (996869, 71442), (996870, 2960), + (996878, 2293), (996880, 30000), + (996884, 98155), (996886, 365119), + (996903, 10000), (996906, 10676), + (996924, 40990), (996936, 640302), + (996946, 55417), (996949, 8263), + (996951, 40000), (996958, 2960), + (996979, 15833), (996986, 23604), + (996988, 111366), (996995, 105356), + (997001, 35564), (997002, 332271), + (997017, 8866), (997022, 2260), + (997026, 114952), (997030, 105080), + (997035, 52632), (997046, 523317), + (997048, 41971), (997050, 4478), + (997055, 385974), (997056, 74896), + (997060, 28030), (997061, 32630), + (997062, 2618), (997075, 250), + (997077, 20250), (997080, 20000), + (997084, 9365), (997086, 216757), + (997090, 26453), (997095, 33610), + (997100, 22565), (997104, 250), + (997105, 34205), (997107, 10000), + (997111, 465341), (997112, 613610), + (997113, 10000), (997118, 405963), + (997120, 250), (997123, 250), + (997132, 100000), (997166, 26403), + (997168, 250), (997169, 565381), + (997171, 80237), (997180, 78224), + (997181, 15580), (997185, 10000), + (997203, 84240), (997204, 250), + (997208, 300149), (997211, 4514), + (997215, 701794), (997219, 5255), + (997226, 69323), (997229, 2350), + (997247, 5560), (997249, 119192), + (997253, 323395), (997261, 215943), + (997270, 11140), (997272, 135186), + (997279, 126250), (997286, 44917), + (997288, 29680), (997299, 55642), + (997307, 157763), (997312, 20100), + (997320, 139610), (997326, 342228), + (997328, 13111), (997330, 105845), + (997339, 22000), (997341, 37005), + (997343, 30160), (997344, 141844), + (997354, 136667), (997361, 14745), + (997362, 16035), (997367, 103536), + (997369, 5060), (997371, 1300459), + (997372, 29407), (997375, 9372), + (997381, 41825), (997384, 18752), + (997388, 2450), (997396, 91970), + (997400, 26860), (997405, 104608), + (997411, 28960), (997418, 94930), + (997424, 200000), (997433, 2287), + (997437, 44760), (997444, 4860), + (997451, 150792), (997457, 93616), + (997463, 101227), (997478, 84060), + (997481, 10000), (997485, 19375), + (997491, 110989), (997493, 2296), + (997508, 21143), (997510, 10000), + (997513, 25580), (997515, 45831), + (997516, 31786), (997518, 16355), + (997519, 14162), (997525, 68168), + (997528, 12000), (997533, 103165), + (997536, 251386), (997539, 12718), + (997554, 56611), (997557, 16710), + (997559, 17000), (997561, 187437), + (997562, 13410), (997563, 22297), + (997567, 14277), (997569, 74123), + (997573, 10000), (997577, 99698), + (997582, 2960), (997591, 106176), + (997596, 73091), (997601, 171538), + (997604, 179331), (997606, 30000), + (997612, 10000), (997613, 10000), + (997615, 190903), (997616, 12960), + (997622, 79850), (997623, 31666), + (997624, 85248), (997625, 24672), + (997629, 17650), (997631, 3573), + (997632, 5373), (997635, 125033), + (997639, 20000), (997647, 131549), + (997655, 10000), (997661, 10000), + (997666, 19379), (997670, 131720), + (997674, 9379), (997676, 124313), + (997680, 2297), (997681, 10000), + (997683, 224678), (997689, 2288), + (997691, 40000), (997708, 10000), + (997709, 2450), (997713, 31809), + (997715, 12547), (997719, 48927), + (997721, 10000), (997722, 15973), + (997731, 25900), (997737, 1152712), + (997743, 20245), (997747, 245), + (997750, 183175), (997754, 10245), + (997759, 3897), (997760, 12243), + (997779, 22058), (997783, 158410), + (997788, 10000), (997797, 10000), + (997799, 175469), (997805, 5105), + (997809, 130730), (997813, 2260), + (997815, 20000), (997819, 218097), + (997821, 22450), (997827, 3037450), + (997831, 82960), (997863, 13001), + (997870, 51975), (997872, 11656), + (997889, 97971), (997892, 10000), + (997919, 2960), (997924, 73027), + (997929, 10244), (997943, 11537), + (997944, 8068), (997959, 85555), + (997972, 128650), (997973, 1360), + (997977, 62423), (997978, 2170), + (997985, 2028), (997987, 140101), + (998004, 22960), (998015, 114112), + (998016, 6342), (998020, 2960), + (998023, 9379), (998041, 30000), + (998042, 14738), (998049, 12288), + (998050, 15814), (998062, 10000), + (998064, 963), (998068, 10276), + (998074, 118017), (998080, 10863), + (998089, 10000), (998091, 12675), + (998095, 10276), (998103, 1113), + (998108, 468709), (998110, 31626), + (998117, 1877), (998130, 134316), + (998153, 20276), (998156, 16224), + (998162, 13530), (998164, 18000), + (998186, 86785), (998191, 5220), + (998192, 40990), (998197, 279), + (998199, 10000), (998201, 3205), + (998217, 20000), (998225, 2960), + (998229, 2960), (998235, 34082), + (998238, 30800), (998242, 73878), + (998243, 15580), (998255, 23236), + (998265, 445573), (998274, 9961), + (998285, 35196), (998290, 100000), + (998293, 276), (998300, 55458), + (998307, 42529), (998308, 72912), + (998309, 129350), (998318, 10000), + (998334, 2960), (998335, 245), + (998336, 110276), (998345, 90279), + (998356, 60452), (998366, 51245), + (998367, 1044196), (998371, 136444), + (998373, 44346), (998377, 12626), + (998380, 1920), (998387, 117244), + (998388, 7850), (998390, 70002), + (998391, 12076), (998397, 13202), + (998401, 124203), (998402, 47022), + (998406, 784), (998407, 10276), + (998410, 2430), (998420, 10000), + (998433, 148525), (998435, 10000), + (998440, 8960), (998443, 27821), + (998445, 133430), (998446, 11717), + (998448, 983), (998459, 238841), + (998464, 33205), (998465, 22470), + (998468, 20000), (998481, 90392), + (998492, 10539), (998493, 100000), + (998498, 14303), (998507, 276), + (998513, 151496), (998515, 11683), + (998519, 2695), (998525, 20245), + (998528, 42111), (998540, 2450), + (998543, 90521), (998554, 163741), + (998556, 82956), (998571, 11852), + (998572, 47256), (998584, 16260), + (998590, 41028), (998591, 10000), + (998598, 13357), (998603, 3689), + (998609, 41988), (998613, 6276), + (998616, 1920), (998633, 33468), + (998642, 109882), (998643, 10245), + (998650, 3980), (998651, 12440), + (998652, 1299149), (998672, 29153), + (998674, 69466), (998699, 11149), + (998712, 21483), (998739, 1442340), + (998740, 20452), (998750, 56796), + (998767, 4491), (998782, 146237), + (998785, 541), (998792, 10552), + (998798, 482903), (998807, 86814), + (998808, 1098), (998819, 15686), + (998823, 11126), (998837, 30276), + (998840, 98960), (998856, 10000), + (998867, 12260), (998869, 36000), + (998870, 3031076), (998876, 59939), + (998880, 245), (998885, 10000), + (998905, 1460908), (998907, 18075), + (998909, 24903), (998918, 78381), + (998920, 17980), (998922, 32406), + (998925, 12483), (998930, 12960), + (998934, 54102), (998944, 2427476), + (998953, 58378), (998954, 1295903), + (998955, 83236), (998960, 12855), + (998964, 11766), (998967, 10000), + (998968, 4227), (998972, 336506), + (998976, 10245), (998978, 395050), + (998980, 2102421), (998982, 125595), + (998989, 15000), (999008, 129062), + (999010, 5527), (999012, 10000), + (999016, 516599), (999017, 15580), + (999023, 101000), (999025, 34765), + (999028, 154459), (999030, 10000), + (999041, 93680), (999043, 3817), + (999061, 4681), (999064, 24000), + (999074, 103792), (999083, 3205), + (999088, 396570), (999092, 490), + (999093, 4500), (999094, 32085), + (999106, 225015), (999109, 11058), + (999115, 1819763), (999118, 252865), + (999120, 6000), (999121, 10000), + (999134, 20000), (999144, 2960), + (999149, 2350), (999150, 7696), + (999151, 12450), (999161, 115941), + (999163, 112260), (999170, 19827), + (999175, 752), (999176, 1455), + (999179, 324595), (999186, 19608), + (999187, 131633), (999195, 115577), + (999204, 28292), (999212, 18434), + (999213, 33481), (999215, 40835), + (999220, 2450), (999222, 41485), + (999223, 10250), (999225, 13740), + (999226, 53580), (999230, 2510), + (999234, 129062), (999238, 10000), + (999244, 10100), (999247, 12726), + (999251, 92260), (999258, 35827), + (999259, 70592), (999269, 160928), + (999271, 22450), (999273, 51064), + (999274, 393), (999280, 1920), + (999281, 10552), (999287, 470382), + (999295, 2910), (999299, 244), + (999302, 10000), (999310, 2251246), + (999320, 22375), (999325, 18000), + (999326, 32960), (999332, 22185), + (999334, 80000), (999336, 2773), + (999347, 143503), (999348, 347), + (999353, 10245), (999359, 63945), + (999372, 44131), (999375, 26162), + (999378, 20000), (999382, 56740), + (999387, 178645), (999404, 140601), + (999407, 520), (999408, 10631), + (999424, 129463), (999426, 175961), + (999433, 1000), (999434, 71323), + (999442, 233964), (999454, 14180), + (999460, 15410), (999463, 10000), + (999467, 1323062), (999474, 10000), + (999476, 15850), (999479, 21000), + (999482, 45556), (999483, 13930), + (999485, 113094), (999493, 20460), + (999497, 5652), (999498, 12905), + (999501, 24936), (999503, 200658), + (999505, 131851), (999508, 100794), + (999512, 8202), (999514, 41865), + (999519, 34344), (999521, 6780), + (999530, 3274), (999531, 8032), + (999533, 3274), (999534, 112140), + (999538, 5706), (999539, 59072), + (999546, 87686), (999552, 142350), + (999555, 61373), (999564, 22960), + (999567, 10000), (999571, 205301), + (999572, 10991), (999573, 10000), + (999579, 12450), (999592, 146423), + (999597, 24000), (999598, 212450), + (999601, 4639), (999602, 44450), + (999604, 112911), (999612, 13573), + (999622, 24400), (999628, 46026), + (999636, 21145), (999639, 18310), + (999645, 80823), (999658, 111489), + (999660, 121220), (999665, 48944), + (999669, 95876), (999672, 80452), + (999676, 975), (999682, 10000), + (999683, 34773), (999705, 10000), + (999708, 34880), (999718, 23400), + (999719, 23573), (999731, 199672), + (999734, 36003), (999735, 29236), + (999741, 9296), (999744, 46329), + (999748, 119896), (999756, 5496), + (999761, 23881), (999766, 13267), + (999768, 50725), (999782, 3374), + (999789, 25580), (999790, 2450), + (999794, 17595), (999796, 2450), + (999803, 32450), (999808, 10000), + (999821, 10276), (999827, 10000), + (999828, 3740), (999840, 14775), + (999842, 90000), (999844, 402058), + (999848, 29059), (999852, 477243), + (999860, 10000), (999872, 19385), + (999881, 2450), (999883, 347), + (999891, 67408), (999896, 33002), + (999897, 1920), (999902, 379360), + (999908, 22695), (999909, 1291373), + (999914, 10452), (999916, 25580), + (999928, 245), (999932, 835), + (999935, 10000), (999958, 20000), + (999964, 245), (999975, 245), + (999981, 24156), (1000002, 23664), + (1000004, 5410), (1000009, 13622), + (1000019, 10000), (1000021, 10604), + (1000023, 381), (1000031, 19688), + (1000041, 4334), (1000048, 53765), + (1000049, 10245), (1000054, 156825), + (1000057, 29558), (1000074, 10000), + (1000076, 302512), (1000079, 23740), + (1000088, 6000), (1000094, 15580), + (1000097, 29296), (1000109, 30487), + (1000111, 2211080), (1000112, 19933), + (1000113, 2726), (1000114, 276), + (1000116, 80000), (1000121, 10000), + (1000124, 20000), (1000146, 137070), + (1000149, 14912), (1000157, 10000), + (1000164, 23756), (1000172, 53879), + (1000177, 6890), (1000181, 91706), + (1000185, 245), (1000195, 10000), + (1000196, 3740), (1000203, 83879), + (1000208, 42376), (1000218, 63267), + (1000220, 95761), (1000224, 10000), + (1000231, 10000), (1000233, 140626), + (1000235, 29595), (1000236, 86000), + (1000241, 62276), (1000245, 28167), + (1000260, 35580), (1000262, 66237), + (1000264, 71502), (1000269, 5220), + (1000277, 71), (1000282, 224409), + (1000284, 10000), (1000285, 44520), + (1000298, 46674), (1000315, 2993), + (1000316, 12960), (1000320, 698), + (1000327, 65447)], + 't1bzsJ7mRyHwsuXEPMud32SFTjLJ7FrWfpf': [(871064, 57840), (871177, 1146), + (871185, 4546), (871200, 15580), + (871634, 17155), (871705, 12375), + (871762, 29079), (871935, 86741), + (872187, 25268), (876173, 2043), + (893630, 6276), (893696, 32423), + (893801, 19917), (893810, 2450), + (893914, 15580), (893980, 83638), + (893997, 58964), (894018, 31813), + (894036, 10000), (894044, 83740), + (894110, 39115), (894147, 35512), + (894152, 118998), (894153, 4330), + (894162, 24267), (894219, 38838), + (894240, 6536), (894255, 2957), + (894289, 21593), (894292, 25580), + (894327, 10276), (894334, 115636), + (894357, 53462), (894363, 10000), + (894375, 2651), (894395, 637), + (894407, 2450), (894531, 7453), + (894634, 278), (894639, 276), + (894667, 1283805), (894695, 15089), + (894705, 149549), (894722, 26059), + (894732, 1022), (894771, 245), + (894780, 276), (894821, 2103359), + (894842, 115580), (894847, 20000), + (894869, 4114), (894883, 10957), + (894892, 60142), (894899, 82485), + (894901, 10000), (894930, 87533), + (894940, 32495), (894949, 55952), + (894982, 10000), (895017, 250943), + (895102, 22580), (895118, 243), + (895131, 139592), (895138, 3400), + (895144, 12260), (895145, 12536), + (895158, 17623), (895173, 104569), + (895212, 20735), (895224, 1504005), + (895241, 6000), (895259, 35580), + (895299, 106276), (895308, 12028), + (895315, 10000), (895317, 105856), + (895336, 12043), (895345, 12000), + (895399, 32129), (895400, 16622), + (895408, 36622), (895435, 55005), + (895464, 30000), (895511, 12043), + (895541, 10000), (895542, 15311), + (895570, 19207), (895600, 2450), + (895656, 15825), (895683, 15232), + (895694, 2564), (895703, 10000), + (895712, 112896), (895724, 3715), + (895740, 837), (895752, 36142), + (895763, 392), (895803, 40639), + (895804, 9746), (895805, 39772), + (895823, 2450), (895829, 3429), + (895845, 401391), (895852, 14769), + (895865, 25580), (895874, 36836), + (895942, 110836), (895945, 90276), + (895952, 37827), (895957, 349019), + (895979, 14213), (895994, 25580), + (896004, 320988), (896007, 1404901), + (896039, 55934), (896043, 41600), + (896046, 245), (896054, 23048), + (896080, 41520), (896122, 250388), + (896153, 103740), (896159, 20215), + (896167, 19622), (896176, 80538), + (896187, 41589), (896197, 20028), + (896202, 9659), (896209, 146443), + (896211, 124944), (896223, 72556), + (896259, 121145), (896266, 57754), + (896274, 10000), (896295, 17448), + (896296, 2569), (896301, 276), + (896304, 14086), (896333, 10000), + (896349, 20114), (896373, 245), + (896442, 15580), (896445, 13080), + (896449, 34086), (896453, 1131), + (896457, 12235), (896467, 13869), + (896478, 2043), (896482, 17901), + (896561, 10000), (896562, 30810), + (896583, 30993), (896599, 35977), + (896610, 245), (896611, 642), + (896633, 103269), (896639, 11974), + (896647, 31219), (896672, 10000), + (896693, 15580), (896696, 35856), + (896731, 64520), (896761, 276), + (896769, 106712), (896780, 2043), + (896817, 5073), (896824, 17208), + (896835, 2043), (896852, 25248), + (896864, 244), (896868, 15580), + (896885, 40245), (896913, 30375), + (896921, 836), (896923, 10802), + (896936, 15145), (896992, 240000), + (896997, 71993), (897000, 15580), + (897017, 28030), (897020, 2288), + (897025, 34493), (897033, 18000), + (897044, 2288), (897053, 41060), + (897055, 26100), (897087, 7000), + (897113, 13906), (897137, 10000), + (897138, 10245), (897142, 138862), + (897154, 12940), (897158, 80000), + (897171, 15959), (897174, 35801), + (897194, 34191), (897200, 29913), + (897220, 1131), (897226, 15580), + (897245, 10835), (897262, 14100), + (897267, 658), (897293, 6543), + (897298, 982), (897330, 12043), + (897333, 88846), (897353, 3004), + (897364, 2043), (897367, 2350), + (897384, 4086), (897390, 12288), + (897397, 121128), (897409, 6000), + (897426, 18030), (897436, 77066), + (897463, 69166), (897466, 97532), + (897473, 4086), (897484, 21125), + (897487, 38048), (897499, 26970), + (897506, 2288), (897541, 7057), + (897548, 19046), (897565, 276), + (897572, 10000), (897574, 97623), + (897576, 32260), (897592, 5233), + (897599, 13874), (897608, 6346), + (897619, 2595), (897628, 5130), + (897638, 244), (897647, 18025), + (897653, 29468), (897659, 20491), + (897664, 245), (897671, 14086), + (897677, 68623), (897685, 108631), + (897724, 169610), (897729, 6536), + (897738, 4086), (897752, 115410), + (897758, 16190), (897769, 2043), + (897770, 6249), (897809, 30842), + (897814, 162690), (897858, 12450), + (897861, 1146), (897883, 22558), + (897892, 10000), (897924, 10245), + (897972, 833), (897981, 8448), + (898006, 19963), (898016, 12043), + (898022, 54760), (898035, 112155), + (898037, 20000), (898042, 11738), + (898045, 278105), (898049, 19109), + (898055, 3020820), (898110, 17781), + (898130, 7554), (898137, 2726), + (898139, 10000), (898146, 244), + (898152, 8871), (898207, 169239), + (898213, 10000), (898215, 30596), + (898227, 500000), (898242, 30053), + (898256, 30000), (898262, 385658), + (898281, 101000), (898283, 19288), + (898284, 118112), (898296, 1000), + (898297, 34661), (898329, 100), + (898332, 14086), (898342, 27982), + (898350, 66965), (898360, 94854), + (898377, 112260), (898385, 29950), + (898397, 10000), (898416, 7000), + (898434, 41967), (898439, 13870), + (898455, 15383), (898487, 14145), + (898488, 47346), (898493, 45538), + (898509, 46740), (898512, 8172), + (898516, 49013), (898521, 245), + (898535, 130304), (898546, 51473), + (898550, 244514), (898552, 2690), + (898564, 15475), (898569, 34564), + (898576, 244), (898588, 2450), + (898591, 32350), (898594, 25000), + (898596, 16043), (898613, 10000), + (898630, 55910), (898642, 184967), + (898660, 9287), (898666, 2475), + (898681, 52784), (898686, 369163), + (898687, 33185), (898691, 1539), + (898707, 2450), (898710, 30000), + (898715, 8886), (898726, 159784), + (898740, 909954), (898745, 4086), + (898765, 112901), (898769, 13189), + (898777, 29326), (898782, 11146), + (898784, 56153), (898789, 27899), + (898854, 6000), (898863, 9660), + (898900, 2480), (898922, 166091), + (898940, 34046), (898944, 32291), + (898954, 37361), (898971, 2043), + (898986, 15580), (898996, 33192), + (899004, 2038), (899016, 72906), + (899029, 2046), (899039, 10000), + (899041, 8355), (899051, 55868), + (899105, 16726), (899114, 211091), + (899119, 26314), (899124, 9043), + (899130, 92396), (899134, 5620), + (899137, 14900), (899144, 63489), + (899147, 144661), (899166, 4778), + (899183, 12245), (899187, 69751), + (899189, 16082), (899208, 89827), + (899221, 17124), (899229, 69428), + (899238, 2095934), (899239, 25117), + (899247, 18350), (899258, 1146), + (899267, 2260), (899273, 2695), + (899277, 225278), (899285, 24820), + (899291, 9110), (899312, 394215), + (899328, 202350), (899330, 80768), + (899344, 20000), (899360, 164254), + (899381, 180113), (899397, 30230), + (899398, 22280), (899402, 10000), + (899421, 22751), (899423, 10000), + (899428, 248801), (899434, 37155), + (899440, 42156), (899455, 147335), + (899462, 10000), (899466, 28738), + (899521, 100000), (899527, 10000), + (899539, 30550), (899543, 10000), + (899554, 46000), (899557, 63241), + (899559, 15580), (899573, 20000), + (899592, 47312), (899609, 7000), + (899612, 26086), (899629, 202657), + (899634, 26974), (899641, 252086), + (899642, 54805), (899647, 245), + (899652, 31160), (899654, 153235), + (899673, 153737), (899675, 10030), + (899680, 207098), (899681, 7336), + (899720, 84016), (899733, 1920), + (899737, 71056), (899760, 10000), + (899761, 1406), (899771, 786), + (899791, 2260), (899794, 14796), + (899797, 676), (899801, 160354), + (899804, 29338), (899807, 245), + (899814, 9490), (899817, 81866), + (899838, 10466), (899847, 13596), + (899865, 6255), (899878, 276), + (899881, 10000), (899882, 1434348), + (899888, 16781), (899901, 108493), + (899918, 2450), (899925, 634), + (899928, 10279), (899941, 106997), + (899946, 84902), (899958, 172760), + (899968, 273238), (899975, 12562), + (899977, 2260), (899980, 19941), + (899986, 96236), (900003, 28806), + (900006, 114362), (900016, 12700), + (900025, 14393), (900027, 109619), + (900029, 7000), (900033, 14208), + (900048, 276), (900053, 181084), + (900057, 42536), (900064, 82319), + (900066, 15000), (900084, 15973), + (900085, 276), (900093, 243), + (900101, 93985), (900109, 15580), + (900110, 94180), (900130, 10276), + (900131, 2450), (900142, 136812), + (900144, 30588), (900152, 12043), + (900159, 80000), (900167, 14576), + (900190, 122695), (900212, 20467), + (900217, 245), (900229, 25580), + (900243, 12690), (900250, 30392), + (900259, 1368105), (900279, 310245), + (900303, 10000), (900311, 8866), + (900316, 30000), (900330, 40000), + (900341, 2574805), (900343, 29060), + (900344, 54384), (900352, 83919), + (900356, 11675), (900364, 14467), + (900365, 13776), (900380, 245), + (900381, 18388), (900392, 4086), + (900394, 2618), (900395, 4920), + (900402, 102480), (900409, 41295), + (900420, 10000), (900422, 44086), + (900426, 2350), (900443, 12350), + (900455, 84616), (900459, 49422), + (900462, 15580), (900473, 54143), + (900478, 205081), (900488, 48294), + (900504, 16584), (900517, 16129), + (900530, 4086), (900535, 91001), + (900537, 12375), (900545, 165526), + (900549, 2043), (900571, 149148), + (900586, 2043), (900587, 106346), + (900597, 12690), (900619, 245), + (900620, 1582), (900621, 529), + (900631, 21722), (900636, 60505), + (900640, 4955), (900647, 2290), + (900656, 17250), (900665, 643), + (900675, 50000), (900677, 100), + (900686, 320000), (900693, 39787), + (900696, 12260), (900706, 10347), + (900707, 10000), (900718, 21642), + (900724, 3470), (900726, 66969), + (900729, 250), (900734, 245), + (900739, 7425), (900740, 6085), + (900750, 494), (900760, 7000), + (900769, 27840), (900773, 32510), + (900774, 17000), (900778, 36695), + (900784, 62468), (900797, 15580), + (900815, 12477), (900824, 76552), + (900829, 21709), (900830, 35303), + (900831, 35580), (900836, 18641), + (900857, 20000), (900869, 28924), + (900879, 25666), (900899, 15671), + (900901, 14740), (900908, 24189), + (900916, 28615), (900921, 36071), + (900927, 276), (900931, 19393), + (900943, 133463), (900948, 22619), + (900964, 35971), (900973, 168058), + (900974, 2450), (900977, 83596), + (900991, 18489), (901002, 10071), + (901009, 32459), (901012, 11146), + (901032, 58337), (901037, 115579), + (901042, 201367), (901044, 47914), + (901050, 41165), (901054, 2047), + (901076, 558), (901080, 187047), + (901081, 127879), (901097, 120580), + (901100, 48165), (901101, 138892), + (901111, 24477), (901126, 21145), + (901129, 32450), (901140, 22085), + (901146, 108289), (901154, 834), + (901157, 13655), (901164, 41062), + (901176, 10000), (901180, 12306), + (901203, 21541), (901206, 37554), + (901220, 345), (901230, 2043), + (901243, 29353), (901246, 208371), + (901247, 18972), (901283, 3712), + (901288, 695288), (901291, 33990), + (901296, 10240), (901298, 66185), + (901301, 19829), (901307, 90000), + (901323, 38628), (901328, 42447), + (901331, 22043), (901334, 23632), + (901340, 10000), (901358, 2350), + (901363, 91436), (901365, 17062), + (901390, 10279), (901393, 2043), + (901402, 135179), (901408, 20824), + (901435, 15580), (901455, 42290), + (901458, 73470), (901481, 1242), + (901495, 523), (901508, 59254), + (901509, 12546), (901511, 12278), + (901520, 14710), (901521, 81300), + (901524, 30043), (901553, 13740), + (901570, 38361), (901575, 1000), + (901584, 9156), (901591, 6536), + (901611, 4738), (901627, 28106), + (901641, 16918), (901655, 17022), + (901665, 31175), (901667, 104637), + (901670, 2043), (901684, 25289), + (901690, 4086), (901691, 18824), + (901698, 6000), (901708, 2260), + (901710, 125264), (901713, 244), + (901721, 7263), (901723, 22043), + (901732, 102503), (901740, 31047), + (901743, 20529), (901746, 48788), + (901747, 11146), (901760, 25580), + (901761, 8013), (901771, 12260), + (901777, 82787), (901790, 7250), + (901794, 281479), (901801, 2927), + (901803, 2407), (901809, 92043), + (901821, 7000), (901824, 2695), + (901837, 36987), (901838, 18983), + (901845, 94935), (901848, 47344), + (901851, 7882), (901866, 85860), + (901878, 14000), (901880, 1000), + (901898, 115100), (901946, 39666), + (901947, 47713), (901948, 138871), + (901974, 32264), (901977, 14330), + (901978, 207515), (901979, 73155), + (901982, 18434), (901987, 2450), + (901992, 2288), (901994, 68296), + (902007, 20000), (902008, 34458), + (902017, 154780), (902020, 2260), + (902028, 27872), (902041, 3433), + (902046, 18075), (902059, 18030), + (902066, 181425), (902084, 12146), + (902094, 51028), (902135, 16244), + (902142, 43998), (902144, 12505), + (902146, 10000), (902147, 36000), + (902152, 35488), (902162, 127081), + (902168, 4086), (902203, 693501), + (902207, 12313), (902219, 27000), + (902226, 250), (902253, 245), + (902263, 17873), (902267, 18233), + (902269, 17713), (902277, 10933), + (902279, 11920), (902284, 2043), + (902338, 24493), (902341, 52505), + (902345, 14395), (902387, 22043), + (902393, 14418), (902398, 199862), + (902401, 54083), (902403, 164273), + (902406, 45017), (902408, 1920), + (902418, 41160), (902422, 21580), + (902432, 14520), (902434, 11081), + (902445, 10000), (902447, 5991), + (902452, 20160), (902461, 112043), + (902470, 45780), (902476, 8152), + (902495, 214960), (902500, 2350), + (902502, 148881), (902504, 2043), + (902508, 15580), (902509, 167907), + (902512, 10000), (902523, 510000), + (902532, 40244), (902535, 4999), + (902538, 10000), (902553, 16129), + (902570, 10000), (902571, 80245), + (902579, 103978), (902582, 1360), + (902591, 7848), (902592, 11787), + (902593, 78269), (902598, 3230690), + (902604, 81902), (902609, 10245), + (902611, 2043), (902615, 54943), + (902617, 49996), (902623, 693), + (902627, 34086), (902628, 10000), + (902637, 2043), (902649, 29447), + (902657, 12760), (902662, 11146), + (902665, 10243), (902672, 15580), + (902692, 1146), (902696, 1920), + (902718, 36185), (902722, 42375), + (902743, 5220), (902745, 12945), + (902748, 6676), (902754, 30898), + (902767, 25762), (902774, 836), + (902778, 10392), (902784, 1272426), + (902789, 4880), (902799, 32527), + (902800, 1374), (902812, 748), + (902828, 210000), (902830, 393), + (902835, 279), (902844, 51186), + (902846, 12375), (902862, 248720), + (902874, 6868), (902876, 22668), + (902897, 3219), (902905, 4157), + (902907, 261469), (902910, 6223), + (902924, 28545), (902925, 2910), + (902927, 40000), (902951, 146383), + (902954, 24385), (902961, 138448), + (902964, 21279), (902965, 20000), + (902977, 21303), (903003, 31240), + (903016, 14465), (903028, 55481), + (903033, 26631), (903041, 9713), + (903060, 15580), (903062, 5180), + (903063, 7311), (903065, 12617), + (903068, 55348), (903070, 36320), + (903074, 7000), (903076, 98160), + (903077, 15825), (903092, 9288), + (903094, 34533), (903098, 26592), + (903107, 9351), (903110, 24624), + (903112, 55604), (903137, 29666), + (903153, 10000), (903162, 60130), + (903173, 90484), (903178, 34690), + (903184, 2450), (903185, 20493), + (903195, 213394), (903197, 14548), + (903201, 36752), (903205, 117236), + (903213, 2112900), (903218, 3740), + (903224, 110000), (903228, 70009), + (903231, 522), (903254, 11231), + (903256, 32862), (903258, 4086), + (903272, 12286), (903276, 22580), + (903280, 108322), (903281, 1534), + (903292, 74943), (903305, 21545), + (903308, 12532), (903311, 86000), + (903312, 6000), (903315, 14417), + (903318, 1869), (903319, 25693), + (903322, 6374), (903324, 27970), + (903330, 14086), (903332, 15086), + (903334, 22290), (903337, 16000), + (903339, 20245), (903346, 24329), + (903347, 17858), (903360, 18172), + (903365, 2450), (903375, 1920), + (903376, 109621), (903385, 43035), + (903404, 10000), (903405, 80245), + (903415, 22450), (903423, 10000), + (903431, 7000), (903448, 28479), + (903455, 19950), (903457, 10000), + (903459, 93788), (903463, 13288), + (903470, 2043), (903501, 2450), + (903503, 10000), (903518, 117978), + (903540, 22450), (903542, 20000), + (903549, 10000), (903554, 14579), + (903555, 12652), (903557, 25580), + (903567, 45246), (903575, 126536), + (903577, 25580), (903581, 30000), + (903604, 245), (903607, 11625), + (903640, 15580), (903656, 489), + (903659, 1000), (903662, 12043), + (903665, 10637), (903676, 20461), + (903677, 816), (903679, 4640), + (903689, 16886), (903692, 264548), + (903704, 1225), (903717, 490), + (903718, 214316), (903737, 2532), + (903741, 244), (903748, 245), + (903749, 245), (903750, 28783), + (903752, 15745), (903758, 52350), + (903762, 42135), (903771, 1582), + (903773, 31785), (903779, 10490), + (903782, 47100), (903786, 61155), + (903794, 65274), (903795, 4493), + (903806, 6000), (903816, 10000), + (903818, 34373), (903821, 2043), + (903823, 80000), (903825, 10000), + (903832, 2043), (903842, 32000), + (903845, 94086), (903854, 243), + (903872, 2695), (903877, 101709), + (903887, 9813), (903889, 295207), + (903890, 80000), (903892, 7453), + (903894, 10852), (903898, 3030), + (903901, 14263), (903904, 73252), + (903908, 12043), (903915, 2043), + (903917, 2495), (903927, 2043), + (903934, 12435), (903935, 10000), + (903941, 12393), (903942, 279), + (903944, 10000), (903948, 10245), + (903959, 18982), (903968, 245), + (903985, 1083), (903989, 6129), + (903990, 100000), (903991, 100245), + (903997, 12043), (903998, 279), + (903999, 4330), (904001, 16129), + (904009, 24331), (904010, 144487), + (904012, 2043), (904027, 11582), + (904029, 20000), (904033, 22990), + (904043, 125922), (904046, 20734), + (904050, 2043), (904053, 22450), + (904055, 16310), (904058, 15580), + (904061, 10000), (904067, 3902781), + (904074, 10000), (904076, 11582), + (904082, 5044), (904091, 24604), + (904092, 20659), (904093, 16490), + (904114, 84086), (904115, 245), + (904116, 18943), (904124, 245), + (904128, 106092), (904143, 10000), + (904144, 95771), (904149, 3968), + (904150, 244), (904153, 72350), + (904163, 48431), (904167, 44610), + (904171, 10000), (904177, 574), + (904180, 26075), (904182, 159632), + (904185, 120265), (904188, 333077), + (904195, 111792), (904199, 198748), + (904207, 62197), (904228, 4303), + (904236, 30278), (904237, 10000), + (904245, 10000), (904246, 90333), + (904251, 18848), (904252, 12288), + (904259, 23633), (904269, 163190), + (904271, 25859), (904276, 18291), + (904277, 38646), (904283, 114885), + (904284, 5068), (904285, 10000), + (904291, 22447), (904294, 150495), + (904299, 88748), (904311, 1870), + (904320, 4331), (904321, 84500), + (904326, 3288), (904335, 10245), + (904347, 18419), (904350, 10100), + (904352, 4032), (904358, 114023), + (904364, 127321), (904365, 196553), + (904370, 245), (904377, 23415), + (904383, 4086), (904387, 12288), + (904393, 14200), (904394, 96042), + (904403, 392), (904404, 17233), + (904424, 2450), (904428, 14336), + (904430, 250), (904437, 296075), + (904439, 86346), (904440, 12476), + (904443, 20000), (904447, 490), + (904452, 2450), (904453, 10245), + (904462, 28983), (904467, 13324), + (904474, 13171), (904493, 2043), + (904494, 16000), (904499, 2260), + (904515, 90460), (904517, 240958), + (904525, 10000), (904526, 2043), + (904527, 10000000), (904544, 16000), + (904545, 16490), (904557, 80000), + (904570, 22982), (904573, 90490), + (904576, 4303), (904581, 32043), + (904587, 16506), (904594, 19391), + (904610, 10000), (904613, 10312), + (904614, 242), (904621, 1920), + (904624, 31228), (904626, 102288), + (904635, 10000), (904637, 512322), + (904645, 12043), (904659, 25830), + (904666, 500), (904671, 100), + (904673, 22801), (904679, 93580), + (904684, 70831), (904685, 11142), + (904686, 2043), (904692, 18083), + (904699, 12043), (904701, 245), + (904708, 14019), (904710, 20489), + (904716, 14086), (904722, 115529), + (904723, 62531), (904725, 2043), + (904729, 25580), (904736, 6536), + (904746, 4086), (904748, 426), + (904753, 10250), (904755, 17840), + (904771, 44520), (904777, 2043), + (904780, 245), (904783, 2043), + (904792, 6000), (904798, 17245), + (904800, 106341), (904803, 95712), + (904809, 22287), (904826, 6528), + (904831, 121478), (904842, 10734), + (904844, 21266), (904847, 522), + (904855, 10694), (904858, 48248), + (904867, 245), (904874, 245), + (904876, 8504), (904882, 16233), + (904886, 114273), (904890, 67684), + (904891, 88930), (904897, 65540), + (904899, 99965), (904901, 4086), + (904905, 16903), (904907, 1658496), + (904910, 112043), (904913, 16875), + (904932, 96738), (904933, 1078), + (904934, 16829), (904937, 2450), + (904940, 16329), (904945, 7453), + (904948, 7697), (904950, 494), + (904951, 2260), (904959, 156684), + (904967, 30000), (904971, 6536), + (904976, 2043), (904985, 44260), + (904991, 2536), (904994, 14833), + (905002, 48599), (905006, 2043), + (905025, 245), (905026, 13180), + (905038, 82288), (905043, 12043), + (905051, 211891), (905056, 48450), + (905071, 80000), (905072, 6526), + (905073, 32350), (905080, 244), + (905085, 24789), (905086, 10000), + (905088, 14378), (905090, 24637), + (905092, 31609), (905101, 12000), + (905111, 133843), (905122, 2288), + (905125, 27723), (905127, 128172), + (905135, 2043), (905136, 10000), + (905137, 21805), (905138, 579360), + (905148, 44583), (905156, 42043), + (905169, 4086), (905176, 5220), + (905184, 12085), (905187, 21607), + (905190, 286846), (905194, 8043), + (905197, 2043), (905199, 2695), + (905200, 10541), (905205, 20000), + (905206, 34403), (905209, 35859), + (905210, 80000), (905219, 2430), + (905237, 415), (905241, 6000), + (905244, 158694), (905250, 244), + (905260, 245), (905268, 2043), + (905272, 12350), (905273, 16861), + (905280, 4303), (905286, 30243), + (905290, 245), (905292, 60257), + (905310, 10000), (905311, 33340), + (905312, 3667), (905315, 106346), + (905318, 244), (905323, 18668), + (905324, 26780), (905325, 2532), + (905340, 92991), (905342, 10000), + (905349, 78459), (905354, 42903), + (905355, 4086), (905360, 10000), + (905361, 14086), (905368, 10000), + (905373, 10414), (905377, 15580), + (905380, 84029), (905381, 245), + (905382, 245), (905408, 129523), + (905419, 50535), (905421, 84978), + (905447, 524), (905456, 3043), + (905457, 6129), (905464, 4086), + (905476, 768), (905489, 2505), + (905495, 30638), (905497, 12043), + (905503, 2260), (905505, 1972), + (905506, 84576), (905507, 12700), + (905509, 245), (905524, 17623), + (905526, 17744), (905528, 1873), + (905530, 321175), (905539, 72565), + (905545, 28631), (905561, 245), + (905562, 46575), (905563, 10245), + (905567, 524), (905577, 10660), + (905578, 12363), (905581, 14576), + (905585, 80000), (905586, 33123), + (905587, 28508), (905592, 44821), + (905596, 3740), (905600, 10245), + (905601, 92356), (905602, 10000), + (905603, 278), (905605, 10245), + (905608, 16896), (905612, 100592), + (905618, 10245), (905622, 10313), + (905630, 119949), (905646, 7000), + (905647, 22321), (905655, 11639), + (905658, 2043), (905668, 245), + (905672, 244), (905676, 4493), + (905682, 279), (905683, 10000), + (905687, 6619), (905689, 16490), + (905701, 10245), (905704, 14493), + (905709, 30938), (905712, 12450), + (905713, 2288), (905716, 2043), + (905717, 15174), (905729, 4331), + (905730, 42288), (905735, 106868), + (905738, 46069), (905741, 24652), + (905746, 244), (905749, 90000), + (905759, 576), (905765, 245), + (905767, 1338), (905784, 245), + (905785, 10000), (905790, 35386), + (905793, 6129), (905800, 6407), + (905801, 212702), (905808, 2043), + (905810, 16129), (905816, 5443), + (905835, 1247346), (905837, 36103), + (905848, 37868), (905851, 90000), + (905854, 245), (905858, 27623), + (905863, 245), (905877, 43421), + (905897, 12620), (905905, 10380), + (905922, 12595), (905923, 30000), + (905926, 15356), (905929, 2043), + (905933, 13740), (905940, 39910), + (905943, 10000), (905944, 10000), + (905951, 245), (905952, 20244), + (905953, 250), (905955, 250), + (905965, 110529), (905969, 30000), + (905974, 10000), (905991, 245), + (905995, 13183), (905998, 4086), + (906004, 94983), (906008, 12287), + (906013, 2940), (906016, 32288), + (906019, 10000), (906027, 12043), + (906037, 22993), (906038, 1257), + (906041, 357142), (906051, 979), + (906053, 59045), (906054, 20252), + (906058, 23677), (906087, 4581), + (906089, 3712), (906091, 16616), + (906092, 10558), (906093, 88172), + (906096, 16272), (906102, 10243), + (906113, 279), (906114, 244331), + (906121, 12288), (906123, 244), + (906128, 14956), (906133, 245), + (906137, 10916), (906138, 10245), + (906145, 2539), (906150, 2322), + (906162, 20000), (906166, 22322), + (906178, 10000), (906179, 245), + (906180, 14086), (906184, 11254), + (906193, 245), (906203, 14843), + (906205, 10524), (906208, 5463), + (906214, 25035), (906225, 10000), + (906229, 21330), (906232, 5410), + (906233, 96360), (906235, 25410), + (906237, 92041), (906246, 10279), + (906250, 20489), (906252, 37229), + (906257, 29911), (906265, 94676), + (906267, 346), (906274, 244), + (906277, 39178), (906278, 6700), + (906286, 17255), (906287, 2920), + (906288, 29090), (906289, 8279), + (906297, 10000), (906299, 2267), + (906300, 16346), (906303, 12851), + (906307, 279), (906308, 20392), + (906316, 15580), (906317, 6255), + (906319, 27626), (906323, 92307), + (906326, 4149), (906331, 10558), + (906346, 3411570), (906348, 10000), + (906349, 20313), (906356, 10000), + (906359, 90871), (906365, 15580), + (906369, 300660), (906373, 314100), + (906383, 39930), (906386, 244), + (906387, 457568), (906388, 5059), + (906389, 3925), (906402, 12363), + (906406, 8860), (906414, 25649), + (906416, 3013), (906417, 230279), + (906420, 23048), (906423, 213492), + (906439, 13217), (906452, 278), + (906454, 1099), (906462, 10245), + (906469, 534561), (906481, 140550), + (906483, 5559), (906488, 80000), + (906492, 64517), (906501, 3294), + (906502, 369673), (906503, 47081), + (906509, 1582), (906523, 86898), + (906530, 2288), (906535, 10702), + (906536, 111668), (906547, 11226), + (906548, 13474), (906552, 13509), + (906555, 4352), (906561, 2043), + (906568, 2888), (906570, 408630), + (906574, 6211), (906578, 36917), + (906581, 561), (906583, 47593), + (906584, 493), (906592, 10903), + (906594, 20832), (906597, 9154), + (906604, 22741), (906606, 77439), + (906608, 62320), (906610, 80696), + (906612, 15649), (906615, 766), + (906620, 766), (906626, 397777), + (906633, 31181), (906637, 2033), + (906646, 49579), (906653, 46894), + (906654, 38888), (906655, 2260), + (906656, 919), (906658, 6707), + (906659, 770), (906661, 313823), + (906663, 129402), (906664, 694), + (906668, 3294), (906670, 8260), + (906674, 44932), (906675, 3460), + (906692, 929), (906696, 1434779), + (906698, 2723), (906699, 2477), + (906705, 3049), (906711, 10680), + (906712, 315580), (906715, 20348), + (906716, 44379), (906717, 9642), + (906726, 10763), (906729, 90849), + (906731, 5908), (906733, 12043), + (906734, 17466), (906737, 31771), + (906738, 16387), (906747, 927), + (906751, 85406), (906753, 18030), + (906755, 82710), (906762, 13990), + (906777, 680), (906782, 3411), + (906783, 26715), (906788, 12043), + (906792, 31614), (906793, 849), + (906794, 15580), (906796, 4600), + (906798, 11779), (906799, 1015), + (906801, 10849), (906802, 34548), + (906805, 25496), (906807, 44063), + (906811, 10599), (906812, 22314), + (906816, 11086), (906818, 10014309), + (906823, 20680), (906825, 20432), + (906826, 932), (906828, 1698), + (906830, 7689), (906833, 10000), + (906838, 2123), (906841, 766), + (906845, 25413), (906849, 597), + (906853, 594), (906855, 19378), + (906859, 22196), (906863, 27549), + (906865, 2450), (906869, 1644), + (906882, 930), (906887, 23729), + (906896, 5260), (906903, 48476), + (906913, 1890), (906926, 10000), + (906943, 11334), (906955, 129510), + (906957, 8678), (906960, 759), + (906962, 667), (906964, 36681), + (906966, 9754), (906970, 38958), + (906972, 33835), (906976, 1609), + (906978, 13097), (906983, 5025), + (906985, 664), (906989, 759), + (906993, 10000), (907006, 38568), + (907007, 5883), (907008, 14137), + (907015, 667), (907026, 43117), + (907028, 12370), (907032, 21534), + (907038, 22710), (907048, 66249), + (907051, 1426), (907053, 664), + (907054, 767), (907062, 24691), + (907070, 24995), (907073, 39963), + (907082, 917), (907085, 18504), + (907093, 759), (907095, 5793), + (907097, 944), (907104, 664), + (907115, 667), (907127, 20667), + (907130, 664), (907131, 21165), + (907132, 10667), (907133, 2802), + (907138, 22641), (907140, 667), + (907143, 16339), (907145, 15031), + (907153, 1032), (907154, 3781), + (907160, 6888), (907165, 849), + (907166, 72002), (907168, 59821), + (907170, 1423), (907176, 15580), + (907183, 64260), (907184, 131608), + (907185, 212408), (907186, 53756), + (907194, 25580), (907195, 24780), + (907214, 18286), (907215, 1870), + (907222, 2207486), (907235, 8797), + (907236, 170375), (907237, 3751), + (907247, 2763), (907249, 500322), + (907257, 72079), (907263, 40299), + (907265, 42465), (907268, 24771), + (907270, 8953), (907279, 12085), + (907284, 20113), (907285, 916), + (907290, 15580), (907293, 3083), + (907302, 101363), (907303, 47312), + (907304, 16625), (907307, 12491), + (907316, 1018), (907318, 43611), + (907320, 23252), (907321, 2157), + (907325, 10805), (907327, 14467), + (907330, 1028), (907339, 11247), + (907340, 14794), (907342, 84738), + (907343, 35751), (907348, 37626), + (907350, 13415), (907364, 44736), + (907367, 46528), (907377, 29594), + (907388, 11903), (907394, 5337), + (907395, 250365), (907396, 12422), + (907408, 30000), (907411, 8016), + (907414, 120236), (907424, 10017), + (907425, 1903), (907430, 21132), + (907433, 2696), (907434, 12960), + (907435, 4320), (907437, 24592), + (907444, 39652), (907448, 28092), + (907457, 47715), (907461, 19208), + (907463, 17081), (907465, 50558), + (907466, 16379), (907468, 14468), + (907472, 67152), (907473, 2532), + (907476, 27382), (907480, 173632), + (907496, 45114), (907504, 15580), + (907509, 106385), (907511, 135494), + (907513, 69463), (907521, 15231), + (907524, 18670), (907526, 6129), + (907532, 14591), (907535, 201524), + (907537, 4658), (907541, 117669), + (907548, 2043), (907550, 10000), + (907553, 10745), (907556, 3539), + (907562, 17314), (907564, 123838), + (907565, 12240), (907566, 78903), + (907569, 2615), (907572, 56479), + (907577, 106134), (907583, 16417), + (907588, 8427), (907596, 14086), + (907599, 149789), (907603, 17578), + (907605, 2331), (907611, 49614), + (907613, 25992), (907615, 6276), + (907616, 73778), (907618, 146626), + (907624, 20658), (907627, 15254), + (907629, 6685), (907635, 3762), + (907641, 31160), (907648, 10125), + (907653, 13184), (907657, 33394), + (907659, 49596), (907660, 4655), + (907662, 60065), (907666, 54649), + (907678, 2332), (907679, 112486), + (907680, 123743), (907681, 48787), + (907682, 100075), (907688, 11782), + (907701, 38766), (907707, 26359), + (907711, 5534), (907713, 52391), + (907715, 2350), (907716, 2031), + (907717, 34037), (907718, 71146), + (907719, 11605), (907722, 8456), + (907723, 34877), (907725, 10585), + (907730, 5399), (907737, 81281), + (907738, 116304), (907745, 98924), + (907750, 32915), (907756, 211166), + (907757, 24133), (907758, 23452), + (907761, 18064), (907764, 69488), + (907769, 10413), (907770, 30943), + (907773, 8338), (907780, 83820), + (907783, 30654), (907786, 53063), + (907788, 12332), (907792, 34434), + (907795, 123943), (907799, 160434), + (907811, 42381), (907816, 16996), + (907825, 19765), (907836, 20520), + (907845, 16085), (907846, 103268), + (907849, 185311), (907865, 196053), + (907868, 5801), (907869, 3753), + (907870, 142870), (907872, 6370), + (907877, 5224), (907882, 46692), + (907890, 175112), (907895, 19917), + (907904, 6980), (907910, 12861), + (907915, 16852), (907916, 2616), + (907918, 4919), (907923, 28996), + (907926, 26050), (907936, 100140), + (907946, 23754), (907952, 262633), + (907954, 6700), (907955, 33822), + (907957, 7761), (907974, 4904), + (907975, 10126304), (907976, 2608), + (907986, 53643), (907987, 6038), + (907988, 26416), (908010, 4935), + (908011, 2929), (908016, 4086), + (908028, 6364), (908031, 18364), + (908033, 39695), (908034, 33529), + (908038, 2043), (908041, 25250), + (908044, 23757), (908051, 127349), + (908053, 37060), (908054, 5898), + (908063, 79704), (908065, 25232), + (908092, 34484), (908093, 2293), + (908097, 2403), (908099, 14498), + (908100, 35590), (908120, 19666), + (908121, 163803), (908124, 38030), + (908129, 2616), (908131, 23194), + (908132, 2900), (908134, 2293), + (908137, 10000), (908139, 45294), + (908140, 30749), (908145, 36672), + (908148, 6566), (908149, 38026), + (908153, 12048), (908158, 21014), + (908161, 10000), (908163, 10000), + (908164, 15580), (908170, 261336), + (908176, 36340), (908177, 2332), + (908190, 32761), (908192, 11989), + (908199, 87902), (908202, 3285), + (908205, 8332), (908215, 10375), + (908216, 4493), (908218, 12240), + (908230, 14937), (908234, 10000), + (908235, 12507), (908237, 16702), + (908240, 78153), (908242, 4083), + (908249, 14980), (908254, 111836), + (908259, 23540), (908265, 7612), + (908278, 2616), (908280, 17912), + (908282, 2611), (908285, 35174), + (908289, 2616), (908290, 2288), + (908295, 4943), (908300, 349259), + (908305, 14091), (908307, 2536), + (908312, 43740), (908325, 10216), + (908329, 382531), (908336, 2043), + (908337, 372679), (908341, 133944), + (908350, 4941), (908354, 3124202), + (908363, 2332), (908364, 14867), + (908369, 2608), (908370, 54372), + (908374, 7000), (908378, 3521), + (908380, 5225), (908383, 19322), + (908384, 2392), (908389, 2893), + (908396, 5067), (908398, 7584), + (908408, 20000), (908410, 76904), + (908412, 2862), (908415, 23930), + (908420, 46900), (908424, 66904), + (908426, 2901), (908430, 20669), + (908432, 35506), (908436, 7670), + (908438, 20164), (908439, 25749), + (908456, 43866), (908458, 87670), + (908459, 11415), (908461, 169682), + (908462, 31213), (908466, 158837), + (908473, 2260), (908477, 32702), + (908494, 2287), (908503, 2043), + (908506, 2172469), (908520, 50913), + (908533, 5067), (908536, 2902), + (908539, 23799), (908540, 65415), + (908556, 30502), (908558, 75807), + (908560, 2603), (908562, 150454), + (908565, 65070), (908575, 359552), + (908582, 17275), (908586, 2390917), + (908588, 12085), (908590, 12902), + (908596, 15313), (908601, 21410), + (908606, 82320), (908611, 30639), + (908616, 31709), (908628, 30773), + (908630, 32385), (908632, 12867), + (908636, 22722), (908644, 55772), + (908645, 3111), (908647, 6402), + (908659, 6441), (908671, 69757), + (908674, 44459), (908683, 54582), + (908695, 183836), (908696, 16497), + (908706, 71463), (908712, 36407), + (908715, 14618), (908716, 8787), + (908722, 18709), (908724, 2450), + (908731, 18545), (908734, 250), + (908736, 250), (908737, 5501), + (908738, 11531), (908739, 12700), + (908742, 13169), (908743, 18538), + (908748, 250), (908751, 132178), + (908752, 250), (908753, 111245), + (908755, 12624), (908758, 8892), + (908759, 26294), (908764, 32771), + (908766, 27489), (908768, 78738), + (908770, 250), (908778, 6661521), + (908779, 12043), (908780, 20599), + (908781, 8829), (908795, 79664), + (908796, 273988), (908797, 30552), + (908798, 2373), (908802, 47492), + (908803, 6832486), (908809, 250), + (908819, 401017), (908821, 157388), + (908825, 6950000), (908826, 49772), + (908830, 15675), (908833, 17672), + (908834, 33769), (908838, 121973), + (908841, 21076), (908842, 58479), + (908845, 59871), (908851, 196883), + (908852, 14503), (908853, 2040), + (908854, 20988), (908857, 22893), + (908863, 3992), (908871, 92350), + (908879, 29931), (908882, 25349), + (908883, 500), (908884, 3471), + (908885, 58526), (908886, 20000), + (908892, 16481), (908894, 52984), + (908897, 2333), (908907, 3287), + (908910, 2902), (908911, 39334), + (908916, 334988), (908917, 150376), + (908919, 98496), (908920, 357277), + (908926, 2638), (908938, 36958), + (908939, 15859), (908940, 16130), + (908941, 250), (908945, 48551), + (908946, 50148), (908947, 6883), + (908950, 19666), (908956, 16890), + (908962, 25344), (908964, 3471), + (908967, 126660), (908974, 61603), + (908985, 2333), (908987, 18181), + (908989, 5019), (908994, 96148), + (908996, 29590), (908998, 3999), + (908999, 25059), (909008, 52609), + (909014, 3462), (909016, 14275), + (909019, 63485), (909020, 14694), + (909027, 138770), (909030, 75599), + (909044, 23563), (909045, 128566), + (909050, 5798), (909051, 14603), + (909053, 15795), (909054, 32005), + (909055, 10000), (909061, 3471), + (909068, 41068), (909069, 16336), + (909071, 28257), (909079, 2609), + (909083, 184452), (909085, 9934), + (909093, 36858), (909094, 15826), + (909100, 22902), (909109, 5872), + (909112, 2617), (909120, 2930), + (909125, 96264), (909134, 279), + (909135, 13792), (909138, 10272), + (909148, 23262), (909152, 71257), + (909154, 3138), (909157, 21384), + (909164, 525860), (909165, 2862), + (909167, 1920), (909170, 4652), + (909181, 109918), (909188, 38197), + (909189, 143593), (909199, 35567), + (909200, 358681), (909204, 8866), + (909205, 30659), (909211, 71522), + (909214, 59430), (909215, 2049), + (909222, 54617), (909223, 49776), + (909224, 12612), (909229, 43695), + (909235, 10180), (909239, 13186), + (909243, 25480), (909251, 39503), + (909252, 123366), (909258, 19396), + (909264, 10000), (909269, 2328), + (909277, 1146), (909280, 28197), + (909282, 70194), (909283, 21721), + (909284, 6433), (909290, 132985), + (909292, 24481), (909298, 18122), + (909303, 5722), (909313, 2617), + (909315, 3186), (909318, 2609), + (909321, 51116), (909328, 18055), + (909330, 6425), (909336, 4850), + (909344, 85631), (909353, 69274), + (909359, 17905), (909362, 14092), + (909370, 2350), (909387, 265256), + (909390, 3186), (909396, 25473), + (909402, 97200), (909403, 230146), + (909410, 4493), (909412, 250), + (909414, 106530), (909419, 55194), + (909420, 19672), (909423, 41911), + (909430, 6541), (909432, 7334), + (909440, 4455), (909442, 24349), + (909447, 51714), (909448, 147275), + (909449, 226), (909457, 37743), + (909458, 850916), (909460, 2333), + (909468, 5221), (909469, 6040), + (909472, 40706), (909473, 25615), + (909475, 2676), (909477, 68961), + (909478, 12085), (909479, 122819), + (909483, 191995), (909489, 57282), + (909490, 2617), (909502, 138571), + (909505, 449033), (909510, 26422), + (909514, 549660), (909515, 4805), + (909524, 19923), (909525, 45138), + (909530, 171268), (909547, 35969), + (909552, 7523), (909561, 25513), + (909566, 3992), (909567, 5162), + (909574, 22173), (909576, 25037), + (909578, 2111589), (909582, 60715), + (909583, 16086), (909584, 8265), + (909585, 9282), (909586, 8747), + (909590, 4904), (909592, 63990), + (909598, 60467), (909605, 35305), + (909608, 11281), (909612, 3470), + (909621, 147931), (909626, 109093), + (909629, 75664), (909630, 253215), + (909631, 8459), (909641, 13066), + (909642, 17888), (909643, 3186), + (909644, 16979), (909645, 11344), + (909646, 4466), (909648, 23002), + (909651, 207328), (909652, 13326), + (909653, 131421), (909666, 12646), + (909670, 25700), (909675, 33829), + (909677, 141763), (909679, 40319), + (909682, 17077), (909683, 34019), + (909687, 28699), (909705, 124817), + (909709, 129310), (909712, 3755), + (909719, 39881), (909724, 7305), + (909729, 18758), (909731, 66861), + (909734, 254086), (909737, 12536), + (909738, 35097), (909739, 6045), + (909741, 15580), (909747, 202340), + (909749, 27364), (909754, 8531), + (909763, 19829), (909774, 7626), + (909776, 32193), (909779, 412937), + (909781, 53971), (909782, 232233), + (909783, 59321), (909785, 22286), + (909788, 41352), (909790, 31952), + (909802, 7232), (909803, 70262), + (909805, 39555), (909806, 4000), + (909810, 2049), (909814, 215029), + (909817, 21227), (909819, 4877), + (909821, 30926), (909823, 2611), + (909832, 13431), (909837, 41970), + (909843, 6252), (909850, 84867), + (909851, 121018), (909860, 10284), + (909863, 3186), (909864, 20222), + (909865, 192626), (909868, 56420), + (909870, 18746), (909872, 21260), + (909873, 2043), (909876, 12040), + (909878, 43847), (909879, 121085), + (909882, 53729), (909884, 129878), + (909886, 99525), (909887, 7637), + (909888, 2043), (909892, 2536), + (909896, 26312), (909898, 49200), + (909900, 43826), (909906, 118363), + (909912, 132148), (909913, 41029), + (909914, 8260), (909921, 4086), + (909926, 135637), (909932, 15939), + (909933, 2260), (909935, 5499), + (909936, 2450), (909937, 27507), + (909944, 35580), (909951, 58245), + (909954, 39154), (909955, 22054), + (909957, 101074), (909960, 608446), + (909967, 113522), (909972, 14418), + (909973, 2333), (909978, 4657), + (909979, 113188), (909988, 23640), + (909990, 816176), (909993, 907892), + (909996, 18442), (909997, 2450), + (910000, 23909), (910019, 3181), + (910021, 14086), (910022, 2285), + (910025, 6350), (910028, 35125), + (910031, 32320), (910041, 27575), + (910043, 3178), (910051, 39844), + (910054, 10100), (910056, 90226), + (910057, 46906), (910058, 38440), + (910062, 50077), (910067, 10635), + (910070, 23006), (910073, 34086), + (910082, 41777), (910085, 7344), + (910088, 16079), (910093, 112413), + (910094, 76870), (910099, 10000), + (910100, 10121), (910104, 19599), + (910105, 8063), (910108, 139461), + (910110, 8492), (910111, 16204), + (910117, 4343), (910123, 18213), + (910132, 3186), (910134, 11234), + (910146, 4381), (910148, 2048), + (910153, 52502), (910154, 74729), + (910156, 134780), (910162, 557134), + (910167, 25580), (910168, 29012), + (910169, 12043), (910173, 40494), + (910175, 23113), (910181, 77699), + (910189, 30000), (910190, 71559), + (910194, 22951), (910196, 13808), + (910200, 122880), (910221, 5318), + (910222, 3754), (910225, 55196), + (910230, 90619), (910239, 15004), + (910246, 21865), (910250, 16676), + (910252, 62327), (910254, 74922), + (910255, 25513), (910256, 85023), + (910262, 107865), (910263, 36281), + (910272, 3177), (910275, 80000), + (910276, 34664), (910279, 432584), + (910282, 13278), (910284, 35147), + (910285, 10648), (910289, 100804), + (910293, 45776), (910295, 8363), + (910297, 136305), (910298, 19057), + (910303, 2333), (910313, 9043), + (910315, 121461), (910316, 26420), + (910324, 118902), (910328, 12048), + (910330, 3609), (910332, 6207), + (910334, 30797), (910335, 39606), + (910340, 178432), (910344, 100000), + (910347, 22377), (910353, 10000), + (910355, 36637), (910359, 18283), + (910362, 36292), (910366, 78787), + (910368, 94026), (910370, 42388), + (910372, 51892), (910380, 25217), + (910385, 245), (910386, 24907), + (910388, 2862), (910394, 92722), + (910395, 8363), (910398, 62439), + (910400, 48895), (910404, 32831), + (910405, 4376), (910406, 12578), + (910418, 37218), (910419, 2333), + (910424, 7993), (910430, 6235), + (910431, 4382), (910435, 172499), + (910442, 156899), (910447, 20246), + (910449, 5480), (910453, 25904), + (910457, 33777), (910468, 52678), + (910469, 217389), (910470, 5150), + (910472, 25923), (910477, 78290), + (910478, 16768), (910481, 15061), + (910483, 30000), (910489, 58778), + (910490, 546998), (910492, 8424), + (910494, 189079), (910506, 16139), + (910507, 37217), (910512, 37169), + (910514, 83208), (910517, 17655), + (910518, 7035), (910521, 5307), + (910523, 16111), (910525, 51738), + (910529, 67216), (910533, 134122), + (910534, 13325), (910539, 2617), + (910540, 34261), (910553, 14014), + (910555, 17844), (910556, 92484), + (910561, 178971), (910564, 25530), + (910566, 21621), (910569, 126390), + (910572, 26587), (910576, 39164), + (910578, 14376), (910586, 47618), + (910588, 34927), (910591, 2862), + (910592, 73354), (910595, 18490), + (910604, 2861), (910605, 2260), + (910607, 1268025), (910608, 386416), + (910616, 62043), (910621, 16849), + (910626, 25580), (910632, 10000), + (910633, 14376), (910639, 10000), + (910641, 12333), (910646, 30079), + (910647, 14641), (910650, 69824), + (910657, 30407), (910659, 72288), + (910660, 12043), (910662, 15898), + (910664, 16352), (910666, 29161), + (910675, 15798), (910678, 5510), + (910683, 18064), (910689, 39691), + (910693, 39428), (910698, 5190), + (910700, 13462), (910702, 22226), + (910707, 11952), (910714, 85291), + (910718, 7797), (910724, 2104781), + (910726, 40853), (910727, 8597), + (910728, 32723), (910732, 98937), + (910737, 36765), (910741, 42009), + (910744, 12333), (910746, 31321), + (910755, 3755), (910763, 115615), + (910764, 25401), (910769, 2049), + (910772, 16344), (910774, 57580), + (910781, 158287), (910783, 15021), + (910788, 21664), (910792, 36089), + (910806, 2450), (910809, 124292), + (910813, 12168), (910822, 222510), + (910832, 11292), (910839, 6490), + (910840, 130563), (910843, 3992), + (910848, 48365), (910855, 6362), + (910856, 18350), (910857, 7000), + (910864, 242615), (910865, 162180), + (910866, 55062), (910870, 40718), + (910872, 15480), (910873, 7001), + (910874, 25236), (910879, 104905), + (910883, 31863), (910886, 21235), + (910887, 196908), (910888, 14324), + (910892, 43145), (910893, 16871), + (910896, 10000), (910903, 146827), + (910904, 166017), (910906, 40970), + (910911, 52842), (910913, 461558), + (910914, 2536), (910918, 43753), + (910927, 34393), (910931, 183474), + (910951, 24871), (910959, 160371), + (910961, 86774), (910968, 197314), + (910969, 230859), (910970, 7043), + (910971, 12399), (910981, 11246), + (910982, 50504), (910984, 3432), + (910994, 1292653), (910996, 133492), + (910998, 84241), (911001, 30449), + (911019, 44076), (911024, 4206), + (911025, 63960), (911028, 52917), + (911034, 12000), (911038, 3465), + (911039, 4086), (911041, 53441), + (911042, 191878), (911052, 44760), + (911055, 41685), (911059, 12333), + (911063, 14014), (911067, 30000), + (911071, 13422), (911081, 175442), + (911087, 85862), (911090, 78162), + (911093, 83948), (911095, 90898), + (911103, 43587), (911106, 17623), + (911107, 125251), (911108, 11257), + (911116, 10000), (911117, 63856), + (911118, 2040), (911120, 10000), + (911127, 29312), (911128, 124808), + (911130, 61699), (911132, 32871), + (911134, 6518), (911137, 21920), + (911141, 68351), (911150, 433300), + (911152, 31160), (911160, 21837), + (911169, 4086), (911171, 6643), + (911175, 58410), (911181, 245), + (911183, 27662), (911185, 149656), + (911193, 78624), (911204, 19614), + (911205, 238506), (911210, 3471), + (911213, 28402), (911214, 6367), + (911219, 150890), (911222, 114102), + (911231, 195479), (911236, 164068), + (911241, 127565), (911245, 35673), + (911247, 48963), (911250, 14880), + (911255, 23325), (911258, 27529), + (911259, 250), (911260, 2043), + (911262, 40075), (911271, 18042), + (911272, 26149), (911273, 2450), + (911275, 140765), (911276, 328986), + (911278, 48219), (911286, 48675), + (911288, 8364), (911290, 2617), + (911291, 16129), (911296, 6311), + (911300, 13178), (911301, 5733), + (911304, 8125), (911306, 14039), + (911315, 50291), (911316, 3740), + (911317, 4560), (911323, 10000), + (911332, 158022), (911333, 154571), + (911334, 23186), (911340, 12375), + (911341, 33047), (911343, 115307), + (911346, 9800), (911347, 58364), + (911349, 388210), (911350, 31981), + (911354, 21882), (911355, 2049), + (911364, 47698), (911365, 46561), + (911368, 433146), (911372, 32568), + (911373, 4886), (911374, 72604), + (911377, 1399093), (911379, 81459), + (911382, 347), (911384, 28227), + (911385, 3186), (911390, 5514), + (911392, 18364), (911395, 86621), + (911398, 8364), (911404, 3215), + (911406, 22464), (911410, 30973), + (911412, 10104926), (911413, 23047), + (911416, 2922), (911419, 33543), + (911434, 22636), (911440, 16651), + (911442, 5234), (911445, 2430), + (911449, 30516), (911451, 19086), + (911454, 12085), (911457, 15503), + (911460, 2043), (911464, 69610), + (911466, 28210), (911468, 6080), + (911494, 37315), (911497, 29666), + (911498, 2325), (911507, 7488), + (911511, 141183), (911514, 2617), + (911515, 4376), (911516, 10000), + (911527, 31955), (911529, 12111), + (911542, 13155), (911545, 70129), + (911554, 23976), (911558, 14945), + (911561, 32415), (911565, 116548), + (911570, 2324), (911581, 49214), + (911585, 55624), (911592, 24660), + (911594, 31659), (911595, 14944), + (911597, 2352), (911599, 10000), + (911607, 120392), (911608, 8041), + (911613, 11833), (911615, 17680), + (911619, 8790), (911620, 4364), + (911622, 6642), (911625, 2901), + (911630, 39565), (911631, 6032), + (911637, 16590), (911638, 2901), + (911648, 11057), (911651, 5229), + (911653, 328941), (911654, 195337), + (911659, 8043), (911663, 20354), + (911671, 120699), (911673, 3464), + (911674, 145661), (911677, 52659), + (911678, 15077), (911680, 5152), + (911685, 56350), (911687, 14088), + (911693, 15120), (911695, 12665), + (911700, 11266), (911704, 4086), + (911706, 25236), (911715, 8462), + (911718, 19669), (911721, 4628), + (911723, 14825), (911728, 30426), + (911729, 70226), (911741, 10825), + (911742, 113470), (911753, 10730), + (911755, 88663), (911759, 328528), + (911768, 7160), (911775, 299420), + (911789, 27550), (911794, 4949), + (911796, 6689), (911798, 2333), + (911802, 2862), (911808, 4665), + (911809, 58880), (911813, 137329), + (911815, 18192), (911817, 774765), + (911818, 93720), (911825, 11259), + (911834, 4584), (911840, 108152), + (911842, 36392), (911843, 44513), + (911844, 10352), (911856, 107074), + (911859, 11664), (911861, 20380), + (911877, 12049), (911878, 46092), + (911881, 117519), (911886, 13431), + (911888, 479626), (911889, 8364), + (911890, 22282), (911891, 17073), + (911899, 13465), (911904, 44221), + (911905, 143231), (911907, 106901), + (911909, 8024), (911910, 99318), + (911914, 7548), (911915, 14666), + (911918, 21209), (911921, 27624), + (911925, 13178), (911933, 20718), + (911942, 4938), (911947, 11113), + (911955, 13070), (911959, 32434), + (911963, 4086), (911965, 15505), + (911967, 124891), (911972, 28163), + (911973, 37523), (911980, 37653), + (911982, 118238), (911985, 9298), + (911995, 4284), (911996, 48002), + (912000, 47438), (912003, 42394), + (912006, 33711), (912007, 14791), + (912029, 85350), (912033, 1582), + (912035, 22043), (912037, 13983), + (912040, 2617), (912041, 21695), + (912043, 11056), (912046, 52139), + (912050, 102371), (912054, 18197), + (912057, 10000), (912060, 4092), + (912063, 15574), (912065, 11795), + (912074, 10502), (912075, 25824), + (912076, 6035), (912081, 56401), + (912084, 13457), (912087, 1520410), + (912088, 22697), (912090, 7485), + (912092, 279), (912103, 23747), + (912105, 10250), (912108, 56056), + (912110, 3750), (912117, 102929), + (912123, 7108), (912125, 39877), + (912136, 68708), (912142, 60324), + (912143, 14430), (912144, 13755), + (912147, 122617), (912148, 164732), + (912153, 31367), (912161, 278), + (912164, 17079), (912165, 52484), + (912167, 4086), (912171, 21770), + (912177, 21844), (912178, 2617), + (912179, 22098), (912182, 149457), + (912184, 33186), (912186, 10040), + (912199, 154951), (912200, 3755), + (912203, 16088), (912212, 202530), + (912216, 35620), (912217, 28906), + (912220, 172253), (912223, 3721), + (912226, 97060), (912227, 10000), + (912230, 21404), (912232, 5140), + (912235, 43473), (912244, 213362), + (912245, 21461), (912249, 404365), + (912253, 18671), (912255, 113925), + (912258, 18979), (912260, 25580), + (912262, 111452), (912264, 255400), + (912269, 250), (912272, 28455), + (912274, 121486), (912278, 191539), + (912296, 22085), (912300, 250), + (912301, 20000), (912316, 154760), + (912321, 13278), (912326, 31796), + (912332, 29716), (912339, 30864), + (912351, 17597), (912352, 24501), + (912363, 29454), (912366, 10000), + (912367, 31972), (912373, 256238), + (912379, 66073), (912382, 79683), + (912383, 21117), (912392, 34962), + (912401, 30321), (912407, 2043), + (912408, 56941), (912412, 84242), + (912416, 20123), (912418, 10000), + (912419, 37251), (912420, 64206), + (912423, 18800), (912424, 12043), + (912426, 9148), (912427, 20000), + (912429, 30302), (912431, 98288), + (912437, 345), (912439, 9579), + (912440, 6432), (912444, 242094), + (912445, 312), (912452, 54721), + (912454, 14086), (912458, 67139), + (912459, 4629), (912463, 14399), + (912465, 17308), (912467, 72076), + (912469, 20342), (912470, 38315), + (912477, 22636), (912480, 10000), + (912482, 68927), (912492, 368789), + (912495, 29403), (912496, 10254), + (912498, 7271), (912503, 22015), + (912506, 35777), (912507, 4109), + (912508, 75666), (912510, 6982), + (912514, 373694), (912530, 1300240), + (912538, 41593), (912558, 126432), + (912559, 34662), (912572, 85673), + (912574, 53358), (912580, 8994), + (912582, 8984), (912586, 4033), + (912590, 3698), (912601, 10381), + (912611, 24413), (912614, 2928), + (912618, 3470), (912619, 66896), + (912620, 11263), (912621, 10000), + (912633, 38606), (912637, 47127), + (912642, 16750), (912648, 12335), + (912649, 5143), (912652, 133214), + (912655, 2998), (912658, 24266), + (912660, 34847), (912667, 62915), + (912669, 347), (912687, 17290), + (912693, 10000), (912694, 6030), + (912702, 14660), (912712, 83314), + (912715, 44251), (912718, 2048), + (912726, 117889), (912727, 3470), + (912730, 2040), (912731, 61349), + (912775, 68149), (912776, 2040), + (912783, 18737), (912785, 3755), + (912788, 130818), (912792, 2043), + (912794, 2043), (912803, 12043), + (912804, 12316), (912805, 24660), + (912811, 34091), (912812, 71547), + (912822, 31647), (912824, 86937), + (912825, 53866), (912827, 2048), + (912830, 23179), (912831, 24938), + (912838, 66904), (912839, 10000), + (912842, 279), (912845, 10244), + (912848, 21351), (912859, 12450), + (912865, 71483), (912873, 10347), + (912878, 45170), (912879, 1188), + (912880, 24648), (912885, 77128), + (912887, 44743), (912890, 2359), + (912895, 79254), (912896, 30404), + (912897, 57605), (912904, 97345), + (912911, 29069), (912914, 36793), + (912916, 5954), (912921, 114950), + (912942, 147648), (912947, 32135), + (912950, 10000), (912953, 6000), + (912955, 17554), (912960, 712809), + (912967, 1548305), (912981, 6872), + (912988, 66940), (912990, 2174679), + (912996, 2901), (912997, 4707), + (913000, 211556), (913001, 27591), + (913002, 14355), (913007, 204713), + (913011, 128138), (913013, 6129), + (913015, 9993), (913016, 9282), + (913017, 7534), (913021, 2617), + (913040, 12884), (913043, 25161), + (913052, 220944), (913058, 60857), + (913060, 34245), (913061, 8040), + (913067, 19601), (913069, 117802), + (913070, 5797), (913074, 30398), + (913080, 2450), (913082, 20292), + (913089, 3180), (913090, 16650), + (913092, 224991), (913093, 6078), + (913094, 3783), (913095, 4607), + (913099, 384515), (913102, 5639), + (913116, 20427), (913117, 29592), + (913119, 32592), (913121, 40415), + (913125, 279), (913129, 3180), + (913130, 66896), (913135, 43978), + (913140, 5721), (913148, 19275), + (913150, 13870), (913151, 3177), + (913157, 4323), (913163, 102418), + (913169, 6649), (913173, 9314), + (913176, 53185), (913177, 14867), + (913183, 6000), (913189, 22575), + (913202, 103749), (913203, 27383), + (913206, 2617), (913211, 31698), + (913212, 71503), (913215, 6053), + (913217, 2043), (913221, 8510), + (913226, 27051), (913227, 18869), + (913230, 120831), (913231, 15189), + (913232, 69428), (913234, 20000), + (913236, 562787), (913240, 16490), + (913247, 13179), (913258, 10000), + (913259, 3177), (913261, 1146), + (913265, 8570), (913266, 24002), + (913268, 151145), (913269, 6645), + (913270, 139122), (913280, 6495), + (913286, 2536), (913291, 18427), + (913296, 33028), (913306, 38694), + (913310, 175261), (913311, 23865), + (913316, 3206), (913318, 13130), + (913320, 2896), (913325, 35580), + (913332, 31821), (913333, 13427), + (913334, 235000), (913335, 36472), + (913339, 48512), (913341, 23661), + (913349, 12893), (913350, 10000), + (913358, 155038), (913362, 4030), + (913371, 4303), (913372, 4013), + (913374, 61031), (913378, 16076), + (913384, 18596), (913388, 21230), + (913390, 43055), (913394, 6622), + (913395, 96502), (913401, 66226), + (913404, 78651), (913405, 2043), + (913407, 97334), (913414, 216728), + (913416, 5912), (913418, 65576), + (913421, 27228), (913422, 44637), + (913423, 100695), (913429, 11603), + (913431, 13186), (913432, 64848), + (913446, 33240), (913450, 3999), + (913453, 326148), (913454, 98291), + (913458, 28761), (913460, 13499), + (913462, 44892), (913464, 21377), + (913465, 32841), (913471, 77954), + (913477, 50884), (913491, 37258), + (913496, 10754), (913498, 10000), + (913510, 70436), (913517, 15797), + (913520, 42125), (913528, 10000), + (913531, 44901), (913532, 13935), + (913533, 46441), (913542, 29521), + (913546, 10250), (913547, 129278), + (913555, 137730), (913556, 32582), + (913564, 8043), (913570, 34204), + (913571, 15036), (913576, 17258), + (913584, 59103), (913592, 17500), + (913598, 19895), (913599, 61331), + (913600, 44402), (913601, 1808), + (913604, 26791), (913606, 5273), + (913608, 2665), (913609, 131588), + (913611, 7317), (913614, 117066), + (913615, 81312), (913616, 30243), + (913618, 23496), (913632, 79505), + (913634, 4992), (913636, 202088), + (913638, 302750), (913647, 29320), + (913648, 9321), (913650, 10402), + (913651, 33685), (913652, 3186), + (913654, 3282), (913658, 13189), + (913662, 28356), (913668, 134710), + (913672, 4900), (913673, 19036), + (913680, 9318), (913684, 56128), + (913691, 37251), (913694, 73873), + (913695, 37160), (913697, 10665258), + (913700, 57561), (913702, 179813), + (913707, 25708), (913709, 30000), + (913711, 2868), (913717, 225232), + (913726, 13715), (913739, 29402), + (913740, 4086), (913747, 11311), + (913748, 5722), (913749, 23302), + (913750, 16329), (913752, 38629), + (913753, 25171), (913754, 9293), + (913756, 52610), (913761, 74551), + (913766, 12913), (913768, 55303), + (913776, 5518), (913779, 22885), + (913784, 41588), (913785, 4941), + (913787, 7020), (913789, 116036), + (913790, 82835), (913795, 63782), + (913799, 27079), (913800, 113514), + (913805, 2043), (913809, 7556), + (913812, 298212), (913813, 7000), + (913816, 12901), (913817, 28902), + (913824, 2577), (913825, 19324), + (913826, 7001), (913827, 12048), + (913828, 31349), (913829, 85463), + (913831, 2333), (913832, 19604), + (913833, 97429), (913836, 164532), + (913840, 88727), (913841, 12040), + (913845, 6000), (913848, 12043), + (913849, 69507), (913850, 9026), + (913854, 49189), (913860, 22079), + (913861, 228992), (913864, 3746), + (913865, 35680), (913869, 1236518), + (913871, 28364), (913872, 22609), + (913873, 2569), (913876, 3499), + (913877, 2450), (913878, 18027), + (913881, 4493), (913882, 10000), + (913888, 131436), (913893, 232531), + (913895, 6129), (913898, 63262), + (913902, 263801), (913903, 43842), + (913913, 16285), (913914, 83271), + (913915, 72842), (913919, 2043), + (913920, 40716), (913928, 108677), + (913930, 3998), (913936, 143330), + (913941, 16384), (913943, 270276), + (913944, 56458), (913945, 138747), + (913950, 11217), (913953, 5780), + (913954, 18000), (913957, 6708), + (913960, 19886), (913962, 15351), + (913967, 3707), (913969, 2333), + (913974, 4660), (913978, 23179), + (913990, 5619), (913994, 142340), + (914002, 3470), (914004, 8363), + (914007, 3431), (914011, 66904), + (914022, 46653), (914023, 3186), + (914025, 100484), (914031, 5581), + (914033, 18467), (914038, 11363), + (914041, 9722), (914042, 81567), + (914043, 28172), (914044, 2040), + (914046, 45534), (914054, 15122), + (914057, 4657), (914058, 103403), + (914061, 34631), (914064, 8707), + (914065, 25580), (914070, 269757), + (914071, 173758), (914073, 17571), + (914085, 213634), (914088, 3465), + (914090, 89348), (914093, 13750), + (914094, 2410), (914101, 12888), + (914103, 25166), (914114, 15226), + (914116, 147802), (914129, 1430917), + (914135, 177377), (914136, 16849), + (914137, 18122), (914142, 22521), + (914143, 10111), (914149, 21024), + (914150, 40187), (914154, 4783), + (914156, 200604), (914157, 2043), + (914163, 2325), (914164, 13750), + (914165, 40832), (914168, 4399), + (914172, 3422), (914173, 16528), + (914177, 12333), (914180, 54731), + (914181, 3471), (914182, 13471), + (914183, 49636), (914185, 29612), + (914186, 68052), (914187, 34599), + (914188, 29539), (914192, 10000), + (914196, 24652), (914200, 237241), + (914204, 16652), (914205, 8558), + (914206, 2260), (914207, 107979), + (914216, 69357), (914217, 13707), + (914218, 10250), (914222, 36747), + (914227, 118147), (914229, 11792), + (914232, 33822), (914233, 4887), + (914234, 18333), (914239, 12319), + (914240, 4086), (914241, 34200), + (914243, 19375), (914245, 5798), + (914247, 36089), (914249, 4039), + (914259, 15221), (914260, 4453), + (914262, 6135), (914267, 62471), + (914270, 157648), (914271, 67506), + (914272, 13146), (914273, 24500), + (914278, 97455), (914284, 46380), + (914286, 3186), (914295, 27000), + (914300, 122678), (914306, 134170), + (914318, 50520), (914319, 114009), + (914328, 16780), (914332, 30334), + (914339, 96366), (914349, 24660), + (914351, 45022), (914352, 7000), + (914355, 621290), (914358, 14000), + (914360, 107523), (914365, 25984), + (914366, 6252), (914367, 12350), + (914368, 18191), (914374, 18473), + (914375, 19088), (914377, 366356), + (914385, 357679), (914387, 66835), + (914391, 73881), (914392, 20470), + (914393, 2043), (914399, 1146), + (914401, 6105), (914402, 10215), + (914409, 7848), (914415, 4317), + (914417, 13749), (914423, 10000), + (914424, 14014), (914428, 42726), + (914430, 6926), (914431, 352115), + (914435, 103747), (914436, 122712), + (914437, 511705), (914439, 6660), + (914444, 16346), (914448, 4102), + (914454, 1347996), (914459, 13539), + (914462, 31685), (914464, 6308), + (914465, 7822), (914467, 47942), + (914468, 12902), (914474, 8024), + (914475, 28825), (914482, 7635), + (914484, 339554), (914486, 24332), + (914489, 11920), (914493, 27850), + (914500, 37590), (914502, 17665), + (914506, 66987), (914510, 142829), + (914531, 21174), (914533, 22814), + (914535, 170017), (914538, 339770), + (914539, 70687), (914543, 35246), + (914552, 52740), (914554, 15580), + (914555, 163937), (914556, 2049), + (914557, 31160), (914558, 125165), + (914560, 12565), (914564, 95847), + (914573, 52180), (914575, 9369), + (914576, 2043), (914577, 176507), + (914584, 123566), (914587, 65482), + (914590, 17408), (914592, 76912), + (914593, 98617), (914599, 31046), + (914602, 47830), (914605, 116461), + (914608, 191255), (914612, 72348), + (914614, 26533), (914617, 56095), + (914621, 462145), (914631, 188752), + (914632, 18904), (914635, 75901), + (914638, 18743), (914644, 125988), + (914645, 27109), (914646, 56561), + (914647, 21396), (914653, 19717), + (914655, 115216), (914661, 39612), + (914663, 1294390), (914666, 415), + (914667, 10630), (914670, 6782), + (914672, 124954), (914673, 3454), + (914682, 13499), (914683, 18125), + (914684, 14671), (914685, 16447), + (914687, 5799), (914694, 29269), + (914695, 16043), (914696, 3920), + (914698, 4136), (914702, 79801), + (914704, 242932), (914710, 30771), + (914715, 97345), (914716, 30), + (914717, 26684), (914721, 6700), + (914723, 10030), (914725, 33806), + (914726, 2043), (914728, 65957), + (914730, 61475), (914732, 22610), + (914733, 3471), (914740, 78129), + (914744, 30477), (914749, 2450), + (914751, 100000), (914756, 99599), + (914757, 6832), (914763, 4031), + (914767, 5739), (914770, 12356), + (914774, 36017), (914782, 14039), + (914790, 117706), (914793, 14083), + (914796, 35518), (914797, 14987), + (914811, 5251), (914815, 6442), + (914822, 22341), (914828, 18136), + (914829, 17000), (914831, 68411), + (914844, 82468), (914846, 11594), + (914850, 10802), (914851, 2043), + (914855, 10692182), (914857, 170442), + (914858, 2043), (914862, 174584), + (914863, 2896), (914866, 12277), + (914871, 15628), (914872, 20136), + (914876, 241820), (914881, 15676), + (914886, 149162), (914889, 23323), + (914896, 6468), (914901, 171096), + (914911, 163136), (914914, 1146), + (914916, 4048), (914918, 2902), + (914924, 45026), (914936, 3763), + (914939, 100213), (914940, 34968), + (914949, 19278), (914950, 24617), + (914951, 137783), (914955, 16370), + (914964, 135175), (914968, 12040), + (914983, 20697), (914994, 18005), + (914997, 18174), (914999, 32333), + (915011, 50247), (915014, 75453), + (915027, 10407), (915028, 34240), + (915039, 10505), (915041, 12375), + (915042, 37448), (915044, 16703), + (915048, 2049), (915052, 35764), + (915055, 7786), (915061, 4092), + (915062, 185504), (915070, 18458), + (915071, 24515), (915074, 2043), + (915076, 2450), (915078, 10243), + (915079, 19051), (915080, 4086), + (915082, 13824), (915083, 86249), + (915085, 81219), (915086, 14992), + (915094, 80090), (915095, 26419), + (915104, 37819), (915111, 144306), + (915112, 2609), (915114, 37080), + (915117, 36495), (915122, 20781), + (915132, 10787), (915134, 48509), + (915136, 61936), (915139, 125070), + (915144, 129963), (915154, 37463), + (915158, 9188), (915164, 10000), + (915170, 123726), (915174, 2049), + (915175, 2043), (915184, 60375), + (915188, 100000), (915189, 3716), + (915195, 60215), (915200, 31271), + (915204, 3592414), (915208, 10032), + (915210, 4892), (915211, 100583), + (915216, 2043), (915217, 5868), + (915221, 33430), (915226, 28596), + (915227, 54668), (915229, 2049), + (915232, 26608), (915234, 55433), + (915237, 8229), (915238, 293214), + (915247, 244433), (915249, 42970), + (915251, 38515), (915256, 4580), + (915263, 3462), (915265, 2333), + (915266, 2350), (915268, 39351), + (915269, 726384), (915281, 124198), + (915282, 26771), (915283, 7901), + (915284, 2048), (915291, 5410), + (915293, 27517), (915296, 32147), + (915306, 145849), (915313, 2450), + (915314, 79658), (915318, 139402), + (915329, 27666), (915332, 19161), + (915335, 23449), (915337, 94329), + (915341, 305470), (915346, 7217), + (915347, 10000), (915348, 220697), + (915351, 146367), (915363, 3750), + (915364, 147713), (915367, 118900), + (915368, 30477), (915369, 14652), + (915379, 4086), (915381, 42333), + (915382, 11542), (915383, 280446), + (915388, 36041), (915391, 8738), + (915392, 20169), (915397, 96831), + (915400, 373909), (915401, 27348), + (915423, 54995), (915428, 32327), + (915430, 83754), (915432, 20000), + (915433, 12812), (915434, 7664), + (915441, 10000), (915446, 90186), + (915453, 102901), (915456, 120460), + (915458, 84748), (915467, 2901), + (915468, 16116), (915470, 16350), + (915485, 113401), (915486, 86421), + (915491, 10000), (915497, 436296), + (915500, 18592), (915505, 12901), + (915507, 6009), (915508, 147517), + (915509, 25380), (915513, 87450), + (915520, 100159), (915521, 6299), + (915522, 12831), (915524, 128795), + (915533, 2043), (915541, 5816), + (915544, 38784), (915550, 104693), + (915553, 14040), (915558, 87062), + (915564, 138580), (915566, 2350), + (915567, 10731), (915573, 4039), + (915576, 32998), (915581, 2325), + (915587, 4039), (915591, 31881), + (915604, 20290), (915608, 10000), + (915614, 9719), (915615, 96564), + (915617, 75644), (915623, 134198), + (915628, 226828), (915629, 56209), + (915630, 27258), (915634, 29790), + (915636, 11393), (915641, 767067), + (915642, 24060), (915646, 1068354), + (915651, 1403714), (915654, 34623), + (915661, 7000), (915663, 2930), + (915668, 50326), (915669, 96428), + (915670, 15307), (915673, 276777), + (915679, 29506), (915681, 20964), + (915695, 287000), (915697, 43905), + (915704, 72974), (915706, 36345), + (915713, 24164), (915721, 81912), + (915737, 42337), (915744, 14749), + (915746, 151508), (915748, 3999), + (915749, 4660), (915750, 73323), + (915754, 49542), (915755, 6602), + (915757, 24740), (915769, 21830), + (915770, 14789), (915771, 59143), + (915795, 44613), (915797, 12780), + (915799, 400478), (915800, 4892), + (915804, 6000), (915805, 20123), + (915810, 66115), (915818, 5239), + (915819, 266771), (915822, 36242), + (915824, 74226), (915827, 34414), + (915836, 6190), (915837, 18642), + (915839, 186460), (915843, 13969), + (915850, 29698), (915856, 151187), + (915860, 24707), (915861, 88183), + (915864, 9292), (915870, 91090), + (915873, 9114), (915875, 14083), + (915880, 48558), (915884, 18694), + (915886, 31614), (915887, 66912), + (915898, 13747), (915900, 49992), + (915911, 122943), (915917, 30943), + (915920, 356316), (915925, 12043), + (915926, 196523), (915940, 19159), + (915941, 16167), (915946, 32800), + (915950, 31706), (915957, 42004), + (915959, 49324), (915961, 333641), + (915974, 11146), (915976, 11792), + (915983, 9045), (915984, 10000), + (915989, 54783), (916007, 1502911), + (916008, 45762), (916011, 100000), + (916015, 27311), (916020, 20347), + (916030, 4261), (916034, 12689), + (916035, 181067), (916036, 808437), + (916046, 83378), (916047, 4367), + (916053, 11181), (916054, 27388), + (916057, 10508), (916058, 890526), + (916059, 10000), (916060, 149396), + (916064, 174004), (916067, 944423), + (916068, 12762), (916069, 116694), + (916081, 30000), (916083, 32057), + (916085, 11920), (916089, 13591), + (916095, 104705), (916102, 2048), + (916103, 26398), (916105, 245), + (916107, 341916), (916108, 233193), + (916109, 33265), (916110, 100319), + (916117, 377), (916120, 8056), + (916123, 140227), (916128, 21942), + (916130, 1023018), (916131, 2450), + (916133, 34013), (916139, 66913), + (916142, 255399), (916145, 313), + (916146, 7000), (916150, 21708), + (916152, 31122), (916163, 28219), + (916164, 2048), (916165, 49941), + (916173, 4086), (916178, 76463), + (916180, 2043), (916184, 4086), + (916185, 44842), (916189, 145720), + (916194, 327273), (916196, 33362), + (916197, 54154), (916200, 284249), + (916206, 310981), (916209, 2350), + (916210, 71781), (916212, 22763), + (916218, 247456), (916226, 24780), + (916229, 10279), (916238, 10000), + (916241, 58000), (916242, 68685), + (916246, 4393), (916247, 10347), + (916257, 20141), (916263, 571944), + (916266, 23813), (916267, 7547), + (916273, 2043), (916274, 66896), + (916275, 278), (916276, 116799), + (916281, 2043), (916286, 10527), + (916289, 23650), (916295, 30272), + (916296, 14047), (916300, 15580), + (916301, 23087), (916302, 101930), + (916305, 123426), (916309, 255638), + (916318, 210444), (916321, 146031), + (916326, 10030), (916331, 32421), + (916340, 19429), (916341, 18245), + (916343, 10000), (916350, 520512), + (916351, 39396), (916355, 253925), + (916356, 30), (916358, 29558), + (916359, 4919), (916360, 363481), + (916365, 75369), (916366, 300728), + (916369, 26115), (916371, 4317), + (916378, 36870), (916380, 69742), + (916388, 4038), (916397, 56190), + (916404, 25886), (916410, 280401), + (916413, 1045), (916420, 81234), + (916422, 14891), (916423, 12048), + (916429, 70165), (916433, 62253), + (916442, 15780), (916446, 13868), + (916447, 21779), (916448, 6114), + (916451, 7469), (916454, 32304), + (916456, 13503), (916457, 14033), + (916464, 328831), (916465, 15366), + (916469, 2137057), (916475, 15283), + (916480, 42165), (916481, 867052), + (916488, 39777), (916489, 7000), + (916491, 158464), (916493, 6086), + (916494, 180373), (916499, 45345), + (916500, 6597), (916506, 8295), + (916510, 108959), (916516, 84089), + (916523, 17583), (916526, 568951), + (916527, 8538), (916533, 5753), + (916535, 8168), (916537, 119816), + (916550, 117425), (916554, 23814), + (916555, 238819), (916556, 16363), + (916557, 16235), (916559, 10543), + (916563, 14658), (916567, 10854), + (916569, 21878), (916574, 13420), + (916578, 140592), (916579, 1285903), + (916582, 14086), (916587, 2260), + (916596, 12292), (916599, 12600), + (916608, 2040), (916616, 6434), + (916623, 47878), (916624, 117037), + (916628, 465323), (916629, 102395), + (916631, 18455), (916635, 2690), + (916637, 16438), (916638, 12355), + (916641, 10244), (916642, 2260), + (916643, 239872), (916644, 1146), + (916646, 13472), (916647, 18116), + (916648, 2043), (916652, 5666), + (916655, 169908), (916674, 25580), + (916684, 175301), (916696, 39562), + (916705, 133067), (916713, 1146), + (916714, 767134), (916716, 17422), + (916717, 104158), (916720, 236273), + (916721, 112571), (916723, 70302), + (916724, 21004), (916729, 10380), + (916730, 67558), (916732, 36337), + (916736, 13917), (916737, 36218), + (916741, 18269), (916744, 44433), + (916745, 22445), (916752, 68939), + (916757, 26516), (916759, 18012), + (916760, 5822), (916767, 597), + (916768, 58157), (916772, 6995), + (916781, 761311), (916789, 125580), + (916790, 684361), (916794, 83289), + (916799, 2332), (916800, 102870), + (916808, 28082), (916810, 12043), + (916813, 108545), (916818, 250), + (916821, 5567), (916825, 17623), + (916830, 41828), (916843, 52111), + (916847, 2031), (916849, 245), + (916853, 18728), (916860, 22569), + (916862, 53685), (916866, 25103), + (916872, 19023), (916874, 119426), + (916875, 14791), (916883, 19666), + (916884, 106347), (916893, 113183), + (916901, 4960), (916902, 16533), + (916905, 58000), (916907, 32475), + (916908, 169542), (916909, 39748), + (916911, 174619), (916913, 23745), + (916915, 35617), (916926, 536722), + (916929, 2043), (916931, 102199), + (916932, 52850), (916933, 17723), + (916935, 150492), (916941, 39064), + (916946, 191063), (916948, 92688), + (916951, 7722), (916953, 51539), + (916965, 6000), (916966, 13268), + (916974, 576812), (916978, 52438), + (916982, 199894), (916984, 29118), + (916987, 2048), (916994, 24763), + (916997, 13701), (917009, 43855), + (917015, 589266), (917018, 2048), + (917021, 2450), (917023, 29903), + (917024, 6000), (917027, 34099), + (917030, 49917), (917038, 76254), + (917039, 28004), (917046, 13569), + (917047, 13876), (917048, 752092), + (917052, 66143), (917053, 414), + (917062, 162398), (917068, 76599), + (917075, 137000), (917077, 8234), + (917078, 53390), (917082, 5250), + (917087, 2616), (917090, 10956), + (917093, 18120), (917101, 83017), + (917107, 26583), (917108, 40000), + (917113, 51780), (917114, 25454), + (917119, 86293), (917136, 15580), + (917141, 30452), (917143, 125670), + (917144, 69781), (917155, 19551), + (917158, 10994), (917174, 4536), + (917178, 9726), (917179, 28954), + (917180, 2048), (917184, 32332), + (917189, 67199), (917190, 73789), + (917194, 137673), (917198, 34030), + (917199, 18160), (917201, 32884), + (917203, 2043), (917206, 214332), + (917214, 13686), (917215, 20281), + (917220, 7000), (917222, 16020), + (917224, 100000), (917232, 27411), + (917233, 3547), (917235, 49429), + (917238, 24364), (917239, 16864), + (917243, 14829), (917245, 47860), + (917246, 4367), (917247, 92189), + (917251, 15610), (917255, 7380), + (917259, 64063), (917261, 16894), + (917266, 4800), (917267, 225869), + (917268, 68916), (917271, 191681), + (917272, 347), (917273, 92274), + (917275, 13653), (917278, 33823), + (917279, 106793), (917281, 156374), + (917283, 85892), (917286, 40568), + (917294, 7372), (917299, 2901), + (917302, 14372), (917303, 27089), + (917304, 17150), (917308, 67133), + (917322, 18196), (917329, 36418), + (917330, 3269), (917338, 69005), + (917340, 10268), (917342, 2048), + (917354, 30657), (917357, 17469), + (917360, 2901), (917369, 7000), + (917377, 9936), (917378, 51788), + (917387, 32043), (917388, 103834), + (917393, 2998), (917396, 190647), + (917397, 2617), (917399, 247923), + (917401, 10000), (917403, 31663), + (917406, 2324), (917409, 58838), + (917411, 23324), (917412, 24030), + (917418, 32901), (917426, 4086), + (917427, 17102), (917438, 21470), + (917446, 28197), (917449, 3739), + (917453, 39050), (917464, 3400), + (917467, 70982), (917468, 28858), + (917470, 166213), (917472, 4944), + (917474, 164894), (917476, 336450), + (917478, 19933), (917479, 18115), + (917481, 8405), (917482, 75019), + (917483, 15802), (917488, 3461), + (917489, 4086), (917504, 2450), + (917511, 1524206), (917512, 4855), + (917518, 126442), (917524, 26564), + (917538, 44325), (917543, 2901), + (917545, 71356), (917547, 82189), + (917549, 8178), (917555, 2048), + (917559, 143533), (917560, 25637), + (917563, 18690), (917564, 33185), + (917570, 28609), (917575, 35783), + (917582, 242132), (917585, 5161), + (917586, 137419), (917590, 22191), + (917593, 7219), (917594, 39596), + (917597, 18562), (917605, 25666), + (917608, 13320), (917612, 38367), + (917613, 6181), (917614, 5831778), + (917615, 148859), (917626, 1043518), + (917636, 20000), (917647, 20365), + (917648, 23965), (917650, 47250), + (917657, 5179), (917658, 31562), + (917660, 2048), (917661, 26440), + (917665, 19877), (917666, 20016), + (917670, 207459), (917675, 16151), + (917680, 39036), (917682, 91325), + (917688, 26655), (917694, 62852), + (917695, 10000), (917697, 3470), + (917698, 10000), (917701, 66879), + (917705, 123031), (917707, 32023), + (917711, 8222), (917712, 3754), + (917713, 21260), (917725, 31128), + (917729, 19068), (917730, 93913), + (917733, 24887), (917735, 47258), + (917740, 24158), (917749, 2043), + (917751, 17847), (917753, 8172), + (917765, 19749), (917767, 3177), + (917769, 3720), (917773, 19059), + (917775, 100503), (917777, 18070), + (917780, 44911), (917782, 20735), + (917799, 9569), (917804, 7000), + (917806, 38663), (917810, 11140), + (917826, 253945), (917828, 2043), + (917829, 65142), (917835, 1146), + (917839, 91847), (917842, 6791), + (917851, 250), (917852, 7582), + (917856, 219971), (917859, 11461), + (917862, 2450), (917866, 22477), + (917874, 7191), (917875, 67514), + (917883, 272614), (917897, 8667), + (917898, 221657), (917913, 21362), + (917914, 81639), (917915, 20000), + (917918, 21960), (917924, 4703), + (917926, 1130), (917928, 77720), + (917934, 9991), (917937, 35424), + (917938, 85542), (917942, 15830), + (917946, 39602), (917952, 49560), + (917954, 13054), (917956, 1146), + (917957, 8824), (917961, 12841), + (917963, 326999), (917964, 865761), + (917965, 3462), (917966, 83572), + (917968, 110618), (917969, 67170), + (917974, 14031), (917976, 10000), + (917977, 24197), (917980, 124763), + (917988, 111929), (917989, 128628), + (917994, 29333), (917999, 136540), + (918014, 214808), (918016, 10000), + (918020, 156593), (918023, 4116), + (918024, 9080), (918026, 33610), + (918028, 16080), (918029, 20944), + (918030, 254888), (918036, 51837), + (918046, 29486), (918048, 183581), + (918050, 35810), (918051, 102023), + (918052, 2450), (918054, 3471), + (918056, 22313), (918058, 137459), + (918071, 3740), (918086, 43713), + (918090, 7775), (918092, 8407), + (918097, 14124), (918101, 4157), + (918103, 12536), (918104, 16489), + (918105, 2450), (918116, 3954), + (918119, 13683), (918130, 44303), + (918138, 22116), (918139, 17935), + (918140, 3195), (918143, 27982), + (918146, 15348), (918151, 41997), + (918153, 5912), (918155, 14696), + (918162, 23399), (918168, 50561), + (918171, 14050), (918185, 2043), + (918189, 10000), (918194, 38049), + (918195, 15798), (918201, 122476), + (918207, 10311), (918210, 37714), + (918211, 2049), (918222, 1920), + (918223, 22499), (918224, 19736), + (918229, 3471), (918236, 30430), + (918244, 1313080), (918246, 15547), + (918248, 6000), (918249, 100000), + (918252, 3430), (918264, 6985), + (918265, 67170), (918268, 28076), + (918290, 2043), (918295, 10054028), + (918298, 2333), (918301, 49621), + (918310, 23012), (918315, 29978), + (918319, 15386), (918322, 8064), + (918331, 33018), (918332, 77701), + (918336, 3808), (918342, 83165), + (918347, 14475), (918349, 10000), + (918353, 5671), (918355, 8373), + (918357, 1700), (918359, 2617), + (918363, 42921), (918367, 1146), + (918369, 85175), (918372, 107011), + (918378, 119378), (918388, 41088), + (918391, 2325), (918393, 47473), + (918399, 37837), (918400, 3240), + (918401, 4086), (918413, 12489), + (918424, 7213), (918430, 4140), + (918431, 80031), (918434, 117392), + (918440, 30000), (918451, 12636), + (918457, 9033), (918458, 7110), + (918467, 22950), (918468, 17556), + (918480, 36924), (918483, 21052), + (918485, 85370), (918486, 73900), + (918489, 22526), (918497, 2617), + (918499, 17905), (918500, 4967), + (918502, 2040), (918503, 3186), + (918507, 2501), (918512, 58666), + (918515, 2043), (918520, 274187), + (918525, 14666), (918531, 15580), + (918532, 2617), (918533, 2450), + (918537, 10000), (918543, 29082), + (918545, 12330), (918553, 28197), + (918556, 6394), (918559, 2043), + (918560, 3750), (918561, 20162), + (918573, 5722), (918582, 42049), + (918594, 13546), (918596, 11877), + (918597, 13471), (918604, 113509), + (918620, 9255), (918622, 97041), + (918623, 20174), (918632, 3178), + (918634, 17579), (918639, 10000), + (918643, 8271), (918646, 9408), + (918648, 300608), (918651, 2043), + (918652, 5798), (918653, 13301), + (918657, 25725), (918663, 820229), + (918676, 2043), (918679, 28477), + (918690, 48744), (918695, 4921), + (918698, 5474), (918701, 40281), + (918705, 2260), (918708, 2612), + (918709, 10000), (918713, 5722), + (918724, 2578), (918733, 12967), + (918735, 6367), (918739, 8972), + (918743, 4600), (918748, 19241), + (918751, 6000), (918754, 16328), + (918757, 28592), (918759, 32984), + (918761, 13187), (918766, 3187), + (918784, 21421), (918785, 222132), + (918786, 60942), (918798, 178589), + (918806, 220156), (918812, 111985), + (918813, 36453), (918817, 1659939), + (918818, 3755), (918819, 20034), + (918821, 69481), (918833, 42949), + (918835, 6483), (918850, 37614), + (918855, 25821), (918858, 15568), + (918865, 8720), (918871, 16000), + (918875, 17588), (918876, 5514), + (918878, 10000), (918880, 30544), + (918889, 11996), (918892, 10000), + (918895, 3239), (918900, 82853), + (918901, 551604), (918902, 3747), + (918905, 7840), (918909, 16647), + (918910, 24083), (918915, 15462), + (918916, 15798), (918920, 4652), + (918921, 2450), (918933, 120741), + (918944, 29806), (918947, 30019), + (918953, 175347), (918954, 115440), + (918960, 16919), (918964, 20868), + (918969, 89261), (918975, 14739), + (918976, 37921), (918978, 20643), + (918981, 105533), (918982, 250), + (918985, 160397), (918997, 14893), + (919003, 5810), (919004, 34549), + (919007, 100000), (919008, 590884), + (919013, 28100), (919022, 410037), + (919023, 41892), (919028, 22968), + (919036, 218), (919045, 11515), + (919050, 29865), (919051, 18150), + (919052, 8523), (919054, 120113), + (919057, 8069), (919071, 107824), + (919075, 60993), (919076, 4324), + (919081, 4404), (919082, 45353), + (919085, 10000), (919091, 250), + (919095, 18271), (919097, 70960), + (919101, 534467), (919105, 12159), + (919107, 117047), (919108, 65507), + (919109, 163820), (919111, 360851), + (919121, 144893), (919124, 18285), + (919129, 340700), (919130, 62869), + (919135, 89554), (919143, 61160), + (919148, 13187), (919155, 17873), + (919157, 358692), (919160, 18116), + (919162, 116811), (919163, 2043), + (919164, 5936), (919176, 24304), + (919177, 13540), (919178, 22741), + (919179, 30715), (919187, 76967), + (919195, 36924), (919203, 7816), + (919204, 7981), (919210, 51629), + (919216, 7496), (919229, 305234), + (919236, 42553), (919240, 14980), + (919244, 109397), (919250, 29787), + (919252, 285142), (919266, 85740), + (919269, 15462), (919270, 5414), + (919304, 10000), (919308, 75101), + (919310, 246078), (919312, 18767), + (919315, 9510), (919317, 14609), + (919318, 91230), (919321, 59344), + (919328, 69365), (919335, 35416), + (919339, 111809), (919353, 50044), + (919356, 44455), (919357, 69161), + (919365, 147638), (919373, 2260), + (919384, 1313), (919385, 314098), + (919390, 18129), (919394, 524873), + (919395, 8172), (919396, 14517), + (919405, 88547), (919409, 16780), + (919423, 235888), (919425, 11029), + (919427, 59350), (919430, 10494), + (919432, 10384), (919445, 16346), + (919464, 2043), (919467, 119173), + (919469, 1870), (919477, 76363), + (919479, 469785), (919480, 53342), + (919481, 4772), (919483, 2539), + (919487, 4585), (919494, 44943), + (919495, 1920), (919502, 37163), + (919523, 2043), (919537, 11609), + (919538, 694404), (919546, 79777), + (919548, 15974), (919549, 16517), + (919550, 19681), (919557, 202325), + (919562, 14086), (919566, 30215), + (919567, 150922), (919572, 11695), + (919577, 12450), (919579, 34880), + (919580, 67453), (919584, 24086), + (919588, 27709), (919593, 12250), + (919595, 6605), (919608, 35580), + (919615, 57491), (919618, 30279), + (919623, 12049), (919626, 10000), + (919643, 2260), (919649, 15580), + (919650, 2043), (919658, 30243), + (919660, 38243), (919662, 56660), + (919670, 10000), (919673, 16129), + (919679, 68389), (919681, 10000), + (919682, 59250), (919687, 2043), + (919700, 13979), (919701, 4092), + (919707, 16419), (919710, 5737), + (919712, 37198), (919718, 279), + (919723, 410535), (919730, 27740), + (919734, 80839), (919742, 2695), + (919747, 4331), (919748, 15100), + (919755, 17629), (919756, 16534), + (919758, 245), (919759, 6850), + (919764, 35425), (919767, 2260), + (919775, 458774), (919780, 22341), + (919783, 14757), (919787, 244), + (919790, 12328), (919795, 1389741), + (919796, 12375), (919797, 50583), + (919799, 415217), (919800, 4658), + (919801, 81403), (919806, 24811), + (919807, 22353), (919811, 74600), + (919820, 209245), (919830, 14399), + (919837, 70889), (919868, 112043), + (919873, 22355), (919881, 2224346), + (919887, 3969), (919888, 6425), + (919892, 50500), (919893, 230838), + (919896, 10000), (919904, 11344), + (919906, 16000), (919909, 1666244), + (919910, 279), (919913, 61586), + (919914, 7134), (919915, 6126), + (919916, 27110), (919921, 194059), + (919947, 245), (919949, 2288), + (919957, 10200), (919963, 20345), + (919965, 4086), (919970, 449), + (919974, 20073), (919976, 13634), + (919986, 42733), (919987, 10279), + (919996, 163211), (920012, 4086), + (920014, 4500), (920015, 20000), + (920024, 46154), (920025, 3189), + (920026, 8048), (920034, 38096), + (920036, 10000), (920047, 29621), + (920049, 2537), (920051, 114383), + (920058, 24465), (920062, 1528841), + (920074, 6438), (920076, 287760), + (920079, 729562), (920095, 130637), + (920096, 16773), (920097, 15287), + (920101, 10000), (920112, 22148), + (920119, 37918), (920122, 530000), + (920123, 59986), (920132, 11920), + (920142, 510449), (920148, 109185), + (920150, 2501), (920153, 26000), + (920154, 20867), (920159, 4086), + (920165, 2700), (920176, 30107), + (920183, 23175), (920185, 32450), + (920187, 18193), (920188, 76760), + (920189, 2863375), (920194, 65880), + (920204, 3740), (920206, 5339), + (920214, 11358), (920219, 170348), + (920221, 212823), (920223, 25762), + (920229, 68915), (920231, 57294), + (920232, 6434), (920249, 25923), + (920250, 130), (920252, 15409), + (920260, 77299), (920264, 2049), + (920265, 2328), (920282, 321604), + (920288, 8240), (920291, 64821), + (920292, 16977), (920303, 68961), + (920307, 8780), (920310, 22592), + (920316, 67266), (920317, 10000), + (920318, 3270), (920321, 279), + (920324, 52844), (920326, 25859), + (920327, 4649), (920334, 3287), + (920343, 85935), (920345, 24260), + (920363, 522349), (920365, 10000), + (920372, 76912), (920373, 30000), + (920374, 21709), (920386, 70888), + (920388, 141814), (920401, 3740), + (920404, 13400), (920407, 32536), + (920408, 22085), (920410, 2049), + (920413, 10800), (920415, 18178), + (920421, 14351), (920431, 119414), + (920433, 115805), (920438, 488972), + (920442, 33554), (920443, 100000), + (920448, 200000), (920457, 33376), + (920459, 2660), (920464, 10618), + (920465, 31578), (920473, 16415), + (920474, 18911), (920475, 2617), + (920480, 37814), (920481, 6129), + (920483, 33048), (920484, 2043), + (920485, 151983), (920487, 28177), + (920496, 119990), (920497, 103899), + (920498, 81673), (920499, 45165), + (920524, 22861), (920534, 191226), + (920536, 29749), (920540, 69575), + (920545, 29364), (920550, 21363), + (920551, 102356), (920555, 18882), + (920559, 118456), (920564, 12364), + (920566, 252175), (920571, 36130), + (920574, 245), (920585, 16129), + (920587, 27371), (920590, 10466180), + (920594, 127924), (920595, 20405), + (920597, 28362), (920603, 233431), + (920605, 33191), (920611, 74073), + (920613, 101929), (920617, 50175), + (920622, 33976), (920624, 222973), + (920627, 19042), (920628, 213037), + (920640, 6950), (920644, 35176), + (920646, 127190), (920647, 8363), + (920654, 11569), (920659, 37192), + (920660, 4567), (920667, 24331), + (920672, 20000), (920676, 43348), + (920679, 111819), (920681, 10344), + (920683, 42650), (920689, 56402), + (920694, 43079), (920695, 313), + (920698, 142804), (920703, 2040), + (920704, 4398), (920712, 45947), + (920715, 40000), (920737, 14354), + (920738, 10000), (920741, 70259), + (920742, 27031), (920747, 10000), + (920756, 18808), (920760, 14627), + (920765, 23395), (920766, 30087), + (920769, 22960), (920776, 2048), + (920780, 17623), (920782, 10000), + (920784, 6776), (920786, 10000), + (920787, 35371), (920793, 6160), + (920794, 655894), (920799, 180832), + (920801, 10380), (920803, 22455), + (920804, 10989), (920807, 18610), + (920808, 10000), (920811, 63687), + (920824, 16838), (920825, 736417), + (920829, 37428), (920835, 26384), + (920865, 16550), (920875, 36851), + (920876, 6810), (920891, 4032), + (920895, 145549), (920897, 2043), + (920901, 15580), (920912, 41188), + (920915, 10000), (920918, 71), + (920924, 47125), (920926, 32812), + (920929, 32423), (920930, 9999), + (920938, 19482), (920940, 566961), + (920941, 10000), (920952, 8363), + (920957, 114091), (920959, 250), + (920965, 54188), (920967, 10881), + (920970, 3311988), (920975, 26209), + (920985, 21525), (920989, 44058), + (921002, 636606), (921004, 2450), + (921006, 37423), (921009, 202034), + (921014, 346974), (921015, 17089), + (921018, 58455), (921019, 101372), + (921023, 39430), (921024, 117693), + (921034, 76621), (921043, 29380), + (921048, 11589), (921060, 34590), + (921062, 279), (921069, 33008), + (921073, 44220), (921083, 6000), + (921091, 10622), (921098, 3400), + (921100, 6000), (921102, 12288), + (921106, 11540), (921112, 149567), + (921116, 49101), (921117, 13550), + (921121, 2180745), (921132, 2260), + (921135, 79095), (921142, 2048), + (921145, 279), (921147, 43471), + (921158, 47332), (921159, 41996), + (921163, 12048), (921164, 164588), + (921166, 61007), (921169, 499056), + (921170, 8834), (921174, 30838), + (921178, 17628), (921189, 299436), + (921192, 42521), (921197, 10000), + (921201, 172080), (921206, 20800), + (921208, 164963), (921213, 50332), + (921221, 20000), (921227, 37471), + (921238, 372012), (921244, 6947), + (921248, 2350), (921249, 32520), + (921255, 111649), (921259, 6000), + (921260, 74324), (921267, 212480), + (921268, 9815), (921278, 19269), + (921285, 18225), (921292, 29699), + (921293, 25571), (921294, 333443), + (921300, 16220), (921308, 11458), + (921314, 58126), (921320, 38381), + (921321, 287591), (921324, 15339), + (921328, 111410), (921331, 39251), + (921334, 32043), (921350, 63490), + (921353, 28639), (921356, 2450), + (921357, 20000), (921359, 10000), + (921365, 347), (921369, 10683), + (921372, 10000), (921378, 140053), + (921379, 134339), (921380, 379422), + (921381, 16232), (921382, 87798), + (921389, 24581), (921392, 16627), + (921393, 14133), (921394, 525135), + (921408, 32940), (921417, 57339), + (921420, 113896), (921421, 134193), + (921423, 2423), (921424, 2350), + (921439, 127103), (921441, 28000), + (921444, 25961), (921445, 17656), + (921446, 30460), (921450, 85307), + (921452, 31160), (921453, 357562), + (921454, 31160), (921457, 12733), + (921471, 208361), (921479, 25888), + (921484, 18945), (921488, 90469), + (921494, 61337), (921502, 4189), + (921504, 39135), (921505, 79328), + (921509, 22720), (921511, 63740), + (921512, 157985), (921517, 60099), + (921529, 347), (921535, 247004), + (921539, 118234), (921542, 10786), + (921546, 31069), (921550, 248669), + (921559, 960), (921567, 1920), + (921570, 193289), (921571, 125624), + (921575, 41782), (921582, 84069), + (921590, 21971), (921591, 66888), + (921592, 4291), (921593, 436377), + (921616, 302279), (921625, 20841), + (921628, 685468), (921634, 18166), + (921635, 419084), (921636, 54729), + (921650, 55491), (921653, 44221), + (921661, 5454), (921666, 96807), + (921669, 64038), (921680, 33499), + (921684, 212504), (921687, 4056), + (921688, 46091), (921690, 13285), + (921693, 114086), (921695, 100000), + (921705, 8522), (921711, 232703), + (921714, 13450), (921717, 105862), + (921725, 99179), (921730, 71347), + (921743, 101903), (921761, 12000), + (921763, 42346), (921773, 278), + (921775, 22536), (921779, 110000), + (921783, 70976), (921788, 68610), + (921790, 2081), (921796, 201415), + (921798, 296367), (921804, 68694), + (921823, 1143739), (921826, 430251), + (921828, 86845), (921829, 19062), + (921831, 15113), (921832, 4327), + (921840, 1618053), (921844, 2039), + (921847, 104382), (921848, 201131), + (921856, 210838), (921863, 206494), + (921864, 1454602), (921865, 13469), + (921867, 10000), (921873, 119921), + (921876, 53993), (921879, 131773), + (921881, 70691), (921882, 34275), + (921886, 1263405), (921888, 302690), + (921889, 37244), (921894, 2048), + (921899, 203653), (921905, 213177), + (921911, 52472), (921921, 195425), + (921924, 139079), (921929, 217100), + (921932, 17613), (921935, 25580), + (921937, 60576), (921938, 21633), + (921942, 6798), (921956, 21103), + (921958, 10000), (921967, 199073), + (921983, 1129734), (921984, 3740), + (921988, 29055), (921989, 35171), + (921994, 28100), (921999, 135847), + (922006, 15610), (922008, 478537), + (922010, 24763), (922012, 45115), + (922017, 114550), (922018, 755334), + (922021, 12318), (922024, 18811), + (922026, 43393), (922029, 16685), + (922031, 25958), (922034, 628553), + (922036, 57943), (922039, 98655), + (922040, 2043), (922043, 12039), + (922049, 1424824), (922052, 6129), + (922060, 32035), (922062, 12085), + (922069, 48480), (922071, 82150), + (922072, 202258), (922079, 2039), + (922080, 129873), (922083, 2043), + (922084, 3967), (922086, 45090), + (922090, 24359), (922101, 192225), + (922109, 6350), (922120, 2043), + (922122, 12039), (922125, 22616), + (922129, 212327), (922131, 32209), + (922136, 34710), (922142, 10347), + (922145, 77954), (922147, 146205), + (922154, 42587), (922155, 33496), + (922160, 373574), (922180, 73317), + (922189, 29182), (922193, 43734), + (922197, 6000), (922199, 659057), + (922204, 129742), (922206, 30244), + (922216, 687334), (922217, 2043), + (922219, 15738), (922228, 17436), + (922230, 27964), (922246, 74341), + (922248, 21919), (922251, 2815), + (922253, 12960), (922259, 37505), + (922269, 5072), (922272, 106206), + (922274, 119112), (922277, 2430), + (922293, 47369), (922300, 41958), + (922305, 172599), (922307, 16190), + (922309, 10643), (922310, 103374), + (922311, 11412), (922318, 44374), + (922321, 52394), (922326, 62831), + (922332, 90675), (922334, 210673), + (922343, 100000), (922344, 121175), + (922351, 420651), (922353, 20469), + (922355, 436869), (922358, 95815), + (922363, 15580), (922366, 30789), + (922377, 243581), (922378, 12039), + (922380, 5779), (922381, 15756), + (922386, 77132), (922389, 22043), + (922394, 284660), (922396, 61445), + (922398, 237914), (922415, 17043), + (922417, 8082), (922418, 5325), + (922419, 3740), (922421, 3400), + (922426, 114759), (922438, 191376), + (922439, 46952), (922441, 62775), + (922443, 359502), (922449, 2260), + (922451, 37867), (922462, 38361), + (922464, 253289), (922466, 48537), + (922467, 112994), (922476, 2260), + (922480, 4395), (922481, 428528), + (922483, 171742), (922491, 29666), + (922497, 23929), (922500, 30761), + (922505, 68268), (922506, 24422), + (922510, 59236), (922515, 54123), + (922517, 8639), (922519, 56786), + (922520, 23076), (922527, 101713), + (922529, 333428), (922531, 95044), + (922532, 12375), (922533, 122700), + (922539, 36505), (922540, 14825), + (922541, 233000), (922542, 54424), + (922545, 6700), (922546, 205817), + (922547, 16678), (922549, 58896), + (922555, 99948), (922561, 32340), + (922563, 51534), (922567, 36454), + (922577, 12047), (922578, 7594), + (922594, 48759), (922600, 2491), + (922602, 9272), (922603, 6960), + (922609, 11690), (922617, 37800), + (922622, 82132), (922627, 19331), + (922628, 19102), (922634, 122381), + (922635, 150744), (922639, 11063), + (922647, 30085), (922651, 160095), + (922652, 51530), (922657, 15580), + (922684, 59124), (922692, 22450), + (922698, 142124), (922701, 62271), + (922706, 145005), (922707, 6440), + (922708, 2394), (922710, 20484), + (922719, 34160), (922725, 46239), + (922728, 8393), (922729, 270025), + (922730, 465936), (922732, 120000), + (922734, 13740), (922736, 76864), + (922739, 135377), (922740, 162255), + (922741, 425037), (922745, 84512), + (922759, 129369), (922762, 24946), + (922770, 7465), (922772, 16123), + (922781, 65086), (922786, 57182), + (922792, 30000), (922799, 2047), + (922803, 19211), (922809, 20707), + (922811, 40400), (922814, 66856), + (922817, 17862), (922818, 782014), + (922823, 28540), (922830, 19520), + (922840, 11546), (922857, 960), + (922859, 80942), (922863, 2460), + (922869, 404998), (922904, 27370), + (922919, 39392), (922920, 111225), + (922924, 82), (922935, 22260), + (922937, 40904), (922946, 15580), + (922970, 10000), (922971, 7000), + (922975, 13116), (922988, 30056), + (923003, 12323), (923009, 55854), + (923011, 277), (923014, 10000), + (923015, 318815), (923016, 10245), + (923017, 6015), (923019, 67143), + (923020, 8626), (923025, 17017), + (923029, 380), (923036, 2047), + (923037, 19666), (923039, 28030), + (923041, 20715), (923047, 25580), + (923051, 126186), (923055, 14548), + (923070, 8459), (923074, 47235), + (923084, 65063), (923088, 22047), + (923099, 50808), (923111, 24086), + (923118, 2043), (923128, 19655), + (923143, 12039), (923146, 32893), + (923147, 16141), (923150, 2729), + (923152, 6409), (923155, 12899), + (923156, 2043), (923157, 29513), + (923159, 16954), (923163, 66864), + (923178, 124717), (923188, 279), + (923200, 2616), (923201, 133182), + (923204, 13414), (923207, 4840), + (923208, 8761), (923228, 45580), + (923229, 48981), (923231, 10000), + (923232, 403650), (923235, 98907), + (923237, 2043), (923246, 264775), + (923257, 10000), (923265, 39689), + (923273, 2043), (923277, 8703), + (923284, 2043), (923289, 723098), + (923310, 279), (923315, 37663), + (923316, 35130), (923321, 5842), + (923336, 23118), (923345, 16086), + (923346, 22000), (923353, 584861), + (923356, 56291), (923357, 2043), + (923367, 46451), (923369, 20245), + (923375, 14462), (923376, 2043), + (923384, 2043), (923401, 10000), + (923402, 4078), (923410, 2332), + (923419, 19239), (923423, 10694), + (923435, 64429), (923441, 97388), + (923450, 36182), (923451, 383543), + (923454, 96878), (923462, 20433), + (923464, 35616), (923487, 1319010), + (923495, 12695), (923503, 4370), + (923509, 38575), (923511, 15580), + (923516, 2510), (923528, 100000), + (923557, 27703), (923568, 24387), + (923571, 39270), (923572, 250), + (923574, 14861), (923576, 69124), + (923581, 347), (923582, 10000), + (923584, 11385), (923587, 13047), + (923588, 13265), (923595, 2043), + (923596, 378070), (923604, 4497), + (923606, 83840), (923609, 10000), + (923639, 101778), (923649, 216346), + (923650, 32602), (923653, 166258), + (923655, 12736), (923658, 449), + (923659, 17220), (923660, 19547), + (923661, 16716), (923669, 2047), + (923670, 74193), (923675, 131365), + (923680, 124093), (923681, 2331), + (923689, 186032), (923701, 22858), + (923703, 269736), (923709, 108313), + (923716, 2450), (923719, 69555), + (923723, 318833), (923729, 8467), + (923730, 23410), (923734, 60046), + (923741, 20619), (923742, 260564), + (923748, 2536), (923756, 18117), + (923773, 39478), (923777, 13479), + (923778, 12618), (923781, 86542), + (923788, 77374), (923789, 25960), + (923795, 8998), (923809, 112130), + (923811, 16855), (923815, 10250), + (923817, 250), (923818, 56200), + (923821, 5250), (923822, 409729), + (923856, 47858), (923859, 347), + (923860, 88871), (923862, 4299), + (923863, 345344), (923868, 57766), + (923871, 100892), (923872, 5181), + (923878, 28051), (923880, 22260), + (923893, 250), (923904, 100313), + (923913, 80282), (923924, 41454), + (923937, 279), (923944, 55824), + (923947, 68919), (923949, 43670), + (923950, 10000), (923952, 8260), + (923957, 448), (923960, 2043), + (923966, 41566), (923970, 24493), + (923973, 600995), (923981, 147476), + (923987, 157854), (923998, 22519), + (924003, 10483), (924004, 85647), + (924012, 4087), (924018, 54751), + (924024, 72973), (924034, 49979), + (924036, 2811), (924040, 121449), + (924047, 12293), (924052, 1920), + (924054, 167977), (924058, 14990), + (924075, 15995), (924076, 15066), + (924077, 179556), (924079, 33709), + (924080, 2332), (924083, 2671), + (924095, 204467), (924104, 16608), + (924113, 2450), (924114, 10000), + (924122, 57312), (924123, 82886), + (924125, 12472), (924126, 6536), + (924127, 12360), (924132, 12389), + (924136, 24840), (924140, 278), + (924147, 36800), (924150, 18359), + (924154, 2875), (924155, 2910), + (924165, 4900), (924169, 16536), + (924170, 3753), (924183, 78865), + (924187, 127216), (924192, 70635), + (924196, 95804), (924203, 98239), + (924216, 82452), (924217, 2039), + (924220, 57393), (924221, 18359), + (924222, 10000), (924231, 28636), + (924241, 42645), (924243, 46131), + (924254, 10343), (924257, 10030), + (924278, 113549), (924294, 42561), + (924306, 20344), (924312, 48089), + (924322, 313), (924327, 10000), + (924335, 44342), (924341, 23930), + (924342, 2043), (924343, 1146), + (924346, 26332), (924353, 20026), + (924356, 380), (924357, 2450), + (924372, 258999), (924374, 49867), + (924375, 102124), (924381, 313), + (924382, 92688), (924385, 132093), + (924387, 48360), (924392, 69714), + (924397, 28674), (924400, 66711), + (924411, 23228), (924414, 125642), + (924421, 12047), (924425, 10000), + (924441, 10000), (924445, 38320), + (924447, 2393), (924454, 5757), + (924455, 12109), (924457, 7332), + (924458, 74368), (924462, 56388), + (924465, 12073), (924480, 68727), + (924486, 16412), (924498, 7785), + (924504, 597266), (924505, 20660), + (924528, 20313), (924536, 12497), + (924547, 2125279), (924548, 2047), + (924551, 46622), (924561, 10000), + (924562, 153983), (924563, 28860), + (924576, 80363), (924578, 121380), + (924580, 3930), (924592, 17655), + (924599, 18218), (924601, 45067), + (924610, 2442), (924618, 39855), + (924621, 6676), (924622, 23342), + (924630, 10340), (924636, 20347), + (924639, 65126), (924641, 31640), + (924642, 105315), (924644, 20000), + (924670, 28743), (924677, 2384466), + (924678, 399589), (924682, 3184), + (924687, 1146), (924689, 66864), + (924708, 30164), (924712, 267219), + (924719, 160162), (924720, 30778), + (924728, 45518), (924745, 526483), + (924755, 1000), (924759, 103096), + (924763, 46471), (924767, 16319), + (924771, 21751), (924773, 377678), + (924776, 28617), (924777, 38016), + (924778, 171453), (924779, 5349), + (924791, 34543), (924808, 111179), + (924812, 1146), (924813, 11493), + (924816, 90053), (924817, 1146), + (924818, 278), (924831, 146634), + (924837, 13333), (924838, 2055), + (924840, 82289), (924848, 19922), + (924850, 423430), (924854, 154471), + (924875, 4086), (924888, 1434178), + (924895, 380), (924905, 31463), + (924910, 417343), (924920, 29874), + (924926, 22299), (924927, 198884), + (924940, 60931), (924950, 18767), + (924956, 14480), (924967, 6000), + (924969, 250), (924976, 115339), + (924982, 553042), (924985, 44488), + (924986, 29578), (924992, 85061), + (924993, 265689), (925007, 592), + (925009, 47239), (925010, 148855), + (925011, 2232), (925017, 26867), + (925019, 37906), (925021, 5415), + (925025, 158528), (925026, 430326), + (925028, 10415), (925038, 250), + (925040, 22608), (925042, 35600), + (925044, 4684), (925045, 114164), + (925054, 2293), (925057, 29578), + (925068, 2331), (925071, 2867), + (925076, 28975), (925081, 1358645), + (925083, 123299), (925084, 32665), + (925085, 23180), (925093, 117244), + (925094, 25959), (925095, 13212), + (925096, 12043), (925101, 179689), + (925105, 108244), (925106, 2043), + (925108, 65322), (925109, 106288), + (925112, 26358), (925117, 17940), + (925120, 12450), (925124, 102778), + (925135, 44918), (925141, 160996), + (925142, 24172), (925147, 221337), + (925150, 10313), (925155, 20531), + (925161, 27885), (925162, 12463), + (925167, 12332), (925175, 250), + (925178, 839145), (925180, 2293), + (925182, 8707), (925186, 2324), + (925189, 11191), (925193, 67159), + (925194, 8319), (925199, 10000), + (925200, 104336), (925226, 19868), + (925233, 10399), (925239, 15456), + (925241, 15056), (925244, 5712), + (925248, 245), (925249, 2324), + (925250, 4086), (925252, 312), + (925256, 25507), (925258, 18512), + (925263, 93456), (925268, 120706), + (925270, 11880), (925273, 97300), + (925277, 2450), (925281, 949), + (925283, 11345), (925285, 31146), + (925290, 63059), (925292, 12475), + (925299, 1704), (925311, 25715), + (925312, 3177), (925314, 1729), + (925317, 1146), (925326, 24713), + (925328, 55906), (925329, 1314544), + (925331, 83309), (925332, 57172), + (925333, 1146), (925354, 24517), + (925363, 182342), (925366, 6737), + (925368, 71686), (925370, 10000), + (925371, 2665), (925376, 239011), + (925377, 3189), (925379, 12897), + (925381, 21645), (925382, 2043), + (925383, 8829), (925385, 7275), + (925387, 32146), (925388, 70124), + (925391, 28182), (925398, 13189), + (925402, 2332), (925404, 27336), + (925410, 20071), (925412, 65271), + (925426, 2536), (925432, 102087), + (925433, 81456), (925441, 95005), + (925442, 18921), (925443, 13855), + (925464, 25420), (925465, 10000), + (925476, 8722), (925478, 74401), + (925486, 45951), (925488, 35698), + (925489, 31126), (925497, 13408), + (925501, 106311), (925502, 6129), + (925514, 2608), (925528, 5362), + (925529, 114397), (925530, 142294), + (925533, 12464), (925538, 212593), + (925542, 372516), (925544, 56606), + (925551, 2040), (925552, 14950), + (925553, 352598), (925554, 2901), + (925561, 13598), (925562, 2324), + (925563, 47205), (925568, 510117), + (925571, 42636), (925578, 49117), + (925581, 14041), (925591, 183767), + (925592, 2324), (925601, 28585), + (925602, 24680), (925603, 38504), + (925608, 4763), (925614, 63036), + (925617, 22169), (925621, 4160), + (925624, 161080), (925626, 62143), + (925647, 132396), (925656, 15352), + (925658, 27620), (925665, 12260), + (925682, 5484), (925684, 113882), + (925691, 27629), (925700, 158816), + (925701, 6849), (925702, 51224), + (925708, 36302), (925713, 32101), + (925718, 518573), (925733, 2043), + (925756, 14382), (925758, 4768), + (925762, 256674), (925765, 1351269), + (925768, 23180), (925773, 43559), + (925774, 17117), (925776, 14686), + (925779, 5606), (925783, 73086), + (925791, 7819), (925794, 16704), + (925795, 251697), (925798, 66912), + (925799, 13022), (925806, 69171), + (925808, 14783), (925810, 129222), + (925813, 299548), (925817, 53557), + (925823, 59703), (925834, 2049), + (925835, 110495), (925837, 20586), + (925842, 351162), (925846, 72547), + (925867, 292371), (925868, 148190), + (925870, 24739), (925872, 148932), + (925874, 89527), (925875, 2043), + (925877, 22002), (925880, 205450), + (925885, 71319), (925887, 43117), + (925894, 78969), (925898, 18764), + (925900, 15), (925905, 20280), + (925912, 74574), (925914, 22618), + (925918, 97603), (925927, 79473), + (925930, 66867), (925954, 81633), + (925959, 2041), (925961, 4667), + (925966, 42010), (925967, 14508), + (925968, 10000), (925969, 4160), + (925970, 4952), (925973, 570568), + (925977, 1543851), (925978, 24993), + (925980, 4086), (925986, 1469311), + (925987, 75254), (925995, 45989), + (925998, 2600), (926001, 10000), + (926009, 30151), (926013, 14500), + (926015, 24520), (926018, 116785), + (926027, 574374), (926034, 9543), + (926045, 107618), (926046, 5338), + (926052, 12041), (926054, 7433), + (926059, 65058), (926060, 9823), + (926063, 4651), (926064, 102706), + (926065, 8366), (926066, 30803), + (926080, 29008), (926082, 4375), + (926091, 24817), (926093, 31957), + (926102, 35932), (926110, 87901), + (926111, 64137), (926112, 371963), + (926116, 238551), (926122, 175999), + (926126, 5841), (926127, 13455), + (926135, 19672), (926152, 997117), + (926154, 7855), (926158, 12049), + (926159, 29819), (926161, 295223), + (926163, 158958), (926164, 26405), + (926166, 4900), (926172, 156474), + (926183, 8700), (926197, 169341), + (926204, 15330), (926210, 212713), + (926214, 70888), (926223, 13480), + (926229, 496718), (926230, 67103), + (926232, 231380), (926239, 10727), + (926240, 1057439), (926241, 132995), + (926244, 961685), (926247, 21708), + (926250, 41324), (926257, 1647914), + (926259, 4784), (926266, 10000), + (926276, 139828), (926282, 21645), + (926289, 19837), (926292, 6564), + (926295, 20539), (926296, 30446), + (926298, 85938), (926299, 8886), + (926303, 2260), (926311, 2049), + (926324, 5521), (926328, 59208), + (926337, 38116), (926341, 58542), + (926350, 3480), (926353, 29721), + (926357, 42375), (926366, 36604), + (926375, 22048), (926376, 23734), + (926377, 119604), (926382, 2618), + (926384, 52295), (926387, 51954), + (926388, 43398), (926393, 2618), + (926408, 24377), (926419, 81474), + (926420, 283211), (926425, 8367), + (926432, 7234), (926436, 50000), + (926439, 27646), (926445, 2334), + (926455, 42521), (926460, 4384), + (926461, 26921), (926462, 206616), + (926463, 174922), (926464, 27190), + (926471, 35795), (926472, 66944), + (926475, 54306), (926481, 338081), + (926485, 161973), (926491, 63924), + (926492, 59444), (926493, 10229), + (926496, 59266), (926502, 534312), + (926511, 26427), (926523, 55311), + (926530, 42685), (926531, 12334), + (926545, 2903), (926546, 117140), + (926547, 17140), (926548, 10000), + (926552, 20686), (926562, 162927), + (926569, 39036), (926571, 52961), + (926582, 17288), (926585, 474298), + (926590, 4662), (926591, 23959), + (926594, 14768), (926599, 6394), + (926609, 4377), (926614, 33740), + (926617, 54886), (926625, 16550), + (926629, 8369), (926638, 133736), + (926645, 65326), (926647, 403602), + (926650, 45475), (926651, 28747), + (926666, 8399), (926667, 4376), + (926675, 1747072), (926693, 62491), + (926699, 219038), (926701, 5530), + (926705, 133700), (926712, 14086), + (926722, 16000), (926723, 18052), + (926725, 6184), (926732, 74681), + (926737, 62048), (926747, 3004), + (926755, 83746), (926757, 147012), + (926759, 2108769), (926766, 46132), + (926776, 12450), (926781, 8786), + (926783, 129086), (926784, 66952), + (926785, 168314), (926787, 59584), + (926798, 44472), (926806, 75251), + (926810, 2619), (926817, 275626), + (926818, 63803), (926819, 112092), + (926829, 8619), (926831, 12326), + (926833, 60829), (926838, 20704), + (926843, 122634), (926859, 2061), + (926861, 64004), (926863, 2042), + (926868, 122610), (926871, 5760), + (926874, 45384), (926880, 90497), + (926881, 37177), (926882, 1), + (926885, 106136), (926887, 41107), + (926888, 2050), (926890, 1406153), + (926895, 15768), (926903, 46826), + (926905, 61171), (926914, 5507), + (926921, 71839), (926927, 32334), + (926930, 34140), (926932, 2334), + (926933, 136628), (926936, 32050), + (926937, 45490), (926943, 42033), + (926945, 14384), (926948, 5890), + (926950, 30), (926951, 12334), + (926957, 8108), (926959, 254315), + (926966, 15580), (926969, 10000), + (926975, 14384), (926980, 161280), + (926984, 62875), (926988, 86616), + (926992, 71444), (927012, 12334), + (927013, 129322), (927017, 250), + (927018, 69957), (927022, 70497), + (927025, 32318), (927026, 24947), + (927032, 634972), (927037, 55355), + (927051, 7000), (927053, 30517), + (927056, 2602), (927057, 39008), + (927058, 207966), (927061, 32828), + (927068, 57139), (927069, 304116), + (927071, 33133), (927072, 19053), + (927080, 22057), (927086, 554059), + (927089, 9317), (927091, 62815), + (927096, 46997), (927097, 37625), + (927100, 12619), (927106, 12619), + (927107, 2351), (927110, 146896), + (927112, 100648), (927113, 2934), + (927128, 2043), (927133, 233103), + (927135, 13085), (927137, 100659), + (927139, 32277), (927142, 3464), + (927146, 31583), (927148, 177122), + (927151, 139732), (927153, 152142), + (927160, 10250), (927171, 145292), + (927175, 15580), (927177, 30946), + (927178, 66740), (927190, 376536), + (927191, 62338), (927192, 5238), + (927195, 17115), (927196, 250), + (927201, 439238), (927208, 54150), + (927210, 6855), (927213, 103795), + (927218, 304139), (927219, 51724), + (927222, 108455), (927225, 79830), + (927230, 6360), (927235, 36616), + (927236, 24500), (927242, 250), + (927248, 11196), (927254, 4594), + (927257, 4310), (927262, 28871), + (927271, 98760), (927272, 30), + (927273, 46567), (927275, 55507), + (927278, 161875), (927279, 277728), + (927282, 209827), (927283, 431508), + (927288, 140836), (927289, 12000), + (927292, 10000), (927296, 55613), + (927297, 21029), (927306, 2043), + (927313, 33196), (927314, 71562), + (927316, 29609), (927319, 76325), + (927326, 212759), (927327, 137528), + (927329, 314510), (927331, 45209), + (927333, 134868), (927334, 14761), + (927340, 79567), (927343, 18037), + (927346, 42517), (927347, 7707), + (927350, 6355), (927351, 12619), + (927352, 68035), (927353, 5174), + (927356, 17240), (927359, 39740), + (927365, 24033), (927366, 10000), + (927367, 475975), (927372, 79548), + (927375, 31137), (927386, 145363), + (927389, 15400), (927391, 173659), + (927393, 190868), (927396, 101146), + (927399, 13975), (927400, 176171), + (927404, 36009), (927405, 7395), + (927412, 4086), (927415, 75416), + (927417, 13210), (927418, 22375), + (927438, 11146), (927439, 179263), + (927440, 27512), (927441, 61029), + (927444, 12042), (927445, 13406), + (927447, 315814), (927451, 40863), + (927453, 5765), (927454, 197969), + (927464, 251356), (927470, 43409), + (927471, 51164), (927472, 2619), + (927475, 114074), (927481, 4996), + (927484, 22432), (927485, 104605), + (927488, 135654), (927508, 18367), + (927509, 24368), (927510, 73343), + (927513, 566777), (927522, 10000), + (927524, 8370), (927527, 2050), + (927537, 649957), (927540, 67809), + (927544, 119963), (927548, 3188), + (927549, 8810), (927551, 61018), + (927554, 2904), (927564, 11146), + (927567, 43738), (927568, 106123), + (927575, 168729), (927579, 12611), + (927581, 4032), (927586, 17331), + (927590, 28244), (927591, 85792), + (927595, 15155), (927596, 32050), + (927601, 4083), (927602, 32451), + (927611, 4093), (927613, 20030), + (927617, 9434), (927618, 2043), + (927620, 7825), (927623, 45483), + (927643, 196093), (927652, 70518), + (927658, 20423), (927661, 154514), + (927662, 14086), (927677, 186505), + (927686, 118532), (927689, 30116), + (927691, 24708), (927695, 64472), + (927700, 32536), (927707, 100000), + (927710, 26156), (927719, 503412), + (927722, 2043), (927723, 6264), + (927727, 28274), (927734, 7964), + (927736, 395106), (927747, 21156), + (927750, 475477), (927751, 79100), + (927753, 2334), (927755, 97906), + (927756, 11273), (927764, 12536), + (927767, 66738), (927768, 12334), + (927778, 132488), (927780, 30), + (927782, 26375), (927783, 280730), + (927787, 84784), (927790, 212730), + (927792, 6200), (927799, 17983), + (927803, 133620), (927814, 3908), + (927816, 103728), (927817, 2117339), + (927818, 334955), (927826, 57434), + (927829, 29224), (927832, 67159), + (927837, 10804), (927838, 5069), + (927839, 286627), (927843, 2043), + (927851, 27025), (927854, 2450), + (927859, 62270), (927875, 31242), + (927889, 27129), (927894, 24086), + (927905, 4954), (927906, 109430), + (927915, 3337), (927926, 47146), + (927927, 10215), (927930, 31128), + (927937, 64148), (927951, 2536), + (927952, 37395), (927954, 20890), + (927956, 4654), (927964, 22577), + (927965, 10000), (927970, 100), + (927981, 41580), (927983, 104325), + (927984, 2619), (927985, 40906), + (927989, 2050), (927990, 2043), + (928004, 2050), (928005, 72964), + (928012, 16669), (928015, 129177), + (928021, 93117), (928024, 1435899), + (928025, 449883), (928028, 14086), + (928030, 2610), (928032, 95143), + (928034, 2619), (928039, 15211), + (928041, 1186199), (928049, 2334), + (928058, 38199), (928059, 38876), + (928067, 132584), (928075, 4662), + (928083, 24389), (928106, 32453), + (928107, 3473), (928109, 38143), + (928110, 8887), (928114, 1641678), + (928118, 24798), (928121, 48486), + (928140, 17055), (928141, 35954), + (928142, 21291), (928148, 38125), + (928150, 12125), (928152, 28700), + (928153, 85997), (928154, 44096), + (928157, 29663), (928166, 10000), + (928171, 30944), (928172, 9162), + (928182, 104631), (928186, 37213), + (928187, 16376), (928188, 14880), + (928193, 2903), (928194, 147037), + (928199, 101379), (928200, 21271), + (928206, 12108), (928216, 327484), + (928217, 2334), (928221, 14381), + (928228, 19296), (928231, 330542), + (928252, 13163), (928258, 42102), + (928259, 17630), (928264, 81706), + (928273, 87800), (928278, 111556), + (928281, 72962), (928282, 9535), + (928287, 5163), (928288, 64654), + (928291, 35668), (928293, 17840), + (928299, 872444), (928305, 34855), + (928308, 7281), (928314, 38575), + (928320, 203223), (928322, 42973), + (928334, 128815), (928339, 12050), + (928341, 2895), (928343, 378424), + (928348, 61536), (928352, 88550), + (928353, 52023), (928360, 36937), + (928363, 5783), (928364, 3188), + (928374, 45667), (928378, 129475), + (928387, 86273), (928388, 31291), + (928391, 3740), (928395, 11965), + (928397, 33404), (928399, 13028), + (928408, 16652), (928422, 165938), + (928423, 7605), (928425, 134257), + (928434, 136754), (928439, 2933), + (928445, 12619), (928452, 165063), + (928453, 40663), (928465, 6989), + (928466, 25447), (928471, 47206), + (928473, 2049), (928479, 35179), + (928481, 250), (928485, 22326), + (928488, 18173), (928491, 90010), + (928492, 74279), (928500, 7001), + (928502, 8061), (928503, 74790), + (928507, 2334), (928512, 207162), + (928520, 39023), (928531, 2618), + (928538, 6853), (928543, 14100), + (928546, 66972), (928555, 36750), + (928564, 12085), (928568, 82990), + (928572, 43453), (928578, 442945), + (928591, 30639), (928593, 6799), + (928595, 28483), (928602, 150286), + (928603, 19191), (928606, 2226443), + (928615, 18483), (928619, 21418), + (928620, 2041), (928622, 4684), + (928633, 44510), (928638, 282753), + (928639, 99213), (928641, 10000), + (928649, 73133), (928656, 146935), + (928661, 55200), (928662, 10967), + (928664, 39088), (928669, 71200), + (928673, 1649149), (928682, 14653), + (928689, 8753), (928690, 24482), + (928694, 178825), (928701, 88312), + (928708, 764403), (928719, 6000), + (928734, 35620), (928735, 24953), + (928736, 13618), (928743, 23596), + (928750, 10000), (928751, 5377), + (928752, 10686), (928754, 32670), + (928760, 20187), (928762, 2114), + (928768, 22450), (928769, 4943), + (928770, 85161), (928779, 88268), + (928780, 14377), (928788, 9500), + (928791, 14086), (928794, 47616), + (928795, 17038), (928798, 90006), + (928800, 82370), (928804, 2049), + (928806, 41739), (928811, 16484), + (928812, 34084), (928818, 2450), + (928821, 44512), (928822, 17618), + (928827, 33790), (928835, 31101), + (928849, 36101), (928860, 319482), + (928875, 47167), (928889, 4377), + (928898, 17286), (928921, 16743), + (928923, 4086), (928930, 2450), + (928941, 15621), (928948, 23287), + (928951, 71020), (928957, 45293), + (928975, 20073), (928983, 37193), + (929003, 29088), (929010, 643326), + (929015, 36544), (929024, 39907), + (929035, 5596), (929041, 78964), + (929055, 34164), (929070, 34715), + (929071, 52514), (929073, 21269), + (929077, 30), (929079, 86152), + (929085, 3187), (929087, 23505), + (929092, 72258), (929095, 2049), + (929096, 158112), (929107, 10000), + (929110, 112133), (929113, 2334), + (929127, 105513), (929129, 13471), + (929132, 102449), (929134, 31949), + (929136, 170295), (929138, 2334), + (929141, 22644), (929148, 16528), + (929158, 114717), (929170, 302642), + (929175, 49745), (929179, 28597), + (929187, 71767), (929193, 2167466), + (929194, 4086), (929199, 2334), + (929202, 5721), (929204, 56158), + (929218, 101151), (929220, 8481), + (929226, 103), (929228, 10000), + (929231, 254036), (929239, 30967), + (929244, 10), (929255, 13471), + (929259, 22683), (929261, 6913), + (929264, 2043), (929266, 12903), + (929270, 14092), (929277, 123812), + (929279, 29339), (929285, 33634), + (929294, 11028), (929296, 58136), + (929304, 162983), (929306, 75479), + (929309, 4775), (929312, 16732), + (929315, 19672), (929319, 5805), + (929329, 32049), (929341, 2041), + (929347, 161343), (929362, 12890), + (929368, 117273), (929369, 3233), + (929371, 287438), (929395, 5210), + (929401, 676542), (929404, 5525), + (929408, 28758), (929409, 191429), + (929412, 779566), (929416, 4015), + (929423, 100), (929428, 235924), + (929430, 38055), (929435, 32742), + (929436, 2325), (929442, 44270), + (929443, 12944), (929444, 388708), + (929451, 412250), (929457, 57724), + (929458, 15829), (929459, 142202), + (929471, 2519755), (929477, 10414), + (929496, 33951), (929503, 3186), + (929507, 26118), (929508, 14086), + (929510, 2618), (929511, 10215), + (929522, 24628), (929523, 216677), + (929530, 77972), (929533, 38112), + (929540, 175884), (929547, 8515), + (929549, 6360), (929553, 19354), + (929556, 9039), (929557, 46341), + (929559, 8365), (929575, 23292), + (929576, 16772), (929580, 223431), + (929585, 63462), (929586, 53050), + (929589, 159867), (929592, 25467), + (929598, 36175), (929608, 19321), + (929611, 182091), (929621, 7778), + (929624, 215790), (929631, 59756), + (929647, 226479), (929652, 7194), + (929655, 254985), (929660, 27930), + (929682, 4979), (929684, 135180), + (929691, 50288), (929700, 37000), + (929701, 29053), (929704, 41096), + (929705, 14499), (929706, 2609), + (929707, 132590), (929711, 35526), + (929715, 10814), (929716, 311163), + (929724, 17030), (929742, 4499), + (929745, 2893), (929746, 12617), + (929748, 12617), (929749, 10095452), + (929761, 15906), (929767, 3043), + (929768, 33033), (929769, 36850), + (929771, 3471), (929774, 16000), + (929779, 18680), (929780, 185382), + (929785, 13471), (929786, 13713), + (929790, 51177), (929805, 102642), + (929806, 18463), (929813, 28366), + (929814, 60399), (929823, 36455), + (929828, 29832), (929845, 69245), + (929850, 8063), (929852, 30), + (929870, 2049), (929894, 20775), + (929896, 14031), (929906, 4376), + (929912, 51526), (929913, 2333), + (929917, 26294), (929922, 21356), + (929931, 64588), (929940, 4382), + (929943, 2350), (929945, 19204), + (929947, 1920), (929948, 12325), + (929960, 5894), (929963, 4556), + (929968, 28719), (929969, 28585), + (929979, 25157), (929983, 13031), + (929984, 2043), (929985, 2043), + (929986, 22034), (929989, 2041), + (929996, 220363), (930003, 2041), + (930017, 26710), (930018, 11780), + (930019, 26953), (930029, 9338), + (930030, 24741), (930038, 15636), + (930041, 12448), (930047, 229230), + (930050, 13186), (930052, 2333), + (930054, 6135), (930056, 19065), + (930059, 26563), (930062, 93815), + (930068, 2965), (930072, 130494), + (930073, 88821), (930077, 2041), + (930085, 2618), (930095, 12618), + (930097, 102333), (930107, 12720), + (930109, 97705), (930111, 12618), + (930114, 61274), (930117, 8028), + (930122, 2043), (930125, 134014), + (930130, 28609), (930139, 180050), + (930140, 65551), (930144, 17623), + (930148, 1701), (930154, 2593), + (930160, 16994), (930161, 21797), + (930165, 8615), (930167, 345876), + (930177, 26994), (930187, 24867), + (930191, 35095), (930214, 14970), + (930215, 286563), (930216, 27081), + (930219, 2333), (930245, 4098), + (930247, 4382), (930251, 251160), + (930253, 42768), (930261, 30572), + (930273, 7490), (930274, 35915), + (930276, 42048), (930284, 82728), + (930285, 14080), (930287, 56480), + (930292, 2049), (930293, 1510395), + (930299, 14090), (930303, 86727), + (930310, 2333), (930312, 7743), + (930313, 1134588), (930317, 34557), + (930322, 56023), (930334, 28609), + (930340, 28066), (930348, 24657), + (930349, 31261), (930350, 69403), + (930363, 10000), (930369, 43154), + (930379, 5703), (930380, 263900), + (930392, 2450), (930400, 89767), + (930401, 29662), (930402, 12498), + (930403, 10414), (930420, 22701), + (930444, 22727), (930453, 3471), + (930457, 2893), (930461, 22274), + (930466, 45148), (930472, 52819), + (930473, 36348), (930480, 146017), + (930481, 4493), (930482, 114113), + (930484, 8365), (930490, 13420), + (930496, 66920), (930497, 37817), + (930499, 45278), (930501, 24650), + (930504, 45926), (930507, 134086), + (930511, 327402), (930516, 94483), + (930518, 11920), (930519, 15661), + (930520, 13049), (930523, 6419), + (930526, 23473), (930533, 31115), + (930543, 58538), (930547, 8022), + (930556, 2333), (930560, 11559), + (930564, 7563), (930569, 21881), + (930571, 47068), (930573, 2041), + (930574, 111954), (930575, 2902), + (930582, 2618), (930583, 79817), + (930589, 21230), (930590, 13704), + (930592, 6824), (930593, 19023), + (930595, 19029), (930600, 9740), + (930605, 235274), (930618, 363798), + (930623, 38740), (930625, 42769), + (930628, 14703), (930629, 14303), + (930632, 200250), (930634, 21286), + (930635, 16004), (930638, 51707), + (930643, 19100), (930648, 211312), + (930660, 12043), (930667, 19133), + (930671, 32079), (930702, 34543), + (930708, 17766), (930710, 32894), + (930715, 133402), (930726, 5360), + (930729, 837072), (930730, 80330), + (930733, 22810), (930740, 58257), + (930747, 254442), (930755, 26089), + (930758, 2260), (930761, 27052), + (930772, 800344), (930774, 201660), + (930776, 473870), (930778, 162732), + (930782, 89694), (930783, 40459), + (930792, 48987), (930798, 21303), + (930811, 94338), (930815, 35501), + (930825, 57024), (930826, 117747), + (930828, 5584), (930829, 1276084), + (930832, 6977), (930834, 2049), + (930838, 43012), (930839, 37725), + (930840, 442228), (930842, 76652), + (930857, 12618), (930859, 31084), + (930861, 2049), (930866, 20414), + (930873, 104426), (930876, 62373), + (930877, 10000), (930887, 12609), + (930890, 60195), (930904, 37828), + (930907, 41857), (930910, 22355), + (930912, 40004), (930918, 40460), + (930919, 186609), (930923, 2333), + (930927, 4609), (930930, 123292), + (930931, 2902), (930933, 3178), + (930941, 2902), (930945, 102440), + (930958, 19157), (930960, 4661), + (930962, 14086), (930963, 21710), + (930966, 145119), (930973, 67232), + (930978, 6704), (930981, 16939), + (930984, 309837), (930985, 4132), + (930998, 28504), (931004, 40018), + (931006, 4661), (931013, 219872), + (931045, 9354), (931046, 4784), + (931047, 8585), (931048, 117064), + (931050, 45524), (931053, 22903), + (931055, 162854), (931056, 2041), + (931062, 36303), (931064, 14334), + (931071, 104784), (931083, 28436), + (931090, 22450), (931098, 25066), + (931105, 2450), (931117, 94833), + (931122, 7725), (931128, 2618), + (931130, 32085), (931135, 2317), + (931140, 21999), (931142, 38567), + (931144, 12903), (931147, 85318), + (931149, 2334), (931150, 43957), + (931151, 8063), (931159, 51906), + (931165, 2325), (931168, 17593), + (931176, 50464), (931181, 17629), + (931182, 2334), (931188, 40112), + (931190, 49577), (931191, 50294), + (931194, 25919), (931197, 2334), + (931198, 18460), (931202, 247628), + (931212, 214667), (931224, 2049), + (931231, 17623), (931232, 2334), + (931239, 297082), (931240, 218152), + (931265, 107430), (931266, 343979), + (931270, 44382), (931271, 116355), + (931276, 2450), (931277, 15580), + (931288, 28777), (931291, 106143), + (931293, 12618), (931297, 181784), + (931300, 190), (931304, 138888), + (931305, 12528), (931310, 7434), + (931312, 155124), (931316, 16360), + (931317, 43158), (931330, 88021), + (931332, 5684), (931335, 21153), + (931338, 21626), (931339, 2043), + (931343, 40910), (931348, 55820), + (931349, 16384), (931350, 2043), + (931351, 2903), (931352, 127250), + (931356, 66936), (931359, 4952), + (931361, 10000), (931364, 8049), + (931373, 71050), (931375, 19320), + (931382, 42334), (931384, 8178), + (931401, 3187), (931413, 35042), + (931415, 180604), (931418, 12863), + (931424, 14313), (931431, 19849), + (931436, 6411), (931441, 39978), + (931444, 2450), (931448, 13747), + (931455, 47280), (931469, 7948), + (931471, 29359), (931475, 2480), + (931476, 39990), (931479, 39672), + (931480, 46852), (931481, 6074), + (931482, 30380), (931494, 2043), + (931497, 2648), (931499, 143523), + (931502, 66936), (931506, 3437), + (931511, 51358), (931512, 6129), + (931515, 34549), (931518, 123901), + (931521, 26452), (931524, 2618), + (931529, 20410), (931532, 75059), + (931543, 76846), (931547, 15990), + (931550, 2903), (931558, 70831), + (931559, 126013), (931561, 234353), + (931565, 8049), (931567, 26126), + (931595, 4393), (931598, 214146), + (931599, 21289), (931600, 14870), + (931601, 77321), (931613, 13163), + (931627, 2894), (931632, 1314092), + (931634, 267736), (931637, 16513), + (931664, 19701), (931668, 54055), + (931675, 12706), (931696, 125575), + (931703, 310393), (931711, 2334), + (931720, 31160), (931736, 16850), + (931737, 5521), (931751, 59649), + (931758, 116171), (931763, 29980), + (931775, 148737), (931779, 6722), + (931780, 12300), (931786, 95250), + (931788, 2350), (931789, 2260), + (931803, 4661), (931805, 1146), + (931807, 37846), (931810, 2619), + (931834, 273769), (931835, 10000), + (931840, 6127), (931841, 20418), + (931842, 8179), (931847, 20000), + (931855, 142023), (931866, 61173), + (931867, 8912), (931872, 1052960), + (931875, 40000), (931888, 510913), + (931892, 1372168), (931909, 16082), + (931910, 32368), (931911, 312611), + (931920, 59579), (931921, 44434), + (931922, 30), (931930, 122375), + (931935, 80607), (931939, 125434), + (931948, 210263), (931953, 32265), + (931962, 78320), (931964, 10000), + (931966, 48981), (931969, 322246), + (931974, 222243), (931979, 528150), + (931985, 20267), (931987, 8368), + (931989, 4493), (931991, 15580), + (931992, 10000), (931993, 60503), + (931994, 30163), (931997, 296761), + (932002, 38705), (932007, 69270), + (932010, 24212), (932043, 58566), + (932048, 46348), (932050, 30990), + (932057, 2334), (932061, 16139), + (932062, 77118), (932072, 34656), + (932076, 17315), (932081, 31383), + (932083, 80943), (932084, 104761), + (932085, 30), (932093, 4538), + (932100, 35073), (932102, 2041), + (932107, 24678), (932112, 102450), + (932123, 10000), (932126, 2364), + (932131, 56477), (932132, 5240), + (932133, 92610), (932146, 152493), + (932153, 439475), (932159, 151103), + (932165, 6000), (932177, 11920), + (932178, 10000), (932181, 17567), + (932192, 66936), (932196, 54437), + (932218, 9145), (932219, 16352), + (932232, 22131), (932236, 15806), + (932238, 88692), (932241, 74959), + (932247, 22682), (932269, 23839), + (932274, 217510), (932277, 21609), + (932285, 279304), (932287, 122164), + (932290, 260214), (932292, 71496), + (932294, 14100), (932299, 2601), + (932314, 10000), (932321, 44147), + (932324, 4084), (932329, 10000), + (932335, 4597), (932337, 22649), + (932340, 108237), (932344, 2450), + (932349, 53094), (932356, 48905), + (932359, 100313), (932360, 10000), + (932372, 3740), (932376, 2043), + (932381, 28596), (932386, 312176), + (932390, 3287), (932403, 100000), + (932416, 1755), (932420, 15580), + (932421, 6129), (932422, 67146), + (932432, 1319285), (932443, 23945), + (932447, 2124059), (932450, 48030), + (932452, 6360), (932453, 36617), + (932457, 85560), (932458, 30127), + (932459, 2071), (932463, 43610), + (932466, 12043), (932474, 7938), + (932477, 25763), (932479, 26125), + (932481, 14086), (932485, 16659), + (932489, 71361), (932503, 122501), + (932507, 81010), (932511, 45569), + (932514, 363908), (932515, 32163), + (932518, 12865), (932531, 4092), + (932534, 4549), (932541, 156688), + (932544, 9405), (932564, 650520), + (932581, 72670), (932592, 10000), + (932608, 22355), (932618, 227145), + (932619, 222260), (932620, 172299), + (932621, 14394), (932622, 253871), + (932623, 356137), (932625, 29131), + (932628, 38342), (932643, 71614), + (932646, 14128), (932665, 1700), + (932670, 80821), (932673, 17941), + (932674, 9369), (932675, 54827), + (932677, 16015), (932680, 308450), + (932686, 8816), (932688, 30), + (932691, 211372), (932697, 392735), + (932701, 18299), (932705, 50546), + (932706, 36542), (932711, 36067), + (932726, 2333), (932732, 124036), + (932733, 91235), (932736, 252457), + (932739, 20199), (932747, 66904), + (932754, 10000), (932758, 114900), + (932761, 22364), (932763, 20100), + (932767, 12623), (932770, 38704), + (932771, 246108), (932776, 82), + (932779, 30), (932780, 89733), + (932789, 21014), (932801, 121564), + (932809, 83616), (932810, 35456), + (932812, 6294), (932814, 30), + (932815, 78013), (932817, 99785), + (932832, 10514), (932836, 29487), + (932840, 2351), (932842, 285354), + (932854, 65852), (932856, 35713), + (932857, 10268), (932858, 2043), + (932863, 38205), (932866, 2480), + (932870, 109516), (932877, 191979), + (932879, 110000), (932881, 6840), + (932886, 24220), (932889, 61405), + (932891, 74670), (932906, 36115), + (932908, 57930), (932910, 109506), + (932916, 495), (932920, 120014), + (932922, 1101416), (932929, 10623), + (932934, 10575), (932936, 135175), + (932940, 104502), (932944, 74850), + (932946, 18202), (932951, 45089), + (932966, 9943), (932969, 52919), + (932975, 12048), (932977, 44709), + (932979, 18340), (932983, 193247), + (932985, 22430), (932988, 27963), + (932991, 155606), (932998, 79991), + (933008, 15745), (933009, 92601), + (933021, 1320739), (933023, 174036), + (933033, 86637), (933034, 56965), + (933036, 30), (933038, 31938), + (933043, 45564), (933047, 34207), + (933052, 5232), (933053, 60170), + (933054, 114172), (933055, 23979), + (933070, 4376), (933076, 325716), + (933085, 2450), (933091, 191086), + (933096, 2048), (933097, 30429), + (933102, 119043), (933103, 25542), + (933111, 2048), (933117, 23007), + (933127, 12048), (933128, 15580), + (933130, 6360), (933137, 124047), + (933140, 26413), (933149, 157528), + (933156, 100977), (933160, 220266), + (933161, 30181), (933171, 41104), + (933175, 14086), (933177, 2048), + (933183, 21762), (933184, 2043), + (933185, 28297), (933186, 14699), + (933187, 1920), (933189, 47982), + (933191, 19267), (933194, 10632), + (933197, 100981), (933208, 8363), + (933209, 57352), (933219, 34653), + (933228, 23943), (933236, 45046), + (933237, 403189), (933241, 23218), + (933242, 330772), (933246, 10143), + (933248, 30), (933251, 7796), + (933255, 15864), (933258, 42446), + (933267, 157680), (933274, 25916), + (933280, 554653), (933282, 80404), + (933284, 4942), (933291, 74735), + (933292, 1466858), (933293, 14086), + (933296, 2690), (933308, 3022087), + (933315, 185766), (933316, 30000), + (933320, 3402), (933326, 42641), + (933327, 50417), (933333, 34638), + (933334, 16128), (933338, 36985), + (933353, 182510), (933363, 10813), + (933371, 22350), (933377, 8016), + (933379, 148308), (933383, 27487), + (933392, 9844), (933397, 106912), + (933398, 47369), (933404, 18095), + (933408, 32043), (933411, 137224), + (933412, 282265), (933414, 4157), + (933421, 4086), (933426, 3186), + (933434, 10000), (933443, 19220), + (933460, 38154), (933461, 81601), + (933462, 47262), (933463, 10000), + (933466, 2690), (933467, 71604), + (933472, 71510), (933474, 10000), + (933478, 12120), (933479, 712368), + (933481, 18028), (933484, 28545), + (933487, 51200), (933488, 3820), + (933491, 59896), (933494, 54994), + (933497, 21698), (933498, 19861), + (933503, 2350), (933504, 82281), + (933516, 55108), (933519, 79172), + (933525, 188187), (933530, 31546), + (933535, 39872), (933549, 36457), + (933551, 12048), (933555, 71187), + (933557, 609553), (933560, 1891755), + (933563, 2372), (933564, 2260), + (933573, 69893), (933594, 51933), + (933598, 1368633), (933599, 10362), + (933601, 15753), (933610, 8090), + (933615, 4828), (933620, 240123), + (933623, 491232), (933624, 12372), + (933625, 2048), (933641, 12375), + (933645, 25019), (933646, 46292), + (933652, 5750), (933653, 6124), + (933658, 4086), (933662, 10000), + (933667, 38314), (933673, 45484), + (933675, 26205), (933683, 36112), + (933686, 94921), (933687, 26875), + (933690, 230411), (933692, 4180), + (933701, 29512), (933703, 4086), + (933705, 31317), (933706, 44944), + (933715, 85768), (933725, 5228), + (933728, 2043), (933729, 43323), + (933732, 16627), (933733, 122822), + (933735, 140680), (933737, 12091), + (933741, 184528), (933746, 60190), + (933751, 141064), (933756, 22258), + (933759, 12048), (933764, 21059), + (933765, 28325), (933767, 90672), + (933770, 16890), (933774, 18466), + (933787, 221555), (933792, 17780), + (933796, 28250), (933797, 53938), + (933802, 63773), (933806, 16548), + (933808, 1514023), (933811, 23072), + (933813, 10952), (933831, 98944), + (933836, 13663), (933843, 30854), + (933845, 38820), (933848, 70830), + (933857, 10000), (933859, 42358), + (933860, 10000), (933862, 62621), + (933865, 130000), (933869, 21344), + (933873, 22628), (933874, 38237), + (933881, 4300), (933883, 50221), + (933888, 69498), (933905, 6619), + (933911, 4523), (933917, 575665), + (933920, 84674), (933922, 24133), + (933938, 17363), (933943, 74137), + (933945, 66896), (933952, 16409), + (933958, 14302), (933959, 26647), + (933963, 35057), (933965, 57787), + (933970, 219030), (933971, 71506), + (933975, 44160), (933981, 719362), + (933985, 78939), (933989, 6190), + (934001, 2043), (934003, 10000), + (934017, 170286), (934019, 10000), + (934021, 85710), (934030, 88849), + (934031, 8043), (934035, 47981), + (934042, 6825), (934043, 1386857), + (934047, 55271), (934048, 20281), + (934051, 699472), (934056, 5448), + (934062, 28632), (934066, 132662), + (934068, 29666), (934069, 62976), + (934071, 10086), (934072, 2143), + (934074, 2260), (934075, 12048), + (934076, 77144), (934077, 17912), + (934079, 64608), (934086, 133432), + (934087, 63586), (934091, 12350), + (934094, 71585), (934101, 124176), + (934102, 4493), (934110, 293167), + (934118, 89746), (934129, 53033), + (934130, 10250), (934131, 10000), + (934141, 170958), (934148, 4375), + (934156, 80402), (934159, 49048), + (934167, 10000), (934173, 2350), + (934176, 94538), (934177, 20405), + (934178, 70619), (934180, 83445), + (934184, 386882), (934185, 25361), + (934187, 89688), (934195, 14393), + (934196, 59850), (934197, 12043), + (934198, 4738), (934223, 59182), + (934225, 2043), (934229, 20057), + (934231, 25889), (934234, 108864), + (934235, 254835), (934243, 42384), + (934245, 5118), (934256, 36232), + (934259, 119569), (934263, 71090), + (934265, 7000), (934277, 6190), + (934283, 2332), (934284, 60964), + (934288, 18886), (934292, 8361), + (934294, 24712), (934298, 45885), + (934312, 2048), (934313, 66710), + (934314, 505404), (934316, 128004), + (934319, 33909), (934324, 66445), + (934325, 25580), (934333, 48077), + (934334, 10060732), (934343, 10409), + (934346, 112350), (934352, 20309), + (934356, 8361), (934366, 123369), + (934375, 17608), (934376, 2028), + (934377, 160940), (934388, 4398), + (934396, 250), (934405, 37799), + (934407, 21101), (934413, 14716), + (934419, 39596), (934422, 21682), + (934423, 20000), (934424, 119994), + (934432, 21143), (934436, 4473), + (934437, 77093), (934439, 100), + (934450, 34596), (934451, 18021), + (934454, 14086), (934459, 6000), + (934462, 39565), (934483, 85923), + (934500, 56366), (934509, 32503), + (934522, 31160), (934531, 2048), + (934544, 112943), (934545, 6129), + (934548, 2332), (934552, 2450), + (934558, 42913), (934562, 2043), + (934568, 75576), (934578, 36512), + (934579, 15184), (934581, 208818), + (934595, 66281), (934598, 13185), + (934601, 2450), (934613, 13840), + (934623, 14418), (934633, 26670), + (934647, 120020), (934648, 76872), + (934658, 112047), (934667, 12043), + (934680, 45987), (934681, 17085), + (934684, 57449), (934701, 377191), + (934703, 22085), (934706, 253868), + (934729, 42032), (934749, 268057), + (934752, 51694), (934762, 12450), + (934764, 12450), (934768, 22043), + (934772, 7472), (934778, 43517), + (934782, 2047), (934786, 50536), + (934790, 7983), (934801, 30), + (934818, 437777), (934820, 15662), + (934824, 888790), (934829, 10000), + (934836, 29788), (934840, 32390), + (934842, 2260), (934846, 14878), + (934852, 6010), (934859, 1146), + (934863, 3383), (934870, 4358), + (934891, 338743), (934898, 423064), + (934901, 107331), (934905, 2202058), + (934907, 48008), (934915, 597763), + (934916, 10000), (934917, 38825), + (934920, 26154), (934922, 85310), + (934926, 54332), (934927, 9807), + (934933, 14393), (934935, 122366), + (934941, 26446), (934944, 2360), + (934945, 4116), (934947, 110326), + (934950, 27366), (934955, 1582), + (934958, 2350), (934962, 80163), + (934971, 230632), (934974, 11562), + (934975, 19840), (934984, 11981), + (934988, 80620), (935016, 41118), + (935017, 84572), (935020, 108810), + (935024, 126401), (935026, 6528), + (935034, 509633), (935037, 11240), + (935041, 2450), (935046, 8172), + (935049, 3410), (935056, 137091), + (935058, 10000), (935061, 19746), + (935062, 94238), (935063, 8358), + (935066, 34244), (935067, 6129), + (935070, 2043), (935072, 46405), + (935077, 2350), (935081, 28358), + (935083, 195071), (935101, 15516), + (935103, 102039), (935105, 96352), + (935106, 416244), (935107, 37855), + (935109, 27446), (935119, 190958), + (935126, 2043), (935133, 2450), + (935135, 246743), (935136, 16813), + (935141, 39055), (935153, 103781), + (935156, 22581), (935167, 48624), + (935168, 38036), (935177, 36129), + (935187, 2043), (935206, 15580), + (935221, 38911), (935233, 6129), + (935236, 92046), (935243, 130267), + (935254, 84231), (935258, 131158), + (935261, 100678), (935265, 203327), + (935272, 14252), (935286, 10000), + (935288, 15580), (935300, 18389), + (935301, 3276), (935316, 132930), + (935322, 10000), (935326, 2298), + (935328, 277926), (935332, 179012), + (935333, 10401), (935337, 10000), + (935338, 22043), (935347, 7546), + (935359, 14981), (935377, 57519), + (935379, 77507), (935380, 134011), + (935386, 1898352), (935391, 100000), + (935393, 6129), (935399, 76664), + (935410, 30851), (935425, 6129), + (935428, 18260), (935430, 22039), + (935431, 37060), (935432, 195962), + (935433, 9461), (935434, 10000), + (935441, 17781), (935443, 320000), + (935447, 44380), (935457, 83036), + (935461, 10000), (935462, 43258), + (935467, 55523), (935476, 89306), + (935478, 2043), (935479, 54624), + (935490, 221246), (935496, 6388), + (935499, 104978), (935502, 70357), + (935517, 15725), (935518, 20000), + (935534, 51635), (935535, 15388), + (935548, 28735), (935556, 2450), + (935557, 364695), (935558, 12450), + (935567, 101146), (935570, 15443), + (935572, 107344), (935585, 143794), + (935587, 470625), (935594, 817008), + (935607, 17001), (935614, 57287), + (935622, 15580), (935623, 46204), + (935639, 31755), (935650, 32118), + (935654, 6123), (935658, 6133), + (935666, 44900), (935669, 140014), + (935670, 17591), (935672, 34357), + (935674, 2450), (935679, 62409), + (935683, 25580), (935688, 3008), + (935691, 14367), (935695, 20190), + (935700, 2260), (935701, 67075), + (935706, 15580), (935715, 4800), + (935720, 100339), (935724, 10000), + (935725, 126284), (935730, 352017), + (935734, 48762), (935735, 21728), + (935740, 168436), (935744, 4610), + (935750, 20013), (935753, 35721), + (935759, 187143), (935761, 99872), + (935762, 10000), (935764, 32237), + (935768, 2047), (935769, 17763), + (935774, 95697), (935782, 6000), + (935785, 58796), (935791, 17048), + (935793, 2043), (935798, 47494), + (935803, 2043), (935805, 29085), + (935806, 3304086), (935808, 24161), + (935809, 61801), (935821, 409425), + (935822, 203144), (935824, 103304), + (935825, 185285), (935826, 30), + (935830, 64829), (935836, 101160), + (935837, 26285), (935838, 47255), + (935842, 24001), (935843, 2883), + (935845, 22043), (935855, 92431), + (935859, 293979), (935860, 66864), + (935868, 20000), (935878, 20405), + (935880, 54067), (935881, 36225), + (935887, 659182), (935890, 4945), + (935894, 25708), (935895, 3792), + (935903, 20000), (935910, 68010), + (935912, 34086), (935915, 1920), + (935919, 2043), (935922, 2043), + (935924, 56560), (935925, 558), + (935940, 25109), (935946, 4299), + (935950, 95669), (935952, 10215), + (935955, 14418), (935962, 72698), + (935963, 2450), (935965, 103239), + (935967, 10000), (935970, 17104), + (935975, 6151), (935979, 30), + (935980, 10000), (935982, 8358), + (935987, 55738), (935989, 15580), + (935997, 2450), (935999, 16749), + (936001, 57013), (936002, 2077), + (936004, 118697), (936027, 40466), + (936028, 100), (936035, 4086), + (936047, 17538), (936053, 2450), + (936057, 1755), (936087, 10000), + (936100, 2043), (936101, 14299), + (936105, 1920), (936116, 134905), + (936118, 22016), (936122, 221731), + (936128, 14607), (936129, 49121), + (936131, 12260), (936133, 10000), + (936136, 66864), (936140, 2043), + (936142, 18176), (936143, 61306), + (936150, 24089), (936151, 128415), + (936155, 35297), (936164, 1755), + (936169, 13760), (936171, 1000), + (936176, 69510), (936177, 10000), + (936188, 2450), (936191, 61646), + (936192, 2450), (936195, 72047), + (936202, 8335148), (936209, 28743), + (936217, 53849), (936224, 66864), + (936230, 37031), (936236, 15580), + (936246, 163549), (936248, 5988), + (936253, 79073), (936268, 323009), + (936279, 10000), (936282, 2047), + (936283, 8389), (936288, 85123), + (936290, 52086), (936291, 66336), + (936294, 26262), (936300, 18393), + (936309, 32039), (936316, 65190), + (936325, 38635), (936337, 10000), + (936340, 198223), (936351, 127106), + (936361, 165520), (936367, 13137), + (936368, 165916), (936369, 7098), + (936371, 72309), (936372, 7934), + (936376, 32917), (936389, 82325), + (936390, 14086), (936393, 49388), + (936397, 3740), (936406, 10130), + (936407, 209596), (936410, 131516), + (936411, 80899), (936413, 2039), + (936418, 206400), (936422, 68899), + (936427, 560940), (936434, 1669141), + (936435, 1429956), (936439, 18176), + (936440, 92323), (936444, 100000), + (936449, 201472), (936469, 2910), + (936470, 89940), (936474, 30000), + (936476, 100000), (936480, 41816), + (936489, 16449), (936490, 64509), + (936496, 13963), (936509, 64486), + (936516, 67027), (936519, 32047), + (936522, 769), (936525, 60048), + (936534, 16660), (936539, 97660), + (936546, 1016006), (936547, 4880), + (936562, 20460), (936568, 83720), + (936569, 105099), (936573, 42305), + (936575, 19511), (936580, 111146), + (936584, 23167), (936586, 51570), + (936590, 20396), (936594, 44760), + (936596, 57514), (936599, 75825), + (936600, 30442), (936604, 55382), + (936612, 11000), (936614, 36370), + (936617, 91203), (936621, 6129), + (936622, 171024), (936625, 29929), + (936629, 80819), (936635, 64086), + (936639, 62977), (936641, 16133), + (936649, 73673), (936654, 133663), + (936656, 113630), (936659, 4303), + (936660, 20000), (936665, 144224), + (936667, 10000), (936678, 2450), + (936683, 131835), (936688, 38475), + (936694, 9687), (936697, 70786), + (936702, 61707), (936705, 2043), + (936709, 2450), (936716, 23969), + (936719, 30), (936721, 14370), + (936722, 295010), (936724, 6000), + (936729, 1080), (936734, 2170), + (936736, 12297), (936747, 118047), + (936750, 240553), (936752, 22085), + (936753, 20000), (936758, 103590), + (936761, 17626), (936763, 33098), + (936766, 20000), (936771, 125580), + (936772, 30), (936776, 14497), + (936788, 10000), (936794, 10000), + (936796, 123222), (936802, 324585), + (936809, 18030), (936811, 3625), + (936816, 32242), (936817, 66856), + (936821, 100), (936835, 84211), + (936851, 26325), (936858, 2043), + (936867, 40000), (936871, 42078), + (936877, 4473), (936887, 40372), + (936907, 2047), (936909, 1286024), + (936912, 4488), (936913, 207095), + (936918, 175149), (936921, 126548), + (936922, 2061), (936924, 50909), + (936929, 15580), (936936, 18082), + (936937, 11910), (936940, 78895), + (936953, 30), (936961, 2047), + (936962, 87084), (936967, 1755), + (936972, 10519), (936973, 9899), + (936975, 4398), (936979, 14090), + (936984, 171748), (936999, 15580), + (937001, 69108), (937014, 104579), + (937024, 8356), (937033, 280883), + (937055, 28690), (937058, 872446), + (937059, 85833), (937060, 17354), + (937061, 115735), (937063, 72043), + (937065, 2043), (937072, 200262), + (937076, 49205), (937079, 13340), + (937081, 4419), (937083, 2600), + (937089, 23416), (937100, 50523), + (937101, 26547), (937111, 173570), + (937112, 1505625), (937116, 500000), + (937128, 7983), (937130, 4710), + (937132, 35580), (937133, 52355), + (937152, 14328), (937163, 147647), + (937180, 60), (937188, 4086), + (937197, 19666), (937198, 22448), + (937205, 14086), (937215, 14116), + (937216, 88913), (937221, 131261), + (937226, 70578), (937235, 30000), + (937242, 10000), (937260, 15580), + (937270, 2450), (937274, 20000), + (937283, 12047), (937291, 131125), + (937295, 18193), (937297, 20922), + (937304, 195752), (937312, 125650), + (937320, 10000), (937322, 4094), + (937329, 2350), (937339, 425721), + (937365, 147534), (937384, 78263), + (937385, 59512), (937399, 26000), + (937406, 101508), (937410, 10000), + (937411, 4086), (937414, 82339), + (937439, 32480), (937445, 18628), + (937448, 26577), (937451, 12043), + (937452, 4086), (937454, 69746), + (937456, 2039), (937459, 58636), + (937462, 33661), (937464, 95690), + (937468, 3353), (937469, 8936), + (937471, 1536), (937472, 5157), + (937476, 22043), (937477, 439090), + (937481, 189696), (937482, 141103), + (937490, 100952), (937494, 6835), + (937516, 103260), (937518, 95234), + (937526, 24774), (937529, 1920), + (937534, 130243), (937536, 19840), + (937545, 10000), (937547, 10000), + (937549, 37154), (937550, 15492), + (937557, 2345), (937562, 12660), + (937565, 1208239), (937574, 177219), + (937577, 4065), (937582, 32043), + (937586, 20073), (937587, 1920), + (937591, 12450), (937602, 60612), + (937615, 22102), (937618, 12321), + (937621, 8358), (937622, 2043), + (937625, 17872), (937630, 46656), + (937641, 102450), (937646, 10000), + (937648, 148758), (937651, 87021), + (937653, 240764), (937655, 134352), + (937656, 1582), (937657, 29113), + (937667, 2043), (937668, 29950), + (937670, 62375), (937675, 112776), + (937676, 114575), (937679, 101696), + (937682, 52451), (937688, 157947), + (937698, 32047), (937706, 109152), + (937709, 1131423), (937710, 92422), + (937718, 131745), (937725, 14475), + (937732, 98304), (937737, 12331), + (937740, 38068), (937753, 10000), + (937755, 56759), (937757, 53859), + (937769, 10622), (937771, 12258), + (937775, 10000), (937777, 67150), + (937778, 64949), (937780, 16938), + (937781, 96856), (937791, 2047), + (937798, 29506), (937800, 4082), + (937807, 50932), (937808, 9523), + (937817, 17830), (937821, 86720), + (937829, 20000), (937831, 30073), + (937832, 8357), (937836, 127791), + (937847, 14493), (937848, 26138), + (937853, 390111), (937861, 21506), + (937870, 100000), (937873, 64530), + (937874, 5892), (937878, 119179), + (937879, 4086), (937883, 5000), + (937889, 7826), (937891, 192438), + (937892, 6159), (937895, 4477), + (937898, 44183), (937901, 14128), + (937918, 2043), (937935, 178432), + (937940, 17657), (937943, 74897), + (937956, 4497), (937957, 1920), + (937958, 75565), (937965, 2047), + (937966, 10000), (937971, 12343), + (937973, 234547), (937975, 6978), + (937984, 2450), (937987, 34086), + (937988, 166103), (937994, 16395), + (937996, 112681), (937999, 59229), + (938000, 26199), (938003, 2039), + (938005, 1536), (938011, 90839), + (938014, 6236), (938015, 80227), + (938036, 2043), (938041, 22375), + (938044, 10000), (938046, 14094), + (938055, 92299), (938056, 7562), + (938062, 32761), (938070, 94621), + (938073, 122629), (938079, 53552), + (938086, 527823), (938097, 60486), + (938099, 284190), (938100, 6141), + (938103, 28646), (938104, 10400), + (938107, 10000), (938115, 1007773), + (938116, 41460), (938120, 4094), + (938128, 212673), (938129, 36660), + (938141, 1920), (938142, 5220), + (938155, 28357), (938159, 116541), + (938160, 54666), (938167, 1393153), + (938168, 304541), (938169, 49520), + (938170, 14190), (938186, 127700), + (938188, 64919), (938189, 475060), + (938192, 19740), (938194, 98442), + (938196, 10554), (938199, 13798), + (938200, 8357), (938202, 6224), + (938203, 1755), (938211, 75866), + (938212, 7043), (938230, 2043), + (938232, 74716), (938236, 39383), + (938239, 9496), (938247, 12692), + (938248, 70266), (938249, 392565), + (938255, 32143), (938258, 2450), + (938266, 18357), (938268, 1146), + (938276, 114215), (938284, 38854), + (938292, 13959), (938295, 13740), + (938297, 8387), (938300, 12047), + (938302, 29484), (938307, 30), + (938324, 2069), (938330, 2260), + (938338, 13760), (938349, 10000), + (938351, 100), (938353, 426135), + (938357, 2450), (938369, 147088), + (938384, 85826), (938386, 34830), + (938389, 14111), (938406, 14300), + (938407, 76856), (938415, 261097), + (938416, 10400), (938448, 24323), + (938452, 28030), (938465, 100000), + (938471, 133453), (938472, 10000), + (938489, 56839), (938491, 111850), + (938498, 93017), (938506, 115040), + (938510, 70950), (938521, 32850), + (938523, 43000), (938525, 307057), + (938531, 103941), (938538, 20707), + (938540, 28194), (938541, 30), + (938547, 226595), (938555, 60614), + (938558, 8357), (938566, 34769), + (938569, 170105), (938574, 10617), + (938577, 145971), (938578, 150417), + (938586, 35610), (938587, 134393), + (938588, 20000), (938590, 44107), + (938593, 20000), (938601, 306400), + (938606, 97209), (938607, 15698), + (938608, 71412), (938609, 1920), + (938619, 289550), (938624, 74783), + (938633, 779502), (938639, 2047), + (938640, 25580), (938641, 190765), + (938642, 10000), (938645, 110515), + (938646, 16084), (938649, 28898), + (938650, 46030), (938654, 5320), + (938657, 84355), (938658, 12450), + (938674, 26985), (938676, 30), + (938679, 12450), (938682, 68871), + (938689, 96848), (938697, 92439), + (938704, 103611), (938705, 17660), + (938707, 69719), (938710, 20000), + (938713, 44128), (938714, 35787), + (938722, 100000), (938723, 14902), + (938733, 68842), (938737, 8356), + (938740, 3740), (938742, 241382), + (938747, 112914), (938748, 12450), + (938754, 12442), (938767, 8356), + (938772, 103530), (938776, 2380), + (938777, 6132), (938781, 14493), + (938786, 76840), (938787, 62989), + (938792, 6539), (938798, 222879), + (938805, 37911), (938822, 122659), + (938826, 41622), (938828, 52975), + (938835, 26578), (938842, 2038), + (938845, 165135), (938847, 12085), + (938856, 490514), (938857, 17829), + (938859, 43246), (938860, 20563), + (938862, 57549), (938868, 19320), + (938869, 390026), (938870, 59169), + (938882, 18050), (938893, 18113), + (938901, 72838), (938908, 32046), + (938909, 76840), (938914, 10000), + (938922, 6129), (938924, 10045142), + (938925, 10000), (938928, 98878), + (938933, 17623), (938935, 2043), + (938938, 10000), (938939, 76840), + (938940, 8356), (938944, 16000), + (938948, 95203), (938951, 10000), + (938953, 3306), (938961, 137716), + (938962, 150163), (938963, 2260), + (938966, 35556), (938974, 118700), + (938976, 9819), (938986, 134515), + (938988, 80430), (938992, 40000), + (938995, 15264), (938997, 34357), + (939002, 21762), (939009, 6000), + (939014, 681040), (939018, 18864), + (939020, 69477), (939036, 6129), + (939045, 13695), (939051, 6536), + (939055, 55640), (939057, 13394), + (939058, 112260), (939059, 10440), + (939063, 30000), (939066, 56110), + (939070, 81222), (939092, 18356), + (939097, 72287), (939098, 16124), + (939104, 1582), (939105, 2028), + (939114, 2288), (939121, 32450), + (939129, 145843), (939137, 10000), + (939148, 18043), (939152, 8456), + (939161, 36108), (939163, 40000), + (939172, 10000), (939176, 2043), + (939178, 14278), (939179, 141956), + (939185, 29975), (939188, 138054), + (939191, 13959), (939194, 40729), + (939205, 193851), (939209, 83861), + (939212, 46887), (939215, 20000), + (939218, 78786), (939243, 77284), + (939258, 85752), (939261, 59192), + (939263, 2043), (939274, 26137), + (939276, 667901), (939277, 1630041), + (939282, 34399), (939284, 15), + (939290, 48574), (939292, 15), + (939295, 2043), (939301, 10400), + (939303, 51657), (939305, 238112), + (939307, 2047), (939313, 46213), + (939316, 250129), (939317, 12260), + (939322, 25393), (939330, 16536), + (939331, 38028), (939335, 64223), + (939338, 2450), (939339, 3268), + (939341, 107737), (939352, 84392), + (939354, 10729), (939355, 9914), + (939356, 52129), (939361, 10090), + (939363, 103609), (939368, 92194), + (939384, 22169), (939392, 2615), + (939394, 239349), (939397, 33563), + (939398, 2047), (939407, 12335), + (939408, 66129), (939409, 2465), + (939415, 2077), (939418, 49061), + (939427, 12420), (939434, 66759), + (939440, 16772), (939445, 2147), + (939455, 1920), (939456, 4303), + (939475, 143548), (939477, 51689), + (939478, 32111), (939481, 142795), + (939485, 22346), (939486, 58697), + (939496, 130000), (939502, 39900), + (939505, 16016), (939510, 33319), + (939514, 14090), (939519, 22307), + (939520, 2380), (939525, 3773), + (939526, 56364), (939537, 31510), + (939543, 22043), (939544, 30), + (939555, 10000), (939560, 6468), + (939563, 8607), (939568, 13820), + (939569, 250), (939574, 250), + (939576, 3967), (939578, 316113), + (939579, 2047), (939582, 108176), + (939585, 3629), (939592, 250), + (939594, 33180), (939596, 67787), + (939598, 186084), (939600, 40000), + (939606, 16425), (939607, 246402), + (939619, 61607), (939623, 85365), + (939630, 99695), (939632, 112281), + (939633, 111442), (939635, 235635), + (939638, 160884), (939645, 22900), + (939647, 8350), (939649, 2331), + (939668, 118016), (939677, 12323), + (939683, 726047), (939694, 58645), + (939699, 286452), (939700, 33700), + (939719, 25825), (939723, 16129), + (939728, 11082), (939738, 24374), + (939740, 28545), (939747, 128233), + (939753, 1000), (939756, 37289), + (939760, 51344), (939764, 4520), + (939772, 62320), (939778, 15580), + (939780, 154912), (939788, 14180), + (939799, 117675), (939801, 157922), + (939802, 95293), (939804, 10880), + (939805, 64616), (939812, 40544), + (939823, 43803), (939824, 65175), + (939832, 94283), (939834, 70942), + (939835, 41975), (939841, 4480), + (939842, 43797), (939852, 186985), + (939853, 10000), (939857, 51390), + (939859, 31794), (939863, 30103), + (939865, 2260), (939867, 30), + (939876, 74103), (939886, 11463), + (939888, 82327), (939894, 2450), + (939896, 10000), (939898, 15798), + (939911, 257674), (939915, 67500), + (939918, 121314), (939928, 326812), + (939931, 91051), (939937, 74042), + (939943, 61793), (939958, 25892), + (939963, 6124), (939966, 10000), + (939973, 13283), (939974, 2450), + (939977, 10000), (939981, 97932), + (939991, 45048), (940000, 3260), + (940036, 14080), (940039, 14785), + (940045, 138043), (940049, 35433), + (940053, 74826), (940059, 6006), + (940061, 405980), (940066, 27871), + (940082, 2314), (940083, 29839), + (940086, 115535), (940089, 36233), + (940096, 248690), (940098, 32260), + (940101, 2720), (940105, 2047), + (940109, 30), (940114, 15580), + (940115, 7490), (940134, 10133), + (940147, 34815), (940149, 197513), + (940150, 9425), (940151, 17868), + (940153, 394593), (940154, 3315), + (940156, 20357), (940160, 97089), + (940169, 24531), (940174, 4085), + (940175, 118218), (940183, 36327), + (940184, 186249), (940187, 67098), + (940188, 61866), (940190, 147786), + (940205, 79343), (940208, 198621), + (940224, 12043), (940229, 18000), + (940239, 42414), (940248, 47843), + (940255, 252970), (940261, 25165), + (940264, 283707), (940271, 2450), + (940282, 20000), (940283, 18173), + (940289, 18575), (940291, 28308), + (940293, 21935), (940304, 52690), + (940305, 22443), (940314, 18579), + (940317, 94287), (940320, 18369), + (940333, 44790), (940335, 75230), + (940337, 81349), (940350, 6358), + (940361, 11707), (940363, 12047), + (940378, 22916), (940381, 69407), + (940386, 21105), (940394, 6346), + (940398, 72579), (940405, 266800), + (940409, 20000), (940415, 116131), + (940418, 92444), (940423, 4086), + (940429, 37353), (940442, 27619), + (940443, 11484), (940450, 12043), + (940451, 16000), (940459, 19284), + (940460, 143900), (940462, 26272), + (940465, 10000), (940468, 9647), + (940472, 2047), (940473, 60058), + (940481, 4186), (940489, 5763), + (940494, 2103), (940505, 60558), + (940516, 13904), (940518, 2260), + (940529, 2288), (940541, 17820), + (940554, 78483), (940562, 8318), + (940570, 136504), (940571, 8567), + (940572, 10850), (940573, 2260), + (940575, 2043), (940584, 20724), + (940588, 43541), (940589, 766017), + (940591, 147823), (940594, 10000), + (940599, 6000), (940603, 7955), + (940605, 95477), (940609, 20315), + (940613, 22243), (940616, 154709), + (940620, 12260), (940629, 61273), + (940631, 250), (940641, 177911), + (940644, 10245), (940647, 10000), + (940650, 28754), (940662, 13740), + (940666, 82043), (940667, 12350), + (940671, 16682), (940675, 255445), + (940676, 192269), (940696, 129040), + (940701, 25355), (940703, 20247), + (940710, 321094), (940725, 2450), + (940727, 12085), (940730, 65129), + (940733, 22849), (940735, 181999), + (940744, 34417), (940747, 66466), + (940748, 32424), (940754, 2043), + (940755, 32814), (940757, 4086), + (940762, 19308), (940763, 4086), + (940774, 322), (940778, 13200), + (940783, 2940), (940793, 110130), + (940794, 6340), (940804, 4086), + (940808, 33291), (940811, 120784), + (940818, 10000), (940821, 32965), + (940824, 133203), (940828, 26129), + (940833, 170491), (940836, 30030), + (940855, 37976), (940862, 6850), + (940869, 10000), (940880, 49053), + (940882, 100100), (940889, 2450), + (940894, 25660), (940899, 77971), + (940906, 31160), (940909, 116855), + (940915, 103003), (940918, 3400), + (940923, 2028), (940925, 59712), + (940926, 245), (940931, 2043), + (940932, 23740), (940933, 20782), + (940942, 29456), (940955, 10000), + (940956, 36998), (940959, 51556), + (940960, 26032), (940963, 38359), + (940966, 122634), (940970, 21536), + (940972, 16694), (940977, 12043), + (940980, 43402), (940985, 36780), + (940987, 12287), (940988, 2043), + (940993, 36581), (941002, 78083), + (941011, 6052), (941012, 30489), + (941015, 1321334), (941017, 8456), + (941021, 7458), (941027, 16711), + (941031, 55187), (941032, 109781), + (941034, 1950), (941035, 212109), + (941038, 2043), (941047, 81920), + (941049, 10000), (941054, 5556), + (941058, 1146), (941060, 13426), + (941061, 6129), (941065, 2043), + (941068, 10489), (941077, 7091), + (941081, 6090), (941082, 82), + (941086, 17213), (941100, 20609), + (941101, 14893), (941109, 30723), + (941123, 2043), (941125, 40250), + (941127, 10000), (941142, 6739), + (941144, 22695), (941147, 1129), + (941154, 36000), (941162, 40699), + (941165, 57953), (941166, 40030), + (941168, 83164), (941169, 29197), + (941174, 14579), (941181, 77993), + (941183, 18749), (941185, 10000), + (941192, 116806), (941199, 48266), + (941209, 10000), (941211, 192408), + (941217, 10000), (941219, 23120), + (941223, 2926100), (941224, 13963), + (941226, 112305), (941227, 8172), + (941229, 42859), (941234, 367909), + (941235, 10000), (941246, 18260), + (941250, 1285275), (941252, 24493), + (941255, 12085), (941256, 92435), + (941258, 12375), (941260, 24407), + (941267, 21270), (941275, 20738), + (941284, 2764), (941285, 717), + (941286, 461972), (941289, 312288), + (941298, 18556), (941299, 16536), + (941300, 133024), (941303, 4510), + (941310, 6762), (941315, 156377), + (941318, 84240), (941321, 11146), + (941322, 8172), (941327, 5780), + (941330, 115375), (941332, 12542), + (941339, 91760), (941353, 14649), + (941357, 182151), (941362, 12085), + (941369, 52043), (941375, 99095), + (941382, 22620), (941390, 197623), + (941392, 94213), (941397, 20245), + (941404, 12043), (941410, 54336), + (941414, 2043), (941420, 10000), + (941424, 136558), (941428, 10000), + (941432, 24086), (941451, 10000), + (941457, 40380), (941461, 28939), + (941470, 15580), (941493, 32621), + (941495, 592), (941509, 28906), + (941512, 13037), (941513, 10000), + (941515, 5617), (941523, 6736), + (941532, 4086), (941540, 17001), + (941541, 4086), (941546, 111844), + (941547, 100728), (941548, 83155), + (941550, 20000), (941555, 203000), + (941561, 107384), (941564, 229366), + (941566, 310363), (941573, 512695), + (941578, 54290), (941579, 43882), + (941580, 30), (941584, 2618), + (941590, 4080), (941607, 13370), + (941611, 10000), (941618, 20000), + (941619, 2103125), (941622, 19689), + (941626, 57604), (941628, 5140), + (941641, 47225), (941642, 63113), + (941652, 6190), (941653, 8043), + (941654, 145646), (941656, 391343), + (941658, 43494), (941665, 366367), + (941666, 278), (941667, 1400509), + (941670, 20000), (941672, 37246), + (941681, 10275), (941685, 7018), + (941688, 2700), (941691, 462689), + (941693, 22390), (941694, 55635), + (941705, 39190), (941715, 8708), + (941722, 83721), (941723, 14800), + (941725, 13740), (941730, 55527), + (941733, 31146), (941741, 10000), + (941743, 45085), (941751, 5379), + (941752, 13740), (941753, 303117), + (941756, 30), (941761, 119131), + (941763, 8623), (941766, 1236816), + (941769, 1382320), (941772, 8044), + (941777, 2043), (941780, 32898), + (941788, 18584), (941800, 7826), + (941804, 17008), (941808, 244), + (941811, 10086), (941813, 211484), + (941821, 6129), (941822, 7344), + (941824, 20000), (941834, 130656), + (941844, 200000), (941848, 83625), + (941852, 15473), (941865, 292359), + (941876, 5410), (941877, 54610), + (941889, 26445), (941891, 92043), + (941899, 635), (941901, 245), + (941904, 30497), (941905, 88421), + (941906, 29251), (941910, 329078), + (941912, 82533), (941919, 1539), + (941927, 245), (941939, 34180), + (941947, 22507), (941951, 33778), + (941952, 155117), (941959, 84710), + (941963, 17782), (941973, 5948), + (941978, 2288), (941982, 93087), + (941985, 381738), (941986, 1000), + (941995, 10000), (941997, 59256), + (942001, 3021), (942008, 40790), + (942011, 78878), (942014, 4637), + (942016, 74823), (942021, 2043), + (942022, 47450), (942029, 245), + (942031, 10000), (942033, 33203), + (942036, 8535), (942040, 60258), + (942042, 221209), (942044, 309094), + (942049, 87097), (942056, 381124), + (942062, 42043), (942072, 10000), + (942073, 13993), (942076, 8833), + (942078, 111188), (942080, 111365), + (942082, 46695), (942085, 2535), + (942088, 2260), (942093, 22287), + (942097, 102043), (942112, 29855), + (942113, 22675), (942115, 82727), + (942116, 13740), (942117, 48000), + (942119, 10000), (942127, 101724), + (942136, 11129), (942143, 768), + (942145, 2043), (942154, 5216), + (942156, 2600), (942159, 22832), + (942169, 38174), (942170, 27856), + (942173, 157275), (942177, 54520), + (942184, 14582), (942185, 26532), + (942190, 138985), (942195, 488103), + (942208, 393), (942220, 143836), + (942221, 243), (942228, 89453), + (942230, 10000), (942232, 24153), + (942242, 102260), (942243, 276194), + (942246, 52048), (942248, 32290), + (942249, 386913), (942257, 10886), + (942267, 89187), (942274, 215178), + (942275, 21633), (942277, 15326), + (942278, 124493), (942285, 185552), + (942289, 1275903), (942295, 10000), + (942301, 14073), (942305, 156423), + (942308, 34365), (942309, 4190), + (942314, 123020), (942327, 2047), + (942329, 108257), (942330, 212869), + (942331, 221020), (942339, 2043), + (942358, 15610), (942362, 378891), + (942368, 3189), (942372, 71003), + (942378, 26000), (942380, 10000), + (942388, 37088), (942389, 29620), + (942391, 89361), (942398, 9503), + (942402, 17000), (942404, 22980), + (942410, 13323), (942414, 166598), + (942417, 364822), (942419, 4930), + (942421, 34374), (942433, 21356), + (942445, 60502), (942453, 2450), + (942476, 16202), (942477, 2039), + (942478, 54408), (942481, 2039), + (942487, 13896), (942488, 4661), + (942507, 4595), (942508, 3989), + (942509, 2260), (942524, 10000), + (942525, 10000), (942531, 224009), + (942535, 34751), (942537, 12653), + (942540, 51709), (942541, 34258), + (942544, 5915), (942550, 50171), + (942551, 2043), (942556, 13740), + (942567, 2043), (942569, 10000), + (942571, 14733), (942582, 126099), + (942585, 14638), (942591, 2043), + (942596, 93807), (942598, 26780), + (942624, 25937), (942630, 2322), + (942634, 20000), (942638, 11816), + (942640, 16333), (942650, 2043), + (942651, 22322), (942653, 100000), + (942655, 10863), (942663, 2910), + (942671, 16536), (942677, 32496), + (942682, 13791), (942690, 41306), + (942693, 2430), (942694, 10000), + (942712, 30), (942717, 20055), + (942725, 29506), (942727, 207532), + (942730, 1470), (942736, 22080), + (942737, 138786), (942738, 123550), + (942743, 22043), (942753, 22595), + (942758, 45710), (942764, 17042), + (942769, 46239), (942775, 10000), + (942780, 12043), (942783, 10000), + (942785, 4251217), (942788, 1275903), + (942790, 12375), (942791, 106374), + (942793, 57003), (942796, 10100), + (942797, 14086), (942805, 7217), + (942812, 14921), (942817, 59592), + (942821, 36977), (942824, 2450), + (942828, 20000), (942831, 136522), + (942832, 102695), (942833, 30000), + (942843, 2079), (942844, 314719), + (942845, 4086), (942847, 47030), + (942856, 229391), (942857, 20000), + (942858, 30030), (942860, 10000), + (942863, 47695), (942876, 27352), + (942878, 153753), (942882, 18664), + (942890, 14596), (942898, 107019), + (942903, 87115), (942909, 166983), + (942919, 51665), (942920, 75272), + (942927, 74232), (942930, 15878), + (942933, 6882), (942935, 64950), + (942941, 11423), (942951, 20000), + (942953, 100000), (942961, 5983), + (942966, 98172), (942980, 6964), + (942981, 98172), (942994, 108049), + (942996, 5996), (943003, 275), + (943005, 17006), (943011, 22558), + (943018, 110000), (943019, 20471), + (943023, 17868), (943025, 1366418), + (943026, 28564), (943030, 110245), + (943034, 14493), (943036, 15648), + (943041, 10000), (943043, 29770), + (943068, 244), (943072, 18530), + (943084, 47020), (943095, 10000), + (943102, 20990), (943108, 14435), + (943113, 13044), (943126, 18719), + (943128, 18796), (943134, 33701), + (943146, 16498), (943149, 9363), + (943150, 2435), (943151, 20460), + (943161, 116346), (943163, 17582), + (943167, 58172), (943178, 12595), + (943184, 12375), (943185, 22819), + (943204, 37623), (943205, 86185), + (943208, 2043), (943213, 87900), + (943224, 2043), (943229, 4493), + (943232, 145652), (943234, 32595), + (943240, 41826), (943244, 12043), + (943249, 8144), (943250, 356130), + (943253, 10000), (943257, 26537), + (943265, 45653), (943267, 39251), + (943274, 10244), (943275, 51836), + (943280, 30), (943281, 118322), + (943293, 37653), (943295, 215940), + (943299, 43211), (943308, 1950), + (943310, 40000), (943314, 6129), + (943315, 114638), (943322, 4993), + (943331, 30043), (943334, 245), + (943343, 34852), (943350, 14333), + (943356, 30318), (943363, 6522), + (943372, 124033), (943375, 16436), + (943381, 10661), (943383, 43101), + (943386, 23565), (943387, 10000), + (943395, 140301), (943397, 10000), + (943414, 133818), (943415, 16000), + (943416, 145234), (943419, 26738), + (943423, 279), (943424, 30000), + (943426, 133077), (943428, 342000), + (943432, 82946), (943434, 14086), + (943436, 44399), (943445, 91692), + (943447, 110030), (943448, 34450), + (943450, 43367), (943451, 54896), + (943458, 3411), (943461, 8045), + (943462, 124498), (943463, 86328), + (943466, 32450), (943467, 38172), + (943479, 52028), (943484, 32243), + (943493, 65142), (943496, 172773), + (943510, 2532345), (943513, 21268), + (943514, 99985), (943516, 43425), + (943521, 15543), (943525, 15580), + (943529, 14005), (943547, 2047), + (943560, 43142), (943564, 2043), + (943569, 13959), (943572, 2043), + (943573, 19573), (943579, 90093), + (943596, 115675), (943597, 18043), + (943603, 25740), (943606, 10000), + (943607, 72619), (943611, 45580), + (943614, 2361), (943615, 33356), + (943625, 6995), (943627, 14086), + (943630, 61040), (943639, 32043), + (943641, 12043), (943649, 97519), + (943653, 2690), (943659, 17623), + (943663, 110000), (943668, 75725), + (943671, 63556), (943673, 12043), + (943674, 29043), (943678, 10268), + (943680, 92150), (943681, 6000), + (943691, 8468), (943694, 110277), + (943699, 18750), (943700, 10399), + (943719, 42431), (943722, 4397), + (943726, 5778), (943727, 100), + (943733, 22043), (943734, 3820), + (943741, 10806), (943744, 32231), + (943752, 139386), (943757, 21316), + (943758, 12085), (943767, 71002), + (943772, 12043), (943776, 38254), + (943786, 26712), (943795, 12450), + (943801, 19750), (943803, 2450), + (943807, 7826), (943812, 14360), + (943816, 6129), (943817, 75437), + (943820, 108129), (943824, 30806), + (943827, 12450), (943838, 20400), + (943863, 33911), (943877, 22693), + (943883, 24000), (943889, 2043), + (943895, 28545), (943898, 268338), + (943901, 203000), (943907, 20000), + (943912, 13097), (943917, 22780), + (943933, 2047), (943945, 2450), + (943947, 4729), (943952, 1282032), + (943955, 16565), (943958, 54491), + (943961, 22043), (943963, 59367), + (943964, 63761), (943966, 27133), + (943970, 126117), (943971, 23938), + (943972, 712532), (943974, 29028), + (943980, 105958), (943986, 15498), + (943988, 2450), (943989, 2043), + (943997, 5783), (944000, 20460), + (944001, 2450), (944005, 21023), + (944011, 10000), (944014, 2226927), + (944017, 175261), (944018, 99673), + (944020, 26536), (944028, 145327), + (944034, 20190), (944036, 102043), + (944044, 23681), (944051, 43016), + (944052, 30), (944054, 78251), + (944057, 66989), (944062, 78603), + (944064, 10000), (944074, 37691), + (944075, 4800), (944081, 10000), + (944085, 27318), (944086, 19338), + (944090, 8980), (944095, 2043), + (944109, 67665), (944115, 5302), + (944116, 12260), (944117, 16536), + (944120, 10500), (944129, 2331), + (944138, 22047), (944140, 53980), + (944141, 13675), (944145, 103643), + (944149, 4086), (944153, 86381), + (944158, 2028), (944162, 10000), + (944164, 162538), (944167, 4085), + (944170, 55288), (944172, 86958), + (944173, 18389), (944175, 31461), + (944178, 23936), (944181, 14086), + (944183, 79842), (944184, 20000), + (944185, 14028), (944192, 119923), + (944194, 61385), (944204, 56079), + (944205, 75236), (944209, 164843), + (944211, 20949), (944212, 8591), + (944214, 18759), (944215, 18356), + (944221, 17399), (944222, 21476), + (944224, 87901), (944227, 14805), + (944228, 30591), (944232, 12663), + (944233, 8356), (944235, 20251), + (944241, 55830), (944252, 21990), + (944254, 105901), (944255, 61482), + (944260, 23067), (944264, 57893), + (944266, 41076), (944271, 139896), + (944276, 26303), (944281, 672674), + (944282, 48291), (944284, 2047), + (944286, 9744), (944289, 14086), + (944299, 22047), (944300, 2043), + (944303, 90795), (944309, 161069), + (944310, 2047), (944327, 18356), + (944329, 15580), (944339, 32323), + (944342, 6506), (944346, 713068), + (944348, 2450), (944356, 336230), + (944364, 358343), (944366, 128375), + (944367, 43551), (944373, 32933), + (944374, 2043), (944379, 2260), + (944382, 118867), (944384, 56400), + (944400, 170937), (944402, 8175), + (944404, 8386), (944410, 2043), + (944413, 20252), (944422, 55042), + (944424, 19968), (944426, 16032), + (944433, 102618), (944440, 98338), + (944445, 10892), (944448, 158980), + (944452, 12085), (944460, 4340), + (944463, 10000), (944465, 553650), + (944475, 58873), (944476, 113329), + (944482, 4090), (944486, 29959), + (944488, 4086), (944492, 9073), + (944493, 86163), (944495, 1362218), + (944497, 46963), (944498, 230087), + (944502, 121178), (944503, 13238), + (944505, 15856), (944506, 8464), + (944510, 57199), (944513, 26805), + (944521, 60), (944525, 16125), + (944532, 184589), (944536, 15323), + (944544, 50849), (944546, 12043), + (944551, 123237), (944552, 103269), + (944555, 475761), (944556, 30257), + (944561, 2043), (944572, 8541), + (944580, 79851), (944582, 128265), + (944586, 20443), (944594, 27826), + (944606, 2047), (944608, 30000), + (944613, 12260), (944614, 138268), + (944619, 13384), (944620, 92838), + (944625, 2043), (944635, 10000), + (944636, 16129), (944639, 22747), + (944640, 2039), (944646, 63289), + (944647, 27623), (944652, 22661), + (944655, 12728), (944661, 10564893), + (944664, 2052), (944665, 24568), + (944670, 100554), (944672, 24128), + (944675, 3400), (944678, 6579), + (944680, 12444), (944681, 6000), + (944683, 22453), (944696, 29121), + (944707, 2450), (944713, 10000), + (944714, 6133), (944726, 52383), + (944739, 2323), (944741, 3284), + (944742, 323532), (944743, 78590), + (944744, 10993), (944745, 20000), + (944751, 174001), (944757, 24905), + (944763, 71), (944764, 53041), + (944765, 129143), (944768, 10000), + (944769, 82), (944775, 110499), + (944777, 10000), (944778, 991393), + (944779, 14128), (944781, 21674), + (944786, 12043), (944787, 39035), + (944788, 13400), (944793, 22443), + (944795, 102994), (944800, 12350), + (944806, 24214), (944813, 27468), + (944815, 115466), (944817, 53784), + (944825, 12047), (944828, 15664), + (944829, 24819), (944833, 132814), + (944836, 13376), (944844, 2043), + (944848, 20000), (944850, 84553), + (944851, 123216), (944866, 18800), + (944868, 97363), (944869, 437882), + (944870, 41445), (944871, 71147), + (944876, 12450), (944881, 4500), + (944889, 14090), (944890, 6000), + (944894, 14579), (944898, 116278), + (944912, 16868), (944916, 14500), + (944918, 12375), (944923, 5331), + (944925, 122139), (944931, 3820), + (944939, 2450), (944943, 2047), + (944948, 58408), (944960, 12047), + (944962, 120676), (944963, 30), + (944967, 63510), (944971, 110868), + (944981, 12043), (944987, 8180), + (944989, 30000), (944991, 10000), + (945014, 12450), (945020, 18483), + (945022, 5331), (945023, 371600), + (945024, 51879), (945025, 16368), + (945027, 8472), (945031, 8188), + (945032, 709284), (945033, 12258), + (945035, 44013), (945041, 2450), + (945062, 100030), (945064, 100000), + (945076, 85181), (945079, 8940), + (945080, 4090), (945087, 8151), + (945091, 10000), (945094, 1457215), + (945100, 8923), (945101, 6000), + (945106, 14086), (945108, 6129), + (945113, 25610), (945117, 2115656), + (945119, 108186), (945122, 12085), + (945129, 83649), (945133, 2350), + (945137, 34132), (945147, 43481), + (945149, 482696), (945154, 73400), + (945164, 37162), (945168, 2043), + (945170, 103612), (945175, 54446), + (945183, 58264), (945190, 108903), + (945193, 18514), (945195, 36300), + (945200, 234641), (945201, 8372), + (945205, 16862), (945208, 2047), + (945209, 28357), (945219, 2043), + (945220, 30000), (945222, 262630), + (945227, 76856), (945231, 100), + (945232, 283804), (945235, 37826), + (945240, 62886), (945242, 142391), + (945248, 69485), (945251, 8357), + (945252, 144683), (945255, 4086), + (945256, 115213), (945257, 10000), + (945263, 77025), (945275, 140819), + (945277, 12350), (945288, 4389), + (945289, 26747), (945292, 1146), + (945295, 66856), (945299, 2043), + (945304, 26465), (945315, 78362), + (945319, 28030), (945325, 2043), + (945336, 24638), (945337, 28700), + (945344, 1950), (945345, 73729), + (945347, 16536), (945351, 84393), + (945352, 32450), (945355, 50643), + (945359, 20482), (945360, 48954), + (945364, 105703), (945378, 129005), + (945382, 2043), (945387, 18357), + (945390, 12073), (945400, 18047), + (945402, 16133), (945403, 8960), + (945404, 75621), (945411, 178393), + (945413, 39302), (945414, 91527), + (945416, 2350), (945419, 231976), + (945424, 14258), (945438, 10000), + (945441, 20000), (945448, 138778), + (945457, 6298), (945474, 5220), + (945477, 31902), (945478, 354985), + (945482, 92821), (945483, 387605), + (945485, 35701), (945487, 11000), + (945488, 138266), (945490, 10000), + (945495, 2450), (945499, 32843), + (945505, 4086), (945518, 30733), + (945519, 30), (945527, 99812), + (945536, 138006), (945538, 78107), + (945545, 12038), (945550, 10670), + (945554, 169603), (945561, 30), + (945566, 121381), (945569, 10000), + (945581, 17115), (945595, 12363), + (945602, 30210), (945609, 24936), + (945610, 12207), (945617, 48513), + (945622, 2536), (945623, 30), + (945625, 70631), (945641, 10000), + (945642, 12663), (945644, 82759), + (945654, 2043), (945660, 169415), + (945663, 20000), (945667, 174420), + (945675, 30), (945680, 2043), + (945697, 4086), (945698, 2450), + (945704, 17930), (945712, 106558), + (945731, 118356), (945733, 2260), + (945736, 4980), (945741, 18000), + (945743, 242799), (945758, 22684), + (945768, 76939), (945769, 31907), + (945771, 20403), (945778, 4369), + (945782, 120000), (945783, 10000), + (945786, 112973), (945789, 151537), + (945791, 8356), (945793, 57363), + (945798, 18336), (945809, 10071487), + (945815, 79820), (945819, 30355), + (945829, 81471), (945830, 17377), + (945848, 46283), (945849, 7000), + (945860, 2370), (945867, 127718), + (945880, 10649), (945887, 87903), + (945890, 38356), (945891, 2450), + (945898, 34506), (945902, 12464), + (945909, 37985), (945914, 88962), + (945917, 46106), (945936, 2043), + (945937, 20000), (945943, 102992), + (945956, 10000), (945963, 15341), + (945964, 12043), (945968, 15610), + (945969, 10000), (945973, 20807), + (945978, 327897), (945982, 76552), + (945986, 15263), (945995, 73473), + (945996, 124086), (945999, 179899), + (946011, 20000), (946012, 2450), + (946021, 10000), (946024, 20000), + (946026, 30000), (946031, 50305), + (946033, 22043), (946038, 19907), + (946039, 2043), (946056, 21093), + (946062, 30), (946063, 20442), + (946068, 16129), (946079, 8357), + (946085, 22443), (946088, 103417), + (946090, 164531), (946092, 105737), + (946103, 1333311), (946105, 211823), + (946107, 2956), (946108, 36818), + (946117, 9777), (946127, 2690), + (946128, 18575), (946134, 113456), + (946136, 8357), (946152, 5227), + (946153, 10707), (946157, 10000), + (946165, 51788), (946166, 561738), + (946175, 465539), (946179, 28263), + (946188, 15580), (946193, 2047), + (946194, 2450), (946211, 1888), + (946214, 2450), (946216, 94798), + (946218, 25580), (946238, 92064), + (946240, 10000), (946242, 161467), + (946244, 12260), (946255, 23429), + (946256, 210432), (946261, 6129), + (946264, 4086), (946273, 132258), + (946279, 17623), (946281, 2350), + (946285, 30067), (946289, 8357), + (946293, 34612), (946299, 1526960), + (946301, 33938), (946304, 160781), + (946308, 10000), (946313, 20401), + (946314, 148055), (946316, 236692), + (946320, 28679), (946325, 30914), + (946333, 20000), (946336, 64444), + (946338, 19889), (946350, 27883), + (946351, 10507), (946352, 103062), + (946361, 92945), (946363, 28065), + (946364, 62980), (946368, 10808), + (946372, 108479), (946379, 184750), + (946382, 27981), (946383, 86864), + (946384, 85597), (946396, 189444), + (946398, 2350), (946411, 2702), + (946425, 104086), (946431, 79195), + (946433, 217704), (946434, 10000), + (946441, 116097), (946442, 5626), + (946454, 55746), (946456, 98724), + (946459, 12043), (946466, 29244), + (946468, 136379), (946469, 19666), + (946473, 16716), (946474, 11391), + (946495, 25421), (946496, 13740), + (946497, 201857), (946501, 6129), + (946507, 208090), (946511, 37897), + (946512, 85106), (946528, 2043), + (946529, 12085), (946540, 306295), + (946543, 25580), (946545, 148738), + (946550, 88310), (946553, 1146), + (946555, 2047), (946556, 23043), + (946559, 137930), (946565, 6910), + (946566, 134414), (946567, 16129), + (946571, 70948), (946573, 131176), + (946599, 2899), (946604, 8357), + (946607, 14393), (946609, 30114), + (946610, 94997), (946612, 9030), + (946614, 31800), (946626, 12077), + (946647, 6000), (946652, 124440), + (946653, 62320), (946655, 212402), + (946656, 98918), (946658, 20404), + (946659, 30), (946662, 365083), + (946667, 153830), (946669, 229506), + (946673, 18583), (946681, 160203), + (946683, 31823), (946696, 24659), + (946699, 15610), (946707, 231784), + (946709, 22422), (946710, 15157), + (946711, 6133), (946713, 38075), + (946726, 40269), (946742, 46704), + (946760, 1598), (946768, 35237), + (946769, 3193), (946788, 94125), + (946795, 6129), (946796, 12690), + (946800, 11379), (946801, 38364), + (946802, 324825), (946805, 641462), + (946808, 3184), (946811, 72107), + (946820, 4082), (946825, 108259), + (946826, 1920), (946834, 8761), + (946836, 411574), (946841, 650377), + (946844, 80836), (946850, 153576), + (946857, 10000), (946868, 12069), + (946886, 54741), (946889, 13136), + (946894, 112030), (946895, 2260), + (946898, 61513), (946900, 81630), + (946902, 344942), (946903, 174439), + (946904, 23240), (946905, 300), + (946909, 4880), (946912, 4763), + (946915, 27750), (946920, 112536), + (946926, 2450), (946927, 10000), + (946931, 30739), (946932, 28575), + (946934, 67456), (946937, 14307), + (946938, 18483), (946939, 40751), + (946942, 11920), (946952, 49856), + (946955, 10000), (946961, 168899), + (946965, 95806), (946967, 30837), + (946970, 104711), (946986, 15749), + (946995, 138472), (946996, 293257), + (946997, 69236), (946998, 10000), + (947001, 25668), (947004, 1920), + (947011, 105061), (947012, 8172), + (947015, 948714), (947019, 6686), + (947026, 190095), (947031, 96873), + (947034, 4272), (947035, 94149), + (947048, 13596), (947061, 2043), + (947062, 18202), (947063, 2043), + (947072, 10000), (947075, 2043), + (947080, 12350), (947081, 43216), + (947095, 24186), (947096, 30), + (947105, 3751), (947119, 116032), + (947120, 16032), (947125, 250), + (947127, 126528), (947134, 100000), + (947149, 10000), (947151, 12450), + (947153, 2450), (947166, 66300), + (947174, 4086), (947175, 38783), + (947176, 38185), (947182, 230098), + (947183, 4801), (947190, 44760), + (947196, 9490), (947203, 71927), + (947208, 57891), (947213, 41917), + (947215, 4086), (947219, 2043), + (947221, 2047), (947224, 130399), + (947230, 48886), (947231, 20000), + (947232, 20215), (947236, 91782), + (947250, 108733), (947253, 103383), + (947255, 125431), (947256, 157511), + (947257, 73452), (947258, 22702), + (947262, 4086), (947266, 13931), + (947269, 75082), (947280, 15580), + (947287, 58582), (947290, 89299), + (947294, 124444), (947297, 2043), + (947298, 107187), (947299, 5725), + (947301, 18214), (947308, 173210), + (947310, 819101), (947312, 104490), + (947317, 2043), (947323, 281015), + (947330, 105036), (947331, 2047), + (947337, 10000), (947347, 197151), + (947355, 2811), (947361, 68350), + (947370, 22043), (947375, 16129), + (947378, 102728), (947382, 67029), + (947384, 12443), (947394, 86206), + (947396, 5787), (947402, 30), + (947403, 14357), (947405, 41430), + (947407, 14520), (947412, 1380079), + (947414, 107149), (947425, 66921), + (947433, 78244), (947435, 10000), + (947450, 12350), (947454, 16547), + (947456, 55334), (947457, 281527), + (947458, 115497), (947465, 91159), + (947467, 2043), (947468, 2992), + (947470, 120149), (947476, 8357), + (947480, 12480), (947481, 205027), + (947482, 39153), (947488, 30), + (947489, 18454), (947493, 162651), + (947496, 44079), (947497, 2043), + (947498, 8430), (947501, 109251), + (947507, 2077), (947514, 8039), + (947523, 86886), (947526, 16939), + (947529, 1211856), (947532, 16129), + (947535, 10000), (947536, 155062), + (947538, 13043), (947550, 163696), + (947554, 36609), (947564, 22750), + (947565, 94878), (947567, 653879), + (947573, 10000), (947575, 64242), + (947581, 11089), (947592, 125947), + (947619, 63819), (947630, 2043), + (947632, 9496), (947635, 1288563), + (947636, 41891), (947637, 12695), + (947640, 120232), (947643, 10000), + (947646, 387744), (947656, 1258911), + (947662, 42038), (947663, 88024), + (947671, 12536), (947675, 11986), + (947682, 79296), (947685, 51585), + (947693, 59087), (947696, 129995), + (947697, 5327), (947723, 109060), + (947725, 31160), (947728, 68224), + (947731, 59611), (947745, 15580), + (947750, 14081), (947761, 106856), + (947764, 2260), (947767, 16783), + (947770, 149369), (947771, 124397), + (947772, 12375), (947783, 14086), + (947789, 102878), (947792, 118250), + (947797, 168397), (947798, 31160), + (947800, 37529), (947801, 31160), + (947802, 24528), (947806, 14086), + (947814, 39927), (947815, 61241), + (947820, 126849), (947828, 8357), + (947832, 1832), (947833, 107602), + (947835, 154939), (947837, 127545), + (947838, 2047), (947840, 1451387), + (947846, 20000), (947848, 39040), + (947849, 10712), (947859, 69306), + (947866, 17072), (947869, 1268513), + (947881, 6133), (947888, 560918), + (947890, 2043), (947892, 100000), + (947894, 27283), (947901, 30000), + (947905, 10000), (947919, 22047), + (947920, 10090), (947922, 157272), + (947925, 104065), (947939, 92077), + (947945, 125189), (947947, 374), + (947949, 12536), (947952, 49498), + (947954, 2910), (947955, 2430), + (947957, 2450), (947959, 6804), + (947961, 3654), (947969, 45063), + (947970, 14845), (947972, 216129), + (947974, 2043), (947975, 75361), + (947978, 24560), (947980, 11453), + (947997, 6000), (947999, 28536), + (948020, 76395), (948023, 231451), + (948025, 27215), (948029, 72430), + (948031, 32450), (948032, 30000), + (948044, 26722), (948053, 24025), + (948058, 12450), (948060, 106856), + (948061, 76129), (948062, 42559), + (948064, 132737), (948066, 26369), + (948069, 213900), (948076, 129270), + (948084, 30), (948085, 20267), + (948093, 157661), (948095, 10400), + (948105, 12043), (948106, 75278), + (948109, 57305), (948130, 33479), + (948140, 24491), (948143, 81601), + (948146, 14513), (948158, 45580), + (948159, 899365), (948168, 27275), + (948171, 77265), (948173, 7001), + (948177, 26410), (948181, 75448), + (948187, 1536), (948190, 34090), + (948196, 10000), (948198, 2039), + (948199, 4473), (948201, 35856), + (948207, 20000), (948208, 24358), + (948217, 24190), (948226, 618572), + (948228, 16000), (948234, 65334), + (948244, 126291), (948247, 72600), + (948257, 9901), (948269, 10000), + (948271, 18980), (948273, 84775), + (948282, 66272), (948288, 12047), + (948291, 10000), (948293, 58801), + (948294, 60309), (948300, 72833), + (948311, 2043), (948316, 20000), + (948326, 175870), (948331, 1322375), + (948334, 2039), (948337, 10000), + (948340, 3202), (948347, 17641), + (948348, 1888), (948357, 10433), + (948359, 5741), (948369, 243134), + (948370, 2450), (948374, 14630), + (948375, 48422), (948378, 102047), + (948388, 10000), (948396, 122974), + (948402, 16938), (948406, 18388), + (948409, 154832), (948411, 231614), + (948413, 6686), (948415, 4086), + (948431, 106129), (948435, 24374), + (948440, 1146045), (948441, 321928), + (948444, 17931), (948448, 83041), + (948454, 70745), (948457, 300207), + (948463, 75885), (948465, 8358), + (948475, 212335), (948486, 267344), + (948491, 34086), (948498, 4082), + (948501, 1100378), (948508, 14086), + (948514, 251297), (948515, 65134), + (948519, 303569), (948525, 12043), + (948532, 81234), (948538, 210000), + (948544, 5443), (948545, 31675), + (948549, 194164), (948552, 67105), + (948554, 28760), (948558, 23963), + (948567, 21177), (948570, 14086), + (948571, 14319), (948573, 24735), + (948587, 27539), (948590, 10000), + (948613, 22375), (948614, 66633), + (948616, 56741), (948617, 30257), + (948621, 12047), (948623, 76310), + (948627, 113436), (948628, 27406), + (948633, 10000), (948649, 6133), + (948651, 72162), (948657, 40403), + (948658, 176280), (948660, 68216), + (948663, 247486), (948664, 20055), + (948665, 210944), (948685, 10000), + (948693, 102298), (948694, 72069), + (948697, 10000), (948715, 111920), + (948716, 35114), (948721, 2047), + (948725, 12043), (948727, 343749), + (948728, 1288236), (948733, 12450), + (948736, 8260), (948744, 30211), + (948748, 17813), (948751, 8207), + (948759, 25627), (948766, 41758), + (948770, 302471), (948772, 32043), + (948779, 26350), (948781, 66864), + (948782, 10000), (948785, 108168), + (948796, 2934822), (948799, 2600), + (948804, 23922), (948812, 8450), + (948816, 20843), (948817, 2030), + (948819, 4086), (948822, 10000), + (948834, 30499), (948836, 22843), + (948848, 66868), (948858, 2510), + (948861, 10030), (948864, 250), + (948865, 4307), (948868, 14893), + (948870, 3967), (948874, 134328), + (948875, 91372), (948877, 7518), + (948883, 7449), (948887, 33150), + (948894, 250), (948895, 30000), + (948897, 129547), (948898, 119912), + (948904, 146340), (948905, 55276), + (948922, 71154), (948923, 68876), + (948940, 174764), (948955, 119909), + (948963, 17715), (948966, 4086), + (948970, 4654), (948972, 14180), + (948973, 178333), (948978, 182722), + (948982, 26314), (948984, 250), + (948985, 226053), (948986, 8172), + (948987, 115725), (948988, 15240), + (948993, 76032), (948994, 30), + (948998, 30), (949000, 10000), + (949012, 115987), (949014, 30618), + (949019, 21453), (949028, 23990), + (949031, 2043), (949032, 244445), + (949034, 10000), (949040, 43705), + (949041, 10000), (949044, 39216), + (949046, 10397), (949058, 20000), + (949062, 41195), (949078, 6000), + (949079, 6000), (949085, 82745), + (949094, 30133), (949098, 3400), + (949102, 282476), (949103, 54203), + (949104, 12039), (949107, 10000), + (949110, 94985), (949112, 100000), + (949113, 67183), (949116, 11582), + (949117, 32301), (949128, 24491), + (949130, 10128), (949135, 186752), + (949144, 2450), (949148, 20833), + (949154, 11390), (949159, 12260), + (949160, 190643), (949180, 101495), + (949181, 3740), (949182, 428728), + (949189, 66864), (949191, 3930), + (949196, 144647), (949197, 142232), + (949200, 41940), (949205, 10000), + (949210, 135420), (949211, 44366), + (949217, 265051), (949227, 46148), + (949228, 1076200), (949233, 183256), + (949241, 2030), (949245, 10080219), + (949258, 104540), (949263, 14393), + (949265, 8358), (949268, 306220), + (949270, 89294), (949272, 8358), + (949277, 20460), (949292, 251628), + (949303, 40707), (949305, 32755), + (949308, 22809), (949309, 107401), + (949316, 18358), (949324, 12043), + (949329, 13405), (949330, 46647), + (949331, 13284), (949336, 35726), + (949337, 174088), (949338, 5599), + (949342, 24872), (949345, 24746), + (949346, 10001), (949348, 64326), + (949349, 85528), (949350, 25222), + (949361, 30000), (949381, 76864), + (949387, 74542), (949395, 89513), + (949398, 61674), (949399, 65184), + (949406, 232038), (949408, 8358), + (949410, 8358), (949415, 35326), + (949418, 2315), (949422, 332872), + (949423, 14497), (949429, 4086), + (949438, 34200), (949442, 129440), + (949447, 76864), (949449, 14086), + (949450, 12039), (949456, 29070), + (949457, 84749), (949461, 6799), + (949466, 10000), (949476, 54407), + (949479, 18172), (949481, 67550), + (949484, 4489), (949511, 38918), + (949525, 139104), (949529, 28141), + (949530, 56659), (949532, 12000), + (949538, 8450), (949549, 17826), + (949558, 120215), (949560, 77672), + (949569, 16835), (949570, 13679), + (949578, 29982), (949581, 78784), + (949587, 2043), (949588, 36630), + (949592, 2043), (949599, 28545), + (949607, 290758), (949608, 165522), + (949614, 3473196), (949618, 202506), + (949620, 21246), (949624, 10000), + (949626, 8172), (949630, 4086), + (949644, 32755), (949645, 32012), + (949664, 16129), (949668, 12724), + (949671, 258666), (949674, 2350), + (949677, 17619), (949679, 14284), + (949682, 237114), (949683, 10233), + (949684, 51182), (949685, 17690), + (949686, 3840), (949690, 84701), + (949692, 8358), (949693, 191894), + (949694, 3284), (949697, 6133), + (949701, 9795), (949718, 1920), + (949727, 13030), (949730, 60526), + (949738, 53982), (949742, 471977), + (949746, 127947), (949747, 88321), + (949754, 30), (949759, 20399), + (949769, 77514), (949776, 40707), + (949778, 88402), (949780, 27287), + (949787, 12260), (949789, 30), + (949790, 38742), (949791, 22177), + (949795, 10000), (949796, 35296), + (949797, 10434), (949799, 22892), + (949806, 20670), (949819, 75248), + (949823, 84106), (949826, 8357), + (949829, 254396), (949845, 95180), + (949847, 97569), (949863, 4610), + (949865, 213436), (949875, 27895), + (949876, 16276), (949886, 21610), + (949894, 10000), (949896, 52034), + (949900, 17768), (949901, 71213), + (949902, 13267), (949906, 27339), + (949913, 15617), (949918, 101107), + (949927, 130), (949930, 54904), + (949931, 68899), (949932, 250), + (949942, 372007), (949947, 29250), + (949949, 2043), (949959, 4836), + (949960, 66246), (949962, 10092), + (949969, 8357), (949970, 40864), + (949971, 7946), (949974, 10000), + (949978, 74563), (949994, 10553), + (950000, 22669), (950001, 45362), + (950005, 90682), (950008, 68418), + (950009, 40404), (950013, 64021), + (950016, 177256), (950020, 24683), + (950023, 10071), (950036, 98695), + (950037, 10000), (950039, 141554), + (950046, 67191), (950048, 89148), + (950053, 103), (950055, 31081), + (950067, 83506), (950071, 14480), + (950076, 1581981), (950082, 105041), + (950084, 30800), (950092, 220272), + (950093, 429778), (950100, 10000), + (950102, 139475), (950104, 2450), + (950107, 66848), (950112, 3930), + (950126, 78270), (950130, 12442), + (950136, 2043), (950138, 211792), + (950142, 11382), (950143, 10000), + (950152, 78462), (950156, 12260), + (950162, 4658), (950163, 162657), + (950169, 20000), (950180, 69105), + (950186, 66848), (950191, 2043), + (950202, 53937), (950205, 86848), + (950209, 12269), (950211, 12446), + (950212, 124588), (950216, 78496), + (950222, 51500), (950224, 4090), + (950230, 148520), (950235, 76848), + (950242, 181381), (950243, 10000), + (950245, 16129), (950250, 22053), + (950254, 4075), (950255, 25004), + (950267, 87799), (950272, 20452), + (950277, 36712), (950278, 179254), + (950289, 41750), (950292, 13704), + (950294, 100000), (950301, 90050), + (950302, 24781), (950305, 86156), + (950306, 2043), (950308, 4497), + (950310, 99378), (950313, 19189), + (950320, 5660), (950325, 22916), + (950341, 2028), (950342, 14792), + (950343, 10000), (950345, 72906), + (950349, 4880), (950352, 258055), + (950356, 2043), (950358, 8047), + (950360, 18356), (950362, 1920), + (950366, 115034), (950375, 165628), + (950378, 10399), (950382, 13740), + (950383, 49393), (950387, 52308), + (950401, 226248), (950433, 10000), + (950436, 42299), (950438, 94927), + (950439, 1920), (950449, 117013), + (950451, 14128), (950453, 48884), + (950457, 12849), (950458, 62496), + (950460, 100338), (950462, 26419), + (950467, 19350), (950476, 76606), + (950482, 97721), (950485, 2450), + (950489, 105048), (950490, 30), + (950498, 20622), (950501, 6133), + (950502, 40427), (950514, 237887), + (950515, 144271), (950543, 109158), + (950545, 77892), (950553, 20), + (950561, 58374), (950577, 30000), + (950578, 22243), (950582, 68895), + (950585, 134900), (950586, 18356), + (950587, 16166), (950590, 909), + (950591, 97800), (950593, 6129), + (950595, 62524), (950601, 3193), + (950602, 16927), (950606, 129702), + (950611, 2043), (950614, 30), + (950615, 78543), (950616, 24386), + (950625, 24132), (950627, 45824), + (950628, 30), (950632, 110929), + (950635, 20722), (950637, 32876), + (950638, 46692), (950639, 78741), + (950649, 25464), (950669, 10806), + (950671, 162672), (950674, 2043), + (950677, 11808), (950678, 46948), + (950685, 12043), (950696, 10000), + (950705, 30000), (950708, 61287), + (950709, 10000), (950710, 10000), + (950714, 89958), (950722, 28760), + (950725, 163153), (950738, 30), + (950742, 42285), (950745, 87246), + (950748, 295760), (950752, 127898), + (950760, 12043), (950762, 17369), + (950769, 127840), (950770, 80845), + (950772, 438429), (950778, 203233), + (950779, 553480), (950788, 133629), + (950792, 222557), (950795, 10000), + (950806, 2450), (950816, 117709), + (950817, 2069), (950833, 30), + (950841, 129634), (950845, 12627), + (950846, 10000), (950848, 10708), + (950854, 12043), (950857, 184776), + (950860, 2113696), (950861, 38007), + (950863, 117493), (950872, 4833), + (950876, 22450), (950877, 37996), + (950878, 42496), (950883, 4397), + (950884, 8358), (950892, 1282583), + (950898, 222030), (950900, 123070), + (950901, 198652), (950904, 165787), + (950911, 37209), (950913, 13792), + (950915, 4086), (950927, 12043), + (950942, 25170), (950949, 12350), + (950952, 365020), (950953, 86212), + (950958, 26016), (950965, 98708), + (950971, 53118), (950974, 8358), + (950984, 41207), (950997, 100144), + (951001, 16000), (951002, 22047), + (951005, 37886), (951006, 21696), + (951010, 10000), (951015, 2047), + (951022, 30447), (951023, 66042), + (951024, 19382), (951027, 14091), + (951028, 55596), (951034, 90675), + (951035, 60257), (951046, 9318), + (951047, 33666), (951052, 3025341), + (951057, 40833), (951060, 31002), + (951072, 79540), (951078, 136368), + (951080, 9826), (951086, 149116), + (951092, 167056), (951093, 44043), + (951100, 2480), (951105, 23621), + (951108, 30000), (951116, 14880), + (951119, 6133), (951129, 29533), + (951132, 104761), (951159, 28476), + (951161, 18359), (951170, 97412), + (951171, 12039), (951174, 7401), + (951181, 210607), (951184, 33984), + (951187, 126927), (951190, 10000), + (951191, 10390), (951195, 40151), + (951197, 16646), (951203, 89943), + (951207, 56163), (951210, 32450), + (951212, 57843), (951218, 18359), + (951222, 66872), (951228, 6129), + (951243, 113932), (951244, 64530), + (951247, 22150), (951250, 16718), + (951259, 95741), (951261, 43834), + (951266, 705953), (951273, 28402), + (951274, 61308), (951276, 149103), + (951286, 26580), (951290, 301514), + (951292, 7420), (951295, 16718), + (951309, 12728), (951311, 26634), + (951317, 2260), (951322, 24877), + (951328, 153586), (951347, 108254), + (951352, 2450), (951358, 81865), + (951362, 83098), (951370, 2047), + (951384, 109087), (951391, 5086), + (951402, 29104), (951408, 22108), + (951411, 552500), (951417, 28069), + (951418, 3629), (951419, 30), + (951421, 165321), (951436, 155246), + (951440, 1445740), (951441, 3), + (951442, 20800), (951443, 516), + (951445, 145015), (951452, 85574), + (951455, 16963), (951458, 27452), + (951459, 108482), (951460, 22943), + (951461, 15707), (951477, 4086), + (951485, 103182), (951492, 12850), + (951493, 11624), (951496, 3930), + (951502, 119230), (951505, 10000), + (951506, 22890), (951508, 133114), + (951512, 8350), (951516, 12069), + (951517, 12350), (951519, 12114), + (951520, 95018), (951523, 96513), + (951527, 2615), (951534, 10119550), + (951541, 104748), (951542, 47867), + (951549, 111235), (951555, 17273), + (951557, 21125), (951559, 184067), + (951572, 30000), (951575, 14393), + (951579, 82262), (951582, 22047), + (951587, 227332), (951591, 71313), + (951593, 8430), (951610, 2450), + (951618, 10000), (951620, 71377), + (951637, 4477), (951640, 45606), + (951649, 20725), (951663, 2043), + (951669, 2047), (951672, 2430), + (951683, 144554), (951686, 37723), + (951690, 21014), (951708, 452), + (951709, 84115), (951710, 27623), + (951713, 28172), (951716, 12043), + (951718, 117341), (951722, 49989), + (951744, 80942), (951762, 2450), + (951764, 12143), (951782, 4086), + (951797, 4858), (951802, 100023), + (951803, 65307), (951804, 2450), + (951814, 36133), (951816, 12450), + (951817, 49009), (951818, 89828), + (951820, 6417), (951822, 48905), + (951832, 10000), (951844, 320119), + (951848, 102855), (951851, 182690), + (951855, 2174683), (951860, 22047), + (951863, 15267), (951866, 58176), + (951871, 34328), (951874, 77794), + (951880, 3276), (951889, 28718), + (951894, 110022), (951895, 12047), + (951897, 93530), (951898, 14493), + (951902, 160017), (951908, 10000), + (951909, 18577), (951910, 30241), + (951911, 92120), (951916, 4497), + (951930, 81534), (951934, 4497), + (951935, 2450), (951938, 2047), + (951946, 125643), (951954, 2103203), + (951958, 10664), (951959, 215051), + (951961, 2350), (951964, 1920), + (951966, 22661), (951981, 12763), + (951991, 2043), (951994, 9393), + (952001, 104169), (952004, 12480), + (952007, 13943), (952011, 36263), + (952015, 26226), (952025, 12910), + (952028, 723), (952030, 558714), + (952034, 3806), (952035, 2043), + (952036, 14493), (952045, 30030), + (952049, 2093828), (952051, 12043), + (952062, 2039), (952069, 70456), + (952070, 27490), (952072, 2450), + (952074, 92717), (952078, 10000), + (952082, 16137), (952083, 93559), + (952092, 9162), (952095, 14642), + (952098, 151115), (952101, 95055), + (952102, 6129), (952120, 57628), + (952129, 10000), (952132, 85204), + (952136, 420), (952139, 105837), + (952142, 24307), (952156, 500), + (952162, 4082), (952163, 74430), + (952165, 1652770), (952167, 38124), + (952168, 2536), (952169, 271439), + (952170, 72025), (952196, 4512), + (952199, 46212), (952200, 4320), + (952202, 63693), (952203, 101061), + (952208, 91088), (952220, 77531), + (952222, 133847), (952226, 12008), + (952234, 144524), (952238, 24086), + (952241, 96523), (952244, 74304), + (952250, 19633), (952252, 9320), + (952253, 77809), (952257, 321182), + (952259, 14880), (952268, 15580), + (952281, 4086), (952284, 12375), + (952291, 14407), (952292, 42047), + (952303, 10000), (952307, 38220), + (952308, 6555), (952309, 5803), + (952310, 31160), (952314, 22169), + (952318, 25493), (952319, 200119), + (952323, 7740), (952326, 35580), + (952330, 15580), (952333, 78956), + (952338, 84854), (952350, 43874), + (952353, 17623), (952360, 10000), + (952370, 2047), (952373, 238244), + (952375, 46755), (952378, 46622), + (952379, 10118), (952381, 4521), + (952382, 18258), (952384, 69602), + (952396, 6000), (952397, 12085), + (952408, 22043), (952415, 12085), + (952421, 115075), (952438, 12039), + (952447, 10000), (952450, 10000), + (952456, 8172), (952460, 10000), + (952463, 10000), (952466, 167428), + (952467, 113273), (952475, 37209), + (952476, 91997), (952488, 26609), + (952492, 85363), (952493, 22688), + (952495, 10000), (952500, 1920), + (952502, 24186), (952505, 108128), + (952506, 36329), (952509, 10000), + (952515, 4497), (952516, 2529), + (952517, 99447), (952529, 29741), + (952534, 52615), (952537, 2450), + (952545, 82080), (952549, 65744), + (952556, 25902), (952559, 60958), + (952560, 522055), (952561, 6586), + (952562, 445954), (952566, 12047), + (952575, 76856), (952581, 41931), + (952582, 168386), (952586, 2043), + (952587, 12047), (952590, 150353), + (952591, 154529), (952594, 10000), + (952600, 62887), (952605, 101450), + (952606, 6693), (952612, 99929), + (952619, 2047), (952622, 66856), + (952626, 10219), (952629, 6000), + (952631, 2047), (952638, 201124), + (952639, 118032), (952649, 68040), + (952667, 30), (952679, 30570), + (952684, 22047), (952685, 131566), + (952698, 4370), (952699, 95079), + (952702, 13946), (952703, 91036), + (952710, 1284075), (952711, 9893), + (952718, 20572), (952720, 9780), + (952729, 12430), (952733, 20215), + (952747, 95666), (952764, 85028), + (952769, 37709), (952776, 133571), + (952789, 4086), (952802, 72430), + (952803, 26000), (952809, 22331), + (952812, 25653), (952816, 25336), + (952818, 78903), (952827, 7805), + (952832, 82032), (952835, 12450), + (952838, 8253), (952839, 160070), + (952844, 2043), (952846, 113726), + (952850, 18583), (952851, 27676), + (952854, 15580), (952861, 10000), + (952864, 60531), (952879, 20000), + (952883, 48234), (952894, 12047), + (952899, 91168), (952903, 14393), + (952924, 150731), (952937, 4374), + (952953, 24132), (952962, 90942), + (952963, 26079), (952966, 1004086), + (952968, 125028), (952969, 3302043), + (952974, 71845), (952980, 70420), + (952983, 76880), (953000, 8202), + (953001, 35580), (953009, 120246), + (953016, 80358), (953022, 14499), + (953025, 16171), (953028, 77178), + (953034, 2043), (953037, 173174), + (953039, 510592), (953052, 44394), + (953057, 4710), (953061, 10000), + (953063, 79689), (953064, 35411), + (953068, 27289), (953073, 18819), + (953076, 13315), (953078, 10000), + (953079, 16129), (953088, 14086), + (953100, 22043), (953101, 66880), + (953103, 12043), (953106, 83000), + (953107, 45658), (953110, 4086), + (953119, 2043), (953122, 4086), + (953124, 13898), (953126, 89044), + (953138, 66872), (953139, 12043), + (953146, 20200), (953154, 131781), + (953156, 14513), (953158, 1379303), + (953162, 108629), (953166, 30000), + (953187, 140031), (953213, 14086), + (953214, 6000), (953226, 76472), + (953228, 4210), (953229, 77741), + (953235, 92056), (953243, 2450), + (953244, 83226), (953246, 115220), + (953254, 53212), (953268, 20000), + (953271, 40884), (953275, 7146), + (953278, 113188), (953291, 22282), + (953298, 151438), (953319, 17071), + (953320, 76827), (953330, 286884), + (953336, 31705), (953338, 10176), + (953340, 310409), (953342, 16970), + (953343, 2047), (953344, 115707), + (953348, 288973), (953350, 118176), + (953353, 78596), (953367, 24086), + (953372, 14086), (953383, 18172), + (953384, 100000), (953399, 6000), + (953403, 19648), (953422, 816), + (953429, 102379), (953430, 2350), + (953435, 21893), (953446, 2047), + (953448, 16129), (953452, 57627), + (953453, 2450), (953456, 2047), + (953460, 231539), (953461, 2260), + (953464, 2039), (953476, 18200), + (953477, 173646), (953478, 10000), + (953482, 14773), (953493, 266157), + (953495, 42047), (953499, 319208), + (953508, 186462), (953509, 2260), + (953513, 12260), (953517, 97900), + (953518, 15580), (953519, 46740), + (953521, 107566), (953531, 67806), + (953535, 17509), (953537, 112047), + (953544, 10000), (953547, 188974), + (953552, 1649025), (953564, 82345), + (953576, 30000), (953577, 14303), + (953581, 2039), (953583, 2450), + (953586, 49708), (953591, 48028), + (953593, 6024), (953595, 203428), + (953596, 10452), (953606, 409270), + (953611, 21808), (953615, 207497), + (953620, 10215), (953624, 105019), + (953650, 8472), (953651, 28031), + (953663, 76864), (953668, 20257), + (953669, 10000), (953670, 10000), + (953674, 30), (953679, 2450), + (953694, 8057), (953696, 75045), + (953697, 102754), (953701, 30), + (953706, 37941), (953708, 262912), + (953712, 6567), (953720, 32338), + (953724, 374287), (953725, 27330), + (953735, 100000), (953738, 29120), + (953740, 76864), (953741, 28705), + (953742, 2043), (953750, 2039), + (953754, 17462), (953777, 30), + (953787, 33284), (953805, 32620), + (953808, 15974), (953814, 72297), + (953829, 10000), (953832, 10051178), + (953833, 10523), (953839, 102766), + (953841, 8180), (953849, 7160), + (953850, 121435), (953873, 155646), + (953874, 12043), (953876, 356861), + (953877, 2047), (953896, 6129), + (953897, 1920), (953908, 10000), + (953910, 2260), (953913, 159903), + (953917, 128176), (953930, 66872), + (953931, 31160), (953936, 98871), + (953938, 6129), (953942, 9013), + (953948, 17581), (953951, 12043), + (953964, 73878), (953967, 15947), + (953971, 16113), (953978, 90535), + (953979, 14086), (953981, 5430), + (953982, 84638), (953993, 40537), + (953994, 80252), (954002, 1920), + (954003, 2047), (954007, 15580), + (954014, 118573), (954017, 87648), + (954020, 12443), (954025, 57504), + (954035, 280215), (954043, 89650), + (954044, 16342), (954047, 59912), + (954048, 2047), (954049, 146902), + (954061, 17429), (954065, 30460), + (954074, 14493), (954076, 4086), + (954080, 151092), (954087, 100000), + (954088, 16536), (954099, 238538), + (954104, 162114), (954105, 24334), + (954107, 46482), (954109, 187401), + (954112, 10000), (954117, 22000), + (954121, 5818), (954126, 10000), + (954132, 3369571), (954136, 609781), + (954139, 2430), (954148, 4160), + (954150, 32085), (954151, 112323), + (954156, 558), (954162, 8940), + (954164, 150815), (954172, 26342), + (954174, 18483), (954186, 51754), + (954200, 1237490), (954205, 204196), + (954217, 10333), (954219, 2043), + (954224, 240759), (954229, 4086), + (954253, 33970), (954254, 121747), + (954260, 10000), (954275, 76864), + (954282, 10833), (954291, 19121), + (954292, 6129), (954294, 2260), + (954296, 175516), (954299, 100969), + (954306, 27263), (954309, 88911), + (954311, 106000), (954325, 11910), + (954328, 6762), (954329, 126385), + (954339, 102993), (954342, 2043), + (954344, 63761), (954352, 46129), + (954354, 151375), (954356, 327729), + (954375, 45663), (954377, 42704), + (954386, 16133), (954405, 86864), + (954412, 2043), (954416, 67358), + (954417, 3112447), (954424, 60295), + (954432, 11582), (954439, 4690), + (954441, 20000), (954443, 23903), + (954454, 149759), (954470, 4086), + (954473, 100000), (954477, 80563), + (954485, 17486), (954496, 27124), + (954501, 2690), (954505, 18047), + (954529, 12350), (954536, 2047), + (954537, 289104), (954545, 3370), + (954553, 73162), (954557, 3400), + (954558, 86517), (954561, 12047), + (954564, 40006), (954570, 30187), + (954572, 2047), (954585, 3047), + (954588, 43400), (954598, 1440493), + (954600, 68899), (954602, 96704), + (954611, 30), (954623, 90207), + (954630, 2043), (954642, 135417), + (954646, 298453), (954658, 26129), + (954659, 2350), (954672, 116858), + (954676, 1920), (954683, 41160), + (954689, 34365), (954692, 2047), + (954707, 2043), (954717, 94016), + (954718, 2450), (954724, 4493), + (954728, 273367), (954730, 15625), + (954731, 14270), (954733, 14497), + (954736, 2350), (954737, 12536), + (954739, 129881), (954750, 10000), + (954753, 66856), (954758, 112612), + (954766, 114086), (954773, 43824), + (954776, 2043), (954780, 105985), + (954783, 148518), (954785, 82170), + (954787, 97843), (954801, 8172), + (954806, 14763), (954807, 244218), + (954811, 9444), (954817, 112129), + (954820, 1272185), (954821, 37918), + (954822, 91788), (954840, 2260), + (954842, 25304), (954845, 24610), + (954846, 4307), (954852, 183019), + (954853, 165915), (954865, 93753), + (954870, 4086), (954874, 9600), + (954886, 6129), (954889, 745099), + (954901, 2047), (954913, 489035), + (954915, 2047), (954919, 2979), + (954929, 2450), (954933, 13963), + (954936, 206609), (954938, 3579), + (954947, 45858), (954948, 22386), + (954954, 1146), (954955, 24606), + (954956, 79248), (954958, 24896), + (954978, 23740), (954983, 47627), + (954986, 83465), (954989, 20971), + (954992, 111796), (954995, 104497), + (954999, 30526), (955001, 2047), + (955006, 118870), (955009, 4086), + (955015, 26911), (955023, 45260), + (955031, 1), (955035, 80564), + (955036, 6392), (955040, 18456), + (955042, 6710), (955052, 2043), + (955053, 73292), (955064, 4086), + (955065, 93570), (955066, 16129), + (955069, 10000), (955071, 25387), + (955082, 5725), (955084, 50000), + (955092, 97229), (955103, 15580), + (955104, 91113), (955116, 44418), + (955124, 78903), (955127, 27500), + (955131, 2284), (955134, 2043), + (955142, 68716), (955149, 20432), + (955164, 121318), (955165, 132962), + (955172, 78407), (955174, 10000), + (955179, 86280), (955185, 506117), + (955187, 22043), (955188, 18172), + (955190, 30122), (955192, 50039), + (955195, 12043), (955207, 39536), + (955209, 180996), (955218, 49123), + (955235, 15580), (955244, 67708), + (955258, 202047), (955259, 117235), + (955283, 12960), (955297, 93289), + (955298, 10000), (955301, 104800), + (955304, 6141), (955306, 38391), + (955308, 62453), (955309, 102546), + (955311, 78903), (955314, 18867), + (955321, 58297), (955322, 291604), + (955323, 227344), (955325, 2450), + (955327, 12766), (955330, 83704), + (955337, 66864), (955355, 4086), + (955358, 36674), (955363, 796109), + (955367, 2450), (955375, 34082), + (955377, 30925), (955380, 16228), + (955381, 953152), (955398, 90978), + (955419, 2138807), (955422, 14583), + (955424, 100000), (955432, 6000), + (955433, 2332386), (955437, 10434), + (955438, 2043), (955439, 1428226), + (955447, 23284), (955450, 16986), + (955458, 24452), (955467, 3740), + (955471, 12854), (955476, 1366929), + (955488, 2910), (955490, 116788), + (955500, 14086), (955506, 249521), + (955508, 13527), (955512, 102663), + (955513, 30), (955516, 4086), + (955526, 90697), (955531, 15318), + (955540, 2047), (955543, 83111), + (955549, 134180), (955551, 11300), + (955559, 167156), (955561, 179955), + (955565, 296793), (955566, 38545), + (955567, 2331), (955568, 102350), + (955581, 74747), (955586, 1236), + (955588, 11677), (955590, 126877), + (955592, 83699), (955594, 38553), + (955596, 103276), (955607, 38394), + (955609, 182560), (955614, 10000), + (955625, 36712), (955627, 22043), + (955631, 21300), (955639, 314197), + (955640, 35530), (955641, 250), + (955645, 123591), (955646, 119198), + (955650, 68152), (955651, 6978), + (955655, 2047), (955656, 11886), + (955662, 2047), (955666, 12043), + (955668, 134190), (955669, 10722), + (955675, 36257), (955676, 89171), + (955678, 4086), (955682, 26824), + (955687, 27211), (955689, 20000), + (955693, 52013), (955694, 65391), + (955697, 60370), (955704, 186000), + (955717, 10000), (955724, 10000), + (955727, 55741), (955739, 192794), + (955740, 275008), (955741, 247114), + (955750, 74295), (955753, 20086), + (955757, 76864), (955767, 2350), + (955775, 6905), (955777, 12047), + (955778, 63762), (955784, 46740), + (955786, 99791), (955793, 154097), + (955796, 110071), (955798, 338377), + (955800, 244040), (955804, 5331), + (955815, 31160), (955816, 21529), + (955818, 13293), (955822, 20200), + (955824, 12677), (955828, 105949), + (955832, 123464), (955838, 27813), + (955843, 2028), (955845, 4086), + (955854, 20000), (955868, 6000), + (955873, 10000), (955874, 27480), + (955879, 149513), (955885, 12043), + (955886, 56989), (955889, 4090), + (955891, 380050), (955893, 5240), + (955894, 16203), (955900, 94222), + (955908, 134600), (955913, 117349), + (955916, 119880), (955923, 4307), + (955927, 17238), (955928, 462837), + (955929, 8357), (955935, 15580), + (955941, 6350), (955944, 24086), + (955945, 2047), (955953, 101904), + (955961, 38000), (955975, 16417), + (955977, 35314), (955986, 102323), + (955988, 68846), (956003, 20661), + (956006, 6000), (956012, 3779812), + (956019, 15559), (956031, 10000), + (956040, 84471), (956042, 13350), + (956043, 10000), (956048, 12047), + (956050, 58393), (956051, 164276), + (956060, 290164), (956072, 105248), + (956073, 81151), (956079, 33000), + (956082, 125724), (956083, 28306), + (956089, 24708), (956093, 189795), + (956099, 4880), (956103, 54760), + (956106, 2753669), (956114, 4086), + (956115, 52043), (956116, 25238), + (956121, 261469), (956134, 36925), + (956138, 82), (956144, 20000), + (956153, 91258), (956160, 10000), + (956162, 2851), (956165, 6216), + (956175, 79084), (956179, 122077), + (956182, 6229), (956190, 91936), + (956210, 110979), (956223, 32006), + (956229, 2450), (956232, 110231), + (956235, 2331), (956237, 2039), + (956245, 212133), (956252, 22043), + (956260, 27458), (956261, 86665), + (956267, 90856), (956272, 103782), + (956275, 104512), (956278, 96492), + (956282, 20059), (956283, 223623), + (956289, 94754), (956302, 1146), + (956307, 6129), (956312, 65107), + (956317, 11140), (956322, 102528), + (956334, 4908), (956365, 56625), + (956371, 26351), (956376, 138060), + (956388, 34411), (956394, 8357), + (956396, 157514), (956397, 22585), + (956401, 8357), (956403, 10215), + (956413, 173101), (956415, 83647), + (956418, 18357), (956421, 102043), + (956422, 28172), (956428, 21580), + (956432, 18357), (956433, 110000), + (956437, 46741), (956439, 8357), + (956446, 7353), (956455, 23696), + (956460, 8356), (956463, 10000), + (956467, 18357), (956468, 638575), + (956474, 4400), (956478, 22350), + (956480, 280604), (956481, 117119), + (956482, 975763), (956483, 461326), + (956491, 26212), (956493, 10200), + (956498, 79331), (956502, 2043), + (956505, 23788), (956511, 34690), + (956515, 63471), (956518, 2212055), + (956526, 41779), (956530, 18172), + (956532, 85070), (956534, 2322), + (956536, 10000), (956537, 14979), + (956538, 10077419), (956547, 295735), + (956548, 11038), (956549, 34346), + (956552, 2200801), (956556, 10000), + (956557, 10000), (956558, 215880), + (956559, 20223), (956564, 107666), + (956577, 20851), (956580, 20000), + (956590, 536034), (956597, 100712), + (956600, 73438), (956615, 801966), + (956620, 275693), (956630, 7000), + (956643, 1146), (956647, 2126251), + (956650, 157246), (956651, 10400), + (956652, 8356), (956657, 22350), + (956658, 18789), (956665, 75204), + (956668, 75712), (956674, 12000), + (956676, 66654), (956681, 4497), + (956684, 31954), (956688, 4085), + (956690, 42428), (956696, 97251), + (956703, 8356), (956713, 86612), + (956714, 97016), (956721, 10000), + (956722, 2450), (956723, 38462), + (956734, 67839), (956751, 2043), + (956752, 182860), (956754, 74607), + (956756, 4800), (956757, 95082), + (956761, 273805), (956762, 42195), + (956764, 20211), (956770, 6006), + (956779, 2047), (956788, 4078), + (956797, 12039), (956798, 493235), + (956813, 72977), (956814, 82254), + (956820, 24757), (956824, 2043), + (956825, 8356), (956826, 140319), + (956829, 44944), (956834, 93631), + (956835, 47639), (956842, 15625), + (956850, 138791), (956851, 19581), + (956863, 8472), (956867, 114854), + (956869, 216020), (956876, 152942), + (956886, 11925), (956896, 151333), + (956898, 6000), (956901, 28945), + (956903, 2831), (956904, 500), + (956905, 100000), (956907, 78383), + (956908, 94856), (956922, 107903), + (956923, 649002), (956926, 2043), + (956928, 35403), (956930, 26279), + (956934, 11758), (956943, 57263), + (956945, 55108), (956948, 210913), + (956950, 14608), (956954, 10000), + (956958, 28195), (956963, 41160), + (956964, 59440), (956969, 24020), + (956983, 90874), (956996, 15799), + (957001, 40000), (957003, 20000), + (957008, 34331), (957015, 124000), + (957016, 12323), (957024, 11920), + (957030, 42047), (957039, 2450), + (957040, 10000), (957041, 10000), + (957043, 103070), (957045, 65585), + (957050, 36529), (957054, 32197), + (957059, 24202), (957060, 10000), + (957063, 42103), (957064, 10000), + (957065, 2260), (957067, 50243), + (957068, 3047), (957073, 2260), + (957085, 115560), (957088, 36301), + (957093, 4773), (957096, 51368), + (957101, 20404), (957109, 10000), + (957111, 51612), (957118, 83189), + (957126, 44802), (957135, 25057), + (957139, 4050), (957140, 50480), + (957151, 9937), (957153, 5250), + (957156, 32545), (957157, 8357), + (957160, 108693), (957169, 313), + (957174, 52562), (957179, 22260), + (957185, 14527), (957186, 8357), + (957189, 56759), (957198, 7721), + (957199, 1146), (957200, 258065), + (957202, 11920), (957204, 12521), + (957206, 73061), (957211, 1000), + (957218, 313868), (957222, 30666), + (957223, 112258), (957228, 114226), + (957237, 4900), (957238, 369800), + (957240, 4880), (957244, 125534), + (957253, 16343), (957261, 20), + (957269, 10945), (957270, 117760), + (957275, 177460), (957280, 1243200), + (957285, 1920), (957291, 21520), + (957292, 70419), (957293, 69306), + (957294, 3740), (957296, 89277), + (957303, 2350), (957312, 60618), + (957322, 3740), (957326, 130442), + (957327, 10000), (957328, 81235), + (957331, 116193), (957333, 10617), + (957334, 26343), (957336, 29187), + (957341, 104214), (957357, 76471), + (957367, 2043), (957370, 16601), + (957372, 22324), (957378, 449160), + (957389, 3410), (957391, 53332), + (957394, 2047), (957395, 430801), + (957409, 121052), (957432, 80249), + (957435, 362587), (957440, 107451), + (957450, 1102450), (957455, 85725), + (957456, 202931), (957471, 115031), + (957489, 10404), (957492, 15043), + (957507, 30249), (957509, 16740), + (957511, 12852), (957517, 97233), + (957535, 26511), (957538, 10671), + (957552, 82576), (957568, 226699), + (957570, 76942), (957575, 10000), + (957577, 18391), (957579, 107761), + (957585, 124986), (957604, 189546), + (957605, 10000), (957608, 15580), + (957611, 37199), (957612, 44384), + (957614, 356911), (957615, 148037), + (957628, 202583), (957629, 69200), + (957630, 297259), (957632, 311494), + (957636, 400708), (957643, 24158), + (957646, 3393), (957672, 12375), + (957673, 2028), (957682, 30000), + (957683, 1500000), (957685, 1470028), + (957687, 2047), (957688, 10000), + (957695, 572000), (957716, 21641), + (957719, 376557), (957723, 10000), + (957724, 310000), (957726, 26000), + (957729, 4500), (957731, 153464), + (957745, 114605), (957747, 2047), + (957748, 136431), (957749, 6982), + (957754, 4180), (957757, 3284), + (957760, 31405), (957761, 381), + (957769, 435127), (957771, 129951), + (957772, 58357), (957777, 4086), + (957780, 10000), (957781, 10000), + (957784, 30000), (957788, 60807), + (957790, 1000), (957792, 58892), + (957798, 83936), (957800, 10000), + (957802, 3466), (957806, 10000), + (957811, 223470), (957813, 117971), + (957815, 20749), (957817, 4086), + (957818, 125173), (957819, 82965), + (957823, 16529), (957837, 8357), + (957840, 51219), (957849, 28293), + (957858, 18579), (957861, 2450), + (957863, 10898), (957864, 4690), + (957866, 356753), (957871, 3284), + (957872, 10000), (957878, 8586), + (957880, 50981), (957884, 5220), + (957890, 98393), (957891, 28318), + (957895, 5398), (957896, 26479), + (957898, 194277), (957901, 10000), + (957904, 151373), (957918, 16129), + (957924, 135094), (957926, 31146), + (957940, 175585), (957944, 4086), + (957954, 250), (957977, 8357), + (957981, 4086), (957992, 10000), + (957994, 38308), (958005, 85007), + (958011, 20404), (958013, 12043), + (958021, 1607152), (958031, 12688), + (958035, 45749), (958043, 2043), + (958050, 1092412), (958060, 22251), + (958063, 337655), (958064, 50946), + (958068, 4090), (958072, 175703), + (958073, 13770), (958074, 392929), + (958076, 66104), (958080, 22043), + (958081, 193848), (958083, 394691), + (958084, 134595), (958098, 36431), + (958103, 270393), (958104, 131468), + (958112, 115580), (958113, 53817), + (958115, 3920400), (958119, 45750), + (958125, 237872), (958128, 59947), + (958140, 69071), (958148, 14707), + (958152, 250), (958157, 1527165), + (958160, 37500), (958162, 2450), + (958170, 204441), (958176, 112205), + (958177, 3276), (958180, 20000), + (958181, 130859), (958187, 205703), + (958192, 125020), (958193, 61281), + (958195, 15786), (958197, 123181), + (958202, 24000), (958203, 86564), + (958205, 4086), (958206, 31647), + (958207, 18200), (958219, 187683), + (958228, 48460), (958231, 17920), + (958235, 143859), (958249, 118551), + (958259, 10000), (958271, 254599), + (958272, 16254), (958279, 10000), + (958285, 83044), (958301, 149662), + (958313, 184272), (958317, 88508), + (958323, 24652), (958335, 20740), + (958347, 12444), (958350, 2047), + (958364, 121625), (958372, 185907), + (958374, 44531), (958378, 4086), + (958395, 4086), (958413, 16350), + (958414, 10066880), (958417, 2450), + (958419, 110966), (958424, 36812), + (958431, 107672), (958439, 41536), + (958443, 26361), (958446, 202450), + (958459, 30), (958469, 61117), + (958474, 1095), (958475, 2900), + (958488, 2332), (958496, 88294), + (958498, 76297), (958499, 76872), + (958504, 82), (958506, 25712), + (958520, 12039), (958522, 10401), + (958527, 69764), (958531, 78746), + (958542, 96576), (958549, 69580), + (958553, 103811), (958554, 10000), + (958562, 11482), (958574, 167855), + (958576, 434616), (958579, 20432), + (958583, 60586), (958587, 144766), + (958588, 3263), (958592, 14495), + (958605, 2260), (958610, 103468), + (958615, 76864), (958616, 20000), + (958621, 44760), (958623, 34325), + (958630, 12043), (958646, 10000), + (958648, 186205), (958651, 22165), + (958652, 14303), (958655, 261311), + (958658, 2043), (958665, 9020), + (958670, 84714), (958672, 10000), + (958678, 6000), (958681, 181774), + (958685, 10000), (958687, 68911), + (958694, 38610), (958697, 2039), + (958705, 22775), (958706, 2061), + (958708, 3740), (958720, 84244), + (958722, 32805), (958728, 91157), + (958732, 54897), (958734, 22260), + (958737, 33937), (958738, 10000), + (958740, 4023), (958750, 3275), + (958751, 10000), (958773, 91497), + (958776, 375489), (958783, 131243), + (958795, 23366), (958799, 89131), + (958810, 3468), (958814, 10000), + (958826, 12039), (958831, 1315442), + (958834, 2047), (958841, 16129), + (958843, 6000), (958854, 12047), + (958858, 10000), (958860, 97834), + (958862, 1146), (958866, 18172), + (958870, 3238460), (958872, 76465), + (958879, 15580), (958880, 44737), + (958881, 7480), (958895, 4307), + (958909, 22443), (958911, 13184), + (958914, 45977), (958920, 342409), + (958924, 12499), (958936, 18870), + (958937, 34024), (958939, 83547), + (958941, 18125), (958949, 60232), + (958952, 960), (958954, 107533), + (958955, 670722), (958957, 8460), + (958963, 2039), (958972, 4378), + (958978, 42165), (958993, 173219), + (958995, 3951), (958998, 19654), + (959004, 9320), (959009, 20617), + (959011, 30538), (959019, 9740), + (959020, 18387), (959022, 1920), + (959025, 72511), (959031, 30000), + (959034, 329362), (959035, 373704), + (959037, 12297), (959041, 13905), + (959044, 30159), (959051, 10000), + (959052, 26536), (959060, 4307), + (959063, 23740), (959065, 22139), + (959066, 6000), (959071, 869641), + (959078, 10000), (959080, 75721), + (959089, 130442), (959099, 1653954), + (959102, 12450), (959104, 126258), + (959105, 35410), (959135, 25975), + (959144, 10000), (959146, 33151), + (959148, 36129), (959149, 12047), + (959151, 67632), (959154, 80885), + (959155, 14086), (959156, 201607), + (959164, 32260), (959167, 85603), + (959178, 40000), (959192, 36133), + (959194, 87951), (959196, 10000), + (959212, 230536), (959216, 2350), + (959224, 6129), (959235, 212605), + (959241, 21756), (959245, 50710), + (959247, 13358), (959252, 20000), + (959267, 110626), (959273, 66835), + (959274, 20000), (959276, 122085), + (959285, 38979), (959287, 209893), + (959289, 32076), (959293, 29109), + (959296, 43020), (959297, 51929), + (959298, 4212), (959312, 59087), + (959313, 2043), (959314, 18176), + (959319, 398407), (959323, 558), + (959324, 30359), (959332, 72940), + (959336, 12047), (959342, 103052), + (959346, 140824), (959350, 2039), + (959353, 583216), (959357, 201840), + (959359, 67053), (959383, 15729), + (959391, 18777), (959393, 7140), + (959401, 55676), (959407, 74793), + (959409, 369360), (959417, 19597), + (959421, 10000), (959424, 166714), + (959428, 160818), (959429, 70402), + (959432, 22047), (959442, 392578), + (959447, 158483), (959478, 28157), + (959479, 193199), (959483, 82061), + (959486, 52478), (959498, 53181), + (959499, 27584), (959501, 42047), + (959508, 7017), (959516, 25783), + (959524, 23116), (959531, 971925), + (959540, 113111), (959541, 236236), + (959548, 67715), (959550, 25489), + (959561, 8358), (959563, 6800), + (959566, 40000), (959578, 80800), + (959580, 64651), (959588, 27955), + (959590, 12047), (959593, 20071), + (959606, 114845), (959607, 15323), + (959612, 10250), (959613, 127627), + (959619, 59562), (959621, 4471), + (959622, 1400102), (959626, 44760), + (959631, 24266), (959634, 2043), + (959635, 228358), (959638, 12323), + (959639, 85406), (959640, 6129), + (959644, 28867), (959657, 12047), + (959658, 3740), (959667, 2616), + (959669, 12043), (959670, 151125), + (959674, 14094), (959678, 1500), + (959680, 14208), (959686, 8480), + (959694, 409702), (959700, 70000), + (959702, 10000), (959706, 101657), + (959713, 72731), (959724, 53203), + (959729, 26364), (959732, 61599), + (959733, 64393), (959745, 36133), + (959749, 2043), (959751, 2043), + (959755, 43643), (959757, 87079), + (959760, 18358), (959761, 2043), + (959770, 12450), (959771, 133402), + (959772, 2039), (959774, 86476), + (959775, 18238), (959782, 47711), + (959790, 90216), (959794, 2047), + (959795, 18000), (959799, 23958), + (959800, 146728), (959801, 161651), + (959808, 240346), (959817, 12000), + (959822, 278426), (959833, 129902), + (959835, 24610), (959838, 18387), + (959841, 2043), (959842, 239214), + (959844, 119350), (959848, 16091), + (959853, 10000), (959860, 10000), + (959870, 3010510), (959880, 1560423), + (959882, 2323), (959883, 134239), + (959884, 84475), (959889, 90172), + (959895, 7826), (959898, 159529), + (959900, 25231), (959901, 92489), + (959902, 84066), (959908, 3960), + (959925, 114073), (959936, 10000), + (959937, 210023), (959941, 434195), + (959942, 186217), (959945, 562122), + (959949, 2039), (959957, 2047), + (959959, 339061), (959987, 90436), + (959992, 1083344), (960003, 10215), + (960007, 8357), (960016, 34094), + (960022, 2047), (960029, 22615), + (960039, 36129), (960045, 91345), + (960046, 12047), (960053, 567095), + (960058, 15580), (960061, 42910), + (960063, 371436), (960064, 66848), + (960069, 115926), (960070, 14422), + (960082, 23119), (960087, 12322), + (960091, 24990), (960092, 110000), + (960113, 83384), (960114, 10000), + (960119, 2536), (960122, 515656), + (960140, 180112), (960148, 4050), + (960150, 10000), (960153, 56953), + (960165, 14485), (960166, 65710), + (960174, 24165), (960182, 39660), + (960188, 73937), (960190, 103767), + (960191, 214086), (960199, 210000), + (960210, 67691), (960211, 41890), + (960214, 3960627), (960221, 126827), + (960224, 11781), (960227, 14081), + (960231, 24139), (960234, 33900), + (960237, 32375), (960238, 1052833), + (960246, 35658), (960247, 12350), + (960249, 122842), (960253, 10000), + (960262, 20254), (960271, 33579), + (960281, 32684), (960287, 24510), + (960288, 7989), (960292, 165708), + (960302, 144160), (960311, 43573), + (960319, 5410), (960321, 67736), + (960325, 90283), (960339, 5633), + (960340, 2450), (960344, 11250), + (960350, 10000), (960360, 216678), + (960362, 2331), (960364, 10215), + (960365, 88295), (960375, 30000), + (960383, 242807), (960384, 252130), + (960387, 20403), (960388, 55065), + (960405, 12350), (960421, 55983), + (960425, 107733), (960426, 464457), + (960430, 31160), (960434, 6850), + (960435, 414328), (960436, 59887), + (960446, 2615), (960457, 105421), + (960459, 10215), (960466, 418409), + (960471, 110000), (960477, 291723), + (960486, 33853), (960492, 154125), + (960496, 120000), (960501, 45438), + (960503, 24027), (960505, 721163), + (960518, 2043), (960533, 149234), + (960535, 12513), (960538, 45277), + (960543, 120783), (960548, 173363), + (960560, 15580), (960564, 8356), + (960565, 8356), (960571, 30240), + (960573, 136562), (960580, 662077), + (960583, 32352), (960598, 43906), + (960599, 58575), (960600, 10000), + (960603, 10000), (960605, 425927), + (960609, 58583), (960624, 6828), + (960630, 9172), (960633, 3283), + (960634, 68349), (960644, 181076), + (960652, 113584), (960659, 2068), + (960671, 74476), (960672, 255793), + (960675, 2046), (960677, 68678), + (960679, 46750), (960681, 99873), + (960682, 100000), (960688, 56805), + (960689, 116267), (960692, 452), + (960701, 43498), (960704, 3740), + (960707, 10000), (960708, 10000), + (960712, 66840), (960733, 1822), + (960744, 12663), (960755, 7000), + (960757, 26955), (960758, 111789), + (960759, 9451), (960772, 132426), + (960773, 26752), (960775, 139108), + (960779, 2046), (960782, 85195), + (960790, 5360), (960792, 12038), + (960798, 27665), (960800, 34159), + (960806, 32445), (960815, 40710), + (960828, 35525), (960830, 15553), + (960833, 138440), (960835, 33737), + (960837, 6129), (960841, 86973), + (960842, 8422), (960847, 4751), + (960859, 22513), (960868, 95353), + (960880, 5725), (960884, 16413), + (960885, 2260), (960897, 20376), + (960904, 14086), (960910, 10000), + (960911, 2046), (960927, 24370), + (960931, 10000), (960934, 42668), + (960936, 91135), (960943, 6129), + (960945, 12450), (960950, 68567), + (960951, 12441), (960958, 8355), + (960962, 82750), (960968, 10000), + (960973, 25580), (960975, 38261), + (960978, 14671), (960981, 10000), + (960982, 8355), (960984, 7913), + (960986, 20000), (960987, 10000), + (960990, 73485), (960991, 89957), + (960998, 9461), (961000, 86848), + (961004, 12258), (961005, 30261), + (961008, 10000), (961014, 8170), + (961017, 41069), (961022, 65891), + (961025, 4085), (961042, 10000), + (961046, 43275), (961061, 24301), + (961063, 17500), (961067, 485234), + (961095, 44540), (961102, 22068), + (961114, 2043), (961120, 10000), + (961122, 10000), (961125, 10000), + (961127, 4512), (961128, 21755), + (961129, 4086), (961138, 69298), + (961147, 517000), (961149, 101659), + (961159, 2113281), (961161, 148851), + (961164, 117124), (961177, 42225), + (961183, 8355), (961189, 58100), + (961194, 21912), (961204, 301810), + (961206, 66000), (961208, 28282), + (961219, 17126), (961229, 12043), + (961236, 22322), (961237, 102159), + (961243, 266848), (961244, 42839), + (961249, 10000), (961251, 18786), + (961257, 2431), (961269, 15748), + (961271, 203129), (961275, 50000), + (961280, 377558), (961281, 10000), + (961282, 12085), (961298, 2331), + (961300, 730181), (961308, 12262), + (961312, 1329730), (961314, 16793), + (961317, 276218), (961321, 8568), + (961333, 4094), (961337, 4681), + (961341, 12047), (961357, 36587), + (961363, 376627), (961367, 565952), + (961372, 511892), (961388, 35099), + (961392, 10000), (961396, 128673), + (961402, 14493), (961403, 612243), + (961404, 2450), (961406, 15770), + (961409, 23298), (961435, 10000), + (961449, 189140), (961456, 160493), + (961465, 93217), (961475, 114098), + (961481, 113792), (961483, 78895), + (961491, 134589), (961496, 146971), + (961503, 350382), (961508, 24422), + (961511, 80216), (961515, 32047), + (961524, 30000), (961533, 38947), + (961534, 224964), (961552, 579148), + (961553, 7211), (961559, 84914), + (961570, 10000), (961571, 10000), + (961584, 128647), (961593, 11654), + (961595, 35145), (961598, 30687), + (961606, 8172), (961625, 62047), + (961627, 12615), (961641, 70676), + (961652, 59258), (961674, 2350), + (961680, 31000), (961686, 40173), + (961693, 27202), (961695, 20000), + (961700, 402648), (961701, 32038), + (961705, 44301), (961717, 123428), + (961720, 418160), (961721, 163740), + (961724, 41160), (961726, 395800), + (961741, 100000), (961742, 68356), + (961743, 50000), (961749, 72350), + (961770, 12331), (961793, 50447), + (961802, 32497), (961813, 2450), + (961819, 4360), (961833, 80376), + (961842, 85608), (961845, 12297), + (961846, 24612), (961851, 197356), + (961859, 55976), (961887, 6890), + (961888, 7595), (961894, 36594), + (961902, 501194), (961911, 8205), + (961915, 4242), (961920, 10215), + (961940, 2450), (961942, 71), + (961944, 5204), (961945, 12262), + (961947, 33120), (961950, 6129), + (961961, 64394), (961975, 45571), + (961983, 25787), (961987, 6409), + (961994, 44283), (962015, 4372), + (962029, 2988), (962032, 2047), + (962045, 18798), (962051, 90868), + (962052, 403977), (962057, 401400), + (962062, 68614), (962071, 2047), + (962081, 23316), (962083, 32536), + (962090, 110000), (962099, 76856), + (962101, 179225), (962107, 135255), + (962108, 100417), (962156, 30000), + (962162, 20000), (962174, 8188), + (962188, 203837), (962196, 18358), + (962197, 1187692), (962198, 85610), + (962201, 1291909), (962207, 183084), + (962210, 20000), (962211, 10000), + (962215, 14086), (962218, 1135798), + (962226, 1832047), (962229, 42039), + (962232, 10000), (962234, 1228926), + (962242, 88312), (962243, 10000), + (962246, 10000), (962247, 10000), + (962249, 2043), (962252, 33871), + (962264, 10000), (962266, 10000), + (962268, 149034), (962272, 12900), + (962274, 12047), (962277, 293264), + (962282, 1878125), (962294, 20000), + (962309, 4086), (962312, 81472), + (962313, 30223), (962319, 54760), + (962331, 220000), (962341, 147881), + (962347, 10000), (962354, 15787), + (962363, 48358), (962364, 50620), + (962365, 64519), (962367, 146063), + (962381, 16000), (962385, 10000), + (962397, 22450), (962401, 61482), + (962426, 2047), (962435, 304587), + (962437, 30000), (962454, 117205), + (962457, 302972), (962459, 11920), + (962467, 292941), (962469, 62000), + (962471, 32910), (962479, 94181), + (962499, 29166), (962513, 59207), + (962524, 224157), (962531, 18358), + (962538, 32047), (962543, 10000), + (962554, 28771), (962555, 106143), + (962563, 20558), (962571, 173894), + (962580, 71643), (962594, 5741), + (962598, 35580), (962604, 23449), + (962613, 78116), (962621, 37889), + (962637, 89130), (962648, 21947), + (962650, 66389), (962661, 88892), + (962679, 382533), (962692, 31217), + (962693, 10000), (962694, 238255), + (962708, 240847), (962734, 25689), + (962735, 20000), (962746, 187978), + (962757, 45883), (962767, 115681), + (962772, 4663), (962775, 32350), + (962779, 25750), (962784, 10000), + (962793, 44032), (962796, 123740), + (962803, 18172), (962807, 165110), + (962810, 137184), (962818, 78101), + (962820, 19279), (962826, 12450), + (962828, 32047), (962829, 10000), + (962840, 60809), (962841, 231699), + (962846, 224160), (962866, 510000), + (962871, 10000), (962885, 10030), + (962890, 22450), (962898, 10000), + (962905, 84427), (962913, 20500), + (962914, 28859), (962921, 10000), + (962923, 118707), (962927, 1000), + (962930, 12332), (962940, 19901), + (962945, 12047), (962950, 109410), + (962951, 4379), (962960, 77660), + (962983, 12350), (962986, 100000), + (962987, 19084), (962993, 48928), + (962994, 18359), (962996, 2043), + (963009, 40000), (963017, 16063), + (963018, 10000), (963032, 471600), + (963071, 2450), (963081, 142047), + (963084, 15580), (963087, 2450), + (963099, 38485), (963100, 87695), + (963116, 45626), (963124, 77611), + (963129, 10000), (963135, 16199), + (963138, 221206), (963167, 10000), + (963180, 16344), (963181, 2288), + (963182, 20279), (963191, 10000), + (963204, 82085), (963209, 20000), + (963211, 59810), (963224, 10000), + (963237, 10000), (963240, 38123), + (963263, 10000), (963279, 39058), + (963294, 16076), (963298, 10000), + (963308, 18172), (963320, 10000), + (963325, 47968), (963334, 19637), + (963338, 12043), (963341, 244), + (963364, 10391), (963372, 34487), + (963381, 97207), (963385, 31577), + (963392, 24086), (963396, 39320), + (963400, 4086), (963404, 23285), + (963410, 1320300), (963415, 40000), + (963423, 126177), (963424, 88756), + (963427, 477453), (963431, 10000), + (963441, 24086), (963458, 16565), + (963460, 6000), (963464, 645792), + (963465, 10000), (963474, 22047), + (963486, 34472), (963498, 57212), + (963499, 14520), (963500, 24303), + (963504, 10200), (963505, 32444), + (963512, 20866), (963516, 26129), + (963523, 76541), (963528, 31676), + (963529, 126413), (963531, 10000), + (963533, 168332), (963534, 70015), + (963540, 331055), (963543, 10000), + (963553, 87679), (963570, 49847), + (963572, 10000), (963578, 16129), + (963586, 9535), (963588, 45732), + (963589, 100), (963596, 14086), + (963616, 16000), (963621, 12000), + (963629, 20000), (963639, 143336), + (963642, 250), (963662, 17436), + (963668, 153546), (963669, 42524), + (963675, 10398), (963686, 148248), + (963690, 20402), (963702, 16129), + (963703, 12047), (963707, 24086), + (963709, 12043), (963711, 28000), + (963712, 36129), (963726, 8359), + (963734, 95436), (963742, 46335), + (963744, 195967), (963749, 13521), + (963751, 28447), (963774, 68358), + (963775, 257532), (963776, 304241), + (963777, 95426), (963780, 10000), + (963781, 452), (963784, 4303), + (963788, 20000), (963789, 13264), + (963801, 26006), (963825, 168730), + (963829, 10000), (963830, 249577), + (963831, 34852), (963841, 16547), + (963846, 158057), (963871, 2127869), + (963873, 2047), (963874, 154109), + (963880, 186526), (963882, 20000), + (963907, 88211), (963914, 37964), + (963919, 20000), (963924, 500), + (963928, 163701), (963931, 12047), + (963939, 18357), (963947, 305045), + (963960, 3740), (963980, 6129), + (963998, 32540), (964008, 135859), + (964024, 12043), (964026, 148852), + (964031, 59608), (964034, 10000), + (964047, 71773), (964053, 59286), + (964056, 138172), (964061, 116780), + (964071, 24493), (964086, 121220), + (964088, 10000), (964092, 21803), + (964094, 64473), (964103, 178983), + (964119, 6129), (964121, 22490), + (964123, 62271), (964127, 96601), + (964130, 114853), (964133, 19949), + (964134, 110000), (964138, 26140), + (964139, 34090), (964156, 22043), + (964158, 8356), (964165, 147043), + (964201, 70641), (964209, 22043), + (964211, 65784), (964215, 1285903), + (964230, 10000), (964231, 10000), + (964234, 30000), (964241, 138946), + (964248, 155226), (964250, 2043), + (964265, 177806), (964284, 126698), + (964304, 183030), (964307, 110256), + (964319, 56193), (964323, 40361), + (964327, 24496), (964331, 14493), + (964336, 60043), (964346, 130399), + (964349, 147943), (964350, 524528), + (964356, 122043), (964362, 56129), + (964393, 11582), (964398, 234525), + (964404, 84962), (964423, 28172), + (964437, 52450), (964455, 54663), + (964470, 20000), (964474, 20000), + (964485, 20000), (964486, 42430), + (964492, 1195347), (964493, 12843), + (964506, 2043), (964526, 198933), + (964535, 501588), (964538, 279128), + (964554, 2450), (964559, 13740), + (964563, 120325), (964566, 2115793), + (964567, 2043), (964569, 68600), + (964574, 162173), (964580, 107825), + (964585, 20000), (964595, 145360), + (964597, 48400), (964610, 30399), + (964611, 1410957), (964619, 66125), + (964620, 210636), (964631, 6133), + (964648, 12043), (964660, 93557), + (964672, 10000), (964675, 14307), + (964687, 116000), (964713, 3331), + (964738, 10000), (964749, 175824), + (964752, 21300), (964755, 80663), + (964757, 143302), (964762, 133306), + (964789, 10000), (964796, 169544), + (964813, 82602), (964817, 15613), + (964818, 78917), (964825, 12450), + (964826, 169816), (964832, 10000), + (964834, 20500), (964849, 59788), + (964852, 10000), (964853, 16536), + (964876, 442024), (964881, 332), + (964887, 250), (964899, 12047), + (964900, 14493), (964916, 169330), + (964928, 10000), (964933, 33885), + (964934, 317792), (964942, 13937), + (964943, 52047), (964945, 20424), + (964954, 24371), (964956, 44338), + (964958, 24700), (964976, 6129), + (964981, 14336), (964982, 40000), + (964983, 78891), (965001, 28844), + (965008, 82451), (965013, 240657), + (965024, 10000), (965056, 73226), + (965058, 89294), (965059, 649238), + (965061, 26778), (965089, 22322), + (965095, 18172), (965097, 24305), + (965108, 15502), (965122, 79193), + (965130, 43184), (965131, 41808), + (965135, 110430), (965156, 109356), + (965161, 13350), (965169, 48656), + (965174, 80000), (965184, 22443), + (965194, 40146), (965211, 49791), + (965212, 122809), (965231, 58634), + (965246, 6129), (965248, 10000), + (965266, 98129), (965276, 68172), + (965293, 83658), (965296, 30904), + (965308, 2450), (965317, 117229), + (965327, 7001), (965328, 18357), + (965352, 47519), (965361, 36533), + (965362, 121960), (965364, 2759396), + (965366, 80131), (965380, 26129), + (965396, 16890), (965400, 85028), + (965416, 8172), (965417, 2043), + (965420, 107986), (965441, 10000), + (965443, 50077), (965446, 31997), + (965448, 308280), (965453, 311147), + (965455, 24086), (965460, 224176), + (965473, 93065), (965494, 15580), + (965506, 97972), (965511, 10000), + (965516, 4086), (965518, 4086), + (965521, 2047), (965524, 12043), + (965527, 14086), (965531, 6129), + (965541, 24486), (965554, 10000), + (965558, 16129), (965562, 5318), + (965570, 25851), (965573, 102478), + (965577, 11140), (965586, 62262), + (965587, 72266), (965596, 222297), + (965611, 8357), (965619, 10000), + (965622, 45611), (965623, 102163), + (965629, 38802), (965637, 89137), + (965644, 279925), (965645, 44086), + (965659, 8357), (965667, 101553), + (965668, 16548), (965676, 638309), + (965688, 109662), (965690, 10000), + (965695, 165679), (965702, 12043), + (965710, 81961), (965721, 15443), + (965732, 24661), (965736, 118356), + (965740, 20710), (965754, 24301), + (965755, 212690), (965776, 211566), + (965780, 16417), (965785, 442654), + (965797, 8356), (965834, 88036), + (965841, 42446), (965848, 22442), + (965850, 825476), (965858, 11409), + (965863, 218792), (965867, 2047), + (965886, 236202), (965892, 93643), + (965904, 10000), (965910, 59906), + (965926, 68320), (965931, 41075), + (965957, 203092), (965981, 12047), + (965992, 2047), (966001, 23227), + (966009, 10000), (966013, 278000), + (966015, 10000), (966028, 12043), + (966029, 47426), (966051, 17826), + (966057, 36197), (966062, 134262), + (966063, 43604), (966082, 106159), + (966090, 140725), (966100, 12295), + (966124, 126683), (966125, 81143), + (966127, 25580), (966137, 35580), + (966151, 2260), (966155, 7800), + (966164, 109236), (966167, 289713), + (966175, 54208), (966182, 117789), + (966238, 127621), (966243, 159216), + (966254, 7000), (966256, 10000), + (966257, 18357), (966261, 22047), + (966270, 1395688), (966282, 32260), + (966288, 74028), (966290, 10537), + (966307, 24815), (966309, 20000), + (966312, 62970), (966330, 2260), + (966332, 2899), (966337, 17334), + (966354, 48331), (966362, 52727), + (966390, 18172), (966435, 79306), + (966439, 10000), (966445, 20000), + (966449, 19722), (966452, 8357), + (966458, 14094), (966461, 2047), + (966462, 12043), (966467, 7353), + (966474, 17677), (966490, 52000), + (966506, 29035), (966511, 26129), + (966516, 40400), (966536, 45517), + (966556, 277183), (966567, 14086), + (966607, 2331), (966612, 19047), + (966613, 24086), (966625, 17587), + (966629, 28168), (966653, 24416), + (966659, 48972), (966662, 124281), + (966666, 4493), (966670, 36129), + (966677, 136553), (966692, 23811), + (966709, 313370), (966710, 65932), + (966727, 62308), (966732, 122415), + (966738, 107044), (966762, 117273), + (966763, 19388), (966766, 26129), + (966778, 23963), (966781, 2043), + (966788, 12314), (966799, 397014), + (966804, 22450), (966828, 629100), + (966829, 93114), (966837, 127511), + (966842, 114462), (966862, 152148), + (966873, 31046), (966882, 20000), + (966908, 21917), (966914, 232711), + (966923, 10000), (966924, 108469), + (966934, 121355), (966943, 118144), + (966958, 188142), (966961, 230838), + (966978, 31489), (966997, 12047), + (967005, 100000), (967010, 34771), + (967011, 118597), (967014, 135955), + (967019, 73357), (967028, 10000), + (967030, 87992), (967037, 242222), + (967039, 71192), (967052, 10000), + (967060, 24743), (967136, 10000), + (967137, 73384), (967143, 302260), + (967156, 113061), (967157, 66956), + (967159, 56529), (967168, 10000), + (967187, 70248), (967196, 168200), + (967197, 93931), (967214, 10000), + (967215, 12043), (967254, 389763), + (967262, 140798), (967269, 211957), + (967271, 53622), (967285, 110903), + (967297, 133211), (967299, 316572), + (967300, 14430), (967313, 77076), + (967314, 137270), (967333, 165897), + (967338, 16133), (967343, 30617), + (967349, 44580), (967353, 132105), + (967371, 125213), (967373, 238402), + (967377, 132325), (967387, 30000), + (967392, 68899), (967393, 4086), + (967418, 25167), (967453, 322164), + (967455, 24385), (967466, 5783), + (967474, 8356), (967485, 103212), + (967493, 24540), (967494, 12047), + (967506, 158561), (967538, 7476), + (967540, 43475), (967541, 106654), + (967547, 54139), (967556, 189374), + (967586, 10413), (967595, 66848), + (967604, 112594), (967606, 105892), + (967619, 10000), (967621, 66532), + (967647, 2450), (967658, 15580), + (967673, 45281), (967674, 12271), + (967678, 2043), (967694, 168176), + (967706, 55015), (967718, 141841), + (967729, 86577), (967730, 106776), + (967731, 10000), (967748, 9351), + (967752, 10000), (967780, 45580), + (967781, 142568), (967786, 3283), + (967794, 14422), (967796, 20399), + (967801, 71), (967809, 41793), + (967814, 23584), (967870, 18418), + (967877, 21826), (967883, 109348), + (967886, 2043), (967888, 80780), + (967897, 9012), (967903, 185137), + (967905, 40901), (967917, 36634), + (967935, 90686), (967942, 10000), + (967943, 48000), (967950, 12061), + (967957, 76525), (967989, 65520), + (968026, 38180), (968055, 10000), + (968072, 87685), (968092, 10000), + (968099, 35845), (968130, 4086), + (968145, 19421), (968171, 12663), + (968180, 275211), (968188, 75070), + (968206, 14086), (968209, 10000), + (968218, 2043), (968240, 3940), + (968244, 49466), (968250, 10000), + (968270, 55767), (968284, 169604), + (968292, 1146), (968303, 2450), + (968307, 18669), (968308, 85545), + (968310, 70968), (968320, 2061), + (968349, 62851), (968363, 110352), + (968381, 45681), (968388, 17997), + (968389, 10000), (968391, 81262), + (968394, 14363), (968396, 6159), + (968400, 31400), (968410, 250), + (968411, 40000), (968417, 62570), + (968431, 77726), (968432, 11910), + (968433, 29565), (968436, 73555), + (968445, 86893), (968449, 836454), + (968471, 42611), (968479, 205146), + (968483, 16533), (968484, 250), + (968495, 46220), (968503, 341279), + (968507, 12043), (968512, 21220), + (968526, 113637), (968566, 40889), + (968571, 5668), (968581, 11669), + (968582, 12043), (968590, 86976), + (968602, 150838), (968622, 5921), + (968625, 179067), (968632, 2047), + (968657, 424681), (968669, 4318), + (968682, 120678), (968686, 26339), + (968690, 85204), (968691, 10000), + (968697, 29404), (968700, 10706), + (968707, 8389), (968712, 2350), + (968721, 2043), (968728, 48000), + (968764, 70324), (968784, 2260), + (968811, 603200), (968812, 18214), + (968876, 12038), (968879, 15326), + (968880, 130316), (968881, 17023), + (968941, 22043), (968942, 8357), + (968979, 91271), (968996, 14086), + (969023, 28579), (969040, 59664), + (969056, 220227), (969058, 10000), + (969071, 100285), (969082, 1384128), + (969088, 20000), (969093, 156029), + (969095, 10212), (969131, 1497678), + (969140, 10000), (969147, 2046), + (969165, 7320), (969174, 34172), + (969191, 11100), (969216, 13977), + (969238, 26100), (969251, 10000), + (969266, 192666), (969281, 10000), + (969286, 2043), (969288, 27813), + (969306, 13186), (969312, 10000), + (969322, 12294), (969345, 12046), + (969376, 21939), (969380, 322624), + (969428, 23858), (969430, 290889), + (969476, 26129), (969495, 7265), + (969506, 262317), (969534, 98580), + (969541, 27495), (969556, 22046), + (969565, 2260), (969594, 24086), + (969616, 12683), (969622, 18172), + (969651, 10000), (969656, 20000), + (969668, 154100), (969684, 76803), + (969693, 20628), (969747, 131019), + (969757, 212719), (969759, 10000), + (969765, 20000), (969777, 74434), + (969791, 252780), (969795, 10000), + (969804, 22038), (969805, 16581), + (969812, 240022), (969817, 144688), + (969840, 12046), (969885, 15818), + (969903, 6147), (969906, 14466), + (969924, 26816), (969932, 110925), + (969947, 2495), (969950, 10397), + (969965, 2043), (969970, 14493), + (969994, 63481), (969996, 48262), + (970015, 37608), (970027, 16124), + (970028, 148431), (970053, 12046), + (970058, 61791), (970067, 40086), + (970073, 55382), (970077, 41160), + (970082, 38242), (970083, 92439), + (970100, 2043), (970115, 173830), + (970134, 10000), (970136, 124086), + (970154, 15939), (970160, 68073), + (970163, 138897), (970176, 24700), + (970208, 14086), (970226, 31060), + (970237, 11330), (970239, 302741), + (970240, 94276), (970252, 8350), + (970272, 12043), (970279, 2038), + (970304, 4698), (970314, 1649576), + (970351, 31598), (970352, 127945), + (970357, 2048), (970368, 17153), + (970394, 2048), (970395, 76142), + (970437, 2349), (970438, 6104), + (970440, 2349), (970476, 16426), + (970498, 120989), (970511, 2349), + (970518, 2380), (970551, 97684), + (970555, 4651), (970561, 26372), + (970565, 5004), (970569, 12349), + (970592, 210211), (970595, 2450), + (970597, 90516), (970598, 85610), + (970621, 85025), (970623, 30983), + (970625, 25741), (970646, 5410), + (970651, 58530), (970694, 67868), + (970730, 13707), (970751, 11920), + (970756, 18383), (970760, 2352102), + (970776, 19486), (970778, 333073), + (970782, 45358), (970809, 157172), + (970811, 1920), (970854, 92443), + (970859, 130808), (970865, 2055), + (970870, 67120), (970871, 741325), + (970891, 100000), (970897, 65472), + (970941, 10000), (970946, 113994), + (970976, 25478), (970993, 169455), + (971011, 390033), (971017, 48858), + (971038, 90240), (971043, 136349), + (971051, 122800), (971077, 14945), + (971098, 63257), (971110, 4594), + (971123, 56740), (971149, 11920), + (971159, 24406), (971167, 17904), + (971180, 67192), (971187, 2655), + (971199, 82448), (971205, 41124), + (971212, 41190), (971217, 12502), + (971228, 10000), (971279, 8403), + (971323, 64852), (971343, 2961), + (971365, 7366), (971370, 15630), + (971374, 10000), (971400, 32375), + (971415, 50000), (971451, 2349), + (971471, 70565), (971534, 18235), + (971559, 112060), (971562, 14624), + (971578, 36228), (971589, 57072), + (971598, 27557), (971615, 10000), + (971664, 32060), (971717, 130265), + (971772, 1152), (971794, 57365), + (971810, 23004), (971815, 77312), + (971816, 98634), (971858, 162390), + (971891, 10000), (971924, 13740), + (971940, 192331), (971944, 34403), + (971989, 14768), (972034, 27372), + (972037, 20481), (972069, 47687), + (972107, 4538), (972137, 10000), + (972184, 107900), (972197, 14269), + (972249, 94695), (972255, 34395), + (972269, 41347), (972299, 2043), + (972426, 24880), (972455, 27929), + (972468, 31043), (972514, 67376), + (972515, 14174), (972521, 22349), + (972541, 16730), (972595, 10000), + (972610, 10000), (972616, 10000), + (972626, 20000), (972660, 132343), + (972696, 161077), (972705, 56467), + (972776, 24886), (972793, 80628), + (972808, 103066), (972868, 1613365), + (972869, 24218), (972897, 134703), + (972909, 75816), (972927, 2350), + (972931, 26609), (973254, 10000), + (973258, 10000), (973392, 35580), + (973459, 15580), (973484, 36411), + (973493, 10000), (973541, 10000), + (973578, 103000), (973629, 18424), + (973778, 30000), (973859, 54000), + (973936, 11510), (973942, 10000), + (974016, 32789), (974226, 10245), + (974245, 10000), (974318, 72780), + (974342, 20552), (974412, 14880), + (974425, 22726), (974428, 10000), + (974572, 22960), (974710, 7085), + (974716, 10000), (974790, 31600), + (974814, 95124), (974866, 18259), + (975041, 2960), (975043, 52065), + (975208, 82151), (975241, 20000), + (975253, 835), (975272, 162000), + (975273, 10000), (975326, 6000), + (975349, 39956), (975412, 70000), + (975567, 29807), (975599, 164212), + (975700, 147720), (975786, 17255), + (975855, 79735), (976173, 17820), + (976194, 10245), (976288, 8032), + (976335, 23957), (976416, 21060), + (976436, 45726), (976456, 154494), + (976468, 25077), (976490, 281557), + (976547, 14542), (976685, 73198), + (976707, 36620), (976765, 2028), + (977122, 10000), (977575, 100000), + (977645, 126156), (977702, 20000), + (977705, 48225), (977725, 58097), + (977736, 100), (977839, 12450), + (977868, 28450), (978049, 22762), + (978112, 25220), (978238, 10000), + (978514, 42375), (978555, 72135), + (978664, 12260), (978687, 22359), + (978690, 42960), (978693, 20000), + (978714, 4679), (978803, 3594358), + (978835, 11868), (978930, 149905), + (979022, 50320), (979073, 10000), + (979079, 107522), (979156, 10000), + (979172, 74190), (979194, 66302), + (979261, 123480), (979335, 68375), + (979369, 276), (979524, 20382), + (979569, 22350), (979594, 70276), + (979730, 74313), (979747, 64720), + (979765, 132901), (979779, 152615), + (980119, 100637), (980198, 100568), + (980317, 257930), (980960, 10000), + (980991, 37001), (981359, 16800), + (981651, 10000)], + 't1dGomv6vidf7ychtujsxWChS5PpXKDzbfa': [(1134425, 625000), (1134659, 625000), + (1134827, 625000)], + 't1f69zsrfqeD1TDEv8QLb5UAsSVz8P15n3Z': [(521491, 2500000)], + 't1fD2SKAFthHmZmGDfekQFW11M6m2kPYpe7': [(904169, 4086), (904181, 16943), + (904194, 10000), (904200, 15680), + (904202, 32948), (904219, 125180), + (904235, 20000), (904267, 198750), + (904275, 22534), (904279, 34630), + (904288, 39159), (904304, 18353), + (904315, 16768), (904371, 82043), + (904378, 37101), (904406, 2043), + (904426, 13930), (904442, 14086), + (904465, 3043), (904482, 22533), + (904490, 2781), (904508, 26906), + (904538, 15526), (904541, 14086), + (904551, 4086), (904563, 49523), + (904564, 250), (904584, 1920), + (904588, 245), (904592, 10824), + (904618, 2043), (904636, 79439), + (904680, 245), (904702, 15580), + (904712, 14086), (904743, 92288), + (904764, 4086), (904773, 66323), + (904814, 40839), (904840, 15985), + (904843, 27913), (904860, 38240), + (904869, 112357), (904870, 15288), + (904902, 14900), (904920, 89317), + (904935, 36843), (904947, 85410), + (904978, 982), (904995, 18857), + (904999, 4596), (905000, 10000), + (905012, 20331), (905030, 18180), + (905053, 10331), (905058, 10000), + (905062, 4473), (905070, 14635), + (905108, 5220), (905126, 393), + (905133, 92043), (905143, 4774), + (905152, 2999), (905168, 4919), + (905175, 18208), (905182, 20244), + (905256, 14086), (905274, 74433), + (905285, 1047), (905321, 25844), + (905326, 2783), (905339, 244), + (905352, 36838), (905366, 2043), + (905387, 245), (905395, 84086), + (905431, 20000), (905469, 193023), + (905475, 20761), (905492, 2043), + (905510, 2043), (905514, 34759), + (905541, 28594), (905573, 2043), + (905575, 113640), (905591, 47989), + (905604, 12043), (905607, 2322), + (905610, 38661), (905616, 20245), + (905636, 17813), (905640, 4885), + (905667, 5544), (905680, 10036440), + (905692, 2043), (905705, 7246), + (905707, 10490), (905725, 32043), + (905744, 244), (905777, 28490), + (905806, 2043), (905807, 48390), + (905840, 2043), (905885, 12322), + (905948, 941), (905959, 54772), + (905968, 10000), (905996, 591), + (905999, 12165), (906007, 20767), + (906020, 44276), (906024, 94576), + (906050, 10979), (906065, 91540), + (906070, 490), (906074, 10245), + (906079, 68220), (906159, 18988), + (906167, 279), (906188, 27415), + (906190, 12756), (906215, 2043), + (906222, 2567), (906227, 5689), + (906228, 5410), (906244, 21391), + (906254, 20244), (906256, 12935), + (906262, 20490), (906266, 2043), + (906281, 159374), (906306, 114610), + (906315, 16443), (906332, 20279), + (906335, 10244), (906371, 95362), + (906372, 12538), (906375, 516627), + (906381, 313), (906385, 80279), + (906395, 32043), (906405, 245), + (906434, 10476), (906441, 13649), + (906494, 6387), (906517, 7922), + (906532, 347), (906566, 29291), + (906627, 4086), (906638, 109608), + (906642, 41190), (906650, 110561), + (906690, 932), (906693, 2667), + (906728, 597), (906746, 229833), + (906773, 105043), (906779, 95080), + (906789, 47448), (906829, 1099), + (906834, 133582), (906843, 599), + (906861, 20847), (906862, 33491), + (906880, 680), (906911, 8862), + (906925, 24750), (906944, 2630), + (906950, 667), (906956, 146618), + (906975, 10667), (906994, 5315), + (907000, 20000), (907004, 13014), + (907010, 760), (907023, 68813), + (907039, 18219), (907044, 33218), + (907046, 5884), (907060, 22543), + (907066, 26853), (907094, 34530), + (907102, 5029), (907103, 7213), + (907108, 15819), (907118, 5031), + (907144, 2318), (907190, 10000), + (907191, 10000), (907213, 15697), + (907223, 35953), (907233, 13286), + (907234, 16347), (907255, 10000), + (907278, 9011), (907295, 31027), + (907306, 80079), (907310, 2959), + (907358, 19496), (907362, 124688), + (907366, 34623), (907399, 45987), + (907417, 17945), (907432, 10000), + (907460, 24589), (907471, 74242), + (907475, 42088), (907486, 23357), + (907489, 28041), (907494, 36000), + (907510, 27291), (907520, 19730), + (907539, 38240), (907540, 4942), + (907559, 33468), (907595, 23882), + (907630, 110525), (907632, 4397), + (907674, 46989), (907683, 31160), + (907695, 1097379), (907699, 103184), + (907729, 2043), (907732, 151778), + (907748, 49048), (907749, 12880), + (907762, 32087), (907779, 333066), + (907800, 4947), (907801, 42479), + (907815, 15966), (907841, 60676), + (907848, 1281415), (907862, 204372), + (907876, 23527), (907886, 15051), + (907930, 26817), (907965, 12978), + (908020, 17623), (908029, 37780), + (908039, 2603), (908055, 1947), + (908064, 2327), (908083, 80971), + (908104, 12900), (908146, 2395), + (908155, 62597), (908166, 12327), + (908172, 5757), (908175, 2332), + (908201, 114229), (908212, 40920), + (908217, 76401), (908227, 2043), + (908245, 4824), (908258, 25953), + (908266, 8954), (908330, 116354), + (908367, 22603), (908377, 71859), + (908391, 121469), (908409, 10158), + (908419, 42181), (908479, 34424), + (908480, 70934), (908483, 9739), + (908517, 5465), (908522, 40291), + (908524, 18867), (908559, 39083), + (908610, 57941), (908621, 2325), + (908661, 95934), (908688, 28066), + (908774, 133094), (908794, 12859), + (908811, 21920), (908814, 250), + (908817, 250), (908820, 91770), + (908848, 7928), (908895, 2893), + (908923, 26925), (908935, 8407), + (908944, 90979), (908959, 2333), + (908963, 1619), (908979, 200242), + (909000, 46085), (909058, 49981), + (909082, 5806), (909097, 33666), + (909102, 14023), (909123, 12350), + (909150, 5041), (909168, 42405), + (909174, 45504), (909179, 108257), + (909186, 9398), (909216, 21241), + (909234, 2450), (909254, 10000), + (909261, 49606), (909287, 135134), + (909301, 10000), (909351, 59505), + (909373, 26373), (909376, 13485), + (909381, 12049), (909384, 14302), + (909409, 8154), (909445, 264150), + (909454, 181691), (909466, 125825), + (909519, 27652), (909526, 2862), + (909548, 6703), (909562, 34908), + (909579, 117006), (909593, 4086), + (909600, 2333), (909611, 8685), + (909700, 19537), (909713, 9197), + (909721, 26584), (909726, 51639), + (909736, 34635), (909742, 2902), + (909757, 44414), (909761, 214562), + (909796, 12260), (909809, 99293), + (909813, 5480), (909826, 8079), + (909858, 10000), (909905, 59200), + (909953, 71557), (909970, 25767), + (909981, 19904), (909991, 9930), + (909995, 17783), (910008, 19327), + (910012, 2024), (910029, 8364), + (910042, 8416), (910075, 18095), + (910101, 67887), (910158, 10000), + (910182, 4039), (910186, 41516), + (910213, 24657), (910264, 10000), + (910299, 66904), (910304, 174298), + (910308, 6277), (910311, 12617), + (910336, 4646), (910352, 121034), + (910369, 20687), (910378, 17913), + (910383, 18129), (910396, 42361), + (910455, 14737), (910463, 7497), + (910480, 2333), (910498, 245746), + (910499, 2043), (910505, 42609), + (910513, 45212), (910558, 2043), + (910559, 59636), (910563, 2043), + (910571, 2049), (910575, 22902), + (910580, 12876), (910598, 118789), + (910628, 230176), (910643, 32568), + (910651, 47562), (910686, 38146), + (910703, 8365), (910709, 68185), + (910723, 30108), (910756, 103463), + (910762, 111066), (910773, 4031), + (910778, 72955), (910779, 3783), + (910782, 97261), (910842, 17629), + (910858, 5438), (910859, 44566), + (910861, 175046), (910897, 123377), + (910907, 28328), (910915, 125223), + (910955, 99786), (910957, 12534), + (910963, 26652), (910986, 133309), + (910993, 244), (910995, 41537), + (911037, 22325), (911048, 215344), + (911050, 48451), (911053, 200), + (911082, 25505), (911112, 773646), + (911115, 4318), (911126, 3186), + (911149, 56651), (911170, 40394), + (911178, 51591), (911220, 152696), + (911226, 35133), (911249, 2902), + (911302, 2043), (911314, 61829), + (911318, 40056), (911320, 641079), + (911337, 28881), (911353, 114167), + (911357, 17109), (911358, 134268), + (911366, 16150), (911369, 3740), + (911370, 20447), (911375, 27140), + (911388, 2963), (911408, 52420), + (911418, 17788), (911421, 20961), + (911465, 97482), (911488, 12325), + (911504, 3192), (911528, 4023), + (911537, 21580), (911568, 11479), + (911584, 22168), (911655, 3302), + (911665, 260495), (911707, 145241), + (911740, 2450), (911754, 4367), + (911765, 28714), (911776, 2043), + (911790, 6135), (911800, 156960), + (911845, 10000), (911848, 10000), + (911872, 132309), (911879, 100), + (911897, 98702), (911990, 66503), + (912024, 11162), (912071, 15177), + (912078, 15153), (912113, 10000), + (912150, 15580), (912176, 16406), + (912208, 4023), (912211, 8692), + (912237, 17611), (912256, 48783), + (912263, 73537), (912265, 58740), + (912283, 24941), (912319, 140786), + (912320, 27857), (912340, 6407), + (912375, 781), (912377, 5783), + (912385, 16824), (912389, 12663), + (912531, 43840), (912535, 154537), + (912541, 22188), (912546, 58081), + (912547, 9857), (912552, 10058189), + (912563, 27389), (912583, 18020), + (912584, 2040), (912587, 2617), + (912606, 30780), (912612, 56753), + (912622, 21221), (912628, 18180), + (912673, 161041), (912732, 47747), + (912740, 8468), (912758, 28852), + (912761, 3177), (912834, 25463), + (912836, 122363), (912877, 19576), + (912909, 72157), (912917, 32624), + (912918, 173409), (912922, 4086), + (912970, 166427), (912984, 247316), + (912993, 2043), (912999, 34324), + (913012, 36354), (913020, 3470), + (913022, 9674), (913032, 93151), + (913057, 100000), (913076, 22043), + (913083, 66029), (913133, 35551), + (913153, 14340), (913164, 24739), + (913166, 30469), (913195, 19563), + (913225, 13185), (913228, 6577), + (913237, 29358), (913260, 110000), + (913262, 3470), (913305, 2450), + (913323, 13851), (913342, 27839), + (913368, 38952), (913369, 93365), + (913373, 106778), (913426, 59548), + (913435, 60533), (913443, 66357), + (913468, 63754), (913489, 10029), + (913500, 2901), (913505, 11039), + (913562, 53829), (913595, 8184), + (913602, 2361), (913610, 39886), + (913620, 20000), (913637, 31267), + (913641, 285265), (913646, 245), + (913660, 18750), (913735, 19949), + (913771, 12333), (913775, 313), + (913793, 35617), (913815, 2260), + (913822, 78055), (913834, 3428), + (913837, 2043), (913851, 29158), + (913870, 1279041), (913883, 13625), + (913912, 4657), (913940, 95680), + (913971, 10048), (913998, 8363), + (914017, 6079), (914052, 3746), + (914062, 267612), (914076, 22331), + (914122, 10245), (914126, 11146), + (914141, 18903), (914198, 31715), + (914203, 249484), (914214, 5289), + (914236, 174878), (914242, 5795), + (914257, 81877), (914261, 22791), + (914269, 14132), (914294, 8500), + (914305, 108789), (914309, 32462), + (914313, 35223), (914316, 45321), + (914323, 62215), (914398, 137609), + (914410, 2143), (914433, 16047), + (914441, 13454), (914491, 48001), + (914499, 6881), (914503, 16129), + (914530, 32087), (914544, 69496), + (914562, 22264), (914570, 13738), + (914589, 16461), (914606, 71912), + (914615, 4892), (914622, 26475), + (914628, 28766), (914642, 156501), + (914669, 21533), (914671, 10000), + (914676, 31989), (914680, 29368), + (914681, 19663), (914700, 12639), + (914711, 25132), (914720, 13454), + (914748, 2612), (914764, 27081), + (914769, 42085), (914777, 187985), + (914783, 150938), (914805, 44388), + (914810, 110783), (914814, 475415), + (914820, 27014), (914848, 3181), + (914860, 12604), (914861, 68955), + (914944, 10000), (914960, 2745), + (914961, 2043), (915002, 16417), + (915025, 9617), (915045, 13676), + (915064, 8901), (915067, 6600), + (915077, 10000), (915092, 10000), + (915107, 2333), (915119, 51055), + (915120, 28129), (915140, 44497), + (915161, 13755), (915183, 16130), + (915202, 3755), (915214, 21715), + (915215, 1015747), (915246, 13206), + (915248, 66912), (915274, 3186), + (915276, 17797), (915279, 45140), + (915302, 30000), (915307, 149637), + (915316, 8364), (915338, 20637), + (915354, 14323), (915366, 17499), + (915408, 8364), (915420, 13392), + (915439, 105135), (915447, 7970), + (915449, 32188), (915484, 7843), + (915538, 141958), (915540, 56366), + (915563, 17517), (915570, 102995), + (915589, 100796), (915611, 12000), + (915624, 61963), (915626, 30552), + (915627, 15053), (915631, 3189), + (915640, 6015), (915680, 22260), + (915683, 84900), (915698, 56219), + (915738, 7000), (915768, 6770), + (915793, 17921), (915807, 11944), + (915890, 8364), (915893, 55450), + (915927, 12501), (915937, 2325), + (915979, 110400), (915981, 16135), + (915985, 10000), (915988, 31709), + (916013, 809158), (916016, 12315), + (916022, 8642), (916044, 12048), + (916073, 1638462), (916075, 4523), + (916114, 1925), (916144, 22116), + (916149, 26509), (916151, 131747), + (916155, 108084), (916160, 2322), + (916161, 19040), (916179, 2048), + (916201, 32593), (916208, 66956), + (916234, 336049), (916252, 99965), + (916254, 12043), (916291, 355793), + (916323, 2043), (916353, 3131963), + (916379, 49034), (916390, 23185), + (916398, 18462), (916406, 3429), + (916445, 38664), (916449, 12104), + (916459, 32286), (916478, 10000), + (916498, 4891), (916504, 97319), + (916519, 24647), (916538, 46433), + (916575, 5780), (916586, 4086), + (916600, 22497), (916649, 26726), + (916650, 56932), (916654, 28249), + (916688, 964), (916690, 32311), + (916711, 13532), (916742, 108614), + (916750, 381), (916753, 30409), + (916769, 2780), (916780, 12964), + (916782, 2789), (916801, 11890), + (916814, 154505), (916816, 327470), + (916837, 325833), (916873, 232774), + (916910, 20231), (916949, 67873), + (916955, 19463), (916977, 17887), + (916981, 3400), (917050, 27547), + (917063, 35708), (917070, 10819), + (917076, 12132), (917091, 30), + (917094, 19815), (917103, 10000), + (917112, 119480), (917126, 34085), + (917196, 10278), (917205, 2048), + (917210, 157889), (917213, 102663), + (917324, 10000), (917350, 1920), + (917355, 14151), (917363, 47627), + (917400, 30608), (917417, 86594), + (917432, 46896), (917433, 12174), + (917444, 2901), (917466, 89292), + (917505, 288915), (917526, 33529), + (917539, 3185), (917546, 27944), + (917561, 87591), (917578, 19586), + (917588, 10000), (917596, 3138), + (917604, 38929), (917617, 257673), + (917620, 13731), (917633, 140497), + (917635, 43188), (917640, 2430), + (917655, 10000), (917659, 299219), + (917677, 4038), (917748, 14582), + (917754, 70878), (917776, 250), + (917778, 1629441), (917779, 581664), + (917781, 4323), (917798, 4483), + (917807, 3841), (917823, 3186), + (917841, 40741), (917843, 21644), + (917863, 4986), (917871, 1146), + (917880, 41938), (917889, 52874), + (917906, 293363), (917910, 30), + (917936, 892992), (918077, 15921), + (918111, 516000), (918127, 20581), + (918136, 81399), (918170, 18922), + (918175, 15580), (918180, 26067), + (918196, 32184), (918204, 22980), + (918233, 2617), (918256, 6862), + (918269, 8902), (918286, 23677), + (918323, 6129), (918325, 11925), + (918340, 11329), (918345, 14869), + (918361, 2617), (918365, 8662), + (918374, 12040), (918382, 31585), + (918385, 2260), (918394, 3181), + (918409, 246189), (918418, 124764), + (918432, 5243), (918439, 21333), + (918469, 29277), (918517, 518050), + (918535, 153105), (918546, 10637), + (918598, 4086), (918601, 15580), + (918628, 74067), (918635, 30), + (918654, 100906), (918675, 121993), + (918680, 2119463), (918682, 16022), + (918685, 13750), (918702, 459225), + (918719, 5479), (918746, 2894), + (918758, 17315), (918768, 2964), + (918792, 23836), (918801, 40529), + (918802, 12325), (918822, 3750), + (918839, 6024), (918857, 9084), + (918866, 2043), (918898, 73707), + (918924, 53585), (918929, 8815), + (918962, 45994), (919021, 5536), + (919024, 3755), (919031, 18064), + (919060, 34359), (919064, 36045), + (919132, 176891), (919140, 14609), + (919158, 27558), (919182, 73844), + (919222, 20086), (919227, 16396), + (919260, 2043), (919273, 2049), + (919277, 11653), (919314, 48656), + (919320, 40125), (919343, 10449), + (919349, 21107), (919354, 34790), + (919378, 250), (919391, 10000), + (919420, 4710), (919421, 156180), + (919429, 19597), (919461, 29735), + (919466, 2049), (919471, 219543), + (919488, 29408), (919507, 10000), + (919508, 12043), (919544, 10000), + (919568, 218665), (919586, 314961), + (919635, 2260), (919659, 4374), + (919669, 11918), (919694, 412294), + (919695, 3930), (919751, 134992), + (919752, 4053), (919760, 17752), + (919849, 4668), (919854, 271794), + (919885, 488922), (919898, 1611756), + (919933, 14761), (919934, 99332), + (919943, 62044), (919950, 2450), + (919964, 34467), (920001, 245), + (920030, 2048), (920032, 51935), + (920059, 35350), (920091, 29119), + (920104, 913271), (920181, 20250), + (920197, 25858), (920217, 56828), + (920227, 100313), (920253, 119979), + (920269, 452), (920275, 10000), + (920358, 10000), (920392, 39057), + (920397, 23400), (920403, 249110), + (920434, 4086), (920455, 1366493), + (920478, 1064136), (920479, 318933), + (920510, 106575), (920516, 6595), + (920541, 60010), (920568, 12299), + (920602, 113041), (920608, 36841), + (920619, 2910), (920642, 60801), + (920652, 10406), (920661, 279), + (920665, 149589), (920716, 176129), + (920748, 2032), (920754, 4090), + (920758, 77545), (920779, 10000), + (920810, 102031), (920827, 10000), + (920894, 107624), (920899, 29770), + (920906, 39571), (920947, 13373), + (920972, 96896), (920974, 12048), + (920994, 7110), (921020, 307277), + (921077, 30528), (921094, 30000), + (921095, 145709), (921104, 22429), + (921111, 40882), (921129, 76759), + (921131, 16514), (921133, 3795), + (921152, 527355), (921171, 3740), + (921183, 73021), (921219, 10000), + (921240, 385175), (921242, 66162), + (921250, 17154), (921257, 150000), + (921262, 2250346), (921270, 89013), + (921310, 116167), (921330, 15022), + (921336, 91670), (921337, 654045), + (921344, 20389), (921347, 67201), + (921383, 22547), (921386, 441307), + (921414, 52284), (921434, 380173), + (921440, 32043), (921448, 94227), + (921497, 8087), (921500, 22792), + (921600, 68916), (921632, 93340), + (921639, 2222025), (921640, 222763), + (921643, 44266), (921652, 1068078), + (921654, 270081), (921663, 96615), + (921671, 75154), (921700, 47752), + (921723, 23243), (921735, 10074430), + (921751, 3285), (921758, 2048), + (921778, 32332), (921787, 22782), + (921827, 102048), (921862, 274783), + (921872, 6911), (921884, 18609), + (921909, 12350), (921916, 30000), + (921917, 12375), (921953, 762242), + (921954, 8165), (921960, 45580), + (921972, 28545), (921998, 52206), + (922002, 39272), (922007, 10000), + (922014, 16950), (922038, 404528), + (922041, 3655), (922045, 69195), + (922068, 44222), (922073, 3153502), + (922076, 288067), (922082, 56784), + (922093, 20851), (922105, 2043), + (922121, 3569), (922134, 58360), + (922141, 106063), (922168, 10000), + (922211, 23962), (922241, 32860), + (922304, 24308), (922339, 140029), + (922354, 334874), (922371, 627945), + (922372, 8654), (922399, 13963), + (922431, 685259), (922507, 52453), + (922537, 55935), (922560, 28620), + (922615, 34133), (922620, 92244), + (922663, 30190), (922681, 2039), + (922702, 20881), (922713, 5337), + (922717, 30380), (922731, 14374), + (922738, 79858), (922806, 20276), + (922844, 15927), (922847, 6459), + (922848, 79699), (922891, 89909), + (922901, 8429), (922913, 48111), + (922915, 17115), (922931, 42225), + (922952, 7926), (922956, 1366084), + (922962, 24564), (923006, 54760), + (923028, 15190), (923034, 53938), + (923038, 54497), (923072, 1146), + (923080, 13157), (923122, 65139), + (923145, 95909), (923239, 27623), + (923264, 817903), (923267, 35580), + (923298, 23312), (923370, 10000), + (923371, 34044), (923393, 4672), + (923396, 228042), (923399, 516), + (923453, 52277), (923466, 25960), + (923472, 10673), (923480, 13450), + (923482, 23023), (923489, 2679), + (923497, 180934), (923499, 16369), + (923501, 160814), (923505, 45623), + (923541, 253706), (923542, 15558), + (923586, 6882), (923593, 12260), + (923642, 122301), (923645, 20242), + (923666, 94491), (923693, 249981), + (923707, 120858), (923733, 34303), + (923743, 18978), (923792, 2670), + (923794, 8172), (923796, 87117), + (923798, 6129), (923801, 250), + (923812, 86955), (923828, 110300), + (923853, 84874), (923873, 37304), + (923874, 5323), (923894, 43842), + (923922, 15369), (923932, 448), + (923968, 3930), (923996, 15867), + (924030, 10042014), (924038, 2043), + (924046, 20000), (924053, 33705), + (924086, 27815), (924092, 73080), + (924097, 347), (924101, 18453), + (924103, 21158), (924105, 28051), + (924106, 2430), (924107, 169198), + (924133, 28701), (924166, 10000), + (924167, 1755), (924174, 38699), + (924206, 3967), (924219, 72543), + (924225, 84068), (924266, 62978), + (924271, 301112), (924323, 10000), + (924358, 96874), (924366, 23939), + (924379, 224255), (924393, 491763), + (924404, 15580), (924409, 12697), + (924417, 2043), (924423, 10414), + (924461, 22426), (924471, 4205), + (924506, 6440), (924508, 41051), + (924556, 60930), (924589, 6441), + (924605, 24389), (924609, 382255), + (924650, 116872), (924668, 4651), + (924672, 25580), (924731, 2073), + (924738, 691184), (924754, 5195), + (924758, 125366), (924781, 55114), + (924821, 1146), (924836, 2039), + (924864, 36114), (924877, 309020), + (924881, 12043), (924939, 71), + (924946, 250), (924961, 67661), + (924996, 280285), (924997, 39311), + (924999, 2450), (925012, 25710), + (925023, 2618), (925049, 500), + (925050, 3136), (925061, 381), + (925069, 215685), (925090, 242286), + (925113, 129981), (925156, 30), + (925191, 15580), (925234, 33969), + (925276, 47739), (925280, 147947), + (925286, 92427), (925345, 3194), + (925351, 16726), (925352, 81578), + (925394, 8303), (925448, 10000), + (925454, 38633), (925459, 2048), + (925526, 2048), (925560, 8840), + (925567, 18516), (925576, 6416), + (925604, 17781), (925605, 2450), + (925651, 2902), (925652, 157227), + (925695, 22802), (925699, 146904), + (925719, 75492), (925732, 63167), + (925800, 2049), (925826, 29152), + (925839, 15663), (925861, 52885), + (925876, 132405), (925893, 13928), + (925916, 15797), (925921, 12325), + (925946, 17433), (925990, 453989), + (926005, 5364), (926017, 87424), + (926041, 146194), (926048, 63042), + (926088, 85796), (926090, 162230), + (926115, 316264), (926119, 43702), + (926120, 37235), (926136, 18913), + (926141, 46818), (926168, 42880), + (926175, 85760), (926193, 50841), + (926198, 31651), (926202, 159628), + (926251, 11438), (926262, 191609), + (926263, 67650), (926288, 453792), + (926294, 143198), (926301, 1129744), + (926304, 10627), (926315, 88641), + (926316, 250), (926355, 222681), + (926405, 22069), (926407, 154294), + (926411, 44659), (926437, 18427), + (926438, 39517), (926550, 48875), + (926570, 22350), (926579, 155655), + (926580, 2043), (926597, 65352), + (926613, 30000), (926630, 47515), + (926641, 150347), (926687, 42577), + (926696, 243279), (926724, 38369), + (926729, 16934), (926761, 10691), + (926774, 21242), (926780, 15228), + (926782, 53834), (926788, 4289), + (926792, 43716), (926801, 1092925), + (926807, 83979), (926853, 643670), + (926864, 7607), (926870, 21121), + (926886, 4527), (926929, 10000), + (926939, 177639), (926968, 22050), + (926971, 22904), (926972, 458599), + (926973, 42292), (927005, 182576), + (927010, 16129), (927024, 91978), + (927049, 122060), (927088, 206750), + (927093, 12000), (927115, 493261), + (927124, 364842), (927129, 7826), + (927134, 89389), (927158, 58157), + (927172, 4376), (927200, 2334), + (927256, 109909), (927274, 78601), + (927281, 118042), (927300, 14100), + (927312, 10000), (927322, 135814), + (927332, 55450), (927360, 49262), + (927361, 13480), (927387, 7505), + (927448, 126387), (927465, 10703), + (927486, 97066), (927520, 1552678), + (927534, 454048), (927535, 209034), + (927558, 1048719), (927573, 10000), + (927576, 424889), (927597, 57712), + (927605, 19366), (927609, 27623), + (927610, 374338), (927616, 63934), + (927657, 74094), (927673, 6427), + (927685, 146658), (927687, 12334), + (927688, 2050), (927703, 48228), + (927709, 13930), (927715, 2334), + (927733, 41053), (927745, 23377), + (927775, 43731), (927789, 2043), + (927800, 10000), (927825, 216077), + (927840, 55907), (927883, 2611), + (927924, 34876), (927971, 46563), + (927973, 2050), (927987, 28487), + (927988, 42833), (927992, 10969), + (928001, 38140), (928040, 4669), + (928089, 99907), (928097, 10251), + (928103, 10000), (928126, 5232), + (928131, 48816), (928159, 82562), + (928181, 171275), (928232, 9016), + (928274, 21365), (928283, 35023), + (928317, 20545), (928340, 4086), + (928355, 45125), (928377, 24601), + (928384, 103847), (928438, 184504), + (928461, 31404), (928462, 243202), + (928464, 22610), (928484, 32689), + (928498, 1920), (928504, 80731), + (928514, 5230), (928533, 13757), + (928552, 26818), (928573, 5068), + (928589, 6413), (928609, 116941), + (928625, 7273), (928651, 1582), + (928732, 16683), (928753, 59616), + (928756, 137420), (928778, 2380), + (928890, 58393), (928918, 51534), + (928929, 33284), (928943, 2049), + (928953, 12043), (928966, 70709), + (928968, 2049), (928977, 47741), + (928992, 12041), (928998, 18585), + (929011, 2218229), (929017, 39886), + (929037, 24786), (929045, 2334), + (929057, 2334), (929062, 85294), + (929068, 19320), (929080, 154990), + (929088, 5244), (929099, 665495), + (929114, 37323), (929130, 159127), + (929137, 13940), (929198, 30), + (929210, 2618), (929232, 64194), + (929260, 65974), (929267, 139248), + (929286, 11796), (929303, 79446), + (929314, 41382), (929323, 10482), + (929333, 37884), (929339, 16657), + (929340, 123887), (929345, 5387), + (929353, 2618), (929376, 25995), + (929406, 282493), (929410, 48830), + (929454, 226736), (929469, 20011), + (929485, 116109), (929499, 2609), + (929518, 121803), (929531, 116021), + (929532, 22000), (929560, 4382), + (929567, 39386), (929581, 7587), + (929614, 226464), (929620, 2049), + (929622, 255895), (929626, 142797), + (929694, 43072), (929717, 30), + (929729, 141844), (929802, 23747), + (929832, 115567), (929839, 21871), + (929867, 2536), (929899, 5440), + (929910, 12492), (929924, 2609), + (929927, 4376), (929946, 250), + (929975, 2049), (929981, 18494), + (930000, 2043), (930005, 43158), + (930016, 5331), (930028, 99706), + (930032, 23966), (930045, 34617), + (930049, 2333), (930065, 6124), + (930071, 14585), (930121, 395312), + (930126, 2260), (930186, 20000), + (930210, 9279), (930221, 26241), + (930236, 85999), (930300, 10000), + (930335, 52569), (930339, 6135), + (930355, 4382), (930376, 5675), + (930397, 12049), (930424, 22894), + (930427, 27978), (930442, 18462), + (930486, 39810), (930502, 35347), + (930597, 10000), (930620, 225499), + (930640, 100208), (930642, 36980), + (930645, 33452), (930651, 34092), + (930672, 66920), (930685, 24536), + (930689, 19032), (930719, 144376), + (930731, 33242), (930746, 4783), + (930760, 12885), (930779, 95498), + (930781, 51937), (930787, 27367), + (930797, 120470), (930812, 22637), + (930898, 17633), (930911, 55734), + (930915, 6000), (930967, 42857), + (930970, 6980), (931002, 2903), + (931019, 2041), (931025, 21240), + (931038, 32282), (931039, 12618), + (931072, 23017), (931079, 200000), + (931114, 10784), (931131, 7634), + (931158, 161141), (931164, 75463), + (931192, 32216), (931225, 155658), + (931228, 20159), (931229, 90205), + (931274, 199155), (931325, 10000), + (931414, 133725), (931437, 3610), + (931440, 42561), (931447, 88721), + (931452, 114621), (931493, 2260), + (931495, 26945), (931517, 6000), + (931537, 257778), (931539, 318518), + (931551, 33659), (931553, 12878), + (931571, 11325), (931588, 33573), + (931608, 943286), (931609, 99959), + (931625, 45992), (931626, 5413), + (931643, 20380), (931648, 23847), + (931663, 35580), (931689, 27955), + (931700, 27668), (931704, 19077), + (931714, 92848), (931747, 539365), + (931819, 20042), (931863, 30000), + (931880, 27747), (931881, 62717), + (931931, 91585), (932004, 307999), + (932015, 19388), (932017, 45580), + (932022, 2823576), (932028, 20073), + (932035, 2001745), (932056, 66522), + (932060, 72710), (932064, 19796), + (932069, 62710), (932079, 132468), + (932086, 48068), (932095, 2079), + (932101, 2028), (932105, 26563), + (932113, 71815), (932117, 151778), + (932119, 12640), (932147, 16720), + (932152, 20049), (932190, 30), + (932207, 59831), (932244, 100634), + (932258, 15580), (932259, 180611), + (932284, 14493), (932291, 55441), + (932293, 15680), (932330, 83012), + (932350, 2041), (932361, 30850), + (932369, 63190), (932373, 81417), + (932379, 226425), (932387, 21287), + (932395, 226), (932398, 1063430), + (932409, 974248), (932412, 30), + (932423, 70939), (932427, 2043), + (932429, 30), (932462, 515576), + (932473, 1927150), (932494, 4086), + (932499, 30910), (932500, 2043), + (932513, 24987), (932555, 20592), + (932585, 55384), (932591, 59253), + (932602, 10000), (932631, 30), + (932633, 17623), (932645, 83262), + (932648, 30), (932679, 26171), + (932687, 126861), (932698, 34193), + (932707, 64477), (932829, 8363), + (932869, 146606), (932883, 84501), + (932888, 113124), (932892, 105986), + (932935, 10000), (932957, 51650), + (933019, 84257), (933088, 28048), + (933101, 23153), (933105, 22718), + (933106, 94880), (933133, 2350), + (933138, 3030), (933143, 3194), + (933153, 3270), (933155, 68739), + (933190, 61658), (933205, 14128), + (933213, 90307), (933225, 15002), + (933226, 386043), (933286, 96674), + (933304, 20000), (933360, 207039), + (933366, 12085), (933375, 136154), + (933432, 60650), (933459, 20520), + (933468, 30343), (933471, 62084), + (933482, 124312), (933500, 19261), + (933521, 21709), (933531, 109078), + (933554, 4088), (933561, 1504498), + (933591, 120593), (933600, 8463), + (933657, 132949), (933665, 22043), + (933682, 66904), (933684, 5220), + (933709, 89315), (933739, 2040), + (933753, 30710), (933758, 236348), + (933775, 69280), (933782, 20000), + (933789, 21592), (933816, 22375), + (933825, 2910), (933835, 36689), + (933867, 111176), (933870, 20000), + (933875, 10000), (933877, 3820), + (933878, 876674), (933941, 20000), + (933942, 320000), (933988, 2682), + (934012, 198941), (934025, 2043), + (934029, 90501), (934055, 4096), + (934057, 2048), (934078, 172722), + (934088, 48023), (934098, 102505), + (934151, 2536), (934162, 132177), + (934182, 97274), (934188, 14300), + (934189, 160519), (934193, 55317), + (934200, 29869), (934220, 15660), + (934246, 352640), (934264, 18218), + (934296, 2450), (934342, 199776), + (934345, 2043), (934362, 2028), + (934370, 1698303), (934411, 265343), + (934421, 73992), (934446, 121644), + (934463, 6000), (934465, 13740), + (934479, 2069), (934488, 4086), + (934525, 1920), (934556, 10627), + (934612, 15121), (934629, 19066), + (934650, 82089), (934671, 22690), + (934713, 14493), (934718, 2146322), + (934719, 2043), (934741, 10000), + (934769, 30467), (934783, 100030), + (934797, 26853), (934803, 8852), + (934844, 7588), (934849, 12375), + (934862, 3666), (934878, 4592), + (934904, 10071), (934952, 10895), + (934964, 12375), (934967, 2043), + (934989, 3740), (935028, 31152), + (935036, 2114), (935048, 5473), + (935050, 34005), (935064, 36300), + (935084, 34803), (935100, 20903), + (935110, 10005), (935111, 8579), + (935116, 30), (935125, 26741), + (935127, 6700), (935134, 6988), + (935146, 14497), (935147, 44466), + (935151, 18091), (935152, 173766), + (935172, 83329), (935175, 15758), + (935214, 80897), (935299, 341122), + (935320, 23860), (935348, 15542), + (935358, 8460), (935360, 5850), + (935370, 434367), (935385, 8172), + (935388, 36337), (935416, 13740), + (935421, 14661), (935449, 20440), + (935454, 28312), (935458, 4086), + (935481, 38607), (935507, 9986), + (935525, 12043), (935533, 12043), + (935543, 23737), (935562, 39359), + (935604, 242450), (935633, 20000), + (935655, 166435), (935662, 39160), + (935687, 35776), (935723, 115644), + (935738, 7263), (935749, 7960), + (935763, 78703), (935765, 89836), + (935783, 12043), (935817, 76854), + (935935, 2047), (936005, 24389), + (936020, 72433), (936034, 45566), + (936037, 12047), (936039, 9844), + (936071, 10000), (936083, 218198), + (936086, 2690), (936090, 33634), + (936103, 2484897), (936110, 30405), + (936141, 15580), (936204, 15580), + (936223, 750), (936240, 38625), + (936251, 1808), (936258, 41622), + (936264, 4090), (936270, 2047), + (936295, 67578), (936329, 160228), + (936333, 22323), (936430, 30), + (936450, 19969), (936455, 22464), + (936465, 225085), (936482, 72158), + (936517, 56069), (936548, 3030), + (936574, 3450), (936595, 30000), + (936602, 71395), (936620, 407748), + (936628, 2043), (936670, 108895), + (936686, 676022), (936710, 22375), + (936712, 2043), (936728, 83644), + (936745, 10000), (936762, 22380), + (936808, 34371), (936827, 2043), + (936839, 1920), (936876, 12047), + (936888, 2043), (936906, 51031), + (936925, 93638), (936941, 118769), + (936952, 185103), (936977, 4086), + (937003, 14121), (937029, 7817), + (937105, 14160), (937120, 18357), + (937139, 14950), (937151, 569665), + (937154, 84034), (937155, 14710), + (937167, 94784), (937208, 56492), + (937218, 121726), (937232, 50215), + (937257, 30000), (937279, 4521), + (937286, 17897), (937288, 10000), + (937294, 42064), (937335, 23189), + (937368, 26253), (937378, 163932), + (937386, 32450), (937391, 38632), + (937395, 110360), (937403, 1146), + (937438, 4086), (937443, 6000), + (937479, 110575), (937504, 6837), + (937532, 36566), (937553, 134456), + (937556, 4719), (937588, 176655), + (937619, 15443), (937629, 49718), + (937633, 43328), (937661, 2043), + (937686, 73617), (937687, 2910), + (937705, 91625), (937707, 13688), + (937728, 26129), (937731, 16883), + (937734, 14975), (937787, 30), + (937816, 2047), (937835, 83446), + (937856, 41470), (937865, 15580), + (937866, 671123), (937868, 10000), + (937875, 33752), (937942, 4090), + (937960, 158704), (937976, 4116), + (937989, 6540), (938111, 151870), + (938114, 90641), (938121, 744684), + (938124, 196770), (938147, 55000), + (938154, 91349), (938161, 2958), + (938162, 20000), (938166, 130090), + (938206, 98172), (938233, 12047), + (938251, 8758), (938260, 136404), + (938270, 5973), (938294, 27373), + (938335, 3740), (938342, 29656), + (938358, 71324), (938367, 1146), + (938381, 265220), (938382, 215222), + (938408, 31299), (938499, 53815), + (938505, 20079), (938580, 25580), + (938622, 27875), (938637, 63795), + (938694, 16002), (938699, 58485), + (938769, 120184), (938778, 2331), + (938846, 18768), (938861, 10393), + (938888, 10000), (938921, 48355), + (938954, 3306), (938983, 61569), + (938996, 20030), (939000, 98120), + (939010, 11914), (939013, 85739), + (939026, 7124), (939084, 12446), + (939102, 23160), (939159, 16179), + (939166, 21983), (939180, 54062), + (939181, 27900), (939189, 18414), + (939202, 85400), (939220, 66848), + (939236, 4493), (939242, 101146), + (939248, 35115), (939270, 30), + (939288, 351198), (939302, 249705), + (939318, 111152), (939334, 14393), + (939349, 1582752), (939366, 4153), + (939378, 71001), (939395, 133022), + (939400, 4520), (939403, 4086), + (939473, 90281), (939495, 6129), + (939508, 74090), (939511, 108491), + (939515, 609198), (939524, 28479), + (939539, 52879), (939540, 12047), + (939552, 1283348), (939601, 57727), + (939655, 79799), (939660, 4512), + (939666, 118030), (939673, 6436), + (939674, 45960), (939688, 2043), + (939729, 154943), (939773, 186721), + (939790, 6536), (939807, 310780), + (939815, 66511), (939875, 42069), + (939904, 134190), (939935, 168770), + (939949, 30), (939952, 46528), + (939962, 143510), (939972, 140381), + (939980, 31783), (939984, 6270), + (939997, 12085), (940018, 4338), + (940024, 4086), (940035, 4086), + (940047, 40750), (940072, 42047), + (940092, 10000), (940120, 7000), + (940124, 26516), (940128, 5306), + (940130, 4579), (940186, 29251), + (940192, 52359), (940206, 20000), + (940258, 67106), (940266, 2043), + (940273, 49253), (940315, 10000), + (940321, 192319), (940332, 38200), + (940346, 4094), (940356, 30000), + (940379, 12260), (940420, 421716), + (940439, 10000), (940454, 30), + (940474, 12129), (940493, 3740), + (940553, 2288), (940567, 2287), + (940574, 41164), (940592, 2450), + (940598, 65147), (940601, 7761), + (940602, 510000), (940607, 137750), + (940622, 134290), (940652, 779921), + (940656, 27140), (940658, 77703), + (940665, 34012), (940669, 10530), + (940692, 17491), (940695, 20345), + (940699, 125985), (940702, 2043), + (940716, 11190), (940726, 2270), + (940764, 16129), (940772, 10000), + (940786, 8202), (940802, 5590), + (940816, 69910), (940831, 13760), + (940890, 71), (940940, 90277), + (940969, 39234), (941000, 14737), + (941019, 2350), (941092, 82594), + (941106, 98819), (941108, 271862), + (941113, 15493), (941116, 92043), + (941143, 10000), (941158, 67015), + (941207, 2043), (941254, 59620), + (941261, 54086), (941262, 14086), + (941270, 80000), (941293, 20000), + (941313, 10250), (941323, 44117), + (941351, 104073), (941365, 54094), + (941434, 100), (941435, 15062), + (941436, 4086), (941441, 146267), + (941444, 8160), (941449, 517432), + (941454, 6700), (941455, 70287), + (941456, 2043), (941460, 12573), + (941464, 10000), (941482, 3174), + (941486, 102043), (941501, 22450), + (941516, 14128), (941526, 22287), + (941558, 3127449), (941560, 4462), + (941563, 734), (941576, 10245), + (941630, 80000), (941649, 61695), + (941669, 415), (941704, 279), + (941709, 10000), (941757, 6000), + (941762, 139143), (941775, 4548), + (941776, 15419), (941782, 159230), + (941787, 10000), (941810, 117701), + (941815, 13820), (941818, 22106), + (941853, 112032), (941868, 20460), + (941875, 14207), (941895, 20000), + (941935, 6436), (941961, 243), + (941965, 15647), (941983, 17043), + (942050, 125842), (942052, 11440), + (942071, 22290), (942083, 55361), + (942086, 2260), (942126, 53639), + (942128, 13920), (942132, 54031), + (942139, 2043), (942210, 97246), + (942245, 30), (942284, 22593), + (942296, 18403), (942326, 100), + (942337, 24403), (942340, 2815079), + (942341, 19706), (942356, 15), + (942361, 25674), (942365, 8747), + (942383, 11146), (942394, 30868), + (942397, 48825), (942403, 104082), + (942405, 33619), (942406, 45611), + (942439, 612258), (942498, 12680), + (942510, 53566), (942600, 2883), + (942607, 10000), (942612, 17725), + (942616, 12043), (942641, 244), + (942647, 1287282), (942720, 310367), + (942732, 107202), (942745, 151433), + (942767, 2111665), (942768, 6102), + (942773, 10393), (942774, 88863), + (942802, 14579), (942807, 35443), + (942808, 10647), (942838, 25850), + (942859, 122287), (942891, 16373), + (942913, 58109), (942916, 80000), + (942928, 51351), (942940, 119114), + (942945, 1030000), (942958, 45379), + (942965, 22022), (942986, 54518), + (943004, 102742), (943035, 2350), + (943037, 80000), (943047, 111822), + (943075, 49709), (943076, 123710), + (943081, 3189), (943093, 102910), + (943105, 129559), (943144, 92043), + (943156, 12260), (943171, 132850), + (943173, 8530), (943198, 14313), + (943216, 41160), (943217, 119706), + (943268, 31160), (943273, 1301060), + (943291, 40425), (943301, 82434), + (943328, 2043), (943330, 12000), + (943340, 74833), (943394, 20000), + (943437, 12450), (943443, 193376), + (943446, 17758), (943460, 27304), + (943497, 202043), (943508, 4991), + (943519, 2043), (943526, 42589), + (943528, 44265), (943537, 3276), + (943544, 65813), (943561, 39346), + (943582, 25610), (943628, 33932), + (943687, 26032), (943731, 56185), + (943735, 25580), (943763, 26745), + (943764, 97481), (943766, 6129), + (943785, 131706), (943787, 10000), + (943818, 2450), (943822, 26553), + (943850, 664812), (943866, 2047), + (943867, 10400), (943876, 17623), + (943882, 57498), (943903, 69143), + (943928, 146769), (943943, 19504), + (943946, 16129), (943962, 29541), + (943981, 5232), (943992, 26129), + (944004, 2450), (944078, 2450), + (944087, 42059), (944091, 21086), + (944094, 18039), (944101, 17228), + (944161, 140884), (944169, 46632), + (944206, 20365), (944231, 674185), + (944234, 9043), (944265, 30330), + (944298, 4086), (944311, 21036), + (944315, 48499), (944323, 45043), + (944362, 5170), (944415, 83805), + (944423, 8356), (944456, 2061), + (944471, 2043), (944540, 14086), + (944560, 17079), (944562, 53499), + (944616, 2043), (944618, 84098), + (944626, 36760), (944657, 26160), + (944686, 101271), (944694, 10000), + (944721, 10000), (944789, 20215), + (944797, 2043), (944799, 27119), + (944804, 34520), (944808, 1275903), + (944831, 49423), (944834, 12043), + (944872, 4086), (944887, 23782), + (944906, 27043), (944922, 1888), + (944937, 133290), (944941, 45153), + (944945, 4658), (944964, 38231), + (944974, 126699), (944986, 29164), + (944988, 59035), (944993, 78128), + (945018, 10000), (945026, 57025), + (945034, 99450), (945097, 65704), + (945110, 10074), (945135, 48023), + (945172, 12047), (945186, 26319), + (945210, 2350), (945217, 250), + (945254, 75484), (945258, 2043), + (945294, 286547), (945310, 10030), + (945329, 22043), (945350, 294309), + (945436, 12350), (945461, 10084), + (945470, 22097), (945476, 22047), + (945489, 5556), (945503, 90683), + (945521, 178073), (945604, 132934), + (945632, 11920), (945647, 70938), + (945653, 43962), (945669, 4086), + (945679, 184671), (945755, 56211), + (945843, 26426), (945877, 3963), + (945912, 23367), (945920, 22640), + (945946, 245429), (945952, 54152), + (945953, 2043), (945957, 30), + (945974, 10000), (945980, 25580), + (945981, 138334), (945987, 2043), + (945993, 33937), (946000, 9443), + (946004, 40215), (946014, 6564), + (946037, 37219), (946058, 28959), + (946065, 40000), (946066, 73253), + (946070, 6125), (946075, 15580), + (946078, 2047), (946089, 54211), + (946106, 113285), (946123, 8357), + (946124, 2331), (946131, 17930), + (946160, 2043), (946189, 2043), + (946206, 100693), (946226, 74905), + (946266, 8358), (946297, 424264), + (946328, 104541), (946341, 66956), + (946354, 289788), (946449, 105690), + (946477, 42030), (946490, 83384), + (946502, 56637), (946526, 335869), + (946537, 10000), (946546, 88941), + (946558, 13067), (946578, 3496), + (946589, 62303), (946591, 10030), + (946621, 20000), (946634, 2039), + (946638, 31190), (946639, 33199), + (946767, 1307922), (946786, 33203), + (946829, 8894), (946849, 13830), + (946865, 19159), (946867, 4900), + (946954, 10090906), (946974, 11493), + (946990, 1280640), (947016, 12375), + (947023, 2252), (947028, 4086), + (947047, 133264), (947050, 132359), + (947076, 13127), (947087, 77318), + (947114, 69139), (947118, 75656), + (947123, 2043), (947145, 2350), + (947156, 4900), (947160, 6124), + (947167, 104733), (947204, 2047), + (947205, 4094), (947226, 2450), + (947244, 13256), (947254, 12375), + (947289, 75338), (947293, 2043), + (947300, 12909), (947328, 20393), + (947360, 75641), (947399, 48461), + (947434, 14090), (947455, 22731), + (947486, 178899), (947502, 156346), + (947519, 16436), (947534, 20000), + (947542, 182380), (947553, 76230), + (947555, 158790), (947560, 428242), + (947597, 2331), (947615, 1344), + (947625, 12443), (947658, 128907), + (947660, 22085), (947666, 29384), + (947704, 106383), (947721, 18855), + (947739, 138121), (947746, 4090), + (947754, 46603), (947794, 144212), + (947807, 2450), (947809, 18956), + (947853, 31371), (947856, 26700), + (947860, 14100), (947882, 7957), + (947883, 95356), (947898, 125348), + (947904, 38616), (947915, 2043), + (947938, 10000), (947943, 15057), + (947973, 203762), (948008, 5750), + (948013, 65399), (948055, 14094), + (948059, 10000), (948063, 14490), + (948110, 139318), (948147, 32047), + (948188, 85613), (948220, 4690), + (948242, 10000), (948252, 3267), + (948281, 55640), (948283, 5370), + (948309, 43311), (948325, 4086), + (948341, 6869), (948345, 18629), + (948414, 126577), (948416, 2047), + (948430, 10000), (948469, 512450), + (948480, 190685), (948500, 2450), + (948502, 4650), (948524, 14825), + (948534, 30), (948565, 30), + (948576, 122448), (948588, 13740), + (948607, 86925), (948618, 2616), + (948636, 101662), (948645, 17628), + (948654, 12043), (948661, 43129), + (948709, 12321), (948729, 56152), + (948734, 17901), (948742, 76864), + (948762, 24918), (948908, 10000), + (948918, 250), (948937, 175933), + (948945, 250), (948965, 12323), + (948977, 250), (948979, 23060), + (949061, 46135), (949070, 208175), + (949081, 35221), (949086, 45831), + (949087, 2260), (949100, 30), + (949101, 8358), (949141, 12047), + (949142, 350433), (949153, 119842), + (949162, 30340), (949173, 2290), + (949244, 22000), (949274, 65282), + (949335, 30077), (949340, 54579), + (949352, 12444), (949364, 108193), + (949394, 14354), (949403, 75672), + (949407, 10000), (949409, 66864), + (949445, 2315), (949452, 48984), + (949586, 38162), (949649, 112358), + (949659, 16484), (949696, 76094), + (949709, 16936), (949711, 221756), + (949719, 6640), (949721, 66864), + (949745, 116978), (949749, 75275), + (949751, 18172), (949765, 3276), + (949770, 10000), (949801, 454733), + (949805, 12443), (949848, 13090), + (949898, 38168), (949904, 4166), + (949953, 12039), (949954, 124090), + (949972, 5510), (949989, 143040), + (950022, 66840), (950042, 12085), + (950069, 2047), (950094, 341678), + (950101, 88447), (950135, 10000), + (950141, 12043), (950181, 14472), + (950187, 95710), (950188, 13136), + (950207, 121933), (950227, 56758), + (950274, 43507), (950307, 15586), + (950312, 2910), (950329, 4086), + (950335, 10000), (950348, 15648), + (950355, 53019), (950389, 61304), + (950413, 4880), (950429, 10000), + (950454, 158963), (950472, 452), + (950483, 16182), (950484, 15580), + (950533, 73770), (950549, 2043), + (950555, 4880), (950557, 41754), + (950570, 27444), (950598, 16431), + (950617, 4086), (950626, 112043), + (950655, 146113), (950692, 63435), + (950694, 34489), (950704, 64086), + (950706, 79620), (950728, 613895), + (950758, 10000), (950771, 15483), + (950809, 340499), (950831, 1920), + (950834, 11582), (950835, 8357), + (950844, 2350), (950865, 51817), + (950890, 66856), (950894, 55047), + (950916, 8357), (950985, 30), + (951064, 2043), (951079, 388951), + (951085, 580743), (951107, 10000), + (951122, 17892), (951138, 51420), + (951164, 31269), (951186, 6516), + (951232, 313307), (951248, 30589), + (951257, 190479), (951282, 72511), + (951291, 11406), (951297, 12445), + (951302, 22332), (951333, 25668), + (951357, 107103), (951371, 8172), + (951377, 70929), (951415, 82357), + (951420, 2043), (951454, 65409), + (951503, 10000), (951524, 13113), + (951535, 13400), (951666, 94314), + (951670, 17303), (951705, 282473), + (951712, 129225), (951749, 28442), + (951775, 266074), (951789, 2043), + (951838, 66864), (951892, 2043), + (951896, 13189), (951907, 25835), + (951983, 178181), (952012, 1355197), + (952032, 12699), (952033, 10000), + (952050, 4497), (952053, 89030), + (952071, 66856), (952107, 30), + (952121, 2331), (952124, 23272), + (952133, 25605), (952134, 950086), + (952150, 22047), (952261, 6540), + (952264, 4489), (952276, 81299), + (952296, 75854), (952300, 23346), + (952316, 70658), (952388, 26663), + (952391, 24422), (952449, 11700), + (952451, 1377053), (952471, 5757), + (952487, 311737), (952491, 10000), + (952513, 2019376), (952523, 313670), + (952533, 8172), (952535, 42450), + (952543, 28003), (952547, 57764), + (952563, 18168), (952588, 34781), + (952589, 25580), (952656, 68899), + (952664, 48600), (952670, 32115), + (952674, 168773), (952680, 10101384), + (952686, 3621), (952688, 85529), + (952705, 16169), (952737, 200490), + (952742, 6129), (952753, 98196), + (952775, 224257), (952795, 24000), + (952796, 14370), (952799, 1146), + (952852, 160133), (952858, 10000), + (952860, 131405), (952863, 16444), + (952884, 2043), (952947, 71674), + (952960, 1283151), (952977, 4062), + (952981, 10000), (952987, 28172), + (953006, 20000), (953019, 42043), + (953041, 68129), (953066, 267905), + (953071, 176867), (953077, 1920), + (953091, 20000), (953161, 66872), + (953164, 12043), (953173, 10000), + (953174, 24350), (953185, 112409), + (953206, 92003), (953241, 17052), + (953252, 10000), (953255, 10000), + (953265, 30000), (953284, 11923), + (953335, 20000), (953345, 2331), + (953346, 547431), (953387, 71), + (953398, 8172), (953423, 87397), + (953437, 11983), (953467, 101796), + (953561, 76839), (953575, 66864), + (953594, 24507), (953622, 12000), + (953641, 16751), (953645, 30000), + (953675, 181904), (953683, 14345), + (953709, 9963), (953715, 27047), + (953728, 10000), (953755, 23607), + (953760, 816644), (953764, 34080), + (953795, 224729), (953815, 4094), + (953852, 31489), (953855, 53274), + (953861, 55508), (953886, 104864), + (953894, 100000), (953905, 27303), + (953927, 12992), (953928, 19339), + (953976, 22450), (953977, 2043), + (954011, 7000), (954015, 2331), + (954026, 79716), (954037, 38656), + (954092, 60770), (954097, 1270268), + (954137, 91069), (954142, 13184), + (954144, 11000), (954159, 34660), + (954170, 731637), (954203, 2047), + (954204, 7000), (954214, 31276), + (954274, 2129734), (954298, 10030), + (954310, 50023), (954347, 11920), + (954395, 2047), (954403, 20761), + (954426, 10000), (954427, 31313), + (954442, 122107), (954446, 81736), + (954450, 355656), (954453, 531411), + (954464, 6125), (954478, 34397), + (954488, 218894), (954498, 91735), + (954503, 155884), (954512, 1920), + (954514, 98166), (954526, 248354), + (954527, 30), (954530, 15783), + (954543, 33299), (954546, 58027), + (954599, 3320086), (954612, 128243), + (954620, 253288), (954624, 32239), + (954634, 26133), (954649, 78899), + (954670, 30), (954681, 119516), + (954685, 2047), (954699, 2039), + (954725, 13566), (954727, 24260), + (954754, 10000), (954772, 2450), + (954791, 46272), (954796, 76856), + (954814, 63829), (954819, 10000), + (954826, 28248), (954848, 7371), + (954850, 191330), (954873, 40000), + (954897, 137267), (954907, 150648), + (954926, 196873), (954952, 402443), + (954969, 12043), (955020, 34132), + (955024, 4086), (955032, 24082), + (955046, 66601), (955079, 6129), + (955098, 80942), (955117, 40000), + (955161, 108565), (955169, 8145), + (955201, 71736), (955217, 54414), + (955220, 59897), (955263, 24524), + (955272, 34090), (955284, 213265), + (955291, 42696), (955300, 12043), + (955370, 28986), (955383, 109275), + (955392, 10000), (955400, 6000), + (955446, 11146), (955478, 10000), + (955491, 446259), (955498, 2047), + (955507, 31077), (955544, 16111), + (955546, 64487), (955599, 250), + (955604, 18741), (955621, 2043), + (955623, 7390), (955630, 74535), + (955632, 123145), (955674, 106637), + (955696, 84125), (955699, 249422), + (955733, 125700), (955734, 304109), + (955736, 2047), (955752, 27830), + (955776, 81000), (955780, 22254), + (955781, 19440), (955787, 82444), + (955806, 20000), (955814, 170258), + (955831, 20221), (955841, 12047), + (955883, 10000), (955943, 2450), + (955968, 96876), (955982, 26002), + (956022, 4504), (956025, 129637), + (956052, 2260), (956053, 2043), + (956092, 123984), (956109, 6346), + (956125, 27185), (956148, 80048), + (956159, 10219), (956187, 36910), + (956198, 37098), (956204, 51210), + (956212, 2047), (956217, 2043), + (956258, 34762), (956286, 14005), + (956290, 2043), (956303, 44750), + (956336, 23701), (956350, 577620), + (956353, 1920), (956355, 16129), + (956387, 20752), (956405, 64068), + (956471, 38389), (956472, 11452), + (956484, 10000), (956509, 42350), + (956535, 333201), (956540, 10670), + (956541, 20000), (956543, 20741), + (956553, 34074), (956565, 203000), + (956633, 2043), (956666, 30616), + (956694, 32749), (956741, 3275), + (956748, 34820), (956750, 6000), + (956766, 65824), (956791, 174447), + (956799, 60454), (956846, 13604), + (956847, 8194), (956936, 102047), + (956965, 57240), (957019, 179901), + (957044, 10000), (957058, 135708), + (957071, 14240), (957092, 191159), + (957119, 12443), (957134, 27299), + (957138, 66759), (957154, 13494), + (957181, 22925), (957209, 236401), + (957214, 37714), (957215, 11920), + (957224, 20751), (957230, 46644), + (957232, 28407), (957259, 73329), + (957267, 10112450), (957298, 119507), + (957309, 214624), (957340, 6927), + (957343, 77047), (957363, 45882), + (957371, 10000), (957416, 88492), + (957437, 34153), (957438, 20399), + (957448, 74363), (957463, 10000), + (957508, 45339), (957515, 25129), + (957518, 96026), (957529, 32149), + (957544, 36747), (957553, 62687), + (957562, 11493), (957603, 2047), + (957616, 369214), (957626, 10000), + (957698, 182695), (957776, 210000), + (957783, 20508), (957789, 18357), + (957795, 120903), (957801, 3501229), + (957820, 261984), (957846, 40474), + (957888, 300), (957908, 2450), + (957915, 72234), (957927, 173782), + (957928, 27487), (957933, 475739), + (957967, 73125), (958129, 2047), + (958139, 121755), (958143, 51765), + (958146, 38958), (958150, 12028), + (958161, 27556), (958183, 224677), + (958184, 107131), (958212, 43381), + (958224, 56817), (958233, 52490), + (958237, 288752), (958243, 210952), + (958253, 100000), (958266, 46630), + (958276, 17486), (958277, 117496), + (958302, 167747), (958309, 371064), + (958311, 4900), (958346, 2047), + (958409, 38290), (958449, 12495), + (958482, 6129), (958494, 54456), + (958514, 116029), (958523, 198433), + (958555, 103808), (958568, 16916), + (958608, 20215), (958620, 234467), + (958657, 2047), (958698, 43366), + (958745, 5973), (958764, 33092), + (958778, 863), (958800, 7480), + (958801, 24090), (958807, 59117), + (958813, 8172), (958838, 2430), + (958851, 30807), (958882, 14880), + (958889, 8172), (958910, 36840), + (958953, 13575), (958961, 86856), + (958986, 12047), (959014, 103538), + (959016, 41762), (959032, 352348), + (959062, 72628), (959072, 1134500), + (959103, 879496), (959113, 648161), + (959128, 497861), (959165, 39354), + (959171, 172548), (959175, 146506), + (959184, 30), (959201, 10000), + (959210, 3930), (959223, 45012), + (959253, 10968), (959255, 29912), + (959257, 26744), (959261, 70129), + (959284, 12720), (959286, 1059528), + (959303, 18936), (959310, 4094), + (959321, 46718), (959337, 2039), + (959349, 2043), (959382, 102073), + (959392, 10000), (959395, 835330), + (959405, 145392), (959461, 250), + (959466, 32331), (959480, 2260), + (959489, 507281), (959493, 45477), + (959553, 10000), (959570, 51539), + (959608, 15449), (959611, 79603), + (959614, 12039), (959660, 11146), + (959662, 40708), (959681, 110682), + (959682, 74061), (959710, 12375), + (959725, 12047), (959727, 87501), + (959767, 17694), (959857, 2450), + (959877, 6000), (959899, 20000), + (959952, 11933), (959989, 89408), + (960104, 31502), (960130, 2450), + (960147, 45783), (960158, 124006), + (960179, 2331), (960200, 20460), + (960217, 103343), (960228, 89450), + (960244, 115143), (960274, 11582), + (960299, 19048), (960303, 80671), + (960307, 284981), (960318, 30939), + (960323, 44737), (960328, 66264), + (960329, 18038), (960341, 212768), + (960361, 8856), (960372, 2043), + (960391, 1434235), (960413, 105516), + (960440, 54756), (960441, 3740), + (960465, 27735), (960490, 33801), + (960493, 502818), (960497, 108861), + (960499, 2331), (960572, 12043), + (960576, 26902), (960585, 233424), + (960594, 98551), (960601, 2615), + (960618, 183606), (960625, 8356), + (960637, 4500), (960661, 68895), + (960667, 38499), (960683, 32046), + (960711, 12375), (960726, 6000), + (960731, 20759), (960766, 71404), + (960767, 2038), (960778, 10000), + (960787, 10000), (960791, 34099), + (960829, 18574), (960834, 190234), + (960882, 2038), (960926, 230401), + (960940, 12687), (960948, 241504), + (960963, 271028), (961023, 90204), + (961038, 130684), (961050, 83380), + (961060, 96686), (961096, 48978), + (961112, 87867), (961130, 16000), + (961135, 9320), (961148, 134337), + (961174, 2038), (961188, 46056), + (961253, 30000), (961265, 111066), + (961272, 42331), (961327, 16129), + (961336, 16693), (961343, 158939), + (961352, 12043), (961373, 12375), + (961378, 22266), (961393, 25750), + (961427, 17000), (961441, 30731), + (961463, 2043), (961468, 13948), + (961484, 22350), (961489, 45386), + (961494, 56344), (961500, 10000), + (961587, 388815), (961599, 32260), + (961636, 139290), (961639, 30302), + (961684, 10000), (961688, 820), + (961704, 120173), (961709, 96848), + (961733, 220158), (961740, 94877), + (961756, 30000), (961761, 200838), + (961792, 10000), (961798, 4497), + (961812, 10000), (961858, 33911), + (961868, 73946), (961895, 13375), + (961897, 2043), (961979, 109187), + (962001, 79282), (962007, 291434), + (962072, 12043), (962086, 20465), + (962111, 30663), (962131, 3284), + (962148, 10000), (962178, 96876), + (962190, 2047), (962208, 219047), + (962253, 30681), (962254, 101565), + (962256, 2039), (962258, 366587), + (962304, 54368), (962308, 36885), + (962340, 90223), (962344, 131431), + (962351, 9927), (962368, 23012), + (962371, 10000), (962386, 25639), + (962396, 51127), (962413, 20000), + (962415, 168597), (962443, 25410), + (962447, 22792), (962450, 8358), + (962462, 29107), (962463, 227169), + (962480, 10000), (962495, 906420), + (962521, 54737), (962522, 22350), + (962586, 22616), (962590, 10000), + (962620, 4086), (962629, 150811), + (962635, 11920), (962639, 40000), + (962641, 70564), (962642, 124179), + (962643, 49306), (962651, 118782), + (962656, 28000), (962677, 133668), + (962691, 23400), (962697, 10000), + (962700, 20000), (962710, 21582), + (962730, 10000), (962738, 15651), + (962827, 25580), (962851, 10000), + (962858, 10000), (962862, 24301), + (962867, 83390), (962872, 10000), + (962900, 132227), (962903, 183345), + (962911, 3210), (962924, 126497), + (962949, 32047), (962963, 22085), + (963006, 51527), (963030, 2047), + (963123, 61206), (963134, 46125), + (963143, 10000), (963144, 40040), + (963160, 20244), (963178, 6129), + (963189, 20000), (963216, 32749), + (963229, 29660), (963243, 150283), + (963257, 10521), (963264, 40245), + (963284, 166295), (963359, 10000), + (963390, 10000), (963405, 18176), + (963414, 30100), (963417, 14493), + (963421, 115788), (963432, 272603), + (963467, 410128), (963473, 236159), + (963477, 29559), (963497, 2260), + (963526, 10000), (963568, 49629), + (963582, 97749), (963587, 12185), + (963592, 10000), (963593, 369220), + (963594, 20000), (963607, 22450), + (963612, 20000), (963615, 155262), + (963617, 20000), (963631, 1397843), + (963636, 119489), (963647, 10000), + (963648, 608291), (963754, 93062), + (963799, 10000), (963805, 23530), + (963827, 37623), (963849, 20000), + (963859, 31160), (963868, 30000), + (963887, 14414), (963929, 27968), + (963934, 67678), (963951, 20400), + (963957, 55869), (963961, 38214), + (963990, 22043), (964055, 22260), + (964137, 10000), (964153, 32260), + (964155, 10000), (964160, 69086), + (964169, 40102), (964183, 136447), + (964190, 10000), (964203, 46159), + (964225, 2910), (964236, 609625), + (964246, 72657), (964270, 10000), + (964279, 104401), (964295, 48085), + (964296, 8356), (964314, 154094), + (964316, 10030), (964325, 28996), + (964373, 14086), (964408, 118930), + (964413, 10000), (964427, 12043), + (964438, 10000), (964482, 190917), + (964491, 69938), (964497, 2450), + (964498, 32043), (964503, 14086), + (964534, 31129), (964575, 38878), + (964594, 1741766), (964629, 172749), + (964655, 104972), (964658, 112443), + (964678, 4520), (964681, 68755), + (964686, 94140), (964709, 15290), + (964722, 164085), (964725, 231670), + (964743, 42442), (964763, 31884), + (964804, 147614), (964837, 76772), + (964908, 232749), (964919, 116862), + (964924, 34159), (964940, 2297), + (964944, 220489), (964951, 60715), + (964970, 284872), (965053, 2), + (965057, 22047), (965060, 55009), + (965088, 74113), (965091, 381174), + (965118, 1423379), (965120, 193195), + (965146, 20400), (965148, 16129), + (965152, 10000), (965160, 112837), + (965182, 169437), (965193, 2047), + (965213, 22450), (965215, 28206), + (965234, 93998), (965283, 45140), + (965303, 73619), (965306, 101232), + (965315, 128357), (965373, 10000), + (965390, 39176), (965407, 10000), + (965419, 20000), (965435, 378796), + (965486, 80874), (965491, 10000), + (965493, 56287), (965535, 18357), + (965537, 22047), (965569, 16129), + (965585, 32047), (965609, 32350), + (965639, 1997538), (965652, 10000), + (965677, 1010852), (965711, 216290), + (965714, 180748), (965727, 25310), + (965771, 41462), (965783, 4086), + (965784, 32047), (965825, 2258356), + (965835, 28128), (965868, 61799), + (965871, 38370), (965874, 293685), + (965908, 365823), (965932, 14493), + (965955, 19172), (965960, 28827), + (965965, 29893), (965970, 56344), + (965974, 156699), (965978, 99780), + (965991, 10071), (965998, 29568), + (966035, 142466), (966044, 78899), + (966045, 25589), (966054, 110015), + (966056, 170002), (966102, 46515), + (966113, 100910), (966119, 120513), + (966140, 148188), (966170, 937379), + (966202, 2047), (966206, 52442), + (966240, 10000), (966264, 126117), + (966286, 38260), (966361, 10000), + (966373, 165161), (966381, 16340), + (966492, 12039), (966494, 26086), + (966498, 4086), (966530, 66856), + (966557, 11086), (966568, 2039), + (966574, 87488), (966580, 30460), + (966584, 42664), (966597, 26129), + (966606, 76848), (966624, 50442), + (966633, 52485), (966640, 166021), + (966661, 47730), (966725, 50403), + (966726, 66848), (966742, 52499), + (966754, 10000), (966773, 13244), + (966786, 20000), (966789, 10000), + (966847, 14397), (966853, 97130), + (966890, 2350), (966912, 73160), + (966926, 10000), (966969, 4086), + (966974, 66848), (967029, 160613), + (967046, 17152), (967054, 29958), + (967062, 5226), (967065, 78625), + (967089, 558), (967094, 570241), + (967099, 45471), (967116, 30000), + (967117, 34086), (967129, 14090), + (967177, 480236), (967184, 243059), + (967190, 165122), (967191, 6125), + (967208, 20030), (967237, 20000), + (967247, 250970), (967250, 14086), + (967268, 85735), (967272, 10100), + (967287, 408691), (967348, 22118), + (967355, 12450), (967367, 60239), + (967368, 13284), (967416, 1797540), + (967438, 10820), (967439, 49901), + (967473, 49370), (967520, 7230), + (967521, 5364), (967535, 10000), + (967539, 32260), (967570, 52666), + (967615, 87273), (967645, 244863), + (967659, 135809), (967676, 12331), + (967680, 22450), (967755, 80169), + (967761, 10403), (967830, 10000), + (967843, 3653), (967887, 12043), + (967890, 9534), (967907, 12085), + (967908, 20000), (967923, 39945), + (967924, 10000), (967929, 8357), + (967979, 848236), (967981, 116389), + (967985, 26660), (967986, 4086), + (968063, 74096), (968078, 17796), + (968098, 12047), (968112, 200000), + (968128, 17329), (968132, 10000), + (968136, 34086), (968176, 26175), + (968195, 10000), (968202, 53842), + (968223, 2047), (968232, 30144), + (968241, 308790), (968242, 505780), + (968267, 244579), (968313, 10000), + (968316, 138103), (968329, 13310), + (968344, 119879), (968347, 3280), + (968355, 22129), (968356, 119307), + (968398, 250), (968407, 75916), + (968422, 25512), (968451, 412414), + (968454, 51330), (968481, 250), + (968488, 4733), (968506, 41350), + (968509, 141709), (968521, 12350), + (968533, 4443), (968534, 10000), + (968536, 117977), (968595, 48811), + (968604, 148698), (968626, 12038), + (968627, 12350), (968659, 26712), + (968692, 89916), (968703, 88725), + (968713, 33425), (968722, 113754), + (968782, 24123), (968783, 161504), + (968789, 111698), (968794, 118161), + (968818, 14947), (968844, 56869), + (968882, 23494), (968889, 2350), + (968900, 47799), (968905, 12043), + (968945, 16179), (968964, 10219), + (968971, 12085), (969006, 153613), + (969053, 9660), (969074, 72198), + (969171, 111567), (969203, 32985), + (969208, 52989), (969221, 535227), + (969228, 623197), (969244, 28649), + (969247, 3740), (969285, 19802), + (969290, 8748), (969332, 200100), + (969335, 6539), (969337, 15960), + (969344, 2095575), (969356, 69990), + (969379, 10000), (969405, 121376), + (969441, 766568), (969452, 82848), + (969469, 7263), (969488, 225926), + (969510, 3740), (969518, 20412), + (969531, 33267), (969542, 68891), + (969576, 3400), (969577, 116222), + (969605, 10000), (969618, 96709), + (969632, 20401), (969659, 9114), + (969688, 39334), (969689, 71413), + (969700, 1030), (969728, 76600), + (969738, 313012), (969752, 10000), + (969772, 4662), (969773, 4086), + (969782, 10239), (969788, 77247), + (969789, 112296), (969810, 20000), + (969833, 106737), (969841, 157754), + (969842, 11920), (969883, 10000), + (969909, 16048), (969915, 47800), + (969927, 111152), (969928, 41869), + (969934, 23585), (969940, 13147), + (969953, 2043), (969969, 26519), + (969987, 31348), (970054, 10000), + (970068, 13136), (970107, 2350), + (970112, 24150), (970128, 14178), + (970140, 10000), (970150, 22702), + (970183, 8043), (970228, 21483), + (970245, 13400), (970251, 2176173), + (970269, 17351), (970277, 7793), + (970386, 126927), (970412, 127967), + (970418, 15755), (970419, 328349), + (970455, 118478), (970460, 96897), + (970503, 576403), (970605, 7250), + (970627, 20000), (970635, 14535), + (970636, 12383), (970661, 2349), + (970665, 16733), (970724, 2053), + (970750, 123237), (970770, 8385), + (970780, 166331), (970789, 67096), + (970810, 828435), (970838, 203315), + (970910, 115291), (970916, 249095), + (970932, 215056), (970934, 16958), + (970940, 104282), (970951, 2047), + (970961, 10000), (970975, 99515), + (970981, 2450), (970982, 1818043), + (970991, 45264), (970995, 17023), + (971005, 1275903), (971013, 42829), + (971039, 8395), (971042, 132085), + (971064, 21146), (971073, 50934), + (971079, 20000), (971080, 250), + (971104, 122692), (971124, 79157), + (971145, 50708), (971151, 16636), + (971156, 10000), (971230, 10000), + (971235, 2335), (971259, 80320), + (971283, 40469), (971289, 18404), + (971311, 34143), (971312, 144608), + (971362, 119291), (971387, 10559), + (971390, 91650), (971394, 18970), + (971421, 18450), (971437, 86518), + (971447, 10000), (971454, 3400), + (971459, 72078), (971476, 214249), + (971496, 67744), (971506, 369360), + (971508, 4698), (971527, 2093359), + (971540, 137940), (971547, 69227), + (971551, 166986), (971553, 10000), + (971575, 6849), (971585, 2060), + (971597, 12243), (971609, 202275), + (971619, 31576), (971621, 3842), + (971644, 4068), (971652, 19976), + (971666, 7004), (971749, 151435), + (971768, 58090), (971831, 3206), + (971849, 10000), (971854, 10000), + (971864, 42081), (971869, 14544), + (971902, 76260), (971922, 12801), + (971931, 86147), (971955, 2450), + (971957, 102349), (971978, 2062), + (972005, 37711), (972014, 97148), + (972028, 10000), (972036, 120000), + (972056, 4721), (972059, 84472), + (972081, 12979), (972086, 12349), + (972116, 16760), (972140, 41269), + (972147, 202645), (972156, 23139), + (972180, 62890), (972181, 55540), + (972187, 319454), (972201, 3930), + (972240, 21333), (972245, 34645), + (972246, 81268), (972250, 25580), + (972277, 84412), (972311, 20030), + (972339, 41320), (972341, 42450), + (972371, 8422), (972425, 12450), + (972448, 12349), (972497, 10771), + (972504, 481592), (972505, 42342), + (972523, 46260), (972532, 1466325), + (972543, 405293), (972558, 20000), + (972592, 280511), (972611, 2655), + (972672, 68038), (972678, 23740), + (972739, 250), (972742, 10000), + (972769, 146040), (972782, 73916), + (972806, 253580), (972815, 118294), + (972820, 250), (972833, 10000), + (972916, 117960), (972925, 87452), + (972944, 24323), (972956, 133044), + (972962, 85901), (972969, 13740), + (972987, 156913), (973022, 31160), + (973076, 38540), (973154, 2055), + (973167, 12349), (973172, 44128), + (973176, 5004), (973183, 10772), + (973250, 4323), (973317, 12063), + (973340, 148295), (973342, 93034), + (973365, 2349), (973385, 20000), + (973431, 22349), (973440, 105549), + (973443, 10000), (973470, 28621), + (973527, 12450), (973558, 67110), + (973568, 131030), (973572, 604300), + (973581, 36098), (973609, 22450), + (973702, 173662), (973845, 14500), + (973864, 16530), (973896, 14005), + (973913, 10245), (973922, 24393), + (973923, 22450), (973925, 10000), + (973940, 70000), (973945, 10000), + (973984, 49159), (973986, 40488), + (974039, 245), (974090, 10981), + (974159, 55011), (974188, 148740), + (974239, 10000), (974273, 23822), + (974306, 15205), (974346, 10071), + (974396, 18956), (974473, 43664), + (974482, 48046), (974510, 22450), + (974604, 85437), (974607, 12960), + (974620, 21161), (974622, 16000), + (974728, 10000), (974780, 23267), + (974815, 116317), (974820, 3328), + (974937, 25243), (974939, 57241), + (974942, 10000), (974977, 10017444), + (974981, 10000), (974986, 69301), + (975024, 5527), (975045, 88707), + (975101, 143049), (975119, 2960), + (975144, 10250), (975194, 210867), + (975202, 10000), (975209, 5220), + (975220, 12987), (975221, 39100), + (975223, 20250), (975259, 84000), + (975262, 62035), (975315, 28900), + (975324, 10000), (975360, 23985), + (975362, 10000), (975409, 41891), + (975534, 70276), (975541, 43400), + (975586, 149138), (975590, 78008), + (975661, 20000), (975674, 10381), + (975678, 11693), (975707, 448), + (975716, 540), (975718, 20302), + (975768, 13954), (975813, 26284), + (975825, 10000), (975836, 1003), + (975877, 20447), (975919, 98489), + (975927, 53456), (975953, 245), + (975954, 69640), (975960, 26533), + (975972, 1525778), (975980, 10552), + (976002, 2180089), (976061, 19451), + (976078, 2766), (976146, 46160), + (976172, 60456), (976199, 12960), + (976204, 11688), (976233, 103755), + (976270, 45580), (976317, 10000), + (976324, 42675), (976356, 110000), + (976358, 3576), (976359, 12085), + (976404, 270896), (976408, 10000), + (976448, 10000), (976478, 26871), + (976485, 30777), (976515, 21831), + (976538, 10000), (976580, 13267), + (976589, 20776), (976596, 21920), + (976648, 31229), (976681, 128204), + (976720, 303808), (976730, 14800), + (976751, 49518), (976785, 40908), + (976796, 41923), (976816, 13445), + (976821, 82909), (976823, 73383), + (976837, 11095), (976848, 20000), + (976893, 12260), (976904, 30000), + (976906, 13955), (976943, 10000), + (976970, 11747), (976972, 30905), + (977006, 25054), (977046, 70761), + (977112, 10000), (977121, 33125), + (977133, 46563), (977165, 2450), + (977181, 313000), (977221, 26000), + (977233, 104672), (977239, 72223), + (977253, 108209), (977271, 10000), + (977284, 102450), (977384, 36136), + (977446, 52079), (977462, 296107), + (977470, 11680), (977557, 452), + (977569, 168039), (977612, 27665), + (977639, 30000), (977661, 40070), + (977724, 17597), (977732, 5357), + (977744, 30000), (977865, 50273), + (977888, 76544), (977898, 120960), + (977901, 94062), (977902, 14165), + (977932, 100), (977937, 10000), + (977953, 118631), (977960, 7001), + (977990, 103267), (978001, 19086), + (978002, 175118), (978027, 10000), + (978036, 10245), (978038, 13400), + (978048, 10000), (978053, 10000), + (978084, 54540), (978106, 24900), + (978108, 10244), (978146, 3267), + (978180, 6274), (978215, 111870), + (978233, 3740), (978240, 5711), + (978312, 10000), (978328, 13543), + (978340, 58259), (978349, 10000), + (978406, 90391), (978412, 26321), + (978434, 12960), (978448, 33740), + (978451, 10000), (978469, 12280), + (978508, 30266), (978520, 27013), + (978533, 60789), (978579, 115275), + (978627, 12450), (978629, 8960), + (978650, 10000), (978708, 177080), + (978766, 10000), (978769, 108804), + (978857, 75080), (978859, 6389), + (978866, 63573), (978922, 134678), + (978943, 53719), (979025, 2450), + (979041, 12350), (979143, 23673), + (979148, 110508), (979170, 20000), + (979171, 10000), (979181, 27220), + (979182, 20000), (979191, 12450), + (979244, 19940), (979246, 85900), + (979249, 20000), (979274, 24338), + (979312, 2960), (979313, 2430), + (979339, 12960), (979363, 94124), + (979402, 61261), (979430, 12888), + (979443, 23204), (979456, 10000), + (979500, 10000), (979520, 10000), + (979537, 15289), (979600, 14890), + (979604, 113607), (979649, 11444), + (979725, 113381), (979728, 26260), + (979735, 14434), (979751, 5220), + (979783, 29563), (979798, 10250), + (979815, 140245), (979831, 10000), + (979849, 15410), (979858, 12960), + (979864, 25635), (979872, 119636), + (979889, 230887), (979919, 67497), + (979928, 31160), (979932, 46840), + (979948, 237698), (979963, 13745), + (979965, 1420771), (979967, 10000), + (980028, 10000), (980042, 1000), + (980117, 2383), (980129, 13267), + (980131, 71502), (980141, 143400), + (980147, 10000), (980196, 2673), + (980221, 77389), (980226, 55582), + (980251, 5696), (980255, 110543), + (980294, 10000), (980380, 72242), + (980403, 90740), (980431, 483845), + (980451, 30460), (980463, 15220), + (980473, 38084), (980475, 10000), + (980519, 24298), (980554, 2960), + (980575, 492593), (980625, 10100), + (980626, 183697), (980658, 2450), + (980661, 52270), (980674, 21321), + (980701, 16100), (980749, 114121), + (980754, 92547), (980777, 22088), + (980808, 50925), (980828, 20477), + (980835, 20572), (980838, 20000), + (980880, 130000), (980910, 246964), + (980917, 244715), (980930, 23412), + (980976, 20000), (980988, 16000), + (981037, 37140), (981043, 23939), + (981229, 145079), (981230, 68176), + (981253, 102623), (981279, 22094), + (981303, 180009), (981321, 1185726), + (981373, 60929), (981400, 45508), + (981454, 171784), (981468, 47822), + (981477, 21920), (981505, 30995), + (981509, 10000), (981519, 12450), + (981581, 2450), (981603, 20000), + (981615, 32960), (981670, 10000), + (981731, 43353), (981732, 1585160), + (981739, 12093), (981749, 100000), + (981798, 10000), (981856, 22450), + (981861, 32116), (981863, 517), + (981868, 94162), (981885, 171431), + (981903, 7260), (981908, 10276), + (981909, 141135), (981918, 19778), + (982048, 42260), (982051, 103402), + (982073, 47129), (982079, 122486), + (982109, 8398), (982113, 15410), + (982141, 7000), (982169, 108009), + (982223, 10000), (982224, 7064), + (982250, 2956), (982259, 104253), + (982264, 20000), (982279, 10000), + (982284, 248491), (982330, 2450), + (982346, 33740), (982381, 10000), + (982389, 13879), (982416, 24543), + (982432, 10000), (982438, 173861), + (982453, 10000), (982461, 100257), + (982470, 22896), (982502, 175581), + (982519, 2093), (982565, 57840), + (982587, 8543), (982680, 46772), + (982758, 10000), (982809, 55624), + (982871, 22672), (982881, 601908), + (982947, 30000), (982958, 10000), + (982963, 20000), (982995, 42036), + (982998, 69620), (983003, 10427), + (983025, 34724), (983046, 100673), + (983066, 103733), (983088, 86891), + (983113, 23282), (983114, 10000), + (983129, 128224), (983158, 48963), + (983176, 1053047), (983205, 31525), + (983230, 123775), (983265, 10000), + (983276, 157142), (983336, 5726), + (983373, 15580), (983433, 219149), + (983502, 2092), (983521, 431051), + (983531, 26002), (983541, 20000), + (983559, 108384), (983564, 4543), + (983585, 2960), (983600, 177579), + (983611, 148639), (983622, 101862), + (983630, 32093), (983658, 10000), + (983669, 1146), (983670, 3596), + (983707, 20404), (983724, 113667), + (983740, 10000), (983751, 14160), + (983789, 2960), (983790, 14543), + (983835, 58716), (983927, 77586), + (983937, 265239), (983962, 35295), + (983967, 225335), (983997, 445061), + (984045, 405171), (984051, 32917), + (984052, 10892), (984091, 10000), + (984114, 239543), (984115, 34878), + (984138, 128459), (984151, 59306), + (984154, 8544), (984226, 2196), + (984257, 677115), (984264, 119532), + (984275, 20000), (984326, 3406), + (984417, 139320), (984458, 27446), + (984475, 30000), (984490, 167880), + (984548, 58088), (984550, 12260), + (984612, 457520), (984619, 7580), + (984650, 47148), (984672, 18148), + (984674, 100178), (984682, 5050), + (984698, 10000), (984706, 84542), + (984739, 12091), (984740, 101030), + (984751, 30000), (984752, 124588), + (984769, 120292), (984794, 198835), + (984795, 7130), (984806, 10710), + (984838, 50000), (984847, 10000), + (984871, 10000), (984897, 60000), + (984921, 16438), (984950, 114812), + (984968, 80120), (984998, 25337), + (985009, 2350), (985029, 168451), + (985039, 12350), (985044, 109239), + (985048, 50000), (985073, 109849), + (985098, 60121), (985114, 125919), + (985121, 10000), (985178, 25617), + (985179, 18541), (985280, 16790), + (985297, 117464), (985314, 82960), + (985319, 175324), (985325, 33481), + (985350, 83683), (985369, 10000), + (985394, 113596), (985435, 36700), + (985484, 93267), (985491, 20000), + (985523, 55240), (985576, 9579), + (985585, 88033), (985640, 80000), + (985668, 32310), (985669, 8116), + (985670, 132594), (985675, 12260), + (985682, 168054), (985690, 13236), + (985709, 130014), (985728, 188067), + (985777, 167190), (985869, 40353), + (985881, 6252), (985912, 2960), + (985996, 20000), (986009, 95736), + (986038, 116220), (986071, 25168), + (986112, 23573), (986138, 25580), + (986151, 10000), (986152, 33267), + (986179, 295193), (986191, 151687), + (986211, 109305), (986236, 71022), + (986244, 10100), (986289, 71905), + (986305, 3648), (986334, 42092), + (986377, 24353), (986380, 18960), + (986417, 87069), (986423, 20000), + (986427, 2260), (986437, 22450), + (986456, 2382), (986499, 65789), + (986513, 209200), (986553, 20000), + (986554, 13850), (986559, 15923), + (986590, 22960), (986601, 33875), + (986632, 7000), (986641, 110000), + (986674, 108997), (986711, 10000), + (986729, 81170), (986750, 10000), + (986761, 35359), (986762, 8541), + (986803, 111823), (986822, 23573), + (986855, 23912), (986876, 238000), + (986909, 22075), (986924, 43960), + (986929, 21920), (986934, 768), + (987019, 57264), (987041, 10000), + (987060, 4500), (987086, 10000), + (987102, 115699), (987109, 226827), + (987179, 20000), (987184, 68344), + (987199, 11920), (987214, 10000), + (987219, 82410), (987231, 42960), + (987285, 30990), (987302, 1146), + (987412, 10000), (987417, 12093), + (987436, 9342), (987448, 10489), + (987471, 1097015), (987473, 68309), + (987474, 19653), (987477, 111437), + (987516, 189321), (987538, 13544), + (987603, 4703013), (987610, 2093), + (987616, 2093), (987633, 299117), + (987659, 3267), (987770, 14549), + (987772, 90731), (987793, 4880), + (987803, 3545), (987827, 342007), + (987861, 38960), (987867, 2093), + (987884, 10000), (987938, 94084), + (987951, 410885), (987967, 169509), + (987992, 74058), (988035, 74352), + (988043, 118641), (988047, 69078), + (988054, 12383), (988096, 219926), + (988125, 2375), (988130, 112519), + (988159, 39896), (988266, 68360), + (988313, 20000), (988318, 86615), + (988322, 627468), (988377, 30000), + (988380, 352193), (988392, 290188), + (988410, 8117), (988434, 15580), + (988449, 113809), (988521, 75042), + (988529, 15220), (988568, 33325), + (988583, 110841), (988586, 92247), + (988591, 10000), (988602, 124656), + (988604, 82982), (988634, 144436), + (988640, 386781), (988665, 4345), + (988674, 20000), (988684, 8545), + (988695, 48138), (988756, 69689), + (988761, 2960), (988768, 22818), + (988794, 12384), (988839, 60763), + (988841, 250), (988871, 33369), + (988892, 10500), (988901, 15527), + (988903, 19040), (989035, 15660), + (989042, 64552), (989050, 10000), + (989065, 47300), (989067, 89958), + (989075, 84377), (989132, 28229), + (989181, 12653), (989199, 1920), + (989337, 175108), (989370, 154735), + (989377, 81305), (989419, 86905), + (989432, 47681), (989434, 20214), + (989438, 493161), (989443, 120449), + (989446, 3411), (989487, 33760), + (989502, 113696), (989602, 83239), + (989641, 6000), (989653, 29634), + (989716, 4751385), (989736, 68847), + (989755, 589516), (989855, 17407), + (989861, 102840), (989881, 20000), + (989908, 480874), (989910, 7920), + (989942, 20286), (989943, 2960), + (989951, 13265), (989975, 20000), + (990018, 38332), (990056, 191509), + (990063, 10071), (990097, 28031), + (990128, 25580), (990131, 10000), + (990172, 12303), (990197, 629945), + (990237, 330158), (990242, 181403), + (990244, 177915), (990275, 226913), + (990309, 88136), (990353, 7000), + (990368, 26939), (990392, 22260), + (990394, 111949), (990433, 10000), + (990444, 23740), (990453, 20000), + (990510, 24756), (990530, 78258), + (990532, 20000), (990534, 57241), + (990567, 118987), (990612, 9397), + (990623, 250717), (990698, 69530), + (990702, 36000), (990706, 34978), + (990711, 2622), (990720, 64760), + (990771, 20709), (990804, 7954), + (990813, 2960), (990860, 46986), + (990872, 1348097), (990873, 9402), + (990897, 314242), (990942, 49384), + (990994, 171579), (991078, 10000), + (991085, 131806), (991086, 33596), + (991087, 14553), (991150, 1286738), + (991214, 398104), (991217, 30000), + (991251, 55865), (991266, 69761), + (991269, 103267), (991338, 10000), + (991343, 64232), (991344, 20000), + (991360, 111410), (991421, 14966), + (991469, 20989), (991476, 75120), + (991478, 19389), (991528, 139226), + (991545, 31710), (991558, 148188), + (991561, 11657), (991572, 9386), + (991595, 31558), (991621, 6000), + (991642, 340271), (991663, 31732), + (991682, 10000), (991747, 100000), + (991762, 4596), (991791, 85080), + (991802, 106498), (991859, 26700), + (991888, 150635), (991930, 270482), + (991975, 25873), (991997, 136649), + (992002, 52375), (992003, 16459), + (992022, 10000), (992060, 108072), + (992063, 20000), (992085, 28620), + (992115, 54760), (992139, 6000), + (992162, 2417514), (992178, 7369), + (992243, 70000), (992253, 8861), + (992263, 22260), (992288, 37212), + (992291, 27139), (992377, 34668), + (992382, 11776), (992424, 39191), + (992436, 23505), (992440, 10000), + (992447, 159680), (992476, 12260), + (992484, 20000), (992498, 118), + (992522, 319234), (992604, 21151), + (992664, 22712), (992687, 81100), + (992707, 85188), (992709, 6680), + (992714, 222291), (992731, 25261), + (992790, 131436), (992807, 3573), + (992810, 10129551), (992813, 137840), + (992815, 15290), (992820, 89005), + (992833, 12960), (992860, 10000), + (992877, 51241), (992894, 20000), + (992957, 10000), (993028, 12960), + (993030, 102846), (993048, 58302), + (993057, 10000), (993170, 2260), + (993227, 20245), (993274, 222661), + (993285, 25498), (993291, 17542), + (993332, 110000), (993358, 10000), + (993363, 1307094), (993380, 10000), + (993397, 52690), (993399, 10000), + (993407, 17727), (993462, 120960), + (993541, 204668), (993574, 30020), + (993622, 68416), (993635, 10000), + (993638, 35652), (993654, 181380), + (993674, 6000), (993699, 109316), + (993772, 528721), (993848, 32960), + (993887, 21146), (993917, 107553), + (993936, 117188), (993949, 64460), + (993952, 107651), (993999, 12095), + (994123, 30000), (994143, 103653), + (994168, 2960), (994212, 20245), + (994234, 25006), (994241, 20000), + (994260, 10000), (994275, 48243), + (994284, 3204), (994304, 20000), + (994332, 12627), (994367, 276), + (994370, 35233), (994395, 17000), + (994408, 160169), (994452, 2145349), + (994458, 22430), (994460, 20000), + (994505, 245), (994515, 12960), + (994567, 143377), (994571, 32000), + (994582, 30245), (994618, 46875), + (994628, 13667), (994634, 33543), + (994641, 10000), (994651, 26941), + (994671, 19003), (994677, 64957), + (994718, 55990), (994762, 56000), + (994790, 36629), (994795, 19555), + (994944, 68466), (994988, 13879), + (994995, 32187), (995024, 34810), + (995039, 18554), (995042, 35254), + (995073, 37061), (995078, 35153), + (995081, 110000), (995104, 28942), + (995107, 2095), (995115, 20068), + (995236, 10000), (995251, 30000), + (995274, 14627), (995281, 29040), + (995300, 91619), (995374, 28103), + (995439, 80000), (995468, 6000), + (995485, 1385477), (995495, 132281), + (995501, 38602), (995511, 255412), + (995518, 20381), (995579, 3573), + (995603, 127535), (995687, 2960), + (995720, 90556), (995772, 27138), + (995786, 329544), (995794, 35047), + (995822, 10641), (995835, 12960), + (995864, 81392), (995886, 48034), + (995892, 24282), (995919, 160818), + (995978, 195338), (995995, 237647), + (996015, 23267), (996036, 154237), + (996059, 2450), (996069, 146389), + (996077, 12960), (996084, 12960), + (996121, 40100), (996146, 74760), + (996147, 40679), (996158, 19298), + (996162, 82338), (996198, 145823), + (996205, 12960), (996217, 147119), + (996316, 26360), (996319, 25310), + (996339, 3879), (996356, 74744), + (996367, 9344), (996380, 30112), + (996395, 19346), (996437, 31627), + (996485, 129438), (996488, 84776), + (996525, 32312), (996588, 10000), + (996591, 2960), (996597, 98124), + (996622, 22027), (996679, 6000), + (996801, 20000), (996835, 25064), + (996836, 107150), (996840, 2960), + (996900, 18456), (996920, 4710), + (996973, 4432), (996982, 100149), + (997003, 45661), (997008, 23060), + (997014, 369360), (997070, 54717), + (997088, 240930), (997108, 45331), + (997135, 30000), (997193, 102076), + (997212, 159529), (997273, 1920), + (997284, 41626), (997298, 11947), + (997383, 2960), (997408, 452488), + (997435, 180875), (997456, 10000), + (997461, 9374), (997486, 24691), + (997499, 36678), (997556, 10452), + (997609, 20000), (997619, 9378), + (997627, 33436), (997648, 3267), + (997703, 31744), (997710, 234778), + (997725, 1699), (997728, 1920), + (997729, 2536), (997834, 100420), + (997848, 245), (997862, 10000), + (997900, 22970), (997904, 10000), + (997910, 10244), (997942, 2626), + (997947, 15580), (997948, 36276), + (997954, 10000), (997960, 65969), + (997981, 136693), (998003, 3740), + (998017, 2260), (998039, 26533), + (998056, 250), (998076, 250), + (998088, 3596), (998096, 250), + (998099, 10000), (998147, 15580), + (998183, 55718), (998187, 18496), + (998213, 17230), (998251, 90245), + (998259, 4016), (998324, 27420), + (998346, 2180), (998349, 19600), + (998375, 15335), (998450, 17283), + (998499, 276), (998553, 100513), + (998557, 245), (998574, 10000), + (998583, 51251), (998602, 24673), + (998618, 12288), (998632, 94645), + (998655, 21269), (998715, 2594), + (998741, 2655), (998770, 20787), + (998774, 23512), (998797, 39450), + (998811, 3267), (998855, 245), + (998860, 2450), (998868, 2420079), + (998911, 5408), (998916, 576), + (998958, 13879), (999005, 10000), + (999049, 276), (999076, 10279), + (999111, 106688), (999112, 62900), + (999156, 111803), (999162, 414), + (999191, 15481), (999282, 24139), + (999296, 13074), (999315, 393), + (999319, 10000), (999383, 16267), + (999386, 31160), (999403, 122817), + (999405, 126342), (999406, 297725), + (999455, 243), (999481, 278), + (999537, 13276), (999606, 42902), + (999621, 93580), (999635, 94188), + (999640, 1282), (999759, 27804), + (999793, 22436), (999814, 2450), + (999817, 33267), (999857, 440058), + (999922, 40000), (999957, 3267), + (1000005, 43879), (1000006, 208678), + (1000008, 18448), (1000024, 276), + (1000040, 117299), (1000051, 20000), + (1000081, 10000), (1000108, 2260), + (1000138, 2960), (1000141, 3034879), + (1000147, 72161), (1000151, 10000), + (1000159, 4185), (1000163, 9666), + (1000174, 510245), (1000179, 166100), + (1000183, 50263), (1000209, 29665), + (1000243, 4000), (1000292, 25961), + (1000307, 80000), (1000339, 55722)]} + ) + + diff --git a/contrib/metrics/supply_check/funding_streams_mainnet.py b/contrib/metrics/supply_check/funding_streams_mainnet.py new file mode 100644 index 000000000..6e540b7e1 --- /dev/null +++ b/contrib/metrics/supply_check/funding_streams_mainnet.py @@ -0,0 +1,104 @@ +fr_addrs = set([ + # FR addresses + "t3Vz22vK5z2LcKEdg16Yv4FFneEL1zg9ojd", + "t3cL9AucCajm3HXDhb5jBnJK2vapVoXsop3", + "t3fqvkzrrNaMcamkQMwAyHRjfDdM2xQvDTR", + "t3TgZ9ZT2CTSK44AnUPi6qeNaHa2eC7pUyF", + "t3SpkcPQPfuRYHsP5vz3Pv86PgKo5m9KVmx", + "t3Xt4oQMRPagwbpQqkgAViQgtST4VoSWR6S", + "t3ayBkZ4w6kKXynwoHZFUSSgXRKtogTXNgb", + "t3adJBQuaa21u7NxbR8YMzp3km3TbSZ4MGB", + "t3K4aLYagSSBySdrfAGGeUd5H9z5Qvz88t2", + "t3RYnsc5nhEvKiva3ZPhfRSk7eyh1CrA6Rk", + "t3Ut4KUq2ZSMTPNE67pBU5LqYCi2q36KpXQ", + "t3ZnCNAvgu6CSyHm1vWtrx3aiN98dSAGpnD", + "t3fB9cB3eSYim64BS9xfwAHQUKLgQQroBDG", + "t3cwZfKNNj2vXMAHBQeewm6pXhKFdhk18kD", + "t3YcoujXfspWy7rbNUsGKxFEWZqNstGpeG4", + "t3bLvCLigc6rbNrUTS5NwkgyVrZcZumTRa4", + "t3VvHWa7r3oy67YtU4LZKGCWa2J6eGHvShi", + "t3eF9X6X2dSo7MCvTjfZEzwWrVzquxRLNeY", + "t3esCNwwmcyc8i9qQfyTbYhTqmYXZ9AwK3X", + "t3M4jN7hYE2e27yLsuQPPjuVek81WV3VbBj", + "t3gGWxdC67CYNoBbPjNvrrWLAWxPqZLxrVY", + "t3LTWeoxeWPbmdkUD3NWBquk4WkazhFBmvU", + "t3P5KKX97gXYFSaSjJPiruQEX84yF5z3Tjq", + "t3f3T3nCWsEpzmD35VK62JgQfFig74dV8C9", + "t3Rqonuzz7afkF7156ZA4vi4iimRSEn41hj", + "t3fJZ5jYsyxDtvNrWBeoMbvJaQCj4JJgbgX", + "t3Pnbg7XjP7FGPBUuz75H65aczphHgkpoJW", + "t3WeKQDxCijL5X7rwFem1MTL9ZwVJkUFhpF", + "t3Y9FNi26J7UtAUC4moaETLbMo8KS1Be6ME", + "t3aNRLLsL2y8xcjPheZZwFy3Pcv7CsTwBec", + "t3gQDEavk5VzAAHK8TrQu2BWDLxEiF1unBm", + "t3Rbykhx1TUFrgXrmBYrAJe2STxRKFL7G9r", + "t3aaW4aTdP7a8d1VTE1Bod2yhbeggHgMajR", + "t3YEiAa6uEjXwFL2v5ztU1fn3yKgzMQqNyo", + "t3g1yUUwt2PbmDvMDevTCPWUcbDatL2iQGP", + "t3dPWnep6YqGPuY1CecgbeZrY9iUwH8Yd4z", + "t3QRZXHDPh2hwU46iQs2776kRuuWfwFp4dV", + "t3enhACRxi1ZD7e8ePomVGKn7wp7N9fFJ3r", + "t3PkLgT71TnF112nSwBToXsD77yNbx2gJJY", + "t3LQtHUDoe7ZhhvddRv4vnaoNAhCr2f4oFN", + "t3fNcdBUbycvbCtsD2n9q3LuxG7jVPvFB8L", + "t3dKojUU2EMjs28nHV84TvkVEUDu1M1FaEx", + "t3aKH6NiWN1ofGd8c19rZiqgYpkJ3n679ME", + "t3MEXDF9Wsi63KwpPuQdD6by32Mw2bNTbEa", + "t3WDhPfik343yNmPTqtkZAoQZeqA83K7Y3f", + "t3PSn5TbMMAEw7Eu36DYctFezRzpX1hzf3M", + "t3R3Y5vnBLrEn8L6wFjPjBLnxSUQsKnmFpv", + "t3Pcm737EsVkGTbhsu2NekKtJeG92mvYyoN", + # ECC funding stream addresses + "t3LmX1cxWPPPqL4TZHx42HU3U5ghbFjRiif", + "t3Toxk1vJQ6UjWQ42tUJz2rV2feUWkpbTDs", + "t3ZBdBe4iokmsjdhMuwkxEdqMCFN16YxKe6", + "t3ZuaJziLM8xZ32rjDUzVjVtyYdDSz8GLWB", + "t3bAtYWa4bi8VrtvqySxnbr5uqcG9czQGTZ", + "t3dktADfb5Rmxncpe1HS5BRS5Gcj7MZWYBi", + "t3hgskquvKKoCtvxw86yN7q8bzwRxNgUZmc", + "t3R1VrLzwcxAZzkX4mX3KGbWpNsgtYtMntj", + "t3ff6fhemqPMVujD3AQurxRxTdvS1pPSaa2", + "t3cEUQFG3KYnFG6qYhPxSNgGi3HDjUPwC3J", + "t3WR9F5U4QvUFqqx9zFmwT6xFqduqRRXnaa", + "t3PYc1LWngrdUrJJbHkYPCKvJuvJjcm85Ch", + "t3bgkjiUeatWNkhxY3cWyLbTxKksAfk561R", + "t3Z5rrR8zahxUpZ8itmCKhMSfxiKjUp5Dk5", + "t3PU1j7YW3fJ67jUbkGhSRto8qK2qXCUiW3", + "t3S3yaT7EwNLaFZCamfsxxKwamQW2aRGEkh", + "t3eutXKJ9tEaPSxZpmowhzKhPfJvmtwTEZK", + "t3gbTb7brxLdVVghSPSd3ycGxzHbUpukeDm", + "t3UCKW2LrHFqPMQFEbZn6FpjqnhAAbfpMYR", + "t3NyHsrnYbqaySoQqEQRyTWkjvM2PLkU7Uu", + "t3QEFL6acxuZwiXtW3YvV6njDVGjJ1qeaRo", + "t3PdBRr2S1XTDzrV8bnZkXF3SJcrzHWe1wj", + "t3ZWyRPpWRo23pKxTLtWsnfEKeq9T4XPxKM", + "t3he6QytKCTydhpztykFsSsb9PmBT5JBZLi", + "t3VWxWDsLb2TURNEP6tA1ZSeQzUmPKFNxRY", + "t3NmWLvZkbciNAipauzsFRMxoZGqmtJksbz", + "t3cKr4YxVPvPBG1mCvzaoTTdBNokohsRJ8n", + "t3T3smGZn6BoSFXWWXa1RaoQdcyaFjMfuYK", + "t3gkDUe9Gm4GGpjMk86TiJZqhztBVMiUSSA", + "t3eretuBeBXFHe5jAqeSpUS1cpxVh51fAeb", + "t3dN8g9zi2UGJdixGe9txeSxeofLS9t3yFQ", + "t3S799pq9sYBFwccRecoTJ3SvQXRHPrHqvx", + "t3fhYnv1S5dXwau7GED3c1XErzt4n4vDxmf", + "t3cmE3vsBc5xfDJKXXZdpydCPSdZqt6AcNi", + "t3h5fPdjJVHaH4HwynYDM5BB3J7uQaoUwKi", + "t3Ma35c68BgRX8sdLDJ6WR1PCrKiWHG4Da9", + "t3LokMKPL1J8rkJZvVpfuH7dLu6oUWqZKQK", + "t3WFFGbEbhJWnASZxVLw2iTJBZfJGGX73mM", + "t3L8GLEsUn4QHNaRYcX3EGyXmQ8kjpT1zTa", + "t3PgfByBhaBSkH8uq4nYJ9ZBX4NhGCJBVYm", + "t3WecsqKDhWXD4JAgBVcnaCC2itzyNZhJrv", + "t3ZG9cSfopnsMQupKW5v9sTotjcP5P6RTbn", + "t3hC1Ywb5zDwUYYV8LwhvF5rZ6m49jxXSG5", + "t3VgMqDL15ZcyQDeqBsBW3W6rzfftrWP2yB", + "t3LC94Y6BwLoDtBoK2NuewaEbnko1zvR9rm", + "t3cWCUZJR3GtALaTcatrrpNJ3MGbMFVLRwQ", + "t3YYF4rPLVxDcF9hHFsXyc5Yq1TFfbojCY6", + "t3XHAGxRP2FNfhAjxGjxbrQPYtQQjc3RCQD", + # ZF funding stream addresses + "t3dvVE3SQEi7kqNzwrfNePxZ1d4hUyztBA1", + # MG funding stream addresses + "t3XyYW8yBFRuMnfvm5KLGFbEVz25kckZXym", +]) diff --git a/contrib/metrics/supply_check/supply_deltas.py b/contrib/metrics/supply_check/supply_deltas.py new file mode 100644 index 000000000..b827ef53e --- /dev/null +++ b/contrib/metrics/supply_check/supply_deltas.py @@ -0,0 +1,60 @@ +import pprint +import bisect + +class SupplyDeltas: + def __init__(self, fr_addrs, miner_deltas, flush_interval = 500): + self.fr_addrs = fr_addrs + self.miner_deltas = miner_deltas + + self.delta_total = 0 + self.delta_cache = [] + self.flush_interval = flush_interval + + deltas_flat = [pair for deltas in miner_deltas.values() for pair in deltas] + for (deltaHeight, delta) in sorted(deltas_flat): + self.AddSupplyDelta(deltaHeight, delta) + + # AddSupplyDelta must be called with heights in increasing order. + # It will raise an assertion error if an out-of-order insertion is + # attempted. + def AddSupplyDelta(self, deltaHeight, delta): + assert len(self.delta_cache) == 0 or deltaHeight > self.delta_cache[-1][0] + + self.delta_total += delta + bisect.insort(self.delta_cache, (deltaHeight, self.delta_total), key=lambda x: x[0]) + + def DeviationUpToHeight(self, height): + i = bisect.bisect(self.delta_cache, height, key=lambda x: x[0]) + return 0 if i == 0 else self.delta_cache[i - 1][1] + + def SaveMismatch(self, block, theoretical, empirical): + height = block['height'] + coinbase_tx = block['tx'][0] + delta = theoretical - empirical + + print('Mismatch at height {}: {} != {} ({}) miner_deltas: {}'.format( + height, + theoretical, + empirical, + delta, + len(self.miner_deltas), + )) + + # if delta ever goes negative, we will halt + if delta >= 0: + miner_addrs = set([addr for out in coinbase_tx['vout'] for addr in out['scriptPubKey'].get('addresses', [])]) - self.fr_addrs + if len(miner_addrs) > 0: + self.miner_deltas.setdefault(",".join(sorted(miner_addrs)), []).append((height, delta)) + self.AddSupplyDelta(height, delta) + if len(self.delta_cache) % 500 == 0: + with open("delta_cache.{}.out".format(len(self.delta_cache)), 'w', encoding="utf8") as f: + pprint.pprint(self.miner_deltas, stream = f, compact = True) + + return True + + pprint.pprint(coinbase_tx['vout'], indent = 4) + return False + + def PrintDeltas(self): + with open("delta_cache.out", 'w', encoding="utf8") as f: + pprint.pprint(self.miner_deltas, stream = f, compact = True) diff --git a/contrib/metrics/supply_check/theoretical.py b/contrib/metrics/supply_check/theoretical.py new file mode 100644 index 000000000..befc57d6e --- /dev/null +++ b/contrib/metrics/supply_check/theoretical.py @@ -0,0 +1,67 @@ +def exact_div(x, y): + assert x % y == 0 + return x // y + +# floor(u/x + v/y) +def div2(u, x, v, y): + return (u*y + v*x) // (x*y) + +TESTNET = 0 +MAINNET = 1 + +class Network: + # + def __init__(self, network): + self.BlossomActivationHeight = 653600 if network == MAINNET else 584000 + + SlowStartInterval = 20000 + MaxBlockSubsidy = 1250000000 # 12.5 ZEC + PreBlossomHalvingInterval = 840000 + PreBlossomPoWTargetSpacing = 150 + PostBlossomPoWTargetSpacing = 75 + + # + def IsBlossomActivated(self, height): + return height >= self.BlossomActivationHeight + + BlossomPoWTargetSpacingRatio = exact_div(PreBlossomPoWTargetSpacing, PostBlossomPoWTargetSpacing) + + # no need for floor since this is necessarily an integer + PostBlossomHalvingInterval = PreBlossomHalvingInterval * BlossomPoWTargetSpacingRatio + + # + SlowStartShift = exact_div(SlowStartInterval, 2) + + SlowStartRate = exact_div(MaxBlockSubsidy, SlowStartInterval) + + SupplyCache = [] + + def Halving(self, height): + if height < self.SlowStartShift: + return 0 + elif not self.IsBlossomActivated(height): + return (height - self.SlowStartShift) // self.PreBlossomHalvingInterval + else: + return div2(self.BlossomActivationHeight - self.SlowStartShift, self.PreBlossomHalvingInterval, + height - self.BlossomActivationHeight, self.PostBlossomHalvingInterval) + + def BlockSubsidy(self, height): + if height < self.SlowStartShift: + return self.SlowStartRate * height + elif self.SlowStartShift <= height and height < self.SlowStartInterval: + return self.SlowStartRate * (height + 1) + if self.SlowStartInterval <= height and not self.IsBlossomActivated(height): + return self.MaxBlockSubsidy // (1 << self.Halving(height)) + else: + return self.MaxBlockSubsidy // (self.BlossomPoWTargetSpacingRatio << self.Halving(height)) + + def SupplyAfterHeight(self, height): + cacheLen = len(self.SupplyCache) + if cacheLen > height: + return self.SupplyCache[height] + else: + cur = 0 if cacheLen == 0 else self.SupplyCache[-1] + for h in range(cacheLen, height + 1): + cur += self.BlockSubsidy(h) + self.SupplyCache.append(cur) + return self.SupplyCache[-1] diff --git a/contrib/qos/README.md b/contrib/qos/README.md new file mode 100644 index 000000000..5e32a2a09 --- /dev/null +++ b/contrib/qos/README.md @@ -0,0 +1,5 @@ +### QoS (Quality of service) ### + +This is a Linux bash script that will set up tc to limit the outgoing bandwidth for connections to the Bitcoin network. It limits outbound TCP traffic with a source or destination port of 8233, but not if the destination IP is within a LAN. + +This means one can have an always-on bitcoind instance running, and another local bitcoind/bitcoin-qt instance which connects to this node and receives blocks from it. diff --git a/contrib/qos/tc.sh b/contrib/qos/tc.sh new file mode 100644 index 000000000..1de8473e6 --- /dev/null +++ b/contrib/qos/tc.sh @@ -0,0 +1,62 @@ +#!/usr/bin/env bash +# +# Copyright (c) 2017 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +export LC_ALL=C +#network interface on which to limit traffic +IF="eth0" +#limit of the network interface in question +LINKCEIL="1gbit" +#limit outbound Bitcoin protocol traffic to this rate +LIMIT="160kbit" +#defines the IPv4 address space for which you wish to disable rate limiting +LOCALNET_V4="192.168.0.0/16" +#defines the IPv6 address space for which you wish to disable rate limiting +LOCALNET_V6="fe80::/10" + +#delete existing rules +tc qdisc del dev ${IF} root + +#add root class +tc qdisc add dev ${IF} root handle 1: htb default 10 + +#add parent class +tc class add dev ${IF} parent 1: classid 1:1 htb rate ${LINKCEIL} ceil ${LINKCEIL} + +#add our two classes. one unlimited, another limited +tc class add dev ${IF} parent 1:1 classid 1:10 htb rate ${LINKCEIL} ceil ${LINKCEIL} prio 0 +tc class add dev ${IF} parent 1:1 classid 1:11 htb rate ${LIMIT} ceil ${LIMIT} prio 1 + +#add handles to our classes so packets marked with go into the class with "... handle fw ..." +tc filter add dev ${IF} parent 1: protocol ip prio 1 handle 1 fw classid 1:10 +tc filter add dev ${IF} parent 1: protocol ip prio 2 handle 2 fw classid 1:11 + +if [ -n "${LOCALNET_V6}" ] ; then + # v6 cannot have the same priority value as v4 + tc filter add dev ${IF} parent 1: protocol ipv6 prio 3 handle 1 fw classid 1:10 + tc filter add dev ${IF} parent 1: protocol ipv6 prio 4 handle 2 fw classid 1:11 +fi + +#delete any existing rules +#disable for now +#ret=0 +#while [ $ret -eq 0 ]; do +# iptables -t mangle -D OUTPUT 1 +# ret=$? +#done + +#limit outgoing traffic to and from port 8233. but not when dealing with a host on the local network +# (defined by $LOCALNET_V4 and $LOCALNET_V6) +# --set-mark marks packages matching these criteria with the number "2" (v4) +# --set-mark marks packages matching these criteria with the number "4" (v6) +# these packets are filtered by the tc filter with "handle 2" +# this filter sends the packages into the 1:11 class, and this class is limited to ${LIMIT} +iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 8233 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 +iptables -t mangle -A OUTPUT -p tcp -m tcp --sport 8233 ! -d ${LOCALNET_V4} -j MARK --set-mark 0x2 + +if [ -n "${LOCALNET_V6}" ] ; then + ip6tables -t mangle -A OUTPUT -p tcp -m tcp --dport 8233 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 + ip6tables -t mangle -A OUTPUT -p tcp -m tcp --sport 8233 ! -d ${LOCALNET_V6} -j MARK --set-mark 0x4 +fi diff --git a/contrib/seeds/README.md b/contrib/seeds/README.md new file mode 100644 index 000000000..0a9d59d88 --- /dev/null +++ b/contrib/seeds/README.md @@ -0,0 +1,4 @@ +### Seeds ### + +Utility to generate the seeds.txt list that is compiled into the client +(see [src/chainparamsseeds.h](/src/chainparamsseeds.h) and other utilities in [contrib/seeds](/contrib/seeds)). \ No newline at end of file diff --git a/contrib/seeds/generate-seeds.py b/contrib/seeds/generate-seeds.py new file mode 100755 index 000000000..5c9bd5475 --- /dev/null +++ b/contrib/seeds/generate-seeds.py @@ -0,0 +1,138 @@ +#!/usr/bin/env python +# Copyright (c) 2014 Wladimir J. van der Laan +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +''' +Script to generate list of seed nodes for chainparams.cpp. + +This script expects two text files in the directory that is passed as an +argument: + + nodes_main.txt + nodes_test.txt + +These files must consist of lines in the format + + + : + [] + []: + .onion + 0xDDBBCCAA (IPv4 little-endian old pnSeeds format) + +The output will be two data structures with the peers in binary format: + + static SeedSpec6 pnSeed6_main[]={ + ... + } + static SeedSpec6 pnSeed6_test[]={ + ... + } + +These should be pasted into `src/chainparamsseeds.h`. +''' +from __future__ import print_function, division +from base64 import b32decode +from binascii import a2b_hex +import sys, os +import re + +# ipv4 in ipv6 prefix +pchIPv4 = bytearray([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff]) +# tor-specific ipv6 prefix +pchOnionCat = bytearray([0xFD,0x87,0xD8,0x7E,0xEB,0x43]) + +def name_to_ipv6(addr): + if len(addr)>6 and addr.endswith('.onion'): + vchAddr = b32decode(addr[0:-6], True) + if len(vchAddr) != 16-len(pchOnionCat): + raise ValueError('Invalid onion %s' % s) + return pchOnionCat + vchAddr + elif '.' in addr: # IPv4 + return pchIPv4 + bytearray((int(x) for x in addr.split('.'))) + elif ':' in addr: # IPv6 + sub = [[], []] # prefix, suffix + x = 0 + addr = addr.split(':') + for i,comp in enumerate(addr): + if comp == '': + if i == 0 or i == (len(addr)-1): # skip empty component at beginning or end + continue + x += 1 # :: skips to suffix + assert(x < 2) + else: # two bytes per component + val = int(comp, 16) + sub[x].append(val >> 8) + sub[x].append(val & 0xff) + nullbytes = 16 - len(sub[0]) - len(sub[1]) + assert((x == 0 and nullbytes == 0) or (x == 1 and nullbytes > 0)) + return bytearray(sub[0] + ([0] * nullbytes) + sub[1]) + elif addr.startswith('0x'): # IPv4-in-little-endian + return pchIPv4 + bytearray(reversed(a2b_hex(addr[2:]))) + else: + raise ValueError('Could not parse address %s' % addr) + +def parse_spec(s, defaultport): + match = re.match('\[([0-9a-fA-F:]+)\](?::([0-9]+))?$', s) + if match: # ipv6 + host = match.group(1) + port = match.group(2) + elif s.count(':') > 1: # ipv6, no port + host = s + port = '' + else: + (host,_,port) = s.partition(':') + + if not port: + port = defaultport + else: + port = int(port) + + host = name_to_ipv6(host) + + return (host,port) + +def process_nodes(g, f, structname, defaultport): + g.write('static SeedSpec6 %s[] = {\n' % structname) + first = True + for line in f: + comment = line.find('#') + if comment != -1: + line = line[0:comment] + line = line.strip() + if not line: + continue + if not first: + g.write(',\n') + first = False + + (host,port) = parse_spec(line, defaultport) + hoststr = ','.join(('0x%02x' % b) for b in host) + g.write(' {{%s}, %i}' % (hoststr, port)) + g.write('\n};\n') + +def main(): + if len(sys.argv)<2: + print(('Usage: %s ' % sys.argv[0]), file=sys.stderr) + exit(1) + g = sys.stdout + indir = sys.argv[1] + g.write('#ifndef BITCOIN_CHAINPARAMSSEEDS_H\n') + g.write('#define BITCOIN_CHAINPARAMSSEEDS_H\n') + g.write('/**\n') + g.write(' * List of fixed seed nodes for the bitcoin network\n') + g.write(' * AUTOGENERATED by contrib/seeds/generate-seeds.py\n') + g.write(' *\n') + g.write(' * Each line contains a 16-byte IPv6 address and a port.\n') + g.write(' * IPv4 as well as onion addresses are wrapped inside a IPv6 address accordingly.\n') + g.write(' */\n') + with open(os.path.join(indir,'nodes_main.txt'),'r', encoding="utf8") as f: + process_nodes(g, f, 'pnSeed6_main', 8233) + g.write('\n') + with open(os.path.join(indir,'nodes_test.txt'),'r', encoding="utf8") as f: + process_nodes(g, f, 'pnSeed6_test', 18233) + g.write('#endif // BITCOIN_CHAINPARAMSSEEDS_H\n') + +if __name__ == '__main__': + main() + diff --git a/contrib/seeds/makeseeds.py b/contrib/seeds/makeseeds.py new file mode 100755 index 000000000..041f83e2b --- /dev/null +++ b/contrib/seeds/makeseeds.py @@ -0,0 +1,169 @@ +#!/usr/bin/env python +# +# Generate seeds.txt from Pieter's DNS seeder +# + +NSEEDS=512 + +MAX_SEEDS_PER_ASN=2 + +MIN_BLOCKS = 337600 + +# These are hosts that have been observed to be behaving strangely (e.g. +# aggressively connecting to every node). +SUSPICIOUS_HOSTS = set([ + "130.211.129.106", "178.63.107.226", + "83.81.130.26", "88.198.17.7", "148.251.238.178", "176.9.46.6", + "54.173.72.127", "54.174.10.182", "54.183.64.54", "54.194.231.211", + "54.66.214.167", "54.66.220.137", "54.67.33.14", "54.77.251.214", + "54.94.195.96", "54.94.200.247" +]) + +import re +import sys +import dns.resolver +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"^(\/MagicBean:([0-9a-z-.]+)\/)$") + +def parseline(line): + sline = line.split() + if len(sline) < 11: + return None + m = PATTERN_IPV4.match(sline[0]) + sortkey = None + ip = None + if m is None: + m = PATTERN_IPV6.match(sline[0]) + if m is None: + m = PATTERN_ONION.match(sline[0]) + if m is None: + return None + else: + net = 'onion' + ipstr = sortkey = m.group(1) + port = int(m.group(2)) + else: + net = 'ipv6' + if m.group(1) in ['::']: # Not interested in localhost + return None + ipstr = m.group(1) + sortkey = ipstr # XXX parse IPv6 into number, could use name_to_ipv6 from generate-seeds + port = int(m.group(2)) + else: + # Do IPv4 sanity check + ip = 0 + for i in range(0,4): + if int(m.group(i+2)) < 0 or int(m.group(i+2)) > 255: + return None + ip = ip + (int(m.group(i+2)) << (8*(3-i))) + if ip == 0: + return None + net = 'ipv4' + sortkey = ip + ipstr = m.group(1) + port = int(m.group(6)) + # Skip bad results. + if sline[1] == 0: + return None + # Extract uptime %. + uptime30 = float(sline[7][:-1]) + # Extract Unix timestamp of last success. + lastsuccess = int(sline[2]) + # Extract protocol version. + version = int(sline[10]) + # Extract user agent. + agent = sline[11][1:-1] + # Extract service flags. + service = int(sline[9], 16) + # Extract blocks. + blocks = int(sline[8]) + # Construct result. + return { + 'net': net, + 'ip': ipstr, + 'port': port, + 'ipnum': ip, + 'uptime': uptime30, + 'lastsuccess': lastsuccess, + 'version': version, + 'agent': agent, + 'service': service, + 'blocks': blocks, + 'sortkey': sortkey, + } + +def filtermultiport(ips): + '''Filter out hosts with more nodes per IP''' + hist = collections.defaultdict(list) + for ip in ips: + hist[ip['sortkey']].append(ip) + return [value[0] for (key,value) in hist.items() if len(value)==1] + +# Based on Greg Maxwell's seed_filter.py +def filterbyasn(ips, max_per_asn, max_total): + # Sift out ips by type + ips_ipv4 = [ip for ip in ips if ip['net'] == 'ipv4'] + ips_ipv6 = [ip for ip in ips if ip['net'] == 'ipv6'] + ips_onion = [ip for ip in ips if ip['net'] == 'onion'] + + # Filter IPv4 by ASN + result = [] + asn_count = {} + for ip in ips_ipv4: + if len(result) == max_total: + break + try: + asn = int([x.to_text() for x in dns.resolver.query('.'.join(reversed(ip['ip'].split('.'))) + '.origin.asn.cymru.com', 'TXT').response.answer][0].split('\"')[1].split(' ')[0]) + if asn not in asn_count: + asn_count[asn] = 0 + if asn_count[asn] == max_per_asn: + continue + asn_count[asn] += 1 + result.append(ip) + except: + sys.stderr.write('ERR: Could not resolve ASN for "' + ip['ip'] + '"\n') + + # TODO: filter IPv6 by ASN + + # Add back non-IPv4 + result.extend(ips_ipv6) + result.extend(ips_onion) + return result + +def main(): + lines = sys.stdin.readlines() + ips = [parseline(line) for line in lines] + + # Skip entries with valid address. + ips = [ip for ip in ips if ip is not None] + # Skip entries from suspicious hosts. + ips = [ip for ip in ips if ip['ip'] not in SUSPICIOUS_HOSTS] + # Enforce minimal number of blocks. + ips = [ip for ip in ips if ip['blocks'] >= MIN_BLOCKS] + # Require service bit 1. + ips = [ip for ip in ips if (ip['service'] & 1) == 1] + # Require at least 50% 30-day uptime. + ips = [ip for ip in ips if ip['uptime'] > 50] + # Require a known and recent user agent. + ips = [ip for ip in ips if PATTERN_AGENT.match(ip['agent'])] + # Sort by availability (and use last success as tie breaker) + ips.sort(key=lambda x: (x['uptime'], x['lastsuccess'], x['ip']), reverse=True) + # Filter out hosts with multiple bitcoin ports, these are likely abusive + ips = filtermultiport(ips) + # Look up ASNs and limit results, both per ASN and globally. + ips = filterbyasn(ips, MAX_SEEDS_PER_ASN, NSEEDS) + # Sort the results by IP address (for deterministic output). + ips.sort(key=lambda x: (x['net'], x['sortkey'])) + + for ip in ips: + if ip['net'] == 'ipv6': + print '[%s]:%i' % (ip['ip'], ip['port']) + else: + print '%s:%i' % (ip['ip'], ip['port']) + +if __name__ == '__main__': + main() diff --git a/contrib/simulations/worstcase.py b/contrib/simulations/worstcase.py new file mode 100755 index 000000000..3018cd053 --- /dev/null +++ b/contrib/simulations/worstcase.py @@ -0,0 +1,246 @@ +#!/usr/bin/env python3 +import csv +import os +import subprocess + +# +# Constants +# + +MAX_BLOCK_SIZE = 2000000 + +# +# Verification times +# + +def collect_times(): + # Find bench_bitcoin binary + script_dir = os.path.dirname(os.path.realpath(__file__)) + base_dir = os.path.dirname(os.path.dirname(script_dir)) + bench_bitcoin = os.path.join(base_dir, 'src', 'bench', 'bench_bitcoin') + + # Run bench_bitcoin binary + try: + result = subprocess.run([bench_bitcoin], stdout=subprocess.PIPE, universal_newlines=True) + result.check_returncode() + result = result.stdout + except AttributeError: + # Use the older API + result = subprocess.check_output([bench_bitcoin], universal_newlines=True) + + # Collect benchmarks + benchmarks = {} + for row in result.strip().split('\n')[1:]: # Skip the headings + parts = row.split(',') + benchmarks[parts[0]] = int(parts[2]) + + return { + 'proof': benchmarks['SaplingOutput'], + 'ecdsa': benchmarks['ECDSA'], + 'redjubjub': benchmarks['SaplingSpend'] - benchmarks['SaplingOutput'], + 'ed25519': benchmarks['JoinSplitSig'], + } + +# +# Size calculations +# + +def compact_size_size(nSize): + if nSize < 253: + return 1 + elif nSize <= 0xFFFF: + return 3 + elif nSize <= 0xFFFFFFFF: + return 5 + else: + return 9 + +def script_size(script): + return ( + compact_size_size(len(script)) + + len(script) + ) + +def tx_in_size(scriptSig): + return ( + 32 + # prevout.hash + 4 + # prevout.n + script_size(scriptSig) + + 4 # nSequence + ) + +def tx_out_size(scriptPubKey): + return ( + 8 + # nValue + script_size(scriptPubKey) + ) + +def v4_tx_size(vin, vout, nShieldedSpend, nShieldedOutput, nJoinSplit): + return ( + 4 + # header + 4 + # nVersionGroupId + compact_size_size(len(vin)) + + sum([tx_in_size(scriptSig) for scriptSig in vin]) + + compact_size_size(len(vout)) + + sum([tx_out_size(scriptPubKey) for scriptPubKey in vout]) + + 4 + # lock_time + 4 + # nExpiryHeight + 4 + # valueBalance + compact_size_size(nShieldedSpend) + + (384 * nShieldedSpend) + + compact_size_size(nShieldedOutput) + + (948 * nShieldedOutput) + + compact_size_size(nJoinSplit) + + (1698 * nJoinSplit) + + ((32 + 64) if nJoinSplit > 0 else 0) + # joinSplitPubKey + joinSplitSig + (64 if (nShieldedSpend + nShieldedOutput) > 0 else 0) # bindingSig + ) + +def block_size(vtx): + return ( + 4 + # nVersion + 32 + # hashPrevBlock + 32 + # hashMerkleRoot + 32 + # hashFinalSaplingRoot + 4 + # nTime + 4 + # nBits + 32 + # nNonce + compact_size_size(1344) + # solutionSize + 1344 + # solution + compact_size_size(len(vtx)) + + sum([v4_tx_size(**tx) for tx in vtx]) + ) + +# +# Runners +# + +def worst_case_many_identical_txs(tx): + vtx = [] + while True: + vtx.append(tx) + if block_size(vtx) > MAX_BLOCK_SIZE: + # Keep under the size limit + vtx.pop() + break + return vtx + +def worst_case_one_tx_containing(item): + vtx = [{ + 'vin': [], + 'vout': [], + 'nShieldedSpend': 0, + 'nShieldedOutput': 0, + 'nJoinSplit': 0, + }] + while True: + vtx[0][item] += 1 + if block_size(vtx) > MAX_BLOCK_SIZE: + # Keep under the size limit + vtx[0][item] -= 1 + break + return vtx + +def print_makeup(vtx, times): + # One proof per Sapling spend, Sapling output, and JoinSplit + proofs = sum([tx['nShieldedSpend'] + tx['nShieldedOutput'] + tx['nJoinSplit'] for tx in vtx]) + + # One ECDSA signature per transparent input + ecdsa_sigs = sum([len(tx['vin']) for tx in vtx]) + + # One RedJubjub signature per Sapling spend (spendAuthSig) and per transaction (bindingSig) + redjubjub_sigs = sum([tx['nShieldedSpend'] + ( + 1 if tx['nShieldedSpend'] + tx['nShieldedOutput'] > 0 else 0) for tx in vtx]) + + # One Ed25519 signature per transaction that contains JoinSplits + ed25519_sigs = sum([1 if tx['nJoinSplit'] > 0 else 0 for tx in vtx]) + + print('- Block size: ', block_size(vtx), 'bytes') + print('- Transactions: ', len(vtx)) + print('- Proofs: ', proofs) + print('- ECDSA signatures: ', ecdsa_sigs) + print('- RedJubjub signatures:', redjubjub_sigs) + print('- Ed25519 signatures: ', ed25519_sigs) + print('- Verification time: %0.2f seconds' % (float( + (times['proof'] * proofs) + + (times['ecdsa'] * ecdsa_sigs) + + (times['redjubjub'] * redjubjub_sigs) + + (times['ed25519'] * ed25519_sigs) + ) / 10**9)) + +# +# Worst-case scenarios +# + +def worst_case_one_sapling_spend_per_tx(times): + vtx = worst_case_many_identical_txs({ + 'vin': [], + 'vout': [], + 'nShieldedSpend': 1, + 'nShieldedOutput': 0, + 'nJoinSplit': 0, + }) + print('One Sapling spend per transaction:') + print_makeup(vtx, times) + print() + +def worst_case_one_tx_containing_sapling_spends(times): + vtx = worst_case_one_tx_containing('nShieldedSpend') + print('One transaction containing Sapling spends:') + print_makeup(vtx, times) + print() + +def worst_case_one_sapling_output_per_tx(times): + vtx = worst_case_many_identical_txs({ + 'vin': [], + 'vout': [], + 'nShieldedSpend': 0, + 'nShieldedOutput': 1, + 'nJoinSplit': 0, + }) + print('One Sapling output per transaction:') + print_makeup(vtx, times) + print() + +def worst_case_one_tx_containing_sapling_outputs(times): + vtx = worst_case_one_tx_containing('nShieldedOutput') + print('One transaction containing Sapling outputs:') + print_makeup(vtx, times) + print() + +def worst_case_one_joinsplit_per_tx(times): + vtx = worst_case_many_identical_txs({ + 'vin': [], + 'vout': [], + 'nShieldedSpend': 0, + 'nShieldedOutput': 0, + 'nJoinSplit': 1, + }) + print('One JoinSplit per transaction:') + print_makeup(vtx, times) + print() + +def worst_case_one_tx_containing_joinsplits(times): + vtx = worst_case_one_tx_containing('nJoinSplit') + print('One transaction containing JoinSplits:') + print_makeup(vtx, times) + print() + + +def run(): + print('Collecting benchmarks...') + times = collect_times() + # times = hard_coded_times() + print('Times (ns):', times) + print() + + print('Running worst-case simulations...') + worst_case_one_sapling_spend_per_tx(times) + worst_case_one_tx_containing_sapling_spends(times) + worst_case_one_sapling_output_per_tx(times) + worst_case_one_tx_containing_sapling_outputs(times) + worst_case_one_joinsplit_per_tx(times) + worst_case_one_tx_containing_joinsplits(times) + +if __name__ == '__main__': + run() diff --git a/contrib/testgen/README.md b/contrib/testgen/README.md new file mode 100644 index 000000000..83624f443 --- /dev/null +++ b/contrib/testgen/README.md @@ -0,0 +1,8 @@ +### TestGen ### + +Utilities to generate test vectors for the data-driven Bitcoin tests. + +Usage: + + gen_base58_test_vectors.py valid 50 > ../../src/test/data/base58_keys_valid.json + gen_base58_test_vectors.py invalid 50 > ../../src/test/data/base58_keys_invalid.json \ No newline at end of file diff --git a/contrib/testgen/base58.py b/contrib/testgen/base58.py new file mode 100644 index 000000000..b71649514 --- /dev/null +++ b/contrib/testgen/base58.py @@ -0,0 +1,104 @@ +''' +Bitcoin base58 encoding and decoding. + +Based on https://bitcointalk.org/index.php?topic=1026.0 (public domain) +''' +import hashlib + +# for compatibility with following code... +class SHA256: + new = hashlib.sha256 + +if str != bytes: + # Python 3.x + def ord(c): + return c + def chr(n): + return bytes( (n,) ) + +__b58chars = '123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz' +__b58base = len(__b58chars) +b58chars = __b58chars + +def b58encode(v): + """ encode v, which is a string of bytes, to base58. + """ + long_value = 0 + for (i, c) in enumerate(v[::-1]): + long_value += (256**i) * ord(c) + + result = '' + while long_value >= __b58base: + div, mod = divmod(long_value, __b58base) + result = __b58chars[mod] + result + long_value = div + result = __b58chars[long_value] + result + + # Bitcoin does a little leading-zero-compression: + # leading 0-bytes in the input become leading-1s + nPad = 0 + for c in v: + if c == '\0': nPad += 1 + else: break + + return (__b58chars[0]*nPad) + result + +def b58decode(v, length = None): + """ decode v into a string of len bytes + """ + long_value = 0 + for (i, c) in enumerate(v[::-1]): + long_value += __b58chars.find(c) * (__b58base**i) + + result = bytes() + while long_value >= 256: + div, mod = divmod(long_value, 256) + result = chr(mod) + result + long_value = div + result = chr(long_value) + result + + nPad = 0 + for c in v: + if c == __b58chars[0]: nPad += 1 + else: break + + result = chr(0)*nPad + result + if length is not None and len(result) != length: + return None + + return result + +def checksum(v): + """Return 32-bit checksum based on SHA256""" + return SHA256.new(SHA256.new(v).digest()).digest()[0:4] + +def b58encode_chk(v): + """b58encode a string, with 32-bit checksum""" + return b58encode(v + checksum(v)) + +def b58decode_chk(v): + """decode a base58 string, check and remove checksum""" + result = b58decode(v) + if result is None: + return None + h3 = checksum(result[:-4]) + if result[-4:] == checksum(result[:-4]): + return result[:-4] + else: + return None + +def get_bcaddress_version(strAddress): + """ Returns None if strAddress is invalid. Otherwise returns integer version of address. """ + addr = b58decode_chk(strAddress) + if addr is None or len(addr)!=21: return None + version = addr[0] + return ord(version) + +if __name__ == '__main__': + # Test case (from http://gitorious.org/bitcoin/python-base58.git) + assert get_bcaddress_version('15VjRaDX9zpbA8LVnbrCAFzrVzN7ixHNsC') is 0 + _ohai = 'o hai'.encode('ascii') + _tmp = b58encode(_ohai) + assert _tmp == 'DYB3oMS' + assert b58decode(_tmp, 5) == _ohai + print("Tests passed") diff --git a/contrib/testgen/gen_base58_test_vectors.py b/contrib/testgen/gen_base58_test_vectors.py new file mode 100755 index 000000000..17b85667a --- /dev/null +++ b/contrib/testgen/gen_base58_test_vectors.py @@ -0,0 +1,126 @@ +#!/usr/bin/env python +''' +Generate valid and invalid base58 address and private key test vectors. + +Usage: + gen_base58_test_vectors.py valid 50 > ../../src/test/data/base58_keys_valid.json + gen_base58_test_vectors.py invalid 50 > ../../src/test/data/base58_keys_invalid.json +''' +# 2012 Wladimir J. van der Laan +# Released under MIT License +import os +from itertools import islice +from base58 import b58encode, b58decode, b58encode_chk, b58decode_chk, b58chars +import random +from binascii import b2a_hex + +# key types +PUBKEY_ADDRESS = (0x1C, 0xB8) +SCRIPT_ADDRESS = (0x1C, 0xBD) +PUBKEY_ADDRESS_TEST = (0x1D, 0x25) +SCRIPT_ADDRESS_TEST = (0x1C, 0xBA) +PRIVKEY = 128 +PRIVKEY_TEST = 239 + +metadata_keys = ['isPrivkey', 'isTestnet', 'addrType', 'isCompressed'] +# templates for valid sequences +templates = [ + # prefix, payload_size, suffix, metadata + # None = N/A + (PUBKEY_ADDRESS, 20, (), (False, False, 'pubkey', None)), + (SCRIPT_ADDRESS, 20, (), (False, False, 'script', None)), + (PUBKEY_ADDRESS_TEST, 20, (), (False, True, 'pubkey', None)), + (SCRIPT_ADDRESS_TEST, 20, (), (False, True, 'script', None)), + ((PRIVKEY,), 32, (), (True, False, None, False)), + ((PRIVKEY,), 32, (1,), (True, False, None, True)), + ((PRIVKEY_TEST,), 32, (), (True, True, None, False)), + ((PRIVKEY_TEST,), 32, (1,), (True, True, None, True)) +] + +def is_valid(v): + '''Check vector v for validity''' + result = b58decode_chk(v) + if result is None: + return False + valid = False + for template in templates: + prefix = str(bytearray(template[0])) + suffix = str(bytearray(template[2])) + if result.startswith(prefix) and result.endswith(suffix): + if (len(result) - len(prefix) - len(suffix)) == template[1]: + return True + return False + +def gen_valid_vectors(): + '''Generate valid test vectors''' + while True: + for template in templates: + prefix = str(bytearray(template[0])) + payload = os.urandom(template[1]) + suffix = str(bytearray(template[2])) + rv = b58encode_chk(prefix + payload + suffix) + assert is_valid(rv) + metadata = dict([(x,y) for (x,y) in zip(metadata_keys,template[3]) if y is not None]) + yield (rv, b2a_hex(payload), metadata) + +def gen_invalid_vector(template, corrupt_prefix, randomize_payload_size, corrupt_suffix): + '''Generate possibly invalid vector''' + if corrupt_prefix: + prefix = os.urandom(1) + else: + prefix = str(bytearray(template[0])) + + if randomize_payload_size: + payload = os.urandom(max(int(random.expovariate(0.5)), 50)) + else: + payload = os.urandom(template[1]) + + if corrupt_suffix: + suffix = os.urandom(len(template[2])) + else: + suffix = str(bytearray(template[2])) + + return b58encode_chk(prefix + payload + suffix) + +def randbool(p = 0.5): + '''Return True with P(p)''' + return random.random() < p + +def gen_invalid_vectors(): + '''Generate invalid test vectors''' + # start with some manual edge-cases + yield "", + yield "x", + while True: + # kinds of invalid vectors: + # invalid prefix + # invalid payload length + # invalid (randomized) suffix (add random data) + # corrupt checksum + for template in templates: + val = gen_invalid_vector(template, randbool(0.2), randbool(0.2), randbool(0.2)) + if random.randint(0,10)<1: # line corruption + if randbool(): # add random character to end + val += random.choice(b58chars) + else: # replace random character in the middle + n = random.randint(0, len(val)) + val = val[0:n] + random.choice(b58chars) + val[n+1:] + if not is_valid(val): + yield val, + +if __name__ == '__main__': + import sys, json + iters = {'valid':gen_valid_vectors, 'invalid':gen_invalid_vectors} + try: + uiter = iters[sys.argv[1]] + except IndexError: + uiter = gen_valid_vectors + try: + count = int(sys.argv[2]) + except IndexError: + count = 0 + + data = list(islice(uiter(), count)) + json.dump(data, sys.stdout, sort_keys=True, indent=4) + sys.stdout.write('\n') + diff --git a/contrib/zcash-cli.bash-completion b/contrib/zcash-cli.bash-completion new file mode 100644 index 000000000..001b1abfb --- /dev/null +++ b/contrib/zcash-cli.bash-completion @@ -0,0 +1,161 @@ +# bash programmable completion for zcash-cli(1) +# Copyright (c) 2012-2016 The Bitcoin Core developers +# Copyright (c) 2016-2019 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +# call $zcash-cli for RPC +_zcash_rpc() { + # determine already specified args necessary for RPC + local rpcargs=() + for i in ${COMP_LINE}; do + case "$i" in + -conf=*|-datadir=*|-regtest|-rpc*|-testnet) + rpcargs=( "${rpcargs[@]}" "$i" ) + ;; + esac + done + $zcash_cli "${rpcargs[@]}" "$@" +} + +# Add wallet accounts to COMPREPLY +_zcash_accounts() { + local accounts + # Accounts are deprecated in Zcash + #accounts=$(_zcash_rpc listaccounts | awk -F '"' '{ print $2 }') + accounts="\\\"\\\"" + COMPREPLY=( "${COMPREPLY[@]}" $( compgen -W "$accounts" -- "$cur" ) ) +} + +_zcash_cli() { + local cur prev words=() cword + local zcash_cli + + # save and use original argument to invoke zcash-cli for -help, help and RPC + # as zcash-cli might not be in $PATH + zcash_cli="$1" + + COMPREPLY=() + _get_comp_words_by_ref -n = cur prev words cword + + if ((cword > 5)); then + case ${words[cword-5]} in + sendtoaddress) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + esac + fi + + if ((cword > 4)); then + case ${words[cword-4]} in + importaddress|listtransactions|setban) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + signrawtransaction) + COMPREPLY=( $( compgen -W "ALL NONE SINGLE ALL|ANYONECANPAY NONE|ANYONECANPAY SINGLE|ANYONECANPAY" -- "$cur" ) ) + return 0 + ;; + esac + fi + + if ((cword > 3)); then + case ${words[cword-3]} in + addmultisigaddress) + _zcash_accounts + return 0 + ;; + getbalance|gettxout|importaddress|importpubkey|importprivkey|listreceivedbyaccount|listreceivedbyaddress|listsinceblock) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + esac + fi + + if ((cword > 2)); then + case ${words[cword-2]} in + addnode) + COMPREPLY=( $( compgen -W "add remove onetry" -- "$cur" ) ) + return 0 + ;; + setban) + COMPREPLY=( $( compgen -W "add remove" -- "$cur" ) ) + return 0 + ;; + fundrawtransaction|getblock|getblockheader|getmempoolancestors|getmempooldescendants|getrawtransaction|gettransaction|listaccounts|listreceivedbyaccount|listreceivedbyaddress|sendrawtransaction) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + z_importkey|z_importviewingkey) + COMPREPLY=( $( compgen -W "yes no whenkeyisnew" -- "$cur" ) ) + return 0 + ;; + move|setaccount) + _zcash_accounts + return 0 + ;; + esac + fi + + case "$prev" in + backupwallet|importwallet|z_exportwallet|z_importwallet) + _filedir + return 0 + ;; + getaddednodeinfo|getrawmempool|lockunspent|setgenerate) + COMPREPLY=( $( compgen -W "true false" -- "$cur" ) ) + return 0 + ;; + getaccountaddress|getaddressesbyaccount|getbalance|getnewaddress|getreceivedbyaccount|listtransactions|move|sendfrom|sendmany) + _zcash_accounts + return 0 + ;; + esac + + case "$cur" in + -conf=*) + cur="${cur#*=}" + _filedir + return 0 + ;; + -datadir=*) + cur="${cur#*=}" + _filedir -d + return 0 + ;; + -*=*) # prevent nonsense completions + return 0 + ;; + *) + local helpopts commands + + # only parse -help if senseful + if [[ -z "$cur" || "$cur" =~ ^- ]]; then + helpopts=$($zcash_cli -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + fi + + # only parse help if senseful + if [[ -z "$cur" || "$cur" =~ ^[a-z] ]]; then + commands=$(_zcash_rpc help 2>/dev/null | awk '$1 ~ /^[a-z]/ { print $1; }') + fi + + COMPREPLY=( $( compgen -W "$helpopts $commands" -- "$cur" ) ) + + # Prevent space if an argument is desired + if [[ $COMPREPLY == *= ]]; then + compopt -o nospace + fi + return 0 + ;; + esac +} && +complete -F _zcash_cli zcash-cli + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/zcash-tx.bash-completion b/contrib/zcash-tx.bash-completion new file mode 100644 index 000000000..b6a0cf434 --- /dev/null +++ b/contrib/zcash-tx.bash-completion @@ -0,0 +1,58 @@ +# bash programmable completion for zcash-tx(1) +# Copyright (c) 2016 The Bitcoin Core developers +# Copyright (c) 2016-2019 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +_zcash_tx() { + local cur prev words=() cword + local zcash_tx + + # save and use original argument to invoke zcash-tx for -help + # it might not be in $PATH + zcash_tx="$1" + + COMPREPLY=() + _get_comp_words_by_ref -n =: cur prev words cword + + case "$cur" in + load=*:*) + cur="${cur#load=*:}" + _filedir + return 0 + ;; + *=*) # prevent attempts to complete other arguments + return 0 + ;; + esac + + if [[ "$cword" == 1 || ( "$prev" != "-create" && "$prev" == -* ) ]]; then + # only options (or an uncompletable hex-string) allowed + # parse zcash-tx -help for options + local helpopts + helpopts=$($zcash_tx -help | sed -e '/^ -/ p' -e d ) + COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) + else + # only commands are allowed + # parse -help for commands + local helpcmds + helpcmds=$($zcash_tx -help | sed -e '1,/Commands:/d' -e 's/=.*/=/' -e '/^ [a-z]/ p' -e d ) + COMPREPLY=( $( compgen -W "$helpcmds" -- "$cur" ) ) + fi + + # Prevent space if an argument is desired + if [[ $COMPREPLY == *= ]]; then + compopt -o nospace + fi + + return 0 +} && +complete -F _zcash_tx zcash-tx + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/zcashd.bash-completion b/contrib/zcashd.bash-completion new file mode 100644 index 000000000..d5135350a --- /dev/null +++ b/contrib/zcashd.bash-completion @@ -0,0 +1,57 @@ +# bash programmable completion for zcashd(1) +# Copyright (c) 2012-2017 The Bitcoin Core developers +# Copyright (c) 2016-2019 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +_zcashd() { + local cur prev words=() cword + local zcashd + + # save and use original argument to invoke zcashd for -help + # it might not be in $PATH + zcashd="$1" + + COMPREPLY=() + _get_comp_words_by_ref -n = cur prev words cword + + case "$cur" in + -conf=*|-pid=*|-loadblock=*|-rpccookiefile=*|-wallet=*) + cur="${cur#*=}" + _filedir + return 0 + ;; + -datadir=*|-exportdir=*) + cur="${cur#*=}" + _filedir -d + return 0 + ;; + -*=*) # prevent nonsense completions + return 0 + ;; + *) + + # only parse -help if senseful + if [[ -z "$cur" || "$cur" =~ ^- ]]; then + local helpopts + helpopts=$($zcashd -help 2>&1 | awk '$1 ~ /^-/ { sub(/=.*/, "="); print $1 }' ) + COMPREPLY=( $( compgen -W "$helpopts" -- "$cur" ) ) + fi + + # Prevent space if an argument is desired + if [[ $COMPREPLY == *= ]]; then + compopt -o nospace + fi + return 0 + ;; + esac +} && +complete -F _zcashd zcashd + +# Local variables: +# mode: shell-script +# sh-basic-offset: 4 +# sh-indent-comment: t +# indent-tabs-mode: nil +# End: +# ex: ts=4 sw=4 et filetype=sh diff --git a/contrib/zmq/zmq_sub.py b/contrib/zmq/zmq_sub.py new file mode 100755 index 000000000..6df3e0838 --- /dev/null +++ b/contrib/zmq/zmq_sub.py @@ -0,0 +1,48 @@ +#!/usr/bin/env python2 +# Copyright (c) 2014-2016 The Bitcoin Core developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +import array +import binascii +import zmq +import struct + +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.setsockopt(zmq.SUBSCRIBE, "checkedblock") +zmqSubSocket.connect("tcp://127.0.0.1:%i" % port) + +try: + while True: + msg = zmqSubSocket.recv_multipart() + topic = str(msg[0]) + body = msg[1] + sequence = "Unknown"; + if len(msg[-1]) == 4: + msgSequence = struct.unpack(' $@ + $(AT)touch $@ + + +define check_or_remove_cached + mkdir -p $(BASE_CACHE)/$(host)/$(package) && cd $(BASE_CACHE)/$(host)/$(package); \ + $(build_SHA256SUM) -c $($(package)_cached_checksum) >/dev/null 2>/dev/null || \ + ( rm -f $($(package)_cached_checksum); \ + if test -f "$($(package)_cached)"; then echo "Checksum mismatch for $(package). Forcing rebuild.."; rm -f $($(package)_cached_checksum) $($(package)_cached); fi ) +endef + +define check_or_remove_sources + mkdir -p $($(package)_source_dir); cd $($(package)_source_dir); \ + $(build_SHA256SUM) -c $($(package)_fetched) >/dev/null 2>/dev/null || \ + ( test -z "$($(package)_all_sources)" || ( echo $($(package)_all_sources) | xargs -n 1 test ! -f ) || echo "Checksum missing or mismatched for $(package) source. Forcing re-download."; \ + rm -f $($(package)_all_sources) $($(1)_fetched)) +endef + +check-packages: + @$(foreach package,$(packages),$(call check_or_remove_cached,$(package));) + @$(foreach package,$(rust_crates),$(call check_or_remove_cached,$(package));) + @$(foreach package,$(native_packages),$(call check_or_remove_cached,$(package));) +check-sources: + @$(foreach package,$(packages),$(call check_or_remove_sources,$(package));) + @$(foreach package,$(rust_crates),$(call check_or_remove_sources,$(package));) + @$(foreach package,$(native_packages),$(call check_or_remove_sources,$(package));) + +$(host_prefix)/share/config.site: check-packages + +check-packages: check-sources + +install: check-packages $(host_prefix)/share/config.site + + +crates_download_dir=$(base_download_dir)/crates +download-crates: native_rust + $(AT)echo Vendoring crates... + $(AT)mkdir -p $(SOURCES_PATH) + $(AT)rm -rf $(crates_download_dir) + $(AT)mkdir -p $(crates_download_dir) + $(AT)tar xf $(native_rust_cached) -C $(crates_download_dir) + $(AT)$(crates_download_dir)/native/bin/cargo vendor --locked --manifest-path $(BASEDIR)/../Cargo.toml $(crates_download_dir)/$(CRATE_REGISTRY) + $(AT)cd $(crates_download_dir); find $(CRATE_REGISTRY) | sort | tar --no-recursion -czf $(CRATE_ARCHIVE) -T - + $(AT)rm -rf $(crates_download_dir) + +download-one: check-sources $(all_sources) + +download-osx: + @$(MAKE) -s HOST=x86_64-apple-darwin14 download-one +download-linux: + @$(MAKE) -s HOST=x86_64-pc-linux-gnu download-one +download-win: + @$(MAKE) -s HOST=x86_64-w64-mingw32 download-one +download: download-crates download-osx download-linux download-win + +.PHONY: install cached download-crates download-one download-osx download-linux download-win download check-packages check-sources diff --git a/depends/README.md b/depends/README.md new file mode 100644 index 000000000..cf88a425f --- /dev/null +++ b/depends/README.md @@ -0,0 +1,57 @@ +### Usage + +To build dependencies for the current arch+OS: + + make + +To build for another arch/OS: + + make HOST=host-platform-triplet + +For example: + + make HOST=x86_64-w64-mingw32 -j4 + +A prefix will be generated that's suitable for plugging into Bitcoin's +configure. In the above example, a dir named x86_64-w64-mingw32 will be +created. To use it for Bitcoin: + + ./configure --prefix=`pwd`/depends/x86_64-w64-mingw32 + +Common `host-platform-triplets` for cross compilation are: + +- `i686-w64-mingw32` for Win32 +- `x86_64-w64-mingw32` for Win64 +- `x86_64-apple-darwin18` for macOS +- `arm-linux-gnueabihf` for Linux ARM 32 bit +- `aarch64-linux-gnu` for Linux ARM 64 bit +- `riscv32-linux-gnu` for Linux RISC-V 32 bit +- `riscv64-linux-gnu` for Linux RISC-V 64 bit + +No other options are needed, the paths are automatically configured. + +Dependency Options: +The following can be set when running make: make FOO=bar + + SOURCES_PATH: downloaded sources will be placed here + BASE_CACHE: built packages will be placed here + SDK_PATH: Path where sdk's can be found (used by OSX) + FALLBACK_DOWNLOAD_PATH: If a source file can't be fetched, try here before giving up + NO_WALLET: Don't download/build/cache libs needed to enable the wallet + DEBUG: disable some optimizations and enable more runtime checking + +If some packages are not built, for example `make NO_WALLET=1`, the appropriate +options will be passed to bitcoin's configure. In this case, `--disable-wallet`. + +Additional targets: + + download: run 'make download' to fetch all sources without building them + download-osx: run 'make download-osx' to fetch all sources needed for osx builds + download-win: run 'make download-win' to fetch all sources needed for win builds + download-linux: run 'make download-linux' to fetch all sources needed for linux builds + +### Other documentation + +- [description.md](description.md): General description of the depends system +- [packages.md](packages.md): Steps for adding packages + diff --git a/depends/builders/darwin.mk b/depends/builders/darwin.mk new file mode 100644 index 000000000..bcb02b782 --- /dev/null +++ b/depends/builders/darwin.mk @@ -0,0 +1,23 @@ +build_darwin_CC: = $(shell xcrun -f clang) +build_darwin_CXX: = $(shell xcrun -f clang++) +build_darwin_AR: = $(shell xcrun -f ar) +build_darwin_RANLIB: = $(shell xcrun -f ranlib) +build_darwin_STRIP: = $(shell xcrun -f strip) +build_darwin_OTOOL: = $(shell xcrun -f otool) +build_darwin_NM: = $(shell xcrun -f nm) +build_darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) +build_darwin_SHA256SUM = shasum -a 256 +build_darwin_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o + +#darwin host on darwin builder. overrides darwin host preferences. +darwin_CC=$(shell xcrun -f clang) -mmacosx-version-min=$(OSX_MIN_VERSION) -fvisibility=hidden -fvisibility-inlines-hidden --sysroot $(shell xcrun --show-sdk-path) +darwin_CXX:=$(shell xcrun -f clang++) -mmacosx-version-min=$(OSX_MIN_VERSION) -fvisibility=hidden -fvisibility-inlines-hidden -stdlib=libc++ --sysroot $(shell xcrun --show-sdk-path) +darwin_AR:=$(shell xcrun -f ar) +darwin_RANLIB:=$(shell xcrun -f ranlib) +darwin_STRIP:=$(shell xcrun -f strip) +darwin_LIBTOOL:=$(shell xcrun -f libtool) +darwin_OTOOL:=$(shell xcrun -f otool) +darwin_NM:=$(shell xcrun -f nm) +darwin_INSTALL_NAME_TOOL:=$(shell xcrun -f install_name_tool) +darwin_native_binutils= +darwin_native_toolchain= diff --git a/depends/builders/default.mk b/depends/builders/default.mk new file mode 100644 index 000000000..f097db65d --- /dev/null +++ b/depends/builders/default.mk @@ -0,0 +1,20 @@ +default_build_CC = gcc +default_build_CXX = g++ +default_build_AR = ar +default_build_RANLIB = ranlib +default_build_STRIP = strip +default_build_NM = nm +default_build_OTOOL = otool +default_build_INSTALL_NAME_TOOL = install_name_tool + +define add_build_tool_func +build_$(build_os)_$1 ?= $$(default_build_$1) +build_$(build_arch)_$(build_os)_$1 ?= $$(build_$(build_os)_$1) +build_$1=$$(build_$(build_arch)_$(build_os)_$1) +endef +$(foreach var,CC CXX AR RANLIB NM STRIP SHA256SUM DOWNLOAD OTOOL INSTALL_NAME_TOOL,$(eval $(call add_build_tool_func,$(var)))) +define add_build_flags_func +build_$(build_arch)_$(build_os)_$1 += $(build_$(build_os)_$1) +build_$1=$$(build_$(build_arch)_$(build_os)_$1) +endef +$(foreach flags, CFLAGS CXXFLAGS LDFLAGS, $(eval $(call add_build_flags_func,$(flags)))) diff --git a/depends/builders/freebsd.mk b/depends/builders/freebsd.mk new file mode 100644 index 000000000..7a61043e9 --- /dev/null +++ b/depends/builders/freebsd.mk @@ -0,0 +1,4 @@ +build_freebsd_CC = clang +build_freebsd_CXX = clang++ +build_freebsd_SHA256SUM = shasum -a 256 +build_freebsd_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/builders/linux.mk b/depends/builders/linux.mk new file mode 100644 index 000000000..b03f42401 --- /dev/null +++ b/depends/builders/linux.mk @@ -0,0 +1,2 @@ +build_linux_SHA256SUM = sha256sum +build_linux_DOWNLOAD = curl --location --fail --connect-timeout $(DOWNLOAD_CONNECT_TIMEOUT) --retry $(DOWNLOAD_RETRIES) -o diff --git a/depends/config.guess b/depends/config.guess new file mode 100755 index 000000000..8d70ec2b2 --- /dev/null +++ b/depends/config.guess @@ -0,0 +1,1685 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-09-19' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). +# +# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. +# +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess +# +# Please send patches to . + + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +tmp= +# shellcheck disable=SC2172 +trap 'test -z "$tmp" || rm -fr "$tmp"' 0 1 2 13 15 + +set_cc_for_build() { + # prevent multiple calls if $tmp is already set + test "$tmp" && return 0 + : "${TMPDIR=/tmp}" + # shellcheck disable=SC2039 + { tmp=`(umask 077 && mktemp -d "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir "$tmp" 2>/dev/null) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir "$tmp" 2>/dev/null) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } + dummy=$tmp/dummy + case ${CC_FOR_BUILD-},${HOST_CC-},${CC-} in + ,,) echo "int x;" > "$dummy.c" + for driver in cc gcc c89 c99 ; do + if ($driver -c -o "$dummy.o" "$dummy.c") >/dev/null 2>&1 ; then + CC_FOR_BUILD="$driver" + break + fi + done + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; + esac +} + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if test -f /.attbin/uname ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +case "$UNAME_SYSTEM" in +Linux|GNU|GNU/*) + # If the system lacks a compiler, then just pick glibc. + # We could probably try harder. + LIBC=gnu + + set_cc_for_build + cat <<-EOF > "$dummy.c" + #include + #if defined(__UCLIBC__) + LIBC=uclibc + #elif defined(__dietlibc__) + LIBC=dietlibc + #else + #include + #ifdef __DEFINED_va_list + LIBC=musl + #else + LIBC=gnu + #endif + #endif + EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^LIBC' | sed 's, ,,g'`" + ;; +esac + +# Note: order is significant - the case branches are not exclusive. + +case "$UNAME_MACHINE:$UNAME_SYSTEM:$UNAME_RELEASE:$UNAME_VERSION" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(uname -p 2>/dev/null || \ + "/sbin/$sysctl" 2>/dev/null || \ + "/usr/sbin/$sysctl" 2>/dev/null || \ + echo unknown)` + case "$UNAME_MACHINE_ARCH" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + sh5el) machine=sh5le-unknown ;; + earmv*) + arch=`echo "$UNAME_MACHINE_ARCH" | sed -e 's,^e\(armv[0-9]\).*$,\1,'` + endian=`echo "$UNAME_MACHINE_ARCH" | sed -ne 's,^.*\(eb\)$,\1,p'` + machine="${arch}${endian}"-unknown + ;; + *) machine="$UNAME_MACHINE_ARCH"-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently (or will in the future) and ABI. + case "$UNAME_MACHINE_ARCH" in + earm*) + os=netbsdelf + ;; + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ELF__ + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # Determine ABI tags. + case "$UNAME_MACHINE_ARCH" in + earm*) + expr='s/^earmv[0-9]/-eabi/;s/eb$//' + abi=`echo "$UNAME_MACHINE_ARCH" | sed -e "$expr"` + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "$UNAME_VERSION" in + Debian*) + release='-gnu' + ;; + *) + release=`echo "$UNAME_RELEASE" | sed -e 's/[-_].*//' | cut -d. -f1,2` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "$machine-${os}${release}${abi-}" + exit ;; + *:Bitrig:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-bitrig"$UNAME_RELEASE" + exit ;; + *:OpenBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-openbsd"$UNAME_RELEASE" + exit ;; + *:LibertyBSD:*:*) + UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` + echo "$UNAME_MACHINE_ARCH"-unknown-libertybsd"$UNAME_RELEASE" + exit ;; + *:MidnightBSD:*:*) + echo "$UNAME_MACHINE"-unknown-midnightbsd"$UNAME_RELEASE" + exit ;; + *:ekkoBSD:*:*) + echo "$UNAME_MACHINE"-unknown-ekkobsd"$UNAME_RELEASE" + exit ;; + *:SolidBSD:*:*) + echo "$UNAME_MACHINE"-unknown-solidbsd"$UNAME_RELEASE" + exit ;; + *:OS108:*:*) + echo "$UNAME_MACHINE"-unknown-os108_"$UNAME_RELEASE" + exit ;; + macppc:MirBSD:*:*) + echo powerpc-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:MirBSD:*:*) + echo "$UNAME_MACHINE"-unknown-mirbsd"$UNAME_RELEASE" + exit ;; + *:Sortix:*:*) + echo "$UNAME_MACHINE"-unknown-sortix + exit ;; + *:Twizzler:*:*) + echo "$UNAME_MACHINE"-unknown-twizzler + exit ;; + *:Redox:*:*) + echo "$UNAME_MACHINE"-unknown-redox + exit ;; + mips:OSF1:*.*) + echo mips-dec-osf1 + exit ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE=alpha ;; + "EV4.5 (21064)") + UNAME_MACHINE=alpha ;; + "LCA4 (21066/21068)") + UNAME_MACHINE=alpha ;; + "EV5 (21164)") + UNAME_MACHINE=alphaev5 ;; + "EV5.6 (21164A)") + UNAME_MACHINE=alphaev56 ;; + "EV5.6 (21164PC)") + UNAME_MACHINE=alphapca56 ;; + "EV5.7 (21164PC)") + UNAME_MACHINE=alphapca57 ;; + "EV6 (21264)") + UNAME_MACHINE=alphaev6 ;; + "EV6.7 (21264A)") + UNAME_MACHINE=alphaev67 ;; + "EV6.8CB (21264C)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8AL (21264B)") + UNAME_MACHINE=alphaev68 ;; + "EV6.8CX (21264D)") + UNAME_MACHINE=alphaev68 ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE=alphaev69 ;; + "EV7 (21364)") + UNAME_MACHINE=alphaev7 ;; + "EV7.9 (21364A)") + UNAME_MACHINE=alphaev79 ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo "$UNAME_MACHINE"-dec-osf"`echo "$UNAME_RELEASE" | sed -e 's/^[PVTX]//' | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz`" + # Reset EXIT trap before exiting to avoid spurious non-zero exit code. + exitcode=$? + trap '' 0 + exit $exitcode ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit ;; + *:[Aa]miga[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-amigaos + exit ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo "$UNAME_MACHINE"-unknown-morphos + exit ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit ;; + *:z/VM:*:*) + echo s390-ibm-zvmoe + exit ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix"$UNAME_RELEASE" + exit ;; + arm*:riscos:*:*|arm*:RISCOS:*:*) + echo arm-unknown-riscos + exit ;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit ;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit ;; + DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7; exit ;; + esac ;; + s390x:SunOS:*:*) + echo "$UNAME_MACHINE"-ibm-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2"`echo "$UNAME_RELEASE" | sed -e 's/[^.]*//'`" + exit ;; + i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*) + echo i386-pc-auroraux"$UNAME_RELEASE" + exit ;; + i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*) + set_cc_for_build + SUN_ARCH=i386 + # If there is a compiler, see if it is configured for 64-bit objects. + # Note that the Sun cc does not turn __LP64__ into 1 like gcc does. + # This test works for both compilers. + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + SUN_ARCH=x86_64 + fi + fi + echo "$SUN_ARCH"-pc-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos"`echo "$UNAME_RELEASE"|sed -e 's/-/_/'`" + exit ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos"$UNAME_RELEASE" + exit ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x$UNAME_RELEASE" = x && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos"$UNAME_RELEASE" + ;; + sun4) + echo sparc-sun-sunos"$UNAME_RELEASE" + ;; + esac + exit ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos"$UNAME_RELEASE" + exit ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint"$UNAME_RELEASE" + exit ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint"$UNAME_RELEASE" + exit ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint"$UNAME_RELEASE" + exit ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint"$UNAME_RELEASE" + exit ;; + m68k:machten:*:*) + echo m68k-apple-machten"$UNAME_RELEASE" + exit ;; + powerpc:machten:*:*) + echo powerpc-apple-machten"$UNAME_RELEASE" + exit ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix"$UNAME_RELEASE" + exit ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix"$UNAME_RELEASE" + exit ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix"$UNAME_RELEASE" + exit ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && + dummyarg=`echo "$UNAME_RELEASE" | sed -n 's/\([0-9]*\).*/\1/p'` && + SYSTEM_NAME=`"$dummy" "$dummyarg"` && + { echo "$SYSTEM_NAME"; exit; } + echo mips-mips-riscos"$UNAME_RELEASE" + exit ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if test "$UNAME_PROCESSOR" = mc88100 || test "$UNAME_PROCESSOR" = mc88110 + then + if test "$TARGET_BINARY_INTERFACE"x = m88kdguxelfx || \ + test "$TARGET_BINARY_INTERFACE"x = x + then + echo m88k-dg-dgux"$UNAME_RELEASE" + else + echo m88k-dg-dguxbcs"$UNAME_RELEASE" + fi + else + echo i586-dg-dgux"$UNAME_RELEASE" + fi + exit ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit ;; + *:IRIX*:*:*) + echo mips-sgi-irix"`echo "$UNAME_RELEASE"|sed -e 's/-/_/g'`" + exit ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit ;; + ia64:AIX:*:*) + if test -x /usr/bin/oslevel ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$UNAME_MACHINE"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + if $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` + then + echo "$SYSTEM_NAME" + else + echo rs6000-ibm-aix3.2.5 + fi + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit ;; + *:AIX:*:[4567]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El "$IBM_CPU_ID" | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if test -x /usr/bin/lslpp ; then + IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | + awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` + else + IBM_REV="$UNAME_VERSION.$UNAME_RELEASE" + fi + echo "$IBM_ARCH"-ibm-aix"$IBM_REV" + exit ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit ;; + ibmrt:4.4BSD:*|romp-ibm:4.4BSD:*) + echo romp-ibm-bsd4.4 + exit ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd"$UNAME_RELEASE" # 4.3 with uname added to + exit ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + case "$UNAME_MACHINE" in + 9000/31?) HP_ARCH=m68000 ;; + 9000/[34]??) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if test -x /usr/bin/getconf; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "$sc_cpu_version" in + 523) HP_ARCH=hppa1.0 ;; # CPU_PA_RISC1_0 + 528) HP_ARCH=hppa1.1 ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "$sc_kernel_bits" in + 32) HP_ARCH=hppa2.0n ;; + 64) HP_ARCH=hppa2.0w ;; + '') HP_ARCH=hppa2.0 ;; # HP-UX 10.20 + esac ;; + esac + fi + if test "$HP_ARCH" = ""; then + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS="" $CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null) && HP_ARCH=`"$dummy"` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if test "$HP_ARCH" = hppa2.0w + then + set_cc_for_build + + # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating + # 32-bit code. hppa64-hp-hpux* has the same kernel and a compiler + # generating 64-bit code. GNU and HP use different nomenclature: + # + # $ CC_FOR_BUILD=cc ./config.guess + # => hppa2.0w-hp-hpux11.23 + # $ CC_FOR_BUILD="cc +DA2.0w" ./config.guess + # => hppa64-hp-hpux11.23 + + if echo __LP64__ | (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | + grep -q __LP64__ + then + HP_ARCH=hppa2.0w + else + HP_ARCH=hppa64 + fi + fi + echo "$HP_ARCH"-hp-hpux"$HPUX_REV" + exit ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo "$UNAME_RELEASE"|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux"$HPUX_REV" + exit ;; + 3050*:HI-UX:*:*) + set_cc_for_build + sed 's/^ //' << EOF > "$dummy.c" + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o "$dummy" "$dummy.c" && SYSTEM_NAME=`"$dummy"` && + { echo "$SYSTEM_NAME"; exit; } + echo unknown-hitachi-hiuxwe2 + exit ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:*) + echo hppa1.1-hp-bsd + exit ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:*) + echo hppa1.1-hp-osf + exit ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit ;; + i*86:OSF1:*:*) + if test -x /usr/sbin/sysversion ; then + echo "$UNAME_MACHINE"-unknown-osf1mk + else + echo "$UNAME_MACHINE"-unknown-osf1 + fi + exit ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*[A-Z]90:*:*:*) + echo "$UNAME_MACHINE"-cray-unicos"$UNAME_RELEASE" \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + *:UNICOS/mp:*:*) + echo craynv-cray-unicosmp"$UNAME_RELEASE" | sed -e 's/\.[^.]*$/.X/' + exit ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz` + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/\///'` + FUJITSU_REL=`echo "$UNAME_RELEASE" | tr ABCDEFGHIJKLMNOPQRSTUVWXYZ abcdefghijklmnopqrstuvwxyz | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo "$UNAME_MACHINE"-pc-bsdi"$UNAME_RELEASE" + exit ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi"$UNAME_RELEASE" + exit ;; + *:BSD/OS:*:*) + echo "$UNAME_MACHINE"-unknown-bsdi"$UNAME_RELEASE" + exit ;; + arm:FreeBSD:*:*) + UNAME_PROCESSOR=`uname -p` + set_cc_for_build + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabi + else + echo "${UNAME_PROCESSOR}"-unknown-freebsd"`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`"-gnueabihf + fi + exit ;; + *:FreeBSD:*:*) + UNAME_PROCESSOR=`/usr/bin/uname -p` + case "$UNAME_PROCESSOR" in + amd64) + UNAME_PROCESSOR=x86_64 ;; + i386) + UNAME_PROCESSOR=i586 ;; + esac + echo "$UNAME_PROCESSOR"-unknown-freebsd"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + i*:CYGWIN*:*) + echo "$UNAME_MACHINE"-pc-cygwin + exit ;; + *:MINGW64*:*) + echo "$UNAME_MACHINE"-pc-mingw64 + exit ;; + *:MINGW*:*) + echo "$UNAME_MACHINE"-pc-mingw32 + exit ;; + *:MSYS*:*) + echo "$UNAME_MACHINE"-pc-msys + exit ;; + i*:PW*:*) + echo "$UNAME_MACHINE"-pc-pw32 + exit ;; + *:Interix*:*) + case "$UNAME_MACHINE" in + x86) + echo i586-pc-interix"$UNAME_RELEASE" + exit ;; + authenticamd | genuineintel | EM64T) + echo x86_64-unknown-interix"$UNAME_RELEASE" + exit ;; + IA64) + echo ia64-unknown-interix"$UNAME_RELEASE" + exit ;; + esac ;; + i*:UWIN*:*) + echo "$UNAME_MACHINE"-pc-uwin + exit ;; + amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*) + echo x86_64-pc-cygwin + exit ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2"`echo "$UNAME_RELEASE"|sed -e 's/[^.]*//'`" + exit ;; + *:GNU:*:*) + # the GNU system + echo "`echo "$UNAME_MACHINE"|sed -e 's,[-/].*$,,'`-unknown-$LIBC`echo "$UNAME_RELEASE"|sed -e 's,/.*$,,'`" + exit ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo "$UNAME_MACHINE-unknown-`echo "$UNAME_SYSTEM" | sed 's,^[^/]*/,,' | tr "[:upper:]" "[:lower:]"``echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`-$LIBC" + exit ;; + *:Minix:*:*) + echo "$UNAME_MACHINE"-unknown-minix + exit ;; + aarch64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + aarch64_be:Linux:*:*) + UNAME_MACHINE=aarch64_be + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' /proc/cpuinfo 2>/dev/null` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep -q ld.so.1 + if test "$?" = 0 ; then LIBC=gnulibc1 ; fi + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arc:Linux:*:* | arceb:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + arm*:Linux:*:*) + set_cc_for_build + if echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_EABI__ + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + else + if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep -q __ARM_PCS_VFP + then + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabi + else + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC"eabihf + fi + fi + exit ;; + avr32*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + cris:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + crisv32:Linux:*:*) + echo "$UNAME_MACHINE"-axis-linux-"$LIBC" + exit ;; + e2k:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + frv:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + hexagon:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:Linux:*:*) + echo "$UNAME_MACHINE"-pc-linux-"$LIBC" + exit ;; + ia64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + k1om:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m32r*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + m68*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + mips:Linux:*:* | mips64:Linux:*:*) + set_cc_for_build + IS_GLIBC=0 + test x"${LIBC}" = xgnu && IS_GLIBC=1 + sed 's/^ //' << EOF > "$dummy.c" + #undef CPU + #undef mips + #undef mipsel + #undef mips64 + #undef mips64el + #if ${IS_GLIBC} && defined(_ABI64) + LIBCABI=gnuabi64 + #else + #if ${IS_GLIBC} && defined(_ABIN32) + LIBCABI=gnuabin32 + #else + LIBCABI=${LIBC} + #endif + #endif + + #if ${IS_GLIBC} && defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa64r6 + #else + #if ${IS_GLIBC} && !defined(__mips64) && defined(__mips_isa_rev) && __mips_isa_rev>=6 + CPU=mipsisa32r6 + #else + #if defined(__mips64) + CPU=mips64 + #else + CPU=mips + #endif + #endif + #endif + + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + MIPS_ENDIAN=el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + MIPS_ENDIAN= + #else + MIPS_ENDIAN= + #endif + #endif +EOF + eval "`$CC_FOR_BUILD -E "$dummy.c" 2>/dev/null | grep '^CPU\|^MIPS_ENDIAN\|^LIBCABI'`" + test "x$CPU" != x && { echo "$CPU${MIPS_ENDIAN}-unknown-linux-$LIBCABI"; exit; } + ;; + mips64el:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + openrisc*:Linux:*:*) + echo or1k-unknown-linux-"$LIBC" + exit ;; + or32:Linux:*:* | or1k*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + padre:Linux:*:*) + echo sparc-unknown-linux-"$LIBC" + exit ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-"$LIBC" + exit ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-"$LIBC" ;; + PA8*) echo hppa2.0-unknown-linux-"$LIBC" ;; + *) echo hppa-unknown-linux-"$LIBC" ;; + esac + exit ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-"$LIBC" + exit ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-"$LIBC" + exit ;; + ppc64le:Linux:*:*) + echo powerpc64le-unknown-linux-"$LIBC" + exit ;; + ppcle:Linux:*:*) + echo powerpcle-unknown-linux-"$LIBC" + exit ;; + riscv32:Linux:*:* | riscv64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo "$UNAME_MACHINE"-ibm-linux-"$LIBC" + exit ;; + sh64*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sh*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + tile*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + vax:Linux:*:*) + echo "$UNAME_MACHINE"-dec-linux-"$LIBC" + exit ;; + x86_64:Linux:*:*) + set_cc_for_build + LIBCABI=$LIBC + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __ILP32__'; echo IS_X32; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_X32 >/dev/null + then + LIBCABI="$LIBC"x32 + fi + fi + echo "$UNAME_MACHINE"-pc-linux-"$LIBCABI" + exit ;; + xtensa*:Linux:*:*) + echo "$UNAME_MACHINE"-unknown-linux-"$LIBC" + exit ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo "$UNAME_MACHINE"-pc-sysv4.2uw"$UNAME_VERSION" + exit ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo "$UNAME_MACHINE"-pc-os2-emx + exit ;; + i*86:XTS-300:*:STOP) + echo "$UNAME_MACHINE"-unknown-stop + exit ;; + i*86:atheos:*:*) + echo "$UNAME_MACHINE"-unknown-atheos + exit ;; + i*86:syllable:*:*) + echo "$UNAME_MACHINE"-pc-syllable + exit ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*) + echo i386-unknown-lynxos"$UNAME_RELEASE" + exit ;; + i*86:*DOS:*:*) + echo "$UNAME_MACHINE"-pc-msdosdjgpp + exit ;; + i*86:*:4.*:*) + UNAME_REL=`echo "$UNAME_RELEASE" | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo "$UNAME_MACHINE"-univel-sysv"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv"$UNAME_REL" + fi + exit ;; + i*86:*:5:[678]*) + # UnixWare 7.x, OpenUNIX and OpenServer 6. + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo "$UNAME_MACHINE-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}" + exit ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo "$UNAME_MACHINE"-pc-sco"$UNAME_REL" + else + echo "$UNAME_MACHINE"-pc-sysv32 + fi + exit ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i586. + # Note: whatever this is, it MUST be the same as what config.sub + # prints for the "djgpp" host, or else GDB configure will decide that + # this is a cross-build. + echo i586-pc-msdosdjgpp + exit ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv"$UNAME_RELEASE" # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv"$UNAME_RELEASE" # Unknown i860-SVR4 + fi + exit ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit ;; + M68*:*:R3V[5678]*:*) + test -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4; exit; } ;; + NCR*:*:4.2:* | MPRAS*:*:4.2:*) + OS_REL='.3' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && { echo i486-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } + /bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \ + && { echo i586-ncr-sysv4.3"$OS_REL"; exit; } ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos"$UNAME_RELEASE" + exit ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos"$UNAME_RELEASE" + exit ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*) + echo powerpc-unknown-lynxos"$UNAME_RELEASE" + exit ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv"$UNAME_RELEASE" + exit ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo "$UNAME_MACHINE"-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit ;; + i*86:VOS:*:*) + # From Paul.Green@stratus.com. + echo "$UNAME_MACHINE"-stratus-vos + exit ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux"$UNAME_RELEASE" + exit ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if test -d /usr/nec; then + echo mips-nec-sysv"$UNAME_RELEASE" + else + echo mips-unknown-sysv"$UNAME_RELEASE" + fi + exit ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit ;; + BePC:Haiku:*:*) # Haiku running on Intel PC compatible. + echo i586-pc-haiku + exit ;; + x86_64:Haiku:*:*) + echo x86_64-unknown-haiku + exit ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux"$UNAME_RELEASE" + exit ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux"$UNAME_RELEASE" + exit ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux"$UNAME_RELEASE" + exit ;; + SX-7:SUPER-UX:*:*) + echo sx7-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8:SUPER-UX:*:*) + echo sx8-nec-superux"$UNAME_RELEASE" + exit ;; + SX-8R:SUPER-UX:*:*) + echo sx8r-nec-superux"$UNAME_RELEASE" + exit ;; + SX-ACE:SUPER-UX:*:*) + echo sxace-nec-superux"$UNAME_RELEASE" + exit ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody"$UNAME_RELEASE" + exit ;; + *:Rhapsody:*:*) + echo "$UNAME_MACHINE"-apple-rhapsody"$UNAME_RELEASE" + exit ;; + arm64:Darwin:*:*) + echo aarch64-apple-darwin"$UNAME_RELEASE" + exit ;; + *:Darwin:*:*) + UNAME_PROCESSOR=`uname -p` + case $UNAME_PROCESSOR in + unknown) UNAME_PROCESSOR=powerpc ;; + esac + if command -v xcode-select > /dev/null 2> /dev/null && \ + ! xcode-select --print-path > /dev/null 2> /dev/null ; then + # Avoid executing cc if there is no toolchain installed as + # cc will be a stub that puts up a graphical alert + # prompting the user to install developer tools. + CC_FOR_BUILD=no_compiler_found + else + set_cc_for_build + fi + if test "$CC_FOR_BUILD" != no_compiler_found; then + if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_64BIT_ARCH >/dev/null + then + case $UNAME_PROCESSOR in + i386) UNAME_PROCESSOR=x86_64 ;; + powerpc) UNAME_PROCESSOR=powerpc64 ;; + esac + fi + # On 10.4-10.6 one might compile for PowerPC via gcc -arch ppc + if (echo '#ifdef __POWERPC__'; echo IS_PPC; echo '#endif') | \ + (CCOPTS="" $CC_FOR_BUILD -E - 2>/dev/null) | \ + grep IS_PPC >/dev/null + then + UNAME_PROCESSOR=powerpc + fi + elif test "$UNAME_PROCESSOR" = i386 ; then + # uname -m returns i386 or x86_64 + UNAME_PROCESSOR=$UNAME_MACHINE + fi + echo "$UNAME_PROCESSOR"-apple-darwin"$UNAME_RELEASE" + exit ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = x86; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo "$UNAME_PROCESSOR"-"$UNAME_MACHINE"-nto-qnx"$UNAME_RELEASE" + exit ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit ;; + NEO-*:NONSTOP_KERNEL:*:*) + echo neo-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSE-*:NONSTOP_KERNEL:*:*) + echo nse-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSR-*:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSV-*:NONSTOP_KERNEL:*:*) + echo nsv-tandem-nsk"$UNAME_RELEASE" + exit ;; + NSX-*:NONSTOP_KERNEL:*:*) + echo nsx-tandem-nsk"$UNAME_RELEASE" + exit ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit ;; + DS/*:UNIX_System_V:*:*) + echo "$UNAME_MACHINE"-"$UNAME_SYSTEM"-"$UNAME_RELEASE" + exit ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + # shellcheck disable=SC2154 + if test "$cputype" = 386; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo "$UNAME_MACHINE"-unknown-plan9 + exit ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux"$UNAME_RELEASE" + exit ;; + *:DragonFly:*:*) + echo "$UNAME_MACHINE"-unknown-dragonfly"`echo "$UNAME_RELEASE"|sed -e 's/[-(].*//'`" + exit ;; + *:*VMS:*:*) + UNAME_MACHINE=`(uname -p) 2>/dev/null` + case "$UNAME_MACHINE" in + A*) echo alpha-dec-vms ; exit ;; + I*) echo ia64-dec-vms ; exit ;; + V*) echo vax-dec-vms ; exit ;; + esac ;; + *:XENIX:*:SysV) + echo i386-pc-xenix + exit ;; + i*86:skyos:*:*) + echo "$UNAME_MACHINE"-pc-skyos"`echo "$UNAME_RELEASE" | sed -e 's/ .*$//'`" + exit ;; + i*86:rdos:*:*) + echo "$UNAME_MACHINE"-pc-rdos + exit ;; + i*86:AROS:*:*) + echo "$UNAME_MACHINE"-pc-aros + exit ;; + x86_64:VMkernel:*:*) + echo "$UNAME_MACHINE"-unknown-esx + exit ;; + amd64:Isilon\ OneFS:*:*) + echo x86_64-unknown-onefs + exit ;; + *:Unleashed:*:*) + echo "$UNAME_MACHINE"-unknown-unleashed"$UNAME_RELEASE" + exit ;; +esac + +# No uname command or uname output not recognized. +set_cc_for_build +cat > "$dummy.c" < +#include +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined (vax) || defined (__vax) || defined (__vax__) || defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#include +#if defined(_SIZE_T_) || defined(SIGLOST) +#include +#endif +#endif +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); +#endif + +#if defined (vax) +#if !defined (ultrix) +#include +#if defined (BSD) +#if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +#else +#if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#endif +#else + printf ("vax-dec-bsd\n"); exit (0); +#endif +#else +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname un; + uname (&un); + printf ("vax-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("vax-dec-ultrix\n"); exit (0); +#endif +#endif +#endif +#if defined(ultrix) || defined(_ultrix) || defined(__ultrix) || defined(__ultrix__) +#if defined(mips) || defined(__mips) || defined(__mips__) || defined(MIPS) || defined(__MIPS__) +#if defined(_SIZE_T_) || defined(SIGLOST) + struct utsname *un; + uname (&un); + printf ("mips-dec-ultrix%s\n", un.release); exit (0); +#else + printf ("mips-dec-ultrix\n"); exit (0); +#endif +#endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o "$dummy" "$dummy.c" 2>/dev/null && SYSTEM_NAME=`$dummy` && + { echo "$SYSTEM_NAME"; exit; } + +# Apollos put the system type in the environment. +test -d /usr/apollo && { echo "$ISP-apollo-$SYSTYPE"; exit; } + +echo "$0: unable to guess system type" >&2 + +case "$UNAME_MACHINE:$UNAME_SYSTEM" in + mips:Linux | mips64:Linux) + # If we got here on MIPS GNU/Linux, output extra information. + cat >&2 <&2 <&2 </dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = "$UNAME_MACHINE" +UNAME_RELEASE = "$UNAME_RELEASE" +UNAME_SYSTEM = "$UNAME_SYSTEM" +UNAME_VERSION = "$UNAME_VERSION" +EOF +fi + +exit 1 + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/depends/config.site.in b/depends/config.site.in new file mode 100644 index 000000000..ba96d9f45 --- /dev/null +++ b/depends/config.site.in @@ -0,0 +1,78 @@ +depends_prefix="`dirname ${ac_site_file}`/.." + +cross_compiling=maybe +host_alias=@HOST@ +ac_tool_prefix=${host_alias}- + +if test -z $with_boost; then + with_boost=$depends_prefix +fi + + +if test -z $enable_wallet && test -n "@no_wallet@"; then + enable_wallet=no +fi + +RUST_TARGET="@rust_target@" +RUST_VENDORED_SOURCES="$depends_prefix/vendored-sources" + +if test x@host_os@ = xdarwin; then + BREW=no + PORT=no +fi + +PATH=$depends_prefix/native/bin:$PATH +PKG_CONFIG="`which pkg-config` --static" + +# These two need to remain exported because pkg-config does not see them +# otherwise. That means they must be unexported at the end of configure.ac to +# avoid ruining the cache. Sigh. + +export PKG_CONFIG_LIBDIR=$depends_prefix/lib/pkgconfig +export PKG_CONFIG_PATH=$depends_prefix/share/pkgconfig + +CPPFLAGS="-I$depends_prefix/include/ $CPPFLAGS" + +if test x@host_os@ = xfreebsd; then + LDFLAGS="-L$depends_prefix/lib $LDFLAGS -static-libstdc++ -lcxxrt" +else + LDFLAGS="-L$depends_prefix/lib $LDFLAGS -static-libstdc++ -lc++abi" +fi + +CC="@CC@" +CXX="@CXX@" +OBJC="${CC}" +OBJCXX="${CXX}" +CCACHE=$depends_prefix/native/bin/ccache + +if test -n "@AR@"; then + AR=@AR@ + ac_cv_path_ac_pt_AR=${AR} +fi + +if test -n "@RANLIB@"; then + RANLIB=@RANLIB@ + ac_cv_path_ac_pt_RANLIB=${RANLIB} +fi + +if test -n "@NM@"; then + NM=@NM@ + ac_cv_path_ac_pt_NM=${NM} +fi + +if test -n "@debug@"; then + enable_reduce_exports=no +fi + +if test -n "@CFLAGS@"; then + CFLAGS="@CFLAGS@ $CFLAGS" +fi +if test -n "@CXXFLAGS@"; then + CXXFLAGS="@CXXFLAGS@ $CXXFLAGS" +fi +if test -n "@CPPFLAGS@"; then + CPPFLAGS="@CPPFLAGS@ $CPPFLAGS" +fi +if test -n "@LDFLAGS@"; then + LDFLAGS="@LDFLAGS@ $LDFLAGS" +fi diff --git a/depends/config.sub b/depends/config.sub new file mode 100755 index 000000000..780c2bbaa --- /dev/null +++ b/depends/config.sub @@ -0,0 +1,1845 @@ +#! /bin/sh +# Configuration validation subroutine script. +# Copyright 1992-2020 Free Software Foundation, Inc. + +timestamp='2020-09-08' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see . +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that +# program. This Exception is an additional permission under section 7 +# of the GNU General Public License, version 3 ("GPLv3"). + + +# Please send patches to . +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# You can get the latest version of this script from: +# https://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS or ALIAS + +Canonicalize a configuration name. + +Options: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright 1992-2020 Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit ;; + --version | -v ) + echo "$version" ; exit ;; + --help | --h* | -h ) + echo "$usage"; exit ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo "$1" + exit ;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Split fields of configuration type +# shellcheck disable=SC2162 +IFS="-" read field1 field2 field3 field4 <&2 + exit 1 + ;; + *-*-*-*) + basic_machine=$field1-$field2 + basic_os=$field3-$field4 + ;; + *-*-*) + # Ambiguous whether COMPANY is present, or skipped and KERNEL-OS is two + # parts + maybe_os=$field2-$field3 + case $maybe_os in + nto-qnx* | linux-* | uclinux-uclibc* \ + | uclinux-gnu* | kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* \ + | netbsd*-eabi* | kopensolaris*-gnu* | cloudabi*-eabi* \ + | storm-chaos* | os2-emx* | rtmk-nova*) + basic_machine=$field1 + basic_os=$maybe_os + ;; + android-linux) + basic_machine=$field1-unknown + basic_os=linux-android + ;; + *) + basic_machine=$field1-$field2 + basic_os=$field3 + ;; + esac + ;; + *-*) + # A lone config we happen to match not fitting any pattern + case $field1-$field2 in + decstation-3100) + basic_machine=mips-dec + basic_os= + ;; + *-*) + # Second component is usually, but not always the OS + case $field2 in + # Prevent following clause from handling this valid os + sun*os*) + basic_machine=$field1 + basic_os=$field2 + ;; + # Manufacturers + dec* | mips* | sequent* | encore* | pc533* | sgi* | sony* \ + | att* | 7300* | 3300* | delta* | motorola* | sun[234]* \ + | unicom* | ibm* | next | hp | isi* | apollo | altos* \ + | convergent* | ncr* | news | 32* | 3600* | 3100* \ + | hitachi* | c[123]* | convex* | sun | crds | omron* | dg \ + | ultra | tti* | harris | dolphin | highlevel | gould \ + | cbm | ns | masscomp | apple | axis | knuth | cray \ + | microblaze* | sim | cisco \ + | oki | wec | wrs | winbond) + basic_machine=$field1-$field2 + basic_os= + ;; + *) + basic_machine=$field1 + basic_os=$field2 + ;; + esac + ;; + esac + ;; + *) + # Convert single-component short-hands not valid as part of + # multi-component configurations. + case $field1 in + 386bsd) + basic_machine=i386-pc + basic_os=bsd + ;; + a29khif) + basic_machine=a29k-amd + basic_os=udi + ;; + adobe68k) + basic_machine=m68010-adobe + basic_os=scout + ;; + alliant) + basic_machine=fx80-alliant + basic_os= + ;; + altos | altos3068) + basic_machine=m68k-altos + basic_os= + ;; + am29k) + basic_machine=a29k-none + basic_os=bsd + ;; + amdahl) + basic_machine=580-amdahl + basic_os=sysv + ;; + amiga) + basic_machine=m68k-unknown + basic_os= + ;; + amigaos | amigados) + basic_machine=m68k-unknown + basic_os=amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + basic_os=sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + basic_os=sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + basic_os=bsd + ;; + aros) + basic_machine=i386-pc + basic_os=aros + ;; + aux) + basic_machine=m68k-apple + basic_os=aux + ;; + balance) + basic_machine=ns32k-sequent + basic_os=dynix + ;; + blackfin) + basic_machine=bfin-unknown + basic_os=linux + ;; + cegcc) + basic_machine=arm-unknown + basic_os=cegcc + ;; + convex-c1) + basic_machine=c1-convex + basic_os=bsd + ;; + convex-c2) + basic_machine=c2-convex + basic_os=bsd + ;; + convex-c32) + basic_machine=c32-convex + basic_os=bsd + ;; + convex-c34) + basic_machine=c34-convex + basic_os=bsd + ;; + convex-c38) + basic_machine=c38-convex + basic_os=bsd + ;; + cray) + basic_machine=j90-cray + basic_os=unicos + ;; + crds | unos) + basic_machine=m68k-crds + basic_os= + ;; + da30) + basic_machine=m68k-da30 + basic_os= + ;; + decstation | pmax | pmin | dec3100 | decstatn) + basic_machine=mips-dec + basic_os= + ;; + delta88) + basic_machine=m88k-motorola + basic_os=sysv3 + ;; + dicos) + basic_machine=i686-pc + basic_os=dicos + ;; + djgpp) + basic_machine=i586-pc + basic_os=msdosdjgpp + ;; + ebmon29k) + basic_machine=a29k-amd + basic_os=ebmon + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + basic_os=ose + ;; + gmicro) + basic_machine=tron-gmicro + basic_os=sysv + ;; + go32) + basic_machine=i386-pc + basic_os=go32 + ;; + h8300hms) + basic_machine=h8300-hitachi + basic_os=hms + ;; + h8300xray) + basic_machine=h8300-hitachi + basic_os=xray + ;; + h8500hms) + basic_machine=h8500-hitachi + basic_os=hms + ;; + harris) + basic_machine=m88k-harris + basic_os=sysv3 + ;; + hp300 | hp300hpux) + basic_machine=m68k-hp + basic_os=hpux + ;; + hp300bsd) + basic_machine=m68k-hp + basic_os=bsd + ;; + hppaosf) + basic_machine=hppa1.1-hp + basic_os=osf + ;; + hppro) + basic_machine=hppa1.1-hp + basic_os=proelf + ;; + i386mach) + basic_machine=i386-mach + basic_os=mach + ;; + isi68 | isi) + basic_machine=m68k-isi + basic_os=sysv + ;; + m68knommu) + basic_machine=m68k-unknown + basic_os=linux + ;; + magnum | m3230) + basic_machine=mips-mips + basic_os=sysv + ;; + merlin) + basic_machine=ns32k-utek + basic_os=sysv + ;; + mingw64) + basic_machine=x86_64-pc + basic_os=mingw64 + ;; + mingw32) + basic_machine=i686-pc + basic_os=mingw32 + ;; + mingw32ce) + basic_machine=arm-unknown + basic_os=mingw32ce + ;; + monitor) + basic_machine=m68k-rom68k + basic_os=coff + ;; + morphos) + basic_machine=powerpc-unknown + basic_os=morphos + ;; + moxiebox) + basic_machine=moxie-unknown + basic_os=moxiebox + ;; + msdos) + basic_machine=i386-pc + basic_os=msdos + ;; + msys) + basic_machine=i686-pc + basic_os=msys + ;; + mvs) + basic_machine=i370-ibm + basic_os=mvs + ;; + nacl) + basic_machine=le32-unknown + basic_os=nacl + ;; + ncr3000) + basic_machine=i486-ncr + basic_os=sysv4 + ;; + netbsd386) + basic_machine=i386-pc + basic_os=netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + basic_os=linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + basic_os=newsos + ;; + news1000) + basic_machine=m68030-sony + basic_os=newsos + ;; + necv70) + basic_machine=v70-nec + basic_os=sysv + ;; + nh3000) + basic_machine=m68k-harris + basic_os=cxux + ;; + nh[45]000) + basic_machine=m88k-harris + basic_os=cxux + ;; + nindy960) + basic_machine=i960-intel + basic_os=nindy + ;; + mon960) + basic_machine=i960-intel + basic_os=mon960 + ;; + nonstopux) + basic_machine=mips-compaq + basic_os=nonstopux + ;; + os400) + basic_machine=powerpc-ibm + basic_os=os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + basic_os=ose + ;; + os68k) + basic_machine=m68k-none + basic_os=os68k + ;; + paragon) + basic_machine=i860-intel + basic_os=osf + ;; + parisc) + basic_machine=hppa-unknown + basic_os=linux + ;; + psp) + basic_machine=mipsallegrexel-sony + basic_os=psp + ;; + pw32) + basic_machine=i586-unknown + basic_os=pw32 + ;; + rdos | rdos64) + basic_machine=x86_64-pc + basic_os=rdos + ;; + rdos32) + basic_machine=i386-pc + basic_os=rdos + ;; + rom68k) + basic_machine=m68k-rom68k + basic_os=coff + ;; + sa29200) + basic_machine=a29k-amd + basic_os=udi + ;; + sei) + basic_machine=mips-sei + basic_os=seiux + ;; + sequent) + basic_machine=i386-sequent + basic_os= + ;; + sps7) + basic_machine=m68k-bull + basic_os=sysv2 + ;; + st2000) + basic_machine=m68k-tandem + basic_os= + ;; + stratus) + basic_machine=i860-stratus + basic_os=sysv4 + ;; + sun2) + basic_machine=m68000-sun + basic_os= + ;; + sun2os3) + basic_machine=m68000-sun + basic_os=sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + basic_os=sunos4 + ;; + sun3) + basic_machine=m68k-sun + basic_os= + ;; + sun3os3) + basic_machine=m68k-sun + basic_os=sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + basic_os=sunos4 + ;; + sun4) + basic_machine=sparc-sun + basic_os= + ;; + sun4os3) + basic_machine=sparc-sun + basic_os=sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + basic_os=sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + basic_os=solaris2 + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + basic_os= + ;; + sv1) + basic_machine=sv1-cray + basic_os=unicos + ;; + symmetry) + basic_machine=i386-sequent + basic_os=dynix + ;; + t3e) + basic_machine=alphaev5-cray + basic_os=unicos + ;; + t90) + basic_machine=t90-cray + basic_os=unicos + ;; + toad1) + basic_machine=pdp10-xkl + basic_os=tops20 + ;; + tpf) + basic_machine=s390x-ibm + basic_os=tpf + ;; + udi29k) + basic_machine=a29k-amd + basic_os=udi + ;; + ultra3) + basic_machine=a29k-nyu + basic_os=sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + basic_os=none + ;; + vaxv) + basic_machine=vax-dec + basic_os=sysv + ;; + vms) + basic_machine=vax-dec + basic_os=vms + ;; + vsta) + basic_machine=i386-pc + basic_os=vsta + ;; + vxworks960) + basic_machine=i960-wrs + basic_os=vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + basic_os=vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + basic_os=vxworks + ;; + xbox) + basic_machine=i686-pc + basic_os=mingw32 + ;; + ymp) + basic_machine=ymp-cray + basic_os=unicos + ;; + *) + basic_machine=$1 + basic_os= + ;; + esac + ;; +esac + +# Decode 1-component or ad-hoc basic machines +case $basic_machine in + # Here we handle the default manufacturer of certain CPU types. It is in + # some cases the only manufacturer, in others, it is the most popular. + w89k) + cpu=hppa1.1 + vendor=winbond + ;; + op50n) + cpu=hppa1.1 + vendor=oki + ;; + op60c) + cpu=hppa1.1 + vendor=oki + ;; + ibm*) + cpu=i370 + vendor=ibm + ;; + orion105) + cpu=clipper + vendor=highlevel + ;; + mac | mpw | mac-mpw) + cpu=m68k + vendor=apple + ;; + pmac | pmac-mpw) + cpu=powerpc + vendor=apple + ;; + + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + cpu=m68000 + vendor=att + ;; + 3b*) + cpu=we32k + vendor=att + ;; + bluegene*) + cpu=powerpc + vendor=ibm + basic_os=cnk + ;; + decsystem10* | dec10*) + cpu=pdp10 + vendor=dec + basic_os=tops10 + ;; + decsystem20* | dec20*) + cpu=pdp10 + vendor=dec + basic_os=tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + cpu=m68k + vendor=motorola + ;; + dpx2*) + cpu=m68k + vendor=bull + basic_os=sysv3 + ;; + encore | umax | mmax) + cpu=ns32k + vendor=encore + ;; + elxsi) + cpu=elxsi + vendor=elxsi + basic_os=${basic_os:-bsd} + ;; + fx2800) + cpu=i860 + vendor=alliant + ;; + genix) + cpu=ns32k + vendor=ns + ;; + h3050r* | hiux*) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + cpu=m68000 + vendor=hp + ;; + hp9k3[2-9][0-9]) + cpu=m68k + vendor=hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + cpu=hppa1.1 + vendor=hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + cpu=hppa1.0 + vendor=hp + ;; + i*86v32) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv32 + ;; + i*86v4*) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv4 + ;; + i*86v) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=sysv + ;; + i*86sol2) + cpu=`echo "$1" | sed -e 's/86.*/86/'` + vendor=pc + basic_os=solaris2 + ;; + j90 | j90-cray) + cpu=j90 + vendor=cray + basic_os=${basic_os:-unicos} + ;; + iris | iris4d) + cpu=mips + vendor=sgi + case $basic_os in + irix*) + ;; + *) + basic_os=irix4 + ;; + esac + ;; + miniframe) + cpu=m68000 + vendor=convergent + ;; + *mint | mint[0-9]* | *MiNT | *MiNT[0-9]*) + cpu=m68k + vendor=atari + basic_os=mint + ;; + news-3600 | risc-news) + cpu=mips + vendor=sony + basic_os=newsos + ;; + next | m*-next) + cpu=m68k + vendor=next + case $basic_os in + openstep*) + ;; + nextstep*) + ;; + ns2*) + basic_os=nextstep2 + ;; + *) + basic_os=nextstep3 + ;; + esac + ;; + np1) + cpu=np1 + vendor=gould + ;; + op50n-* | op60c-*) + cpu=hppa1.1 + vendor=oki + basic_os=proelf + ;; + pa-hitachi) + cpu=hppa1.1 + vendor=hitachi + basic_os=hiuxwe2 + ;; + pbd) + cpu=sparc + vendor=tti + ;; + pbb) + cpu=m68k + vendor=tti + ;; + pc532) + cpu=ns32k + vendor=pc532 + ;; + pn) + cpu=pn + vendor=gould + ;; + power) + cpu=power + vendor=ibm + ;; + ps2) + cpu=i386 + vendor=ibm + ;; + rm[46]00) + cpu=mips + vendor=siemens + ;; + rtpc | rtpc-*) + cpu=romp + vendor=ibm + ;; + sde) + cpu=mipsisa32 + vendor=sde + basic_os=${basic_os:-elf} + ;; + simso-wrs) + cpu=sparclite + vendor=wrs + basic_os=vxworks + ;; + tower | tower-32) + cpu=m68k + vendor=ncr + ;; + vpp*|vx|vx-*) + cpu=f301 + vendor=fujitsu + ;; + w65) + cpu=w65 + vendor=wdc + ;; + w89k-*) + cpu=hppa1.1 + vendor=winbond + basic_os=proelf + ;; + none) + cpu=none + vendor=none + ;; + leon|leon[3-9]) + cpu=sparc + vendor=$basic_machine + ;; + leon-*|leon[3-9]-*) + cpu=sparc + vendor=`echo "$basic_machine" | sed 's/-.*//'` + ;; + + *-*) + # shellcheck disable=SC2162 + IFS="-" read cpu vendor <&2 + exit 1 + ;; + esac + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $vendor in + digital*) + vendor=dec + ;; + commodore*) + vendor=cbm + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if test x$basic_os != x +then + +# First recognize some ad-hoc caes, or perhaps split kernel-os, or else just +# set os. +case $basic_os in + gnu/linux*) + kernel=linux + os=`echo $basic_os | sed -e 's|gnu/linux|gnu|'` + ;; + nto-qnx*) + kernel=nto + os=`echo $basic_os | sed -e 's|nto-qnx|qnx|'` + ;; + *-*) + # shellcheck disable=SC2162 + IFS="-" read kernel os <&2 + exit 1 + ;; +esac + +# As a final step for OS-related things, validate the OS-kernel combination +# (given a valid OS), if there is a kernel. +case $kernel-$os in + linux-gnu* | linux-dietlibc* | linux-android* | linux-newlib* | linux-musl* | linux-uclibc* ) + ;; + -dietlibc* | -newlib* | -musl* | -uclibc* ) + # These are just libc implementations, not actual OSes, and thus + # require a kernel. + echo "Invalid configuration \`$1': libc \`$os' needs explicit kernel." 1>&2 + exit 1 + ;; + kfreebsd*-gnu* | kopensolaris*-gnu*) + ;; + nto-qnx*) + ;; + *-eabi* | *-gnueabi*) + ;; + -*) + # Blank kernel with real OS is always fine. + ;; + *-*) + echo "Invalid configuration \`$1': Kernel \`$kernel' not known to work with OS \`$os'." 1>&2 + exit 1 + ;; +esac + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +case $vendor in + unknown) + case $cpu-$os in + *-riscix*) + vendor=acorn + ;; + *-sunos*) + vendor=sun + ;; + *-cnk* | *-aix*) + vendor=ibm + ;; + *-beos*) + vendor=be + ;; + *-hpux*) + vendor=hp + ;; + *-mpeix*) + vendor=hp + ;; + *-hiux*) + vendor=hitachi + ;; + *-unos*) + vendor=crds + ;; + *-dgux*) + vendor=dg + ;; + *-luna*) + vendor=omron + ;; + *-genix*) + vendor=ns + ;; + *-clix*) + vendor=intergraph + ;; + *-mvs* | *-opened*) + vendor=ibm + ;; + *-os400*) + vendor=ibm + ;; + s390-* | s390x-*) + vendor=ibm + ;; + *-ptx*) + vendor=sequent + ;; + *-tpf*) + vendor=ibm + ;; + *-vxsim* | *-vxworks* | *-windiss*) + vendor=wrs + ;; + *-aux*) + vendor=apple + ;; + *-hms*) + vendor=hitachi + ;; + *-mpw* | *-macos*) + vendor=apple + ;; + *-*mint | *-mint[0-9]* | *-*MiNT | *-MiNT[0-9]*) + vendor=atari + ;; + *-vos*) + vendor=stratus + ;; + esac + ;; +esac + +echo "$cpu-$vendor-${kernel:+$kernel-}$os" +exit + +# Local variables: +# eval: (add-hook 'before-save-hook 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/depends/description.md b/depends/description.md new file mode 100644 index 000000000..74f9ef3f2 --- /dev/null +++ b/depends/description.md @@ -0,0 +1,53 @@ +This is a system of building and caching dependencies necessary for building Bitcoin. +There are several features that make it different from most similar systems: + +### It is designed to be builder and host agnostic + +In theory, binaries for any target OS/architecture can be created, from a +builder running any OS/architecture. In practice, build-side tools must be +specified when the defaults don't fit, and packages must be amended to work +on new hosts. For now, a build architecture of x86_64 is assumed, either on +Linux or OSX. + +### No reliance on timestamps + +File presence is used to determine what needs to be built. This makes the +results distributable and easily digestable by automated builders. + +### Each build only has its specified dependencies available at build-time. + +For each build, the sysroot is wiped and the (recursive) dependencies are +installed. This makes each build deterministic, since there will never be any +unknown files available to cause side-effects. + +### Each package is cached and only rebuilt as needed. + +Before building, a unique build-id is generated for each package. This id +consists of a hash of all files used to build the package (Makefiles, packages, +etc), and as well as a hash of the same data for each recursive dependency. If +any portion of a package's build recipe changes, it will be rebuilt as well as +any other package that depends on it. If any of the main makefiles (Makefile, +funcs.mk, etc) are changed, all packages will be rebuilt. After building, the +results are cached into a tarball that can be re-used and distributed. + +### Package build results are (relatively) deterministic. + +Each package is configured and patched so that it will yield the same +build-results with each consequent build, within a reasonable set of +constraints. Some things like timestamp insertion are unavoidable, and are +beyond the scope of this system. Additionally, the toolchain itself must be +capable of deterministic results. When revisions are properly bumped, a cached +build should represent an exact single payload. + +### Sources are fetched and verified automatically + +Each package must define its source location and checksum. The build will fail +if the fetched source does not match. Sources may be pre-seeded and/or cached +as desired. + +### Self-cleaning + +Build and staging dirs are wiped after use, and any previous version of a +cached result is removed following a successful build. Automated builders +should be able to build each revision and store the results with no further +intervention. diff --git a/depends/funcs.mk b/depends/funcs.mk new file mode 100644 index 000000000..afc55efe7 --- /dev/null +++ b/depends/funcs.mk @@ -0,0 +1,278 @@ +define int_vars +#Set defaults for vars which may be overridden per-package +$(1)_cc=$($($(1)_type)_CC) +$(1)_cxx=$($($(1)_type)_CXX) +$(1)_objc=$($($(1)_type)_OBJC) +$(1)_objcxx=$($($(1)_type)_OBJCXX) +$(1)_ar=$($($(1)_type)_AR) +$(1)_ranlib=$($($(1)_type)_RANLIB) +$(1)_libtool=$($($(1)_type)_LIBTOOL) +$(1)_nm=$($($(1)_type)_NM) +$(1)_cflags=$($($(1)_type)_CFLAGS) $($($(1)_type)_$(release_type)_CFLAGS) +$(1)_cxxflags=$($($(1)_type)_CXXFLAGS) $($($(1)_type)_$(release_type)_CXXFLAGS) +$(1)_ldflags=$($($(1)_type)_LDFLAGS) $($($(1)_type)_$(release_type)_LDFLAGS) -L$($($(1)_type)_prefix)/lib +$(1)_cppflags=$($($(1)_type)_CPPFLAGS) $($($(1)_type)_$(release_type)_CPPFLAGS) -I$($($(1)_type)_prefix)/include +$(1)_recipe_hash:= +endef + +define int_get_all_dependencies +$(sort $(foreach dep,$(2),$(2) $(call int_get_all_dependencies,$(1),$($(dep)_dependencies)))) +endef + +define download_and_check_file +($(build_DOWNLOAD) "$(1)/$(2).temp" $(3) && echo "$(4) $(1)/$(2).temp" > $(1)/.$(2).hash && $(build_SHA256SUM) -c $(1)/.$(2).hash) +endef + +define fetch_file +(test -f $$($(1)_source_dir)/$(4) || \ + ( mkdir -p $$($(1)_download_dir) && echo Fetching $(1)... && \ + ( $(call download_and_check_file,$$($(1)_download_dir),$(4),"$(2)/$(3)",$(5)) || \ + $(call download_and_check_file,$$($(1)_download_dir),$(4),"$(FALLBACK_DOWNLOAD_PATH)/$(4)",$(5)) ) && \ + mv $$($(1)_download_dir)/$(4).temp $$($(1)_source_dir)/$(4) && \ + rm -rf $$($(1)_download_dir) )) +endef + +define vendor_crate_deps +(test -f $$($(1)_source_dir)/$(5) || \ + ( mkdir -p $$($(1)_download_dir)/$(1) && echo Vendoring dependencies for $(1)... && \ + tar -xf $(native_rust_cached) -C $$($(1)_download_dir) && \ + tar --strip-components=1 -xf $$($(1)_source_dir)/$(2) -C $$($(1)_download_dir)/$(1) && \ + cp $(3) $$($(1)_download_dir)/$(1)/Cargo.lock && \ + $$($(1)_download_dir)/native/bin/cargo vendor --locked --manifest-path $$($(1)_download_dir)/$(1)/$(4) $$($(1)_download_dir)/$(CRATE_REGISTRY) && \ + cd $$($(1)_download_dir) && \ + find $(CRATE_REGISTRY) | sort | tar --no-recursion -czf $$($(1)_download_dir)/$(5).temp -T - && \ + mv $$($(1)_download_dir)/$(5).temp $$($(1)_source_dir)/$(5) && \ + rm -rf $$($(1)_download_dir) )) +endef + +define int_get_build_recipe_hash +$(eval $(1)_all_file_checksums:=$(shell $(build_SHA256SUM) $(meta_depends) packages/$(1).mk $(addprefix $(PATCHES_PATH)/$(1)/,$($(1)_patches)) | cut -d" " -f1)) +$(eval $(1)_recipe_hash:=$(shell echo -n "$($(1)_all_file_checksums)" | $(build_SHA256SUM) | cut -d" " -f1)) +endef + +define int_get_build_id +$(eval $(1)_dependencies += $($(1)_$(host_arch)_$(host_os)_dependencies) $($(1)_$(host_os)_dependencies)) +$(eval $(1)_all_dependencies:=$(call int_get_all_dependencies,$(1),$($($(1)_type)_native_toolchain) $($($(1)_type)_native_binutils) $($(1)_dependencies))) +$(foreach dep,$($(1)_all_dependencies),$(eval $(1)_build_id_deps+=$(dep)-$($(dep)_version)-$($(dep)_recipe_hash))) +$(eval $(1)_build_id_long:=$(1)-$($(1)_version)-$($(1)_recipe_hash)-$(release_type) $($(1)_build_id_deps)) +$(eval $(1)_build_id:=$(shell echo -n "$($(1)_build_id_long)" | $(build_SHA256SUM) | cut -c-$(HASH_LENGTH))) +final_build_id_long+=$($(package)_build_id_long) + +#override platform specific files and hashes +$(eval $(1)_file_name=$(if $($(1)_exact_file_name),$($(1)_exact_file_name),$(if $($(1)_file_name_$(host_arch)_$(host_os)),$($(1)_file_name_$(host_arch)_$(host_os)),$(if $($(1)_file_name_$(host_os)),$($(1)_file_name_$(host_os)),$($(1)_file_name))))) +$(eval $(1)_sha256_hash=$(if $($(1)_exact_sha256_hash),$($(1)_exact_sha256_hash),$(if $($(1)_sha256_hash_$(host_arch)_$(host_os)),$($(1)_sha256_hash_$(host_arch)_$(host_os)),$(if $($(1)_sha256_hash_$(host_os)),$($(1)_sha256_hash_$(host_os)),$($(1)_sha256_hash))))) +$(eval $(1)_download_file=$(if $($(1)_exact_download_file),$($(1)_exact_download_file),$(if $($(1)_download_file_$(host_arch)_$(host_os)),$($(1)_download_file_$(host_arch)_$(host_os)),$(if $($(1)_download_file_$(host_os)),$($(1)_download_file_$(host_os)),$(if $($(1)_download_file),$($(1)_download_file),$($(1)_file_name)))))) +$(eval $(1)_download_path=$(if $($(1)_exact_download_path),$($(1)_exact_download_path),$(if $($(1)_download_path_$(host_arch)_$(host_os)),$($(1)_download_path_$(host_arch)_$(host_os)),$(if $($(1)_download_path_$(host_os)),$($(1)_download_path_$(host_os)),$($(1)_download_path))))) + +#compute package-specific paths +$(1)_build_subdir?=. +$(1)_source_dir:=$(SOURCES_PATH) +$(1)_source:=$$($(1)_source_dir)/$($(1)_file_name) +$(1)_staging_dir=$(base_staging_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_staging_prefix_dir:=$$($(1)_staging_dir)$($($(1)_type)_prefix) +$(1)_extract_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id) +$(1)_download_dir:=$(base_download_dir)/$(1)-$($(1)_version) +$(1)_build_dir:=$$($(1)_extract_dir)/$$($(1)_build_subdir) +$(1)_cached_checksum:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz.hash +$(1)_patch_dir:=$(base_build_dir)/$(host)/$(1)/$($(1)_version)-$($(1)_build_id)/.patches-$($(1)_build_id) +$(1)_prefixbin:=$($($(1)_type)_prefix)/bin/ +$(1)_cached:=$(BASE_CACHE)/$(host)/$(1)/$(1)-$($(1)_version)-$($(1)_build_id).tar.gz +$(1)_all_sources=$($(1)_file_name) $($(1)_extra_sources) + +#stamps +$(1)_fetched=$(SOURCES_PATH)/download-stamps/.stamp_fetched-$(1)-$($(1)_file_name).hash +$(1)_extracted=$$($(1)_extract_dir)/.stamp_extracted +$(1)_preprocessed=$$($(1)_extract_dir)/.stamp_preprocessed +$(1)_cleaned=$$($(1)_extract_dir)/.stamp_cleaned +$(1)_built=$$($(1)_build_dir)/.stamp_built +$(1)_configured=$$($(1)_build_dir)/.stamp_configured +$(1)_staged=$$($(1)_staging_dir)/.stamp_staged +$(1)_postprocessed=$$($(1)_staging_prefix_dir)/.stamp_postprocessed +$(1)_download_path_fixed=$(subst :,\:,$$($(1)_download_path)) + + +#default commands +# The default behavior for tar will try to set ownership when running as uid 0 and may not succeed, --no-same-owner disables this behavior +$(1)_fetch_cmds ?= $(call fetch_file,$(1),$(subst \:,:,$$($(1)_download_path_fixed)),$$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) +$(1)_extract_cmds ?= mkdir -p $$($(1)_extract_dir) && echo "$$($(1)_sha256_hash) $$($(1)_source)" > $$($(1)_extract_dir)/.$$($(1)_file_name).hash && $(build_SHA256SUM) -c $$($(1)_extract_dir)/.$$($(1)_file_name).hash && tar --no-same-owner --strip-components=1 -xf $$($(1)_source) +$(1)_preprocess_cmds ?= +$(1)_build_cmds ?= +$(1)_config_cmds ?= +$(1)_stage_cmds ?= +$(1)_set_vars ?= + + +all_sources+=$$($(1)_fetched) +endef +#$(foreach dep_target,$($(1)_all_dependencies),$(eval $(1)_dependency_targets=$($(dep_target)_cached))) + + +define int_config_attach_build_config +$(eval $(call $(1)_set_vars,$(1))) +$(1)_cflags+=$($(1)_cflags_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)) $($(1)_cflags_$(host_arch)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_os)) $($(1)_cflags_$(host_os)_$(release_type)) +$(1)_cflags+=$($(1)_cflags_$(host_arch)_$(host_os)) $($(1)_cflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cxxflags+=$($(1)_cxxflags_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)) $($(1)_cxxflags_$(host_arch)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_os)) $($(1)_cxxflags_$(host_os)_$(release_type)) +$(1)_cxxflags+=$($(1)_cxxflags_$(host_arch)_$(host_os)) $($(1)_cxxflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_cppflags+=$($(1)_cppflags_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)) $($(1)_cppflags_$(host_arch)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_os)) $($(1)_cppflags_$(host_os)_$(release_type)) +$(1)_cppflags+=$($(1)_cppflags_$(host_arch)_$(host_os)) $($(1)_cppflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_ldflags+=$($(1)_ldflags_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)) $($(1)_ldflags_$(host_arch)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_os)) $($(1)_ldflags_$(host_os)_$(release_type)) +$(1)_ldflags+=$($(1)_ldflags_$(host_arch)_$(host_os)) $($(1)_ldflags_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_build_opts+=$$($(1)_build_opts_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)) $$($(1)_build_opts_$(host_arch)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_os)) $$($(1)_build_opts_$(host_os)_$(release_type)) +$(1)_build_opts+=$$($(1)_build_opts_$(host_arch)_$(host_os)) $$($(1)_build_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_opts+=$$($(1)_config_opts_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)) $$($(1)_config_opts_$(host_arch)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_os)) $$($(1)_config_opts_$(host_os)_$(release_type)) +$(1)_config_opts+=$$($(1)_config_opts_$(host_arch)_$(host_os)) $$($(1)_config_opts_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=$$($(1)_config_env_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)) $($(1)_config_env_$(host_arch)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_os)) $($(1)_config_env_$(host_os)_$(release_type)) +$(1)_config_env+=$($(1)_config_env_$(host_arch)_$(host_os)) $($(1)_config_env_$(host_arch)_$(host_os)_$(release_type)) + +$(1)_config_env+=PKG_CONFIG_LIBDIR=$($($(1)_type)_prefix)/lib/pkgconfig +$(1)_config_env+=PKG_CONFIG_PATH=$($($(1)_type)_prefix)/share/pkgconfig +$(1)_config_env+=CMAKE_MODULE_PATH=$($($(1)_type)_prefix)/lib/cmake +$(1)_config_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_build_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_stage_env+=PATH="$(build_prefix)/bin:$(PATH)" +$(1)_autoconf=./configure --host=$($($(1)_type)_host) --prefix=$($($(1)_type)_prefix) $$($(1)_config_opts) CC="$$($(1)_cc)" CXX="$$($(1)_cxx)" +ifneq ($($(1)_nm),) +$(1)_autoconf += NM="$$($(1)_nm)" +endif +ifneq ($($(1)_ranlib),) +$(1)_autoconf += RANLIB="$$($(1)_ranlib)" +endif +ifneq ($($(1)_ar),) +$(1)_autoconf += AR="$$($(1)_ar)" +endif +ifneq ($($(1)_cflags),) +$(1)_autoconf += CFLAGS="$$($(1)_cflags)" +endif +ifneq ($($(1)_cxxflags),) +$(1)_autoconf += CXXFLAGS="$$($(1)_cxxflags)" +endif +ifneq ($($(1)_cppflags),) +$(1)_autoconf += CPPFLAGS="$$($(1)_cppflags)" +endif +ifneq ($($(1)_ldflags),) +$(1)_autoconf += LDFLAGS="$$($(1)_ldflags)" +endif + +$(1)_cmake=env CC="$$($(1)_cc)" \ + CFLAGS="$$($(1)_cppflags) $$($(1)_cflags)" \ + CXX="$$($(1)_cxx)" \ + CXXFLAGS="$$($(1)_cppflags) $$($(1)_cxxflags)" \ + LDFLAGS="$$($(1)_ldflags)" \ + $(build_prefix)/bin/cmake -DCMAKE_INSTALL_PREFIX:PATH="$$($($(1)_type)_prefix)" +ifeq ($($(1)_type),build) +$(1)_cmake += -DCMAKE_INSTALL_RPATH:PATH="$$($($(1)_type)_prefix)/lib" +else +ifneq ($(host),$(build)) +$(1)_cmake += -DCMAKE_SYSTEM_NAME=$($(host_os)_cmake_system) +$(1)_cmake += -DCMAKE_C_COMPILER_TARGET=$(host) +$(1)_cmake += -DCMAKE_CXX_COMPILER_TARGET=$(host) +endif +endif +endef + +define int_add_cmds +$($(1)_fetched): + $(AT)mkdir -p $$(@D) $(SOURCES_PATH) + $(AT)rm -f $$@ + $(AT)touch $$@ + $(AT)cd $$(@D); $(call $(1)_fetch_cmds,$(1)) + $(AT)cd $($(1)_source_dir); $(foreach source,$($(1)_all_sources),$(build_SHA256SUM) $(source) >> $$(@);) + $(AT)touch $$@ +$($(1)_extracted): | $($(1)_fetched) + $(AT)echo Extracting $(1)... + $(AT)mkdir -p $$(@D) + $(AT)cd $$(@D); $(call $(1)_extract_cmds,$(1)) + $(AT)touch $$@ +$($(1)_preprocessed): | $($(1)_dependencies) $($(1)_extracted) + $(AT)echo Preprocessing $(1)... + $(AT)mkdir -p $$(@D) $($(1)_patch_dir) + $(AT)$(foreach patch,$($(1)_patches),cd $(PATCHES_PATH)/$(1); cp $(patch) $($(1)_patch_dir) ;) + $(AT)cd $$(@D); $(call $(1)_preprocess_cmds, $(1)) + $(AT)touch $$@ +$($(1)_configured): | $($(1)_preprocessed) + $(AT)echo Configuring $(1)... + $(AT)rm -rf $(host_prefix); mkdir -p $(host_prefix)/lib; cd $(host_prefix); $(foreach package,$($(1)_all_dependencies), tar --no-same-owner -xf $($(package)_cached); ) + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_config_env) $(call $(1)_config_cmds, $(1)) + $(AT)touch $$@ +$($(1)_built): | $($(1)_configured) + $(AT)echo Building $(1)... + $(AT)mkdir -p $$(@D) + $(AT)+cd $$(@D); $($(1)_build_env) $(call $(1)_build_cmds, $(1)) + $(AT)touch $$@ +$($(1)_staged): | $($(1)_built) + $(AT)echo Staging $(1)... + $(AT)mkdir -p $($(1)_staging_dir)/$(host_prefix) + $(AT)cd $($(1)_build_dir); $($(1)_stage_env) $(call $(1)_stage_cmds, $(1)) + $(AT)rm -rf $($(1)_extract_dir) + $(AT)touch $$@ +$($(1)_postprocessed): | $($(1)_staged) + $(AT)echo Postprocessing $(1)... + $(AT)cd $($(1)_staging_prefix_dir); $(call $(1)_postprocess_cmds) + $(AT)touch $$@ +$($(1)_cached): | $($(1)_dependencies) $($(1)_postprocessed) + $(AT)echo Caching $(1)... + $(AT)cd $$($(1)_staging_dir)/$(host_prefix); find . | sort | tar --no-recursion -czf $$($(1)_staging_dir)/$$(@F) -T - + $(AT)mkdir -p $$(@D) + $(AT)rm -rf $$(@D) && mkdir -p $$(@D) + $(AT)mv $$($(1)_staging_dir)/$$(@F) $$(@) + $(AT)rm -rf $($(1)_staging_dir) +$($(1)_cached_checksum): $($(1)_cached) + $(AT)cd $$(@D); $(build_SHA256SUM) $$( $$(@) + +.PHONY: $(1) +$(1): | $($(1)_cached_checksum) +.SECONDARY: $($(1)_cached) $($(1)_postprocessed) $($(1)_staged) $($(1)_built) $($(1)_configured) $($(1)_preprocessed) $($(1)_extracted) $($(1)_fetched) + +endef + +# These functions create the build targets for each package. They must be +# broken down into small steps so that each part is done for all packages +# before moving on to the next step. Otherwise, a package's info +# (build-id for example) would only be available to another package if it +# happened to be computed already. + +#set the type for host/build packages. +$(foreach native_package,$(native_packages),$(eval $(native_package)_type=build)) +$(foreach package,$(packages),$(eval $(package)_type=$(host_arch)_$(host_os))) + +#set overridable defaults +$(foreach package,$(all_packages),$(eval $(call int_vars,$(package)))) + +#include package files +$(foreach package,$(all_packages),$(eval include packages/$(package).mk)) + +#compute a hash of all files that comprise this package's build recipe +$(foreach package,$(all_packages),$(eval $(call int_get_build_recipe_hash,$(package)))) + +#generate a unique id for this package, incorporating its dependencies as well +$(foreach package,$(all_packages),$(eval $(call int_get_build_id,$(package)))) + +#compute final vars after reading package vars +$(foreach package,$(all_packages),$(eval $(call int_config_attach_build_config,$(package)))) + +#create build targets +$(foreach package,$(all_packages),$(eval $(call int_add_cmds,$(package)))) + +#special exception: if a toolchain package exists, all non-native packages depend on it +$(foreach package,$(packages),$(eval $($(package)_unpacked): |$($($(host_arch)_$(host_os)_native_toolchain)_cached) $($($(host_arch)_$(host_os)_native_binutils)_cached) )) diff --git a/depends/hosts/darwin.mk b/depends/hosts/darwin.mk new file mode 100644 index 000000000..19af5f9e5 --- /dev/null +++ b/depends/hosts/darwin.mk @@ -0,0 +1,44 @@ +OSX_MIN_VERSION=10.14 +XCODE_VERSION=11.3.1 +XCODE_BUILD_ID=11C505 +LD64_VERSION=530 + +OSX_SDK=$(SDK_PATH)/Xcode-$(XCODE_VERSION)-$(XCODE_BUILD_ID)-extracted-SDK-with-libcxx-headers + +# Flag explanations: +# +# -mlinker-version +# +# Ensures that modern linker features are enabled. See here for more +# details: https://github.com/bitcoin/bitcoin/pull/19407. +# +# -B$(build_prefix)/bin +# +# Explicitly point to our binaries (e.g. cctools) so that they are +# ensured to be found and preferred over other possibilities. +# +# -nostdinc++ -isystem $(OSX_SDK)/usr/include/c++/v1 +# +# Forces clang to use the libc++ headers from our SDK and completely +# forget about the libc++ headers from the standard directories +# +# TODO: Once we start requiring a clang version that has the +# -stdlib++-isystem flag first introduced here: +# https://reviews.llvm.org/D64089, we should use that instead. Read the +# differential summary there for more details. +# +darwin_CC=clang -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -mlinker-version=$(LD64_VERSION) -B$(build_prefix)/bin +darwin_CXX=clang++ -target $(host) -mmacosx-version-min=$(OSX_MIN_VERSION) --sysroot $(OSX_SDK) -stdlib=libc++ -mlinker-version=$(LD64_VERSION) -B$(build_prefix)/bin -nostdinc++ -isystem $(OSX_SDK)/usr/include/c++/v1 + +darwin_CFLAGS=-pipe +darwin_CXXFLAGS=$(darwin_CFLAGS) + +darwin_release_CFLAGS=-O3 +darwin_release_CXXFLAGS=$(darwin_release_CFLAGS) + +darwin_debug_CFLAGS=-O0 +darwin_debug_CXXFLAGS=$(darwin_debug_CFLAGS) + +darwin_native_binutils=native_cctools +darwin_native_toolchain=native_cctools +darwin_cmake_system=Darwin diff --git a/depends/hosts/default.mk b/depends/hosts/default.mk new file mode 100644 index 000000000..ec9ca3e63 --- /dev/null +++ b/depends/hosts/default.mk @@ -0,0 +1,45 @@ +# Flag explanations: +# +# -B$(build_prefix)/bin +# +# Explicitly point to our binaries (e.g. cctools) so that they are +# ensured to be found and preferred over other possibilities. +# +default_host_CC = clang -target $(host) -B$(build_prefix)/bin +default_host_CXX = clang++ -target $(host) -B$(build_prefix)/bin -stdlib=libc++ +default_host_AR = llvm-ar +default_host_RANLIB = llvm-ranlib +default_host_STRIP = llvm-strip +default_host_LIBTOOL = $(host_toolchain)libtool +default_host_INSTALL_NAME_TOOL = $(host_toolchain)install_name_tool +default_host_OTOOL = $(host_toolchain)otool +default_host_NM = llvm-nm + +$(host_os)_native_binutils?=native_clang +$(host_os)_native_toolchain?=native_clang + +define add_host_tool_func +ifneq ($(filter $(origin $1),undefined default),) +# Do not consider the well-known var $1 if it is undefined or is taking a value +# that is predefined by "make" (e.g. the make variable "CC" has a predefined +# value of "cc") +$(host_os)_$1?=$$(default_host_$1) +$(host_arch)_$(host_os)_$1?=$$($(host_os)_$1) +$(host_arch)_$(host_os)_$(release_type)_$1?=$$($(host_os)_$1) +else +$(host_os)_$1=$(or $($1),$($(host_os)_$1),$(default_host_$1)) +$(host_arch)_$(host_os)_$1=$(or $($1),$($(host_arch)_$(host_os)_$1),$$($(host_os)_$1)) +$(host_arch)_$(host_os)_$(release_type)_$1=$(or $($1),$($(host_arch)_$(host_os)_$(release_type)_$1),$$($(host_os)_$1)) +endif +host_$1=$$($(host_arch)_$(host_os)_$1) +endef + +define add_host_flags_func +$(host_arch)_$(host_os)_$1 += $($(host_os)_$1) +$(host_arch)_$(host_os)_$(release_type)_$1 += $($(host_os)_$(release_type)_$1) +host_$1 = $$($(host_arch)_$(host_os)_$1) +host_$(release_type)_$1 = $$($(host_arch)_$(host_os)_$(release_type)_$1) +endef + +$(foreach tool,CC CXX AR RANLIB STRIP NM LIBTOOL OTOOL INSTALL_NAME_TOOL,$(eval $(call add_host_tool_func,$(tool)))) +$(foreach flags,CFLAGS CXXFLAGS CPPFLAGS LDFLAGS, $(eval $(call add_host_flags_func,$(flags)))) diff --git a/depends/hosts/freebsd.mk b/depends/hosts/freebsd.mk new file mode 100644 index 000000000..8bf336ac8 --- /dev/null +++ b/depends/hosts/freebsd.mk @@ -0,0 +1,22 @@ +freebsd_CFLAGS=-pipe +freebsd_CXXFLAGS=$(freebsd_CFLAGS) + +freebsd_release_CFLAGS=-O3 +freebsd_release_CXXFLAGS=$(freebsd_release_CFLAGS) + +freebsd_debug_CFLAGS=-O0 +freebsd_debug_CXXFLAGS=$(freebsd_debug_CFLAGS) + +freebsd_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC + +# Changes below have not been tested. If you try to build on FreeBSD, +# please let us know how it goes. + +freebsd_LDFLAGS?=-fuse-ld=lld + +i686_freebsd_CC=$(default_host_CC) -m32 +i686_freebsd_CXX=$(default_host_CXX) -m32 +x86_64_freebsd_CC=$(default_host_CC) -m64 +x86_64_freebsd_CXX=$(default_host_CXX) -m64 + +freebsd_cmake_system=FreeBSD diff --git a/depends/hosts/linux.mk b/depends/hosts/linux.mk new file mode 100644 index 000000000..cf136d777 --- /dev/null +++ b/depends/hosts/linux.mk @@ -0,0 +1,26 @@ +linux_CFLAGS=-pipe +linux_CXXFLAGS=$(linux_CFLAGS) + +linux_release_CFLAGS=-O3 +linux_release_CXXFLAGS=$(linux_release_CFLAGS) + +linux_debug_CFLAGS=-O0 +linux_debug_CXXFLAGS=$(linux_debug_CFLAGS) + +linux_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC + +linux_LDFLAGS?=-fuse-ld=lld + +i686_linux_CC=$(default_host_CC) -m32 +i686_linux_CXX=$(default_host_CXX) -m32 +x86_64_linux_CC=$(default_host_CC) -m64 +x86_64_linux_CXX=$(default_host_CXX) -m64 + +# Clang doesn't appear to find these multilib paths by default, +# so help it out if we are cross-compiling. +ifneq ($(canonical_host),$(build)) + # CFLAGS is copied to CXXFLAGS after it is fully-evaluated. + linux_CFLAGS += -idirafter /usr/$(host)/include + linux_LDFLAGS += -L/usr/$(host)/lib +endif +linux_cmake_system=Linux diff --git a/depends/hosts/mingw32.mk b/depends/hosts/mingw32.mk new file mode 100644 index 000000000..cf93b7aa1 --- /dev/null +++ b/depends/hosts/mingw32.mk @@ -0,0 +1,15 @@ +mingw32_CFLAGS=-pipe +mingw32_CXXFLAGS=$(mingw32_CFLAGS) -isystem $(host_prefix)/include/c++/v1 + +mingw32_LDFLAGS?=-fuse-ld=lld +mingw32_LDFLAGS+=-L/usr/lib/gcc/x86_64-w64-mingw32/$(shell x86_64-w64-mingw32-g++-posix -dumpversion) + +mingw32_release_CFLAGS=-O3 +mingw32_release_CXXFLAGS=$(mingw32_release_CFLAGS) + +mingw32_debug_CFLAGS=-O0 +mingw32_debug_CXXFLAGS=$(mingw32_debug_CFLAGS) + +mingw32_debug_CPPFLAGS=-D_GLIBCXX_DEBUG -D_GLIBCXX_DEBUG_PEDANTIC + +mingw_cmake_system=Windows diff --git a/depends/packages.md b/depends/packages.md new file mode 100644 index 000000000..14bb8f3d9 --- /dev/null +++ b/depends/packages.md @@ -0,0 +1,186 @@ +Each recipe consists of 3 main parts: defining identifiers, setting build +variables, and defining build commands. + +The package "mylib" will be used here as an example + +General tips: +- mylib_foo is written as $(package)_foo in order to make recipes more similar. +- Secondary dependency packages relative to the Zcash binaries/libraries (i.e. + those not in `ALLOWED_LIBRARIES` in `contrib/devtools/symbol-check.py`) should + be built statically. See [below](#secondary-dependencies) for more details. + +## Identifiers +Each package is required to define at least these variables: + + $(package)_version: + Version of the upstream library or program. If there is no version, a + placeholder such as 1.0 can be used. + + $(package)_download_path: + Location of the upstream source, without the file-name. Usually http, https + or ftp. Secure transmission options like https should be preferred if + available. + + $(package)_file_name: + The upstream source filename available at the download path. + + $(package)_sha256_hash: + The sha256 hash of the upstream file + +These variables are optional: + + $(package)_build_subdir: + cd to this dir before running configure/build/stage commands. + + $(package)_download_file: + The file-name of the upstream source if it differs from how it should be + stored locally. This can be used to avoid storing file-names with strange + characters. + + $(package)_dependencies: + Names of any other packages that this one depends on. + + $(package)_patches: + Filenames of any patches needed to build the package + + $(package)_extra_sources: + Any extra files that will be fetched via $(package)_fetch_cmds. These are + specified so that they can be fetched and verified via 'make download'. + + +## Build Variables: +After defining the main identifiers, build variables may be added or customized +before running the build commands. They should be added to a function called +$(package)_set_vars. For example: + + define $(package)_set_vars + ... + endef + +Most variables can be prefixed with the host, architecture, or both, to make +the modifications specific to that case. For example: + + Universal: $(package)_cc=gcc + Linux only: $(package)_linux_cc=gcc + x86_64 only: $(package)_x86_64_cc = gcc + x86_64 linux only: $(package)_x86_64_linux_cc = gcc + +These variables may be set to override or append their default values. + + $(package)_cc + $(package)_cxx + $(package)_objc + $(package)_objcxx + $(package)_ar + $(package)_ranlib + $(package)_libtool + $(package)_nm + $(package)_cflags + $(package)_cxxflags + $(package)_ldflags + $(package)_cppflags + $(package)_config_env + $(package)_build_env + $(package)_stage_env + $(package)_build_opts + $(package)_config_opts + +The *_env variables are used to add environment variables to the respective +commands. + +Many variables respect a debug/release suffix as well, in order to use them for +only the appropriate build config. For example: + + $(package)_cflags_release = -O3 + $(package)_cflags_i686_debug = -g + $(package)_config_opts_release = --disable-debug + +These will be used in addition to the options that do not specify +debug/release. All builds are considered to be release unless DEBUG=1 is set by +the user. Other variables may be defined as needed. + +## Build commands: + + For each build, a unique build dir and staging dir are created. For example, + `work/build/mylib/1.0-1adac830f6e` and `work/staging/mylib/1.0-1adac830f6e`. + + The following build commands are available for each recipe: + + $(package)_fetch_cmds: + Runs from: build dir + Fetch the source file. If undefined, it will be fetched and verified + against its hash. + + $(package)_extract_cmds: + Runs from: build dir + Verify the source file against its hash and extract it. If undefined, the + source is assumed to be a tarball. + + $(package)_preprocess_cmds: + Runs from: build dir/$(package)_build_subdir + Preprocess the source as necessary. If undefined, does nothing. + + $(package)_config_cmds: + Runs from: build dir/$(package)_build_subdir + Configure the source. If undefined, does nothing. + + $(package)_build_cmds: + Runs from: build dir/$(package)_build_subdir + Build the source. If undefined, does nothing. + + $(package)_stage_cmds: + Runs from: build dir/$(package)_build_subdir + Stage the build results. If undefined, does nothing. + + The following variables are available for each recipe: + + $(1)_staging_dir: package's destination sysroot path + $(1)_staging_prefix_dir: prefix path inside of the package's staging dir + $(1)_extract_dir: path to the package's extracted sources + $(1)_build_dir: path where configure/build/stage commands will be run + $(1)_patch_dir: path where the package's patches (if any) are found + +Notes on build commands: + +For packages built with autotools, $($(package)_autoconf) can be used in the +configure step to (usually) correctly configure automatically. Any +$($(package)_config_opts) will be appended. + +Most autotools projects can be properly staged using: + + $(MAKE) DESTDIR=$($(package)_staging_dir) install + +## Build outputs: + +In general, the output of a depends package should not contain any libtool +archives. Instead, the package should output `.pc` (`pkg-config`) files where +possible. + +From the [Gentoo Wiki entry](https://wiki.gentoo.org/wiki/Project:Quality_Assurance/Handling_Libtool_Archives): + +> Libtool pulls in all direct and indirect dependencies into the .la files it +> creates. This leads to massive overlinking, which is toxic to the Gentoo +> ecosystem, as it leads to a massive number of unnecessary rebuilds. + +## Secondary dependencies: + +Secondary dependency packages relative to the Zcash binaries/libraries (i.e. +those not in `ALLOWED_LIBRARIES` in `contrib/devtools/symbol-check.py`) +should be built statically. The arguments for statically linking secondary +dependencies are similar to those for primary dependencies: it is preferable +for promptness of security updates; consensus compatibility; ease of +debugging and reproduction of user issues; avoiding unintended breakage +due to incompatible changes; and portability across OS distributions. It also +improves general build reliability as illustrated by the following example: + +When linking an executable against a shared library `libprimary` that has its +own shared dependency `libsecondary`, we may need to specify the path to +`libsecondary` on the link command using the `-rpath/-rpath-link` options, it is +not sufficient to just say `libprimary`. + +For us, it's much easier to just link a static `libsecondary` into a shared +`libprimary`. Especially because in our case, we are linking against a dummy +`libprimary` anyway that we'll throw away. We don't care if the end-user has a +static or dynamic `libseconday`, that's not our concern. With a static +`libseconday`, when we need to link `libprimary` into our executable, there's no +dependency chain to worry about as `libprimary` has all the symbols. diff --git a/depends/packages/bdb.mk b/depends/packages/bdb.mk new file mode 100644 index 000000000..a0c0bef6c --- /dev/null +++ b/depends/packages/bdb.mk @@ -0,0 +1,64 @@ +package=bdb +$(package)_version=6.2.23 +$(package)_download_path=https://download.oracle.com/berkeley-db +$(package)_file_name=db-$($(package)_version).tar.gz +$(package)_sha256_hash=47612c8991aa9ac2f6be721267c8d3cdccf5ac83105df8e50809daea24e95dc7 +$(package)_build_subdir=build_unix +$(package)_patches=clang-12-stpcpy-issue.diff winioctl-and-atomic_init_db.patch + +ifneq ($(host_os),darwin) +$(package)_dependencies=libcxx +endif + +define $(package)_set_vars +$(package)_config_opts=--disable-shared --enable-cxx --disable-replication --enable-option-checking +$(package)_config_opts_mingw32=--enable-mingw +$(package)_config_opts_linux=--with-pic +$(package)_config_opts_freebsd=--with-pic +ifneq ($(build_os),darwin) +$(package)_config_opts_darwin=--disable-atomicsupport +endif +$(package)_config_opts_aarch64=--disable-atomicsupport +$(package)_cxxflags+=-std=c++17 + +ifeq ($(host_os),freebsd) + $(package)_ldflags+=-static-libstdc++ -lcxxrt +else + $(package)_ldflags+=-static-libstdc++ -lc++abi +endif + +endef + +define $(package)_preprocess_cmds + patch -p1 <$($(package)_patch_dir)/clang-12-stpcpy-issue.diff && \ + patch -p1 <$($(package)_patch_dir)/winioctl-and-atomic_init_db.patch +endef + +define $(package)_config_cmds + ../dist/$($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) libdb_cxx-6.2.a libdb-6.2.a +endef + +ifneq ($(build_os),darwin) +# Install the BDB utilities as well, so that we have the specific compatible +# versions for recovery purposes (https://github.com/zcash/zcash/issues/4537). +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + cd $(BASEDIR)/../zcutil && \ + mkdir -p bin && \ + mv -f $($(package)_staging_dir)$(host_prefix)/bin/db_* bin +endef +else +# The BDB utilities silently fail to link on native macOS, causing the rest of +# the install to fail due to missing binaries. Until we can figure out how to +# make them work, avoid building them. +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install_lib install_include +endef +endif diff --git a/depends/packages/boost.mk b/depends/packages/boost.mk new file mode 100644 index 000000000..5b74d7156 --- /dev/null +++ b/depends/packages/boost.mk @@ -0,0 +1,66 @@ +package=boost +$(package)_version=1_82_0 +$(package)_download_path=https://boostorg.jfrog.io/artifactory/main/release/$(subst _,.,$($(package)_version))/source/ +$(package)_file_name=boost_$($(package)_version).tar.bz2 +$(package)_sha256_hash=a6e1ab9b0860e6a2881dd7b21fe9f737a095e5f33a3a874afc6a345228597ee6 +$(package)_dependencies=native_b2 + +ifneq ($(host_os),darwin) +$(package)_dependencies+=libcxx +endif + +define $(package)_set_vars +$(package)_config_opts_release=variant=release +$(package)_config_opts_debug=variant=debug +$(package)_config_opts=--layout=system --user-config=user-config.jam +$(package)_config_opts+=threading=multi link=static -sNO_COMPRESSION=1 +$(package)_config_opts_linux=target-os=linux threadapi=pthread runtime-link=shared +$(package)_config_opts_freebsd=cxxflags=-fPIC +$(package)_config_opts_darwin=target-os=darwin runtime-link=shared +$(package)_config_opts_mingw32=target-os=windows binary-format=pe threadapi=win32 runtime-link=static +$(package)_config_opts_x86_64=architecture=x86 address-model=64 +$(package)_config_opts_i686=architecture=x86 address-model=32 +$(package)_config_opts_aarch64=address-model=64 +$(package)_config_opts_armv7a=address-model=32 +ifneq (,$(findstring clang,$($(package)_cxx))) +$(package)_toolset_$(host_os)=clang +else +$(package)_toolset_$(host_os)=gcc +endif +$(package)_config_libraries=chrono,filesystem,program_options,system,thread,test +$(package)_cxxflags+=-std=c++17 -fvisibility=hidden +$(package)_cxxflags_linux=-fPIC +$(package)_cxxflags_freebsd=-fPIC + +ifeq ($(host_os),freebsd) + $(package)_ldflags+=-static-libstdc++ -lcxxrt +else + $(package)_ldflags+=-static-libstdc++ -lc++abi +endif + +endef + +define $(package)_preprocess_cmds + echo "using $($(package)_toolset_$(host_os)) : : $($(package)_cxx) : \"$($(package)_cflags)\" \"$($(package)_cxxflags)\" \"$($(package)_cppflags)\" \"$($(package)_ldflags)\" \"$($(package)_ar)\" \"$(host_STRIP)\" \"$(host_RANLIB)\" \"$(host_WINDRES)\" : ;" > user-config.jam +endef + +define $(package)_config_cmds + ./bootstrap.sh --without-icu --with-libraries=$($(package)_config_libraries) --with-toolset=$($(package)_toolset_$(host_os)) --with-bjam=b2 --libdir=lib +endef + +define $(package)_build_cmds + b2 -d2 -j2 -d1 --prefix=$($(package)_staging_prefix_dir) $($(package)_config_opts) toolset=$($(package)_toolset_$(host_os)) stage +endef + +define $(package)_stage_cmds + b2 -d0 -j4 --prefix=$($(package)_staging_prefix_dir) $($(package)_config_opts) toolset=$($(package)_toolset_$(host_os)) install +endef + +# Boost uses the MSVC convention of libboost_foo.lib as the naming pattern when +# compiling for Windows, even though we use MinGW which follows the libfoo.a +# convention. This causes issues with lld, so we rename all .lib files to .a. +ifeq ($(host_os),mingw32) +define $(package)_postprocess_cmds + for f in lib/*.lib; do mv -- "$$$$f" "$$$${f%.lib}.a"; done +endef +endif diff --git a/depends/packages/googletest.mk b/depends/packages/googletest.mk new file mode 100644 index 000000000..7d5357e89 --- /dev/null +++ b/depends/packages/googletest.mk @@ -0,0 +1,41 @@ +package=googletest +$(package)_version=1.12.1 +$(package)_download_path=https://github.com/google/$(package)/archive/refs/tags +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_download_file=release-$($(package)_version).tar.gz +$(package)_sha256_hash=81964fe578e9bd7c94dfdb09c8e4d6e6759e19967e397dbea48d1c10e45d0df2 +$(package)_build_subdir=build +$(package)_dependencies=native_cmake + +ifneq ($(host_os),darwin) +$(package)_dependencies+=libcxx +endif + +define $(package)_set_vars +$(package)_cxxflags+=-std=c++17 +$(package)_cxxflags_linux=-fPIC +$(package)_cxxflags_freebsd=-fPIC + +ifeq ($(host_os),freebsd) + $(package)_ldflags+=-static-libstdc++ -lcxxrt +else + $(package)_ldflags+=-static-libstdc++ -lc++abi +endif + +endef + +define $(package)_preprocess_cmds + mkdir build +endef + +define $(package)_config_cmds + $($(package)_cmake) .. +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/libcxx.mk b/depends/packages/libcxx.mk new file mode 100644 index 000000000..7c5d6b4b2 --- /dev/null +++ b/depends/packages/libcxx.mk @@ -0,0 +1,61 @@ +package=libcxx +$(package)_version=$(if $(native_clang_version_$(host_arch)_$(host_os)),$(native_clang_version_$(host_arch)_$(host_os)),$(if $(native_clang_version_$(host_os)),$(native_clang_version_$(host_os)),$(native_clang_default_version))) +$(package)_msys2_version=15.0.7-3 + +ifneq ($(canonical_host),$(build)) +ifneq ($(host_os),mingw32) +# Clang is provided pre-compiled for a bunch of targets; fetch the one we need +# and stage its copies of the static libraries. +$(package)_download_path=$(native_clang_download_path) +$(package)_download_file_aarch64_linux=clang+llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz +$(package)_file_name_aarch64_linux=clang-llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz +$(package)_sha256_hash_aarch64_linux=8ca4d68cf103da8331ca3f35fe23d940c1b78fb7f0d4763c1c059e352f5d1bec +$(package)_download_file_linux=clang+llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-18.04.tar.xz +$(package)_file_name_linux=clang-llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-18.04.tar.xz +$(package)_sha256_hash_linux=38bc7f5563642e73e69ac5626724e206d6d539fbef653541b34cae0ba9c3f036 + +# Starting from LLVM 14.0.0, some Clang binary tarballs store libc++ in a +# target-specific subdirectory. +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/lib && \ + (test ! -f lib/*/libc++.a || cp lib/*/libc++.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f lib/*/libc++abi.a || cp lib/*/libc++abi.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f lib/libc++.a || cp lib/libc++.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f lib/libc++abi.a || cp lib/libc++abi.a $($(package)_staging_prefix_dir)/lib) +endef + +else +# For Windows cross-compilation, use the MSYS2 binaries. +# Starting from LLVM 15.0.0, libc++abi is provided by libc++. +$(package)_download_path=https://repo.msys2.org/mingw/x86_64 +$(package)_download_file=mingw-w64-x86_64-libc++-$($(package)_msys2_version)-any.pkg.tar.zst +$(package)_file_name=mingw-w64-x86_64-libcxx-$($(package)_msys2_version)-any.pkg.tar.zst +$(package)_sha256_hash=8c14da21fa9622cc7450b22467452c6c933a03cee526cf8744faea3d4674035b + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/lib && \ + mv include/ $($(package)_staging_prefix_dir) && \ + cp lib/libc++.a $($(package)_staging_prefix_dir)/lib && \ + cp lib/libc++abi.a $($(package)_staging_prefix_dir)/lib +endef +endif + +else +# For native compilation, use the static libraries from native_clang. +# We explicitly stage them so that subsequent dependencies don't link to the +# shared libraries distributed with Clang. +define $(package)_fetch_cmds +endef + +define $(package)_extract_cmds +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/lib && \ + (test ! -f $(build_prefix)/lib/*/libc++.a || cp $(build_prefix)/lib/*/libc++.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f $(build_prefix)/lib/*/libc++abi.a || cp $(build_prefix)/lib/*/libc++abi.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f $(build_prefix)/lib/libc++.a || cp $(build_prefix)/lib/libc++.a $($(package)_staging_prefix_dir)/lib) && \ + (test ! -f $(build_prefix)/lib/libc++abi.a || cp $(build_prefix)/lib/libc++abi.a $($(package)_staging_prefix_dir)/lib) +endef + +endif diff --git a/depends/packages/libevent.mk b/depends/packages/libevent.mk new file mode 100644 index 000000000..e2d1d9d34 --- /dev/null +++ b/depends/packages/libevent.mk @@ -0,0 +1,40 @@ +package=libevent +$(package)_version=2.1.12 +$(package)_download_path=https://github.com/libevent/libevent/archive/refs/tags +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_download_file=release-$($(package)_version)-stable.tar.gz +$(package)_sha256_hash=7180a979aaa7000e1264da484f712d403fcf7679b1e9212c4e3d09f5c93efc24 +$(package)_patches=0001-fix-windows-getaddrinfo.patch + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/0001-fix-windows-getaddrinfo.patch && \ + ./autogen.sh +endef + +# When building for Windows, we set _WIN32_WINNT to target the same Windows +# version as we do in configure. Due to quirks in libevents build system, this +# is also required to enable support for ipv6. See #19375. +define $(package)_set_vars + $(package)_config_opts=--disable-shared --disable-openssl --disable-libevent-regress + $(package)_config_opts += --disable-dependency-tracking --enable-option-checking + $(package)_config_opts_release=--disable-debug-mode + $(package)_config_opts_linux=--with-pic + $(package)_config_opts_freebsd=--with-pic + $(package)_cppflags_mingw32=-D_WIN32_WINNT=0x0601 +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm lib/*.la +endef diff --git a/depends/packages/libsodium.mk b/depends/packages/libsodium.mk new file mode 100644 index 000000000..332072577 --- /dev/null +++ b/depends/packages/libsodium.mk @@ -0,0 +1,26 @@ +package=libsodium +$(package)_version=1.0.18 +$(package)_download_path=https://download.libsodium.org/libsodium/releases/ +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=6f504490b342a4f8a4c4a02fc9b866cbef8622d5df4e5452b46be121e46636c1 +$(package)_dependencies= +$(package)_patches=1.0.15-pubkey-validation.diff 1.0.15-signature-validation.diff +$(package)_config_opts= + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/1.0.15-pubkey-validation.diff && \ + patch -p1 < $($(package)_patch_dir)/1.0.15-signature-validation.diff && \ + cd $($(package)_build_subdir); DO_NOT_UPDATE_CONFIG_SCRIPTS=1 ./autogen.sh +endef + +define $(package)_config_cmds + $($(package)_autoconf) --enable-static --disable-shared +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/native_b2.mk b/depends/packages/native_b2.mk new file mode 100644 index 000000000..aaa37cdcf --- /dev/null +++ b/depends/packages/native_b2.mk @@ -0,0 +1,20 @@ +package=native_b2 +$(package)_version=$(boost_version) +$(package)_download_path=$(boost_download_path) +$(package)_file_name=$(boost_file_name) +$(package)_sha256_hash=$(boost_sha256_hash) +$(package)_build_subdir=tools/build/src/engine +ifneq (,$(findstring clang,$($(package)_cxx))) +$(package)_toolset_$(host_os)=clang +else +$(package)_toolset_$(host_os)=gcc +endif + +define $(package)_build_cmds + CXX="$($(package)_cxx)" CXXFLAGS="$($(package)_cxxflags)" ./build.sh "$($(package)_toolset_$(host_os))" +endef + +define $(package)_stage_cmds + mkdir -p "$($(package)_staging_prefix_dir)"/bin/ && \ + cp b2 "$($(package)_staging_prefix_dir)"/bin/ +endef diff --git a/depends/packages/native_ccache.mk b/depends/packages/native_ccache.mk new file mode 100644 index 000000000..39db51f8e --- /dev/null +++ b/depends/packages/native_ccache.mk @@ -0,0 +1,33 @@ +package=native_ccache +$(package)_version=4.6.3 +$(package)_download_path=https://github.com/ccache/ccache/releases/download/v$($(package)_version) +$(package)_file_name=ccache-$($(package)_version).tar.gz +$(package)_sha256_hash=f46ba3706ad80c30d4d5874dee2bf9227a7fcd0ccaac31b51919a3053d84bd05 +$(package)_build_subdir=build +$(package)_dependencies=native_cmake native_zstd + +define $(package)_set_vars +$(package)_config_opts += -DCMAKE_BUILD_TYPE=Release +$(package)_config_opts += -DZSTD_LIBRARY=$(build_prefix)/lib/libzstd.a +$(package)_config_opts += -DREDIS_STORAGE_BACKEND=OFF +endef + +define $(package)_preprocess_cmds + mkdir $($(package)_build_subdir) +endef + +define $(package)_config_cmds + $($(package)_cmake) .. $($(package)_config_opts) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef + +define $(package)_postprocess_cmds + rm -rf lib include +endef diff --git a/depends/packages/native_cctools.mk b/depends/packages/native_cctools.mk new file mode 100644 index 000000000..95052ad78 --- /dev/null +++ b/depends/packages/native_cctools.mk @@ -0,0 +1,63 @@ +package=native_cctools +$(package)_version=55562e4073dea0fbfd0b20e0bf69ffe6390c7f97 +$(package)_download_path=https://github.com/tpoechtrager/cctools-port/archive +$(package)_download_file=$($(package)_version).tar.gz +$(package)_file_name=$(package)_$($(package)_version).tar.gz +$(package)_sha256_hash=e51995a843533a3dac155dd0c71362dd471597a2d23f13dff194c6285362f875 +$(package)_build_subdir=cctools +$(package)_dependencies=native_clang +$(package)_patches=ignore-otool.diff + +$(package)_libtapi_version=3efb201881e7a76a21e0554906cf306432539cef +$(package)_libtapi_download_path=https://github.com/tpoechtrager/apple-libtapi/archive +$(package)_libtapi_download_file=$($(package)_libtapi_version).tar.gz +$(package)_libtapi_file_name=$(package)_libtapi_$($(package)_libtapi_version).tar.gz +$(package)_libtapi_sha256_hash=380c1ca37cfa04a8699d0887a8d3ee1ad27f3d08baba78887c73b09485c0fbd3 + +$(package)_extra_sources += $($(package)_libtapi_file_name) + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_libtapi_download_path),$($(package)_libtapi_download_file),$($(package)_libtapi_file_name),$($(package)_libtapi_sha256_hash)) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_libtapi_sha256_hash) $($(package)_source_dir)/$($(package)_libtapi_file_name)" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir -p libtapi && \ + tar --no-same-owner --strip-components=1 -C libtapi -xf $($(package)_source_dir)/$($(package)_libtapi_file_name) && \ + tar --no-same-owner --strip-components=1 -xf $($(package)_source) +endef + +define $(package)_set_vars + $(package)_config_opts=--target=$(host) --with-libtapi=$($(package)_extract_dir) + $(package)_ldflags+=-Wl,-rpath=\\$$$$$$$$\$$$$$$$$ORIGIN/../lib + $(package)_config_opts+=--enable-lto-support --with-llvm-config=$(build_prefix)/bin/llvm-config + $(package)_cc=$(build_prefix)/bin/clang + $(package)_cxx=$(build_prefix)/bin/clang++ +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/ignore-otool.diff && \ + cd $($(package)_build_subdir); DO_NOT_UPDATE_CONFIG_SCRIPTS=1 ./autogen.sh +endef + +define $(package)_config_cmds + rm -f $(build_prefix)/lib/libc++abi.so* && \ + CC=$($(package)_cc) CXX=$($(package)_cxx) INSTALLPREFIX=$($(package)_extract_dir) ../libtapi/build.sh && \ + CC=$($(package)_cc) CXX=$($(package)_cxx) INSTALLPREFIX=$($(package)_extract_dir) ../libtapi/install.sh && \ + $($(package)_config_env) $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install && \ + mkdir -p $($(package)_staging_prefix_dir)/lib/ && \ + cd $($(package)_extract_dir) && \ + cp lib/libtapi.so.6 $($(package)_staging_prefix_dir)/lib/ +endef diff --git a/depends/packages/native_clang.mk b/depends/packages/native_clang.mk new file mode 100644 index 000000000..4cd197ebe --- /dev/null +++ b/depends/packages/native_clang.mk @@ -0,0 +1,77 @@ +package=native_clang +# To update the Clang compiler: +# - Change the versions below, and the MSYS2 version in libcxx.mk +# - Run the script ./contrib/devtools/update-clang-hashes.sh +# - Manually fix the versions for packages that don't exist (the LLVM project +# doesn't uniformly cut binaries across releases). +# The Clang compiler should use the same LLVM version as the Rust compiler. +$(package)_default_major_version=15 +$(package)_default_version=15.0.6 +$(package)_version_darwin=15.0.4 +# 2023-02-16: No FreeBSD packages are available for Clang 15. +# 2023-04-07: Still the case. +$(package)_major_version_freebsd=14 +$(package)_version_freebsd=14.0.6 + +# Tolerate split LLVM versions. If an LLVM build is not available for a Tier 3 +# platform, we permit an older LLVM version to be used. This means the version +# of LLVM used in Clang and Rust will differ on these platforms, preventing LTO +# from working. +$(package)_version=$(if $($(package)_version_$(host_arch)_$(host_os)),$($(package)_version_$(host_arch)_$(host_os)),$(if $($(package)_version_$(host_os)),$($(package)_version_$(host_os)),$($(package)_default_version))) +$(package)_major_version=$(if $($(package)_major_version_$(host_arch)_$(host_os)),$($(package)_major_version_$(host_arch)_$(host_os)),$(if $($(package)_major_version_$(host_os)),$($(package)_major_version_$(host_os)),$($(package)_default_major_version))) + +$(package)_download_path_linux=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version) +$(package)_download_file_linux=clang+llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-18.04.tar.xz +$(package)_file_name_linux=clang-llvm-$($(package)_version)-x86_64-linux-gnu-ubuntu-18.04.tar.xz +$(package)_sha256_hash_linux=38bc7f5563642e73e69ac5626724e206d6d539fbef653541b34cae0ba9c3f036 +$(package)_download_path_darwin=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version) +$(package)_download_file_darwin=clang+llvm-$($(package)_version)-x86_64-apple-darwin.tar.xz +$(package)_file_name_darwin=clang-llvm-$($(package)_version)-x86_64-apple-darwin.tar.xz +$(package)_sha256_hash_darwin=4c98d891c07c8f6661b233bf6652981f28432cfdbd6f07181114195c3536544b +$(package)_download_path_freebsd=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version) +$(package)_download_file_freebsd=clang+llvm-$($(package)_version)-amd64-unknown-freebsd12.tar.xz +$(package)_file_name_freebsd=clang-llvm-$($(package)_version)-amd64-unknown-freebsd12.tar.xz +$(package)_sha256_hash_freebsd=b0a7b86dacb12afb8dd2ca99ea1b894d9cce84aab7711cb1964b3005dfb09af3 +$(package)_download_path_aarch64_linux=https://github.com/llvm/llvm-project/releases/download/llvmorg-$($(package)_version) +$(package)_download_file_aarch64_linux=clang+llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz +$(package)_file_name_aarch64_linux=clang-llvm-$($(package)_version)-aarch64-linux-gnu.tar.xz +$(package)_sha256_hash_aarch64_linux=8ca4d68cf103da8331ca3f35fe23d940c1b78fb7f0d4763c1c059e352f5d1bec + +ifneq (,$(wildcard /etc/arch-release)) +$(package)_dependencies=native_libtinfo +endif + +# Ensure we have clang native to the builder, not the target host +ifneq ($(canonical_host),$(build)) +$(package)_exact_download_path=$($(package)_download_path_$(build_os)) +$(package)_exact_download_file=$($(package)_download_file_$(build_os)) +$(package)_exact_file_name=$($(package)_file_name_$(build_os)) +$(package)_exact_sha256_hash=$($(package)_sha256_hash_$(build_os)) +endif + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/bin && \ + rm -r include/flang && \ + rm -r include/lldb && \ + rm lib/libflang* && \ + rm lib/libFortran* && \ + rm lib/liblldb* && \ + cp bin/clang-$($(package)_major_version) $($(package)_staging_prefix_dir)/bin && \ + cp bin/lld $($(package)_staging_prefix_dir)/bin && \ + cp bin/llvm-ar $($(package)_staging_prefix_dir)/bin && \ + cp bin/llvm-config $($(package)_staging_prefix_dir)/bin && \ + cp bin/llvm-nm $($(package)_staging_prefix_dir)/bin && \ + cp bin/llvm-objcopy $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/clang $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/clang++ $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/ld.lld $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/ld64.lld $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/lld-link $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/llvm-ranlib $($(package)_staging_prefix_dir)/bin && \ + cp -P bin/llvm-strip $($(package)_staging_prefix_dir)/bin && \ + (test ! -f include/x86_64-unknown-linux-gnu/c++/v1/__config_site || \ + cp include/x86_64-unknown-linux-gnu/c++/v1/__config_site include/c++/v1/__config_site) && \ + mv include/ $($(package)_staging_prefix_dir) && \ + mv lib/ $($(package)_staging_prefix_dir) && \ + mv libexec/ $($(package)_staging_prefix_dir) +endef diff --git a/depends/packages/native_cmake.mk b/depends/packages/native_cmake.mk new file mode 100644 index 000000000..31d3756c7 --- /dev/null +++ b/depends/packages/native_cmake.mk @@ -0,0 +1,22 @@ +package=native_cmake +$(package)_version=3.26.4 +$(package)_download_path=https://github.com/Kitware/CMake/releases/download/v$($(package)_version) +$(package)_file_name=cmake-$($(package)_version).tar.gz +$(package)_sha256_hash=313b6880c291bd4fe31c0aa51d6e62659282a521e695f30d5cc0d25abbd5c208 + +define $(package)_set_vars +$(package)_config_opts += -DCMAKE_BUILD_TYPE:STRING=Release +$(package)_config_opts += -DCMAKE_USE_OPENSSL:BOOL=OFF +endef + +define $(package)_config_cmds + ./bootstrap --prefix=$($(package)_staging_prefix_dir) -- $($(package)_config_opts) +endef + +define $(package)_build_cmds + $(MAKE) cmake +endef + +define $(package)_stage_cmds + $(MAKE) install +endef diff --git a/depends/packages/native_cxxbridge.mk b/depends/packages/native_cxxbridge.mk new file mode 100644 index 000000000..3f3d902fe --- /dev/null +++ b/depends/packages/native_cxxbridge.mk @@ -0,0 +1,50 @@ +package=native_cxxbridge +# The version needs to match cxx in Cargo.toml +$(package)_version=1.0.95 +$(package)_download_path=https://github.com/dtolnay/cxx/archive/refs/tags +$(package)_file_name=native_cxxbridge-$($(package)_version).tar.gz +$(package)_download_file=$($(package)_version).tar.gz +$(package)_sha256_hash=842926be773c09b4b45d1a2d82556752d5008f1d564b1a04070ec61ef94992ea +$(package)_build_subdir=gen/cmd +$(package)_dependencies=native_rust +# This file is somewhat annoying to update, but can be done like so from the repo base: +# $ export VERSION=1.0.95 +# $ rm .cargo/config .cargo/.configured-for-offline +# $ mkdir tmp +# $ cd tmp +# $ tar xf ../depends/sources/native_cxxbridge-$VERSION.tar.gz +# $ cd cxx-$VERSION +# $ cargo check --release --package=cxxbridge-cmd --bin=cxxbridge +# $ cp Cargo.lock ../../depends/patches/native_cxxbridge/ +$(package)_patches=Cargo.lock +$(package)_extra_sources=$(package)-$($(package)_version)-vendored.tar.gz + +define $(package)_fetch_cmds +$(call fetch_file,$(1),$($(1)_download_path),$($(1)_download_file),$($(1)_file_name),$($(1)_sha256_hash)) && \ +$(call vendor_crate_deps,$(1),$($(1)_file_name),$(PATCHES_PATH)/$(1)/Cargo.lock,Cargo.toml,$(1)-$($(1)_version)-vendored.tar.gz) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + tar --no-same-owner --strip-components=1 -xf $($(package)_source) && \ + tar --no-same-owner -xf $($(package)_source_dir)/$(package)-$($(package)_version)-vendored.tar.gz +endef + +define $(package)_preprocess_cmds + cp $($(package)_patch_dir)/Cargo.lock . && \ + mkdir -p .cargo && \ + echo "[source.crates-io]" >.cargo/config && \ + echo "replace-with = \"vendored-sources\"" >>.cargo/config && \ + echo "[source.vendored-sources]" >>.cargo/config && \ + echo "directory = \"$(CRATE_REGISTRY)\"" >>.cargo/config +endef + +define $(package)_build_cmds + cargo build --locked --offline --release --package=cxxbridge-cmd --bin=cxxbridge +endef + +define $(package)_stage_cmds + cargo install --locked --offline --path=. --bin=cxxbridge --root=$($(package)_staging_prefix_dir) +endef diff --git a/depends/packages/native_libtinfo.mk b/depends/packages/native_libtinfo.mk new file mode 100644 index 000000000..d3c200660 --- /dev/null +++ b/depends/packages/native_libtinfo.mk @@ -0,0 +1,22 @@ +package=native_tinfo +$(package)_version=5.6.0 +$(package)_download_path_linux=http://ftp.debian.org/debian/pool/main/n/ncurses/ +$(package)_download_file_linux=libtinfo5_6.0+20161126-1+deb9u2_amd64.deb +$(package)_file_name_linux=libtinfo5_6.0+20161126-1+deb9u2_amd64.deb +$(package)_sha256_hash_linux=1d249a3193568b5ef785ad8993b9ba6d6fdca0eb359204c2355532b82d25e9f5 + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir -p libtinfo5 && \ + ar x --output libtinfo5 $($(package)_source_dir)/$($(package)_file_name) && \ + cd libtinfo5 && \ + tar xf data.tar.xz +endef + +define $(package)_stage_cmds + pwd && \ + mkdir -p $($(package)_staging_prefix_dir)/lib && \ + cp libtinfo5/lib/x86_64-linux-gnu/libtinfo.so.5.9 $($(package)_staging_prefix_dir)/lib/libtinfo.so.5 +endef diff --git a/depends/packages/native_rust.mk b/depends/packages/native_rust.mk new file mode 100644 index 000000000..99bc5da0f --- /dev/null +++ b/depends/packages/native_rust.mk @@ -0,0 +1,70 @@ +package=native_rust +# To update the Rust compiler, change the version below and then run the script +# ./contrib/devtools/update-rust-hashes.sh +# The Rust compiler should use the same LLVM version as the Clang compiler; you +# can check this with `rustc --version -v`. +$(package)_version=1.69.0 +$(package)_download_path=https://static.rust-lang.org/dist +$(package)_file_name_linux=rust-$($(package)_version)-x86_64-unknown-linux-gnu.tar.gz +$(package)_sha256_hash_linux=2ca4a306047c0b8b4029c382910fcbc895badc29680e0332c9df990fd1c70d4f +$(package)_file_name_darwin=rust-$($(package)_version)-x86_64-apple-darwin.tar.gz +$(package)_sha256_hash_darwin=9818dab2c3726d63dfbfde12c9273e62e484ef6d6f6e05a6431a3e089c335454 +$(package)_file_name_freebsd=rust-$($(package)_version)-x86_64-unknown-freebsd.tar.gz +$(package)_sha256_hash_freebsd=2985d98910b4a1dd336bfc7a1ac3b18082ed917cff097b4db6f0d6602016c289 +$(package)_file_name_aarch64_linux=rust-$($(package)_version)-aarch64-unknown-linux-gnu.tar.gz +$(package)_sha256_hash_aarch64_linux=88af5aa7a40c8f1b40416a1f27de8ffbe09c155d933f69d3e109c0ccee92353b + +# Mapping from GCC canonical hosts to Rust targets +# If a mapping is not present, we assume they are identical, unless $host_os is +# "darwin", in which case we assume x86_64-apple-darwin. +$(package)_rust_target_x86_64-pc-linux-gnu=x86_64-unknown-linux-gnu +$(package)_rust_target_x86_64-w64-mingw32=x86_64-pc-windows-gnu + +# Mapping from Rust targets to SHA-256 hashes +$(package)_rust_std_sha256_hash_aarch64-unknown-linux-gnu=8f42b40c0a0658ee75ce758652c9821fac7db3fbd8d20f7fb2483ec2c57ee0ac +$(package)_rust_std_sha256_hash_x86_64-apple-darwin=e44d71250dc5a238da0dc4784dad59d562862653adecd31ea52e0920b85c6a7c +$(package)_rust_std_sha256_hash_x86_64-pc-windows-gnu=09ded4a4c27c16aff9c9911640b1bdf6e1172237ce540ed4dc3e166e9438f0d7 +$(package)_rust_std_sha256_hash_x86_64-unknown-freebsd=eed4b3f3358a8887b0f6a62e021469878a8990af9b94c2fe87d3c1b0220913bb + +define rust_target +$(if $($(1)_rust_target_$(2)),$($(1)_rust_target_$(2)),$(if $(findstring darwin,$(3)),x86_64-apple-darwin,$(if $(findstring freebsd,$(3)),x86_64-unknown-freebsd,$(2)))) +endef + +define $(package)_set_vars +$(package)_stage_opts=--disable-ldconfig +$(package)_stage_build_opts=--without=rust-docs-json-preview,rust-docs +endef + +ifneq ($(canonical_host),$(build)) +$(package)_rust_target=$(call rust_target,$(package),$(canonical_host),$(host_os)) +$(package)_exact_file_name=rust-std-$($(package)_version)-$($(package)_rust_target).tar.gz +$(package)_exact_sha256_hash=$($(package)_rust_std_sha256_hash_$($(package)_rust_target)) +$(package)_build_subdir=buildos +$(package)_extra_sources=$($(package)_file_name_$(build_os)) + +define $(package)_fetch_cmds +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_download_file),$($(package)_file_name),$($(package)_sha256_hash)) && \ +$(call fetch_file,$(package),$($(package)_download_path),$($(package)_file_name_$(build_os)),$($(package)_file_name_$(build_os)),$($(package)_sha256_hash_$(build_os))) +endef + +define $(package)_extract_cmds + mkdir -p $($(package)_extract_dir) && \ + echo "$($(package)_sha256_hash) $($(package)_source)" > $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + echo "$($(package)_sha256_hash_$(build_os)) $($(package)_source_dir)/$($(package)_file_name_$(build_os))" >> $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + $(build_SHA256SUM) -c $($(package)_extract_dir)/.$($(package)_file_name).hash && \ + mkdir $(canonical_host) && \ + tar --strip-components=1 -xf $($(package)_source) -C $(canonical_host) && \ + mkdir buildos && \ + tar --strip-components=1 -xf $($(package)_source_dir)/$($(package)_file_name_$(build_os)) -C buildos +endef + +define $(package)_stage_cmds + bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) && \ + ../$(canonical_host)/install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) +endef +else + +define $(package)_stage_cmds + bash ./install.sh --destdir=$($(package)_staging_dir) --prefix=$(build_prefix) $($(package)_stage_opts) $($(package)_stage_build_opts) +endef +endif diff --git a/depends/packages/native_zstd.mk b/depends/packages/native_zstd.mk new file mode 100644 index 000000000..b8844c1f8 --- /dev/null +++ b/depends/packages/native_zstd.mk @@ -0,0 +1,35 @@ +package=native_zstd +$(package)_version=1.5.5 +$(package)_download_path=https://github.com/facebook/zstd/releases/download/v$($(package)_version) +$(package)_file_name=zstd-$($(package)_version).tar.gz +$(package)_sha256_hash=9c4396cc829cfae319a6e2615202e82aad41372073482fce286fac78646d3ee4 +$(package)_build_subdir=build/cmake +$(package)_dependencies=native_cmake + +define $(package)_set_vars +$(package)_config_opts += -DCMAKE_BUILD_TYPE=Release +$(package)_config_opts += -DCMAKE_INSTALL_LIBDIR=lib +$(package)_config_opts += -DZSTD_BUILD_CONTRIB=OFF +$(package)_config_opts += -DZSTD_BUILD_PROGRAMS=ON +$(package)_config_opts += -DZSTD_BUILD_SHARED=OFF +$(package)_config_opts += -DZSTD_BUILD_STATIC=ON +$(package)_config_opts += -DZSTD_BUILD_TESTS=OFF +$(package)_config_opts += -DZSTD_LEGACY_SUPPORT=OFF +$(package)_config_opts += -DZSTD_LZ4_SUPPORT=OFF +$(package)_config_opts += -DZSTD_LZMA_SUPPORT=OFF +$(package)_config_opts += -DZSTD_MULTITHREAD_SUPPORT=ON +$(package)_config_opts += -DZSTD_PROGRAMS_LINK_SHARED=OFF +$(package)_config_opts += -DZSTD_ZLIB_SUPPORT=OFF +endef + +define $(package)_config_cmds + $($(package)_cmake) $($(package)_config_opts) +endef + +define $(package)_build_cmds + $(MAKE) +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install +endef diff --git a/depends/packages/packages.mk b/depends/packages/packages.mk new file mode 100644 index 000000000..5e609db76 --- /dev/null +++ b/depends/packages/packages.mk @@ -0,0 +1,20 @@ +zcash_packages := libsodium rustcxx utfcpp tl_expected +packages := boost libevent zeromq $(zcash_packages) googletest +native_packages := native_clang native_ccache native_cmake native_rust native_cxxbridge native_zstd + +ifneq (,$(wildcard /etc/arch-release)) +native_packages += native_libtinfo +endif + +wallet_packages=bdb + +$(host_arch)_$(host_os)_native_packages += native_b2 + +ifneq ($(build_os),darwin) +darwin_native_packages=native_cctools +endif + +# We use a complete SDK for Darwin, which includes libc++. +ifneq ($(host_os),darwin) +packages += libcxx +endif diff --git a/depends/packages/rustcxx.mk b/depends/packages/rustcxx.mk new file mode 100644 index 000000000..6badddfea --- /dev/null +++ b/depends/packages/rustcxx.mk @@ -0,0 +1,13 @@ +package=rustcxx +$(package)_version=$(native_cxxbridge_version) +$(package)_file_name=$(native_cxxbridge_file_name) +$(package)_sha256_hash=$(native_cxxbridge_sha256_hash) + +define $(package)_fetch_cmds + $(call native_cxxbridge_fetch_cmds,native_cxxbridge) +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_prefix_dir)/include/rust && \ + cp include/cxx.h $($(package)_staging_prefix_dir)/include/rust +endef diff --git a/depends/packages/tl_expected.mk b/depends/packages/tl_expected.mk new file mode 100644 index 000000000..e09f38c4c --- /dev/null +++ b/depends/packages/tl_expected.mk @@ -0,0 +1,16 @@ +package=tl_expected +$(package)_version=96d547c03d2feab8db64c53c3744a9b4a7c8f2c5 +$(package)_download_path=https://github.com/TartanLlama/expected/archive +$(package)_download_file=$($(package)_version).tar.gz +$(package)_file_name=$(package)_$($(package)_version).tar.gz +$(package)_sha256_hash=64901df1de9a5a3737b331d3e1de146fa6ffb997017368b322c08f45c51b90a7 +$(package)_patches=remove-undefined-behaviour.diff + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/remove-undefined-behaviour.diff +endef + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_dir)$(host_prefix)/include && \ + cp -r include/tl $($(package)_staging_dir)$(host_prefix)/include +endef diff --git a/depends/packages/utfcpp.mk b/depends/packages/utfcpp.mk new file mode 100644 index 000000000..1bce168f0 --- /dev/null +++ b/depends/packages/utfcpp.mk @@ -0,0 +1,11 @@ +package=utfcpp +$(package)_version=3.2.3 +$(package)_download_path=https://github.com/nemtrif/$(package)/archive/refs/tags +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_download_file=v$($(package)_version).tar.gz +$(package)_sha256_hash=3ba9b0dbbff08767bdffe8f03b10e596ca351228862722e4c9d4d126d2865250 + +define $(package)_stage_cmds + mkdir -p $($(package)_staging_dir)$(host_prefix)/include && \ + cp -a ./source $($(package)_staging_dir)$(host_prefix)/include/utf8cpp +endef diff --git a/depends/packages/zeromq.mk b/depends/packages/zeromq.mk new file mode 100644 index 000000000..196348eee --- /dev/null +++ b/depends/packages/zeromq.mk @@ -0,0 +1,49 @@ +package=zeromq +$(package)_version=4.3.4 +$(package)_download_path=https://github.com/zeromq/libzmq/releases/download/v$($(package)_version)/ +$(package)_file_name=$(package)-$($(package)_version).tar.gz +$(package)_sha256_hash=c593001a89f5a85dd2ddf564805deb860e02471171b3f204944857336295c3e5 +$(package)_patches=windows-unused-variables.diff use-snprintf-not-sprintf.patch check_snprintf_return.patch + +ifneq ($(host_os),darwin) +$(package)_dependencies=libcxx +endif + +define $(package)_set_vars + $(package)_config_opts=--without-docs --disable-shared --disable-curve --disable-curve-keygen --disable-perf + $(package)_config_opts += --without-libgssapi_krb5 --without-pgm --without-norm --without-vmci + $(package)_config_opts += --disable-libunwind --disable-radix-tree --without-gcov --disable-dependency-tracking + $(package)_config_opts += --disable-drafts --enable-option-checking + $(package)_config_opts_linux=--with-pic + $(package)_config_opts_freebsd=--with-pic + $(package)_cxxflags+=-std=c++17 + + ifeq ($(host_os),freebsd) + $(package)_ldflags+=-static-libstdc++ -lcxxrt + else + $(package)_ldflags+=-static-libstdc++ -lc++abi + endif + +endef + +define $(package)_preprocess_cmds + patch -p1 < $($(package)_patch_dir)/windows-unused-variables.diff && \ + patch -p1 < $($(package)_patch_dir)/use-snprintf-not-sprintf.patch && \ + patch -p1 < $($(package)_patch_dir)/check_snprintf_return.patch +endef + +define $(package)_config_cmds + $($(package)_autoconf) +endef + +define $(package)_build_cmds + $(MAKE) src/libzmq.la +endef + +define $(package)_stage_cmds + $(MAKE) DESTDIR=$($(package)_staging_dir) install-libLTLIBRARIES install-includeHEADERS install-pkgconfigDATA +endef + +define $(package)_postprocess_cmds + rm -rf bin share lib/*.la +endef diff --git a/depends/patches/bdb/clang-12-stpcpy-issue.diff b/depends/patches/bdb/clang-12-stpcpy-issue.diff new file mode 100644 index 000000000..671938e0b --- /dev/null +++ b/depends/patches/bdb/clang-12-stpcpy-issue.diff @@ -0,0 +1,17 @@ +diff -ur db-6.2.23-orig/src/blob/blob_util.c db-6.2.23/src/blob/blob_util.c +--- db-6.2.23-orig/src/blob/blob_util.c 2016-03-28 20:45:53.000000000 +0100 ++++ db-6.2.23/src/blob/blob_util.c 2021-07-30 19:52:37.082811600 +0100 +@@ -544,7 +544,12 @@ + goto err; + + memset(path, 0, len); +- name_len += sprintf(path, "%s", blob_sub_dir); ++ // Clang 12 introduced an "libcall optimization" that lowers the above ++ // to stpcpy to avoid the machinery involved in parsing format strings. ++ // This causes build problems when cross-compiling to Windows with the ++ // version of mingw-w64 that Zcash supports. We haven't figured out why ++ // but in the meantime using "%s%s" inhibits the optimization. ++ name_len += sprintf(path, "%s%s", blob_sub_dir, ""); + + __blob_calculate_dirs(blob_id, path, &name_len, &depth); + diff --git a/depends/patches/bdb/winioctl-and-atomic_init_db.patch b/depends/patches/bdb/winioctl-and-atomic_init_db.patch new file mode 100644 index 000000000..788da5be4 --- /dev/null +++ b/depends/patches/bdb/winioctl-and-atomic_init_db.patch @@ -0,0 +1,136 @@ +diff --git a/src/dbinc/atomic.h b/src/dbinc/atomic.h +index e4420aa..4799b5f 100644 +--- a/src/dbinc/atomic.h ++++ b/src/dbinc/atomic.h +@@ -70,7 +70,7 @@ typedef struct { + * These have no memory barriers; the caller must include them when necessary. + */ + #define atomic_read(p) ((p)->value) +-#define atomic_init(p, val) ((p)->value = (val)) ++#define atomic_init_db(p, val) ((p)->value = (val)) + + #ifdef HAVE_ATOMIC_SUPPORT + +@@ -225,7 +225,7 @@ static inline int __atomic_compare_exchange_int( + #define atomic_dec(env, p) (--(p)->value) + #define atomic_compare_exchange(env, p, oldval, newval) \ + (DB_ASSERT(env, atomic_read(p) == (oldval)), \ +- atomic_init(p, (newval)), 1) ++ atomic_init_db(p, (newval)), 1) + #else + #define atomic_inc(env, p) __atomic_inc_int(env, p) + #define atomic_dec(env, p) __atomic_dec_int(env, p) +diff --git a/src/dbinc/win_db.h b/src/dbinc/win_db.h +index f5228f4..6e44659 100644 +--- a/src/dbinc/win_db.h ++++ b/src/dbinc/win_db.h +@@ -51,7 +51,7 @@ + #include + #include + #ifndef DB_WINCE +-#include ++#include + #endif + + #ifdef HAVE_GETADDRINFO +diff --git a/src/mp/mp_fget.c b/src/mp/mp_fget.c +index 59fe9fe..fa4ced7 100644 +--- a/src/mp/mp_fget.c ++++ b/src/mp/mp_fget.c +@@ -654,7 +654,7 @@ alloc: /* Allocate a new buffer header and data space. */ + + /* Initialize enough so we can call __memp_bhfree. */ + alloc_bhp->flags = 0; +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + #ifdef DIAGNOSTIC + if ((uintptr_t)alloc_bhp->buf & (sizeof(size_t) - 1)) { + __db_errx(env, DB_STR("3025", +@@ -969,7 +969,7 @@ alloc: /* Allocate a new buffer header and data space. */ + MVCC_MPROTECT(bhp->buf, mfp->pagesize, + PROT_READ); + +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + MUTEX_LOCK(env, alloc_bhp->mtx_buf); + alloc_bhp->priority = bhp->priority; + alloc_bhp->pgno = bhp->pgno; +diff --git a/src/mp/mp_mvcc.c b/src/mp/mp_mvcc.c +index 83c4d72..0a47202 100644 +--- a/src/mp/mp_mvcc.c ++++ b/src/mp/mp_mvcc.c +@@ -281,7 +281,7 @@ __memp_bh_freeze(dbmp, infop, hp, bhp, need_frozenp) + #else + memcpy(frozen_bhp, bhp, SSZA(BH, buf)); + #endif +- atomic_init(&frozen_bhp->ref, 0); ++ atomic_init_db(&frozen_bhp->ref, 0); + if (mutex != MUTEX_INVALID) + frozen_bhp->mtx_buf = mutex; + else if ((ret = __mutex_alloc(env, MTX_MPOOL_BH, +@@ -440,7 +440,7 @@ __memp_bh_thaw(dbmp, infop, hp, frozen_bhp, alloc_bhp) + #endif + alloc_bhp->mtx_buf = mutex; + MUTEX_LOCK(env, alloc_bhp->mtx_buf); +- atomic_init(&alloc_bhp->ref, 1); ++ atomic_init_db(&alloc_bhp->ref, 1); + F_CLR(alloc_bhp, BH_FROZEN); + } + +diff --git a/src/mp/mp_region.c b/src/mp/mp_region.c +index 4d95e4f..e97459c 100644 +--- a/src/mp/mp_region.c ++++ b/src/mp/mp_region.c +@@ -278,7 +278,7 @@ __memp_init(env, dbmp, reginfo_off, htab_buckets, max_nreg) + MTX_MPOOL_FILE_BUCKET, 0, &htab[i].mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&htab[i].hash_bucket); +- atomic_init(&htab[i].hash_page_dirty, 0); ++ atomic_init_db(&htab[i].hash_page_dirty, 0); + } + + mtx_base = mtx_prev = MUTEX_INVALID; +@@ -332,7 +332,7 @@ no_prealloc: + DB_MUTEX_SHARED, &hp->mtx_hash)) != 0) + return (ret); + SH_TAILQ_INIT(&hp->hash_bucket); +- atomic_init(&hp->hash_page_dirty, 0); ++ atomic_init_db(&hp->hash_page_dirty, 0); + #ifdef HAVE_STATISTICS + hp->hash_io_wait = 0; + hp->hash_frozen = hp->hash_thawed = hp->hash_frozen_freed = 0; +diff --git a/src/mutex/mut_method.c b/src/mutex/mut_method.c +index 72b34de..a9f9868 100644 +--- a/src/mutex/mut_method.c ++++ b/src/mutex/mut_method.c +@@ -501,7 +501,7 @@ __atomic_compare_exchange_int(env, v, oldval, newval) + MUTEX_LOCK(env, mtx); + ret = atomic_read(v) == oldval; + if (ret) +- atomic_init(v, newval); ++ atomic_init_db(v, newval); + MUTEX_UNLOCK(env, mtx); + + return (ret); +diff --git a/src/mutex/mut_tas.c b/src/mutex/mut_tas.c +index 7899c4b..d9420fa 100644 +--- a/src/mutex/mut_tas.c ++++ b/src/mutex/mut_tas.c +@@ -47,7 +47,7 @@ __db_tas_mutex_init(env, mutex, flags) + + #ifdef HAVE_SHARED_LATCHES + if (F_ISSET(mutexp, DB_MUTEX_SHARED)) +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + else + #endif + if (MUTEX_INIT(&mutexp->tas)) { +@@ -643,7 +643,7 @@ was_not_locked: + F_CLR(mutexp, DB_MUTEX_LOCKED); + /* Flush flag update before zeroing count */ + MEMBAR_EXIT(); +- atomic_init(&mutexp->sharecount, 0); ++ atomic_init_db(&mutexp->sharecount, 0); + } else { + DB_ASSERT(env, sharecount > 0); + MEMBAR_EXIT(); diff --git a/depends/patches/libevent/0001-fix-windows-getaddrinfo.patch b/depends/patches/libevent/0001-fix-windows-getaddrinfo.patch new file mode 100644 index 000000000..a98cd90bd --- /dev/null +++ b/depends/patches/libevent/0001-fix-windows-getaddrinfo.patch @@ -0,0 +1,15 @@ +diff -ur libevent-2.1.8-stable.orig/configure.ac libevent-2.1.8-stable/configure.ac +--- libevent-2.1.8-stable.orig/configure.ac 2017-01-29 17:51:00.000000000 +0000 ++++ libevent-2.1.8-stable/configure.ac 2020-03-07 01:11:16.311335005 +0000 +@@ -389,6 +389,10 @@ + #ifdef HAVE_NETDB_H + #include + #endif ++#ifdef _WIN32 ++#include ++#include ++#endif + ]], + [[ + getaddrinfo; +Only in libevent-2.1.8-stable: configure.ac~ diff --git a/depends/patches/libsodium/1.0.15-pubkey-validation.diff b/depends/patches/libsodium/1.0.15-pubkey-validation.diff new file mode 100644 index 000000000..3a9b7ea86 --- /dev/null +++ b/depends/patches/libsodium/1.0.15-pubkey-validation.diff @@ -0,0 +1,17 @@ +diff -ur libsodium-1.0.18-orig/src/libsodium/crypto_sign/ed25519/ref10/open.c libsodium-1.0.18/src/libsodium/crypto_sign/ed25519/ref10/open.c +--- libsodium-1.0.18-orig/src/libsodium/crypto_sign/ed25519/ref10/open.c 2019-05-18 16:32:11.000000000 -0400 ++++ libsodium-1.0.18/src/libsodium/crypto_sign/ed25519/ref10/open.c 2020-01-21 18:55:22.474233831 -0500 +@@ -32,8 +32,11 @@ + ge25519_has_small_order(sig) != 0) { + return -1; + } +- if (ge25519_is_canonical(pk) == 0 || +- ge25519_has_small_order(pk) != 0) { ++ unsigned char d = 0; ++ for (int i = 0; i < 32; ++i) { ++ d |= pk[i]; ++ } ++ if (d == 0) { + return -1; + } + #endif diff --git a/depends/patches/libsodium/1.0.15-signature-validation.diff b/depends/patches/libsodium/1.0.15-signature-validation.diff new file mode 100644 index 000000000..87bae480c --- /dev/null +++ b/depends/patches/libsodium/1.0.15-signature-validation.diff @@ -0,0 +1,78 @@ +diff -ur libsodium-1.0.18-orig/src/libsodium/crypto_sign/ed25519/ref10/open.c libsodium-1.0.18/src/libsodium/crypto_sign/ed25519/ref10/open.c +--- libsodium-1.0.18-orig/src/libsodium/crypto_sign/ed25519/ref10/open.c 2019-05-18 21:32:11.000000000 +0100 ++++ libsodium-1.0.18/src/libsodium/crypto_sign/ed25519/ref10/open.c 2020-02-18 00:00:08.544107613 +0000 +@@ -10,6 +10,65 @@ + #include "private/ed25519_ref10.h" + #include "utils.h" + ++#ifndef ED25519_COMPAT ++int ++_crypto_sign_ed25519_small_order(const unsigned char p[32]) ++{ ++ CRYPTO_ALIGN(16) ++ static const unsigned char blacklist[][32] = { ++ { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, ++ { 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, ++ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }, ++ { 0x26, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, ++ 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, ++ 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x05 }, ++ { 0xc7, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, ++ 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, ++ 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0x7a }, ++ { 0x13, 0xe8, 0x95, 0x8f, 0xc2, 0xb2, 0x27, 0xb0, 0x45, 0xc3, 0xf4, ++ 0x89, 0xf2, 0xef, 0x98, 0xf0, 0xd5, 0xdf, 0xac, 0x05, 0xd3, 0xc6, ++ 0x33, 0x39, 0xb1, 0x38, 0x02, 0x88, 0x6d, 0x53, 0xfc, 0x85 }, ++ { 0xb4, 0x17, 0x6a, 0x70, 0x3d, 0x4d, 0xd8, 0x4f, 0xba, 0x3c, 0x0b, ++ 0x76, 0x0d, 0x10, 0x67, 0x0f, 0x2a, 0x20, 0x53, 0xfa, 0x2c, 0x39, ++ 0xcc, 0xc6, 0x4e, 0xc7, 0xfd, 0x77, 0x92, 0xac, 0x03, 0xfa }, ++ { 0xec, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, ++ { 0xed, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, ++ { 0xee, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f }, ++ { 0xd9, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, ++ { 0xda, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff }, ++ { 0xdb, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, ++ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff } ++ }; ++ size_t i, j; ++ unsigned char c; ++ ++ for (i = 0; i < sizeof blacklist / sizeof blacklist[0]; i++) { ++ c = 0; ++ for (j = 0; j < 32; j++) { ++ c |= p[j] ^ blacklist[i][j]; ++ } ++ if (c == 0) { ++ return 1; ++ } ++ } ++ return 0; ++} ++#endif ++ + int + _crypto_sign_ed25519_verify_detached(const unsigned char *sig, + const unsigned char *m, +@@ -29,7 +88,7 @@ + } + #else + if (sc25519_is_canonical(sig + 32) == 0 || +- ge25519_has_small_order(sig) != 0) { ++ _crypto_sign_ed25519_small_order(sig) != 0) { + return -1; + } + if (ge25519_is_canonical(pk) == 0 || diff --git a/depends/patches/native_cctools/ignore-otool.diff b/depends/patches/native_cctools/ignore-otool.diff new file mode 100644 index 000000000..fdb348ede --- /dev/null +++ b/depends/patches/native_cctools/ignore-otool.diff @@ -0,0 +1,24 @@ +diff -ur cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97-orig/cctools/Makefile.am cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97/cctools/Makefile.am +--- cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97-orig/cctools/Makefile.am 2020-07-30 15:01:05.680000000 +0100 ++++ cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97/cctools/Makefile.am 2020-07-30 15:01:34.900000000 +0100 +@@ -1,7 +1,7 @@ + if ISDARWIN +-SUBDIRS=libstuff libmacho ar as misc otool efitools ld64 man ++SUBDIRS=libstuff libmacho ar as misc efitools ld64 man + else +-SUBDIRS=libobjc2 libstuff libmacho ar as misc otool efitools ld64 man ++SUBDIRS=libobjc2 libstuff libmacho ar as misc efitools ld64 man + endif + + ACLOCAL_AMFLAGS = -I m4 +diff -ur cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97-orig/cctools/configure.ac cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97/cctools/configure.ac +--- cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97-orig/cctools/configure.ac 2020-07-30 15:01:05.680000000 +0100 ++++ cctools-port-55562e4073dea0fbfd0b20e0bf69ffe6390c7f97/cctools/configure.ac 2020-07-30 15:01:47.330000000 +0100 +@@ -466,7 +466,6 @@ + AC_CONFIG_FILES([as/ppc64/Makefile]) + AC_CONFIG_FILES([man/Makefile]) + AC_CONFIG_FILES([misc/Makefile]) +-AC_CONFIG_FILES([otool/Makefile]) + AC_CONFIG_FILES([efitools/Makefile]) + AC_CONFIG_FILES([libobjc2/Makefile]) + AC_CONFIG_FILES([ld64/Makefile]) diff --git a/depends/patches/native_cxxbridge/Cargo.lock b/depends/patches/native_cxxbridge/Cargo.lock new file mode 100644 index 000000000..096c7f4b2 --- /dev/null +++ b/depends/patches/native_cxxbridge/Cargo.lock @@ -0,0 +1,423 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "anstyle" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41ed9a86bf92ae6580e0a31281f65a1b1d867c0cc68d5346e2ae128dddfa6a7d" + +[[package]] +name = "basic-toml" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0de75129aa8d0cceaf750b89013f0e08804d6ec61416da787b35ad0d7cddf1" +dependencies = [ + "serde", +] + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" +dependencies = [ + "jobserver", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "clang-ast" +version = "0.1.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02c73a606ccd8c2fe7691f15c6f9b9e2eae203f8356462fe99db91840e3fb964" +dependencies = [ + "serde", +] + +[[package]] +name = "clap" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "401a4694d2bf92537b6867d94de48c4842089645fdcdf6c71865b175d836e9c2" +dependencies = [ + "clap_builder", +] + +[[package]] +name = "clap_builder" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72394f3339a76daf211e57d4bcb374410f3965dcc606dd0e03738c7888766980" +dependencies = [ + "anstyle", + "bitflags", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_lex" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2da6da31387c7e4ef160ffab6d5e7f00c42626fe39aea70a7b0f1773f7dd6c1b" + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "crc32fast" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "cxx" +version = "1.0.95" +dependencies = [ + "cc", + "cxx-build", + "cxx-gen", + "cxx-test-suite", + "cxxbridge-flags", + "cxxbridge-macro", + "link-cplusplus", + "rustversion", + "trybuild", +] + +[[package]] +name = "cxx-build" +version = "1.0.95" +dependencies = [ + "cc", + "codespan-reporting", + "cxx", + "cxx-gen", + "once_cell", + "pkg-config", + "proc-macro2", + "quote", + "scratch", + "syn", +] + +[[package]] +name = "cxx-gen" +version = "0.7.95" +dependencies = [ + "codespan-reporting", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cxx-test-suite" +version = "0.0.0" +dependencies = [ + "cxx", + "cxx-build", + "cxxbridge-flags", +] + +[[package]] +name = "cxxbridge-cmd" +version = "1.0.95" +dependencies = [ + "clap", + "codespan-reporting", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "cxxbridge-flags" +version = "1.0.95" + +[[package]] +name = "cxxbridge-macro" +version = "1.0.95" +dependencies = [ + "clang-ast", + "cxx", + "flate2", + "memmap", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn", +] + +[[package]] +name = "demo" +version = "0.0.0" +dependencies = [ + "cxx", + "cxx-build", +] + +[[package]] +name = "dissimilar" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "210ec60ae7d710bed8683e333e9d2855a8a56a3e9892b38bad3bb0d4d29b0d5e" + +[[package]] +name = "flate2" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b9429470923de8e8cbd4d2dc513535400b4b3fef0319fb5c4e1f520a7bef743" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "itoa" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" + +[[package]] +name = "jobserver" +version = "0.1.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "936cfd212a0155903bcbc060e316fb6cc7cbf2e1907329391ebadc1fe0ce77c2" +dependencies = [ + "libc", +] + +[[package]] +name = "libc" +version = "0.2.146" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f92be4933c13fd498862a9e02a3055f8a8d9c039ce33db97306fd5a6caa7f29b" + +[[package]] +name = "link-cplusplus" +version = "1.0.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ecd207c9c713c34f95a097a5b029ac2ce6010530c7b49d7fea24d977dede04f5" +dependencies = [ + "cc", +] + +[[package]] +name = "memmap" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6585fd95e7bb50d6cc31e20d4cf9afb4e2ba16c5846fc76793f11218da9c475b" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +dependencies = [ + "adler", +] + +[[package]] +name = "once_cell" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" + +[[package]] +name = "pkg-config" +version = "0.3.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" + +[[package]] +name = "proc-macro2" +version = "1.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aeca18b86b413c660b781aa319e4e2648a3e6f9eadc9b47e9038e6fe9f3451b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9ab9c7eadfd8df19006f1cf1a4aed13540ed5cbc047010ece5826e10825488" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f3208ce4d8448b3f3e7d168a73f5e0c43a61e32930de3bceeccedb388b6bf06" + +[[package]] +name = "ryu" +version = "1.0.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91339c0467de62360649f8d3e185ca8de4224ff281f66000de5eb2a77a79041" + +[[package]] +name = "scratch" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1792db035ce95be60c3f8853017b3999209281c24e2ba5bc8e59bf97a0c590c1" + +[[package]] +name = "serde" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2113ab51b87a539ae008b5c6c02dc020ffa39afd2d83cffcb3f4eb2722cebec2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.163" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c805777e3930c8883389c602315a24224bcc738b63905ef87cd1420353ea93e" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "serde_json" +version = "1.0.96" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "057d394a50403bcac12672b2b18fb387ab6d289d957dab67dd201875391e52f1" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "2.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "trybuild" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "501dbdbb99861e4ab6b60eb6a7493956a9defb644fd034bc4a5ef27c693c8a3a" +dependencies = [ + "basic-toml", + "dissimilar", + "glob", + "once_cell", + "serde", + "serde_derive", + "serde_json", + "termcolor", +] + +[[package]] +name = "unicode-ident" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15811caf2415fb889178633e7724bad2509101cde276048e013b9def5e51fa0" + +[[package]] +name = "unicode-width" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/depends/patches/tl_expected/remove-undefined-behaviour.diff b/depends/patches/tl_expected/remove-undefined-behaviour.diff new file mode 100644 index 000000000..84b60e0c5 --- /dev/null +++ b/depends/patches/tl_expected/remove-undefined-behaviour.diff @@ -0,0 +1,78 @@ +diff --recursive --unified tl-expected-1.0.1-orig/include/tl/expected.hpp tl-expected-1.0.1/include/tl/expected.hpp +--- tl-expected-1.0.1-orig/include/tl/expected.hpp 2022-08-30 20:10:13.269489852 +0100 ++++ tl-expected-1.0.1/include/tl/expected.hpp 2022-08-30 20:17:35.744258828 +0100 +@@ -24,6 +24,7 @@ + #include + #include + #include ++#include + + #if defined(__EXCEPTIONS) || defined(_CPPUNWIND) + #define TL_EXPECTED_EXCEPTIONS_ENABLED +@@ -1862,27 +1863,37 @@ + } + } + +- constexpr const T *operator->() const { return valptr(); } +- TL_EXPECTED_11_CONSTEXPR T *operator->() { return valptr(); } ++ constexpr const T *operator->() const { ++ assert(has_value()); ++ return valptr(); ++ } ++ TL_EXPECTED_11_CONSTEXPR T *operator->() { ++ assert(has_value()); ++ return valptr(); ++ } + + template ::value> * = nullptr> + constexpr const U &operator*() const & { ++ assert(has_value()); + return val(); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &operator*() & { ++ assert(has_value()); + return val(); + } + template ::value> * = nullptr> + constexpr const U &&operator*() const && { ++ assert(has_value()); + return std::move(val()); + } + template ::value> * = nullptr> + TL_EXPECTED_11_CONSTEXPR U &&operator*() && { ++ assert(has_value()); + return std::move(val()); + } + +@@ -1918,10 +1929,22 @@ + return std::move(val()); + } + +- constexpr const E &error() const & { return err().value(); } +- TL_EXPECTED_11_CONSTEXPR E &error() & { return err().value(); } +- constexpr const E &&error() const && { return std::move(err().value()); } +- TL_EXPECTED_11_CONSTEXPR E &&error() && { return std::move(err().value()); } ++ constexpr const E &error() const & { ++ assert(!has_value()); ++ return err().value(); ++ } ++ TL_EXPECTED_11_CONSTEXPR E &error() & { ++ assert(!has_value()); ++ return err().value(); ++ } ++ constexpr const E &&error() const && { ++ assert(!has_value()); ++ return std::move(err().value()); ++ } ++ TL_EXPECTED_11_CONSTEXPR E &&error() && { ++ assert(!has_value()); ++ return std::move(err().value()); ++ } + + template constexpr T value_or(U &&v) const & { + static_assert(std::is_copy_constructible::value && diff --git a/depends/patches/zeromq/check_snprintf_return.patch b/depends/patches/zeromq/check_snprintf_return.patch new file mode 100644 index 000000000..05a8aac36 --- /dev/null +++ b/depends/patches/zeromq/check_snprintf_return.patch @@ -0,0 +1,48 @@ +From 6dc559c0726c2d2d9a928bd8d1ed89773c0b47ea Mon Sep 17 00:00:00 2001 +From: Daira Hopwood +Date: Wed, 1 Feb 2023 15:15:19 +0000 +Subject: [PATCH] #4494 added calls to snprintf, but did not take into account + that snprintf can truncate, and then return the number of characters that + would have been written without truncation. + +Signed-off-by: Daira Hopwood +--- + RELICENSE/daira.md | 15 +++++++++++++++ + src/tcp_address.cpp | 5 +++-- + src/udp_engine.cpp | 6 +++--- + 3 files changed, 21 insertions(+), 5 deletions(-) + create mode 100644 RELICENSE/daira.md + +diff --git a/src/tcp_address.cpp b/src/tcp_address.cpp +index 46b4defc7..cd8016f64 100644 +--- a/src/tcp_address.cpp ++++ b/src/tcp_address.cpp +@@ -129,8 +129,9 @@ static std::string make_address_string (const char *hbuf_, + pos += hbuf_len; + memcpy (pos, ipv6_suffix_, sizeof ipv6_suffix_ - 1); + pos += sizeof ipv6_suffix_ - 1; +- pos += snprintf (pos, max_port_str_length + 1 * sizeof (char), "%d", +- ntohs (port_)); ++ int res = snprintf (pos, max_port_str_length + 1, "%d", ntohs (port_)); ++ zmq_assert (res > 0 && res < (int) (max_port_str_length + 1)); ++ pos += res; + return std::string (buf, pos - buf); + } + +diff --git a/src/udp_engine.cpp b/src/udp_engine.cpp +index 47f1359e1..5ca03a425 100644 +--- a/src/udp_engine.cpp ++++ b/src/udp_engine.cpp +@@ -367,9 +367,9 @@ void zmq::udp_engine_t::sockaddr_to_msg (zmq::msg_t *msg_, + const char *const name = inet_ntoa (addr_->sin_addr); + + char port[6]; +- const int port_len = snprintf (port, 6 * sizeof (char), "%d", +- static_cast (ntohs (addr_->sin_port))); +- zmq_assert (port_len > 0); ++ const int port_len = ++ snprintf (port, 6, "%d", static_cast (ntohs (addr_->sin_port))); ++ zmq_assert (port_len > 0 && port_len < 6); + + const size_t name_len = strlen (name); + const int size = static_cast (name_len) + 1 /* colon */ diff --git a/depends/patches/zeromq/use-snprintf-not-sprintf.patch b/depends/patches/zeromq/use-snprintf-not-sprintf.patch new file mode 100644 index 000000000..4a2a53d5f --- /dev/null +++ b/depends/patches/zeromq/use-snprintf-not-sprintf.patch @@ -0,0 +1,249 @@ +From f7df6c8599835d6022335d63f37e291514d9a6f4 Mon Sep 17 00:00:00 2001 +From: Arnaud Loonstra +Date: Tue, 24 Jan 2023 12:54:48 +0100 +Subject: [PATCH] deprecate sprint and replace with snprintf + +--- + src/tcp_address.cpp | 3 ++- + src/udp_engine.cpp | 4 ++-- + tests/test_inproc_connect.cpp | 4 ++-- + tests/test_issue_566.cpp | 2 +- + tests/test_proxy.cpp | 12 ++++++++---- + tests/test_reqrep_tcp.cpp | 8 ++++++-- + tests/test_setsockopt.cpp | 2 +- + tests/test_stream_disconnect.cpp | 4 ++-- + tests/test_unbind_wildcard.cpp | 12 ++++++------ + tests/test_ws_transport.cpp | 3 ++- + tests/testutil.cpp | 18 +++++++++--------- + 11 files changed, 41 insertions(+), 31 deletions(-) + +diff --git a/src/tcp_address.cpp b/src/tcp_address.cpp +index bdda66a200..46b4defc79 100644 +--- a/src/tcp_address.cpp ++++ b/src/tcp_address.cpp +@@ -129,7 +129,8 @@ static std::string make_address_string (const char *hbuf_, + pos += hbuf_len; + memcpy (pos, ipv6_suffix_, sizeof ipv6_suffix_ - 1); + pos += sizeof ipv6_suffix_ - 1; +- pos += sprintf (pos, "%d", ntohs (port_)); ++ pos += snprintf (pos, max_port_str_length + 1 * sizeof (char), "%d", ++ ntohs (port_)); + return std::string (buf, pos - buf); + } + +diff --git a/src/udp_engine.cpp b/src/udp_engine.cpp +index d09bfe166e..47f1359e1b 100644 +--- a/src/udp_engine.cpp ++++ b/src/udp_engine.cpp +@@ -367,8 +367,8 @@ void zmq::udp_engine_t::sockaddr_to_msg (zmq::msg_t *msg_, + const char *const name = inet_ntoa (addr_->sin_addr); + + char port[6]; +- const int port_len = +- sprintf (port, "%d", static_cast (ntohs (addr_->sin_port))); ++ const int port_len = snprintf (port, 6 * sizeof (char), "%d", ++ static_cast (ntohs (addr_->sin_port))); + zmq_assert (port_len > 0); + + const size_t name_len = strlen (name); +diff --git a/tests/test_inproc_connect.cpp b/tests/test_inproc_connect.cpp +index 7a3acbda8c..c6437d55bb 100644 +--- a/tests/test_inproc_connect.cpp ++++ b/tests/test_inproc_connect.cpp +@@ -155,7 +155,7 @@ void test_connect_before_bind_ctx_term () + void *connect_socket = test_context_socket (ZMQ_ROUTER); + + char ep[32]; +- sprintf (ep, "inproc://cbbrr%d", i); ++ snprintf (ep, 32 * sizeof (char), "inproc://cbbrr%d", i); + TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (connect_socket, ep)); + + // Cleanup +@@ -233,7 +233,7 @@ void test_simultaneous_connect_bind_threads () + // Set up thread arguments: context followed by endpoint string + for (unsigned int i = 0; i < no_of_times; ++i) { + thr_args[i] = (void *) endpts[i]; +- sprintf (endpts[i], "inproc://foo_%d", i); ++ snprintf (endpts[i], 20 * sizeof (char), "inproc://foo_%d", i); + } + + // Spawn all threads as simultaneously as possible +diff --git a/tests/test_issue_566.cpp b/tests/test_issue_566.cpp +index 7a8859feba..2495eadfbe 100644 +--- a/tests/test_issue_566.cpp ++++ b/tests/test_issue_566.cpp +@@ -58,7 +58,7 @@ void test_issue_566 () + void *dealer = zmq_socket (ctx2, ZMQ_DEALER); + // Leave space for NULL char from sprintf, gcc warning + char routing_id[11]; +- sprintf (routing_id, "%09d", cycle); ++ snprintf (routing_id, 11 * sizeof (char), "%09d", cycle); + TEST_ASSERT_SUCCESS_ERRNO ( + zmq_setsockopt (dealer, ZMQ_ROUTING_ID, routing_id, 10)); + int rcvtimeo = 1000; +diff --git a/tests/test_proxy.cpp b/tests/test_proxy.cpp +index 5666721be1..16722e3ce5 100644 +--- a/tests/test_proxy.cpp ++++ b/tests/test_proxy.cpp +@@ -88,7 +88,8 @@ static void client_task (void *db_) + TEST_ASSERT_SUCCESS_ERRNO ( + zmq_setsockopt (endpoint, ZMQ_LINGER, &linger, sizeof (linger))); + char endpoint_source[256]; +- sprintf (endpoint_source, "inproc://endpoint%d", databag->id); ++ snprintf (endpoint_source, 256 * sizeof (char), "inproc://endpoint%d", ++ databag->id); + TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (endpoint, endpoint_source)); + char *my_endpoint = s_recv (endpoint); + TEST_ASSERT_NOT_NULL (my_endpoint); +@@ -107,7 +108,8 @@ static void client_task (void *db_) + char content[CONTENT_SIZE_MAX] = {}; + // Set random routing id to make tracing easier + char routing_id[ROUTING_ID_SIZE] = {}; +- sprintf (routing_id, "%04X-%04X", rand () % 0xFFFF, rand () % 0xFFFF); ++ snprintf (routing_id, ROUTING_ID_SIZE * sizeof (char), "%04X-%04X", ++ rand () % 0xFFFF, rand () % 0xFFFF); + TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( + client, ZMQ_ROUTING_ID, routing_id, + ROUTING_ID_SIZE)); // includes '\0' as an helper for printf +@@ -164,7 +166,8 @@ static void client_task (void *db_) + } + + if (keep_sending) { +- sprintf (content, "request #%03d", ++request_nbr); // CONTENT_SIZE ++ snprintf (content, CONTENT_SIZE_MAX * sizeof (char), ++ "request #%03d", ++request_nbr); // CONTENT_SIZE + if (is_verbose) + printf ("client send - routing_id = %s request #%03d\n", + routing_id, request_nbr); +@@ -228,7 +231,8 @@ void server_task (void * /*unused_*/) + TEST_ASSERT_NOT_NULL (endpoint_receivers[i]); + TEST_ASSERT_SUCCESS_ERRNO (zmq_setsockopt ( + endpoint_receivers[i], ZMQ_LINGER, &linger, sizeof (linger))); +- sprintf (endpoint_source, "inproc://endpoint%d", i); ++ snprintf (endpoint_source, 256 * sizeof (char), "inproc://endpoint%d", ++ i); + TEST_ASSERT_SUCCESS_ERRNO ( + zmq_bind (endpoint_receivers[i], endpoint_source)); + } +diff --git a/tests/test_reqrep_tcp.cpp b/tests/test_reqrep_tcp.cpp +index c1bdf4719b..01d263ab3d 100644 +--- a/tests/test_reqrep_tcp.cpp ++++ b/tests/test_reqrep_tcp.cpp +@@ -66,8 +66,12 @@ void make_connect_address (char *connect_address_, + const int port_, + const char *bind_address_) + { +- sprintf (connect_address_, "tcp://%s:%i;%s", ipv6_ ? "[::1]" : "127.0.0.1", +- port_, strrchr (bind_address_, '/') + 1); ++ if (ipv6_) ++ snprintf (connect_address_, 30 * sizeof (char), "tcp://[::1]:%i;%s", ++ port_, strrchr (bind_address_, '/') + 1); ++ else ++ snprintf (connect_address_, 38 * sizeof (char), "tcp://127.0.0.1:%i;%s", ++ port_, strrchr (bind_address_, '/') + 1); + } + + void test_multi_connect (int ipv6_) +diff --git a/tests/test_setsockopt.cpp b/tests/test_setsockopt.cpp +index 7e51a519c3..50414682b3 100644 +--- a/tests/test_setsockopt.cpp ++++ b/tests/test_setsockopt.cpp +@@ -120,7 +120,7 @@ void test_setsockopt_bindtodevice () + TEST_ASSERT_EQUAL_INT8 ('\0', devname[0]); + TEST_ASSERT_EQUAL_UINT (1, buflen); + +- sprintf (devname, "testdev"); ++ snprintf (devname, BOUNDDEVBUFSZ * sizeof (char), "testdev"); + buflen = strlen (devname); + + TEST_ASSERT_SUCCESS_ERRNO ( +diff --git a/tests/test_stream_disconnect.cpp b/tests/test_stream_disconnect.cpp +index d46916f279..2e1e77960c 100644 +--- a/tests/test_stream_disconnect.cpp ++++ b/tests/test_stream_disconnect.cpp +@@ -78,8 +78,8 @@ void test_stream_disconnect () + + // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome. + #ifdef ZMQ_HAVE_WINDOWS +- sprintf (connect_endpoint, "tcp://127.0.0.1:%s", +- strrchr (bind_endpoint, ':') + 1); ++ snprintf (connect_endpoint, MAX_SOCKET_STRING * sizeof (char), ++ "tcp://127.0.0.1:%s", strrchr (bind_endpoint, ':') + 1); + #else + strcpy (connect_endpoint, bind_endpoint); + #endif +diff --git a/tests/test_unbind_wildcard.cpp b/tests/test_unbind_wildcard.cpp +index f25d6acc46..92a577d9dd 100644 +--- a/tests/test_unbind_wildcard.cpp ++++ b/tests/test_unbind_wildcard.cpp +@@ -40,8 +40,8 @@ void test_address_wildcard_ipv4 () + + // Apparently Windows can't connect to 0.0.0.0. A better fix would be welcome. + #ifdef ZMQ_HAVE_WINDOWS +- sprintf (connect_endpoint, "tcp://127.0.0.1:%s", +- strrchr (bind_endpoint, ':') + 1); ++ snprintf (connect_endpoint, 256 * sizeof (char), "tcp://127.0.0.1:%s", ++ strrchr (bind_endpoint, ':') + 1); + #else + strcpy (connect_endpoint, bind_endpoint); + #endif +@@ -81,11 +81,11 @@ void test_address_wildcard_ipv6 () + + #ifdef ZMQ_HAVE_WINDOWS + if (ipv6) +- sprintf (connect_endpoint, "tcp://[::1]:%s", +- strrchr (bind_endpoint, ':') + 1); ++ snprintf (connect_endpoint, 256 * sizeof (char), "tcp://[::1]:%s", ++ strrchr (bind_endpoint, ':') + 1); + else +- sprintf (connect_endpoint, "tcp://127.0.0.1:%s", +- strrchr (bind_endpoint, ':') + 1); ++ snprintf (connect_endpoint, 256 * sizeof (char), "tcp://127.0.0.1:%s", ++ strrchr (bind_endpoint, ':') + 1); + #else + strcpy (connect_endpoint, bind_endpoint); + #endif +diff --git a/tests/test_ws_transport.cpp b/tests/test_ws_transport.cpp +index 49b810fec0..6781af4d7d 100644 +--- a/tests/test_ws_transport.cpp ++++ b/tests/test_ws_transport.cpp +@@ -47,7 +47,8 @@ void test_roundtrip () + zmq_getsockopt (sb, ZMQ_LAST_ENDPOINT, bind_address, &addr_length)); + + // Windows can't connect to 0.0.0.0 +- sprintf (connect_address, "ws://127.0.0.1%s", strrchr (bind_address, ':')); ++ snprintf (connect_address, MAX_SOCKET_STRING * sizeof (char), ++ "ws://127.0.0.1%s", strrchr (bind_address, ':')); + + TEST_ASSERT_SUCCESS_ERRNO (zmq_connect (sc, connect_address)); + +diff --git a/tests/testutil.cpp b/tests/testutil.cpp +index 5306aff9b2..ba7eb9b592 100644 +--- a/tests/testutil.cpp ++++ b/tests/testutil.cpp +@@ -510,16 +510,15 @@ + addr_len = sizeof (struct sockaddr_storage); + TEST_ASSERT_SUCCESS_RAW_ERRNO ( + getsockname (s_pre, (struct sockaddr *) &addr, &addr_len)); +- sprintf (my_endpoint_, "%s://%s:%u", +- protocol_ == IPPROTO_TCP +- ? "tcp" +- : protocol_ == IPPROTO_UDP +- ? "udp" +- : protocol_ == IPPROTO_WSS ? "wss" : "ws", +- address_, +- af_ == AF_INET +- ? ntohs ((*(struct sockaddr_in *) &addr).sin_port) +- : ntohs ((*(struct sockaddr_in6 *) &addr).sin6_port)); ++ snprintf ( ++ my_endpoint_, 6 + strlen (address_) + 7 * sizeof (char), "%s://%s:%u", ++ protocol_ == IPPROTO_TCP ? "tcp" ++ : protocol_ == IPPROTO_UDP ? "udp" ++ : protocol_ == IPPROTO_WSS ? "wss" ++ : "ws", ++ address_, ++ af_ == AF_INET ? ntohs ((*(struct sockaddr_in *) &addr).sin_port) ++ : ntohs ((*(struct sockaddr_in6 *) &addr).sin6_port)); + } + + return s_pre; diff --git a/depends/patches/zeromq/windows-unused-variables.diff b/depends/patches/zeromq/windows-unused-variables.diff new file mode 100644 index 000000000..8526ee5f9 --- /dev/null +++ b/depends/patches/zeromq/windows-unused-variables.diff @@ -0,0 +1,17 @@ +diff -ur zeromq-4.3.3-orig/src/clock.cpp zeromq-4.3.3/src/clock.cpp +--- zeromq-4.3.3-orig/src/clock.cpp 2020-10-13 13:44:04.190000000 +0100 ++++ zeromq-4.3.3/src/clock.cpp 2020-10-13 13:47:04.170000000 +0100 +@@ -126,9 +126,13 @@ + init_compatible_get_tick_count64 (); + #endif + ++#ifndef ZMQ_HAVE_WINDOWS + const uint64_t usecs_per_msec = 1000; ++#endif + const uint64_t usecs_per_sec = 1000000; ++#if !defined(ZMQ_HAVE_WINDOWS) && !defined(ZMQ_HAVE_FREEBSD) + const uint64_t nsecs_per_usec = 1000; ++#endif + + zmq::clock_t::clock_t () : + _last_tsc (rdtsc ()), diff --git a/doc/Doxyfile b/doc/Doxyfile new file mode 100644 index 000000000..dc7be6658 --- /dev/null +++ b/doc/Doxyfile @@ -0,0 +1,1752 @@ +# Doxyfile 1.7.4 + +# !!! Invoke doxygen from project root using: +# doxygen doc/Doxyfile + +# This file describes the settings to be used by the documentation system +# doxygen (www.doxygen.org) for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- + +# This tag specifies the encoding used for all characters in the config file +# that follow. The default is UTF-8 which is also the encoding used for all +# text before the first occurrence of this tag. Doxygen uses libiconv (or the +# iconv built into libc) for the transcoding. See +# https://www.gnu.org/software/libiconv/ for the list of possible encodings. + +DOXYFILE_ENCODING = UTF-8 + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. + +PROJECT_NAME = Bitcoin + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = 0.11.2 + +# Using the PROJECT_BRIEF tag one can provide an optional one line description +# for a project that appears at the top of each page and should give viewer +# a quick idea about the purpose of the project. Keep the description short. + +PROJECT_BRIEF = "P2P Digital Currency" + +# With the PROJECT_LOGO tag one can specify an logo or icon that is +# included in the documentation. The maximum height of the logo should not +# exceed 55 pixels and the maximum width should not exceed 200 pixels. +# Doxygen will copy the logo to the output directory. + +PROJECT_LOGO = doc/bitcoin_logo_doxygen.png + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = doc/doxygen + +# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create +# 4096 sub-directories (in 2 levels) under the output directory of each output +# format and will distribute the generated files over these directories. +# Enabling this option can be useful when feeding doxygen a huge amount of +# source files, where putting all generated files in the same directory would +# otherwise cause performance problems for the file system. + +CREATE_SUBDIRS = NO + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, +# Croatian, Czech, Danish, Dutch, Esperanto, Farsi, Finnish, French, German, +# Greek, Hungarian, Italian, Japanese, Japanese-en (Japanese with English +# messages), Korean, Korean-en, Lithuanian, Norwegian, Macedonian, Persian, +# Polish, Portuguese, Romanian, Russian, Serbian, Serbian-Cyrillic, Slovak, +# Slovene, Spanish, Swedish, Ukrainian, and Vietnamese. + +OUTPUT_LANGUAGE = English + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# This tag implements a quasi-intelligent brief description abbreviator +# that is used to form the text in various listings. Each string +# in this list, if found as the leading text of the brief description, will be +# stripped from the text and the result after processing the whole list, is +# used as the annotated text. Otherwise, the brief description is used as-is. +# If left blank, the following values are used ("$name" is automatically +# replaced with the name of the entity): "The $name class" "The $name widget" +# "The $name file" "is" "provides" "specifies" "contains" +# "represents" "a" "an" "the" + +ABBREVIATE_BRIEF = "The $name class" \ + "The $name widget" \ + "The $name file" \ + is \ + provides \ + specifies \ + contains \ + represents \ + a \ + an \ + the + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all +# inherited members of a class in the documentation of that class as if those +# members were ordinary class members. Constructors, destructors and assignment +# operators of the base classes will not be shown. + +INLINE_INHERITED_MEMB = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = YES + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user-defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. The tag can be used to show relative paths in the file list. +# If left blank the directory from which doxygen is run is used as the +# path to strip. + +STRIP_FROM_PATH = + +# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of +# the path mentioned in the documentation of a class, which tells +# the reader which header file to include in order to use a class. +# If left blank only the name of the header file containing the class +# definition is used. Otherwise one should specify the include paths that +# are normally passed to the compiler using the -I flag. + +STRIP_FROM_INC_PATH = + +# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter +# (but less readable) file names. This can be useful if your file system +# doesn't support long names like on DOS, Mac, or CD-ROM. + +SHORT_NAMES = NO + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like regular Qt-style comments +# (thus requiring an explicit @brief command for a brief description.) + +JAVADOC_AUTOBRIEF = YES + +# If the QT_AUTOBRIEF tag is set to YES then Doxygen will +# interpret the first line (until the first dot) of a Qt-style +# comment as the brief description. If set to NO, the comments +# will behave just like regular Qt-style comments (thus requiring +# an explicit \brief command for a brief description.) + +QT_AUTOBRIEF = NO + +# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen +# treat a multi-line C++ special comment block (i.e. a block of //! or /// +# comments) as a brief description. This used to be the default behaviour. +# The new default is to treat a multi-line C++ comment block as a detailed +# description. Set this tag to YES if you prefer the old behaviour instead. + +MULTILINE_CPP_IS_BRIEF = NO + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# re-implements. + +INHERIT_DOCS = YES + +# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce +# a new page for each member. If set to NO, the documentation of a member will +# be part of the file/class/namespace that contains it. + +SEPARATE_MEMBER_PAGES = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user-defined paragraph with heading "Side Effects:". +# You can put \n in the value part of an alias to insert newlines. + +ALIASES = + +# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C +# sources only. Doxygen will then generate output that is more tailored for C. +# For instance, some of the names that are used will be different. The list +# of all members will be omitted, etc. + +OPTIMIZE_OUTPUT_FOR_C = NO + +# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java +# sources only. Doxygen will then generate output that is more tailored for +# Java. For instance, namespaces will be presented as packages, qualified +# scopes will look different, etc. + +OPTIMIZE_OUTPUT_JAVA = NO + +# Set the OPTIMIZE_FOR_FORTRAN tag to YES if your project consists of Fortran +# sources only. Doxygen will then generate output that is more tailored for +# Fortran. + +OPTIMIZE_FOR_FORTRAN = NO + +# Set the OPTIMIZE_OUTPUT_VHDL tag to YES if your project consists of VHDL +# sources. Doxygen will then generate output that is tailored for +# VHDL. + +OPTIMIZE_OUTPUT_VHDL = NO + +# Doxygen selects the parser to use depending on the extension of the files it +# parses. With this tag you can assign which parser to use for a given extension. +# Doxygen has a built-in mapping, but you can override or extend it using this +# tag. The format is ext=language, where ext is a file extension, and language +# is one of the parsers supported by doxygen: IDL, Java, Javascript, CSharp, C, +# C++, D, PHP, Objective-C, Python, Fortran, VHDL, C, C++. For instance to make +# doxygen treat .inc files as Fortran files (default is PHP), and .f files as C +# (default is Fortran), use: inc=Fortran f=C. Note that for custom extensions +# you also need to set FILE_PATTERNS otherwise the files are not read by doxygen. + +EXTENSION_MAPPING = + +# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want +# to include (a tag file for) the STL sources as input, then you should +# set this tag to YES in order to let doxygen match functions declarations and +# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. +# func(std::string) {}). This also makes the inheritance and collaboration +# diagrams that involve STL classes more complete and accurate. + +BUILTIN_STL_SUPPORT = NO + +# If you use Microsoft's C++/CLI language, you should set this option to YES to +# enable parsing support. + +CPP_CLI_SUPPORT = NO + +# Set the SIP_SUPPORT tag to YES if your project consists of sip sources only. +# Doxygen will parse them like normal C++ but will assume all classes use public +# instead of private inheritance when no explicit protection keyword is present. + +SIP_SUPPORT = NO + +# For Microsoft's IDL there are propget and propput attributes to indicate getter +# and setter methods for a property. Setting this option to YES (the default) +# will make doxygen replace the get and set methods by a property in the +# documentation. This will only work if the methods are indeed getting or +# setting a simple type. If this is not the case, or you want to show the +# methods anyway, you should set this option to NO. + +IDL_PROPERTY_SUPPORT = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# Set the SUBGROUPING tag to YES (the default) to allow class member groups of +# the same type (for instance a group of public functions) to be put as a +# subgroup of that type (e.g. under the Public Functions section). Set it to +# NO to prevent subgrouping. Alternatively, this can be done per class using +# the \nosubgrouping command. + +SUBGROUPING = YES + +# When the INLINE_GROUPED_CLASSES tag is set to YES, classes, structs and +# unions are shown inside the group in which they are included (e.g. using +# @ingroup) instead of on a separate page (for HTML and Man pages) or +# section (for LaTeX and RTF). + +INLINE_GROUPED_CLASSES = NO + +# When TYPEDEF_HIDES_STRUCT is enabled, a typedef of a struct, union, or enum +# is documented as struct, union, or enum with the name of the typedef. So +# typedef struct TypeS {} TypeT, will appear in the documentation as a struct +# with name TypeT. When disabled the typedef will appear as a member of a file, +# namespace, or class. And the struct will be named TypeS. This can typically +# be useful for C code in case the coding convention dictates that all compound +# types are typedef'ed and only the typedef is referenced, never the tag name. + +TYPEDEF_HIDES_STRUCT = NO + +# The SYMBOL_CACHE_SIZE determines the size of the internal cache use to +# determine which symbols to keep in memory and which to flush to disk. +# When the cache is full, less often used symbols will be written to disk. +# For small to medium size projects (<1000 input files) the default value is +# probably good enough. For larger projects a too small cache size can cause +# doxygen to be busy swapping symbols to and from disk most of the time +# causing a significant performance penalty. +# If the system has enough physical memory increasing the cache will improve the +# performance by keeping more symbols in memory. Note that the value works on +# a logarithmic scale so increasing the size by one will roughly double the +# memory usage. The cache size is given by this formula: +# 2^(16+SYMBOL_CACHE_SIZE). The valid range is 0..9, the default is 0, +# corresponding to a cache size of 2^16 = 65536 symbols + +SYMBOL_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = NO + +# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) +# defined locally in source files will be included in the documentation. +# If set to NO only classes defined in header files are included. + +EXTRACT_LOCAL_CLASSES = YES + +# This flag is only useful for Objective-C code. When set to YES local +# methods, which are defined in the implementation section but not in +# the interface are included in the documentation. +# If set to NO (the default) only methods in the interface are included. + +EXTRACT_LOCAL_METHODS = NO + +# If this flag is set to YES, the members of anonymous namespaces will be +# extracted and appear in the documentation as a namespace called +# 'anonymous_namespace{file}', where file will be replaced with the base +# name of the file that contains the anonymous namespace. By default +# anonymous namespaces are hidden. + +EXTRACT_ANON_NSPACES = NO + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these classes will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all +# friend (class|struct|union) declarations. +# If set to NO (the default) these declarations will be included in the +# documentation. + +HIDE_FRIEND_COMPOUNDS = NO + +# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any +# documentation blocks found inside the body of a function. +# If set to NO (the default) these blocks will be appended to the +# function's detailed documentation block. + +HIDE_IN_BODY_DOCS = NO + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower-case letters. If set to YES upper-case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# and Mac users are advised to set this option to NO. + +CASE_SENSE_NAMES = NO + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put a list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the FORCE_LOCAL_INCLUDES tag is set to YES then Doxygen +# will list include files with double quotes in the documentation +# rather than with sharp brackets. + +FORCE_LOCAL_INCLUDES = NO + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the +# brief documentation of file, namespace and class members alphabetically +# by member name. If set to NO (the default) the members will appear in +# declaration order. + +SORT_BRIEF_DOCS = NO + +# If the SORT_MEMBERS_CTORS_1ST tag is set to YES then doxygen +# will sort the (brief and detailed) documentation of class members so that +# constructors and destructors are listed first. If set to NO (the default) +# the constructors will appear in the respective orders defined by +# SORT_MEMBER_DOCS and SORT_BRIEF_DOCS. +# This tag will be ignored for brief docs if SORT_BRIEF_DOCS is set to NO +# and ignored for detailed docs if SORT_MEMBER_DOCS is set to NO. + +SORT_MEMBERS_CTORS_1ST = NO + +# If the SORT_GROUP_NAMES tag is set to YES then doxygen will sort the +# hierarchy of group names into alphabetical order. If set to NO (the default) +# the group names will appear in their defined order. + +SORT_GROUP_NAMES = NO + +# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be +# sorted by fully-qualified names, including namespaces. If set to +# NO (the default), the class list will be sorted only by class name, +# not including the namespace part. +# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES. +# Note: This option applies only to the class list, not to the +# alphabetical list. + +SORT_BY_SCOPE_NAME = NO + +# If the STRICT_PROTO_MATCHING option is enabled and doxygen fails to +# do proper type resolution of all parameters of a function it will reject a +# match between the prototype and the implementation of a member function even +# if there is only one candidate or it is obvious which candidate to choose +# by doing a simple string match. By disabling STRICT_PROTO_MATCHING doxygen +# will still accept a match between prototype and implementation in such cases. + +STRICT_PROTO_MATCHING = NO + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = YES + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# The GENERATE_BUGLIST tag can be used to enable (YES) or +# disable (NO) the bug list. This list is created by putting \bug +# commands in the documentation. + +GENERATE_BUGLIST = YES + +# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or +# disable (NO) the deprecated list. This list is created by putting +# \deprecated commands in the documentation. + +GENERATE_DEPRECATEDLIST= YES + +# The ENABLED_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The MAX_INITIALIZER_LINES tag determines the maximum number of lines +# the initial value of a variable or macro consists of for it to appear in +# the documentation. If the initializer consists of more lines than specified +# here it will be hidden. Use a value of 0 to hide initializers completely. +# The appearance of the initializer of individual variables and macros in the +# documentation can be controlled using \showinitializer or \hideinitializer +# command in the documentation regardless of this setting. + +MAX_INITIALIZER_LINES = 30 + +# Set the SHOW_USED_FILES tag to NO to disable the list of files generated +# at the bottom of the documentation of classes and structs. If set to YES the +# list will mention the files that were used to generate the documentation. + +SHOW_USED_FILES = YES + +# If the sources in your project are distributed over multiple directories +# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy +# in the documentation. The default is NO. + +SHOW_DIRECTORIES = NO + +# Set the SHOW_FILES tag to NO to disable the generation of the Files page. +# This will remove the Files entry from the Quick Index and from the +# Folder Tree View (if specified). The default is YES. + +SHOW_FILES = YES + +# Set the SHOW_NAMESPACES tag to NO to disable the generation of the +# Namespaces page. This will remove the Namespaces entry from the Quick Index +# and from the Folder Tree View (if specified). The default is YES. + +SHOW_NAMESPACES = YES + +# The FILE_VERSION_FILTER tag can be used to specify a program or script that +# doxygen should invoke to get the current version for each file (typically from +# the version control system). Doxygen will invoke the program by executing (via +# popen()) the command , where is the value of +# the FILE_VERSION_FILTER tag, and is the name of an input file +# provided by doxygen. Whatever the program writes to standard output +# is used as the file version. See the manual for examples. + +FILE_VERSION_FILTER = + +# The LAYOUT_FILE tag can be used to specify a layout file which will be parsed +# by doxygen. The layout file controls the global structure of the generated +# output files in an output format independent way. The create the layout file +# that represents doxygen's defaults, run doxygen with the -l option. +# You can optionally specify a file name after the option, if omitted +# DoxygenLayout.xml will be used as the name of the layout file. + +LAYOUT_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for +# potential errors in the documentation, such as not documenting some +# parameters in a documented function, or documenting parameters that +# don't exist or using markup commands wrongly. + +WARN_IF_DOC_ERROR = YES + +# The WARN_NO_PARAMDOC option can be enabled to get warnings for +# functions that are documented, but have no documentation for their parameters +# or return value. If set to NO (the default) doxygen will only warn about +# wrong or incomplete parameter documentation, but not about the absence of +# documentation. + +WARN_NO_PARAMDOC = NO + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. Optionally the format may contain +# $version, which will be replaced by the version of the file (if it could +# be obtained via FILE_VERSION_FILTER) + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src + +# This tag can be used to specify the character encoding of the source files +# that doxygen parses. Internally doxygen uses the UTF-8 encoding, which is +# also the default input encoding. Doxygen uses libiconv (or the iconv built +# into libc) for the transcoding. See https://www.gnu.org/software/libiconv for +# the list of possible encodings. + +INPUT_ENCODING = UTF-8 + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank the following patterns are tested: +# *.c *.cc *.cxx *.cpp *.c++ *.d *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh +# *.hxx *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.dox *.py +# *.f90 *.f *.for *.vhd *.vhdl + +FILE_PATTERNS = *.c \ + *.cc \ + *.cxx \ + *.cpp \ + *.c++ \ + *.d \ + *.java \ + *.ii \ + *.ixx \ + *.ipp \ + *.i++ \ + *.inl \ + *.h \ + *.hh \ + *.hxx \ + *.hpp \ + *.h++ \ + *.idl \ + *.odl \ + *.cs \ + *.php \ + *.php3 \ + *.inc \ + *.m \ + *.mm \ + *.dox \ + *.py \ + *.f90 \ + *.f \ + *.for \ + *.vhd \ + *.vhdl + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = src/leveldb src/json src/test /src/qt/test + +# The EXCLUDE_SYMLINKS tag can be used select whether or not files or +# directories that are symbolic links (a Unix file system feature) are excluded +# from the input. + +EXCLUDE_SYMLINKS = NO + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. Note that the wildcards are matched +# against the file with absolute path, so to exclude all test directories +# for example use the pattern */test/* + +EXCLUDE_PATTERNS = + +# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names +# (namespaces, classes, functions, etc.) that should be excluded from the +# output. The symbol name can be a fully qualified name, a word, or if the +# wildcard * is used, a substring. Examples: ANamespace, AClass, +# AClass::ANamespace, ANamespace::*Test + +EXCLUDE_SYMBOLS = boost google + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = * + +# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be +# searched for input files to be used with the \include or \dontinclude +# commands irrespective of the value of the RECURSIVE tag. +# Possible values are YES and NO. If left blank NO is used. + +EXAMPLE_RECURSIVE = NO + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. If FILTER_PATTERNS is specified, this tag will be +# ignored. + +INPUT_FILTER = + +# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern +# basis. Doxygen will compare the file name with each pattern and apply the +# filter if there is a match. The filters are a list of the form: +# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further +# info on how filters are used. If FILTER_PATTERNS is empty or if +# non of the patterns match the file name, INPUT_FILTER is applied. + +FILTER_PATTERNS = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse (i.e. when SOURCE_BROWSER is set to YES). + +FILTER_SOURCE_FILES = NO + +# The FILTER_SOURCE_PATTERNS tag can be used to specify source filters per file +# pattern. A pattern will override the setting for FILTER_PATTERN (if any) +# and it is also possible to disable source filtering for a specific pattern +# using *.ext= (so without naming a filter). This option only has effect when +# FILTER_SOURCE_FILES is enabled. + +FILTER_SOURCE_PATTERNS = + +#--------------------------------------------------------------------------- +# configuration options related to source browsing +#--------------------------------------------------------------------------- + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. +# Note: To get rid of all source code in the generated output, make sure also +# VERBATIM_HEADERS is set to NO. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the REFERENCED_BY_RELATION tag is set to YES +# then for each documented function all documented +# functions referencing it will be listed. + +REFERENCED_BY_RELATION = NO + +# If the REFERENCES_RELATION tag is set to YES +# then for each documented function all documented entities +# called/used by that function will be listed. + +REFERENCES_RELATION = NO + +# If the REFERENCES_LINK_SOURCE tag is set to YES (the default) +# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from +# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will +# link to the source code. Otherwise they will link to the documentation. + +REFERENCES_LINK_SOURCE = YES + +# If the USE_HTAGS tag is set to YES then the references to source code +# will point to the HTML generated by the htags(1) tool instead of doxygen +# built-in source browser. The htags tool is part of GNU's global source +# tagging system (see https://www.gnu.org/software/global/global.html). You +# will need version 4.8.6 or higher. + +USE_HTAGS = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = YES + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_FILE_EXTENSION tag can be used to specify the file extension for +# each generated HTML page (for example: .htm,.php,.asp). If it is left blank +# doxygen will generate files with .html extension. + +HTML_FILE_EXTENSION = .html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. Note that when using a custom header you are responsible +# for the proper inclusion of any scripts and style sheets that doxygen +# needs, which is dependent on the configuration options used. +# It is advised to generate a default header using "doxygen -w html +# header.html footer.html stylesheet.css YourConfigFile" and then modify +# that header. Note that the header is subject to change so you typically +# have to redo this when upgrading to a newer version of doxygen or when +# changing the value of configuration settings such as GENERATE_TREEVIEW! + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user-defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet. Note that doxygen will try to copy +# the style sheet file to the HTML output directory, so don't put your own +# stylesheet in the HTML output directory as well, or it will be erased! + +HTML_STYLESHEET = + +# The HTML_EXTRA_FILES tag can be used to specify one or more extra images or +# other source files which should be copied to the HTML output directory. Note +# that these files will be copied to the base HTML output directory. Use the +# $relpath$ marker in the HTML_HEADER and/or HTML_FOOTER files to load these +# files. In the HTML_STYLESHEET file, use the file name only. Also note that +# the files will be copied as-is; there are no commands or markers available. + +HTML_EXTRA_FILES = + +# The HTML_COLORSTYLE_HUE tag controls the color of the HTML output. +# Doxygen will adjust the colors in the stylesheet and background images +# according to this color. Hue is specified as an angle on a colorwheel, +# see https://en.wikipedia.org/wiki/Hue for more information. +# For instance the value 0 represents red, 60 is yellow, 120 is green, +# 180 is cyan, 240 is blue, 300 purple, and 360 is red again. +# The allowed range is 0 to 359. + +HTML_COLORSTYLE_HUE = 220 + +# The HTML_COLORSTYLE_SAT tag controls the purity (or saturation) of +# the colors in the HTML output. For a value of 0 the output will use +# grayscales only. A value of 255 will produce the most vivid colors. + +HTML_COLORSTYLE_SAT = 100 + +# The HTML_COLORSTYLE_GAMMA tag controls the gamma correction applied to +# the luminance component of the colors in the HTML output. Values below +# 100 gradually make the output lighter, whereas values above 100 make +# the output darker. The value divided by 100 is the actual gamma applied, +# so 80 represents a gamma of 0.8, The value 220 represents a gamma of 2.2, +# and 100 does not change the gamma. + +HTML_COLORSTYLE_GAMMA = 80 + +# If the HTML_TIMESTAMP tag is set to YES then the footer of each generated HTML +# page will contain the date and time when the page was generated. Setting +# this to NO can help when comparing the output of multiple runs. + +HTML_TIMESTAMP = YES + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML +# documentation will contain sections that can be hidden and shown after the +# page has loaded. For this to work a browser that supports +# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox +# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari). + +HTML_DYNAMIC_SECTIONS = NO + +# If the GENERATE_DOCSET tag is set to YES, additional index files +# will be generated that can be used as input for Apple's Xcode 3 +# integrated development environment, introduced with OSX 10.5 (Leopard). +# To create a documentation set, doxygen will generate a Makefile in the +# HTML output directory. Running make will produce the docset in that +# directory and running "make install" will install the docset in +# ~/Library/Developer/Shared/Documentation/DocSets so that Xcode will find +# it at startup. +# See http://developer.apple.com/tools/creatingdocsetswithdoxygen.html +# for more information. + +GENERATE_DOCSET = NO + +# When GENERATE_DOCSET tag is set to YES, this tag determines the name of the +# feed. A documentation feed provides an umbrella under which multiple +# documentation sets from a single provider (such as a company or product suite) +# can be grouped. + +DOCSET_FEEDNAME = "Doxygen generated docs" + +# When GENERATE_DOCSET tag is set to YES, this tag specifies a string that +# should uniquely identify the documentation set bundle. This should be a +# reverse domain-name style string, e.g. com.mycompany.MyDocSet. Doxygen +# will append .docset to the name. + +DOCSET_BUNDLE_ID = org.doxygen.Project + +# When GENERATE_PUBLISHER_ID tag specifies a string that should uniquely identify +# the documentation publisher. This should be a reverse domain-name style +# string, e.g. com.mycompany.MyDocSet.documentation. + +DOCSET_PUBLISHER_ID = org.doxygen.Publisher + +# The GENERATE_PUBLISHER_NAME tag identifies the documentation publisher. + +DOCSET_PUBLISHER_NAME = Publisher + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compiled HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can +# be used to specify the file name of the resulting .chm file. You +# can add a path in front of the file if the result should not be +# written to the html output directory. + +CHM_FILE = + +# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can +# be used to specify the location (absolute path including file name) of +# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run +# the HTML help compiler on the generated index.hhp. + +HHC_LOCATION = + +# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag +# controls if a separate .chi index file is generated (YES) or that +# it should be included in the master .chm file (NO). + +GENERATE_CHI = NO + +# If the GENERATE_HTMLHELP tag is set to YES, the CHM_INDEX_ENCODING +# is used to encode HtmlHelp index (hhk), content (hhc) and project file +# content. + +CHM_INDEX_ENCODING = + +# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag +# controls whether a binary table of contents is generated (YES) or a +# normal table of contents (NO) in the .chm file. + +BINARY_TOC = NO + +# The TOC_EXPAND flag can be set to YES to add extra items for group members +# to the contents of the HTML help documentation and to the tree view. + +TOC_EXPAND = NO + +# If the GENERATE_QHP tag is set to YES and both QHP_NAMESPACE and +# QHP_VIRTUAL_FOLDER are set, an additional index file will be generated +# that can be used as input for Qt's qhelpgenerator to generate a +# Qt Compressed Help (.qch) of the generated HTML documentation. + +GENERATE_QHP = NO + +# If the QHG_LOCATION tag is specified, the QCH_FILE tag can +# be used to specify the file name of the resulting .qch file. +# The path specified is relative to the HTML output folder. + +QCH_FILE = + +# The QHP_NAMESPACE tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#namespace + +QHP_NAMESPACE = org.doxygen.Project + +# The QHP_VIRTUAL_FOLDER tag specifies the namespace to use when generating +# Qt Help Project output. For more information please see +# http://doc.trolltech.com/qthelpproject.html#virtual-folders + +QHP_VIRTUAL_FOLDER = doc + +# If QHP_CUST_FILTER_NAME is set, it specifies the name of a custom filter to +# add. For more information please see +# http://doc.trolltech.com/qthelpproject.html#custom-filters + +QHP_CUST_FILTER_NAME = + +# The QHP_CUST_FILT_ATTRS tag specifies the list of the attributes of the +# custom filter to add. For more information please see +# +# Qt Help Project / Custom Filters. + +QHP_CUST_FILTER_ATTRS = + +# The QHP_SECT_FILTER_ATTRS tag specifies the list of the attributes this +# project's +# filter section matches. +# +# Qt Help Project / Filter Attributes. + +QHP_SECT_FILTER_ATTRS = + +# If the GENERATE_QHP tag is set to YES, the QHG_LOCATION tag can +# be used to specify the location of Qt's qhelpgenerator. +# If non-empty doxygen will try to run qhelpgenerator on the generated +# .qhp file. + +QHG_LOCATION = + +# If the GENERATE_ECLIPSEHELP tag is set to YES, additional index files +# will be generated, which together with the HTML files, form an Eclipse help +# plugin. To install this plugin and make it available under the help contents +# menu in Eclipse, the contents of the directory containing the HTML and XML +# files needs to be copied into the plugins directory of eclipse. The name of +# the directory within the plugins directory should be the same as +# the ECLIPSE_DOC_ID value. After copying Eclipse needs to be restarted before +# the help appears. + +GENERATE_ECLIPSEHELP = NO + +# A unique identifier for the eclipse help plugin. When installing the plugin +# the directory name containing the HTML and XML files should also have +# this name. + +ECLIPSE_DOC_ID = org.doxygen.Project + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# The ENUM_VALUES_PER_LINE tag can be used to set the number of enum values +# (range [0,1..20]) that doxygen will group on one line in the generated HTML +# documentation. Note that a value of 0 will completely suppress the enum +# values from appearing in the overview section. + +ENUM_VALUES_PER_LINE = 4 + +# The GENERATE_TREEVIEW tag is used to specify whether a tree-like index +# structure should be generated to display hierarchical information. +# If the tag value is set to YES, a side panel will be generated +# containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript, DHTML, CSS and frames is required (i.e. any modern browser). +# Windows users are probably better off using the HTML help feature. + +GENERATE_TREEVIEW = NO + +# By enabling USE_INLINE_TREES, doxygen will generate the Groups, Directories, +# and Class Hierarchy pages using a tree view instead of an ordered list. + +USE_INLINE_TREES = NO + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +# When the EXT_LINKS_IN_WINDOW option is set to YES doxygen will open +# links to external symbols imported via tag files in a separate window. + +EXT_LINKS_IN_WINDOW = NO + +# Use this tag to change the font size of Latex formulas included +# as images in the HTML documentation. The default is 10. Note that +# when you change the font size after a successful doxygen run you need +# to manually remove any form_*.png images from the HTML output directory +# to force them to be regenerated. + +FORMULA_FONTSIZE = 10 + +# Use the FORMULA_TRANPARENT tag to determine whether or not the images +# generated for formulas are transparent PNGs. Transparent PNGs are +# not supported properly for IE 6.0, but are supported on all modern browsers. +# Note that when changing this option you need to delete any form_*.png files +# in the HTML output before the changes have effect. + +FORMULA_TRANSPARENT = YES + +# Enable the USE_MATHJAX option to render LaTeX formulas using MathJax +# (see http://www.mathjax.org) which uses client side Javascript for the +# rendering instead of using prerendered bitmaps. Use this if you do not +# have LaTeX installed or if you want to formulas look prettier in the HTML +# output. When enabled you also need to install MathJax separately and +# configure the path to it using the MATHJAX_RELPATH option. + +USE_MATHJAX = NO + +# When MathJax is enabled you need to specify the location relative to the +# HTML output directory using the MATHJAX_RELPATH option. The destination +# directory should contain the MathJax.js script. For instance, if the mathjax +# directory is located at the same level as the HTML output directory, then +# MATHJAX_RELPATH should be ../mathjax. The default value points to the +# mathjax.org site, so you can quickly see the result without installing +# MathJax, but it is strongly recommended to install a local copy of MathJax +# before deployment. + +MATHJAX_RELPATH = http://www.mathjax.org/mathjax + +# When the SEARCHENGINE tag is enabled doxygen will generate a search box +# for the HTML output. The underlying search engine uses javascript +# and DHTML and should work on any modern browser. Note that when using +# HTML help (GENERATE_HTMLHELP), Qt help (GENERATE_QHP), or docsets +# (GENERATE_DOCSET) there is already a search function so this one should +# typically be disabled. For large projects the javascript based search engine +# can be slow, then enabling SERVER_BASED_SEARCH may provide a better solution. + +SEARCHENGINE = YES + +# When the SERVER_BASED_SEARCH tag is enabled the search engine will be +# implemented using a PHP enabled web server instead of at the web client +# using Javascript. Doxygen will generate the search PHP script and index +# file to put on the web server. The advantage of the server +# based approach is that it scales better to large projects and allows +# full text search. The disadvantages are that it is more difficult to setup +# and does not have live searching capabilities. + +SERVER_BASED_SEARCH = NO + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be +# invoked. If left blank `latex' will be used as the default command name. +# Note that when enabling USE_PDFLATEX this option is only used for +# generating bitmaps for formulas in the HTML output, but not in the +# Makefile that is written to the output directory. + +LATEX_CMD_NAME = latex + +# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to +# generate index for LaTeX. If left blank `makeindex' will be used as the +# default command name. + +MAKEINDEX_CMD_NAME = makeindex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4 + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# The LATEX_FOOTER tag can be used to specify a personal LaTeX footer for +# the generated latex document. The footer should contain everything after +# the last chapter. If it is left blank doxygen will generate a +# standard footer. Notice: only use this tag if you know what you are doing! + +LATEX_FOOTER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = YES + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = YES + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +# If LATEX_HIDE_INDICES is set to YES then doxygen will not +# include the index chapters (such as File Index, Compound Index, etc.) +# in the output. + +LATEX_HIDE_INDICES = NO + +# If LATEX_SOURCE_CODE is set to YES then doxygen will include +# source code with syntax highlighting in the LaTeX output. +# Note that which sources are shown also depends on other settings +# such as SOURCE_BROWSER. + +LATEX_SOURCE_CODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimized for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using WORD or other +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assignments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +# Set optional variables used in the generation of an rtf document. +# Syntax is similar to doxygen's config file. + +RTF_EXTENSIONS_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +# If the MAN_LINKS tag is set to YES and Doxygen generates man output, +# then it will generate one additional man file for each entity +# documented in the real man page(s). These additional files +# only source the real man page, but without them the man command +# would be unable to find the correct page. The default is NO. + +MAN_LINKS = NO + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. + +GENERATE_XML = NO + +# The XML_OUTPUT tag is used to specify where the XML pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `xml' will be used as the default path. + +XML_OUTPUT = xml + +# The XML_SCHEMA tag can be used to specify an XML schema, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_SCHEMA = + +# The XML_DTD tag can be used to specify an XML DTD, +# which can be used by a validating XML parser to check the +# syntax of the XML files. + +XML_DTD = + +# If the XML_PROGRAMLISTING tag is set to YES Doxygen will +# dump the program listings (including syntax highlighting +# and cross-referencing information) to the XML output. Note that +# enabling this will significantly increase the size of the XML output. + +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# configuration options for the AutoGen Definitions output +#--------------------------------------------------------------------------- + +# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will +# generate an AutoGen Definitions (see autogen.sf.net) file +# that captures the structure of the code including all +# documentation. Note that this feature is still experimental +# and incomplete at the moment. + +GENERATE_AUTOGEN_DEF = NO + +#--------------------------------------------------------------------------- +# configuration options related to the Perl module output +#--------------------------------------------------------------------------- + +# If the GENERATE_PERLMOD tag is set to YES Doxygen will +# generate a Perl module file that captures the structure of +# the code including all documentation. Note that this +# feature is still experimental and incomplete at the +# moment. + +GENERATE_PERLMOD = NO + +# If the PERLMOD_LATEX tag is set to YES Doxygen will generate +# the necessary Makefile rules, Perl scripts and LaTeX code to be able +# to generate PDF and DVI output from the Perl module output. + +PERLMOD_LATEX = NO + +# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be +# nicely formatted so it can be parsed by a human reader. This is useful +# if you want to understand what is going on. On the other hand, if this +# tag is set to NO the size of the Perl module output will be much smaller +# and Perl will parse it just the same. + +PERLMOD_PRETTY = YES + +# The names of the make variables in the generated doxyrules.make file +# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. +# This is useful so different doxyrules.make files included by the same +# Makefile don't overwrite each other's variables. + +PERLMOD_MAKEVAR_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = NO + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_DEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# pointed to by INCLUDE_PATH will be searched when a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. To prevent a macro definition from being +# undefined via #undef or recursively expanded use the := operator +# instead of the = operator. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition that +# overrules the definition found in the source code. + +EXPAND_AS_DEFINED = + +# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then +# doxygen's preprocessor will remove all references to function-like macros +# that are alone on a line, have an all uppercase name, and do not end with a +# semicolon, because these will confuse the parser if not removed. + +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Configuration::additions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES option can be used to specify one or more tagfiles. +# Optionally an initial location of the external documentation +# can be added for each tagfile. The format of a tag file without +# this location is as follows: +# TAGFILES = file1 file2 ... +# Adding location for the tag files is done as follows: +# TAGFILES = file1=loc1 "file2 = loc2" ... +# where "loc1" and "loc2" can be relative or absolute paths or +# URLs. If a location is present for each tag, the installdox tool +# does not have to be run to correct the links. +# Note that each tag file must have a unique name +# (where the name does NOT include the path) +# If a tag file is not located in the directory in which doxygen +# is run, you must also specify the path to the tagfile here. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed +# in the modules index. If set to NO, only the current project's groups will +# be listed. + +EXTERNAL_GROUPS = YES + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base +# or super classes. Setting the tag to NO turns the diagrams off. Note that +# this option also works with HAVE_DOT disabled, but it is recommended to +# install and use dot, since it yields more powerful graphs. + +CLASS_DIAGRAMS = YES + +# You can define message sequence charts within doxygen comments using the \msc +# command. Doxygen will then run the mscgen tool (see +# http://www.mcternan.me.uk/mscgen/) to produce the chart and insert it in the +# documentation. The MSCGEN_PATH tag allows you to specify the directory where +# the mscgen tool resides. If left empty the tool is assumed to be found in the +# default search path. + +MSCGEN_PATH = + +# If set to YES, the inheritance and collaboration graphs will hide +# inheritance and usage relations if the target is undocumented +# or is not a class. + +HIDE_UNDOC_RELATIONS = YES + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# The DOT_NUM_THREADS specifies the number of dot invocations doxygen is +# allowed to run in parallel. When set to 0 (the default) doxygen will +# base this on the number of processors available in the system. You can set it +# explicitly to a value larger than 0 to get control over the balance +# between CPU load and processing speed. + +DOT_NUM_THREADS = 0 + +# By default doxygen will write a font called Helvetica to the output +# directory and reference it in all dot files that doxygen generates. +# When you want a differently looking font you can specify the font name +# using DOT_FONTNAME. You need to make sure dot is able to find the font, +# which can be done by putting it in a standard location or by setting the +# DOTFONTPATH environment variable or by setting DOT_FONTPATH to the directory +# containing the font. + +DOT_FONTNAME = Helvetica + +# The DOT_FONTSIZE tag can be used to set the size of the font of dot graphs. +# The default size is 10pt. + +DOT_FONTSIZE = 10 + +# By default doxygen will tell dot to use the output directory to look for the +# FreeSans.ttf font (which doxygen will put there itself). If you specify a +# different font using DOT_FONTNAME you can set the path where dot +# can find it using this tag. + +DOT_FONTPATH = + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for groups, showing the direct groups dependencies + +GROUP_GRAPHS = YES + +# If the UML_LOOK tag is set to YES doxygen will generate inheritance and +# collaboration diagrams in a style similar to the OMG's Unified Modeling +# Language. + +UML_LOOK = NO + +# If set to YES, the inheritance and collaboration graphs will show the +# relations between templates and their instances. + +TEMPLATE_RELATIONS = NO + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT +# tags are set to YES then doxygen will generate a graph for each documented +# file showing the direct and indirect include dependencies of the file with +# other documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and +# HAVE_DOT tags are set to YES then doxygen will generate a graph for each +# documented header file showing the documented files that directly or +# indirectly include this file. + +INCLUDED_BY_GRAPH = YES + +# If the CALL_GRAPH and HAVE_DOT options are set to YES then +# doxygen will generate a call dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable call graphs +# for selected functions only using the \callgraph command. + +CALL_GRAPH = YES + +# If the CALLER_GRAPH and HAVE_DOT tags are set to YES then +# doxygen will generate a caller dependency graph for every global function +# or class method. Note that enabling this option will significantly increase +# the time of a run. So in most cases it will be better to enable caller +# graphs for selected functions only using the \callergraph command. + +CALLER_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will generate a graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES +# then doxygen will show the dependencies a directory has on other directories +# in a graphical way. The dependency relations are determined by the #include +# relations between the files in the directories. + +DIRECTORY_GRAPH = YES + +# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images +# generated by dot. Possible values are svg, png, jpg, or gif. +# If left blank png will be used. + +DOT_IMAGE_FORMAT = svg + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found in the path. + +DOT_PATH = + +# The DOTFILE_DIRS tag can be used to specify one or more directories that +# contain dot files that are included in the documentation (see the +# \dotfile command). + +DOTFILE_DIRS = + +# The MSCFILE_DIRS tag can be used to specify one or more directories that +# contain msc files that are included in the documentation (see the +# \mscfile command). + +MSCFILE_DIRS = + +# The DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of +# nodes that will be shown in the graph. If the number of nodes in a graph +# becomes larger than this value, doxygen will truncate the graph, which is +# visualized by representing a node as a red box. Note that doxygen if the +# number of direct children of the root node in a graph is already larger than +# DOT_GRAPH_MAX_NODES then the graph will not be shown at all. Also note +# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH. + +DOT_GRAPH_MAX_NODES = 50 + +# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the +# graphs generated by dot. A depth value of 3 means that only nodes reachable +# from the root by following a path via at most 3 edges will be shown. Nodes +# that lay further from the root node will be omitted. Note that setting this +# option to 1 or 2 may greatly reduce the computation time needed for large +# code bases. Also note that the size of a graph can be further restricted by +# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction. + +MAX_DOT_GRAPH_DEPTH = 0 + +# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent +# background. This is disabled by default, because dot on Windows does not +# seem to support this out of the box. Warning: Depending on the platform used, +# enabling this option may lead to badly anti-aliased labels on the edges of +# a graph (i.e. they become hard to read). + +DOT_TRANSPARENT = NO + +# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output +# files in one run (i.e. multiple -o and -T options on the command line). This +# makes dot run faster, but since only newer versions of dot (>1.8.10) +# support this, this feature is disabled by default. + +DOT_MULTI_TARGETS = NO + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will +# remove the intermediate dot files that are used to generate +# the various graphs. + +DOT_CLEANUP = YES diff --git a/doc/authors.md b/doc/authors.md new file mode 100644 index 000000000..5630527a8 --- /dev/null +++ b/doc/authors.md @@ -0,0 +1,270 @@ +Zcash Contributors +================== + +Jack Grigg (1335) +Kris Nuttycombe (698) +Simon Liu (460) +Sean Bowe (404) +Daira Hopwood (396) +Eirik Ogilvie-Wigley (216) +Greg Pfeil (208) +Wladimir J. van der Laan (160) +Pieter Wuille (153) +Alfredo Garcia (120) +Marshall Gaucher (119) +Taylor Hornby (118) +Marco Falke (91) +Ying Tong Lai (90) +Jonas Schnelli (90) +Jay Graber (89) +Larry Ruane (88) +sasha (80) +Cory Fields (78) +Matt Corallo (62) +Nathan Wilcox (57) +Daira Emma Hopwood (47) +practicalswift (43) +Dimitris Apostolou (43) +Kevin Gallagher (38) +fanquake (37) +Carl Dong (30) +Alex Morcos (28) +Luke Dashjr (27) +Jorge Timón (25) +Gregory Maxwell (24) +John Newbery (23) +Suhas Daftuar (20) +furszy (18) +Jonathan "Duke" Leto (18) +Marius Kjærstad (17) +syd (16) +Patick Strateman (16) +Charlie O'Keefe (16) +avnish (14) +Per Grön (14) +Benjamin Winston (13) +teor (12) +Steven Smith (12) +Pavel Janík (12) +Patrick Strateman (12) +Jeremy Rubin (12) +Ariel Gabizon (12) +Russell Yanofsky (11) +Paige Peterson (11) +Kaz Wesley (11) +João Barbosa (11) +Philip Kaufmann (10) +Peter Todd (10) +ying tong (9) +nomnombtc (9) +Zancas Wilcox (9) +kozyilmaz (8) +Jeff Garzik (8) +James O'Beirne (8) +Hennadii Stepanov (8) +Chun Kuan Lee (8) +Ben Wilson (8) +Karl-Johan Alm (7) +Alex Wied (7) +David Mercer (6) +Daniel Kraft (6) +Daniel Cousens (6) +Casey Rodarmor (6) +jnewbery (5) +ca333 (5) +MeshCollider (5) +Johnathan Corgan (5) +George Tankersley (5) +Gavin Andresen (5) +Gareth Davies (5) +sandakersmann (4) +instagibbs (4) +gladcow (4) +WO (4) +Sjors Provoost (4) +Nate Wilcox (4) +Miodrag Popović (4) +Jim Posen (4) +Evan Klitzke (4) +DeckerSU (4) +Ben Woosley (4) +mruddy (3) +lpescher (3) +isle2983 (3) +elbandi (3) +Thomas Snider (3) +NikVolf (3) +Martin Ankerl (3) +Julian Fleischer (3) +Jason Davies (3) +Ethan Heilman (3) +Eric Lombrozo (3) +Danny Willems (3) +Conrado Gouvea (3) +Anthony Towns (3) +Alfie John (3) +Aditya Kulkarni (3) +ANISH M (3) +whythat (2) +rofl0r (2) +ptschip (2) +noname45688@gmail.com (2) +kpcyrd (2) +kobake (2) +hexabot (2) +face (2) +ebfull (2) +aniemerg (2) +Yuri Zhykin (2) +UdjinM6 (2) +Tim Ruffing (2) +Solar Designer (2) +Sebastian Falbesoner (2) +Scott (2) +S. Matthew English (2) +Robert C. Seacord (2) +Pejvan (2) +Pavol Rusnak (2) +Pavel Vasin (2) +Mustafa (2) +Matthew King (2) +Mary Moore-Simmons (2) +Mark Friedenbach (2) +Marek (2) +Jon Atack (2) +Joe Turgeon (2) +Jesse Cohen (2) +Jeffrey Czyz (2) +Jack Gavigan (2) +ITH4Coinomia (2) +Dan Raviv (2) +Dagur Valberg Johannsson (2) +Bryant Eisenbach (2) +Brian Stafford (2) +Brad Miller (2) +Bjorn Hjortsberg (2) +Amgad Abdelhafez (2) +Alex Tsankov (2) +Alex (2) +Akio Nakamura (2) +ロハン ダル (1) +zathras-crypto (1) +vim88 (1) +user (1) +unsystemizer (1) +tulip (1) +tpantin (1) +sgmoore (1) +randy-waterhouse (1) +plutoforever (1) +nathannaveen (1) +murrayn (1) +mrbandrews (1) +kirkalx (1) +kazcw (1) +jeff-liang (1) +jc (1) +idm (1) +glowang (1) +ewillbefull@gmail.com (1) +emilrus (1) +dismad (1) +dexX7 (1) +dependabot[bot] (1) +daniel (1) +cronicc (1) +codetriage-readme-bot (1) +calebogden (1) +ayleph (1) +avnish98 (1) +adityapk00 (1) +Za Wilcox (1) +Yasser Isa (1) +William M Peaster (1) +Vidar Holen (1) +Vasil Dimov (1) +Ulrich Kempken (1) +TrellixVulnTeam (1) +Tom Ritter (1) +Tom Harding (1) +Technetium (1) +Stephen (1) +Shaul Kfir (1) +Ross Nicoll (1) +Rod Vagg (1) +Robert McLaughlin (1) +Richard Littauer (1) +René Nyffenegger (1) +R E Broadley (1) +Puru (1) +Peter Pratscher (1) +Peter Bushnell (1) +Pedro Branco (1) +Paul Georgiou (1) +Paragon Initiative Enterprises, LLC (1) +NicolasDorier (1) +Nicolas DORIER (1) +Nick (1) +Nathaniel Mahieu (1) +Murilo Santana (1) +Miles Manley (1) +Michał Janiszewski (1) +Maxwell Gubler (1) +Matt Quinn (1) +Marko Bencun (1) +Luv Khemani (1) +Louis Nyffenegger (1) +LongShao007 (1) +LitecoinZ (1) +Leo Arias (1) +Lauda (1) +Lars-Magnus Skog (1) +Kristaps Kaupe (1) +Kevin Pan (1) +Karel Bilek (1) +Josh Lehan (1) +Josh Ellithorpe (1) +Jonas Nick (1) +Jon Layton (1) +Jeffrey Walton (1) +Janito Vaqueiro Ferreira Filho (1) +James White (1) +Jainan-Tandel (1) +Igor Cota (1) +Ian T (1) +Ian Munoz (1) +Ian Kelling (1) +Gregory Sanders (1) +Gaurav Rana (1) +Forrest Voight (1) +Florian Schmaus (1) +Eran Tromer (1) +Elliot Olds (1) +Dimitris Tsapakidis (1) +DesWurstes (1) +Denis Lukianov (1) +David Llop (1) +Christian von Roques (1) +Chirag Davé (1) +Cameron Boehmer (1) +BtcDrak (1) +Bryan Stitt (1) +Bruno Arueira (1) +Braydon Fuller (1) +Boris Hajduk (1) +Bob McElrath (1) +Bitcoin Error Log (1) +Bernhard M. Wiedemann (1) +Ashley Holman (1) +Andrés G. Aragoneses (1) +Andrew Chow (1) +Allan Niemerg (1) +Alex van der Peet (1) +Ahmad Kazi (1) +Adam Weiss (1) +Adam Langley (1) +Adam Brown (1) +Aaron Clauson (1) +4ZEC (1) +251 (1) +21E14 (1) diff --git a/doc/bips.md b/doc/bips.md new file mode 100644 index 000000000..14c7e372f --- /dev/null +++ b/doc/bips.md @@ -0,0 +1,4 @@ +BIPs that are implemented by Zcash (up-to-date up to **v1.1.0**): + +* Numerous historic BIPs were present in **v1.0.0** at launch; see [the protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf) for details. +* [`BIP 111`](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki): `NODE_BLOOM` service bit added, but only enforced for peer versions `>=170004` as of **v1.1.0** ([PR #2814](https://github.com/zcash/zcash/pull/2814)). diff --git a/doc/book/.gitignore b/doc/book/.gitignore new file mode 100644 index 000000000..7585238ef --- /dev/null +++ b/doc/book/.gitignore @@ -0,0 +1 @@ +book diff --git a/doc/book/book.toml b/doc/book/book.toml new file mode 100644 index 000000000..a67147b67 --- /dev/null +++ b/doc/book/book.toml @@ -0,0 +1,6 @@ +[book] +authors = ["Jack Grigg"] +language = "en" +multilingual = false +src = "src" +title = "The zcashd Book" diff --git a/doc/book/src/README.md b/doc/book/src/README.md new file mode 100644 index 000000000..3bad00702 --- /dev/null +++ b/doc/book/src/README.md @@ -0,0 +1 @@ +{{#include ../../../README.md}} diff --git a/doc/book/src/SUMMARY.md b/doc/book/src/SUMMARY.md new file mode 100644 index 000000000..60ff3c665 --- /dev/null +++ b/doc/book/src/SUMMARY.md @@ -0,0 +1,23 @@ +# The zcashd Book + +[zcashd](README.md) +- [User Documentation](user.md) + - [Release Support](user/release-support.md) + - [Platform Support](user/platform-support.md) + - [Wallet Backup](user/wallet-backup.md) + - [Shielding Coinbase Outputs](user/shield-coinbase.md) + - [Data Directory Structure](user/files.md) + - [Metrics](user/metrics.md) + - [Using `zcashd` with Tor](user/tor.md) + - [Security Warnings](user/security-warnings.md) + - [Deprecated Features](user/deprecation.md) +- [Developer Documentation](dev.md) + - [DNS Seeders](dev/dnsseed-policy.md) + - [Rust in `zcashd`](dev/rust.md) + - [Regtest Tips And Hints](dev/regtest.md) + - [Platform Tier Policy](dev/platform-tier-policy.md) + - [Deprecation Procedure](dev/deprecation.md) +- [Design](design.md) + - [Chain State](design/chain-state.md) + - ["Coins" View](design/coins-view.md) + - [P2P Data Propagation](design/p2p-data-propagation.md) diff --git a/doc/book/src/design.md b/doc/book/src/design.md new file mode 100644 index 000000000..643207e11 --- /dev/null +++ b/doc/book/src/design.md @@ -0,0 +1,9 @@ +# Design + +Zcash was originally a fork of Bitcoin 0.11.2, and as such the `zcashd` node architecture +is very similar to `bitcoind`. There are however several differences, most notably the +addition of shielded pools to the consensus logic and full node state. + +In this section of the book, we describe the overall architecture that we inherit from +`bitcoind`, the changes we have made to the inherited components, and the new components +we have introduced. diff --git a/doc/book/src/design/chain-state.md b/doc/book/src/design/chain-state.md new file mode 100644 index 000000000..0e5057f13 --- /dev/null +++ b/doc/book/src/design/chain-state.md @@ -0,0 +1,3 @@ +# Chain state + +TBD diff --git a/doc/book/src/design/coins-view.md b/doc/book/src/design/coins-view.md new file mode 100644 index 000000000..79a44fdf2 --- /dev/null +++ b/doc/book/src/design/coins-view.md @@ -0,0 +1,10 @@ +# "Coins" view + +TBD + +## Notes + +- This is the main context in which `CTxOut::IsNull()` is used. The other is a + single spot in the mempool code. Once we've backported the + [per-txout CoinsDB](https://github.com/bitcoin/bitcoin/pull/10195) we can + hopefully eliminate this method. diff --git a/doc/book/src/design/p2p-data-propagation.md b/doc/book/src/design/p2p-data-propagation.md new file mode 100644 index 000000000..6296e9df1 --- /dev/null +++ b/doc/book/src/design/p2p-data-propagation.md @@ -0,0 +1,43 @@ +# P2P data propagation + +This page contains notes about how block and transaction data is tracked and propagated by +`zcashd`. Most of this behaviour is inherited from Bitcoin Core, but some differences have +developed. + +Some of this content is duplicated from in-code comments, but assembling this summary in +one place is generally useful for understanding the overall dynamic :) + +## `recentRejects` + +When a transaction is rejected by `AcceptToMemoryPool`, the transaction is added to the +`recentRejects` Bloom filter, so that we don't process it again. The Bloom filter resets +whenever the chain tip changes, as previously invalid transactions might become valid. + +To prevent DoS attacks against wallets submitting transactions, `recentRejects` needs to +store a commitment to the entire transaction. This ensures that if a transaction is +malleated by a network peer to invalidate its authorizing data, the node will ignore +future advertisements of that specific transaction, but still request alternative versions +of the same txid (which might have valid authorizing data). + +- For pre-v5 transactions, the txid commits to the entire transaction, and the wtxid is + the txid with a globally-fixed (all-ones) suffix. +- For v5+ transactions, the wtxid commits to the entire transaction. + +## `mapOrphanTransactions` + +Upstream uses this map to store transactions that are rejected by `AcceptToMemoryPool` +because the node doesn't have their transparent inputs. `zcashd` inherits this behaviour +but limits it to purely-transparent transactions (that is, if a transaction contains any +shielded components, the node rejects it as invalid and adds it to `recentRejects`). + +`mapOrphanTransactions` indexes transactions by txid. This means that if an orphan +transaction is received (spending transparent UTXOs the node does not know about), and it +also happens to be invalid for other reasons (subsequent `AcceptToMemoryPool` rules that +haven't yet been checked), then the node will not request any v5+ transactions with the +same txid but different authorizing data. This does not create a DoS problem for wallets, +because an adversary that manipulated an orphan transaction to be invalid under the above +constraints would also need to prevent the orphan's parent from entering the mempool, and +eventually a parent is reached that is not an orphan. Once the orphan's direct parent is +accepted, the orphan is re-evaluated, and if it had been manipulated to be invalid, its +wtxid is added to `recentRejects` while its txid is removed from `mapOrphanTransactions`, +enabling the wallet to rebroadcast the unmodified transaction. diff --git a/doc/book/src/dev.md b/doc/book/src/dev.md new file mode 100644 index 000000000..8fcbaddd0 --- /dev/null +++ b/doc/book/src/dev.md @@ -0,0 +1,3 @@ +# Developer Documentation + +This section contains documentation aimed at contributors to the `zcashd` codebase. diff --git a/doc/book/src/dev/deprecation.md b/doc/book/src/dev/deprecation.md new file mode 100644 index 000000000..16e68e9f3 --- /dev/null +++ b/doc/book/src/dev/deprecation.md @@ -0,0 +1,38 @@ +Deprecation Procedure +===================== + +From time to time, features of `zcashd` and its associated wallet and RPC API are +deprecated to allow eventual removal of functionality that has been superseded +by more recent improvements. Deprecation follows a process whereby deprecate +features can be explicitly turned on or off using the +`-allowdeprecated=` CLI argument. + +`zcashd` internally supports two sets of deprecated feature flags in +`src/deprecation.h`: +- `DEFAULT_ALLOW_DEPRECATED` contains the set of features that remain available + for use without having to be specifically enabled using `-allowdeprecated`. +- `DEFAULT_DENY_DEPRECATED` contains the set of features that are not enabled + by default, and must be explicitly enabled using `-allowdeprecated`. + +Deprecation of a feature occurs as a 3-step process: + +1. A deprecation flag is selected for the feature, and added to + `DEFAULT_ALLOW_DEPRECATED`. The fact of its deprecation is announced, and + any functionality that supersedes the deprecated feature (if any) is + documented, in the release notes. The string `DEPRECATED` is added to + user-facing API documentation and CLI help text. +2. The deprecation flag is removed from `DEFAULT_ALLOW_DEPRECATED` and added to + `DEFAULT_DENY_DEPRECATED`. +3. The deprecated feature is removed entirely, and its deprecation flag is + removed. + +Features that enter Stage 1 in a particular release should be disabled by +default after no fewer than 3 releases that update `zcashd`'s +minor-version, and features should only be fully removed after a total of 6 minor-version +updates. `zcashd`'s release schedule intends to produce a release that updates +the minor version every 6 weeks, so deprecated features remain accessible by +default for approximately 18 weeks, and then can be expected to be removed no +less than 36 weeks from their initial deprecation. The deprecation timeline for +each newly deprecated feature should be documented in +[../user/deprecation.md](../user/deprecation.md). + diff --git a/doc/book/src/dev/dnsseed-policy.md b/doc/book/src/dev/dnsseed-policy.md new file mode 100644 index 000000000..90fead217 --- /dev/null +++ b/doc/book/src/dev/dnsseed-policy.md @@ -0,0 +1,54 @@ +Expectations for DNS Seed operators +==================================== + +Zcash attempts to minimize the level of trust in DNS seeds, +but DNS seeds still pose a small amount of risk for the network. +As such, DNS seeds must be run by entities which have some minimum +level of trust within the Zcash community. + +Other implementations of Zcash software may also use the same +seeds and may be more exposed. In light of this exposure, this +document establishes some basic expectations for operating DNS seeds. + +0. A DNS seed operating organization or person is expected to follow good +host security practices, maintain control of applicable infrastructure, +and not sell or transfer control of the DNS seed. Any hosting services +contracted by the operator are equally expected to uphold these expectations. + +1. The DNS seed results must consist exclusively of fairly selected and +functioning Zcash nodes from the public network to the best of the +operator's understanding and capability. + +2. For the avoidance of doubt, the results may be randomized but must not +single out any group of hosts to receive different results unless due to an +urgent technical necessity and disclosed. + +3. The results may not be served with a DNS TTL of less than one minute. + +4. Any logging of DNS queries should be only that which is necessary +for the operation of the service or urgent health of the Zcash +network and must not be retained longer than necessary nor disclosed +to any third party. + +5. Information gathered as a result of the operators node-spidering +(not from DNS queries) may be freely published or retained, but only +if this data was not made more complete by biasing node connectivity +(a violation of expectation (1)). + +6. Operators are encouraged, but not required, to publicly document the +details of their operating practices. + +7. A reachable email contact address must be published for inquiries +related to the DNS seed operation. + +If these expectations cannot be satisfied the operator should discontinue +providing services and contact the active Zcash development team as well as +creating an issue in the [Zcash repository](https://github.com/zcash/zcash). + +Behavior outside of these expectations may be reasonable in some +situations but should be discussed in public in advance. + +See also +---------- +- [zcash-seeder](https://github.com/zcash/zcash-seeder) is a reference + implementation of a DNS seed. diff --git a/doc/book/src/dev/platform-tier-policy.md b/doc/book/src/dev/platform-tier-policy.md new file mode 100644 index 000000000..b4149f864 --- /dev/null +++ b/doc/book/src/dev/platform-tier-policy.md @@ -0,0 +1,136 @@ +# Platform Tier Policy + +## General + +ECC provides three tiers of platform support, modeled after the +[Rust Target Tier Policy](https://doc.rust-lang.org/stable/rustc/platform-tier-policy.html): + +- The Zcash developers provide no guarantees about tier 3 platforms; they exist in the + codebase, but may or may not build. +- ECC's continuous integration checks that tier 2 platforms will always build, but they + may or may not pass tests. +- ECC's continuous integration checks that tier 1 platforms will always build and pass + tests. + +Adding a new tier 3 platform imposes minimal requirements; we focus primarily on avoiding +disruption to other ongoing Zcash development. + +Tier 2 and tier 1 platforms place work on Zcash developers as a whole, to avoid breaking +the platform. The broader Zcash community may also feel more inclined to support +higher-tier platforms in their downstream uses of `zcashd` (though they are not obligated +to do so). Thus, these tiers require commensurate and ongoing efforts from the maintainers +of the platform, to demonstrate value and to minimize any disruptions to ongoing Zcash +development. + +This policy defines the requirements for accepting a proposed platform at a given level of +support. + +Each tier builds on all the requirements from the previous tier, unless overridden by a +stronger requirement. + +While these criteria attempt to document the policy, that policy still involves human +judgment. Platforms must fulfill the spirit of the requirements as well, as determined by +the judgment of the approving reviewers. Reviewers and team members evaluating platforms +and platform-specific patches should always use their own best judgment regarding the +quality of work, and the suitability of a platform for the Zcash project. Neither this +policy nor any decisions made regarding platforms shall create any binding agreement or +estoppel by any party. + +For a list of all supported platforms and their corresponding tiers ("tier 3", "tier 2", +or "tier 1"), see [Platform Support](../user/platform-support.md). + +The availability or tier of a platform in Zcash releases is not a hard stability guarantee +about the future availability or tier of that platform. Higher-level platform tiers are an +increasing commitment to the support of a platform, and we will take that commitment and +potential disruptions into account when evaluating the potential demotion or removal of a +platform that has been part of a stable release. The promotion or demotion of a platform +will not generally affect existing stable releases, only current development and future +releases. + +In this policy, the words "MUST" and "MUST NOT" specify absolute requirements that a +platform must meet to qualify for a tier. The words "SHOULD" and "SHOULD NOT" specify +requirements that apply in almost all cases, but for which the approving teams may grant +an exception for good reason. The word "MAY" indicates something entirely optional, and +does not indicate guidance or recommendations. This language is based on +[IETF RFC 2119](https://tools.ietf.org/html/rfc2119). + +## Tier 3 platform policy + +At this tier, ECC provides no official support for a platform, so we place minimal +requirements on the introduction of platforms. + +A proposed new tier 3 platform MUST be reviewed and approved by a member of the ECC core +team based on these requirements. + +- The platform MUST provide documentation for the Zcash community explaining how to build + for the platform, using cross-compilation if possible. If the platform supports running + binaries, or running tests (even if they do not pass), the documentation MUST explain + how to run such binaries or tests for the platform, using emulation if possible or + dedicated hardware if necessary. +- Tier 3 platforms MUST NOT impose burden on the authors of pull requests, or other + developers in the community, to maintain the platform. In particular, do not post + comments (automated or manual) on a PR that derail or suggest a block on the PR based on + a tier 3 platform. Do not send automated messages or notifications (via any medium, + including via @) to a PR author or others involved with a PR regarding a tier 3 + platform, unless they have opted into such messages. +- Patches adding or updating tier 3 platforms MUST NOT break any existing tier 2 or tier 1 + platform, and MUST NOT knowingly break another tier 3 platform without approval of the + ECC core team. + +If a tier 3 platform stops meeting these requirements, or the platform shows no signs of +activity and has not built for some time, or removing the platform would improve the +quality of the Zcash codebase, we MAY post a PR to remove it. + +## Tier 2 platform policy + +At this tier, the Zcash developers guarantee that a platform builds, and will reject +patches that fail to build for a platform. Thus, we place requirements that ensure the +platform will not block forward progress of the Zcash project. + +A proposed new tier 2 platform MUST be reviewed and approved by the ECC core team based +on these requirements. + +In addition, the ECC infrastructure team MUST approve the integration of the platform into +Continuous Integration (CI), and the tier 2 CI-related requirements. This review and +approval MAY take place in a PR adding the platform to CI, or simply by an infrastructure +team member reporting the outcome of a team discussion. + +- A tier 2 platform MUST have value to people other than its proponents. (It MAY still be + a niche platform, but it MUST NOT be exclusively useful for an inherently closed group.) +- A tier 2 platform MUST have a designated team of developers (the "platform maintainers") + supporting it, without the need for a paid support contract. +- The platform MUST NOT place undue burden on Zcash developers not specifically concerned + with that platform. Zcash developers are expected to not gratuitously break a tier 2 + platform, but are not expected to become experts in every tier 2 platform, and are not + expected to provide platform-specific implementations for every tier 2 platform. +- The platform MUST build reliably in CI, for all components that ECC's CI considers + mandatory. +- All requirements for tier 3 apply. + +A tier 2 platform MAY be demoted or removed if it no longer meets these requirements. + +## Tier 1 platform policy + +At this tier, the Zcash developers guarantee that a platform builds and passes all tests, +and will reject patches that fail to build or pass the test suite on a platform. We hold +tier 1 platforms to our highest standard of requirements. + +- Tier 1 platforms MUST have substantial, widespread interest within the Zcash community, + and MUST serve the ongoing needs of multiple production users of Zcash across multiple + organizations or projects. These requirements are subjective. A tier 1 platform MAY be + demoted or removed if it becomes obsolete or no longer meets this requirement. +- The platform MUST build and pass tests reliably in CI, for all components that ECC's CI + considers mandatory. +- Building the platform and running the test suite for the platform MUST NOT take + substantially longer than other platforms, and SHOULD NOT substantially raise the + maintenance burden of the CI infrastructure. +- Tier 1 platforms MUST NOT have a hard requirement for signed, verified, or otherwise + "approved" binaries. Developers MUST be able to build, run, and test binaries for the + platform on systems they control, or provide such binaries for others to run. (Doing so + MAY require enabling some appropriate "developer mode" on such systems, but MUST NOT + require the payment of any additional fee or other consideration, or agreement to any + onerous legal agreements.) +- All requirements for tier 2 apply. + +A tier 1 platform MAY be demoted or removed if it no longer meets these requirements but +still meets the requirements for a lower tier. diff --git a/doc/book/src/dev/regtest.md b/doc/book/src/dev/regtest.md new file mode 100644 index 000000000..649d9107c --- /dev/null +++ b/doc/book/src/dev/regtest.md @@ -0,0 +1,165 @@ +# Regtest + +_Regtest_ ("regression test") is one of the three _network types_ +supported by Zcash, the others being `testnet` and `mainnet`. +Regtest is an entirely local, self-contained mode -- your node or nodes +do not talk with peers out in the world. It gives you complete +control of the state of the blockchain and the sequence of events. +You start with an empty blockchain (just the genesis block, block 0). +Blocks can be mined instantly, and must be created explicitly. + +You can run one or more regtest nodes on the same system. +The [RPC tests](https://github.com/zcash/zcash/tree/master/qa/rpc-tests) +use `regtest` mode (usually starting multiple nodes), but you may use it +manually and interactively to learn, test, and experiment. Most often +just one node is used in this case. + +## Example session + +Here's a sample session (after you've built `zcashd` and `zcash-cli`): + +``` +$ mkdir /tmp/regtest-datadir +$ cat </tmp/regtest-datadir/zcash.conf +regtest=1 +rpcuser=u +rpcpassword=p +rpcport=18132 +EOF +$ src/zcashd -daemon -datadir=/tmp/regtest-datadir +``` + +Watch `tmp/regtest-datadir/regtest/debug.log` to see what `zcashd` is doing. +It may also be useful to start `zcashd` with `-debug` to generate much +more logging. Now we can send RPCs to the node: + +``` +$ src/zcash-cli -datadir=/tmp/regtest-datadir getblockchaininfo +{ + "chain": "regtest", + "blocks": 0, + "initial_block_download_complete": false, + "headers": 0, + (...) +} +# Generate (mine) three blocks: +$ src/zcash-cli -datadir=/tmp/regtest-datadir generate 3 +[ + "05040271f43f78e3870a88697eba201aa361ea5802c69eadaf920ff376787242", + "0469f2df43dda69d521c482679b2db3c637b1721222511302584ac75e057c859", + "0ab7a26e7b3b5dfca077728de90da0cfd1c49e1edbc130a52de4062b1aecac75" +] +$ src/zcash-cli -datadir=/tmp/regtest-datadir getblockchaininfo +{ + "chain": "regtest", + "blocks": 3, + "initial_block_download_complete": true, + "headers": 3, + (...) +} +$ src/zcash-cli -datadir=/tmp/regtest-datadir stop +Zcash server stopping +$ +``` +## Network upgrades + +Zcash has adopted a series of +[network upgrades](https://github.com/zcash/zcash/blob/master/src/consensus/upgrades.cpp). +On `mainnet` and `testnet`, these activate at +fixed, known block heights ([example](https://github.com/zcash/zcash/blob/master/src/chainparams.cpp#L117)). +In `regtest` mode, you determine the activation heights. Upgrades may occur at +any height greater than 0, and multiple upgrades can occur at the same height. The upgrades +have a strict ordering (as shown in the upgrades source file); for example, Canopy can't +be activated before Blossom. + +You specify the upgrade heights using multiple `-nuparams=`_\_ arguments. +(The branch IDs are available in the +[upgrades.cpp file](https://github.com/zcash/zcash/blob/master/src/consensus/upgrades.cpp)) +It's convenient to add these to the configuration file, for example: +``` +$ cat <>/tmp/regtest-datadir/zcash.conf +nuparams=76b809bb:1 +nuparams=f5b9230b:5 +EOF +``` +(Alternatively, you can specify these on the `zcashd` command line.) +You need not activate every upgrade explicitly. The example activates Sapling +(branchID 76b809bb) at height 1; activating Sapling implies activating Overwinter, so this +is done automatically. Similarly, activating Heartwood at height 5 +also simultaneously activates Blossom. Since no later upgrades are specified, none +of them will activate, regardless of height reached. + +**IMPORTANT**: if you change the network upgrade heights from one +test run to the next, it's almost always necessary to start fresh +by removing the data directory, otherwise you'll encounter strange errors. + +You can see which network upgrades are currently active and which are pending +(using the above `nuparams` settings as an example): +``` +$ src/zcash-cli -datadir=/tmp/regtest-datadir generate 2 +$ src/zcash-cli -datadir=/tmp/regtest-datadir getblockchaininfo +{ + "blocks": 2, + (...) + "upgrades": { + "5ba81b19": { + "name": "Overwinter", + "activationheight": 1, + "status": "active", + "info": "See https://z.cash/upgrade/overwinter/ for details." + }, + "76b809bb": { + "name": "Sapling", + "activationheight": 1, + "status": "active", + "info": "See https://z.cash/upgrade/sapling/ for details." + }, + "2bb40e60": { + "name": "Blossom", + "activationheight": 5, + "status": "pending", + "info": "See https://z.cash/upgrade/blossom/ for details." + }, + "f5b9230b": { + "name": "Heartwood", + "activationheight": 5, + "status": "pending", + "info": "See https://z.cash/upgrade/heartwood/ for details." + } + }, + (...) +} +``` + +## Manual testing within an RPC (Python) test run + +It is often useful, either when debugging an issue or simply when you want to put +the node into a certain state, to use the RPC test framework to produce the desired +state and then be able to manually interrogate and modify that state using `zcash-cli` +to execute RPC calls. An easy way to do that is as follows: + +Add the line `import time; time.sleep(999999)` (the units are seconds) somewhere +within an RPC test to pause its execution at that point. Start the test, and then: + +``` +$ ps alx | grep zcashd +0 1000 96247 96246 20 0 1426304 123952 futex_ SLl+ pts/12 0:18 /g/zcash/src/zcashd -datadir=/tmp/test9d907s8a/96246/node0 -keypool=1 -discover=0 -rest -nuparams=5ba81b19:1 -nuparams=76b809bb:1 -debug=mempool -mempooltxcostlimit=8000 +0 1000 96274 96246 20 0 744092 85568 - RLl+ pts/12 0:05 /g/zcash/src/zcashd -datadir=/tmp/test9d907s8a/96246/node1 -keypool=1 -discover=0 -rest -nuparams=5ba81b19:1 -nuparams=76b809bb:1 -debug=mempool -mempooltxcostlimit=8000 +$ +``` +Now you can interact with the running test node by copy-and-pasting its +`-datadir` argument, for example: + +``` +$ src/zcash-cli -datadir=/tmp/test9d907s8a/96246/node0 getblockchaininfo +``` +(The other `zcashd` command-line arguments are generally not needed by +`zcash-cli`.) You can see the running node's debug log file: +``` +$ cat /tmp/test9d907s8a/96246/node0/regtest/debug.log +``` +or look at its configuration file. +``` +$ cat /tmp/test9d907s8a/96246/node0/zcash.conf +``` +In this way, the RPC test framework can teach us more about running `regtest` nodes. \ No newline at end of file diff --git a/doc/book/src/dev/rust.md b/doc/book/src/dev/rust.md new file mode 100644 index 000000000..fe5616744 --- /dev/null +++ b/doc/book/src/dev/rust.md @@ -0,0 +1,126 @@ +# Rust in `zcashd` + +`zcashd` is primarily a C++ codebase, but most new code is being written in Rust +where possible. + +## Auditing Rust dependencies + +We use [`cargo-vet`] to audit our Rust dependencies. This means that after +adding a new dependency, or updating existing dependencies with `cargo update`, +CI will fail until corresponding audits have been added. + +We also have a significant number of pre-existing unaudited dependency versions +that are excluded from auditing checks. We aim to reduce this list over time. +New entries should not be added to the exclusion list without justification. + +To audit a dependency, first [install `cargo-vet`] and then follow the +["Performing Audits" guide]. If you are updating a dependency then instead of +auditing the new version in its entirety, you can optionally just audit the +delta between the old and new versions - even if the old version is in the +"unaudited" exclusion list. + +[`cargo-vet`]: https://github.com/mozilla/cargo-vet +[install `cargo-vet`]: https://mozilla.github.io/cargo-vet/install.html +["Performing Audits" guide]: https://mozilla.github.io/cargo-vet/performing-audits.html + +## Adding new dependencies in online-Rust mode + +The `zcashd` build system pins all dependencies, and in order to facilitate +reproducible builds, `cargo` is configured to run in offline mode with vendored +crates. This means that if, for example, you add the `foobar` crate to +`Cargo.toml`, you will likely see an error similar to this: + +``` +$ cargo check +error: no matching package named `foobar` found +location searched: registry `https://github.com/rust-lang/crates.io-index` +required by package `librustzcash v0.2.0 (/path/to/zcash)` +``` + +To add dependencies that are compatible with the reproducible build system, you need to follow these steps: + +1. First, if you've made changes to dependencies in `Cargo.toml`, these must be reverted before the next step: + ``` + git stash + ``` +2. Next, reconfigure the build system for "online" mode: + ``` + CONFIGURE_FLAGS=--enable-online-rust ./zcutil/build.sh + ``` +3. Now, introduce the dependency changes into `Cargo.toml`. If you saved changes in Step 1 with `git stash`, you can reapply them: + ``` + git stash pop + ``` +4. Update `Cargo.lock`: + ``` + cargo check + ``` +5. Commit the changes to `Cargo.toml` and `Cargo.lock` together: + ``` + git commit ./Cargo.{toml,lock} + ``` +6. Verify the reproducible build works in vendored/offline mode without the `--enable-online-rust` flag: + ``` + ./zcutil/build.sh + ``` + +## Using an unpublished Rust dependency + +Occasionally we may need to depend on an unpublished git revision of a crate. +We sometimes want to prove out API changes to the `zcash_*` Rust crates by +migrating `zcashd` to them first, before making a public crate release. Or we +might need to cut a `zcashd` release before some upstream dependency has +published a fix we need. In these cases, we use patch dependencies. + +For example, to use an unpublished version of the `orchard` crate that includes +a new API, add the following patch to `Cargo.toml`: + +``` +[dependencies] +# This dependency is listed with a version, meaning it comes from crates.io; the +# patch goes into a [patch.crates-io] section. +orchard = "0.4" +... + +[patch.crates-io] +orchard = { git = "https://github.com/zcash/orchard.git", rev = "..." } +``` + +Note that if the git repository contains a workspace of interconnected crates +(for example, https://github.com/zcash/librustzcash), you will need to provide +patches for each of the dependencies that reference the same git revision. + +You also need to update `.cargo/config.offline` to add a replacement definition +for each `(git, rev)` pair. Run `./test/lint/lint-cargo-patches.sh` to get the +lines that need to be present. + +Finally, `./qa/supply-chain/config.toml` needs to be updated to ignore patched +dependencies. Run `cargo vet regenerate audit-as-crates-io`, and then ensure the +newly-added lines are of the form `audit-as-crates-io = false`. + +## Using a local Rust dependency + +During development, you can use a locally checked out version of a dependency +by applying a [`cargo` patch](https://doc.rust-lang.org/cargo/reference/overriding-dependencies.html#the-patch-section). + +For example, to use a local version of the `orchard` crate that includes a new +API, add the following patch to `Cargo.toml`: + +``` +[dependencies] +# This dependency is listed with a version, meaning it comes from crates.io; the +# patch goes into a [patch.crates-io] section. +orchard = "0.0" +... + +[patch.crates-io] +# Comment out any existing patch, if present. +# orchard = { git = "https://github.com/zcash/orchard.git", rev = "..." } + +# Add this patch (both relative and absolute paths work): +orchard = { path = "../relative/path/to/orchard" } +``` + +Usually you can apply a patch to use a locally checked out dependency without +needing to build `zcashd` in online-Rust mode. However, if your local changes +include a new dependency, you will need to ensure you are in online-Rust mode. diff --git a/doc/book/src/doc/imgs/logo.png b/doc/book/src/doc/imgs/logo.png new file mode 120000 index 000000000..15d77010f --- /dev/null +++ b/doc/book/src/doc/imgs/logo.png @@ -0,0 +1 @@ +../../../../imgs/logo.png \ No newline at end of file diff --git a/doc/book/src/doc/imgs/zcashd_screen.gif b/doc/book/src/doc/imgs/zcashd_screen.gif new file mode 120000 index 000000000..c16cb866f --- /dev/null +++ b/doc/book/src/doc/imgs/zcashd_screen.gif @@ -0,0 +1 @@ +../../../../imgs/zcashd_screen.gif \ No newline at end of file diff --git a/doc/book/src/user.md b/doc/book/src/user.md new file mode 100644 index 000000000..e23cdcf42 --- /dev/null +++ b/doc/book/src/user.md @@ -0,0 +1,6 @@ +# User Documentation + +This section contains user documentation specific to `zcashd`. + +See [here](https://zcash.readthedocs.io/) for more general Zcash documentation, as well as +installation instructions for `zcashd`. diff --git a/doc/book/src/user/deprecation.md b/doc/book/src/user/deprecation.md new file mode 100644 index 000000000..07f0b17fa --- /dev/null +++ b/doc/book/src/user/deprecation.md @@ -0,0 +1,60 @@ +Deprecated Features +=================== + +In order to support the continuous improvement of `zcashd`, features are +periodically deprecated and removed when they have been superseded or are no +longer useful. Deprecation follows a 3-stage process: + +1. Initially, a feature will be marked as DEPRECATED in the release notes and + user-facing documentation, but no other changes are made; the feature + continues to be available and function as normal. While features at this + stage remain enabled by default, they may be explicitly disabled by + specifying `-allowdeprecated=none` on the command line when starting the + node, or by including `allowdeprecated=none` as a line in the `zcash.conf` + file. +2. In the next stage of deprecation, the feature will be disabled by default. + Disabled features may be reenabled via use of the `-allowdeprecated` flag. +3. In the third stage, the feature is fully removed and is no longer available. + +Features that enter Stage 1 in a particular release will be disabled by default +after no fewer than 3 releases that update `zcashd`'s minor-version, and +features will only be fully removed after a total of at least 6 minor-version updates. +`zcashd`'s release schedule intends to produce a release that updates the minor +version every 6 weeks, so deprecated features remain accessible by default for +approximately 18 weeks, and then can be expected to be removed no less than 36 +weeks after their initial deprecation. Deprecation and removal timelines might +be extended beyond this on a case-by-case basis to satisfy user requirements. + +Currently Deprecated +==================== + +Stage 1 +------- + +The following features are deprecated, but remain enabled by default. These features +will be disabled if `-allowdeprecated=none` is added to the CLI arguments when starting +the node, or if an `allowdeprecated=none` line is added to `zcash.conf`. + +| `feature` | Deprecated | Feature details +|-------------------------------------|------------|---------------- +| `z_getbalance` | 5.0.0 | The `z_getbalance` RPC method. +| `z_gettotalbalance` | 5.0.0 | The `z_gettotalbalance` RPC method. +| `gbt_oldhashes` | 5.4.0 | The `finalsaplingroothash`, `lightclientroothash`, and `blockcommitmentshash` fields in the output of `getblocktemplate`, which are replaced by the `defaultroots` field. +| `deprecationinfo_deprecationheight` | 5.5.0 | The `deprecationheight` field returned by the `getdeprecationinfo` RPC method has been replaced by the `end_of_service` object. + +Stage 2 +------- + +Each feature in the table below may be enabled by adding `-allowdeprecated=` +to the CLI arguments when starting the node, or by adding an `allowdeprecated=` +line to `zcash.conf`. + +| `feature` | Deprecated | Feature details +|-----------------------|------------|---------------- +| `legacy_privacy` | 5.0.0 | The default "legacy" privacy policy for `z_sendmany` has been replaced by the `FullPrivacy` directive. +| `getnewaddress` | 5.0.0 | The `getnewaddress` RPC method. +| `getrawchangeaddress` | 5.0.0 | The `getrawchangeaddress` RPC method. +| `z_getnewaddress` | 5.0.0 | The `z_getnewaddress` RPC method. +| `z_listaddresses` | 5.0.0 | The `z_listaddresses` RPC method. +| `addrtype` | 5.0.0 | The `type` attribute is deprecated in the results of RPC methods that return address metadata. It is recommended that applications using this metadata be updated to use the `pool` or `address_type` attributes, which have replaced the `type` attribute, as appropriate. +| `wallettxvjoinsplit` | 5.1.0 | The `vjoinsplit` attribute returned by the `gettransaction` RPC method. diff --git a/doc/book/src/user/files.md b/doc/book/src/user/files.md new file mode 100644 index 000000000..067aa4885 --- /dev/null +++ b/doc/book/src/user/files.md @@ -0,0 +1,23 @@ +Data Directory Files +==================== + +Files within the zcashd data directory (``~/.zcash/`` on Linux unless otherwise specified) +include: + +| File | Description +|-----------------------|-------------- +|``zcash.conf`` | contains configuration settings for zcashd +|``zcashd.pid`` | stores the process id of zcashd while running +|``blocks/blk000*.dat`` | block data (custom, 128 MiB per file) +|``blocks/rev000*.dat`` | block undo data (custom) +|``blocks/index/*`` | block index (LevelDB) +|``chainstate/*`` | block chain state database (LevelDB) +|``database/*`` | BDB database environment +|``db.log`` | wallet database log file +|``debug.log`` | contains debug information and general logging generated by zcashd +|``peers.dat`` | peer IP address database (custom format) +|``wallet.dat`` | personal wallet (BDB) with keys and transactions (keep private, back this up!) +|``.cookie`` | session RPC authentication cookie (written at start when cookie authentication is used, deleted on shutdown) +|``.lock`` | data directory lock file (empty) +|``testnet3/*`` | contains testnet versions of these files, except ``zcash.conf``, if running ``-testnet`` +|``onion_private_key`` | cached Tor hidden service private key for ``-listenonion`` diff --git a/doc/book/src/user/metrics.md b/doc/book/src/user/metrics.md new file mode 100644 index 000000000..d0dc9d7e9 --- /dev/null +++ b/doc/book/src/user/metrics.md @@ -0,0 +1,141 @@ +# zcashd metrics + +## Metrics UI + +This is the user interface that `zcashd` displays by default when run. It +displays a small selection of interesting metrics, but is not intended for +programmatic consumption. + +## RPC methods + +`zcashd` provides the following JSON-RPC methods that expose node metrics: + +- Chain: + - `getblockchaininfo`: Various state info regarding block chain processing. + - `gettxoutsetinfo`: Statistics about the unspent transparent transaction output set. + - `getmempoolinfo`: Details on the active state of the TX memory pool. +- P2P network: + - `getnetworkinfo`: Various state info regarding P2P networking. + - `getpeerinfo`: Data about each connected network node. + - `getdeprecationinfo`: The current node version and deprecation block height. +- Miscellaneous + - `getmemoryinfo`: Information about memory usage. + - `getmininginfo`: Mining-related information. + - `getinfo` (deprecated): A small subset of the above metrics. + +You can see what each method provides with `zcash-cli help METHOD_NAME`. + +## Prometheus support + +`zcashd` can optionally expose an HTTP server that acts as a Prometheus scrape +endpoint. The server will respond to `GET` requests on any request path. + +To enable the endpoint, add `-prometheusport=` to your `zcashd` +configuration (either in `zcash.conf` or on the command line). After +restarting `zcashd` you can then test the endpoint by querying it: + +``` +$ curl http://127.0.0.1: +# TYPE zcash_net_out_messages counter +zcash_net_out_messages 181 + +# TYPE zcash_net_in_bytes_total counter +zcash_net_in_bytes_total 3701998 + +# TYPE zcash_net_in_messages counter +zcash_net_in_messages 184 + +# TYPE zcashd_build_info counter +zcashd_build_info{version="v4.2.0"} 1 + +# TYPE zcash_chain_verified_block_total counter +zcash_chain_verified_block_total 162 +... +``` + +By default, access is restricted to localhost. This can be expanded with +`-metricsallowip=`, which can specify IPs or subnets. Note that HTTPS is +not supported, and therefore connections to the endpoint are not encrypted or +authenticated. Access to the endpoint should be assumed to compromise the +privacy of node operations, by the provided metrics and/or by timing side +channels. Non-localhost access is **strongly discouraged** if the node has a +wallet holding live funds. + +### Metrics collection with Docker + +A docker-compose.yml has been provided in `./contrib/metrics` that sets up +local instances of `prometheus` and `grafana` and provides a dashboard that +charts several of the various metrics exposed by `zcashd`'s `prometheus` +endpoint. Note that both `docker` and `docker-compose` must ordinarily be run +with superuser permissions (use `sudo`) when running on Linux. + +`docker-compose up`[^1] will start local instances of `prometheus` and `grafana`, +accessible over HTTP on ports `9090` and `3030`, respectively. + +``` +cd /contrib/metrics +docker-compose up -d +``` +(substitute the root directory where you have checked out the `zcash` git +repository for ``) + +`~/.zcash/zcash.conf` must be updated to enable `prometheus` and to allow the +`prometheus` server launched via `docker-compose` to connect to the `zcashd` +prometheus endpoint. The following commands can be used to detect the local IP +address for the `prometheus` server and add it to the `~/.zcash/zcash.conf` +file. + +First, figure out where `prometheus` is running. + +``` +export PROMETHEUS_DOCKER_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' zcashd-prometheus) +``` + +Then, update your `~/.zcash/zcash.conf` file to open port `9969` and allow +connections from the `zcashd-prometheus` docker container. + +``` +cat << PROM_CONF >> ~/.zcash/zcash.conf +prometheusport=9969 +metricsallowip=$PROMETHEUS_DOCKER_IP/32 +PROM_CONF +``` + +You may then (re)start `zcashd` and navigate to +[http://localhost:9090/targets?search=](http://localhost:9090/targets?search=) +to verify that the `prometheus` server is able to connect to the `zcashd` +prometheus endpoint; you should see the host +`http://host.docker.internal:9969/` having `UP` status. Once this is working, +navigate to +[http://localhost:3030/d/U4U58t-Gk/zcashd-metrics](http://localhost:3030/d/U4U58t-Gk/zcashd-metrics) +to view the dashboard. The username and password for this local grafana +instance are set by default to `admin`/`admin`; the UI will ask you to change +this on first use. Data gathered by the running prometheus instance and changes +that you make to the grafana interface will be persisted across restarts. + +#### Manual Docker Setup Without docker-compose + +The example instructions below were tested on Windows 10 using Docker Desktop +with the WSL 2 backend, connected to a `zcashd` running inside WSL2 (but not +inside Docker): + +``` +# Create a storage volume for Grafana (once) +docker volume create grafana-storage + +# Create a storage volume for Prometheus (once) +docker volume create prometheus-storage + +# Run Prometheus +# You will need to modify $(zcash_root)/contrib/metrics/prometheus.yaml to match the +# port configured with -prometheusport and -metricsbind / -metricsallowip +# (and possibly also for your Docker network setup). +docker run --detach -p 9090:9090 --volume prometheus-storage:/prometheus --volume $(zcash_root)/contrib/metrics/prometheus.yaml:/etc/prometheus/prometheus.yml prom/prometheus + +# Run Grafana +docker run --detach -p 3030:3030 --env GF_SERVER_HTTP_PORT=3030 --volume grafana-storage:/var/lib/grafana grafana/grafana +``` + +[^1]: This requires a running Docker daemon. See [the relevant section of the + Docker Engine manual](https://docs.docker.com/config/daemon/start/). + diff --git a/doc/book/src/user/platform-support.md b/doc/book/src/user/platform-support.md new file mode 100644 index 000000000..ed84ff899 --- /dev/null +++ b/doc/book/src/user/platform-support.md @@ -0,0 +1,50 @@ +# Platform Support + +Support for different platforms (build "targets" and operating systems) are organised into +three tiers, each with a different set of guarantees. For more information on the policies +for targets at each tier, see the [Platform Tier Policy](../dev/platform-tier-policy.md). + +## Tier 1 + +Tier 1 platforms can be thought of as "guaranteed to work". ECC builds official binary +releases for each tier 1 platform, and automated testing ensures that each tier 1 platform +builds and passes tests after each change. + +"End of Support" dates are the latest currently-known date after which the platform will +be removed from tier 1. These dates are subject to change. + +| target | OS | End of Support | +| ----------------------- | ------------ | -------------- | +| `x86_64-pc-linux-gnu` | Debian 10 | June 2024 | +| | Debian 11 | June 2026 | +| | Ubuntu 20.04 | April 2025 | + +## Tier 2 + +Tier 2 platforms can be thought of as "guaranteed to build". ECC builds official binary +releases for each tier 2 platform, and automated builds ensure that each tier 2 platform +builds after each change. Automated tests are not always run so it's not guaranteed to +produce a working build, but tier 2 platforms often work to quite a good degree, and +patches are always welcome! + +"End of Support" dates are the latest currently-known date after which the platform will +be removed from tier 2. These dates are subject to change. + +| target | OS | End of Support | +| ----------------------- | ------------ | -------------- | +| N/A | + +## Tier 3 + +Tier 3 platforms are those for which the `zcashd` codebase has support, but ECC does not +require builds or tests to pass, so these may or may not work. Official builds are not +available. + +| target | OS | notes | +| ----------------------- | ------------ | ----- | +| `x86_64-pc-linux-gnu` | Arch | +| | Ubuntu 22.04 | +| `x86_64-unknown-freebsd`| FreeBSD | +| `x86_64-w64-mingw32` | Windows | 64-bit MinGW | +| `x86_64-apple-darwin16` | macOS 10.14+ | +| `aarch64-linux-gnu` | ARM64 Linux | diff --git a/doc/book/src/user/release-support.md b/doc/book/src/user/release-support.md new file mode 100644 index 000000000..ee98e67f3 --- /dev/null +++ b/doc/book/src/user/release-support.md @@ -0,0 +1,53 @@ +# `zcashd` Release Support + +## Release cadence and support window + +`zcashd` releases happen approximately every six weeks, although this may change if a +particular release is delayed, or if a hotfix release occurs. + +Each `zcashd` release is generally supported for 16 weeks. Occasionally this changes for +individual releases (for example, near to a Network Upgrade activation). + +These two policies mean that there are generally at least two separate `zcashd` versions +currently supported at any given time. + +## End-of-Support halt + +Every `zcashd` version released by ECC has an End-of-Support height. When the Zcash chain +reaches this height, `zcashd` will automatically shut down, and the binary will refuse to +restart. This is for several reasons: + +- The `zcashd` maintainers do not have the resources to maintain old versions of `zcashd` + indefinitely. +- Each time a user upgrades their `zcashd` node, they are re-confirming that they are + happy to run the Zcash consensus rules encoded in the version of `zcashd` they are + running. This is an important part of the overall strategy for changes to the node and + consensus rules; users who want to follow different rules (or even just have a different + End-of-Support halt policy) will obtain a `zcashd` binary from some other source, with + its own support policies. +- Knowing that old versions will shut down is useful for planning backwards-incompatible + changes in Network Upgrades. A Network Upgrade activation can be targeted for a height + where we know that all released `zcashd` versions which _did not_ support the Network + Upgrade will have shut down by the time the Network Upgrade activates. + +## End-of-Support heights + +The End-of-Support height for a running `zcashd` can be queried over JSON-RPC using the +`getdeprecationinfo` method. + +The following table shows End-of-Support information for recent `zcashd` releases. It is +automatically updated during each release. "End of Support" dates are estimated at that +time, and may shift due to changes in network solution power. + + +| `zcashd` version | Release date | Halt height | End of Support | +| ---------------- | ------------ | ----------- | -------------- | +| 5.5.0-rc1 | 2023-04-20 | 2188024 | 2023-08-10 | +| 5.5.0-rc2 | 2023-04-25 | 2193300 | 2023-08-15 | +| 5.5.0-rc3 | 2023-04-27 | 2195224 | 2023-08-17 | +| 5.5.0 | 2023-04-27 | 2196024 | 2023-08-17 | +| 5.5.1 | 2023-05-16 | 2217487 | 2023-09-05 | +| 5.6.0-rc1 | 2023-06-08 | 2243024 | 2023-09-28 | +| 5.6.0 | 2023-06-14 | 2250924 | 2023-10-04 | +| 5.6.1 | 2023-06-21 | 2258800 | 2023-10-11 | + diff --git a/doc/book/src/user/security-warnings.md b/doc/book/src/user/security-warnings.md new file mode 100644 index 000000000..63f050ce5 --- /dev/null +++ b/doc/book/src/user/security-warnings.md @@ -0,0 +1,137 @@ +Security Warnings +================= + +Security Audit +-------------- + +Zcash has been subjected to a formal third-party security review. For security +announcements, audit results and other general security information, see +https://z.cash/support/security.html + +Wallet Encryption +----------------- + +Wallet encryption is disabled, for several reasons: + +- Encrypted wallets are unable to correctly detect shielded spends (due to the + nature of unlinkability of JoinSplits) and can incorrectly show larger + available shielded balances until the next time the wallet is unlocked. This + problem was not limited to failing to recognize the spend; it was possible + for the shown balance to increase by the amount of change from a spend, + without deducting the spent amount. + +- While encrypted wallets prevent spending of funds, they do not maintain the + shielding properties of JoinSplits (due to the need to detect spends). That + is, someone with access to an encrypted wallet.dat has full visibility of + your entire transaction graph (other than newly-detected spends, which suffer + from the earlier issue). + +- We were concerned about the resistance of the algorithm used to derive wallet + encryption keys (inherited from + [Bitcoin](https://bitcoin.org/en/secure-your-wallet)) to dictionary attacks + by a powerful attacker. If and when we re-enable wallet encryption, it is + likely to be with a modern passphrase-based key derivation algorithm designed + for greater resistance to dictionary attack, such as Argon2i. + +You should use full-disk encryption (or encryption of your home directory) to +protect your wallet at rest, and should assume (even unprivileged) users who +are running on your OS can read your wallet.dat file. + +Side-Channel Attacks +-------------------- + +This implementation of Zcash is not resistant to side-channel attacks. You +should assume (even unprivileged) users who are running on the hardware, or who +are physically near the hardware, that your `zcashd` process is running on +will be able to: + +- Determine the values of your secret spending keys, as well as which notes you + are spending, by observing cache side-channels as you perform a JoinSplit + operation. This is due to probable side-channel leakage in the libsnark + proving machinery. + +- Determine which notes you own by observing cache side-channel information + leakage from the incremental witnesses as they are updated with new notes. + +- Determine which notes you own by observing the trial decryption process of + each note ciphertext on the blockchain. + +You should ensure no other users have the ability to execute code (even +unprivileged) on the hardware your `zcashd` process runs on until these +vulnerabilities are fully analyzed and fixed. + +REST Interface +-------------- + +The REST interface is a feature inherited from upstream Bitcoin. By default, +it is disabled. We do not recommend you enable it until it has undergone a +security review. + +RPC Interface +------------- + +Users should choose a strong RPC password. If no RPC username and password are +set, zcashd will not start and will print an error message with a suggestion +for a strong random password. If the client knows the RPC password, they have +at least full access to the node. In addition, certain RPC commands can be +misused to overwrite files and/or take over the account that is running zcashd. +(In the future we may restrict these commands, but full node access – including +the ability to spend from and export keys held by the wallet – would still be +possible unless wallet methods are disabled.) + +Users should also refrain from changing the default setting that only allows +RPC connections from localhost. Allowing connections from remote hosts would +enable a MITM to execute arbitrary RPC commands, which could lead to compromise +of the account running zcashd and loss of funds. For multi-user services that +use one or more zcashd instances on the backend, the parameters passed in by +users should be controlled to prevent confused-deputy attacks which could spend +from any keys held by that zcashd. + +Block Chain Reorganization: Major Differences +--------------------------------------------- + +Users should be aware of new behavior in Zcash that differs significantly from +Bitcoin: in the case of a block chain reorganization, Bitcoin's coinbase +maturity rule helps to ensure that any reorganization shorter than the maturity +interval will not invalidate any of the rolled-back transactions. Zcash keeps +Bitcoin's 100-block maturity interval for generation transactions, but because +JoinSplits must be anchored within a block, this provides more limited +protection against transactions becoming invalidated. In the case of a block +chain reorganization for Zcash, all JoinSplits which were anchored within the +reorganization interval and any transactions that depend on them will become +invalid, rolling back transactions and reverting funds to the original owner. +The transaction rebroadcast mechanism inherited from Bitcoin will not +successfully rebroadcast transactions depending on invalidated JoinSplits if +the anchor needs to change. The creator of an invalidated JoinSplit, as well as +the creators of all transactions dependent on it, must rebroadcast the +transactions themselves. + +Receivers of funds from a JoinSplit can mitigate the risk of relying on funds +received from transactions that may be rolled back by using a higher minconf +(minimum number of confirmations). + +Logging z_* RPC calls +--------------------- + +The option `-debug=zrpc` covers logging of the z_* calls. This will reveal +information about private notes which you might prefer not to disclose. For +example, when calling `z_sendmany` to create a shielded transaction, input +notes are consumed and new output notes are created. + +The option `-debug=zrpcunsafe` covers logging of sensitive information in z_* +calls which you would only need for debugging and audit purposes. For example, +if you want to examine the memo field of a note being spent. + +Private spending keys for z addresses are never logged. + +Potentially-Missing Required Modifications +------------------------------------------ + +In addition to potential mistakes in code we added to Bitcoin Core, and +potential mistakes in our modifications to Bitcoin Core, it is also possible +that there were potential changes we were supposed to make to Bitcoin Core but +didn't, either because we didn't even consider making those changes, or we ran +out of time. We have brainstormed and documented a variety of such +possibilities in [issue #826](https://github.com/zcash/zcash/issues/826), and +believe that we have changed or done everything that was necessary for the +1.0.0 launch. Users may want to review this list themselves. diff --git a/doc/book/src/user/shield-coinbase.md b/doc/book/src/user/shield-coinbase.md new file mode 100644 index 000000000..4ae14b635 --- /dev/null +++ b/doc/book/src/user/shield-coinbase.md @@ -0,0 +1,137 @@ +# Shielding Coinbase UTXOs + +**Summary** + +Use `z_shieldcoinbase` RPC call to shield coinbase UTXOs. + +**Who should read this document** + +Miners, Mining pools, Online wallets + +## Background + +The current Zcash protocol includes a consensus rule that coinbase rewards must +be sent to a shielded address. + +## User Experience Challenges + +A user can use the z_sendmany RPC call to shield coinbase funds, but the call +was not designed for sweeping up many UTXOs, and offered a suboptimal user +experience. + +If customers send mining pool payouts to their online wallet, the service +provider must sort through UTXOs to correctly determine the non-coinbase UTXO +funds that can be withdrawn or transferred by customers to another transparent +address. + +## Solution + +The z_shieldcoinbase call makes it easy to sweep up coinbase rewards from +multiple coinbase UTXOs across multiple coinbase reward addresses. + + z_shieldcoinbase fromaddress toaddress (fee) (limit) + +The default fee is 0.0010000 ZEC and the default limit on the maximum number of +UTXOs to shield is 50. + +## Examples + +Sweep up coinbase UTXOs from a transparent address you use for mining: + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress + +Sweep up coinbase UTXOs from multiple transparent addresses to a shielded +address: + + zcash-cli z_shieldcoinbase "*" zMyPrivateAddress + +Sweep up with a fee of 1.23 ZEC: + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress 1.23 + +Sweep up with a fee of 0.1 ZEC and set limit on the maximum number of UTXOs to +shield at 25: + + zcash-cli z_shieldcoinbase "*" zMyPrivateAddress 0.1 25 + +### Asynchronous Call + +The `z_shieldcoinbase` RPC call is an asynchronous call, so you can queue up +multiple operations. + +When you invoke + + zcash-cli z_shieldcoinbase tMyMiningAddress zMyPrivateAddress + +JSON will be returned immediately, with the following data fields populated: + +- operationid: a temporary id to use with `z_getoperationstatus` and + `z_getoperationresult` to get the status and result of the operation. +- shieldedUTXOs: number of coinbase UTXOs being shielded +- shieldedValue: value of coinbase UTXOs being shielded. +- remainingUTXOs: number of coinbase UTXOs still available for shielding. +- remainingValue: value of coinbase UTXOs still available for shielding + +### Locking UTXOs + +The `z_shieldcoinbase` call will lock any selected UTXOs. This prevents the +selected UTXOs which are already queued up from being selected for any other +send operation. If the `z_shieldcoinbase` call fails, any locked UTXOs are +unlocked. + +You can use the RPC call `lockunspent` to see which UTXOs have been locked. +You can also use this call to unlock any UTXOs in the event of an unexpected +system failure which leaves UTXOs in a locked state. + +### Limits, Performance and Transaction Confirmation + +The number of coinbase UTXOs selected for shielding can be adjusted by setting +the limit parameter. The default value is 50. + +If the limit parameter is set to zero, the zcashd `mempooltxinputlimit` option +will be used instead, where the default value for `mempooltxinputlimit` is +zero, which means no limit. + +Any limit is constrained by a hard limit due to the consensus rule defining a +maximum transaction size of 100,000 bytes. + +In general, the more UTXOs that are selected, the longer it takes for the +transaction to be verified. Due to the quadratic hashing problem, some miners +use the `mempooltxinputlimit` option to reject transactions with a large number +of UTXO inputs. + +Currently, as of November 2017, there is no commonly agreed upon limit, but as +a rule of thumb (a form of emergent consensus) if a transaction has less than +100 UTXO inputs, the transaction will be mined promptly by the majority of +mining pools, but if it has many more UTXO inputs, such as 500, it might take +several days to be mined by a miner who has higher or no limits. + +### Anatomy of a z_shieldcoinbase transaction + +The transaction created is a shielded transaction. It consists of a single +joinsplit, which consumes coinbase UTXOs as input, and deposits value at a +shielded address, minus any fee. + +The number of coinbase UTXOs is determined by a user configured limit. + +If no limit is set (in the case when limit parameter and `mempooltxinputlimit` +options are set to zero) the behaviour of z_shieldcoinbase is to consume as +many UTXOs as possible, with `z_shieldcoinbase` constructing a transaction up +to the size limit of 100,000 bytes. + +As a result, the maximum number of inputs that can be selected is: + +- P2PKH coinbase UTXOs ~ 662 +- 2-of-3 multisig P2SH coinbase UTXOs ~ 244. + +Here is an example of using `z_shieldcoinbase` on testnet to shield multi-sig coinbase UTXOs. + +- Block 141042 is almost ~2 MB in size (the maximum size for a block) and + contains 1 coinbase reward transaction and 20 transactions, each indivually + created by a call to z_shieldcoinbase. + - https://explorer.testnet.z.cash/block/0050552a78e97c89f666713c8448d49ad1d7263274422272696187dedf6c0d03 +- Drilling down into a transaction, you can see there is one joinsplit, with + 244 inputs (vin) and 0 outputs (vout). + - https://explorer.testnet.z.cash/tx/cf4f3da2e434f68b6e361303403344e22a9ff9a8fda9abc180d9520d0ca6527d + + diff --git a/doc/book/src/user/tor.md b/doc/book/src/user/tor.md new file mode 100644 index 000000000..78b8f010e --- /dev/null +++ b/doc/book/src/user/tor.md @@ -0,0 +1,289 @@ +Tor Support in Zcash +==================== + +Tor can be used to provide a layer of network anonymity for Zcash users. +Additionally, Zcash users may chose to connect only to Tor hidden services, and +also to expose their own Tor hidden service to allow users to connect to them +over the Tor network. + +0. Install Tor +-------------- + +The easiest way to install Tor is to use the +[Tor Browser Bundle](https://www.torproject.org/download/). For headless +installs, you probably want to install the Tor daemon. The Tor Project +provides [instructions](https://support.torproject.org/apt/) for doing this on +common Linux distributions. Note that the Tor Browser Bundle exposes a SOCKS +listener on tcp/9150 by default, while the Tor daemon exposes the SOCKS +listener on tcp/9050. For the purposes of the example below, we'll assume that +you're using the Tor daemon and that the SOCKS listener is on tcp/9050. + +1. Run zcashd over Tor +---------------------- + +Configuring zcashd to use a Tor SOCKS proxy will route all outgoing connections +over Tor. + +```bash +$ zcashd -proxy=127.0.0.1:9050 +``` + +Yay! Your zcashd node is now leveraging the Tor network to connect to other +zcashd nodes. But there's more fun to be had. By creating a +[Tor Hidden Service](https://2019.www.torproject.org/docs/faq.html.en#TorOnionServices). +you can help promote privacy for Zcash users by advertising your node's .onion +address to other Tor Zcash users. + +2. Expose your zcashd via a Tor hidden service (optional) +--------------------------------------------------------- + +Edit your /etc/tor/torrc (or equivalent config file) to map the hidden service +to your zcashd TCP listener. The directory can be whatever you like but the +port numbers should be equal to the zcashd p2p listen port (8233 by default). +An example is below. + +```yaml +############### This section is just for location-hidden services ### + +## Once you have configured a hidden service, you can look at the +## contents of the file ".../hidden_service/hostname" for the address +## to tell people. +## +## HiddenServicePort x y:z says to redirect requests on port x to the +## address y:z. + +# +# Placeholder for when zcashd adds support for Onion v3 addresses +#HiddenServiceDir /var/lib/tor/zcash_hidden_service_v3/ +#HiddenServiceVersion 3 +#HiddenServicePort 8233 127.0.0.1:8233 + +# use the generated v2 Onion hostname until v3 support is complete +HiddenServiceDir /var/lib/tor/zcash_hidden_service_v2/ +HiddenServiceVersion 2 +HiddenServicePort 8233 127.0.0.1:8233 +``` + +Note that zcashd does not yet support Onion v3 addresses, but will do so before +v2 addresses are removed from Tor. See [this +issue](https://github.com/zcash/zcash/issues/3051) for more information on +what's required to make zcashd support v3 Onion addresses. + +After making these edits to /etc/tor/torrc, restart tor to create the hidden +service hostname and keys. + +```bash +$ sudo systemctl restart tor +``` + +Then set a bash variable to provide your Onion service hostname to zcashd so it +can advertise your node to other Tor capable nodes on the Zcash network. + +```bash +$ export MY_ONION_HOSTNAME=`sudo cat /var/lib/tor/zcash_hidden_service_v2/hostname` +``` + +Now configure the zcashd node to use the Tor proxy, enable the TCP listener +(only on localhost), and advertise your onion address so that other nodes on +the Zcash network can connect to you over Tor. + +```bash +$ zcashd -proxy=127.0.0.1:9050 -externalip=$MY_ONION_HOSTNAME -listen -bind=127.0.0.1 -listenonion=0 +``` +zcashd flags used: + +- `-proxy=ip:port`: sets the proxy server. This must match the port IP and port + on which your Tor listener is configured. +- `-externalip=`: sets the publicly routable address that zcashd will + advertise to other zcash nodes. This can be an IPv4, IPv6 or .onion address. + Onion addresses are given preference for advertising and connections. Onionv3 + addresses are [not yet supported](https://github.com/zcash/zcash/issues/3051). +- `-listen`: Enable listening for incoming connections with this flag; + listening is off by default, but is needed in order for Tor to connect to + zcashd. +- `-bind=ip`: Bind (only) to this IP. Will bind to all interfaces by default + if ``listen=1``. +- `-listenonion=<0|1>`: Enable or disable autoconfiguration of Tor hidden + service via control socket API. Disabled in this example because we manually + configured the hidden service in /etc/tor/torrc. + +Once your node is up and running, you can use `zcash-cli` to verify that it +is properly connected to other Zcash nodes over the p2p network, and is +correctly advertising its Onion address to the network. + +```bash +$ zcash-cli getnetworkinfo +``` + +```javascript +{ + "version": 4020050, + "subversion": "/MagicBean:4.2.0/", + "protocolversion": 170013, + "connections": 9, + "networks": [ + { + "name": "ipv4", + "limited": true, + "reachable": false, + "proxy": "127.0.0.1:9050", + "proxy_randomize_credentials": true + }, + { + "name": "ipv6", + "limited": true, + "reachable": false, + "proxy": "127.0.0.1:9050", + "proxy_randomize_credentials": true + }, + { + "name": "onion", + "limited": false, + "reachable": true, + "proxy": "127.0.0.1:9050", + "proxy_randomize_credentials": true + } + ], + "relayfee": 0.00000100, + "localaddresses": [ + { + "address": "ynizm2wpla6ec22q.onion", + "port": 8233, + "score": 10 + } + ], +} +``` + + +3. Dynamically Configure Onion Service (Optional) +------------------------------------------------- + +Starting with Tor version 0.2.7.1 it is possible, through Tor's control socket +API, to create and destroy 'ephemeral' hidden services programmatically. zcashd +has been updated to make use of this. + +This configuration could be used instead of manually configuring the Onion +service as in step 2 above. + +If Tor is running (and proper authentication has been configured), zcashd +automatically creates a hidden service to listen on. zcashd will also use Tor +automatically to connect to other .onion nodes if the control socket can be +successfully opened. + +This new feature is enabled by default if zcashd is listening (`-listen`) and +requires a Tor connection to work. It can be explicitly disabled with +`-listenonion=0` and, if not disabled, configured using the `-torcontrol` +and `-torpassword` settings. To show verbose debugging information, pass +`-debug=tor`. + +Connecting to Tor's control socket API requires one of two authentication +methods to be configured: + +1. Cookie authentication, which requires write access to the `CookieAuthFile` + specified in Tor configuration. In some cases, this is preconfigured and the + creation of a hidden service is automatic. If permission problems are seen + with `-debug=tor` they can be resolved by adding both the user running tor + and the user running zcashd to the same group and setting permissions + appropriately. On Debian-based systems the user running zcashd can be added + to the debian-tor group, which has the appropriate permissions. +2. Authentication with the `-torpassword` flag and a `hash-password`, which + can be enabled and specified in Tor configuration. + +On Debian systems, where Tor is installed via APT, you can trivially permit +zcashd to connect to the Tor socket by adding the zcash user to the +`debian-tor` group. + +```bash +$ sudo usermod -aG debian-tor zcash +``` + +When properly configured, this will allow zcashd to automatically connect to +the Tor control socket API and configure an ephemeral hidden service. + +```bash +$ zcashd -debug=tor +``` + +``` +Feb 11 15:26:20.323 INFO main: tor: Got service ID tweustb4j6o3u5x7, advertizing service tweustb4j6o3u5x7.onion:8233 +Feb 11 15:26:20.323 DEBUG tor: tor: Cached service private key to /home/zcash/.zcash/onion_private_key +Feb 11 15:26:20.323 INFO main: AddLocal(tweustb4j6o3u5x7.onion:8233,4) +... +Feb 11 15:26:47.565 INFO main: ProcessMessages: advertizing address tweustb4j6o3u5x7.onion:8233 +``` + +4. Connect to a single Zcash Onion server +----------------------------------------- + +This invocation will start zcashd and connect via Tor to a single zcashd onion +server. + +Launch zcashd as follows: + +```bash +$ zcashd -onion=127.0.0.1:9050 -connect=ynizm2wpla6ec22q.onion +``` + +- `-onion=ip:port`: Use SOCKS5 proxy to reach peers via Tor hidden services. + This must match the port IP and port on which your Tor listener is + configured. +- `-connect=`: Connect only to the specified node(s); `-noconnect` + or `-connect=0` alone to disable automatic connections + + +Now use zcash-cli to verify there is only a single peer connection. + +```bash +$ zcash-cli getpeerinfo +``` + +```javascript +[ + { + "id": 1, + "addr": "ynizm2wpla6ec22q.onion", + ... + "version": 170013, + "subver": "/MagicBean:4.2.0/", + "inbound": false, + ... + } +] +``` + +4. Connect to multiple Zcash Onion servers +------------------------------------------ + +This invocation will start zcashd, skip DNS seeding, connect via Tor to a +multiple zcashd onion servers, and also advertise your Onion server to other +Tor capable Zcash nodes. + +Launch zcashd as follows: + +```bash +$ export MY_ONION_HOSTNAME=`sudo cat /var/lib/tor/zcash_hidden_service_v2/hostname` +$ zcashd -listen -onion=127.0.0.1:9050 -addnode=ynizm2wpla6ec22q.onion -dnsseed=0 -onlynet=onion -externalip=$MY_ONION_HOSTNAME -bind=127.0.0.1 +``` + +zcashd flags used: + +- `-onion=ip:port`: Use SOCKS5 proxy to reach peers via Tor hidden services. + This must match the port IP and port on which your Tor listener is + configured. +- `-addnode=`: Add a node to connect to and attempt to keep the + connection open +- `-externalip=`: sets the publicly routable address that zcashd will + advertise to other zcash nodes. This can be an IPv4, IPv6 or .onion address. + Onion addresses are given preference for advertising and connections. Onionv3 + addresses are [not yet supported](https://github.com/zcash/zcash/issues/3051). +- `-listen`: Enable listening for incoming connections with this flag; + listening is off by default, but is needed in order for Tor to connect to + zcashd. +- `-bind=`: Bind (only) to this IP. Will bind to all interfaces by default + if `listen=1` and `bind` is not set. +- `-onlynet=`: Only connect to nodes in network `` (ipv4, ipv6 or + onion) + + + diff --git a/doc/book/src/user/wallet-backup.md b/doc/book/src/user/wallet-backup.md new file mode 100644 index 000000000..5d6a48cdc --- /dev/null +++ b/doc/book/src/user/wallet-backup.md @@ -0,0 +1,137 @@ +# Wallet Backup Instructions + +## Overview + +Backing up your Zcash private keys is the best way to be proactive about +preventing loss of access to your ZEC. + +Problems resulting from bugs in the code, user error, device failure, etc. may +lead to losing access to your wallet (and as a result, the private keys of +addresses which are required to spend from them). + +No matter what the cause of a corrupted or lost wallet could be, we highly +recommend all users backup on a regular basis. Anytime a new address in the +wallet is generated, we recommending making a new backup so all private keys +for addresses in your wallet are safe. + +Note that a backup is a duplicate of data needed to spend ZEC so where you keep +your backup(s) is another important consideration. You should not store backups +where they would be equally or increasingly susceptible to loss or theft. + +## Instructions for backing up your wallet and/or private keys + +These instructions are specific for the officially supported Zcash Linux +client. For backing up with third-party wallets, please consult with user +guides or support channels provided for those services. + +There are multiple ways to make sure you have at least one other copy of the +private keys needed to spend your ZEC and view your shielded ZEC. + +For all methods, you will need to include an export directory setting in your +config file (`zcash.conf` located in the data directory which is `~/.zcash/` +unless it's been overridden with `datadir=` setting): + +`exportdir=path/to/chosen/export/directory` + +You may chose any directory within the home directory as the location for +export & backup files. If the directory doesn't exist, it will be created. + +Note that zcashd will need to be stopped and restarted for edits in the config +file to take effect. + +### Using `backupwallet` + +To create a backup of your wallet, use: + +```bash +$ zcash-cli backupwallet +``` + +The backup will be an exact copy of the current state of your wallet.dat file +stored in the export directory you specified in the config file. The file path +will also be returned. + +If you generate a new Zcash address, it will not be reflected in the backup +file. + +If your original `wallet.dat` file becomes inaccessible for whatever reason, +you can use your backup by copying it into your data directory and renaming the +copy to `wallet.dat`. + +### Using `z_exportwallet` & `z_importwallet` + +If you prefer to have an export of your private keys in human readable format, +you can use: + +```bash +$ zcash-cli z_exportwallet ` +``` + +This will generate a file in the export directory listing all transparent and +shielded private keys with their associated public addresses. The file path +will be returned in the command line. + +To import keys into a wallet which were previously exported to a file, use: + +```bash +$ zcash-cli z_importwallet +``` + +### Using `z_exportkey`, `z_importkey`, `dumpprivkey` & `importprivkey` + +If you prefer to export a single private key for a shielded address, you can +use: + +```bash +$ zcash-cli z_exportkey +``` + +This will return the private key and will not create a new file. + +For exporting a single private key for a transparent address, you can use the +command inherited from Bitcoin: + +```bash +$ zcash-cli dumpprivkey +``` + +This will return the private key and will not create a new file. + +To import a private key for a shielded address, use: + +```bash +$ zcash-cli z_importkey +``` + +This will add the key to your wallet and rescan the wallet for associated +transactions if it is not already part of the wallet. + +The rescanning process can take a few minutes for a new private key. To skip +it, instead use: + +```bash +$ zcash-cli z_importkey no +``` + +For other instructions on fine-tuning the wallet rescan, see the command's help +documentation: + +```bash +$ zcash-cli help z_importkey +``` + +To import a private key for a transparent address, use: + +```bash +$ zcash-cli importprivkey +``` + +This has the same functionality as `z_importkey` but works with transparent +addresses. + +See the command's help documentation for instructions on fine-tuning the wallet +rescan: + +```bash +$ zcash-cli help importprivkey +``` diff --git a/doc/developer-notes.md b/doc/developer-notes.md new file mode 100644 index 000000000..a5722ce3b --- /dev/null +++ b/doc/developer-notes.md @@ -0,0 +1,373 @@ +Coding +==================== + +Various coding styles have been used during the history of the codebase, +and the result is not very consistent. However, we're now trying to converge to +a single style, so please use it in new code. Old code will be converted +gradually. +- Basic rules specified in src/.clang-format. Use a recent clang-format-3.5 to format automatically. + - Braces on new lines for namespaces, classes, functions, methods. + - Braces on the same line for everything else. + - 4 space indentation (no tabs) for every block except namespaces. + - No indentation for public/protected/private or for namespaces. + - No extra spaces inside parenthesis; don't do ( this ) + - No space after function names; one space after if, for and while. + +Block style example: +```c++ +namespace foo +{ +class Class +{ + bool Function(char* psz, int n) + { + // Comment summarising what this section of code does + for (int i = 0; i < n; i++) { + // When something fails, return early + if (!Something()) + return false; + ... + } + + // Success return is usually at the end + return true; + } +} +} +``` + +Doxygen comments +----------------- + +To facilitate the generation of documentation, use doxygen-compatible comment blocks for functions, methods and fields. + +For example, to describe a function use: +```c++ +/** + * ... text ... + * @param[in] arg1 A description + * @param[in] arg2 Another argument description + * @pre Precondition for function... + */ +bool function(int arg1, const char *arg2) +``` +A complete list of `@xxx` commands can be found at http://www.stack.nl/~dimitri/doxygen/manual/commands.html. +As Doxygen recognizes the comments by the delimiters (`/**` and `*/` in this case), you don't +*need* to provide any commands for a comment to be valid; just a description text is fine. + +To describe a class use the same construct above the class definition: +```c++ +/** + * Alerts are for notifying old versions if they become too obsolete and + * need to upgrade. The message is displayed in the status bar. + * @see GetWarnings() + */ +class CAlert +{ +``` + +To describe a member or variable use: +```c++ +int var; //!< Detailed description after the member +``` + +or +```cpp +//! Description before the member +int var; +``` + +Also OK: +```c++ +/// +/// ... text ... +/// +bool function2(int arg1, const char *arg2) +``` + +Not OK (used plenty in the current source, but not picked up): +```c++ +// +// ... text ... +// +``` + +A full list of comment syntaxes picked up by doxygen can be found at http://www.stack.nl/~dimitri/doxygen/manual/docblocks.html, +but if possible use one of the above styles. + +Development tips and tricks +--------------------------- + +**compiling for debugging** + +Run configure with the --enable-debug option, then make. Or run configure with +CXXFLAGS="-g -ggdb -O0" or whatever debug flags you need. + +**compiling for gprof profiling** + +Run configure with the --enable-gprof option, then make. + +**debug.log** + +If the code is behaving strangely, take a look in the debug.log file in the data directory; +error and debugging messages are written there. + +The -debug=... command-line option controls debugging; running with just -debug or -debug=1 will turn +on all categories (and give you a very large debug.log file). + +**testnet and regtest modes** + +Run with the -testnet option to run with "play zcash" on the test network, if you +are testing multi-machine code that needs to operate across the internet. + +If you are testing something that can run on one machine, run with the -regtest option. +In regression test mode, blocks can be created on-demand; see qa/rpc-tests/ for tests +that run in -regtest mode. + +**DEBUG_LOCKORDER** + +Zcash is a multithreaded application, and deadlocks or other multithreading bugs +can be very difficult to track down. Compiling with -DDEBUG_LOCKORDER (configure +CXXFLAGS="-DDEBUG_LOCKORDER -g") inserts run-time checks to keep track of which locks +are held, and adds warnings to the debug.log file if inconsistencies are detected. + +**Sanitizers** + +Bitcoin can be compiled with various "sanitizers" enabled, which add +instrumentation for issues regarding things like memory safety, thread race +conditions, or undefined behavior. This is controlled with the +`--with-sanitizers` configure flag, which should be a comma separated list of +sanitizers to enable. The sanitizer list should correspond to supported +`-fsanitize=` options in your compiler. These sanitizers have runtime overhead, +so they are most useful when testing changes or producing debugging builds. + +Some examples: + +```bash +# Enable both the address sanitizer and the undefined behavior sanitizer +./configure --with-sanitizers=address,undefined + +# Enable the thread sanitizer +./configure --with-sanitizers=thread +``` + +If you are compiling with GCC you will typically need to install corresponding +"san" libraries to actually compile with these flags, e.g. libasan for the +address sanitizer, libtsan for the thread sanitizer, and libubsan for the +undefined sanitizer. If you are missing required libraries, the configure script +will fail with a linker error when testing the sanitizer flags. + +The test suite should pass cleanly with the `thread` and `undefined` sanitizers, +but there are a number of known problems when using the `address` sanitizer. The +address sanitizer is known to fail in +[sha256_sse4::Transform](/src/crypto/sha256_sse4.cpp) which makes it unusable +unless you also use `--disable-asm` when running configure. We would like to fix +sanitizer issues, so please send pull requests if you can fix any errors found +by the address sanitizer (or any other sanitizer). + +Not all sanitizer options can be enabled at the same time, e.g. trying to build +with `--with-sanitizers=address,thread` will fail in the configure script as +these sanitizers are mutually incompatible. Refer to your compiler manual to +learn more about these options and which sanitizers are supported by your +compiler. + +Additional resources: + + * [AddressSanitizer](https://clang.llvm.org/docs/AddressSanitizer.html) + * [LeakSanitizer](https://clang.llvm.org/docs/LeakSanitizer.html) + * [MemorySanitizer](https://clang.llvm.org/docs/MemorySanitizer.html) + * [ThreadSanitizer](https://clang.llvm.org/docs/ThreadSanitizer.html) + * [UndefinedBehaviorSanitizer](https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html) + * [GCC Instrumentation Options](https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html) + * [Google Sanitizers Wiki](https://github.com/google/sanitizers/wiki) + * [Issue #12691: Enable -fsanitize flags in Travis](https://github.com/bitcoin/bitcoin/issues/12691) + +Locking/mutex usage notes +------------------------- + +The code is multi-threaded, and uses mutexes and the +LOCK/TRY_LOCK macros to protect data structures. + +Deadlocks due to inconsistent lock ordering (thread 1 locks cs_main +and then cs_wallet, while thread 2 locks them in the opposite order: +result, deadlock as each waits for the other to release its lock) are +a problem. Compile with -DDEBUG_LOCKORDER to get lock order +inconsistencies reported in the debug.log file. + +Re-architecting the core code so there are better-defined interfaces +between the various components is a goal, with any necessary locking +done by the components (e.g. see the self-contained CKeyStore class +and its cs_KeyStore lock for example). + +Threads +------- + +- ThreadScriptCheck : Verifies block scripts. + +- ThreadImport : Loads blocks from blk*.dat files or bootstrap.dat. + +- StartNode : Starts other threads. + +- ThreadDNSAddressSeed : Loads addresses of peers from the DNS. + +- ThreadMapPort : Universal plug-and-play startup/shutdown + +- ThreadSocketHandler : Sends/Receives data from peers on port 8233. + +- ThreadOpenAddedConnections : Opens network connections to added nodes. + +- ThreadOpenConnections : Initiates new connections to peers. + +- ThreadMessageHandler : Higher-level message handling (sending and receiving). + +- DumpAddresses : Dumps IP addresses of nodes to peers.dat. + +- ThreadFlushWalletDB : Close the wallet.dat file if it hasn't been used in 500ms. + +- ThreadRPCServer : Remote procedure call handler, listens on port 8232 for connections and services them. + +- ZcashMiner : Generates zcash (if wallet is enabled). + +- Shutdown : Does an orderly shutdown of everything. + +Pull Request Terminology +------------------------ + +Concept ACK - Agree with the idea and overall direction, but have neither reviewed nor tested the code changes. + +utACK (untested ACK) - Reviewed and agree with the code changes but haven't actually tested them. + +Tested ACK - Reviewed the code changes and have verified the functionality or bug fix. + +ACK - A loose ACK can be confusing. It's best to avoid them unless it's a documentation/comment only change in which case there is nothing to test/verify; therefore the tested/untested distinction is not there. + +NACK - Disagree with the code changes/concept. Should be accompanied by an explanation. + +See the [Development Guidelines](https://zcash.readthedocs.io/en/latest/rtd_pages/development_guidelines.html) documentation for preferred workflows, information on continuous integration and release versioning. + +Strings and formatting +------------------------ + +- Avoid using locale dependent functions if possible. You can use the provided + [`lint-locale-dependence.sh`](../test/lint/lint-locale-dependence.sh) + to check for accidental use of locale-dependent functions. + + - *Rationale*: Unnecessary locale dependence can cause bugs that are very tricky to isolate and fix. + + - These functions are known to be locale-dependent: + `alphasort`, `asctime`, `asprintf`, `atof`, `atoi`, `atol`, `atoll`, `atoq`, + `btowc`, `ctime`, `dprintf`, `fgetwc`, `fgetws`, `fprintf`, `fputwc`, + `fputws`, `fscanf`, `fwprintf`, `getdate`, `getwc`, `getwchar`, `isalnum`, + `isalpha`, `isblank`, `iscntrl`, `isdigit`, `isgraph`, `islower`, `isprint`, + `ispunct`, `isspace`, `isupper`, `iswalnum`, `iswalpha`, `iswblank`, + `iswcntrl`, `iswctype`, `iswdigit`, `iswgraph`, `iswlower`, `iswprint`, + `iswpunct`, `iswspace`, `iswupper`, `iswxdigit`, `isxdigit`, `mblen`, + `mbrlen`, `mbrtowc`, `mbsinit`, `mbsnrtowcs`, `mbsrtowcs`, `mbstowcs`, + `mbtowc`, `mktime`, `putwc`, `putwchar`, `scanf`, `snprintf`, `sprintf`, + `sscanf`, `stoi`, `stol`, `stoll`, `strcasecmp`, `strcasestr`, `strcoll`, + `strfmon`, `strftime`, `strncasecmp`, `strptime`, `strtod`, `strtof`, + `strtoimax`, `strtol`, `strtold`, `strtoll`, `strtoq`, `strtoul`, + `strtoull`, `strtoumax`, `strtouq`, `strxfrm`, `swprintf`, `tolower`, + `toupper`, `towctrans`, `towlower`, `towupper`, `ungetwc`, `vasprintf`, + `vdprintf`, `versionsort`, `vfprintf`, `vfscanf`, `vfwprintf`, `vprintf`, + `vscanf`, `vsnprintf`, `vsprintf`, `vsscanf`, `vswprintf`, `vwprintf`, + `wcrtomb`, `wcscasecmp`, `wcscoll`, `wcsftime`, `wcsncasecmp`, `wcsnrtombs`, + `wcsrtombs`, `wcstod`, `wcstof`, `wcstoimax`, `wcstol`, `wcstold`, + `wcstoll`, `wcstombs`, `wcstoul`, `wcstoull`, `wcstoumax`, `wcswidth`, + `wcsxfrm`, `wctob`, `wctomb`, `wctrans`, `wctype`, `wcwidth`, `wprintf` + +Scripts +-------------------------- + +### Shebang + +- Use `#!/usr/bin/env bash` instead of obsolete `#!/bin/bash`. + + - [*Rationale*](https://github.com/dylanaraps/pure-bash-bible#shebang): + + `#!/bin/bash` assumes it is always installed to /bin/ which can cause issues; + + `#!/usr/bin/env bash` searches the user's PATH to find the bash binary. + + OK: + +```bash +#!/usr/bin/env bash +``` + + Wrong: + +```bash +#!/bin/bash +``` + +Source code organization +-------------------------- + +- Use include guards to avoid the problem of double inclusion. The header file + `foo/bar.h` should use the include guard identifier `ZCASH_FOO_BAR_H`, e.g. + +```c++ +#ifndef ZCASH_FOO_BAR_H +#define ZCASH_FOO_BAR_H +... +#endif // ZCASH_FOO_BAR_H +``` + +Subtrees +---------- + +Several parts of the repository are subtrees of software maintained elsewhere. + +Some of these are maintained by active developers of Zcash or Bitcoin Core, in which case changes should probably go +directly upstream without being PRed directly against the project. They will be merged back in the next +subtree merge. + +Others are external projects without a tight relationship with our project. Changes to these should also +be sent upstream, but bugfixes may also be prudent to PR against Zcash and/or Bitcoin Core so that they can be integrated +quickly. Cosmetic changes should be purely taken upstream. + +There is a tool in `test/lint/git-subtree-check.sh` ([instructions](../test/lint#git-subtree-checksh)) to check a subtree directory for consistency with +its upstream repository. + +Current subtrees include: + +- src/leveldb + - Upstream at https://github.com/google/leveldb ; Maintained by Google, but + open important PRs to Core to avoid delay. + - **Note**: Follow the instructions in [Upgrading LevelDB](#upgrading-leveldb) when + merging upstream changes to the LevelDB subtree. + +- src/crc32c + - Used by leveldb for hardware acceleration of CRC32C checksums for data integrity. + - Upstream at https://github.com/google/crc32c ; Maintained by Google. + +- src/secp256k1 + - Upstream at https://github.com/bitcoin-core/secp256k1/ ; actively maintained by Core contributors. + +- src/crypto/ctaes + - Upstream at https://github.com/bitcoin-core/ctaes ; actively maintained by Core contributors. + +- src/univalue + - Upstream at https://github.com/bitcoin-core/univalue ; actively maintained by Core contributors, deviates from upstream https://github.com/jgarzik/univalue + +Scripted diffs +-------------- + +For reformatting and refactoring commits where the changes can be easily automated using a bash script, we use +scripted-diff commits. The bash script is included in the commit message and our Travis CI job checks that +the result of the script is identical to the commit. This aids reviewers since they can verify that the script +does exactly what it's supposed to do. It is also helpful for rebasing (since the same script can just be re-run +on the new master commit). + +To create a scripted-diff: + +- start the commit message with `scripted-diff:` (and then a description of the diff on the same line) +- in the commit message include the bash script between lines containing just the following text: + + - `-BEGIN VERIFY SCRIPT-` + - `-END VERIFY SCRIPT-` + +The scripted-diff is verified by the tool `test/lint/commit-script-check.sh` + +Commit `ccd074a5` is an example of a scripted-diff. diff --git a/doc/hotfix-process.md b/doc/hotfix-process.md new file mode 100644 index 000000000..de8672e92 --- /dev/null +++ b/doc/hotfix-process.md @@ -0,0 +1,49 @@ +Hotfix Release Process +====================== + +Hotfix releases are versioned by incrementing the patch number of the latest +release. For example: + + First hotfix: v1.0.0 -> v1.0.1 + Second hotfix: v1.0.1 -> v1.0.2 + +In the commands below, and are prefixed with a v, ie. +v1.0.2 (not 1.0.2). + +## Create a hotfix branch + +Create a hotfix branch from the previous release tag, and push it to the main +repository: + + $ git branch hotfix- + $ git push 'git@github.com:zcash/zcash' hotfix- + +## Implement hotfix changes + +Hotfix changes are implemented the same way as regular changes (developers work +in separate branches per change, and push the branches to their own repositories), +except that the branches are based on the hotfix branch instead of master: + + $ git checkout hotfix- + $ git checkout -b + +## Merge hotfix PRs + +Hotfix PRs are created like regular PRs, except using the hotfix branch as the +base instead of `master`. Each PR should be reviewed and merged as normal. + +## Release process + +The majority of this process is identical to the standard release process. +Release candidates for hotfixes should be created and tested as normal, using +the `hotfix-` branch in place of the release stabilization branch, +with a couple of minor differences: + +- When running the release script, use the `--hotfix` flag. Provide the hash of + the commit to be released as the first argument: + + $ ./zcutil/make-release.py --hotfix + +- To review the automated changes in git: + + $ git log hotfix-..HEAD diff --git a/doc/imgs/logo.png b/doc/imgs/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..52ea66ec32c7d3e53b1cc3ca6949e3aba0a5c6be GIT binary patch literal 10950 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 literal 0 HcmV?d00001 diff --git a/doc/imgs/zcashd_screen.gif b/doc/imgs/zcashd_screen.gif new file mode 100644 index 0000000000000000000000000000000000000000..2eebc1cba0846d0d1723eccd279616bb9b2b320e GIT binary patch literal 39787 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 z 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�#*QbG(%&0orG@y3v zsd^;Zt~&Y2;iQz~j$mfnUKhEvB`*Ol(1OR%z)y{ePd?w`~rq$sS`Um7N?T~t# zT-sV(N>_aQ`N6sikyTD{QqqvvgeiLZm5zy3g6gIz>=HvQ^v!t|{!M7cVk0sKsx=w! z+iC{eH`T<7(?e5rNu}{}19`>`WmFvMn1Ep!Z}!d4i+;(Xqj+ zTJ@sEz=39lNgJIWPZUr#TK%3f5@=`}cmcq}#Zal?h`U%%@9E|eIf^>nt(lKP3= z>{m1oJZ!rW8#eay_W@qRX;QNefkKbrvG*}XO(OPrymek>cH~_)jqTi)2iAn>&$vS` zXdC#KFKXXiy6;X@#g2SgD_m2w>pDnGNku_KoI`o3kZqJTSf*M=}w_?3RiClCx8x zJ-N^;HJCHa@QBZ?NPje$uU%?fHg@<dI>v0yerW6GkoV$TO$;{&INnu4lFwgNw8htImQoH?h6U4zq zD6veNAL+@(HUEIRCih+edG>jk4}8ZyD~LV{Q1bEU{c@asRZP0ZehSw$5pIe6{K{02 z4d+fcK90DA%i7DF)`J0;_wfVm&?A9c&sPZ~q-Oi3U#r$4q1Uixy6bnhxaz(lv5!8d zG-9J{9e7){=6Q&k$ad=yH_;47iw`@Jg*>Z5Ub9U6ixY(_Nx@8cT(av&yRP4`D{>t> z*EBi5(~7USgzWqA?;Omtdi;j7o^n3cIeS_;Jx86Oj*Br01D=VN5v?R|(We$=31(HQ z9L+s4to!siLpyUKhvGv+u;~L*ODw@$@6^pN>3q49(>rES zW@^?tQO%JRDj7DN9`K3HW)v89?O+T@H;ys0^9QWWidSo4-5fdLOG_J}s+G6Lvhke| z7wR|rSNRjO04ag^Ulj!|7GJn5KQr}ZF{`3+B_~(emnq7!EZFtXIf@e;3CHC6x94s) z_82wPXfpNf$#YL#g2A|!IIKSG@pKjsJ%?Lb*Ev`8t?P48ekr|KnQvzEt0`?t`G!wV zwa2k*6X2#je4C!Gd7rOC(cT=&xoiBD4+>(@T@ z!t2`HT5-gmu{wpr84Pb%(J>znIAUsdr7nT_i@?o=TQeu{zhMGSr2g^Kas6*ex9pa> z>QD?4wPIhwM0r>i;@0y=(XWW2(~m!Vcd`---{(1?w@uL5rLfxXz@Y?wgdbdPm1O_; z8h{auJ(#c1t>z!kZrla;;ZXx*(<~M(b|#gtZqCa?HdA0?*~cw`jVHq*_I0aYh0R`C z-__)#O497a@uwKu4b&wS#kX5f=@czGBJ{E?+SdTIk6t9PPob}i-ea9Zp(-+`;1)J7 z6t)ys0XDW>@KZ7%!;5$3Ls8^1gi6QQIxF76!IN--CqMzQ@^Xg z53hDu%=H@kezapyIf}U}p(B8s@4)-4EK6`k4luj-+D~#+#a?f23Uoj2H22=6e`c&% zAB7iR&y+ro>TiqN6xd%p00ZY^3X8$2`fVt8kWwk+&VbxzZ-BpshoZQ2Tl& z!M>wlr6YdUAW+nkansi$b|cdr<`Xy2i{`qh)rNfB0wB|{PaRIW6D%P|;3CD;yhC}s zqP&JfH$83>AszyEu5EfMuS5`a-jw>SVemBleu47V(H@5Tn~P!^lUPJWZ|>m=B}yYE zwp+=uvGJ<)feUVa+EG4Z6RP>jEgx%`Zm%_}0~z;Q*tiGts|gQYX9W%(tdTHi>Y`0i zyY?40yhbUt;fvfKdPX zwsscsrOnL$ju)|WNSc?Q`PJ-EaE~s0+ELtcPxKRAg?HH8)##4~c<(K<_ZnKCnQ)f@ zcm+~jFYrT9PF)e2I}ojg=uS$wQRgV}S;y zCM^<2bpqbrBY>7>r<2g+|CU`z@DcFla^jA(7wz4hUAghSIu>fngJG{-LsyceOtSs5 zdWuMLKNV{ixe#3zi&({EN%&{+SWPoqO%=5ka!Vh5s0&K`^-4k_AYnc-xxWbxm-*lq z=DZyebaH#yR36_S4LfvhgEm4$;<0+1;c_oCB=h-%`6rfFMojYIiGr4IChM%;vA%>` zrr9j|YOK$xeAEk)NW$eN;Yqd+&1Kc;3DjLXwUF6K^RDu#VgY5L5nJ97jg8*q4WoGE z4%&RwpPyl(L0gT6XI!&B2;!m3p54`-k}3HLZyjFNCnqKbGum4U6AY(`rdDqoTb zK~k}N658&)*511-A8*y0an0S4&5E0v0x`>x`$!;iWejM5WHPYx_q_Rwc=5|GZ{$s6 zWZRhvo3pt41nqM?iH3tEGr8??1{~pI%=VwBrNz1&ZEQdAxk5cG#OJP~Zcz9p7YJgX z!c`%cqg10^h*X1svu)Xy`J0{(nb}>KwABY|`G>Z5#O+@Fd<-r06QdGAcTZ_M%ky7M zpO~56eDCH3-tWE?nES@_%ZjGN$^>Ng+6qMfG>3g5w-wX_yW9E~JkizRj(aoyz~ z|CGhN+%Lz&(_!Q}?#SSct>Ag@+P>Hs8%D%InI3eY~GhEU-~qOV+`EcVl!+AGvsw%X*8MTm$sT zZC#q-?&#__^-erLzl(O(w+aFBgtl@}FdrFUO%m#Vh^(EhVN(eCl5elPz{{%iAX+T~ znypce_4s`&lFU_49NR~((C(4jZagzKM|*;%`6gkOxJws0&dr$VIWLWq)iH2%H?h1t z0=d+g+}r$l=QG*=dkFR4?_wU*$otiY63AGG?3+t(5Zy-aaju$9P!uvr({2vvf6+j6 zo@MF`h?F{w5_Lh$hVZrP^;6#4ag^SejLL|ux!J6|eNs8-7vxw-u*&#reK5i{a5F+{ zGLayFXN2p#HfFnxJgo|aY5%)mT9i|bzVa3{7ty(cY-V0|%X`IAnG;MjtKxK@Yz+@h z*bFk(t-_ujBhO}Y?I9kb-G5o#23%-2q+p7gJAjm$g+fI~!{Xd>u#pd}Ty&d$BXIyd zEL-Q>D)DmDM~9};P^fk`$+kk{XF!v)4`w!y`brhzIE{!BQNsmtF{MMx-!yNDTppYd zS~;~4(A*gb~M>k1>|DRt%G&NR{f0r;n9t>=Y7 zUM%^IhF7p>x(@M702<;0-Ts#&P4WZq)p#sLePJGVs?znkYk^2F*q7M?-HSB7rLt@Vr!n!21Lnp)Frq6|%I&^NdIZ6N*v*(6%l;yXj}~ zslwA!ZY886>xu=kMMjlfIf0*g13(W=KW1ZbzAE0@(?H`=`aq65@idr^Z9&kV<@D!Y z{gc#PjlC{>FUsybY$r-?$gZSBC;+V_qOK!66PMgFa$sew+3h>t_A$CQ>+WyGC=Kqs zy&EYI1mwVnAG@()oB($sP**=0goVBZxQ$<*Gf=q-%UrUZ9@kW@v_xW*DlsgXe4T|B zpFhxFiLp}hA!FfP#IFMzj^ow^5h`h5T?vP9h-yQ47OiyhZ@#}xoqs(S{K#bP=NP|&%bD? zxd)(!di~lIo`_7G&G23n57TWyQ5+*w5KQ`BLI(RHaWIndX=HxR0fUK9!_XR4h8L9@ z={xQTYP8MAW#^n6{Sd^E-@;`4ncC10^GzEa9TKInb_q8Y%`t9VPR&N4la1tWpGZ8t zUCS%a?tb+XSf7ILan6sy9deR(q~~hF!BfPQsc+?8!;NptyB)AzQ>|Pmu22f&M3h=vRTN*c54ve%bWPERb|E4>Z=&cJ&o{eg+nma$ng~Q-(rnIK909tLMF`ef z8eU^xl^KdtD*JUsRnR}JeHzpZ8T4%Tsd^Z`Cm1`w2Pei&iA%X`DUqS{wd9zO4o2!A z{s&T_7%gZv{nu=!&3s?0F`}UZSb%C7!zU6k0r>AU3%IRE{&1EmtZEo`LG`+$NRUOe z@}0}1{)>q?DQD4H1|qRfi3S5wD?w5QmDK9AZ)~lU_izW6(8E5e)nM>8y|N3S6H@{L zu+eGBHr(VGNI(>jKO^lM8n#4qSr?yL(n#b-XHE4)lMR%2tRYaC?S@`BteYWE^f zm7Q0GvkxOkr|JOiJxK4hkB77@P&JFmVwZx>sJyv(WU1esLM5|_f8UyC!-V4I<Wy9 zFwGa=vz#*3=Ex~0muafsgp=d!K7&mD)b!bqdu-!Lbe$qE^=rW&2jlJdrZ!A)P)C1E zcyzV977?(*DE6AcDAcIC&*khbtHJ!Gx4x9gQNoThBubOd ziKs`}8Nz)@LfAt!CTsP*jStr7pYD#8KV-ZvP@rbPwCze+RO!4M9O5tw>RIDzAa{`o z70QoT?V2%v?GrF-9J(n$0s2(}4#+yQDY>dF8v0?WIM(pcQ=eMrEViAvLBEe41!(YL zK^b=W1$8Ke9FyfTO#1y43EAY^LGOFS`N(NV^2NV@PZ7VyyYIXu4EBk&oWasb2pDtm zoAr=-Q8|yjP?Adya!$pL!+hYLQ@KoDXWNq0R{8<#S!8lYWD2Cg0rFrpwfs&kMDa=g zc9`Ijp3Zo=tsBg#DWwn954a}?p2a#{z1p;R4ibvB{C;SyJ;e>}IrG@mQx2CNa204D zDR&_WslSh{G?1=7g9&)_nY;>$4a39_<3QSoJ4A@Ib0Pu_qK~g}L*ClYF+R3bdj7_y zmw7b`KF(AA>{Ejs$hvRw4XPKCm`0=2X=Rsr?#j^3@*tSHZX25qE4qIFmOE~0$pta5 zG!>Uskp$N9I{#6*Usj->c(=@Tp9@;w+O;HG;FadREMo{Gr)?2ZjpE`G~C$x<|pbx&aMx%g3&%G{4bmi=Y4ZIm`w?LS9bho z-!QetHm{jM&XQB_ye%`{El)2nROrO_Tih;E^O^4kW0IN>X}*4fz?kh2Bd}r>a`$sm z;O!gbOf&-yO8})m7NF)z^$P{n2)Xmug0bvbbN5S?C#RtQLD#%rG}cfvv?n~FgI&V+ii-x7%q;RA9G9@@J~k?DeT4sjP;+zdA- zFSVOL=#Ksv+ zND88(6wnx_lBV3)S1!N4rrDGkaJ{i)^95$s<#xu%dgGiZJjzm7q>JW6Rc7vLp9&v! zbKR#IY=??mVB4p>51R14mL0edLXEY>Oq%(MceJP2(Dl|YkWUHcvn7d-y5JBrFfXq% z-wsox-uu2Wa{Vn4es`!Q`vhHIq?FMibGohF=FGCksuTS&klTb|R_M&Sy))lPNuI5mDNj(6*mhkQ)A#ZJ7MJ z0_7T#K7cqfZ`?TQMy{8aBJv>0t_As>6ImY%V+c#Kn_g!aohg(D{-|=}&A_ZqH$bV$ z6#e~+n%+c%ABG3O0vtAKeOuq$CoyKz{~&SZtpQx=x4orazS{Z{6OgpZo8^I}>@mz* z?$RW+f!ooNulTZG`}KZIg`zX z=^~?b2`L4`K6MIz69$H{w||lFIRmi_&>=O$b_S*!?iy1Q%#ij}R#SwI--o38MddsC zJ>R5TJUFMiF#{G>6rA+T9n&6?a>hH4Lr{i7`U2k1zMwgRp$+CyeoJ`ECew(k-l8=~ zreMRMmdzNOP3dsE&ysD2E!)@_D#nLp(rG_LT%HF0`HX3Wls`(HmoP!-wq>K9K+W!W z2ZE`@oYE4p$^xxA+7c;>>v%>i+e;kP)yG40hWJKbZsL^=8%KZ;BI zL4Dp7;VqKMrV;0XXRR0Tg(Gmj>5+BdQ*m?Ter{Ff!>>qhm(|oss6B49v2>%^iD78m zSV4_xOw4VHTjL8g8BX9=+|gsB1oh$vDIut3;`1@Q&AJp8@x|ThJ356A?i}EQGY0)} zBCap3pBsYn#V~eHq`(KPx-HQ^Ea$D}p0A^j^;!ITZ(`_tth9o%n+@v@YDS9*I1Tv? zJ|0L&uPGsZ;@4C^w@sM5`?3@ui=*345-5u<^W9Z-J-a&JV(xt%WmCGF(I_yCxT{3f z7X_ncQ@4U)x{Xx4dEm|=Ypa+J9a7Ze`o<- zhkWiUu_(-6pbKoFcuOzfS4@~S?&7p@oA!OwA{0RBoM2l9$8ViZbMZkX1qpGO9pio? z)b6PiQvZr5;xYYc`1|PToI}u_=w1CLonC|wP9P);^Cb{YrA8+?ch1@nXx4Del$aj^ z2I1^zc)x+ZK%3kM{cvdI8BkID+@}4g=Z{q;|E&}QP>o)B^X0#6IP#9OU14Y(I9eam zR2Q{Ze^jX1EqbqkXb^h26htdMF!vYOSW-$)&G~Rd*0Pdw+<3hcK_UCFk$YJ8IaV>l zZcrzJ$&vU{eF2htv%RMDS)lU|XDdGepy$i(2S?JSM4a_#VqrUqQkE}4rwb#8Y;+>9 zI<+fs@J7!X7Dls31m#n(vtxRm(?1Rd?yO6Sq*+ZCN|@GxfDQ|w1KHpdaOdNTbwW3e z$zJ4iqRsNc1G^Kms>xf0RPG>49iBIYez)Apbw};iJx!#A`uh_26EPX%1@qoI%$Edw zqFXNlWrR54TiGJIvM*UE`h)oLxoqZa2qNBJcAID{owb>Fl<@-K(k*PGYRcobT1dxt zmCw_|Ah#M*qo0a2{KTw{-q3m$dpZfpn{KEe~EtkLID^_jZx9P_3&_s98rEjY#ge3IXg@J242ij1*ex9}d0=G85{i(-*n}HBaxBsqDa9Jo3>Z|e(^^n_-Opwd zH9v7gQ{--;cKRoL~>y03s}HL*@E>)KlMh<~ZDQ*eq*+ zFfWCw&JgHLpV9mi)ZKcv@80<>dUw2;)p%T-aN_A3W*mbLiz4)HBl1!spuokjXBiIu z1BZgw3|^$ZeJ2zFzOjQ$&MO|6eGsNe!t%(a(Q=JQM0miRharmyZXWCs%=DUfCa@;m zNp!Sbq%hqiT;9u)>rRNm!{QD*8Z8n$#f$aTcM;9?4B>K{Ez~qEGVdm-blT-%61GkC z-%?*1o^Rg!B>8?e*rNKBWKhofmf)l&3mOEhVe?JBEPdcuiH=E&e!0I9tI<$LRsCo! zbGD_zT1FhanNSS@Ht7cG{^5uNCCq&(bVNm|E&Nsbx-gxEzaa|eiAVr+;8tH)KD_sd z1QA&RTbnKn)e_HT0~0RB<#gG486PF82&L-U{%Wx#UPXdqY$C^dsiGe!gvzb7w$6h(Q61Eu?+sr?vn|*z^Z}&_RY}IK=$s^sK)Vo52 z9e2eRzfJh9HK6^cDPL-J~keV^T z%cmY0GLpTtPc|m4@b>{~`NT-bCi(4O7B?FKYTwm@NJ7tJ88Rz7Ged0S=$tnp+kR64 zPpxg=J}zXF9si{pfl@8ir5~7o6%-F?A~2}0p)nbt@T)>RpwU>O70ost%i$MX$K2P3)A_omsq<&vjS6`D7}!6Ky< zIWPQ24U|^vYHYvuPSuab=BV=X;@7_aA(7ID5}z`)*etTbyHd!qf{bMz(tVYKu0BsE4zAMOA=Dci{77K;=+!lqlWghT+G&K3t z@C1$E;*6S}`E}@*+%YfdJm0ra-8k-Axe^E&p)JTzeoyjQVXvCLZQ+W31BXz>H`Gfw`V)fo>2@yr)jZ*J_Y~cucqJ0imV`%Ly+X|;`kV1kx4mJ`q2fCKf}!t;m4 zG{p1-g*)Tq#oTO7f#qoM=2-@aZun8qF&FTe_9y$}!IB3eKwdUU#?zFK7r(}+NmF?T zo+fMIPox`oq9LO!Xy5>+`6&^BfW=wk4h0zx zb!Tze+oy~sw$W@<`S&0M&4U^E2!FVkH}`v{(4nyR?R;`7^MVSYV+t|ljHz_%P7UQ) z^ocvg7Szzaj#Ycaz#4>e{qe)o##%iVmsgPD7p-CF>&hL=lc#K}`~u%ez;0mx>C?y4 z2Xpktvg=ThV|Upp(kFgAEGB;C^EOAZXhOI-%9ouwCRp18M!ckW55sly|8?jycI)g)9nr(bK{hi5|K2n$Lqy{Yk{ z(Pn%u5&4wy_9_AQqimBlIz}?m8+lImIw9x1dPnbjOAa^Nu&iNoN<+f$G5#9qZAkr= ze>o#Nx*^1&N$*$)w-d=w5Ao36oDWH!wcfprJRmXG| zz1#EITDtPKrt8~6`_iQUngmG4D7@^sE!hOSUwzs1wY@QbV}-4V{ph@bk_-!qZ4PLv*cZDoPieaXcFW5ce82miAWUgza{|wM?7MrA-?eLwLWfr|8Gr%mF%$C8Pzf6tnbIz;UpR_qB zqh=Ff5FATLBx(U`4hXEza~HKN52XxUsdBDP%k_O?T@VOF6NMY({g+$^$cr&EN+5_q zdiBYhLu$*FuNRzK5dg=%%^%qNO7j$1+&RF9b*c!BQe*aw*BLGjarrj{K5kUTAH8*R ztn1T0h8O>DQXsm?esbw2w)Kz4yTp=JU>wtmsIEh^loYM>*ndS0*v3Fje=O~omYnZ? z5ShRBK^0}2OiGXctzvYV-ta5Mcys@KO^L?vS~H7}F_|oW-zew7u}0L+Ypt;G!-Z20 zJUQ?AcuG2#ya2tOn?jp|v12ZDztl%6{$hTSd~O1s-RgzcsG!6!M0b1%<<}Tj&nP=D zCk8pm5qnZq;o|&dVoPCC3E97({R@VBcE|CNlP0l~djEdPAH}3VzR@>QmZEoCXQ-Lq z>Ub=))f8*;`PNa&@|cK=8*M3RoVCX1JXYLBLs%mlUb3^9C2o7Z17FF$-kv-3u{eO| zDQ45w6p%cn>LE;@kBhe@C8&b7ripPKTo7Y5jb!Rs8mQMlMuCc5Ob0`TEYcfJhCSP! zZnS@n1%#Q;6o?_AEI6{x#aOL|XXu?hQy&p}+>#Y$@H^1hWVc-ZT+Yhq?Q(^WDb#Z% z3I9tBAQzKq37b)c9uZc0wo|IkotnKR_0|yB#LEu+mF$7&{_&vX(sJC@EA%=ct~7xB z%>zAlEaoL$*jD!Kaf+yKbOJupAdeTSPR*}Rx%xc#+qu6Y&pEX{Cvv0^P8L`6Soa*U zXa;T@$(_r@V{mR6$ZzxW&c+g&m!5Aj4*F;D5KgASe3dh%^lzOLN^dFcrB$M67b`O} zFekO9P5YA~Ybt&!Z$Kt2cf#|p3X3Z&=Yp|WkTfstRS3N1oaF#=HxHA$Iy5nQtq^1N zM#k9ZpEtxmK6B?f79T7VuB2d2bqRq$hfVKyNJ^Gn;xd9vhC|}M3-5$;r^OCs9?PA} zH9{=onb=*aH)Uwn4=DmHYxn2OqLQPWCF(5gjyE9TNLr_hPJP8t$9EkeaFmFg*b(HN zQBlYwdZWOAXUR^R5B`WL4WRpnn>zJ>?e$|M41G6VimRrvAoYoR{3W}^y5k{&muJ2h zz!;k3LVAz<+Z|%G#;3#YBf@&XN8prl@&xNC20S@`9blft*nchYn9bmxe>w}Yz3%TeR3bym^$h(S z(Hto1HJMqp-MT_)bX@-niLa_52O86tLrv-GiTa~l-G06J!oXsFw(5O$gxM?XY8GW& zzIY#H=-6|9OndO3X&?HRyIC&;c;Mdq34Aji>WukKOoL3p8NEovXFDzdn8_nu963Ou zvk;*bc-lS=4fNOH#DB+4RF_HxlYxsk7G%bC)!BJ5EX}1i_{Gi$AIdlr?FrbP;v$nP zDP9@}9{eBXzA`M%EL%4~&|pD>C%C&?1qkl$?jGDBKyY_=cXtc!?j9)I-Q^ZN-90n+ zoSEO}9}iS*s=jUOm9-Yn_AvzVX~^Y_yuJF|4=yi@Ut~8$7Pck=9$R086u1JV1_#Lt z?m^WM2sMpxa3syu6~uZy9#0g=lSs?5ELiJlbnvFhhElFrI^Z% zn;-ItCHdlv9h9d|@6TF6`4k8OXypL^vd4p}EKgxpEiXp*cvcYP19B1UuBXqC3H0Q( z)ndKiA#snavc)%|hmHrA8?Xd6HE8+1!Ss=VMUs47?_I8@=yq4l$~!>z+}NbO@7Dx&lYRjgkbu-<;l zgz7Pu1iuF7*Sx`DHGMu4b89Ly{m~mTB%$vo5QF40-%02MG4MCEPTXpi`FB%>27X-~ z#I-tGR<)#6L1gkKPs8tzjJ}-lP290>IeBnsuru0V2PkEUKra#=nA>39{+l-WJ%w@B zHi&{n{?l zoi4H9^{GJx&|1rT#Kq}5cB*P@VohQiy9K(t`2$zz41zJoN8;u3m^E-G{V1#k7vkL_ z=1{$KuV`^jTA6+Vqg+LTNw;j76G>2R&I~c{3`PEl%L!oVTG(Aklh9D@_?^b|XYSOA zF)Jifw4s@-YB1K9rW+9nmpRHQO zI>q+I|C%8(6IKgmxbt;62_Um-jo0CH{bi_{Q(GEqsIV+Zql5vGuB?k$>;mO&U4l$W zh8+pK&p^^rcE0g1w66vU6r+oHK|3r@DLL;OV+nXEDM$S*b?7m1`ES?K~OUz ze?b35UHxLBhiEEuPuy8I+0_oM8nn@=@ z#p!7C*Zoe+HmQ%d_Ch;`CagQksSlp~E;yeVl94mypMdPC4hi@HH;eK82N3!9mYIH% zW=nj#bWG&Or#_@?1;DGrPZKyokt1c2F^S19HC)Oxyg7pebvBhsHXK?=g_RG^%yz2P$9}*gOay)KsgI-GSuk`1LN%F2o8OF$%f5#wP7b*_Dr+YOp z{B!PM79TE#WRr9>v%oAp?*jST-PkcqzN!?`cJ*IsCbDcvj!8Ri288P`7FqVe%q!Yg z=*7nm{A6>Z{X0qs-kP~~U5 zA2@C*XO`NYd)(e_qLNtE_sYDr;>(R$)%hpzm>91b*cCzHSNGKfOpeJDuIJdERu*A! z6RV58XSZq-?VY#m(8h{RT-YxgU8TC)O^kNrQrg!>cX!h&^Y^jM*1UB&JS`U{ZAsIG z9IMc{WZvo)2NTIR4(b!_R(7fJkTDh}t6@X$QyNk(B-bg4(-(rAa(S;iW_wK;^C3vC zZ|oO6lI@nLa9b+j)LSJ1@pTHUB1xzb+0uG1MWVXgexaixtho4~&s( ziB&5-JxhTn9#q~(b3mB_ve)rvb1(ea{q?TLc>?zPz5K7b*xi5Z zTPJI*oAyHPI`kE0{(kx0CvW*CLUv5VMAKl8s$e1mH58A3q@vU^F=^y3S$UC zLj_@z6_?V3Q7e|L{`5qU9~YEfQ!~H=V|8E)isq4d=<@C0($ao=0QTH4jsEMs&_9qc zr8N4RJEfYDibktrtjO25ONO>gKV#KQ<_Jeb7pgniP`wr{Pn(^?vcWHk ziIPI1n@O5cC{nUep48--Yriz#7`!V8>5w+a-*&I}rwoH);f#((px%(*9&CuthHcst z91x@%Yx0xpvqo&=iZwi4`6?HUDhgIArjqrA(xI1=A@(=DiP{_ns`Ej20|ob)o&M@C z?fbJ~NcU?+thooM+|}QORpyM*+skg*>UVf;{Vk~1BM52Hf1bx$*44t#ig|KbvcA0A zMIwqB{QM|r)l^RsyS%M7{-4DzH^@k)PbU=q36ex3?U!T3WwFgXmjgFBEbycd*M_h1 zE$^QV9Q^TB_$rn#7T4c%2fWG4fjkc8drjMi<6-a>zcLfa8btR{g2dll>cx+*c$5Am z$tKD|wed296T|5nCm|I?Y6WN^nW3^!etrE7m2kp;PiL-|qNEXL$g$>vdZOK$a2=pM z8*zA3s4Y3qgP!CIPEvY|3M|1Lre!E=Qkb5s17RNS?0EJ$+fq?_#NXpcZ`o; z(P9psd`U=mZx)q%KVQ+OJJl7XrKxbYcSM2h71BmG;Ikgjq{R~f0jAW- z_MN!Qf|lOt=6(j)<63DyMZufFlyIG5UgO&aKK&5tYZo_C$5Yg79t=W=kx7anX zS_5m&9+<}0r;a4~->_SZt{?aR4o5_q+kM0O(>^gd!RCCR*<8S*qV$+euKuc&0T`9~ z50b9cS~*lo?C+Q?JPLICq)ay?*$&yD2xxeqhrBk%3A`vm7tmv|^$1(DPuk$=x3dzy zboN7J5Hst!&O=`<4Fx5Y8RCg_+dzm0Lb%|y5IXO@E;&J>*7o>n!<3JU_!`b5(`o;y z?npe$QHf$N{yQGgjn4P0LBbWpVcD&3a>y6&hZ4~B*mA4LoK)lI1$L!&k`CxB#;;NF z{QOXKOp3(LWd*)W6`nUfly`QSiRrcbW>H3wF|_dB&!?cETH3oF18Pa!U9y+1bw$$4(M=M2@y70=BCVtE zZP0^XERN?s9Nweuu^4~E3*0@4gZUaDWqs$5w|cxP;pm!C6a&RzSpv1m|2<=8u>RR8 zOu@!)#*boiB9hiOja*p);sN?+>Pmm=PRC`!X^!SbkVeLIz!yIqKxhs|-g&trD!#j%Y{R8o5^Gb&Oz--Weio9@)^sI!zOf z318>GBRz?AL)J1&S<&+N>|azXI*cudoVS8i^^=@%k4 zZ#$sw`yY~lb^e1>S|Rqn@Y!=fV!V3-hCY`pvooHX$M!P)o4Y&e zRV0&E3yHK|!ED8w&yrHtoc}=U#g__;L67&MH}Nfg8;CGC40)UJpU5r}gL4V)cNQF= zpWlA*uXrLv*=K3V`=KmFW|6eyOG*Boa?Jt`uyg8Vn|^e9YTN&xfj31?^~`jl$rXP5$x%D7sefZK;?+ z9vKY&0yN?(CRP(LXIIC;tq#+!d`OTO*u<~3q2fC-1fXa++FS$=`9s;UF&5R)4L>++ z3`kO$Aw0!J;V2<1cd&@l4exe=o?M{v>|yPhN~NjTl>3^Sb0PY%epJS}%_ zT_X9V9rt(U$D{wl^6cr4ZW6|mF{V0>@p|cO@_aU>wLOsJcV(r}Q_1`;|ArZ4*WdlD z-CFCJ+J3{P@75kB*k_DTG(s_LhCCgC->aF@Oz3{IgP(6t?hW+|6pyZ+1AEeyROGxt z5h*Y(-fFopI1&7ydc9KgFhKb)jR;D`U{0v7kSp_V7c@V-9IjbsD~qG?N4li+@l>` zc`E3vb-aCi=soqrRR#dme!+|No?tGdD^? zsql@Px=-}eAJco&F>_`$4TCjJabQ}yngoo`!bQMZ&t#@V>G&^b9NDFIx>tdV-}i|$ zZUyD)JZRkg9rgXj&1=9!KwFqR(%?`WENeb5Qy}9QuJ|7wNwSDl$#uA#h?|WGLA-j0 zwLBG!2rQKeNexXXnM zfSiAI+cE!(+wS8n2*le2e?2Nv7Z|6}_Odc?hJ@;k1pimhnv%4pM2>VQQBc={su7cc zLr@RN4;O}E5knUMAL zmIw}KtyItVl+xH;?+W?Q-IJnn$QT>U zF*5fY(NGE|5@a-yx#|tR~g;K2f z4Pw0sY}n9a-Qm`90S7vxPkD`3R`*$$^D0x$)4af4xf%Gb@jYtBF3BHELzPITmd;*~ z!)uzBq`)V}bFOyvH4O33=QofVyT_dhkU`BND^N~G-|h^cKqVr~L(m9Y9hn}7MaM0q z2U#?k3;gT48FZKd?1+YD0K3oLXCGP;_cwi{CEz0egGFe(9NxS6-d^`{lA6FbXn2wwT^FBJ!6%$ltClS@Zu!I1*FrLvDmHrDX2a2caVZyh;zrdv`)5<8TbIEi#pi(Zk zZe^R7emA-Ja>}W)6(XdN@a!+C256nqvNFfkiAn)(FO2;QAy@v@qe^NmoBrFYvf1Tn5rUae;$-=2-gSk0cl+gV9f2{#o5PhLdQ z1-vr5vn;iaA@6WT6NuVuKx%;hJo}msSTXrza!+yI7&cC zPluyk(D_s4`G%z9v9mgtR#XoaD&z4#LY#k6XL>6xRlH>@r4=lb9&gV<3N))2ss>f; zlp620&2-$hI)!$;V2fCCZRfn+?-Y^Dc31{m{zAODAB?f{10kJgV*=7TP=NV@uzEL2 zgW;iN_`oUpH|a-D$0+fyl%Gpf-au+TJu8N5dHC^|^L*mWeV#P&fzZ-ddb`Zy5rV># zhVb>42V_Ilw2A_F!k_Nv6^%tZLZa8u51Y-C4z%Evbc5`%${hXL+0~G zD}1pUR70$fO*K5PR^=!^6eFq)WZNL#l|P2m`MwaJ?a-719*P$m#h(_7nP~m+18$8F z@$MX4xbz$~KXXF*!Cjuj)=8Y8c86TEW_NQf!tXr%>w>%}>%lN)D}E;B!O5Lf4q zKl&m62P*JzeL%@|rV+<;TsZqF~?3W;cv5a$c7(U9xmOAq*oYh0f9 zj`w4Bh_k_jNw<(lT^WxS5KQOY64sw`56SNKN<7^Yb3VGxP#R`)OKzCi?J6?w(&uW49eAtAJm=AjXjjIY(p>~zq88E8l=+poO^Z(_qK=nfvZyfsF)PWR59PwN=|RxW0cVuq5d zShUn9AHy$2gpIU(FD#)MY|pWo`LyZx_aLtRliMiKVCKJOHTnM6G`6Ay{^=>ny{VRu zQR4ZG=f4rU2=*B0j0945eI?dD(&tDd?3b#nC7J^qHg*-IwPb3H`HuI8?~1k!Y4UVkM!=`jOpnV;=^f&P0|)^Vq;bH1$*-m3X!XP zs-(yQDK*kbiTW9xYl456`Ld&wyXVP?dgc8W|CXSGGP9E1BBa0Ea%|7o)|ZcOEGrx- z_sycAo~E3fe+Dy}4SBd4j>uQ%;7#V_Xoo^|N~{c;_Sh#wuE&RUUE3H)Tm)Rc1UgE+ z_H$lXxTziz{|$od0)Y^^Lhfg{1Un=xf24t4T9(I>1Q;GH>EC{ zPX9d^SNb0$?0Il5>66(fdzTMf@(2&SB?}Duya2_6;U*Nr%D~pKwt!5ESe|2`NzT z_kRqbwM?-hJNnrLjQz%o0(ahs`VypTIF^UIj3x4S)Gt`6FOu}XXTBknDc*oGl>Xu4 z^1Rrwt>n?J#g)t{#$bo$l~HgK)Svw&w;LZ+hj4x?ad%YlTr0=-ROegz?1D>$`18VI zpuDTv$}2zA z9;E~F$8SNCZD}^WBW`X*yCU$tFJJciAKU(5xMlp^0V=G@3s-p{2fkd=H5g>|+u61-SP32=Ps(53F3| z-jf&q_T$Dz>aB6=xXb$Z{feE(=GPob>EX^c69rl~$o$pi{stNgEQUSk7np}1s3YL!WRR`2)PXs9Xr z&}mMgA=H{R-Jn6_3GL z@*07zR?R%8mQ&e2LA^ed=;B%8L0`5!!PUAi6iVK~-V%vUQY;G@o`cEPdwLsfAm`IA z^zB%8WSuU{H$L^Tjo`n!-i$lt_My0Ur-?tZGIh)|)22A+m}DG$0&lKGWB#FP$izsn z7L78t3PWFEbv|;;&t&26kh}5>SlmtT$76(az&&*E!2|LZxE(6?T;HWHK9?9_iCnYQ zXEN>{f3YM7?v9*ujkhn#a=uLhxoEz9Vb6o-94KL3bn>Q``!#|8SH7Y~F>hcyt8_-l z&B80Vx60&~ z9dY;_1&>wSjL~rCJ|0cs6x=PLAN6!RMo9gSm`Iz$N;zUHfFmvpF*P}4WpJ_S`xsl? zBio=rbue~7rM|oGcU&I*32@M$<6Ocu4*>`xaur+Oeqf!3))$oAJ19}NC>7SNH9K27 zBJ4%XnbO?^#DAPLqxOQz+kOprM`@QlTEF{DuS~1eBAnV6ijB9{t7LU1>ZwqkyYPL~k~M9D>_5RFj@z5sT4V zc3AakVd;ES2QLAIQWyOe=`jL8d<;2b7e%}dEG7uW))ijol3IZg?JIPJp!OaxW*aRz zg4`?VB}j;<0J@A8gLV8xVxWt4mGHQKOMOv7>z+>@~}ozLO9Te z{1HAg(DL4oI7_}-a!S(i)jq5}B!ThuhTHR&T08}7U5?HIkb~q`kf9A%KgruT;P;yX zUgZYQgY>lLS(n1>=F_-dz~5LWSslTo$=pS zwj}qJ#?O`yaYrrz)37yVGu-ZgdY)>|8jk2eHgcoIe)Z>v!J>ma@Ph8KPI z;sUXjV^%WSYF(313(pPO9 ze~030qv;&?+|SR4>N|cPAhZ9ug|=6~48^Og$!AqMqRE{M7^AXeG8TT=A3NX@n$i?~ zl8>Fef>c!s)Nov-?P9i$CXn(Kk~`dV+&OxI%0L7FOSTYOmOknG4%MbNhtg5yt{aNL zwT}U&g{n8*<-X{7_G~BB*pxH*>ZZ(f0--fj_QpD6bWKD^26UO_i)rTN|4Qy>q;LzML<`%${sg~SC zm~(#s%us>qk&U;4c0e1Pj_19c(i9^PMg8KZb(6)(6fYWpepMei zGuszmK>??=GkN-~gc~jup=!MgN-p@FmUXJX`S^kC$&Ot+HWUZM^1NKzs^#gpxU;Y*L#54e!I`c`Gm9|Di3V$mRzS_S=E8>nnz*|?nj z38mQPXJ|5TVo6Mp!m=o?0_t$&EGB+;Gj7uSY}o%r3|>(*j`i;fEsbgU;k<_^?&h&gu(~abtZFdG}j{;r-TOw88uv;n75(x zi)A$Q9;FmK4I9D=KW+P(pMbfVXdW*Dy$;P9YFehxr{zTlf*Kn7V^4 zx9_KKBiT`o7mcqTtV}B|sbpVGmko9q6<~dAX+q$sLem3Wxx zsH*}ieZkxzhM==>X~px~v)f$nquubD2p$lsFLGMkXwet}^{e*Fb6+c;&!tHC zd$V9BDcR_^(1Hm=ED!no&JbE&F7M+JePFsV6{^>C!d5~%0ca@xr{yh9z64h{wh|=b zNs}REX6l%BQ$JeAtKx&8vVZ7A0t^Ug~B$)Wii8I5=a;hH;W`n<&v!0dgl4$5N z#T)me>)K$7GoB)RQk~QrqQv!e|1N#Dy?MNz$Z&@sp~!*DOh<`Y?0`2+h>5Aeq}S|z zN`LvN(3knnP#L90YsgSXuw|QT;qW#W(c0!<3fsS)_O`ZdWKCZ;kZu>zDG$C5%k9`` z2PNTI{*YYDHLH9oh334SUApA)${N13if1?Ead5ma*WOG;bR^OXFeBd-x{lq=X^pgk z>TYwr(zhbn!hwA}ESM1nZz>0ct{M;3+f?~$nnIH{i9AJr2-bG|Q7r`TUE z96s-)B#TE3-2TPPh4GkjUcTxi!J!46V+66_$t76PX-2qe^WupT-uaOjOEK@hkz?Ul zr56H69hb@IF06EU%FDz&+e`IVYR7Ysdv15G4@ZzPK^BBeT;9GO87`FIrU@XLq#?_w zqH2N5qWAM2>Q1wPMFO1wh}sLw5m3j+TO2shRR(DTy|rTK_9v5QTb=^#42LBeP)0MR z>pn}eI7zxr;fYf$rse=&8#jgb%%6sfL}-YeD_b4N9P5+ENCTFR4w<5Pz)XLH$5yuF zQc%aRJ`oD@{AxG1qoh42`UXLH$!2;<`hKKCtX63wJhrDam*AjC!#{34--g9Y$tgp6 zD*?HTuqo#!Ps+Sjgfw+Qk*LlCz12cx0jFtWUQBGN7w1ZyK)XYxFW_v35qA zzG?{Fn8>tIFA)<{b?ALKPcly3)M+SW5ZgiOs zmTs2Faqy7Gg&;6oWQ3wC;K6N6yjtO%nQdnDY$PdY-y4m9&Yl2Qri0SE*{~6Ux9*X{ zR7Qz?uRj+n`(at{`;&TmtpjQ40F}3Ggz6wGB!#kACRIUrDv5WE25hlt3RA}9VBb%9 z+MrBv!md-qpgEh|D2bozcuyYkAGA_y15#IyeV@CeO_lE15VDsm&1ePxZtmnULL? za9p=DW+IlNXM7fzzH@sMqs_dK>#Z#W8qJheK}aG{cQk)RH70}e_pVNb(uQ_45nVA= zzapJcw+X74il(ENpbSlF9|^6-U-bFW#Y(>Lby`%&);XCfNQLyz$-9b7g-FRZ*%EGZ zY5nB|xNDg~Cg@_w$@Xi{Ad40XtRd0@jN}Tpz~Qc73DiZbbu+H`by%ZYLftMVqF;A+ zZEv|unL6ZF;7?~sPWz|{@+nIj=2g@?I|BOZ)a61R+0i!9Ftj-K7172gd_~H#l64UQn2(LLKSl`ZN7Yl1um^7w%Dn7JH82- zZ$Pzs(Sgg&v{qDiD8azQVQ+#jefhBH2o9}TLybo5>oqt&S$2~bZhs9^;-!OI=}q%g ztGa`pG;UW#;pv)fXp@Pk?Z)Or<|O4lJsi<+0}WgQL7X?3S#54Uh5F1NF5+lDKG%FA z8V-b7(_CIAyQhU$6h4*di|%-S>=Z z_~{yeLqP>Fr_29|<c)SA2rN_E=07YvS3L);3iBs=e*XpAaoVnO8*}BmA2a zVX#QYLX~qjJQsHNsyc_58Aoh<&T?M^5I?!+S%jS)Ip>Y2a7341DR&7-b91(NSuhPGBd;WkpT z8}z-)u8GoXrMK!qTq+DbFm3Y2o~2_f*l>O-q0OYLac>LZ!%-3o3%c+;Oei*UPj)7> zczeGh;1f$%c)L?-Vom+PGM-&wUA+)ENDyW)1M@NpwyZXnti zXJ1Q|6{v}tR=W?Lo5e!?BO{-zX)L9--^E8V8(u7bA#FptF)}J%vCo5t-m6sy^SIQejb*^fT@9cZhR)4K!KEp4c(fCh7tDcmf zGHdDrs70EtNN9r9=k*yX>wqbpoU|kgU6i142)tA(_0eqrMNWv7m!Wvm%1>R)z`9gK zh8(Mg69woK-j*s=`9ABqf*KC@M0>1dk{6B@!MENb-)zX`vcp-EYk&_7B)0fKqw?IA zB7gE*0qR3`w&9Bq1s_}?ro00}Qc1PGUSH3Iy$r}G5#+3X$J^h?mq*DpIwvX^Crm$jbTlxv3}34zsMUEkFGd#G=aV`sB@cg}L(o#&kCVIk z6BFQKYUuoa!1(!eMU~z(%8Tij?Wq!JyDv^SzvJF-T`>-{3()?Qh}-1{d4kLSQt5mf zgE7+XEkNF4#wrkBk%uJu(^VKut+v^C?H5n`a8t~N{Q>SM*8F$X>9WSW7&!!!q=+-D3TI!H!0a(C-z2$ARa!d8o#W# zhYTBkMTty27aO>+Lpf_SVLIU7;wtymd89JRl&f zg(&dhpnku5A>E;hp7^;2(#u+JC|1$=;FSpCEnu8LRekt}hWm|yd~XWVkgi`95r;;}FXA~Tsgx}^DePcc^C;L&}y zasW;7)(ZnX$?{e?TE#ezpWBMkQX(erShO%;TP~qYu;#?F$oS;|f#H?Xf7_JNoxW{J z;Q`ZArwDD9H)V_yiERbN-6o=aB%|NxLU((m-Mjn_&C-H`x7Q_oDDm^RjV;dL#M>3W z;V~nQS72Khyh&@~>j4B&ZC1dYc1=kvYx$UQi&y^gFe1!5mVA~&*~MSD*KaX!Kwiaj z>w&#V^z`Rz2GiGMq`_i}X=i%zmxu6q&m)nJZ7>dQGEKlXqbXxLdbo9U(>aGbuvRco zH82%xrgl5PQlRi+H)0{8MXYwoXJ{4yHjrlTmcFAo_>w!0fiJLYkVQ7))eX*Lok_s& zi(-dHx3u=Uv2KBjMhJ8?5sVmZA9;wn8FeR{ewG55Ky8#o-D~>RJ5h zI6D6m+ct>x^gs*EC_rjY=Y8+b?O&_n!}PK~&*l?LR%1yzyHD@MG=}71BYn2hIE(_t zOxGh(7KKieU)sem0Db#jn|AFb49j=@*VUk%DSW9(gFCd_b9vtSjznW`k+}J%rDlzK zeXO~?ZrgFP0jTe87$0BrhcJIEH=~V`iV&5C!08 zjE52YGbEOIrP7S6Eo!!acqm^U4r12^^+)=?W*TzM^e9^$W{bUfDjbF8kkOcG`<~=F zr+_yDfO;UQ(UYizw8;AlKY_agk2S+~yZ?v>!~f3q`WahA-)#)@HYP)Me{k%AD_#_W^x@7{&rmbm`<)tzvW!7+|t&vJ^55JUrrY4FU`e~-wUp>$Z zIUj0CyUsQ8#2e>QT`4f>qPv*ropNi#O$lUYQ08!VM!QZ|< zMz(9W%*q`H?CT3R>kCN=X}L`GyQ?f0S$Ol0H6Ws=`#xZ+qg^vV&ZoIAYi_s{7e;Jj z)=V+*!9?X`(`3pg0DTpusPT}8y-gjdZ`gpEEvJdLt%yRSP?gX1T?O35LsRxusEEFV zHnjwU(aSP5^D0Mp^?Jxxuy&gGSxodfQjZuj;Y$PXEp|Pz<)Z43SfR@~gqfWxQiA!? zucrSAVL;TZpeXj+nl8Sopqhwu>&oBn+*rPB3C5*9g{p{v=jQ&2XJ^ML?e1HFfbkq$N>{vi(0io#hLfH#rRl{j znG_EXp=z?v2oq5#pfrf0u=G9z%R9kv*B>79I|>?`!huik}!#0aVBLi;gC88 ztMM-a>Zs4d;5$#p(pyA$r064}t;I(g(g~rbn_yRKDsbpJGDS4NE2um8L!FuFd9;hs>)8m(0gUBBdMM)_6wN2(CQc-~MbQtkC^cRBuwQJIa=)!+x+)7Hl?L9%dXA{4cy^@$FoWZE zmD-b^Slxs)NM$=c|2uj~hwq^9E>GpOjekF8OHxQ`Ip!`zhJz~AluICr=>?s@DwY_eaz>+j_&xZU0KE%OyZrVJ-MzX zhkLm6c&7ePIS0`OqfbAK0j-dL1oxcw;T(WlTHC z7TbXL>!4NPaqSXwyJNFw;5D?1miZ{b>9IE;fRH&&Aw_COl|a}`O!#yXX@Vz=J^1Zz zwR4@#O{uWL#`nKKuH5}gl_b40+okTw5K+j7k^=kOpX(%_ap{YNDoB9NY%lL(Iu`oU z$Xb}qhYI~H8Q5QFw3j$hb@IYo9+)gy)aT)- z8Tz?_Qn@;;o&0Sw?zeEv@AGG^V~4Wb%z>vLRlxzu1r;_BQ!qA;J%<5FS0>8dzFhi+ zHWd_^*u3&~E8L$rh`A; zBzQ5IzEF`G{7Op_gHpc=i|a>B@M!w-)vzY60E$39NY3pXl`Q?S5G7xsk}V|kxw{(B zb@p5c4={Cm<-{_XuQ2{2vB@dWMhN#`Zh z7AET=l1GY2gy?Ilu18+pUrSBQa)9j-1TU&u-h4JgF$ghgwY6X!isB0!?pW4H(&ZV~ zgp?TodDV8wfCk$@)q*b^=%F;?0A*R%5RQ<)@T2WxWyYVvUcSj`WpHCgtPUN2RlaHs z9No)#INTC*8%?R{bCg3lfrQ*&%ZdQB$G>yW1yFIcX*`@)<5QH0ixS68sl>aqLtU|0 zz03Sx;H$w}n2det3_HL6uZuA3MD+e|Sw#rl^$W7Ymay_(7aNPxy}7)N!OEdvVeJ-@ zc`Hj5@AT7XIYMzdD)jjx!rfO)xd!nH7_&5W@uRIpw!^!V=vxR_;}@yKL`PgLojl05 zt~XVCIqK02R%E75T+#|2iU|b!hhp6bP&XA7bKRxwPCo-qaYqjbSn0*vqEW$&TA7y8 z%Xj8gtB#U4)rUZsShdZC7;)NZQ>QMTr{6uOGqt!P1z5BAah%D}OM;{kMz(8AAWL{cmR%_8Jd$7iQa+>vA{#g*^HVj z?jE@rAH!<_E zDz@zdu^d_)3OK*tHkHk)crpf9N_j9mSu*4|ocW zfv|U$+O8w`;kR`7Jqcw(agAOJPSml?JYhKd{{w2j*iS}gGl-$~36fc>=!};Z6|px9 z>C9wqeAvg)`8N9T1J;WxJ9L0nzCzo>48-R+VKA_tq$Xe1!W``A&dx8;j~4X1>sJ$C zgT-1zc*aQL-BPU}M=az$Y_jmM;roudXI z|J#`U%1E3&+br_7XP_b8F0Ye1?dfxmt*)H45R`=e$UqSF-O_sz(u)Vacy^8rtb*^J z42uz#&!l=)dbmW6H$7c2BI1Oczrv=Gm^LSSP`^K5fAR3I8o0;#&5*VGx)p#JvUsU6 z64A(Q$2#UHPHL!-rK4XGZui(D@ztt$g%8d|fM}e;2WXo}T09hYu?p-=B2P zPsnHzJs<*P9A_>3skOxkqG7JX!D~%2)Oihh%q^GCyo8`8YRDYOGDe=m`J`fNi&*{b zfDiQhof3VaDg(hqX1^Jtc*`}AB<0)xIPH0^2{iS{oyr4tTGBxHVKMevpdiOfcisdh z@gBCG!}DBr(u4q4FJ03PV+3!w%L6L%Q|Mt=$q@jfxWfh*^zTH0>SIE-ejdseeKLh2 zCWGk|^nXuNYY)fi?;K8kFwJy`Ey^1`(Y zwqbP`e(L+dN*eirsyr_OAU5`)j-d}K&XmUiOIt}KV@K+5q4Ena{No+%u9W|DksY(K zMt8^XZ%t@`#NV!MS5$o|EDv{c5UHUVU_7>7k8p$ zYnNCV;MJWDs*`pnMRec$Tm=0KizMjW?tXCz}nAPk{)p;F}UY|buJA+iV0Q@FQ!K5sLlgbRdnjc z*S}g)w@=pMPAiC{mDicx#edfjvUG|T@%}_ zulLwg+=06@jC3S!K716EZ9W%?f1XVdGu>EOFdHA(PY`t`;Y@r>xbma^t1<2;H2eJ! z?$@{c70@40L{R>0MI!e3O-g(tG|0V)W&hE$B>R2zw?D1#|7Tv<89oe&oT}Ou~FFr`nsNPOITgT5>Xl8EYJ_-?X;eLIyk>^zT#w*YX!b zii|}JUS5nXKzAF!8svxB5Dp=mdO@3X?T4Iv3E-Dfgr?Co(Ykau)M8faZ?6cCcU&OM z{GKj6UE^zoe|~G^4k%;eJR_lBLD+OHxg*S_dz1Za_0x_e+ z&|_SdRh~D_t_LOW4u%MrE^l>-Jpi$J32-mBeb!;RX${aPu&7uy~h6^Ov&)@bq&?%$fDLai?5)sdxZud#3qc=(`iqYk$75sFJka+o% zPG+K8o(J`N*O(WjjE(59KA_wM_FZI@X2=PAuIs_eo_&&W;W58K-Rc3);rK+b78uGE z5Bw6#0)nD`x1Ua@!e%Y`l8G!UOQBybUu8Y#Q|>s7iYrf~9w**9qFKQs5{Xh$ONvPL zTMSndC@b$~W%1md=xbnn2&|#LjYk-|nNRPN5)H-TCr+Sc7BHqon{dk&?yzI34J{2uhiyq_v`)sX^ zrcxy)7`i1TXHH?Wijk26aI}(sAm{;z_bMwgiC<(I>Z(m{VOKRqoqdith&_T8niQ!h zU((1vMxgU){^BanxVVee^gP6HJ2Hm93H%n`JLxf$thE9UHe-jbcm~^=`Dd#yHNy2! zX&kSmL;jKHWTqO8RgoNtYSSutHI+4-2;DXTbkN3&vHWXX-g)5ZR9zBEYSW+3>~^;1 z^RcRJD#Rzj(=`R7ldycUJN6Y7l{&tWg*6(+k}fY8DdOYX-{Cqn6*L$tE`efuJmX)e z;VIk47AX2)!!>{1etq-_gk+(~s+&eHXRM)xHrywo0)+1uKS2_%FY6{mLe)F2B1ovZ zH?%Dhdz|`+ROy9G_Lc>?=7XEkya!$JJ67S~txKdw2O-fHzj2f!E_2;S>m!l2Mks0N z^3 zqp>`mO>~(L;8aZhltJ2>-k^8YUJ{w7B|17YLvlFnwAoBnr9=1-?8X<5jSvlaQc?|c zJ0!g6Egn33tFGN=$`qKl!*B6Uj;W|qP&W)btgXs|*f}0BU}l6JBct^25lA@8S8Aa_4i9ar9R2Nwty&3|9HJl^fKX zOA)|&vTnYgV#exrZF7&UAMF_RcS`Z4wclFxK#w4HVzvB2H5~W-vuHlXd~3x3iAH82 z;W8T4UsVK{F|yk`@XBP?A9B%$Ox6|^POd$fA)tkBqZvhIECt6L_M-8m4&H1%G;W~Mt+jrAVe0DT zOvHAcG_>I&QoSM?8e8+7xphW5JU!|Hph|&#x*je?UvcA3VQE3(SL1;c?K%(M?^gEW z3?Rfm(BwP!e?b%RhOj3P@oq>3pNG9?rXr>-yiy1Pr?b3C^wV{yK@PfkyUUv5{mBai zPkpI}tdIB_*ylGX0k>N{I0#$f_TkOaJ$&M((4jsRB*6+FY)NFCT=;UsSl=z6MbHIb zd$>KM(xs4C2kHUcf6s)vcuyAiTx*5O;E(5=wqB`C%=dL&sKZY>TS6Sq{WYrD%)$N{ z{#+JI1~x=qMlx#4nYs!5Dp|q(WCzzX!5M_L7Cr*#!sS1fQ+4hBs21Ym&duJli&rSY zy!!bQW>0k^tIHNkwhxxb%C45Fp*I0zz6CQy$a4-0bH!g=eT3N+>i97e6&})gNrMIL$wb3g5w+m1x zlBtII=>ydCt9g~7V!<=^K3-xyCE}L07Nw8ct0PZC+kAxOWnOO`oyes)X?|a8nAxNt zQByq;oAkBn!o$vDLtQzIAZ{yYO{4D_d=9U_0ni&;%0vFp6{7B)Z$KQp#8mgKAb+mR z_|lBQO67|zVl=X8jL9QZ>YtP30{I8!PY5r{GxEd2?}WUr&A<cJp*8D~4$#*l6ksqsYng&0S2`Qtl1WO!SOdQuhQc~a|qyWU9R z_!vg#ftqB2f$S`=n6N^4uU4v<6kO?n>>%HAjebpyvI;`w`ZYW1p~Jv1)BZXD9X$A1 z_hRI#$QjH~nmiZsOV;=pyz4NzXCZksgUNFSZQi#!AJ3?B62y6_!{35mw5I%-s%Z7m z=;_n2)yLsl-YjsZozSsxO{h@A4zvB^-ExPMDCb z-yi&peF@)MLE~(%NYk0o6RE9P^!~n(*lN>ytCx))26_B2Y31F`em5p*Fx9ox$;`E9 zJCy(UhNTXgs`HDoIS4LBrwt~tF!6yqU$_J1IcffE`PFk8 z%?one4Oy|x#OK(hR6_93&M2tD=Cq9Oh1VZs;eHWKSDkML5cBx*?226FIcIiZt9&!x zlVmE6^$u4Bvs@^&e1DDe8f#rH*4Ke{7l7P5<#E^af&l(PX`iDi&StwV}-y!y4BAcV!nGEw|1kJ#y!5N_4ghmA`lM34$MriPfqHq z=3PFS-#fcrSiwc44zx4!;eQ=2tcoW=cQp+WZ9P_k$sG<~Gj_5dRtXYKD8<9>;u_~k#aRi@eiu)PeC;F(}mv)>Szn8x-+*Yp6b-*O97+rwOUn3Vel1{o#`) zgRP3Fzde{gDun+@hd7Qu#V3WA0-?>_0850)?d`f0D931K>kO^^UOwO%-=y&Rs&aYE z^WiaU5?hCLrHc!ZiaDeAb#fiON=7Lb{vKR4XutJRXf?{X!HI`{fiy_`k0Jb-Q55@0 zxuAmMejx64tYzV?d+3;z?HD+KapTBlD=0#@t_u>2Ji*<_<~lIrp?-$O-|#phC^h~x zZ&LLB^S$Jkj7K`ws-HH=LZJs*xG17zoZtEXP8@LVD{VgC%WStbk#MRguw6aK5nX-P zc>Jcax-8Yh2d5SO|BEe{{n0o6u!Zd@naQa*j`HMw)y7-A)_u)K(aDXZ(Wk&f)G}7^ z?5}53%p`x?)7R|+)2Z{6179dX-EuhndLc49xTOc?RFwVy4^}muLfthp*B0M{;>g|w0cwOhH-Ik8wr_3S^5*P2jLzd z7?cl=nj9c3bk2;me4gGo4wy`^dw1pUd0rYjsIiIEJP|;$3K?zy+_jr~HO9}x{Zkn4 zx^lEBn-psHZH+@)gXy{FFL=V?PSBG*`mv!c^h(;yCgZPy^jV?fUu=bvSJ?c#M3E;s z+qXE>mj&|qLyV{&XDnGNBOW?uUH|0Td3P%kypCdqf3>`2ffUkHa2*=jw!K~O)tKlg z`YlecbfG(R%Itn}2{x5AuRA9?wAZmX!)!HIgHxixGv8do_jToNuYE*&ShHNzbh#E3 zo_1{~0?rA~5RpbGcri7jTJJZ6sX60*CzmVIeG3vuSB#S=>m+kaE0(>NGl&YIZ;5LA z$+4NkXES{5tJS+Uo{p9w^PxvLvjeqgyUvv6l2jM)@Z)((Se|ra;u*YYUrb&t%^GGt zynzFw`o4*c3+XguFV|g z%L$}vO9`QLEk9lJRbYv6y3#zIwQ?0DK3rQ5dNcM{X`dg4$coKbO|ip8gz9Ln9ZoK7hw$zZb9e=9X(R_C zVqJy?Oqe2q9RW}Eojj#bFgWxtl#2Ov!ifI`D27tHm;RU%8?TXf6{Q3Q=-Of&sHI*R zT&>ppO*FZ7yLq1$v!pboUW`AQ&#}awTW+(AZIdF@mQ;$fs#by`%BLZFB${nC@tEo0 z57O<*5necMS@m734XMv4mMfGnoiJNcxrfaizPv@(3pqi?iS z<%=8cfr-nxY>3E%B~{QZeu+!9QK@Sa`&|$yp6UY<`&x$ulc{VDLA_t4tqr_W2RFJDo+cT^Pd6V?%e;PU1^MX zcZ~O+glz$3JK||t{y5)+*wFwYlT-e97SHjAxA>>gZl3Lx+F2# zUQk=SS(ZECO;7Z{Llrp?xmq~S#*4tTJew)w@Q{s3#Ks;v#Kcc;UYg9=U=f#@>~u|A zAD9bDcJP`zk1B=+Qkd~OzBa_uf;f!w{c%=d*s&UV6a58 z^OJ3%d&!m zg$^GvvK$C@+1BUs(}e+z=w%=@XmI;Z9x`z7{(i$F;8h!A z7RiCa)lWx?_amuNFFySnhr*w0RbXU`bLe2=`CfL*tDH}XKu-$*e#c{K?H9!VY;44M zTm?h{XoIyPt9VEj!u^!B$sOyTY&A3KI~$T501IDmY}~wY>g+1X^+3JAd8TF8uTpU5 z;lmhTI7d|Qaid?W?IlQDikO-{R1&GPVv|ykV?9%^ce}thYaUX00AZhXB`13O1IHn8 z@Pp;8Jb_p=%AOs%20*_OE*Z3!RTF@+2upoY)4o0L^C2tP5e5wUaSs|n_m+FLCXP5KiTO^=Qz?8Z=;6RHiv@mpIy z%`Rp);%&xNQ+7u1Y#{^02o0pk%Sd}5Q_}n(|FZea@f^&5IpVdc}gYtmD;~N z1-q%|f2e)an=%k5ktJ+Ef?8Mw>{~@TKU7Q~*wiNZMg#Eqa6*mGUCxP7XVdg)cRH=A zv^;p&D~IE;fY{WNdu2b?tD5_tRgKj@szxRV$?9? z&6{LG8%w!q1prQ*OqsqcE2z@0%X^b2Y8O9WTHi6@C+a}Ak^newye0AE} zqetZYb~x_GrVGPAc^mTM7kOm>RinW)`OeHcdvoK@;F!z(RwQ_z73}rsJerk@2So`U zylg0ze+0`yT3yRnB%{( zGfZzN7?mJLzd`rR=ldEVse8Mp;CMDy=vQhMiV5ZX$-Fm!Bkz^{hScV+zX1`m*c(zA zt)Xv`qSkv~w-tY>Z;fHPeV3FXPWl*}+r}YqDmZvKwmea>X4&9W*u$0nYCg;he~d#M86=e@0bj%%_kwB7@&FLOW-FNQlJ5*zq}IBLp0O_{wMbUOA=Ami>e z3KDE3Jr%`*gek8x_0F(G&FV3usa7VlvwuDxqDwaVBzv3e9b zvGJ3|6q@y6>4@u5Uq}r5tBu&7MBry3m1F{ATm8*(;S$~Z-q?^_!8dXY`+}Op7X21K zP-RNmv?}y1h$8{vW!q|4o>=42RLW&2|dYna7}KzB78ytU1W7 zMoejIb_Gl1;+NkJi#ZQt6%*)DaIK%K4e*5W%2-^5kod~;{up|SjQTy3EZX~qSjJ*# zhkxQn3UW_ew&T&WIV{ZR_N>o|TT8>)@qVDm-+f0E=guw|RMWnl z7+Z&s##emRb^+-eb)paeSRlK(MTC9$bNQ55#rBa zhPR`-4DDSLppIA{;$435*yLY!{2aeF$ZN-iQi~{;k4A|z&zf4cV_<(8<|9jlj^x9n&<~69Z%>y$9DbY(oC=l3p4o_Cl_nD8lM+e1jWS>-%_* zeeAvh>+;b&i<5>j3PG)0=l2!|9qa%%dmeM)t-|SCn_Xbb>^spCAGRtysR)c5x`l(~ zz`GIR-+eo036`9jD_(x)8_xdtdyjqSp~I?{qX`mkZL?NhMjTh!;wHI+Ovm3(yn!0r z{UB^k{lP8@wjXc&N>ULts_A0m1$<`9(QkZ2(|d}m0k%KNb1_dWPm83FKDL;9Mfwc1 zPMNkjIg1LyUnxrPj5$0C+Yo$0-F%GeOnuoiKJCO!%D`uI4^*bu0Bt{Wt}3rcXsU+{ zv5x8g6NQMLj>B^*#EB3mDFF!Q0a@Y$zX3|WQ zSA5GFb&|b>){zeqJMeH;GK<+JlqMH^|$N@-xi#r2V~QBDbl*2}%v;w;%1$H9}rruNJ=q*!=rGa{Fa% zA?=owGSxer={PVG|2Qh7!toqWotsD;T3<=Vp7g_8aT@3Cq?Fka%tdS3Rp2QVze`5T z3@H(BAStZeP!3oKF+-G$$T3KN_98IZM;5cwZx%P&%Ehf{Y!B~fCMpA+QH z1zZ`4Q{Tg?qsC;^3f@Nx1w>T>=`V0c zxhj02U=6EHxo>7Ev%Q-bEw5|_%hq&x#fH72ZBA@gxYxmm9%Jv(+mbw@ezY}r&sCN; z#ZPU9g({&9xIdRcjx<7oS*C9W32xAnlh1@k#pyP17JAI9xsqfA!AGC)%)Slo?9{%6R4@oD&TOwfDfpGW8UX!WXy&V z`{#&b+3fXjwl^D(U)CCyxS?FRc=$^!#a|`%F8pp~pjB>Zg+jas(B#)P>c&0P1lT## z9{ov`UDykua&@sa8sM8#uM}SKT?&o^!nDTr4YqNWa?f7-iw*fT`_^|!eCahy@h8qR z1RO^f$k6I$k{NngDRDyTk7agIoG}l-F>R3n>*^7N7jvw87G%gp68%P*D8I zbos>5;ngpT*Vh*A?;fF3%s3!07wMo?yQUP9X8o!g6E@`h}^MYIoLb5dE-5 zH#=OzmzZ=u*^KL%lD39zZ00!a0^5AEwCPPNnB)@IL|Ums9bIxxb^ zQIQ@EX-g~?_2S<<2}~FM*#7=|=^8u7maw~(yptP{zTZtvfQb-(J}|vw8pPO$E~xOAScbc{b z{338IDZqtlMZ1*tiW5r7yH;AnNWXJpp*a!trS+0Yf`)H= zjFtoh+^~)yN7DPv6mO)M2;}rbF7$nzR({)yie-6=QsXmhk@FG}NWi8IGnfkY*; z$=rvTmXB3ov$>q`E-alIM*MH&`_nxYZo<&#HCkCJ*ETy}isqJ`tMdG^zyJw1gesLT z$ZwFV2ygBVyIL%9gJcJUB~D4EOCcc=X_p5oO!0hG$pWF9!6C<Muw?H3uTMUg~l-8Li9|1)SO>1n=s_RZtjX$@iQ|Wu*ZFY}yDN#(O0pd?l-p%r ze(^Z;>_gzx^hHscUdQQ&%$tIbHcsY`W$5@;G{<9AZ}*XB#rp=B6S*9CX+k8hHZD*C zw+1_IgroYt-1<$X$UIqALF#MoVlMhI{Bwv`;)y3*i!a2jGlwqM#P>{J!_FoqbX}Ba z?5$RNcVmvg&5`sZSMaVWD-ZA|_Z?A1Jk=Zq#2(pjt)Y`iauQq# zLpdEN**eXV+mCL9BM5RP`%s!M_Y(nTa<=1F_rY)5RAX^SnaqF@VsU6^8=0AQ@V349 zT#iCaxoIW~al++Fi9ph!&4bIpH*ROxHK{{g#Xv!ud}7hhE8n{Ngf`gk1ioz5*odJf z%a}{kE*s?>Y)x<-XimCOI+`sFaHo1|VI-o!`oj73@bKc3U0$=s04YM(2R(?<<+Mg< zm~+a2{-mU7c^#f!M{HjKq6>$RNM?8mRL3X}#9hIwbGjw>hv#t+!B|$E`LmHE%ku=` z(0P~8Oh-kNCFQ6}D}09|Gyy?^QPUd`pT12Cow5xk#%rj`PNa>%xE=Rigqi*vN$7b< z;g3>y-MB;{+N8>O)lA}ty)L($@L92{Y$j{Tre1ICqxWN9S#+YU5$6=(E@VpQbQzkO z?uYK-K(}hgV8KLxnXp?|o#-Ixq3-JLR`|-@S1SDSWG7SjO;4a#=}rgVzD>}#CTQ?=@)7gw zOr8c0XsFw2sRsI9X%RD&MhKT6VX4?a?(y82MUM)q1deFJsXef0hmo`OT>B#>%DaKX zjMr=x5zlS77euU;-yq5Lwc5qC#ffy3uVu~1P{lJ~h7)gziCJijjh`KU3>XLb`*_rI zY=2sgx3qUP=k8H}Homc)C-75%c`V_bGOM4@YB4A5MzL76nl60+;7_%Pcu%bBUJ*h#IoF_mV8Cq?s44UX8?Jt`e_KSF zx%p(oV|Wg_hAix^b}!1*7`Tlo6v|MsXKAU-a*=x*%!F>9O{Bt}E~Hx?JXrVq0DVk# zFc|7SzKz3^n z)(F>}atG{dn{?pjmEwdo%?_fmIJ^i8Y^2gf7XlPGA@*$4hD}_lO-tyF^gzZ|m)ZvA*&p=G^Zyk2QET>bfx+igTWz~~yO37d6NVl{;+HFoUnJL@&~M zA9AJzTy4&)l^ z0-q|@jobZav(1}h7QHG)_9=SKF~gDs<@b`ES(CXma=TlY7@M<&*+%`+ z>yzzvEY58+{0&ca5F@kqe96a>EswKIl ztCd<1PpvhHL_C*IiaD=uL;%M|)ZK2;Y?hginOv!|un%8R3(<(g?F!?5IICl4YPDVG zh?kPjO~d%3Y1V`0YA3IA3mW>BXCh&ZXZtCBp_FG4bL!F6I_Nl2Chd1*L(Xf)Jv5Wv zn-J&)Zj2HB0Sk>A`s--Dy1OYZU4xPLsDpH7P<6m;0_I3bR1M=|-ocBw1i^iwy@6Eb z1wWVe;n}w&83)5S;UJz7Y$20^bqw)vN%8uB6I)712yYYA^ zL7xb14ti5?k)PavPehd7j?-y)}IyvGM!OxApn!Sunk8| z{J1GJ=n-(b?p@k7$B%FHhsNzusVUL}-OUn8z>0La~irHh_F~|T?dqYQnwEICLx!vzJ737MT!ww z*iQSxsfgAe)r(}g599odxT|X^?GsM$-Sp|$>4tx{cH6#Bpp5k#YI;{8=UGk$+sHoP z?2W;T+Kty%5|^x9JvYB2zz1XOsCajXwnJbvW-@*^QbL;2-eIwonV#uwr_d{_{x16m zr0X7pap*guvOqOL<9!By;aOfc)I!4WjI9N&ANX=#K7F(bLD=OQcNsQb?Q;|}z{JH@ zsKhYc9Q-$YMW%&>>5g(^su8iJR8e%|`pC~76kjod$;KMPNeBqrC?rqRD>I#0{pBK*rSZ@tiIgLLXtL-{@~T8Q z9#;&12Nye$S@MFJ;-EK5_PR#1&Wka`B_%KgwI#gt%R1;}zlwf`h zwwee3khEWiJlJeDu4}mJn81Au;wzG=n%bM6>- z>ruFQX3uAJ6ZDu9v}#5AWekvW=8JD^?fM~(V`PiU1MdF?m_P{cS7z4{_Qd1cv6vvV zj4-AIxmrbsANudw{)U%=Jdus}eTxm%o5>z)e9Q4KqI}PZ&b#pb{7K}X(mOL;P&{X* zKF1g42H;}o3#Y$tKlYFJg*9v!>ap)42sbJUd|}=RX8qe)E7$m5H<-8SpH~mzI}vuL zubHoQpt_IA{lQ&g`+!FCN(YO3J~iGx(4amlrGf IZ0P%c08QS;I{*Lx literal 0 HcmV?d00001 diff --git a/doc/man/Makefile.am b/doc/man/Makefile.am new file mode 100644 index 000000000..27917a208 --- /dev/null +++ b/doc/man/Makefile.am @@ -0,0 +1 @@ +dist_man1_MANS=zcashd.1 zcash-cli.1 zcash-fetch-params.1 zcash-tx.1 diff --git a/doc/man/zcash-cli.1 b/doc/man/zcash-cli.1 new file mode 100644 index 000000000..c3ebe264b --- /dev/null +++ b/doc/man/zcash-cli.1 @@ -0,0 +1,89 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.1. +.TH ZCASH-CLI "1" "June 2023" "zcash-cli v5.6.1" "User Commands" +.SH NAME +zcash-cli \- manual page for zcash-cli v5.6.1 +.SH DESCRIPTION +Zcash RPC client version v5.6.1 +.PP +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . +.SS "Usage:" +.TP +zcash\-cli [options] [params] +Send command to Zcash +.TP +zcash\-cli [options] help +List commands +.TP +zcash\-cli [options] help +Get help for a command +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-conf=\fR +.IP +Specify configuration file. Relative paths will be prefixed by datadir +location. (default: zcash.conf) +.HP +\fB\-datadir=\fR +.IP +Specify data directory (this path cannot use '~') +.HP +\fB\-stdin\fR +.IP +Read extra arguments from standard input, one per line until EOF/Ctrl\-D +(recommended for sensitive information such as passphrases). If first +extra argument is `walletpassphrase` then the first line(password) will +not be echoed. +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-regtest\fR +.IP +Enter regression test mode, which uses a special chain in which blocks +can be solved instantly. This is intended for regression testing tools +and app development. +.HP +\fB\-rpcconnect=\fR +.IP +Send commands to node running on (default: 127.0.0.1) +.HP +\fB\-rpcport=\fR +.IP +Connect to JSON\-RPC on (default: 8232 or testnet: 18232) +.HP +\fB\-rpcwait\fR +.IP +Wait for RPC server to start +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcclienttimeout=\fR +.IP +Timeout in seconds during HTTP requests, or 0 for no timeout. (default: +900) +.SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + +Copyright (C) 2009-2023 The Bitcoin Core Developers +Copyright (C) 2015-2023 The Zcash Developers + +This is experimental software. + +Distributed under the MIT software license, see the accompanying file COPYING +or . diff --git a/doc/man/zcash-fetch-params.1 b/doc/man/zcash-fetch-params.1 new file mode 100644 index 000000000..76dab4c23 --- /dev/null +++ b/doc/man/zcash-fetch-params.1 @@ -0,0 +1,28 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.47.3. +.TH ZCASH-FETCH-PARAMS "1" "January 2017" "Zcash - zcash-fetch-params" "User Commands" +.SH NAME +zcash-fetch-params \- Downloads the Zcash network parameters +.SH DESCRIPTION +Zcash \- zcash-fetch\-params +.PP +This script will fetch the Zcash zkSNARK parameters and verify their +integrity with sha256sum. +.PP +If they already exist locally, it will exit now and do nothing else. +.PP +This script will fetch the Zcash zkSNARK parameters and verify their +integrity with sha256sum. +.PP +If they already exist locally, it will exit now and do nothing else. +.SH "SEE ALSO" +The full documentation for +.B Zcash +is maintained as a Texinfo manual. If the +.B info +and +.B Zcash +programs are properly installed at your site, the command +.IP +.B info Zcash +.PP +should give you access to the complete manual. diff --git a/doc/man/zcash-tx.1 b/doc/man/zcash-tx.1 new file mode 100644 index 000000000..fe8109bc9 --- /dev/null +++ b/doc/man/zcash-tx.1 @@ -0,0 +1,100 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.1. +.TH ZCASH-TX "1" "June 2023" "zcash-tx v5.6.1" "User Commands" +.SH NAME +zcash-tx \- manual page for zcash-tx v5.6.1 +.SH DESCRIPTION +Zcash zcash\-tx utility version v5.6.1 +.SS "Usage:" +.TP +zcash\-tx [options] [commands] +Update hex\-encoded zcash transaction +.TP +zcash\-tx [options] \fB\-create\fR [commands] +Create hex\-encoded zcash transaction +.SH OPTIONS +.HP +\-? +.IP +This help message +.HP +\fB\-create\fR +.IP +Create new, empty TX. +.HP +\fB\-json\fR +.IP +Select JSON output +.HP +\fB\-txid\fR +.IP +Output only the hex\-encoded transaction id of the resultant transaction. +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.HP +\fB\-regtest\fR +.IP +Enter regression test mode, which uses a special chain in which blocks +can be solved instantly. This is intended for regression testing tools +and app development. +.PP +Commands: +.IP +delin=N +.IP +Delete input N from TX +.IP +delout=N +.IP +Delete output N from TX +.IP +in=TXID:VOUT(:SEQUENCE_NUMBER) +.IP +Add input to TX +.IP +locktime=N +.IP +Set TX lock time to N +.IP +nversion=N +.IP +Set TX version to N +.IP +outaddr=VALUE:ADDRESS +.IP +Add address\-based output to TX +.IP +outscript=VALUE:SCRIPT +.IP +Add raw script output to TX +.IP +sign=HEIGHT:SIGHASH\-FLAGS +.IP +Add zero or more signatures to transaction. This command requires JSON +registers:prevtxs=JSON object, privatekeys=JSON object. See +signrawtransaction docs for format of sighash flags, JSON objects. +.PP +Register Commands: +.IP +load=NAME:FILENAME +.IP +Load JSON file FILENAME into register NAME +.IP +set=NAME:JSON\-STRING +.IP +Set register NAME to given JSON\-STRING +.SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + +Copyright (C) 2009-2023 The Bitcoin Core Developers +Copyright (C) 2015-2023 The Zcash Developers + +This is experimental software. + +Distributed under the MIT software license, see the accompanying file COPYING +or . diff --git a/doc/man/zcashd-wallet-tool.1 b/doc/man/zcashd-wallet-tool.1 new file mode 100644 index 000000000..0cb26eb47 --- /dev/null +++ b/doc/man/zcashd-wallet-tool.1 @@ -0,0 +1,53 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.1. +.TH ZCASHD-WALLET-TOOL "1" "June 2023" "zcashd-wallet-tool v5.6.1" "User Commands" +.SH NAME +zcashd-wallet-tool \- manual page for zcashd-wallet-tool v5.6.1 +.SH SYNOPSIS +.B zcashd-wallet-tool +[\fI\,OPTIONS\/\fR] +.SH DESCRIPTION +.SS "Optional arguments:" +.TP +\fB\-\-help\fR +Print this help output +.TP +\fB\-\-conf\fR FILENAME +Specify configuration filename, relative to the data directory (default: zcash.conf) +.TP +\fB\-\-datadir\fR PATH +Specify data directory (this path cannot use '~') +.TP +\fB\-\-testnet\fR +Use the test chain +.TP +\fB\-\-rpcconnect\fR IPADDR +Send commands to node running on IPADDR (default: 127.0.0.1) +.TP +\fB\-\-rpcport\fR PORT +Connect to JSON\-RPC on PORT (default: 8232 or testnet: 18232) +.TP +\fB\-\-rpcuser\fR USERNAME +Username for JSON\-RPC connections +.TP +\fB\-\-rpcpassword\fR PASSWORD +Password for JSON\-RPC connections +.TP +\fB\-\-rpcclienttimeout\fR SECONDS +Timeout in seconds during HTTP requests, or 0 for no timeout. (default: 900) +.PP +Options can be given in GNU style (`\-\-conf=CONF` or `\-\-conf CONF`), +or in Bitcoin style with a single hyphen (`\-conf=CONF`). +.PP +The environment variable RUST_LOG controls debug output, e.g. +`RUST_LOG=debug`. +.SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + +Copyright (C) 2015-2023 The Zcash Developers + +This is experimental software. + +Distributed under the MIT software license, see the accompanying file COPYING +or . diff --git a/doc/man/zcashd.1 b/doc/man/zcashd.1 new file mode 100644 index 000000000..2ce7aa480 --- /dev/null +++ b/doc/man/zcashd.1 @@ -0,0 +1,609 @@ +.\" DO NOT MODIFY THIS FILE! It was generated by help2man 1.49.1. +.TH ZCASHD "1" "June 2023" "zcashd v5.6.1" "User Commands" +.SH NAME +zcashd \- manual page for zcashd v5.6.1 +.SH DESCRIPTION +Zcash Daemon version v5.6.1 +.PP +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . +.SS "Usage:" +.TP +zcashd [options] +Start Zcash Daemon +.SH OPTIONS +.HP +\-? +.IP +Print this help message and exit +.HP +\fB\-version\fR +.IP +Print version and exit +.HP +\fB\-alerts\fR +.IP +Receive and display P2P network alerts (default: 1) +.HP +\fB\-alertnotify=\fR +.IP +Execute command when a relevant alert is received or we see a really +long fork (%s in cmd is replaced by message) +.HP +\fB\-allowdeprecated=\fR +.IP +Explicitly allow the use of the specified deprecated feature. Multiple +instances of this parameter are permitted; values for must be +selected from among {"none", "deprecationinfo_deprecationheight", +"gbt_oldhashes", "z_getbalance", "z_gettotalbalance", "addrtype", +"getnewaddress", "getrawchangeaddress", "legacy_privacy", +"wallettxvjoinsplit", "z_getnewaddress", "z_listaddresses"} +.HP +\fB\-blocknotify=\fR +.IP +Execute command when the best block changes (%s in cmd is replaced by +block hash) +.HP +\fB\-checkblocks=\fR +.IP +How many blocks to check at startup (default: 288, 0 = all) +.HP +\fB\-checklevel=\fR +.IP +How thorough the block verification of \fB\-checkblocks\fR is (0\-4, default: 3) +.HP +\fB\-conf=\fR +.IP +Specify configuration file. Relative paths will be prefixed by datadir +location. (default: zcash.conf) +.HP +\fB\-daemon\fR +.IP +Run in the background as a daemon and accept commands +.HP +\fB\-datadir=\fR +.IP +Specify data directory (this path cannot use '~') +.HP +\fB\-paramsdir=\fR +.IP +Specify Zcash network parameters directory +.HP +\fB\-dbcache=\fR +.IP +Set database cache size in megabytes (4 to 16384, default: 450) +.HP +\fB\-debuglogfile=\fR +.IP +Specify location of debug log file. Relative paths will be prefixed by a +net\-specific datadir location. (default: debug.log) +.HP +\fB\-exportdir=\fR +.IP +Specify directory to be used when exporting data +.HP +\fB\-ibdskiptxverification\fR +.IP +Skip transaction verification during initial block download up to the +last checkpoint height. Incompatible with flags that disable +checkpoints. (default = 0) +.HP +\fB\-loadblock=\fR +.IP +Imports blocks from external blk000??.dat file on startup +.HP +\fB\-maxorphantx=\fR +.IP +Keep at most unconnectable transactions in memory (default: 100) +.HP +\fB\-par=\fR +.IP +Set the number of script verification threads (\fB\-16\fR to 16, 0 = auto, <0 = +leave that many cores free, default: 0) +.HP +\fB\-pid=\fR +.IP +Specify pid file. Relative paths will be prefixed by a net\-specific +datadir location. (default: zcashd.pid) +.HP +\fB\-prune=\fR +.IP +Reduce storage requirements by pruning (deleting) old blocks. This mode +disables wallet support and is incompatible with \fB\-txindex\fR. Warning: +Reverting this setting requires re\-downloading the entire blockchain. +(default: 0 = disable pruning blocks, >550 = target size in MiB to use +for block files) +.HP +\fB\-reindex\-chainstate\fR +.IP +Rebuild chain state from the currently indexed blocks (implies \fB\-rescan\fR) +.HP +\fB\-reindex\fR +.IP +Rebuild chain state and block index from the blk*.dat files on disk +(implies \fB\-rescan\fR) +.HP +\fB\-sysperms\fR +.IP +Create new files with system default permissions, instead of umask 077 +(only effective with disabled wallet functionality) +.HP +\fB\-txexpirynotify=\fR +.IP +Execute command when transaction expires (%s in cmd is replaced by +transaction id) +.HP +\fB\-txindex\fR +.IP +Maintain a full transaction index, used by the getrawtransaction rpc +call (default: 0) +.PP +Connection options: +.HP +\fB\-addnode=\fR +.IP +Add a node to connect to and attempt to keep the connection open +.HP +\fB\-banscore=\fR +.IP +Threshold for disconnecting misbehaving peers (default: 100) +.HP +\fB\-bantime=\fR +.IP +Number of seconds to keep misbehaving peers from reconnecting (default: +86400) +.HP +\fB\-bind=\fR +.IP +Bind to given address and always listen on it. Use [host]:port notation +for IPv6 +.HP +\fB\-connect=\fR +.IP +Connect only to the specified node(s); \fB\-noconnect\fR or \fB\-connect\fR=\fI\,0\/\fR alone to +disable automatic connections +.HP +\fB\-discover\fR +.IP +Discover own IP addresses (default: 1 when listening and no \fB\-externalip\fR +or \fB\-proxy\fR) +.HP +\fB\-dns\fR +.IP +Allow DNS lookups for \fB\-addnode\fR, \fB\-seednode\fR and \fB\-connect\fR (default: 1) +.HP +\fB\-dnsseed\fR +.IP +Query for peer addresses via DNS lookup, if low on addresses (default: 1 +unless \fB\-connect\fR/\-noconnect) +.HP +\fB\-externalip=\fR +.IP +Specify your own public address +.HP +\fB\-forcednsseed\fR +.IP +Always query for peer addresses via DNS lookup (default: 0) +.HP +\fB\-listen\fR +.IP +Accept connections from outside (default: 1 if no \fB\-proxy\fR or +\fB\-connect\fR/\-noconnect) +.HP +\fB\-listenonion\fR +.IP +Automatically create Tor hidden service (default: 1) +.HP +\fB\-maxconnections=\fR +.IP +Maintain at most connections to peers (default: 125) +.HP +\fB\-maxreceivebuffer=\fR +.IP +Maximum per\-connection receive buffer, *1000 bytes (default: 5000) +.HP +\fB\-maxsendbuffer=\fR +.IP +Maximum per\-connection send buffer, *1000 bytes (default: 1000) +.HP +\fB\-mempoolevictionmemoryminutes=\fR +.IP +The number of minutes before allowing rejected transactions to re\-enter +the mempool. (default: 60) +.HP +\fB\-mempooltxcostlimit=\fR +.IP +An upper bound on the maximum size in bytes of all transactions in the +mempool. (default: 80000000) +.HP +\fB\-onion=\fR +.IP +Use separate SOCKS5 proxy to reach peers via Tor hidden services +(default: \fB\-proxy\fR) +.HP +\fB\-onlynet=\fR +.IP +Only connect to nodes in network (ipv4, ipv6 or onion) +.HP +\fB\-permitbaremultisig\fR +.IP +Relay non\-P2SH multisig (default: 1) +.HP +\fB\-peerbloomfilters\fR +.IP +Support filtering of blocks and transaction with bloom filters (default: +1) +.HP +\fB\-port=\fR +.IP +Listen for connections on (default: 8233 or testnet: 18233) +.HP +\fB\-proxy=\fR +.IP +Connect through SOCKS5 proxy +.HP +\fB\-proxyrandomize\fR +.IP +Randomize credentials for every proxy connection. This enables Tor +stream isolation (default: 1) +.HP +\fB\-seednode=\fR +.IP +Connect to a node to retrieve peer addresses, and disconnect +.HP +\fB\-timeout=\fR +.IP +Specify connection timeout in milliseconds (minimum: 1, default: 5000) +.HP +\fB\-torcontrol=\fR: +.IP +Tor control port to use if onion listening enabled (default: +127.0.0.1:9051) +.HP +\fB\-torpassword=\fR +.IP +Tor control port password (default: empty) +.HP +\fB\-whitebind=\fR +.IP +Bind to given address and whitelist peers connecting to it. Use +[host]:port notation for IPv6 +.HP +\fB\-whitelist=\fR +.IP +Whitelist peers connecting from the given netmask or IP address. Can be +specified multiple times. Whitelisted peers cannot be DoS banned and +their transactions are always relayed, even if they are already in the +mempool, useful e.g. for a gateway +.HP +\fB\-whitelistrelay\fR +.IP +Accept relayed transactions received from whitelisted inbound peers even +when not relaying transactions (default: 1) +.HP +\fB\-whitelistforcerelay\fR +.IP +Force relay of transactions from whitelisted inbound peers even they +violate local relay policy (default: 1) +.HP +\fB\-maxuploadtarget=\fR +.IP +Tries to keep outbound traffic under the given target (in MiB per 24h), +0 = no limit (default: 0) +.PP +Wallet options: +.HP +\fB\-disablewallet\fR +.IP +Do not load the wallet and disable wallet RPC calls +.HP +\fB\-keypool=\fR +.IP +Set key pool size to (default: 100) +.HP +\fB\-migration\fR +.IP +Enable the Sprout to Sapling migration +.HP +\fB\-migrationdestaddress=\fR +.IP +Set the Sapling migration address +.HP +\fB\-orchardactionlimit=\fR +.IP +Set the maximum number of Orchard actions permitted in a transaction +(default 50) +.HP +\fB\-paytxfee=\fR +.IP +The preferred fee rate (in ZEC per 1000 bytes) used for transactions +created by legacy APIs (sendtoaddress, sendmany, and +fundrawtransaction). If the transaction is less than 1000 bytes then the +fee rate is applied as though it were 1000 bytes. When this option is +not set, the ZIP 317 fee calculation is used. +.HP +\fB\-rescan\fR +.IP +Rescan the block chain for missing wallet transactions on startup +.HP +\fB\-salvagewallet\fR +.IP +Attempt to recover private keys from a corrupt wallet on startup +(implies \fB\-rescan\fR) +.HP +\fB\-spendzeroconfchange\fR +.IP +Spend unconfirmed change when sending transactions (default: 1) +.HP +\fB\-txexpirydelta\fR +.IP +Set the number of blocks after which a transaction that has not been +mined will become invalid (min: 4, default: 20 (pre\-Blossom) or 40 +(post\-Blossom)) +.HP +\fB\-upgradewallet\fR +.IP +Upgrade wallet to latest format on startup +.HP +\fB\-wallet=\fR +.IP +Specify wallet file absolute path or a path relative to the data +directory (default: wallet.dat) +.HP +\fB\-walletbroadcast\fR +.IP +Make the wallet broadcast transactions (default: 1) +.HP +\fB\-walletnotify=\fR +.IP +Execute command when a wallet transaction changes (%s in cmd is replaced +by TxID) +.HP +\fB\-zapwallettxes=\fR +.IP +Delete all wallet transactions and only recover those parts of the +blockchain through \fB\-rescan\fR on startup (1 = keep tx meta data e.g. +account owner and payment request information, 2 = drop tx meta data) +.HP +\fB\-walletrequirebackup=\fR +.IP +By default, the wallet will not allow generation of new spending keys & +addresses from the mnemonic seed until the backup of that seed has been +confirmed with the `zcashd\-wallet\-tool` utility. A user may start zcashd +with `\-walletrequirebackup=false` to allow generation of spending keys +even if the backup has not yet been confirmed. +.PP +ZeroMQ notification options: +.HP +\fB\-zmqpubhashblock=\fR
+.IP +Enable publish hash block in
+.HP +\fB\-zmqpubhashtx=\fR
+.IP +Enable publish hash transaction in
+.HP +\fB\-zmqpubrawblock=\fR
+.IP +Enable publish raw block in
+.HP +\fB\-zmqpubrawtx=\fR
+.IP +Enable publish raw transaction in
+.PP +Monitoring options: +.HP +\fB\-metricsallowip=\fR +.IP +Allow metrics connections from specified source. Valid for are a +single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) +or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified +multiple times. (default: only localhost) +.HP +\fB\-metricsbind=\fR +.IP +Bind to given address to listen for metrics connections. (default: bind +to all interfaces) +.HP +\fB\-prometheusport=\fR +.IP +Expose node metrics in the Prometheus exposition format. An HTTP +listener will be started on , which responds to GET requests on +any request path. Use \fB\-metricsallowip\fR and \fB\-metricsbind\fR to control +access. +.HP +\fB\-debugmetrics\fR +.IP +Include debug metrics in exposed node metrics. +.PP +Debugging/Testing options: +.HP +\fB\-uacomment=\fR +.IP +Append comment to the user agent string +.HP +\fB\-debug=\fR +.IP +Output debugging information (default: 0, supplying is +optional). If is not supplied or if = 1, output +all debugging information. can be: addrman, alert, bench, +coindb, db, http, libevent, lock, mempool, mempoolrej, net, +partitioncheck, pow, proxy, prune, rand, receiveunsafe, reindex, rpc, +selectcoins, tor, zmq, zrpc, zrpcunsafe (implies zrpc). For multiple +specific categories use \fB\-debug=\fR multiple times. +.HP +\fB\-experimentalfeatures\fR +.IP +Enable use of experimental features +.HP +\fB\-help\-debug\fR +.IP +Show all debugging options (usage: \fB\-\-help\fR \fB\-help\-debug\fR) +.HP +\fB\-logips\fR +.IP +Include IP addresses in debug output (default: 0) +.HP +\fB\-logtimestamps\fR +.IP +Prepend debug output with timestamp (default: 1) +.HP +\fB\-minrelaytxfee=\fR +.IP +Transactions must have at least this fee rate (in ZEC per 1000 bytes) +for relaying, mining and transaction creation (default: 0.000001). This +is not the only fee constraint. +.HP +\fB\-maxtxfee=\fR +.IP +Maximum total fees (in ZEC) to use in a single wallet transaction or raw +transaction; setting this too low may abort large transactions (default: +0.10) +.HP +\fB\-printtoconsole\fR +.IP +Send trace/debug info to console instead of the debug log +.PP +Chain selection options: +.HP +\fB\-testnet\fR +.IP +Use the test chain +.PP +Node relay options: +.HP +\fB\-datacarrier\fR +.IP +Relay and mine data carrier transactions (default: 1) +.HP +\fB\-datacarriersize=\fR +.IP +Maximum size of data in data carrier transactions we relay and mine +(default: 83) +.HP +\fB\-txunpaidactionlimit=\fR +.IP +Transactions with more than this number of unpaid actions will not be +accepted to the mempool or relayed (default: 50) +.PP +Block creation options: +.HP +\fB\-blockmaxsize=\fR +.IP +Set maximum block size in bytes (default: 2000000) +.HP +\fB\-blockunpaidactionlimit=\fR +.IP +Set the limit on unpaid actions that will be accepted in a block for +transactions paying less than the ZIP 317 fee (default: 50) +.PP +Mining options: +.HP +\fB\-gen\fR +.IP +Generate coins (default: 0) +.HP +\fB\-genproclimit=\fR +.IP +Set the number of threads for coin generation if enabled (\fB\-1\fR = all +cores, default: 1) +.HP +\fB\-equihashsolver=\fR +.IP +Specify the Equihash solver to be used if enabled (default: "default") +.HP +\fB\-mineraddress=\fR +.IP +Send mined coins to a specific single address +.HP +\fB\-minetolocalwallet\fR +.IP +Require that mined blocks use a coinbase address in the local wallet +(default: 1) +.PP +RPC server options: +.HP +\fB\-server\fR +.IP +Accept command line and JSON\-RPC commands +.HP +\fB\-rest\fR +.IP +Accept public REST requests (default: 0) +.HP +\fB\-rpcbind=\fR +.IP +Bind to given address to listen for JSON\-RPC connections. Use +[host]:port notation for IPv6. This option can be specified multiple +times (default: bind to all interfaces) +.HP +\fB\-rpccookiefile=\fR +.IP +Location of the auth cookie. Relative paths will be prefixed by a +net\-specific datadir location. (default: data dir) +.HP +\fB\-rpcuser=\fR +.IP +Username for JSON\-RPC connections +.HP +\fB\-rpcpassword=\fR +.IP +Password for JSON\-RPC connections +.HP +\fB\-rpcauth=\fR +.IP +Username and hashed password for JSON\-RPC connections. The field + comes in the format: :$. A canonical +python script is included in share/rpcuser. This option can be specified +multiple times +.HP +\fB\-rpcport=\fR +.IP +Listen for JSON\-RPC connections on (default: 8232 or testnet: +18232) +.HP +\fB\-rpcallowip=\fR +.IP +Allow JSON\-RPC connections from specified source. Valid for are a +single IP (e.g. 1.2.3.4), a network/netmask (e.g. 1.2.3.4/255.255.255.0) +or a network/CIDR (e.g. 1.2.3.4/24). This option can be specified +multiple times +.HP +\fB\-rpcthreads=\fR +.IP +Set the number of threads to service RPC calls (default: 4) +.PP +Metrics Options (only if \fB\-daemon\fR and \fB\-printtoconsole\fR are not set): +.HP +\fB\-showmetrics\fR +.IP +Show metrics on stdout (default: 1 if running in a console, 0 otherwise) +.HP +\fB\-metricsui\fR +.IP +Set to 1 for a persistent metrics screen, 0 for sequential metrics +output (default: 1 if running in a console, 0 otherwise) +.HP +\fB\-metricsrefreshtime\fR +.IP +Number of seconds between metrics refreshes (default: 1 if running in a +console, 600 otherwise) +.PP +Compatibility options: +.HP +\fB\-preferredtxversion\fR +.IP +Preferentially create transactions having the specified version when +possible (default: 4) +.SH COPYRIGHT + +In order to ensure you are adequately protecting your privacy when using Zcash, +please see . + +Copyright (C) 2009-2023 The Bitcoin Core Developers +Copyright (C) 2015-2023 The Zcash Developers + +This is experimental software. + +Distributed under the MIT software license, see the accompanying file COPYING +or . diff --git a/doc/payment-api.md b/doc/payment-api.md new file mode 100644 index 000000000..9ae6c57c9 --- /dev/null +++ b/doc/payment-api.md @@ -0,0 +1,179 @@ +# Zcash Payment API + +## Overview + +Zcash extends the Bitcoin Core API with new RPC calls to support private Zcash payments. + +Zcash payments make use of two address formats: + +* taddr - an address for transparent funds (just like a Bitcoin address, value stored in UTXOs) +* zaddr - an address for private funds (value stored in objects called notes) + +When transferring funds from one taddr to another taddr, you can use either the existing Bitcoin RPC calls or the new Zcash RPC calls. + +When a transfer involves zaddrs, you must use the new Zcash RPC calls. + + +## Compatibility with Bitcoin Core + +Zcash supports all commands in the Bitcoin Core API (as of version 0.11.2). Where applicable, Zcash will extend commands in a backwards-compatible way to enable additional functionality. + +We do not recommend use of accounts which are now deprecated in Bitcoin Core. Where the account parameter exists in the API, please use “” as its value, otherwise an error will be returned. + +To support multiple users in a single node’s wallet, consider using getnewaddress or z_getnewaddress to obtain a new address for each user. Also consider mapping multiple addresses to each user. + +## List of Zcash API commands + +Optional parameters are denoted in [square brackets]. + +RPC calls by category: + +* Accounting: z_getbalance, z_gettotalbalance +* Addresses : z_getnewaddress, z_listaddresses, z_validateaddress, z_exportviewingkey, z_importviewingkey +* Keys : z_exportkey, z_importkey, z_exportwallet, z_importwallet +* Operation: z_getoperationresult, z_getoperationstatus, z_listoperationids +* Payment : z_listreceivedbyaddress, z_listunspent, z_sendmany, z_shieldcoinbase + +RPC parameter conventions: + +* taddr : Transparent address +* zaddr : Private address +* address : Accepts both private and transparent addresses. +* amount : JSON format decimal number with at most 8 digits of precision, with 1 ZEC expressed as 1.00000000. +* memo : Metadata expressed in hexadecimal format. Limited to 512 bytes, the current size of the memo field of a private transaction. Zero padding is automatic. + +### Accounting + +Command | Parameters | Description +--- | --- | --- +z_getbalance
| address [minconf=1] | Returns the balance of a taddr or zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations a private or transparent transaction must have in order to be included in the balance. Use 0 to count unconfirmed transactions. +z_gettotalbalance
| [minconf=1] | Return the total value of funds stored in the node’s wallet.

Optionally set the minimum number of confirmations a private or transparent transaction must have in order to be included in the balance. Use 0 to count unconfirmed transactions.

Output:
{
"transparent" : 1.23,
"private" : 4.56,
"total" : 5.79} + +### Addresses + +Command | Parameters | Description +--- | --- | --- +z_getnewaddress | | Return a new zaddr for sending and receiving payments. The spending key for this zaddr will be added to the node’s wallet.

Output:
zN68D8hSs3... +z_listaddresses | | Returns a list of all the zaddrs in this node’s wallet for which you have a spending key.

Output:
{ [“z123…”, “z456...”, “z789...”] } +z_validateaddress | zaddr | Return information about a given zaddr.

Output:
{"isvalid" : true,
"address" : "zcWsmq...",
"type" : "sprout",
"payingkey" : "f5bb3c...",
"transmissionkey" : "7a58c7...",
"ismine" : true} + +### Key Management + +Command | Parameters | Description +--- | --- | --- +z_exportkey | zaddr | _Requires an unlocked wallet or an unencrypted wallet._

Return a zkey for a given zaddr belonging to the node’s wallet.

The key will be returned as a string formatted using Base58Check as described in the Zcash protocol spec.

Output:AKWUAkypwQjhZ6LLNaMuuuLcmZ6gt5UFyo8m3jGutvALmwZKLdR5 +z_importkey | zkey [rescan=true] | _Wallet must be unlocked._

Add a zkey as returned by z_exportkey to a node's wallet.

The key should be formatted using Base58Check as described in the Zcash protocol spec.

Set rescan to true (the default) to rescan the entire local block database for transactions affecting any address or pubkey script in the wallet (including transactions affecting the newly-added address for this spending key). +z_exportwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._

Creates or overwrites a file with taddr private keys and zaddr private keys in a human-readable format.

Filename is the file in which the wallet dump will be placed. May be prefaced by an absolute file path. An existing file with that name will be overwritten.

No value is returned but a JSON-RPC error will be reported if a failure occurred. +z_importwallet | filename | _Requires an unlocked wallet or an unencrypted wallet._

Imports private keys from a file in wallet export file format (see z_exportwallet). These keys will be added to the keys currently in the wallet. This call may need to rescan all or parts of the block chain for transactions affecting the newly-added keys, which may take several minutes.

Filename is the file to import. The path is relative to zcashd’s working directory.

No value is returned but a JSON-RPC error will be reported if a failure occurred. +z_exportviewingkey | zaddr | Reveals the viewing key corresponding to 'zaddr'. Then the z_importviewingkey can be used with this output. +z_importviewingkey | vkey [rescan=whenkeyisnew] [startHeight=0] | Adds a viewing key (as returned by z_exportviewingkey) to your wallet. + + +### Payment + +Command | Parameters | Description +--- | --- | --- +z_listreceivedbyaddress
| zaddr [minconf=1] | Return a list of amounts received by a zaddr belonging to the node’s wallet.

Optionally set the minimum number of confirmations which a received amount must have in order to be included in the result. Use 0 to count unconfirmed transactions.

Output:
[{
“txid”: “4a0f…”,
“amount”: 0.54,
“memo”:”F0FF…”,}, {...}, {...}
] +z_listunspent | [minconf=1] [maxconf=9999999] [includeWatchonly=false] [zaddrs] | Returns array of unspent shielded notes with between minconf and maxconf (inclusive) confirmations.

Optionally filter to only include notes sent to specified addresses.

When minconf is 0, unspent notes with zero confirmations are returned, even though they are not immediately spendable.

Results are an array of Objects, each of which has: {txid, jsindex, jsoutindex, confirmations, address, amount, memo} +z_sendmany
| fromaddress amounts [minconf=1] [fee=0.0001] | _This is an Asynchronous RPC call_

Send funds from an address to multiple outputs. The address can be either a taddr or a zaddr.

Amounts is a list containing key/value pairs corresponding to the addresses and amount to pay. Each output address can be in taddr or zaddr format.

When sending to a zaddr, you also have the option of attaching a memo in hexadecimal format.

**NOTE:**When sending coinbase funds to a zaddr, the node's wallet does not allow any change. Put another way, spending a partial amount of a coinbase utxo is not allowed. This is not a consensus rule but a local wallet rule due to the current implementation of z_sendmany. In future, this rule may be removed.

Example of Outputs parameter:
[{“address”:”t123…”, “amount”:0.005},
,{“address”:”z010…”,”amount”:0.03, “memo”:”f508af…”}]

Optionally set the minimum number of confirmations which a private or transparent transaction must have in order to be used as an input. When sending from a zaddr, minconf must be greater than zero.

Optionally set a transaction fee, which by default is 0.0001 ZEC.

Any transparent change will be sent to a new transparent address. Any private change will be sent back to the zaddr being used as the source of funds.

Returns an operationid. You use the operationid value with z_getoperationstatus and z_getoperationresult to obtain the result of sending funds, which if successful, will be a txid. +z_shieldcoinbase
| fromaddress toaddress [fee=0.0001] [limit=50] | _This is an Asynchronous RPC call_

Shield transparent coinbase funds by sending to a shielded z address. Utxos selected for shielding will be locked. If there is an error, they are unlocked. The RPC call `listlockunspent` can be used to return a list of locked utxos.

The number of coinbase utxos selected for shielding can be set with the limit parameter, which has a default value of 50. If the parameter is set to 0, the number of utxos selected is limited by the `-mempooltxinputlimit` option. Any limit is constrained by a consensus rule defining a maximum transaction size of 100000 bytes.

The from address is a taddr or "*" for all taddrs belonging to the wallet. The to address is a zaddr. The default fee is 0.0001.

Returns an object containing an operationid which can be used with z_getoperationstatus and z_getoperationresult, along with key-value pairs regarding how many utxos are being shielded in this transaction and what remains to be shielded. + +### Operations + +Asynchronous calls return an OperationStatus object which is a JSON object with the following defined key-value pairs: + +* operationid : unique identifier for the async operation. Use this value with z_getoperationstatus or z_getoperationresult to poll and query the operation and obtain its result. +* status : current status of operation + * queued : operation is pending execution + * executing : operation is currently being executed + * cancelled + * failed. + * success +* result : result object if the status is ‘success’. The exact form of the result object is dependent on the call itself. +* error: error object if the status is ‘failed’. The error object has the following key-value pairs: + * code : number + * message: error message + +Depending on the type of asynchronous call, there may be other key-value pairs. For example, a z_sendmany operation will also include the following in an OperationStatus object: + +* method : name of operation e.g. z_sendmany +* params : an object containing the parameters to z_sendmany + +Currently, as soon as you retrieve the operation status for an operation which has finished, that is it has either succeeded, failed, or been cancelled, the operation and any associated information is removed. + +It is currently not possible to cancel operations. + +Command | Parameters | Description +--- | --- | --- +z_getoperationresult
| [operationids] | Return OperationStatus JSON objects for all completed operations the node is currently aware of, and then remove the operation from memory.

Operationids is an optional array to filter which operations you want to receive status objects for.

Output is a list of operation status objects, where the status is either "failed", "cancelled" or "success".
[
{“operationid”: “opid-11ee…”,
“status”: “cancelled”},
{“operationid”: “opid-9876”, “status”: ”failed”},
{“operationid”: “opid-0e0e”,
“status”:”success”,
“execution_time”:”25”,
“result”: {“txid”:”af3887654…”,...}
},
]

Examples:
zcash-cli z_getoperationresult '["opid-8120fa20-5ee7-4587-957b-f2579c2d882b"]'
zcash-cli z_getoperationresult +z_getoperationstatus
| [operationids] | Return OperationStatus JSON objects for all operations the node is currently aware of.

Operationids is an optional array to filter which operations you want to receive status objects for.

Output is a list of operation status objects.
[
{“operationid”: “opid-12ee…”,
“status”: “queued”},
{“operationid”: “opd-098a…”, “status”: ”executing”},
{“operationid”: “opid-9876”, “status”: ”failed”}
]

When the operation succeeds, the status object will also include the result.

{“operationid”: “opid-0e0e”,
“status”:”success”,
“execution_time”:”25”,
“result”: {“txid”:”af3887654…”,...}
} +z_listoperationids
| [state] | Return a list of operationids for all operations which the node is currently aware of.

State is an optional string parameter to filter the operations you want listed by their state. Acceptable parameter values are ‘queued’, ‘executing’, ‘success’, ‘failed’, ‘cancelled’.

[“opid-0e0e…”, “opid-1af4…”, … ] + +## Asynchronous RPC call Error Codes + +Zcash error codes are defined in https://github.com/zcash/zcash/blob/master/src/rpcprotocol.h + +### z_sendmany error codes + +RPC_INVALID_PARAMETER (-8) | _Invalid, missing or duplicate parameter_ +---------------------------| ------------------------------------------------- +"Minconf cannot be zero when sending from zaddr" | Cannot accept minimum confirmation value of zero when sending from zaddr. +"Minconf cannot be negative" | Cannot accept negative minimum confirmation number. +"Minimum number of confirmations cannot be less than 0" | Cannot accept negative minimum confirmation number. +"From address parameter missing" | Missing an address to send funds from. +"No recipients" | Missing recipient addresses. +"Memo must be in hexadecimal format" | Encrypted memo field data must be in hexadecimal format. +"Memo size of __ is too big, maximum allowed is __ " | Encrypted memo field data exceeds maximum size of 512 bytes. +"From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found. +"Invalid parameter, expected object" | Expected object. +"Invalid parameter, unknown key: __" | Unknown key. +"Invalid parameter, expected valid size" | Invalid size. +"Invalid parameter, expected hex txid" | Invalid txid. +"Invalid parameter, vout must be positive" | Invalid vout. +"Invalid parameter, duplicated address" | Address is duplicated. +"Invalid parameter, amounts array is empty" | Amounts array is empty. +"Invalid parameter, unknown key" | Key not found. +"Invalid parameter, unknown address format" | Unknown address format. +"Invalid parameter, size of memo" | Invalid memo field size. +"Invalid parameter, amount must be positive" | Invalid or negative amount. +"Invalid parameter, too many zaddr outputs" | z_address outputs exceed maximum allowed. +"Invalid parameter, expected memo data in hexadecimal format" | Encrypted memo field is not in hexadecimal format. +"Invalid parameter, size of memo is larger than maximum allowed __ " | Encrypted memo field data exceeds maximum size of 512 bytes. + + +RPC_INVALID_ADDRESS_OR_KEY (-5) | _Invalid address or key_ +--------------------------------| --------------------------- +"Invalid from address, no spending key found for zaddr" | z_address spending key not found. +"Invalid output address, not a valid taddr." | Transparent output address is invalid. +"Invalid from address, should be a taddr or zaddr." | Sender address is invalid. +"From address does not belong to this node, zaddr spending key not found." | Sender address spending key not found. + + +RPC_WALLET_INSUFFICIENT_FUNDS (-6) | _Not enough funds in wallet or account_ +-----------------------------------| ------------------------------------------ +"Insufficient funds, no UTXOs found for taddr from address." | Insufficient funds for sending address. +"Could not find any non-coinbase UTXOs to spend. Coinbase UTXOs can only be sent to a single zaddr recipient." | Must send Coinbase UTXO to a single z_address. +"Could not find any non-coinbase UTXOs to spend." | No available non-coinbase UTXOs. +"Insufficient funds, no unspent notes found for zaddr from address." | Insufficient funds for sending address. +"Insufficient transparent funds, have __, need __ plus fee __" | Insufficient funds from transparent address. +"Insufficient protected funds, have __, need __ plus fee __" | Insufficient funds from shielded address. + +RPC_WALLET_ERROR (-4) | _Unspecified problem with wallet_ +----------------------| ------------------------------------- +"Could not find previous JoinSplit anchor" | Try restarting node with `-reindex`. +"Error decrypting output note of previous JoinSplit: __" | +"Could not find witness for note commitment" | Try restarting node with `-rescan`. +"Witness for note commitment is null" | Missing witness for note commitment. +"Witness for spendable note does not have same anchor as change input" | Invalid anchor for spendable note witness. +"Not enough funds to pay miners fee" | Retry with sufficient funds. +"Missing hex data for raw transaction" | Raw transaction data is null. +"Missing hex data for signed transaction" | Hex value for signed transaction is null. +"Send raw transaction did not return an error or a txid." | + +RPC_WALLET_ENCRYPTION_FAILED (-16) | _Failed to encrypt the wallet_ +-------------------------------------------------------------------------| ------------------------------------- +"Failed to sign transaction" | Transaction was not signed, sign transaction and retry. + +RPC_WALLET_KEYPOOL_RAN_OUT (-12) | _Keypool ran out, call keypoolrefill first_ +-------------------------------------------------------------------------| ----------------------------------------------- +"Could not generate a taddr to use as a change address" | Call keypoolrefill and retry. diff --git a/doc/payment-disclosure.md b/doc/payment-disclosure.md new file mode 100644 index 000000000..d0aa68a96 --- /dev/null +++ b/doc/payment-disclosure.md @@ -0,0 +1,107 @@ +# Payment Disclosure (Experimental Feature) + +**Summary** + +Use RPC calls `z_getpaymentdisclosure` and `z_validatepaymentdisclosure` to reveal details of a shielded payment. + +**Who should read this document** + +Frequent users of shielded transactions, payment processors, exchanges, block explorer + +### Experimental Feature + +This is an experimental feature. Enable it by launching `zcashd` with flags: + + zcashd -experimentalfeatures -paymentdisclosure -debug=paymentdisclosure -txindex=1 + +These flags can also be set as options in `zcash.conf`. + +All nodes that generate or validate payment disclosures must run with `txindex=1` enabled. + +### Background + +Payment Disclosure is an implementation of the work-in-progress Payment Disclosure ZIP [1]. + +The ZIP describes a method of proving that a payment was sent to a shielded address. In the typical case, this means enabling a sender to present a proof that they transferred funds to a recipient's shielded address. + +[1] https://github.com/zcash/zips/pull/119 + +### Example Use Case + +Alice the customer sends 10 ZEC to Bob the merchant at the shielded address shown on their website. However, Bob is not sure if he received the funds. + +Alice's node is running with payment disclosure enabled, so Alice generates a payment disclosure and provides it to Bob, who verifies the payment was made. + +If Bob is a bad merchant, Alice can present the payment disclosure to a third party to validate that payment was indeed made. + +### Solution + +A payment disclosure can be generated for any output of a JoinSplit using the RPC call: + + z_getpaymentdisclosure txid js_index output_index (message) + +An optional message can be supplied. This could be used for a refund address or some other reference, as currently it is not common practice to (ahead of time) include a refund address in the memo field when making a payment. + +To validate a payment disclosure, the following RPC call can be used: + + z_validatepaymentdisclosure hexdata + +### Example + +Generate a payment disclosure for the first joinsplit, second output (index starts from zero): + + zcash-cli z_getpaymentdisclosure 79189528d611e811a1c7bb0358dd31343033d14b4c1e998d7c4799c40f8b652b 0 1 "Hello" + +This returns a payment disclosure in the form of a hex string: + + 706462ff000a3722aafa8190cdf9710bfad6da2af6d3a74262c1fc96ad47df814b0cd5641c2b658b0fc499477c8d991e4c4bd133303431dd5803bbc7a111e811d6289518790000000000000000017e861adb829d8cb1cbcf6330b8c2e25fb0d08041a67a857815a136f0227f8a5342bce5b3c0d894e2983000eb594702d3c1580817d0374e15078528e56bb6f80c0548656c6c6f59a7085395c9e706d82afe3157c54ad4ae5bf144fcc774a8d9c921c58471402019c156ec5641e2173c4fb6467df5f28530dc4636fa71f4d0e48fc5c560fac500 + +To validate the payment disclosure: + + zcash-cli z_validatepaymentdisclosure HEXDATA + +This returns data related to the payment and the payment disclosure: + + { + "txid": "79189528d611e811a1c7bb0358dd31343033d14b4c1e998d7c4799c40f8b652b", + "jsIndex": 0, + "outputIndex": 1, + "version": 0, + "onetimePrivKey": "1c64d50c4b81df47ad96fcc16242a7d3f62adad6fa0b71f9cd9081faaa22370a", + "message": "Hello", + "joinSplitPubKey": "d1c465d16166b602992479acfac18e87dc18065f6cefde6a002e70bc371b9faf", + "signatureVerified": true, + "paymentAddress": "ztaZJXy8iX8nrk2ytXKDBoTWqPkhQcj6E2ifARnD3wfkFwsxXs5SoX7NGmrjkzSiSKn8VtLHTJae48vX5NakvmDhtGNY5eb", + "memo": "f600000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "value": 12.49900000, + "commitmentMatch": true, + "valid": true + } + +The `signatureVerified` field confirms that the payment disclosure was generated and signed with the joinSplitPrivKey, which should only be known by the node generating and sending the transaction 7918...652b in question. + +### Where is the data stored? + +For all nodes, payment disclosure does not touch `wallet.dat` in any way. + +For nodes that only validate payment disclosures, no data is stored locally. + +For nodes that generate payment disclosures, a LevelDB database is created in the node's datadir. For most users, this would be in the folder: + + $HOME/.zcash/paymentdisclosure + +If you decide you don't want to use payment disclosure, it is safe to shut down your node and delete the database folder. + +### Security Properties + +Please consult the work-in-progress ZIP for details about the protocol, security properties and caveats. + +### Reminder + +Feedback is most welcome! + +This is an experimental feature so there are no guarantees that the protocol, database format, RPC interface etc. will remain the same in the future. + +### Notes + +Currently there is no user friendly way to help senders identify which joinsplit output index maps to a given payment they made. It is possible to construct this from `debug.log`. Ideas and feedback are most welcome on how to improve the user experience. diff --git a/doc/reduce-traffic.md b/doc/reduce-traffic.md new file mode 100644 index 000000000..20e19d0bb --- /dev/null +++ b/doc/reduce-traffic.md @@ -0,0 +1,54 @@ +Reduce Traffic +============== + +Some node operators need to deal with bandwidth caps imposed by their ISPs. + +By default, bitcoin-core allows up to 125 connections to different peers, 8 of +which are outbound. You can therefore, have at most 117 inbound connections. + +The default settings can result in relatively significant traffic consumption. + +Ways to reduce traffic: + +## 1. Use `-maxuploadtarget=` + +A major component of the traffic is caused by serving historic blocks to other nodes +during the initial blocks download phase (syncing up a new node). +This option can be specified in MiB per day and is turned off by default. +This is *not* a hard limit; only a threshold to minimize the outbound +traffic. When the limit is about to be reached, the uploaded data is cut by no +longer serving historic blocks (blocks older than one week). +Keep in mind that new nodes require other nodes that are willing to serve +historic blocks. **The recommended minimum is 1152 blocks per day (max. 2304MB +per day)** + +Whitelisted peers will never be disconnected, although their traffic counts for +calculating the target. + +## 2. Disable "listening" (`-listen=0`) + +Disabling listening will result in fewer nodes connected (remember the maximum of 8 +outbound peers). Fewer nodes will result in less traffic usage as you are relaying +blocks and transactions to fewer nodes. + +## 3. Reduce maximum connections (`-maxconnections=`) + +Reducing the maximum connected nodes to a minimum could be desirable if traffic +limits are tiny. Keep in mind that bitcoin's trustless model works best if you are +connected to a handful of nodes. + +## 4. Turn off transaction relay (`-blocksonly`) + +Forwarding transactions to peers increases the P2P traffic. To only sync blocks +with other peers, you can disable transaction relay. + +Be reminded of the effects of this setting. + +- It sets the flag "-walletbroadcast" to be "0", only if it is currently unset. + Doing so disables the automatic broadcasting of transactions from the wallet. Not + relaying other's transactions could hurt your privacy if used while the wallet + is loaded or if you use the node to broadcast transactions. +- If a peer is whitelisted and "-whitelistforcerelay" is set to "1" (which will + also set "whitelistrelay" to "1"), we will still receive and relay their transactions. +- It makes block propagation slower because compact block relay can only be + used when transaction relay is enabled. diff --git a/doc/reducing-memory-usage.md b/doc/reducing-memory-usage.md new file mode 100644 index 000000000..333ea0086 --- /dev/null +++ b/doc/reducing-memory-usage.md @@ -0,0 +1,8 @@ +In-memory caches +---------------- + +The size of some in-memory caches can be reduced. As caches trade off memory usage for performance, usually reducing these have a negative effect on performance. + +- `-dbcache=` - the UTXO database cache size, this defaults to `450` (`100` before 1.0.15). The unit is MiB (where 1 GiB = 1024 MiB). + - The minimum value for `-dbcache` is 4. + - A lower dbcache make initial sync time much longer. After the initial sync, the effect is less pronounced for most use-cases, unless fast validation of blocks is important such as for mining. diff --git a/doc/release-notes.md b/doc/release-notes.md new file mode 100644 index 000000000..a29094b51 --- /dev/null +++ b/doc/release-notes.md @@ -0,0 +1,6 @@ +(note: this is a temporary file, to be added-to by anybody, and moved to +release-notes at release time) + +Notable changes +=============== + diff --git a/doc/release-notes/release-notes-0.11.2.z2.md b/doc/release-notes/release-notes-0.11.2.z2.md new file mode 100644 index 000000000..107a86c7a --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z2.md @@ -0,0 +1,35 @@ +Daira Hopwood (2): + Add Code of Conduct. fixes #802 + Specify Sean as the second contact for conduct issues. + +Jack Grigg (6): + Implement validator and basic solver for Equihash + Add test vectors for Equihash + Use Equihash for Proof-of-Work + Adjust genesis blocks to have valid solutions and hashes + Fix tests that depend on old block header format + Fix pow_tests to work with Equihash + +Nathan Wilcox (4): + Log all failing rpc tests concisely. + Apply a patch from Sean to update wallet to use our new founders-reward aware balances. + Fix (most) rpc tests by updating balances. zcpour, zcpourdoublespend, and txn_doublespend currently fail. + Update a bunch of docs by adding a banner, delete a bunch of known bitrot docs; does not update release-process.md. + +Sean Bowe (5): + Fix miner_tests to work with equihash + Add missing synchronization that causes race condition in test. + Implementation of Founders' Reward. + Fix remaining RPC tests. + Change pchMessageStart for new testnet. + +Taylor Hornby (8): + Add automated performance measurement system. + Add equihash solving benchmarks + Add JoinSplit verification benchmarks + Add verify equihash benchmark + Don't leave massif.out lying around after the benchmarks + Use a separate datadir for the benchmarks + Make benchmark specified by command-line arguments + Benchmark a random equihash input. + diff --git a/doc/release-notes/release-notes-0.11.2.z3.md b/doc/release-notes/release-notes-0.11.2.z3.md new file mode 100644 index 000000000..656c0df7d --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z3.md @@ -0,0 +1,69 @@ +Daira Hopwood (1): + zkSNARK: Add constraint that the total value in a JoinSplit is a 64-bit integer. + +Nathan Wilcox (4): + Add a depends description for googletest. + Add a zcash-gtest binary to our build with a single tautological test. + Add coverage support scoped to only the zcash-gtest run; invoke with make zcash-cov; make cov is a superset. + Add googlemock 1.7.0 dependency. + +Sean Bowe (49): + Add serialization for primitive boost::optional. + New implementation of incremental merkle tree + Integrate new incremental merkle tree implementation into consensus. + Test old tree along with new tree as much as possible. + Deprecate the old tree and remove old tree tests from the test suite. + Initialize curve/field parameters in case another test hasn't done so. + Improve well-formedness checks and add additional serialization/deserialization tests. + Add more well-formedness checks/tests to tree. + Make appending algorithm more succinct. + Move incremental merkle tree tests to zcash-gtest. + NoteEncryption implementation and integration, removal of ECIES and crypto++ dependencies. + Move NoteEncryption tests to gtest suite. + Add additional tests for ephemeral key behavior. + Clarify the usage of decryption API. + Check exception has specific string message. + Small nit fixes + Run `zcash-gtest` in `make check` and fix performance tests. + Perform zerocash tests as part of full-test-suite, in preparation for removal of zerocash waterfall. + Distinguish the failure cases of wfcheck in tree. + Change ciphertext length to match protocol spec, and refactor the use of constants. + Initialize libsodium in the gtest suite. + Introduce new `libzcash` Zcash protocol API and crypto constructions surrounding the zkSNARK circuit. + zkSNARK: Foundations of circuit design and verification logic. + zkSNARK: Add "zero" constant variable. + zkSNARK: Enforce spend-authority of input notes. + zkSNARK: Enforce disclosure of input note nullifiers + zkSNARK: Authenticate h_sig with a_sk + zkSNARK: Enforce that new output notes have unique `rho` to prevent faerie gold attack. + zkSNARK: Enforce disclosure of commitments to output notes. + zkSNARK: Ensure that values balance correctly. + zkSNARK: Witness commitments to input notes. + zkSNARK: Enforce merkle authentication path from nonzero-valued public inputs to root. + libzcash: Add tests for API + Remove scriptPubKey/scriptSig from CPourTx, and add randomSeed. + Transplant of libzcash. + Added public zkSNARK parameter generation utility. + Stop testing old tree against new tree. + Remove nearly all of libzerocash. + Update public zkSNARK parameters for new circuit. + Fix performance measurements due to modified transaction structure. + Remove the zerocash tests from the full test suite. + Protect-style joinsplits should anchor to the latest root for now, until #604 is resolved. + Use inheritance for PRF gadgets. + Rename ZCASH_ constants to ZC_. + Rename hmac -> mac in circuit. + `Note` values should be little-endian byte order. + Update zkSNARK proving/verifying keys. + Add h_sig test vectors. + Change testnet network magics. + +Taylor Hornby (7): + Add check that vpubs are not both nonzero and test it. + Fix sighash tests + Add empty merkle/noteencryption tests so Sean can rebase. + Fix RPC tests + Rename bitcoin.conf and bitcoind.pid to zcash.conf and zcashd.pid in qa/ and src/ + Trivial change: Capitalize the Z in Zerocash + Remove the Merkle tree hash function's fixed point. + diff --git a/doc/release-notes/release-notes-0.11.2.z4.md b/doc/release-notes/release-notes-0.11.2.z4.md new file mode 100644 index 000000000..cbdbafc26 --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z4.md @@ -0,0 +1,70 @@ +Alex (1): + add sha256sum support for Mac OS X + +Alfie John (1): + Rename libzerocash to libzcash + +Jack Grigg (21): + Implement mining slow start with a linear ramp + Update subsidy tests to account for mining slow start + Update miner tests to account for mining slow start + Disable mining slow start in regtest mode + Fix failing miner test + Add Zcash revision to version strings + Bitcoin -> Zcash in version and help text + Add Zcash Developers to CLI copyright notice + Minor error message tweak + Refactor StepRow to make optimisation easier + Cleanups + Implement index-truncation Equihash optimisation + Store truncated indices in the same char* as the hash (H/T tromp for the idea!) + Use template parameters to statically initialise Equihash + Merge *StepRow XOR and trimming operations + Use comparator object for sorting StepRows + Store full indices in the same char* as the hash + Use fixed-width array for storing hash and indices + Use optimised Equihash solver for miner and benchmarks + Fix comment + Fix nits after review + +Nathan Wilcox (1): + Fix a test name bug so that ``make cov-zcash`` correctly runs the ``zcash-gtest`` binary. Fixes #946. + +Sean Bowe (14): + Refactor PRF_gadget to hand responsibility to PRF_addr_a_pk_gadget for creating the '0' argument to the PRF. + Enforce first four bits are zero for all spending keys and phi. + Enable binary serializations of proofs and r1cs keys, and make the `CPourTx` proof field fixed-size. + Reorder fields of CPourTx to reflect the spec. + Update proving key and tests that depend on transaction structure changes + Enable MULTICORE proving behavior with omp. + Pass `-fopenmp` at compile-time to enable MULTICORE. + Switch to Ed25519 for cryptographic binding of joinsplits to transactions. + Enforce that the `S` value of the ed25519 signature is smaller than the group order to prevent malleability attacks. + Use joinsplit_sig_t in more places. + Wrap lines in *CTransaction constructors. + Change error for invalid joinsplit signature for consistency. + Add additional assertions. + Update performance measurement transaction. + +Simon (2): + Remove Bitcoin testnet seeds. + Remove Bitcoin mainnet seeds. + +Taylor Hornby (16): + Fix build warnings in sighash tests. + Fix FORTIFY_SOURCE build errors. + Use HARDENED_CPPFLAGS in the Makefile consistently. + Use left shift instead of floating-point pow() in equihash. + Ignore deprecated declaration warnings. + Remove unused code in libzerocash util.cpp + Turn on -Werror for the Zcash build. + Patch libsnark to build with my compiler. Upstream PR #35. + Hide new Boost warnings on GCC 6. + Add ability to run things under valgrind. + Pass -DPURIFY to OpenSSL so it doesn't clutter valgrind output. + Enable -v for valgrind so we can see counts for each error. + Sign JoinSplit transactions + We don't want to benchmark signature creation / verification. + Implement signature verification in CheckTransaction + Fix tests for JoinSplit signatures + diff --git a/doc/release-notes/release-notes-0.11.2.z5.md b/doc/release-notes/release-notes-0.11.2.z5.md new file mode 100644 index 000000000..5c86083ff --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z5.md @@ -0,0 +1,78 @@ +Ethan Heilman (1): + Increase test coverage for addrman and addrinfo + +EthanHeilman (1): + Creates unittests for addrman, makes addrman testable. Adds several unittests for addrman to verify it works as expected. Makes small modifications to addrman to allow deterministic and targeted tests. + +Jack Grigg (24): + Use depth-first scan for eliminating partial solutions instead of breadth-first + Add a 256-bit reserved field to the block header + Set -relaypriority default to false + Regenerate genesis blocks + Update tests to account for reserved field + Update RPC tests to account for reserved field + Decrease block interval to 2.5 minutes + Update tests to account for decreased block interval + Update RPC tests to account for decreased block interval + Updated a hard-coded number of blocks to account for decreased block interval + Fix failing tests + Increase Equihash parameters to n = 96, k = 3 (about 430 MiB) + Update tests to account for new Equihash parameters + Speed up FullStepRow index comparison by leveraging big-endian byte layout + Use little-endian for hash personalisation and hashing indices + Use htole32 and htobe32 for endian conversions + Regenerate genesis blocks + Update miner tests for platform-independent Equihash + Tweaks after review + Implement new difficulty algorithm (#931) + Update tests for new difficulty algorithm + Improve comments per review + Handle full Zcash version string in AC_INIT + Fix bug in network hashrate lookup window configuration + +Patrick Strateman (1): + CAddrMan::Deserialize handle corrupt serializations better. + +Philip Kaufmann (1): + remove using namespace std from addrman.cpp + +Sean Bowe (28): + Move new coins tests to within coins_tests test suite. + Ensure merkle tree fixed point removal is tested against inside coins_tests. + Allow pours to be anchored to intermediate treestates of a transaction. + Test behavior of chained pour consensus rules. + Remove redundant constraints. + Change merkle tree depth to 29. + Update the zkSNARK parameters. + Add test to ensure parent treestates only can appear earlier in the transaction or in the global state, not later. + Minor changes to coins_tests. + Rename `CheckInputs` to `ContextualCheckInputs` since it relies on a global variable and assumes calling conditions. + Refactor contextual and noncontextual input checks. + Prevent coinbases from being spent to transparent outputs. + Disable coinbase-must-be-protected rule on regtest. + Ensure mempool integrity checks don't trip on chained joinsplits. + Enforce BIP16 and BIP30 unconditionally to all blocks. + Enforce remaining softfork activation rules unconditionally. + Ensure NonContextualCheckInputs runs before routines in ContextualCheckInputs. + Rename to `fCoinbaseMustBeProtected`. + Disable enforced coinbase protection in miner_tests. + Do not encode leading bytes in `PaymentAddress` serialization; this is a task for a higher-level API. + Use base58check to encode Zcash payment addresses, such that the first two bytes are "zc". + Add tests for `CZCPaymentAddress`. + Fix test against merkle tree root. + Added encoding for Zcash spending keys. + Guarantee first two bytes of spending key are SK + Make testnet addresses always start with 'tn'. + Add test to ensure spending keys always encode with 'SK' at beginning. + Testnet spending keys should start with 'TK'. + +Simon (5): + Fix issue #717 where if addrman is starved of addresses (e.g. on testnet) the Select_() function will loop endlessly trying to find an address, and therefore eat up 100% cpu time on the 'opencon' thread. + Declare constants for the maximum number of retries, when to sleep between retries and how long for. + Implement issue #997 to reduce time for test_bitcoin due to sleeps in addrman. Related to issue #717. + Update to DistinctIndices function (for issue #857). Replaces pull request #974. + Update variable name. + +Taylor Hornby (1): + Enable -alertnotify for hard fork detection. Test it. + diff --git a/doc/release-notes/release-notes-0.11.2.z6.md b/doc/release-notes/release-notes-0.11.2.z6.md new file mode 100644 index 000000000..5d6054509 --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z6.md @@ -0,0 +1,18 @@ +Jack Grigg (4): + Equihash: Only compare the first n/(k+1) bits when sorting. + Randomise the nonce in the block header. + Clear mempool before using it for benchmark test, fix parameter name. + Fix memory leak in large tx benchmark. + +Sean Bowe (5): + Increase block size to 2MB and update performance test. + Make sigop limit `20000` just as in Bitcoin, ignoring our change to the blocksize limit. + Remove the mainnet checkpoints. + Fix performance test for block verification. + Make `validatelargetx` test more accurate. + +Taylor Hornby (1): + Add example mock test of CheckTransaction. + +aniemerg (1): + Suppress Libsnark Debugging Info. diff --git a/doc/release-notes/release-notes-0.11.2.z7.md b/doc/release-notes/release-notes-0.11.2.z7.md new file mode 100644 index 000000000..a6a14af96 --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z7.md @@ -0,0 +1,90 @@ +Daira Hopwood (2): + .clang-format: change standard to C++11 + Bucket -> note. + +Jack Grigg (4): + Collect all permutations of final solutions + Add test case that requires the fix + Reinstate previous testnet adjustment behaviour + Hardfork to the previous testnet difficulty adjustment behaviour at block 43400 + +Nathan Wilcox (1): + A script to remove "unofficial" tags from a remote, such as github. + +Sean Bowe (36): + Flush to disk more consistently by accounting memory usage of serials/anchors in cache. + Always check valid joinsplits during performance tests, and avoid recomputing them every time we change the circuit. + Remove the rest of libzerocash. + Update tests with cache usage computations + Reorder initialization routines to ensure verifying key log messages appear in debug.log. + Remove zerocash tests from full-test-suite. + Rename samplepour to samplejoinsplit + Update libsnark to our fork. + Initialize libsodium in this routine, which is now necessary because libsnark uses its PRNG. + Pass our constraint system to libsnark, so that it doesn't need to (de)serialize it in the proving key. + Rename CPourTx to JSDescription. + Rename vpour to vjoinsplit. + Rename JSDescription's `serials` to `nullifiers`. + Test fixes. + Rename GetPourValueIn to GetJoinSplitValueIn + Rename HavePourRequirements to HaveJoinSplitRequirements. + Rename GetSerial to GetNullifier. + Renaming SetSerial to SetNullifier. + Rename CSerialsMap to CNullifiersMap. + Rename mapSerials to mapNullifiers. + Rename some usage of 'pour'. + Rename more usage of `serial`. + Rename cacheSerials to cacheNullifiers and fix tests. + Rename CSerialsCacheEntry. + Change encryptedbucket1 to encryptednote1. + Rename pour RPC tests + Fix tests + Remove more usage of `serial`. + Fixes for indentation and local variable names. + Change `serial` to `nf` in txdb. + Rename `pour` in RPC tests. + Remove the constraint system from the alpha proving key. + Introduce `zcsamplejoinsplit` for creating a raw joinsplit description, and use it to construct the joinsplit for the performance tests that verify joinsplits. + Bump the (minimum) protocol version to avoid invoking legacy behavior from upstream. + Remove more from libsnark, and fix potential remote-DoS. + Add test for non-intuitive merkle tree gadget witnessing behavior. + +bitcartel (15): + Disable USE_ASM when building libsnark (issue 932). + Add getblocksubsidy RPC command to return the block reward for a given block, taking into account the mining slow start. + Replace index with height in help message for getblocksubsidy RPC call. + Narrow scope of lock. + Add founders reward to output. + Use new public/private key pairs for alert system. + Add sendalert.cpp to repo. + Fixes to integrate sendalert.cpp. Add sendalert.cpp to build process. Add alertkeys.h as a placeholder for private keys. + Disable QT alert message. + Update comments. + Update alert ID start value and URL in comment. + Update alert protocol version comment. + Update URL for zcash alert IDs. + Remove QT alert message box. + New alert test data generated for new alert key pair. Added test fixture to create new test data. Added instructions for developer. + Update tor.md for Zcash + +Taylor Hornby (17): + WIP: Add mock test coverage of CheckTransaction + Split JoinSplit proof verification out of CheckTransaction. + More testing of CheckTransaction + Test non-canonical ed25519 signature check + Rename zerocash to zcash in some places. + Remove references to libzerocash in .gitignore + Rename qa/zerocash to qa/zcash in Makefile.am + Rename zerocash_packages to zcash_packages in packages.mk + Add security warnings doc with warning about side channels. + Add another security warning + Add the results of #784 to security warnings. + Fix bad_txns_oversize test for increased block size. + Note that the actual secret spending key may be leaked. + Mention physical access / close proximity + Remove in-band error signalling from SignatureHash, fixing the SIGHASH_SINGLE bug. + Fix the tests that the SIGHASH_SINGLE bugfix breaks. + Remove insecurely-downloaded dependencies that we don't currently use. + +aniemerg (1): + Update GetDifficulty() to use consensus.powLimit from consensus parameters. Fixes #1032. diff --git a/doc/release-notes/release-notes-0.11.2.z8.md b/doc/release-notes/release-notes-0.11.2.z8.md new file mode 100644 index 000000000..073d771f1 --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z8.md @@ -0,0 +1,61 @@ +Daira Hopwood (1): + README.md: simplify the title, drop "Core" + +Jack Grigg (23): + Make Equihash solvers cancellable + Add tests that exercise the cancellation code branches + Fix segfault by indirectly monitoring chainActive.Tip(), locking on mutex + Move initialisations to simplify cancelled checks + Use std::shared_ptr to deallocate partialSolns automatically + Equihash: Pass each obtained solution to a callback for immediate checking + Remove hardfork from special testnet difficulty rules + Fix bug in 'generate' RPC method that caused it to fail with high probability + Add thread parameter to solveequihash benchmark + Eliminate some of the duplicates caused by truncating indices + Use fixed-size array in IsProbablyDuplicate to avoid stack protector warning + Eliminate probably duplicates in final round + Simplify IsProbablyDuplicate() + Add missing assert + Simplify optional parameters + Fix previous commit + Remove the assumption that n/(k+1) is a multiple of 8. + Add Equihash support for n = 200, k = 9 + Add test showing bug in IsProbablyDuplicate() + Fix bug in IsProbablyDuplicate() + Change Equihash parameters to n = 200, k = 9 (about 563-700 MiB) + Update tests to account for new Equihash parameters + Ignore duplicate entries after partial recreation + +Simon (21): + Inform user that zcraw... rpc calls are being deprecated. + Add GetTxid() which returns a non-malleable txid. + Update genesis blocks. + Update precomputed equihash solutions used in test. + Update block and tx data used in bloom filter tests. + Updated test data for script_tests by uncommenting UPDATE_JSON_TESTS flag. + Rename GetHash() method to GetSerializeHash(). + Replace calls to GetHash() with GetTxid() for transaction objects. + Set nLockTime in CreateNewBlock() so coinbase txs do not have the same txid. Update test data in miner_tests. + Refactor GetTxid() into UpdateTxid() to match coding style of hash member variable. + Revert "Set nLockTime in CreateNewBlock() so coinbase txs do not have the same txid." + Fix issue where a coinbase tx should have it's sigscript hashed to avoid duplicate txids, as discussed in BIP34 and BIP30. + Update genesis block hashes and test data. + Make txid const. + Update deprecation message for zcraw api. + Fix comment. + Update comment. + Extend try catch block around calls to libsnark, per discussion in #1126. + Remove GetSerializeHash() method. + Use -O1 opimitization flag when building libzcash. Continuation of #1064 and related to #1168. + Add test for non-malleable txids. To run just this test: ./zcash-gtest --gtest_filter="txid_tests*" + +Taylor Hornby (8): + Make the --enable-hardening flag explicit. + Enable -O1 for better FORTIFY_SOURCE protections. + Add checksec.sh from http://www.trapkit.de/tools/checksec.html + Add tests for security hardening features + Pull in upstream's make check-security, based on upstream PR #6854 and #7424. + Make security options in configure.ac fail if unavailable. + Put hardened stuff in libzcash CPPFLAGS. + Add more commands to run unit tests under valgrind. + diff --git a/doc/release-notes/release-notes-0.11.2.z9.md b/doc/release-notes/release-notes-0.11.2.z9.md new file mode 100644 index 000000000..3c45b9d9a --- /dev/null +++ b/doc/release-notes/release-notes-0.11.2.z9.md @@ -0,0 +1,55 @@ +Sean Bowe (6): + Change memo field size and relocate `ciphertexts` field of JoinSplit description. + Implement zkSNARK compression. + Perform curve parameter initialization at start of gtest suite. + Update libsnark dependency. + Enable MONTGOMERY_OUTPUT everywhere. + Update proving/verifying keys. + +Jack Grigg (11): + Add support for spending keys to the basic key store. + Merge AddSpendingKeyPaymentAddress into AddSpendingKey to simplify API. + Add methods for byte array expansion and compression. + Update Equihash hash generation to match the Zcash spec. + Extend byte array expansion and compression methods with optional padding. + Store the Equihash solution in minimal representation in the block header. + Enable branch coverage in coverage reports. + Add gtest coverage and intermediates to files deleted by "make clean". + Remove non-libsnark dependencies and test harness code from coverage reports. + Add separate lock for SpendingKey key store operations. + Test conversion between solution indices and minimal representation. + +Daira Hopwood (6): + Move bigint arithmetic implementations to libsnark. + Add mostly-static checks on consistency of Equihash parameters, MAX_HEADERS_RESULTS, and MAX_PROTOCOL_MESSAGE_LENGTH. + Change some asserts in equihash.cpp to be static. + Decrease MAX_HEADERS_RESULTS to 160. fixes #1289 + Increment version numbers for z9 release. + Add these release notes for z9. + +Taylor Hornby (5): + Disable hardening when building for coverage reports. + Upgrade libsodium for AVX2-detection bugfix. + Fix inconsistent optimization flags; single source of truth. + Add -fwrapv -fno-strict-aliasing; fix libzcash flags. + Use libsodium's s < L check, instead checking that libsodium checks that. + +Simon Liu (3): + Fixes #1193 so that during verification benchmarking it does not unncessarily create thousands of CTransaction objects. + Closes #701 by adding documentation about the Payment RPC interface. + Add note about zkey and encrypted wallets. + +Gaurav Rana (1): + Update zcash-cli stop message. + +Tom Ritter (1): + Clarify comment about nonce space for Note Encryption. + +Robert C. Seacord (1): + Memory safety and correctness fixes found in NCC audit. + +Patrick Strateman (1): + Pull in some DoS mitigations from upstream. (#1258) + +Wladimir J. van der Laan (1): + net: correctly initialize nMinPingUsecTime. diff --git a/doc/release-notes/release-notes-1.0.0-beta1.md b/doc/release-notes/release-notes-1.0.0-beta1.md new file mode 100644 index 000000000..8c28b92aa --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-beta1.md @@ -0,0 +1,159 @@ +Daira Hopwood (1): + Update steps after D + +Jack Grigg (43): + Undo debugging change from 5be6abbf84c46e8fc4c8ef9be987a44de22d0d05 + Output Equihash solution in RPC results as a hex string + Add optional bool to disable computation of proof in JSDescription constructor + Add wallet method for finding spendable notes in a CTransaction + Store mapping between notes and PaymentAddresses in CWalletTx + Keep track of spent notes, and detect and report conflicts + Create mapping from nullifiers to received notes + Add caching of incremental witnesses for spendable notes + Update cached incremental witnesses when the active block chain tip changes + Test solution output of blockToJSON() + Pass ZCIncrementalMerkleTree to wallet to prevent race conditions + Remove GetNoteDecryptors(), lock inside FindMyNotes() instead + Replace vAnchorCache with a cache size counter + mapNullifiers -> mapNullifiersToNotes for clarity + Set witness cache size equal to coinbase maturity duration + Add transactions to wallet if we spend notes in them + Add test for GetNoteDecryptor() + Keep any existing cached witnesses when updating transactions + Changes after review + Add test showing that the witness cache isn't being serialised + Fix the failing test! + Increase coverage of GetNoteDecryptor() + Add coverage of the assertion inside GetNoteWitnesses() + Separate concepts of block difficulty and network difficulty in RPC + Add test comparing GetDifficulty() with GetNetworkDifficulty() + Remove mainnet DNS seeds, set checkpoint to genesis + Fix failing test + Adjust from average difficulty instead of previous difficulty + Remove testnet-only difficulty rules + Add comments explaining changed semantics of pow_tests + Expand bounds on difficulty adjustment + Remove accidental double-semicolon (harmless but odd) + Add test of difficulty averaging + Simplify difficulty averaging code + Restrict powLimit due to difficulty averaging + Regenerate genesis blocks for new powLimits + Update tests for new genesis blocks + Adjust test to avoid spurious failures + Remove unnecessary method + Adjust test to account for integer division precision loss + Refactor wallet note code for testing + Add tests for refactored wallet code + Remove .z# suffix from version + +Lars-Magnus Skog (1): + changed module name from "bitcoin" to "Zcash" in FormatException() + +Sean Bowe (7): + Deallocate the public parameters during Shutdown. + Update libsnark again. + Fix CheckTransaction bugs. + Remove TODO 808. + Fix transaction test in test_bitcoin. + Change version to 1.0.0. This is just a beta. + Update pchMessageStart and add testnet DNS boostrapper. + +Simon (91): + Implemented RPC calls z_importkey, z_exportkey, z_getnewaddress. Modified RPC calls dumpwallet and importwallet to include spending keys. + Add z_importwallet and z_exportwallet to handle keys for both taddr and zaddr. Restore behaviour of dumpwallet and importwallet to only handle taddr. + Implemented z_listaddresses to return all the zaddr in the wallet. + Add gtest to cover new methods in: CWallet - GenerateNewZKey() - AddZKey() - LoadZKey() - LoadZKeyMetadata() CWalletDB - WriteZKey() + Don't mark wallet as dirty if key already exists. Fix incorrect method name used in error message. + Added wallet rpc tests to cover: z_importwallet, z_exportwallet z_importkey, z_exportkey z_listaddresses + Add test coverage for RPC call z_getnewaddress. + Fix comment. + Remove one line of dead code. + Add "zkey" to list of key types (used by the wallet to decide whether or not it can be recovered if it detects bad records). + Fix comments. + Rename methods to avoid using prefix of _ underscore which is reserved. Added logging of explicit exception rather than a catch all. Removed redundant spending key check. Updated user facing help message. + Fixes #1122 where json_spirit could stack overflow because there was no maximum limit set on the number of nested compound elements. + Throw a domain error as json_spirit is a third-party library. + Closes #1315. RPC getblocksubsidy height parameter is now optional and a test has been added to verify parameter input and results. + Remove #1144 from transaction.h. + Remove #1144 from transaction.cpp by reverting back to commit 942bc46. + Remove #1144 from bloom_tests by reverting to commit 5012190. + Remove #1144 from input data of script_tests. + Update txid gtest to verify #1144 has been removed: GetTxid() and GetHash() return the same result. + Refactor: replace calls to GetTxid() with GetHash() + Remove GetTxid() from CTransaction and update test_txid + Replace GetTxid() with GetHash() after rebase on latest. + Add async RPC queue and operation classes. Add z_getoperationstatus RPC command. Add z_sendmany RPC command (dummy implementation, does not send actual coins). + Add prefix to async operation id so it is easier to manage on cli. + Add config option 'rpcasyncthreads' to specify number of async rpc workers. Default is 1. + Add public field 'memo' to JSOutput to enable creation of notes with custom memos. + Implement z_sendmany RPC call. + Update find_unspent_notes() as mapNoteAddrs_t has been replaced by mapNoteData_t. + z_sendmany from a taddr now routes change to a new address instead of back to the sender's taddr, + Successful result of z_sendmany returns txid so it doesn't need to return raw hex. + Add public method to get state as a human readable string from an AsyncRPCOperation. + Add public method to AsycnRPCQueue to retrieve all the known operation ids. + Implement RPC call z_listoperationids and update z_getoperationstatus to take a list parameter. + Refactoring and small improvements to async rpc operations. + Closes #1293 by adding z_getoperationresult and making z_getoperationstatus idempotent. + Add chaining of JoinSplits within a transaction. + Disable option to allow multiple async rpc workers. + Coinbase utxos can only be spent when sending to a single zaddr. Change from the transaction will be sent to the same zaddr. + Fix bug where call to sign and send a transaction was in wrong scope. + Added option to close a queue and wait for queued up operations to finish, rather than just closing a queue and immediately cancelling all operations. + Fix bug where wallet was not persisting witnesses to disk. Author: str4d + Refactor to use wallet note tracking from commit a72379 + Clear the operation queue when closing it. + Add test for AsyncRPCQueue and AsyncRPCOperation. + Add shared queue to AsynRPCQueue. + Update RPCServer to use AsyncRPCQueue's shared queue. + Remove redundant check when getting spending key for a payment address. + Add tests for async queue and rpc commands: z_getoperationstatus, z_getoperationresult, z_listoperationids, z_sendmany + Remove redundant call. + Add logging under the category "asyncrpc". + Add extra checking of memo data in hexadecimal string format. + Add friend class for testing private members of AsyncRPCOperation_sendmany. + Add z_getbalance and z_gettotalbalance RPC calls to close #1201. + Fix typo in error message + Disable proof generation when testmode is enabled in async SendMany operation. + Reduce use of global pzcashParams with private member variable + Revert "Reduce use of global pzcashParams with private member variable" + Replace zcashParams_ with global. + Add tests to try and improve coverage of perform_joinsplit. + Add GetUnspentNotes to wallet. + Add test for GetUnspentNotes() in wallet. + Refactor async sendmany and getbalance calls to use GetUnspentNotes(). + Add more logging. + Disable z_sendmany in safe mode + Rename GetUnspentNotes to GetFilteredNotes + Add z_listreceivedbyaddress RPC call + Add 'DEPRECATED' to help message of zcraw* commands + Update formatting and documentation. + Move lock guard to start of addOperation to protect isClosed() and isFinishing() + Fix formatting + Add lock guard to getNumberOfWorkers() + Replace unique_lock with lock_guard, where appropriate, for consistency + Add extra RPC parameter checks for minconf<0 and zaddr not belonging to wallet. + Add test for calling RPC z_getbalance, z_gettotalbalance, z_listreceivedbyaddress with invalid parameters. + Fix formatting + Update log statement to include fee. + Fix incorrect default value for argument of GetFilteredNotes. + Formatting and updated test per review. + Add lock for member variables. Clean up and clarify that id_ and creation_time_ are never to be mutated anywhere. Fix incomplete copy/assignment constructors. + Remove unused varible. + Add ticket number to issues raised in comment. + Add assert for two mutually exclusive member variables. + Improve error reporting when attempting to spend coinbase utxos. + Use zcash constants + Fix formatting + Add assert + Update comment with ticket issue number + Remove line of commented out code we don't need + Improve check that user supplied memo field is too long. + Replace GetTxid() with GetHash() + Update payment-api.md + Update security-warnings.md about REST interface + Update payment API documentation for beta 1 + +Taylor Hornby (2): + Add -Wformat -Wformat-security + Use -Wformat in the test for -Wformat-security diff --git a/doc/release-notes/release-notes-1.0.0-beta2.md b/doc/release-notes/release-notes-1.0.0-beta2.md new file mode 100644 index 000000000..90d9286a9 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-beta2.md @@ -0,0 +1,119 @@ +Alfie John (2): + Typo in params README + Updating wording to match Beta Guide + +Bryan Stitt (1): + Link to beta guide + +Daira Hopwood (9): + Benchmark 50 iterations of solveequihash + Remove FindAndDelete. refs #1386 + Update my email address in the Code of Conduct. + Repair FormatSubVersion tests. refs #1138 + WIP: update address prefixes. refs #812 + Reencode keys in JSON test data. refs #812 + CBitcoinAddress should use nVersionBytes == 2. + Repair bitcoin-util-test. + Repair rpc-tests/signrawtransactions.py. + +Gregory Maxwell (1): + Limit setAskFor and retire requested entries only when a getdata returns. + +Jack Grigg (43): + Add support for encrypting spending keys + Check we haven't trashed the first key entry with the second + Move serialized Zcash address length constants into zcash/Address.hpp + Measure multithreaded solveequihash time per-thread + Add a make command for checking expected failures + Enable high-priority alerts to put the RPC into safe mode + Fix test + Add wallet method to clear the note witness cache + Clear note witness caches on reindex + Write note witness cache atomically to disk to avoid corruption + Test that invalid keys fail to unlock the keystore + Implement CSecureDataStream for streaming CKeyingMaterial + Cache note decryptors in encrypted keystore + Use correct lock for spending keys + Upgrade Boost to 1.62.0 + Upgrade libgmp to 6.1.1 + Upgrade OpenSSL to 1.1.0b + Upgrade miniupnpc to 2.0 + Upgrade ccache to 3.3.1 + Release process: check dependencies for updates + Fix auto_ptr deprecation warning in Boost + Replace auto_ptr with unique_ptr + Re-enable disabled compiler warnings + Disable nearly everything in OpenSSL + Add libsnark to pre-release dependency checks + Assert that new OpenSSL allocators succeed + Remove no-autoalginit and no-autoerrinit OpenSSL flags + Use asserts to check allocation errors in CECKey::Recover + Simplify ClearNoteWitnessCache() + Add tests for alerts enabling RPC safe mode + Ensure correctness if asserts are compiled out + Disable OP_CODESEPARATOR + Remove OP_CODESEPARATOR from tests + Downgrade bdb to 5.3.28 + Use CLIENT_VERSION_BUILD to represent -beta and -rc in client version + Update release process with version schema + Formatting fix + Mark previously-valid test data as invalid + Re-encode hard-coded addresses in tests + Re-encode Founders' Reward keys + Fix secp256k1 test compilation + Fix zkey test + Update address in Founders' Reward gtest + +Jay Graber (4): + Link to z.cash on security-warnings.md + Add section abt confs and reorgs to security-warnings.md + Update wording + Final edits + +Kevin Gallagher (5): + Lock to prevent parallel execution of fetch-params.sh + Updates dns.testnet.z.cash -> dnsseed.testnet.z.cash + Verify TLS certificates w/ wget in fetch-params.sh + Inserts some notes related to testnet deployment + Adds note about updating guide during testnet deployment + +Pieter Wuille (1): + Fix and improve relay from whitelisted peers + +Robert C. Seacord (1): + Changes to upgrade bdb to 6.2.23 + +Sean Bowe (1): + Update to `beta2` public parameters, remove `regtest`/`testnet3` parameters subdirectories. + +Simon (20): + Replace %i format specifier with more commonly used %d. + Fix GetFilteredNotes to use int for minDepth like upstream and avoid casting problems. Don't use FindMyNotes as mapNoteData has already been set on wallet tx. + Update test to filter and find notes. + Add support for spending keys to the encrypted wallet. + Update to use new API in CCryptoKeyStore and store a viewing key in walletdb. + Fix comment and formatting per review + Add founders reward to ChainParams. Fix bug where subsidy slow shift was ignored. + Founders reward: changed index computation, added new test and some refactoring. + Founders reward: Refactor test and formatting per review. + Refactor to add test to verify number of rewards each mainnet address will receive + Refactor and fix per review + Update comment per review + Update founders reward test to output path of temporary wallet.dat file which contains keys which can be used for testing founders reward addresses. + Update testnet founders reward addresses + Add mainnet 2-of-3 multisig addresses for testing. + Add field fMinerTestModeForFoundersRewardScript to chainparams + Update mainnet addresses used for testing to have the correct number + Fixes #1345 so that UTXO debit and credits are computed correctly for a transaction. + Closes #1371 by updating signed message + Modify message string so we don't need to backport commits which implement FormatStateMessage and GetDebugMessage and involve changes to consensus/validation.h + +Wladimir J. van der Laan (1): + build: remove libressl check + +fanquake (1): + [depends] OpenSSL 1.0.1k - update config_opts + +kazcw (1): + prevent peer flooding request queue for an inv + diff --git a/doc/release-notes/release-notes-1.0.0-rc1.md b/doc/release-notes/release-notes-1.0.0-rc1.md new file mode 100644 index 000000000..4d9763ec7 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc1.md @@ -0,0 +1,121 @@ +4ZEC (1): + Correct line swap + +Cory Fields (7): + release: add _IO_stdin_used to ignored exports + release: add check-symbols and check-security make targets + release: always link librt for glibc back-compat builds + release: add security/symbol checks to gitian + depends: allow for CONFIG_SITE to be used rather than stealing prefix + gitian: use CONFIG_SITE rather than hijacking the prefix + gitian: create debug packages for linux/windows + +Daira Hopwood (6): + Fix RPC tests to not rely on accounts. + Cosmetics in RPC tests. + Fix blank lines in DEBIAN/copyright license texts. + Move the increment of nWitnessCacheSize to make the later assertions correct. + Add another assertion to narrow down where the bug occurs. + Add another assertion about the witness cache. + +Jack Grigg (25): + Update release process to sign release tags + WriteWitnessCache: Catch errors and abort transaction + Throw an RPC error for all accounts except the default + Update tests for account deprecation + Deprecated -> Unsupported in RPC error + Correct docstring + Add unit tests for WriteWitnessCache + Document CWalletTx::FindMyNotes + Refactor test to clarify expectations + Add unit test that fails when calling FindMyNotes on a locked wallet + Add RPC test showing correct handling of JS txns from blockchain + Break the RPC test by encrypting the mirroring wallet + Delay caching of nullifiers when wallet is locked + Update comments + Only ignore runtime errors caused by failed note decryption + Remaining changes from bitcoin/bitcoin#6854 + [gitian] Don't call "make check-symbols" + Fix Makefiles so "make dist" will run + Render full version correctly in configure.ac + Update libsnark to include determinism fix + Address review comments + Add more asserts to track down the bug + Increment witnesses for new transactions on rescan + Add clear error message for upgrading users + Set CBlockIndex.hashAnchor correctly in ConnectBlock + +Jay Graber (17): + Document wallet reindexing for z_importkey description in payment-api.md + Rm beta 1 release note about encrypted wallets + Note that Coinbase maturity interval does not protect JoinSplits + Refer to Zcash wiki in INSTALL + Rm bitcoin logo + Rm build-unix.md, to keep single copy of build instructions for Zcash on github wiki + Rm Bitcoin-specific documentation + Add note that document is not updated for Zcash to translation policy + Rm doc for disabled REST interface + Change alpha to beta testnet, add zcash hidden service + Improve documentation on connecting to zcash hidden server + Improve documentation on connecting to zcash hidden server + Update tor.md + Distinguish between connecting to 1 vs multiple tor nodes + Revert "Rm Bitcoin-specific documentation" + Mv btc release notes to doc/bitcoin-release-notes + Reword joinsplit anchor paragraph + +Kevin Gallagher (24): + Set wget retry options for fetching parameters + Increases timeout to 30s, wait before retry to 3s + Initial packaging for Debian + Moves zcash-fetch-params to /usr/bin + Adds newline between source and package definition + Adds copyright file back to Debian package + Updates Linux gitian descriptor file for Zcash + Updates trusty -> jessie in Gitian Linux descriptor + Adds distro: debian to gitian-linux.yml + Updates Gitian descriptor for Zcash + Removes Windows and OSX packaging from EXTRA_DIST + Moves V=1 and NO_QT=1 to MAKEOPTS + Include contrib/devtools/split-debug.sh from upstream + Adds faketime to Gitian build dependencies + Inlude crypto/equihash.tcc in list of sources for dist + Adds zcash/Zcash.h to LIBZCASH sources + Adds zcash/Proof.hpp to LIBZCASH_H + Add alertkeys.h to libbitcoin_server_a_SOURCES + Adds files in src/zcash/circuit to libzcash_a_SOURCES + Adds zcbenchmarks.h to libbitcoin_wallet_a_SOURCES + Adds json_test_vectors.h to zcash_gtest_SOURCES + Adds additional licenses to Debian copyright file + Updates Zcash Core developers -> Zcash developers + Adds . to blank lines in Google license + +MarcoFalke (3): + [gitian] Set reference date to something more recent + [gitian] Default reference_datetime to commit author date + [gitian] hardcode datetime for depends + +Sean Bowe (1): + Make 100KB transaction size limit a consensus rule, rather than a standard rule. + +Simon (11): + Add vjoinsplit to JSON output of RPC call gettransaction + Fixes #1478 by ensuring wallet tests have the -datadir environment set appropriately. + Fixes #1491 by updating help message for rpc call z_importkey + Fix incorrect check of number of parameters for z_getnewaddress. + Add tests to verify that all z_* rpc calls return an error if there are too many input parameters. + Rename client identifier from Satoshi to MagicBean (closes #1481) + Use -debug=zrpc for z_* rpc calls (#1504) + Document CWallet::GetFilteredNotes and fix return type which should be void. + Fix test so that the encrypted wallet is output to the test_bitcoin -datadir folder. + Reorder gtests in zcash-gtest. + Return improved error message when trying to spend Coinbase coins (#1373). + +Wladimir J. van der Laan (6): + devtools: add libraries for bitcoin-qt to symbol check + gitian: use trusty for building + gitian: make windows build deterministic + gitian: Need `ca-certificates` and `python` for LXC builds + build: Remove unnecessary executables from gitian release + gitian: Add --disable-bench to config flags for windows + diff --git a/doc/release-notes/release-notes-1.0.0-rc2.md b/doc/release-notes/release-notes-1.0.0-rc2.md new file mode 100644 index 000000000..27f115a75 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc2.md @@ -0,0 +1,106 @@ +Daira Hopwood (22): + Add link to protocol specification. + Add tests for IsStandardTx applied to v2 transactions. + Make v2 transactions standard. This also corrects a rule about admitting large orphan transactions into the mempool, to account for v2-specific fields. + Changes to build on Alpine Linux. + Add Tromp's implementation of Equihash solver (as of tromp/equihash commit 690fc5eff453bc0c1ec66b283395c9df87701e93). + Integrate Tromp solver into miner code and remove its dependency on extra BLAKE2b implementation. + Minor edits to dnsseed-policy.md. + Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459 + Add help for -equihashsolver= option. + Assert that the Equihash solver is a supported option. + Repair check-security-hardening.sh. + Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459" + Fix race condition in rpc-tests/wallet_protectcoinbase.py. closes #1597 + Fix other potential race conditions similar to ref #1597 in RPC tests. + Update the error message string for tx version too low. ref #1600 + Static assertion that standard and network min tx versions are consistent. + Update comments in chainparams.cpp. + Update unit-tests documentation. closes #1530 + Address @str4d's comments on unit-tests doc. ref #1530 + Remove copyright entries for some files we deleted. + Update license text in README.md. closes #38 + Bump version numbers to 1.0.0-rc2. + +David Mercer (4): + explicitly pass HOST and BUILD to ./configure + allow both HOST and BUILD to be passed in from the zcutil/build.sh + pass in both HOST and BUILD to depends system, needed for deterministic builds + explicitly pass HOST and BUILD to libgmp ./configure + +Gregory Maxwell (1): + Only send one GetAddr response per connection. + +Jack Grigg (31): + Implement MappedShuffle for tracking the permutation of an array + Implement static method for creating a randomized JSDescription + Randomize JoinSplits in z_sendmany + Refactor test code to better test JSDescription::Randomized() + Remove stale comment + Rename libbitcoinconsensus to libzcashconsensus + Rename bitcoin-tx to zcash-tx + Remove the RC 1 block index error message + Disable wallet encryption + Add more assertions, throw if find_output params are invalid + Clear witness cache when re-witnessing notes + Add heights to log output + Throw an error when encryptwallet is disabled + Document that wallet encryption is disabled + Document another wallet encryption concern + Improve security documentation + Fix RPC tests that require wallet encryption + Add test that encryptwallet is disabled + Revert "Revert "Avoid boost::posix_time functions that have potential out-of-bounds read bugs. ref #1459"" + GBT: Support coinbasetxn instead of coinbasevalue + GBT: Add informational founders' reward value to coinbasetxn + GBT: Correct block header in proposals RPC test + GBT: Add RPC tests + Disallow v0 transactions as a consensus rule + Reject block versions lower than 4 + Regenerate genesis blocks with nVersion = 4 + Use tromp's solver to regenerate miner tests + Update tests for new genesis blocks + Enforce standard transaction rules on testnet + Update sighash tests for new consensus rule + Fix RPC test + +Jay Graber (7): + Rm bitcoin dev keys from gitian-downloader, add zcash dev keys + Rm bips.md + Update files.md for zcash + Update dnsseed-policy.md + Developer notes still relevant + Document RPC interface security assumptions in security-warnings.md + Update RPC interfaces warnings language + +Patrick Strateman (1): + CDataStream::ignore Throw exception instead of assert on negative nSize. + +Pieter Wuille (4): + Introduce constant for maximum CScript length + Treat overly long scriptPubKeys as unspendable + Fix OOM bug: UTXO entries with invalid script length + Add tests for CCoins deserialization + +Simon (17): + Fixes CID 1147436 uninitialized scalar field. + Fixes CID 1352706 uninitialized scalar field. + Fixes CID 1352698 uninitialized scalar field. + Fixes CID 1352687 uninitialized scalar field. + Fixes CID 1352715 uninitialized scalar field. + Fixes CID 1352686 uninitialized scalar variable. + Fixes CID 1352599 unitialized scalar variable + Fixes CID 1352727 uninitialized scalar variable. + Fixes CID 1352714 uninitialized scalar variable. + Add security warning about logging of z_* calls. + Add debug option "zrpcunsafe" to be used when logging more sensitive information such as the memo field of a note. + Closes #1583 by setting up the datadir for the wallet gtest. + Fix issue where z_sendmany is too strict and does not allow integer based amount e.g. 1 which is the same as 1.0 + Update test to use integer amount as well as decimal amount when calling z_sendmany + Fix build problem with coins_tests + Workaround g++ 5.x bug with brace enclosed initializer. + Patch backport of upstream 1588 as we don't (yet) use the NetMsgType namespace + +Wladimir J. van der Laan (1): + net: Ignore `notfound` P2P messages + diff --git a/doc/release-notes/release-notes-1.0.0-rc3.md b/doc/release-notes/release-notes-1.0.0-rc3.md new file mode 100644 index 000000000..863df2000 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc3.md @@ -0,0 +1,51 @@ +Chirag Davé (1): + fReopenDebugLog and fRequestShutdown should be type sig_atomic_t + +Daira Hopwood (9): + Refactor README docs to avoid duplication. + Fix licensing to comply with OpenSSL and Berkeley DB licenses. + Changes to upgrade bdb to 6.2.23 + util: Update tinyformat + Tweak descriptions of mining parameters for example zcash.conf. + Update dnsseeds for mainnet. closes #1369 + Minor update to release process. + Remove the override of nMaxTipAge that effectively disables it on testnet. + Update version numbers for rc3. + +Jack Grigg (2): + Disable metrics screen in performance-measurements.sh + Link to #826 in doc/security-warnings.md, link to new Security website page + +Joe Turgeon (2): + Fixing floating point exception caused by metrics. Using default column width unless in a TTY. + Adding handling for ioctl failure. Updates from code review in PR #1615. + +Kevin Gallagher (2): + Prefer sha256sum but fall back to shasum if not available + Adds libgomp1 to Debian package depends + +Louis Nyffenegger (1): + Fix typo in README.md + +Paige Peterson (3): + add zcash.config + fix per Jack's mod suggestions + fix per Daira's suggestions + +Pieter Wuille (3): + Include signal.h for sig_atomic_t in WIN32 + Revert "Include signal.h for sig_atomic_t in WIN32" + Use std::atomic for fRequestShutdown and fReopenDebugLog + +Sean Bowe (1): + Add manpages for zcashd and zcash-cli binaries for debian. + +Simon (4): + Fix incorrect error message in z_sendmany + Add z_sendmany rule that when sending coinbase utxos to a zaddr they must be consumed entirely, without any change, since there is currently no way to specify a change address in z_sendmany. + Add assert to AsyncRPCOperation_sendmany + Bump version number in sendalert.cpp + +bitcartel (1): + Update payment-api.md + diff --git a/doc/release-notes/release-notes-1.0.0-rc4.md b/doc/release-notes/release-notes-1.0.0-rc4.md new file mode 100644 index 000000000..0a51dfb92 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0-rc4.md @@ -0,0 +1,14 @@ +Daira Hopwood (3): + Update pchMessageStart for mainnet and testnet. + Update version numbers for 1.0.0-rc4. + Add release notes for 1.0.0-rc4. + +Jack Grigg (4): + Integrate production Founders' Reward keys + Remove Founders' Reward override from #1398 + Regenerate mainnet and testnet genesis blocks for nMaxTipAge change + Update tests for new genesis blocks + +Sean Bowe (1): + Zcash zk-SNARK public parameters for 1.0 "Sprout". + diff --git a/doc/release-notes/release-notes-1.0.0.md b/doc/release-notes/release-notes-1.0.0.md new file mode 100644 index 000000000..f95d53d4e --- /dev/null +++ b/doc/release-notes/release-notes-1.0.0.md @@ -0,0 +1,18 @@ +Jack Grigg (8): + Rework zcutil/build-debian-package.sh to place files correctly + Add lintian check to zcutil/build-debian-package.sh + Fix DEBIAN/control errors raised by lintian + Build libsnark with -march=x86-64 instead of -march=native + Disable the metrics screen on regtest + Add the Zcash genesis blocks + Update tests for new genesis blocks + Update version strings to 1.0.0 + +Kevin Gallagher (6): + Use fakeroot to build Debian package + Update Debian package maintainer scripts + Fixes executable mode of maintainer scripts + Add DEBIAN/rules file (required by policy) + Adds zcash.examples and zcash.manpages + Run Lintian after built package is copied to $SRC_PATH + diff --git a/doc/release-notes/release-notes-1.0.1.md b/doc/release-notes/release-notes-1.0.1.md new file mode 100644 index 000000000..8ee772bf7 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.1.md @@ -0,0 +1,34 @@ +Cameron Boehmer (1): + point "where do i begin?" readme link to 1.0 guide + +Jack Grigg (15): + Track mined blocks to detect and report orphans and mining revenue + Refresh mining status to detect setgenerate changes + Add network stats to metrics screen + Show mining info once the node has finished loading + Improve locking in metrics + Adjust consensus rule to accept genesis block without height in coinbase + Fix previous commit + Ensure that no tracked blocks are skipped during orphan detection + Add build scripts and fetch-params.sh to "make install" and "make dist" + Use uint64_t for AtomicCounter + Fix gtest issue introduced into master + Fix whitespace in Makefile.gtest.include + Initialise walletdb system in a temp dir for all gtests + Revert "Initialise walletdb system in a temp dir for all gtests" + Change execution order of gtests to avoid bug + +Kevin Gallagher (1): + Improves usability of fetch-params.sh + +Sean Bowe (6): + Properly account for joinsplit value when deciding if a transaction should be placed in a mined block. + Add checkpoint at block 2500. + Throw more descriptive exceptions when the constraint system is violated. + Test that a pure joinsplit will mine if other transactions are in the mempool. + 1.0.1 release. + Update man pages. + +Simon (1): + Closes #1746. Add rpc call z_validateaddress to validate zaddrs. + diff --git a/doc/release-notes/release-notes-1.0.10-1.md b/doc/release-notes/release-notes-1.0.10-1.md new file mode 100644 index 000000000..fea2f5156 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.10-1.md @@ -0,0 +1,11 @@ +Jack Grigg (1): + Disable building Proton in Gitian + +Sean Bowe (2): + Revert "Remove an unneeded version workaround as per @str4d's review comment." + Revert "Delete old protocol version constants and simplify code that used them." + +Simon Liu (2): + make-release.py: Versioning changes for 1.0.10-1. + make-release.py: Updated manpages for 1.0.10-1. + diff --git a/doc/release-notes/release-notes-1.0.10.md b/doc/release-notes/release-notes-1.0.10.md new file mode 100644 index 000000000..16d2a62ba --- /dev/null +++ b/doc/release-notes/release-notes-1.0.10.md @@ -0,0 +1,79 @@ +Notable changes +=============== + +Signature validation using libsecp256k1 +--------------------------------------- + +ECDSA signatures inside Zcash transactions now use validation using +[https://github.com/bitcoin/secp256k1](libsecp256k1) instead of OpenSSL. + +Depending on the platform, this means a significant speedup for raw signature +validation speed. The advantage is largest on x86_64, where validation is over +five times faster. In practice, this translates to a raw reindexing and new +block validation times that are less than half of what it was before. + +Libsecp256k1 has undergone very extensive testing and validation upstream. + +A side effect of this change is that libconsensus no longer depends on OpenSSL. + +Changelog +========= + +Boris Hajduk (1): + documentatin z_validateaddress was missing param + +Daira Hopwood (8): + Delete old protocol version constants and simplify code that used them. fixes #2244 + Remove an unneeded version workaround as per @str4d's review comment. + Remove unneeded lax ECDSA signature verification. + Strict DER signatures are always enforced; remove the flag and code that used it. + Repair tests for strict DER signatures. While we're at it, repair a similar test for CLTV, and make the repaired RPC tests run by default. + Make transaction test failures print the comments preceding the test JSON. + Fix a comment that was made stale before launch by #1016 (commit 542da61). + Delete test that is redundant and inapplicable to Zcash. + +Jack Grigg (20): + Fix incorrect locking in CCryptoKeyStore + Use AtomicTimer for metrics screen thread count + Revert "Fix secp256k1 test compilation" + Squashed 'src/secp256k1/' changes from 22f60a6..84973d3 + Fix potential overflows in ECDSA DER parsers + Rename FALLBACK_DOWNLOAD_PATH to PRIORITY_DOWNLOAD_PATH + Add test for incorrect consensus logic + Correct consensus logic in ContextualCheckInputs + Add comments + Update Debian copyright list + Specify ECDSA constant sizes as constants + Remove redundant `= 0` initialisations + Ensure that ECDSA constant sizes are correctly-sized + Add test for -mempooltxinputlimit + Hold an ECCVerifyHandle in zcash-gtest + Additional testing of -mempooltxinputlimit + Fix comment + Use sendfrom for both t-addr calls + make-release.py: Versioning changes for 1.0.10. + make-release.py: Updated manpages for 1.0.10. + +Kevin Pan (1): + "getblocktemplate" could work without wallet + +Pieter Wuille (2): + Update key.cpp to new secp256k1 API + Switch to libsecp256k1-based validation for ECDSA + +Simon Liu (5): + Fix intermediate vpub_new leakage in multi joinsplit tx (#1360) + Add option 'mempooltxinputlimit' so the mempool can reject a transaction based on the number of transparent inputs. + Check mempooltxinputlimit when creating a transaction to avoid local mempool rejection. + Partial revert & fix for commit 9e84b5a ; code block in wrong location. + Fix #b1eb4f2 so test checks sendfrom as originally intended. + +Wladimir J. van der Laan (2): + Use real number of cores for default -par, ignore virtual cores + Remove ChainParams::DefaultMinerThreads + +kozyilmaz (3): + [macOS] system linker does not support “--version” option but only “-v” + option to disable building libraries (zcutil/build.sh) + support per platform filename and hash setting for dependencies + diff --git a/doc/release-notes/release-notes-1.0.11-rc1.md b/doc/release-notes/release-notes-1.0.11-rc1.md new file mode 100644 index 000000000..4542a448c --- /dev/null +++ b/doc/release-notes/release-notes-1.0.11-rc1.md @@ -0,0 +1,44 @@ +Changelog +========= + +Ariel Gabizon (2): + make-release.py: Versioning changes for 1.0.11-rc1. + make-release.py: Updated manpages for 1.0.11-rc1. + +Daira Hopwood (7): + Clean up imports to be pyflakes-checkable. fixes #2450 + For unused variables reported by pyflakes, either remove the variable, suppress the warning, or fix a bug (if the wrong variable was used). refs #2450 + Cosmetics (trailing whitespace, comment conventions, etc.) + Alert 1004 (version 1.0.10 only) + Remove UPnP support. fixes #2500 + Change wording in Security Warnings section of README.md. + Document our criteria for adding CI workers. closes #2499 + +Jack Grigg (15): + Pull in temporary release notes during the release process + Ansible playbook for installing Zcash dependencies and Buildbot worker + Variable overrides for Debian, Ubuntu and Fedora + Variable overrides for FreeBSD + Simplify Python installation, inform user if they need to manually configure + Add test for issue #2444 + Add Buildbot worker setup to Ansible playbook + Add steps for setting up a latent worker on Amazon EC2 + Add pyblake2 to required Python modules + Remove Buildbot version from host file + Add a separate Buildbot host info template for EC2 + Add pyflakes to required Python modules + Add block download progress to metrics UI + Correct and extend EstimateNetHeightInner tests + Improve network height estimation + +Simon Liu (3): + Closes #2446 by adding generated field to listunspent. + Fixes #2519. When sending from a zaddr, minconf cannot be zero. + Fixes #2480. Null entry in map was dereferenced leading to a segfault. + +Wladimir J. van der Laan (1): + rpc: Add WWW-Authenticate header to 401 response + +practicalswift (1): + Net: Fix resource leak in ReadBinaryFile(...) + diff --git a/doc/release-notes/release-notes-1.0.11.md b/doc/release-notes/release-notes-1.0.11.md new file mode 100644 index 000000000..d5a12a222 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.11.md @@ -0,0 +1,47 @@ +Changelog +========= + +Ariel Gabizon (3): + make-release.py: Versioning changes for 1.0.11-rc1. + make-release.py: Updated manpages for 1.0.11-rc1. + make-release.py: Updated release notes and changelog for 1.0.11-rc1. + +Daira Hopwood (7): + Clean up imports to be pyflakes-checkable. fixes #2450 + For unused variables reported by pyflakes, either remove the variable, suppress the warning, or fix a bug (if the wrong variable was used). refs #2450 + Cosmetics (trailing whitespace, comment conventions, etc.) + Alert 1004 (version 1.0.10 only) + Remove UPnP support. fixes #2500 + Change wording in Security Warnings section of README.md. + Document our criteria for adding CI workers. closes #2499 + +Jack Grigg (17): + Pull in temporary release notes during the release process + Ansible playbook for installing Zcash dependencies and Buildbot worker + Variable overrides for Debian, Ubuntu and Fedora + Variable overrides for FreeBSD + Simplify Python installation, inform user if they need to manually configure + Add test for issue #2444 + Add Buildbot worker setup to Ansible playbook + Add steps for setting up a latent worker on Amazon EC2 + Add pyblake2 to required Python modules + Remove Buildbot version from host file + Add a separate Buildbot host info template for EC2 + Add pyflakes to required Python modules + Add block download progress to metrics UI + Correct and extend EstimateNetHeightInner tests + Improve network height estimation + make-release.py: Versioning changes for 1.0.11. + make-release.py: Updated manpages for 1.0.11. + +Simon Liu (3): + Closes #2446 by adding generated field to listunspent. + Fixes #2519. When sending from a zaddr, minconf cannot be zero. + Fixes #2480. Null entry in map was dereferenced leading to a segfault. + +Wladimir J. van der Laan (1): + rpc: Add WWW-Authenticate header to 401 response + +practicalswift (1): + Net: Fix resource leak in ReadBinaryFile(...) + diff --git a/doc/release-notes/release-notes-1.0.12-rc1.md b/doc/release-notes/release-notes-1.0.12-rc1.md new file mode 100644 index 000000000..27d36b7e7 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.12-rc1.md @@ -0,0 +1,57 @@ +Changelog +========= + +Ariel (1): + add examples to z_getoperationresult + +Ariel Gabizon (1): + add load-wallet benchmark + +Bjorn Hjortsberg (2): + Do not warn on built in declaration mismatch + Remove deprecated exception specification + +Jack Grigg (20): + ci-workers: Enable pipelining, and use root to set admin and host details + Variable overrides for Arch Linux + Rationalize currency unit to "ZEC" + ci-workers: Fail if Python is not version 2.7 + ci-workers: Variable overrides and process tweaks for CentOS 7 + Add build progress to the release script if progressbar module is available + Add hotfix support to release script + Document the hotfix release process + Enforce sequential hotfix versioning + Benchmark time to call sendtoaddress with many UTXOs + Fix bug in benchmark data generation script + Adjust instructions for UTXO dataset creation + Add GitHub release notes to release process + Clarify branching and force-building operations in hotfix process + Update user guide translations as part of release process + make-release.py: Send stderr to stdout + List dependencies for release script in release process doc + Additional test cases for importprivkey RPC test + make-release.py: Versioning changes for 1.0.12-rc1. + make-release.py: Updated manpages for 1.0.12-rc1. + +Jason Davies (1): + Fix deprecation policy comment. + +Nathan Wilcox (5): + key_import_export rpc-test: verify that UTXO view co-evolves for nodes sharing a key. + Add a new rpc-test-specified requirement: `importprivkey` outputs the associated address. (Test fails.) + [tests pass] Output address on new key import. + Add a new requirement that `importprivkey` API is idempotent. + [tests pass] Ensure `importprivkey` outputs the address in case key is already imported. + +Ross Nicoll (1): + Rationalize currency unit to "BTC" + +Simon Liu (3): + Closes #2583. Exclude watch-only utxos from z_sendmany coin selection. + Set up a clean chain. Delete redundant method wait_until_miner_sees() via use of sync_all(). + Implement RPC shield_coinbase #2448. + +kpcyrd (2): + Fetch params from ipfs if possible + Prefer wget over ipfs + diff --git a/doc/release-notes/release-notes-1.0.12.md b/doc/release-notes/release-notes-1.0.12.md new file mode 100644 index 000000000..6aa6cd651 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.12.md @@ -0,0 +1,65 @@ +Changelog +========= + +Ariel (1): + add examples to z_getoperationresult + +Ariel Gabizon (1): + add load-wallet benchmark + +Bjorn Hjortsberg (2): + Do not warn on built in declaration mismatch + Remove deprecated exception specification + +Jack Grigg (26): + ci-workers: Enable pipelining, and use root to set admin and host details + Variable overrides for Arch Linux + Rationalize currency unit to "ZEC" + ci-workers: Fail if Python is not version 2.7 + ci-workers: Variable overrides and process tweaks for CentOS 7 + Add build progress to the release script if progressbar module is available + Add hotfix support to release script + Document the hotfix release process + Enforce sequential hotfix versioning + Benchmark time to call sendtoaddress with many UTXOs + Fix bug in benchmark data generation script + Adjust instructions for UTXO dataset creation + Add GitHub release notes to release process + Clarify branching and force-building operations in hotfix process + Update user guide translations as part of release process + make-release.py: Send stderr to stdout + List dependencies for release script in release process doc + Additional test cases for importprivkey RPC test + make-release.py: Versioning changes for 1.0.12-rc1. + make-release.py: Updated manpages for 1.0.12-rc1. + make-release.py: Updated release notes and changelog for 1.0.12-rc1. + Fix pyflakes warnings in RPC tests + Individualise performance-measurements.sh errors for debugging + Fix incorrect failure in memory benchmark + make-release.py: Versioning changes for 1.0.12. + make-release.py: Updated manpages for 1.0.12. + +Jason Davies (1): + Fix deprecation policy comment. + +Nathan Wilcox (5): + key_import_export rpc-test: verify that UTXO view co-evolves for nodes sharing a key. + Add a new rpc-test-specified requirement: `importprivkey` outputs the associated address. (Test fails.) + [tests pass] Output address on new key import. + Add a new requirement that `importprivkey` API is idempotent. + [tests pass] Ensure `importprivkey` outputs the address in case key is already imported. + +Ross Nicoll (1): + Rationalize currency unit to "BTC" + +Simon Liu (5): + Closes #2583. Exclude watch-only utxos from z_sendmany coin selection. + Set up a clean chain. Delete redundant method wait_until_miner_sees() via use of sync_all(). + Implement RPC shield_coinbase #2448. + Update which lock to synchronize on when calling GetBestAnchor(). + Closes #2637. Make z_shieldcoinbase an experimental feature where it can be enabled with: zcashd -experimentalfeatures -zshieldcoinbase. + +kpcyrd (2): + Fetch params from ipfs if possible + Prefer wget over ipfs + diff --git a/doc/release-notes/release-notes-1.0.13-rc1.md b/doc/release-notes/release-notes-1.0.13-rc1.md new file mode 100644 index 000000000..4d8a37a7c --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13-rc1.md @@ -0,0 +1,88 @@ +Changelog +========= + +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (37): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks + +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + diff --git a/doc/release-notes/release-notes-1.0.13-rc2.md b/doc/release-notes/release-notes-1.0.13-rc2.md new file mode 100644 index 000000000..6ade7d922 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13-rc2.md @@ -0,0 +1,95 @@ +Changelog +========= + +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (44): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + make-release.py: Updated release notes and changelog for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks + Move libsnark from DIST_SUBDIRS into EXTRA_DIST + Pass correct dependencies path to libsnark from both Gitian and build.sh + Mark libsnark includes as library includes + Add the tar-pax option to automake + make-release.py: Versioning changes for 1.0.13-rc2. + make-release.py: Updated manpages for 1.0.13-rc2. + +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + diff --git a/doc/release-notes/release-notes-1.0.13.md b/doc/release-notes/release-notes-1.0.13.md new file mode 100644 index 000000000..3a1a950a9 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.13.md @@ -0,0 +1,98 @@ +Changelog +========= + +Ariel Gabizon (1): + boost::format -> tinyformat + +Bruno Arueira (1): + Removes out bitcoin mention in favor for zcash + +Cory Fields (1): + httpserver: explicitly detach worker threads + +Duke Leto (1): + Update performance-measurements.sh + +Jack Grigg (47): + Squashed 'src/snark/' content from commit 9ada3f8 + Add libsnark compile flag to not copy DEPINST to PREFIX + Add Ansible playbook for grind workers + Add connections in BIP65 and BIP66 tests to the test manager + Add benchmark for listunspent + [Test] MiniNode: Implement JSDescription parsing + [Test] MiniNode: Implement v2 CTransaction parsing + [Test] MiniNode: Implement Zcash block parsing + [Test] MiniNode: Update protocol version and network magics + [Test] MiniNode: Use Zcash PoW + [Test] MiniNode: Fix coinbase creation + [Test] MiniNode: Coerce OP_PUSHDATA bytearrays to bytes + [Test] MiniNode: Implement Zcash coinbase + Fix BIP65 and BIP66 tests + Un-indent RPC test output in test runner + Replace full-test-suite.sh with a new test suite driver script + Move ensure-no-dot-so-in-depends.py into full_test_suite.py + Move check-security-hardening.sh into full_test_suite.py + Add memory benchmark for validatelargetx + Migrate libsnark test code to Google Test + Remove test code corresponding to removed code + Add alt_bn128 to QAP and Merkle tree gadget tests + Update libsnark LDLIBS + Add "make check" to libsnark that runs the Google Tests + Add "make libsnark-tests" that runs libsnark's "make check" + Changes to get test_r1cs_ppzksnark passing + Add bitcoin-util-test.py to full_test_suite.py + Add stdout notice if any stage fails + Add libsnark to "make clean" + Ensure that libsnark is built first, so its headers are available + Remove OpenSSL libraries from libsnark LDLIBS + Add libsnark tests to full_test_suite.py + Add --list-stages argument to full_test_suite.py + Fix NPE in rpc_wallet_tests + make-release.py: Versioning changes for 1.0.13-rc1. + make-release.py: Updated manpages for 1.0.13-rc1. + make-release.py: Updated release notes and changelog for 1.0.13-rc1. + Change auto-senescence cycle to 16 weeks + Move libsnark from DIST_SUBDIRS into EXTRA_DIST + Pass correct dependencies path to libsnark from both Gitian and build.sh + Mark libsnark includes as library includes + Add the tar-pax option to automake + make-release.py: Versioning changes for 1.0.13-rc2. + make-release.py: Updated manpages for 1.0.13-rc2. + make-release.py: Updated release notes and changelog for 1.0.13-rc2. + make-release.py: Versioning changes for 1.0.13. + make-release.py: Updated manpages for 1.0.13. + +Jason Davies (1): + Replace "bitcoin" with "Zcash". + +Jay Graber (1): + s/zcash/Zcash + +Jonathan "Duke" Leto (1): + Fix bug where performance-measurements.sh fails hards when given no args + +João Barbosa (1): + Improve shutdown process + +Sean Bowe (5): + Remove libsnark from depends system and integrate it into build system. + Remove crusty old "loadVerifyingKey"/"loadProvingKey" APIs and associated invariants. + Refactor proof generation function. + Add streaming prover. + Integrate low memory prover. + +Simon Liu (7): + Replace 'bitcoin address' with 'zcash address'. + Closes #2639. z_shieldcoinbase is now supported, no longer experimental. + Closes #2263 fixing broken pipe error. + Closes #2576. Update link to security info on z.cash website. + Closes #2639. Adds optional limit parameter with a default value of 50. + Fix an issue where qa test wallet_shieldcoinbase could hang. + Add payment disclosure as experimental feature. + +Wladimir J. van der Laan (4): + Make HTTP server shutdown more graceful + http: Wait for worker threads to exit + http: Force-exit event loop after predefined time + http: speed up shutdown + diff --git a/doc/release-notes/release-notes-1.0.14-rc1.md b/doc/release-notes/release-notes-1.0.14-rc1.md new file mode 100644 index 000000000..1654bf483 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.14-rc1.md @@ -0,0 +1,156 @@ +Notable changes +=============== + +Incoming viewing keys +--------------------- + +Support for incoming viewing keys, as described in +[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), +has been added to the wallet. + +Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a +z-address in a node's wallet. For Sprout z-addresses, these always begin with +"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import +these into another node. + +A node that possesses an incoming viewing key for a z-address can view all past +transactions received by that address, as well as all future transactions sent +to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the +address. This is similar to the behaviour of "watch-only" t-addresses. + +`z_gettotalbalance` now has an additional boolean parameter for including the +balance of "watch-only" addresses (both transparent and shielded), which is set +to `false` by default. `z_getbalance` has also been updated to work with +watch-only addresses. + +- **Caution:** for z-addresses, these balances will **not** be accurate if any + funds have been sent from the address. This is because incoming viewing keys + cannot detect spends, and so the "balance" is just the sum of all received + notes, including ones that have been spent. Some future use-cases for incoming + viewing keys will include synchronization data to keep their balances accurate + (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). + +Changelog +========= + +Anthony Towns (1): + Add configure check for -latomic + +Cory Fields (12): + c++11: don't throw from the reverselock destructor + c++11: CAccountingEntry must be defined before use in a list + c++11: fix libbdb build against libc++ in c++11 mode + depends: use c++11 + depends: bump OSX toolchain + build: Split hardening/fPIE options out + build: define base filenames for use elsewhere in the buildsystem + build: quiet annoying warnings without adding new ones + build: fix Windows builds without pkg-config + build: force a c++ standard to be specified + build: warn about variable length arrays + build: add --enable-werror option + +Jack Grigg (36): + Squashed 'src/secp256k1/' changes from 84973d3..6ad5cdb + Use g-prefixed coreutils commands if they are available + Replace hard-coded defaults for HOST and BUILD with config.guess + Remove manual -std=c++11 flag + Replace "install -D" with "mkdir -p && install" + Check if OpenMP is available before using it + [libsnark] Use POSIX-compliant ar arguments + Include endian-ness compatibility layer in Equihash implementation + build: Split hardening/fPIE options out in Zcash-specific binaries + Change --enable-werror to apply to all warnings, use it in build.sh + Move Zcash flags into configure.ac + ViewingKey -> ReceivingKey per zcash/zips#117 + Implement viewing key storage in the keystore + Factor out common logic from CZCPaymentAddress and CZCSpendingKey + Track net value entering and exiting the Sprout circuit + Add Sprout value pool to getblock and getblockchaininfo + Apply -fstack-protector-all to libsnark + Add Rust and Proton to configure options printout + Clarify operator precedence in serialization of nSproutValue + Remove nSproutValue TODO from CDiskBlockIndex + Add Base58 encoding of viewing keys + Implement viewing key storage in the wallet + Add RPC methods for exporting/importing viewing keys + Update wallet logic to account for viewing keys + Add watch-only support to Zcash RPC methods + Modify zcrawkeygen RPC method to set "zcviewingkey" to the viewing key + Cleanup: Add braces for clarity + Add cautions to z_getbalance and z_gettotalbalance help text about viewing keys + Add release notes for incoming viewing keys + Create release notes starting from the previous non-beta non-RC release + release-notes.py: Remove unnecessary parameter + Regenerate previous release notes to conform to new format + Exclude beta and RC release notes from author tallies + Fix pyflakes warnings in zkey_import_export RPC test + make-release.py: Versioning changes for 1.0.14-rc1. + make-release.py: Updated manpages for 1.0.14-rc1. + +Jay Graber (3): + Add cli and rpc examples for z_sendmany + Fix cli help result for z_shieldcoinbase + Add rpc test that exercises z_importkey + +Jonas Schnelli (1): + Add compile and link options echo to configure + +Luke Dashjr (4): + depends: Use curl for fetching on Linux + Travis: Use curl rather than wget for Mac SDK + Bugfix: depends/Travis: Use --location (follow redirects) and --fail [on HTTP error response] with curl + Travis: Use Blue Box VMs for IPv6 loopback support + +MarcoFalke (2): + Fix url in .travis.yml + [depends] builders: No need to set -L and --location for curl + +Per Grön (2): + Deduplicate test utility method wait_and_assert_operationid_status + Print result of RPC call in test only when PYTHON_DEBUG is set + +René Nyffenegger (1): + Use AC_ARG_VAR to set ARFLAGS. + +Simon Liu (5): + RPC dumpwallet and z_exportwallet updated to no longer allow overwriting an existing file. + Add documentation for shielding coinbase utxos. + Add documentation for payment disclosure. + Closes #2759. Fixes broken pipe error with QA test wallet.py. + Closes #2746. Payment disclosure blobs now use 'zpd:' prefix. + +Wladimir J. van der Laan (6): + build: Enable C++11 build, require C++11 compiler + build: update ax_cxx_compile_stdcxx to serial 4 + test: Remove java comparison tool + build: Remove check for `openssl/ec.h` + devtools: Check for high-entropy ASLR in 64-bit PE executables + build: supply `-Wl,--high-entropy-va` + +daniel (1): + add powerpc build support for openssl lib + +fanquake (3): + [build-aux] Update Boost & check macros to latest serials + [depends] Add -stdlib=libc++ to darwin CXX flags + [depends] Set OSX_MIN_VERSION to 10.8 + +kozyilmaz (1): + empty spaces in PATH variable cause build failure + +syd (13): + Upgrade googletest to 1.8.0 + Get the sec-hard tests to run correctly. + Update libsodium from 1.0.11 to 1.0.15 + Remove Boost conditional compilation. + Update to address @daira comments wrt fixing configure.ac + Get rid of consensus.fPowAllowMinDifficultyBlocks. + Don't compile libgtest.a when building libsnark. + Add gtests to .gitignore + Get rid of fp3 from libsnark, it is not used. + InitGoogleMock instead of InitGoogleTest per CR + Get rid of underscore prefixes for include guards. + Rename bash completion files so that they refer to zcash and not bitcoin. + Fix libsnark test failure. + diff --git a/doc/release-notes/release-notes-1.0.14.md b/doc/release-notes/release-notes-1.0.14.md new file mode 100644 index 000000000..4b9cd0810 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.14.md @@ -0,0 +1,160 @@ +Notable changes +=============== + +Incoming viewing keys +--------------------- + +Support for incoming viewing keys, as described in +[the Zcash protocol spec](https://github.com/zcash/zips/blob/master/protocol/protocol.pdf), +has been added to the wallet. + +Use the `z_exportviewingkey` RPC method to obtain the incoming viewing key for a +z-address in a node's wallet. For Sprout z-addresses, these always begin with +"ZiVK" (or "ZiVt" for testnet z-addresses). Use `z_importviewingkey` to import +these into another node. + +A node that possesses an incoming viewing key for a z-address can view all past +transactions received by that address, as well as all future transactions sent +to it, by using `z_listreceivedbyaddress`. They cannot spend any funds from the +address. This is similar to the behaviour of "watch-only" t-addresses. + +`z_gettotalbalance` now has an additional boolean parameter for including the +balance of "watch-only" addresses (both transparent and shielded), which is set +to `false` by default. `z_getbalance` has also been updated to work with +watch-only addresses. + +- **Caution:** for z-addresses, these balances will **not** be accurate if any + funds have been sent from the address. This is because incoming viewing keys + cannot detect spends, and so the "balance" is just the sum of all received + notes, including ones that have been spent. Some future use-cases for incoming + viewing keys will include synchronization data to keep their balances accurate + (e.g. [#2542](https://github.com/zcash/zcash/issues/2542)). + +Changelog +========= + +Anthony Towns (1): + Add configure check for -latomic + +Cory Fields (12): + c++11: don't throw from the reverselock destructor + c++11: CAccountingEntry must be defined before use in a list + c++11: fix libbdb build against libc++ in c++11 mode + depends: use c++11 + depends: bump OSX toolchain + build: Split hardening/fPIE options out + build: define base filenames for use elsewhere in the buildsystem + build: quiet annoying warnings without adding new ones + build: fix Windows builds without pkg-config + build: force a c++ standard to be specified + build: warn about variable length arrays + build: add --enable-werror option + +Jack Grigg (40): + Squashed 'src/secp256k1/' changes from 84973d3..6ad5cdb + Use g-prefixed coreutils commands if they are available + Replace hard-coded defaults for HOST and BUILD with config.guess + Remove manual -std=c++11 flag + Replace "install -D" with "mkdir -p && install" + Check if OpenMP is available before using it + [libsnark] Use POSIX-compliant ar arguments + Include endian-ness compatibility layer in Equihash implementation + build: Split hardening/fPIE options out in Zcash-specific binaries + Change --enable-werror to apply to all warnings, use it in build.sh + Move Zcash flags into configure.ac + ViewingKey -> ReceivingKey per zcash/zips#117 + Implement viewing key storage in the keystore + Factor out common logic from CZCPaymentAddress and CZCSpendingKey + Track net value entering and exiting the Sprout circuit + Add Sprout value pool to getblock and getblockchaininfo + Apply -fstack-protector-all to libsnark + Add Rust and Proton to configure options printout + Clarify operator precedence in serialization of nSproutValue + Remove nSproutValue TODO from CDiskBlockIndex + Add Base58 encoding of viewing keys + Implement viewing key storage in the wallet + Add RPC methods for exporting/importing viewing keys + Update wallet logic to account for viewing keys + Add watch-only support to Zcash RPC methods + Modify zcrawkeygen RPC method to set "zcviewingkey" to the viewing key + Cleanup: Add braces for clarity + Add cautions to z_getbalance and z_gettotalbalance help text about viewing keys + Add release notes for incoming viewing keys + Create release notes starting from the previous non-beta non-RC release + release-notes.py: Remove unnecessary parameter + Regenerate previous release notes to conform to new format + Exclude beta and RC release notes from author tallies + Fix pyflakes warnings in zkey_import_export RPC test + make-release.py: Versioning changes for 1.0.14-rc1. + make-release.py: Updated manpages for 1.0.14-rc1. + make-release.py: Updated release notes and changelog for 1.0.14-rc1. + Update release process + make-release.py: Versioning changes for 1.0.14. + make-release.py: Updated manpages for 1.0.14. + +Jay Graber (3): + Add cli and rpc examples for z_sendmany + Fix cli help result for z_shieldcoinbase + Add rpc test that exercises z_importkey + +Jonas Schnelli (1): + Add compile and link options echo to configure + +Luke Dashjr (4): + depends: Use curl for fetching on Linux + Travis: Use curl rather than wget for Mac SDK + Bugfix: depends/Travis: Use --location (follow redirects) and --fail [on HTTP error response] with curl + Travis: Use Blue Box VMs for IPv6 loopback support + +MarcoFalke (2): + Fix url in .travis.yml + [depends] builders: No need to set -L and --location for curl + +Per Grön (2): + Deduplicate test utility method wait_and_assert_operationid_status + Print result of RPC call in test only when PYTHON_DEBUG is set + +René Nyffenegger (1): + Use AC_ARG_VAR to set ARFLAGS. + +Simon Liu (5): + RPC dumpwallet and z_exportwallet updated to no longer allow overwriting an existing file. + Add documentation for shielding coinbase utxos. + Add documentation for payment disclosure. + Closes #2759. Fixes broken pipe error with QA test wallet.py. + Closes #2746. Payment disclosure blobs now use 'zpd:' prefix. + +Wladimir J. van der Laan (6): + build: Enable C++11 build, require C++11 compiler + build: update ax_cxx_compile_stdcxx to serial 4 + test: Remove java comparison tool + build: Remove check for `openssl/ec.h` + devtools: Check for high-entropy ASLR in 64-bit PE executables + build: supply `-Wl,--high-entropy-va` + +daniel (1): + add powerpc build support for openssl lib + +fanquake (3): + [build-aux] Update Boost & check macros to latest serials + [depends] Add -stdlib=libc++ to darwin CXX flags + [depends] Set OSX_MIN_VERSION to 10.8 + +kozyilmaz (1): + empty spaces in PATH variable cause build failure + +syd (13): + Upgrade googletest to 1.8.0 + Get the sec-hard tests to run correctly. + Update libsodium from 1.0.11 to 1.0.15 + Remove Boost conditional compilation. + Update to address @daira comments wrt fixing configure.ac + Get rid of consensus.fPowAllowMinDifficultyBlocks. + Don't compile libgtest.a when building libsnark. + Add gtests to .gitignore + Get rid of fp3 from libsnark, it is not used. + InitGoogleMock instead of InitGoogleTest per CR + Get rid of underscore prefixes for include guards. + Rename bash completion files so that they refer to zcash and not bitcoin. + Fix libsnark test failure. + diff --git a/doc/release-notes/release-notes-1.0.15-rc1.md b/doc/release-notes/release-notes-1.0.15-rc1.md new file mode 100644 index 000000000..b4b0b2f0a --- /dev/null +++ b/doc/release-notes/release-notes-1.0.15-rc1.md @@ -0,0 +1,165 @@ +Notable changes +=============== + +UTXO and note merging +--------------------- + +In order to simplify the process of combining many small UTXOs and notes into a +few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges +funds from t-addresses, z-addresses, or both, and sends them to a single +t-address or z-address. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +UTXO memory accounting +---------------------- + +The default -dbcache has been changed in this release to 450MiB. Users can set -dbcache to a higher value (e.g. to keep the UTXO set more fully cached in memory). Users on low-memory systems (such as systems with 1GB or less) should consider specifying a lower value for this parameter. + +Additional information relating to running on low-memory systems can be found here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). + +Changelog +========= + +21E14 (1): + Remove obsolete reference to CValidationState from UpdateCoins. + +Alex Morcos (1): + Implement helper class for CTxMemPoolEntry constructor + +Ariel (2): + add blake2b writer + update SignatureHash according to Overwinter spec + +Ashley Holman (1): + TxMemPool: Change mapTx to a boost::multi_index_container + +Cory Fields (2): + chainparams: move CCheckpointData into chainparams.h + chainparams: don't use std namespace + +Daniel Kraft (1): + Clean up chainparams some more. + +Jack Grigg (38): + Scope the ECDSA constant sizes to CPubKey / CKey classes + Enable Bash completion for -exportdir + Check chainValueZat when checking value pool monitoring + Add missing namespace for boost::get + Add viewing key prefix to regtest parameters + zkey_import_export: Synchronize mempools before mining + Use JoinSplitTestingSetup for Boost sighash tests + Network upgrade activation mechanism + Allow changing network upgrade parameters on regtest + Test network upgrade logic + Adjust rewind logic to use the network upgrade mechanism + Add Overwinter to upgrade list + Add method for fetching the next activation height after a given block height + Use a boost::optional for nCachedBranchId + Change UI/log status message for block rewinding + Update quote from ZIP 200 + Update SignatureHash tests for transaction format changes + Implement roll-back limit for reorganisation + Add rollback limit to block index rewinding + Remove mempool transactions which commit to an unmineable branch ID + Remove P2WPKH and P2WSH from signing logic + Add consensus branch ID parameter to SignatureHash, remove SigVersion parameter + Cleanup: Wrap function arguments + Regenerate SignatureHash tests + Make number of inputs configurable in validatelargetx test + Use v3 transactions with caching for validatelargetx benchmark + Extend CWallet::GetFilteredNotes to enable filtering on a set of addresses + Add branch IDs for current and next block to getblockchaininfo + Check Equihash solution when loading block index + Implement z_mergetoaddress for combining UTXOs and notes + Gate z_mergetoaddress as an experimental feature + Add z_mergetoaddress to release notes + Check upgrade status in wallet_overwintertx RPC test + Document that consensus.chaintip != consensus.nextblock just before an upgrade + Regenerate sighash tests + wallet_mergetoaddress: Add additional syncs to prevent race conditions + make-release.py: Versioning changes for 1.0.15-rc1. + make-release.py: Updated manpages for 1.0.15-rc1. + +Jay Graber (8): + Add getdeprecationinfo rpc call to return current version and deprecation block height. + Make applicable only on mainnet + Add upgrades field to RPC call getblockchaininfo + Implement transaction expiry for Overwinter + Add -txexpirydelta cli option + Add mempool_tx_expiry.py test + Add expiry to z_mergetoaddress + Change rpc_tests to 21 + +Jonas Nick (1): + Reduce unnecessary hashing in signrawtransaction + +Jorge Timón (3): + Chainparams: Introduce CreateGenesisBlock() static function + Chainparams: CTestNetParams and CRegTestParams extend directly from CChainParams + Mempool: Use Consensus::CheckTxInputs direclty over main::CheckInputs + +Marius Kjærstad (1): + Changed http:// to https:// on some links + +Mark Friedenbach (1): + Explicitly set tx.nVersion for the genesis block and mining tests + +Matt Corallo (5): + Add failing test checking timelocked-txn removal during reorg + Fix removal of time-locked transactions during reorg + Fix comment in removeForReorg + Make indentation in ActivateBestChainStep readable + removeForReorg calls once-per-disconnect-> once-per-reorg + +Maxwell Gubler (1): + Fix syntax examples for z_importwallet and export + +Nicolas DORIER (1): + Unit test for sighash caching + +Pavel Vasin (1): + remove unused NOBLKS_VERSION_{START,END} constants + +Pieter Wuille (8): + Add rewind logic to deal with post-fork software updates + Support -checkmempool=N, which runs checks on average once every N transactions + Report non-mandatory script failures correctly + Refactor script validation to observe amounts + BIP143: Verification logic + BIP143: Signing logic + Precompute sighashes + Rename to PrecomputedTransactionData + +Simon Liu (11): + Fixes #2793. Backport commit f33afd3 to increase dbcache default. + Add documentation about dbcache. + Add note about dbcache to 1.0.15 release notes. + Remove redundant service flag NODE_GETUTXO meant for Bitcoin XT. + Implementation of Overwinter transaction format ZIP 202. + Add test to check malformed v1 transaction against Overwinter tx parser + Closes #2964. z_sendmany once again makes v1 tx for taddr to taddr. + Closes #2954 and #2959. Fixes Overwinter issues in sighash_tests. + Add field nProtocolVersion to struct NetworkUpgrade. + Overwinter peer management and network handshaking. + Add python qa test overwinter_peer_management. + +Suhas Daftuar (3): + Track coinbase spends in CTxMemPoolEntry + Don't call removeForReorg if DisconnectTip fails + Fix removeForReorg to use MedianTimePast + +jc (1): + read hashReserved from disk block index + +syd (2): + Fix libsnark dependency build. + Remove OSX and Windows files from Makefile + share directory. + diff --git a/doc/release-notes/release-notes-1.0.15.md b/doc/release-notes/release-notes-1.0.15.md new file mode 100644 index 000000000..3195c955a --- /dev/null +++ b/doc/release-notes/release-notes-1.0.15.md @@ -0,0 +1,209 @@ +Notable changes +=============== + +Overwinter network upgrade +-------------------------- + +The code preparations for the Overwinter network upgrade, as described in [ZIP +200](https://github.com/zcash/zips/blob/master/zip-0200.rst), [ZIP +201](https://github.com/zcash/zips/blob/master/zip-0201.rst), [ZIP +202](https://github.com/zcash/zips/blob/master/zip-0202.rst), [ZIP +203](https://github.com/zcash/zips/blob/master/zip-0203.rst), and [ZIP +143](https://github.com/zcash/zips/blob/master/zip-0143.rst) are +finished and included in this release. Overwinter will activate on testnet at +height 207500, and can also be activated at a specific height in regtest mode +by setting the config option `-nuparams=5ba81b19:HEIGHT`. + +However, because the Overwinter activation height is not yet specified for +mainnet, version 1.0.15 will behave similarly as other pre-Overwinter releases +even after a future activation of Overwinter on the network. Upgrading from +1.0.15 will be required in order to follow the Overwinter network upgrade on +mainnet. + +Overwinter transaction format +----------------------------- + +Once Overwinter has activated, transactions must use the new v3 format +(including coinbase transactions). All RPC methods that create new transactions +(such as `createrawtransaction` and `getblocktemplate`) will create v3 +transactions once the Overwinter activation height has been reached. + +Overwinter transaction expiry +----------------------------- + +Overwinter transactions created by `zcashd` will also have a default expiry +height set (the block height after which the transaction becomes invalid) of 20 +blocks after the height of the next block. This can be configured with the +config option `-txexpirydelta`. + +UTXO and note merging +--------------------- + +In order to simplify the process of combining many small UTXOs and notes into a +few larger ones, a new RPC method `z_mergetoaddress` has been added. It merges +funds from t-addresses, z-addresses, or both, and sends them to a single +t-address or z-address. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +UTXO memory accounting +---------------------- + +The default `-dbcache` has been changed in this release to 450MiB. Users can set +`-dbcache` to a higher value (e.g. to keep the UTXO set more fully cached in +memory). Users on low-memory systems (such as systems with 1GB or less) should +consider specifying a lower value for this parameter. + +Additional information relating to running on low-memory systems can be found +here: [reducing-memory-usage.md](https://github.com/zcash/zcash/blob/master/doc/reducing-memory-usage.md). + +Changelog +========= + +21E14 (1): + Remove obsolete reference to CValidationState from UpdateCoins. + +Alex Morcos (1): + Implement helper class for CTxMemPoolEntry constructor + +Ariel (2): + add blake2b writer + update SignatureHash according to Overwinter spec + +Ashley Holman (1): + TxMemPool: Change mapTx to a boost::multi_index_container + +Cory Fields (2): + chainparams: move CCheckpointData into chainparams.h + chainparams: don't use std namespace + +Daniel Kraft (1): + Clean up chainparams some more. + +Jack Grigg (43): + Scope the ECDSA constant sizes to CPubKey / CKey classes + Enable Bash completion for -exportdir + Check chainValueZat when checking value pool monitoring + Add missing namespace for boost::get + Add viewing key prefix to regtest parameters + zkey_import_export: Synchronize mempools before mining + Use JoinSplitTestingSetup for Boost sighash tests + Network upgrade activation mechanism + Allow changing network upgrade parameters on regtest + Test network upgrade logic + Adjust rewind logic to use the network upgrade mechanism + Add Overwinter to upgrade list + Add method for fetching the next activation height after a given block height + Use a boost::optional for nCachedBranchId + Change UI/log status message for block rewinding + Update quote from ZIP 200 + Update SignatureHash tests for transaction format changes + Implement roll-back limit for reorganisation + Add rollback limit to block index rewinding + Remove mempool transactions which commit to an unmineable branch ID + Remove P2WPKH and P2WSH from signing logic + Add consensus branch ID parameter to SignatureHash, remove SigVersion parameter + Cleanup: Wrap function arguments + Regenerate SignatureHash tests + Make number of inputs configurable in validatelargetx test + Use v3 transactions with caching for validatelargetx benchmark + Extend CWallet::GetFilteredNotes to enable filtering on a set of addresses + Add branch IDs for current and next block to getblockchaininfo + Check Equihash solution when loading block index + Implement z_mergetoaddress for combining UTXOs and notes + Gate z_mergetoaddress as an experimental feature + Add z_mergetoaddress to release notes + Check upgrade status in wallet_overwintertx RPC test + Document that consensus.chaintip != consensus.nextblock just before an upgrade + Regenerate sighash tests + wallet_mergetoaddress: Add additional syncs to prevent race conditions + make-release.py: Versioning changes for 1.0.15-rc1. + make-release.py: Updated manpages for 1.0.15-rc1. + make-release.py: Updated release notes and changelog for 1.0.15-rc1. + Use block hash comparison for consistency check when loading block index + Overwinter release notes and testnet activation height + make-release.py: Versioning changes for 1.0.15. + make-release.py: Updated manpages for 1.0.15. + +Jay Graber (8): + Add getdeprecationinfo rpc call to return current version and deprecation block height. + Make applicable only on mainnet + Add upgrades field to RPC call getblockchaininfo + Implement transaction expiry for Overwinter + Add -txexpirydelta cli option + Add mempool_tx_expiry.py test + Add expiry to z_mergetoaddress + Change rpc_tests to 21 + +Jonas Nick (1): + Reduce unnecessary hashing in signrawtransaction + +Jorge Timón (3): + Chainparams: Introduce CreateGenesisBlock() static function + Chainparams: CTestNetParams and CRegTestParams extend directly from CChainParams + Mempool: Use Consensus::CheckTxInputs direclty over main::CheckInputs + +Marius Kjærstad (1): + Changed http:// to https:// on some links + +Mark Friedenbach (1): + Explicitly set tx.nVersion for the genesis block and mining tests + +Matt Corallo (5): + Add failing test checking timelocked-txn removal during reorg + Fix removal of time-locked transactions during reorg + Fix comment in removeForReorg + Make indentation in ActivateBestChainStep readable + removeForReorg calls once-per-disconnect-> once-per-reorg + +Maxwell Gubler (1): + Fix syntax examples for z_importwallet and export + +Nicolas DORIER (1): + Unit test for sighash caching + +Pavel Vasin (1): + remove unused NOBLKS_VERSION_{START,END} constants + +Pieter Wuille (8): + Add rewind logic to deal with post-fork software updates + Support -checkmempool=N, which runs checks on average once every N transactions + Report non-mandatory script failures correctly + Refactor script validation to observe amounts + BIP143: Verification logic + BIP143: Signing logic + Precompute sighashes + Rename to PrecomputedTransactionData + +Simon Liu (11): + Fixes #2793. Backport commit f33afd3 to increase dbcache default. + Add documentation about dbcache. + Add note about dbcache to 1.0.15 release notes. + Remove redundant service flag NODE_GETUTXO meant for Bitcoin XT. + Implementation of Overwinter transaction format ZIP 202. + Add test to check malformed v1 transaction against Overwinter tx parser + Closes #2964. z_sendmany once again makes v1 tx for taddr to taddr. + Closes #2954 and #2959. Fixes Overwinter issues in sighash_tests. + Add field nProtocolVersion to struct NetworkUpgrade. + Overwinter peer management and network handshaking. + Add python qa test overwinter_peer_management. + +Suhas Daftuar (3): + Track coinbase spends in CTxMemPoolEntry + Don't call removeForReorg if DisconnectTip fails + Fix removeForReorg to use MedianTimePast + +jc (1): + read hashReserved from disk block index + +syd (2): + Fix libsnark dependency build. + Remove OSX and Windows files from Makefile + share directory. + diff --git a/doc/release-notes/release-notes-1.0.2.md b/doc/release-notes/release-notes-1.0.2.md new file mode 100644 index 000000000..2625cb909 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.2.md @@ -0,0 +1,16 @@ +ITH4Coinomia (2): + Update security-warnings.md + Update init.cpp + +S. Matthew English (1): + enforcing consistency 'tor' to 'Tor' + +Sean Bowe (1): + Write R1CS output to file in GenerateParams. + +Simon (4): + Fixes #1762 segfault when miner is interrupted. + Fixes #1779 so that sending to multiple zaddrs no longer fails. + Add GenIdentity, an identity function for MappedShuffle. + Add transaction size and zaddr output limit checks to z_sendmany. + diff --git a/doc/release-notes/release-notes-1.0.3.md b/doc/release-notes/release-notes-1.0.3.md new file mode 100644 index 000000000..ae4e25b25 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.3.md @@ -0,0 +1,35 @@ +Jack Grigg (5): + Add --disable-tests flag to zcutils/build.sh + Correctly set CNoteData::witnessHeight when decrementing witness caches + Copy over CNoteData::witnessHeight when updating wallet tx + Add code comments about CNoteData::witnessHeight + Clear witnessHeight and nWitnessCacheSize in ClearNoteWitnessCache + +Jay Graber (4): + Document z_sendmany error code messages in payment-api.md + s/Bitcoin/Zcash in JSONRPCError + Change format of z_sendmany error code documentation. + Release-notes.py script to generate release notes and add contributors to authors.md + +Sean Bowe (7): + Regression test for constraint system violation. + Improve accuracy of constraint system violation diagnostics. + Add tests for witness `element` and tree `last` methods. Strengthen testing by inserting a different commitment into the tree at each step. + Initialize after profiling messages are suppressed. + Process verification keys to perform online verification. + Add test that `last` and `element` will throw exception when the tree is blank. + Anchors and nullifiers should always be inherited from the parent cache. + +Simon (8): + Closes #1833. Format currency amounts in z_sendmany error message. + Closes #1680, temporary fix for rpc deadlock inherited from upstream. + Set default minrelaytxfee to 1000 zatoshis to match upstream. + Mempool will accept tx with joinsplits and the default z_sendmany fee. + Track the correct change witness across chained joinsplits + Closes #1854. z_sendmany selects more utxos to avoid dust change output. + Partial revert of bd87e8c: file release-notes-1.0.2.md to 343b0d6. + Fix threading issue when initializing public params. + +ayleph (1): + Correct spelling error in z_sendmany error output + diff --git a/doc/release-notes/release-notes-1.0.4.md b/doc/release-notes/release-notes-1.0.4.md new file mode 100644 index 000000000..1cb73c393 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.4.md @@ -0,0 +1,75 @@ +Bitcoin Error Log (1): + Edit for grammar: "block chain" + +Christian von Roques (1): + bash-completion: Adapt for 0.12 and 0.13 + +Jack Grigg (32): + Add getlocalsolps and getnetworksolps RPC calls, show them in getmininginfo + Add benchmark for attempting decryption of notes + Add benchmark for incrementing note witnesses + Add -metricsui flag to toggle between persistent screen and rolling metrics + Add -metricsrefreshtime option + Only show metrics by default if stdout is a TTY + Document metrics screen options + Clarify that metrics options are only useful without -daemon and -printtoconsole + Increase length of metrics divider + Write witness caches when writing the best block + Apply miniupnpc patches to enable compilation on Solaris 11 + Add an upstream miniupnpc patch revision + Address review comments, tweak strings + Change function names to not clash with Bitcoin, apply to correct binaries + Add bash completion files to Debian package + Always bash-complete the default account + Add Zcash RPC commands to CLI argument completion + Document behaviour of CWallet::SetBestChain + Fix indentation + Generate JS for trydecryptnotes, make number of addresses a variable + Add JS to second block to ensure witnesses are incremented + Skip JoinSplit verification before the last checkpoint + Add a reindex test that fails because of a bug in decrementing witness caches + Make the test pass by fixing the bug! + Only check cache validity for witnesses being incremented or decremented + Fix bug in wallet tests + Extract block-generation wallet test code into a function + Rewrite reindex test to check beyond the max witness cache size + Fix bug in IncrementNoteWitness() + Update payment API docs to recommend -rescan for fixing witness errors + Update version to 1.0.4 + Update man pages + +Jay Graber (2): + Replace bitcoin with zcash in rpcprotocol.cpp + Gather release notes from previous release to HEAD + +Jeffrey Walton (1): + Add porter dev overrides for CC, CXX, MAKE, BUILD, HOST + +Scott (1): + Metrics - Don't exclaim unless > 1 + +Sean Bowe (8): + Isolate verification to a `ProofVerifier` context object that allows verification behavior to be tuned by the caller. + Regression test. + Ensure cache contains valid entry when anchor is popped. + Ensure ProofVerifier cannot be accidentally copied. + Rename Dummy to Disabled. + Add more tests for ProofVerifier. + ASSERT_TRUE -> ASSERT_FALSE + Check that E' points are actually in G2 by ensuring they are of order r. + +Simon Liu (8): + Fix stale comment referencing upstream block interval + Add checkpoint at block height 15000 + Closes #1857. Fixes bug where tx spending only notes had priority of 0. + Closes #1901. Increase default settings for the max block size when mining and the amount of space available for priority transactions. + Closes #1903. Add fee parameter to z_sendmany. + Fixes #1823. Witness anchors for input notes no longer cross block boundaries. + Increase timeout as laptops on battery power have cpu throttling. + WitnessAnchorData only needs to store one witness per JSOutPoint. + +lpescher (3): + Make command line option to show all debugging consistent with similar options + Update documentation to match the #4219 change + Update help message to match the #4219 change + diff --git a/doc/release-notes/release-notes-1.0.5.md b/doc/release-notes/release-notes-1.0.5.md new file mode 100644 index 000000000..7e2c6e1c8 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.5.md @@ -0,0 +1,58 @@ +Eran Tromer (1): + CreateJoinSplit: add start_profiling() call + +Jack Grigg (22): + Extend createjoinsplit to benchmark parallel JoinSplits + Add total number of commitments to getblockchaininfo + Only enable getblocktemplate when wallet is enabled + Only run wallet tests when wallet is enabled + Add a tool for profiling the creation of JoinSplits + Exclude test binaries from make install + Scan the whole chain whenever a z-key is imported + Instruct users to run zcash-fetch-params if network params aren't available + Trigger metrics UI refresh on new messages + Strip out the SECURE flag in metrics UI so message style is detected + Handle newlines in UI messages + Suggest ./zcutil/fetch-params.sh as well + Update debug categories + Rename build-aux/m4/bitcoin_find_bdb48.m4 to remove version + Throw an error if zcash.conf is missing + Show a friendly message explaining why zcashd needs a zcash.conf + Fix gtest ordering broken by #1949 + Debian package lint + Generate Debian control file to fix shlibs lint + Create empty zcash.conf during performance measurements + Create empty zcash.conf during coverage checks + Coverage build system tweaks + +Jay Graber (1): + Update release process to check in with users who opened resolved issues + +Paige Peterson (2): + Create ISSUE_TEMPLATE.md + move template to subdirectory, fix typo, include prompt under describing issue section, include uploading file directly to github ticket as option for sharing logs + +Sean Bowe (4): + Add test for IncrementalMerkleTree::size(). + Add 'CreateJoinSplit' standalone utility to gitignore. + Add test for z_importkey rescanning from beginning of chain. + Bump version to 1.0.5. + +Simon Liu (13): + Fixes #1964 to catch general exception in z_sendmany and catch exceptions as reference-to-const. + Fixes #1967 by adding age of note to z_sendmany logging. + Fixes a bug where the unsigned transaction was logged by z_sendmany after a successful sign and send, meaning that the logged hash fragment would be different from the txid logged by "AddToWallet". This issue occured when sending from transparent addresses, as utxo inputs must be signed. It did not occur when sending from shielded addresses. + Bump COPYRIGHT_YEAR from 2016 to 2017. + Closes #1780. Result of z_getoperationstatus now sorted by creation time of operation + Remove UTF-8 BOM efbbbf from zcash.conf to avoid problems with command line tools + Closes #1097 so zcash-cli now displays license info like zcashd. + Fixes #1497 ZCA-009 by restricting data exporting to user defined folder. + Closes #1957 by adding tx serialization size to listtransactions output. + Fixes #1960: z_getoperationstatus/result now includes operation details. + Update walletbackup.py qa test to use -exportdir option + Add missing header required by std::accumulate + Increase timeout for z_sendmany transaction in wallet.py qa test + +Wladimir J. van der Laan (1): + rpc: Implement random-cookie based authentication + diff --git a/doc/release-notes/release-notes-1.0.6.md b/doc/release-notes/release-notes-1.0.6.md new file mode 100644 index 000000000..c1ae03605 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.6.md @@ -0,0 +1,148 @@ +Cory Fields (4): + Depends: Add ZeroMQ package + travis: install a recent libzmq and pyzmq for tests + build: Make use of ZMQ_CFLAGS + build: match upstream build change + +Daira Hopwood (2): + Better error reporting for the !ENABLE_WALLET && ENABLE_MINING case. + Address @str4d's comment about the case where -gen is not set. Also avoid shadowing mineToLocalWallet variable. + +Daniel Cousens (3): + init: amend ZMQ flag names + init: add zmq to debug categories + zmq: prepend zmq to debug messages + +Jack Grigg (33): + Update comment + Remove OpenSSL PRNG reseeding + Address review comments + Fix linking error in CreateJoinSplit + Add compile flag to disable compilation of mining code + Upgrade OpenSSL to 1.1.0d + Show all JoinSplit components in getrawtransaction and decoderawtransaction + Use a more specific exception class for note decryption failure + Switch miner to P2PKH, add -mineraddress option + Update help text for mining options + Correct #ifdef nesting of miner headers and helper functions + Add ZMQ libs to zcash-gtest + Fix python syntax in ZMQ RPC test + [qa] py2: Unfiddle strings into bytes explicitly in ZMQ RPC test + Bitcoin -> Zcash in ZMQ docs + Add ZeroMQ license to contrib/debian/copyright + [depends] ZeroMQ 4.2.1 + Clarify that user only needs libzmq if not using depends system + Bump suggested ZMQ Debian package to 4.1 series + Add -minetolocalwallet flag, enforced on -mineraddress + Add test to check for presence of vpub_old & vpub_new in getrawtransaction + Add a flag for enabling experimental features + Require -experimentalmode for wallet encryption + Migrate Zcash-specific code to UniValue + Manually iterate over UniValue arrays in tests + Remove JSON Spirit from contrib/debian/copyright + unsigned int -> size_t for comparing with UniValue.size() + [cleanup] Remove unused import + [cleanup] Simplify test code + Squashed 'src/univalue/' content from commit 9ef5b78 + Update UniValue includes in Zcash-specific code + UniValue::getValues const reference + Get rid of fPlus argument to FormatMoney in Zcash-specific code + +Jeff Garzik (4): + Add ZeroMQ support. Notify blocks and transactions via ZeroMQ + UniValue: prefer .size() to .count(), to harmonize w/ existing tree + UniValue: export NullUniValue global constant + Convert tree to using univalue. Eliminate all json_spirit uses. + +Johnathan Corgan (5): + zmq: require version 4.x or newer of libzmq + zmq: update and cleanup build-unix, release-notes, and zmq docs + autotools: move checking for zmq library to common area in configure.ac + zmq: update docs to reflect feature is compiled in automatically if possible + zmq: point API link to 4.0 as that is what we are conforming to [Trivial] + +Jonas Schnelli (24): + QA: Add ZeroMQ RPC test + depends: fix platform specific packages variable + [travis] add zmq python module + use CBlockIndex* insted of uint256 for UpdatedBlockTip signal + [ZMQ] refactor message string + [ZMQ] append a message sequence number to every ZMQ notification + fix rpc-tests.sh + extend conversion to UniValue + expicit set UniValue type to avoid empty values + special threatment for null,true,false because they are non valid json + univalue: add support for real, fix percision and make it json_spirit compatible + univalue: correct bool support + fix rpc unit test, plain numbers are not JSON compatible object + remove JSON Spirit UniValue wrapper + Remove JSON Spirit wrapper, remove JSON Spirit leftovers + fix rpc batching univalue issue + fix missing univalue types during constructing + fix univalue json parse tests + univalue: add type check unit tests + fix util_tests.cpp clang warnings + fix rpcmining/getblocktemplate univalue transition logic error + remove univalue, prepare for subtree + [Univalue] add univalue over subtree + remove $(@F) and subdirs from univalue make + +João Barbosa (2): + Add UpdatedBlockTip signal to CMainSignals and CValidationInterface + Fix ZMQ Notification initialization and shutdown + +Paragon Initiative Enterprises, LLC (1): + Use libsodium's CSPRNG instead of OpenSSL's + +Scott (1): + Update random.h + +Sean Bowe (3): + Bump protocol version in release process if necessary. + Fix use after free in transaction_tests. + Update libsnark. + +Simon Liu (16): + Closes #2057 by adding extra zrpcunsafe logging + Update z_sendmany logging + Add test to verify z_sendmany logging + Update test to verify order of zrpcunsafe log messages + Closes #2045 by allowing z_sendmany with 0 fee + Closes #2024 by documenting and testing method field in z_getoperationstatus + Add parameter interaction, where zrpcunsafe implies zrpc + Update zrpc vs zrpcunsafe logging in z_sendmany operation + Add test for z_sendmany with fee of 0 + Update test to check for more joinsplit related fields in getrawtransaction + Add comment about fix for #2026. + Update test to check for updated error messages in AmountFromValue(). + Bump version to 1.0.6 as part of release process + Debian man pages updated as part of release process + Update release notes as part of release process + Update debian changelog as part of release process + +Wladimir J. van der Laan (10): + Simplify RPCclient, adapt json_parse_error test + util: Add ParseInt64 and ParseDouble functions + univalue: add strict type checking + Don't go through double in AmountFromValue and ValueFromAmount + Get rid of fPlus argument to FormatMoney + Changes necessary now that zero values accepted in AmountFromValue + rpc: Accept scientific notation for monetary amounts in JSON + rpc: Make ValueFromAmount always return 8 decimals + univalue: Avoid unnecessary roundtrip through double for numbers + util: use locale-independent parsing in ParseDouble + +fanquake (3): + [depends] zeromq 4.0.7 + [depends] ZeroMQ 4.1.4 + [depends] ZeroMQ 4.1.5 + +isle2983 (1): + [copyright] add MIT License copyright header to zmq_sub.py + +mrbandrews (1): + Fixes ZMQ startup with bad arguments. + +paveljanik (1): + [Trivial] start the help texts with lowercase + diff --git a/doc/release-notes/release-notes-1.0.7-1.md b/doc/release-notes/release-notes-1.0.7-1.md new file mode 100644 index 000000000..6474eb628 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.7-1.md @@ -0,0 +1,4 @@ +Jay Graber (3): + Add -t to git fetch for release-notes.py + Update version to 1.0.7-1 + Update auto-generated manpages to 1.0.7-1 diff --git a/doc/release-notes/release-notes-1.0.7.md b/doc/release-notes/release-notes-1.0.7.md new file mode 100644 index 000000000..94681f0d8 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.7.md @@ -0,0 +1,165 @@ +Adam Weiss (1): + Buffer log messages and explicitly open logs + +Alex van der Peet (1): + New RPC command disconnectnode + +Allan Niemerg (1): + Pause mining during joinsplit creation + +Casey Rodarmor (1): + Don't share objects between TestInstances + +Cory Fields (2): + locking: teach Clang's -Wthread-safety to cope with our scoped lock macros + locking: add a quick example of GUARDED_BY + +Daira Hopwood (1): + Don't assume sizes of unsigned short and unsigned int in GetSizeOfCompactSize and WriteCompactSize. Fixes #2137 + +Daniel Kraft (1): + Fix univalue handling of \u0000 characters. + +Florian Schmaus (1): + Add BITCOIND_SIGTERM_TIMEOUT to OpenRC init scripts + +Forrest Voight (1): + When processing RPC commands during warmup phase, parse the request object before returning an error so that id value can be used in the response. + +Gavin Andresen (2): + configure --enable-debug changes + Testing infrastructure: mocktime fixes + +Jack Grigg (11): + Remove reference to -reindex-chainstate + Treat metrics screen as non-interactive for now + Adjust gen-manpages.sh for Zcash, use in Debian builds + Regenerate and collate Zcash manpages, delete Bitcoin ones + Update release process with gen-manpages.sh + Adjust blockheaderToJSON() for Zcash block header + Adjust fundrawtransaction RPC test for Zcash + Re-encode t-addrs in disablewallet.py with Zcash prefixes + BTC -> ZEC in paytxfee RPC docs + Update default RPC port in help strings + Fix typo in listbanned RPC keys + +Jay Graber (4): + Add rpc test for prioritisetransaction + Inc num of txs in test mempool + Update release to 1.0.7, generate manpages + Add 1.0.7 release notes and update authors.md + +Jonas Schnelli (23): + [net] extend core functionallity for ban/unban/listban + [RPC] add setban/listbanned/clearbanned RPC commands + [QA] add setban/listbanned/clearbanned tests + [net] remove unused return type bool from CNode::Ban() + [RPC] extend setban to allow subnets + rename json field "bannedtill" to "banned_until" + setban: rewrite to UniValue, allow absolute bantime + fix CSubNet comparison operator + setban: add RPCErrorCode + add RPC tests for setban & disconnectnode + fix missing lock in CNode::ClearBanned() + setban: add IPv6 tests + fix lock issue for QT node diconnect and RPC disconnectnode + fundrawtransaction tests + UniValue: don't escape solidus, keep espacing of reverse solidus + [REST] add JSON support for /rest/headers/ + [QA] fix possible reorg issue in rawtransaction.py/fundrawtransaction.py RPC test + [QA] remove rawtransactions.py from the extended test list + [QA] add testcases for parsing strings as values + [bitcoin-cli] improve error output + fix and extend CBitcoinExtKeyBase template + extend bip32 tests to cover Base58c/CExtKey decode + don't try to decode invalid encoded ext keys + +Jorge Timón (1): + Consensus: Refactor: Separate Consensus::CheckTxInputs and GetSpendHeight in CheckInputs + +Leo Arias (1): + Fix the path to the example configuration + +Luke Dashjr (1): + Fix various warnings + +Matt Corallo (4): + Small tweaks to CCoinControl for fundrawtransaction + Add FundTransaction method to wallet + Add fundrawtransaction RPC method + Assert on probable deadlocks if the second lock isnt try_lock + +Murilo Santana (1): + Fix sha256sum on busybox by using -c instead of --check + +Paul Georgiou (1): + Update Linearize tool to support Windows paths + +Pavel Vasin (1): + remove unused inv from ConnectTip() + +Peter Todd (2): + Add getblockheader RPC call + Improve comment explaining purpose of MAX_MONEY constant + +Philip Kaufmann (3): + use const references where appropriate + [init] add -blockversion help and extend -upnp help + make CAddrMan::size() return the correct type of size_t + +Pieter Wuille (3): + Do not ask a UI question from bitcoind + Add DummySignatureCreator which just creates zeroed sigs + Reduce checkpoints' effect on consensus. + +Simon Liu (14): + Alert 1000 + Alert 1001 + Add assert to check alert message length is valid + Fix bug where test was generating but not saving keys to wallet on disk. + Update founders reward addresses for testnet + Keep first three original testnet fr addresses so existing coinbase transactions on testnet remain valid during upgrade. New addresses will be used starting from block 53127. + Closes #2083 and #2088. Update release process documentation + Closes #2084. Fix incorrect year in timestamp. + Closes #2112 where z_getoperationresult could return stale status. + Add mainnet checkpoint at block 67500 + Add testnet checkpoint at block 38000 + Closes #1969. Default fee now sufficient for large shielded tx. + Part of #1969. Changing min fee calculation also changes the dust threshold. + Part of #1969. Update tests to avoid error 'absurdly high fee' from change in min fee calc. + +Stephen (1): + Add paytxfee to getwalletinfo, warnings to getnetworkinfo + +Wladimir J. van der Laan (10): + rpc: make `gettxoutsettinfo` run lock-free + test: Move reindex test to standard tests + rpc: Remove chain-specific RequireRPCPassword + univalue: Avoid unnecessary roundtrip through double for numbers + rpc: Accept strings in AmountFromValue + Fix crash in validateaddress with -disablewallet + Improve proxy initialization + tests: Extend RPC proxy tests + build: Remove -DBOOST_SPIRIT_THREADSAFE + tests: Fix bitcoin-tx signing testcase + +dexX7 (1): + Return all available information via validateaddress + +mruddy (1): + add tests for the decodescript rpc. add mention of the rpc regression tests to the testing seciton of the main readme. + +nomnombtc (9): + add script to generate manpages with help2man + add gen-manpages.sh description to README.md + add autogenerated manpages by help2man + add doc/man/Makefile.am to include manpages + add doc/man to subdir if configure flag --enable-man is set + add conditional for --enable-man, default is yes + change help string --enable-man to --disable-man + regenerated all manpages with commit tag stripped, also add bitcoin-tx + improved gen-manpages.sh, includes bitcoin-tx and strips commit tag, now also runs binaries from build dir by default, added variables for more control + +zathras-crypto (1): + Exempt unspendable transaction outputs from dust checks + diff --git a/doc/release-notes/release-notes-1.0.8-1.md b/doc/release-notes/release-notes-1.0.8-1.md new file mode 100644 index 000000000..4650f552c --- /dev/null +++ b/doc/release-notes/release-notes-1.0.8-1.md @@ -0,0 +1,16 @@ +Daira Hopwood (3): + Don't rely on a finite upper bound on fee rate or priority. + Simplify JoinSplit priority calculation. refs 1896 + Add check for JoinSplit priority as calculated by CCoinsViewCache::GetPriority. + +Jack Grigg (1): + Use a larger -rpcclienttimeout for slow performance measurements + +Nathan Wilcox (2): + Bump version numbers for v1.0.8-1. + Commit the changes from gen-manpages.sh, except manually tweak the version strings. + +str4d (2): + Update tests to check actual infinity as well as INF_FEERATE + Add unit test for security issue 2017-04-11.a + diff --git a/doc/release-notes/release-notes-1.0.8.md b/doc/release-notes/release-notes-1.0.8.md new file mode 100644 index 000000000..7d6460c88 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.8.md @@ -0,0 +1,170 @@ +Adam Brown (1): + [doc] Update port in tor.md + +Bob McElrath (1): + Add explicit shared_ptr constructor due to C++11 error + +Cory Fields (2): + libevent: add depends + libevent: Windows reuseaddr workaround in depends + +Daira Hopwood (15): + Remove src/qt. + License updates for removal of src/qt. + Correct license text for LGPL. + Remove QT gunk from Makefiles. + Remove some more QT-related stragglers. + Update documentation for QT removal. + Update which libraries are allowed to be linked to zcashd by symbol-check.py. + Remove NO_QT make option. + .gitignore cache/ and venv-mnf/ + Remove unused packages and patches. + Delete -rootcertificates from bash completion script. + Line-wrap privacy notice. Use <> around URL and end sentence with '.'. Include privacy notice in help text for zcashd -help. + Update version numbers. + Improvement to release process doc. + Generate man pages. + +Daniel Cousens (1): + torcontrol: only output disconnect if -debug=tor + +Gregory Maxwell (3): + Avoid a compile error on hosts with libevent too old for EVENT_LOG_WARN. + Do not absolutely protect local peers from eviction. + Decide eviction group ties based on time. + +Ian Kelling (1): + Docs: add details to -rpcclienttimeout doc + +Jack Gavigan (2): + Removed markdown from COPYING + Updated the Bitcoin Core copyright statement + +Jack Grigg (25): + Add anchor to output of getblock + Migrate IncrementalMerkleTree memory usage calls + Add tests for getmempoolinfo + Usability improvements for z_importkey + Implement an AtomicTimer + Use AtomicTimer for more accurate local solution rate + Metrics: Move local solution rate into stats + Metrics: Improve mining status + Expand on reasons for mining being paused + Simplify z_importkey by making rescan a string + Revert "Closes #1680, temporary fix for rpc deadlock inherited from upstream." + Add libevent to zcash-gtest + [depends] libevent 2.1.8 + Test boolean fallback in z_importkey + Require that z_importkey height parameter be in valid range + Update LocalSolPS test + Add AtomicTimer tests + Revert "Revert "rpc-tests: re-enable rpc-tests for Windows"" + Wrap error string + Fix typo + torcontrol: Improve comments + torcontrol: Add unit tests for Tor reply parsers + torcontrol: Fix ParseTorReplyMapping + torcontrol: Check for reading errors in ReadBinaryFile + torcontrol: Log invalid parameters in Tor reply strings where meaningful + +Jay Graber (5): + Document returned results of submitblock + Edit release-process.md for clarity + Add security warning to zcash-cli --help and --version message output + Add security warning to zcashd metrics display + Add security message to license text, rm url from translation string + +Jonas Schnelli (1): + Fix torcontrol.cpp unused private field warning + +Karl-Johan Alm (4): + Added std::unique_ptr<> wrappers with deleters for libevent modules. + Switched bitcoin-cli.cpp to use RAII unique pointers with deleters. + Added some simple tests for the RAII-style events. + Added EVENT_CFLAGS to test makefile to explicitly include libevent headers. + +Luke Dashjr (1): + Skip RAII event tests if libevent is built without event_set_mem_functions + +MarcoFalke (2): + [doc] [tor] Clarify when to use bind + torcontrol debug: Change to a blanket message that covers both cases + +Matt Quinn (1): + Consolidate individual references to the current maximum peer connection value of 125 into a single constant declaration. + +Nathaniel Mahieu (1): + Clarify documentation for running a tor node + +Patrick Strateman (1): + Remove vfReachable and modify IsReachable to only use vfLimited. + +Pavel Janík (3): + Implement REST mempool API, add test and documentation. + Prevent -Wshadow warnings with gcc versions 4.8.5, 5.3.1 and 6.2.1. + Make some global variables less-global (static) + +Peter Todd (2): + Better error message if Tor version too old + Connect to Tor hidden services by default + +Pieter Wuille (3): + Implement accurate memory accounting for mempool + Separate core memory usage computation in core_memusage.h + Fix interrupted HTTP RPC connection workaround for Python 3.5+ + +Sean Bowe (2): + Introduce librustzcash and Rust to depends system. + Allow Rust-language related assets to be disabled with `--disable-rust`. + +Simon Liu (4): + Remove stale Qt comments and dead code + Remove QT translation support files + Remove redundant gui options from build scripts + Closes #2186. RPC getblock now accepts height or hash. + +Wladimir J. van der Laan (28): + doc: remove documentation for rpcssl + qa: Remove -rpckeepalive tests from httpbasics + Remove rpc_boostasiotocnetaddr test + build: build-system changes for libevent + tests: GET requests cannot have request body, use POST in rest.py + evhttpd implementation + Implement RPCTimerHandler for Qt RPC console + Document options for new HTTP/RPC server in --help + Fix race condition between starting HTTP server thread and setting EventBase() + Move windows socket init to utility function + Revert "rpc-tests: re-enable rpc-tests for Windows" + init: Ignore SIGPIPE + http: Disable libevent debug logging, if not explicitly enabled + rpc: Split option -rpctimeout into -rpcservertimeout and -rpcclienttimeout + Make RPC tests cope with server-side timeout between requests + chain: define enum used as bit field as uint32_t + auto_ptr → unique_ptr + bitcoin-cli: More detailed error reporting + depends: Add libevent compatibility patch for windows + bitcoin-cli: Make error message less confusing + test: Avoid ConnectionResetErrors during RPC tests + net: Automatically create hidden service, listen on Tor + torcontrol improvements and fixes + doc: update docs for Tor listening + tests: Disable Tor interaction + Fix memleak in TorController [rework] + tor: Change auth order to only use HASHEDPASSWORD if -torpassword + torcontrol: Explicitly request RSA1024 private key + +calebogden (1): + Fixing typos on security-check.py and torcontrol.cpp + +fanquake (1): + [depends] libevent 2.1.7rc + +instagibbs (1): + Add common failure cases for rpc server connection failure + +paveljanik (1): + [TRIVIAL] Fix typo: exactmath -> exactmatch + +unsystemizer (1): + Clarify `listenonion` + diff --git a/doc/release-notes/release-notes-1.0.9.md b/doc/release-notes/release-notes-1.0.9.md new file mode 100644 index 000000000..a1335ec97 --- /dev/null +++ b/doc/release-notes/release-notes-1.0.9.md @@ -0,0 +1,90 @@ +Amgad Abdelhafez (2): + Update timedata.cpp + Update timedata.cpp + +Daira Hopwood (4): + Fix an error reporting bug due to BrokenPipeError and ConnectionResetError not existing in Python 2. refs #2263 + Alert 1002 (versions 1.0.0-1.0.2 inclusive). + Alert 1003 (versions 1.0.3-1.0.8 inclusive). + Disable building Proton by default. + +Jack Grigg (14): + Fix prioritisetransaction RPC test + torcontrol: Handle escapes in Tor QuotedStrings + torcontrol: Add missing copyright header + Convert Zcash versions to Debian format + [manpage] Handle build numbers in versions + Address Daira's comments + Address Daira's further comments + Correctly handle three-digit octals with leading digit 4-7 + Check that >3-digit octals are truncated. + Implement automatic shutdown of deprecated Zcash versions + Wrap messages nicely on metrics screen + Regenerate miner tests + Add a benchmark for calling ConnectBlock on a block with many inputs + Remove additional sources of determinism from benchmark archive + +Jay Graber (2): + Change help text examples to use Zcash addresses + Poll on getblocktemplate result rather than use bare sleep to avoid race condition. + +Nathan Wilcox (39): + [Direct master commit] Fix a release snafu in debian version string. + Show toolchain versions in build.sh. + Start on a make-release.py script; currently just arg parsing and unittests [unittests fail]. + Update version spec by altering test; also update regex to pass single 0 digits in major/minor/patch. + Add another case from debian-style versions. + Add all of the zcash release tags in my current repo as positive test vector. + Add support for beta/rc release versions. + Add version sorting, assert that RELEASE_PREV is the most recent release. + Make SystemExit errors less redundant in output; verify clean git status on master. + Always run unittests prior to actual runs. + Make --help output clean by not running self-test. + Add an option to run against a different repo directory. + Make sure to pull the latest master. + Exit instead of raising an unexpected exception, since it's already logged. + Implement `PathPatcher` abstraction, `clientversion.h` rewrite, and build numbering w/ unittests. + Implement the IS_RELEASE rule for betas. + Generalize buildnum patching for both `clientversion.h` and `configure.ac`. + Modify the `APPROX_RELEASE_HEIGHT`. + Remove portions of `./doc/release-process.md` now implemented in `make-release.py`. + Switch from `sh_out_logged` to `sh_log`. + Shorten the arg log line. + Commit the version changes and build. + Generate manpages; commit that; improve error output in sh_log. + Polish logging a bit more. + Tidy up / systematize logging output a bit more. + First full-release-branch version of script; rewrite large swatch of release-process.md. [Manually tested.] + Enable set -u mode. + Fix a variable name typo. + Reuse zcash_rpc. + Do not use `-rpcwait` on all `zcash_rpc` invocations, only block when starting zcashd. + Fix `release-process.md` doc usage for `make-release.py` to have correct arguments and order. + Include release version in commit comments. + Examine all future versions which are assumed to follow the same Version parser schema. + Consider both beta and rc versions to be `IS_RELEASE == false`. + Add a few more version strings to positive parser test. + Define the deprecation policy for 1.0.9. + Clarify that the feature is automated *shutdown*. + make-release.py: Versioning changes for 1.0.9. + make-release.py: Updated manpages for 1.0.9. + +Paige Peterson (4): + wallet backup instructions + typo and rewording edits + str4d and Ariel's suggestions + specify exportdir being within homedirectory + +Sean Bowe (1): + Check that pairings work properly when the G1 point is at infinity. + +Simon Liu (5): + Add AMQP 1.0 support via Apache Qpid Proton C++ API 0.17.0 + Add --disable-proton flag to build.sh. Proton has build/linker issues with gcc 4.9.2 and requires gcc 5.x. + Fix proton build issue with debian jessie, as used on CI servers. + Change regtest port to 18344. Closes #2269. + Patch to build Proton with minimal dependencies. + +emilrus (1): + Replace bitcoind with zcashd + diff --git a/doc/release-notes/release-notes-1.1.0-rc1.md b/doc/release-notes/release-notes-1.1.0-rc1.md new file mode 100644 index 000000000..a769b97cf --- /dev/null +++ b/doc/release-notes/release-notes-1.1.0-rc1.md @@ -0,0 +1,180 @@ +Notable changes +=============== + +`-mempooltxinputlimit` deprecation +---------------------------------- + +The configuration option `-mempooltxinputlimit` was added in release 1.0.10 as a +short-term fix for the quadratic hashing problem inherited from Bitcoin. At the +time, transactions with many inputs were causing performance issues for miners. +Since then, several performance improvements have been merged from the Bitcoin +Core codebase that significantly reduce these issues. + +The Overwinter network upgrade includes changes that solve the quadratic hashing +problem, and so `-mempooltxinputlimit` will no longer be needed - a transaction +with 1000 inputs will take just as long to validate as 10 transactions with 100 +inputs each. Starting from this release, `-mempooltxinputlimit` will be enforced +before the Overwinter activation height is reached, but will be ignored once +Overwinter activates. The option will be removed entirely in a future release +after Overwinter has activated. + +`NODE_BLOOM` service bit +------------------------ + +Support for the `NODE_BLOOM` service bit, as described in [BIP +111](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki), has been +added to the P2P protocol code. + +BIP 111 defines a service bit to allow peers to advertise that they support +Bloom filters (such as used by SPV clients) explicitly. It also bumps the protocol +version to allow peers to identify old nodes which allow Bloom filtering of the +connection despite lacking the new service bit. + +In this version, it is only enforced for peers that send protocol versions +`>=170004`. For the next major version it is planned that this restriction will be +removed. It is recommended to update SPV clients to check for the `NODE_BLOOM` +service bit for nodes that report version 170004 or newer. + +Changelog +========= + +Brad Miller (2): + Clean up + Implement note locking for z_mergetoaddress + +Charlie O'Keefe (1): + Add filename and sha256 hash for windows rust package + +Daira Hopwood (5): + Squashed commit of the following: + pyflakes cleanups to RPC tests after Overwinter PRs. + Add support for Overwinter v3 transactions to mininode framework. + Test that receiving an expired transaction does not increase the peer's ban score. + Don't increase banscore if the transaction only just expired. + +Daniel Kraft (1): + trivial: use constants for db keys + +Jack Grigg (43): + Add environment variable for setting ./configure flags in zcutil/build.sh + Add configure flags for enabling ASan/UBSan and TSan + Split declaration and definition of SPROUT_BRANCH_ID constant + Add link to Overwinter info page + Notify users about auto-senescence via -alertnotify + test: Move wait_and_assert_operationid_status debug output before asserts + Don't require RELRO and BIND_NOW for Darwin + Only set multicore flags if OpenMP is available + Revert "remove -mt suffix from boost libraries built by depends" + Use correct Boost::System linker flag for libzcash + depends: Remove -mt suffix from Boost libraries + snark: Remove -mt suffix from Boost library + cleanup: Ensure code is pyflakes-clean for CI + Ignore -mempooltxinputlimit once Overwinter activates + depends: Explicitly download and vendor Rust dependencies + Make Rust compilation mandatory + Optimise serialization of MerklePath, avoiding ambiguity of std::vector + Use uint64_t instead of size_t for serialized indices into tx.vjoinsplit + Move explicit instantiation of IncrementalMerkleTree::emptyroots into header + libsnark: Don't set -static on Darwin + Set PLATFORM flag when compiling libsnark + Add base case to CurrentEpoch() + Cast ZCIncrementalMerkleTree::size() to uint64_t before passing to UniValue + rpcwallet.cpp: Cast size_t to uint64_t before passing to UniValue + wallet: Cast size_t to uint64_t before passing to UniValue + Test calling z_mergetoaddress to merge notes while a note merge is ongoing + depends: Fix regex bugs in cargo-checksum.sh + Fix z_importviewingkey startHeight parameter + Add RPC test of RewindBlockIndex + When rewinding, remove insufficiently-validated blocks + Adjust deprecation message to work in both UI and -alertnotify + Refactor Zcash changes to CCoinsViewDB + Update blockchain.py RPC test for Zcash + Update CBlockTreeDB::EraseBatchSync for dbwrapper refactor + Fix typo + test: Check return value of snprintf + test: Add missing Overwinter fields to mininode's CTransaction + Add RPC test for -enforcenodebloom + Fix NODE_BLOOM documentation errors + Move bloom filter filtering logic back into command "switch" + Update -enforcenodebloom RPC test with filterclear vs filteradd + make-release.py: Versioning changes for 1.1.0-rc1. + make-release.py: Updated manpages for 1.1.0-rc1. + +James O'Beirne (3): + Refactor leveldbwrapper + Minor bugfixes + Add tests for gettxoutsetinfo, CLevelDBBatch, CLevelDBIterator + +Jason Davies (1): + Fix typo in comment: should link to issue #1359. + +Jay Graber (1): + Set ban score for expired txs to 0 + +Jeff Garzik (3): + leveldbwrapper: Remove unused .Prev(), .SeekToLast() methods + leveldbwrapper symbol rename: Remove "Level" from class, etc. names + leveldbwrapper file rename to dbwrapper.* + +Jonathan "Duke" Leto (7): + Fix references to Bitcoin in RPC tests readme + This library seems to not be used at all and all comments mentioning it are ghosts + Update awkward wording about blocks as per @daira + Regtest mining does have a founders reward, a single address t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg + Fix outdated comment about starting balance of nodes + Return JoinSplit and JoinSplitOutput indexes in z_listreceivedbyaddress + Add tests for new JoinSplit keys returned by z_listreceivedbyaddress + +Lauda (1): + [Trivial] Grammar and typo correction + +Matt Corallo (3): + Add test for dbwrapper iterators with same-prefix keys. + Add NODE_BLOOM service bit and bump protocol version + Don't do mempool lookups for "mempool" command without a filter + +Patick Strateman (3): + Move bloom filter filtering logic outside of command "switch" (giant if/else). + Add enforcenodebloom option. + Document both the peerbloomfilters and enforcenodebloom options. + +Pavel Janík (1): + Do not shadow members in dbwrapper + +Pieter Wuille (2): + Encapsulate CLevelDB iterators cleanly + Fix chainstate serialized_size computation + +R E Broadley (1): + Allow filterclear messages for enabling TX relay only. + +Simon Liu (13): + Code clean up. Remove use of X macro. + Enable mempool logging in tx expiry QA test. + Closes #3084. Log txid when removing expired txs from mempool. + Add qa test for cache invalidation bug found in v1.0.0 to v1.0.3. + Remove local function wait_and_assert_operationid_status which is now defined in the test framework for shared usage. + Update boost to 1.66.0 + Part of #2966, extending Sprout tests to other epochs. + Update boost package URL to match official download url on boost.org + Closes #3110. Ensure user can see error message about absurdly high fees. + Closes #2910. Add z_listunspent RPC call. + Upgrade OpenSSL to 1.1.0h + Use range based for loop + Bump MIT Licence copyright header. + +Wladimir J. van der Laan (6): + dbwrapper: Pass parent CDBWrapper into CDBBatch and CDBIterator + dbwrapper: Move `HandleError` to `dbwrapper_private` + chain: Add assertion in case of missing records in index db + test: Add more thorough test for dbwrapper iterators + test: Replace remaining sprintf with snprintf + doc: update release-notes and bips.md for BIP111 + +kozyilmaz (1): + Fix test/gtest bugs caught by latest macOS clang + +rofl0r (2): + fix build error due to usage of obsolete boost_system-mt + remove -mt suffix from boost libraries built by depends + diff --git a/doc/release-notes/release-notes-1.1.0.md b/doc/release-notes/release-notes-1.1.0.md new file mode 100644 index 000000000..37f803e6f --- /dev/null +++ b/doc/release-notes/release-notes-1.1.0.md @@ -0,0 +1,193 @@ +Notable changes +=============== + +Overwinter network upgrade +-------------------------- + +The activation height for the Overwinter network upgrade on mainnet is included +in this release. Overwinter will activate on mainnet at height 347500, which is +expected to be mined on the 25th of June 2018. Please upgrade to this release, +or any subsequent release, in order to follow the Overwinter network upgrade. + +`-mempooltxinputlimit` deprecation +---------------------------------- + +The configuration option `-mempooltxinputlimit` was added in release 1.0.10 as a +short-term fix for the quadratic hashing problem inherited from Bitcoin. At the +time, transactions with many inputs were causing performance issues for miners. +Since then, several performance improvements have been merged from the Bitcoin +Core codebase that significantly reduce these issues. + +The Overwinter network upgrade includes changes that solve the quadratic hashing +problem, and so `-mempooltxinputlimit` will no longer be needed - a transaction +with 1000 inputs will take just as long to validate as 10 transactions with 100 +inputs each. Starting from this release, `-mempooltxinputlimit` will be enforced +before the Overwinter activation height is reached, but will be ignored once +Overwinter activates. The option will be removed entirely in a future release +after Overwinter has activated. + +`NODE_BLOOM` service bit +------------------------ + +Support for the `NODE_BLOOM` service bit, as described in [BIP +111](https://github.com/bitcoin/bips/blob/master/bip-0111.mediawiki), has been +added to the P2P protocol code. + +BIP 111 defines a service bit to allow peers to advertise that they support +Bloom filters (such as used by SPV clients) explicitly. It also bumps the protocol +version to allow peers to identify old nodes which allow Bloom filtering of the +connection despite lacking the new service bit. + +In this version, it is only enforced for peers that send protocol versions +`>=170004`. For the next major version it is planned that this restriction will be +removed. It is recommended to update SPV clients to check for the `NODE_BLOOM` +service bit for nodes that report version 170004 or newer. + +Changelog +========= + +Brad Miller (2): + Clean up + Implement note locking for z_mergetoaddress + +Charlie O'Keefe (1): + Add filename and sha256 hash for windows rust package + +Daira Hopwood (5): + Squashed commit of the following: + pyflakes cleanups to RPC tests after Overwinter PRs. + Add support for Overwinter v3 transactions to mininode framework. + Test that receiving an expired transaction does not increase the peer's ban score. + Don't increase banscore if the transaction only just expired. + +Daniel Kraft (1): + trivial: use constants for db keys + +Jack Grigg (47): + Add environment variable for setting ./configure flags in zcutil/build.sh + Add configure flags for enabling ASan/UBSan and TSan + Split declaration and definition of SPROUT_BRANCH_ID constant + Add link to Overwinter info page + Notify users about auto-senescence via -alertnotify + test: Move wait_and_assert_operationid_status debug output before asserts + Don't require RELRO and BIND_NOW for Darwin + Only set multicore flags if OpenMP is available + Revert "remove -mt suffix from boost libraries built by depends" + Use correct Boost::System linker flag for libzcash + depends: Remove -mt suffix from Boost libraries + snark: Remove -mt suffix from Boost library + cleanup: Ensure code is pyflakes-clean for CI + Ignore -mempooltxinputlimit once Overwinter activates + depends: Explicitly download and vendor Rust dependencies + Make Rust compilation mandatory + Optimise serialization of MerklePath, avoiding ambiguity of std::vector + Use uint64_t instead of size_t for serialized indices into tx.vjoinsplit + Move explicit instantiation of IncrementalMerkleTree::emptyroots into header + libsnark: Don't set -static on Darwin + Set PLATFORM flag when compiling libsnark + Add base case to CurrentEpoch() + Cast ZCIncrementalMerkleTree::size() to uint64_t before passing to UniValue + rpcwallet.cpp: Cast size_t to uint64_t before passing to UniValue + wallet: Cast size_t to uint64_t before passing to UniValue + Test calling z_mergetoaddress to merge notes while a note merge is ongoing + depends: Fix regex bugs in cargo-checksum.sh + Fix z_importviewingkey startHeight parameter + Add RPC test of RewindBlockIndex + When rewinding, remove insufficiently-validated blocks + Adjust deprecation message to work in both UI and -alertnotify + Refactor Zcash changes to CCoinsViewDB + Update blockchain.py RPC test for Zcash + Update CBlockTreeDB::EraseBatchSync for dbwrapper refactor + Fix typo + test: Check return value of snprintf + test: Add missing Overwinter fields to mininode's CTransaction + Add RPC test for -enforcenodebloom + Fix NODE_BLOOM documentation errors + Move bloom filter filtering logic back into command "switch" + Update -enforcenodebloom RPC test with filterclear vs filteradd + make-release.py: Versioning changes for 1.1.0-rc1. + make-release.py: Updated manpages for 1.1.0-rc1. + make-release.py: Updated release notes and changelog for 1.1.0-rc1. + Set Overwinter protocol version to 170005 + make-release.py: Versioning changes for 1.1.0. + make-release.py: Updated manpages for 1.1.0. + +James O'Beirne (3): + Refactor leveldbwrapper + Minor bugfixes + Add tests for gettxoutsetinfo, CLevelDBBatch, CLevelDBIterator + +Jason Davies (1): + Fix typo in comment: should link to issue #1359. + +Jay Graber (1): + Set ban score for expired txs to 0 + +Jeff Garzik (3): + leveldbwrapper: Remove unused .Prev(), .SeekToLast() methods + leveldbwrapper symbol rename: Remove "Level" from class, etc. names + leveldbwrapper file rename to dbwrapper.* + +Jonathan "Duke" Leto (7): + Fix references to Bitcoin in RPC tests readme + This library seems to not be used at all and all comments mentioning it are ghosts + Update awkward wording about blocks as per @daira + Regtest mining does have a founders reward, a single address t2FwcEhFdNXuFMv1tcYwaBJtYVtMj8b1uTg + Fix outdated comment about starting balance of nodes + Return JoinSplit and JoinSplitOutput indexes in z_listreceivedbyaddress + Add tests for new JoinSplit keys returned by z_listreceivedbyaddress + +Lauda (1): + [Trivial] Grammar and typo correction + +Matt Corallo (3): + Add test for dbwrapper iterators with same-prefix keys. + Add NODE_BLOOM service bit and bump protocol version + Don't do mempool lookups for "mempool" command without a filter + +Patick Strateman (3): + Move bloom filter filtering logic outside of command "switch" (giant if/else). + Add enforcenodebloom option. + Document both the peerbloomfilters and enforcenodebloom options. + +Pavel Janík (1): + Do not shadow members in dbwrapper + +Pieter Wuille (2): + Encapsulate CLevelDB iterators cleanly + Fix chainstate serialized_size computation + +R E Broadley (1): + Allow filterclear messages for enabling TX relay only. + +Simon Liu (14): + Code clean up. Remove use of X macro. + Enable mempool logging in tx expiry QA test. + Closes #3084. Log txid when removing expired txs from mempool. + Add qa test for cache invalidation bug found in v1.0.0 to v1.0.3. + Remove local function wait_and_assert_operationid_status which is now defined in the test framework for shared usage. + Update boost to 1.66.0 + Part of #2966, extending Sprout tests to other epochs. + Update boost package URL to match official download url on boost.org + Closes #3110. Ensure user can see error message about absurdly high fees. + Closes #2910. Add z_listunspent RPC call. + Upgrade OpenSSL to 1.1.0h + Use range based for loop + Bump MIT Licence copyright header. + Fix test to check for sanitized string from alertnotify. + +Wladimir J. van der Laan (6): + dbwrapper: Pass parent CDBWrapper into CDBBatch and CDBIterator + dbwrapper: Move `HandleError` to `dbwrapper_private` + chain: Add assertion in case of missing records in index db + test: Add more thorough test for dbwrapper iterators + test: Replace remaining sprintf with snprintf + doc: update release-notes and bips.md for BIP111 + +kozyilmaz (1): + Fix test/gtest bugs caught by latest macOS clang + +rofl0r (2): + fix build error due to usage of obsolete boost_system-mt + remove -mt suffix from boost libraries built by depends + diff --git a/doc/release-notes/release-notes-1.1.1-rc1.md b/doc/release-notes/release-notes-1.1.1-rc1.md new file mode 100644 index 000000000..bc209efc7 --- /dev/null +++ b/doc/release-notes/release-notes-1.1.1-rc1.md @@ -0,0 +1,286 @@ +Notable changes +=============== + +zcash-cli: arguments privacy +---------------------------- + +The RPC command line client gained a new argument, `-stdin` +to read extra arguments from standard input, one per line until EOF/Ctrl-D. +For example: + + $ src/zcash-cli -stdin walletpassphrase + mysecretcode + 120 + ^D (Ctrl-D) + +It is recommended to use this for sensitive information such as private keys, as +command-line arguments can usually be read from the process table by any user on +the system. + +Asm representations of scriptSig signatures now contain SIGHASH type decodes +---------------------------------------------------------------------------- + +The `asm` property of each scriptSig now contains the decoded signature hash +type for each signature that provides a valid defined hash type. + +The following items contain assembly representations of scriptSig signatures +and are affected by this change: + +- RPC `getrawtransaction` +- RPC `decoderawtransaction` +- REST `/rest/tx/` (JSON format) +- REST `/rest/block/` (JSON format when including extended tx details) +- `zcash-tx -json` + +For example, the `scriptSig.asm` property of a transaction input that +previously showed an assembly representation of: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001 + +now shows as: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090[ALL] + +Note that the output of the RPC `decodescript` did not change because it is +configured specifically to process scriptPubKey and not scriptSig scripts. + +Changelog +========= + +Cory Fields (4): + serialization: teach serializers variadics + build: univalue subdir build fixups + don't throw std::bad_alloc when out of memory. Instead, terminate immediately + prevector: assert successful allocation + +Daira Hopwood (1): + Use https: for BDB backup download URL. + +David Llop (1): + Update Payment API + +Eirik Ogilvie-Wigley (7): + Clarify help text of dumpprivkey + Add sapling nullifier set + Add enum for nullifier type + Add sapling nullifiers to db and mempool + Rename nullifier caches and maps to indicate sprout nullifiers + Make sure transactions have non-empty outputs + Coinbase transactions can not have shielded spend or output + +Jack Grigg (50): + Disable building libzcashconsensus by default + depends: Upgrade Rust to 1.26.0-beta.3 + depends: Add support for unpackaged Rust crates + depends: Update to latest librustzcash with sapling-crypto dependencies + Add Sapling to upgrade list + Add static asserts to ensure CONTINUE_EXECUTION doesn't collide + [Bitcoin-Tx] Adjust util-test test cases for Zcash + Handle usage of prevector for CScript in Zcash-specific code + GetSerializeSize changes in Zcash-specific code + Remove nType and nVersion from Zcash-specific code + Adjust consensus rules to require v4 transactions from Sapling activation + Implement basic Sapling v4 transaction parser + Add Sapling v4 transactions to IsStandard + Pass transaction header into correct SignatureHash serialization level + Remove now-unshadowed serialization lines that do nothing + Implement SpendDescription and OutputDescription datastructures + Add a constant for Overwinter's transaction version + Return result of boost::apply_visitor + Improve best-effort logging before termination on OOM + Attempt to log before terminating if prevector allocation fails + Fix -Wstring-plus-int warning on clang + Update mempool_nu_activation RPC test to exercise both Overwinter and Sapling + Use CBitcoinAddress wrappers in Zcash-specific code + Change JSOutPoint constructor to have js argument be uint64_t + Update CreateNewContextualCMutableTransaction to create Sapling transactions + Expire Overwinter transactions before the Sapling activation height + Remove obsolete CreateJoinSplit and GenerateParams binaries + Add missing include guard + Raise 100kB transaction size limit from Sapling activation + Benchmark the largest valid Sapling transaction in validatelargetx + Rename MAX_TX_SIZE to MAX_TX_SIZE_AFTER_SAPLING + Rework z_sendmany z-address recipient limit + Add test of Sapling transaction size boundary + Update tests for CreateNewContextualCMutableTransaction changes + wallet: Change IsLockedNote to take a JSOutPoint + wallet: Make some arguments const that can be + Implement Sapling signature hash (ZIP 243) + Update sighash tests + Introduce wrappers around CZCPaymentAddress + Introduce wrappers around CZCSpendingKey + Introduce wrappers around CZCViewingKey + Implement {Encode,Decode}PaymentAddress etc. without CZCEncoding + Add key_io includes to Zcash-specific code + Add valueBalance to value balances, and enforce its consensus rules + Track net value entering and exiting the Sapling circuit + Add contextual comment for GetValueOut() and GetShieldedValueIn() + Use boost::variant to represent shielded addresses and keys + Correctly serialize Groth16 JSDescription for verifyjoinsplit benchmark + make-release.py: Versioning changes for 1.1.1-rc1. + make-release.py: Updated manpages for 1.1.1-rc1. + +Jay Graber (1): + Add test for dependent txs to mempool_tx_expiry.py + +Jeremy Rubin (1): + Fix subscript[0] in base58.cpp + +Jonas Schnelli (4): + [RPC] createrawtransaction: add option to set the sequence number per input + [bitcoin-tx] allow to set nSequence number over the in= command + [Bitcoin-Tx] Add tests for sequence number support + add bip32 pubkey serialization + +João Barbosa (1): + Remove unused GetKeyID and IsScript methods from CBitcoinAddress + +Karl-Johan Alm (1): + Removed using namespace std from bitcoin-cli/-tx and added std:: in appropriate places. + +Kaz Wesley (1): + CBase58Data::SetString: cleanse the full vector + +Larry Ruane (1): + fix qa/zcash/full_test_suite.py pathname + +MarcoFalke (3): + [uacomment] Sanitize per BIP-0014 + [rpcwallet] Don't use floating point + [test] Remove unused code + +Matt Corallo (1): + Add COMPACTSIZE wrapper similar to VARINT for serialization + +Pavel Janík (1): + [WIP] Remove unused statement in serialization + +Pavol Rusnak (2): + implement uacomment config parameter which can add comments to user agent as per BIP-0014 + limit total length of user agent comments + +Pedro Branco (1): + Prevent multiple calls to ExtractDestination + +Per Grön (1): + Make some globals static that can be + +Peter Pratscher (1): + Backported Bitcoin PR #8704 to optionally return full tx details in the getblock rpc call + +Pieter Wuille (22): + Prevector type + Remove unused ReadVersion and WriteVersion + Make streams' read and write return void + Make nType and nVersion private and sometimes const + Make GetSerializeSize a wrapper on top of CSizeComputer + Get rid of nType and nVersion + Avoid -Wshadow errors + Make CSerAction's ForRead() constexpr + Add optimized CSizeComputer serializers + Use fixed preallocation instead of costly GetSerializeSize + Add serialization for unique_ptr and shared_ptr + Add deserializing constructors to CTransaction and CMutableTransaction + Avoid unaligned access in crypto i/o + Fix some empty vector references + Introduce wrappers around CBitcoinAddress + Move CBitcoinAddress to base58.cpp + Implement {Encode,Decode}Destination without CBitcoinAddress + Import Bech32 C++ reference code & tests + Convert base58_tests from type/payload to scriptPubKey comparison + Replace CBitcoinSecret with {Encode,Decode}Secret + Stop using CBase58Data for ext keys + Split key_io (address/key encodings) off from base58 + +Puru (1): + bitcoin-cli.cpp: Use symbolic constant for exit code + +Sean Bowe (49): + Switch to latest librustzcash + Invoke the merkle_hash API in librustzcash via test suite. + Link with -ldl + Update librustzcash hash + Load Sapling testnet parameters into memory. + Update librustzcash hash + Check that duplicate Sapling nullifiers don't exist within a transaction. + Abstract `uncommitted` and depth personalization for IncrementalMerkleTree. + Add implementation of Sapling merkle tree + Add regression tests and test vectors for Sapling merkle tree + Rename NullifierType to ShieldedType. + Specifically describe anchors as Sprout anchors. + Rename hashAnchor to hashSproutAnchor. + Rename hashReserved to hashSaplingAnchorEnd. + Add primitive implementation of GetSaplingAnchorEnd. + Rename DB_ANCHOR to DB_SPROUT_ANCHOR. + Rename GetAnchorAt to GetSproutAnchorAt. + Rename PushAnchor to PushSproutAnchor. + Introduce support for GetBestAnchor(SAPLING). + Generalize the PopAnchor implementation behavior. + Generalize the PushAnchor implementation behavior. + Remove underscores from gtest test names. + Rename hashSaplingAnchorEnd to hashFinalSaplingRoot to match spec. + Rename hashSproutAnchorEnd to hashFinalSproutRoot to be consistent. + Add support for Sapling anchors in coins/txdb. + Add support for PopAnchor(.., SPROUT/SAPLING) + Add `PushSaplingAnchor` + Add consensus support for Sapling merkle trees. + Add support for Sapling anchor checks in mempool consistency checks. + Calculate the correct hashFinalSaplingRoot in the miner. + Adjust tests to handle Sapling anchor cache + Evict transactions with obsolete anchors from the mempool + Fix outdated comment + Fix broken error messages. + Fix miner tests + Update sapling-crypto and librustzcash + Swap bit endianness of test vectors + Remove unnecessary IsCoinbase() check. Coinbases are guaranteed to have empty vjoinsplit. + Refactor so that dataToBeSigned can be used later in the function for other purposes. + Update to latest librustzcash + Check Sapling Spend/Output proofs and signatures. + Integrate Groth16 verification and proving. + Update librustzcash again + Adjust tests and benchmarks + Switch Rust to 1.26 Stable. + Update librustzcash + Update Sapling testnet parameters + Update merkle tree and pedersen hash tests to account for new encoding + Change txdb prefixes for sapling and avoid writing unnecessary information. + +Simon Liu (14): + Part of #2966, extending Sprout tests to other epochs. + Closes #3134 - Least Authority Issue E + Refactoring: libzcash::Note is now a subclass of libzcash::BaseNote. + Refactoring: Rename class libzcash::Note to libzcash::SproutNote. + Refactoring: SproutNote member variable value moved to BaseNote. + Add virtual destructor to SproutNote and BaseNote + Remove unused SproutNote variables. + Refactoring: rename NotePlaintext --> SproutNotePlaintext + Create class hierarchy for SproutNotePlaintext. + Move memo member varible from SproutNotePlaintext to BaseNotePlaintext. + Tweaks to d0a1d83 to complete backport of Bitcoin PR #8704 + Closes #3178 by adding verbosity level improvements to getblock RPC. + Fix undefined behaviour, calling memcpy with NULL pointer. + Closes #3250. Memo getter should return by reference, not by value. + +Tom Harding (1): + Add optional locktime to createrawtransaction + +UdjinM6 (2): + Fix exit codes: + Every main()/exit() should return/use one of EXIT_ codes instead of magic numbers + +Wladimir J. van der Laan (2): + rpc: Input-from-stdin mode for bitcoin-cli + doc: mention bitcoin-cli -stdin in release notes + +ca333 (2): + [fix] proton download path + update proton.mk + +kozyilmaz (2): + [macOS] added curl method for param download + [macOS] use shlock instead of flock in fetch-params + +mruddy (1): + Resolve issue bitcoin/bitcoin#3166. + diff --git a/doc/release-notes/release-notes-1.1.1-rc2.md b/doc/release-notes/release-notes-1.1.1-rc2.md new file mode 100644 index 000000000..5d10ede47 --- /dev/null +++ b/doc/release-notes/release-notes-1.1.1-rc2.md @@ -0,0 +1,290 @@ +Notable changes +=============== + +zcash-cli: arguments privacy +---------------------------- + +The RPC command line client gained a new argument, `-stdin` +to read extra arguments from standard input, one per line until EOF/Ctrl-D. +For example: + + $ src/zcash-cli -stdin walletpassphrase + mysecretcode + 120 + ^D (Ctrl-D) + +It is recommended to use this for sensitive information such as private keys, as +command-line arguments can usually be read from the process table by any user on +the system. + +Asm representations of scriptSig signatures now contain SIGHASH type decodes +---------------------------------------------------------------------------- + +The `asm` property of each scriptSig now contains the decoded signature hash +type for each signature that provides a valid defined hash type. + +The following items contain assembly representations of scriptSig signatures +and are affected by this change: + +- RPC `getrawtransaction` +- RPC `decoderawtransaction` +- REST `/rest/tx/` (JSON format) +- REST `/rest/block/` (JSON format when including extended tx details) +- `zcash-tx -json` + +For example, the `scriptSig.asm` property of a transaction input that +previously showed an assembly representation of: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001 + +now shows as: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090[ALL] + +Note that the output of the RPC `decodescript` did not change because it is +configured specifically to process scriptPubKey and not scriptSig scripts. + +Changelog +========= + +Cory Fields (4): + serialization: teach serializers variadics + build: univalue subdir build fixups + don't throw std::bad_alloc when out of memory. Instead, terminate immediately + prevector: assert successful allocation + +Daira Hopwood (1): + Use https: for BDB backup download URL. + +David Llop (1): + Update Payment API + +Eirik Ogilvie-Wigley (7): + Clarify help text of dumpprivkey + Add sapling nullifier set + Add enum for nullifier type + Add sapling nullifiers to db and mempool + Rename nullifier caches and maps to indicate sprout nullifiers + Make sure transactions have non-empty outputs + Coinbase transactions can not have shielded spend or output + +Jack Grigg (52): + Disable building libzcashconsensus by default + depends: Upgrade Rust to 1.26.0-beta.3 + depends: Add support for unpackaged Rust crates + depends: Update to latest librustzcash with sapling-crypto dependencies + Add Sapling to upgrade list + Add static asserts to ensure CONTINUE_EXECUTION doesn't collide + [Bitcoin-Tx] Adjust util-test test cases for Zcash + Handle usage of prevector for CScript in Zcash-specific code + GetSerializeSize changes in Zcash-specific code + Remove nType and nVersion from Zcash-specific code + Adjust consensus rules to require v4 transactions from Sapling activation + Implement basic Sapling v4 transaction parser + Add Sapling v4 transactions to IsStandard + Pass transaction header into correct SignatureHash serialization level + Remove now-unshadowed serialization lines that do nothing + Implement SpendDescription and OutputDescription datastructures + Add a constant for Overwinter's transaction version + Return result of boost::apply_visitor + Improve best-effort logging before termination on OOM + Attempt to log before terminating if prevector allocation fails + Fix -Wstring-plus-int warning on clang + Update mempool_nu_activation RPC test to exercise both Overwinter and Sapling + Use CBitcoinAddress wrappers in Zcash-specific code + Change JSOutPoint constructor to have js argument be uint64_t + Update CreateNewContextualCMutableTransaction to create Sapling transactions + Expire Overwinter transactions before the Sapling activation height + Remove obsolete CreateJoinSplit and GenerateParams binaries + Add missing include guard + Raise 100kB transaction size limit from Sapling activation + Benchmark the largest valid Sapling transaction in validatelargetx + Rename MAX_TX_SIZE to MAX_TX_SIZE_AFTER_SAPLING + Rework z_sendmany z-address recipient limit + Add test of Sapling transaction size boundary + Update tests for CreateNewContextualCMutableTransaction changes + wallet: Change IsLockedNote to take a JSOutPoint + wallet: Make some arguments const that can be + Implement Sapling signature hash (ZIP 243) + Update sighash tests + Introduce wrappers around CZCPaymentAddress + Introduce wrappers around CZCSpendingKey + Introduce wrappers around CZCViewingKey + Implement {Encode,Decode}PaymentAddress etc. without CZCEncoding + Add key_io includes to Zcash-specific code + Add valueBalance to value balances, and enforce its consensus rules + Track net value entering and exiting the Sapling circuit + Add contextual comment for GetValueOut() and GetShieldedValueIn() + Use boost::variant to represent shielded addresses and keys + Correctly serialize Groth16 JSDescription for verifyjoinsplit benchmark + make-release.py: Versioning changes for 1.1.1-rc1. + make-release.py: Updated manpages for 1.1.1-rc1. + make-release.py: Updated release notes and changelog for 1.1.1-rc1. + Comment out Gitian library handling while we don't build any libraries + +Jay Graber (1): + Add test for dependent txs to mempool_tx_expiry.py + +Jeremy Rubin (1): + Fix subscript[0] in base58.cpp + +Jonas Schnelli (4): + [RPC] createrawtransaction: add option to set the sequence number per input + [bitcoin-tx] allow to set nSequence number over the in= command + [Bitcoin-Tx] Add tests for sequence number support + add bip32 pubkey serialization + +João Barbosa (1): + Remove unused GetKeyID and IsScript methods from CBitcoinAddress + +Karl-Johan Alm (1): + Removed using namespace std from bitcoin-cli/-tx and added std:: in appropriate places. + +Kaz Wesley (1): + CBase58Data::SetString: cleanse the full vector + +Larry Ruane (1): + fix qa/zcash/full_test_suite.py pathname + +MarcoFalke (3): + [uacomment] Sanitize per BIP-0014 + [rpcwallet] Don't use floating point + [test] Remove unused code + +Matt Corallo (1): + Add COMPACTSIZE wrapper similar to VARINT for serialization + +Pavel Janík (1): + [WIP] Remove unused statement in serialization + +Pavol Rusnak (2): + implement uacomment config parameter which can add comments to user agent as per BIP-0014 + limit total length of user agent comments + +Pedro Branco (1): + Prevent multiple calls to ExtractDestination + +Per Grön (1): + Make some globals static that can be + +Peter Pratscher (1): + Backported Bitcoin PR #8704 to optionally return full tx details in the getblock rpc call + +Pieter Wuille (22): + Prevector type + Remove unused ReadVersion and WriteVersion + Make streams' read and write return void + Make nType and nVersion private and sometimes const + Make GetSerializeSize a wrapper on top of CSizeComputer + Get rid of nType and nVersion + Avoid -Wshadow errors + Make CSerAction's ForRead() constexpr + Add optimized CSizeComputer serializers + Use fixed preallocation instead of costly GetSerializeSize + Add serialization for unique_ptr and shared_ptr + Add deserializing constructors to CTransaction and CMutableTransaction + Avoid unaligned access in crypto i/o + Fix some empty vector references + Introduce wrappers around CBitcoinAddress + Move CBitcoinAddress to base58.cpp + Implement {Encode,Decode}Destination without CBitcoinAddress + Import Bech32 C++ reference code & tests + Convert base58_tests from type/payload to scriptPubKey comparison + Replace CBitcoinSecret with {Encode,Decode}Secret + Stop using CBase58Data for ext keys + Split key_io (address/key encodings) off from base58 + +Puru (1): + bitcoin-cli.cpp: Use symbolic constant for exit code + +Sean Bowe (49): + Switch to latest librustzcash + Invoke the merkle_hash API in librustzcash via test suite. + Link with -ldl + Update librustzcash hash + Load Sapling testnet parameters into memory. + Update librustzcash hash + Check that duplicate Sapling nullifiers don't exist within a transaction. + Abstract `uncommitted` and depth personalization for IncrementalMerkleTree. + Add implementation of Sapling merkle tree + Add regression tests and test vectors for Sapling merkle tree + Rename NullifierType to ShieldedType. + Specifically describe anchors as Sprout anchors. + Rename hashAnchor to hashSproutAnchor. + Rename hashReserved to hashSaplingAnchorEnd. + Add primitive implementation of GetSaplingAnchorEnd. + Rename DB_ANCHOR to DB_SPROUT_ANCHOR. + Rename GetAnchorAt to GetSproutAnchorAt. + Rename PushAnchor to PushSproutAnchor. + Introduce support for GetBestAnchor(SAPLING). + Generalize the PopAnchor implementation behavior. + Generalize the PushAnchor implementation behavior. + Remove underscores from gtest test names. + Rename hashSaplingAnchorEnd to hashFinalSaplingRoot to match spec. + Rename hashSproutAnchorEnd to hashFinalSproutRoot to be consistent. + Add support for Sapling anchors in coins/txdb. + Add support for PopAnchor(.., SPROUT/SAPLING) + Add `PushSaplingAnchor` + Add consensus support for Sapling merkle trees. + Add support for Sapling anchor checks in mempool consistency checks. + Calculate the correct hashFinalSaplingRoot in the miner. + Adjust tests to handle Sapling anchor cache + Evict transactions with obsolete anchors from the mempool + Fix outdated comment + Fix broken error messages. + Fix miner tests + Update sapling-crypto and librustzcash + Swap bit endianness of test vectors + Remove unnecessary IsCoinbase() check. Coinbases are guaranteed to have empty vjoinsplit. + Refactor so that dataToBeSigned can be used later in the function for other purposes. + Update to latest librustzcash + Check Sapling Spend/Output proofs and signatures. + Integrate Groth16 verification and proving. + Update librustzcash again + Adjust tests and benchmarks + Switch Rust to 1.26 Stable. + Update librustzcash + Update Sapling testnet parameters + Update merkle tree and pedersen hash tests to account for new encoding + Change txdb prefixes for sapling and avoid writing unnecessary information. + +Simon Liu (16): + Part of #2966, extending Sprout tests to other epochs. + Closes #3134 - Least Authority Issue E + Refactoring: libzcash::Note is now a subclass of libzcash::BaseNote. + Refactoring: Rename class libzcash::Note to libzcash::SproutNote. + Refactoring: SproutNote member variable value moved to BaseNote. + Add virtual destructor to SproutNote and BaseNote + Remove unused SproutNote variables. + Refactoring: rename NotePlaintext --> SproutNotePlaintext + Create class hierarchy for SproutNotePlaintext. + Move memo member varible from SproutNotePlaintext to BaseNotePlaintext. + Tweaks to d0a1d83 to complete backport of Bitcoin PR #8704 + Closes #3178 by adding verbosity level improvements to getblock RPC. + Fix undefined behaviour, calling memcpy with NULL pointer. + Closes #3250. Memo getter should return by reference, not by value. + make-release.py: Versioning changes for 1.1.1-rc2. + make-release.py: Updated manpages for 1.1.1-rc2. + +Tom Harding (1): + Add optional locktime to createrawtransaction + +UdjinM6 (2): + Fix exit codes: + Every main()/exit() should return/use one of EXIT_ codes instead of magic numbers + +Wladimir J. van der Laan (2): + rpc: Input-from-stdin mode for bitcoin-cli + doc: mention bitcoin-cli -stdin in release notes + +ca333 (2): + [fix] proton download path + update proton.mk + +kozyilmaz (2): + [macOS] added curl method for param download + [macOS] use shlock instead of flock in fetch-params + +mruddy (1): + Resolve issue bitcoin/bitcoin#3166. + diff --git a/doc/release-notes/release-notes-1.1.1.md b/doc/release-notes/release-notes-1.1.1.md new file mode 100644 index 000000000..90adec943 --- /dev/null +++ b/doc/release-notes/release-notes-1.1.1.md @@ -0,0 +1,336 @@ +Notable changes +=============== + +Sapling network upgrade +----------------------- + +The consensus code preparations for the Sapling network upgrade, as described +in [ZIP 243](https://github.com/zcash/zips/blob/master/zip-0243.rst) and the +[Sapling spec](https://github.com/zcash/zips/blob/master/protocol/sapling.pdf) +are finished and included in this release. Sapling support in the wallet and +RPC is ongoing, and is expected to land in master over the next few weeks. + +The [Sapling MPC](https://blog.z.cash/announcing-the-sapling-mpc/) is currently +working on producing the final Sapling parameters. In the meantime, Sapling will +activate on testnet with dummy Sapling parameters at height 252500. This +activation will be temporary, and the testnet will be rolled back by version +2.0.0 so that both mainnet and testnet will be using the same parameters. +Users who want to continue testing Overwinter should continue to run version +1.1.0 on testnet, and then upgrade to 2.0.0 (which will be released after +Overwinter activates). + +Sapling can also be activated at a specific height in regtest mode by +setting the config options `-nuparams=5ba81b19:HEIGHT -nuparams=76b809bb:HEIGHT`. +These config options will change when the testnet is rolled back for 2.0.0 +(because the branch ID for Sapling will change, due to us following the safe +upgrade conventions we introduced in Overwinter). + +Users running testnet or regtest nodes will need to run +`./zcutil/fetch-params.sh --testnet` (for users building from source) or +`zcash-fetch-params --testnet` (for binary / Debian users). + +As a reminder, because the Sapling activation height is not yet specified for +mainnet, version 1.1.1 will behave similarly as other pre-Sapling releases even +after a future activation of Sapling on the network. Upgrading from 1.1.1 will +be required in order to follow the Sapling network upgrade on mainnet. + +Sapling transaction format +-------------------------- + +Once Sapling has activated, transactions must use the new v4 format (including +coinbase transactions). All RPC methods that create new transactions (such as +`createrawtransaction` and `getblocktemplate`) will create v4 transactions once +the Sapling activation height has been reached. + +zcash-cli: arguments privacy +---------------------------- + +The RPC command line client gained a new argument, `-stdin` +to read extra arguments from standard input, one per line until EOF/Ctrl-D. +For example: + + $ src/zcash-cli -stdin walletpassphrase + mysecretcode + 120 + ^D (Ctrl-D) + +It is recommended to use this for sensitive information such as private keys, as +command-line arguments can usually be read from the process table by any user on +the system. + +Asm representations of scriptSig signatures now contain SIGHASH type decodes +---------------------------------------------------------------------------- + +The `asm` property of each scriptSig now contains the decoded signature hash +type for each signature that provides a valid defined hash type. + +The following items contain assembly representations of scriptSig signatures +and are affected by this change: + +- RPC `getrawtransaction` +- RPC `decoderawtransaction` +- REST `/rest/tx/` (JSON format) +- REST `/rest/block/` (JSON format when including extended tx details) +- `zcash-tx -json` + +For example, the `scriptSig.asm` property of a transaction input that +previously showed an assembly representation of: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c509001 + +now shows as: + + 304502207fa7a6d1e0ee81132a269ad84e68d695483745cde8b541e3bf630749894e342a022100c1f7ab20e13e22fb95281a870f3dcf38d782e53023ee313d741ad0cfbc0c5090[ALL] + +Note that the output of the RPC `decodescript` did not change because it is +configured specifically to process scriptPubKey and not scriptSig scripts. + +Changelog +========= + +Cory Fields (4): + serialization: teach serializers variadics + build: univalue subdir build fixups + don't throw std::bad_alloc when out of memory. Instead, terminate immediately + prevector: assert successful allocation + +Daira Hopwood (1): + Use https: for BDB backup download URL. + +David Llop (1): + Update Payment API + +Eirik Ogilvie-Wigley (7): + Clarify help text of dumpprivkey + Add sapling nullifier set + Add enum for nullifier type + Add sapling nullifiers to db and mempool + Rename nullifier caches and maps to indicate sprout nullifiers + Make sure transactions have non-empty outputs + Coinbase transactions can not have shielded spend or output + +Jack Grigg (55): + Disable building libzcashconsensus by default + depends: Upgrade Rust to 1.26.0-beta.3 + depends: Add support for unpackaged Rust crates + depends: Update to latest librustzcash with sapling-crypto dependencies + Add Sapling to upgrade list + Add static asserts to ensure CONTINUE_EXECUTION doesn't collide + [Bitcoin-Tx] Adjust util-test test cases for Zcash + Handle usage of prevector for CScript in Zcash-specific code + GetSerializeSize changes in Zcash-specific code + Remove nType and nVersion from Zcash-specific code + Adjust consensus rules to require v4 transactions from Sapling activation + Implement basic Sapling v4 transaction parser + Add Sapling v4 transactions to IsStandard + Pass transaction header into correct SignatureHash serialization level + Remove now-unshadowed serialization lines that do nothing + Implement SpendDescription and OutputDescription datastructures + Add a constant for Overwinter's transaction version + Return result of boost::apply_visitor + Improve best-effort logging before termination on OOM + Attempt to log before terminating if prevector allocation fails + Fix -Wstring-plus-int warning on clang + Update mempool_nu_activation RPC test to exercise both Overwinter and Sapling + Use CBitcoinAddress wrappers in Zcash-specific code + Change JSOutPoint constructor to have js argument be uint64_t + Update CreateNewContextualCMutableTransaction to create Sapling transactions + Expire Overwinter transactions before the Sapling activation height + Remove obsolete CreateJoinSplit and GenerateParams binaries + Add missing include guard + Raise 100kB transaction size limit from Sapling activation + Benchmark the largest valid Sapling transaction in validatelargetx + Rename MAX_TX_SIZE to MAX_TX_SIZE_AFTER_SAPLING + Rework z_sendmany z-address recipient limit + Add test of Sapling transaction size boundary + Update tests for CreateNewContextualCMutableTransaction changes + wallet: Change IsLockedNote to take a JSOutPoint + wallet: Make some arguments const that can be + Implement Sapling signature hash (ZIP 243) + Update sighash tests + Introduce wrappers around CZCPaymentAddress + Introduce wrappers around CZCSpendingKey + Introduce wrappers around CZCViewingKey + Implement {Encode,Decode}PaymentAddress etc. without CZCEncoding + Add key_io includes to Zcash-specific code + Add valueBalance to value balances, and enforce its consensus rules + Track net value entering and exiting the Sapling circuit + Add contextual comment for GetValueOut() and GetShieldedValueIn() + Use boost::variant to represent shielded addresses and keys + Correctly serialize Groth16 JSDescription for verifyjoinsplit benchmark + make-release.py: Versioning changes for 1.1.1-rc1. + make-release.py: Updated manpages for 1.1.1-rc1. + make-release.py: Updated release notes and changelog for 1.1.1-rc1. + Comment out Gitian library handling while we don't build any libraries + Add Sapling details to release notes + make-release.py: Versioning changes for 1.1.1. + make-release.py: Updated manpages for 1.1.1. + +Jay Graber (1): + Add test for dependent txs to mempool_tx_expiry.py + +Jeremy Rubin (1): + Fix subscript[0] in base58.cpp + +Jonas Schnelli (4): + [RPC] createrawtransaction: add option to set the sequence number per input + [bitcoin-tx] allow to set nSequence number over the in= command + [Bitcoin-Tx] Add tests for sequence number support + add bip32 pubkey serialization + +João Barbosa (1): + Remove unused GetKeyID and IsScript methods from CBitcoinAddress + +Karl-Johan Alm (1): + Removed using namespace std from bitcoin-cli/-tx and added std:: in appropriate places. + +Kaz Wesley (1): + CBase58Data::SetString: cleanse the full vector + +Larry Ruane (1): + fix qa/zcash/full_test_suite.py pathname + +MarcoFalke (3): + [uacomment] Sanitize per BIP-0014 + [rpcwallet] Don't use floating point + [test] Remove unused code + +Matt Corallo (1): + Add COMPACTSIZE wrapper similar to VARINT for serialization + +Pavel Janík (1): + [WIP] Remove unused statement in serialization + +Pavol Rusnak (2): + implement uacomment config parameter which can add comments to user agent as per BIP-0014 + limit total length of user agent comments + +Pedro Branco (1): + Prevent multiple calls to ExtractDestination + +Per Grön (1): + Make some globals static that can be + +Peter Pratscher (1): + Backported Bitcoin PR #8704 to optionally return full tx details in the getblock rpc call + +Pieter Wuille (22): + Prevector type + Remove unused ReadVersion and WriteVersion + Make streams' read and write return void + Make nType and nVersion private and sometimes const + Make GetSerializeSize a wrapper on top of CSizeComputer + Get rid of nType and nVersion + Avoid -Wshadow errors + Make CSerAction's ForRead() constexpr + Add optimized CSizeComputer serializers + Use fixed preallocation instead of costly GetSerializeSize + Add serialization for unique_ptr and shared_ptr + Add deserializing constructors to CTransaction and CMutableTransaction + Avoid unaligned access in crypto i/o + Fix some empty vector references + Introduce wrappers around CBitcoinAddress + Move CBitcoinAddress to base58.cpp + Implement {Encode,Decode}Destination without CBitcoinAddress + Import Bech32 C++ reference code & tests + Convert base58_tests from type/payload to scriptPubKey comparison + Replace CBitcoinSecret with {Encode,Decode}Secret + Stop using CBase58Data for ext keys + Split key_io (address/key encodings) off from base58 + +Puru (1): + bitcoin-cli.cpp: Use symbolic constant for exit code + +Sean Bowe (49): + Switch to latest librustzcash + Invoke the merkle_hash API in librustzcash via test suite. + Link with -ldl + Update librustzcash hash + Load Sapling testnet parameters into memory. + Update librustzcash hash + Check that duplicate Sapling nullifiers don't exist within a transaction. + Abstract `uncommitted` and depth personalization for IncrementalMerkleTree. + Add implementation of Sapling merkle tree + Add regression tests and test vectors for Sapling merkle tree + Rename NullifierType to ShieldedType. + Specifically describe anchors as Sprout anchors. + Rename hashAnchor to hashSproutAnchor. + Rename hashReserved to hashSaplingAnchorEnd. + Add primitive implementation of GetSaplingAnchorEnd. + Rename DB_ANCHOR to DB_SPROUT_ANCHOR. + Rename GetAnchorAt to GetSproutAnchorAt. + Rename PushAnchor to PushSproutAnchor. + Introduce support for GetBestAnchor(SAPLING). + Generalize the PopAnchor implementation behavior. + Generalize the PushAnchor implementation behavior. + Remove underscores from gtest test names. + Rename hashSaplingAnchorEnd to hashFinalSaplingRoot to match spec. + Rename hashSproutAnchorEnd to hashFinalSproutRoot to be consistent. + Add support for Sapling anchors in coins/txdb. + Add support for PopAnchor(.., SPROUT/SAPLING) + Add `PushSaplingAnchor` + Add consensus support for Sapling merkle trees. + Add support for Sapling anchor checks in mempool consistency checks. + Calculate the correct hashFinalSaplingRoot in the miner. + Adjust tests to handle Sapling anchor cache + Evict transactions with obsolete anchors from the mempool + Fix outdated comment + Fix broken error messages. + Fix miner tests + Update sapling-crypto and librustzcash + Swap bit endianness of test vectors + Remove unnecessary IsCoinbase() check. Coinbases are guaranteed to have empty vjoinsplit. + Refactor so that dataToBeSigned can be used later in the function for other purposes. + Update to latest librustzcash + Check Sapling Spend/Output proofs and signatures. + Integrate Groth16 verification and proving. + Update librustzcash again + Adjust tests and benchmarks + Switch Rust to 1.26 Stable. + Update librustzcash + Update Sapling testnet parameters + Update merkle tree and pedersen hash tests to account for new encoding + Change txdb prefixes for sapling and avoid writing unnecessary information. + +Simon Liu (18): + Part of #2966, extending Sprout tests to other epochs. + Closes #3134 - Least Authority Issue E + Refactoring: libzcash::Note is now a subclass of libzcash::BaseNote. + Refactoring: Rename class libzcash::Note to libzcash::SproutNote. + Refactoring: SproutNote member variable value moved to BaseNote. + Add virtual destructor to SproutNote and BaseNote + Remove unused SproutNote variables. + Refactoring: rename NotePlaintext --> SproutNotePlaintext + Create class hierarchy for SproutNotePlaintext. + Move memo member varible from SproutNotePlaintext to BaseNotePlaintext. + Tweaks to d0a1d83 to complete backport of Bitcoin PR #8704 + Closes #3178 by adding verbosity level improvements to getblock RPC. + Fix undefined behaviour, calling memcpy with NULL pointer. + Closes #3250. Memo getter should return by reference, not by value. + make-release.py: Versioning changes for 1.1.1-rc2. + make-release.py: Updated manpages for 1.1.1-rc2. + make-release.py: Updated release notes and changelog for 1.1.1-rc2. + Closes #3301. Non-void function should not have empty definition. + +Tom Harding (1): + Add optional locktime to createrawtransaction + +UdjinM6 (2): + Fix exit codes: + Every main()/exit() should return/use one of EXIT_ codes instead of magic numbers + +Wladimir J. van der Laan (2): + rpc: Input-from-stdin mode for bitcoin-cli + doc: mention bitcoin-cli -stdin in release notes + +ca333 (2): + [fix] proton download path + update proton.mk + +kozyilmaz (2): + [macOS] added curl method for param download + [macOS] use shlock instead of flock in fetch-params + +mruddy (1): + Resolve issue bitcoin/bitcoin#3166. + diff --git a/doc/release-notes/release-notes-1.1.2-rc1.md b/doc/release-notes/release-notes-1.1.2-rc1.md new file mode 100644 index 000000000..91fdafd5a --- /dev/null +++ b/doc/release-notes/release-notes-1.1.2-rc1.md @@ -0,0 +1,96 @@ +Notable changes +=============== + +`-disabledeprecation` removal +----------------------------- + +In release 1.0.9 we implemented automatic deprecation of `zcashd` software +versions made by the Zcash Company. The configuration option +`-disabledeprecation` was added as a way for users to specifically choose to +stay on a particular software version. However, it incorrectly implied that +deprecated releases would still be supported. + +This release removes the `-disabledeprecation` option, so that `zcashd` software +versions made by the Zcash Company will always shut down in accordance with the +defined deprecation policy (currently 16 weeks after release). Users who wish to +use a different policy must now specifically choose to either: + +- edit and compile the source code themselves, or +- obtain a software version from someone else who has done so (and obtain + support from them). + +Either way, it is much clearer that the software they are running is not +supported by the Zcash Company. + +Changelog +========= + +Ariel Gabizon (1): + Improve/Fix variable names + +Daira Hopwood (1): + Update code_of_conduct.md + +Eirik Ogilvie-Wigley (5): + Add tests for sapling anchors + Add hashFinalSaplingRoot to getblocktemplate + Fix parsing parameters in getnetworksolps + Add BOOST_TEST_CONTEXT to distinguish sprout v. sapling + Rename typename + +Jack Grigg (16): + Replace boost::array with std::array + Add MacOS support to no-dot-so test + Whitespace cleanup + chainparams: Add Sapling Bech32 HRPs + ConvertBits() - convert from one power-of-2 number base to another. + Fix bech32::Encode() error handling + Implement encoding and decoding of Sapling keys and addresses + Add Mach-O 64-bit detection to security-check.py + Fix cached_witnesses_empty_chain test failure on MacOS + Skip ELF-only sec-hard checks on non-ELF binaries + Remove config option -disabledeprecation + Add release notes for -disabledeprecation removal + Add comment about size calculations for converted serialized keys + Add examples of ConvertBits transformation + Use CChainParams::Bech32HRP() in zs_address_test + Add hashFinalSaplingRoot to getblockheader and getblock output + +Jay Graber (8): + Add Sapling key classes to wallet, with new librustzcash APIs + Change librustzcash dependency hash to work for new Sapling classes + Update librustzcash dependency, address comments + Minimal sapling key test + Fix default_address() + s/SaplingInViewingKey/SaplingIncomingViewingKey + Make diversifier functions return option + Add json test vectors for Sapling key components. + +Jonathan "Duke" Leto (1): + Clarify help that signmessage only works on taddrs + +Larry Ruane (1): + (rpc-test) accurately account for fee without rounding error + +Matthew King (2): + Use portable #! in python scripts (/usr/bin/env) + Favour python over python2 as per PR #7723 + +Paige Peterson (1): + include note about volunteers in CoC + +Pieter Wuille (2): + Generalize ConvertBits + Simplify Base32 and Base64 conversions + +Simon Liu (9): + Part of #3277. Add comment about deprecated txdb prefixes. + Remove now redundant Rust call to librustzcash_xor. + Add SaplingNote class and test_sapling_note unit test. + Refactor and replace factory method random() with constructor. + Return optional for Sapling commitments and nullifiers. + Closes #3328. Send alert to put non-Overwinter nodes into safe mode. + Fix pyflakes error in test zkey_import_export. + make-release.py: Versioning changes for 1.1.2-rc1. + make-release.py: Updated manpages for 1.1.2-rc1. + diff --git a/doc/release-notes/release-notes-1.1.2.md b/doc/release-notes/release-notes-1.1.2.md new file mode 100644 index 000000000..9041c1bb2 --- /dev/null +++ b/doc/release-notes/release-notes-1.1.2.md @@ -0,0 +1,99 @@ +Notable changes +=============== + +`-disabledeprecation` removal +----------------------------- + +In release 1.0.9 we implemented automatic deprecation of `zcashd` software +versions made by the Zcash Company. The configuration option +`-disabledeprecation` was added as a way for users to specifically choose to +stay on a particular software version. However, it incorrectly implied that +deprecated releases would still be supported. + +This release removes the `-disabledeprecation` option, so that `zcashd` software +versions made by the Zcash Company will always shut down in accordance with the +defined deprecation policy (currently 16 weeks after release). Users who wish to +use a different policy must now specifically choose to either: + +- edit and compile the source code themselves, or +- obtain a software version from someone else who has done so (and obtain + support from them). + +Either way, it is much clearer that the software they are running is not +supported by the Zcash Company. + +Changelog +========= + +Ariel Gabizon (1): + Improve/Fix variable names + +Daira Hopwood (1): + Update code_of_conduct.md + +Eirik Ogilvie-Wigley (5): + Add tests for sapling anchors + Add hashFinalSaplingRoot to getblocktemplate + Fix parsing parameters in getnetworksolps + Add BOOST_TEST_CONTEXT to distinguish sprout v. sapling + Rename typename + +Jack Grigg (16): + Replace boost::array with std::array + Add MacOS support to no-dot-so test + Whitespace cleanup + chainparams: Add Sapling Bech32 HRPs + ConvertBits() - convert from one power-of-2 number base to another. + Fix bech32::Encode() error handling + Implement encoding and decoding of Sapling keys and addresses + Add Mach-O 64-bit detection to security-check.py + Fix cached_witnesses_empty_chain test failure on MacOS + Skip ELF-only sec-hard checks on non-ELF binaries + Remove config option -disabledeprecation + Add release notes for -disabledeprecation removal + Add comment about size calculations for converted serialized keys + Add examples of ConvertBits transformation + Use CChainParams::Bech32HRP() in zs_address_test + Add hashFinalSaplingRoot to getblockheader and getblock output + +Jay Graber (8): + Add Sapling key classes to wallet, with new librustzcash APIs + Change librustzcash dependency hash to work for new Sapling classes + Update librustzcash dependency, address comments + Minimal sapling key test + Fix default_address() + s/SaplingInViewingKey/SaplingIncomingViewingKey + Make diversifier functions return option + Add json test vectors for Sapling key components. + +Jonathan "Duke" Leto (1): + Clarify help that signmessage only works on taddrs + +Larry Ruane (1): + (rpc-test) accurately account for fee without rounding error + +Matthew King (2): + Use portable #! in python scripts (/usr/bin/env) + Favour python over python2 as per PR #7723 + +Paige Peterson (1): + include note about volunteers in CoC + +Pieter Wuille (2): + Generalize ConvertBits + Simplify Base32 and Base64 conversions + +Simon Liu (12): + Part of #3277. Add comment about deprecated txdb prefixes. + Remove now redundant Rust call to librustzcash_xor. + Add SaplingNote class and test_sapling_note unit test. + Refactor and replace factory method random() with constructor. + Return optional for Sapling commitments and nullifiers. + Closes #3328. Send alert to put non-Overwinter nodes into safe mode. + Fix pyflakes error in test zkey_import_export. + make-release.py: Versioning changes for 1.1.2-rc1. + make-release.py: Updated manpages for 1.1.2-rc1. + make-release.py: Updated release notes and changelog for 1.1.2-rc1. + make-release.py: Versioning changes for 1.1.2. + make-release.py: Updated manpages for 1.1.2. + diff --git a/doc/release-notes/release-notes-2.0.0-rc1.md b/doc/release-notes/release-notes-2.0.0-rc1.md new file mode 100644 index 000000000..9033a31a6 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.0-rc1.md @@ -0,0 +1,176 @@ +Changelog +========= + +Alex Morcos (1): + Output line to debug.log when IsInitialBlockDownload latches to false + +Ariel Gabizon (1): + Extend Joinsplit tests to Groth + +Charlie OKeefe (1): + Remove extra slash from lockfile path + +Cory Fields (1): + crypter: shuffle Makefile so that crypto can be used by the wallet + +Daira Hopwood (1): + Support testnet rollback. + +Daniel Cousens (2): + move rpc* to rpc/ + rpc: update inline comments to refer to new file paths + +Dimitris Apostolou (1): + Fix typos + +Duke Leto (3): + Fix absurd fee bug reported in #3281, with tests + Update comment as per @arielgabizon + Improve error message + +Eirik Ogilvie-Wigley (24): + Add more options when asserting in RPC tests + Add change indicator for notes + Fix test broken by change indicator + Rename note data to include sprout + Remove redundant curly braces + Consolidate for loops + Add out point for sapling note data + Add sapling note data and map + Decrement sapling note witnesses + Clear sapling witness cache + Extract method for copying previous witnesses + Extract methods for incrementing witnesses + Extract method for incrementing witness heights + Pass sapling merkle tree when incrementing witnesses + Increment sapling note witnesses + Rename sprout specific methods + Remove extra indentation + Add getter and setter for sapling note data and update tests + Add parameter for version in GetValidReceive + Rename Merkle Trees to include sprout or sapling + Rename Witnesses to include sprout or sapling + Rename test objects to include sprout or sapling + Only include the change field if we have a spending key + Fix assertion and comment + +Gregory Maxwell (2): + IBD check uses minimumchain work instead of checkpoints. + IsInitialBlockDownload no longer uses header-only timestamps. + +Jack Grigg (38): + Add some more checkpoints, up to the 1.1.0 release + Add Sapling support to z_validateaddress + Update payment-api.md with type field of z_validateaddress + Alter SaplingNote::nullifier() to take a SaplingFullViewingKey + Expose note position in IncrementalMerkleWitness + TransactionBuilder with support for creating Sapling-only transactions + TransactionBuilder: Check that all anchors in a transaction are identical + Formatting + test: Move ECC_Start() call into src/gtest/main.cpp + TransactionBuilder: Add support for transparent inputs and outputs + TransactionBuilder: Add change output to transaction + TransactionBuilder: Make fee configurable + Rename xsk to expsk + Implement CKeyStore::GetSaplingPaymentAddresses() + Raise the 90-character limit on Bech32 encodings + Add Sapling support to z_getnewaddress and z_listaddresses + Fix block hash for checkpoint at height 270000 + Formatting + test: Deduplicate logic in wallet_addresses RPC test + test: Another assert in wallet_zkeys_tests.store_and_load_sapling_zkeys + test: Fix permissions of wallet_addresses + test: Update rpc_wallet_z_importexport to account for Sapling changes + Rename DecryptSpendingKey -> DecryptSproutSpendingKey + Rename CryptedSpendingKeyMap -> CryptedSproutSpendingKeyMap + Add Sapling decryption check to CCryptoKeyStore::Unlock() + Check for unencrypted Sapling keys in CCryptoKeyStore::SetCrypted() + Remove outdated comment + Add CWallet::AddCryptedSaplingSpendingKey() hook + Pass SaplingPaymentAddress to store through the CKeyStore + Rename SpendingKeyMap -> SproutSpendingKeyMap + Rename Serialized*Size -> SerializedSprout*Size + Rename *ViewingKey* -> *SproutViewingKey* + Formatting nits + Rename *SpendingKey -> *SproutSpendingKey + chainparams: Add BIP 44 coin type (as registered in SLIP 44) + Upgrade Rust to 1.28.0 stable + Adjust Makefile so that common can be used by the wallet + Move RewindBlockIndex log message inside rewindLength check + +Jay Graber (13): + Add Sapling Add/Have/Get to keystore + Add SaplingIncomingViewingKeys map, SaplingFullViewingKey methods + Add StoreAndRetrieveSaplingSpendingKey test + Change default_address to return SaplingPaymentAddr and not boost::optional + Add crypted keystore sapling add key + Discard sk if ivk == 0 + Add Sapling support to z_exportkey + Add Sapling support to z_importkey + Add Sapling to rpc_wallet_z_importexport test + Refactor into visitors and throw errors for invalid key or address. + Take expiryheight as param to createrawtransaction + Add Sapling have/get sk crypter overrides + Add Sapling keys to CCryptoKeyStore::EncryptKeys + +Jonas Schnelli (2): + [RPC, Wallet] Move RPC dispatch table registration to wallet/ code + Fix test_bitcoin circular dependency issue + +Kaz Wesley (1): + IsInitialBlockDownload: usually avoid locking + +Larry Ruane (4): + Disable libsnark debug logging in Boost tests + add extra help how to enable experimental features + Add call to sync_all() after (z_sendmany, wait) + don't ban peers when loading pre-overwinter blocks + +Pejvan (2): + Update README.md + Update README.md + +Richard Littauer (1): + docs(LICENSE): update license year to 2018 + +Sean Bowe (18): + Update librustzcash + Implementation of Sapling in-band secret distribution. + Swap types in OutputDescription to use new NoteEncryption interfaces. + Prevent nonce reuse in Sapling note encryption API. + Add get_esk() function to Sapling note encryption. + Minor edits + Decryption and tests of note/outgoing encryption. + Update librustzcash and sapling-crypto. + Fix bug in return value. + Ensure sum of valueBalance and all vpub_new's does not exceed MAX_MONEY inside of CheckTransactionWithoutProofVerification. + Move `extern params` to beginning of `test_checktransaction`. + Relocate ECC_Start() to avoid test failures. + Don't call ECC_Start/ECC_Stop outside the test harness. + Make changes to gtest ECC behavior suggested by @str4d. + Check the hash of the (Sapling+) zk-SNARK parameters during initialization. + Switch to use the official Sapling parameters. + make-release.py: Versioning changes for 2.0.0-rc1. + make-release.py: Updated manpages for 2.0.0-rc1. + +Simon Liu (9): + Add encryption of SaplingNotePlaintext and SaplingOutgoingPlaintext classes. + Update and fix per review comments, the test for absurd fee. + Minor update to address nits in review. + Implement Sapling note decryption using full viewing key. + Rename AttemptSaplingEncDecryptionUsingFullViewingKey and use function overloading. + Only check for a valid Sapling anchor after Sapling activation. + Clean up for rebase: rename mapNoteData to mapSproutNoteData. + Clean up help messages for RPC createrawtransaction. + Add tests for expiryheight parameter of RPC createrawtransaction. + +Wladimir J. van der Laan (2): + Make max tip age an option instead of chainparam + rpc: Register calls where they are defined + +kozyilmaz (1): + Add -Wl,-pie linker option for macOS and use it instead of -pie + +mdr0id (1): + Fix minor references to auto-senescence in code + diff --git a/doc/release-notes/release-notes-2.0.0.md b/doc/release-notes/release-notes-2.0.0.md new file mode 100644 index 000000000..7dcbf5d6a --- /dev/null +++ b/doc/release-notes/release-notes-2.0.0.md @@ -0,0 +1,199 @@ +Notable changes +=============== + +Sapling network upgrade +----------------------- + +The activation height for the Sapling network upgrade on mainnet is included +in this release. Sapling will activate on mainnet at height 419200, which is +expected to be mined on the 28th of October 2018. Please upgrade to this release, +or any subsequent release, in order to follow the Sapling network upgrade. + +The testnet is being rolled back in this release to Overwinter. Sapling will +activate on testnet at height 280000. Please update your testnet nodes before +then. + +Changelog +========= + +Alex Morcos (1): + Output line to debug.log when IsInitialBlockDownload latches to false + +Ariel Gabizon (1): + Extend Joinsplit tests to Groth + +Charlie OKeefe (1): + Remove extra slash from lockfile path + +Cory Fields (1): + crypter: shuffle Makefile so that crypto can be used by the wallet + +Daira Hopwood (1): + Support testnet rollback. + +Daniel Cousens (2): + move rpc* to rpc/ + rpc: update inline comments to refer to new file paths + +Dimitris Apostolou (1): + Fix typos + +Duke Leto (3): + Fix absurd fee bug reported in #3281, with tests + Update comment as per @arielgabizon + Improve error message + +Eirik Ogilvie-Wigley (24): + Add more options when asserting in RPC tests + Add change indicator for notes + Fix test broken by change indicator + Rename note data to include sprout + Remove redundant curly braces + Consolidate for loops + Add out point for sapling note data + Add sapling note data and map + Decrement sapling note witnesses + Clear sapling witness cache + Extract method for copying previous witnesses + Extract methods for incrementing witnesses + Extract method for incrementing witness heights + Pass sapling merkle tree when incrementing witnesses + Increment sapling note witnesses + Rename sprout specific methods + Remove extra indentation + Add getter and setter for sapling note data and update tests + Add parameter for version in GetValidReceive + Rename Merkle Trees to include sprout or sapling + Rename Witnesses to include sprout or sapling + Rename test objects to include sprout or sapling + Only include the change field if we have a spending key + Fix assertion and comment + +Gregory Maxwell (2): + IBD check uses minimumchain work instead of checkpoints. + IsInitialBlockDownload no longer uses header-only timestamps. + +Jack Grigg (41): + Add some more checkpoints, up to the 1.1.0 release + Add Sapling support to z_validateaddress + Update payment-api.md with type field of z_validateaddress + Alter SaplingNote::nullifier() to take a SaplingFullViewingKey + Expose note position in IncrementalMerkleWitness + TransactionBuilder with support for creating Sapling-only transactions + TransactionBuilder: Check that all anchors in a transaction are identical + Formatting + test: Move ECC_Start() call into src/gtest/main.cpp + TransactionBuilder: Add support for transparent inputs and outputs + TransactionBuilder: Add change output to transaction + TransactionBuilder: Make fee configurable + Rename xsk to expsk + Implement CKeyStore::GetSaplingPaymentAddresses() + Raise the 90-character limit on Bech32 encodings + Add Sapling support to z_getnewaddress and z_listaddresses + Fix block hash for checkpoint at height 270000 + Formatting + test: Deduplicate logic in wallet_addresses RPC test + test: Another assert in wallet_zkeys_tests.store_and_load_sapling_zkeys + test: Fix permissions of wallet_addresses + test: Update rpc_wallet_z_importexport to account for Sapling changes + Rename DecryptSpendingKey -> DecryptSproutSpendingKey + Rename CryptedSpendingKeyMap -> CryptedSproutSpendingKeyMap + Add Sapling decryption check to CCryptoKeyStore::Unlock() + Check for unencrypted Sapling keys in CCryptoKeyStore::SetCrypted() + Remove outdated comment + Add CWallet::AddCryptedSaplingSpendingKey() hook + Pass SaplingPaymentAddress to store through the CKeyStore + Rename SpendingKeyMap -> SproutSpendingKeyMap + Rename Serialized*Size -> SerializedSprout*Size + Rename *ViewingKey* -> *SproutViewingKey* + Formatting nits + Rename *SpendingKey -> *SproutSpendingKey + chainparams: Add BIP 44 coin type (as registered in SLIP 44) + Upgrade Rust to 1.28.0 stable + Adjust Makefile so that common can be used by the wallet + Move RewindBlockIndex log message inside rewindLength check + test: gtest for Sapling encoding and decoding + test: Use regtest in key_tests/zs_address_test + Disable Sapling features on mainnet + +Jay Graber (13): + Add Sapling Add/Have/Get to keystore + Add SaplingIncomingViewingKeys map, SaplingFullViewingKey methods + Add StoreAndRetrieveSaplingSpendingKey test + Change default_address to return SaplingPaymentAddr and not boost::optional + Add crypted keystore sapling add key + Discard sk if ivk == 0 + Add Sapling support to z_exportkey + Add Sapling support to z_importkey + Add Sapling to rpc_wallet_z_importexport test + Refactor into visitors and throw errors for invalid key or address. + Take expiryheight as param to createrawtransaction + Add Sapling have/get sk crypter overrides + Add Sapling keys to CCryptoKeyStore::EncryptKeys + +Jonas Schnelli (2): + [RPC, Wallet] Move RPC dispatch table registration to wallet/ code + Fix test_bitcoin circular dependency issue + +Kaz Wesley (1): + IsInitialBlockDownload: usually avoid locking + +Larry Ruane (4): + Disable libsnark debug logging in Boost tests + add extra help how to enable experimental features + Add call to sync_all() after (z_sendmany, wait) + don't ban peers when loading pre-overwinter blocks + +Pejvan (2): + Update README.md + Update README.md + +Richard Littauer (1): + docs(LICENSE): update license year to 2018 + +Sean Bowe (21): + Update librustzcash + Implementation of Sapling in-band secret distribution. + Swap types in OutputDescription to use new NoteEncryption interfaces. + Prevent nonce reuse in Sapling note encryption API. + Add get_esk() function to Sapling note encryption. + Minor edits + Decryption and tests of note/outgoing encryption. + Update librustzcash and sapling-crypto. + Fix bug in return value. + Ensure sum of valueBalance and all vpub_new's does not exceed MAX_MONEY inside of CheckTransactionWithoutProofVerification. + Move `extern params` to beginning of `test_checktransaction`. + Relocate ECC_Start() to avoid test failures. + Don't call ECC_Start/ECC_Stop outside the test harness. + Make changes to gtest ECC behavior suggested by @str4d. + Check the hash of the (Sapling+) zk-SNARK parameters during initialization. + Switch to use the official Sapling parameters. + make-release.py: Versioning changes for 2.0.0-rc1. + make-release.py: Updated manpages for 2.0.0-rc1. + make-release.py: Updated release notes and changelog for 2.0.0-rc1. + Always write the empty root down as the best root, since we may roll back. + Sapling mainnet activation height + +Simon Liu (11): + Add encryption of SaplingNotePlaintext and SaplingOutgoingPlaintext classes. + Update and fix per review comments, the test for absurd fee. + Minor update to address nits in review. + Implement Sapling note decryption using full viewing key. + Rename AttemptSaplingEncDecryptionUsingFullViewingKey and use function overloading. + Only check for a valid Sapling anchor after Sapling activation. + Clean up for rebase: rename mapNoteData to mapSproutNoteData. + Clean up help messages for RPC createrawtransaction. + Add tests for expiryheight parameter of RPC createrawtransaction. + make-release.py: Versioning changes for 2.0.0. + make-release.py: Updated manpages for 2.0.0. + +Wladimir J. van der Laan (2): + Make max tip age an option instead of chainparam + rpc: Register calls where they are defined + +kozyilmaz (1): + Add -Wl,-pie linker option for macOS and use it instead of -pie + +mdr0id (1): + Fix minor references to auto-senescence in code + diff --git a/doc/release-notes/release-notes-2.0.1-rc1.md b/doc/release-notes/release-notes-2.0.1-rc1.md new file mode 100644 index 000000000..683d5ed22 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.1-rc1.md @@ -0,0 +1,244 @@ +Notable changes +=============== + +Hierarchical Deterministic Key Generation for Sapling +----------------------------------------------------- +All Sapling addresses will use hierarchical deterministic key generation +according to ZIP 32 (keypath m/32'/133'/k' on mainnet). Transparent and +Sprout addresses will still use traditional key generation. + +Backups of HD wallets, regardless of when they have been created, can +therefore be used to re-generate all possible Sapling private keys, even the +ones which haven't already been generated during the time of the backup. +Regular backups are still necessary, however, in order to ensure that +transparent and Sprout addresses are not lost. + +[Pull request](https://github.com/zcash/zcash/pull/3492), [ZIP 32](https://github.com/zcash/zips/blob/master/zip-0032.mediawiki) + +Changelog +========= + +David Mercer (2): + libsnark: convert long long and unsigned long to C++11 fixed-width types + libsnark: convert 0ul to UINT64_C(0) + +Eirik Ogilvie-Wigley (22): + Rename map to include sprout + Add sapling spending keys to z_exportwallet + Rename AddZKey to include sprout + Move AddSpendingKeyToWallet + Return more information when adding a spending key + Add sapling support to z_importwallet + Export comment on HDSeed and fingerprint with wallet + Export zip32 metadata with sapling keys + Don't export empty zip32 metadata + Allow more information to be returned when an async rpc fails + Use utility method to wait for async operations + Remove unneeded semicolons + Remove unused imports + Allow passing timeout parameter to wait_and_assert_operationid_status + Add test for signing raw transactions offline + Incorporate APPROX_RELEASE_HEIGHT when determining what consensus branch to sign with + Allow passing branchId when calling signrawtransaction + Remove unused import + Address need not be optional when adding sapling keys + Use max priority for all shielded transfers + Move FIXME comment to where the fix should happen + Add newly discovered sapling addresses to the wallet + +George Tankersley (2): + Refactor ContextualCheckBlock tests (#3187) + Refactor ContextualCheckBlock tests + +Jack Grigg (83): + [ci-workers] Install Python modules in a virtualenv + [ci-workers] Handle user home directories outside /home + [ci-workers] Handle ansible_processor being either a string or a list + [ci-workers] Add support for MacOSX + [ci-workers] Add a tag for updating dependencies + [ci-workers] Add curl and cmake to dependencies + [ci-workers] README cleanups + [ci-workers] Add pkg-config to general dependencies + depends: Correctly configure Rust when cross-compiling + depends: Configure librustzcash for cross-compiling + depends: Fix BDB naming issue when cross-compiling + zcutil/build.sh: Use $HOST to specify the depends prefix + configure: Don't require RELRO and BIND_NOW when cross-compiling + Measure Windows console size for metrics UI + Use -O1 for darwin and mingw32 release builds + Clean up libzcash CPPFLAGS, CXXFLAGS, and LDFLAGS + zcutil/build.sh: Use config.site to set default ./configure settings + zcutil/build.sh: Remove --enable-werror from default configuration + Pass correct compiler, linker, and flags into libsnark + Use boost::filesystem::path::string() instead of path::native() + Metrics UI: Enable virtual terminal sequence processing on Windows + Metrics UI: Tell Windows users how to stop zcashd + depends: Pass correct compiler, linker, and flags into googletest + configure: Don't add -ldl to RUST_LIBS for mingw32 + test: Fix comment in WalletTests.FindMySaplingNotes + Add Sapling support to GetFilteredNotes() and GetUnspentFilteredNotes() + Add Sapling support to z_getbalance and z_gettotalbalance + Metrics UI: Fall back to 80 cols if GetConsoleScreenBufferInfo() fails + libsnark: Adjust SHA256 K value type to match the constant + libsnark: Use mp_limb_t cast instead of uint64_t when masking bigint.data + libsnark: Fix stale comment + rpc: Clarify Sprout shielded addresses in help text + rpc: Clarify ivk balance issues in help text + Move GetSpendingKeyForPaymentAddress visitor into wallet.h + wallet: Add HaveSpendingKeyForPaymentAddress visitor + rpcwallet: Add TransactionBuilder argument to AsyncRPCOperation_sendmany + rpcwallet: Prevent use of both Sprout and Sapling addresses in z_sendmany + rpcwallet: Add Sapling support to z_sendmany + Define additional booleans for readability + Ensure SCOPED_TRACE falls out of scope when necessary + Revert NU activation heights in reverse order + Fix test after refactor to check bacd-cb-height rule on a genesis block + Rename GetFirstBlockTransaction() to GetFirstBlockCoinbaseTx() + libsnark: Force constants used in test comparisons to be unsigned + libsnark: Use format macro constants for printing fixed-width values + Rename z_inputs_ to z_sprout_inputs_ + Minor cleanups + Fix RPC test that checks exact wording of cleaned-up error message + Fix file permissions of wallet_sapling RPC test + Update librustzcash with ZIP 32 APIs + ZIP 32 Sapling structs + Store HDSeed in CBasicKeyStore + Store HDSeed in CCryptoKeyStore + wallet: Store HDSeed and chain data + wallet: Store Sapling key metadata indexed by ivk + wallet: Switch from SaplingSpendingKey to SaplingExtendedSpendingKey + init: Generate a new HD seed on startup + wallet: Comment out HDSeed and CHDChain persistence to disk + Add ZIP 32 usage to release notes + wallet: Don't allow an HDSeed to be overwritten + Bugfix: Use time instead of block height for Sapling key metadata + net: Check against the current epoch's version when rejecting nodes + Extract a helper method for finding the next epoch + net: Check against the next epoch's version when evicting peers + net: Check against the current epoch's version when disconnecting peers + qa: Test both Overwinter and Sapling peer management + Use ovk directly in the TransactionBuilder API instead of fvk + Generate an ovk to encrypt outCiphertext for t-addr senders + Revert "Disable Sapling features on mainnet" + Use the correct empty memo for Sapling outputs + Add Sapling support to z_shieldcoinbase + Revert "Get rid of consensus.fPowAllowMinDifficultyBlocks." + Revert "Remove testnet-only difficulty rules" + Allow minimum-difficulty blocks on testnet and regtest + Only enable min-difficulty blocks on testnet from a particular height + Update wallet_listreceived test for now-correct empty Sapling memos + Rename min-difficulty flag to remove off-by-one in the name + Explicitly check the min-difficulty flag against boost::none + Position PoW.MinDifficultyRules test after rule activates + Fix pyflakes warnings + Store ExtFVK with encrypted Sapling spending key instead of FVK + Persist Sapling payment address to IVK map + Ignore decoding errors during -zapwallettxes + +Jay Graber (5): + s/jsoutindex/outindex for sapling outputs + z_listunspent sapling support - needs refactor + Add rpc test for sprout txs z_listunspent + Modify comments + Modify GetNullifiersForAddresses for Sapling + +Jonas Schnelli (3): + [Wallet] extend CKeyMetadata with HD keypath Zcash: modified for zip32 + [Wallet] print hd masterkeyid in getwalletinfo Zcash: modified for zip32 + [Wallet] ensure CKeyMetadata.hdMasterKeyID will be cleared during SetNull() Zcash: modified for zip32 + +Larry Ruane (5): + generalize mininode.py protocol versioning + Test peer banning logic in both pre- and post-initial block download states + Sapling support for z_listreceivedbyaddress + z_listunspent rpc unit test: add testing for Sapling + fix z_listunspent includeWatchonly logic + +Marius Kjærstad (3): + Fix for license not being valid + Update debian package copyright license + Missing comma in debian package copyright license + +Sean Bowe (1): + Check commitment validity within the decryption API for Sapling note plaintexts. + +Simon Liu (59): + Rename FindMyNotes to FindMySproutNotes. + Rename GetNoteNullifier to GetSproutNoteNullifier. + Rename mapNullifiersToNotes to mapSproutNullifiersToNotes. + Rename CWallet::AddToSpends methods for clarity. + Rename mapTxNullifiers to mapTxSproutNullifiers. + Add ivk member variable and equality comparators to SaplingNoteData class. + Update CWallet::MarkAffectedTransactionsDirty() for Sapling. + Update CWallet::UpdatedNoteData() for Sapling. + Create CWallet::AddToSaplingSpends() to track Sapling nullifiers. + Update test to pass in required cm to SaplingNotePlaintext::decrypt(). + Create CWallet::FindMySaplingNotes() + Rename IsFromMe(nullifier) to IsSproutNullifierFromMe(nullifier). + Create CWallet::IsSaplingNullifierFromMe() + Remove dead code in CWalletTx::GetAmounts() as filed in issue #3434. + Cleanup CWalletTx::GetAmounts() for clarity. No-op. + Update CWalletTx::GetAmounts() to return COutputEntry for Sapling valueBalance. + Add caching and updating of Sapling note nullifier. + Update CWallet::IsSpent() to check Sapling nullifiers. + Clean up names of unit tests in gtest/test_wallet.cpp. + Add test for CWalletTx::SetSaplingNoteData() + Iterate over mapSaplingFullViewingKeys with ivk->fvk mapping (1:1). + Refactor IsSpent(nullifier) for Sprout and Sapling domain separation. + Fix code review nits. + Add two new wallet tests: FindMySaplingNotes, SaplingNullifierIsSpent. + Add new wallet test: NavigateFromSaplingNullifierToNote + Add new wallet test: UpdatedSaplingNoteData. + Add new wallet tests: SpentSaplingNoteIsFromMe. + Rename wallet tests for clarity between Sprout and Sapling. + Fix typo in variable name in test. + Fix inaccurate comments in test. + Fix typo in parameter name. + Update CWallet::GetConflicts for Sapling. + Add new wallet test: SetSaplingNoteAddrsInCWalletTx. + Add new wallet test: GetConflictedSaplingNotes + Add new wallet test: MarkAffectedSaplingTransactionsDirty + Update wallet unit tests to revert upgraded network parameters. + Clean up wallet unit tests: replace .value() with .get() for clarity. + Fix comment in CWallet::SyncMetaData. + Refactor: rename setLockedNotes -> setLockedSproutNotes + Refactor: rename UnlockAllNotes -> UnlockAllSproutNotes + Refactor: rename ListLockedNotes -> ListLockedSproutNotes + Add methods to store SaplingOutPoint in setLockedSaplingNotes + Add unit test SaplingNoteLocking + Update comment for test ContextualCheckBlockTest.BlockSproutRulesRejectOtherTx + Add Sapling fields to JSON RPC output using TxToJSON. + Update qa test to check for Sapling related JSON fields. + Closes #3534. Do not use APPROX_RELEASE_HEIGHT to get consensus branch id when in regtest mode. + For #3533. Replace asserts with JSON errors. + Update qa test as offline regtest nodes need branch id passed in. + Fix rebasing of CWallet::GetNullifiersForAddresses + Cleanup to address review comments. + Add test that Sapling shielded transactions have MAX_PRIORITY + Closes #3560. Update Sapling note data correctly when importing a key. + For #3546. Shielded tx with missing inputs are not treated as orphans. + For #3546. Improve estimated tx size for Sapling outputs. + Fix deadlock from calling CWallet::AddSaplingIncomingViewingKey instead of CBasicKeyStore::AddSaplingIncomingViewingKey + Fix file permissions of QA test wallet_persistence.py + Update wallet_persistence test to verify wallet txs are persisted across restarts. + Update wallet_persistence test to verify spending notes after restart. + +WO (4): + Fix a bug of Windows binary + Add an assert for num_bits function + long -> int64_t + The long data type is replaced with int64_t + +Za Wilcox (1): + Revise help output for z_sendmany + +mdr0id (8): + Resolve final edits for README + Revert "wallet: Comment out HDSeed and CHDChain persistence to disk" + Persist Sapling key material in the wallet to disk + Serialize Sapling data in CWalletTx + Adding in rpc wallet sap for test_bitcoin + Add gtest coverage of Sapling wallet persistence + make-release.py: Versioning changes for 2.0.1-rc1. + make-release.py: Updated manpages for 2.0.1-rc1. + diff --git a/doc/release-notes/release-notes-2.0.1.md b/doc/release-notes/release-notes-2.0.1.md new file mode 100644 index 000000000..b4dad7c25 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.1.md @@ -0,0 +1,276 @@ +Notable changes +=============== + +Enabled Sapling features for mainnet +------------------------------------ +This release adds significant support for Sapling to the wallet and RPC interface. Sapling will activate at block 419200, which is expected to be mined on the 28th of October 2018. Users running v2.0.0 nodes (which are consensus-compatible with Sapling) will follow the network upgrade, but must upgrade to v2.0.1 in order to send or receive Sapling shielded transactions. + +Minimum Difficulty Blocks allowed on testnet +-------------------------------------------- +Sapling activated on testnet at block 280000. Users running v2.0.0 nodes should upgrade to v2.0.1 which introduces a consensus rule change to allow minimum difficulty blocks to be mined from block 299188, thereby splitting the chain. In addition, users running v2.0.1 nodes no longer need to specify `-experimentalfeatures` and `-developersapling` to use Sapling functionality on testnet. + +[Pull request](https://github.com/zcash/zcash/pull/3559) + +Hierarchical Deterministic Key Generation for Sapling +----------------------------------------------------- +All Sapling addresses will use hierarchical deterministic key generation +according to ZIP 32 (keypath m/32'/133'/k' on mainnet). Transparent and +Sprout addresses will still use traditional key generation. + +Backups of HD wallets, regardless of when they have been created, can +therefore be used to re-generate all possible Sapling private keys, even the +ones which haven't already been generated during the time of the backup. +Regular backups are still necessary, however, in order to ensure that +transparent and Sprout addresses are not lost. + +[Pull request](https://github.com/zcash/zcash/pull/3492), [ZIP 32](https://github.com/zcash/zips/blob/master/zip-0032.mediawiki) + +Fix Signing Raw Transactions with Unsynced Offline Nodes +-------------------------------------------------------- +With v2.0.0, in `signrawtransaction` the consensus branch ID (which is used to construct the transaction) was estimated using the chain height. With v2.0.1 this has been improved by also considering the `APPROX_RELEASE_HEIGHT` of the release, and a new parameter to allow the caller to manually override the consensus branch ID that zcashd will use. + +[Pull request](https://github.com/zcash/zcash/pull/3520) + + +Changelog +========= + +David Mercer (2): + libsnark: convert long long and unsigned long to C++11 fixed-width types + libsnark: convert 0ul to UINT64_C(0) + +Eirik Ogilvie-Wigley (24): + Rename map to include sprout + Add sapling spending keys to z_exportwallet + Rename AddZKey to include sprout + Move AddSpendingKeyToWallet + Return more information when adding a spending key + Add sapling support to z_importwallet + Export comment on HDSeed and fingerprint with wallet + Export zip32 metadata with sapling keys + Don't export empty zip32 metadata + Allow more information to be returned when an async rpc fails + Use utility method to wait for async operations + Remove unneeded semicolons + Remove unused imports + Allow passing timeout parameter to wait_and_assert_operationid_status + Add test for signing raw transactions offline + Incorporate APPROX_RELEASE_HEIGHT when determining what consensus branch to sign with + Allow passing branchId when calling signrawtransaction + Remove unused import + Address need not be optional when adding sapling keys + Use max priority for all shielded transfers + Move FIXME comment to where the fix should happen + Add newly discovered sapling addresses to the wallet + Fix HDSeed comment + Better error message when sending to both sprout and sapling + +George Tankersley (2): + Refactor ContextualCheckBlock tests (#3187) + Refactor ContextualCheckBlock tests + +Jack Grigg (83): + [ci-workers] Install Python modules in a virtualenv + [ci-workers] Handle user home directories outside /home + [ci-workers] Handle ansible_processor being either a string or a list + [ci-workers] Add support for MacOSX + [ci-workers] Add a tag for updating dependencies + [ci-workers] Add curl and cmake to dependencies + [ci-workers] README cleanups + [ci-workers] Add pkg-config to general dependencies + depends: Correctly configure Rust when cross-compiling + depends: Configure librustzcash for cross-compiling + depends: Fix BDB naming issue when cross-compiling + zcutil/build.sh: Use $HOST to specify the depends prefix + configure: Don't require RELRO and BIND_NOW when cross-compiling + Measure Windows console size for metrics UI + Use -O1 for darwin and mingw32 release builds + Clean up libzcash CPPFLAGS, CXXFLAGS, and LDFLAGS + zcutil/build.sh: Use config.site to set default ./configure settings + zcutil/build.sh: Remove --enable-werror from default configuration + Pass correct compiler, linker, and flags into libsnark + Use boost::filesystem::path::string() instead of path::native() + Metrics UI: Enable virtual terminal sequence processing on Windows + Metrics UI: Tell Windows users how to stop zcashd + depends: Pass correct compiler, linker, and flags into googletest + configure: Don't add -ldl to RUST_LIBS for mingw32 + test: Fix comment in WalletTests.FindMySaplingNotes + Add Sapling support to GetFilteredNotes() and GetUnspentFilteredNotes() + Add Sapling support to z_getbalance and z_gettotalbalance + Metrics UI: Fall back to 80 cols if GetConsoleScreenBufferInfo() fails + libsnark: Adjust SHA256 K value type to match the constant + libsnark: Use mp_limb_t cast instead of uint64_t when masking bigint.data + libsnark: Fix stale comment + rpc: Clarify Sprout shielded addresses in help text + rpc: Clarify ivk balance issues in help text + Move GetSpendingKeyForPaymentAddress visitor into wallet.h + wallet: Add HaveSpendingKeyForPaymentAddress visitor + rpcwallet: Add TransactionBuilder argument to AsyncRPCOperation_sendmany + rpcwallet: Prevent use of both Sprout and Sapling addresses in z_sendmany + rpcwallet: Add Sapling support to z_sendmany + Define additional booleans for readability + Ensure SCOPED_TRACE falls out of scope when necessary + Revert NU activation heights in reverse order + Fix test after refactor to check bacd-cb-height rule on a genesis block + Rename GetFirstBlockTransaction() to GetFirstBlockCoinbaseTx() + libsnark: Force constants used in test comparisons to be unsigned + libsnark: Use format macro constants for printing fixed-width values + Rename z_inputs_ to z_sprout_inputs_ + Minor cleanups + Fix RPC test that checks exact wording of cleaned-up error message + Fix file permissions of wallet_sapling RPC test + Update librustzcash with ZIP 32 APIs + ZIP 32 Sapling structs + Store HDSeed in CBasicKeyStore + Store HDSeed in CCryptoKeyStore + wallet: Store HDSeed and chain data + wallet: Store Sapling key metadata indexed by ivk + wallet: Switch from SaplingSpendingKey to SaplingExtendedSpendingKey + init: Generate a new HD seed on startup + wallet: Comment out HDSeed and CHDChain persistence to disk + Add ZIP 32 usage to release notes + wallet: Don't allow an HDSeed to be overwritten + Bugfix: Use time instead of block height for Sapling key metadata + net: Check against the current epoch's version when rejecting nodes + Extract a helper method for finding the next epoch + net: Check against the next epoch's version when evicting peers + net: Check against the current epoch's version when disconnecting peers + qa: Test both Overwinter and Sapling peer management + Use ovk directly in the TransactionBuilder API instead of fvk + Generate an ovk to encrypt outCiphertext for t-addr senders + Revert "Disable Sapling features on mainnet" + Use the correct empty memo for Sapling outputs + Add Sapling support to z_shieldcoinbase + Revert "Get rid of consensus.fPowAllowMinDifficultyBlocks." + Revert "Remove testnet-only difficulty rules" + Allow minimum-difficulty blocks on testnet and regtest + Only enable min-difficulty blocks on testnet from a particular height + Update wallet_listreceived test for now-correct empty Sapling memos + Rename min-difficulty flag to remove off-by-one in the name + Explicitly check the min-difficulty flag against boost::none + Position PoW.MinDifficultyRules test after rule activates + Fix pyflakes warnings + Store ExtFVK with encrypted Sapling spending key instead of FVK + Persist Sapling payment address to IVK map + Ignore decoding errors during -zapwallettxes + +Jay Graber (5): + s/jsoutindex/outindex for sapling outputs + z_listunspent sapling support - needs refactor + Add rpc test for sprout txs z_listunspent + Modify comments + Modify GetNullifiersForAddresses for Sapling + +Jonas Schnelli (3): + [Wallet] extend CKeyMetadata with HD keypath Zcash: modified for zip32 + [Wallet] print hd masterkeyid in getwalletinfo Zcash: modified for zip32 + [Wallet] ensure CKeyMetadata.hdMasterKeyID will be cleared during SetNull() Zcash: modified for zip32 + +Jonathan "Duke" Leto (1): + Fix some typos in rpc-tests readme + +Larry Ruane (5): + generalize mininode.py protocol versioning + Test peer banning logic in both pre- and post-initial block download states + Sapling support for z_listreceivedbyaddress + z_listunspent rpc unit test: add testing for Sapling + fix z_listunspent includeWatchonly logic + +Marius Kjærstad (3): + Fix for license not being valid + Update debian package copyright license + Missing comma in debian package copyright license + +Sean Bowe (1): + Check commitment validity within the decryption API for Sapling note plaintexts. + +Simon Liu (68): + Rename FindMyNotes to FindMySproutNotes. + Rename GetNoteNullifier to GetSproutNoteNullifier. + Rename mapNullifiersToNotes to mapSproutNullifiersToNotes. + Rename CWallet::AddToSpends methods for clarity. + Rename mapTxNullifiers to mapTxSproutNullifiers. + Add ivk member variable and equality comparators to SaplingNoteData class. + Update CWallet::MarkAffectedTransactionsDirty() for Sapling. + Update CWallet::UpdatedNoteData() for Sapling. + Create CWallet::AddToSaplingSpends() to track Sapling nullifiers. + Update test to pass in required cm to SaplingNotePlaintext::decrypt(). + Create CWallet::FindMySaplingNotes() + Rename IsFromMe(nullifier) to IsSproutNullifierFromMe(nullifier). + Create CWallet::IsSaplingNullifierFromMe() + Remove dead code in CWalletTx::GetAmounts() as filed in issue #3434. + Cleanup CWalletTx::GetAmounts() for clarity. No-op. + Update CWalletTx::GetAmounts() to return COutputEntry for Sapling valueBalance. + Add caching and updating of Sapling note nullifier. + Update CWallet::IsSpent() to check Sapling nullifiers. + Clean up names of unit tests in gtest/test_wallet.cpp. + Add test for CWalletTx::SetSaplingNoteData() + Iterate over mapSaplingFullViewingKeys with ivk->fvk mapping (1:1). + Refactor IsSpent(nullifier) for Sprout and Sapling domain separation. + Fix code review nits. + Add two new wallet tests: FindMySaplingNotes, SaplingNullifierIsSpent. + Add new wallet test: NavigateFromSaplingNullifierToNote + Add new wallet test: UpdatedSaplingNoteData. + Add new wallet tests: SpentSaplingNoteIsFromMe. + Rename wallet tests for clarity between Sprout and Sapling. + Fix typo in variable name in test. + Fix inaccurate comments in test. + Fix typo in parameter name. + Update CWallet::GetConflicts for Sapling. + Add new wallet test: SetSaplingNoteAddrsInCWalletTx. + Add new wallet test: GetConflictedSaplingNotes + Add new wallet test: MarkAffectedSaplingTransactionsDirty + Update wallet unit tests to revert upgraded network parameters. + Clean up wallet unit tests: replace .value() with .get() for clarity. + Fix comment in CWallet::SyncMetaData. + Refactor: rename setLockedNotes -> setLockedSproutNotes + Refactor: rename UnlockAllNotes -> UnlockAllSproutNotes + Refactor: rename ListLockedNotes -> ListLockedSproutNotes + Add methods to store SaplingOutPoint in setLockedSaplingNotes + Add unit test SaplingNoteLocking + Update comment for test ContextualCheckBlockTest.BlockSproutRulesRejectOtherTx + Add Sapling fields to JSON RPC output using TxToJSON. + Update qa test to check for Sapling related JSON fields. + Closes #3534. Do not use APPROX_RELEASE_HEIGHT to get consensus branch id when in regtest mode. + For #3533. Replace asserts with JSON errors. + Update qa test as offline regtest nodes need branch id passed in. + Fix rebasing of CWallet::GetNullifiersForAddresses + Cleanup to address review comments. + Add test that Sapling shielded transactions have MAX_PRIORITY + Closes #3560. Update Sapling note data correctly when importing a key. + For #3546. Shielded tx with missing inputs are not treated as orphans. + For #3546. Improve estimated tx size for Sapling outputs. + Fix deadlock from calling CWallet::AddSaplingIncomingViewingKey instead of CBasicKeyStore::AddSaplingIncomingViewingKey + Fix file permissions of QA test wallet_persistence.py + Update wallet_persistence test to verify wallet txs are persisted across restarts. + Update wallet_persistence test to verify spending notes after restart. + Resolves Sapling nullifier persistence issue when importing a key. + Update test to verify Sapling nullifiers and witnesses persist correctly. + For #3359. RPCs transferring funds return error if Sapling addresses are used before Sapling activation. + For #3359. Return error if Sapling addresses passed to RPC z_mergetoaddress. + Update mainnet checkpoint for block 410100. + Update release notes for v2.0.1 + Update release-notes.md for clarity. + make-release.py: Versioning changes for 2.0.1. + make-release.py: Updated manpages for 2.0.1. + +WO (4): + Fix a bug of Windows binary + Add an assert for num_bits function + long -> int64_t + The long data type is replaced with int64_t + +Za Wilcox (1): + Revise help output for z_sendmany + +mdr0id (9): + Resolve final edits for README + Revert "wallet: Comment out HDSeed and CHDChain persistence to disk" + Persist Sapling key material in the wallet to disk + Serialize Sapling data in CWalletTx + Adding in rpc wallet sap for test_bitcoin + Add gtest coverage of Sapling wallet persistence + make-release.py: Versioning changes for 2.0.1-rc1. + make-release.py: Updated manpages for 2.0.1-rc1. + make-release.py: Updated release notes and changelog for 2.0.1-rc1. + diff --git a/doc/release-notes/release-notes-2.0.2-rc1.md b/doc/release-notes/release-notes-2.0.2-rc1.md new file mode 100644 index 000000000..f79e0fd57 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.2-rc1.md @@ -0,0 +1,106 @@ +Notable changes +=============== + +Other issues +============ + +Revoked key error when upgrading on Debian +------------------------------------------ + +If you see the following error when updating to a new version of zcashd: + +`The following signatures were invalid: REVKEYSIG AEFD26F966E279CD` + +Remove the key marked as revoked: + +`sudo apt-key del AEFD26F966E279CD` + +Then retrieve the updated key: + +`wget -qO - https://apt.z.cash/zcash.asc | sudo apt-key add -` + +Then update the package lists: + +`sudo apt-get update` + +[Issue](https://github.com/zcash/zcash/issues/3612) + +Changelog +========= + +Charlie O'Keefe (2): + Save and restore current_path in TestingSetup constructor/destructor + Add a call to SetupNetworking in BasicTestingSetup + +Eirik Ogilvie-Wigley (17): + Rename GenerateNewZKey to include Sprout + GenerateNewSproutZKey can return a SproutPaymentAddress + Remove unnecessary call to IsValidPaymentAddress + Remove unspent note entry structs + Add functionality from GetUnspentFilteredNotes to GetFilteredNotes + Remove GetUnspentFilteredNotes + Wrap long line and update comments + Fix error message + Fix potentially misleading test failures + Fix z_mergetoaddress parameter tests + Add fail method to rpc test utils + Extend Sprout mergetoaddress rpc test to also work for Sapling + Add Sapling support to z_mergetoaddress + Add locking for Sapling notes + Better error messages when sending between Sprout and Sapling + Add additional z_mergetoaddress parameter tests + Adjust z_mergetoaddress assertions in Sapling rpc test + +Gareth Davies (2): + Add clarifying text for parameter size + Cleaning up RPC output + +Jack Grigg (7): + Update IncrementalMerkleTree test vectors to use valid commitments + Migrate to current librustzcash + Pass parameter paths as native strings to librustzcash + Build librustzcash package without changing directory + Set nSaplingValue in-memory when loading block index from disk + Comment in CDiskBlockIndex that LoadBlockIndexGuts also needs updating + Test Sapling value pool accounting + +Jonathan "Duke" Leto (2): + Clarify in sendmany/z_sendmany rpc docs that amounts are not floating point + Fix another instance of incorrectly saying amount is double precision, and s/ZC/ZEC/ + +Larry Ruane (3): + sapling z_sendmany default memo 0xf6 + zeros + update bug in wallet_listreceived.py, now it highlights the fix + don't ban peers when loading pre-sapling (and pre-blossom) blocks + +Simon Liu (14): + Add test to verify final sapling root in block header is updated. + Closes #3467. Add benchmarks for Sapling spends and outputs. + Closes #3616. Document revoked key error when upgrading on Debian. + Closes #3329. Send alert to put non-Sapling nodes into safe mode. + Closes #3597. TransactionBuilder checks tx version before adding Sapling spends and outputs. + Closes #3671 to make "sapling" the default for z_getnewaddress RPC. + Update rpc_wallet_tests for new "sapling" default for z_getnewaddress. + Update qa tests for new "sapling" default for z_getnewaddress. + Add support for "notfound" message to mininode. + For ZEC-013. Mitigate potential tx expiry height related DoS vector. + For ZEC-013. Don't propagate txs which are expiring soon in p2p messages. + For ZEC-013. RPC createrawtransaction returns error if tx expiring soon. + For ZEC-013. Update qa tests broken by expiring soon threshold. + For ZEC-013. RPC sendrawtransaction returns error if tx expiring soon. + +Suhas Daftuar (2): + Do not inv old or missing blocks when pruning + Enable block relay when pruning + +arielgabizon (2): + add test for sapling spend with transparent recipient + rename HaveJoinSplitRequirements for Sapling + +mdr0id (2): + make-release.py: Versioning changes for 2.0.2-rc1. + make-release.py: Updated manpages for 2.0.2-rc1. + +tpantin (1): + Updating copyright year from 2017 to 2018 + diff --git a/doc/release-notes/release-notes-2.0.2.md b/doc/release-notes/release-notes-2.0.2.md new file mode 100644 index 000000000..f7f0f6599 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.2.md @@ -0,0 +1,110 @@ +Notable changes +=============== + +Other issues +============ + +Revoked key error when upgrading on Debian +------------------------------------------ + +If you see the following error when updating to a new version of zcashd: + +`The following signatures were invalid: REVKEYSIG AEFD26F966E279CD` + +Remove the key marked as revoked: + +`sudo apt-key del AEFD26F966E279CD` + +Then retrieve the updated key: + +`wget -qO - https://apt.z.cash/zcash.asc | sudo apt-key add -` + +Then update the package lists: + +`sudo apt-get update` + +[Issue](https://github.com/zcash/zcash/issues/3612) + +Changelog +========= + +Charlie O'Keefe (2): + Save and restore current_path in TestingSetup constructor/destructor + Add a call to SetupNetworking in BasicTestingSetup + +Eirik Ogilvie-Wigley (17): + Rename GenerateNewZKey to include Sprout + GenerateNewSproutZKey can return a SproutPaymentAddress + Remove unnecessary call to IsValidPaymentAddress + Remove unspent note entry structs + Add functionality from GetUnspentFilteredNotes to GetFilteredNotes + Remove GetUnspentFilteredNotes + Wrap long line and update comments + Fix error message + Fix potentially misleading test failures + Fix z_mergetoaddress parameter tests + Add fail method to rpc test utils + Extend Sprout mergetoaddress rpc test to also work for Sapling + Add Sapling support to z_mergetoaddress + Add locking for Sapling notes + Better error messages when sending between Sprout and Sapling + Add additional z_mergetoaddress parameter tests + Adjust z_mergetoaddress assertions in Sapling rpc test + +Gareth Davies (2): + Add clarifying text for parameter size + Cleaning up RPC output + +Jack Grigg (7): + Update IncrementalMerkleTree test vectors to use valid commitments + Migrate to current librustzcash + Pass parameter paths as native strings to librustzcash + Build librustzcash package without changing directory + Set nSaplingValue in-memory when loading block index from disk + Comment in CDiskBlockIndex that LoadBlockIndexGuts also needs updating + Test Sapling value pool accounting + +Jonathan "Duke" Leto (2): + Clarify in sendmany/z_sendmany rpc docs that amounts are not floating point + Fix another instance of incorrectly saying amount is double precision, and s/ZC/ZEC/ + +Larry Ruane (4): + sapling z_sendmany default memo 0xf6 + zeros + update bug in wallet_listreceived.py, now it highlights the fix + don't ban peers when loading pre-sapling (and pre-blossom) blocks + remove non-ascii characters from help text + +Simon Liu (14): + Add test to verify final sapling root in block header is updated. + Closes #3467. Add benchmarks for Sapling spends and outputs. + Closes #3616. Document revoked key error when upgrading on Debian. + Closes #3329. Send alert to put non-Sapling nodes into safe mode. + Closes #3597. TransactionBuilder checks tx version before adding Sapling spends and outputs. + Closes #3671 to make "sapling" the default for z_getnewaddress RPC. + Update rpc_wallet_tests for new "sapling" default for z_getnewaddress. + Update qa tests for new "sapling" default for z_getnewaddress. + Add support for "notfound" message to mininode. + For ZEC-013. Mitigate potential tx expiry height related DoS vector. + For ZEC-013. Don't propagate txs which are expiring soon in p2p messages. + For ZEC-013. RPC createrawtransaction returns error if tx expiring soon. + For ZEC-013. Update qa tests broken by expiring soon threshold. + For ZEC-013. RPC sendrawtransaction returns error if tx expiring soon. + +Suhas Daftuar (2): + Do not inv old or missing blocks when pruning + Enable block relay when pruning + +arielgabizon (2): + add test for sapling spend with transparent recipient + rename HaveJoinSplitRequirements for Sapling + +mdr0id (5): + make-release.py: Versioning changes for 2.0.2-rc1. + make-release.py: Updated manpages for 2.0.2-rc1. + make-release.py: Updated release notes and changelog for 2.0.2-rc1. + make-release.py: Versioning changes for 2.0.2. + make-release.py: Updated manpages for 2.0.2. + +tpantin (1): + Updating copyright year from 2017 to 2018 + diff --git a/doc/release-notes/release-notes-2.0.3-rc1.md b/doc/release-notes/release-notes-2.0.3-rc1.md new file mode 100644 index 000000000..4291bf77f --- /dev/null +++ b/doc/release-notes/release-notes-2.0.3-rc1.md @@ -0,0 +1,57 @@ +Changelog +========= + +Alex Morcos (3): + ModifyNewCoins saves database lookups + Make CCoinsViewTest behave like CCoinsViewDB + Add unit test for UpdateCoins + +Charlie O'Keefe (1): + initialize pCurrentParams in TransactionBuilder tests + +Dimitris Apostolou (1): + Update zmq to 4.3.1 + +Eirik Ogilvie-Wigley (11): + Remove --disable-libs flag from help output + Update z_mergetoaddress documentation + flake8 cleanup + Move common code to helper + Make variables local + Check entire contents of mempool + fail test if pong is not received + Extract helper methods + Strategically sync to prevent intermittent failures + Return more information when building a transaction fails + throw an exception rather than returning false when building invalid transactions + +George Tankersley (2): + zmq: add flag to publish all checked blocks + zmq: remove extraneous space from zmq_sub.py + +Jack Grigg (5): + Remove the testing of duplicate coinbase transactions + wallet: Skip transactions with no shielded data in CWallet::SetBestChain() + Use nullptr instead of NULL in wallet tests + Add Sapling test cases + Set Sprout note data in WalletTest.WriteWitnessCache + +Larry Ruane (1): + wait for miner threads to exit (join them) + +Pieter Wuille (3): + Make sigcache faster and more efficient + Evict sigcache entries that are seen in a block + Don't wipe the sigcache in TestBlockValidity + +Sean Bowe (1): + Allow user to ask server to save the Sprout R1CS out during startup. + +ca333 (1): + update libsodium dl-path + +mdr0id (3): + Make pythonisms consistent + make-release.py: Versioning changes for 2.0.3-rc1. + make-release.py: Updated manpages for 2.0.3-rc1. + diff --git a/doc/release-notes/release-notes-2.0.3.md b/doc/release-notes/release-notes-2.0.3.md new file mode 100644 index 000000000..9b59be0e3 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.3.md @@ -0,0 +1,61 @@ +Changelog +========= + +Alex Morcos (3): + ModifyNewCoins saves database lookups + Make CCoinsViewTest behave like CCoinsViewDB + Add unit test for UpdateCoins + +Charlie O'Keefe (1): + initialize pCurrentParams in TransactionBuilder tests + +Dimitris Apostolou (1): + Update zmq to 4.3.1 + +Eirik Ogilvie-Wigley (11): + Remove --disable-libs flag from help output + Update z_mergetoaddress documentation + flake8 cleanup + Move common code to helper + Make variables local + Check entire contents of mempool + fail test if pong is not received + Extract helper methods + Strategically sync to prevent intermittent failures + Return more information when building a transaction fails + throw an exception rather than returning false when building invalid transactions + +George Tankersley (2): + zmq: add flag to publish all checked blocks + zmq: remove extraneous space from zmq_sub.py + +Jack Grigg (5): + Remove the testing of duplicate coinbase transactions + wallet: Skip transactions with no shielded data in CWallet::SetBestChain() + Use nullptr instead of NULL in wallet tests + Add Sapling test cases + Set Sprout note data in WalletTest.WriteWitnessCache + +Larry Ruane (1): + wait for miner threads to exit (join them) + +Pieter Wuille (3): + Make sigcache faster and more efficient + Evict sigcache entries that are seen in a block + Don't wipe the sigcache in TestBlockValidity + +Sean Bowe (1): + Allow user to ask server to save the Sprout R1CS out during startup. + +ca333 (1): + update libsodium dl-path + +mdr0id (7): + Make pythonisms consistent + make-release.py: Versioning changes for 2.0.3-rc1. + make-release.py: Updated manpages for 2.0.3-rc1. + make-release.py: Updated release notes and changelog for 2.0.3-rc1. + Update nMinimumChainWork with information from the getblockchaininfo RPC + make-release.py: Versioning changes for 2.0.3. + make-release.py: Updated manpages for 2.0.3. + diff --git a/doc/release-notes/release-notes-2.0.4-rc1.md b/doc/release-notes/release-notes-2.0.4-rc1.md new file mode 100644 index 000000000..a6ce81aa4 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.4-rc1.md @@ -0,0 +1,132 @@ +Notable changes +=============== + +Sprout note validation bug fixed in wallet +------------------------------------------ +We include a fix for a bug in the Zcashd wallet which could result in Sprout +z-addresses displaying an incorrect balance. Sapling z-addresses are not +impacted by this issue. This would occur if someone sending funds to a Sprout +z-address intentionally sent a different amount in the note commitment of a +Sprout output than the value provided in the ciphertext (the encrypted message +from the sender). + +Users should install this update and then rescan the blockchain by invoking +“zcashd -rescan”. Sprout address balances shown by the zcashd wallet should +then be correct. + +Thank you to Alexis Enston for bringing this to our attention. + +[Security Announcement 2019-03-19](https://z.cash/support/security/announcements/security-announcement-2019-03-19/) + +[Pull request](https://github.com/zcash/zcash/pull/3897) + +Miner address selection behaviour fixed +--------------------------------------- +Zcash inherited a bug from upstream Bitcoin Core where both the internal miner +and RPC call `getblocktemplate` would use a fixed transparent address, until RPC +`getnewaddress` was called, instead of using a new transparent address for each +mined block. This was fixed in Bitcoin 0.12 and we have now merged the change. + +Miners who wish to use the same address for every mined block, should use the +`-mineraddress` option. + +[Mining Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/zcash_mining_guide.html) + + +New consensus rule: Reject blocks that violate turnstile (Testnet only) +----------------------------------------------------------------------- +Testnet nodes will now enforce a consensus rule which marks blocks as invalid +if they would lead to a turnstile violation in the Sprout or Sapling value +pools. The motivations and deployment details can be found in the accompanying +[ZIP draft](https://github.com/zcash/zips/pull/210). + +The consensus rule will be enforced on mainnet in a future release. + +[Pull request](https://github.com/zcash/zcash/pull/3885) + + +Changelog +========= + +Eirik Ogilvie-Wigley (14): + Rename methods to include Sprout + Add benchmark for decrypting sapling notes + Move reusable Sapling test setup to utiltest + Move test SaplingNote creation to utiltest + Add test method for generating master Sapling extended spending keys + Include Sapling transactions in increment note witness benchmark + Prevent header from being included multiple times + benchmarks do not require updating network parameters + FakeCoinsViewDB can inherit directly from CCoinsView + Add a method for generating a test CKey + Change to t->z transaction and create separate benchmark for sapling + Renaming and other minor cleanup + Improve some error messages when building a transaction fails + Add missing author aliases + +Gareth Davies (1): + Correcting logo on README + +Jack Grigg (6): + Add Sapling benchmarks to benchmark runner + test: Fetch coinbase address from coinbase UTXOs + test: Make expected_utxos optional in get_coinbase_address() + Add comments + Move utiltest.cpp from wallet to common + Move payment disclosure code and tests into wallet + +Jonas Schnelli (4): + detach wallet from miner + fix GetScriptForMining() CReserveKey::keepKey() issue + add CReserveScript to allow modular script keeping/returning + miner: rename UpdateRequestCount signal to ResetRequestCount + +Jonathan "Duke" Leto (2): + Backport size_on_disk to RPC call getblockchaininfo. + Add size_on_disk test + +Marius Kjærstad (1): + Update COPYRIGHT_YEAR in clientversion.h to 2019 + +Paige Peterson (1): + redirect and update source documentation + +Pieter Wuille (1): + Simplify DisconnectBlock arguments/return value + +Sean Bowe (13): + (testnet) Fall back to hardcoded shielded pool balance to avoid reorgs. + (testnet) Reject blocks that result in turnstile violations + (testnet/regtest) Avoid mining transactions that would violate the turnstile. + Fix tallying for Sprout/Sapling value pools. + Consolidate logic to enable turnstile auditing for testnet/regtest/mainnet. + Use existing chainparams variable + Add newlines to turntile log messages for miner + Check blockhash of fallback block for Sprout value pool balance + Change SproutValuePoolCheckpointEnabled to ZIP209Activated + Only enforce Sapling turnstile if balance values have been populated. + Do not enable ZIP209 on regtest right now. + (minor) Remove added newline. + (wallet) Check that the commitment matches the note plaintext provided by the sender. + +Simon Liu (5): + Update nMinimumChainWork using block 497000. + Add checkpoint for block 497000. + Update release notes for 2.0.4 + make-release.py: Versioning changes for 2.0.4-rc1. + make-release.py: Updated manpages for 2.0.4-rc1. + +Taylor Hornby (5): + Update OpenSSL from 1.1.0h to 1.1.1a. #3786 + Update boost from v1.66.0 to v1.69.0. #3786 + Update Rust from v1.28.0 to v1.32.0. #3786 + Update Proton from 0.17.0 to 0.26.0. #3816, #3786 + Patch Proton for a minimal build. #3786 + +sandakersmann (1): + Update of copyright year to 2019 + +zebambam (2): + Added documentation warnings about DNS rebinding attacks, issue #3841 + Added responsible disclosure statement for issue #3869 + diff --git a/doc/release-notes/release-notes-2.0.4.md b/doc/release-notes/release-notes-2.0.4.md new file mode 100644 index 000000000..272a038dc --- /dev/null +++ b/doc/release-notes/release-notes-2.0.4.md @@ -0,0 +1,139 @@ +Notable changes +=============== + +Sprout note validation bug fixed in wallet +------------------------------------------ +We include a fix for a bug in the Zcashd wallet which could result in Sprout +z-addresses displaying an incorrect balance. Sapling z-addresses are not +impacted by this issue. This would occur if someone sending funds to a Sprout +z-address intentionally sent a different amount in the note commitment of a +Sprout output than the value provided in the ciphertext (the encrypted message +from the sender). + +Users should install this update and then rescan the blockchain by invoking +“zcashd -rescan”. Sprout address balances shown by the zcashd wallet should +then be correct. + +Thank you to Alexis Enston for bringing this to our attention. + +[Security Announcement 2019-03-19](https://z.cash/support/security/announcements/security-announcement-2019-03-19/) + +[Pull request](https://github.com/zcash/zcash/pull/3897) + +Miner address selection behaviour fixed +--------------------------------------- +Zcash inherited a bug from upstream Bitcoin Core where both the internal miner +and RPC call `getblocktemplate` would use a fixed transparent address, until RPC +`getnewaddress` was called, instead of using a new transparent address for each +mined block. This was fixed in Bitcoin 0.12 and we have now merged the change. + +Miners who wish to use the same address for every mined block, should use the +`-mineraddress` option. + +[Mining Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/zcash_mining_guide.html) + + +New consensus rule: Reject blocks that violate turnstile (Testnet only) +----------------------------------------------------------------------- +Testnet nodes will now enforce a consensus rule which marks blocks as invalid +if they would lead to a turnstile violation in the Sprout or Sapling value +pools. The motivations and deployment details can be found in the accompanying +[ZIP draft](https://github.com/zcash/zips/pull/210). + +The consensus rule will be enforced on mainnet in a future release. + +[Pull request](https://github.com/zcash/zcash/pull/3885) + + +Changelog +========= + +Eirik Ogilvie-Wigley (14): + Rename methods to include Sprout + Add benchmark for decrypting sapling notes + Move reusable Sapling test setup to utiltest + Move test SaplingNote creation to utiltest + Add test method for generating master Sapling extended spending keys + Include Sapling transactions in increment note witness benchmark + Prevent header from being included multiple times + benchmarks do not require updating network parameters + FakeCoinsViewDB can inherit directly from CCoinsView + Add a method for generating a test CKey + Change to t->z transaction and create separate benchmark for sapling + Renaming and other minor cleanup + Improve some error messages when building a transaction fails + Add missing author aliases + +Gareth Davies (1): + Correcting logo on README + +Jack Grigg (6): + Add Sapling benchmarks to benchmark runner + test: Fetch coinbase address from coinbase UTXOs + test: Make expected_utxos optional in get_coinbase_address() + Add comments + Move utiltest.cpp from wallet to common + Move payment disclosure code and tests into wallet + +Jonas Schnelli (4): + detach wallet from miner + fix GetScriptForMining() CReserveKey::keepKey() issue + add CReserveScript to allow modular script keeping/returning + miner: rename UpdateRequestCount signal to ResetRequestCount + +Jonathan "Duke" Leto (2): + Backport size_on_disk to RPC call getblockchaininfo. + Add size_on_disk test + +Marius Kjærstad (1): + Update COPYRIGHT_YEAR in clientversion.h to 2019 + +Paige Peterson (1): + redirect and update source documentation + +Pieter Wuille (1): + Simplify DisconnectBlock arguments/return value + +Sean Bowe (13): + (testnet) Fall back to hardcoded shielded pool balance to avoid reorgs. + (testnet) Reject blocks that result in turnstile violations + (testnet/regtest) Avoid mining transactions that would violate the turnstile. + Fix tallying for Sprout/Sapling value pools. + Consolidate logic to enable turnstile auditing for testnet/regtest/mainnet. + Use existing chainparams variable + Add newlines to turntile log messages for miner + Check blockhash of fallback block for Sprout value pool balance + Change SproutValuePoolCheckpointEnabled to ZIP209Activated + Only enforce Sapling turnstile if balance values have been populated. + Do not enable ZIP209 on regtest right now. + (minor) Remove added newline. + (wallet) Check that the commitment matches the note plaintext provided by the sender. + +Simon Liu (9): + Update nMinimumChainWork using block 497000. + Add checkpoint for block 497000. + Update release notes for 2.0.4 + make-release.py: Versioning changes for 2.0.4-rc1. + make-release.py: Updated manpages for 2.0.4-rc1. + make-release.py: Updated release notes and changelog for 2.0.4-rc1. + Fix typo in release notes. + make-release.py: Versioning changes for 2.0.4. + make-release.py: Updated manpages for 2.0.4. + +Taylor Hornby (8): + Update OpenSSL from 1.1.0h to 1.1.1a. #3786 + Update boost from v1.66.0 to v1.69.0. #3786 + Update Rust from v1.28.0 to v1.32.0. #3786 + Update Proton from 0.17.0 to 0.26.0. #3816, #3786 + Patch Proton for a minimal build. #3786 + Fix proton patch regression. #3916 + Fix OpenSSL reproducible build regression + Patch out proton::url deprecation as workaround for build warnings + +sandakersmann (1): + Update of copyright year to 2019 + +zebambam (2): + Added documentation warnings about DNS rebinding attacks, issue #3841 + Added responsible disclosure statement for issue #3869 + diff --git a/doc/release-notes/release-notes-2.0.5-1.md b/doc/release-notes/release-notes-2.0.5-1.md new file mode 100644 index 000000000..ef02d80b5 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.5-1.md @@ -0,0 +1,68 @@ +Notable changes +=============== + +Sprout to Sapling Migration Tool +-------------------------------- +This release includes the addition of a tool that will enable users to migrate +shielded funds from the Sprout pool to the Sapling pool while minimizing +information leakage. + +The migration can be enabled using the RPC `z_setmigration` or by including +`-migration` in the `zcash.conf` file. Unless otherwise specified funds will be +migrated to the wallet's default Sapling address; it is also possible to set the +receiving Sapling address using the `-migrationdestaddress` option in `zcash.conf`. + +See [ZIP308](https://github.com/zcash/zips/blob/master/zip-0308.rst) for full details. + +Sprout to Sapling Migration Tool Fixes +-------------------------------------- +The 2.0.5-1 release includes fixes to the Sprout to Sapling Migration Tool +found in testing. We resolved an issue which would cause the zcash daemon to +crash if calling the RPC `z_getmigrationstatus` while a wallet's migration +transactions are in the mempool. + +New consensus rule: Reject blocks that violate turnstile +-------------------------------------------------------- +In the 2.0.4 release the consensus rules were changed on testnet to enforce a +consensus rule which marks blocks as invalid if they would lead to a turnstile +violation in the Sprout or Shielded value pools. +**This release enforces the consensus rule change on mainnet** + +The motivations and deployment details can be found in the accompanying +[ZIP draft](https://github.com/zcash/zips/pull/210) and +[PR 3968](https://github.com/zcash/zcash/pull/3968). + +Developers can use a new experimental feature `-developersetpoolsizezero` to test +Sprout and Sapling turnstile violations. See [PR 3964](https://github.com/zcash/zcash/pull/3964) for more details. + + +64-bit ARMv8 support +-------------------- +Added ARMv8 (AArch64) support. This enables users to build zcash on even more +devices. + +For information on how to build see the [User Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/user_guide.html#build) + +Users on the Zcash forum have reported successes with both the Pine64 Rock64Pro +and Odroid C2 which contain 4GB and 2GB of RAM respectively. + +Just released, the Odroid N2 looks like a great solution with 4GB of RAM. The +newly released Jetson Nano Developer Kit from Nvidia (also 4GB of RAM) is also +worth a look. The NanoPC-T3 Plus is another option but for the simplest/best +experience choose a board with 4GB of RAM. Just make sure before purchase that +the CPU supports the 64-bit ARMv8 architecture. + +Changelog +========= + +Eirik0 (9): + Correctly account for migration transactions in the mempool + Store the migration operation id rather than the operation iteslf + Rename variable and add comment + Notable changes for v2.0.5-1 + Fix summing available funds + Add the amount migrated to the operation's result + coinsView is required when using TransactionBuilder if there may be Sprout change + make-release.py: Versioning changes for 2.0.5-1. + make-release.py: Updated manpages for 2.0.5-1. + diff --git a/doc/release-notes/release-notes-2.0.5-2.md b/doc/release-notes/release-notes-2.0.5-2.md new file mode 100644 index 000000000..8d7dc947a --- /dev/null +++ b/doc/release-notes/release-notes-2.0.5-2.md @@ -0,0 +1,77 @@ +Notable changes +=============== + +Sprout to Sapling Migration Tool +-------------------------------- +This release includes the addition of a tool that will enable users to migrate +shielded funds from the Sprout pool to the Sapling pool while minimizing +information leakage. + +The migration can be enabled using the RPC `z_setmigration` or by including +`migration=1` in the `zcash.conf` file. Unless otherwise specified funds will be +migrated to the wallet's default Sapling address; it is also possible to set the +receiving Sapling address using the `migrationdestaddress=` option in +`zcash.conf`. + +See [ZIP308](https://github.com/zcash/zips/blob/master/zip-0308.rst) for full details. + +Sprout to Sapling Migration Tool Fixes +-------------------------------------- +The 2.0.5-1 and 2.0.5-2 releases include fixes to the Sprout to Sapling +Migration Tool found in testing. + +For a complete list of changes in 2.0.5, 2.0.5-1 and 2.0.5-2, see the [2.0.5 milestone](https://github.com/zcash/zcash/milestone/79?closed=1). + +New consensus rule: Reject blocks that violate turnstile +-------------------------------------------------------- +In the 2.0.4 release the consensus rules were changed on testnet to enforce a +consensus rule which marks blocks as invalid if they would lead to a turnstile +violation in the Sprout or Shielded value pools. +**This release enforces the consensus rule change on mainnet.** + +The motivations and deployment details can be found in +[ZIP209](https://github.com/zcash/zips/blob/master/zip-0209.rst) and +[PR 3968](https://github.com/zcash/zcash/pull/3968). + +Developers can use a new experimental feature `-developersetpoolsizezero` to test +Sprout and Sapling turnstile violations. See [PR 3964](https://github.com/zcash/zcash/pull/3964) for more details. + +64-bit ARMv8 support +-------------------- +Added ARMv8 (AArch64) support. This enables users to build zcash on even more +devices. + +For information on how to build see the [User Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/user_guide.html#build). + +Users on the Zcash forum have reported successes with both the Pine64 Rock64Pro +and Odroid C2 which contain 4GB and 2GB of RAM respectively. + +Just released, the Odroid N2 looks like a great solution with 4GB of RAM. The +newly released Jetson Nano Developer Kit from Nvidia (also 4GB of RAM) is also +worth a look. The NanoPC-T3 Plus is another option but for the simplest/best +experience choose a board with 4GB of RAM. Just make sure before purchase that +the CPU supports the 64-bit ARMv8 architecture. + +Changelog +========= + +Daira Hopwood (5): + Generalize TransactionBuilder and CreateNewContextualCMutableTransaction to allow choosing the expiry delta. + Repair calls to TransactionBuilder from tests. + Change expiry delta for migration transactions to 450 blocks. + Test the expiry height of migration transactions. + Fix cosmetic spacing issue in z_setmigration help. + +Eirik0 (7): + Do not automatically remove async migration operations and return txids + Add logging for Sprout to Sapling migration transaction generation + Fix LogPrint statements + Notable changes for v2.0.5-2 + Release notes wording and punctuation + make-release.py: Versioning changes for 2.0.5-2. + make-release.py: Updated manpages for 2.0.5-2. + +Simon Liu (2): + Remove unused specifier from format string. + Don't allow migration when node is syncing at launch or after waking up. + diff --git a/doc/release-notes/release-notes-2.0.5-rc1.md b/doc/release-notes/release-notes-2.0.5-rc1.md new file mode 100644 index 000000000..08640b1f4 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.5-rc1.md @@ -0,0 +1,73 @@ +Changelog +========= + +Braydon Fuller (1): + tests: adds unit test for IsPayToPublicKeyHash method + +Dimitris Apostolou (1): + Electric Coin Company + +Eirik0 (22): + Split test in to multiple parts + Use a custom error type if creating joinsplit descriptions fails + Rename and update comment + Add rpc to enable and disable Sprout to Sapling migration + Move migration logic to ChainTip + Documentation cleanup + Additional locking and race condition prevention + Refactor wait_and_assert_operationid_status to allow returning the result + Set min depth when selecting notes to migrate + Check for full failure message in test case + Add migration options to conf file + Create method for getting HD seed in RPCs + Add rpc to get Sprout to Sapling migration status + Fix help message + Test migration using both the parameter and the default Sapling address + Fix typos and update documentation + use -valueBalance rather than vpub_new to calculate migrated amount + Do not look at vin/vout when determining migration txs and other cleanup + Calculate the number of confimations in the canonical way + Do not throw an exception if HD Seed is not found when exporting wallet + make-release.py: Versioning changes for 2.0.5-rc1. + make-release.py: Updated manpages for 2.0.5-rc1. + +Gareth Davies (1): + Adding addressindex.h to Makefile.am + +Jack Grigg (9): + Add Sprout support to TransactionBuilder + depends: Use full path to cargo binary + depends: Generalise the rust package cross-compilation functions + depends: Add rust-std hash for aarch64-unknown-linux-gnu + depends: Compile bdb with --disable-atomics on aarch64 + depends: Update .gitignore + configure: Guess -march for libsnark OPTFLAGS instead of hard-coding + Add Blossom to upgrade list + init: Fix new HD seed generation for previously-encrypted wallets + +Larry Ruane (6): + fix enable-debug build DB_COINS undefined + add -addressindex changes for bitcore insight block explorer + add -spentindex changes for bitcore insight block explorer + Update boost from v1.69.0 to v1.70.0. #3947 + add -timestampindex for bitcore insight block explorer + 3873 z_setmigration cli bool enable arg conversion + +Marius Kjærstad (1): + Update _COPYRIGHT_YEAR in configure.ac to 2019 + +Mary Moore-Simmons (1): + Creates checklist template for new PRs being opened and addresses Str4d's suggestion for using GitHub handles + +Simon Liu (4): + Add testnet and regtest experimental feature: -developersetpoolsizezero + Add qa test for experimental feature: -developersetpoolsizezero + Enable ZIP209 on mainnet and set fallback Sprout pool balance. + Enable experimental feature -developersetpoolsizezero on mainnet. + +Jack Grigg (1): + remove extra hyphen + +zebambam (1): + Minor speling changes + diff --git a/doc/release-notes/release-notes-2.0.5.md b/doc/release-notes/release-notes-2.0.5.md new file mode 100644 index 000000000..520060f17 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.5.md @@ -0,0 +1,130 @@ +Notable changes +=============== + +Sprout to Sapling Migration Tool +-------------------------------- +This release includes the addition of a tool that will enable users to migrate +shielded funds from the Sprout pool to the Sapling pool while minimizing +information leakage. + +The migration can be enabled using the RPC `z_setmigration` or by including +`-migration` in the `zcash.conf` file. Unless otherwise specified funds will be +migrated to the wallet's default Sapling address; it is also possible to set the +receiving Sapling address using the `-migrationdestaddress` option in `zcash.conf`. + +See [ZIP308](https://github.com/zcash/zips/blob/master/zip-0308.rst) for full details. + + +New consensus rule: Reject blocks that violate turnstile +-------------------------------------------------------- +In the 2.0.4 release the consensus rules were changed on testnet to enforce a +consensus rule which marks blocks as invalid if they would lead to a turnstile +violation in the Sprout or Shielded value pools. +**This release enforces the consensus rule change on mainnet** + +The motivations and deployment details can be found in the accompanying +[ZIP draft](https://github.com/zcash/zips/pull/210) and +[PR 3968](https://github.com/zcash/zcash/pull/3968). + +Developers can use a new experimental feature `-developersetpoolsizezero` to test +Sprout and Sapling turnstile violations. See [PR 3964](https://github.com/zcash/zcash/pull/3964) for more details. + + +64-bit ARMv8 support +-------------------- +Added ARMv8 (AArch64) support. This enables users to build zcash on even more +devices. + +For information on how to build see the [User Guide](https://zcash.readthedocs.io/en/latest/rtd_pages/user_guide.html#build) + +Users on the Zcash forum have reported successes with both the Pine64 Rock64Pro +and Odroid C2 which contain 4GB and 2GB of RAM respectively. + +Just released, the Odroid N2 looks like a great solution with 4GB of RAM. The +newly released Jetson Nano Developer Kit from Nvidia (also 4GB of RAM) is also +worth a look. The NanoPC-T3 Plus is another option but for the simplest/best +experience choose a board with 4GB of RAM. Just make sure before purchase that +the CPU supports the 64-bit ARMv8 architecture. + +Changelog +========= + +Braydon Fuller (1): + tests: adds unit test for IsPayToPublicKeyHash method + +Dimitris Apostolou (1): + Electric Coin Company + +Eirik0 (27): + Split test in to multiple parts + Use a custom error type if creating joinsplit descriptions fails + Rename and update comment + Add rpc to enable and disable Sprout to Sapling migration + Move migration logic to ChainTip + Documentation cleanup + Additional locking and race condition prevention + Refactor wait_and_assert_operationid_status to allow returning the result + Set min depth when selecting notes to migrate + Check for full failure message in test case + Add migration options to conf file + Create method for getting HD seed in RPCs + Add rpc to get Sprout to Sapling migration status + Fix help message + Test migration using both the parameter and the default Sapling address + Fix typos and update documentation + use -valueBalance rather than vpub_new to calculate migrated amount + Do not look at vin/vout when determining migration txs and other cleanup + Calculate the number of confimations in the canonical way + Do not throw an exception if HD Seed is not found when exporting wallet + make-release.py: Versioning changes for 2.0.5-rc1. + make-release.py: Updated manpages for 2.0.5-rc1. + make-release.py: Updated release notes and changelog for 2.0.5-rc1. + Notable changes for v2.0.5 + Add missing word to release notes + make-release.py: Versioning changes for 2.0.5. + make-release.py: Updated manpages for 2.0.5. + +Gareth Davies (1): + Adding addressindex.h to Makefile.am + +Ian Munoz (1): + add curl to package list for gitian lxc container + +Jack Grigg (9): + Add Sprout support to TransactionBuilder + depends: Use full path to cargo binary + depends: Generalise the rust package cross-compilation functions + depends: Add rust-std hash for aarch64-unknown-linux-gnu + depends: Compile bdb with --disable-atomics on aarch64 + depends: Update .gitignore + configure: Guess -march for libsnark OPTFLAGS instead of hard-coding + Add Blossom to upgrade list + init: Fix new HD seed generation for previously-encrypted wallets + +Larry Ruane (6): + fix enable-debug build DB_COINS undefined + add -addressindex changes for bitcore insight block explorer + add -spentindex changes for bitcore insight block explorer + Update boost from v1.69.0 to v1.70.0. #3947 + add -timestampindex for bitcore insight block explorer + 3873 z_setmigration cli bool enable arg conversion + +Marius Kjærstad (1): + Update _COPYRIGHT_YEAR in configure.ac to 2019 + +Mary Moore-Simmons (1): + Creates checklist template for new PRs being opened and addresses Str4d's suggestion for using GitHub handles + +Simon Liu (5): + Add testnet and regtest experimental feature: -developersetpoolsizezero + Add qa test for experimental feature: -developersetpoolsizezero + Enable ZIP209 on mainnet and set fallback Sprout pool balance. + Enable experimental feature -developersetpoolsizezero on mainnet. + Update chain work and checkpoint using block 525000. + +Jack Grigg (1): + remove extra hyphen + +zebambam (1): + Minor speling changes + diff --git a/doc/release-notes/release-notes-2.0.6-rc1.md b/doc/release-notes/release-notes-2.0.6-rc1.md new file mode 100644 index 000000000..ce4014720 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.6-rc1.md @@ -0,0 +1,62 @@ +Changelog +========= + +Daira Hopwood (3): + Closes #3992. Remove obsolete warning message. + make-release.py: Versioning changes for 2.0.6-rc1. + make-release.py: Updated manpages for 2.0.6-rc1. + +Daniel Kraft (1): + Add some const declarations where they are appropriate. + +Eirik Ogilvie-Wigley (7): + Fix tree depth in comment + Update author aliases + Remove old mergetoaddress RPC test + Replace CSproutNotePlaintextEntry with SproutNoteEntry to match Sapling + z_getmigrationstatus help message wording change + Fix z_mergetoaddress sending from ANY_SPROUT/ANY_SAPLING when the wallet contains both note types + Clarify what combinations of from addresses can be used in z_mergetoaddress + +Jack Grigg (10): + Move Equihash parameters into consensus params + Globals: Remove Zcash-specific Params() calls from main.cpp + Globals: Explicitly pass const CChainParams& to IsStandardTx() + Globals: Explicit const CChainParams& arg for main: + Globals: Explicitly pass const CChainParams& to ContextualCheckTransaction() + Globals: Explicit const CChainParams& arg for main: + Globals: Explicitly pass const CChainParams& to DisconnectBlock() + Consistently use chainparams and consensusParams + Globals: Explicitly pass const CChainParams& to IsInitialBlockDownload() + Globals: Explicitly pass const CChainParams& to ReceivedBlockTransactions() + +Jorge Timón (6): + Globals: Explicit Consensus::Params arg for main: + Globals: Make AcceptBlockHeader static (Fix #6163) + Chainparams: Explicit CChainParams arg for main (pre miner): + Chainparams: Explicit CChainParams arg for miner: + Globals: Remove a bunch of Params() calls from main.cpp: + Globals: Explicitly pass const CChainParams& to UpdateTip() + +Larry Ruane (1): + add spentindex to getrawtransaction RPC results + +MarcoFalke (1): + [doc] Fix doxygen comments for members + +Peter Todd (1): + Improve block validity/ConnectBlock() comments + +Simon Liu (1): + Fix typo and clean up help message for RPC z_getmigrationstatus. + +Wladimir J. van der Laan (1): + Break circular dependency main ↔ txdb + +face (2): + Pass CChainParams to DisconnectTip() + Explicitly pass CChainParams to ConnectBlock + +Benjamin Winston (1): + Fixes #4013, added BitcoinABC as a disclosure partner + diff --git a/doc/release-notes/release-notes-2.0.6.md b/doc/release-notes/release-notes-2.0.6.md new file mode 100644 index 000000000..f1beec511 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.6.md @@ -0,0 +1,102 @@ +Notable changes +=============== + +Debian Stretch is now a Supported Platform +------------------------------------------ + +We now provide reproducible builds for Stretch as well as for Jessie. + + +Fixed a bug in ``z_mergetoaddress`` +----------------------------------- + +We fixed a bug which prevented users sending from ``ANY_SPROUT`` or ``ANY_SAPLING`` +with ``z_mergetoaddress`` when a wallet contained both Sprout and Sapling notes. + + +Insight Explorer +---------------- + +We have been incorporating changes to support the Insight explorer directly from +``zcashd``. v2.0.6 includes the first change to an RPC method. If ``zcashd`` is +run with the flag ``--insightexplorer``` (this requires an index rebuild), the +RPC method ``getrawtransaction`` will now return additional information about +spend indices. + +Changelog +========= + +Charlie O'Keefe (1): + Add stretch to list of suites in gitian linux descriptors + +Daira Hopwood (9): + Closes #3992. Remove obsolete warning message. + make-release.py: Versioning changes for 2.0.6-rc1. + make-release.py: Updated manpages for 2.0.6-rc1. + make-release.py: Updated release notes and changelog for 2.0.6-rc1. + ld --version doesn't work on macOS. + Tweak author aliases. + Add coding declaration to zcutil/release-notes.py + make-release.py: Versioning changes for 2.0.6. + make-release.py: Updated manpages for 2.0.6. + +Daniel Kraft (1): + Add some const declarations where they are appropriate. + +Eirik Ogilvie-Wigley (1): + Notable changes for 2.0.6 + +Eirik Ogilvie-Wigley (7): + Fix tree depth in comment + Update author aliases + Remove old mergetoaddress RPC test + Replace CSproutNotePlaintextEntry with SproutNoteEntry to match Sapling + z_getmigrationstatus help message wording change + Fix z_mergetoaddress sending from ANY_SPROUT/ANY_SAPLING when the wallet contains both note types + Clarify what combinations of from addresses can be used in z_mergetoaddress + +Jack Grigg (10): + Move Equihash parameters into consensus params + Globals: Remove Zcash-specific Params() calls from main.cpp + Globals: Explicitly pass const CChainParams& to IsStandardTx() + Globals: Explicit const CChainParams& arg for main: + Globals: Explicitly pass const CChainParams& to ContextualCheckTransaction() + Globals: Explicit const CChainParams& arg for main: + Globals: Explicitly pass const CChainParams& to DisconnectBlock() + Consistently use chainparams and consensusParams + Globals: Explicitly pass const CChainParams& to IsInitialBlockDownload() + Globals: Explicitly pass const CChainParams& to ReceivedBlockTransactions() + +Jorge Timón (6): + Globals: Explicit Consensus::Params arg for main: + Globals: Make AcceptBlockHeader static (Fix #6163) + Chainparams: Explicit CChainParams arg for main (pre miner): + Chainparams: Explicit CChainParams arg for miner: + Globals: Remove a bunch of Params() calls from main.cpp: + Globals: Explicitly pass const CChainParams& to UpdateTip() + +Larry Ruane (1): + add spentindex to getrawtransaction RPC results + +Marco Falke (1): + [doc] Fix doxygen comments for members + +Mary Moore-Simmons (1): + Fixes issue #3504: Changes to --version and adds a couple other useful commands. + +Peter Todd (1): + Improve block validity/ConnectBlock() comments + +Simon Liu (1): + Fix typo and clean up help message for RPC z_getmigrationstatus. + +Wladimir J. van der Laan (1): + Break circular dependency main ↔ txdb + +face (2): + Pass CChainParams to DisconnectTip() + Explicitly pass CChainParams to ConnectBlock + +Benjamin Winston (1): + Fixes #4013, added BitcoinABC as a disclosure partner + diff --git a/doc/release-notes/release-notes-2.0.7-1.md b/doc/release-notes/release-notes-2.0.7-1.md new file mode 100644 index 000000000..997d4b9f4 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.7-1.md @@ -0,0 +1,38 @@ +Notable changes +=============== + +Testnet Blossom Rewind +---------------------- +Testnet users needed to upgrade to 2.0.7 before Blossom activated. The amount +of notice given to these users was brief, so many were not able to upgrade in +time. These users may now be on the wrong branch. v2.0.7-1 adds an "intended +rewind" to prevent having to manually reindex when reconnecting to the correct +chain. + + +Insight Explorer Logging Fix +---------------------------- +Fixed an issue where `ERROR: spent index not enabled` would be logged unnecessarily. + +Changelog +========= + +Alex Tsankov (2): + Update INSTALL + Typo Fix + +Daira Hopwood (1): + Add intended rewind for Blossom on testnet. + +Eirik Ogilvie-Wigley (6): + Notable changes for v2.0.7-1 + fix typo + Add note about logging fix + Better wording in release notes + make-release.py: Versioning changes for 2.0.7-1. + make-release.py: Updated manpages for 2.0.7-1. + +Larry Ruane (2): + #4114 don't call error() from GetSpentIndex() + better fix: make GetSpentIndex() consistent with others... + diff --git a/doc/release-notes/release-notes-2.0.7-2.md b/doc/release-notes/release-notes-2.0.7-2.md new file mode 100644 index 000000000..f135ad733 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.7-2.md @@ -0,0 +1,30 @@ +Notable changes +=============== + + +Pre-Blossom EOS Halt +-------------------- +v2.0.7-2 contains a shortened EOS halt so that is in alignment with v2.0.7. + + +Testnet Blossom Rewind +---------------------- +Testnet users needed to upgrade to 2.0.7 before Blossom activated. The amount +of notice given to these users was brief, so many were not able to upgrade in +time. These users may now be on the wrong branch. v2.0.7-2 adds an "intended +rewind" to prevent having to manually reindex when reconnecting to the correct +chain. + + +Insight Explorer Logging Fix +---------------------------- +Fixed an issue where `ERROR: spent index not enabled` would be logged unnecessarily. + +Changelog +========= + +Eirik Ogilvie-Wigley (3): + Notable changes for v2.0.7-2 + make-release.py: Versioning changes for 2.0.7-2. + make-release.py: Updated manpages for 2.0.7-2. + diff --git a/doc/release-notes/release-notes-2.0.7-3.md b/doc/release-notes/release-notes-2.0.7-3.md new file mode 100644 index 000000000..baf7cac15 --- /dev/null +++ b/doc/release-notes/release-notes-2.0.7-3.md @@ -0,0 +1,35 @@ +Notable changes +=============== + +This release fixes a security issue described at +https://z.cash/support/security/announcements/security-announcement-2019-09-24/ . + +The service period of this release is shorter than normal due to the upcoming +v2.1.0 Blossom release. The End-of-Service of v2.0.7-3 will occur at block height +653012, expected to be on 2019-12-10. + + +Shrinking of debug.log files is temporarily disabled +---------------------------------------------------- + +In previous versions, `zcashd` would shrink the `debug.log` file to 200 KB on +startup if it was larger than 10 MB. This behaviour, and the `-shrinkdebugfile` +option that controlled it, has been disabled. + +Changelog +========= + +Daira Hopwood (4): + Add hotfix release notes. + Make a note of the shorter service period in the release notes. + make-release.py: Versioning changes for 2.0.7-3. + make-release.py: Updated manpages for 2.0.7-3. + +Jack Grigg (6): + Disable -shrinkdebugfile command + SetMerkleBranch: remove unused code, remove cs_main lock requirement + Remove cs_main lock requirement from CWallet::SyncTransaction + Ignore exceptions when deserializing note plaintexts + Move mempool SyncWithWallets call into its own thread + Enable RPC tests to wait on mempool notifications + diff --git a/doc/release-notes/release-notes-2.0.7-rc1.md b/doc/release-notes/release-notes-2.0.7-rc1.md new file mode 100644 index 000000000..ab448862a --- /dev/null +++ b/doc/release-notes/release-notes-2.0.7-rc1.md @@ -0,0 +1,118 @@ +Changelog +========= + +Daira Hopwood (10): + Add MIT license to Makefiles + Add MIT license to build-aux/m4/bitcoin_* scripts, and a permissive license to build-aux/m4/l_atomic.m4 . + Update copyright information for Zcash, leveldb, and libsnark. + Add license information for Autoconf macros. refs #2827 + Update contrib/debian/copyright for ax_boost_thread.m4 + Replace http with https: in links to the MIT license. Also change MIT/X11 to just MIT, since no distinction was intended. + qa/zcash/checksec.sh is under a BSD license, with a specialized non-endorsement clause. + Link to ticket #2827 using URL + Release process doc: add step to set the gpg key id. + Release process doc: mention the commit message. + +Dimitris Apostolou (5): + Rename vjoinsplit to vJoinSplit + Fix naming inconsistency + Rename joinsplit to shielded + Rename FindWalletTx to FindWalletTxToZap + Fix RPC undefined behavior. + +Eirik Ogilvie-Wigley (47): + Make nextHeight required in CalculateNextWorkRequired + Fix nondeterministic failure in sapling migration test + Clean up and fix typo + Apply suggestions from code review + Shorter block times rpc test + Update pow_tests for shorter block times + Update test_pow for shorter block times + Update block subsidy halving for zip208 + Make NetworkUpgradeAvailable a method of Params + Temporarily disable test + Simplify PartitionCheck + Use static_assert + Add missing new line at end of file + pow test cleanup + Add message to static_assert + Update expiry height for shorter block times + Fix zip208 founders reward calculation and update test + PartitionCheck tests for shorter block times + Add test for Blossom default tx expiry delta + Update metrics block height estimation for shorter block times + Do not create transactions that will expire after the next epoch + Do not send migration transactions that would expire after a network upgrade + Fix integer truncation in Blossom halving calculation + Update main_tests for shorter block times + Use pre-Blossom max FR height when calculating address change interval + Make founders reward tests pass before and after Blossom activation height is set + Extract Halvings method and add tests + Add comments and fix typos + Improve EstimateNetHeight calculation + Fix check transaction tests + Make sure to deactivate blossom in test case + Fix parsing txexpirydelta argument + Do not add expiring soon threshold to expiry height of txs near NU activation + Fix/update comments + Make sure that expiry height is not less than height + Clarify documentation + Update PoW related assertions + Remove DefaultExpiryDelta method + Algebraic improvements related to halving + Distinguish between height and current header height on metrics screen + Test clean up and fixes + Add copyright info + NPE defense in metrics screen + Do not estimate height if there is no best header + Rename method and use int64_t + make-release.py: Versioning changes for 2.0.7-rc1. + make-release.py: Updated manpages for 2.0.7-rc1. + +Eirik Ogilvie-Wigley (8): + Use CommitTransaction() rather than sendrawtransaction() + Move reused async rpc send logic to separate file + Move reused sign and send logic + Do not shadow the return value when testmode is true + Inline sign_send_raw_transaction + Allow passing optional reserve key as a parameter to SendTransaction + Use reserve key for transparent change when sending to Sapling + Fix comment in mergetoaddress RPC test + +Jack Grigg (4): + test: Check for change t-addr reuse in z_sendmany + Use reserve key for transparent change when sending to Sprout + test: Fix permissions on wallet_changeaddresses RPC test + test: Fix pyflakes warnings + +Larry Ruane (6): + add addressindex related RPCs + add spentindex RPC for bitcore block explorer + add timestampindex related RPC getblockhashes + fix getblockdeltas documentation formatting + insightexplorer minor bug fixes + insightexplorer fix LogPrintf + +Luke Dashjr (2): + Add MIT license to autogen.sh and share/genbuild.sh + Trivial: build-aux/m4/l_atomic: Fix typo + +Simon Liu (8): + Redefine PoW functions to accept height parameter. + Remove use of redundant member nPowTargetSpacing. + Replace nPoWTargetSpacing -> PoWTargetSpacing() + Update PoW function calls to pass in height. + Update GetBlockTimeout() to take height parameter. + Replace nPoWTargetSpacing -> PoWTargetSpacing() in ProcessMessage() + Replace nPoWTargetSpacing -> PoWTargetSpacing() in tests + Modify PartitionCheck to be aware of pre & post Blossom target spacing. + +William M Peaster (1): + Handful of copyedits to README.md + +codetriage-readme-bot (1): + Link to development guidelines in CONTRIBUTING.md + +Jack Grigg (1): + Update README.md + diff --git a/doc/release-notes/release-notes-2.0.7.md b/doc/release-notes/release-notes-2.0.7.md new file mode 100644 index 000000000..6c5e8bc9d --- /dev/null +++ b/doc/release-notes/release-notes-2.0.7.md @@ -0,0 +1,149 @@ +Notable changes +=============== + +Shorter Block Times +------------------- +Shorter block times are coming to Zcash! In the v2.0.7 release we have implemented [ZIP208](https://github.com/zcash/zips/blob/master/zip-0208.rst) which will take effect when Blossom activates. Upon activation, the block times for Zcash will decrease from 150 seconds to 75 seconds, and the block reward will decrease accordingly. This affects at what block height halving events will occur, but should not affect the overall rate at which Zcash is mined. The total founders' reward stays the same, and the total supply of Zcash is decreased only microscopically due to rounding. + +Blossom Activation on Testnet +----------------------------- +The v2.0.7 release includes Blossom activation on testnet, bringing shorter block times. The testnet Blossom activation height is 584000. + +Insight Explorer +---------------- +Changes needed for the Insight explorer have been incorporated into Zcash. *This is an experimental feature* and therefore is subject to change. To enable, add the `experimentalfeatures=1`, `txindex=1`, and `insightexplorer=1` flags to `zcash.conf`. This feature adds several RPCs to `zcashd` which allow the user to run an Insight explorer. + +Changelog +========= + +Daira Hopwood (11): + Add MIT license to Makefiles + Add MIT license to build-aux/m4/bitcoin_* scripts, and a permissive license to build-aux/m4/l_atomic.m4 . + Update copyright information for Zcash, leveldb, and libsnark. + Add license information for Autoconf macros. refs #2827 + Update contrib/debian/copyright for ax_boost_thread.m4 + Replace http with https: in links to the MIT license. Also change MIT/X11 to just MIT, since no distinction was intended. + qa/zcash/checksec.sh is under a BSD license, with a specialized non-endorsement clause. + Link to ticket #2827 using URL + Release process doc: add step to set the gpg key id. + Release process doc: mention the commit message. + Add RPC test and test framework constants for Sapling->Blossom activation. + +Dimitris Apostolou (5): + Rename vjoinsplit to vJoinSplit + Fix naming inconsistency + Rename joinsplit to shielded + Rename FindWalletTx to FindWalletTxToZap + Fix RPC undefined behavior. + +Eirik Ogilvie-Wigley (56): + Make nextHeight required in CalculateNextWorkRequired + Fix nondeterministic failure in sapling migration test + Clean up and fix typo + Apply suggestions from code review + Shorter block times rpc test + Update pow_tests for shorter block times + Update test_pow for shorter block times + Update block subsidy halving for zip208 + Make NetworkUpgradeAvailable a method of Params + Temporarily disable test + Simplify PartitionCheck + Use static_assert + Add missing new line at end of file + pow test cleanup + Add message to static_assert + Update expiry height for shorter block times + Fix zip208 founders reward calculation and update test + PartitionCheck tests for shorter block times + Add test for Blossom default tx expiry delta + Update metrics block height estimation for shorter block times + Do not create transactions that will expire after the next epoch + Do not send migration transactions that would expire after a network upgrade + Fix integer truncation in Blossom halving calculation + Update main_tests for shorter block times + Use pre-Blossom max FR height when calculating address change interval + Make founders reward tests pass before and after Blossom activation height is set + Extract Halvings method and add tests + Add comments and fix typos + Improve EstimateNetHeight calculation + Fix check transaction tests + Make sure to deactivate blossom in test case + Fix parsing txexpirydelta argument + Do not add expiring soon threshold to expiry height of txs near NU activation + Fix/update comments + Make sure that expiry height is not less than height + Clarify documentation + Update PoW related assertions + Remove DefaultExpiryDelta method + Algebraic improvements related to halving + Distinguish between height and current header height on metrics screen + Test clean up and fixes + Add copyright info + NPE defense in metrics screen + Do not estimate height if there is no best header + Rename method and use int64_t + make-release.py: Versioning changes for 2.0.7-rc1. + make-release.py: Updated manpages for 2.0.7-rc1. + make-release.py: Updated release notes and changelog for 2.0.7-rc1. + Update download path + Set testnet Blossom activation height + Notable changes for v2.0.7 + Enable shorter block times rpc test + Grammatical fixes and improvements + Remove constant + make-release.py: Versioning changes for 2.0.7. + make-release.py: Updated manpages for 2.0.7. + +Eirik Ogilvie-Wigley (8): + Use CommitTransaction() rather than sendrawtransaction() + Move reused async rpc send logic to separate file + Move reused sign and send logic + Do not shadow the return value when testmode is true + Inline sign_send_raw_transaction + Allow passing optional reserve key as a parameter to SendTransaction + Use reserve key for transparent change when sending to Sapling + Fix comment in mergetoaddress RPC test + +Jack Grigg (5): + test: Check for change t-addr reuse in z_sendmany + Use reserve key for transparent change when sending to Sprout + test: Fix permissions on wallet_changeaddresses RPC test + test: Fix pyflakes warnings + test: Fix AuthServiceProxy closed conn detection + +Larry Ruane (6): + add addressindex related RPCs + add spentindex RPC for bitcore block explorer + add timestampindex related RPC getblockhashes + fix getblockdeltas documentation formatting + insightexplorer minor bug fixes + insightexplorer fix LogPrintf + +Luke Dashjr (2): + Add MIT license to autogen.sh and share/genbuild.sh + Trivial: build-aux/m4/l_atomic: Fix typo + +Simon Liu (8): + Redefine PoW functions to accept height parameter. + Remove use of redundant member nPowTargetSpacing. + Replace nPoWTargetSpacing -> PoWTargetSpacing() + Update PoW function calls to pass in height. + Update GetBlockTimeout() to take height parameter. + Replace nPoWTargetSpacing -> PoWTargetSpacing() in ProcessMessage() + Replace nPoWTargetSpacing -> PoWTargetSpacing() in tests + Modify PartitionCheck to be aware of pre & post Blossom target spacing. + +William M Peaster (1): + Handful of copyedits to README.md + +codetriage-readme-bot (1): + Link to development guidelines in CONTRIBUTING.md + +Jack Grigg (1): + Update README.md + +Benjamin Winston (3): + Updated location to new download server + Fixes 4097, improves caching on parameter downloads + Updated location to new download server, fixing #4100 + diff --git a/doc/release-notes/release-notes-2.1.0-1.md b/doc/release-notes/release-notes-2.1.0-1.md new file mode 100644 index 000000000..21b08f168 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.0-1.md @@ -0,0 +1,10 @@ +Changelog +========= + +Jack Grigg (2): + make-release.py: Versioning changes for 2.1.0-1. + make-release.py: Updated manpages for 2.1.0-1. + +Sean Bowe (1): + Fix of CVE-2017-18350 + diff --git a/doc/release-notes/release-notes-2.1.0-rc1.md b/doc/release-notes/release-notes-2.1.0-rc1.md new file mode 100644 index 000000000..e11a6c09c --- /dev/null +++ b/doc/release-notes/release-notes-2.1.0-rc1.md @@ -0,0 +1,177 @@ +Notable changes +=============== + +DoS Mitigation: Mempool Size Limit and Random Drop +-------------------------------------------------- + +This release adds a mechanism for preventing nodes from running out of memory +in the situation where an attacker is trying to overwhelm the network with +transactions. This is achieved by keeping track of and limiting the total +`cost` and `evictionWeight` of all transactions in the mempool. The `cost` of a +transaction is determined by its size in bytes, and its `evictionWeight` is a +function of the transaction's `cost` and its fee. The maximum total cost is +configurable via the parameter `mempooltxcostlimit` which defaults to +80,000,000 (up to 20,000 txs). If a node's total mempool `cost` exceeds this +limit the node will evict a random transaction, preferentially picking larger +transactions and ones with below the standard fee. To prevent a node from +re-accepting evicted transactions, it keeps track of ones that it has evicted +recently. By default, a transaction will be considered recently evicted for 60 +minutes, but this can be configured with the parameter +`mempoolevictionmemoryminutes`. + +For full details see ZIP 401. + +Fake chain detection during initial block download +-------------------------------------------------- + +One of the mechanisms that `zcashd` uses to detect whether it is in "initial +block download" (IBD) mode is to compare the active chain's cumulative work +against a hard-coded "minimum chain work" value. This mechanism (inherited from +Bitcoin Core) means that once a node exits IBD mode, it is either on the main +chain, or a fake alternate chain with similar amounts of work. In the latter +case, the node has most likely become the victim of a 50% + 1 adversary. + +Starting from this release, `zcashd` additionally hard-codes the block hashes +for the activation blocks of each past network upgrade (NU). During initial +chain synchronization, and after the active chain has reached "minimum chain +work", the node checks the blocks at each NU activation height against the +hard-coded hashes. If any of them do not match, the node will immediately alert +the user and **shut down for safety**. + +Disabling old Sprout proofs +--------------------------- + +As part of our ongoing work to clean up the codebase and minimise the security +surface of `zcashd`, we are removing `libsnark` from the codebase, and dropping +support for creating and verifying old Sprout proofs. Funds stored in Sprout +addresses are not affected, as they are spent using the hybrid Sprout circuit +(built using `bellman`) that was deployed during the Sapling network upgrade. + +This change has several implications: + +- `zcashd` no longer verifies old Sprout proofs, and will instead assume they + are valid. This has a minor implication for nodes: during initial block + download, an adversary could feed the node fake blocks containing invalid old + Sprout proofs, and the node would accept the fake chain as valid. However, + as soon as the active chain contains at least as much work as the hard-coded + "minimum chain work" value, the node will detect this situation and shut down. + +- Shielded transactions can no longer be created before Sapling has activated. + This does not affect Zcash itself, but will affect downstream codebases that + have not yet activated Sapling (or that start a new chain after this point and + do not activate Sapling from launch). Note that the old Sprout circuit is + [vulnerable to counterfeiting](https://z.cash/support/security/announcements/security-announcement-2019-02-05-cve-2019-7167/) + and should not be used in current deployments. + +- Starting from this release, the circuit parameters from the original Sprout + MPC are no longer required to start `zcashd`, and will not be downloaded by + `fetch-params.sh`. They are not being automatically deleted at this time. + +We would like to take a moment to thank the `libsnark` authors and contributors. +It was vital to the success of Zcash, and the development of zero-knowledge +proofs in general, to have this code available and usable. + +Changelog +========= + +Bryant Eisenbach (2): + doc: Change Debian package description + doc: Move text prior to "This package provides..." + +Daira Hopwood (4): + Remove copyright entries for Autoconf macros that have been deleted. + Remove copyright entry for libsnark. + Test setting an expiry height of 0. + Fix setting an expiry height of 0. fixes #4132 + +Eirik Ogilvie-Wigley (33): + Wrap metrics message in strprintf + DoS protection: Weighted random drop of txs if mempool full + Rebuild weighted list on removal and fix size calculation + Grammatical fixes + Remove transactions when ensuring size limit + Help message cleanup and add lock + Performance: Store weighted transactions in a tree + Fix naming conventions + No need to activate Overwinter/Sapling in rpc test + Fix recently evicted list size + Put size increment and decrement on their own lines + Prevent adding duplicate transactions + Move duplicate macro to reusable location + mempool_limit rpc test cleanup + Represent tx costs as signed integers + Fix comments + Rename variables for consistency + Use tx cost rather than evictionWeight when checking mempool capacity + Log rather than return error if a transaction is recently evicted + Represent recently evicted list as a deque + Rename files + Update release notes + Add test + minor rpc test clean up + Add explanatory comments + Wording and grammatical fixes + Update parameter names to match ZIP + Clarify the difference between cost and evictionWeight + Fix test cases: default mempool limiters + Remove dots and underscores from parameter names + Use same type when calling max + make-release.py: Versioning changes for 2.1.0-rc1. + make-release.py: Updated manpages for 2.1.0-rc1. + +Gareth Davies (1): + Updating IPFS link for chunking + +Jack Grigg (39): + depends: Add FreeBSD to hosts and builders + depends: Explicitly set Boost toolchain during configuration + depends: Add FreeBSD support to OpenSSL + depends: Patch libevent to detect arch4random_addrandom + depends: Add FreeBSD Rust binaries + depends: Explicitly call Rust install script using bash + depends: Use project-config.jam to configure Boost instead of user-config.jam + depends: Set PIC flags for FreeBSD + Always skip verification for old Sprout proofs + Remove ability to create non-Groth16 Sprout JSDescriptions + Use Sapling JSDescriptions in Boost tests + Remove non-Groth16 Sprout proofs from joinsplit gtests + Migrate test utilities to generate Sapling-type Sprout proofs + Use Sapling JSDescriptions in gtests + Revert "Allow user to ask server to save the Sprout R1CS out during startup." + Remove libsnark code for pre-Sapling Sprout proofs + Remove pre-Sapling Sprout circuit + Revert "configure: Guess -march for libsnark OPTFLAGS instead of hard-coding" + Revert "Check if OpenMP is available before using it" + Remove libsnark from build system + Remove libsnark + Remove libgmp + Remove libsnark unit tests from full test suite + test: Require minimum of Sapling for all RPC tests + test: Add Sapling v4 transactions to mininode framework + test: Add hashFinalSaplingProxy to create_block + test: Update RPC tests to use a minimum of Sapling + rpc: Use Sapling transactions in zc_raw_joinsplit + depends: Fix crate vendoring path + depends: Helper for vendoring new crates + depends: Add flag for building with a local librustzcash repo + tests: Clean up use of repr() in mininode + Remove makeGrothProof argument from JoinSplit::prove + Stop fetching old Sprout parameters + Add libsnark removal to notable changes + Move AbortNode to the top of main.cpp + Abort node if NU activations have unexpected hashes + Add block hashes for Overwinter, Sapling, and testnet Blossom + Update release notes with node abort behaviour + +Larry Ruane (4): + insightexplorer: formatting, pyflakes cleanups + precompute empty merkle roots + update unit tests to compute empty roots + access array element using at() + +jeff-liang (1): + Display which network the node is running on. + +Benjamin Winston (1): + Removed stale seeder, fixing #4153 + diff --git a/doc/release-notes/release-notes-2.1.0.md b/doc/release-notes/release-notes-2.1.0.md new file mode 100644 index 000000000..a34305b17 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.0.md @@ -0,0 +1,215 @@ +Notable changes +=============== + +Blossom network upgrade +----------------------- + +The mainnet activation of the Blossom network upgrade is supported by this +release, with an activation height of 653600, which should occur in early +December — roughly one day following the targeted EOS halt of our 2.0.7-3 +release. Please upgrade to this release, or any subsequent release, in order to +follow the Blossom network upgrade. + +The Blossom network upgrade implements +[ZIP208](https://github.com/zcash/zips/blob/master/zip-0208.rst) which shortens +block times from 150s to 75s. + +DoS Mitigation: Mempool Size Limit and Random Drop +-------------------------------------------------- + +This release adds a mechanism for preventing nodes from running out of memory +in the situation where an attacker is trying to overwhelm the network with +transactions. This is achieved by keeping track of and limiting the total +`cost` and `evictionWeight` of all transactions in the mempool. The `cost` of a +transaction is determined by its size in bytes, and its `evictionWeight` is a +function of the transaction's `cost` and its fee. The maximum total cost is +configurable via the parameter `mempooltxcostlimit` which defaults to +80,000,000 (up to 20,000 txs). If a node's total mempool `cost` exceeds this +limit the node will evict a random transaction, preferentially picking larger +transactions and ones with below the standard fee. To prevent a node from +re-accepting evicted transactions, it keeps track of ones that it has evicted +recently. By default, a transaction will be considered recently evicted for 60 +minutes, but this can be configured with the parameter +`mempoolevictionmemoryminutes`. + +For full details see ZIP 401. + +Asynchronous Operations Incorrectly Reporting Success +----------------------------------------------------- +We fixed an issue where asynchronous operations were sometimes reporting sucess +when they had actually failed. One way this could occur was when trying to use +`z_sendmany` to create a transaction spending coinbase funds in a way where +change would be generated (not a valid use of `z_sendmany`). In this case the +operation would erroneously report success, and the only way to see that the +transaction had actually failed was to look in the `debug.log` file. Such +operations will now correctly report that they have failed. + +Fake chain detection during initial block download +-------------------------------------------------- + +One of the mechanisms that `zcashd` uses to detect whether it is in "initial +block download" (IBD) mode is to compare the active chain's cumulative work +against a hard-coded "minimum chain work" value. This mechanism (inherited from +Bitcoin Core) means that once a node exits IBD mode, it is either on the main +chain, or a fake alternate chain with similar amounts of work. In the latter +case, the node has most likely become the victim of a 50% + 1 adversary. + +Starting from this release, `zcashd` additionally hard-codes the block hashes +for the activation blocks of each past network upgrade (NU). During initial +chain synchronization, and after the active chain has reached "minimum chain +work", the node checks the blocks at each NU activation height against the +hard-coded hashes. If any of them do not match, the node will immediately alert +the user and **shut down for safety**. + +Disabling old Sprout proofs +--------------------------- + +As part of our ongoing work to clean up the codebase and minimise the security +surface of `zcashd`, we are removing `libsnark` from the codebase, and dropping +support for creating and verifying old Sprout proofs. Funds stored in Sprout +addresses are not affected, as they are spent using the hybrid Sprout circuit +(built using `bellman`) that was deployed during the Sapling network upgrade. + +This change has several implications: + +- `zcashd` no longer verifies old Sprout proofs, and will instead assume they + are valid. This has a minor implication for nodes: during initial block + download, an adversary could feed the node fake blocks containing invalid old + Sprout proofs, and the node would accept the fake chain as valid. However, + as soon as the active chain contains at least as much work as the hard-coded + "minimum chain work" value, the node will detect this situation and shut down. + +- Shielded transactions can no longer be created before Sapling has activated. + This does not affect Zcash itself, but will affect downstream codebases that + have not yet activated Sapling (or that start a new chain after this point and + do not activate Sapling from launch). Note that the old Sprout circuit is + [vulnerable to counterfeiting](https://z.cash/support/security/announcements/security-announcement-2019-02-05-cve-2019-7167/) + and should not be used in current deployments. + +- Starting from this release, the circuit parameters from the original Sprout + MPC are no longer required to start `zcashd`, and will not be downloaded by + `fetch-params.sh`. They are not being automatically deleted at this time. + +We would like to take a moment to thank the `libsnark` authors and contributors. +It was vital to the success of Zcash, and the development of zero-knowledge +proofs in general, to have this code available and usable. + +Changelog +========= + +Bryant Eisenbach (2): + doc: Change Debian package description + doc: Move text prior to "This package provides..." + +Daira Hopwood (4): + Remove copyright entries for Autoconf macros that have been deleted. + Remove copyright entry for libsnark. + Test setting an expiry height of 0. + Fix setting an expiry height of 0. fixes #4132 + +Dimitris Apostolou (1): + depends macOS: point --sysroot to SDK + +Eirik Ogilvie-Wigley (41): + Wrap metrics message in strprintf + DoS protection: Weighted random drop of txs if mempool full + Rebuild weighted list on removal and fix size calculation + Grammatical fixes + Remove transactions when ensuring size limit + Help message cleanup and add lock + Performance: Store weighted transactions in a tree + Fix naming conventions + No need to activate Overwinter/Sapling in rpc test + Fix recently evicted list size + Put size increment and decrement on their own lines + Prevent adding duplicate transactions + Move duplicate macro to reusable location + mempool_limit rpc test cleanup + Represent tx costs as signed integers + Fix comments + Rename variables for consistency + Use tx cost rather than evictionWeight when checking mempool capacity + Log rather than return error if a transaction is recently evicted + Represent recently evicted list as a deque + Rename files + Update release notes + Add test + minor rpc test clean up + Add explanatory comments + Wording and grammatical fixes + Update parameter names to match ZIP + Clarify the difference between cost and evictionWeight + Fix test cases: default mempool limiters + Remove dots and underscores from parameter names + Use same type when calling max + make-release.py: Versioning changes for 2.1.0-rc1. + make-release.py: Updated manpages for 2.1.0-rc1. + make-release.py: Updated release notes and changelog for 2.1.0-rc1. + Release notes for bug fix + Better wording in release notes + Fix wording + Fix getblocksubsidy tests + fix comment + make-release.py: Versioning changes for 2.1.0. + make-release.py: Updated manpages for 2.1.0. + +Gareth Davies (1): + Updating IPFS link for chunking + +Jack Grigg (39): + depends: Add FreeBSD to hosts and builders + depends: Explicitly set Boost toolchain during configuration + depends: Add FreeBSD support to OpenSSL + depends: Patch libevent to detect arch4random_addrandom + depends: Add FreeBSD Rust binaries + depends: Explicitly call Rust install script using bash + depends: Use project-config.jam to configure Boost instead of user-config.jam + depends: Set PIC flags for FreeBSD + Always skip verification for old Sprout proofs + Remove ability to create non-Groth16 Sprout JSDescriptions + Use Sapling JSDescriptions in Boost tests + Remove non-Groth16 Sprout proofs from joinsplit gtests + Migrate test utilities to generate Sapling-type Sprout proofs + Use Sapling JSDescriptions in gtests + Revert "Allow user to ask server to save the Sprout R1CS out during startup." + Remove libsnark code for pre-Sapling Sprout proofs + Remove pre-Sapling Sprout circuit + Revert "configure: Guess -march for libsnark OPTFLAGS instead of hard-coding" + Revert "Check if OpenMP is available before using it" + Remove libsnark from build system + Remove libsnark + Remove libgmp + Remove libsnark unit tests from full test suite + test: Require minimum of Sapling for all RPC tests + test: Add Sapling v4 transactions to mininode framework + test: Add hashFinalSaplingProxy to create_block + test: Update RPC tests to use a minimum of Sapling + rpc: Use Sapling transactions in zc_raw_joinsplit + depends: Fix crate vendoring path + depends: Helper for vendoring new crates + depends: Add flag for building with a local librustzcash repo + tests: Clean up use of repr() in mininode + Remove makeGrothProof argument from JoinSplit::prove + Stop fetching old Sprout parameters + Add libsnark removal to notable changes + Move AbortNode to the top of main.cpp + Abort node if NU activations have unexpected hashes + Add block hashes for Overwinter, Sapling, and testnet Blossom + Update release notes with node abort behaviour + +Larry Ruane (5): + insightexplorer: formatting, pyflakes cleanups + precompute empty merkle roots + update unit tests to compute empty roots + access array element using at() + #4175 z_sendmany coinbase to zaddr with change: report error status + +Sean Bowe (1): + Set mainnet activation of Blossom + +jeff-liang (1): + Display which network the node is running on. + +Benjamin Winston (1): + Removed stale seeder, fixing #4153 + diff --git a/doc/release-notes/release-notes-2.1.1-1.md b/doc/release-notes/release-notes-2.1.1-1.md new file mode 100644 index 000000000..5c764f24c --- /dev/null +++ b/doc/release-notes/release-notes-2.1.1-1.md @@ -0,0 +1,43 @@ +Notable changes +=============== + +This release fixes a security issue described at +https://z.cash/support/security/announcements/security-announcement-2020-02-06/ . + +This release also adds a `-maxtimeadjustment` option to set the maximum time, in +seconds, by which the node's clock can be adjusted based on the clocks of its +peer nodes. This option defaults to 0, meaning that no such adjustment is performed. +This is a change from the previous behaviour, which was to adjust the clock by up +to 70 minutes forward or backward. The maximum setting for this option is now +25 minutes (1500 seconds). + +Fix for incorrect banning of nodes during syncing +------------------------------------------------- +After activation of the Blossom network upgrade, a node that is syncing the +block chain from before Blossom would incorrectly ban peers that send it a +Blossom transaction. This resulted in slower and less reliable syncing (#4283). + +Changelog +========= + +Daira Hopwood (10): + Move check for block times that are too far ahead of adjusted time, to ContextualCheckBlock. + Improve messages for timestamp rules. + Add constant for how far a block timestamp can be ahead of adjusted time. Loosely based on https://github.com/bitcoin/bitcoin/commit/e57a1fd8999800b3fc744d45bb96354cae294032 + Soft fork: restrict block timestamps to be no more than 90 minutes after the MTP of the previous block. + Adjust the miner to satisfy consensus regarding future timestamps relative to median-time-past. + Enable future timestamp soft fork at varying heights according to network. + Cosmetic: brace style in ContextualCheckBlockHeader. + Add -maxtimeadjustment with default of 0 instead of the 4200 seconds used in Bitcoin Core. + Fix ContextualCheckBlock test (the ban score should be 100 since these are mined transactions). + Add string argument to static_asserts to satisfy C++11. + +Jack Grigg (2): + test: Update RPC test cache generation to handle new consensus rule + Apply a consistent ban policy within ContextualCheckTransaction + +Sean Bowe (3): + Release notes for vulnerability and -maxtimeadjustment option. + make-release.py: Versioning changes for 2.1.1-1. + make-release.py: Updated manpages for 2.1.1-1. + diff --git a/doc/release-notes/release-notes-2.1.1-rc1.md b/doc/release-notes/release-notes-2.1.1-rc1.md new file mode 100644 index 000000000..9e286935b --- /dev/null +++ b/doc/release-notes/release-notes-2.1.1-rc1.md @@ -0,0 +1,288 @@ +Notable changes +=============== + +`z_mergetoaddress` promoted out of experimental status +------------------------------------------------------ + +The `z_mergetoaddress` API merges funds from t-addresses, z-addresses, or both, +and sends them to a single t-address or z-address. It was added in v1.0.15 as an +experimental feature, to simplify the process of combining many small UTXOs and +notes into a few larger ones. + +In this release we are promoting `z_mergetoaddress` out of experimental status. +It is now a stable RPC, and any future changes to it will only be additive. See +`zcash-cli help z_mergetoaddress` for API details and usage. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +Option parsing behavior +----------------------- + +Command line options are now parsed strictly in the order in which they are +specified. It used to be the case that `-X -noX` ends up, unintuitively, with X +set, as `-X` had precedence over `-noX`. This is no longer the case. Like for +other software, the last specified value for an option will hold. + +Low-level RPC changes +--------------------- + +- Bare multisig outputs to our keys are no longer automatically treated as + incoming payments. As this feature was only available for multisig outputs for + which you had all private keys in your wallet, there was generally no use for + them compared to single-key schemes. Furthermore, no address format for such + outputs is defined, and wallet software can't easily send to it. These outputs + will no longer show up in `listtransactions`, `listunspent`, or contribute to + your balance, unless they are explicitly watched (using `importaddress` or + `importmulti` with hex script argument). `signrawtransaction*` also still + works for them. + +Changelog +========= + +Alfredo Garcia (19): + remove duplicated prefix in errors and warnings + Consensus: Decouple pow.cpp from util.h + change some wallet functions from bool to void + limit blockchain progress to a max of 1.000000 + remove z_mergetoaddress from experimental + add version to thank you string + add next upgrade info to metrics console + change target spacing to up to upgrade height + create and use SecondsLeftToHeight to display next upgrade info + add NextUpgrade test case + fix spacing + add after blossom test + change var and function names for clarity, refactor function + reverse conditional, replace get_value_or(0) calls + remove redundant line from test + remove zmergetoaddress from experimental state in rpc-tests + get UPGRADE_TESTDUMMY back to default at the end of the test + remove dead code in init + readd create_directories + +Ben Woosley (1): + Assert CPubKey::ValidLength to the pubkey's header-relevent size + +Carl Dong (1): + depends: tar: Always extract as yourself + +Casey Rodarmor (1): + Give a better error message if system clock is bad + +Charlie O'Keefe (1): + Add check-depends step to STAGE_COMMANDS list + +Cory Fields (3): + depends: qt/cctools: fix checksum checksum tests + depends: bump OSX toolchain + depends: make osx output deterministic + +Dagur Valberg Johannsson (1): + Remove option mempooltxinputlimit + +Denis Lukianov (1): + Correct importaddress help reference to importpubkey + +Dimitris Apostolou (4): + Fix typo + Remove stale comment + Change "protect" terminology to "shield" + depends macOS: hide linker visibility warnings + +Eirik Ogilvie-Wigley (2): + Show time elapsed when running RPC tests + Update team email + +Gavin Andresen (1): + Unit test doublespends in new blocks + +Gregory Maxwell (1): + Make connect=0 disable automatic outbound connections. + +Gregory Sanders (1): + Added additional config option for multiple RPC users. + +Ian T (1): + Update RPC generate help for numblocks to include required + +Jack Grigg (32): + Upgrade librustzcash to 0.2.0 + Migrate to librustzcash 0.2.0 API + Remove invalid address comparison from gtest + Cast uint8* in InterruptibleRecv to char* for recv + Add Heartwood to upgrade list + Initialize experimental mode in a separate function + Fix benchmarks after removal of SelectParamsFromCommandLine() + Handle Equihash and optional miner code in TestChain100Setup + Add tests covering the current interaction of alerts with subver comments + Parameterize zcash.conf in init error message + cleanup: Comments + Wrap long line + Match alerts both with and without comments + pyflakes fixes + Revert "Remove insecurely-downloaded dependencies that we don't currently use." + depends: Compile bdb with --disable-atomics when cross-compiling darwin + depends: Add Rust targets for cross-compiling darwin + configure: Don't require RELRO and BIND_NOW when cross-compiling darwin + depends: Manually apply build_env to second half of googletest build + Revert "depends: Explicitly set Boost toolchain during configuration" + Add z_mergetoaddress to release notes + ThreadNotifyRecentlyAdded -> ThreadNotifyWallets + Move mempool tx notifying logic out of CTxMemPool + Merge tree and boolean fields in ChainTip API + Move block-notifying logic into ThreadNotifyWallets + Tie sync_blocks in RPC tests to notifier thread + Extend comment with reason for taking care with locks + test: Add sync_all points after block generation to RPC tests + test: Remove genesis-block Sapling activation from shorter_block_times + test: Reverse hashtx and hashblock ordering at start of ZMQ RPC test + test: Add missing sync_all point + test: Update wallet RPC test with change to "absurdly high fee" limit + +Jainan-Tandel (1): + Cosmetic update to README.md . + +Jim Posen (3): + Comments: More comments on functions/globals in standard.h. + [script] Unit tests for script/standard functions + [script] Unit tests for IsMine + +Jonas Schnelli (9): + [autoprune] allow wallet in pruned mode + [RPC] disable import functions in pruned mode + [squashme] improve/corrects prune mode detection test for required wallet rescans + Refactor parameter interaction, call it before AppInit2() + Initialize logging before we do parameter interaction + [Wallet] move wallet help string creation to CWallet + [Wallet] move "load wallet phase" to CWallet + [Wallet] optimize return value of InitLoadWallet() + [Wallet] refactor wallet/init interaction + +Jorge Timón (4): + Chainparams: Replace CBaseChainParams::Network enum with string constants (suggested by Wladimir) + Chainparams: Translations: DRY: options and error strings + Globals: Decouple GetConfigFile and ReadConfigFile from global mapArgs + Policy: MOVEONLY: Create policy/policy.h with some constants + +Larry Ruane (5): + simplify locking, merge cs_SpendingKeyStore into cs_KeyStore + eliminate races: hold cs_KeyStore lock while reading fUseCrypto + revert CCryptoKeyStore::SetCrypted() return value + insightexplorer: LOCK(cs_main) during rpcs + fix tests for enable-debug build + +Luke Dashjr (8): + Bugfix: RPC: blockchain: Display correct defaults in help for verifychain method + Bugfix: Describe dblogsize option correctly (it refers to the wallet database, not memory pool) + Bugfix: If genproclimit is omitted to RPC setgenerate, don't change it; also show correct default in getmininginfo + Bugfix: Omit wallet-related options from -help when wallet is disabled + Constrain constant values to a single location in code + Bugfix: Omit wallet-related options from -help when wallet is not supported + Policy: MOVEONLY: 3 functions to policy.o: + Common argument defaults for NODE_BLOOM stuff and -wallet + +Marco Falke (20): + [trivial] Reuse translation and cleanup DEFAULT_* values + [qt] Move GUI related HelpMessage() part downstream + [trivial] init cleanup + [wallet] Refactor to use new MIN_CHANGE + [wallet] Add comments for doxygen + Init: Use DEFAULT_TRANSACTION_MINFEE in help message + [qt] Properly display required fee instead of minTxFee + Clarify what minrelaytxfee does + translations: Don't translate markdown or force English grammar + transaction_tests: Be more strict checking dust + [trivial] init: Use defaults MIN_RELAY_TX_FEE & TRANSACTION_MAXFEE + contrib: Del. gitian downloader config and update gitian README + rpcwallet: Clarify what settxfee does + HelpMessage: Don't hide -mintxfee behind showDebug + mempool: Replace maxFeeRate of 10000*minRelayTxFee with maxTxFee + [doxygen] Actually display comment + Fix doxygen comment for payTxFee + [doc] Fix markdown + Make sure LogPrintf strings are line-terminated + [wallet] Move hardcoded file name out of log messages + +Marshall Gaucher (3): + Update `import *` to unblock pyflakes from failing + Update z_sendmany calls passing int 0, instead of Decimal('0') + Update to stop random race error from assert + +Matt Corallo (10): + Also remove pay-2-pubkey from watch when adding a priv key + Split up importaddress into helper functions + Add p2sh option to importaddress to import redeemScripts + Add importpubkey method to import a watch-only pubkey + Update importaddress help to push its use to script-only + Add have-pubkey distinction to ISMINE flags + Add logic to track pubkeys as watch-only, not just scripts + Implement watchonly support in fundrawtransaction + SQUASH "Add have-pubkey distinction to ISMINE flags" + SQUASH "Implement watchonly support in fundrawtransaction" + +Peter Todd (3): + Make TX_SCRIPTHASH clear vSolutionsRet first + Add IsPushOnly(const_iterator pc) + Accept any sequence of PUSHDATAs in OP_RETURN outputs + +Pieter Wuille (9): + Remove template matching and pseudo opcodes + Stop treating importaddress'ed scripts as change + Make CScript -> CScriptID conversion explicit + Do not expose SigVersion argument to IsMine + Switch to a private version of SigVersion inside IsMine + Track difference between scriptPubKey and P2SH execution in IsMine + Do not treat bare multisig as IsMine + Mention removal of bare multisig IsMine in release notes + Use anonymous namespace instead of static functions + +Sean Bowe (2): + make-release.py: Versioning changes for 2.1.1-rc1. + make-release.py: Updated manpages for 2.1.1-rc1. + +Simon Liu (1): + Closes #3911. Fix help message of RPC getwalletinfo. + +Taylor Hornby (10): + Add AFL instrumentation scripts to zcutil. + Add configure option to replace main with a stub for fuzzing + Add all-in-one script for starting AFL fuzzing + Separate AFL build, run fuzz stages, and add afl argument pass-through + Have make clean delete fuzz.cpp + Pass AFL input file path to zcashd + Add fuzzing stub for AddrMan deserialization + Add fuzzing stub for ReadFeeEstimates + Add fuzzing stub for CheckBlock + Update proton from 0.26.0 to 0.30.0 + +Ulrich Kempken (1): + depends: switch to secure download of all dependencies + +Wladimir J. van der Laan (7): + make proxy_test work on servers without ipv6 + Fix argument parsing oddity with -noX + doc: mention change to option parsing behavior in release notes + test: move accounting_tests and rpc_wallet_tests to wallet/test + test: Create test fixture for wallet + wallet_ismine.h → script/ismine.h + test: Rename wallet.dat to wallet_test.dat + +sandakersmann (3): + Update of copyright year to 2020 + Update COPYRIGHT_YEAR in clientversion.h to 2020 + Update _COPYRIGHT_YEAR in configure.ac to 2020 + +Jack Grigg (2): + Apply suggestions from code review + Apply suggestions from code review + +Benjamin Winston (1): + Added basic fuzzing to the monolith, see ticket #4155 + diff --git a/doc/release-notes/release-notes-2.1.1-rc2.md b/doc/release-notes/release-notes-2.1.1-rc2.md new file mode 100644 index 000000000..8d20d89d1 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.1-rc2.md @@ -0,0 +1,298 @@ +Notable changes +=============== + +`z_mergetoaddress` promoted out of experimental status +------------------------------------------------------ + +The `z_mergetoaddress` API merges funds from t-addresses, z-addresses, or both, +and sends them to a single t-address or z-address. It was added in v1.0.15 as an +experimental feature, to simplify the process of combining many small UTXOs and +notes into a few larger ones. + +In this release we are promoting `z_mergetoaddress` out of experimental status. +It is now a stable RPC, and any future changes to it will only be additive. See +`zcash-cli help z_mergetoaddress` for API details and usage. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +Option parsing behavior +----------------------- + +Command line options are now parsed strictly in the order in which they are +specified. It used to be the case that `-X -noX` ends up, unintuitively, with X +set, as `-X` had precedence over `-noX`. This is no longer the case. Like for +other software, the last specified value for an option will hold. + +Low-level RPC changes +--------------------- + +- Bare multisig outputs to our keys are no longer automatically treated as + incoming payments. As this feature was only available for multisig outputs for + which you had all private keys in your wallet, there was generally no use for + them compared to single-key schemes. Furthermore, no address format for such + outputs is defined, and wallet software can't easily send to it. These outputs + will no longer show up in `listtransactions`, `listunspent`, or contribute to + your balance, unless they are explicitly watched (using `importaddress` or + `importmulti` with hex script argument). `signrawtransaction*` also still + works for them. + +Changelog +========= + +Alfredo Garcia (19): + remove duplicated prefix in errors and warnings + Consensus: Decouple pow.cpp from util.h + change some wallet functions from bool to void + limit blockchain progress to a max of 1.000000 + remove z_mergetoaddress from experimental + add version to thank you string + add next upgrade info to metrics console + change target spacing to up to upgrade height + create and use SecondsLeftToHeight to display next upgrade info + add NextUpgrade test case + fix spacing + add after blossom test + change var and function names for clarity, refactor function + reverse conditional, replace get_value_or(0) calls + remove redundant line from test + remove zmergetoaddress from experimental state in rpc-tests + get UPGRADE_TESTDUMMY back to default at the end of the test + remove dead code in init + readd create_directories + +Ben Woosley (1): + Assert CPubKey::ValidLength to the pubkey's header-relevent size + +Carl Dong (1): + depends: tar: Always extract as yourself + +Casey Rodarmor (1): + Give a better error message if system clock is bad + +Charlie O'Keefe (1): + Add check-depends step to STAGE_COMMANDS list + +Cory Fields (3): + depends: qt/cctools: fix checksum checksum tests + depends: bump OSX toolchain + depends: make osx output deterministic + +Dagur Valberg Johannsson (1): + Remove option mempooltxinputlimit + +Daira Hopwood (1): + Remove temporary workaround for deprecation height. + +Denis Lukianov (1): + Correct importaddress help reference to importpubkey + +Dimitris Apostolou (4): + Fix typo + Remove stale comment + Change "protect" terminology to "shield" + depends macOS: hide linker visibility warnings + +Eirik Ogilvie-Wigley (2): + Show time elapsed when running RPC tests + Update team email + +Gavin Andresen (1): + Unit test doublespends in new blocks + +Gregory Maxwell (1): + Make connect=0 disable automatic outbound connections. + +Gregory Sanders (1): + Added additional config option for multiple RPC users. + +Ian T (1): + Update RPC generate help for numblocks to include required + +Jack Grigg (32): + Upgrade librustzcash to 0.2.0 + Migrate to librustzcash 0.2.0 API + Remove invalid address comparison from gtest + Cast uint8* in InterruptibleRecv to char* for recv + Add Heartwood to upgrade list + Initialize experimental mode in a separate function + Fix benchmarks after removal of SelectParamsFromCommandLine() + Handle Equihash and optional miner code in TestChain100Setup + Add tests covering the current interaction of alerts with subver comments + Parameterize zcash.conf in init error message + cleanup: Comments + Wrap long line + Match alerts both with and without comments + pyflakes fixes + Revert "Remove insecurely-downloaded dependencies that we don't currently use." + depends: Compile bdb with --disable-atomics when cross-compiling darwin + depends: Add Rust targets for cross-compiling darwin + configure: Don't require RELRO and BIND_NOW when cross-compiling darwin + depends: Manually apply build_env to second half of googletest build + Revert "depends: Explicitly set Boost toolchain during configuration" + Add z_mergetoaddress to release notes + ThreadNotifyRecentlyAdded -> ThreadNotifyWallets + Move mempool tx notifying logic out of CTxMemPool + Merge tree and boolean fields in ChainTip API + Move block-notifying logic into ThreadNotifyWallets + Tie sync_blocks in RPC tests to notifier thread + Extend comment with reason for taking care with locks + test: Add sync_all points after block generation to RPC tests + test: Remove genesis-block Sapling activation from shorter_block_times + test: Reverse hashtx and hashblock ordering at start of ZMQ RPC test + test: Add missing sync_all point + test: Update wallet RPC test with change to "absurdly high fee" limit + +Jainan-Tandel (1): + Cosmetic update to README.md . + +Jim Posen (3): + Comments: More comments on functions/globals in standard.h. + [script] Unit tests for script/standard functions + [script] Unit tests for IsMine + +Jonas Schnelli (9): + [autoprune] allow wallet in pruned mode + [RPC] disable import functions in pruned mode + [squashme] improve/corrects prune mode detection test for required wallet rescans + Refactor parameter interaction, call it before AppInit2() + Initialize logging before we do parameter interaction + [Wallet] move wallet help string creation to CWallet + [Wallet] move "load wallet phase" to CWallet + [Wallet] optimize return value of InitLoadWallet() + [Wallet] refactor wallet/init interaction + +Jorge Timón (4): + Chainparams: Replace CBaseChainParams::Network enum with string constants (suggested by Wladimir) + Chainparams: Translations: DRY: options and error strings + Globals: Decouple GetConfigFile and ReadConfigFile from global mapArgs + Policy: MOVEONLY: Create policy/policy.h with some constants + +Larry Ruane (5): + simplify locking, merge cs_SpendingKeyStore into cs_KeyStore + eliminate races: hold cs_KeyStore lock while reading fUseCrypto + revert CCryptoKeyStore::SetCrypted() return value + insightexplorer: LOCK(cs_main) during rpcs + fix tests for enable-debug build + +Luke Dashjr (8): + Bugfix: RPC: blockchain: Display correct defaults in help for verifychain method + Bugfix: Describe dblogsize option correctly (it refers to the wallet database, not memory pool) + Bugfix: If genproclimit is omitted to RPC setgenerate, don't change it; also show correct default in getmininginfo + Bugfix: Omit wallet-related options from -help when wallet is disabled + Constrain constant values to a single location in code + Bugfix: Omit wallet-related options from -help when wallet is not supported + Policy: MOVEONLY: 3 functions to policy.o: + Common argument defaults for NODE_BLOOM stuff and -wallet + +Marco Falke (20): + [trivial] Reuse translation and cleanup DEFAULT_* values + [qt] Move GUI related HelpMessage() part downstream + [trivial] init cleanup + [wallet] Refactor to use new MIN_CHANGE + [wallet] Add comments for doxygen + Init: Use DEFAULT_TRANSACTION_MINFEE in help message + [qt] Properly display required fee instead of minTxFee + Clarify what minrelaytxfee does + translations: Don't translate markdown or force English grammar + transaction_tests: Be more strict checking dust + [trivial] init: Use defaults MIN_RELAY_TX_FEE & TRANSACTION_MAXFEE + contrib: Del. gitian downloader config and update gitian README + rpcwallet: Clarify what settxfee does + HelpMessage: Don't hide -mintxfee behind showDebug + mempool: Replace maxFeeRate of 10000*minRelayTxFee with maxTxFee + [doxygen] Actually display comment + Fix doxygen comment for payTxFee + [doc] Fix markdown + Make sure LogPrintf strings are line-terminated + [wallet] Move hardcoded file name out of log messages + +Marshall Gaucher (3): + Update `import *` to unblock pyflakes from failing + Update z_sendmany calls passing int 0, instead of Decimal('0') + Update to stop random race error from assert + +Matt Corallo (10): + Also remove pay-2-pubkey from watch when adding a priv key + Split up importaddress into helper functions + Add p2sh option to importaddress to import redeemScripts + Add importpubkey method to import a watch-only pubkey + Update importaddress help to push its use to script-only + Add have-pubkey distinction to ISMINE flags + Add logic to track pubkeys as watch-only, not just scripts + Implement watchonly support in fundrawtransaction + SQUASH "Add have-pubkey distinction to ISMINE flags" + SQUASH "Implement watchonly support in fundrawtransaction" + +Miles Manley (1): + Update libsodium download-path + +Peter Todd (3): + Make TX_SCRIPTHASH clear vSolutionsRet first + Add IsPushOnly(const_iterator pc) + Accept any sequence of PUSHDATAs in OP_RETURN outputs + +Pieter Wuille (9): + Remove template matching and pseudo opcodes + Stop treating importaddress'ed scripts as change + Make CScript -> CScriptID conversion explicit + Do not expose SigVersion argument to IsMine + Switch to a private version of SigVersion inside IsMine + Track difference between scriptPubKey and P2SH execution in IsMine + Do not treat bare multisig as IsMine + Mention removal of bare multisig IsMine in release notes + Use anonymous namespace instead of static functions + +Sean Bowe (5): + make-release.py: Versioning changes for 2.1.1-rc1. + make-release.py: Updated manpages for 2.1.1-rc1. + make-release.py: Updated release notes and changelog for 2.1.1-rc1. + make-release.py: Versioning changes for 2.1.1-rc2. + make-release.py: Updated manpages for 2.1.1-rc2. + +Simon Liu (1): + Closes #3911. Fix help message of RPC getwalletinfo. + +Taylor Hornby (11): + Add AFL instrumentation scripts to zcutil. + Add configure option to replace main with a stub for fuzzing + Add all-in-one script for starting AFL fuzzing + Separate AFL build, run fuzz stages, and add afl argument pass-through + Have make clean delete fuzz.cpp + Pass AFL input file path to zcashd + Add fuzzing stub for AddrMan deserialization + Add fuzzing stub for ReadFeeEstimates + Add fuzzing stub for CheckBlock + Update proton from 0.26.0 to 0.30.0 + Fix broken proton build + +Ulrich Kempken (1): + depends: switch to secure download of all dependencies + +Wladimir J. van der Laan (7): + make proxy_test work on servers without ipv6 + Fix argument parsing oddity with -noX + doc: mention change to option parsing behavior in release notes + test: move accounting_tests and rpc_wallet_tests to wallet/test + test: Create test fixture for wallet + wallet_ismine.h → script/ismine.h + test: Rename wallet.dat to wallet_test.dat + +sandakersmann (3): + Update of copyright year to 2020 + Update COPYRIGHT_YEAR in clientversion.h to 2020 + Update _COPYRIGHT_YEAR in configure.ac to 2020 + +Jack Grigg (2): + Apply suggestions from code review + Apply suggestions from code review + +Benjamin Winston (1): + Added basic fuzzing to the monolith, see ticket #4155 + diff --git a/doc/release-notes/release-notes-2.1.1.md b/doc/release-notes/release-notes-2.1.1.md new file mode 100644 index 000000000..a51e29399 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.1.md @@ -0,0 +1,301 @@ +Notable changes +=============== + +`z_mergetoaddress` promoted out of experimental status +------------------------------------------------------ + +The `z_mergetoaddress` API merges funds from t-addresses, z-addresses, or both, +and sends them to a single t-address or z-address. It was added in v1.0.15 as an +experimental feature, to simplify the process of combining many small UTXOs and +notes into a few larger ones. + +In this release we are promoting `z_mergetoaddress` out of experimental status. +It is now a stable RPC, and any future changes to it will only be additive. See +`zcash-cli help z_mergetoaddress` for API details and usage. + +Unlike most other RPC methods, `z_mergetoaddress` operates over a particular +quantity of UTXOs and notes, instead of a particular amount of ZEC. By default, +it will merge 50 UTXOs and 10 notes at a time; these limits can be adjusted with +the parameters `transparent_limit` and `shielded_limit`. + +`z_mergetoaddress` also returns the number of UTXOs and notes remaining in the +given addresses, which can be used to automate the merging process (for example, +merging until the number of UTXOs falls below some value). + +Option parsing behavior +----------------------- + +Command line options are now parsed strictly in the order in which they are +specified. It used to be the case that `-X -noX` ends up, unintuitively, with X +set, as `-X` had precedence over `-noX`. This is no longer the case. Like for +other software, the last specified value for an option will hold. + +Low-level RPC changes +--------------------- + +- Bare multisig outputs to our keys are no longer automatically treated as + incoming payments. As this feature was only available for multisig outputs for + which you had all private keys in your wallet, there was generally no use for + them compared to single-key schemes. Furthermore, no address format for such + outputs is defined, and wallet software can't easily send to it. These outputs + will no longer show up in `listtransactions`, `listunspent`, or contribute to + your balance, unless they are explicitly watched (using `importaddress` or + `importmulti` with hex script argument). `signrawtransaction*` also still + works for them. + +Changelog +========= + +Alfredo Garcia (19): + remove duplicated prefix in errors and warnings + Consensus: Decouple pow.cpp from util.h + change some wallet functions from bool to void + limit blockchain progress to a max of 1.000000 + remove z_mergetoaddress from experimental + add version to thank you string + add next upgrade info to metrics console + change target spacing to up to upgrade height + create and use SecondsLeftToHeight to display next upgrade info + add NextUpgrade test case + fix spacing + add after blossom test + change var and function names for clarity, refactor function + reverse conditional, replace get_value_or(0) calls + remove redundant line from test + remove zmergetoaddress from experimental state in rpc-tests + get UPGRADE_TESTDUMMY back to default at the end of the test + remove dead code in init + readd create_directories + +Ben Woosley (1): + Assert CPubKey::ValidLength to the pubkey's header-relevent size + +Carl Dong (1): + depends: tar: Always extract as yourself + +Casey Rodarmor (1): + Give a better error message if system clock is bad + +Charlie O'Keefe (1): + Add check-depends step to STAGE_COMMANDS list + +Cory Fields (3): + depends: qt/cctools: fix checksum checksum tests + depends: bump OSX toolchain + depends: make osx output deterministic + +Dagur Valberg Johannsson (1): + Remove option mempooltxinputlimit + +Daira Hopwood (1): + Remove temporary workaround for deprecation height. + +Denis Lukianov (1): + Correct importaddress help reference to importpubkey + +Dimitris Apostolou (4): + Fix typo + Remove stale comment + Change "protect" terminology to "shield" + depends macOS: hide linker visibility warnings + +Eirik Ogilvie-Wigley (2): + Show time elapsed when running RPC tests + Update team email + +Gavin Andresen (1): + Unit test doublespends in new blocks + +Gregory Maxwell (1): + Make connect=0 disable automatic outbound connections. + +Gregory Sanders (1): + Added additional config option for multiple RPC users. + +Ian T (1): + Update RPC generate help for numblocks to include required + +Jack Grigg (32): + Upgrade librustzcash to 0.2.0 + Migrate to librustzcash 0.2.0 API + Remove invalid address comparison from gtest + Cast uint8* in InterruptibleRecv to char* for recv + Add Heartwood to upgrade list + Initialize experimental mode in a separate function + Fix benchmarks after removal of SelectParamsFromCommandLine() + Handle Equihash and optional miner code in TestChain100Setup + Add tests covering the current interaction of alerts with subver comments + Parameterize zcash.conf in init error message + cleanup: Comments + Wrap long line + Match alerts both with and without comments + pyflakes fixes + Revert "Remove insecurely-downloaded dependencies that we don't currently use." + depends: Compile bdb with --disable-atomics when cross-compiling darwin + depends: Add Rust targets for cross-compiling darwin + configure: Don't require RELRO and BIND_NOW when cross-compiling darwin + depends: Manually apply build_env to second half of googletest build + Revert "depends: Explicitly set Boost toolchain during configuration" + Add z_mergetoaddress to release notes + ThreadNotifyRecentlyAdded -> ThreadNotifyWallets + Move mempool tx notifying logic out of CTxMemPool + Merge tree and boolean fields in ChainTip API + Move block-notifying logic into ThreadNotifyWallets + Tie sync_blocks in RPC tests to notifier thread + Extend comment with reason for taking care with locks + test: Add sync_all points after block generation to RPC tests + test: Remove genesis-block Sapling activation from shorter_block_times + test: Reverse hashtx and hashblock ordering at start of ZMQ RPC test + test: Add missing sync_all point + test: Update wallet RPC test with change to "absurdly high fee" limit + +Jainan-Tandel (1): + Cosmetic update to README.md . + +Jim Posen (3): + Comments: More comments on functions/globals in standard.h. + [script] Unit tests for script/standard functions + [script] Unit tests for IsMine + +Jonas Schnelli (9): + [autoprune] allow wallet in pruned mode + [RPC] disable import functions in pruned mode + [squashme] improve/corrects prune mode detection test for required wallet rescans + Refactor parameter interaction, call it before AppInit2() + Initialize logging before we do parameter interaction + [Wallet] move wallet help string creation to CWallet + [Wallet] move "load wallet phase" to CWallet + [Wallet] optimize return value of InitLoadWallet() + [Wallet] refactor wallet/init interaction + +Jorge Timón (4): + Chainparams: Replace CBaseChainParams::Network enum with string constants (suggested by Wladimir) + Chainparams: Translations: DRY: options and error strings + Globals: Decouple GetConfigFile and ReadConfigFile from global mapArgs + Policy: MOVEONLY: Create policy/policy.h with some constants + +Larry Ruane (5): + simplify locking, merge cs_SpendingKeyStore into cs_KeyStore + eliminate races: hold cs_KeyStore lock while reading fUseCrypto + revert CCryptoKeyStore::SetCrypted() return value + insightexplorer: LOCK(cs_main) during rpcs + fix tests for enable-debug build + +Luke Dashjr (8): + Bugfix: RPC: blockchain: Display correct defaults in help for verifychain method + Bugfix: Describe dblogsize option correctly (it refers to the wallet database, not memory pool) + Bugfix: If genproclimit is omitted to RPC setgenerate, don't change it; also show correct default in getmininginfo + Bugfix: Omit wallet-related options from -help when wallet is disabled + Constrain constant values to a single location in code + Bugfix: Omit wallet-related options from -help when wallet is not supported + Policy: MOVEONLY: 3 functions to policy.o: + Common argument defaults for NODE_BLOOM stuff and -wallet + +Marco Falke (20): + [trivial] Reuse translation and cleanup DEFAULT_* values + [qt] Move GUI related HelpMessage() part downstream + [trivial] init cleanup + [wallet] Refactor to use new MIN_CHANGE + [wallet] Add comments for doxygen + Init: Use DEFAULT_TRANSACTION_MINFEE in help message + [qt] Properly display required fee instead of minTxFee + Clarify what minrelaytxfee does + translations: Don't translate markdown or force English grammar + transaction_tests: Be more strict checking dust + [trivial] init: Use defaults MIN_RELAY_TX_FEE & TRANSACTION_MAXFEE + contrib: Del. gitian downloader config and update gitian README + rpcwallet: Clarify what settxfee does + HelpMessage: Don't hide -mintxfee behind showDebug + mempool: Replace maxFeeRate of 10000*minRelayTxFee with maxTxFee + [doxygen] Actually display comment + Fix doxygen comment for payTxFee + [doc] Fix markdown + Make sure LogPrintf strings are line-terminated + [wallet] Move hardcoded file name out of log messages + +Marshall Gaucher (3): + Update `import *` to unblock pyflakes from failing + Update z_sendmany calls passing int 0, instead of Decimal('0') + Update to stop random race error from assert + +Matt Corallo (10): + Also remove pay-2-pubkey from watch when adding a priv key + Split up importaddress into helper functions + Add p2sh option to importaddress to import redeemScripts + Add importpubkey method to import a watch-only pubkey + Update importaddress help to push its use to script-only + Add have-pubkey distinction to ISMINE flags + Add logic to track pubkeys as watch-only, not just scripts + Implement watchonly support in fundrawtransaction + SQUASH "Add have-pubkey distinction to ISMINE flags" + SQUASH "Implement watchonly support in fundrawtransaction" + +Miles Manley (1): + Update libsodium download-path + +Peter Todd (3): + Make TX_SCRIPTHASH clear vSolutionsRet first + Add IsPushOnly(const_iterator pc) + Accept any sequence of PUSHDATAs in OP_RETURN outputs + +Pieter Wuille (9): + Remove template matching and pseudo opcodes + Stop treating importaddress'ed scripts as change + Make CScript -> CScriptID conversion explicit + Do not expose SigVersion argument to IsMine + Switch to a private version of SigVersion inside IsMine + Track difference between scriptPubKey and P2SH execution in IsMine + Do not treat bare multisig as IsMine + Mention removal of bare multisig IsMine in release notes + Use anonymous namespace instead of static functions + +Sean Bowe (8): + make-release.py: Versioning changes for 2.1.1-rc1. + make-release.py: Updated manpages for 2.1.1-rc1. + make-release.py: Updated release notes and changelog for 2.1.1-rc1. + make-release.py: Versioning changes for 2.1.1-rc2. + make-release.py: Updated manpages for 2.1.1-rc2. + make-release.py: Updated release notes and changelog for 2.1.1-rc2. + make-release.py: Versioning changes for 2.1.1. + make-release.py: Updated manpages for 2.1.1. + +Simon Liu (1): + Closes #3911. Fix help message of RPC getwalletinfo. + +Taylor Hornby (11): + Add AFL instrumentation scripts to zcutil. + Add configure option to replace main with a stub for fuzzing + Add all-in-one script for starting AFL fuzzing + Separate AFL build, run fuzz stages, and add afl argument pass-through + Have make clean delete fuzz.cpp + Pass AFL input file path to zcashd + Add fuzzing stub for AddrMan deserialization + Add fuzzing stub for ReadFeeEstimates + Add fuzzing stub for CheckBlock + Update proton from 0.26.0 to 0.30.0 + Fix broken proton build + +Ulrich Kempken (1): + depends: switch to secure download of all dependencies + +Wladimir J. van der Laan (7): + make proxy_test work on servers without ipv6 + Fix argument parsing oddity with -noX + doc: mention change to option parsing behavior in release notes + test: move accounting_tests and rpc_wallet_tests to wallet/test + test: Create test fixture for wallet + wallet_ismine.h → script/ismine.h + test: Rename wallet.dat to wallet_test.dat + +sandakersmann (3): + Update of copyright year to 2020 + Update COPYRIGHT_YEAR in clientversion.h to 2020 + Update _COPYRIGHT_YEAR in configure.ac to 2020 + +Jack Grigg (2): + Apply suggestions from code review + Apply suggestions from code review + +Benjamin Winston (1): + Added basic fuzzing to the monolith, see ticket #4155 + diff --git a/doc/release-notes/release-notes-2.1.2-1.md b/doc/release-notes/release-notes-2.1.2-1.md new file mode 100644 index 000000000..02c101ea2 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2-1.md @@ -0,0 +1,17 @@ +Notable changes +=============== + +This release solves an issue where nodes that did not follow the Heartwood activation on testnet (by running a version prior to v2.1.2) but then upgraded to v2.1.2 or later would be incapable of rolling back and following the Heartwood activation without performing a reindex operation. + +Changelog +========= + +Jack Grigg (1): + txdb/chain: Restrict Heartwood chain consistency check to block index objects that were created by Heartwood-unaware clients. + +Sean Bowe (4): + Add the intended testnet activation block of Heartwood to our intended rewind logic. + Don't throw exception in PopHistoryNode when popping from empty tree. + make-release.py: Versioning changes for 2.1.2-1. + make-release.py: Updated manpages for 2.1.2-1. + diff --git a/doc/release-notes/release-notes-2.1.2-2.md b/doc/release-notes/release-notes-2.1.2-2.md new file mode 100644 index 000000000..0f2871cce --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2-2.md @@ -0,0 +1,18 @@ +Notable changes +=============== + +This release fixes an issue that was identified by the Heartwood activation on testnet. v2.1.2 nodes that followed the Heartwood activation on testnet would crash on restart if, prior to shutdown, they had received a block from a miner that had not activated Heartwood, which is very likely. This release fixes that crash. + +Changelog +========= + +Daira Hopwood (1): + txdb: log additional debug information. + +Jack Grigg (1): + txdb: More complete fix for the Heartwood chain consistency check issue. + +Sean Bowe (2): + make-release.py: Versioning changes for 2.1.2-2. + make-release.py: Updated manpages for 2.1.2-2. + diff --git a/doc/release-notes/release-notes-2.1.2-3.md b/doc/release-notes/release-notes-2.1.2-3.md new file mode 100644 index 000000000..02c66637e --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2-3.md @@ -0,0 +1,12 @@ +Notable changes +=============== + +This release sets the EOS halt date to roughly July 14th, which was our original intention. + +Changelog +========= + +Sean Bowe (2): + make-release.py: Versioning changes for 2.1.2-3. + make-release.py: Updated manpages for 2.1.2-3. + diff --git a/doc/release-notes/release-notes-2.1.2-rc1.md b/doc/release-notes/release-notes-2.1.2-rc1.md new file mode 100644 index 000000000..328aaea07 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2-rc1.md @@ -0,0 +1,615 @@ +Notable changes +=============== + +Network Upgrade 3: Heartwood +---------------------------- + +The code preparations for the Heartwood network upgrade are finished and +included in this release. The following ZIPs are being deployed: + +- [ZIP 213: Shielded Coinbase](https://zips.z.cash/zip-0213) +- [ZIP 221: FlyClient - Consensus-Layer Changes](https://zips.z.cash/zip-0221) + +Heartwood will activate on testnet at height XXXXXX, and can also be activated +at a specific height in regtest mode by setting the config option +`-nuparams=f5b9230b:HEIGHT`. + +As a reminder, because the Heartwood activation height is not yet specified for +mainnet, version 2.1.2 will behave similarly as other pre-Heartwood releases +even after a future activation of Heartwood on the network. Upgrading from 2.1.2 +will be required in order to follow the Heartwood network upgrade on mainnet. + +See [ZIP 250](https://zips.z.cash/zip-0250) for additional information about the +deployment process for Heartwood. + +### Mining to Sapling addresses + +Miners and mining pools that wish to test the new "shielded coinbase" support on +the Heartwood testnet can generate a new Sapling address with `z_getnewaddress`, +add the config option `mineraddress=SAPLING_ADDRESS` to their `zcash.conf` file, +and then restart their `zcashd` node. `getblocktemplate` will then return +coinbase transactions containing a shielded miner output. + +Note that `mineraddress` should only be set to a Sapling address after the +Heartwood network upgrade has activated; setting a Sapling address prior to +Heartwood activation will cause `getblocktemplate` to return block templates +that cannot be mined. + +Sapling viewing keys support +---------------------------- + +Support for Sapling viewing keys (specifically, Sapling extended full viewing +keys, as described in [ZIP 32](https://zips.z.cash/zip-0032)), has been added to +the wallet. Nodes will track both sent and received transactions for any Sapling +addresses associated with the imported Sapling viewing keys. + +- Use the `z_exportviewingkey` RPC method to obtain the viewing key for a + shielded address in a node's wallet. For Sapling addresses, these always begin + with "zxviews" (or "zxviewtestsapling" for testnet addresses). + +- Use `z_importviewingkey` to import a viewing key into another node. Imported + Sapling viewing keys will be stored in the wallet, and remembered across + restarts. + +- `z_getbalance` will show the balance of a Sapling address associated with an + imported Sapling viewing key. Balances for Sapling viewing keys will be + included in the output of `z_gettotalbalance` when the `includeWatchonly` + parameter is set to `true`. + +- RPC methods for viewing shielded transaction information (such as + `z_listreceivedbyaddress`) will return information for Sapling addresses + associated with imported Sapling viewing keys. + +Details about what information can be viewed with these Sapling viewing keys, +and what guarantees you have about that information, can be found in +[ZIP 310](https://zips.z.cash/zip-0310). + +Removal of time adjustment and the -maxtimeadjustment= option +------------------------------------------------------------- + +Prior to v2.1.1-1, `zcashd` would adjust the local time that it used by up +to 70 minutes, according to a median of the times sent by the first 200 peers +to connect to it. This mechanism was inherently insecure, since an adversary +making multiple connections to the node could effectively control its time +within that +/- 70 minute window (this is called a "timejacking attack"). + +In the v2.1.1-1 security release, in addition to other mitigations for +timejacking attacks, the maximum time adjustment was set to zero by default. +This effectively disabled time adjustment; however, a `-maxtimeadjustment=` +option was provided to override this default. + +As a simplification the time adjustment code has now been completely removed, +together with `-maxtimeadjustment=`. Node operators should instead ensure that +their local time is set reasonably accurately. + +If it appears that the node has a significantly different time than its peers, +a warning will still be logged and indicated on the metrics screen if enabled. + +View shielded information in wallet transactions +------------------------------------------------ + +In previous `zcashd` versions, to obtain information about shielded transactions +you would use either the `z_listreceivedbyaddress` RPC method (which returns all +notes received by an address) or `z_listunspent` (which returns unspent notes, +optionally filtered by addresses). There were no RPC methods that directly +returned details about spends, or anything equivalent to the `gettransaction` +method (which returns transparent information about in-wallet transactions). + +This release introduces a new RPC method `z_viewtransaction` to fill that gap. +Given the ID of a transaction in the wallet, it decrypts the transaction and +returns detailed shielded information for all decryptable new and spent notes, +including: + +- The address that each note belongs to. +- Values in both decimal ZEC and zatoshis. +- The ID of the transaction that each spent note was received in. +- An `outgoing` flag on each new note, which will be `true` if the output is not + for an address in the wallet. +- A `memoStr` field for each new note, containing its text memo (if its memo + field contains a valid UTF-8 string). + +Information will be shown for any address that appears in `z_listaddresses`; +this includes watch-only addresses linked to viewing keys imported with +`z_importviewingkey`, as well as addresses with spending keys (both generated +with `z_getnewaddress` and imported with `z_importkey`). + +Better error messages for rejected transactions after network upgrades +---------------------------------------------------------------------- + +The Zcash network upgrade process includes several features designed to protect +users. One of these is the "consensus branch ID", which prevents transactions +created after a network upgrade has activated from being replayed on another +chain (that might have occurred due to, for example, a +[friendly fork](https://electriccoin.co/blog/future-friendly-fork/)). This is +known as "two-way replay protection", and is a core requirement by +[various](https://blog.bitgo.com/bitgos-approach-to-handling-a-hard-fork-71e572506d7d?gi=3b80c02e027e) +[members](https://trezor.io/support/general/hard-forks/) of the cryptocurrency +ecosystem for supporting "hard fork"-style changes like our network upgrades. + +One downside of the way replay protection is implemented in Zcash, is that there +is no visible difference between a transaction being rejected by a `zcashd` node +due to targeting a different branch, and being rejected due to an invalid +signature. This has caused issues in the past when a user had not upgraded their +wallet software, or when a wallet lacked support for the new network upgrade's +consensus branch ID; the resulting error messages when users tried to create +transactions were non-intuitive, and particularly cryptic for transparent +transactions. + +Starting from this release, `zcashd` nodes will re-verify invalid transparent +and Sprout signatures against the consensus branch ID from before the most +recent network upgrade. If the signature then becomes valid, the transaction +will be rejected with the error message `old-consensus-branch-id`. This error +can be handled specifically by wallet providers to inform the user that they +need to upgrade their wallet software. + +Wallet software can also automatically obtain the latest consensus branch ID +from their (up-to-date) `zcashd` node, by calling `getblockchaininfo` and +looking at `{'consensus': {'nextblock': BRANCH_ID, ...}, ...}` in the JSON +output. + +Expired transactions notifications +---------------------------------- + +A new config option `-txexpirynotify` has been added that will cause `zcashd` to +execute a command when a transaction in the mempool expires. This can be used to +notify external systems about transaction expiry, similar to the existing +`-blocknotify` config option that notifies when the chain tip changes. + +RPC methods +----------- + +- The `z_importkey` and `z_importviewingkey` RPC methods now return the type of + the imported spending or viewing key (`sprout` or `sapling`), and the + corresponding payment address. + +- Negative heights are now permitted in `getblock` and `getblockhash`, to select + blocks backwards from the chain tip. A height of `-1` corresponds to the last + known valid block on the main chain. + +- A new RPC method `getexperimentalfeatures` returns the list of enabled + experimental features. + +Build system +------------ + +- The `--enable-lcov`, `--disable-tests`, and `--disable-mining` flags for + `zcutil/build.sh` have been removed. You can pass these flags instead by using + the `CONFIGURE_FLAGS` environment variable. For example, to enable coverage + instrumentation (thus enabling "make cov" to work), call: + + ``` + CONFIGURE_FLAGS="--enable-lcov --disable-hardening" ./zcutil/build.sh + ``` + +- The build system no longer defaults to verbose output. You can re-enable + verbose output with `./zcutil/build.sh V=1` + +Changelog +========= + +Alfredo Garcia (40): + remove SignatureHash from python rpc tests + add negative height to getblock + allow negative index to getblockhash + update docs + add additional tests to rpc_wallet_z_getnewaddress + change convention + change regex + Return address and type of imported key in z_importkey + Delete travis file + dedup decode keys and addresses + remove unused imports + add txexpirynotify + fix rpx_wallet_tests + remove debug noise from 2 gtests + make type and size a pair in DecodeAny arguments + add missing calls to DecodeAny + add destination wrappers + change tuples to classes + change cm() to cmu() in SaplingNote class + change the cm member of OutputDescription to cmu + change maybe_cm to maybe_cmu + add getexperimentalfeatures rpc call + refactor experimental features + make fInsightExplorer a local + add check_node_log utility function + remove space after new line + move check_node_log framework test to a new file + use check_node_log in turnstile.py + add stop_node argument to check_node_log, use it in shieldingcoinbase + change constructors + minor comment fix + preserve test semantics + remove unused import + multiple debug categories documentation + return address info in z_importviewingkey + add expected address check to tests + change unclear wording in z_import calls address returned + Lock with cs_main inside gtests that call chainActive.Height() + add -lightwalletd experimental option + compute more structures in mempool DynamicMemoryUsage + +Carl Dong (1): + autoconf: Sane --enable-debug defaults. + +Chun Kuan Lee (1): + Reset default -g -O2 flags when enable debug + +Cory Fields (3): + bench: switch to std::chrono for time measurements + bench: prefer a steady clock if the resolution is no worse + build: Split hardening/fPIE options out + +Dagur Valberg Johannsson (1): + Improve z_getnewaddress tests + +Daira Hopwood (24): + Add missing cases for Blossom in ContextualCheckBlock tests. + Revert "Add -maxtimeadjustment with default of 0 instead of the 4200 seconds used in Bitcoin Core." + Remove uses of GetTimeOffset(). + Replace time adjustment with warning only. + Update GetAdjustedTime() to GetTime(). + Sort entries in zcash_gtest_SOURCES (other than test_tautology which is deliberately first). + Add release notes for removal of -maxtimeadjustment. + Resolve a race condition on `chainActive.Tip()` in initialization (introduced in #4379). + Setting a std::atomic variable in a signal handler only has defined behaviour if it is lock-free. + Add comment to `MilliSleep` documenting that it is an interruption point. + Exit init early if we request shutdown before having loaded the genesis block. + Fix typos/minor errors in comments, and wrap some lines. + Avoid a theoretical possibility of division-by-zero introduced in #4368. + Make the memo a mandatory argument for SendManyRecipient + Add a `zcutil/clean.sh` script that works (unlike `make clean`). + Split into clean.sh and distclean.sh. + Minor refactoring. + Executables end with .exe on Windows. + Avoid spurious error messages when cleaning up directories. + Address review comments. + Use `SA_RESTART` in `sa_flags` when setting up signal handlers. + Remove a redundant `rm -f` command. + Refer to altitude instead of height for history tree peaks + Address review comments: `target` and `depends/work` should be cleaned by clean.sh. + +Dimitris Apostolou (8): + Fix Boost compilation on macOS + Remove libsnark preprocessor flags + Fix typo + End diff with LF character + Remove stale comment + Point at support community on Discord + Update documentation info + Fix typos + +Eirik Ogilvie-Wigley (2): + Include shielded transaction data when calculating RecursiveDynamicUsage of transactions + Account for malloc overhead + +Evan Klitzke (2): + Add --with-sanitizers option to configure + Make --enable-debug to pick better options + +Gavin Andresen (2): + Simple benchmarking framework + Support very-fast-running benchmarks + +Gregory Maxwell (4): + Avoid integer division in the benchmark inner-most loop. + Move GetWarnings and related globals to util. + Eliminate data races for strMiscWarning and fLargeWork*Found. + Move GetWarnings() into its own file. + +Jack Grigg (94): + Revert "Add configure flags for enabling ASan/UBSan and TSan" + configure: Re-introduce additional sanitizer flags + RPC: z_viewtransaction + depends: Add utfcpp to dependencies + RPC: Display valid UTF-8 memos in z_viewtransaction + RPC: Use OutgoingViewingKeys to recover non-wallet Sapling outputs + test: Check z_viewtransaction output in wallet_listreceived RPC test + Benchmark Zcash verification operations + Simulate worst-case block verification + zcutil/build.sh: Remove lcov and mining flags + configure: Change default Proton to match build.sh + zcutil/build.sh: Turn off verbosity by default + Make -fwrapv conditional on --enable-debug=no + Move default -g flag into configure.ac behind --enable-debug=no + Add build system changes to release notes + test: Hard-code hex memo in wallet_listreceived for Python3 compatibility + test: Fix pyflakes warnings + bench: "Use" result of crypto_sign_verify_detached + Add test vectors for small-order Ed25519 pubkeys + Patch libsodium 1.0.15 pubkey validation onto 1.0.18 + Patch libsodium 1.0.15 signature validation onto 1.0.18 + Add release notes for z_viewtransaction + Deduplicate some wallet keystore logic + Move Sprout and Sapling address logic into separate files + Move ZIP 32 classes inside zcash/Address.hpp + SaplingFullViewingKey -> SaplingExtendedFullViewingKey in keystore maps + Remove default address parameter from Sapling keystore methods + test: Add test for CBasicKeyStore::AddSaplingFullViewingKey + Add encoding and decoding for Sapling extended full viewing keys + Add Sapling ExtFVK support to z_exportviewingkey + Add in-memory Sapling ExtFVK support to z_importviewingkey + Store imported Sapling ExtFVKs in wallet database + OutputDescriptionInfo::Build() + ZIP 213 consensus rules + Add support for Sapling addresses in -mineraddress + wallet: Include coinbase txs in Sapling note selection + Add regtest-only -nurejectoldversions option + test: Minor tweaks to comments in LibsodiumPubkeyValidation + test: RPC test for shielded coinbase + Adjust comments on ZIP 213 logic + Use DoS level constants and parameters for ZIP 213 rejections + test: Check that shielded coinbase can be spent to a t-address + init: Inform on error that -mineraddress must be Sapling or transparent + test: Explicitly check Sapling consensus rules apply to shielded coinbase + Migrate GitHub issue template to new format + Add GitHub issue templates for feature requests and UX reports + depends: Remove comments from libsodium signature validation patch + Bring in librustzcash crate + Bring in Cargo.lock from librustzcash repo + rust: Pin toolchain to 1.36.0, matching depends system + rust: Adjust Cargo.toml so that it compiles + Update .gitignore for Rust code + Replace librustzcash from depends system with src/rust + Move root of Rust crate into repo root + depends: Remove unused vendored crates + Fix Rust static library linking for Windows builds + test: Rename FakeCoinsViewDB -> ValidationFakeCoinsViewDB + test: Modify ValidationFakeCoinsViewDB to optionally contain a coin + test: Add missing parameter selection to Validation.ReceivedBlockTransactions + mempool: Check transparent signatures against the previous network upgrade + mempool: Remove duplicate consensusBranchId from AcceptToMemoryPool + test: Add Overwinter and Sapling support to GetValidTransaction() helper + consensus: Check JoinSplit signatures against the previous network upgrade + depends: Use Rust 1.42.0 toolchain + Bring in updates to librustzcash crate + depends: Define Rust target in a single location + depends: Hard-code Rust target for all Darwin hosts + Add ZIP 221 logic to block index + Add ZIP 221 support to miner and getblocktemplate + Implement ZIP 221 consensus rules + Return the correct root from librustzcash_mmr_{append, delete} + Use a C array for HistoryEntry instead of std::array + test: Verify ZIP 221 logic against reference implementation + build: Move cargo arguments into RUST_BUILD_OPTS + build: Correctly remove generated files from .cargo + test: Build Rust tests as part of qa/zcash/full_test_suite.py + build: Connect cargo verbosity to make verbosity + test: Assert that GetValidTransaction supports the given branch ID + Comment tweaks and cleanups + test: Add an extra assertion to feature_zip221.py + Remove unnecessary else case in CCoinsViewCache::PreloadHistoryTree + Improve documentation of CCoinsViewCache::PreloadHistoryTree + Truncate HistoryCache.appends correctly for zero-indexed entries + Comment clarifications and fixes + Make peak_pos zero-indexed in CCoinsViewCache::PreloadHistoryTree + test: Ignore timestamps in addressindex checks + test: Add a second Sapling note to WalletTests.ClearNoteWitnessCache + test: Run Equihash test vectors on both C++ and Rust validators + Pass the block height through to CheckEquihashSolution() + consensus: From Heartwood activation, use Rust Equihash validator + zcutil/make-release.py: Fix to run with Python 3 + zcutil/make-release.py: Check for release dependencies + Update release notes for v2.1.2 + zcutil/release-notes.py: Add Python 3 execution header + +James O'Beirne (1): + Add basic coverage reporting for RPC tests + +Jeremy Rubin (3): + Add Basic CheckQueue Benchmark + Address ryanofsky feedback on CCheckQueue benchmarks. Eliminated magic numbers, fixed scoping of vectors (and memory movement component of benchmark). + Add prevector destructor benchmark + +Karl-Johan Alm (1): + Refactoring: Removed using namespace from bench/ and test/ source files. + +Larry Ruane (2): + zcutil/fetch-params.sh unneeded --testnet arg should warn user + util: CBufferedFile fixes + +LitecoinZ (1): + Fix issue #3772 + +Marshall Gaucher (1): + Update qa/rpc-tests/addressindex.py + +Matt Corallo (2): + Remove countMaskInv caching in bench framework + Require a steady clock for bench with at least micro precision + +MeshCollider (3): + Fix race for mapBlockIndex in AppInitMain + Make fReindex atomic to avoid race + Consistent parameter names in txdb.h + +NicolasDorier (1): + [qa] assert_start_raises_init_error + +NikVolf (3): + push/pop history with tests + update chain history in ConnectBlock and DisconnectBlock + use iterative platform-independent log2i + +Patrick Strateman (1): + Acquire lock to check for genesis block. + +Pavel Janík (3): + Rewrite help texts for features enabled by default. + Ignore bench_bitcoin binary. + Prevent warning: variable 'x' is uninitialized + +Philip Kaufmann (1): + [Trivial] ensure minimal header conventions + +Pieter Wuille (3): + Benchmark rolling bloom filter + Introduce FastRandomContext::randbool() + FastRandom benchmark + +Sean Bowe (9): + Initialize ThreadNotifyWallets before additional blocks are imported. + Handle case of fresh wallets in ThreadNotifyWallets. + Clarify comment + Add librustzcash tests to the full test suite. + Add release profile optimizations and turn off panic unwinding in librustzcash. + Minor typo fixes. + Simplification for MacOS in rust-test. + make-release.py: Versioning changes for 2.1.2-rc1. + make-release.py: Updated manpages for 2.1.2-rc1. + +Taylor Hornby (15): + Make the equihash validator macro set its output to false when throwing an exception. + Add test for unused bits in the Equihash solution encoding. + Add Python script for checking if dependencies have updates. + Add GitHub API credential + Update list of dependencies to check + Wrap long lines + Cache releases to reduce network usage and improve performance + Make updatecheck.py compatible with python2 + Have make clean delete temporary AFL build directory + Add AFL build directory to .gitignore + Have make clean delete AFL output directories. + Fix bug in updatecheck.py and add utfcpp to its dependency list + Fix typo in updatecheck.py + Update updatecheck.py with the new Rust dependencies and improve the error message in case the untracked dependency list becomes out of date. + Fix undefined behavior in CScriptNum + +Wladimir J. van der Laan (7): + bench: Add crypto hash benchmarks + Kill insecure_random and associated global state + bench: Fix subtle counting issue when rescaling iteration count + bench: Add support for measuring CPU cycles + bench: Fix initialization order in registration + util: Don't set strMiscWarning on every exception + test_framework: detect failure of bitcoind startup + +Yuri Zhykin (1): + bench: Added base58 encoding/decoding benchmarks + +avnish (14): + changed block_test to BlockTests + changed test names from _ to CamelCase + changed header_size_is_expected to HeaderSizeIsExpected + changed "equihash_tests" to EquihashTests + changed founders_reward_test to FoundersRewardTest + changes tests to camelcase + chnged keystore_tests to KeystoreTests + changed libzcash_utils to LibzcashUtils + changed test to CamelCase + changed test to CamelCase + changed test to CamelCase + changed seven_eq_seven to SevenEqSeven + changed txid_tests to TxidTests + changed wallet_zkeys_test to WalletZkeysTest + +avnish98 (1): + requested changes are rectified + +ca333 (2): + update libsodium to v1.0.18 + fix dead openssl download path + +gladcow (4): + Show reindex state in metrics + Use processed file size as progress in metrics during reindex + Byte sizes format + Move reindex progress globals to metrics.h/cpp + +Marshall Gaucher (74): + update /usr/bin/env; fix print conventions + update test_framework modules + Update rpc-test/test_framework to Py3 convention,modules,encoding + Update ignored testScriptsExt to Python3 + Update python3 env path, remove python 2.7 assert + Update hexlify for encoding, update to py3 io module + Update py3 env path, remove py2 assert + Update py2 conventions to py3, remove py2 env and assert + Update py2 conventions to py3, update Decimal calls + Update py2 env path, remove py2 assert + Update py2 env path, remove py2 assert + Update py2 env path, remove py2 assert, update filter to return list for py3 + Update py2 env path, remove py2 assert, update http module and assert encoding + Update cmp to py3 functions, update map return to list for py3 + Standard py2 to py3 updates + Update py2 modules to py3, update encoding to be py3 compatible + Update to py3 conventions, update decimal calls to be consistent + Update to py3 conventions, update filter to return list + update to py3 conventions, update range to return list for py3 + update to py3 convention, update execfile to py3 call + update to py3 conventions, update cmp to be py3 compatible, update map to return list for py3 + update to py3 conventions, preserve ipv6 patch + update str cast to prevent address assert issues + clean up binascii call + Add keyerror execption + update to py3 env path + update to py3 conventions, update functions to be upstream consistent + update to py3 conventions, clean up code to be upstream consistent + update to py3 encodings + update encoding, decoding, serialize funcs for py3 + Update type to be decimal + update to py3 conventions, BUG with last assert_equal + Update io modules for py3, ISSUE with create_transaction function + Update to py3, ISSUE with encoding + Update to py3, ISSUE with encoding + Update to py3, ISSUE with encoding in create_block + Update to py3, ISSUE with encoding in create_block + Clean up code not needed from upstream + update io module, fix py3 division, and string encoding + update remaining encoding issues, add pyblake2 + Use more meaningful assert_equal from our original codebase + Clean up code from upstream we dont use + fix except bug for undefined url + Remove semi colons + make import urlparse module consistent,httplib update to py3 + correct update to python3 + clean-up imports, keep string notation consistent, remove spacing + clean up + Use upstream encoding for encodeDecimal + fix type issue + fix initialize statements for imports + clean up initiliaze statements from imports + update type for decimal 0 + remove debug lines from prior commits + clean up to minimize diff + remove u encoding + Fix decimal 0 issues + Clean up import calls + clean up + clean up + clean up + fix url and port issue + cleanups and fixing odd casting + Update json to simplejson to remove unicode and str issue from py2 to py3 + Update py3 division + fix pyflakes errors + clean up conventions and whitespace + fix string pattern issue on byte object + update comment regarding prior py2 exception + Fix remaining python3 conventions + Update remaining Python3 conventions + Updating remaining python3 conventions + Update #! env for python3 + Update RPCs to support cross platform paths and libs + +murrayn (1): + Add build support for 'gprof' profiling. + +practicalswift (8): + build: Show enabled sanitizers in configure output + Add -ftrapv to DEBUG_CXXFLAGS when --enable-debug is used + Assert that what might look like a possible division by zero is actually unreachable + Replace boost::function with std::function (C++11) + Avoid static analyzer warnings regarding uninitialized arguments + Restore default format state of cout after printing with std::fixed/setprecision + Initialize recently introduced non-static class member lastCycles to zero in constructor + Replace boost::function with std::function (C++11) + +ptschip (1): + Enable python tests for Native Windows + +zancas (3): + update comment, to correctly specify number of methods injected + replace "virtual" with "override" in subclasses + Remove remaining instances of boost::function + diff --git a/doc/release-notes/release-notes-2.1.2.md b/doc/release-notes/release-notes-2.1.2.md new file mode 100644 index 000000000..0a4aa45d4 --- /dev/null +++ b/doc/release-notes/release-notes-2.1.2.md @@ -0,0 +1,623 @@ +Notable changes +=============== + +Network Upgrade 3: Heartwood +---------------------------- + +The code preparations for the Heartwood network upgrade are finished and +included in this release. The following ZIPs are being deployed: + +- [ZIP 213: Shielded Coinbase](https://zips.z.cash/zip-0213) +- [ZIP 221: FlyClient - Consensus-Layer Changes](https://zips.z.cash/zip-0221) + +Heartwood will activate on testnet at height 903800, and can also be activated +at a specific height in regtest mode by setting the config option +`-nuparams=f5b9230b:HEIGHT`. + +As a reminder, because the Heartwood activation height is not yet specified for +mainnet, version 2.1.2 will behave similarly as other pre-Heartwood releases +even after a future activation of Heartwood on the network. Upgrading from 2.1.2 +will be required in order to follow the Heartwood network upgrade on mainnet. + +See [ZIP 250](https://zips.z.cash/zip-0250) for additional information about the +deployment process for Heartwood. + +### Mining to Sapling addresses + +Miners and mining pools that wish to test the new "shielded coinbase" support on +the Heartwood testnet can generate a new Sapling address with `z_getnewaddress`, +add the config option `mineraddress=SAPLING_ADDRESS` to their `zcash.conf` file, +and then restart their `zcashd` node. `getblocktemplate` will then return +coinbase transactions containing a shielded miner output. + +Note that `mineraddress` should only be set to a Sapling address after the +Heartwood network upgrade has activated; setting a Sapling address prior to +Heartwood activation will cause `getblocktemplate` to return block templates +that cannot be mined. + +Sapling viewing keys support +---------------------------- + +Support for Sapling viewing keys (specifically, Sapling extended full viewing +keys, as described in [ZIP 32](https://zips.z.cash/zip-0032)), has been added to +the wallet. Nodes will track both sent and received transactions for any Sapling +addresses associated with the imported Sapling viewing keys. + +- Use the `z_exportviewingkey` RPC method to obtain the viewing key for a + shielded address in a node's wallet. For Sapling addresses, these always begin + with "zxviews" (or "zxviewtestsapling" for testnet addresses). + +- Use `z_importviewingkey` to import a viewing key into another node. Imported + Sapling viewing keys will be stored in the wallet, and remembered across + restarts. + +- `z_getbalance` will show the balance of a Sapling address associated with an + imported Sapling viewing key. Balances for Sapling viewing keys will be + included in the output of `z_gettotalbalance` when the `includeWatchonly` + parameter is set to `true`. + +- RPC methods for viewing shielded transaction information (such as + `z_listreceivedbyaddress`) will return information for Sapling addresses + associated with imported Sapling viewing keys. + +Details about what information can be viewed with these Sapling viewing keys, +and what guarantees you have about that information, can be found in +[ZIP 310](https://zips.z.cash/zip-0310). + +Removal of time adjustment and the -maxtimeadjustment= option +------------------------------------------------------------- + +Prior to v2.1.1-1, `zcashd` would adjust the local time that it used by up +to 70 minutes, according to a median of the times sent by the first 200 peers +to connect to it. This mechanism was inherently insecure, since an adversary +making multiple connections to the node could effectively control its time +within that +/- 70 minute window (this is called a "timejacking attack"). + +In the v2.1.1-1 security release, in addition to other mitigations for +timejacking attacks, the maximum time adjustment was set to zero by default. +This effectively disabled time adjustment; however, a `-maxtimeadjustment=` +option was provided to override this default. + +As a simplification the time adjustment code has now been completely removed, +together with `-maxtimeadjustment=`. Node operators should instead ensure that +their local time is set reasonably accurately. + +If it appears that the node has a significantly different time than its peers, +a warning will still be logged and indicated on the metrics screen if enabled. + +View shielded information in wallet transactions +------------------------------------------------ + +In previous `zcashd` versions, to obtain information about shielded transactions +you would use either the `z_listreceivedbyaddress` RPC method (which returns all +notes received by an address) or `z_listunspent` (which returns unspent notes, +optionally filtered by addresses). There were no RPC methods that directly +returned details about spends, or anything equivalent to the `gettransaction` +method (which returns transparent information about in-wallet transactions). + +This release introduces a new RPC method `z_viewtransaction` to fill that gap. +Given the ID of a transaction in the wallet, it decrypts the transaction and +returns detailed shielded information for all decryptable new and spent notes, +including: + +- The address that each note belongs to. +- Values in both decimal ZEC and zatoshis. +- The ID of the transaction that each spent note was received in. +- An `outgoing` flag on each new note, which will be `true` if the output is not + for an address in the wallet. +- A `memoStr` field for each new note, containing its text memo (if its memo + field contains a valid UTF-8 string). + +Information will be shown for any address that appears in `z_listaddresses`; +this includes watch-only addresses linked to viewing keys imported with +`z_importviewingkey`, as well as addresses with spending keys (both generated +with `z_getnewaddress` and imported with `z_importkey`). + +Better error messages for rejected transactions after network upgrades +---------------------------------------------------------------------- + +The Zcash network upgrade process includes several features designed to protect +users. One of these is the "consensus branch ID", which prevents transactions +created after a network upgrade has activated from being replayed on another +chain (that might have occurred due to, for example, a +[friendly fork](https://electriccoin.co/blog/future-friendly-fork/)). This is +known as "two-way replay protection", and is a core requirement by +[various](https://blog.bitgo.com/bitgos-approach-to-handling-a-hard-fork-71e572506d7d?gi=3b80c02e027e) +[members](https://trezor.io/support/general/hard-forks/) of the cryptocurrency +ecosystem for supporting "hard fork"-style changes like our network upgrades. + +One downside of the way replay protection is implemented in Zcash, is that there +is no visible difference between a transaction being rejected by a `zcashd` node +due to targeting a different branch, and being rejected due to an invalid +signature. This has caused issues in the past when a user had not upgraded their +wallet software, or when a wallet lacked support for the new network upgrade's +consensus branch ID; the resulting error messages when users tried to create +transactions were non-intuitive, and particularly cryptic for transparent +transactions. + +Starting from this release, `zcashd` nodes will re-verify invalid transparent +and Sprout signatures against the consensus branch ID from before the most +recent network upgrade. If the signature then becomes valid, the transaction +will be rejected with the error message `old-consensus-branch-id`. This error +can be handled specifically by wallet providers to inform the user that they +need to upgrade their wallet software. + +Wallet software can also automatically obtain the latest consensus branch ID +from their (up-to-date) `zcashd` node, by calling `getblockchaininfo` and +looking at `{'consensus': {'nextblock': BRANCH_ID, ...}, ...}` in the JSON +output. + +Expired transactions notifications +---------------------------------- + +A new config option `-txexpirynotify` has been added that will cause `zcashd` to +execute a command when a transaction in the mempool expires. This can be used to +notify external systems about transaction expiry, similar to the existing +`-blocknotify` config option that notifies when the chain tip changes. + +RPC methods +----------- + +- The `z_importkey` and `z_importviewingkey` RPC methods now return the type of + the imported spending or viewing key (`sprout` or `sapling`), and the + corresponding payment address. + +- Negative heights are now permitted in `getblock` and `getblockhash`, to select + blocks backwards from the chain tip. A height of `-1` corresponds to the last + known valid block on the main chain. + +- A new RPC method `getexperimentalfeatures` returns the list of enabled + experimental features. + +Build system +------------ + +- The `--enable-lcov`, `--disable-tests`, and `--disable-mining` flags for + `zcutil/build.sh` have been removed. You can pass these flags instead by using + the `CONFIGURE_FLAGS` environment variable. For example, to enable coverage + instrumentation (thus enabling "make cov" to work), call: + + ``` + CONFIGURE_FLAGS="--enable-lcov --disable-hardening" ./zcutil/build.sh + ``` + +- The build system no longer defaults to verbose output. You can re-enable + verbose output with `./zcutil/build.sh V=1` + +Changelog +========= + +Alfredo Garcia (40): + remove SignatureHash from python rpc tests + add negative height to getblock + allow negative index to getblockhash + update docs + add additional tests to rpc_wallet_z_getnewaddress + change convention + change regex + Return address and type of imported key in z_importkey + Delete travis file + dedup decode keys and addresses + remove unused imports + add txexpirynotify + fix rpx_wallet_tests + remove debug noise from 2 gtests + make type and size a pair in DecodeAny arguments + add missing calls to DecodeAny + add destination wrappers + change tuples to classes + change cm() to cmu() in SaplingNote class + change the cm member of OutputDescription to cmu + change maybe_cm to maybe_cmu + add getexperimentalfeatures rpc call + refactor experimental features + make fInsightExplorer a local + add check_node_log utility function + remove space after new line + move check_node_log framework test to a new file + use check_node_log in turnstile.py + add stop_node argument to check_node_log, use it in shieldingcoinbase + change constructors + minor comment fix + preserve test semantics + remove unused import + multiple debug categories documentation + return address info in z_importviewingkey + add expected address check to tests + change unclear wording in z_import calls address returned + Lock with cs_main inside gtests that call chainActive.Height() + add -lightwalletd experimental option + compute more structures in mempool DynamicMemoryUsage + +Carl Dong (1): + autoconf: Sane --enable-debug defaults. + +Chun Kuan Lee (1): + Reset default -g -O2 flags when enable debug + +Cory Fields (3): + bench: switch to std::chrono for time measurements + bench: prefer a steady clock if the resolution is no worse + build: Split hardening/fPIE options out + +Dagur Valberg Johannsson (1): + Improve z_getnewaddress tests + +Daira Hopwood (25): + Add missing cases for Blossom in ContextualCheckBlock tests. + Revert "Add -maxtimeadjustment with default of 0 instead of the 4200 seconds used in Bitcoin Core." + Remove uses of GetTimeOffset(). + Replace time adjustment with warning only. + Update GetAdjustedTime() to GetTime(). + Sort entries in zcash_gtest_SOURCES (other than test_tautology which is deliberately first). + Add release notes for removal of -maxtimeadjustment. + Resolve a race condition on `chainActive.Tip()` in initialization (introduced in #4379). + Setting a std::atomic variable in a signal handler only has defined behaviour if it is lock-free. + Add comment to `MilliSleep` documenting that it is an interruption point. + Exit init early if we request shutdown before having loaded the genesis block. + Fix typos/minor errors in comments, and wrap some lines. + Avoid a theoretical possibility of division-by-zero introduced in #4368. + Make the memo a mandatory argument for SendManyRecipient + Add a `zcutil/clean.sh` script that works (unlike `make clean`). + Split into clean.sh and distclean.sh. + Minor refactoring. + Executables end with .exe on Windows. + Avoid spurious error messages when cleaning up directories. + Address review comments. + Use `SA_RESTART` in `sa_flags` when setting up signal handlers. + Remove a redundant `rm -f` command. + Refer to altitude instead of height for history tree peaks + Address review comments: `target` and `depends/work` should be cleaned by clean.sh. + Clarify definition of NETWORK_UPGRADE_PEER_PREFERENCE_BLOCK_PERIOD. + +Dimitris Apostolou (8): + Fix Boost compilation on macOS + Remove libsnark preprocessor flags + Fix typo + End diff with LF character + Remove stale comment + Point at support community on Discord + Update documentation info + Fix typos + +Eirik Ogilvie-Wigley (2): + Include shielded transaction data when calculating RecursiveDynamicUsage of transactions + Account for malloc overhead + +Evan Klitzke (2): + Add --with-sanitizers option to configure + Make --enable-debug to pick better options + +Gavin Andresen (2): + Simple benchmarking framework + Support very-fast-running benchmarks + +Gregory Maxwell (4): + Avoid integer division in the benchmark inner-most loop. + Move GetWarnings and related globals to util. + Eliminate data races for strMiscWarning and fLargeWork*Found. + Move GetWarnings() into its own file. + +Jack Grigg (95): + Revert "Add configure flags for enabling ASan/UBSan and TSan" + configure: Re-introduce additional sanitizer flags + RPC: z_viewtransaction + depends: Add utfcpp to dependencies + RPC: Display valid UTF-8 memos in z_viewtransaction + RPC: Use OutgoingViewingKeys to recover non-wallet Sapling outputs + test: Check z_viewtransaction output in wallet_listreceived RPC test + Benchmark Zcash verification operations + Simulate worst-case block verification + zcutil/build.sh: Remove lcov and mining flags + configure: Change default Proton to match build.sh + zcutil/build.sh: Turn off verbosity by default + Make -fwrapv conditional on --enable-debug=no + Move default -g flag into configure.ac behind --enable-debug=no + Add build system changes to release notes + test: Hard-code hex memo in wallet_listreceived for Python3 compatibility + test: Fix pyflakes warnings + bench: "Use" result of crypto_sign_verify_detached + Add test vectors for small-order Ed25519 pubkeys + Patch libsodium 1.0.15 pubkey validation onto 1.0.18 + Patch libsodium 1.0.15 signature validation onto 1.0.18 + Add release notes for z_viewtransaction + Deduplicate some wallet keystore logic + Move Sprout and Sapling address logic into separate files + Move ZIP 32 classes inside zcash/Address.hpp + SaplingFullViewingKey -> SaplingExtendedFullViewingKey in keystore maps + Remove default address parameter from Sapling keystore methods + test: Add test for CBasicKeyStore::AddSaplingFullViewingKey + Add encoding and decoding for Sapling extended full viewing keys + Add Sapling ExtFVK support to z_exportviewingkey + Add in-memory Sapling ExtFVK support to z_importviewingkey + Store imported Sapling ExtFVKs in wallet database + OutputDescriptionInfo::Build() + ZIP 213 consensus rules + Add support for Sapling addresses in -mineraddress + wallet: Include coinbase txs in Sapling note selection + Add regtest-only -nurejectoldversions option + test: Minor tweaks to comments in LibsodiumPubkeyValidation + test: RPC test for shielded coinbase + Adjust comments on ZIP 213 logic + Use DoS level constants and parameters for ZIP 213 rejections + test: Check that shielded coinbase can be spent to a t-address + init: Inform on error that -mineraddress must be Sapling or transparent + test: Explicitly check Sapling consensus rules apply to shielded coinbase + Migrate GitHub issue template to new format + Add GitHub issue templates for feature requests and UX reports + depends: Remove comments from libsodium signature validation patch + Bring in librustzcash crate + Bring in Cargo.lock from librustzcash repo + rust: Pin toolchain to 1.36.0, matching depends system + rust: Adjust Cargo.toml so that it compiles + Update .gitignore for Rust code + Replace librustzcash from depends system with src/rust + Move root of Rust crate into repo root + depends: Remove unused vendored crates + Fix Rust static library linking for Windows builds + test: Rename FakeCoinsViewDB -> ValidationFakeCoinsViewDB + test: Modify ValidationFakeCoinsViewDB to optionally contain a coin + test: Add missing parameter selection to Validation.ReceivedBlockTransactions + mempool: Check transparent signatures against the previous network upgrade + mempool: Remove duplicate consensusBranchId from AcceptToMemoryPool + test: Add Overwinter and Sapling support to GetValidTransaction() helper + consensus: Check JoinSplit signatures against the previous network upgrade + depends: Use Rust 1.42.0 toolchain + Bring in updates to librustzcash crate + depends: Define Rust target in a single location + depends: Hard-code Rust target for all Darwin hosts + Add ZIP 221 logic to block index + Add ZIP 221 support to miner and getblocktemplate + Implement ZIP 221 consensus rules + Return the correct root from librustzcash_mmr_{append, delete} + Use a C array for HistoryEntry instead of std::array + test: Verify ZIP 221 logic against reference implementation + build: Move cargo arguments into RUST_BUILD_OPTS + build: Correctly remove generated files from .cargo + test: Build Rust tests as part of qa/zcash/full_test_suite.py + build: Connect cargo verbosity to make verbosity + test: Assert that GetValidTransaction supports the given branch ID + Comment tweaks and cleanups + test: Add an extra assertion to feature_zip221.py + Remove unnecessary else case in CCoinsViewCache::PreloadHistoryTree + Improve documentation of CCoinsViewCache::PreloadHistoryTree + Truncate HistoryCache.appends correctly for zero-indexed entries + Comment clarifications and fixes + Make peak_pos zero-indexed in CCoinsViewCache::PreloadHistoryTree + test: Ignore timestamps in addressindex checks + test: Add a second Sapling note to WalletTests.ClearNoteWitnessCache + test: Run Equihash test vectors on both C++ and Rust validators + Pass the block height through to CheckEquihashSolution() + consensus: From Heartwood activation, use Rust Equihash validator + zcutil/make-release.py: Fix to run with Python 3 + zcutil/make-release.py: Check for release dependencies + Update release notes for v2.1.2 + zcutil/release-notes.py: Add Python 3 execution header + Set hashFinalSaplingRoot and hashChainHistoryRoot in AddToBlockIndex + +James O'Beirne (1): + Add basic coverage reporting for RPC tests + +Jeremy Rubin (3): + Add Basic CheckQueue Benchmark + Address ryanofsky feedback on CCheckQueue benchmarks. Eliminated magic numbers, fixed scoping of vectors (and memory movement component of benchmark). + Add prevector destructor benchmark + +Karl-Johan Alm (1): + Refactoring: Removed using namespace from bench/ and test/ source files. + +Larry Ruane (2): + zcutil/fetch-params.sh unneeded --testnet arg should warn user + util: CBufferedFile fixes + +LitecoinZ (1): + Fix issue #3772 + +Marshall Gaucher (1): + Update qa/rpc-tests/addressindex.py + +Matt Corallo (2): + Remove countMaskInv caching in bench framework + Require a steady clock for bench with at least micro precision + +MeshCollider (3): + Fix race for mapBlockIndex in AppInitMain + Make fReindex atomic to avoid race + Consistent parameter names in txdb.h + +NicolasDorier (1): + [qa] assert_start_raises_init_error + +NikVolf (3): + push/pop history with tests + update chain history in ConnectBlock and DisconnectBlock + use iterative platform-independent log2i + +Patrick Strateman (1): + Acquire lock to check for genesis block. + +Pavel Janík (3): + Rewrite help texts for features enabled by default. + Ignore bench_bitcoin binary. + Prevent warning: variable 'x' is uninitialized + +Philip Kaufmann (1): + [Trivial] ensure minimal header conventions + +Pieter Wuille (3): + Benchmark rolling bloom filter + Introduce FastRandomContext::randbool() + FastRandom benchmark + +Sean Bowe (15): + Initialize ThreadNotifyWallets before additional blocks are imported. + Handle case of fresh wallets in ThreadNotifyWallets. + Clarify comment + Add librustzcash tests to the full test suite. + Add release profile optimizations and turn off panic unwinding in librustzcash. + Minor typo fixes. + Simplification for MacOS in rust-test. + make-release.py: Versioning changes for 2.1.2-rc1. + make-release.py: Updated manpages for 2.1.2-rc1. + make-release.py: Updated release notes and changelog for 2.1.2-rc1. + Add Rust resources to distribution tarball. + Add test_random.h to distribution tarball. + Set Heartwood activation height for testnet to 903800. + make-release.py: Versioning changes for 2.1.2. + make-release.py: Updated manpages for 2.1.2. + +Taylor Hornby (15): + Make the equihash validator macro set its output to false when throwing an exception. + Add test for unused bits in the Equihash solution encoding. + Add Python script for checking if dependencies have updates. + Add GitHub API credential + Update list of dependencies to check + Wrap long lines + Cache releases to reduce network usage and improve performance + Make updatecheck.py compatible with python2 + Have make clean delete temporary AFL build directory + Add AFL build directory to .gitignore + Have make clean delete AFL output directories. + Fix bug in updatecheck.py and add utfcpp to its dependency list + Fix typo in updatecheck.py + Update updatecheck.py with the new Rust dependencies and improve the error message in case the untracked dependency list becomes out of date. + Fix undefined behavior in CScriptNum + +Wladimir J. van der Laan (7): + bench: Add crypto hash benchmarks + Kill insecure_random and associated global state + bench: Fix subtle counting issue when rescaling iteration count + bench: Add support for measuring CPU cycles + bench: Fix initialization order in registration + util: Don't set strMiscWarning on every exception + test_framework: detect failure of bitcoind startup + +Yuri Zhykin (1): + bench: Added base58 encoding/decoding benchmarks + +avnish (14): + changed block_test to BlockTests + changed test names from _ to CamelCase + changed header_size_is_expected to HeaderSizeIsExpected + changed "equihash_tests" to EquihashTests + changed founders_reward_test to FoundersRewardTest + changes tests to camelcase + chnged keystore_tests to KeystoreTests + changed libzcash_utils to LibzcashUtils + changed test to CamelCase + changed test to CamelCase + changed test to CamelCase + changed seven_eq_seven to SevenEqSeven + changed txid_tests to TxidTests + changed wallet_zkeys_test to WalletZkeysTest + +avnish98 (1): + requested changes are rectified + +ca333 (2): + update libsodium to v1.0.18 + fix dead openssl download path + +gladcow (4): + Show reindex state in metrics + Use processed file size as progress in metrics during reindex + Byte sizes format + Move reindex progress globals to metrics.h/cpp + +Marshall Gaucher (74): + update /usr/bin/env; fix print conventions + update test_framework modules + Update rpc-test/test_framework to Py3 convention,modules,encoding + Update ignored testScriptsExt to Python3 + Update python3 env path, remove python 2.7 assert + Update hexlify for encoding, update to py3 io module + Update py3 env path, remove py2 assert + Update py2 conventions to py3, remove py2 env and assert + Update py2 conventions to py3, update Decimal calls + Update py2 env path, remove py2 assert + Update py2 env path, remove py2 assert + Update py2 env path, remove py2 assert, update filter to return list for py3 + Update py2 env path, remove py2 assert, update http module and assert encoding + Update cmp to py3 functions, update map return to list for py3 + Standard py2 to py3 updates + Update py2 modules to py3, update encoding to be py3 compatible + Update to py3 conventions, update decimal calls to be consistent + Update to py3 conventions, update filter to return list + update to py3 conventions, update range to return list for py3 + update to py3 convention, update execfile to py3 call + update to py3 conventions, update cmp to be py3 compatible, update map to return list for py3 + update to py3 conventions, preserve ipv6 patch + update str cast to prevent address assert issues + clean up binascii call + Add keyerror execption + update to py3 env path + update to py3 conventions, update functions to be upstream consistent + update to py3 conventions, clean up code to be upstream consistent + update to py3 encodings + update encoding, decoding, serialize funcs for py3 + Update type to be decimal + update to py3 conventions, BUG with last assert_equal + Update io modules for py3, ISSUE with create_transaction function + Update to py3, ISSUE with encoding + Update to py3, ISSUE with encoding + Update to py3, ISSUE with encoding in create_block + Update to py3, ISSUE with encoding in create_block + Clean up code not needed from upstream + update io module, fix py3 division, and string encoding + update remaining encoding issues, add pyblake2 + Use more meaningful assert_equal from our original codebase + Clean up code from upstream we dont use + fix except bug for undefined url + Remove semi colons + make import urlparse module consistent,httplib update to py3 + correct update to python3 + clean-up imports, keep string notation consistent, remove spacing + clean up + Use upstream encoding for encodeDecimal + fix type issue + fix initialize statements for imports + clean up initiliaze statements from imports + update type for decimal 0 + remove debug lines from prior commits + clean up to minimize diff + remove u encoding + Fix decimal 0 issues + Clean up import calls + clean up + clean up + clean up + fix url and port issue + cleanups and fixing odd casting + Update json to simplejson to remove unicode and str issue from py2 to py3 + Update py3 division + fix pyflakes errors + clean up conventions and whitespace + fix string pattern issue on byte object + update comment regarding prior py2 exception + Fix remaining python3 conventions + Update remaining Python3 conventions + Updating remaining python3 conventions + Update #! env for python3 + Update RPCs to support cross platform paths and libs + +murrayn (1): + Add build support for 'gprof' profiling. + +practicalswift (8): + build: Show enabled sanitizers in configure output + Add -ftrapv to DEBUG_CXXFLAGS when --enable-debug is used + Assert that what might look like a possible division by zero is actually unreachable + Replace boost::function with std::function (C++11) + Avoid static analyzer warnings regarding uninitialized arguments + Restore default format state of cout after printing with std::fixed/setprecision + Initialize recently introduced non-static class member lastCycles to zero in constructor + Replace boost::function with std::function (C++11) + +ptschip (1): + Enable python tests for Native Windows + +zancas (3): + update comment, to correctly specify number of methods injected + replace "virtual" with "override" in subclasses + Remove remaining instances of boost::function + diff --git a/doc/release-notes/release-notes-3.0.0-rc1.md b/doc/release-notes/release-notes-3.0.0-rc1.md new file mode 100644 index 000000000..3a8acb93b --- /dev/null +++ b/doc/release-notes/release-notes-3.0.0-rc1.md @@ -0,0 +1,120 @@ +Notable changes +=============== + +The mainnet activation of the Heartwood network upgrade is supported by this +release, with an activation height of 903000, which should occur in the middle +of July — following the targeted EOS halt of our 2.1.2-3 release. Please upgrade +to this release, or any subsequent release, in order to follow the Heartwood +network upgrade. + +The following two ZIPs are being deployed as part of this upgrade: + +- [ZIP 213: Shielded Coinbase](https://zips.z.cash/zip-0213) +- [ZIP 221: FlyClient - Consensus-Layer Changes](https://zips.z.cash/zip-0221) + +In order to help the ecosystem prepare for the mainnet activiation, Heartwood +has already been activated on the Zcash testnet. Any node version 2.1.2 or +higher, including this release, supports the Heartwood activation on testnet. + +## Mining to Sapling addresses + +After the mainnet activation of Heartwood, miners can mine directly into a +Sapling shielded address. Miners should wait until after Heartwood activation +before they make changes to their configuration to leverage this new feature. +After activation of Heartwood, miners can add `mineraddress=SAPLING_ADDRESS` to +their `zcash.conf` file, where `SAPLING_ADDRESS` represents a Sapling address +that can be generated locally with the `z_getnewaddress` RPC command. Restart +your node, and block templates produced by the `getblocktemplate` RPC command +will now have coinbase transactions that mine directly into this shielded +address. +Changelog +========= + +Aaron Clauson (1): + Minimal code changes to allow msvc compilation. + +Adam Langley (1): + Switch memory_cleanse implementation to BoringSSL's to ensure memory clearing even with link-time optimization. + +Alfredo Garcia (12): + fix rpc testcase + add blockheight, blockindex and blocktime to z_listreceivedbyaddress + change time to blocktime in help + add status to transactions + minor fix + minor cleanup style, var names + Add a new safe chars rule for node version string + fix wallet nullifiers test + Fix typo + add a test case + implement z_getnotescount api call + remove not needed help parameters to dump and import impl + +Ben Wilson (4): + Added Dockerfile to contrib with README + Fixed README grammar, reuse Dockerfile vars + Fixed Docker README grammar + Dockerfiles for zcashd CI builds + +Daira Hopwood (2): + Fix a null pointer dereference that occurs when formatting an error message, if we haven't activated an upgrade as expected. + Explicitly assert that chainActive[upgrade.nActivationHeight] is non-null at this point. + +Dimitris Apostolou (1): + Fix typos + +Jack Grigg (5): + Use BOOST_SCOPE_EXIT_TPL to clean and free datValue in CDB::Read + Improve memory_cleanse documentation + Add NU4 to upgrade list + Add NU4 test helpers + Update URLs for prior network upgrades + +Jonathan "Duke" Leto (1): + Add confirmations to z_listreceivedbyaddress + +Kris Nuttycombe (21): + Add a test reproducing the off-by-one error. + Check network reunification. + Narrow down the test case. + Make the test reproduce the actual off-by-one error in rewind length. + Fix #4119. + The last valid height condition reads better flipped. + Restart node in a chain split state to allow the test to complete. + Trivial comment. + Remove option to load new blocks from ConnectTip + Make condition closer to original, Fix incorrect comment. + Ensure that we don't pass a null block pointer to ConnectTip. + Update all crates. + Update to the Cargo V2 lockfile format. + Clean up imports in sapling_rewind_check.py + Use `%x` formatter for branch id hex string in test_framework/util.py + Update qa/rpc-tests/test_framework/mininode.py + Update qa/rpc-tests/sapling_rewind_check.py + Add Zcash copyright to sapling_rewind_check.py + Update test description and clarify internal comments. + Revert "Update qa/rpc-tests/sapling_rewind_check.py" + Remove unused imports. + +Sean Bowe (6): + Update minimum chain work on testnet to reflect Heartwood activation. + Pass DO_NOT_UPDATE_CONFIG_SCRIPTS=1 to autogen.sh in libsodium dependency, to avoid updating config scripts over the network. + Set the Heartwood activation height to 903000. + Bump the protocol version, as this node supports Heartwood on mainnet. + make-release.py: Versioning changes for 3.0.0-rc1. + make-release.py: Updated manpages for 3.0.0-rc1. + +Taylor Hornby (2): + Add univalue to updatecheck.py and update univalue, removing calls to deprecated methods + Avoid names starting with __. + +Thomas Snider (1): + [wallet] Securely erase potentially sensitive keys/values + +Tim Ruffing (2): + Clean up logic in memory_cleanse() for MSVC + Improve documentation of memory_cleanse() + +therealyingtong (1): + Fix off-by-one error in CreateNewBlock() + diff --git a/doc/release-notes/release-notes-3.0.0.md b/doc/release-notes/release-notes-3.0.0.md new file mode 100644 index 000000000..479636a56 --- /dev/null +++ b/doc/release-notes/release-notes-3.0.0.md @@ -0,0 +1,130 @@ +Notable changes +=============== + +The mainnet activation of the Heartwood network upgrade is supported by this +release, with an activation height of 903000, which should occur in the middle +of July — following the targeted EOS halt of our 2.1.2-3 release. Please upgrade +to this release, or any subsequent release, in order to follow the Heartwood +network upgrade. + +The following two ZIPs are being deployed as part of this upgrade: + +- [ZIP 213: Shielded Coinbase](https://zips.z.cash/zip-0213) +- [ZIP 221: FlyClient - Consensus-Layer Changes](https://zips.z.cash/zip-0221) + +In order to help the ecosystem prepare for the mainnet activiation, Heartwood +has already been activated on the Zcash testnet. Any node version 2.1.2 or +higher, including this release, supports the Heartwood activation on testnet. + +## Mining to Sapling addresses + +After the mainnet activation of Heartwood, miners can mine directly into a +Sapling shielded address. Miners should wait until after Heartwood activation +before they make changes to their configuration to leverage this new feature. +After activation of Heartwood, miners can add `mineraddress=SAPLING_ADDRESS` to +their `zcash.conf` file, where `SAPLING_ADDRESS` represents a Sapling address +that can be generated locally with the `z_getnewaddress` RPC command. Restart +your node, and block templates produced by the `getblocktemplate` RPC command +will now have coinbase transactions that mine directly into this shielded +address. + +Changelog +========= + +Aaron Clauson (1): + Minimal code changes to allow msvc compilation. + +Adam Langley (1): + Switch memory_cleanse implementation to BoringSSL's to ensure memory clearing even with link-time optimization. + +Alfredo Garcia (12): + fix rpc testcase + add blockheight, blockindex and blocktime to z_listreceivedbyaddress + change time to blocktime in help + add status to transactions + minor fix + minor cleanup style, var names + Add a new safe chars rule for node version string + fix wallet nullifiers test + Fix typo + add a test case + implement z_getnotescount api call + remove not needed help parameters to dump and import impl + +Ben Wilson (4): + Added Dockerfile to contrib with README + Fixed README grammar, reuse Dockerfile vars + Fixed Docker README grammar + Dockerfiles for zcashd CI builds + +Daira Hopwood (2): + Fix a null pointer dereference that occurs when formatting an error message, if we haven't activated an upgrade as expected. + Explicitly assert that chainActive[upgrade.nActivationHeight] is non-null at this point. + +Dimitris Apostolou (1): + Fix typos + +Jack Grigg (5): + Use BOOST_SCOPE_EXIT_TPL to clean and free datValue in CDB::Read + Improve memory_cleanse documentation + Add NU4 to upgrade list + Add NU4 test helpers + Update URLs for prior network upgrades + +Jonathan "Duke" Leto (1): + Add confirmations to z_listreceivedbyaddress + +Kris Nuttycombe (25): + Add a test reproducing the off-by-one error. + Check network reunification. + Narrow down the test case. + Make the test reproduce the actual off-by-one error in rewind length. + Fix #4119. + The last valid height condition reads better flipped. + Restart node in a chain split state to allow the test to complete. + Trivial comment. + Remove option to load new blocks from ConnectTip + Make condition closer to original, Fix incorrect comment. + Ensure that we don't pass a null block pointer to ConnectTip. + Update all crates. + Update to the Cargo V2 lockfile format. + Clean up imports in sapling_rewind_check.py + Use `%x` formatter for branch id hex string in test_framework/util.py + Update qa/rpc-tests/test_framework/mininode.py + Update qa/rpc-tests/sapling_rewind_check.py + Add Zcash copyright to sapling_rewind_check.py + Update test description and clarify internal comments. + Revert "Update qa/rpc-tests/sapling_rewind_check.py" + Remove unused imports. + Add baseline for golden testing across network upgrade boundaries. + Update golden test for heartwood network upgrade. + Fully remove the regtest tree from restored nodes. + Remove unused imports. + +Sean Bowe (11): + Add NU4 activation to golden test. + Update minimum chain work on testnet to reflect Heartwood activation. + Pass DO_NOT_UPDATE_CONFIG_SCRIPTS=1 to autogen.sh in libsodium dependency, to avoid updating config scripts over the network. + Set the Heartwood activation height to 903000. + Bump the protocol version, as this node supports Heartwood on mainnet. + make-release.py: Versioning changes for 3.0.0-rc1. + make-release.py: Updated manpages for 3.0.0-rc1. + make-release.py: Updated release notes and changelog for 3.0.0-rc1. + Set deprecation of 3.0.0 to target EOS halt mid-September. + make-release.py: Versioning changes for 3.0.0. + make-release.py: Updated manpages for 3.0.0. + +Taylor Hornby (2): + Add univalue to updatecheck.py and update univalue, removing calls to deprecated methods + Avoid names starting with __. + +Thomas Snider (1): + [wallet] Securely erase potentially sensitive keys/values + +Tim Ruffing (2): + Clean up logic in memory_cleanse() for MSVC + Improve documentation of memory_cleanse() + +therealyingtong (1): + Fix off-by-one error in CreateNewBlock() + diff --git a/doc/release-notes/release-notes-3.1.0-rc1.md b/doc/release-notes/release-notes-3.1.0-rc1.md new file mode 100644 index 000000000..c994b5971 --- /dev/null +++ b/doc/release-notes/release-notes-3.1.0-rc1.md @@ -0,0 +1,243 @@ +Notable changes +=============== + +Network Upgrade 4: Canopy +-------------------------- + +The code preparations for the Canopy network upgrade are finished and included in this release. The following ZIPs are being deployed: + +- [ZIP 207: Funding Streams](https://zips.z.cash/zip-0207) +- [ZIP 211: Disabling Addition of New Value to the Sprout Value Pool](https://zips.z.cash/zip-0211) +- [ZIP 212: Allow Recipient to Derive Sapling Ephemeral Secret from Note Plaintext](https://zips.z.cash/zip-0212) +- [ZIP 214: Consensus rules for a Zcash Development Fund](https://zips.z.cash/zip-0214) +- [ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules](https://zips.z.cash/zip-0215) + +Canopy will activate on testnet at height TODO, and can also be activated at a specific height in regtest mode by setting the config option `-nuparams=0xe9ff75a6:HEIGHT`. + +Canopy will activate on mainnet at height 1046400. + +See [ZIP 251](https://zips.z.cash/zip-0251) for additional information about the deployment process for Canopy. + +Flush witness data to disk only when it's consistent +----------------------------------------------------- +This fix prevents the wallet database from getting into an inconsistent state. By flushing witness data to disk from the wallet thread instead of the main thread, we ensure that the on-disk block height is always the same as the witness data height. Previously, the database occasionally got into a state where the latest block height was one ahead of the witness data. This then triggered an assertion failure in `CWallet::IncrementNoteWitnesses()` upon restarting after a zcashd shutdown. + +Note that this code change will not automatically repair a data directory that has been affected by this problem; that requires starting zcashd with the `-rescan` or `-reindex` options. + +New DNS seeders +---------------- +DNS seeders hosted at "zfnd.org" and "yolo.money" have been added to the list in `chainparams.cpp`. They're running [CoreDNS](https://coredns.io) with a [Zcash crawler plugin](https://github.com/ZcashFoundation/dnsseeder), the result of a Zcash Foundation in-house development effort to replace `zcash-seeder` with something memory-safe and easier to maintain. + +These are validly operated seeders per the [existing policy](https://zcash.readthedocs.io/en/latest/rtd_pages/dnsseed_policy.html). For general questions related to either seeder, contact george@zfnd.org or mention @gtank in the Zcash Foundation's Discord. For bug reports, open an issue on the [dnsseeder](https://github.com/ZcashFoundation/dnsseeder) repo. + +Changed command-line options +----------------------------- +- `-debuglogfile=` can be used to specify an alternative debug logging file. + +RPC methods +------------ +- `joinSplitPubKey` and `joinSplitSig` have been added to verbose transaction outputs. This enables the transaction's binary form to be fully reconstructed from the RPC output. +- The output of `getblockchaininfo` now includes an `estimatedheight` parameter. This can be shown in UIs as an indication of the current chain height while `zcashd` is syncing, but should not be relied upon when creating transactions. + +Metrics screen +----------------------- +- A progress bar is now visible when in Initial Block Download mode, showing both the prefetched headers and validated blocks. It is only printed for TTY output. Additionally, the "not mining" message is no longer shown on mainnet, as the built-in CPU miner is not effective at the current network difficulty. +- The number of block headers prefetched during Initial Block Download is now displayed alongside the number of validated blocks. With current compile-time defaults, a Zcash node prefetches up to 160 block headers per request without a limit on how far it can prefetch, but only up to 16 full blocks at a time. + +Changelog +========= + +Alfredo Garcia (28): + add estimatedheight to getblockchaininfo + add documentation and command line parsing to afl scripts + get fuzzing options from directory + add bool argument to get balance in satoshis to rpc getreceivedbyaddress + add documentation to flag + change argument name + add boolean inZat to getreceivedbyaccount + add boolean inZat to getbalance + add boolean inZat to z_getbalance + add amountZat field to listreceivedbyaddress and listreceivedbyaccount + add amountZat field to listtransactions, gettransaction and listsinceblock + add amountZat field to listunspent + add amountZat field to z_listreceivedbyaddress + replace with AssertionError assert_equal in receivedby.py + Fix casting in wallet.py + simplify inzat balances logic + Fix casting in listtransactions.py + add MINOR_CURRENCY_UNIT + remove additional not needed casts from py tests + change name of harden option + fix test cases + fix sort of options + remove not needed comments from wallet.py + update docs + add new parameters to rpc client and fix some bugs + initialize size_t + fix/improve docs + add log aporximation to metrics solution rates + +Anthony Towns (1): + test: Add tests for `-debuglogfile` with subdirs + +Daira Hopwood (15): + Rename NU4 to Canopy in constant and function names. + Rename golden/nu4.tar.gz to canopy.tar.gz. + Missing NU4->Canopy renames. + Remove unused import in qa/rpc-tests/listtransactions.py + Remove an unused CCriticalSection. + Add GetActiveFundingStreams function. + Tests for changes to getblocksubsidy. + Change getblocksubsidy RPC to take into account funding streams. + Use ValueFromAmount instead of double arithmetic, and improve variable names. + Cosmetic spacing changes. + Apply suggestions from code review + Change the format of `getblocksubsidy` output to use an array of funding stream objects. + Clean up some iterator usage. + Remove an unnecessary iterator increment. + Another cleanup. + +Danny Willems (3): + librustzcash: make the header C compatible + Use assert.h instead of define manually static_assert + Use preprocessor for ENTRY_SERIALIZED_LENGTH + +Eirik Ogilvie-Wigley (2): + Resolve decimal vs float issues + Various improvements + +George Tankersley (1): + Add ZF and gtank's DNS seeders + +Jack Grigg (18): + Use the cached consensusBranchId in DisconnectBlock + qa: Smoke test driver + qa: Run Zcash node for smoke tests + qa: Simple smoke tests + qa: Transaction chain smoke test + qa: Use slick-bitcoinrpc for smoke tests + qa: Don't allow smoke tests with mainnet wallet.dat + qa: Improve reliability of smoke tests + qa: Improve reliability of smoke test cleanup + metrics: Fix indents + metrics: Draw IBD progress bar showing headers and blocks + metrics: Don't show "not mining" text for mainnet + qa: Add --use-faucet flag to smoke tests + qa: Remove unused timeout configuration from wait_for_balance + qa: Add --automate flag to smoke tests + metrics: Switch to ANSI colour codes for progress bar + metrics: Only print IBD progress bar on TTY + Implement zip-207 and zip-214. + +Kris Nuttycombe (29): + Identify `-fundingstream` parameter as being regtest-only + Use for..: rather than BOOST_FOREACH + Trivial error message fix. + Minor fixes for ZIP-207 review comments. + Trivial copyright fix. + Replace BOOST_FOREACH with for..: + Qualified imports of std:: types + Capitalization fixes from code review + Minor naming change FundingStreamShare -> FundingStreamElement + Record-constructor syntax for funding stream initialization. + Update HalvingHeight documentation. + Fix pyflakes. + Fix funding stream end-height-exclusion bugs + Add `RegtestDeactivateCanopy` calls to restore shared regtest params. + Move test-only code into test sources. + Trivial comment correction. + Minor help message correction. + Pass by const reference where possible. + Use uint32_t for vFundingStreams indexing. + Fix incorrect subtraction of Halving(blossomActivationHeight) from halvingIndex + Fix ordering of transparent outputs such that miner reward is vout[0] + Remove assertion that was breaking regtest in the case that blossom activates after the halving. + Use for..in rather than an indexed loop. + Make evident the relationship between chainparams and key IO. + Rename KeyInfo -> KeyConstants and move out of Consensus namespace. + Fix typo in constant. + Fix assertion check in GetBlockSubsidy + Apply suggestions from code review + Trivial whitespace fix. + +Larry Ruane (7): + add python test to reproduce bug 4301 + flush witness cache correctly + review, cleanup: eliminate uninitialized variable + self.sync_all(), not time.sleep(4) + fix pyflakes CI errors + undo flushing witness data on shutdown + sync before stopping nodes + +Rod Vagg (1): + Add joinSplitPubKey and joinSplitSig to RPC + +Sean Bowe (23): + Add implementations of PRF_expand calls that obtain esk and rcm. + Remove bare SaplingNote constructor. + Add a getter method to obtain rcm from a Sapling note plaintext. + Add support for receiving v2 Sapling note plaintexts. + Change transaction builder and miner to use v2 Sapling note plaintexts after Canopy activates. + Make ed25519-zebra available via librustzcash. + Change to version of ed25519-zebra crate which is compliant with ZIP 215. + Enforce ZIP 215 rules upon activation of Canopy. + Add test that a weird signature successfully validates. + Remove bincode crate. + Remove unused curve25519-dalek dev-dependency. + Minor adjustments to librustzcash and tests. + Redirect git checkouts of ebfull/ed25519-zebra through our vendored sources in offline mode. + Require that shielded coinbase output note plaintexts are version 2 if Canopy is active. + Make transaction builder take the next block height into account for use of v2 note plaintexts. + Turn return values for libsodium-like API into constants for clarity. + Add more exhaustive tests for ZIP 215 compatibility. + Cargo fmt + Remove unused imports from remove_sprout_shielding RPC test. + Migrate ZIP 215 test vectors to gtest suite. + Change LIBSODIUM_ERROR to -1. + Hash "Zcash" to align tests with ZIP 215 test vectors. + Remove outdated comment. + +Solar Designer (2): + Fix typos in ProcessMessage() "headers" + During initial blocks download, also report the number of headers + +Taylor Hornby (3): + Fix undefined behavior in gtest tests + Add missing header for std::invalid_argument + Fix bug in CScheduler + +Wladimir J. van der Laan (3): + Add `-debuglogfile` option + test: Add test for `-debuglogfile` + doc: Update release notes for `-debuglogfile` + +Marshall Gaucher (1): + Add helpers for tapping and donating to the testnet faucet + +therealyingtong (22): + Add RPC tests for post-Heartwood rollback + Reject v1 plaintexts after grace period + Check epk vs esk whenever caller has esk + Refactor SaplingNotePlaintext::decrypt + Add gtests for v2 plaintexts + Add contextual check to main.cpp + Add gtests + Add checks to z_ methods in rpcwallet + Add RPC tests + Replace leadByte in SaplingNote with is_zip_212 + Throw error in plaintext deserialization + Pass pindex to AddToWalletIfInvolvingMe() + Remove plaintext check from AddSaplingSpend + Remove plaintext check from GetFilteredNotes + Refactor bool is_zip_212 to enum Zip212Enabled + Minor changes + Remove old SaplingNote() constructor + Pass nHeight instead of pindex to AddToWalletIfInvolvingMe() + Directly call RegtestActivate* in gtests + Update release notes for v3.1.0 + make-release.py: Versioning changes for 3.1.0-rc1. + make-release.py: Updated manpages for 3.1.0-rc1. + +ying tong (1): + Apply suggestions from code review + diff --git a/doc/release-notes/release-notes-3.1.0-rc2.md b/doc/release-notes/release-notes-3.1.0-rc2.md new file mode 100644 index 000000000..e3ec7680a --- /dev/null +++ b/doc/release-notes/release-notes-3.1.0-rc2.md @@ -0,0 +1,250 @@ +Notable changes +=============== + +Network Upgrade 4: Canopy +-------------------------- + +The code preparations for the Canopy network upgrade are finished and included in this release. The following ZIPs are being deployed: + +- [ZIP 207: Funding Streams](https://zips.z.cash/zip-0207) +- [ZIP 211: Disabling Addition of New Value to the Sprout Value Pool](https://zips.z.cash/zip-0211) +- [ZIP 212: Allow Recipient to Derive Sapling Ephemeral Secret from Note Plaintext](https://zips.z.cash/zip-0212) +- [ZIP 214: Consensus rules for a Zcash Development Fund](https://zips.z.cash/zip-0214) +- [ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules](https://zips.z.cash/zip-0215) + +Canopy will activate on testnet at height TODO, and can also be activated at a specific height in regtest mode by setting the config option `-nuparams=0xe9ff75a6:HEIGHT`. Note that v3.1.0-rc2 does not enable Canopy support on the testnet. + +Canopy will activate on mainnet at height 1046400. + +See [ZIP 251](https://zips.z.cash/zip-0251) for additional information about the deployment process for Canopy. + +Flush witness data to disk only when it's consistent +----------------------------------------------------- +This fix prevents the wallet database from getting into an inconsistent state. By flushing witness data to disk from the wallet thread instead of the main thread, we ensure that the on-disk block height is always the same as the witness data height. Previously, the database occasionally got into a state where the latest block height was one ahead of the witness data. This then triggered an assertion failure in `CWallet::IncrementNoteWitnesses()` upon restarting after a zcashd shutdown. + +Note that this code change will not automatically repair a data directory that has been affected by this problem; that requires starting zcashd with the `-rescan` or `-reindex` options. + +New DNS seeders +---------------- +DNS seeders hosted at "zfnd.org" and "yolo.money" have been added to the list in `chainparams.cpp`. They're running [CoreDNS](https://coredns.io) with a [Zcash crawler plugin](https://github.com/ZcashFoundation/dnsseeder), the result of a Zcash Foundation in-house development effort to replace `zcash-seeder` with something memory-safe and easier to maintain. + +These are validly operated seeders per the [existing policy](https://zcash.readthedocs.io/en/latest/rtd_pages/dnsseed_policy.html). For general questions related to either seeder, contact george@zfnd.org or mention @gtank in the Zcash Foundation's Discord. For bug reports, open an issue on the [dnsseeder](https://github.com/ZcashFoundation/dnsseeder) repo. + +Changed command-line options +----------------------------- +- `-debuglogfile=` can be used to specify an alternative debug logging file. + +RPC methods +------------ +- `joinSplitPubKey` and `joinSplitSig` have been added to verbose transaction outputs. This enables the transaction's binary form to be fully reconstructed from the RPC output. +- The output of `getblockchaininfo` now includes an `estimatedheight` parameter. This can be shown in UIs as an indication of the current chain height while `zcashd` is syncing, but should not be relied upon when creating transactions. + +Metrics screen +----------------------- +- A progress bar is now visible when in Initial Block Download mode, showing both the prefetched headers and validated blocks. It is only printed for TTY output. Additionally, the "not mining" message is no longer shown on mainnet, as the built-in CPU miner is not effective at the current network difficulty. +- The number of block headers prefetched during Initial Block Download is now displayed alongside the number of validated blocks. With current compile-time defaults, a Zcash node prefetches up to 160 block headers per request without a limit on how far it can prefetch, but only up to 16 full blocks at a time. + +Changelog +========= + +Alfredo Garcia (28): + add estimatedheight to getblockchaininfo + add documentation and command line parsing to afl scripts + get fuzzing options from directory + add bool argument to get balance in satoshis to rpc getreceivedbyaddress + add documentation to flag + change argument name + add boolean inZat to getreceivedbyaccount + add boolean inZat to getbalance + add boolean inZat to z_getbalance + add amountZat field to listreceivedbyaddress and listreceivedbyaccount + add amountZat field to listtransactions, gettransaction and listsinceblock + add amountZat field to listunspent + add amountZat field to z_listreceivedbyaddress + replace with AssertionError assert_equal in receivedby.py + Fix casting in wallet.py + simplify inzat balances logic + Fix casting in listtransactions.py + add MINOR_CURRENCY_UNIT + remove additional not needed casts from py tests + change name of harden option + fix test cases + fix sort of options + remove not needed comments from wallet.py + update docs + add new parameters to rpc client and fix some bugs + initialize size_t + fix/improve docs + add log aporximation to metrics solution rates + +Anthony Towns (1): + test: Add tests for `-debuglogfile` with subdirs + +Daira Hopwood (17): + Rename NU4 to Canopy in constant and function names. + Rename golden/nu4.tar.gz to canopy.tar.gz. + Missing NU4->Canopy renames. + Remove unused import in qa/rpc-tests/listtransactions.py + Remove an unused CCriticalSection. + Add GetActiveFundingStreams function. + Tests for changes to getblocksubsidy. + Change getblocksubsidy RPC to take into account funding streams. + Use ValueFromAmount instead of double arithmetic, and improve variable names. + Cosmetic spacing changes. + Apply suggestions from code review + Change the format of `getblocksubsidy` output to use an array of funding stream objects. + Clean up some iterator usage. + Remove an unnecessary iterator increment. + Another cleanup. + Add key_constants.h to src/Makefile.am. + Fix an unintended consensus change in decryption of coinbase outputs. + +Danny Willems (3): + librustzcash: make the header C compatible + Use assert.h instead of define manually static_assert + Use preprocessor for ENTRY_SERIALIZED_LENGTH + +Eirik Ogilvie-Wigley (2): + Resolve decimal vs float issues + Various improvements + +George Tankersley (1): + Add ZF and gtank's DNS seeders + +Jack Grigg (18): + Use the cached consensusBranchId in DisconnectBlock + qa: Smoke test driver + qa: Run Zcash node for smoke tests + qa: Simple smoke tests + qa: Transaction chain smoke test + qa: Use slick-bitcoinrpc for smoke tests + qa: Don't allow smoke tests with mainnet wallet.dat + qa: Improve reliability of smoke tests + qa: Improve reliability of smoke test cleanup + metrics: Fix indents + metrics: Draw IBD progress bar showing headers and blocks + metrics: Don't show "not mining" text for mainnet + qa: Add --use-faucet flag to smoke tests + qa: Remove unused timeout configuration from wait_for_balance + qa: Add --automate flag to smoke tests + metrics: Switch to ANSI colour codes for progress bar + metrics: Only print IBD progress bar on TTY + Implement zip-207 and zip-214. + +Kris Nuttycombe (30): + Identify `-fundingstream` parameter as being regtest-only + Use for..: rather than BOOST_FOREACH + Trivial error message fix. + Minor fixes for ZIP-207 review comments. + Trivial copyright fix. + Replace BOOST_FOREACH with for..: + Qualified imports of std:: types + Capitalization fixes from code review + Minor naming change FundingStreamShare -> FundingStreamElement + Record-constructor syntax for funding stream initialization. + Update HalvingHeight documentation. + Fix pyflakes. + Fix funding stream end-height-exclusion bugs + Add `RegtestDeactivateCanopy` calls to restore shared regtest params. + Move test-only code into test sources. + Trivial comment correction. + Minor help message correction. + Pass by const reference where possible. + Use uint32_t for vFundingStreams indexing. + Fix incorrect subtraction of Halving(blossomActivationHeight) from halvingIndex + Fix ordering of transparent outputs such that miner reward is vout[0] + Use ed25519-zebra from crates.io. + Remove assertion that was breaking regtest in the case that blossom activates after the halving. + Use for..in rather than an indexed loop. + Make evident the relationship between chainparams and key IO. + Rename KeyInfo -> KeyConstants and move out of Consensus namespace. + Fix typo in constant. + Fix assertion check in GetBlockSubsidy + Apply suggestions from code review + Trivial whitespace fix. + +Larry Ruane (7): + add python test to reproduce bug 4301 + flush witness cache correctly + review, cleanup: eliminate uninitialized variable + self.sync_all(), not time.sleep(4) + fix pyflakes CI errors + undo flushing witness data on shutdown + sync before stopping nodes + +Rod Vagg (1): + Add joinSplitPubKey and joinSplitSig to RPC + +Sean Bowe (23): + Add implementations of PRF_expand calls that obtain esk and rcm. + Remove bare SaplingNote constructor. + Add a getter method to obtain rcm from a Sapling note plaintext. + Add support for receiving v2 Sapling note plaintexts. + Change transaction builder and miner to use v2 Sapling note plaintexts after Canopy activates. + Make ed25519-zebra available via librustzcash. + Change to version of ed25519-zebra crate which is compliant with ZIP 215. + Enforce ZIP 215 rules upon activation of Canopy. + Add test that a weird signature successfully validates. + Remove bincode crate. + Remove unused curve25519-dalek dev-dependency. + Minor adjustments to librustzcash and tests. + Redirect git checkouts of ebfull/ed25519-zebra through our vendored sources in offline mode. + Require that shielded coinbase output note plaintexts are version 2 if Canopy is active. + Make transaction builder take the next block height into account for use of v2 note plaintexts. + Turn return values for libsodium-like API into constants for clarity. + Add more exhaustive tests for ZIP 215 compatibility. + Cargo fmt + Remove unused imports from remove_sprout_shielding RPC test. + Migrate ZIP 215 test vectors to gtest suite. + Change LIBSODIUM_ERROR to -1. + Hash "Zcash" to align tests with ZIP 215 test vectors. + Remove outdated comment. + +Solar Designer (2): + Fix typos in ProcessMessage() "headers" + During initial blocks download, also report the number of headers + +Taylor Hornby (3): + Fix undefined behavior in gtest tests + Add missing header for std::invalid_argument + Fix bug in CScheduler + +Wladimir J. van der Laan (3): + Add `-debuglogfile` option + test: Add test for `-debuglogfile` + doc: Update release notes for `-debuglogfile` + +Marshall Gaucher (1): + Add helpers for tapping and donating to the testnet faucet + +therealyingtong (26): + Add RPC tests for post-Heartwood rollback + Reject v1 plaintexts after grace period + Check epk vs esk whenever caller has esk + Refactor SaplingNotePlaintext::decrypt + Add gtests for v2 plaintexts + Add contextual check to main.cpp + Add gtests + Add checks to z_ methods in rpcwallet + Add RPC tests + Replace leadByte in SaplingNote with is_zip_212 + Throw error in plaintext deserialization + Pass pindex to AddToWalletIfInvolvingMe() + Remove plaintext check from AddSaplingSpend + Remove plaintext check from GetFilteredNotes + Refactor bool is_zip_212 to enum Zip212Enabled + Minor changes + Remove old SaplingNote() constructor + Pass nHeight instead of pindex to AddToWalletIfInvolvingMe() + Directly call RegtestActivate* in gtests + Update release notes for v3.1.0 + make-release.py: Versioning changes for 3.1.0-rc1. + make-release.py: Updated manpages for 3.1.0-rc1. + make-release.py: Updated release notes and changelog for 3.1.0-rc1. + Undo manual DEPRECATION_HEIGHT + make-release.py: Versioning changes for 3.1.0-rc2. + make-release.py: Updated manpages for 3.1.0-rc2. + +ying tong (1): + Apply suggestions from code review + diff --git a/doc/release-notes/release-notes-3.1.0.md b/doc/release-notes/release-notes-3.1.0.md new file mode 100644 index 000000000..b96995c95 --- /dev/null +++ b/doc/release-notes/release-notes-3.1.0.md @@ -0,0 +1,274 @@ +Notable changes +=============== + +Network Upgrade 4: Canopy +-------------------------- + +The code preparations for the Canopy network upgrade are finished and included in this release. The following ZIPs are being deployed: + +- [ZIP 207: Funding Streams](https://zips.z.cash/zip-0207) +- [ZIP 211: Disabling Addition of New Value to the Sprout Value Pool](https://zips.z.cash/zip-0211) +- [ZIP 212: Allow Recipient to Derive Sapling Ephemeral Secret from Note Plaintext](https://zips.z.cash/zip-0212) +- [ZIP 214: Consensus rules for a Zcash Development Fund](https://zips.z.cash/zip-0214) +- [ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules](https://zips.z.cash/zip-0215) + +Canopy will activate on testnet at height 1028500, and can also be activated at a specific height in regtest mode by setting the config option `-nuparams=0xe9ff75a6:HEIGHT`. Note that v3.1.0 enables Canopy support on the testnet. + +Canopy will activate on mainnet at height 1046400. + +See [ZIP 251](https://zips.z.cash/zip-0251) for additional information about the deployment process for Canopy. + +Debian 8 "Jessie" will no longer be supported after v3.1.0, due to its [end-of-life](https://www.debian.org/News/2020/20200709#:~:text=The%20Debian%20Long%20Term%20Support,security%20updates%20for%20Debian%208) on June 30th, 2020. This will allow us to direct more resources to supporting Debian 10 Buster, other Linux distributions, and other platforms such as Windows and macOS. + +Flush witness data to disk only when it's consistent +----------------------------------------------------- +This fix prevents the wallet database from getting into an inconsistent state. By flushing witness data to disk from the wallet thread instead of the main thread, we ensure that the on-disk block height is always the same as the witness data height. Previously, the database occasionally got into a state where the latest block height was one ahead of the witness data. This then triggered an assertion failure in `CWallet::IncrementNoteWitnesses()` upon restarting after a zcashd shutdown. + +Note that this code change will not automatically repair a data directory that has been affected by this problem; that requires starting zcashd with the `-rescan` or `-reindex` options. + +New DNS seeders +---------------- +DNS seeders hosted at "zfnd.org" and "yolo.money" have been added to the list in `chainparams.cpp`. They're running [CoreDNS](https://coredns.io) with a [Zcash crawler plugin](https://github.com/ZcashFoundation/dnsseeder), the result of a Zcash Foundation in-house development effort to replace `zcash-seeder` with something memory-safe and easier to maintain. + +These are validly operated seeders per the [existing policy](https://zcash.readthedocs.io/en/latest/rtd_pages/dnsseed_policy.html). For general questions related to either seeder, contact george@zfnd.org or mention @gtank in the Zcash Foundation's Discord. For bug reports, open an issue on the [dnsseeder](https://github.com/ZcashFoundation/dnsseeder) repo. + +Changed command-line options +----------------------------- +- `-debuglogfile=` can be used to specify an alternative debug logging file. + +RPC methods +------------ +- `joinSplitPubKey` and `joinSplitSig` have been added to verbose transaction outputs. This enables the transaction's binary form to be fully reconstructed from the RPC output. +- The output of `getblockchaininfo` now includes an `estimatedheight` parameter. This can be shown in UIs as an indication of the current chain height while `zcashd` is syncing, but should not be relied upon when creating transactions. + +Metrics screen +----------------------- +- A progress bar is now visible when in Initial Block Download mode, showing both the prefetched headers and validated blocks. It is only printed for TTY output. Additionally, the "not mining" message is no longer shown on mainnet, as the built-in CPU miner is not effective at the current network difficulty. +- The number of block headers prefetched during Initial Block Download is now displayed alongside the number of validated blocks. With current compile-time defaults, a Zcash node prefetches up to 160 block headers per request without a limit on how far it can prefetch, but only up to 16 full blocks at a time. + +Changelog +========= + +Alfredo Garcia (28): + add estimatedheight to getblockchaininfo + add documentation and command line parsing to afl scripts + get fuzzing options from directory + add bool argument to get balance in satoshis to rpc getreceivedbyaddress + add documentation to flag + change argument name + add boolean inZat to getreceivedbyaccount + add boolean inZat to getbalance + add boolean inZat to z_getbalance + add amountZat field to listreceivedbyaddress and listreceivedbyaccount + add amountZat field to listtransactions, gettransaction and listsinceblock + add amountZat field to listunspent + add amountZat field to z_listreceivedbyaddress + replace with AssertionError assert_equal in receivedby.py + Fix casting in wallet.py + simplify inzat balances logic + Fix casting in listtransactions.py + add MINOR_CURRENCY_UNIT + remove additional not needed casts from py tests + change name of harden option + fix test cases + fix sort of options + remove not needed comments from wallet.py + update docs + add new parameters to rpc client and fix some bugs + initialize size_t + fix/improve docs + add log aporximation to metrics solution rates + +Anthony Towns (1): + test: Add tests for `-debuglogfile` with subdirs + +Daira Hopwood (24): + Rename NU4 to Canopy in constant and function names. + Rename golden/nu4.tar.gz to canopy.tar.gz. + Missing NU4->Canopy renames. + Remove unused import in qa/rpc-tests/listtransactions.py + Remove an unused CCriticalSection. + Add GetActiveFundingStreams function. + Tests for changes to getblocksubsidy. + Change getblocksubsidy RPC to take into account funding streams. + Use ValueFromAmount instead of double arithmetic, and improve variable names. + Cosmetic spacing changes. + Apply suggestions from code review + Change the format of `getblocksubsidy` output to use an array of funding stream objects. + Clean up some iterator usage. + Remove an unnecessary iterator increment. + Another cleanup. + Add key_constants.h to src/Makefile.am. + Fix an unintended consensus change in decryption of coinbase outputs. + More iterator cleanups. + src/metrics.cpp: cosmetic whitespace changes. + Metrics screen: display hash rates using SI prefixes rather than as powers of 2. + Add unit tests for DisplayDuration, DisplaySize, and DisplayHashRate. + Fix the formatting of the 3.0.0 release notes. + Fix --disable-mining build regression. closes #4634 + Allow Equihash validation tests to be compiled with --disable-mining. + +Danny Willems (3): + librustzcash: make the header C compatible + Use assert.h instead of define manually static_assert + Use preprocessor for ENTRY_SERIALIZED_LENGTH + +Eirik Ogilvie-Wigley (2): + Resolve decimal vs float issues + Various improvements + +George Tankersley (1): + Add ZF and gtank's DNS seeders + +Jack Grigg (21): + Use the cached consensusBranchId in DisconnectBlock + qa: Smoke test driver + qa: Run Zcash node for smoke tests + qa: Simple smoke tests + qa: Transaction chain smoke test + qa: Use slick-bitcoinrpc for smoke tests + qa: Don't allow smoke tests with mainnet wallet.dat + qa: Improve reliability of smoke tests + qa: Improve reliability of smoke test cleanup + metrics: Fix indents + metrics: Draw IBD progress bar showing headers and blocks + metrics: Don't show "not mining" text for mainnet + qa: Add --use-faucet flag to smoke tests + qa: Remove unused timeout configuration from wait_for_balance + qa: Add --automate flag to smoke tests + metrics: Switch to ANSI colour codes for progress bar + metrics: Only print IBD progress bar on TTY + Implement zip-207 and zip-214. + Use Rust Equihash validator unconditionally + Remove C++ Equihash validator + Revert "Pass the block height through to CheckEquihashSolution()" + +Kris Nuttycombe (31): + Identify `-fundingstream` parameter as being regtest-only + Use for..: rather than BOOST_FOREACH + Trivial error message fix. + Minor fixes for ZIP-207 review comments. + Trivial copyright fix. + Replace BOOST_FOREACH with for..: + Qualified imports of std:: types + Capitalization fixes from code review + Minor naming change FundingStreamShare -> FundingStreamElement + Record-constructor syntax for funding stream initialization. + Update HalvingHeight documentation. + Fix pyflakes. + Fix funding stream end-height-exclusion bugs + Add `RegtestDeactivateCanopy` calls to restore shared regtest params. + Move test-only code into test sources. + Trivial comment correction. + Minor help message correction. + Pass by const reference where possible. + Use uint32_t for vFundingStreams indexing. + Fix incorrect subtraction of Halving(blossomActivationHeight) from halvingIndex + Fix ordering of transparent outputs such that miner reward is vout[0] + Use ed25519-zebra from crates.io. + Remove assertion that was breaking regtest in the case that blossom activates after the halving. + Use for..in rather than an indexed loop. + Make evident the relationship between chainparams and key IO. + Rename KeyInfo -> KeyConstants and move out of Consensus namespace. + Fix typo in constant. + Fix assertion check in GetBlockSubsidy + Apply suggestions from code review + Trivial whitespace fix. + Zero-initialize HistoryNode values. + +Larry Ruane (7): + add python test to reproduce bug 4301 + flush witness cache correctly + review, cleanup: eliminate uninitialized variable + self.sync_all(), not time.sleep(4) + fix pyflakes CI errors + undo flushing witness data on shutdown + sync before stopping nodes + +Rod Vagg (1): + Add joinSplitPubKey and joinSplitSig to RPC + +Sean Bowe (23): + Add implementations of PRF_expand calls that obtain esk and rcm. + Remove bare SaplingNote constructor. + Add a getter method to obtain rcm from a Sapling note plaintext. + Add support for receiving v2 Sapling note plaintexts. + Change transaction builder and miner to use v2 Sapling note plaintexts after Canopy activates. + Make ed25519-zebra available via librustzcash. + Change to version of ed25519-zebra crate which is compliant with ZIP 215. + Enforce ZIP 215 rules upon activation of Canopy. + Add test that a weird signature successfully validates. + Remove bincode crate. + Remove unused curve25519-dalek dev-dependency. + Minor adjustments to librustzcash and tests. + Redirect git checkouts of ebfull/ed25519-zebra through our vendored sources in offline mode. + Require that shielded coinbase output note plaintexts are version 2 if Canopy is active. + Make transaction builder take the next block height into account for use of v2 note plaintexts. + Turn return values for libsodium-like API into constants for clarity. + Add more exhaustive tests for ZIP 215 compatibility. + Cargo fmt + Remove unused imports from remove_sprout_shielding RPC test. + Migrate ZIP 215 test vectors to gtest suite. + Change LIBSODIUM_ERROR to -1. + Hash "Zcash" to align tests with ZIP 215 test vectors. + Remove outdated comment. + +Solar Designer (2): + Fix typos in ProcessMessage() "headers" + During initial blocks download, also report the number of headers + +Taylor Hornby (3): + Fix undefined behavior in gtest tests + Add missing header for std::invalid_argument + Fix bug in CScheduler + +Wladimir J. van der Laan (3): + Add `-debuglogfile` option + test: Add test for `-debuglogfile` + doc: Update release notes for `-debuglogfile` + +ewillbefull@gmail.com (1): + Add dev fund addresses for testnet NU4 activation. + +Marshall Gaucher (1): + Add helpers for tapping and donating to the testnet faucet + +therealyingtong (35): + Add RPC tests for post-Heartwood rollback + Reject v1 plaintexts after grace period + Check epk vs esk whenever caller has esk + Refactor SaplingNotePlaintext::decrypt + Add gtests for v2 plaintexts + Add contextual check to main.cpp + Add gtests + Add checks to z_ methods in rpcwallet + Add RPC tests + Replace leadByte in SaplingNote with is_zip_212 + Throw error in plaintext deserialization + Pass pindex to AddToWalletIfInvolvingMe() + Remove plaintext check from AddSaplingSpend + Remove plaintext check from GetFilteredNotes + Refactor bool is_zip_212 to enum Zip212Enabled + Minor changes + Remove old SaplingNote() constructor + Pass nHeight instead of pindex to AddToWalletIfInvolvingMe() + Directly call RegtestActivate* in gtests + Update release notes for v3.1.0 + make-release.py: Versioning changes for 3.1.0-rc1. + make-release.py: Updated manpages for 3.1.0-rc1. + make-release.py: Updated release notes and changelog for 3.1.0-rc1. + Undo manual DEPRECATION_HEIGHT + make-release.py: Versioning changes for 3.1.0-rc2. + make-release.py: Updated manpages for 3.1.0-rc2. + make-release.py: Updated release notes and changelog for 3.1.0-rc2. + Edit release notes to specify that rc2 does not enable Canopy support on the testnet + Set Canopy testnet activation height to 1020500 + Set PROTOCOL_VERSION to 170012 + Pass HistoryNode struct to librustzcash FFI + Delay testnet activation height by one week + Use 51 Testnet Dev Fund addresses, and adjust the end heights. + make-release.py: Versioning changes for 3.1.0. + make-release.py: Updated manpages for 3.1.0. + +ying tong (1): + Apply suggestions from code review diff --git a/doc/release-notes/release-notes-4.0.0-rc1.md b/doc/release-notes/release-notes-4.0.0-rc1.md new file mode 100644 index 000000000..b25b85ebd --- /dev/null +++ b/doc/release-notes/release-notes-4.0.0-rc1.md @@ -0,0 +1,276 @@ +Notable changes +=============== + +The mainnet activation of the Canopy network upgrade is supported by the 4.0.0 +release, with an activation height of 1046400, which should occur roughly in the +middle of November — following the targeted EOS halt of our 3.1.0 release. +Please upgrade to this release, or any subsequent release, in order to follow +the Canopy network upgrade. + +The following ZIPs are being deployed as part of this upgrade: + +* [ZIP 207: Funding Streams](https://zips.z.cash/zip-0207) in conjunction with [ZIP 214: Consensus rules for a Zcash Development Fund](https://zips.z.cash/zip-0214) +* [ZIP 211: Disabling Addition of New Value to the Sprout Value Pool](https://zips.z.cash/zip-0211) +* [ZIP 212: Allow Recipient to Derive Sapling Ephemeral Secret from Note Plaintext](https://zips.z.cash/zip-0212) +* [ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules](https://zips.z.cash/zip-0215) + +In order to help the ecosystem prepare for the mainnet activation, Canopy has +already been activated on the Zcash testnet. Any node version 3.1.0 or higher, +including this release, supports the Canopy activation on testnet. + +Disabling new value in the Sprout value pool +-------------------------------------------- + +After the mainnet activation of Canopy, it will not be possible to send funds to +Sprout z-addresses from any _other_ kind of address, as described in [ZIP 211](https://zips.z.cash/zip-0211). +It will still be possible to send funds _from_ a Sprout z-address and to send +funds between Sprout addresses. Users of Sprout z-addresses are encouraged to +use Sapling z-addresses instead, and to migrate their remaining Sprout funds +into a Sapling z-address using the migration utility in zcashd: set `migrate=1` +in your `zcash.conf` file, or use the `z_setmigration` RPC. + +New logging system +------------------ + +The `zcashd` logging system is now powered by the Rust `tracing` crate. This +has two main benefits: + +- `tracing` supports the concept of "spans", which represent periods of time + with a beginning and end. These enable logging additional information about + temporality and causality of events. (Regular log lines, which represent + moments in time, are called `events` in `tracing`.) +- Spans and events are structured, and can record typed data in addition to text + messages. This structure can then be filtered dynamically. + +The existing `-debug=target` config flags are mapped to `tracing` log filters, +and will continue to correctly enable additional logging when starting `zcashd`. +A new `setlogfilter` RPC method has been introduced that enables reconfiguring +the log filter at runtime. See `zcash-cli help setlogfilter` for its syntax. + +As a minor note, `zcashd` no longer reopens the `debug.log` file on `SIGHUP`. +This behaviour was originally introduced in upstream Bitcoin Core to support log +rotation using external tools. `tracing` supports log rotation internally (which +is currently disabled), as well as a variety of interesting backends (such as +`journald` and OpenTelemetry integration); we are investigating how these might +be exposed in future releases. + +Compatibility +------------- +macOS versions earlier than 10.12 (Sierra) are no longer supported. + +Changelog +========= + +Alfredo Garcia (3): + only allow duplicates for certain options of the config + install bdb binaries + add more allowed duplicates + +Andrew Chow (1): + Fix naming of macOS SDK and clarify version + +Carl Dong (8): + contrib: macdeploy: Correctly generate macOS SDK + Adapt rest of tooling to new SDK naming scheme + native_cctools: Don't use libc++ from pinned clang + contrib: macdeploy: Use apple-sdk-tools instead of xar+pbzx + contrib: macdeploy: Remove historical extraction notes + depends: Decouple toolchain + binutils + depends: Specify path to native binaries as clang argument + depends: Add justifications for macOS clang flags + +Charlie O'Keefe (1): + Remove 'jessie' (debian 8) from suites list in linux gitian descriptors + +Cory Fields (14): + crypto: add AES 128/256 CBC classes + crypto: add aes cbc tests + crypter: fix the stored initialization vector size + crypter: constify encrypt/decrypt + crypter: hook up the new aes cbc classes + crypter: add a BytesToKey clone to replace the use of openssl + crypter: add tests for crypter + build: Enumerate ctaes rather than globbing + depends: bump MacOS toolchain + macos: Bump to xcode 11.3.1 and 10.15 SDK + darwin: pass mlinker-version so that clang enables new features + depends: specify libc++ header location for darwin + depends: enable lto support for Apple's ld64 + depends: bump native_cctools for fixed lto with external clang + +Daira Hopwood (6): + zcutil/distclean.sh: remove BDB utility programs. + Update .gitignore. + Fix a return status issue. + Update Makefile.am + Newer version of checksec.sh from https://github.com/slimm609/checksec.sh/commit/a6df608ac077689b2160e521db6601abc7b9e26e + Repair full_test_suite.py for new checksec.sh. + +Dimitris Apostolou (1): + Remove deprecated contrib utilities + +Jack Grigg (67): + Move GrothProof and SproutProof definitions into zcash/Proof.hpp + Remove unused declarations left over from libsnark verification + Make ZCJoinSplit::prove static and remove ZCJoinSplit globals + Move ProofVerifier out of the libzcash namespace + Move JSDescription::Verify to ProofVerifier::VerifySprout + Skip Sprout proof verification for ProofVerifier::Disabled + Send alert to put pre-Heartwood nodes into safe mode. + Squashed 'src/crypto/ctaes/' content from commit 003a4acfc + build: shuffle gtest Makefile so that crypto can be used by the wallet + metrics: Collect general stats before clearing screen + Debian: Add copyright entries for ctaes and secp256k1 + Revert "Rename FALLBACK_DOWNLOAD_PATH to PRIORITY_DOWNLOAD_PATH" + Revert "Try downloading from our mirror first to avoid headaches." + depends: Use FALLBACK_DOWNLOAD_PATH if the primary's hash doesn't match + test: Remove obsolete TransactionBuilder test + Add tracing to librustzcash dependencies + FFI wrapper around tracing crate + Replace C++ logging with tracing logging + Use a tracing EnvFilter directive for -debug flags + Add support for reloading the tracing filter + Add an RPC method for setting the tracing filter directives + Add support for tracing spans + Add some spans to the Zcash codebase + FFI: Extract common codeunit types into a rust/types.h header + tracing: Use 'static constexpr' hack in macros + wallet: Fix logging to satisfy constexpr requirements + FFI: Add missing includes + init: Place additional constraints on pathDebug + rpc: Throw error in setlogfilter if filter reloading fails + tracing: Log field values that aren't valid UTF-8 + tracing: Document macro arguments that MUST be static constant UTF-8 strings + doc: Update release notes for tracing backend + qa: Add tracing dependencies to updatecheck.py + depends: tracing-core 0.1.13 + Revert "Add check-depends step to STAGE_COMMANDS list" + contrib: Update macdeploy README + depends: Rework Rust integration + depends: Add platform-specific overrides for download files + depends: Split check-packages and check-sources across categories + FFI: Fix tracing log path handling on Windows + tracing: Add MAP macro + tracing: Add support for event fields + tracing: Add support for span fields + tracing: Format field values with Display + Add fields to logging in CNode and UpdateTip + util: Use DEBUG level for LogPrint(), leaving INFO for LogPrintf() + tracing: Parse log_path into an Option + tracing: Rework tracing_init into a single function + init: Rework tracing_init call + init: Add spans for initialization and shutdown + Replace libsodium's randombytes_buf with rand_core::OsRng::fill_bytes + consensus: Add assertions for Params::HalvingHeight parameters + consensus: Document the empty conditional branch in ContextualCheckBlock + consensus: Statically check funding stream numerators and denominators + consensus: Clearly gate active funding stream elements on Canopy + Replace libsodium's crypto_sign with ed25519-zebra + ed25519: Panic (triggering abort) if nullptr passed into APIs + test: Update ZIP 215 test cases from ed25519-zebra + depends: Migrate to zcash_* 0.3.0 Rust crates + FFI: Remove circuit parameter hashes from librustzcash_init_zksnark_params + FFI: Migrate to bls12_381 and jubjub crates + depends: cargo update + qa: Update list of postponed crate versions + FFI: Rename to librustzcash_sapling_compute_cmu + FFI: Rename r to rcm + debian: Rename X11 to Expat-with-advertising-clause in copyright + Adjust GetActiveFundingStream* comments + +Kris Nuttycombe (13): + Remove amqp code and Proton library depenencies & flags. + Remove Proton license from contrib/debian/copyright + consensus: Clean up some whitespace and variable names + consensus: Refactor Sprout contextual rules to match the rest + consensus: Remove canopyActive gate around GetActiveFundingStreamElements + consensus: Combine heartwoodActive conditionals + consensus: Add a placeholder for !canopyActive + consensus: Move overwinterActive rules ahead of saplingActive rules + consensus: Combine saplingActive conditionals + consensus: Move Sapling-disabled Overwinter rules above Sapling rules + consensus: Reorder Overwinter+!Sapling rules + consensus: Remove redundant contextual consensus rules + Add comment in lieu of redundant overwinter version check & fix tests. + +Larry Ruane (2): + flush wallet db (SetBestChain()) on clean shutdown + wallet: lock cs_main while accessing chainActive + +LongShao007 (1): + fix bug of bdb.mk + +Per Grön (11): + Get rid of implicit hidden dependencies between test .cpp files + Add missing #includes to test_block.cpp + Add actual header file for utilities in gtest/utils.cpp + Fix linkage issue with consts in primitives/block.h + Remove Checkpoints_tests.cpp + libsnark: Don't (implicitly) rely on other tests initializing the public params + Add missing libsnark initialization call + Don't clobber cwd in rpc_wallet_tests.cpp + Include header files within the source tree using "" instead of <> + Be consistent about what path to include bitcoin-config.h with + Be consistent with how to #include test data headers + +Pieter Wuille (1): + Add ctaes-based constant time AES implementation + +Sean Bowe (4): + Postpone boost 1.74.0 update + Postpone rust updates + make-release.py: Versioning changes for 4.0.0-rc1. + make-release.py: Updated manpages for 4.0.0-rc1. + +Taylor Hornby (5): + Implement system for postponing dependency updates. + Change release instructions to block the release when dependencies are not updated and not postponed. + Enforce pre-release dependency update check in make-release.py + Extend deadline for postponing dependency updates + Add new dependencies to updatecheck.py, add a flag we can use to have our CI test it. + +Ariel Gabizon (1): + explain expiry error + +Benjamin Winston (2): + Added support for afl-clang-fast. + Added libfuzzer support. + +elbandi (3): + Allow configure params directory + Add paramsdir option for manpage + Throw error if -paramsdir not a valid directory + +fanquake (8): + depends: set OSX_MIN_VERSION to 10.10 + doc: mention that macOS 10.10 is now required + scripted-diff: prefer MAC_OSX over __APPLE__ + build: set minimum supported macOS to 10.12 + depends: clang 6.0.1 + depends: native_cctools 921, ld64 409.12, libtapi 1000.10.8 + build: use macOS 10.14 SDK + doc: explain why passing -mlinker-version is required + +noname45688@gmail.com (2): + Updating to Python 3 + Update to Python 3 + +teor (1): + Fix a comment typo in pow.cpp + +Ying Tong Lai (11): + Add Debian8 deprecation to release notes + Add missing curly braces after if statement + Add test for garbage memory in history nodes + Add documentation specific to ZIP 212 + Move esk derivation check to beginning of plaintext_checks_without_height() + Define PRF diversifiers in prf.h + assert(leadbyte == 0x02) after every if(leadbyte != 0x01) + Update doc/release-notes/release-notes-3.1.0.md + Make sure garbage bytes are different + Rename PRV_DIVERSIFIER to PRF_TAG + Add link to ZIP212 in coinbase comment + +Zancas Wilcox (1): + make deprecation.h include consensus/params.h + diff --git a/doc/release-notes/release-notes-4.0.0.md b/doc/release-notes/release-notes-4.0.0.md new file mode 100644 index 000000000..cd675c434 --- /dev/null +++ b/doc/release-notes/release-notes-4.0.0.md @@ -0,0 +1,290 @@ +Notable changes +=============== + +The mainnet activation of the Canopy network upgrade is supported by the 4.0.0 +release, with an activation height of 1046400, which should occur roughly in the +middle of November — following the targeted EOS halt of our 3.1.0 release. +Please upgrade to this release, or any subsequent release, in order to follow +the Canopy network upgrade. + +The following ZIPs are being deployed as part of this upgrade: + +* [ZIP 207: Funding Streams](https://zips.z.cash/zip-0207) in conjunction with [ZIP 214: Consensus rules for a Zcash Development Fund](https://zips.z.cash/zip-0214) +* [ZIP 211: Disabling Addition of New Value to the Sprout Value Pool](https://zips.z.cash/zip-0211) +* [ZIP 212: Allow Recipient to Derive Sapling Ephemeral Secret from Note Plaintext](https://zips.z.cash/zip-0212) +* [ZIP 215: Explicitly Defining and Modifying Ed25519 Validation Rules](https://zips.z.cash/zip-0215) + +In order to help the ecosystem prepare for the mainnet activation, Canopy has +already been activated on the Zcash testnet. Any node version 3.1.0 or higher, +including this release, supports the Canopy activation on testnet. + +Disabling new value in the Sprout value pool +-------------------------------------------- + +After the mainnet activation of Canopy, it will not be possible to send funds to +Sprout z-addresses from any _other_ kind of address, as described in [ZIP 211](https://zips.z.cash/zip-0211). +It will still be possible to send funds _from_ a Sprout z-address and to send +funds between Sprout addresses. Users of Sprout z-addresses are encouraged to +use Sapling z-addresses instead, and to migrate their remaining Sprout funds +into a Sapling z-address using the migration utility in zcashd: set `migrate=1` +in your `zcash.conf` file, or use the `z_setmigration` RPC. + +New logging system +------------------ + +The `zcashd` logging system is now powered by the Rust `tracing` crate. This +has two main benefits: + +- `tracing` supports the concept of "spans", which represent periods of time + with a beginning and end. These enable logging additional information about + temporality and causality of events. (Regular log lines, which represent + moments in time, are called `events` in `tracing`.) +- Spans and events are structured, and can record typed data in addition to text + messages. This structure can then be filtered dynamically. + +The existing `-debug=target` config flags are mapped to `tracing` log filters, +and will continue to correctly enable additional logging when starting `zcashd`. +A new `setlogfilter` RPC method has been introduced that enables reconfiguring +the log filter at runtime. See `zcash-cli help setlogfilter` for its syntax. + +As a minor note, `zcashd` no longer reopens the `debug.log` file on `SIGHUP`. +This behaviour was originally introduced in upstream Bitcoin Core to support log +rotation using external tools. `tracing` supports log rotation internally (which +is currently disabled), as well as a variety of interesting backends (such as +`journald` and OpenTelemetry integration); we are investigating how these might +be exposed in future releases. + +Compatibility +------------- +macOS versions earlier than 10.12 (Sierra) are no longer supported. + +Changelog +========= + +Alfredo Garcia (3): + only allow duplicates for certain options of the config + install bdb binaries + add more allowed duplicates + +Andrew Chow (1): + Fix naming of macOS SDK and clarify version + +Carl Dong (8): + contrib: macdeploy: Correctly generate macOS SDK + Adapt rest of tooling to new SDK naming scheme + native_cctools: Don't use libc++ from pinned clang + contrib: macdeploy: Use apple-sdk-tools instead of xar+pbzx + contrib: macdeploy: Remove historical extraction notes + depends: Decouple toolchain + binutils + depends: Specify path to native binaries as clang argument + depends: Add justifications for macOS clang flags + +Charlie O'Keefe (1): + Remove 'jessie' (debian 8) from suites list in linux gitian descriptors + +Cory Fields (14): + crypto: add AES 128/256 CBC classes + crypto: add aes cbc tests + crypter: fix the stored initialization vector size + crypter: constify encrypt/decrypt + crypter: hook up the new aes cbc classes + crypter: add a BytesToKey clone to replace the use of openssl + crypter: add tests for crypter + build: Enumerate ctaes rather than globbing + depends: bump MacOS toolchain + macos: Bump to xcode 11.3.1 and 10.15 SDK + darwin: pass mlinker-version so that clang enables new features + depends: specify libc++ header location for darwin + depends: enable lto support for Apple's ld64 + depends: bump native_cctools for fixed lto with external clang + +Daira Hopwood (7): + zcutil/distclean.sh: remove BDB utility programs. + Update .gitignore. + Fix a return status issue. + Update Makefile.am + Newer version of checksec.sh from https://github.com/slimm609/checksec.sh/commit/a6df608ac077689b2160e521db6601abc7b9e26e + Repair full_test_suite.py for new checksec.sh. + Clarify a comment about the ZF and MG addresses + +Dimitris Apostolou (1): + Remove deprecated contrib utilities + +Jack Grigg (65): + Move GrothProof and SproutProof definitions into zcash/Proof.hpp + Remove unused declarations left over from libsnark verification + Make ZCJoinSplit::prove static and remove ZCJoinSplit globals + Move ProofVerifier out of the libzcash namespace + Move JSDescription::Verify to ProofVerifier::VerifySprout + Skip Sprout proof verification for ProofVerifier::Disabled + Send alert to put pre-Heartwood nodes into safe mode. + Squashed 'src/crypto/ctaes/' content from commit 003a4acfc + build: shuffle gtest Makefile so that crypto can be used by the wallet + metrics: Collect general stats before clearing screen + Debian: Add copyright entries for ctaes and secp256k1 + Revert "Rename FALLBACK_DOWNLOAD_PATH to PRIORITY_DOWNLOAD_PATH" + Revert "Try downloading from our mirror first to avoid headaches." + depends: Use FALLBACK_DOWNLOAD_PATH if the primary's hash doesn't match + test: Remove obsolete TransactionBuilder test + Add tracing to librustzcash dependencies + FFI wrapper around tracing crate + Replace C++ logging with tracing logging + Use a tracing EnvFilter directive for -debug flags + Add support for reloading the tracing filter + Add an RPC method for setting the tracing filter directives + Add support for tracing spans + Add some spans to the Zcash codebase + FFI: Extract common codeunit types into a rust/types.h header + tracing: Use 'static constexpr' hack in macros + wallet: Fix logging to satisfy constexpr requirements + FFI: Add missing includes + init: Place additional constraints on pathDebug + rpc: Throw error in setlogfilter if filter reloading fails + tracing: Log field values that aren't valid UTF-8 + tracing: Document macro arguments that MUST be static constant UTF-8 strings + doc: Update release notes for tracing backend + qa: Add tracing dependencies to updatecheck.py + depends: tracing-core 0.1.13 + Revert "Add check-depends step to STAGE_COMMANDS list" + contrib: Update macdeploy README + depends: Rework Rust integration + depends: Add platform-specific overrides for download files + depends: Split check-packages and check-sources across categories + FFI: Fix tracing log path handling on Windows + tracing: Add MAP macro + tracing: Add support for event fields + tracing: Add support for span fields + tracing: Format field values with Display + Add fields to logging in CNode and UpdateTip + util: Use DEBUG level for LogPrint(), leaving INFO for LogPrintf() + tracing: Parse log_path into an Option + tracing: Rework tracing_init into a single function + init: Rework tracing_init call + init: Add spans for initialization and shutdown + Replace libsodium's randombytes_buf with rand_core::OsRng::fill_bytes + consensus: Add assertions for Params::HalvingHeight parameters + consensus: Document the empty conditional branch in ContextualCheckBlock + consensus: Statically check funding stream numerators and denominators + consensus: Clearly gate active funding stream elements on Canopy + Replace libsodium's crypto_sign with ed25519-zebra + ed25519: Panic (triggering abort) if nullptr passed into APIs + test: Update ZIP 215 test cases from ed25519-zebra + depends: Migrate to zcash_* 0.3.0 Rust crates + FFI: Remove circuit parameter hashes from librustzcash_init_zksnark_params + FFI: Migrate to bls12_381 and jubjub crates + depends: cargo update + qa: Update list of postponed crate versions + FFI: Rename to librustzcash_sapling_compute_cmu + FFI: Rename r to rcm + +Kris Nuttycombe (13): + Remove amqp code and Proton library depenencies & flags. + Remove Proton license from contrib/debian/copyright + consensus: Clean up some whitespace and variable names + consensus: Refactor Sprout contextual rules to match the rest + consensus: Remove canopyActive gate around GetActiveFundingStreamElements + consensus: Combine heartwoodActive conditionals + consensus: Add a placeholder for !canopyActive + consensus: Move overwinterActive rules ahead of saplingActive rules + consensus: Combine saplingActive conditionals + consensus: Move Sapling-disabled Overwinter rules above Sapling rules + consensus: Reorder Overwinter+!Sapling rules + consensus: Remove redundant contextual consensus rules + Add comment in lieu of redundant overwinter version check & fix tests. + +Larry Ruane (2): + flush wallet db (SetBestChain()) on clean shutdown + wallet: lock cs_main while accessing chainActive + +LongShao007 (1): + fix bug of bdb.mk + +Per Grön (11): + Get rid of implicit hidden dependencies between test .cpp files + Add missing #includes to test_block.cpp + Add actual header file for utilities in gtest/utils.cpp + Fix linkage issue with consts in primitives/block.h + Remove Checkpoints_tests.cpp + libsnark: Don't (implicitly) rely on other tests initializing the public params + Add missing libsnark initialization call + Don't clobber cwd in rpc_wallet_tests.cpp + Include header files within the source tree using "" instead of <> + Be consistent about what path to include bitcoin-config.h with + Be consistent with how to #include test data headers + +Pieter Wuille (1): + Add ctaes-based constant time AES implementation + +Sean Bowe (13): + Postpone boost 1.74.0 update + Postpone rust updates + make-release.py: Versioning changes for 4.0.0-rc1. + make-release.py: Updated manpages for 4.0.0-rc1. + make-release.py: Updated release notes and changelog for 4.0.0-rc1. + Add release notes to describe the Canopy network upgrade. + Update names of contributors in release notes. + Specify 4.0.0 in release notes + Add dev fund addresses for mainnet. + Set activation height for Canopy on mainnet. + Postpone updates for dependencies until after 4.0.0 release. + make-release.py: Versioning changes for 4.0.0. + make-release.py: Updated manpages for 4.0.0. + +Taylor Hornby (5): + Implement system for postponing dependency updates. + Change release instructions to block the release when dependencies are not updated and not postponed. + Enforce pre-release dependency update check in make-release.py + Extend deadline for postponing dependency updates + Add new dependencies to updatecheck.py, add a flag we can use to have our CI test it. + +Ariel Gabizon (1): + explain expiry error + +Benjamin Winston (2): + Added support for afl-clang-fast. + Added libfuzzer support. + +elbandi (3): + Allow configure params directory + Add paramsdir option for manpage + Throw error if -paramsdir not a valid directory + +fanquake (8): + depends: set OSX_MIN_VERSION to 10.10 + doc: mention that macOS 10.10 is now required + scripted-diff: prefer MAC_OSX over `__APPLE__` + build: set minimum supported macOS to 10.12 + depends: clang 6.0.1 + depends: native_cctools 921, ld64 409.12, libtapi 1000.10.8 + build: use macOS 10.14 SDK + doc: explain why passing -mlinker-version is required + +noname45688@gmail.com (2): + Updating to Python 3 + Update to Python 3 + +Jack Grigg (2): + debian: Rename X11 to Expat-with-advertising-clause in copyright + Adjust GetActiveFundingStream* comments + +teor (1): + Fix a comment typo in pow.cpp + +Ying Tong Lai (7): + Add Debian8 deprecation to release notes + Add missing curly braces after if statement + Add test for garbage memory in history nodes + Add documentation specific to ZIP 212 + Move esk derivation check to beginning of plaintext_checks_without_height() + Define PRF diversifiers in prf.h + assert(leadbyte == 0x02) after every if(leadbyte != 0x01) + +ying tong (4): + Update doc/release-notes/release-notes-3.1.0.md + Make sure garbage bytes are different + Rename PRV_DIVERSIFIER to PRF_TAG + Add link to ZIP212 in coinbase comment + +Zancas Wilcox (1): + make deprecation.h include consensus/params.h + diff --git a/doc/release-notes/release-notes-4.1.0-rc1.md b/doc/release-notes/release-notes-4.1.0-rc1.md new file mode 100644 index 000000000..593f3305e --- /dev/null +++ b/doc/release-notes/release-notes-4.1.0-rc1.md @@ -0,0 +1,382 @@ +Notable changes +=============== + +Migration to Clang and static libc++ +------------------------------------ + +`zcashd` now builds its C++ (and C) dependencies entirely with a pinned version +of Clang, and statically links libc++ instead of dynamically linking libstdc++. +This migration enables us to reliably use newer C++ features while supporting +older LTS platforms, be more confident in the compiler's optimisations, and +leverage security features such as sanitisers and efficient fuzzing. In future, +this will also allow optimizing across the boundary between Rust and C++. + +The system compiler is still used to compile a few native dependencies (used by +the build machine to then compile `zcashd` for the target machine). These will +likely also be migrated to use the pinned Clang in a future release. + +Fast sync for initial block download +------------------------------------ + +The `-ibdskiptxverification` flag allows faster synchronization during initial +block sync, by skipping transaction verification and instead verifying only PoW. +Note that this mode requires checkpoints to be enabled, to make sure that each +block under inspection is an ancestor of the latest checkpoint. + +Convenient testing for invalid note plaintexts +---------------------------------------------- + +After the mainnet activation of Canopy (block 1046400), correct wallet software +will no longer produce v1 note plaintexts (with a lead byte of `0x01`). However, +v1 note plaintexts will continue to be accepted for a grace period of 32256 +blocks (about 4 weeks), as specified in [ZIP 212](https://zips.z.cash/zip-0212). +The new `receiveunsafe` log category complains if an invalid note plaintext is +received. + +Additional lightwalletd and light client RPCs +--------------------------------------------- + +- lightwalletd is now able to retrieve all UTXOs related to a t-address through +the `getaddressutxos` RPC. (Previously, this was only available to the Insight +Explorer.) +- The new `z_gettreestate` RPC returns the Sprout and Sapling treestate at a +given block height or block hash. This makes it easier for light clients to +generate checkpoints. + +Update/removal of several cryptographic dependencies +---------------------------------------------------- + +This release updates secp256k1 to enable the GLV endomorphism optimisation by +default, after the recent expiry of the GLV patents. It also removes OpenSSL, +and replaces libsodium BLAKE2b usage with the [blake2b_simd Rust crate](https://github.com/oconnor663/blake2_simd). + +Changelog +========= + +Aditya Kulkarni (1): + Add a config option to skip transaction verification in IBD mode + +Ahmad Kazi (1): + [Trivial] Add BITCOIN_FS_H endif footer in fs.h + +Alfredo Garcia (9): + add timestamp to warnings + change order of returned pair, fix compatibility issue + revert result key change, fix calls to getime + add shielded balance to getwalletinfo + Add null check to feof. + allow wallet file to be outside datadir + Apply suggestions from code review + simplify TestBlockValidity + update function comment + +Ben Wilson (4): + Added libtinfo5 to ci builder containers + Added Arch and Centos to script, added libtinfo5 for arch + Fixed Centos and Arch python requirements + Build python for debian9 and ubuntu16.04 + +Carl Dong (3): + depends: Build secondary deps statically. + depends: Purge libtool archives + scripted-diff: Run scripted-diff in subshell + +Cory Fields (8): + leveldb: integrate leveldb into our buildsystem + build: No need to check for leveldb atomics + build: out-of-tree fixups + leveldb: enable runtime-detected crc32 instructions + build: verify that the assembler can handle crc32 functions + httpserver: use a future rather than relying on boost's try_join_for + httpserver: replace boost threads with std + devtools: add script to verify scriptable changes + +Daira Hopwood (29): + CBufferedFile: assert that Fill() is only called when nReadPos == nSrcPos, and simplify based on that assumption. + CBufferedFile: use eof() method rather than feof(src) in error message. + Make some conversions explicit to reduce sanitizer warnings. + Rename z_*_balance fields of getwalletinfo output to shielded_*_balance + Fix grammar in error messages. + Ensure that the absolute path used in the test definitely does not exist. + Line-wrap addition to README.md + Minor additional OpenSSL scouring. + Avoid undefined behaviour in scriptnum tests. + Add assertions for CScriptNum[10] +/- int64_t to avoid the possibility of UB. + It's unnecessary to pass int64_t by const reference. + Cosmetics in CScriptNum code and tests. + Add logging when we receive an invalid note plaintext (using the "receiveunsafe" log category). + Fix a new warning about use of boost::bind placeholders after updating Boost. closes #4774 + Beef up the CoC to address use of dog-whistles. + Fix warnings surfaced by compiling with clang++. + Use the current time as the timestamp if we override a misc warning. + qa/zcash/full_test_suite.py: changes needed for macOS. fixes #4785 + qa/zcash/full_test_suite.py: print immediately if a test fails. + log(x)/log(2.0) can be written as log2(x). + Fix integer types in DisplayDuration. + Rename `time` to `duration` in `DisplayDuration`. + Update contrib/devtools/symbol-check.py + contrib/devtools/symbol-check.py: add info about Fedora-based distributions. + Comment and error message cleanups for transaction checks. + Add new copyright entries for build-aux/m4/ax_cxx_compile_stdcxx.m4 + Fix death gtests on macOS by switching to the threadsafe style. + Fix an error reporting bug in "Checksum missing or mismatched ..." + Rename the FS_ZIP214_ECC funding stream to FS_ZIP214_BP. See also https://github.com/zcash/zips/pull/412 . + +Dimitris Apostolou (5): + Remove reference to cargo-checksum.sh + Fix typos + Fix zeromq warning + Remove deprecated init.md + Remove Bitcoin release notes + +Dimitris Tsapakidis (1): + Fixed multiple typos + +Hennadii Stepanov (1): + Enable ShellCheck rules + +Jack Grigg (79): + Assorted small changes to the locked pool manager + wallet: Add ANY_TADDR special string to z_sendmany + Allow multiple nuparams options in config file + depends: Switch to `cargo vendor` for Rust dependencies + QA: Comment out Rust crate checks in updatecheck.py + depends: Ensure that SOURCES_PATH exists before vendoring crates + wallet: Ignore coinbase UTXOs with z_sendmany ANY_TADDR + rpc: Fix comma spacing in example z_sendmany commands + Squashed 'src/leveldb/' changes from 20ca81f08..a31c8aa40 + Squashed 'src/leveldb/' changes from a31c8aa40..196962ff0 + Squashed 'src/leveldb/' changes from 196962ff0..c521b3ac6 + Squashed 'src/leveldb/' changes from c521b3ac6..64052c76c + Squashed 'src/leveldb/' changes from 64052c76c..524b7e36a + Squashed 'src/leveldb/' changes from 524b7e36a..f545dfabf + depends: Remove cargo-checksum.sh + Replace libsodium's crypto_generichash_blake2b with blake2b_simd + blake2b: Allow consuming partial BLAKE2b output + tracing: Correctly override tracing::Span move constructors + build: Remove Rust staticlib naming workaround + depends: Update to latest config.guess & config.sub + build: out-of-tree fixups + leveldb: Assert that ssize_t is the same size as size_t on Windows + LockedPool: Fix LockedPool::free(nullptr) to be a no-op + LockedPool: Make Arena::free and LockedPool::free noexcept + allocators: Apply Allocator named requirements to secure_allocator::deallocate + depends: Update map of GCC canonical hosts to Rust targets + QA: Switch to x86_64-pc-linux-gnu for hard-coded Linux HOST + build: Switch to x86_64-pc-linux-gnu for codecov filtering + gitian: Switch from x86_64-unknown-linux-gnu to x86_64-linux-gnu + util: Remove OpenSSL multithreading infrastructure + Remove remaining OpenSSL references + QA: Remove OpenSSL from updatecheck.py + build: Remove a stray -lcrypto + Squashed 'src/secp256k1/' changes from 6ad5cdb42..8ab24e8da + build: Use the endomorphism optimization for secp256k1 + depends: libevent 2.1.12 + depends: ccache 3.7.11 + depends: googletest 1.8.1 + depends: utfcpp 3.1.2 + depends: Use correct HOST for download-linux target + QA: Fix backporting bugs in httpbasics.py + depends: Boost 1.74.0 + depends: ccache 3.7.12 + cargo update + depends: ZeroMQ 4.3.3 + FFI: Merge librustzcash_init_zksnark_params variants into one function + depends: Postpone current and scheduled Rust releases until 2021 + MOVEONLY: Move logging code from util.{h,cpp} to new files + depends: Add Clang 8.0.0 + depends: Use vendored Clang for native compilation + depends: Use vendored Clang for macOS cross-compilation + depends: Vendor LLD and use it for linking + depends: Add libc++ as a dependency + depends: Don't replace default CXXFLAGS in C++ dependencies + depends: Add multilib paths for Linux cross-compile + build: Statically link libc++ + build: Add missing LIBUNIVALUE to Makefile.bench.include LDADD + depends: Fix "unused variables" warning when compiling zeromq for Windows + depends: Rename Boost libraries to follow MinGW/GCC convention + depends: Fix boost::iostreams usage on Windows with libc++ + build: Compile secp256k1 with C99 + build: Add -lpthread to univalue test LDFLAGS + qa: Disable FORTIFY_SOURCE checks + QA: Add native_clang and libcxx to updatecheck.py + test: Fix various pyflakes warnings + doc: Add Clang and libc++ migration to release notes + build: Update AX_CXX_COMPILE_STDCXX macro + build: Require and build with C++ 17 + depends: Build C++ dependencies with C++ 17 + Switch from std::random_shuffle to std::shuffle + Squashed 'src/secp256k1/' changes from 8ab24e8da..c6b6b8f1b + build: Update secp256k1 configure flags + Improve reject reasons for unmet shielded requirements + Add logging to CCoinsViewCache::HaveShieldedRequirements + utils: Remove unnecessary GetTempPath() + Add txid to "shielded requirements not met" messages + test/lint: Check for working changes before checking scripted diffs + tests: Update chained_joinsplits test for HaveShieldedRequirements API change + scripted-diff: Remove BOOST_STATIC_ASSERT + +Jeffrey Czyz (2): + Fix compilation errors in support/lockedpool.cpp + Fix segfault in allocator_tests/arena_tests + +Jeremy Rubin (1): + Fix subscript[0] potential bugs in key.cpp + +John Newbery (1): + [docs] document scripted-diff + +Jonas Schnelli (2): + NotifyBlockTip signal: switch from hash (uint256) to CBlockIndex* + Move uiInterface.NotifyBlockTip signal above the core/wallet signal + +Kaz Wesley (3): + LockedPool: test handling of invalid allocations + LockedPool: fix explosion for illegal-sized alloc + LockedPool: avoid quadratic-time allocation + +Kris Nuttycombe (14): + Prevent creation of shielded transactions in initial block download. + Revert the move of the `getBalanceZaddr` block for ease of review. + Fix forward declaration. + Remove redundant CheckBlock calls. + Reduce diff complexity. + Apply style suggestions from code review + -ibdskiptxverification must imply -checkpoints + Apply suggestions from code review + Ensure conflicting flags are reported as an error. + Reject incompatible flags in "Step 2" + Rename IBDSkipTxVerification back to ShouldCheckTransaction + Fix command-line help for -ibdskiptxverification + Fix invocation of updatecheck.py in make-release.py + Replace invalid characters in log message decoding. + +Larry Ruane (4): + Flush witness data when consistent (part 2) + performance: auto params = CChainParams::GetConsensus() + allow getaddressutxos if -lightwalletd + add z_gettreestate rpc + +Luke Dashjr (2): + lockedpool: When possible, use madvise to avoid including sensitive information in core dumps + Add MIT license to Makefiles + +Marco Falke (3): + Limit scope of all global std::once_flag + Add extra LevelDB source to Makefile + test: Move linters to test/lint, add readme + +Martin Ankerl (2): + Use best-fit strategy in Arena, now O(log(n)) instead O(n) + fix nits: variable naming, typos + +Mustafa (2): + Add a source file for unit test utils. + Move GetTempPath() to testutil. + +Nate Wilcox (3): + Link the README.md to the specific readthedocs.io page for building on Debian/Ubuntu. + Convert a sed command to a static patch file. + depends: fix a logging bug for multi-archive packages. + +Nick (1): + [RPC] Add transaction size to JSON output + +Pavel Janík (2): + Do not shadow variable, use deprecated MAP_ANON if MAP_ANONYMOUS is not defined. + Do not include env_win.cc on non-Windows systems + +Pieter Wuille (2): + Remove some unused functions and methods + Fail on commit with VERIFY SCRIPT but no scripted-diff + +Sean Bowe (3): + Update Rust to 1.44.1. + cargo update + Update to latest zcash_* and zkcrypto crates. + +Taylor Hornby (3): + Fix buffer overflows in P2PKH tests + Add a missing % to a string interpolation in rpc test framework + Fix undefined behavior in the test_bitcoin tests + +Thomas Snider (1): + [trivial] Switched constants to sizeof() + +Vasil Dimov (1): + lockedpool: avoid sensitive data in core files (FreeBSD) + +Wladimir J. van der Laan (19): + wallet: Change CCrypter to use vectors with secure allocator + wallet: Get rid of LockObject and UnlockObject calls in key.h + support: Add LockedPool + rpc: Add `getmemoryinfo` call + bench: Add benchmark for lockedpool allocation/deallocation + http: Restrict maximum size of request line + headers + Replace scriptnum_test's normative ScriptNum implementation + build: remove libcrypto as internal dependency in libbitcoinconsensus.pc + http: Do a pending c++11 simplification + http: Add log message when work queue is full + http: Change boost::scoped_ptr to std::unique_ptr in HTTPRequest + http: use std::move to move HTTPRequest into HTTPWorkItem + Add fs.cpp/h + Replace includes of boost/filesystem.h with fs.h + Replace uses of boost::filesystem with fs + Use fsbridge for fopen and freopen + torcontrol: Use fs::path instead of std::string for private key path + Remove `namespace fs=fs` + test: Mention commit id in scripted diff error + +fanquake (8): + build: remove SSL lib detection + build: remove OpenSSL detection and libs + depends: remove OpenSSL package + doc: remove OpenSSL from build instructions and licensing info + depends: Disable unused ZeroMQ features + depends: zeromq: disable draft classes and methods + build: only pass --disable-dependency-tracking to packages that understand it + build: pass --enable-option-checking to applicable packages + +mruddy (1): + [depends, zmq, doc] avoid deprecated zeromq api functions + +practicalswift (7): + Fix out-of-bounds write in case of failing mmap(...) in PosixLockedPageAllocator::AllocateLocked + Improve readability by removing redundant casts to same type (on all platforms) + tests: Remove OldSetKeyFromPassphrase/OldEncrypt/OldDecrypt + Remove unused Boost includes + Add "export LC_ALL=C" to all shell scripts + Add error handling: exit if cd fails + Use bash instead of POSIX sh. POSIX sh does not support arrays. + +Jack Grigg (9): + Update license headers + leveldb: Fix typo + LockedPool: Switch to HTTPS URLs in licenses and comments + test: Fix LFSR period in comments + httpserver: Code style cleanups + depends: Update packages documentation for Zcash + depends: Add untested note to FreeBSD host + Update example scripted-diff comit in doc/developer-notes.md + Use HTTPS in script license headers + +syd (1): + Add assert_raises_message to the python test framework. + +Ying Tong Lai (9): + Add funding stream addresses to getblocksubsidy RPC output + Fix CScript encoding + Handle shielded address case + Minor cleanups + Only return address instead of CScript + Remove void declaration of ScriptPubKeyToJSON() + Postpone native_ccache 4.0 + make-release.py: Versioning changes for 4.1.0-rc1. + make-release.py: Updated manpages for 4.1.0-rc1. + +ying tong (1): + Apply suggestions from code review + +Benjamin Winston (1): + Postponed dependency updates, refer to core team sync meeting. + diff --git a/doc/release-notes/release-notes-4.1.0.md b/doc/release-notes/release-notes-4.1.0.md new file mode 100644 index 000000000..d5d26eb9d --- /dev/null +++ b/doc/release-notes/release-notes-4.1.0.md @@ -0,0 +1,387 @@ +Notable changes +=============== + +Migration to Clang and static libc++ +------------------------------------ + +`zcashd` now builds its C++ (and C) dependencies entirely with a pinned version +of Clang, and statically links libc++ instead of dynamically linking libstdc++. +This migration enables us to reliably use newer C++ features while supporting +older LTS platforms, be more confident in the compiler's optimisations, and +leverage security features such as sanitisers and efficient fuzzing. In future, +this will also allow optimizing across the boundary between Rust and C++. + +The system compiler is still used to compile a few native dependencies (used by +the build machine to then compile `zcashd` for the target machine). These will +likely also be migrated to use the pinned Clang in a future release. + + +Fast sync for initial block download +------------------------------------ + +The `-ibdskiptxverification` flag allows faster synchronization during initial +block sync, by skipping transaction verification and instead verifying only PoW. +Note that this mode requires checkpoints to be enabled, to make sure that each +block under inspection is an ancestor of the latest checkpoint. + +Convenient testing for invalid note plaintexts +---------------------------------------------- + +After the mainnet activation of Canopy (block 1046400), correct wallet software +will no longer produce v1 note plaintexts (with a lead byte of `0x01`). However, +v1 note plaintexts will continue to be accepted for a grace period of 32256 +blocks (about 4 weeks), as specified in [ZIP 212](https://zips.z.cash/zip-0212). +The new `receiveunsafe` log category complains if an invalid note plaintext is +received. + +Additional lightwalletd and light client RPCs +--------------------------------------------- + +- lightwalletd is now able to retrieve all UTXOs related to a t-address through +the `getaddressutxos` RPC. (Previously, this was only available to the Insight +Explorer.) +- The new `z_gettreestate` RPC returns the Sprout and Sapling treestate at a +given block height or block hash. This makes it easier for light clients to +generate checkpoints. + +Update/removal of several cryptographic dependencies +---------------------------------------------------- + +This release updates secp256k1 to enable the GLV endomorphism optimisation by +default, after the recent expiry of the GLV patents. It also removes OpenSSL, +and replaces libsodium BLAKE2b usage with the [blake2b_simd Rust crate](https://github.com/oconnor663/blake2_simd). +Changelog +========= + +Aditya Kulkarni (1): + Add a config option to skip transaction verification in IBD mode + +Ahmad Kazi (1): + [Trivial] Add BITCOIN_FS_H endif footer in fs.h + +Alfredo Garcia (9): + add timestamp to warnings + change order of returned pair, fix compatibility issue + revert result key change, fix calls to getime + add shielded balance to getwalletinfo + Add null check to feof. + allow wallet file to be outside datadir + Apply suggestions from code review + simplify TestBlockValidity + update function comment + +Ben Wilson (4): + Added libtinfo5 to ci builder containers + Added Arch and Centos to script, added libtinfo5 for arch + Fixed Centos and Arch python requirements + Build python for debian9 and ubuntu16.04 + +Carl Dong (3): + depends: Build secondary deps statically. + depends: Purge libtool archives + scripted-diff: Run scripted-diff in subshell + +Cory Fields (8): + leveldb: integrate leveldb into our buildsystem + build: No need to check for leveldb atomics + build: out-of-tree fixups + leveldb: enable runtime-detected crc32 instructions + build: verify that the assembler can handle crc32 functions + httpserver: use a future rather than relying on boost's try_join_for + httpserver: replace boost threads with std + devtools: add script to verify scriptable changes + +Daira Hopwood (30): + CBufferedFile: assert that Fill() is only called when nReadPos == nSrcPos, and simplify based on that assumption. + CBufferedFile: use eof() method rather than feof(src) in error message. + Make some conversions explicit to reduce sanitizer warnings. + Rename z_*_balance fields of getwalletinfo output to shielded_*_balance + Fix grammar in error messages. + Ensure that the absolute path used in the test definitely does not exist. + Line-wrap addition to README.md + Minor additional OpenSSL scouring. + Avoid undefined behaviour in scriptnum tests. + Add assertions for CScriptNum[10] +/- int64_t to avoid the possibility of UB. + It's unnecessary to pass int64_t by const reference. + Cosmetics in CScriptNum code and tests. + Add logging when we receive an invalid note plaintext (using the "receiveunsafe" log category). + Fix a new warning about use of boost::bind placeholders after updating Boost. closes #4774 + Beef up the CoC to address use of dog-whistles. + Fix warnings surfaced by compiling with clang++. + Use the current time as the timestamp if we override a misc warning. + qa/zcash/full_test_suite.py: changes needed for macOS. fixes #4785 + qa/zcash/full_test_suite.py: print immediately if a test fails. + log(x)/log(2.0) can be written as log2(x). + Fix integer types in DisplayDuration. + Rename `time` to `duration` in `DisplayDuration`. + Update contrib/devtools/symbol-check.py + contrib/devtools/symbol-check.py: add info about Fedora-based distributions. + Comment and error message cleanups for transaction checks. + Add new copyright entries for build-aux/m4/ax_cxx_compile_stdcxx.m4 + Fix death gtests on macOS by switching to the threadsafe style. + Fix an error reporting bug in "Checksum missing or mismatched ..." + Rename the FS_ZIP214_ECC funding stream to FS_ZIP214_BP. See also https://github.com/zcash/zips/pull/412 . + Gitian builds: Remove manual CFLAGS and CXXFLAGS from descriptor. + +Dimitris Apostolou (5): + Remove reference to cargo-checksum.sh + Fix typos + Fix zeromq warning + Remove deprecated init.md + Remove Bitcoin release notes + +Dimitris Tsapakidis (1): + Fixed multiple typos + +Hennadii Stepanov (1): + Enable ShellCheck rules + +Jack Grigg (79): + Assorted small changes to the locked pool manager + wallet: Add ANY_TADDR special string to z_sendmany + Allow multiple nuparams options in config file + depends: Switch to `cargo vendor` for Rust dependencies + QA: Comment out Rust crate checks in updatecheck.py + depends: Ensure that SOURCES_PATH exists before vendoring crates + wallet: Ignore coinbase UTXOs with z_sendmany ANY_TADDR + rpc: Fix comma spacing in example z_sendmany commands + Squashed 'src/leveldb/' changes from 20ca81f08..a31c8aa40 + Squashed 'src/leveldb/' changes from a31c8aa40..196962ff0 + Squashed 'src/leveldb/' changes from 196962ff0..c521b3ac6 + Squashed 'src/leveldb/' changes from c521b3ac6..64052c76c + Squashed 'src/leveldb/' changes from 64052c76c..524b7e36a + Squashed 'src/leveldb/' changes from 524b7e36a..f545dfabf + depends: Remove cargo-checksum.sh + Replace libsodium's crypto_generichash_blake2b with blake2b_simd + blake2b: Allow consuming partial BLAKE2b output + tracing: Correctly override tracing::Span move constructors + build: Remove Rust staticlib naming workaround + depends: Update to latest config.guess & config.sub + build: out-of-tree fixups + leveldb: Assert that ssize_t is the same size as size_t on Windows + LockedPool: Fix LockedPool::free(nullptr) to be a no-op + LockedPool: Make Arena::free and LockedPool::free noexcept + allocators: Apply Allocator named requirements to secure_allocator::deallocate + depends: Update map of GCC canonical hosts to Rust targets + QA: Switch to x86_64-pc-linux-gnu for hard-coded Linux HOST + build: Switch to x86_64-pc-linux-gnu for codecov filtering + gitian: Switch from x86_64-unknown-linux-gnu to x86_64-linux-gnu + util: Remove OpenSSL multithreading infrastructure + Remove remaining OpenSSL references + QA: Remove OpenSSL from updatecheck.py + build: Remove a stray -lcrypto + Squashed 'src/secp256k1/' changes from 6ad5cdb42..8ab24e8da + build: Use the endomorphism optimization for secp256k1 + depends: libevent 2.1.12 + depends: ccache 3.7.11 + depends: googletest 1.8.1 + depends: utfcpp 3.1.2 + depends: Use correct HOST for download-linux target + QA: Fix backporting bugs in httpbasics.py + depends: Boost 1.74.0 + depends: ccache 3.7.12 + cargo update + depends: ZeroMQ 4.3.3 + FFI: Merge librustzcash_init_zksnark_params variants into one function + depends: Postpone current and scheduled Rust releases until 2021 + MOVEONLY: Move logging code from util.{h,cpp} to new files + depends: Add Clang 8.0.0 + depends: Use vendored Clang for native compilation + depends: Use vendored Clang for macOS cross-compilation + depends: Vendor LLD and use it for linking + depends: Add libc++ as a dependency + depends: Don't replace default CXXFLAGS in C++ dependencies + depends: Add multilib paths for Linux cross-compile + build: Statically link libc++ + build: Add missing LIBUNIVALUE to Makefile.bench.include LDADD + depends: Fix "unused variables" warning when compiling zeromq for Windows + depends: Rename Boost libraries to follow MinGW/GCC convention + depends: Fix boost::iostreams usage on Windows with libc++ + build: Compile secp256k1 with C99 + build: Add -lpthread to univalue test LDFLAGS + qa: Disable FORTIFY_SOURCE checks + QA: Add native_clang and libcxx to updatecheck.py + test: Fix various pyflakes warnings + doc: Add Clang and libc++ migration to release notes + build: Update AX_CXX_COMPILE_STDCXX macro + build: Require and build with C++ 17 + depends: Build C++ dependencies with C++ 17 + Switch from std::random_shuffle to std::shuffle + Squashed 'src/secp256k1/' changes from 8ab24e8da..c6b6b8f1b + build: Update secp256k1 configure flags + Improve reject reasons for unmet shielded requirements + Add logging to CCoinsViewCache::HaveShieldedRequirements + utils: Remove unnecessary GetTempPath() + Add txid to "shielded requirements not met" messages + test/lint: Check for working changes before checking scripted diffs + tests: Update chained_joinsplits test for HaveShieldedRequirements API change + scripted-diff: Remove BOOST_STATIC_ASSERT + +Jeffrey Czyz (2): + Fix compilation errors in support/lockedpool.cpp + Fix segfault in allocator_tests/arena_tests + +Jeremy Rubin (1): + Fix subscript[0] potential bugs in key.cpp + +John Newbery (1): + [docs] document scripted-diff + +Jonas Schnelli (2): + NotifyBlockTip signal: switch from hash (uint256) to CBlockIndex* + Move uiInterface.NotifyBlockTip signal above the core/wallet signal + +Kaz Wesley (3): + LockedPool: test handling of invalid allocations + LockedPool: fix explosion for illegal-sized alloc + LockedPool: avoid quadratic-time allocation + +Kris Nuttycombe (14): + Prevent creation of shielded transactions in initial block download. + Revert the move of the `getBalanceZaddr` block for ease of review. + Fix forward declaration. + Remove redundant CheckBlock calls. + Reduce diff complexity. + Apply style suggestions from code review + -ibdskiptxverification must imply -checkpoints + Apply suggestions from code review + Ensure conflicting flags are reported as an error. + Reject incompatible flags in "Step 2" + Rename IBDSkipTxVerification back to ShouldCheckTransaction + Fix command-line help for -ibdskiptxverification + Fix invocation of updatecheck.py in make-release.py + Replace invalid characters in log message decoding. + +Larry Ruane (4): + Flush witness data when consistent (part 2) + performance: auto params = CChainParams::GetConsensus() + allow getaddressutxos if -lightwalletd + add z_gettreestate rpc + +Luke Dashjr (2): + lockedpool: When possible, use madvise to avoid including sensitive information in core dumps + Add MIT license to Makefiles + +Marco Falke (3): + Limit scope of all global std::once_flag + Add extra LevelDB source to Makefile + test: Move linters to test/lint, add readme + +Martin Ankerl (2): + Use best-fit strategy in Arena, now O(log(n)) instead O(n) + fix nits: variable naming, typos + +Mustafa (2): + Add a source file for unit test utils. + Move GetTempPath() to testutil. + +Nate Wilcox (3): + Link the README.md to the specific readthedocs.io page for building on Debian/Ubuntu. + Convert a sed command to a static patch file. + depends: fix a logging bug for multi-archive packages. + +Nick (1): + [RPC] Add transaction size to JSON output + +Pavel Janík (2): + Do not shadow variable, use deprecated MAP_ANON if MAP_ANONYMOUS is not defined. + Do not include env_win.cc on non-Windows systems + +Pieter Wuille (2): + Remove some unused functions and methods + Fail on commit with VERIFY SCRIPT but no scripted-diff + +Sean Bowe (6): + Update Rust to 1.44.1. + cargo update + Update to latest zcash_* and zkcrypto crates. + Postpone clang and libc++ dependency updates until after the 4.1.0 release. + make-release.py: Versioning changes for 4.1.0. + make-release.py: Updated manpages for 4.1.0. + +Taylor Hornby (3): + Fix buffer overflows in P2PKH tests + Add a missing % to a string interpolation in rpc test framework + Fix undefined behavior in the test_bitcoin tests + +Thomas Snider (1): + [trivial] Switched constants to sizeof() + +Vasil Dimov (1): + lockedpool: avoid sensitive data in core files (FreeBSD) + +Wladimir J. van der Laan (19): + wallet: Change CCrypter to use vectors with secure allocator + wallet: Get rid of LockObject and UnlockObject calls in key.h + support: Add LockedPool + rpc: Add `getmemoryinfo` call + bench: Add benchmark for lockedpool allocation/deallocation + http: Restrict maximum size of request line + headers + Replace scriptnum_test's normative ScriptNum implementation + build: remove libcrypto as internal dependency in libbitcoinconsensus.pc + http: Do a pending c++11 simplification + http: Add log message when work queue is full + http: Change boost::scoped_ptr to std::unique_ptr in HTTPRequest + http: use std::move to move HTTPRequest into HTTPWorkItem + Add fs.cpp/h + Replace includes of boost/filesystem.h with fs.h + Replace uses of boost::filesystem with fs + Use fsbridge for fopen and freopen + torcontrol: Use fs::path instead of std::string for private key path + Remove `namespace fs=fs` + test: Mention commit id in scripted diff error + +fanquake (8): + build: remove SSL lib detection + build: remove OpenSSL detection and libs + depends: remove OpenSSL package + doc: remove OpenSSL from build instructions and licensing info + depends: Disable unused ZeroMQ features + depends: zeromq: disable draft classes and methods + build: only pass --disable-dependency-tracking to packages that understand it + build: pass --enable-option-checking to applicable packages + +mruddy (1): + [depends, zmq, doc] avoid deprecated zeromq api functions + +practicalswift (7): + Fix out-of-bounds write in case of failing mmap(...) in PosixLockedPageAllocator::AllocateLocked + Improve readability by removing redundant casts to same type (on all platforms) + tests: Remove OldSetKeyFromPassphrase/OldEncrypt/OldDecrypt + Remove unused Boost includes + Add "export LC_ALL=C" to all shell scripts + Add error handling: exit if cd fails + Use bash instead of POSIX sh. POSIX sh does not support arrays. + +Jack Grigg (9): + Update license headers + leveldb: Fix typo + LockedPool: Switch to HTTPS URLs in licenses and comments + test: Fix LFSR period in comments + httpserver: Code style cleanups + depends: Update packages documentation for Zcash + depends: Add untested note to FreeBSD host + Update example scripted-diff comit in doc/developer-notes.md + Use HTTPS in script license headers + +syd (1): + Add assert_raises_message to the python test framework. + +Ying Tong Lai (11): + Add funding stream addresses to getblocksubsidy RPC output + Fix CScript encoding + Handle shielded address case + Minor cleanups + Only return address instead of CScript + Remove void declaration of ScriptPubKeyToJSON() + Postpone native_ccache 4.0 + make-release.py: Versioning changes for 4.1.0-rc1. + make-release.py: Updated manpages for 4.1.0-rc1. + make-release.py: Updated release notes and changelog for 4.1.0-rc1. + Update release-notes-4.1.0-rc1.md + +ying tong (1): + Apply suggestions from code review + +Benjamin Winston (1): + Postponed dependency updates, refer to core team sync meeting. diff --git a/doc/release-notes/release-notes-4.1.1.md b/doc/release-notes/release-notes-4.1.1.md new file mode 100644 index 000000000..46793955d --- /dev/null +++ b/doc/release-notes/release-notes-4.1.1.md @@ -0,0 +1,156 @@ +Notable changes +=============== + +Optimize release build +---------------------- +The release build now sets CLAGS/CXXFLAGS to use the -O3 optimization +option, which turns on more optimization flags than the previously used +-O1. This produces a faster build, addressing a performance regression in +v4.1.0. + +Correctly report Founders' Reward amount in `getblocktemplate` +-------------------------------------------------------------- +This release correctly returns the `foundersreward` field from `getblocktemplate` +output pre-Canopy and removes the field post-Canopy. (The Founders' Reward will +expire exactly as Canopy activates, as specified in [ZIP 207](https://zips.z.cash/zip-0207).) +To obtain information about funding stream amounts, use `getblocksubsidy HEIGHT`, +passing in the height returned by the `getblocktemplate` API. + +Changelog +========= + +Akio Nakamura (1): + [script] lint-whitespace: improve print linenumber + +Alfredo Garcia (1): + add myblockhash parameter to getrawtransaction + +Daira Hopwood (3): + Wording improvements to getrawtransaction RPC documentation + GetNextWorkRequired: clarify why this computation is equivalent to that in the protocol spec. refs https://github.com/zcash/zips/pull/418 + Set release CFLAGS/CXXFLAGS to use -O3. + +Dan Raviv (1): + Fix header guards using reserved identifiers + +DesWurstes (1): + Obsolete #!/bin/bash shebang + +Evan Klitzke (1): + Add a lint check for trailing whitespace. + +Jack Grigg (14): + lints: Use Zcash-specific include guards for new files + lints: Update expected Boost imports + lints: Match `export LC_ALL="C"` in lint-shell-locale + test: Fix pyflakes warning in bitcoin-util-test.py + lint: Fix missing or inconsistent include guards + lint: Fix duplicate includes + python: Explicitly set encoding to utf8 when opening text files + lint: Use consistent shebangs + lint: Opt out of locale dependence in Zcash shell scripts + lint: Re-exclude subtrees from lint-include-guards.sh + lint: Apply include guard style to src/rust/include + lint: s/trim/lenTrim in src/crypto/equihash.[cpp,h] + lint: Fix minor shellcheck lints + cargo update + +John Newbery (4): + [contrib] convert test-security-check to python3 + Clean up bctest.py and bitcoin-util-test.py + Improve logging in bctest.py if there is a formatting mismatch + [linter] Strip trailing / in path for git-subtree-check + +João Barbosa (1): + qa: Ignore shellcheck warning SC2236 + +Julian Fleischer (3): + fix locale for lint-shell + use export LC_ALL=C.UTF-8 + Run all lint scripts + +Kris Nuttycombe (6): + Change order of checks to skip IsInitialBlockDownload check if flag is unset. + Correctly report founder's reward amount in getblocktemplate prior to Canopy + Document how to get block subsidy information in getblocktemplate. + Update getblocktemplate documentation. + make-release.py: Versioning changes for 4.1.1. + make-release.py: Updated manpages for 4.1.1. + +Kristaps Kaupe (1): + Make lint-includes.sh work from any directory + +Marco Falke (4): + devtools: Exclude patches from lint-whitespace + Refine travis check for duplicate includes + test: Move linters to test/lint, add readme + Revert "Remove unused variable in shell script" + +MeshCollider (1): + Add tab char lint check and exclude imported dependencies + +Philip Kaufmann (1): + [Trivial] ensure minimal header conventions + +Pieter Wuille (1): + Improve git-subtree-check.sh + +Sjors Provoost (3): + [scripts] lint-whitespace: use perl instead of grep -P + [scripts] lint-whitespace: check last N commits or unstaged changes + doc: improve subtree check instructions + +Vidar Holen (1): + refactor/lint: Add ignored suggestions to an array + +Wladimir J. van der Laan (4): + contrib: Ignore historical release notes for whitespace check + test: Add format-dependent comparison to bctest + test: Explicitly set encoding to utf8 when opening text files + uint256: replace sprintf with HexStr and reverse-iterator + +adityapk00 (1): + Don't compile ehHashState::* if mining is disabled + +isle2983 (1): + [copyright] add MIT license headers to .sh scripts where missing + +jnewbery (5): + Add bitcoin-tx JSON tests + Add option to run bitcoin-util-test.py manually + bitcoin-util-test.py should fail if the output file is empty + add verbose mode to bitcoin-util-test.py + Add logging to bitcoin-util-test.py + +practicalswift (20): + Document include guard convention + Fix missing or inconsistent include guards + Add lint-include-guards.sh which checks include guard consistency + Add Travis check for duplicate includes + Add shell script linting: Check for shellcheck warnings in shell scripts + add lint tool to check python3 shebang + build: Guard against accidental introduction of new Boost dependencies + build: Add linter for checking accidental locale dependence + docs: Mention lint-locale-dependence.sh in developer-notes.md + Add "export LC_ALL=C" to all shell scripts + Add linter: Make sure all shell scripts opt out of locale dependence using "export LC_ALL=C" + Explicitly specify encoding when opening text files in Python code + Add linter: Make sure we explicitly open all text files using UTF-8 or ASCII encoding in Python + macOS fix: Work around empty (sub)expression error when using BSD grep + macOS fix: Add excludes for checks added in the newer shellcheck version installed by brew + Remove repeated suppression. Fix indentation. + Fix warnings introduced in shellcheck v0.6.0 + Remove no longer needed shellcheck suppressions + Follow-up to #13454: Fix broken build by exporting LC_ALL=C + Remove unused variables in shell scripts. + +Jack Grigg (5): + Small documentation fixes + lints: Add a missing copyright header + lint: Allow stoi in src/rpc/blockchain.cpp + lint: Remove some subtrees from exclusion + doc: Adjust subtree developer notes to refer to Zcash + +vim88 (1): + Scripts and tools & Docs: Used #!/usr/bin/env bash instead of obsolete #!/bin/bash, added linting for .sh files shebang and updated the Developer Notes. + diff --git a/doc/release-notes/release-notes-4.2.0-rc1.md b/doc/release-notes/release-notes-4.2.0-rc1.md new file mode 100644 index 000000000..f8d721111 --- /dev/null +++ b/doc/release-notes/release-notes-4.2.0-rc1.md @@ -0,0 +1,242 @@ +Notable changes +=============== + +Switch to ed25519-zebra for consensus signature checks +------------------------------------------------------ +This removes the zcashd dependency upon libsodium for ed25519 +signature checks and instead uses the Rust implementation in +ed25519-zebra, which has been active for signature verification +since the Canopy upgrade. For more information on the conditions +that led to this change see https://hdevalence.ca/blog/2020-10-04-its-25519am + +Update default fees according to ZIP-313 +---------------------------------------- +Reduce default fees to 0.00001 ZEC as specified in ZIP-313 and +ensure that transactions paying at least the new minimum fee meet +the transaction relay threshold irrespective of transaction size. + +Improve getblocktemplate rpc performance when using shielded coinbase +--------------------------------------------------------------------- +This change precomputes future block templates to permit miners to +begin working atop newly arrived blocks as quickly as possible, rather +than waiting for a new template to be generated after a block has arrived. +It also reduces the initial the wait time for incorporating new mempool +transactions into a block from 1 minute to 10 seconds; the previous value +was inherited from the upstream bitcoin codebase but is inappropriate for +our block timing. + +Migrate from rpc-tests.sh to rpc-tests.py +----------------------------------------- +This unifies and simplifies the RPC testing framework, as has +been done in the upstream Bitcoin codebase. + +Changelog +========= + +Alex Morcos (2): + Reorder RPC tests for running time + remove obsolete run-bitcoind-for-test.sh + +Alfredo Garcia (1): + add address to z_importviewingkey error + +Casey Rodarmor (1): + Add p2p-fullblocktest.py + +Chun Kuan Lee (2): + gui: get special folder in unicode + refactor: Drop boost::this_thread::interruption_point and boost::thread_interrupted in main thread + +Cory Fields (1): + build: a few ugly hacks to get the rpc tests working out-of-tree + +Daira Hopwood (5): + Windows cross-build generates .lib files, which should be ignored by git and removed by clean. + Partial revert of "Update links". See #4904 + Fix a typo introduced in #4904. + Reduce the default fee for z_* operations, and the "low fee penalty" threshold for mempool limiting, to 1000 zatoshis. + Always allow transactions paying at least DEFAULT_FEE to be relayed, and do not rate-limit them. In other words, make sure that the "minimum relay fee" is no greater than DEFAULT_FEE. + +Daniel Kraft (1): + Fix crash when mining with empty keypool. + +Dimitris Apostolou (5): + Fix typo + readelf is Linux only + Fix readelf configuration + Update links + Remove workaround affecting old Boost version + +Elliot Olds (1): + Check if zmq is installed in tests, update docs + +Eric Lombrozo (1): + Added fPowNoRetargeting field to Consensus::Params that disables nBits recalculation. + +Jack Grigg (32): + test: Use default shielded address in RPC tests where the type is irrelevant + Revert "remove SignatureHash from python rpc tests" + test: Remove FindAndDelete from RPC test framework + test: Fix SignatureHash RPC test helper + test: Set hashFinalSaplingRoot default correctly in create_block + test: Re-enable regtest difficulty adjustment for unit tests that use it + test: Adjust some Zcash RPC tests to work with parallel runner + test: Run rpc-tests.py in full_test_suite.py + lint: Remove boost/foreach.hpp from allowed includes + test: Silence pyflakes unused import warning + test: Run shielding-heavy RPC tests in serial + Fix Hungarian notation nit from Daira + Switch to ed25519-zebra for consensus signature checks + test: Use ed25519_verify in ConsensusTests + Update minimum chain work and set activation block hashes for mainnet + Update minimum chain work and set activation block hashes for testnet + net: Rework CNode spans + rpc: Reload CNode spans after reloading the log filter + rpc: Log the new filter when we set it + mempool: Log all accepted txids at INFO level + Add header to files that will need it + scripted-diff: Migrate from boost::variant to std::variant + Finish migrating to std::variant + Migrate from boost::optional::get to boost::optional::value + Add header to files that will need it + scripted-diff: Migrate from boost::optional to std::optional + Finish migrating to std::optional + lint: Remove boost::variant and boost::optional from allowed includes + test: Fix test_bitcoin compilation on macOS High Sierra + cargo update + tracing: Remove unnecessary tracing_init_inner internal function + tracing: Simplify init logic using optional layers + +James O'Beirne (2): + Add tests for gettxoutsetinfo, CLevelDBBatch, CLevelDBIterator + Add basic coverage reporting for RPC tests + +Jeff Garzik (1): + qa/pull-tester/rpc-tests.py: chmod 0755 + +Jesse Cohen (1): + [doc][trivial] no retargeting in regtest mode + +John Newbery (6): + Use configparser in rpc-tests.py + Use argparse in rpc_tests.py + Improve rpc-tests.py arguments + Refactor rpc-tests.py + Various review markups for rpc-tests.py improvements + Add exclude option to rpc-tests.py + +Jorge Timón (8): + Small preparations for Q_FOREACH, PAIRTYPE and #include removal + scripted-diff: Fully remove BOOST_FOREACH + scripted-diff: Remove PAIRTYPE + Introduce src/reverse_iterator.hpp and include it... + Fix const_reverse_iterator constructor (pass const ptr) + scripted-diff: Remove BOOST_REVERSE_FOREACH + scripted-diff: Remove #include + clang-format: Delete ForEachMacros + +Josh Ellithorpe (1): + Include transaction hex in verbose getblock output + +Kris Nuttycombe (7): + Write down the folklore about nSequence + Prefer explicit passing of CChainParams to the Params() global. + Remove vestigial OSX_SDK_VERSION from darwin build. + Update boost to 1.75, postpone other updates. + Don't log to stdout if a file logger is configured. + make-release.py: Versioning changes for 4.2.0-rc1. + make-release.py: Updated manpages for 4.2.0-rc1. + +Larry Ruane (2): + add more version information to getinfo rpc + improve getblocktemplate performance for shielded coinbase + +Luv Khemani (1): + Add autocomplete to bitcoin-qt's console window. + +Marco Falke (37): + [doc] trivial: fix markdown syntax in qa/rpc-tests/README.md + [rpc-tests] fundrawtransaction: Update fee after minRelayTxFee increase + [rpc-tests] Check return code + [qa] Split README.md to /qa and /qa/rpc-tests + [qa] Extend README.md + [qa] keypool: Fix white space to prepare transition to test framework + [qa] keypool: DRY: Use test framework + [qa] pull-tester: Cleanup (run keypool, tidy stdout) + [qa] Use python2/3 syntax + [qa] rpc-tests: Properly use integers, floats + [qa] mininode: Catch exceptions in got_data + [qa] pull-tester: Don't mute zmq ImportError + [qa] pull-tester: Exit early when no tests are run + [qa] rpc-tests: Fix link in comment and label error msg + [qa] Switch to py3 + [qa] Refactor test_framework and pull tester + [qa] Update README.md + [qa] Stop other nodes, even when one fails to stop + [qa] pull-tester: Adjust comment + [qa] pull-tester: Run rpc test in parallel + [qa] Add option --portseed to test_framework + [qa] Remove hardcoded "4 nodes" from test_framework + [qa] test_framework: Append portseed to tmpdir + [qa] test_framework: Use different rpc_auth_pair for each node + [qa] pull-tester: Fix assertion and check for run_parallel + [qa] pull-tester: Start longest test first + [qa] Adjust timeouts for micro-optimization of run time + [qa] Use single cache dir for chains + [qa] Remove unused code + [qa] pull-tester: Don't mute zmq ImportError + [qa] create_cache: Delete temp dir when done + [qa] Refactor RPCTestHandler to prevent TimeoutExpired + [qa] pull-tester: Only print output when failed + [qa] test_framework: Exit when tmpdir exists + [qa] rpc-tests: Apply random offset to portseed + qa: Set correct path for binaries in rpc tests + util: Replace boost::signals2 with std::function + +Nate Wilcox (1): + configure.ac: Introduce macros to simplify requiring tools. + +Suhas Daftuar (2): + Remove unmaintained example test script_test.py + Tests: add timeout to sync_blocks() and sync_mempools() + +Wladimir J. van der Laan (2): + build: don't distribute tests_config.py + test: don't override BITCOIND and BITCOINCLI if they're set + +fanquake (4): + [doc] Add OS X ZMQ requirement to QA readme + [trivial] Add tests_config.ini to .gitignore + [qa][doc] Correct rpc test options in readme + build: set minimum supported macOS to 10.14 + +furszy (15): + wallet:AvailableCoins fOnlySpendable filtering flag implemented + connected to sendmany async operation. + wallet:AvailableCoins nMinDepth filter implemented + connected to sendmany async operation. + asyncrpcoperation_sendmany::find_utxos removing a redundant coinbase check, coinbases are already being filtered by the AvailableCoins flag. + wallet:AvailableCoins filter by destination/s feature implemented + connected to sendmany async operation. + sendmany::find_utxo removing an unneeded recursive lock, AvailableCoins is already locking cs_main and cs_wallet. + wallet:COutput adding fIsCoinbase member. + COutput: implemented Value() method. + asyncRPCOperation_sendmany:find_utxos, removing a redundant loop over all of the available utxo in the wallet. + sendmany: removing now unused SendManyInputUTXO class. + move-only: asyncOp_sendmany, target amount calculation moved before find inputs (utxos and notes). + sendmany operation: Creating TxValues struct to store the transaction values in a more organized manner. + Improving asyncoperation_sendmany, removing another redundant for loop over all of the available utxos. + rpc_wallet_tests: changed "Insufficient funds" error message to a proper "Insufficient transparent funds". This is because we are now throwing the insufficient transparent balance rpc error inside load_utxo. + asyncOp sendmany: moved inputs total amount check inside load_utxo before the dust validation. + sendmany::find_unspent_notes removing an unneeded recursive lock, GetFilteredNotes is already locking cs_main and cs_wallet. + +isle2983 (1): + [doc] - clarify statement about parallel jobs in rpc-tests.py + +Marshall Gaucher (1): + Update expected fails for Sprout txns flows on Canopy + +ptschip (1): + Migrated rpc-tests.sh to all python rpc-tests.py + +whythat (2): + [qa]: add parsing for ':' argument form to rpc_url() + [qa]: enable rpcbind_test + diff --git a/doc/release-notes/release-notes-4.2.0.md b/doc/release-notes/release-notes-4.2.0.md new file mode 100644 index 000000000..aa7ed583f --- /dev/null +++ b/doc/release-notes/release-notes-4.2.0.md @@ -0,0 +1,247 @@ +Notable changes +=============== + +Switch to ed25519-zebra for consensus signature checks +------------------------------------------------------ +This removes the zcashd dependency upon libsodium for ed25519 +signature checks and instead uses the Rust implementation in +ed25519-zebra, which has been active for signature verification +since the Canopy upgrade. For more information on the conditions +that led to this change see https://hdevalence.ca/blog/2020-10-04-its-25519am + +Update default fees according to ZIP-313 +---------------------------------------- +Reduce default fees to 0.00001 ZEC as specified in ZIP-313 and +ensure that transactions paying at least the new minimum fee meet +the transaction relay threshold irrespective of transaction size. + +Improve getblocktemplate rpc performance when using shielded coinbase +--------------------------------------------------------------------- +This change precomputes future block templates to permit miners to +begin working atop newly arrived blocks as quickly as possible, rather +than waiting for a new template to be generated after a block has arrived. +It also reduces the initial the wait time for incorporating new mempool +transactions into a block from 1 minute to 10 seconds; the previous value +was inherited from the upstream bitcoin codebase but is inappropriate for +our block timing. + +Migrate from rpc-tests.sh to rpc-tests.py +----------------------------------------- +This unifies and simplifies the RPC testing framework, as has +been done in the upstream Bitcoin codebase. + +Changelog +========= + +Alex Morcos (2): + Reorder RPC tests for running time + remove obsolete run-bitcoind-for-test.sh + +Alfredo Garcia (1): + add address to z_importviewingkey error + +Casey Rodarmor (1): + Add p2p-fullblocktest.py + +Chun Kuan Lee (2): + gui: get special folder in unicode + refactor: Drop boost::this_thread::interruption_point and boost::thread_interrupted in main thread + +Cory Fields (1): + build: a few ugly hacks to get the rpc tests working out-of-tree + +Daira Hopwood (7): + Windows cross-build generates .lib files, which should be ignored by git and removed by clean. + Partial revert of "Update links". See #4904 + Fix a typo introduced in #4904. + Reduce the default fee for z_* operations, and the "low fee penalty" threshold for mempool limiting, to 1000 zatoshis. + Always allow transactions paying at least DEFAULT_FEE to be relayed, and do not rate-limit them. In other words, make sure that the "minimum relay fee" is no greater than DEFAULT_FEE. + gtest/test_mempoollimit: the test failed to properly ensure that the "low fee penalty" threshold matches the new ZIP 313 fee. + Revert changes in #4916 that assumed arguments represent fees, when they are actually number of confirmations. + +Daniel Kraft (1): + Fix crash when mining with empty keypool. + +Dimitris Apostolou (5): + Fix typo + readelf is Linux only + Fix readelf configuration + Update links + Remove workaround affecting old Boost version + +Elliot Olds (1): + Check if zmq is installed in tests, update docs + +Eric Lombrozo (1): + Added fPowNoRetargeting field to Consensus::Params that disables nBits recalculation. + +Jack Grigg (32): + test: Use default shielded address in RPC tests where the type is irrelevant + Revert "remove SignatureHash from python rpc tests" + test: Remove FindAndDelete from RPC test framework + test: Fix SignatureHash RPC test helper + test: Set hashFinalSaplingRoot default correctly in create_block + test: Re-enable regtest difficulty adjustment for unit tests that use it + test: Adjust some Zcash RPC tests to work with parallel runner + test: Run rpc-tests.py in full_test_suite.py + lint: Remove boost/foreach.hpp from allowed includes + test: Silence pyflakes unused import warning + test: Run shielding-heavy RPC tests in serial + Fix Hungarian notation nit from Daira + Switch to ed25519-zebra for consensus signature checks + test: Use ed25519_verify in ConsensusTests + Update minimum chain work and set activation block hashes for mainnet + Update minimum chain work and set activation block hashes for testnet + net: Rework CNode spans + rpc: Reload CNode spans after reloading the log filter + rpc: Log the new filter when we set it + mempool: Log all accepted txids at INFO level + Add header to files that will need it + scripted-diff: Migrate from boost::variant to std::variant + Finish migrating to std::variant + Migrate from boost::optional::get to boost::optional::value + Add header to files that will need it + scripted-diff: Migrate from boost::optional to std::optional + Finish migrating to std::optional + lint: Remove boost::variant and boost::optional from allowed includes + test: Fix test_bitcoin compilation on macOS High Sierra + cargo update + tracing: Remove unnecessary tracing_init_inner internal function + tracing: Simplify init logic using optional layers + +James O'Beirne (2): + Add tests for gettxoutsetinfo, CLevelDBBatch, CLevelDBIterator + Add basic coverage reporting for RPC tests + +Jeff Garzik (1): + qa/pull-tester/rpc-tests.py: chmod 0755 + +Jesse Cohen (1): + [doc][trivial] no retargeting in regtest mode + +John Newbery (6): + Use configparser in rpc-tests.py + Use argparse in rpc_tests.py + Improve rpc-tests.py arguments + Refactor rpc-tests.py + Various review markups for rpc-tests.py improvements + Add exclude option to rpc-tests.py + +Jorge Timón (8): + Small preparations for Q_FOREACH, PAIRTYPE and #include removal + scripted-diff: Fully remove BOOST_FOREACH + scripted-diff: Remove PAIRTYPE + Introduce src/reverse_iterator.hpp and include it... + Fix const_reverse_iterator constructor (pass const ptr) + scripted-diff: Remove BOOST_REVERSE_FOREACH + scripted-diff: Remove #include + clang-format: Delete ForEachMacros + +Josh Ellithorpe (1): + Include transaction hex in verbose getblock output + +Kris Nuttycombe (10): + Write down the folklore about nSequence + Prefer explicit passing of CChainParams to the Params() global. + Remove vestigial OSX_SDK_VERSION from darwin build. + Update boost to 1.75, postpone other updates. + Don't log to stdout if a file logger is configured. + make-release.py: Versioning changes for 4.2.0-rc1. + make-release.py: Updated manpages for 4.2.0-rc1. + make-release.py: Updated release notes and changelog for 4.2.0-rc1. + make-release.py: Versioning changes for 4.2.0. + make-release.py: Updated manpages for 4.2.0. + +Larry Ruane (2): + add more version information to getinfo rpc + improve getblocktemplate performance for shielded coinbase + +Luv Khemani (1): + Add autocomplete to bitcoin-qt's console window. + +Marco Falke (37): + [doc] trivial: fix markdown syntax in qa/rpc-tests/README.md + [rpc-tests] fundrawtransaction: Update fee after minRelayTxFee increase + [rpc-tests] Check return code + [qa] Split README.md to /qa and /qa/rpc-tests + [qa] Extend README.md + [qa] keypool: Fix white space to prepare transition to test framework + [qa] keypool: DRY: Use test framework + [qa] pull-tester: Cleanup (run keypool, tidy stdout) + [qa] Use python2/3 syntax + [qa] rpc-tests: Properly use integers, floats + [qa] mininode: Catch exceptions in got_data + [qa] pull-tester: Don't mute zmq ImportError + [qa] pull-tester: Exit early when no tests are run + [qa] rpc-tests: Fix link in comment and label error msg + [qa] Switch to py3 + [qa] Refactor test_framework and pull tester + [qa] Update README.md + [qa] Stop other nodes, even when one fails to stop + [qa] pull-tester: Adjust comment + [qa] pull-tester: Run rpc test in parallel + [qa] Add option --portseed to test_framework + [qa] Remove hardcoded "4 nodes" from test_framework + [qa] test_framework: Append portseed to tmpdir + [qa] test_framework: Use different rpc_auth_pair for each node + [qa] pull-tester: Fix assertion and check for run_parallel + [qa] pull-tester: Start longest test first + [qa] Adjust timeouts for micro-optimization of run time + [qa] Use single cache dir for chains + [qa] Remove unused code + [qa] pull-tester: Don't mute zmq ImportError + [qa] create_cache: Delete temp dir when done + [qa] Refactor RPCTestHandler to prevent TimeoutExpired + [qa] pull-tester: Only print output when failed + [qa] test_framework: Exit when tmpdir exists + [qa] rpc-tests: Apply random offset to portseed + qa: Set correct path for binaries in rpc tests + util: Replace boost::signals2 with std::function + +Nate Wilcox (1): + configure.ac: Introduce macros to simplify requiring tools. + +Suhas Daftuar (2): + Remove unmaintained example test script_test.py + Tests: add timeout to sync_blocks() and sync_mempools() + +Wladimir J. van der Laan (2): + build: don't distribute tests_config.py + test: don't override BITCOIND and BITCOINCLI if they're set + +fanquake (4): + [doc] Add OS X ZMQ requirement to QA readme + [trivial] Add tests_config.ini to .gitignore + [qa][doc] Correct rpc test options in readme + build: set minimum supported macOS to 10.14 + +furszy (15): + wallet:AvailableCoins fOnlySpendable filtering flag implemented + connected to sendmany async operation. + wallet:AvailableCoins nMinDepth filter implemented + connected to sendmany async operation. + asyncrpcoperation_sendmany::find_utxos removing a redundant coinbase check, coinbases are already being filtered by the AvailableCoins flag. + wallet:AvailableCoins filter by destination/s feature implemented + connected to sendmany async operation. + sendmany::find_utxo removing an unneeded recursive lock, AvailableCoins is already locking cs_main and cs_wallet. + wallet:COutput adding fIsCoinbase member. + COutput: implemented Value() method. + asyncRPCOperation_sendmany:find_utxos, removing a redundant loop over all of the available utxo in the wallet. + sendmany: removing now unused SendManyInputUTXO class. + move-only: asyncOp_sendmany, target amount calculation moved before find inputs (utxos and notes). + sendmany operation: Creating TxValues struct to store the transaction values in a more organized manner. + Improving asyncoperation_sendmany, removing another redundant for loop over all of the available utxos. + rpc_wallet_tests: changed "Insufficient funds" error message to a proper "Insufficient transparent funds". This is because we are now throwing the insufficient transparent balance rpc error inside load_utxo. + asyncOp sendmany: moved inputs total amount check inside load_utxo before the dust validation. + sendmany::find_unspent_notes removing an unneeded recursive lock, GetFilteredNotes is already locking cs_main and cs_wallet. + +isle2983 (1): + [doc] - clarify statement about parallel jobs in rpc-tests.py + +Marshall Gaucher (1): + Update expected fails for Sprout txns flows on Canopy + +ptschip (1): + Migrated rpc-tests.sh to all python rpc-tests.py + +whythat (2): + [qa]: add parsing for ':' argument form to rpc_url() + [qa]: enable rpcbind_test + diff --git a/doc/release-notes/release-notes-4.3.0-rc1.md b/doc/release-notes/release-notes-4.3.0-rc1.md new file mode 100644 index 000000000..bb43600e5 --- /dev/null +++ b/doc/release-notes/release-notes-4.3.0-rc1.md @@ -0,0 +1,320 @@ +Notable changes +=============== + +Reduce download traffic +----------------------- + +We have made several changes to reduce the amount of data downloaded by `zcashd` +during initial block download (IBD): + +- Significant time and bandwidth is spent in issuing `getheaders` P2P requests. + This results in noticeable bandwidth usage due to the large size of Zcash + block headers. + + We now eliminate redundant requests in cases where we already know the last + header in the message. This optimization is enabled by default, but can be + disabled by setting the config option `-no-optimize-getheaders`. + +- Transactions in the mempool are no longer downloaded during IBD (`zcashd` will + only request block data). + +Reduce upload traffic +--------------------- + +A major part of the outbound traffic is caused by serving historic blocks to +other nodes in initial block download state. + +It is now possible to reduce the total upload traffic via the `-maxuploadtarget` +parameter. This is *not* a hard limit but a threshold to minimize the outbound +traffic. When the limit is about to be reached, the uploaded data is cut by not +serving historic blocks (blocks older than one week). +Moreover, any SPV peer is disconnected when they request a filtered block. + +This option can be specified in MiB per day and is turned off by default +(`-maxuploadtarget=0`). +The recommended minimum is 1152 * MAX_BLOCK_SIZE (currently 2304MB) per day. + +Whitelisted peers will never be disconnected, although their traffic counts for +calculating the target. + +A more detailed documentation about keeping traffic low can be found in +[/doc/reduce-traffic.md](/doc/reduce-traffic.md). + +`libzcashconsensus` replaced by `libzcash_script` +------------------------------------------------- + +The `libzcashconsensus` library inherited from upstream has been unusable since +the Overwinter network upgrade in 2018. We made changes to signature digests +similar to those made in Bitcoin's SegWit, which required additional per-input +data that could not be added to the existing APIs without breaking backwards +compatibility. + +Additionally, it has become increasingly inaccurately named; it only covers +(Zcash's subset of) the Bitcoin scripting system, and not the myriad of other +consensus changes: in particular, Zcash's shielded pools. + +We have now renamed the library to `libzcash_script`, and reworked it to instead +focus on transparent script verification: + +- The script verification APIs are altered to take `consensusBranchId` and + `amount` fields. +- New precomputing APIs have been added that enable multiple transparent inputs + on a single transaction to be verified more efficiently. +- Equihash has been removed from the compiled library. The canonical Equihash + validator is the [`equihash` Rust crate](https://crates.io/crates/equihash) + since v3.1.0. + +The C++ library can be built by compiling `zcashd` with the environment variable +`CONFIGURE_FLAGS=--with-libs`. It is also wrapped as the +[`zcash_script` Rust crate](https://crates.io/crates/zcash_script) +(maintained by the Zcash Foundation for use in `zebrad`). + +Other P2P Changes +----------------- + +The list of banned peers is now stored on disk rather than in memory. Restarting +`zcashd` will no longer clear out the list of banned peers; instead the +`clearbanned` RPC call can be used to manually clear the list. The `setban` RPC +call can also be used to manually ban or unban a peer. + +Build system updates +-------------------- + +- We now build with Clang 11 and Rust 1.49. +- We have downgraded Boost to 1.74 to mitigate `statx`-related breakage in some + container environments. + +Changelog +========= + +Alex Wied (3): + Add support for FreeBSD 12 + Set rust_target for all FreeBSD versions + Use parentheses for defined in windows-unused-variables.diff + +Alfredo Garcia (3): + split wallet.py tests + hide password in -stdin `walletpassphrase` command + Apply suggestions from code review + +Bernhard M. Wiedemann (1): + Make tests pass after 2020 + +BtcDrak (1): + Remove bad chain alert partition check + +Carl Dong (13): + build: Add variable printing target to Makefiles + depends: Propagate well-known vars into depends + depends: boost: Specify toolset to bootstrap.sh + depends: boost: Split target-os from toolset + depends: boost: Use clang toolset if clang in CXX + depends: Propagate only specific CLI variables to sub-makes + depends: boost: Refer to version in URL + depends: boost: Split into non-/native packages + depends: boost: Disable all compression + depends: boost: Cleanup architecture/address-model + depends: boost: Cleanup toolset selection + depends: boost: Remove unnecessary _archiver_ + depends: boost: Specify cflags+compileflags + +Casey Rodarmor (3): + Make limited map actually respect max size + Disallow unlimited limited maps + Add limitedmap test + +Cory Fields (6): + depends: fix boost mac cross build with clang 9+ + build: add missing leveldb defines + net: make Ban/Unban/ClearBan functionality consistent + net: No need to export DumpBanlist + net: move CBanDB and CAddrDB out of net.h/cpp + net: Drop CNodeRef for AttemptToEvictConnection + +Daira Hopwood (2): + qa/zcash/updatecheck.py: remove dead code; print instructions to run `cargo outdated` and `cargo update`. + Ensure that `CONFIGURE_FLAGS=--enable-debug` correctly uses -O0 for dependencies and main build. + +Daniel Kraft (1): + doc: add comment explaining initial header request + +Dimitris Apostolou (1): + Discord invite instead of direct link + +Ethan Heilman (1): + Fix de-serialization bug where AddrMan is corrupted after exception * CAddrDB modified so that when de-serialization code throws an exception Addrman is reset to a clean state * CAddrDB modified to make unit tests possible * Regression test created to ensure bug is fixed * StartNode modifed to clear adrman if CAddrDB::Read returns an error code. + +Gregory Maxwell (2): + Return early in IsBanned. + Disconnect on mempool requests from peers when over the upload limit. + +Igor Cota (1): + Define TARGET_OS when host is android + +Jack Grigg (41): + Add JSDescriptionInfo for constructing JSDescriptions + Remove JSDescription::h_sig + prevector: Terminate without logging on failed allocation + Remove init_and_check_sodium from crypto/common.h + Store inputs and outputs by reference in JSDescriptionInfo + depends: Update Rust to 1.49.0 + rust: Use renamed broken_intra_doc_links lint + depends: cargo update + depends: Move to Clang 11 + depends: Fix Boost warnings under Clang 11 + depends: Allow per-host package download paths + depends: Ensure the native_clang download path is for the builder + Revert "Update boost to 1.75, postpone other updates." + qa: Postpone Boost and native_b2 updates + QA: Remove unused update postponements + QA: Postpone BDB update again + depends: ZeroMQ 4.3.4 + depends: Postpone updates that require adding CMake + cargo update + Squashed 'src/univalue/' changes from 9ef5b78c1..98fadc090 + Remove crypto/equihash from libzcashconsensus + Add amount and consensus branch ID to zcashconsensus_verify_script + Rename src/script/zcashconsensus.* -> src/script/zcash_script.* + Rename zcashconsensus_* -> zcash_script_* in APIs + Rename libzcashconsensus.la -> libzcash_script.la + Set up an mdbook in which we can document zcashd's architecture design + Actions: Add a workflow to deploy the zcashd book + Show README as root of zcashd book + Link to zips.z.cash for protocol spec + test: Convert Bech32 test vectors into known-answer test vectors + zcash_script: Add API to verify scripts with precomputed tx data + test: Migrate maxuploadtarget.py to Python 3 + Pass current PoWTargetSpacing() into CNode::OutboundTargetReached() + init: Pass post-Blossom spacing into CNode::SetMaxOutboundTarget() + Fix some typos + zcash_script: Clarify return values in docs + Rename responsible_disclosure.md to SECURITY.md + Add IBD download traffic reduction to release notes + Fill out the rest of the 4.3.0 release notes + make-release.py: Versioning changes for 4.3.0-rc1. + make-release.py: Updated manpages for 4.3.0-rc1. + +Jeremy Rubin (1): + Minimal fix to slow prevector tests as stopgap measure + +Jonas Schnelli (14): + banlist.dat: store banlist on disk + CAddrDB/CBanDB: change filesize variables from int to uint64_t + use CBanEntry as object container for banned nodes + Adding CSubNet constructor over a single CNetAddr + [Qt] add ui signal for banlist changes + [Qt] banlist, UI optimizing and better signal handling + net: use CIDR notation in CSubNet::ToString() + [QA] fix netbase tests because of new CSubNet::ToString() output + Introduce -maxuploadtarget + [doc] add documentation how to reduce traffic + don't enforce maxuploadtargets disconnect for whitelisted peers + [docs] rename reducetraffic.md to reduce-traffic.md + add documentation for exluding whitelistes peer from maxuploadtarget + add (max)uploadtarget infos to getnettotals RPC help + +Josh Lehan (1): + Re-organize -maxconnections option handling + +Karel Bilek (1): + scripted-diff: Use UniValue.pushKV instead of push_back(Pair()) + +Kaz Wesley (4): + fix race that could fail to persist a ban + prevector: destroy elements only via erase() + test prevector::swap + prevector::swap: fix (unreached) data corruption + +Kris Nuttycombe (4): + Skip "tx" messages during initial block download. + Fix pyflakes complaints + Whitespace-only fix in chainparams.cpp + Update the maxuploadtarget.py tests to accommodate zcash. + +Larry Ruane (1): + #4624 improve IBD sync by eliminating getheaders requests + +Marco Falke (3): + [net] Cleanup maxuploadtarget + [doc] Add -maxuploadtarget release notes + [walletdb] Add missing LOCK() in Recover() for dummyWallet + +Marius Kjærstad (3): + Update _COPYRIGHT_YEAR in configure.ac to 2021 + Update COPYRIGHT_YEAR in clientversion.h to 2021 + Update of copyright year to 2021 + +Matt Corallo (6): + Default to defining endian-conversion DECLs in compat w/o config + Make fDisconnect an std::atomic + Make fImporting an std::atomic + Fix AddrMan locking + Remove double brackets in addrman + Fix unlocked access to vNodes.size() + +Patrick Strateman (1): + Avoid recalculating vchKeyedNetGroup in eviction logic. + +Peter Bushnell (1): + depends: Consistent use of package variable + +Peter Todd (1): + Remove LOCK(cs_main) from decodescript + +Philip Kaufmann (4): + banlist: update set dirty to be more fine grained + banlist: better handling of banlist in StartNode() + banlist: add more banlist infos to log / add GUI signal + banlist (bugfix): allow CNode::SweepBanned() to run on interval + +Pieter Wuille (11): + Add SipHash-2-4 primitives to hash + Use SipHash-2-4 for CCoinsCache index + Switch CTxMempool::mapTx to use a hash index for txids + Use SipHash-2-4 for address relay selection + Add extra message to avoid a long 'Loading banlist' + Support SipHash with arbitrary byte writes + Use 64-bit SipHash of netgroups in eviction + Use C++11 thread-safe static initializers + Add ChaCha20 + Switch FastRandomContext to ChaCha20 + Add a FastRandomContext::randrange and use it + +Suhas Daftuar (1): + Add RPC test for -maxuploadtarget + +Taylor Hornby (2): + Move the github API token out of updatecheck.py into an untracked file. + Document the required .updatecheck-token file in the release docs + +Wladimir J. van der Laan (6): + build: Updates for OpenBSD + net: Fix CIDR notation in ToString() + test: Add more test vectors for siphash + timedata: Prevent warning overkill + Always allow getheaders from whitelisted peers + rpc: remove cs_main lock from `createrawtransaction` + +fanquake (2): + [build] Add NETBSD leveldb target to configure.ac + [doc] Improve lanaguge in reducetraffic.md + +kirkalx (1): + peers.dat, banlist.dat recreated when missing + +randy-waterhouse (1): + Re-instate TARGET_OS=linux in configure.ac. Removed by 351abf9e035. + +Jack Grigg (1): + Update URL for Zcash Foundation security policy + +Ying Tong Lai (2): + Cargo update + Postpone dependencies + +tulip (1): + Move time data log print to 'net' category to reduce log noise + +Benjamin Winston (1): + Added foundation to responsible_disclosure.md + diff --git a/doc/release-notes/release-notes-4.3.0.md b/doc/release-notes/release-notes-4.3.0.md new file mode 100644 index 000000000..7bfbff125 --- /dev/null +++ b/doc/release-notes/release-notes-4.3.0.md @@ -0,0 +1,331 @@ +Notable changes +=============== + +Reduce download traffic +----------------------- + +We have made several changes to reduce the amount of data downloaded by `zcashd` +during initial block download (IBD): + +- Significant time and bandwidth is spent in issuing `getheaders` P2P requests. + This results in noticeable bandwidth usage due to the large size of Zcash + block headers. + + We now eliminate redundant requests in cases where we already know the last + header in the message. This optimization is enabled by default, but can be + disabled by setting the config option `-nooptimize-getheaders`. + +- Transactions in the mempool are no longer downloaded during IBD (`zcashd` will + only request block data). + +Reduce upload traffic +--------------------- + +A major part of the outbound traffic is caused by serving historic blocks to +other nodes in initial block download state. + +It is now possible to reduce the total upload traffic via the `-maxuploadtarget` +parameter. This is *not* a hard limit but a threshold to minimize the outbound +traffic. When the limit is about to be reached, the uploaded data is cut by not +serving historic blocks (blocks older than one week). +Moreover, any SPV peer is disconnected when they request a filtered block. + +This option can be specified in MiB per day and is turned off by default +(`-maxuploadtarget=0`). +The recommended minimum is 1152 * MAX_BLOCK_SIZE (currently 2304MB) per day. + +Whitelisted peers will never be disconnected, although their traffic counts for +calculating the target. + +A more detailed documentation about keeping traffic low can be found in +[/doc/reduce-traffic.md](/doc/reduce-traffic.md). + +`libzcashconsensus` replaced by `libzcash_script` +------------------------------------------------- + +The `libzcashconsensus` library inherited from upstream has been unusable since +the Overwinter network upgrade in 2018. We made changes to signature digests +similar to those made in Bitcoin's SegWit, which required additional per-input +data that could not be added to the existing APIs without breaking backwards +compatibility. + +Additionally, it has become increasingly inaccurately named; it only covers +(Zcash's subset of) the Bitcoin scripting system, and not the myriad of other +consensus changes: in particular, Zcash's shielded pools. + +We have now renamed the library to `libzcash_script`, and reworked it to instead +focus on transparent script verification: + +- The script verification APIs are altered to take `consensusBranchId` and + `amount` fields. +- New precomputing APIs have been added that enable multiple transparent inputs + on a single transaction to be verified more efficiently. +- Equihash has been removed from the compiled library. The canonical Equihash + validator is the [`equihash` Rust crate](https://crates.io/crates/equihash) + since v3.1.0. + +The C++ library can be built by compiling `zcashd` with the environment variable +`CONFIGURE_FLAGS=--with-libs`. It is also wrapped as the +[`zcash_script` Rust crate](https://crates.io/crates/zcash_script) +(maintained by the Zcash Foundation for use in `zebrad`). + +Other P2P Changes +----------------- + +The list of banned peers is now stored on disk rather than in memory. Restarting +`zcashd` will no longer clear out the list of banned peers; instead the +`clearbanned` RPC method can be used to manually clear the list. The `setban` +RPC method can also be used to manually ban or unban a peer. + +Build system updates +-------------------- + +- We now build with Clang 11 and Rust 1.49. +- We have downgraded Boost to 1.74 to mitigate `statx`-related breakage in some + container environments. + +Changelog +========= + +Alex Wied (3): + Add support for FreeBSD 12 + Set rust_target for all FreeBSD versions + Use parentheses for defined in windows-unused-variables.diff + +Alfredo Garcia (3): + split wallet.py tests + hide password in -stdin `walletpassphrase` command + Apply suggestions from code review + +Bernhard M. Wiedemann (1): + Make tests pass after 2020 + +BtcDrak (1): + Remove bad chain alert partition check + +Carl Dong (13): + build: Add variable printing target to Makefiles + depends: Propagate well-known vars into depends + depends: boost: Specify toolset to bootstrap.sh + depends: boost: Split target-os from toolset + depends: boost: Use clang toolset if clang in CXX + depends: Propagate only specific CLI variables to sub-makes + depends: boost: Refer to version in URL + depends: boost: Split into non-/native packages + depends: boost: Disable all compression + depends: boost: Cleanup architecture/address-model + depends: boost: Cleanup toolset selection + depends: boost: Remove unnecessary _archiver_ + depends: boost: Specify cflags+compileflags + +Casey Rodarmor (3): + Make limited map actually respect max size + Disallow unlimited limited maps + Add limitedmap test + +Cory Fields (6): + depends: fix boost mac cross build with clang 9+ + build: add missing leveldb defines + net: make Ban/Unban/ClearBan functionality consistent + net: No need to export DumpBanlist + net: move CBanDB and CAddrDB out of net.h/cpp + net: Drop CNodeRef for AttemptToEvictConnection + +Daira Hopwood (2): + qa/zcash/updatecheck.py: remove dead code; print instructions to run `cargo outdated` and `cargo update`. + Ensure that `CONFIGURE_FLAGS=--enable-debug` correctly uses -O0 for dependencies and main build. + +Daniel Kraft (1): + doc: add comment explaining initial header request + +Dimitris Apostolou (1): + Discord invite instead of direct link + +Ethan Heilman (1): + Fix de-serialization bug where AddrMan is corrupted after exception * CAddrDB modified so that when de-serialization code throws an exception Addrman is reset to a clean state * CAddrDB modified to make unit tests possible * Regression test created to ensure bug is fixed * StartNode modifed to clear adrman if CAddrDB::Read returns an error code. + +Gregory Maxwell (2): + Return early in IsBanned. + Disconnect on mempool requests from peers when over the upload limit. + +Igor Cota (1): + Define TARGET_OS when host is android + +Jack Grigg (46): + Add JSDescriptionInfo for constructing JSDescriptions + Remove JSDescription::h_sig + prevector: Terminate without logging on failed allocation + Remove init_and_check_sodium from crypto/common.h + Store inputs and outputs by reference in JSDescriptionInfo + depends: Update Rust to 1.49.0 + rust: Use renamed broken_intra_doc_links lint + depends: cargo update + depends: Move to Clang 11 + depends: Fix Boost warnings under Clang 11 + depends: Allow per-host package download paths + depends: Ensure the native_clang download path is for the builder + Revert "Update boost to 1.75, postpone other updates." + qa: Postpone Boost and native_b2 updates + QA: Remove unused update postponements + QA: Postpone BDB update again + depends: ZeroMQ 4.3.4 + depends: Postpone updates that require adding CMake + cargo update + Squashed 'src/univalue/' changes from 9ef5b78c1..98fadc090 + Remove crypto/equihash from libzcashconsensus + Add amount and consensus branch ID to zcashconsensus_verify_script + Rename src/script/zcashconsensus.* -> src/script/zcash_script.* + Rename zcashconsensus_* -> zcash_script_* in APIs + Rename libzcashconsensus.la -> libzcash_script.la + Set up an mdbook in which we can document zcashd's architecture design + Actions: Add a workflow to deploy the zcashd book + Show README as root of zcashd book + Link to zips.z.cash for protocol spec + test: Convert Bech32 test vectors into known-answer test vectors + zcash_script: Add API to verify scripts with precomputed tx data + test: Migrate maxuploadtarget.py to Python 3 + Pass current PoWTargetSpacing() into CNode::OutboundTargetReached() + init: Pass post-Blossom spacing into CNode::SetMaxOutboundTarget() + Fix some typos + zcash_script: Clarify return values in docs + Rename responsible_disclosure.md to SECURITY.md + Add IBD download traffic reduction to release notes + Fill out the rest of the 4.3.0 release notes + make-release.py: Versioning changes for 4.3.0-rc1. + make-release.py: Updated manpages for 4.3.0-rc1. + make-release.py: Updated release notes and changelog for 4.3.0-rc1. + cargo update + rust: Pin funty =1.1.0 + make-release.py: Versioning changes for 4.3.0. + make-release.py: Updated manpages for 4.3.0. + +Jeremy Rubin (1): + Minimal fix to slow prevector tests as stopgap measure + +Jonas Schnelli (14): + banlist.dat: store banlist on disk + CAddrDB/CBanDB: change filesize variables from int to uint64_t + use CBanEntry as object container for banned nodes + Adding CSubNet constructor over a single CNetAddr + [Qt] add ui signal for banlist changes + [Qt] banlist, UI optimizing and better signal handling + net: use CIDR notation in CSubNet::ToString() + [QA] fix netbase tests because of new CSubNet::ToString() output + Introduce -maxuploadtarget + [doc] add documentation how to reduce traffic + don't enforce maxuploadtargets disconnect for whitelisted peers + [docs] rename reducetraffic.md to reduce-traffic.md + add documentation for exluding whitelistes peer from maxuploadtarget + add (max)uploadtarget infos to getnettotals RPC help + +Josh Lehan (1): + Re-organize -maxconnections option handling + +Karel Bilek (1): + scripted-diff: Use UniValue.pushKV instead of push_back(Pair()) + +Kaz Wesley (4): + fix race that could fail to persist a ban + prevector: destroy elements only via erase() + test prevector::swap + prevector::swap: fix (unreached) data corruption + +Kris Nuttycombe (4): + Skip "tx" messages during initial block download. + Fix pyflakes complaints + Whitespace-only fix in chainparams.cpp + Update the maxuploadtarget.py tests to accommodate zcash. + +Larry Ruane (1): + #4624 improve IBD sync by eliminating getheaders requests + +Marco Falke (3): + [net] Cleanup maxuploadtarget + [doc] Add -maxuploadtarget release notes + [walletdb] Add missing LOCK() in Recover() for dummyWallet + +Marius Kjærstad (3): + Update _COPYRIGHT_YEAR in configure.ac to 2021 + Update COPYRIGHT_YEAR in clientversion.h to 2021 + Update of copyright year to 2021 + +Marshall Gaucher (1): + add libxml2 + +Matt Corallo (6): + Default to defining endian-conversion DECLs in compat w/o config + Make fDisconnect an std::atomic + Make fImporting an std::atomic + Fix AddrMan locking + Remove double brackets in addrman + Fix unlocked access to vNodes.size() + +Patrick Strateman (1): + Avoid recalculating vchKeyedNetGroup in eviction logic. + +Peter Bushnell (1): + depends: Consistent use of package variable + +Peter Todd (1): + Remove LOCK(cs_main) from decodescript + +Philip Kaufmann (4): + banlist: update set dirty to be more fine grained + banlist: better handling of banlist in StartNode() + banlist: add more banlist infos to log / add GUI signal + banlist (bugfix): allow CNode::SweepBanned() to run on interval + +Pieter Wuille (11): + Add SipHash-2-4 primitives to hash + Use SipHash-2-4 for CCoinsCache index + Switch CTxMempool::mapTx to use a hash index for txids + Use SipHash-2-4 for address relay selection + Add extra message to avoid a long 'Loading banlist' + Support SipHash with arbitrary byte writes + Use 64-bit SipHash of netgroups in eviction + Use C++11 thread-safe static initializers + Add ChaCha20 + Switch FastRandomContext to ChaCha20 + Add a FastRandomContext::randrange and use it + +Suhas Daftuar (1): + Add RPC test for -maxuploadtarget + +Taylor Hornby (2): + Move the github API token out of updatecheck.py into an untracked file. + Document the required .updatecheck-token file in the release docs + +Wladimir J. van der Laan (6): + build: Updates for OpenBSD + net: Fix CIDR notation in ToString() + test: Add more test vectors for siphash + timedata: Prevent warning overkill + Always allow getheaders from whitelisted peers + rpc: remove cs_main lock from `createrawtransaction` + +fanquake (2): + [build] Add NETBSD leveldb target to configure.ac + [doc] Improve lanaguge in reducetraffic.md + +kirkalx (1): + peers.dat, banlist.dat recreated when missing + +Marshall Gaucher (1): + add zstd package + +randy-waterhouse (1): + Re-instate TARGET_OS=linux in configure.ac. Removed by 351abf9e035. + +Jack Grigg (1): + Update URL for Zcash Foundation security policy + +Ying Tong Lai (2): + Cargo update + Postpone dependencies + +tulip (1): + Move time data log print to 'net' category to reduce log noise + +Benjamin Winston (1): + Added foundation to responsible_disclosure.md + diff --git a/doc/release-notes/release-notes-4.4.0-rc1.md b/doc/release-notes/release-notes-4.4.0-rc1.md new file mode 100644 index 000000000..6a84fc879 --- /dev/null +++ b/doc/release-notes/release-notes-4.4.0-rc1.md @@ -0,0 +1,187 @@ +Notable changes +=============== + +Prometheus metrics +------------------ + +`zcashd` can now be configured to optionally expose an HTTP server that acts as +a Prometheus scrape endpoint. The server will respond to `GET` requests on any +request path. + +To enable the endpoint, add `-prometheusport=` to your `zcashd` +configuration (either in `zcash.conf` or on the command line). After +restarting `zcashd` you can then test the endpoint by querying it with e.g. +`curl http://127.0.0.1:`. + +By default, access is restricted to localhost. This can be expanded with +`-metricsallowip=`, which can specify IPs or subnets. Note that HTTPS is not +supported, and therefore connections to the endpoint are not encrypted or +authenticated. Access to the endpoint should be assumed to compromise the +privacy of node operations, by the provided metrics and/or by timing side +channels. Non-localhost access is **strongly discouraged** if the node has a +wallet holding live funds. + +The specific metrics names may change in subsequent releases, in particular to +improve interoperability with `zebrad`. + +Changelog +========= + +Cory Fields (3): + net: rearrange so that socket accesses can be grouped together + net: add a lock around hSocket + net: fix a few races. Credit @TheBlueMatt + +Daira Hopwood (6): + Fix regression introduced in e286250ce49309bfa931b622fabfc37100246266 by adding #include . fixes #5014 + native_rust: don't install Rust docs. This speeds up builds, especially native builds on macOS. fixes #5042 + Delete spare mainnet Founders' Reward addresses that will never be used. + configure.ac: Add check for ntdll on Windows. + configure.ac: tidy up spacing. + Cleanup: get the definition of ENABLE_VIRTUAL_TERMINAL_PROCESSING from wincon.h. + +Gregory Maxwell (5): + Replace setInventoryKnown with a rolling bloom filter. + Remove mruset as it is no longer used. + Actually only use filterInventoryKnown with MSG_TX inventory messages. + Add whitelistforcerelay to control forced relaying. + Blacklist -whitelistalwaysrelay; replaced by -whitelistrelay. + +Jack Grigg (39): + Squashed 'src/secp256k1/' changes from c6b6b8f1bb..3967d96bf1 + Squashed 'src/secp256k1/' changes from 3967d96bf1..a4abaab793 + CI: Correctly build zcashd book + cargo update + rust: zcash_{primitives, proofs} 0.5.0 + depends: Update Rust to 1.51.0 + qa: Update BerkeleyDB downloads page URL + rust: Implement FFI interface to metrics crate + rust: Add a Prometheus metrics exporter + Add some metrics that match existing zebrad metrics + metrics: Add documentation and example configs + tracing: Merge TracingSpanFields macro into TracingSpan + rust: Move helper macros into rust/helpers.h + metrics: Add support for labels + metrics: Expose binary metadata + Add more detailed metrics + rust: Use consistent include guards in header files + rust: Check for invalid UTF-8 in -prometheusmetrics argument + Add -prometheusmetrics to release notes + Mention in release notes that metrics names may still change + metrics: Implement IP access control on Prometheus scrape endpoint + rust: Pin hyper 0.14.2 + metrics: Move documentation into zcashd book + metrics: Enable gauges with fully-static labels + metrics: Use labels for pool statistics + metrics: Rename metrics with consistent naming scheme + metrics: Remove zcash.sync.* metrics + metrics: Rework pool metrics in anticipation of transparent pool + net: Clear CNode::strSendCommand if a message is aborted + rust: Add license header to metrics_ffi::prometheus + book: Fix typo in metrics documentation + metrics: Don't assert that the Sprout tree is accessible + Remove usage of local from fetch-params.sh + lint: Fix false positive + qa: Point univalue update checker at correct upstream + qa: Postpone updates that require CMake in the build system + qa: Postpone Boost 1.75.0 + make-release.py: Versioning changes for 4.4.0-rc1. + make-release.py: Updated manpages for 4.4.0-rc1. + +Jeremy Rubin (2): + Fix CCheckQueue IsIdle (potential) race condition and remove dangerous constructors. + Add CheckQueue Tests + +Jonas Schnelli (1): + Move -blocksonly parameter interaction to the new ParameterInteraction() function + +Kaz Wesley (2): + lock cs_main for State/Misbehaving + lock cs_main for chainActive + +Kris Nuttycombe (14): + Ignore temporary build artifacts. + Add feature flagging infrastructure to consensus parameters. + Relocate contextual Sapling version checks + Add TxVersionInfo for feature/future-base transaction construction. + Move sapling version group checks back inside of saplingActive check. + Add future version group & version checks + Use SPROUT_MAX_CURRENT_VERSION + Apply suggestions from code review + Add feature flagging tests. + Document FeatureSet type. + Document UPGRADE_ZFUTURE + Ensure that Sapling version range checks are always guarded by SAPLING_VERSION_GROUP_ID + Address review comments. + CurrentTxVersionInfo should return SPROUT_MIN_CURRENT_VERSION pre-overwinter. + +Marco Falke (2): + Move blocksonly parameter interaction to InitParameterInteraction() + doc: Mention blocksonly in reduce-traffic.md, unhide option + +Matt Corallo (13): + Fix race when accessing std::locale::classic() + Lock mapArgs/mapMultiArgs access in util + Ensure cs_vNodes is held when using the return value from FindNode + Access WorkQueue::running only within the cs lock. + Make nTimeConnected const in CNode + Avoid copying CNodeStats to make helgrind OK with buggy std::string + Access fRelayTxes with cs_filter lock in copyStats + Make nStartingHeight atomic + Make nServices atomic + Move [clean|str]SubVer writes/copyStats into a lock + Make nTimeBestReceived atomic + Move CNode::addrName accesses behind locked accessors + Move CNode::addrLocal access behind locked accessors + +Patick Strateman (13): + Add blocksonly mode + Do not process tx inv's in blocksonly mode + Add whitelistalwaysrelay option + Add help text for blocksonly and whitelistalwaysrelay + Use DEFAULT_BLOCKSONLY and DEFAULT_WHITELISTALWAYSRELAY constants + Display DEFAULT_WHITELISTALWAYSRELAY in help text + Fix fRelayTxs comment + Fix comment for blocksonly parameter interactions + Fix relay mechanism for whitelisted peers under blocks only mode. + Bail early in processing transactions in blocks only mode. + Improve log messages for blocks only violations. + Rename setInventoryKnown filterInventoryKnown + Only use filterInventoryKnown with MSG_TX inventory messages. + +Patrick Strateman (1): + Make nWalletDBUpdated atomic to avoid a potential race. + +Pavel Janík (2): + Notify other serviceQueue thread we are finished to prevent deadlocks. + Do not shadow LOCK's criticalblock variable for LOCK inside LOCK + +Peter Todd (1): + Add relaytxes status to getpeerinfo + +Pieter Wuille (2): + Clean up lockorder data of destroyed mutexes + Fix some locks + +Russell Yanofsky (1): + Add missing cs_wallet lock that triggers new lock held assertion + +Sjors Provoost (1): + [doc] mention whitelist is inbound, and applies to blocksonly + +Steven Smith (1): + Adding base NU5 declarations and logic + +Yuri Zhykin (1): + Fix for incorrect locking in GetPubKey() (keystore.cpp) + +glowang (1): + Update -blocksonly documentation + +plutoforever (1): + removed bashisms from build scripts + +Jack Grigg (2): + Add security warnings for -prometheusmetrics option + Clean up comment + diff --git a/doc/release-notes/release-notes-4.4.0.md b/doc/release-notes/release-notes-4.4.0.md new file mode 100644 index 000000000..2bae0c2c7 --- /dev/null +++ b/doc/release-notes/release-notes-4.4.0.md @@ -0,0 +1,197 @@ +Notable changes +=============== + +Prometheus metrics +------------------ + +`zcashd` can now be configured to optionally expose an HTTP server that acts as +a Prometheus scrape endpoint. The server will respond to `GET` requests on any +request path. + +To enable the endpoint, add `-prometheusport=` to your `zcashd` +configuration (either in `zcash.conf` or on the command line). After +restarting `zcashd` you can then test the endpoint by querying it with e.g. +`curl http://127.0.0.1:`. + +By default, access is restricted to localhost. This can be expanded with +`-metricsallowip=`, which can specify IPs or subnets. Note that HTTPS is not +supported, and therefore connections to the endpoint are not encrypted or +authenticated. Access to the endpoint should be assumed to compromise the +privacy of node operations, by the provided metrics and/or by timing side +channels. Non-localhost access is **strongly discouraged** if the node has a +wallet holding live funds. + +The specific metrics names may change in subsequent releases, in particular to +improve interoperability with `zebrad`. + +Changelog +========= + +Cory Fields (3): + net: rearrange so that socket accesses can be grouped together + net: add a lock around hSocket + net: fix a few races. Credit @TheBlueMatt + +Daira Hopwood (6): + Fix regression introduced in e286250ce49309bfa931b622fabfc37100246266 by adding #include . fixes #5014 + native_rust: don't install Rust docs. This speeds up builds, especially native builds on macOS. fixes #5042 + Delete spare mainnet Founders' Reward addresses that will never be used. + configure.ac: Add check for ntdll on Windows. + configure.ac: tidy up spacing. + Cleanup: get the definition of ENABLE_VIRTUAL_TERMINAL_PROCESSING from wincon.h. + +Gregory Maxwell (5): + Replace setInventoryKnown with a rolling bloom filter. + Remove mruset as it is no longer used. + Actually only use filterInventoryKnown with MSG_TX inventory messages. + Add whitelistforcerelay to control forced relaying. + Blacklist -whitelistalwaysrelay; replaced by -whitelistrelay. + +Jack Grigg (49): + Squashed 'src/secp256k1/' changes from c6b6b8f1bb..3967d96bf1 + Squashed 'src/secp256k1/' changes from 3967d96bf1..a4abaab793 + CI: Correctly build zcashd book + cargo update + rust: zcash_{primitives, proofs} 0.5.0 + depends: Update Rust to 1.51.0 + qa: Update BerkeleyDB downloads page URL + rust: Implement FFI interface to metrics crate + rust: Add a Prometheus metrics exporter + Add some metrics that match existing zebrad metrics + metrics: Add documentation and example configs + tracing: Merge TracingSpanFields macro into TracingSpan + rust: Move helper macros into rust/helpers.h + metrics: Add support for labels + metrics: Expose binary metadata + Add more detailed metrics + rust: Use consistent include guards in header files + rust: Check for invalid UTF-8 in -prometheusmetrics argument + Add -prometheusmetrics to release notes + Mention in release notes that metrics names may still change + metrics: Implement IP access control on Prometheus scrape endpoint + rust: Pin hyper 0.14.2 + metrics: Move documentation into zcashd book + metrics: Enable gauges with fully-static labels + metrics: Use labels for pool statistics + metrics: Rename metrics with consistent naming scheme + metrics: Remove zcash.sync.* metrics + metrics: Rework pool metrics in anticipation of transparent pool + net: Clear CNode::strSendCommand if a message is aborted + rust: Add license header to metrics_ffi::prometheus + book: Fix typo in metrics documentation + metrics: Don't assert that the Sprout tree is accessible + Remove usage of local from fetch-params.sh + lint: Fix false positive + qa: Point univalue update checker at correct upstream + qa: Postpone updates that require CMake in the build system + qa: Postpone Boost 1.75.0 + make-release.py: Versioning changes for 4.4.0-rc1. + make-release.py: Updated manpages for 4.4.0-rc1. + make-release.py: Updated release notes and changelog for 4.4.0-rc1. + scripted-diff: Remove direct usages of boost::filesystem + Remove duplicate / unused includes + Fix include guards + python: Use UTF-8 encodings for opened files + clean.sh: Remove secp256k1 test log + Postpone Clang 12 + book: Fix comment in metrics example, and clarify usage + make-release.py: Versioning changes for 4.4.0. + make-release.py: Updated manpages for 4.4.0. + +Jeremy Rubin (2): + Fix CCheckQueue IsIdle (potential) race condition and remove dangerous constructors. + Add CheckQueue Tests + +Jonas Schnelli (1): + Move -blocksonly parameter interaction to the new ParameterInteraction() function + +Kaz Wesley (2): + lock cs_main for State/Misbehaving + lock cs_main for chainActive + +Kris Nuttycombe (14): + Ignore temporary build artifacts. + Add feature flagging infrastructure to consensus parameters. + Relocate contextual Sapling version checks + Add TxVersionInfo for feature/future-base transaction construction. + Move sapling version group checks back inside of saplingActive check. + Add future version group & version checks + Use SPROUT_MAX_CURRENT_VERSION + Apply suggestions from code review + Add feature flagging tests. + Document FeatureSet type. + Document UPGRADE_ZFUTURE + Ensure that Sapling version range checks are always guarded by SAPLING_VERSION_GROUP_ID + Address review comments. + CurrentTxVersionInfo should return SPROUT_MIN_CURRENT_VERSION pre-overwinter. + +Marco Falke (2): + Move blocksonly parameter interaction to InitParameterInteraction() + doc: Mention blocksonly in reduce-traffic.md, unhide option + +Matt Corallo (13): + Fix race when accessing std::locale::classic() + Lock mapArgs/mapMultiArgs access in util + Ensure cs_vNodes is held when using the return value from FindNode + Access WorkQueue::running only within the cs lock. + Make nTimeConnected const in CNode + Avoid copying CNodeStats to make helgrind OK with buggy std::string + Access fRelayTxes with cs_filter lock in copyStats + Make nStartingHeight atomic + Make nServices atomic + Move [clean|str]SubVer writes/copyStats into a lock + Make nTimeBestReceived atomic + Move CNode::addrName accesses behind locked accessors + Move CNode::addrLocal access behind locked accessors + +Patick Strateman (13): + Add blocksonly mode + Do not process tx inv's in blocksonly mode + Add whitelistalwaysrelay option + Add help text for blocksonly and whitelistalwaysrelay + Use DEFAULT_BLOCKSONLY and DEFAULT_WHITELISTALWAYSRELAY constants + Display DEFAULT_WHITELISTALWAYSRELAY in help text + Fix fRelayTxs comment + Fix comment for blocksonly parameter interactions + Fix relay mechanism for whitelisted peers under blocks only mode. + Bail early in processing transactions in blocks only mode. + Improve log messages for blocks only violations. + Rename setInventoryKnown filterInventoryKnown + Only use filterInventoryKnown with MSG_TX inventory messages. + +Patrick Strateman (1): + Make nWalletDBUpdated atomic to avoid a potential race. + +Pavel Janík (2): + Notify other serviceQueue thread we are finished to prevent deadlocks. + Do not shadow LOCK's criticalblock variable for LOCK inside LOCK + +Peter Todd (1): + Add relaytxes status to getpeerinfo + +Pieter Wuille (2): + Clean up lockorder data of destroyed mutexes + Fix some locks + +Russell Yanofsky (1): + Add missing cs_wallet lock that triggers new lock held assertion + +Sjors Provoost (1): + [doc] mention whitelist is inbound, and applies to blocksonly + +Steven Smith (1): + Adding base NU5 declarations and logic + +Yuri Zhykin (1): + Fix for incorrect locking in GetPubKey() (keystore.cpp) + +glowang (1): + Update -blocksonly documentation + +plutoforever (1): + removed bashisms from build scripts + +Jack Grigg (2): + Add security warnings for -prometheusmetrics option + Clean up comment + diff --git a/doc/release-notes/release-notes-4.4.1-rc1.md b/doc/release-notes/release-notes-4.4.1-rc1.md new file mode 100644 index 000000000..5c65bb924 --- /dev/null +++ b/doc/release-notes/release-notes-4.4.1-rc1.md @@ -0,0 +1,128 @@ +Notable changes +=============== + +Build system changes +-------------------- + +- Cross-compilation support for Windows XP, Windows Vista, and 32-bit Windows + binaries, has been removed. Cross-compiled Windows binaries are now 64-bit + only, and target a minimum of Windows 7. + +Changelog +========= + +251 (1): + Removes unsed `CBloomFilter` constructor. + +Akio Nakamura (1): + Prevent mutex lock fail even if --enable-debug + +Anthony Towns (1): + doc: clarify CRollingBloomFilter size estimate + +Ben Woosley (1): + Drop defunct Windows compat fixes + +Chun Kuan Lee (3): + windows: Set _WIN32_WINNT to 0x0601 (Windows 7) + windows: Call SetProcessDEPPolicy directly + build: Remove WINVER pre define in Makefile.leveldb.inlcude + +Cory Fields (2): + rpc: work-around an upstream libevent bug + rpc: further constrain the libevent workaround + +Jack Grigg (7): + build: Link to libbcrypt on Windows + doc: Add Windows version support change to release notes + Postpone dependency updates until after 4.4.1 + Fix Rust dependency name in postponed-updates.txt + Postpone native_ccache 4.3 + make-release.py: Versioning changes for 4.4.1-rc1. + make-release.py: Updated manpages for 4.4.1-rc1. + +João Barbosa (5): + bench: Add benchmark for CRollingBloomFilter::reset + refactor: Improve CRollingBloomFilter::reset by using std::fill + wallet: Remove unnecessary mempool lock in ReacceptWalletTransactions + [rpc] Reduce scope of cs_main and cs_wallet locks in listtransactions + [wallet] Make CWallet::ListCoins atomic + +Karl-Johan Alm (1): + Refactor: Remove using namespace from src/*.cpp. + +Larry Ruane (1): + when rewinding, set pindexBestHeader to the highest-work block index + +Luke Dashjr (2): + depends: Patch libevent build to fix IPv6 -rpcbind on Windows + Move Win32 defines to configure.ac to ensure they are globally defined + +Marko Bencun (1): + keystore GetKeys(): return result instead of writing to reference + +Martin Ankerl (1): + replace modulus with FastMod + +Matt Corallo (4): + Add ability to assert a lock is not held in DEBUG_LOCKORDER + Remove redundant pwallet nullptr check + Hold mempool.cs for the duration of ATMP. + Add braces to meet code style on line-after-the-one-changed. + +MeshCollider (1): + Make fUseCrypto atomic + +Pavel Janík (1): + Do not shadow variables + +Pieter Wuille (3): + Switch to a more efficient rolling Bloom filter + Fix formatting of NOPs for generated script tests + More efficient bitsliced rolling Bloom filter + +Robert McLaughlin (1): + trivial: fix bloom filter init to isEmpty = true + +Russell Yanofsky (1): + Acquire cs_main lock before cs_wallet during wallet initialization + +S. Matthew English (1): + unification of Bloom filter representation + +Sebastian Falbesoner (2): + refactor: Remove unused methods CBloomFilter::reset()/clear() + net: remove is{Empty,Full} flags from CBloomFilter, clarify CVE fix + +Wladimir J. van der Laan (3): + http: Join worker threads before deleting work queue + http: Remove WaitExit from WorkQueue + http: Remove numThreads and ThreadCounter + +fanquake (6): + build: remove WINDOWS_BITS from build system + build: remove configure checks for win libraries we don't link against + build: remove --large-address-aware linker flag + build: don't pass -w when building for Windows + build: enforce minimum required Windows version (7) + build: pass _WIN32_WINNT=0x0601 when building libevent for Windows + +kobake (2): + Fix msvc compiler error C4146 (minus operator applied to unsigned type) + Fix msvc compiler error C4146 (unary minus operator applied to unsigned type) + +Marshall Gaucher (3): + Add Debian 11 ci-builder + clean up ubuntu 18.04 and 20.04 commands + add tekton build/worker docker, organize legacy buildbot docker + +practicalswift (2): + addrman: Add missing lock in Clear() (CAddrMan) + Add missing cs_main locks when calling blockToJSON/blockheaderToJSON + +Jack Grigg (1): + doc: Add removal of 32-bit Windows binaries to release notes + +ロハン ダル (1): + param variables made const + diff --git a/doc/release-notes/release-notes-4.4.1.md b/doc/release-notes/release-notes-4.4.1.md new file mode 100644 index 000000000..8cc5f3224 --- /dev/null +++ b/doc/release-notes/release-notes-4.4.1.md @@ -0,0 +1,156 @@ +Notable changes +=============== + +Fixed chain sync stall bug +-------------------------- + +The 4.3.0 release included a change to prevent redundant `getheaders` P2P +requests, to reduce node bandwith usage. This behaviour could be disabled by +setting the config option `-nooptimize-getheaders`. + +It turns out that these redundant requests were masking an unrelated bug in the +chain-rewinding logic that is used when the node detects a change to the +consensus rules (for example, if a user forgets to upgrade their `zcashd` node +before a network upgrade activates, and temporarily follows an un-upgraded chain +before restarting with the latest version). + +In certain uncommon scenarios, a node could end up in a situation where it would +believe that the best header it knew about was more than 160 blocks behind its +actual best-known block. The redundant `getheaders` requests meant that this did +not cause an issue, because the node would continue requesting headers until it +found new blocks. After the `getheaders` optimizations, if a peer returned a +`headers` message that was entirely known to the node, it would stop requesting +more headers from that peer; this eventually caused node synchronization to +stall. Restarting with the `-nooptimize-getheaders` config option would enable +the node to continue syncing. + +This release fixes the bug at its source, but the `-nooptimize-getheaders` +config option remains available if necessary. + +Build system changes +-------------------- + +- Cross-compilation support for Windows XP, Windows Vista, and 32-bit Windows + binaries, has been removed. Cross-compiled Windows binaries are now 64-bit + only, and target a minimum of Windows 7. + +Changelog +========= + +251 (1): + Removes unsed `CBloomFilter` constructor. + +Akio Nakamura (1): + Prevent mutex lock fail even if --enable-debug + +Anthony Towns (1): + doc: clarify CRollingBloomFilter size estimate + +Ben Woosley (1): + Drop defunct Windows compat fixes + +Chun Kuan Lee (3): + windows: Set _WIN32_WINNT to 0x0601 (Windows 7) + windows: Call SetProcessDEPPolicy directly + build: Remove WINVER pre define in Makefile.leveldb.inlcude + +Cory Fields (2): + rpc: work-around an upstream libevent bug + rpc: further constrain the libevent workaround + +Jack Grigg (10): + build: Link to libbcrypt on Windows + doc: Add Windows version support change to release notes + Postpone dependency updates until after 4.4.1 + Fix Rust dependency name in postponed-updates.txt + Postpone native_ccache 4.3 + make-release.py: Versioning changes for 4.4.1-rc1. + make-release.py: Updated manpages for 4.4.1-rc1. + make-release.py: Updated release notes and changelog for 4.4.1-rc1. + make-release.py: Versioning changes for 4.4.1. + make-release.py: Updated manpages for 4.4.1. + +João Barbosa (5): + bench: Add benchmark for CRollingBloomFilter::reset + refactor: Improve CRollingBloomFilter::reset by using std::fill + wallet: Remove unnecessary mempool lock in ReacceptWalletTransactions + [rpc] Reduce scope of cs_main and cs_wallet locks in listtransactions + [wallet] Make CWallet::ListCoins atomic + +Karl-Johan Alm (1): + Refactor: Remove using namespace from src/*.cpp. + +Larry Ruane (1): + when rewinding, set pindexBestHeader to the highest-work block index + +Luke Dashjr (2): + depends: Patch libevent build to fix IPv6 -rpcbind on Windows + Move Win32 defines to configure.ac to ensure they are globally defined + +Marko Bencun (1): + keystore GetKeys(): return result instead of writing to reference + +Martin Ankerl (1): + replace modulus with FastMod + +Matt Corallo (4): + Add ability to assert a lock is not held in DEBUG_LOCKORDER + Remove redundant pwallet nullptr check + Hold mempool.cs for the duration of ATMP. + Add braces to meet code style on line-after-the-one-changed. + +MeshCollider (1): + Make fUseCrypto atomic + +Pavel Janík (1): + Do not shadow variables + +Pieter Wuille (3): + Switch to a more efficient rolling Bloom filter + Fix formatting of NOPs for generated script tests + More efficient bitsliced rolling Bloom filter + +Robert McLaughlin (1): + trivial: fix bloom filter init to isEmpty = true + +Russell Yanofsky (1): + Acquire cs_main lock before cs_wallet during wallet initialization + +S. Matthew English (1): + unification of Bloom filter representation + +Sebastian Falbesoner (2): + refactor: Remove unused methods CBloomFilter::reset()/clear() + net: remove is{Empty,Full} flags from CBloomFilter, clarify CVE fix + +Wladimir J. van der Laan (3): + http: Join worker threads before deleting work queue + http: Remove WaitExit from WorkQueue + http: Remove numThreads and ThreadCounter + +fanquake (6): + build: remove WINDOWS_BITS from build system + build: remove configure checks for win libraries we don't link against + build: remove --large-address-aware linker flag + build: don't pass -w when building for Windows + build: enforce minimum required Windows version (7) + build: pass _WIN32_WINNT=0x0601 when building libevent for Windows + +kobake (2): + Fix msvc compiler error C4146 (minus operator applied to unsigned type) + Fix msvc compiler error C4146 (unary minus operator applied to unsigned type) + +Marshall Gaucher (3): + Add Debian 11 ci-builder + clean up ubuntu 18.04 and 20.04 commands + add tekton build/worker docker, organize legacy buildbot docker + +practicalswift (2): + addrman: Add missing lock in Clear() (CAddrMan) + Add missing cs_main locks when calling blockToJSON/blockheaderToJSON + +Jack Grigg (1): + doc: Add removal of 32-bit Windows binaries to release notes + +ロハン ダル (1): + param variables made const diff --git a/doc/release-notes/release-notes-4.5.0-rc1.md b/doc/release-notes/release-notes-4.5.0-rc1.md new file mode 100644 index 000000000..c91384283 --- /dev/null +++ b/doc/release-notes/release-notes-4.5.0-rc1.md @@ -0,0 +1,311 @@ +Changelog +========= + +Aditya Kulkarni (1): + Sort taddr txns by txindex in addition to height + +Alex Morcos (4): + Store the total sig op count of a tx. + Add a score index to the mempool. + Add TxPriority class and comparator + tidy up CInv::GetCommand + +Daira Hopwood (8): + Improve error message when a block would overfill the Orchard commitment tree. + More precise terminology: "lock free" -> "unlocked" + ZIP 339 support. + Update URL for Boost source download (from dl.bintray.com to boostorg.jfrog.io). + Cargo.toml: use librustzcash after the merge of https://github.com/zcash/librustzcash/pull/424 . + Update unified address test data to take account of HRPs in padding (https://github.com/zcash/librustzcash/pull/419). + Avoid need to cast away const in the C caller of zip339_free_phrase. + Update authors of librustzcash to everyone currently and formerly on Core team (in alphabetical order). + +Eric Lombrozo (2): + Removed ppszTypeName from protocol.cpp + getdata enum issue fix + +Ethan Heilman (1): + Fix typo adddrman to addrman as requested in #8070 + +Ethan Heilman (1): + Remove non-determinism which is breaking net_tests #8069 + +Gregory Maxwell (4): + Eliminate TX trickle bypass, sort TX invs for privacy and priority. + Move bloom and feerate filtering to just prior to tx sending. + Do not use mempool for GETDATA for tx accepted after the last mempool req. + Defer inserting into maprelay until just before relaying. + +Jack Grigg (109): + Re-include reading blocks from disk in block connection benchmark + cargo update + Migrate to latest zcash_* crates + metrics 0.16 and metrics-exporter-prometheus 0.5 + Implement ZIP 216 consensus rules + Extract SpendDescriptionV5 and OutputDescriptionV5 classes + rust: Enable C++ streams to be passed into Rust code + ZIP 225 tx format constants + v5 transaction format parser + contrib: Add BOSL to contrib/debian/copyright + Remove early return logic from transaction parsing + rust: Document read_callback_t and write_callback_t + CTransaction: Make new ZIP 225 fields non-const and private + ZIP 244 transaction digests + ZIP 244 signature digests + ZIP 244 hashAuthDataRoot computation + Fix tests that assume CTxOuts can be "null" + test: Generate valid Sapling types + test: Small fixes to sighash test vector generation + test: Regenerate sighash.json after generator fixes + Throw an exception instead of asserting if Rust tx parser fails + CI: Publish correct book directory + CI: Build book with latest mdbook + rust: Documentation improvements to FFI methods + Implement Orchard authorization batch validator + Implement Orchard signature validation consensus rules + rust: Fix patched dependencies + book: Add dev guide page about Rust dependencies + Rename hashLightClientRoot to hashBlockCommitments in block header + ZIP 244 hashBlockCommitments implementation + test: Check for valid hashBlockCommitments construction post-NU5 + Skip hashBlockCommitments check when testing block templates + test: Check hashBlockCommitments before, at, and after NU5 activation + ConnectBlock: Check NU activation when deriving block commitments + Copy authDigest in CTransaction::operator=(const CTransaction &tx) + rust: Move history tree FFI logic into a module + rust: Migrate to zcash_history with versioned trees + rust: Move history tree FFI declarations into a separate header + test: Use valid consensus branch IDs in history tree tests + Use V2 history trees from NU5 onward + test: Check history trees across Canopy and NU5 activations + rpc: Document getblock RPC finalorchardroot field, omit before NU5 + rust: Document some requirements for history tree FFI methods + test: Add test case for popping from an empty history tree + Implement Orchard pool value tracking + rust: Load Orchard circuit parameters at startup + Check Orchard bundle-specific consensus rules, i.e. proofs + test: Update CCoinsViewTest with changes to CCoinsView interface + Include Orchard bundle in transaction dynamic usage + ZIP 203: Enforce coinbase nExpiryHeight consensus rule from NU5 + test: Check for updated empty-tx reject messages in transaction tests + test: Fix OverwinterExpiryHeight test after ZIP 203 contextual changes + miner: Set coinbase expiry height to block height from NU5 activation + Introduce libzcash::RawAddress type + Use `libzcash::RawAddress` in `CWallet::GetFilteredNotes` + Use a visitor for handling -mineraddress config option + Add support for decoding and encoding Unified Addresses + Pass network type through to UA address handling logic + CI: Add workflow that runs general lints + CI: Check scripted diffs + CI: Add Rust lints + Document why a nested call to ExtractMinerAddress is not recursive + Add constants for UA typecodes + Postpone dependency updates we aren't doing in this release + depends: Update Rust to 1.54.0 + depends: Update Clang / libcxx to LLVM 12 + depends: Update utfcpp to 3.2.1 + depends: Fix issue cross-compiling BDB to Windows with Clang 12 + rust: cargo update + rust: metrics 0.17 + CI: Use Rust 1.54 for lints + cargo fmt + test: Wait for transaction propagation in shorter_block_times RPC test + test: Fix race condition in p2p_txexpiringsoon + Revert "Remove reference to -reindex-chainstate" + test: Flush wallet in WriteCryptedSaplingZkeyDirectToDb before reopening + qa: Bump `sync_mempool` timeout for `prioritisetransaction.py` + ProcessGetData(): Rework IsExpiringSoon check + test: Print reject reason if RPC test block rejected instead of accepted + test: Fix pyflakes warnings + CI: Ignore errors from general lints we don't yet have passing + lint: remove duplicate include + lint: Add missing include guards + test: Add NU5 test cases to existing RPC tests + builder: Generate v5 transactions from NU5 activation + Print `nConsensusBranchId` in `CTransaction::ToString` + Separate the consensus and internal consistency checks for branch ID + Parse consensus branch ID when reading v5 transaction format + test: Use correct field of getnetworkinfo to read protocol version + CI: Add Dependabot config to keep Actions up-to-date + Introduce a WTxId struct + Implement CInv message type MSG_WTX + test: Fix bugs in mininode transaction parser + test: Add v5 tx support to mininode + ProcessGetData: Respond to MSG_WTX requests + Add MSG_WTX support to inv messages + Use wtxid for peer state management + test: Implement CInv.__eq__() for mininode to simplify RPC test + Postpone dependency updates that require CMake + depends: Update Rust to 1.54.0 + test: Fix bug in mininode.SpendDescription.deserialize + Add named constants for legacy tx authDigest placeholder value + qa: Boost 1.77.0 + cargo update + Migrate to latest revisions of Zcash Rust crates + test: Set up mininodes at the start of feature_zip239 + net: Reject unknown CInv message types + make-release.py: Versioning changes for 4.5.0-rc1. + make-release.py: Updated manpages for 4.5.0-rc1. + +John Newbery (10): + [tests] Remove wallet accounts test + [wallet] GetBalance can take an isminefilter filter. + [wallet] Factor out GetWatchOnlyBalance() + [wallet] deduplicate GetAvailableCredit logic + [wallet] factor out GetAvailableWatchOnlyBalance() + [wallet] GetBalance can take a min_depth argument. + [RPC] [wallet] allow getbalance to use min_conf and watch_only without accounts. + [wallet] Remove wallet account RPCs + [wallet] Kill accounts + [net] split PushInventory() + +Jonas Schnelli (1): + fix locking issue with new mempool limiting + +Kris Nuttycombe (46): + Update transaction auth commitments for pre-v5 transactions. + Move OrchardBundle to its own header file. + Implement the Rust side of the incremental merkle tree FFI. + Orchard changes to coins & consensus. + Return std::optional for GetAnchor + Check nullifiers length against bundle actions length. + Add Orchard bundle commitments to merkle tree. + Add Orchard merkle tree anchor tests. + Documentation cleanup. + Update orchard dependency. + Update to released version of incrementalmerkletree + Apply suggestions from code review + Apply suggestions from code review + Fix Orchard incremental Merkle tree empty root. + Fix header guards for incremental_sinsemilla_tree.h + Apply style suggestions. + Consistently panic on null commitment tree pointers. + Fix implmentation of OrchardMerkleTree.DynamicMemoryUsage + Document source of Orchard merkle tree test data. + Apply suggestions from code review + Add consensus check for duplicate Orchard nullifiers within a single transaction. + Add Orchard nullifiers to nullifiers cache. + Apply suggestions from code review + Ensure Sapling versions are valid after NU5 + Make CTransaction::nConsensusBranchId a std::optional + Add NU5 upper bound check on nSpendsSapling, nOutputsSapling, nActionsOrchard + Check consensus branch ID for V5 transactions. + Rename tx.valueBalance -> tx.valueBalanceSapling + Make valueBalanceSapling a private non-const member of CTransaction. + Add Orchard value balance checks. + Account for Orchard balance in GetValueOut and GetShieldedValueIn. + Retract partial Orchard test support. + Add check that v5 transactions have empty Sprout joinsplits. + Prevent undefined behaviour in `CTransaction::GetValueOut()` + ZIP 213: Add checks to support Orchard shielded coinbase outputs. + Add check for consistency between nActionsOrchard and Orchard flags. + Ensure that the Orchard note commitment tree does not exceed its maximum size. + Update Orchard commitment tree hashes to use total MerkleCRH^Orchard. + Apply suggestions from code review + Make Sapling Spend and Ouput count, and Orchard Action count checks be noncontextual. + Use DOS level 100 for noncontextual checks. + Fix error strings to correctly reflect context. + Remove unused account-related wallet methods. + Use manual serialization for Merkle frontiers rather than bincode. + Fix clippy complaints. + Lock the wallet in SetBestChainINTERNAL + +Larry Ruane (1): + ZIP 225: v5 transaction check rules + +Luke Dashjr (1): + Optimisation: Store transaction list order in memory rather than compute it every need + +Marco Falke (1): + [qa] py2: Unfiddle strings into bytes explicitly + +Matt Corallo (4): + Fix calling mempool directly, instead of pool, in ATMP + Track (and define) ::minRelayTxFee in CTxMemPool + Add CFeeRate += operator + Print mempool size in KB when adding txn + +Patrick Strateman (5): + Fix insanity of CWalletDB::WriteTx and CWalletTx::WriteToDisk + Add CWallet::ListAccountCreditDebit + Add CWallet::ReorderTransactions and use in accounting_tests.cpp + Move CWalletDB::ReorderTransactions to CWallet + Move GetAccountBalance from rpcwallet.cpp into CWallet::GetAccountBalance + +Pieter Wuille (16): + Replace trickle nodes with per-node/message Poisson delays + Change mapRelay to store CTransactions + Make ProcessNewBlock dbp const and update comment + Switch reindexing to AcceptBlock in-loop and ActivateBestChain afterwards + Optimize ActivateBestChain for long chains + Add -reindex-chainstate that does not rebuild block index + Report reindexing progress in GUI + Split up and optimize transaction and block inv queues + Handle mempool requests in send loop, subject to trickle + Return mempool queries in dependency order + Add support for unique_ptr and shared_ptr to memusage + Switch CTransaction storage in mempool to std::shared_ptr + Optimize the relay map to use shared_ptr's + Optimization: don't check the mempool at all if no mempool req ever + Optimization: use usec in expiration and reuse nNow + Get rid of CTxMempool::lookup() entirely + +Russell Yanofsky (2): + [wallet] Add GetLegacyBalance method to simplify getbalance RPC + [wallet] Remove unneeded legacy getbalance code + +Shaul Kfir (1): + Add absurdly high fee message to validation state (for RPC propagation) + +Suhas Daftuar (3): + Use txid as key in mapAlreadyAskedFor + Reverse the sort on the mempool's feerate index + Only use AddInventoryKnown for transactions + +Technetium (1): + add missing aarch64 build deps + +Wladimir J. van der Laan (17): + streams: Add data() method to CDataStream + streams: Remove special cases for ancient MSVC + dbwrapper: Use new .data() method of CDataStream + wallet: Use CDataStream.data() + net: Consistent checksum handling + net: Hardcode protocol sizes and use fixed-size types + protocol.h: Move MESSAGE_START_SIZE into CMessageHeader + protocol.h: Make enums in GetDataMsg concrete values + Add assertion and cast before sending reject code + Add debug message to CValidationState for optional extra information + Introduce REJECT_INTERNAL codes for local AcceptToMempool errors + Add function to convert CValidationState to a human-readable message + Remove most logging from transaction validation + Add information to errors in ConnectBlock, CheckBlock + Move mempool rejections to new debug category + net: Fix sent reject messages for blocks and transactions + test: Add basic test for `reject` code + +hexabot (2): + Update depends/packages/native_clang.mk + Update depends/packages/native_rust.mk + +Marshall Gaucher (5): + Remove sprout funding flow logic + Add fix and note for timing issue + Update funding logic bug + Add usage documentation for manual and faucet driven tests + Update funding logic + +Jack Grigg (12): + Document next_pow2 effects and algorithm source + Improvements to CBlock::BuildAuthDataMerkleTree + rust: Explicitly return null hash for pre-v5 auth digests + book: Note that cargo patches work with absolute paths + Improve docs about setting CBlockIndex hash fields + test: Cleanups to ZIP 221 Python test code + Minor fixes to documentation and formatting + Fix typo in method documentation + Track lengths when copying receiver data from C++ to Rust + depends: Greatly simplify the Clang 12 patch + Adjust code comments to remove topological-sort references + Fix typos + diff --git a/doc/release-notes/release-notes-4.5.0.md b/doc/release-notes/release-notes-4.5.0.md new file mode 100644 index 000000000..94453bd74 --- /dev/null +++ b/doc/release-notes/release-notes-4.5.0.md @@ -0,0 +1,387 @@ +Notable changes +=============== + +Network Upgrade 5 +----------------- + +The code preparations for the Network Upgrade 5 consensus rules are finished and +included in this release. The following ZIPs are being deployed: + +- [ZIP 216: Require Canonical Jubjub Point Encodings](https://zips.z.cash/zip-0216) +- [ZIP 224: Orchard Shielded Protocol](https://zips.z.cash/zip-0224) +- [ZIP 225: Version 5 Transaction Format](https://zips.z.cash/zip-0225) +- [ZIP 239: Relay of Version 5 Transactions](https://zips.z.cash/zip-0239) +- [ZIP 244: Transaction Identifier Non-Malleability](https://zips.z.cash/zip-0244) + +NU5 will activate on testnet at height **1,590,000**, and can also be activated +at a specific height in regtest mode by setting the config option +`-nuparams=f919a198:HEIGHT`. + +The testnet activation of NU5, and `zcashd` v4.5.0 itself, is aimed at enabling +existing Zcash users to test their software and make the necessary changes to be +compatible with the new consensus rules. In particular: + +- Wallets should start adding support for v5 transactions. +- Miners and mining pools should ensure that their software is compatible with + the semantic change to the block header specified in + [ZIP 244](https://zips.z.cash/zip-0244#block-header-changes) + +A subsequent v4.5.1 release in the coming weeks will add support for generating +and using Unified Addresses ([ZIP 316](https://zips.z.cash/zip-0316)), which +will enable `zcashd` wallets to interact with the Orchard shielded pool. + +As with previous network upgrades, it is possible that backwards-incompatible +changes might be made to the consensus rules in this testing phase, prior to +setting the mainnet activation height. In the event that this happens, testnet +will be rolled back in v5.0.0 and a second testnet activation will occur. + +See [ZIP 252](https://zips.z.cash/zip-0252) for additional information about the +deployment process for NU5. + +Rejecting unknown `CInv` message types +-------------------------------------- + +Previously, if `zcashd` received an `inv` or `getdata` message containing +unknown `CInv` message types, it would ignore them and process the remainder of +the message. Starting with v4.5.0, `zcashd` will instead drop the entire `inv` +or `getdata` message and reply with a `reject` message. This will enable node +operators to discover whether their nodes are sending unexpected `CInv` types; +in particular, node operators should ensure their software does not produce the +`MSG_WTX` CInv message type intended for the Bitcoin network, which is +incompatible with the `MSG_WTX` CInv message type defined in ZIP 239 (which will +be used from NU5 activation for advertising v5 transactions). + +Deprecated or removed RPCs +-------------------------- + +- The 'account' API inherited from Bitcoin Core has been disabled since the + launch of Zcash. Following its deprecation in Bitcoin Core v0.17 and removal + in Bitcoin Core v0.18, we have now removed the API from `zcashd`. + + +Changelog +========= + +Aditya Kulkarni (1): + Sort taddr txns by txindex in addition to height + +Alex Morcos (4): + Store the total sig op count of a tx. + Add a score index to the mempool. + Add TxPriority class and comparator + tidy up CInv::GetCommand + +Daira Hopwood (8): + Improve error message when a block would overfill the Orchard commitment tree. + More precise terminology: "lock free" -> "unlocked" + ZIP 339 support. + Update URL for Boost source download (from dl.bintray.com to boostorg.jfrog.io). + Cargo.toml: use librustzcash after the merge of https://github.com/zcash/librustzcash/pull/424 . + Update unified address test data to take account of HRPs in padding (https://github.com/zcash/librustzcash/pull/419). + Avoid need to cast away const in the C caller of zip339_free_phrase. + Update authors of librustzcash to everyone currently and formerly on Core team (in alphabetical order). + +Eric Lombrozo (2): + Removed ppszTypeName from protocol.cpp + getdata enum issue fix + +Ethan Heilman (1): + Fix typo adddrman to addrman as requested in #8070 + +Ethan Heilman (1): + Remove non-determinism which is breaking net_tests #8069 + +Gregory Maxwell (4): + Eliminate TX trickle bypass, sort TX invs for privacy and priority. + Move bloom and feerate filtering to just prior to tx sending. + Do not use mempool for GETDATA for tx accepted after the last mempool req. + Defer inserting into maprelay until just before relaying. + +Jack Grigg (124): + Re-include reading blocks from disk in block connection benchmark + cargo update + Migrate to latest zcash_* crates + metrics 0.16 and metrics-exporter-prometheus 0.5 + Implement ZIP 216 consensus rules + Extract SpendDescriptionV5 and OutputDescriptionV5 classes + rust: Enable C++ streams to be passed into Rust code + ZIP 225 tx format constants + v5 transaction format parser + contrib: Add BOSL to contrib/debian/copyright + Remove early return logic from transaction parsing + rust: Document read_callback_t and write_callback_t + CTransaction: Make new ZIP 225 fields non-const and private + ZIP 244 transaction digests + ZIP 244 signature digests + ZIP 244 hashAuthDataRoot computation + Fix tests that assume CTxOuts can be "null" + test: Generate valid Sapling types + test: Small fixes to sighash test vector generation + test: Regenerate sighash.json after generator fixes + Throw an exception instead of asserting if Rust tx parser fails + CI: Publish correct book directory + CI: Build book with latest mdbook + rust: Documentation improvements to FFI methods + Implement Orchard authorization batch validator + Implement Orchard signature validation consensus rules + rust: Fix patched dependencies + book: Add dev guide page about Rust dependencies + Rename hashLightClientRoot to hashBlockCommitments in block header + ZIP 244 hashBlockCommitments implementation + test: Check for valid hashBlockCommitments construction post-NU5 + Skip hashBlockCommitments check when testing block templates + test: Check hashBlockCommitments before, at, and after NU5 activation + ConnectBlock: Check NU activation when deriving block commitments + Copy authDigest in CTransaction::operator=(const CTransaction &tx) + rust: Move history tree FFI logic into a module + rust: Migrate to zcash_history with versioned trees + rust: Move history tree FFI declarations into a separate header + test: Use valid consensus branch IDs in history tree tests + Use V2 history trees from NU5 onward + test: Check history trees across Canopy and NU5 activations + rpc: Document getblock RPC finalorchardroot field, omit before NU5 + rust: Document some requirements for history tree FFI methods + test: Add test case for popping from an empty history tree + Implement Orchard pool value tracking + rust: Load Orchard circuit parameters at startup + Check Orchard bundle-specific consensus rules, i.e. proofs + test: Update CCoinsViewTest with changes to CCoinsView interface + Include Orchard bundle in transaction dynamic usage + ZIP 203: Enforce coinbase nExpiryHeight consensus rule from NU5 + test: Check for updated empty-tx reject messages in transaction tests + test: Fix OverwinterExpiryHeight test after ZIP 203 contextual changes + miner: Set coinbase expiry height to block height from NU5 activation + Introduce libzcash::RawAddress type + Use `libzcash::RawAddress` in `CWallet::GetFilteredNotes` + Use a visitor for handling -mineraddress config option + Add support for decoding and encoding Unified Addresses + Pass network type through to UA address handling logic + CI: Add workflow that runs general lints + CI: Check scripted diffs + CI: Add Rust lints + Document why a nested call to ExtractMinerAddress is not recursive + Add constants for UA typecodes + Postpone dependency updates we aren't doing in this release + depends: Update Rust to 1.54.0 + depends: Update Clang / libcxx to LLVM 12 + depends: Update utfcpp to 3.2.1 + depends: Fix issue cross-compiling BDB to Windows with Clang 12 + rust: cargo update + rust: metrics 0.17 + CI: Use Rust 1.54 for lints + cargo fmt + test: Wait for transaction propagation in shorter_block_times RPC test + test: Fix race condition in p2p_txexpiringsoon + Revert "Remove reference to -reindex-chainstate" + test: Flush wallet in WriteCryptedSaplingZkeyDirectToDb before reopening + qa: Bump `sync_mempool` timeout for `prioritisetransaction.py` + ProcessGetData(): Rework IsExpiringSoon check + test: Print reject reason if RPC test block rejected instead of accepted + test: Fix pyflakes warnings + CI: Ignore errors from general lints we don't yet have passing + lint: remove duplicate include + lint: Add missing include guards + test: Add NU5 test cases to existing RPC tests + builder: Generate v5 transactions from NU5 activation + Print `nConsensusBranchId` in `CTransaction::ToString` + Separate the consensus and internal consistency checks for branch ID + Parse consensus branch ID when reading v5 transaction format + test: Use correct field of getnetworkinfo to read protocol version + CI: Add Dependabot config to keep Actions up-to-date + Introduce a WTxId struct + Implement CInv message type MSG_WTX + test: Fix bugs in mininode transaction parser + test: Add v5 tx support to mininode + ProcessGetData: Respond to MSG_WTX requests + Add MSG_WTX support to inv messages + Use wtxid for peer state management + test: Implement CInv.__eq__() for mininode to simplify RPC test + Postpone dependency updates that require CMake + depends: Update Rust to 1.54.0 + test: Fix bug in mininode.SpendDescription.deserialize + Add named constants for legacy tx authDigest placeholder value + qa: Boost 1.77.0 + cargo update + Migrate to latest revisions of Zcash Rust crates + test: Set up mininodes at the start of feature_zip239 + net: Reject unknown CInv message types + make-release.py: Versioning changes for 4.5.0-rc1. + make-release.py: Updated manpages for 4.5.0-rc1. + make-release.py: Updated release notes and changelog for 4.5.0-rc1. + Migrate to latest revisions of orchard and the zcash_* crates + contrib: Add script for generating a graph of our Rust dependencies + cargo update + build: Add primitives/orchard.h to list of header files + build: Ensure that cargo uses vendored dependencies for git repos + build: Add missing source file to zcash_gtest_SOURCES + rust: Move Orchard batch logic into BatchValidator methods + wallet: Batch-validate all Orchard signatures in the wallet on load + rust: Skip running the Orchard batch validator on an empty batch + bench: Add Orchard logic to zcbenchmarks + cargo update + Update halo2 and orchard dependencies with BOSL Zcash exception + make-release.py: Versioning changes for 4.5.0. + make-release.py: Updated manpages for 4.5.0. + +John Newbery (10): + [tests] Remove wallet accounts test + [wallet] GetBalance can take an isminefilter filter. + [wallet] Factor out GetWatchOnlyBalance() + [wallet] deduplicate GetAvailableCredit logic + [wallet] factor out GetAvailableWatchOnlyBalance() + [wallet] GetBalance can take a min_depth argument. + [RPC] [wallet] allow getbalance to use min_conf and watch_only without accounts. + [wallet] Remove wallet account RPCs + [wallet] Kill accounts + [net] split PushInventory() + +Jonas Schnelli (1): + fix locking issue with new mempool limiting + +Kris Nuttycombe (46): + Update transaction auth commitments for pre-v5 transactions. + Move OrchardBundle to its own header file. + Implement the Rust side of the incremental merkle tree FFI. + Orchard changes to coins & consensus. + Return std::optional for GetAnchor + Check nullifiers length against bundle actions length. + Add Orchard bundle commitments to merkle tree. + Add Orchard merkle tree anchor tests. + Documentation cleanup. + Update orchard dependency. + Update to released version of incrementalmerkletree + Apply suggestions from code review + Apply suggestions from code review + Fix Orchard incremental Merkle tree empty root. + Fix header guards for incremental_sinsemilla_tree.h + Apply style suggestions. + Consistently panic on null commitment tree pointers. + Fix implmentation of OrchardMerkleTree.DynamicMemoryUsage + Document source of Orchard merkle tree test data. + Apply suggestions from code review + Add consensus check for duplicate Orchard nullifiers within a single transaction. + Add Orchard nullifiers to nullifiers cache. + Apply suggestions from code review + Ensure Sapling versions are valid after NU5 + Make CTransaction::nConsensusBranchId a std::optional + Add NU5 upper bound check on nSpendsSapling, nOutputsSapling, nActionsOrchard + Check consensus branch ID for V5 transactions. + Rename tx.valueBalance -> tx.valueBalanceSapling + Make valueBalanceSapling a private non-const member of CTransaction. + Add Orchard value balance checks. + Account for Orchard balance in GetValueOut and GetShieldedValueIn. + Retract partial Orchard test support. + Add check that v5 transactions have empty Sprout joinsplits. + Prevent undefined behaviour in `CTransaction::GetValueOut()` + ZIP 213: Add checks to support Orchard shielded coinbase outputs. + Add check for consistency between nActionsOrchard and Orchard flags. + Ensure that the Orchard note commitment tree does not exceed its maximum size. + Update Orchard commitment tree hashes to use total MerkleCRH^Orchard. + Apply suggestions from code review + Make Sapling Spend and Ouput count, and Orchard Action count checks be noncontextual. + Use DOS level 100 for noncontextual checks. + Fix error strings to correctly reflect context. + Remove unused account-related wallet methods. + Use manual serialization for Merkle frontiers rather than bincode. + Fix clippy complaints. + Lock the wallet in SetBestChainINTERNAL + +Larry Ruane (1): + ZIP 225: v5 transaction check rules + +Luke Dashjr (1): + Optimisation: Store transaction list order in memory rather than compute it every need + +Marco Falke (1): + [qa] py2: Unfiddle strings into bytes explicitly + +Matt Corallo (4): + Fix calling mempool directly, instead of pool, in ATMP + Track (and define) ::minRelayTxFee in CTxMemPool + Add CFeeRate += operator + Print mempool size in KB when adding txn + +Patrick Strateman (5): + Fix insanity of CWalletDB::WriteTx and CWalletTx::WriteToDisk + Add CWallet::ListAccountCreditDebit + Add CWallet::ReorderTransactions and use in accounting_tests.cpp + Move CWalletDB::ReorderTransactions to CWallet + Move GetAccountBalance from rpcwallet.cpp into CWallet::GetAccountBalance + +Pieter Wuille (16): + Replace trickle nodes with per-node/message Poisson delays + Change mapRelay to store CTransactions + Make ProcessNewBlock dbp const and update comment + Switch reindexing to AcceptBlock in-loop and ActivateBestChain afterwards + Optimize ActivateBestChain for long chains + Add -reindex-chainstate that does not rebuild block index + Report reindexing progress in GUI + Split up and optimize transaction and block inv queues + Handle mempool requests in send loop, subject to trickle + Return mempool queries in dependency order + Add support for unique_ptr and shared_ptr to memusage + Switch CTransaction storage in mempool to std::shared_ptr + Optimize the relay map to use shared_ptr's + Optimization: don't check the mempool at all if no mempool req ever + Optimization: use usec in expiration and reuse nNow + Get rid of CTxMempool::lookup() entirely + +Russell Yanofsky (2): + [wallet] Add GetLegacyBalance method to simplify getbalance RPC + [wallet] Remove unneeded legacy getbalance code + +Shaul Kfir (1): + Add absurdly high fee message to validation state (for RPC propagation) + +Suhas Daftuar (3): + Use txid as key in mapAlreadyAskedFor + Reverse the sort on the mempool's feerate index + Only use AddInventoryKnown for transactions + +Technetium (1): + add missing aarch64 build deps + +Wladimir J. van der Laan (17): + streams: Add data() method to CDataStream + streams: Remove special cases for ancient MSVC + dbwrapper: Use new .data() method of CDataStream + wallet: Use CDataStream.data() + net: Consistent checksum handling + net: Hardcode protocol sizes and use fixed-size types + protocol.h: Move MESSAGE_START_SIZE into CMessageHeader + protocol.h: Make enums in GetDataMsg concrete values + Add assertion and cast before sending reject code + Add debug message to CValidationState for optional extra information + Introduce REJECT_INTERNAL codes for local AcceptToMempool errors + Add function to convert CValidationState to a human-readable message + Remove most logging from transaction validation + Add information to errors in ConnectBlock, CheckBlock + Move mempool rejections to new debug category + net: Fix sent reject messages for blocks and transactions + test: Add basic test for `reject` code + +hexabot (2): + Update depends/packages/native_clang.mk + Update depends/packages/native_rust.mk + +Marshall Gaucher (5): + Remove sprout funding flow logic + Add fix and note for timing issue + Update funding logic bug + Add usage documentation for manual and faucet driven tests + Update funding logic + +Jack Grigg (12): + Document next_pow2 effects and algorithm source + Improvements to CBlock::BuildAuthDataMerkleTree + rust: Explicitly return null hash for pre-v5 auth digests + book: Note that cargo patches work with absolute paths + Improve docs about setting CBlockIndex hash fields + test: Cleanups to ZIP 221 Python test code + Minor fixes to documentation and formatting + Fix typo in method documentation + Track lengths when copying receiver data from C++ to Rust + depends: Greatly simplify the Clang 12 patch + Adjust code comments to remove topological-sort references + Fix typos + diff --git a/doc/release-notes/release-notes-4.5.1-1.md b/doc/release-notes/release-notes-4.5.1-1.md new file mode 100644 index 000000000..f7847c3bc --- /dev/null +++ b/doc/release-notes/release-notes-4.5.1-1.md @@ -0,0 +1,46 @@ +Notable changes +=============== + +Added v5 transactions to standard rules +--------------------------------------- + +In v4.5.0 we added the v5 transaction format to the NU5 consensus rules for +testnet. However, it was omitted from the standard rules, which meant that +`zcashd` testnet nodes would not accept v5 transactions into their mempools, +causing them to not be propagated or mined. This release updates the `zcashd` +standard rules to accept v5 transactions alongside v4 transactions. + +New `listaddresses` RPC method +------------------------------ + +The `listaddresses` endpoint has been added to the RPC API. This method +allows the caller to obtain addresses managed by the wallet, grouped +by the source of the address, including both those addresses generated +by the wallet and those associated with imported viewing or spending +keys. This provides functionality that replaces and subsumes the +previously-removed `getaddressesbyaccount` method. + +Changelog +========= + +Jack Grigg (6): + Mark v5 transaction format as standard for NU5 + Fix comment + cargo update + depends: Postpone dependency updates + make-release.py: Versioning changes for 4.5.1-1. + make-release.py: Updated manpages for 4.5.1-1. + +Kris Nuttycombe (11): + Add `listaddresses` RPC method. + Categorize listaddresses result by source type. + Correctly handle imported Sapling addresses + Apply suggestions from code review + Apply suggestions from code review + Group legacy_hdseed Sapling addresses by account ID. + Update release notes for v4.5.1-1 to reflect the addition of `listaddresses` + Include `ImportedWatchOnly` as a PaymentAddressSource result. + Add listaddresses check to wallet_addresses.py + Consistently group Sapling addresses by IVK for every source. + Use lowerCamelCase for listaddresses JSON + diff --git a/doc/release-notes/release-notes-4.5.1.md b/doc/release-notes/release-notes-4.5.1.md new file mode 100644 index 000000000..c0229a5e7 --- /dev/null +++ b/doc/release-notes/release-notes-4.5.1.md @@ -0,0 +1,80 @@ +Notable changes +=============== + +Fixed bugs in the testnet Orchard circuit +----------------------------------------- + +In the `zcashd v4.5.0` release notes we indicated that a testnet rollback might +occur to update the consensus rules, if we needed to make backwards-incompatible +changes. Shortly after `zcashd v4.5.0` was released, during another internal +review of the Orchard circuit, we identified two bugs that would affect the +upcoming testnet activation of NU5: + +- The diversifier base `g_d_old`, for the note being spent, is required to be a + non-identity point. A note created from a payment address with `g_d` set to + the identity (via collaboration between sender and recipient) could be spent + multiple times with different nullifiers (corresponding to different `ivk`s). + The code outside the circuit correctly enforced the non-identity requirement, + but the circuit did not correctly constrain this, and allowed the prover to + witness the identity. + +- SinsemillaCommit can be modeled as a Pedersen commitment to an output of + SinsemillaHash: `SinsemillaCommit(r, M) = SinsemillaHashToPoint(M) + [r] R`. + The specification used incomplete addition here, matching its use inside + SinsemillaHash. However, unlike in SinsemillaHash, an exceptional case can be + produced here when `r = 0`. The derivations of `rivk` (for computing `ivk`) + and `rcm` (for computing the note commitment) normally ensure that `r = 0` + can only occur with negligible probability, but these derivations are not + checked by the circuit for efficiency; thus SinsemillaCommit needs to use + complete addition. + +These bugs do not affect mainnet, as `zcashd v4.5.0` only set the activation +height for NU5 on testnet for testing purposes. Nevertheless, in the interest of +keeping the testnet environment as close to mainnet as possible, we are fixing +these bugs immediately. This means a change to the NU5 consensus rules, and a +new testnet activation height for NU5. + +To this end, the following changes are made in `zcashd v4.5.1`: + +- The consensus branch ID for NU5 is changed to `0x37519621`. +- The protocol version indicating NU5-aware testnet nodes is set to `170015`. +- The testnet activation height for NU5 is set to **1,599,200**. + +Testnet nodes that upgrade to `zcashd v4.5.1` prior to block height 1,590,000 +will follow the new testnet network upgrade. Testnet nodes that are running +`zcashd v4.5.0` at that height will need to upgrade to `v4.5.1` and then run +with `-reindex`. + +As always, it is possible that further backwards-incompatible changes might be +made to the NU5 consensus rules in this testing phase, prior to setting the +mainnet activation height, as we continue to conduct additional internal review. +In the event that this happens, testnet will be rolled back in (or prior to) +v5.0.0, and a new testnet activation will occur. + +Fixed regression in `getbalance` RPC method +------------------------------------------- + +`zcashd v4.5.0` removed the account API from the wallet, following its +deprecation and removal in upstream Bitcoin Core. As part of the upstream +changes, the `getbalance` RPC method was altered from using two custom balance +computation methods, to instead relying on `CWallet::GetBalance`. This method +internally relies on `CWalletTx::IsFromMe` as part of identifying "trusted" +zero-confirmation transactions to include in the balance calculation. + +There is an equivalent and closely-named `CWallet::IsFromMe` method, which is +used throughout the wallet, and had been updated before Zcash launched to be +aware of spent shielded notes. The change to `getbalance` exposed a bug: +`CWalletTx::IsFromMe` had not been similarly updated, which caused `getbalance` +to ignore wallet-internal (sent between two addresses in the node's wallet) +unshielding transactions with zero confirmations. This release fixes the bug. + +Changelog +========= + +Jack Grigg (5): + wallet: Check spent shielded notes in CWalletTx::IsFromMe + Fix bugs in testnet Orchard circuit + depends: Postpone native_ccache 4.4.2 + make-release.py: Versioning changes for 4.5.1. + make-release.py: Updated manpages for 4.5.1. + diff --git a/doc/release-notes/release-notes-4.6.0-1.md b/doc/release-notes/release-notes-4.6.0-1.md new file mode 100644 index 000000000..975376aa1 --- /dev/null +++ b/doc/release-notes/release-notes-4.6.0-1.md @@ -0,0 +1,37 @@ +`getblocktemplate` regression fix +================================= + +We added support for the NU5 consensus rules in v4.5.0, which alters the +block header to contain a `hashBlockCommitments` value instead of the +chain history root. However, the output of `getblocktemplate` wasn't +returning this value; once NU5 activated, the `blockcommitmentshash` +field was being set to "null" (all-zeroes). + +In v4.6.0 we added full NU5 support to `getblocktemplate`, by adding a +`defaultroots` field that gave default values for `hashBlockCommitments` +and the components required to derive it. However, in doing so we +introduced a regression in the (now-deprecated) legacy fields, where +prior to NU5 activation they contained nonsense. + +This release fixes the output of `getblocktemplate` to have the intended +semantics for all fields: + +- The `blockcommitmentshash` and `authdataroot` fields in `defaultroots` + are now omitted from block templates for heights before NU5 activation. + +- The legacy fields now always contain the default value to be placed + into the block header (regaining their previous semantics). + +Changelog +========= + +Jack Grigg (3): + rpc: Fix regression in getblocktemplate output + make-release.py: Versioning changes for 4.6.0-1. + make-release.py: Updated manpages for 4.6.0-1. + +Larry Ruane (3): + assert that the return value of submitblock is None + test: check getblocktemplate output before and after NU5 + test: Fix ZIP 244 implementation + diff --git a/doc/release-notes/release-notes-4.6.0-2.md b/doc/release-notes/release-notes-4.6.0-2.md new file mode 100644 index 000000000..ae6f649f5 --- /dev/null +++ b/doc/release-notes/release-notes-4.6.0-2.md @@ -0,0 +1,47 @@ +This is a bugfix release that also bumps the End-of-Support height to May 16th. +It backports bugfixes from v4.7.0-rc1, including a `getblocktemplate` deadlock +fix, and several portability fixes. + +Debian 9 "Stretch" is no longer supported from v4.6.0-2, due to its +[end-of-life](https://wiki.debian.org/LTS/Stretch) on June 30th, 2022. This will +allow us to direct more resources to supporting Debian 11 Bullseye, other Linux +distributions, and other platforms such as Windows and macOS. + +Changelog +========= + +Charlie O'Keefe (2): + Update base image used by Dockerfile from debian 10 to debian 11 + Remove stretch (debian 9), add bullseye (debian 11) in gitian descriptor + +Daira Hopwood (4): + Avoid a warning by explicitly calling drop. + Replace call to drop with zeroization. + qa/zcash/updatecheck.py: print status code and response of failed http requests. + Postpone native_clang and libcxx 14.0.0. + +Jack Grigg (9): + qa: Bump all postponed dependencies + qa: Postpone recent CCache release + depends: Update Rust to 1.59.0 + depends: Update Clang / libcxx to LLVM 13.0.1 + rust: Fix clippy lint + depends: Revert to `libc++ 13.0.0-3` for Windows cross-compile + qa: Exclude `native_libtinfo` from dependency update checks + make-release.py: Versioning changes for 4.6.0-2. + make-release.py: Updated manpages for 4.6.0-2. + +Larry Ruane (1): + document global variables + +Pieter Wuille (2): + Fix csBestBlock/cvBlockChange waiting in rpc/mining + Modernize best block mutex/cv/hash variable naming + +Taylor Hornby (1): + Untested, not working yet, use libtinfo from the debian packages + +sasha (2): + on Arch only, use Debian's libtinfo5_6.0 to satisfy clang + remove superfluous space at end of native_packages line + diff --git a/doc/release-notes/release-notes-4.6.0-rc1.md b/doc/release-notes/release-notes-4.6.0-rc1.md new file mode 100644 index 000000000..1bfd543d0 --- /dev/null +++ b/doc/release-notes/release-notes-4.6.0-rc1.md @@ -0,0 +1,111 @@ +Notable changes +=============== + +Wallet +------ + +From this release, newly-created wallets will save the chain name ("Zcash") and +network identifier (e.g. "main") to the `wallet.dat` file. This will enable the +`zcashd` node to check on subsequent starts that the `wallet.dat` file matches +the node's configuration. Existing wallets will start saving this information in +a later release. + +`libzcash_script` +----------------- + +Two new APIs have been added to this library (`zcash_script_legacy_sigop_count` +and `zcash_script_legacy_sigop_count_precomputed`), for counting the number of +signature operations in the transparent inputs and outputs of a transaction. +The presence of these APIs is indicated by a library API version of 2. + +Updated RPCs +------------ + +- Fixed an issue where `ERROR: spent index not enabled` would be logged + unnecessarily on nodes that have either insightexplorer or lightwalletd + configuration options enabled. + +- The `getmininginfo` RPC now omits `currentblockize` and `currentblocktx` + when a block was never assembled via RPC on this node during its current + process instantiation. (#5404) + +Changelog +========= + +Alex Wied (1): + Update support for FreeBSD + +Charlie O'Keefe (1): + Add buster to the list of suites used by gitian + +Dimitris Apostolou (1): + Fix typos + +Jack Grigg (22): + contrib: Update Debian copyright file to follow the v1 format + contrib: Add license information for libc++ and libevent + cargo update + tracing-subscriber 0.3 + Bump all postponed dependencies + depends: Update Rust to 1.56.1 + depends: Update Clang / libcxx to LLVM 13 + rust: Move `incremental_sinsemilla_tree_ffi` into crate root + CI: Add Pyflakes to lints workflow + cargo update + ed25519-zebra 3 + cargo update + cargo update + depends: Update Boost to 1.78.0 + depends Update Rust to 1.57.0 + qa: Postpone recent CCache releases + Revert "lint: Fix false positive" + rust: Remove misleading log message + Migrate to latest revisions of Zcash Rust crates + Update release notes + make-release.py: Versioning changes for 4.6.0-rc1. + make-release.py: Updated manpages for 4.6.0-rc1. + +Janito Vaqueiro Ferreira Filho (1): + Move `CurrentTxVersionInfo` into a new file + +Kris Nuttycombe (7): + Add BIP 44 coin type to persisted wallet state. + Persist network id string instead of bip44 coin type. + Add a check to test that wallet load fails if we're on the wrong network. + Remove unused `AddDestData` method. + Fix wallet-related wording in doc/reduce-traffic.md + Rename OrchardMerkleTree -> OrchardMerkleFrontier + Batch-verify Orchard transactions at the block level. + +Larry Ruane (6): + add TestSetIBD(bool) for testing + Disable IBD for all boost tests + better wallet network info error handling + test: automatically add missing nuparams + Don't log 'ERROR: spent index not enabled' + getblocktemplate: add NU5 commitments to new `defaultroots` section + +Marco Falke (1): + [rpc] mining: Omit uninitialized currentblockweight, currentblocktx + +Marshall Gaucher (1): + Update entrypoint.sh + +Sasha (1): + fix typo in docker run's volume argument + +sgmoore (1): + Update reduce-traffic.md - add one word + +Jack Grigg (1): + contrib: Add space between URL and period + +teor (7): + Add sigop count functions to zcash_script library + Increment the zcash_script API version + Remove an unused header + Use correct copyright header + Remove redundant variable + Explain UINT_MAX error return value + Explain how to get rid of a tiny duplicated function + diff --git a/doc/release-notes/release-notes-4.6.0.md b/doc/release-notes/release-notes-4.6.0.md new file mode 100644 index 000000000..26e1f3652 --- /dev/null +++ b/doc/release-notes/release-notes-4.6.0.md @@ -0,0 +1,126 @@ +Notable changes +=============== + +Wallet +------ + +From this release, newly-created wallets will save the chain name ("Zcash") and +network identifier (e.g. "main") to the `wallet.dat` file. This will enable the +`zcashd` node to check on subsequent starts that the `wallet.dat` file matches +the node's configuration. Existing wallets will start saving this information in +a later release. + +`libzcash_script` +----------------- + +Two new APIs have been added to this library (`zcash_script_legacy_sigop_count` +and `zcash_script_legacy_sigop_count_precomputed`), for counting the number of +signature operations in the transparent inputs and outputs of a transaction. +The presence of these APIs is indicated by a library API version of 2. + +Updated RPCs +------------ + +- The `getblocktemplate` RPC method output now includes a `defaultroots` field, + which provides various tree roots and block commitments matching the contents + of the block template. If any part of the block template marked as `mutable` + in the RPC method output is mutated, these roots may need to be recomputed. + For more information on the derivation process, see the block header changes + in [ZIP 244](https://zips.z.cash/zip-0244#block-header-changes). + +- Fixed an issue where `ERROR: spent index not enabled` would be logged + unnecessarily on nodes that have either `-insightexplorer` or `-lightwalletd` + configuration options enabled. + +- The `getmininginfo` RPC now omits `currentblocksize` and `currentblocktx` + when a block was never assembled via RPC on this node during its current + process instantiation. (#5404) + +Changelog +========= + +Alex Wied (1): + Update support for FreeBSD + +Charlie O'Keefe (2): + Add buster to the list of suites used by gitian + Add libtinfo5 to gitian packages list + +Dimitris Apostolou (1): + Fix typos + +Jack Grigg (23): + contrib: Update Debian copyright file to follow the v1 format + contrib: Add license information for libc++ and libevent + cargo update + tracing-subscriber 0.3 + Bump all postponed dependencies + depends: Update Rust to 1.56.1 + depends: Update Clang / libcxx to LLVM 13 + rust: Move `incremental_sinsemilla_tree_ffi` into crate root + CI: Add Pyflakes to lints workflow + cargo update + ed25519-zebra 3 + cargo update + cargo update + depends: Update Boost to 1.78.0 + depends Update Rust to 1.57.0 + qa: Postpone recent CCache releases + Revert "lint: Fix false positive" + rust: Remove misleading log message + Migrate to latest revisions of Zcash Rust crates + Update release notes + make-release.py: Versioning changes for 4.6.0-rc1. + make-release.py: Updated manpages for 4.6.0-rc1. + make-release.py: Updated release notes and changelog for 4.6.0-rc1. + +Janito Vaqueiro Ferreira Filho (1): + Move `CurrentTxVersionInfo` into a new file + +Kris Nuttycombe (7): + Add BIP 44 coin type to persisted wallet state. + Persist network id string instead of bip44 coin type. + Add a check to test that wallet load fails if we're on the wrong network. + Remove unused `AddDestData` method. + Fix wallet-related wording in doc/reduce-traffic.md + Rename OrchardMerkleTree -> OrchardMerkleFrontier + Batch-verify Orchard transactions at the block level. + +Larry Ruane (8): + add TestSetIBD(bool) for testing + Disable IBD for all boost tests + better wallet network info error handling + test: automatically add missing nuparams + Don't log 'ERROR: spent index not enabled' + getblocktemplate: add NU5 commitments to new `defaultroots` section + test: fix bugs in test framework + test: Use result of getblocktemplate to submitblock + +Marco Falke (1): + [rpc] mining: Omit uninitialized currentblockweight, currentblocktx + +Marshall Gaucher (1): + Update entrypoint.sh + +Sasha (5): + fix typo in docker run's volume argument + update hash for librustzcash + only librustzcash in config.offline + make-release.py: Versioning changes for 4.6.0. + make-release.py: Updated manpages for 4.6.0. + +sgmoore (1): + Update reduce-traffic.md - add one word + +Jack Grigg (1): + contrib: Add space between URL and period + +teor (7): + Add sigop count functions to zcash_script library + Increment the zcash_script API version + Remove an unused header + Use correct copyright header + Remove redundant variable + Explain UINT_MAX error return value + Explain how to get rid of a tiny duplicated function + diff --git a/doc/release-notes/release-notes-4.7.0-rc1.md b/doc/release-notes/release-notes-4.7.0-rc1.md new file mode 100644 index 000000000..d428fa1d1 --- /dev/null +++ b/doc/release-notes/release-notes-4.7.0-rc1.md @@ -0,0 +1,538 @@ +Notable changes +=============== + +Mnemonic Recovery Phrases +------------------------- + +The zcashd wallet has been modified to support BIP 39, which describes how to +derive the wallet's HD seed from a mnemonic phrase. The mnemonic phrase will +be generated on load of the wallet, or the first time the wallet is unlocked, +and is available via the `z_exportwallet` RPC call. All new addresses produced +by the wallet are now derived from this seed using the HD wallet functionality +described in ZIP 32 and ZIP 316. For users upgrading an existing Zcashd wallet, +it is recommended that the wallet be backed up prior to upgrading to the 4.7.0 +Zcashd release. + +Following the upgrade to 4.7.0, Zcashd will require that the user confirm that +they have backed up their new emergency recovery phrase, which may be obtained +from the output of the `z_exportwallet` RPC call. This confirmation can be +performed manually using the `zcashd-wallet-tool` utility that is supplied +with this release (built or installed in the same directory as `zcashd`). +The wallet will not allow the generation of new addresses until this +confirmation has been performed. It is recommended that after this upgrade, +that funds tied to preexisting addresses be migrated to newly generated +addresses so that all wallet funds are recoverable using the emergency +recovery phrase going forward. If you choose not to migrate funds in this +fashion, you will continue to need to securely back up the entire `wallet.dat` +file to ensure that you do not lose access to existing funds; EXISTING FUNDS +WILL NOT BE RECOVERABLE USING THE EMERGENCY RECOVERY PHRASE UNLESS THEY HAVE +BEEN MOVED TO A NEWLY GENERATED ADDRESS FOLLOWING THE 4.7.0 UPGRADE. + +New RPC Methods +--------------- + +- 'walletconfirmbackup' This newly created API checks a provided emergency + recovery phrase against the wallet's emergency recovery phrase; if the phrases + match then it updates the wallet state to allow the generation of new addresses. + This backup confirmation workflow can be disabled by starting zcashd with + `-requirewalletbackup=false` but this is not recommended unless you know what + you're doing (and have otherwise backed up the wallet's recovery phrase anyway). + For security reasons, this RPC method is not intended for use via zcash-cli + but is provided to enable `zcashd-wallet-tool` and other third-party wallet + interfaces to satisfy the backup confirmation requirement. Use of the + `walletconfirmbackup` API via zcash-cli would risk that the recovery phrase + being confirmed might be leaked via the user's shell history or the system + process table; `zcashd-wallet-tool` is specifically provided to avoid this + problem. +- 'z_getbalanceforviewingkey' This newly created API allows a user to obtain + balance information for funds visible to a Sapling or Unified full + viewing key; if a Sprout viewing key is provided, this method allows + retrieval of the balance only in the case that the wallet controls the + corresponding spending key. + +RPC Changes +----------- + +- The results of the 'dumpwallet' and 'z_exportwallet' RPC methods have been modified + to now include the wallet's newly generated emergency recovery phrase as part of the + exported data. + +- The results of the 'getwalletinfo' RPC have been modified to return two new fields: + `mnemonic_seedfp` and `legacy_seedfp`, the latter of which replaces the field that + was previously named `seedfp`. + +Wallet +------ + +'z_sendmany' +------------ + +- The 'z_sendmany' RPC call no longer permits Sprout recipients in the + list of recipient addresses. Transactions spending Sprout funds will + still result in change being sent back into the Sprout pool, but no + other `Sprout->Sprout` transactions will be constructed by the Zcashd + wallet. + +- The restriction that prohibited `Sprout->Sapling` transactions has been + lifted; however, since such transactions reveal the amount crossing + pool boundaries, they must be explicitly enabled via a parameter to + the 'z_sendmany' call. + +- A new string parameter, `privacyPolicy`, has been added to the list of + arguments accepted by `z_sendmany`. This parameter enables the caller to + control what kind of information they permit `zcashd` to reveal when creating + the transaction. If the transaction can only be created by revealing more + information than the given strategy permits, `z_sendmany` will return an + error. The parameter defaults to `LegacyCompat`, which applies the most + restrictive strategy `FullPrivacy` when a Unified Address is present as the + sender or a recipient, and otherwise preserves existing behaviour (which + corresponds to the `AllowFullyTransparent` policy). + +- Since Sprout outputs are no longer created (with the exception of change) + 'z_sendmany' no longer generates payment disclosures (which were only + available for Sprout outputs) when the `-paymentdisclosure` experimental + feature flag is set. + +Changelog +========= + +Charlie O'Keefe (2): + Update base image used by Dockerfile from debian 10 to debian 11 + Remove stretch (debian 9), add bullseye (debian 11) in gitian descriptor + +Conrado Gouvea (1): + Add comment to zcash_script_new_precomputed_tx about references to input buffers + +Daira Hopwood (25): + Avoid a warning by explicitly calling drop. + Replace call to drop with zeroization. + contrib/devtools/rust-deps-graph.sh: allow overriding the arguments to `cargo deps`. + Cosmetic whitespace change + Make a zcashd-wallet-tool executable. + Attempt to fix linking problem on ARM. + Add some text about choosing location of the physical backup. Add TODO for better handling of file not found and permission errors. + Move `wallet_tool.rs` from `src/rust/src` into `src/rust/bin`. Also add a brief description of `zcashd-wallet-tool` to `src/rust/README.md`. + Improved error handling. + The recovery phrase confirmation and `zcashd-wallet-tool` are being introduced in zcashd v4.7.0. + Refactor use of `export_path` as suggested. + Tweak the wording of the fallback messages when the terminal cannot be automatically cleared. + Simplify extraction of recovery phrase. + Improve memory hygiene, and use -stdin to pass the recovery phrase to the child zcash-cli process. + Cleanups to error handling for the first invocation of zcash-cli. + Use the tracing crate for debugging. + Improve error message when the config file cannot be found, taking into account -conf and -datadir. + Ensure the buffer used in `prompt` is zeroized even on error. + Document that '~' cannot be used in `-datadir` (see #5661). + Set `meta` for `-datadir` option. + Simplify debug tracing. + Correct the fallback instruction for how to clear the terminal on macOS: pressing Command + K also clears scrollback. + Include $(bin_SCRIPTS) in `check-symbols`, `check-security`, and `clean` targets. Checking for stack canaries in `check-security` is disabled for Rust executables (Rust does support `-Z stack-protector=all` but only for the nightly compiler). + qa/zcash/full_test_suite.py: enable `test_rpath_runpath` for Rust binaries, and reenable `test_fortify_source` for C++ binaries. + Tweaks to message text. + +Dimitris Apostolou (1): + Fix typos + +Jack Grigg (65): + wallet: Implement `z_getnewaccount` + wallet: Implement `z_getaddressforaccount` + wallet: Implement `z_listunifiedreceivers` + wallet: Show UAs owned by the wallet in `z_viewtransaction` + wallet: Reverse order of arguments to z_getaddressforaccount + rust: Add missing Orchard receiver check in UA parsing + rust: Add missing checks for shielded UFVK items + rust: Add missing checks for transparent UFVK items + wallet: Implement `z_getbalanceforaccount` + wallet: Fix account generation bug + wallet: Implement `z_getbalanceforaddress` + wallet: Don't show Sapling receivers from UAs in `z_listaddresses` + wallet: Show UAs instead of Sapling receivers in `z_listunspent` + wallet: Remove `CWallet::GetKeyFromPool` + wallet: Store internal transparent keys in the keypool + wallet: Separate counters for external and internal transparent keys + Add Orchard recipient support to the transaction builder + Make `TransactionBuilder::AddOrchardOutput` memo optional + Return UFVK from `CWallet::GenerateNewUnifiedSpendingKey` + Rename to `ZcashdUnifiedSpendingKey::GetSaplingKey` for consistency + Trial-decrypt candidate Sapling receivers with all wallet UFVKs + Add mappings from Orchard receivers to IVKs to the wallet + Add Orchard to default UA receiver types + Fix semantic merge conflicts + Select Orchard receivers preferentially from UAs + Regenerate `TxDigests` after rebuilding tx with Orchard bundle + qa: Bump all postponed dependencies + qa: Postpone recent CCache release + depends: Update Rust to 1.59.0 + depends: Update Clang / libcxx to LLVM 13.0.1 + cargo update + rust: Fix clippy lint + Ensure the view's best Orchard anchor matches the previous block + Add missing `view.PopAnchor(_, ORCHARD)` in `DisconnectBlock` + Add RPC test for the Orchard commitment tree bug on first NU5 testnet + Use `std::optional` in `CValidationInterface::GetAddressForMining` + Select Orchard receivers from UA miner addresses once NU5 activates + miner: Manually add dummy Orchard output with Orchard miner address + rpc: Handle keypool exhaustion separately in `generate` RPC + depends: Revert to `libc++ 13.0.0-3` for Windows cross-compile + Add Orchard spend support to the transaction builder + wallet: Alter `OrchardWallet::GetSpendInfo` to return the spending key + Improve FFI interface documentation + Refactor `CWallet::GenerateChangeAddressForAccount` + Add unit tests for `SpendableInputs::LimitToAmount` + Fix bug in `SpendableInputs::LimitToAmount` + Select spendable inputs based on recipient and change pool types + Implement opportunistic shielding in `SpendableInputs::LimitToAmount` + Add Orchard cases to note selection logic + Add Orchard to change address generation + Add support for sending Orchard funds in `z_sendmany` + Set default Orchard anchor confirmations to 1 + build: Fix `zcash/address/orchard.hpp` filename in `src/Makefile.am` + z_sendmany: Replace `allowRevealedAmount` with `privacyStrategy` + z_sendmany: Expand `privacyPolicy` cases + build: Add missing `util/match.h` to `src/Makefile.am` + wallet: Add seedfp to transparent keys in dumpwallet / z_exportwallet + Fix bugs in wallet_addresses RPC test + wallet: Fix bugs in `listaddresses` + wallet: Fix Sapling address bug in `listaddresses` + wallet: Fix expected `listaddresses` sources in `rpc_wallet_tests` + qa: Exclude `native_libtinfo` from dependency update checks + cargo update + make-release.py: Versioning changes for 4.7.0-rc1. + make-release.py: Updated manpages for 4.7.0-rc1. + +John Newbery (1): + Log calls to getblocktemplate + +Jonas Schnelli (1): + [Wallet] add HD xpriv to dumpwallet + +Kris Nuttycombe (243): + Derive random HD seeds from ZIP-339 seed phrases. + Add support for externally searching for valid Sapling diversifiers. + Adds basic unified spending key derivation. + Add unified full viewing keys and Zcash-internal unified addresses. + Use the default UA-based Sapling address for the saplingmigration tool. + Fix tests for wallet operations on legacy Sapling keys. + Remove unused forward declaration. + Update librustzcash dependency version. + Apply suggestions from code review + Derive transparent keys from mnemonic seed. + Generate legacy Sapling addresses from the mnemonic seed. + Replace account ID with ZIP-0032 key path in listaddresses output. + Use legacy address for Sapling migration until UA functionality is available to the RPC tests. + Revert change to the type of GenerateNewKey + Fix wallet import/export test + Use 0x7FFFFFFF for the legacy account ID. + Require backup of the emergency recovery phrase. + Use hardened derivation for the legacy Sapling key at the address index level. + Address comments from code review. + Restore legacy HD seed storage & retrieval tests. + Fix spurious test passage. + Move CKeyMetadata back to wallet.h + Clean up format of recovery information in the wallet dump. + Use SecureString for mnemonic phrase. + Apply suggestions from code review + Fix diversifier_index_t less than operator. + Restore FindAddress comment + Fix transparent BIP-44 keypaths. + Fix naming of unified spending & full viewing keys + Fix max transparent diversifier index. + Clean up handling of mnemonic seed metadata. + Restore legacy HDSeed encryption tests. + Style fix in BIP 32 path account parsing test. + Do not strip quotes when verifying mnemonic seed. + Apply suggestions from code review + Fix name of menmonic entropy length constant. + Fix polymorphism of string serialization. + Document mnemonic-seed-related RPC method changes & update changelog. + Minor cleanup of the code that searches for a valid transparent key. + Generalize keypath parsing over account id. + Update documentation for GenerateNewSeed. + Use MnemonicSeed instead of HDSeed where appropriate. + Add diversifier_index_t::ToTransparentChildIndex + Only maintain CKeyID for the transparent part of ZcashdUnifiedAddress + Minor naming fixes + Parameterize HD keypath parsing by coin type. + Fix error message text to refer to zcashd-wallet-tool rather than the RPC method. + Apply suggestions from code review + Minor textual fixes to release notes. + Improve documentation of the `-walletrequirebackup` zcashd wallet configuration option. + Add libzcash::AccountId type. + Adds Orchard Address, IncomingViewingKey, FullViewingKey, and SpendingKey types. + Apply suggestions from code review + Update orchard & librustzcash dependency versions. + Remove incorrect FFI method documentation. + Remove Orchard spending key equality implementation. + Refine structure of Zcash address generation. + Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes. + Remove ZcashdUnifiedAddress in favor of UnifiedAddress + Update to ufvk zcash_address build. + Adds SaplingDiversifiableFullViewingKey + Add Rust FFI components for unified full viewing keys. + Add UnifiedFullViewingKey type. + Apply suggestions from code review + Add tests for ufvk roundtrip serialization. + Apply suggestions from code review + Apply suggestions from code review + Apply suggestions from code review + Add functions for generating BIP-44 and ZIP-32 keypaths + Check the output of zip339_phrase_to_seed in MnemonicSeed initialization. + Compute key id for UFVKs. + Add ZcashdUnifiedKeyMetadata and libzcash::ReceiverType + Add unified key components to the transparent & Sapling wallet parts. + Store ufvks to the wallet database. + Add unified address tracking to KeyStore + Load unified full viewing keys from the walletdb. + Add key metadata to walletdb. + Add unified address generation. + AddTransparentSecretKey does not need to take a CExtKey + Add newly generated transparent UA receivers to the wallet. + Add CWallet::GetUnifiedForReceiver + Add tests for keystore storage and retrieval of UFVKs. + Add test for wallet UA generation & detection. + Add test for CKeyStore::AddUnifiedAddress + Fix handling of unified full viewing key metadata. + Apply suggestions from code review + Only derive ZcashdUnifiedFullViewingKey from UnifiedFullViewingKey + Rename `ZcashdUnifiedSpendingKeyMetadata` -> `ZcashdUnifiedAccount` + Remove unused ufvkid argument from AddTransparentSecretKey + Ensure that unified address metadata is always correctly populated. + Apply suggestions from code review + Make `FindAddress` correctly check for maximum transparent child index. + Use Bip44TransparentAccountKeyPath() for Bip44AccountChains keypath construction. + Improve documentation of UFVK/UA metadata storage semantics. + Apply suggestions from code review + Fix encoding order of unified addresses. + Remove the `InvalidEncoding` type from key & address variants. + Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes. + Remove spurious uses of HaveSpendingKeyForPaymentAddress + Add raw transparent address types to PaymentAddress + Remove spurious variant from asyncrpcoperation_sendmany + Remove `RawAddress` + Replace `DecodeDestination` in `GetMinerAddress` with `DecodePaymentAddress` + Remove uses of KeyIO::DecodeDestination + Remove a use of KeyIO::DecodeDestination in z_shieldcoinbase + Use libzcash::PaymentAddress instead of std::string in mergetoaddress + Improve error messages in the case of taddr decoding failure. + Apply suggestions from code review + Apply suggestions from code review + Use transaction builder for asyncrpcoperation_sendmany. + Transaction builder must not set consensus branch ID for V4 transactions. + Fix conditions around dust thresholds. + Require an explicit flag to allow cross-pool transfers in z_sendmany. + Apply suggestions from code review + Return z_sendmany errors synchronously when possible. + Update release notes to reflect z_sendmany changes + Move FindSpendableInputs to CWallet + Replace the badly-named `PaymentSource` with `ZTXOSelector` + Add support for unified addresses to CWallet::ToZTXOSelector + Replace `HaveSpendingKeyForAddress` with checks at ZTXOSelector construction. + Modify CWallet::FindSpendableInputs to use ZTXOSelector + Add CWallet::FindAccountForSelector + Add RecipientAddress type. + Use libzcash::RecipientAddress for z_sendmany recipients. + Apply suggestions from code review + Rename ZTXOSelector::SpendingKeysAvailable -> RequireSpendingKeys + Make `FindSpendableInputs` respect `ZTXOSelector::RequireSpendingKeys()` + Clarify documentation of CWallet::FindAccountForSelector + Use `ZTXOSelector::IncludesSapling` rather than selector internals. + Add documentation for `UnifiedAddress::GetPreferredRecipientAddress` + Add correct selection of change addresses to z_sendmany + Add a first-class type for transparent full viewing keys. + Implement OVK selection for z_sendmany. + Implement derivation of the internal Sapling spending key. + Use a BIP 44 change address for change when sending from legacy t-addrs. + Add a check for internal vs. external outputs to wallet_listreceived test. + Fix z_sendmany handling of transparent OVK derivation in the ANY_TADDR case. + Simplify determination of valid change types. + Add failing tests for z_sendmany ANY_TADDR -> UA and UA -> + Add gtest for change address derivation. + Fix variable shadowing in change address derivation & add change IVK to the keystore. + GenerateLegacySaplingZKey only needs to return an address, not an extfvk. + Rename AddSaplingIncomingViewingKey -> AddSaplingPaymentAddress + Do not add Sapling addresses to the wallet by default when adding extfvks. + Fix a bug in the generation of addresses from UFVKs + Add accessor method for Sapling IVKs to SaplingDiversifiableFullViewingKey + Address TODOs in rpc-tests/wallet-accounts.py + Add a few additional cases to z_sendmany RPC tests. + Update librustzcash dependency. + Fix nondeterministic test error (checking for the wrong error case). + Use z_shieldcoinbase for Sprout funds in wallet_listreceived tests. + Apply suggestions from code review + Apply suggestions from code review. + Fix nondeterministic test failure in wallet_listreceivedby.py + Fix locking in z_getbalanceforaddress and z_getbalanceforaccount + Replace z_getbalanceforaddress with z_getbalanceforviewingkey + Clarify documentation of z_getbalanceforviewingkey for Sprout viewing keys. + Implement PaymentAddressBelongsToWallet for unified addresses. + Add unified address support to GetSourceForPaymentAddress + Address comments from review. + Add change field to z_listreceivedbyaddress for transparent addrs. + Fix missing std::variant header that was breaking Darwin builds. + Add test vectors for UFVK derivation + Rename sapling-specific zip32 FFI methods. + Make SaveRecipientMappings polymorphic in RecipientMapping type. + Add Rust backend for Orchard components of the wallet. + Add GetFilteredNotes to Orchard wallet. + Add test for Orchard wallet note detection. + Move parsing of unified addresses to UnifiedAddress. + Remove txid field from TxNotes + Apply suggestions from code review + Add various bits of documentation + Add Orchard components to unified address + Add Orchard components to unified full viewing keys + Add Orchard components to unified spending keys + Remove OrchardSpendingKey serialization code + Select Orchard notes in FindSpendableInputs + GenerateNewKey must be guarded by a cs_wallet lock + Filter returned Orchard notes by minimum confirmations. + Log outpoint for failed Sapling witness lookup. + Add a roundtrip test for Orchard merkle frontier serialization from the C++ side. + Add test for Orchard contribution to z_gettotalbalance + Respect minDepth argument for Orchard notes in GetFilteredNotes + Update MSRV for lints. + Update incrementalmerkletree version + Split LoadWalletTx from AddToWallet + Fix missing locks for GenerateNewUnifiedSpendingKey tests. + Record when notes are detected as being spent in the Orchard wallet. + Reset Orchard wallet state when rescanning from below NU5 activation. + Check wallet latest anchor against hashFinalOrchardRoot in ChainTip. + Remove assertions that require Orchard wallet persistence to satisfy. + Add a test for Orchard note detection. + Assert we never attempt to checkpoint the Orchard wallet at a negative block height. + Apply suggestions from code review + Add an `InPoint` type to the Orchard wallet to fix incorrect conflict data. + Apply suggestions from code review + Fix missing update to `last_checkpoint` on rewind. + Track mined-ness instead of spent-ness of notes in the Orchard wallet. + Apply suggestions from code review + Respect maxDepth for Orchard notes in GetFilteredNotes + Set number of confirmations for Orchard notes returned by FindSpendableInputs + Update walletTx with decrypted Orchard action metadata. + Persist Orchard action index/IVK mappings in CWalletTx + Restore decrypted notes to the wallet. + Update tests with rollback checks. + Apply suggestions from code review + Restore mined block heights when restoring decrypted notes. + Apply suggestions from code review + Return std::optional from CExtKey::Master + Ensure that Orchard spentness information is repopulated by LoadUnifiedCaches. + Modify `join_network` in tests to skip mempool resync. + Address suggestions from code review on #5637 + Apply suggestions from code review + Serialize the Orchard note commitment tree to the wallet. + Update orchard_wallet_add_notes_from_bundle documentation. + Derive the new mnemonic seed from the legacy HD seed, if one is available. + Fix indentation. + Apply suggestions from code review + Explicitly specify the change address in the Sapling migration. + Add TODO for Orchard z_listunspent integration. + Document that z_getnewaccount and z_getaddressforaccount replace z_getnewaddress. + Add orchard support to z_getnotescount + Document that Orchard keys are not supported in z_importkey help + Return the correct error for `z_getbalance` if a UA does not correspond to an account in the wallet.. + Update documentation of z_importviewingkey and z_exportviewingkey to address unified keys. + Add UnifiedAddress variant to ZTXOSelector + Eliminate redundancy between the wallet and the keystore. + Simplify retrieval of unified account by address. + Add OrchardWallet::GetTxActions + Apply suggestions from code review + Update z_viewtransaction documentation to correctly represent field names. + Add debug printing for receivers and recipient addresses. + Correctly report change outputs in z_viewtransaction. + Return the default unified address if we have the UFVK but no address metadata. + Fix missing AllowRevealedSenders flag in test. + Uncomment addtional tests that depend on z_viewtransaction. + Minor rename & documentation improvement. + Add RecipientType to GetPaymentAddressForRecipient result. + Make CWallet::DefaultReceiverTypes height-dependent. + Return failure rather than asserting on WriteRecipientMapping failure. + Lock cs_main for accesses to chainActive in GetPaymentAddressForRecipient. + Fix legacy address handling in CWallet::GetPaymentAddressForRecipient + Documentation fix for UnifiedAddressForReciever (+ spelling corrections.) + +Larry Ruane (12): + add ParseArbitraryInt() for diversifier index + add -orchardwallet experimental feature flag + Add new and modify existing Orchard RPCs, non-functional + mining: submitblock: log detailed equihash solution error + allow UA as z_shieldcoinbase destination + fix minconf parsing for z_getbalanceforaccount and z_getbalanceforaddress + Update z_listreceivedbyaddress to support unified addresses (5467) + fix wallet_listreceived.py, add blockdata to taddr output + z_listreceivedbyaddress: reject UA component addr (#5537) + add functional test + document global variables + update listaddresses RPC for UAs, Orchard + +Marius Kjærstad (1): + Update copyright year to 2022 + +Pieter Wuille (2): + Fix csBestBlock/cvBlockChange waiting in rpc/mining + Modernize best block mutex/cv/hash variable naming + +Sean Bowe (5): + wallet: consolidate unified key/address/account map reconstruction + wallet: restore Orchard secret keys from mnemonic seed + wallet: restore orchard address to IVK mappings during wallet loading + wallet: rather than assert, error in case of inconsistency between FVK and address + wallet: add logging for failure cases in unified cache loading + +Steven Smith (8): + Lock cs_main prior to calling blockToJSON + Mark z_gettotalbalance and dumpwallet as deprecated + Add Orchard support to the z_gettreestate RPC + Update transaction size estimation to include V5 transactions + Extend uniqueness check in z_sendmany to UA receivers + Load previously persisted sent transaction recipient metadata back into the wallet. + Add Orchard & unified address support to z_viewtransaction. + Ensure z_viewtransaction returns Orchard details + +Taylor Hornby (1): + Untested, not working yet, use libtinfo from the debian packages + +sasha (12): + on Arch only, use Debian's libtinfo5_6.0 to satisfy clang + explain the 0x0f0f[..]0f0f powLimit constant for regtest + remove superfluous space at end of native_packages line + gtests ordering: change wallet filename in WriteZkeyDirectToDb + gtests ordering: ContextualCheckBlockTest's TearDown deactivates Blossom + gtests ordering: CheckBlock.VersionTooLow calls SelectParams(MAIN) + implement AtomicTimer::zeroize() that resets start_time and total_time + gtests ordering: make Metrics.GetLocalSolPS idempotent + gtests ordering: clean up wallet files before each WalletZkeysTest + make librustzcash_init_zksnark_params idempotent + move proof parameter loading out of gtest/main.cpp and into utiltest.cpp + Call LoadProofParameters() in gtests that need proofs + +Ying Tong Lai (18): + Move SendManyRecipient to wallet.h and introduce optional ua field. + SendTransaction: Introduce recipients argument. + Implement read and write for (txid, recipient) -> ua mapping. + z_sendmany: Only get ua if decoded is ua variant. + ShieldToAddress: Factor out static shieldToAddress() helper. + Docfixes. + CSerializeRecipientAddress: add Read method and make constructor private. + WriteRecipientMapping: Check that receiver exists in UA. + wallet_sendmany_any_taddr.py: Test sending from a change taddr. + wallet_sendmany_any_taddr.py: Test sending output from expired tx. + FindSpendableInputs: Add nDepth < 0 check. + wallet_sendmany_any_taddr.py: Expect expired tx to be ignored. + Orchard: invalidate mempool transactions that use orphaned anchors. + coins_tests.cpp: Add Orchard nullifier to TxWithNullifiers(). + coins_tests: Update tests to include Orchard case. + CWallet::GetConflictS: Handle conflicting Orchard spends. + z_getbalance: Handle Unified Address case. + Adapt RPC tests to use z_getbalance for UAs. + +ying tong (2): + Apply docfixes from code review + Style improvements in RPC tests. + +Zancas Wilcox (4): + blake2b/s is integrated into hashlib, drop external python package dependency + update doctest in gtest suite to prefer hashlib + enforce usage of the get_tests comptool interface as ComparisonTestFramework method + All implementations of ComparisonTestFramework were overriding num_nodes + diff --git a/doc/release-notes/release-notes-4.7.0.md b/doc/release-notes/release-notes-4.7.0.md new file mode 100644 index 000000000..cd8da43c8 --- /dev/null +++ b/doc/release-notes/release-notes-4.7.0.md @@ -0,0 +1,869 @@ +Notable changes +=============== + +Changes to Testnet NU5 Consensus Rules +-------------------------------------- + +NOTE: All testnet nodes that have been running on testnet above height 1,599,200 will need +to upgrade to `v4.7.0` and then run with `-reindex` and `-rescan`. + +- In order to better support hardware wallets, transparent signature hash construction as + defined in [ZIP 244](https://zips.z.cash/zip-0244) has been modified to include a hash + of the serialization of the amounts of all outputs being spent, along with a hash of all + spent outputs `scriptPubKeys` values, except in the case that the `ANYONECANPAY` flag is + set. This allows hardware wallet devices to verify the UTXO amounts without having to + stream all the previous transactions containing the outputs being spent to the device. + Also as part of these changes, the transparent signature hash digest now commits + directly, rather than implicitly, to the sighash type, and the sighash type is + restricted to a fixed set of valid values. The change to ZIP 244 can be seen + [here](https://github.com/zcash/zips/commit/ac9dd97f77869b9191dc9592faa3ebf45475c341). +- This release fixes a bug in `v4.6.0` that caused a consensus failure on the Zcash + testnet at height `1,779,200`. For details see + . +- There have been changes to the Halo2 proving system to improve consistency between the + specification and the implementation, and these may break compatibility. See for example + . +- There have been numerous changes to the Orchard circuit implementation since `v4.6.0`. + See + for a complete list. +- A potential Faerie Gold vulnerability affecting the previous activation of NU5 on + testnet and existing since `v4.6.0` has been mitigated. + +NU5 Testnet Reactivation +------------------------ + +To support the aforementioned testnet consensus changes, the following changes are made in +`zcashd v4.7.0`: + +- The consensus branch ID for NU5 is changed to `0xC2D6D0B4`. +- The protocol version indicating NU5-aware testnet nodes is set to `170050`. +- The testnet reactivation height for NU5 is set to **1,842,420**. + +As mentioned above, all testnet nodes that have been running on testnet above height +1,599,200 will need to upgrade to `v4.7.0` and then run with `-reindex` and `-rescan`. + +Emergency Recovery Phrases +-------------------------- + +The zcashd wallet has been modified to support BIP 39, which describes how to derive the +wallet's HD seed from a mnemonic phrase, hereafter known as the wallet's "emergency +recovery phrase". The emergency recovery phrase will be generated on load of the wallet, +or the first time the wallet is unlocked, and is available via the `z_exportwallet` RPC +call. All new addresses produced by the wallet are now derived from this seed using the HD +wallet functionality described in ZIP 32 and ZIP 316. For users upgrading an existing +Zcashd wallet, it is recommended that the wallet be backed up prior to upgrading to the +4.7.0 Zcashd release. In the remainder of this document, the HD seed derived from the +emergency recovery phrase will be termed the wallet's "mnemonic seed". + +Following the upgrade to 4.7.0, Zcashd will require that the user confirm that they have +backed up their new emergency recovery phrase, which may be obtained from the output of +the `z_exportwallet` RPC call. This confirmation can be performed manually using the +`zcashd-wallet-tool` utility that is supplied with this release (built or installed in the +same directory as `zcashd`). The wallet will not allow the generation of new addresses +until this confirmation has been performed. It is recommended that after this upgrade, +funds tied to preexisting addresses be migrated to newly generated addresses so that all +wallet funds are recoverable using the emergency recovery phrase going forward. If you +choose not to migrate funds in this fashion, you will continue to need to securely back up +the entire `wallet.dat` file to ensure that you do not lose access to existing funds; +EXISTING FUNDS WILL NOT BE RECOVERABLE USING THE EMERGENCY RECOVERY PHRASE UNLESS THEY +HAVE BEEN MOVED TO A NEWLY GENERATED ADDRESS FOLLOWING THE 4.7.0 UPGRADE. + +In the case that your wallet previously contained a Sapling HD seed, the emergency +recovery phrase is constructed using the bytes of that seed, such that it is possible to +reconstruct keys generated using that legacy seed if you know the emergency recovery +phrase. HOWEVER, THIS RECONSTRUCTION DOES NOT FOLLOW THE NORMAL PROCESS OF DERIVATION FROM +THE EMERGENCY RECOVERY PHRASE. Instead, to recover a legacy Sapling key from the emergency +recovery phrase, it is necessary to reconstruct the bytes of the legacy seed by conversion +of the phrase back to its source randomness instead of by hashing as is specified in BIP +39. Only keys and addresses produced after the upgrade can be obtained by normal +derivation of a ZIP 32 or BIP 32 master seed using BIP 39. + +Wallet Updates +-------------- + +The zcashd wallet now supports the Orchard shielded protocol. + +The zcashd wallet has been modified to alter the way that change is handled. In the case +that funds are being spent from a unified account, change is sent to a wallet-internal +change address for that account instead of sending change amounts back to the original +address where a note being spent was received. The rationale for this change is that it +improves the security that is provided to the user of the wallet when supplying incoming +viewing keys to third parties; previously, an incoming viewing key could effectively be +used to detect when a note was spent (hence violating the "incoming" restriction) by +observing change outputs that were sent back to the address where the spent note was +originally received. + +New RPC Methods +--------------- + +- `walletconfirmbackup` This newly created API checks a provided emergency recovery phrase + against the wallet's emergency recovery phrase; if the phrases match then it updates the + wallet state to allow the generation of new addresses. This backup confirmation + workflow can be disabled by starting zcashd with `-walletrequirebackup=false` but this + is not recommended unless you know what you're doing (and have otherwise backed up the + wallet's emergency recovery phrase anyway). For security reasons, this RPC method is + not intended for use via `zcash-cli` but is provided to enable `zcashd-wallet-tool` and + other third-party wallet interfaces to satisfy the backup confirmation requirement. Use + of the `walletconfirmbackup` API via `zcash-cli` would risk that the emergency recovery + phrase being confirmed might be leaked via the user's shell history or the system + process table; `zcashd-wallet-tool` is provided specifically to avoid this problem. +- `z_getnewaccount` This API allows for creation of new BIP 44 / ZIP 32 accounts using HD + derivation from the wallet's mnemonic seed. Each account represents a separate spending + authority and source of funds. A single account may contain funds in the Sapling and + Orchard shielded pools, as well as funds held in transparent addresses. +- `z_listaccounts` This API returns the list of BIP 44 / ZIP 32 accounts that are being + tracked by the wallet. +- `z_getaddressforaccount` This API allows for creation of diversified unified addresses + under a single account. Each call to this API will, by default, create a new diversified + unified address containing transparent p2pkh, Sapling, and Orchard receivers. Additional + arguments to this API may be provided to request the address to be created with a + user-specified set of receiver types and diversifier index. +- `z_getbalanceforaccount` This API makes it possible to obtain balance information on a + per-account basis. +- `z_getbalanceforviewingkey` This API allows a user to obtain balance + information for funds visible to a Sapling or Unified full viewing key; if a Sprout + viewing key is provided, this method allows retrieval of the balance only in the case + that the wallet controls the corresponding spending key. This API has been added to + supplement (and largely supplant) `z_getbalance`. Querying for balance by a single + address returns only the amount received by that address, and omits value sent to other + diversified addresses derived from the same full viewing key; by using + `z_getbalanceforviewingkey` it is possible to obtain a correct balance that includes all + amounts controlled by a single spending key, including both those sent to external + diversified addresses and to wallet-internal change addresses. +- `z_listunifiedreceivers` This API allows the caller to extract the individual component + receivers from a unified address. This is useful if one needs to provide a bare Sapling + or transparent p2pkh address to a service that does not yet support unified addresses. + +RPC Changes +----------- + +- The result type for the `listaddresses` endpoint has been modified: + - The `keypool` source type has been removed; it was reserved but not used. + - In the `sapling` address results, the `zip32AccountId` attribute has been removed in + favor of `zip32KeyPath`. This is to allow distinct key paths to be reported for + addresses derived from the legacy account under different child spending authorities, + as are produced by `z_getnewaddress`. + - Addresses derived from the wallet's mnemonic seed are now included in + `listaddresses` output. +- The results of the `dumpwallet` and `z_exportwallet` RPC methods have been modified + to now include the wallet's newly generated emergency recovery phrase as part of the + exported data. Also, the seed fingerprint and HD keypath information are now included in + the output of these methods for all HD-derived keys. +- The results of the `getwalletinfo` RPC have been modified to return two new fields: + `mnemonic_seedfp` and `legacy_seedfp`, the latter of which replaces the field that + was previously named `seedfp`. +- A new `pool` attribute has been added to each element returned by `z_listunspent` to + indicate which value pool the unspent note controls funds in. +- `z_listreceivedbyaddress` + - A `pool` attribute has been added to each result to indicate what pool the received + funds are held in. + - A boolean-valued `change` attribute has been added to indicate whether the output is + change. + - Block metadata attributes `blockheight`, `blockindex`, and `blocktime` have been + added to the result. +- `z_viewtransaction` has been updated to include attributes that provide information + about Orchard components of the transaction. Also, the `type` attribute for spend and + output values has been deprecated and replaced by the `pool` attribute. +- `z_getnotescount` now also returns information for Orchard notes. +- The output format of `z_exportwallet` has been changed. The exported file now includes + the mnemonic seed for the wallet, and HD keypaths are now exported for transparent + addresses when available. +- The result value for `z_importviewingkey` now includes an `address_type` field that + replaces the now-deprecated `type` key. +- `z_listunspent` has been updated to render unified addresses for Sapling and + Orchard outputs when those outputs are controlled by unified spending keys. Outputs + received by unified internal addresses do not include the `address` field. +- Legacy transparent address generation using `getnewaddress` no longer uses a + preallocated keypool, but instead performs HD derivation from the wallet's mnemonic seed + according to BIP 39 and BIP 44 under account ID `0x7FFFFFFF`. +- `z_gettreestate` has been updated to include information about the Orchard note + commitment tree. + +### 'z_sendmany' + +- The `z_sendmany` RPC call no longer permits Sprout recipients in the list of recipient + addresses. Transactions spending Sprout funds will still result in change being sent + back into the Sprout pool, but no other `Sprout->Sprout` transactions will be + constructed by the Zcashd wallet. +- The restriction that prohibited `Sprout->Sapling` transactions has been lifted; however, + since such transactions reveal the amount crossing pool boundaries, they must be + explicitly enabled via a parameter to the `z_sendmany` call. +- A new string parameter, `privacyPolicy`, has been added to the list of arguments + accepted by `z_sendmany`. This parameter enables the caller to control what kind of + information they permit `zcashd` to reveal on-chain when creating the transaction. If the + transaction can only be created by revealing more information than the given strategy + permits, `z_sendmany` will return an error. The parameter defaults to `LegacyCompat`, + which applies the most restrictive strategy `FullPrivacy` when a Unified Address is + present as the sender or a recipient, and otherwise preserves existing behaviour (which + corresponds to the `AllowFullyTransparent` policy). In cases where it is possible to do + so without revealing additional information, and where it is permitted by the privacy + policy, the wallet will now opportunistically shield funds to the most current pool. +- Since Sprout outputs are no longer created (with the exception of change) + `z_sendmany` no longer generates payment disclosures (which were only available for + Sprout outputs) when the `-paymentdisclosure` experimental feature flag is set. +- Outgoing viewing keys used for shielded outputs are now produced as + described in [ZIP 316](https://zips.z.cash/zip-0316#usage-of-outgoing-viewing-keys) +- When sending from or to one or more unified addresses, change outputs + are now always sent to addresses controlled by the wallet's internal spending keys, as + described in [ZIP 316](https://zips.z.cash/zip-0316#deriving-internal-keys). These + addresses are not returned by any RPC API, as they are intended to never be shared with + any third party, and are for wallet-internal use only. This change improves the privacy + properties that may be maintained when sharing a unified internal viewing key for an + account in the wallet. +- In cases where `z_sendmany` might produce transparent change UTXOs, those UTXOs are + sent to addresses derived from the wallet's mnemonic seed via the BIP 44 `change` + derivation path. + +RPC Deprecations +---------------- + +- `z_getnewaddress` has been deprecated in favor of `z_getnewaccount` and + `z_getaddressforaccount`. +- `z_listaddresses` has been deprecated. Use `listaddresses` instead. +- `z_getbalance` has been deprecated. Use `z_getbalanceforviewingkey` instead. + See the discussion of how change is now handled under the `Wallet` heading for + additional background. +- `z_gettotalbalance` has been deprecated. Use `z_getbalanceforaccount` instead. +- `dumpwallet` has been deprecated. Use `z_exportwallet` instead. + +Build System +------------ + +- Clang has been updated to use LLVM 13.0.1. +- libc++ has been updated to use LLVM 13.0.1, except on Windows where it uses 13.0.0-3. +- The Rust toolchain dependency has been updated to version 1.59.0. + +Platform Support +---------------- + +- Debian 9 has been removed from the list of supported platforms. +- Debian 11 (Bullseye) has been added to the list of supported platforms. +- A build issue (a missing header file) has been fixed for macOS targets. +- On Arch Linux only, a copy of Debian's libtinfo5_6.0 is used to fix a build + regression. + +Mining +------ + +- Mining to Orchard recipients is now supported on testnet. +- It is now possible to mine to a Sapling receiver of a unified address. +- Concurrency bugs related to `getblocktemplate` have been fixed via backports from + Bitcoin Core. + +Licenses +-------- + +- License information in `contrib/debian/copyright` has been updated to be more accurate. + +Changelog +========= + +Alfredo Garcia (3): + change error message + fix grammar in message + remove final dot from error msg + +Charlie O'Keefe (2): + Update base image used by Dockerfile from debian 10 to debian 11 + Remove stretch (debian 9), add bullseye (debian 11) in gitian descriptor + +Conrado Gouvea (2): + Add comment to zcash_script_new_precomputed_tx about references to input buffers + Add zcash_script V5 functions + +Daira Hopwood (42): + Avoid a warning by explicitly calling drop. + Replace call to drop with zeroization. + contrib/devtools/rust-deps-graph.sh: allow overriding the arguments to `cargo deps`. + Cosmetic whitespace change + Make a zcashd-wallet-tool executable. + Attempt to fix linking problem on ARM. + Add some text about choosing location of the physical backup. Add TODO for better handling of file not found and permission errors. + Move `wallet_tool.rs` from `src/rust/src` into `src/rust/bin`. Also add a brief description of `zcashd-wallet-tool` to `src/rust/README.md`. + Improved error handling. + The recovery phrase confirmation and `zcashd-wallet-tool` are being introduced in zcashd v4.7.0. + Refactor use of `export_path` as suggested. + Tweak the wording of the fallback messages when the terminal cannot be automatically cleared. + Simplify extraction of recovery phrase. + Improve memory hygiene, and use -stdin to pass the recovery phrase to the child zcash-cli process. + Cleanups to error handling for the first invocation of zcash-cli. + Use the tracing crate for debugging. + Improve error message when the config file cannot be found, taking into account -conf and -datadir. + Ensure the buffer used in `prompt` is zeroized even on error. + Document that '~' cannot be used in `-datadir` (see #5661). + Set `meta` for `-datadir` option. + Simplify debug tracing. + Correct the fallback instruction for how to clear the terminal on macOS: pressing Command + K also clears scrollback. + Include $(bin_SCRIPTS) in `check-symbols`, `check-security`, and `clean` targets. Checking for stack canaries in `check-security` is disabled for Rust executables (Rust does support `-Z stack-protector=all` but only for the nightly compiler). + qa/zcash/full_test_suite.py: enable `test_rpath_runpath` for Rust binaries, and reenable `test_fortify_source` for C++ binaries. + Tweaks to message text. + zcashd-wallet-tool: add man page generation. fixes #5729 + zcashd-wallet-tool: warn that wallet.dat needs to be backed up. fixes #5704 + zcashd-wallet-tool: adjust man page to correct copyright information. + Start with an empty banlist if -reindex is set. fixes #5739 + contrib/debian/copyright: add license entries for Libtool macros. + contrib/debian/copyright: minor corrections and formatting + contrib/debian/copyright: add licenses of Rust dependencies that do not have Expat/MIT as an option. + contrib/debian/copyright: add license for Apache-2.0. + Switch Jack Grigg's copyright on src/rust/{include/tracing.h, src/tracing_ffi.rs} to the Zcash developers (with his permission). + Repair `feature_zip239` RPC test by checking the debug log of node 0 rather than its stderr. + qa/zcash/updatecheck.py: print status code and response of failed http requests. + Postpone native_clang and libcxx 14.0.0. + Fix an incorrect preprocessor symbol. Also repair the lint-includes-guards.sh script that was checking for the incorrect symbol. + .gitignore: add files temporarily created by autoconf. + This check done for Sprout and Sapling (which is separate from consensus nullifier checks) was not being done for Orchard. + AcceptToMemoryPool: Remove initial nullifier checks for Sprout and Sapling (within the mempool only), that are redundant with checks in HaveShieldedRequirements. The latter take into account nullifiers in the chain (using CCoinsViewMemPool::GetNullifier) and include Orchard. + Revert "rpc: Reload CNode spans after reloading the log filter". fixes #5863 + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Jack Grigg (111): + wallet: Implement `z_getnewaccount` + wallet: Implement `z_getaddressforaccount` + wallet: Implement `z_listunifiedreceivers` + wallet: Show UAs owned by the wallet in `z_viewtransaction` + wallet: Reverse order of arguments to z_getaddressforaccount + rust: Add missing Orchard receiver check in UA parsing + rust: Add missing checks for shielded UFVK items + rust: Add missing checks for transparent UFVK items + wallet: Implement `z_getbalanceforaccount` + wallet: Fix account generation bug + wallet: Implement `z_getbalanceforaddress` + wallet: Don't show Sapling receivers from UAs in `z_listaddresses` + wallet: Show UAs instead of Sapling receivers in `z_listunspent` + wallet: Remove `CWallet::GetKeyFromPool` + wallet: Store internal transparent keys in the keypool + wallet: Separate counters for external and internal transparent keys + Move shielded signature checks out of `ContextualCheckTransaction` + Make `PrecomputedTransactionData` a required argument of `SignatureHash` + Update ZIP 244 test vectors + Add Orchard recipient support to the transaction builder + Update ZIP 244 implementation + Enforce ZIP 244 consensus rules on sighash type + Make `TransactionBuilder::AddOrchardOutput` memo optional + Enforce length constraints on allPrevOutputs + ZIP 244: Address review comments + Return UFVK from `CWallet::GenerateNewUnifiedSpendingKey` + Rename to `ZcashdUnifiedSpendingKey::GetSaplingKey` for consistency + Trial-decrypt candidate Sapling receivers with all wallet UFVKs + Add mappings from Orchard receivers to IVKs to the wallet + Add Orchard to default UA receiver types + Fix semantic merge conflicts + Select Orchard receivers preferentially from UAs + Regenerate `TxDigests` after rebuilding tx with Orchard bundle + Migrate to `orchard` crate revision with circuit changes + qa: Bump all postponed dependencies + qa: Postpone recent CCache release + depends: Update Rust to 1.59.0 + depends: Update Clang / libcxx to LLVM 13.0.1 + cargo update + rust: Fix clippy lint + Ensure the view's best Orchard anchor matches the previous block + Add missing `view.PopAnchor(_, ORCHARD)` in `DisconnectBlock` + Add RPC test for the Orchard commitment tree bug on first NU5 testnet + Use `std::optional` in `CValidationInterface::GetAddressForMining` + Select Orchard receivers from UA miner addresses once NU5 activates + miner: Manually add dummy Orchard output with Orchard miner address + rpc: Handle keypool exhaustion separately in `generate` RPC + libzcash_script: Add more granular errors to the new APIs + depends: Revert to `libc++ 13.0.0-3` for Windows cross-compile + Add Orchard spend support to the transaction builder + wallet: Alter `OrchardWallet::GetSpendInfo` to return the spending key + Improve FFI interface documentation + Refactor `CWallet::GenerateChangeAddressForAccount` + Add unit tests for `SpendableInputs::LimitToAmount` + Fix bug in `SpendableInputs::LimitToAmount` + Select spendable inputs based on recipient and change pool types + Implement opportunistic shielding in `SpendableInputs::LimitToAmount` + Add Orchard cases to note selection logic + Add Orchard to change address generation + Add support for sending Orchard funds in `z_sendmany` + Set default Orchard anchor confirmations to 1 + build: Fix `zcash/address/orchard.hpp` filename in `src/Makefile.am` + z_sendmany: Replace `allowRevealedAmount` with `privacyStrategy` + z_sendmany: Expand `privacyPolicy` cases + build: Add missing `util/match.h` to `src/Makefile.am` + wallet: Add seedfp to transparent keys in dumpwallet / z_exportwallet + Fix bugs in wallet_addresses RPC test + wallet: Fix bugs in `listaddresses` + wallet: Fix Sapling address bug in `listaddresses` + wallet: Fix expected `listaddresses` sources in `rpc_wallet_tests` + qa: Exclude `native_libtinfo` from dependency update checks + cargo update + make-release.py: Versioning changes for 4.7.0-rc1. + make-release.py: Updated manpages for 4.7.0-rc1. + make-release.py: Updated release notes and changelog for 4.7.0-rc1. + Migrate to latest `zcash/librustzcash` revision + Fix logical merge conflicts after merging 4.7.0-rc1 + builder: Use correct `PrecomputedTransactionData` for transparent sigs + Set NU5 protocol version for regtest to 170040, bump protocol version + qa: Remove hard-coded consensus branch IDs from RPC tests + qa: Remove pinned action indices from wallet_listreceived + Test Orchard shielded coinbase rules + test: Print all logged errors to stdout during gtests + builder: Handle `std::ios_base::failure` exceptions during sighash + test: Improve gtest handling of `TransactionBuilderResult::GetTxOrThrow` + rust: Improve `PrecomputedTransactionData` construction errors + test: Fix `WalletTests.GetConflictedOrchardNotes` gtest + qa: Add RPC test testing Orchard note position persistence + wallet: Move Orchard note position data into a separate map + wallet: Persist Orchard note positions with the witness tree + wallet: Add version information to Orchard commitment tree data + wallet: Persist Orchard tx height alongside note positions + qa: Add test for Orchard support in `z_listunspent` + wallet: Treat `mnemonichdchain` records as key material + wallet: Initialise ThreadNotifyWallets with wallet's best block + Apply `HaveShieldedRequirements` to coinbase transactions + mempool: Remove duplicated anchor and nullifier assertions + AcceptToMemoryPool: Re-add missing code comment + wallet: Rename `CWallet::GetBestBlock` to `GetPersistedBestBlock` + Add trace-level logging to the Orchard wallet + wallet: Add assertions during Orchard wallet bundle appends + wallet: Remove duplicate nullifier insertion into Orchard wallet + lint: Add check that every Cargo patch has a matching replacement + qa: Postpone update to Rust 1.60 + wallet: Bump a trace log message to error in `Wallet::checkpoint` + rpc: Document that enabling trace-level logging is unsafe + test: Capture gtest log output and only print on error + qa: Update Berkeley DB release listener regex + cargo update + depends: Remove `hyper 0.14.2` pin + depends: Remove direct `tokio` dependency + +John Newbery (1): + Log calls to getblocktemplate + +Jonas Schnelli (1): + [Wallet] add HD xpriv to dumpwallet + +Kris Nuttycombe (303): + Derive random HD seeds from ZIP-339 seed phrases. + Add support for externally searching for valid Sapling diversifiers. + Adds basic unified spending key derivation. + Add unified full viewing keys and Zcash-internal unified addresses. + Use the default UA-based Sapling address for the saplingmigration tool. + Fix tests for wallet operations on legacy Sapling keys. + Remove unused forward declaration. + Update librustzcash dependency version. + Apply suggestions from code review + Derive transparent keys from mnemonic seed. + Generate legacy Sapling addresses from the mnemonic seed. + Replace account ID with ZIP-0032 key path in listaddresses output. + Use legacy address for Sapling migration until UA functionality is available to the RPC tests. + Revert change to the type of GenerateNewKey + Fix wallet import/export test + Use 0x7FFFFFFF for the legacy account ID. + Require backup of the emergency recovery phrase. + Use hardened derivation for the legacy Sapling key at the address index level. + Address comments from code review. + Restore legacy HD seed storage & retrieval tests. + Fix spurious test passage. + Move CKeyMetadata back to wallet.h + Clean up format of recovery information in the wallet dump. + Use SecureString for mnemonic phrase. + Apply suggestions from code review + Fix diversifier_index_t less than operator. + Restore FindAddress comment + Fix transparent BIP-44 keypaths. + Fix naming of unified spending & full viewing keys + Fix max transparent diversifier index. + Clean up handling of mnemonic seed metadata. + Restore legacy HDSeed encryption tests. + Style fix in BIP 32 path account parsing test. + Do not strip quotes when verifying mnemonic seed. + Apply suggestions from code review + Fix name of menmonic entropy length constant. + Fix polymorphism of string serialization. + Document mnemonic-seed-related RPC method changes & update changelog. + Minor cleanup of the code that searches for a valid transparent key. + Generalize keypath parsing over account id. + Update documentation for GenerateNewSeed. + Use MnemonicSeed instead of HDSeed where appropriate. + Add diversifier_index_t::ToTransparentChildIndex + Only maintain CKeyID for the transparent part of ZcashdUnifiedAddress + Minor naming fixes + Parameterize HD keypath parsing by coin type. + Fix error message text to refer to zcashd-wallet-tool rather than the RPC method. + Apply suggestions from code review + Minor textual fixes to release notes. + Improve documentation of the `-walletrequirebackup` zcashd wallet configuration option. + Add libzcash::AccountId type. + Adds Orchard Address, IncomingViewingKey, FullViewingKey, and SpendingKey types. + Apply suggestions from code review + Update orchard & librustzcash dependency versions. + Remove incorrect FFI method documentation. + Remove Orchard spending key equality implementation. + Refine structure of Zcash address generation. + Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes. + Remove ZcashdUnifiedAddress in favor of UnifiedAddress + Update to ufvk zcash_address build. + Adds SaplingDiversifiableFullViewingKey + Add Rust FFI components for unified full viewing keys. + Add UnifiedFullViewingKey type. + Apply suggestions from code review + Add tests for ufvk roundtrip serialization. + Apply suggestions from code review + Apply suggestions from code review + Apply suggestions from code review + Add functions for generating BIP-44 and ZIP-32 keypaths + Check the output of zip339_phrase_to_seed in MnemonicSeed initialization. + Compute key id for UFVKs. + Add ZcashdUnifiedKeyMetadata and libzcash::ReceiverType + Add unified key components to the transparent & Sapling wallet parts. + Store ufvks to the wallet database. + Add unified address tracking to KeyStore + Load unified full viewing keys from the walletdb. + Add key metadata to walletdb. + Add unified address generation. + AddTransparentSecretKey does not need to take a CExtKey + Add newly generated transparent UA receivers to the wallet. + Add CWallet::GetUnifiedForReceiver + Add tests for keystore storage and retrieval of UFVKs. + Add test for wallet UA generation & detection. + Add test for CKeyStore::AddUnifiedAddress + Fix handling of unified full viewing key metadata. + Apply suggestions from code review + Only derive ZcashdUnifiedFullViewingKey from UnifiedFullViewingKey + Rename `ZcashdUnifiedSpendingKeyMetadata` -> `ZcashdUnifiedAccount` + Remove unused ufvkid argument from AddTransparentSecretKey + Ensure that unified address metadata is always correctly populated. + Apply suggestions from code review + Make `FindAddress` correctly check for maximum transparent child index. + Use Bip44TransparentAccountKeyPath() for Bip44AccountChains keypath construction. + Improve documentation of UFVK/UA metadata storage semantics. + Apply suggestions from code review + Fix encoding order of unified addresses. + Remove the `InvalidEncoding` type from key & address variants. + Use CKeyID and CScriptID instead of new P2PKH/P2SHAddress classes. + Remove spurious uses of HaveSpendingKeyForPaymentAddress + Add raw transparent address types to PaymentAddress + Remove spurious variant from asyncrpcoperation_sendmany + Remove `RawAddress` + Replace `DecodeDestination` in `GetMinerAddress` with `DecodePaymentAddress` + Remove uses of KeyIO::DecodeDestination + Remove a use of KeyIO::DecodeDestination in z_shieldcoinbase + Use libzcash::PaymentAddress instead of std::string in mergetoaddress + Improve error messages in the case of taddr decoding failure. + Apply suggestions from code review + Apply suggestions from code review + Use transaction builder for asyncrpcoperation_sendmany. + Transaction builder must not set consensus branch ID for V4 transactions. + Fix conditions around dust thresholds. + Require an explicit flag to allow cross-pool transfers in z_sendmany. + Apply suggestions from code review + Return z_sendmany errors synchronously when possible. + Update release notes to reflect z_sendmany changes + Move FindSpendableInputs to CWallet + Replace the badly-named `PaymentSource` with `ZTXOSelector` + Add support for unified addresses to CWallet::ToZTXOSelector + Replace `HaveSpendingKeyForAddress` with checks at ZTXOSelector construction. + Modify CWallet::FindSpendableInputs to use ZTXOSelector + Add CWallet::FindAccountForSelector + Add RecipientAddress type. + Use libzcash::RecipientAddress for z_sendmany recipients. + Apply suggestions from code review + Rename ZTXOSelector::SpendingKeysAvailable -> RequireSpendingKeys + Make `FindSpendableInputs` respect `ZTXOSelector::RequireSpendingKeys()` + Clarify documentation of CWallet::FindAccountForSelector + Use `ZTXOSelector::IncludesSapling` rather than selector internals. + Add documentation for `UnifiedAddress::GetPreferredRecipientAddress` + Add correct selection of change addresses to z_sendmany + Add a first-class type for transparent full viewing keys. + Implement OVK selection for z_sendmany. + Implement derivation of the internal Sapling spending key. + Use a BIP 44 change address for change when sending from legacy t-addrs. + Add a check for internal vs. external outputs to wallet_listreceived test. + Fix z_sendmany handling of transparent OVK derivation in the ANY_TADDR case. + Simplify determination of valid change types. + Add failing tests for z_sendmany ANY_TADDR -> UA and UA -> + Add gtest for change address derivation. + Fix variable shadowing in change address derivation & add change IVK to the keystore. + GenerateLegacySaplingZKey only needs to return an address, not an extfvk. + Rename AddSaplingIncomingViewingKey -> AddSaplingPaymentAddress + Do not add Sapling addresses to the wallet by default when adding extfvks. + Fix a bug in the generation of addresses from UFVKs + Add accessor method for Sapling IVKs to SaplingDiversifiableFullViewingKey + Address TODOs in rpc-tests/wallet-accounts.py + Add a few additional cases to z_sendmany RPC tests. + Update librustzcash dependency. + Fix nondeterministic test error (checking for the wrong error case). + Use z_shieldcoinbase for Sprout funds in wallet_listreceived tests. + Apply suggestions from code review + Apply suggestions from code review. + Fix nondeterministic test failure in wallet_listreceivedby.py + Fix locking in z_getbalanceforaddress and z_getbalanceforaccount + Replace z_getbalanceforaddress with z_getbalanceforviewingkey + Clarify documentation of z_getbalanceforviewingkey for Sprout viewing keys. + Implement PaymentAddressBelongsToWallet for unified addresses. + Add unified address support to GetSourceForPaymentAddress + Address comments from review. + Add change field to z_listreceivedbyaddress for transparent addrs. + Fix missing std::variant header that was breaking Darwin builds. + Add test vectors for UFVK derivation + Rename sapling-specific zip32 FFI methods. + Make SaveRecipientMappings polymorphic in RecipientMapping type. + Add Rust backend for Orchard components of the wallet. + Add GetFilteredNotes to Orchard wallet. + Add test for Orchard wallet note detection. + Move parsing of unified addresses to UnifiedAddress. + Remove txid field from TxNotes + Apply suggestions from code review + Add various bits of documentation + Add Orchard components to unified address + Add Orchard components to unified full viewing keys + Add Orchard components to unified spending keys + Remove OrchardSpendingKey serialization code + Select Orchard notes in FindSpendableInputs + GenerateNewKey must be guarded by a cs_wallet lock + Filter returned Orchard notes by minimum confirmations. + Log outpoint for failed Sapling witness lookup. + Add a roundtrip test for Orchard merkle frontier serialization from the C++ side. + Add test for Orchard contribution to z_gettotalbalance + Respect minDepth argument for Orchard notes in GetFilteredNotes + Update MSRV for lints. + Update incrementalmerkletree version + Split LoadWalletTx from AddToWallet + Fix missing locks for GenerateNewUnifiedSpendingKey tests. + Record when notes are detected as being spent in the Orchard wallet. + Reset Orchard wallet state when rescanning from below NU5 activation. + Check wallet latest anchor against hashFinalOrchardRoot in ChainTip. + Remove assertions that require Orchard wallet persistence to satisfy. + Add a test for Orchard note detection. + Assert we never attempt to checkpoint the Orchard wallet at a negative block height. + Apply suggestions from code review + Add an `InPoint` type to the Orchard wallet to fix incorrect conflict data. + Apply suggestions from code review + Fix missing update to `last_checkpoint` on rewind. + Track mined-ness instead of spent-ness of notes in the Orchard wallet. + Apply suggestions from code review + Respect maxDepth for Orchard notes in GetFilteredNotes + Set number of confirmations for Orchard notes returned by FindSpendableInputs + Update walletTx with decrypted Orchard action metadata. + Persist Orchard action index/IVK mappings in CWalletTx + Restore decrypted notes to the wallet. + Update tests with rollback checks. + Apply suggestions from code review + Restore mined block heights when restoring decrypted notes. + Apply suggestions from code review + Return std::optional from CExtKey::Master + Ensure that Orchard spentness information is repopulated by LoadUnifiedCaches. + Modify `join_network` in tests to skip mempool resync. + Address suggestions from code review on #5637 + Apply suggestions from code review + Serialize the Orchard note commitment tree to the wallet. + Update orchard_wallet_add_notes_from_bundle documentation. + Derive the new mnemonic seed from the legacy HD seed, if one is available. + Fix indentation. + Apply suggestions from code review + Explicitly specify the change address in the Sapling migration. + Add TODO for Orchard z_listunspent integration. + Document that z_getnewaccount and z_getaddressforaccount replace z_getnewaddress. + Add orchard support to z_getnotescount + Document that Orchard keys are not supported in z_importkey help + Return the correct error for `z_getbalance` if a UA does not correspond to an account in the wallet.. + Update documentation of z_importviewingkey and z_exportviewingkey to address unified keys. + Add UnifiedAddress variant to ZTXOSelector + Eliminate redundancy between the wallet and the keystore. + Simplify retrieval of unified account by address. + Add OrchardWallet::GetTxActions + Apply suggestions from code review + Update z_viewtransaction documentation to correctly represent field names. + Add debug printing for receivers and recipient addresses. + Correctly report change outputs in z_viewtransaction. + Return the default unified address if we have the UFVK but no address metadata. + Fix missing AllowRevealedSenders flag in test. + Uncomment addtional tests that depend on z_viewtransaction. + Minor rename & documentation improvement. + Add RecipientType to GetPaymentAddressForRecipient result. + Make CWallet::DefaultReceiverTypes height-dependent. + Return failure rather than asserting on WriteRecipientMapping failure. + Lock cs_main for accesses to chainActive in GetPaymentAddressForRecipient. + Fix legacy address handling in CWallet::GetPaymentAddressForRecipient + Documentation fix for UnifiedAddressForReciever (+ spelling corrections.) + Restore legacy default Sapling addresses to the keystore. + Assert that pindexStart cannot be null in CWallet::ScanForWalletTransactions + Rename unifiedaddress->address in z_getaddressforaccount results + Add undocumented components to getinfo API. + Improve consistency of RPC parameter and result attribute naming. + Correctly return p2pkh/p2sh labels for z_listunifiedreceivers + Add test for rollback of an Orchard spend. + Add missing filter to ensure only fully-transparent transactions end up in mapOrphans. + Apply suggestions from code review + Improve error message for when a UA is only usable after a future NU. + Improve error logging in walletdb.cpp + Add an RPC test that attempts a double-spend. + Fix overzealous matching of Orchard FVKs to addresses. + Guard against invalid coercion of int to u32 in FindSpendableInputs + Apply suggestions from code review + Ensure that legacy imported addresses are properly restored to the wallet. + Add a test verifying the default addr is added when importing a Sapling key. + Update release notes to include all RPC changes since 4.6.0 + Note that Debian 9 has been removed from the list of supported platforms. + Add independent wallet persistence tests. + Apply suggestions from code review + Add Orchard support to z_listunspent. + Update incrementalmerkletree version to fix GC bug & use updated API. + Add account ID to z_listunspent results. + Add a test demonstrating that z_listaddresses reveals internal addrs. + Do not display internal addresses in z_listaddresses. + Adds a test demonstrating an Orchard wallet initialization bug. + Refactor ChainTip to take a struct of Merkle trees instead of a pair. + Fix a bug in initialization of the Orchard wallet after NU5 activation. + Improve error output from OrchardWallet::get_spend_info + Update test to verify rewind behavior. + Omit check of Orchard commitment root after rewind past first checkpoint. + Only check nWitnessCacheSize on rewind if we've ever witnessed a Sprout or Sapling note. + Add a test demonstrating that change may cross the pool boundary without permission. + Add logging to the miner to provide more detail on tx selection. + Check privacy strategy when setting allowed change types. + Update to orchard-0.1.0-beta.3, incrementalmerkletree 0.3.0-beta.2, secp256k1-0.21 + Make all privacy policy checks after note selection. + Add 'AllowRevealedAmounts' in tests where it is now necessary. + Return MAX_PRIORITY when transactions contain an Orchard bundle. + Use DEFAULT_FEE consistently in wallet_unified_change test + Never consider transactions that pay the default fee to be free. + Fix assertion in wallet initialization when wallet best block is ahead of the main chain. + Apply suggestions from code review + Apply suggestions from code review + Fix error in z_listaccounts help text. + Ensure pindexPrev is not null before mining against it. + Make Orchard `finalState` serialization format match Sapling. + Fix missing null initialization of `pindexLastTip` pointer in ThreadStartWalletNotifier + Fix uninitialized sleep variable. + Don't advance the wallet init timer until past reindex. + Defensively check for a null pindex in `FindFork` + Set NU5 testnet reactivation height. + Update protocol version to 170050 for v4.7.0 release. + Update the release notes to describe consensus changes since v4.6.0 + Apply suggestions from code review + Push back NU5 testnet release height to 1842420 + qa: postpone native_clang, libcxx, boost, and native_b2 upgrades before 4.7.0 release + make-release.py: Versioning changes for 4.7.0. + make-release.py: Updated manpages for 4.7.0. + +Larry Ruane (13): + add ParseArbitraryInt() for diversifier index + add -orchardwallet experimental feature flag + Add new and modify existing Orchard RPCs, non-functional + mining: submitblock: log detailed equihash solution error + allow UA as z_shieldcoinbase destination + fix minconf parsing for z_getbalanceforaccount and z_getbalanceforaddress + Update z_listreceivedbyaddress to support unified addresses (5467) + fix wallet_listreceived.py, add blockdata to taddr output + z_listreceivedbyaddress: reject UA component addr (#5537) + add functional test + document global variables + update listaddresses RPC for UAs, Orchard + Add regtest documentation to book + +Marius Kjærstad (1): + Update copyright year to 2022 + +Marshall Gaucher (1): + Update Dockerfile + +Pieter Wuille (2): + Fix csBestBlock/cvBlockChange waiting in rpc/mining + Modernize best block mutex/cv/hash variable naming + +Sean Bowe (12): + wallet: consolidate unified key/address/account map reconstruction + wallet: restore Orchard secret keys from mnemonic seed + wallet: restore orchard address to IVK mappings during wallet loading + wallet: rather than assert, error in case of inconsistency between FVK and address + wallet: add logging for failure cases in unified cache loading + AddBogusOrchardSpends + Add test that checks if a bundle containing duplicate Orchard nullifiers is rejected. + Hardcode transaction data for DuplicateOrchardNullifier test. + Revert "AddBogusOrchardSpends" + Activate NU5 at start of DuplicateOrchardNullifier test. + Rename constant in include file to avoid conflicts with btest + Fix logic for deciding whether to perform Orchard updates during rescan + +Steven Smith (9): + Lock cs_main prior to calling blockToJSON + Mark z_gettotalbalance and dumpwallet as deprecated + Add Orchard support to the z_gettreestate RPC + Update transaction size estimation to include V5 transactions + Extend uniqueness check in z_sendmany to UA receivers + Load previously persisted sent transaction recipient metadata back into the wallet. + Add Orchard & unified address support to z_viewtransaction. + Ensure z_viewtransaction returns Orchard details + Remove the fExperimentalOrchardWallet flag and related logic + +Taylor Hornby (2): + Untested, not working yet, use libtinfo from the debian packages + Only send exceptions to the log, not stderr + +sasha (21): + on Arch only, use Debian's libtinfo5_6.0 to satisfy clang + explain the 0x0f0f[..]0f0f powLimit constant for regtest + remove superfluous space at end of native_packages line + gtests ordering: change wallet filename in WriteZkeyDirectToDb + gtests ordering: ContextualCheckBlockTest's TearDown deactivates Blossom + gtests ordering: CheckBlock.VersionTooLow calls SelectParams(MAIN) + implement AtomicTimer::zeroize() that resets start_time and total_time + gtests ordering: make Metrics.GetLocalSolPS idempotent + gtests ordering: clean up wallet files before each WalletZkeysTest + make librustzcash_init_zksnark_params idempotent + move proof parameter loading out of gtest/main.cpp and into utiltest.cpp + Call LoadProofParameters() in gtests that need proofs + Add missing wallet/orchard.h to src/Makefile.am + Add missing gtest/test_transaction_builder.h to Makefile.gtest.include + Prevent a pindex == NULL case in the ScanForWalletTransactions traversal + Disallow testnet peers with a protocol version older than 170040 + Fix test_wallet_zkeys failures by increasing diversifier search offset + Fix sporadic failures in StoreAndRetrieveMnemonicSeedInEncryptedStore + Fix the exception message for SetSeedFromMnemonic failure + add walletrequirebackup=false to the zcash argument list in smoke_tests.py + fix smoke_tests.py accounting math to remove the warning before test 4r + +Jack Grigg (1): + Apply suggestions from code review + +Ying Tong Lai (31): + Move SendManyRecipient to wallet.h and introduce optional ua field. + SendTransaction: Introduce recipients argument. + Implement read and write for (txid, recipient) -> ua mapping. + z_sendmany: Only get ua if decoded is ua variant. + ShieldToAddress: Factor out static shieldToAddress() helper. + Docfixes. + CSerializeRecipientAddress: add Read method and make constructor private. + WriteRecipientMapping: Check that receiver exists in UA. + wallet_sendmany_any_taddr.py: Test sending from a change taddr. + wallet_sendmany_any_taddr.py: Test sending output from expired tx. + FindSpendableInputs: Add nDepth < 0 check. + wallet_sendmany_any_taddr.py: Expect expired tx to be ignored. + Orchard: invalidate mempool transactions that use orphaned anchors. + coins_tests.cpp: Add Orchard nullifier to TxWithNullifiers(). + coins_tests: Update tests to include Orchard case. + CWallet::GetConflictS: Handle conflicting Orchard spends. + z_getbalance: Handle Unified Address case. + Adapt RPC tests to use z_getbalance for UAs. + test_wallet: Test GetConflictedOrchardNotes. + Fix GetConflictedOrchardNotes test. + Introduce OrchardWallet::GetPotentialSpendsFromNullifier method. + Update FFI to use scoped APIs for viewing keys and addresses + Introduce CWallet::HaveOrchardSpendingKeyForAddress. + Introduce push_orchard_result in z_listreceivedbyaddress. + IsNoteSaplingChange: Inline internal recipient check. + Correctly derive UAs for unknown Orchard receivers. + Add z_listaccounts RPC. + Inline z_listaccounts check in wallet_accounts.py + Use height of latest network upgrade in -mineraddress validation. + Fix >= bound when iterating over network upgrades. + Check for overflow in IncrementAccountCounter(). + +ying tong (3): + Apply docfixes from code review + Style improvements in RPC tests. + orchard_wallet_get_potential_spends: Do not use uint256 type. + +Zancas Wilcox (4): + blake2b/s is integrated into hashlib, drop external python package dependency + update doctest in gtest suite to prefer hashlib + enforce usage of the get_tests comptool interface as ComparisonTestFramework method + All implementations of ComparisonTestFramework were overriding num_nodes + diff --git a/doc/release-notes/release-notes-5.0.0-rc1.md b/doc/release-notes/release-notes-5.0.0-rc1.md new file mode 100644 index 000000000..df92993b5 --- /dev/null +++ b/doc/release-notes/release-notes-5.0.0-rc1.md @@ -0,0 +1,215 @@ +Notable changes +=============== + +Feature Deprecation and removal +------------------------------- + +`zcashd` now has a [process](https://zcash.github.io/zcash/user/deprecation.html) +for how features of the public API may be deprecated and removed. Feature +deprecation follows a series of steps whereby, over a series of releases, +features first remain enabled by default (but may be explicitly disabled), then +switch to being disabled by default, and eventually are removed entirely. + +A new string-valued option, `-allowdeprecated` has been introduced to allow a +user to explicitly manage the availability of deprecated `zcashd` features. This +flag makes it possible for users to reenable deprecated methods and features +api that are currently disabled by default, or alternately to explicitly +disable all deprecated features if they so choose. Multiple instances of this +argument may be provided. A user may disable deprecated features entirely +by providing the string `none` as the argument to this parameter. In the case +that `none` is specified, multiple invocations of `-allowdeprecated` are not +permitted. + +Deprecated +---------- + +As of this release, the following features are deprecated, but remain +available by default. These features may be disabled by setting +`-allowdeprecated=none`. After release 5.3.0, these features will be +disabled by default and the following flags to `-allowdeprecated` will +be required to permit their continued use: + + - `legacy_privacy` - the default "legacy" privacy policy for z_sendmany + is deprecated. When disabled, the default behavior of z_sendmany will + conform to the `FullPrivacy` directive (introduced in 4.7.0) in all cases + instead of just for transactions involving unified addresses. + - `getnewaddress` - controls availability of the `getnewaddress` RPC method. + - `z_getnewaddress` - controls availability of the `z_getnewaddress` RPC method. + - `addrtype` - controls availability of the deprecated `type` attribute + returned by RPC methods that return address metadata. + +As of this release, the following previously deprecated features are disabled +by default, but may be be reenabled using `-allowdeprecated=`. + + - The `zcrawreceive` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawreceive` + - The `zcrawjoinsplit` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawjoinsplit` + - The `zcrawkeygen` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawkeygen` + +Option handling +--------------- + +- The `-reindex` and `-reindex-chainstate` options now imply `-rescan` + (provided that the wallet is enabled and pruning is disabled, and unless + `-rescan=0` is specified explicitly). +- A new `-anchorconfirmations` argument has been added to allow the user + to specify the number of blocks back from the chain tip that anchors will be + selected from when spending notes. By default, anchors will now be selected + to have 3 confirmations. Values greater than 100 are not supported. +- A new `-orchardactionlimit` option has been added to allow the user to + override the default maximum of 50 Orchard actions per transaction. + Transactions that contain large numbers of Orchard actions can use + large amounts of memory for proving, so the 50-action default limit is + imposed to guard against memory exhaustion. Systems with more than 16G + of memory can safely set this parameter to allow 200 actions or more. + +RPC Interface +------------- + +- The default `minconf` value for `z_sendmany` is now 10 confirmations instead + of 1. If `minconf` and specifies a value less than that provided for + `-anchorconfirmations`, it will also override that value as it is not + possible to spend notes that are more recent than the anchor. Selecting + `minconf` values less than 3 is not recommended, as it allows the transaction + to be distinguished from transactions using the default for + `-anchorconfirmations`. + +RPC Changes +----------- + +- The deprecated `zcrawkeygen`, `zcrawreceive`, and `zcrawjoinsplit` RPC + methods are now disabled by default. Use `-allowdeprecated=` + to select individual features if you wish to continue using these APIs. + +Build system +------------ + +- `zcutil/build.sh` now automatically runs `zcutil/clean.sh` to remove + files created by previous builds. We previously recommended to do this + manually. + +Dependencies +------------ + +- The `boost` and `native_b2` dependencies have been updated to version 1.79.0 + +Tests +----- + +- The environment variable that allows users of the rpc (Python) tests to + override the default path to the `zcashd` executable has been changed + from `BITCOIND` to `ZCASHD`. + +Changelog +========= + +Alex Wied (1): + Cargo.toml: Rename hdwallet source + +Charlie O'Keefe (1): + Use bullseye apt source in Dockerfile to match debian:11 base image + +Daira Hopwood (9): + Fix to 4.7.0 release notes: testnet nodes that upgrade prior to height 1,842,420 actually still need to run with -reindex and -rescan. + zcutil/build.sh: Run zcutil/clean.sh before building. fixes #3625 + Make `-reindex` and `-reindex-chainstate` imply `-rescan` (provided that the wallet is enabled and pruning is disabled, and unless `-rescan=0` is specified explicitly). + zcutil/build-debian-package.sh: copy executable and man page for zcashd-wallet-tool. + zcashd-wallet-tool: improve the error message for an invalid logging filter directive. + Change the numbering convention for hotfixes to increment the patch number, not the hyphen number. fixes #4364 + Rename nOrchardAnchorConfirmations -> nAnchorConfirmations + Select an anchor and notes that have 10 confirmations. + Fix WalletTests.CachedWitnessesEmptyChain for new anchor selection. + +Dimitris Apostolou (1): + Fix typo + +Jack Grigg (3): + Update minimum chain work and set NU5 activation block hash for testnet + make-release.py: Versioning changes for 5.0.0-rc1. + make-release.py: Updated manpages for 5.0.0-rc1. + +Kris Nuttycombe (30): + Update boost dependencies to version 1.79.0 + Default to error logging if we can't parse the log filter. + Fix boolean initialization in Orchard transaction builder. + Use fallible version parsing for tags. + Allow deprecated wallet features to be preemptively disabled. + Remove zcrawreceive, zcrawjoinsplit, zcrawkeygen from default-allowed deprecated methods. + Add deprecation policy to the zcashd book. + Use ERROR level logging for fatal errors in main/init + Remove `-allowdeprecated=all` + Clarify documentation of the deprecation process. + Select Orchard anchors at `-orchardanchorconfirmations` depth. + Add anchor depth parameter to Get*NoteWitnesses + Disallow -anchorconfirmations values > 100 + Add -anchorconfirmations to the release notes + Fix RPC tests that depend upon -anchorconfirmations=1 + Apply suggestions from code review + Gracefully handle Get(Sprout/Sapling)NoteWitnesses failure. + Add parity-scale-codec licenses to contrib/debian/copyright + Ensure transaction integer fields are zero-initialized. + Build releases from a commit hash, rather than a named branch. + Apply suggestions from code review + Update release process documentation to clarify the use of release stabilization branches. + Fix missing handling for imported transparent multisig addresses. + Change default anchor depth from 10 confirmations to 3 + Use default anchor confirmations for minconf in z_mergetoaddress. + Add -orchardactionlimit parameter to guard against memory exhaustion. + Add -orchardactionlimit help text. + Postpone dependency updates prior to v5.0.0-rc1 + Set RELEASE_TO_DEPRECATION_WEEKS to 2 weeks to provide RC EOS halt. + Fix a typo in the release script. + +Larry Ruane (2): + Allow rpc python tests to be run standalone + ThreadStartWalletNotifier: wait until !IBD, rather than !reindex + +Marek (2): + Document the block time in the `z_gettreestate` RPC response + Specify the format and epoch + +Steven Smith (2): + Add orchard pool metrics + Require wallet recovery phrase to be backed up for z_getnewaccount and z_getaddressforaccount + +Taylor Hornby (1): + Reproduce an assertion failure in the listaddresses RPC + +dependabot[bot] (1): + Bump actions/checkout from 2 to 3 + +sasha (28): + Move LoadProofParameters to gtest/utils.cpp + add tx-orchard-duplicate-nullifiers.h to Makefile.gtest.include + Closing #1539 simplifies gtest Makefile. + remove JoinSplitTestingSetup from sighash_tests -- it doesn't need it + Make a LoadGlobalWallet and UnloadGlobalWallet for gtests + Remove proof parameter loading from btests + Separate test suite from tests, inspired by upstream's #12926 + Allow parallel btest runs using make as the parallelization tool. + btest parallelization work: tag #if'd out test suites + Port btest test_basic_joinsplit_verification to gtest suite Joinsplit + Create a new gtest group WalletRPCTests + Port btest rpc_z_shieldcoinbase_internals to gtest suite WalletRPCTests + Port btest rpc_z_mergetoaddress_internals to gtest suite WalletRPCTests + Port btest rpc_z_sendmany_taddr_to_sapling to gtest suite WalletRPCTests + Downgrade btest suite coins_test to BasicTestingSetup + Make [seed_]insecure_rand available to the gtests + Create a new gtest suite CoinsTests + Port CCoinsViewTest to gtest suite CoinsTests + Port nullifier_regression_test to gtest suite CoinsTests + Port anchor_pop_regression_test to gtest suite CoinsTests + Port anchor_regression_test to gtest suite CoinsTests + Port nullifiers_test to gtest suite CoinsTests + Port anchors_flush_test to gtest suite CoinsTests + Port anchors_test to gtest suite CoinsTests + Update copyright header + Update comments in newly-ported gtests to be more consistent with current codebase + Tidy up spacing in newly-ported gtests + Remove -developersapling since it hasn't been implemented for a long time + +teor (1): + Fix typo in getaddressbalance RPC help + diff --git a/doc/release-notes/release-notes-5.0.0.md b/doc/release-notes/release-notes-5.0.0.md new file mode 100644 index 000000000..173d41474 --- /dev/null +++ b/doc/release-notes/release-notes-5.0.0.md @@ -0,0 +1,253 @@ +Notable changes +=============== + +The mainnet activation of the NU5 network upgrade is supported by the 5.0.0 +release, with an activation height of 1687104, which should occur on +approximately May 31, 2022. Please upgrade to this release, or any subsequent +release, in order to follow the NU5 network upgrade. + +The following ZIPs are being deployed, or have been updated, as part of this upgrade: + +* [ZIP 32 : Shielded Hierarchical Deterministic Wallets (updated)](https://zips.z.cash/zip-0032) +* [ZIP 203: Transaction Expiry (updated)](https://zips.z.cash/zip-0203) +* [ZIP 209: Prohibit Negative Shielded Chain Value Pool Balances (updated)](https://zips.z.cash/zip-0209) +* [ZIP 212: Allow Recipient to Derive Ephemeral Secret from Note Plaintext (updated)](https://zips.z.cash/zip-0212) +* [ZIP 213: Shielded Coinbase (updated)](https://zips.z.cash/zip-0213) +* [ZIP 216: Require Canonical Jubjub Point Encodings](https://zips.z.cash/zip-0216) +* [ZIP 221: FlyClient - Consensus-Layer Changes (updated)](https://zips.z.cash/zip-0221) +* [ZIP 224: Orchard Shielded Protocol](https://zips.z.cash/zip-0224) +* [ZIP 225: Version 5 Transaction Format](https://zips.z.cash/zip-0225) +* [ZIP 239: Relay of Version 5 Transactions](https://zips.z.cash/zip-0239) +* [ZIP 244: Transaction Identifier Non-Malleability](https://zips.z.cash/zip-0244) +* [ZIP 252: Deployment of the NU5 Network Upgrade](https://zips.z.cash/zip-0252) +* [ZIP 316: Unified Addresses and Unified Viewing Keys](https://zips.z.cash/zip-0316) +* [ZIP 401: Addressing Mempool Denial-of-Service (clarified)](https://zips.z.cash/zip-0401) + +Feature Deprecation and removal +------------------------------- + +`zcashd` now has a [process](https://zcash.github.io/zcash/user/deprecation.html) +for how features of the public API may be deprecated and removed. Feature +deprecation follows a series of steps whereby, over a series of releases, +features first remain enabled by default (but may be explicitly disabled), then +switch to being disabled by default, and eventually are removed entirely. + +A new string-valued option, `-allowdeprecated` has been introduced to allow a +user to explicitly manage the availability of deprecated `zcashd` features. This +flag makes it possible for users to reenable deprecated methods and features +api that are currently disabled by default, or alternately to explicitly +disable all deprecated features if they so choose. Multiple instances of this +argument may be provided. A user may disable deprecated features entirely +by providing the string `none` as the argument to this parameter. In the case +that `none` is specified, multiple invocations of `-allowdeprecated` are not +permitted. + +Deprecated +---------- + +As of this release, the following features are deprecated, but remain +available by default. These features may be disabled by setting +`-allowdeprecated=none`. After release 5.3.0, these features will be +disabled by default and the following flags to `-allowdeprecated` will +be required to permit their continued use: + + - `legacy_privacy` - the default "legacy" privacy policy for z_sendmany + is deprecated. When disabled, the default behavior of z_sendmany will + conform to the `FullPrivacy` directive (introduced in 4.7.0) in all cases + instead of just for transactions involving unified addresses. + - `getnewaddress` - controls availability of the `getnewaddress` RPC method. + - `getrawchangeaddress` - controls availability of the `getrawchangeaddress` RPC method. + - `z_getbalance` - controls availability of the `z_getbalance` RPC method. + - `z_gettotalbalance` - controls availability of the `z_gettotalbalance` RPC method. + - `z_getnewaddress` - controls availability of the `z_getnewaddress` RPC method. + - `z_listaddresses` - controls availability of the `z_listaddresses` RPC method. + - `addrtype` - controls availability of the deprecated `type` attribute + returned by RPC methods that return address metadata. + +As of this release, the following previously deprecated features are disabled +by default, but may be be reenabled using `-allowdeprecated=`. + + - The `zcrawreceive` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawreceive` + - The `zcrawjoinsplit` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawjoinsplit` + - The `zcrawkeygen` RPC method is disabled. It may be reenabled with + `allowdeprecated=zcrawkeygen` + +Option handling +--------------- + +- The `-reindex` and `-reindex-chainstate` options now imply `-rescan` + (provided that the wallet is enabled and pruning is disabled, and unless + `-rescan=0` is specified explicitly). +- A new `-anchorconfirmations` argument has been added to allow the user + to specify the number of blocks back from the chain tip that anchors will be + selected from when spending notes. By default, anchors will now be selected + to have 3 confirmations. Values greater than 100 are not supported. +- A new `-orchardactionlimit` option has been added to allow the user to + override the default maximum of 50 Orchard actions per transaction. + Transactions that contain large numbers of Orchard actions can use + large amounts of memory for proving, so the 50-action default limit is + imposed to guard against memory exhaustion. Systems with more than 16G + of memory can safely set this parameter to allow 200 actions or more. + +RPC Interface +------------- + +- The default `minconf` value for `z_sendmany` is now 10 confirmations instead + of 1. If `minconf` specifies a value less than that provided for + `-anchorconfirmations`, it will also override that value as it is not + possible to spend notes that are more recent than the anchor. Selecting + `minconf` values less than 3 is not recommended, as it allows the transaction + to be distinguished from transactions using the default for + `-anchorconfirmations`. + +RPC Changes +----------- + +- The deprecated `zcrawkeygen`, `zcrawreceive`, and `zcrawjoinsplit` RPC + methods are now disabled by default. Use `-allowdeprecated=` + to select individual features if you wish to continue using these APIs. + +Build system +------------ + +- `zcutil/build.sh` now automatically runs `zcutil/clean.sh` to remove + files created by previous builds. We previously recommended to do this + manually. + +Dependencies +------------ + +- The `boost` and `native_b2` dependencies have been updated to version 1.79.0 + +Tests +----- + +- The environment variable that allows users of the rpc (Python) tests to + override the default path to the `zcashd` executable has been changed + from `BITCOIND` to `ZCASHD`. + +Changelog +========= + +Alex Wied (1): + Cargo.toml: Rename hdwallet source + +Charlie O'Keefe (1): + Use bullseye apt source in Dockerfile to match debian:11 base image + +Daira Hopwood (9): + Fix to 4.7.0 release notes: testnet nodes that upgrade prior to height 1,842,420 actually still need to run with -reindex and -rescan. + zcutil/build.sh: Run zcutil/clean.sh before building. fixes #3625 + Make `-reindex` and `-reindex-chainstate` imply `-rescan` (provided that the wallet is enabled and pruning is disabled, and unless `-rescan=0` is specified explicitly). + zcutil/build-debian-package.sh: copy executable and man page for zcashd-wallet-tool. + zcashd-wallet-tool: improve the error message for an invalid logging filter directive. + Change the numbering convention for hotfixes to increment the patch number, not the hyphen number. fixes #4364 + Rename nOrchardAnchorConfirmations -> nAnchorConfirmations + Select an anchor and notes that have 10 confirmations. + Fix WalletTests.CachedWitnessesEmptyChain for new anchor selection. + +Dimitris Apostolou (1): + Fix typo + +Jack Grigg (5): + Update minimum chain work and set NU5 activation block hash for testnet + make-release.py: Versioning changes for 5.0.0-rc1. + make-release.py: Updated manpages for 5.0.0-rc1. + make-release.py: Updated release notes and changelog for 5.0.0-rc1. + Migrate to `zcash_primitives 0.6` et al + +Kris Nuttycombe (40): + Update boost dependencies to version 1.79.0 + Default to error logging if we can't parse the log filter. + Fix boolean initialization in Orchard transaction builder. + Use fallible version parsing for tags. + Allow deprecated wallet features to be preemptively disabled. + Remove zcrawreceive, zcrawjoinsplit, zcrawkeygen from default-allowed deprecated methods. + Add deprecation policy to the zcashd book. + Use ERROR level logging for fatal errors in main/init + Remove `-allowdeprecated=all` + Clarify documentation of the deprecation process. + Select Orchard anchors at `-orchardanchorconfirmations` depth. + Add anchor depth parameter to Get*NoteWitnesses + Disallow -anchorconfirmations values > 100 + Add -anchorconfirmations to the release notes + Fix RPC tests that depend upon -anchorconfirmations=1 + Add z_get(total)balance to deprecation flags. + Apply suggestions from code review + Gracefully handle Get(Sprout/Sapling)NoteWitnesses failure. + Add parity-scale-codec licenses to contrib/debian/copyright + Ensure transaction integer fields are zero-initialized. + Build releases from a commit hash, rather than a named branch. + Apply suggestions from code review + Update release process documentation to clarify the use of release stabilization branches. + Fix missing handling for imported transparent multisig addresses. + Change default anchor depth from 10 confirmations to 3 + Use default anchor confirmations for minconf in z_mergetoaddress. + Add -orchardactionlimit parameter to guard against memory exhaustion. + Add -orchardactionlimit help text. + Postpone dependency updates prior to v5.0.0-rc1 + Set RELEASE_TO_DEPRECATION_WEEKS to 2 weeks to provide RC EOS halt. + Fix a typo in the release script. + Fix typos in release notes & Orchard wallet internal API doc. + Add missing parenthesis to -reindex help. + Include getbalance in recommendations for z_getbalance and z_gettotalbalance replacements. + Add tests to check auth data commitments committing to Orchard actions. + Deprecate `getrawchangeaddress` and `z_listaddresses` + Update rpcwallet help to better distinguish transparent-only APIs. + Revert "Set RELEASE_TO_DEPRECATION_WEEKS to 2 weeks to provide RC EOS halt." + make-release.py: Versioning changes for 5.0.0. + make-release.py: Updated manpages for 5.0.0. + +Larry Ruane (2): + Allow rpc python tests to be run standalone + ThreadStartWalletNotifier: wait until !IBD, rather than !reindex + +Marek (2): + Document the block time in the `z_gettreestate` RPC response + Specify the format and epoch + +Steven Smith (2): + Add orchard pool metrics + Require wallet recovery phrase to be backed up for z_getnewaccount and z_getaddressforaccount + +Taylor Hornby (1): + Reproduce an assertion failure in the listaddresses RPC + +dependabot[bot] (1): + Bump actions/checkout from 2 to 3 + +sasha (28): + Move LoadProofParameters to gtest/utils.cpp + add tx-orchard-duplicate-nullifiers.h to Makefile.gtest.include + Closing #1539 simplifies gtest Makefile. + remove JoinSplitTestingSetup from sighash_tests -- it doesn't need it + Make a LoadGlobalWallet and UnloadGlobalWallet for gtests + Remove proof parameter loading from btests + Separate test suite from tests, inspired by upstream's #12926 + Allow parallel btest runs using make as the parallelization tool. + btest parallelization work: tag #if'd out test suites + Port btest test_basic_joinsplit_verification to gtest suite Joinsplit + Create a new gtest group WalletRPCTests + Port btest rpc_z_shieldcoinbase_internals to gtest suite WalletRPCTests + Port btest rpc_z_mergetoaddress_internals to gtest suite WalletRPCTests + Port btest rpc_z_sendmany_taddr_to_sapling to gtest suite WalletRPCTests + Downgrade btest suite coins_test to BasicTestingSetup + Make [seed_]insecure_rand available to the gtests + Create a new gtest suite CoinsTests + Port CCoinsViewTest to gtest suite CoinsTests + Port nullifier_regression_test to gtest suite CoinsTests + Port anchor_pop_regression_test to gtest suite CoinsTests + Port anchor_regression_test to gtest suite CoinsTests + Port nullifiers_test to gtest suite CoinsTests + Port anchors_flush_test to gtest suite CoinsTests + Port anchors_test to gtest suite CoinsTests + Update copyright header + Update comments in newly-ported gtests to be more consistent with current codebase + Tidy up spacing in newly-ported gtests + Remove -developersapling since it hasn't been implemented for a long time + +teor (1): + Fix typo in getaddressbalance RPC help + diff --git a/doc/release-notes/release-notes-5.1.0-rc1.md b/doc/release-notes/release-notes-5.1.0-rc1.md new file mode 100644 index 000000000..6c8e4f223 --- /dev/null +++ b/doc/release-notes/release-notes-5.1.0-rc1.md @@ -0,0 +1,222 @@ +Notable changes +=============== + +Faster block validation for Sapling and Orchard transactions +------------------------------------------------------------ + +Block validation in `zcashd` is a mostly single-threaded process, due to how the +chain update logic inherited from Bitcoin Core is written. However, certain more +computationally intensive checks are performed more efficiently than checking +everything individually: + +- ECDSA signatures on transparent inputs are checked via multithreading. +- RedPallas signatures on Orchard actions are checked via batch validation. + +As of this release, `zcashd` applies these techniques to more Sapling and +Orchard components: + +- RedJubjub signatures on Sapling Spends are checked via batch validation. +- Groth16 proofs for Sapling Spends and Outputs are checked via batch validation + and multithreading. +- Halo 2 proofs for Orchard Actions are checked via batch validation and + multithreading. + +This reduces worst-case block validation times for observed historic blocks by +around 80% on a Ryzen 9 5950X CPU. + +The number of threads used for checking Groth16 and Halo 2 proofs (as well as +for creating them when spending funds) can be set via the `RAYON_NUM_THREADS` +environment variable. + +Option handling +--------------- + +- A new `-preferredtxversion` argument allows the node to preferentially create + transactions of a specified version, if a transaction does not contain + components that necessitate creation with a specific version. For example, + setting `-preferredtxversion=4` will cause the node to create V4 transactions + whenever the transaction does not contain Orchard components. This can be + helpful if recipients of transactions are likely to be using legacy wallets + that have not yet been upgraded to support parsing V5 transactions. + +RPC interface +------------- + +- The `getrawtransaction` RPC method now includes details about Orchard actions + within transactions. + +Deprecated +---------- + +As of this release, the following previously deprecated features are disabled +by default, but may be be reenabled using `-allowdeprecated=`. + + - The `dumpwallet` RPC method is disabled. It may be reenabled with + `allowdeprecated=dumpwallet`. `dumpwallet` should not be used; it is + unsafe for backup purposes as it does not return any key information + for keys used to derive shielded addresses. Use `z_exportwallet` instead. + +As of this release, the following features are deprecated, but remain available +by default. These features may be disabled by setting `-allowdeprecated=none`. +After at least 3 minor-version releases, these features will be disabled by +default and the following flags to `-allowdeprecated` will be required to +permit their continued use: + + - `wallettxvjoinsplit` - controls availability of the deprecated `vjoinsplit` + attribute returned by the `gettransaction` RPC method. + +Changelog +========= + +Brian Stafford (2): + rpc: Add missing fields to getrawtransaction help text + rpc: add valueBalanceOrchard to getrawtransaction output + +Chun Kuan Lee (1): + break circular dependency: random/sync -> util -> random/sync + +Cory Fields (1): + threads: add a thread_local autoconf check + +Daira Hopwood (4): + halo2 is now under MIT/Apache-2.0, so does not need a declaration in `contrib/debian/copyright`. fixes #5203 + COPYING: Address feedback about the use of "permissive". Also refer to zcashd instead of "Zcash". + Upgrade to metrics 0.19.x and metrics-exporter-prometheus 0.10.x. + Apply cosmetic suggestions + +Jack Grigg (39): + book: Add platform support information and tier policy + lint: Fix cargo patches linter when no patches are present + Shorten thread name prefix + Name currently-unnamed threads that we can rename + book: Capitalize key words in platform tier policy + book: Add FreeBSD to tier 3 platforms list + depends: Add cxx crate to dependencies + depends: Add cxxbridge command to dependencies + build: Pass `CC` etc. flags through to `cargo build` + build: Add non-verbose output for `cargo build` + depends: Add `rust/cxx.h` header as a dependency + Migrate Equihash Rust FFI to `cxx` + Migrate BLAKE2b Rust FFI to `cxx` + depends: Vendor dependencies of native_cxxbuild + Revert "Switched sync.{cpp,h} to std threading primitives." + qa: Fix sprout_sapling_migration RPC test to handle wallet RPC change + wallet: Clear witness caches on load if reindexing + Document that `-reindex` and `-salvagewallet` both imply `-rescan` + Update orchard license with current exception text + Note dependence on BOSL in COPYING + qa: `cargo vet init` + qa: Add `crypto-reviewed` and `license-reviewed` criteria for `cargo vet` + CI: Add workflow that runs `cargo vet --locked` + qa: Add audits for the crates directly maintained by the ECC core team + book: Add section about auditing Rust dependencies + qa: Fix `qa/zcash/create_benchmark_archive.py` script + qa: Generalise `extract_benchmark_data` in `performance-measurements.sh` + bench: Support multiple trees in FakeCoinsViewDB + bench: Add `ConnectBlock` benchmark using block 1708048 + cargo vet fmt + Upgrade to `orchard 0.2.0` + Batch-validate Orchard proofs as well as Orchard signatures + test: Load the proof verification keys in Boost tests + bench: Add `ConnectBlock` benchmark using block 1723244 + Use batch validation for Sapling proofs and signatures + qa: Reformat for latest cargo-vet + qa: Postpone dependency updates + Update release notes + qa: Add native_cxxbridge and rustcxx to update checker + +Jesse Cohen (1): + Annotate AssertLockHeld() with ASSERT_CAPABILITY() for thread safety analysis + +John Newbery (1): + [logging] Comment all continuing logs. + +João Barbosa (1): + Remove unused fTry from push_lock + +Kris Nuttycombe (27): + Fix incorrect links in 5.0.0 release notes. + Fix inconsistent caplitalization in copyright notices. + scripted-diff: Update Zcash copyrights to 2022 + scripted-diff: Add 2016-2022 copyright headers for files added/modified in 2016 + scripted-diff: Add 2017-2022 copyright headers for files added/modified in 2017 + scripted-diff: Add 2018-2022 copyright headers for files added/modified in 2018 + scripted-diff: Add 2019-2022 copyright headers for files added/modified in 2019 + scripted-diff: Add 2020-2022 copyright headers for files added/modified in 2020 + scripted-diff: Add 2021-2022 copyright headers for files added/modified in 2021 + Ensure that anchor depth is > 0 when selecting an Orchard anchor. + Add configure~ to .gitignore + Return an error if attempting to use z_shieldcoinbase for Orchard shielding. + Only return active protocol components from z_gettreestate. + Revert "Only return active protocol components from z_gettreestate." + Only return `skipHash` for Orchard & Sapling roots at heights >= activation. + Add a CLI flag to preferentially send V4 tx. + Revert "Make `-reindex` and `-reindex-chainstate` imply `-rescan`" + Do not attempt to begin a rescan if reindexing. + Disable wallet commands that are unavailable in safe mode during -reindex + Guard map accesses. + Mark the `dumpwallet` RPC method as disabled. + Add a clock for testing with an offset from the system clock. + Apply suggestions from code review + Note that `gettransaction` doesn't provide shielded info in RPC help. + Deprecate the `vjoinsplit` field of `gettransaction` results. + Revert "Merge pull request #6037 from nuttycom/feature/clock_capability" + Replace "Disabled" Orchard AuthValidator with std::nullopt + +Marco Falke (3): + qa: Initialize lockstack to prevent null pointer deref + sync: Add RecursiveMutex type alias + doc: Add comment to cs_main and mempool::cs + +Matt Corallo (8): + Split CNode::cs_vSend: message processing and message sending + Make the cs_sendProcessing a LOCK instead of a TRY_LOCK + Lock cs_vSend and cs_inventory in a consistent order even in TRY + Always enforce lock strict lock ordering (try or not) + Fixup style a bit by moving { to the same line as if statements + Further-enforce lockordering by enforcing directly after TRY_LOCKs + Fix -Wthread-safety-analysis warnings. Change the sync.h primitives to std from boost. + Fix fast-shutdown hang on ThreadImport+GenesisWait + +Pieter Wuille (2): + Use a signal to continue init after genesis activation + Do diskspace check before import thread is started + +Russell Yanofsky (5): + Add unit test for DEBUG_LOCKORDER code + MOVEONLY Move AnnotatedMixin declaration + Make LOCK, LOCK2, TRY_LOCK work with CWaitableCriticalSection + Use LOCK macros for non-recursive locks + scripted-diff: Small locking rename + +Sean Bowe (8): + Fix "transparent" example that should be "p2pkh" + Make shielded requirements error "debug" level rather than an error. + Introduce new Sapling verification API via cxx and switch consensus rules to use the new API. + Enable ZIP 216 for blocks prior to NU5 activation + Remove the old Sapling verification FFI APIs. + cargo fmt + Address clippy lints. + Update minimum chain work and set NU5 activation block hash for mainnet + +Thomas Snider (1): + Switched sync.{cpp,h} to std threading primitives. + +Marshall Gaucher (2): + add rpc parallel test group logic + Update walletbackup.py + +practicalswift (3): + Remove unused code + Use -Wthread-safety-analysis if available (+ -Werror=thread-safety-analysis if --enable-werror) + Fix typos + +sasha (2): + make-release.py: Versioning changes for 5.1.0-rc1. + make-release.py: Updated manpages for 5.1.0-rc1. + +Ying Tong Lai (3): + Add orchard_bundle FFI. + Use orchard_bundle ffi in getrawtransaction. + Test getrawtransaction in wallet_orchard.py + diff --git a/doc/release-notes/release-notes-5.1.0.md b/doc/release-notes/release-notes-5.1.0.md new file mode 100644 index 000000000..83a39ef97 --- /dev/null +++ b/doc/release-notes/release-notes-5.1.0.md @@ -0,0 +1,259 @@ +Notable changes +=============== + +Faster block validation for Sapling and Orchard transactions +------------------------------------------------------------ + +Block validation in `zcashd` is a mostly single-threaded process, due to how the +chain update logic inherited from Bitcoin Core is written. However, certain more +computationally intensive checks are performed more efficiently than checking +everything individually: + +- ECDSA signatures on transparent inputs are checked via multithreading. +- RedPallas signatures on Orchard actions are checked via batch validation. + +As of this release, `zcashd` applies these techniques to more Sapling and +Orchard components: + +- RedJubjub signatures on Sapling Spends are checked via batch validation. +- Groth16 proofs for Sapling Spends and Outputs are checked via batch validation + and multithreading. +- Halo 2 proofs for Orchard Actions are checked via batch validation and + multithreading. + +This reduces worst-case block validation times for observed historic blocks by +around 80% on a Ryzen 9 5950X CPU. + +The number of threads used for checking Groth16 and Halo 2 proofs (as well as +for creating them when spending funds) can be set via the `RAYON_NUM_THREADS` +environment variable. + +Option handling +--------------- + +- A new `-preferredtxversion` argument allows the node to preferentially create + transactions of a specified version, if a transaction does not contain + components that necessitate creation with a specific version. For example, + setting `-preferredtxversion=4` will cause the node to create V4 transactions + whenever the transaction does not contain Orchard components. This can be + helpful if recipients of transactions are likely to be using legacy wallets + that have not yet been upgraded to support parsing V5 transactions. + +RPC interface +------------- + +- The `getblocktemplate` RPC method now skips proof and signature checks on + templates it creates, as these templates only include transactions that have + previously been checked when being added to the mempool. + +- The `getrawtransaction` and `decoderawtransaction` RPC methods now include + details about Orchard actions within transactions. + +Wallet +------ + +- Rescan performance of post-NU5 blocks has been slightly improved (overall + rescan time for a single-account wallet decreases by around 6% on a Ryzen 9 + 5950X). Further improvements will be implemented in future releases to help + mitigate the effect of blocks full of shielded outputs. + +- The `CWallet::UpdatedTransaction` signal is no longer called while holding the + `cs_main` lock. This fixes an issue where RPCs could block for long periods of + time on `zcashd` nodes with large wallets. Downstream code forks that have + reconnected the `NotifyTransactionChanged` wallet signal should take note of + this change, and not rely there on access to globals protected by `cs_main`. + +- Some `zcashd 5.0.0` nodes would shut down some time after start with the error + `ThreadNotifyWallets: Failed to read block X while notifying wallets of block disconnects`. + `zcashd` now attempts to rectify the situation, and otherwise will inform the + user before shutting down that a reindex is required. + +- Previously, every wallet transaction stored a Merkle branch to prove its + presence in blocks. This wasn't being used for more than an expensive sanity + check. Since 5.1.0, these are no longer stored. When loading a 5.1.0 wallet + into an older version, it will automatically rescan to avoid failed checks. + +Deprecated +---------- + +As of this release, the following previously deprecated features are disabled +by default, but may be be reenabled using `-allowdeprecated=`. + + - The `dumpwallet` RPC method is disabled. It may be reenabled with + `allowdeprecated=dumpwallet`. `dumpwallet` should not be used; it is + unsafe for backup purposes as it does not return any key information + for keys used to derive shielded addresses. Use `z_exportwallet` instead. + +As of this release, the following features are deprecated, but remain available +by default. These features may be disabled by setting `-allowdeprecated=none`. +After at least 3 minor-version releases, these features will be disabled by +default and the following flags to `-allowdeprecated` will be required to +permit their continued use: + + - `wallettxvjoinsplit` - controls availability of the deprecated `vjoinsplit` + attribute returned by the `gettransaction` RPC method. + +Changelog +========= + +Brian Stafford (2): + rpc: Add missing fields to getrawtransaction help text + rpc: add valueBalanceOrchard to getrawtransaction output + +Chun Kuan Lee (1): + break circular dependency: random/sync -> util -> random/sync + +Cory Fields (1): + threads: add a thread_local autoconf check + +Daira Hopwood (4): + halo2 is now under MIT/Apache-2.0, so does not need a declaration in `contrib/debian/copyright`. fixes #5203 + COPYING: Address feedback about the use of "permissive". Also refer to zcashd instead of "Zcash". + Upgrade to metrics 0.19.x and metrics-exporter-prometheus 0.10.x. + Apply cosmetic suggestions + +Jack Grigg (46): + book: Add platform support information and tier policy + lint: Fix cargo patches linter when no patches are present + Shorten thread name prefix + Name currently-unnamed threads that we can rename + book: Capitalize key words in platform tier policy + book: Add FreeBSD to tier 3 platforms list + depends: Add cxx crate to dependencies + depends: Add cxxbridge command to dependencies + build: Pass `CC` etc. flags through to `cargo build` + build: Add non-verbose output for `cargo build` + depends: Add `rust/cxx.h` header as a dependency + Migrate Equihash Rust FFI to `cxx` + Migrate BLAKE2b Rust FFI to `cxx` + depends: Vendor dependencies of native_cxxbuild + Revert "Switched sync.{cpp,h} to std threading primitives." + qa: Fix sprout_sapling_migration RPC test to handle wallet RPC change + wallet: Clear witness caches on load if reindexing + Document that `-reindex` and `-salvagewallet` both imply `-rescan` + Update orchard license with current exception text + Note dependence on BOSL in COPYING + qa: `cargo vet init` + qa: Add `crypto-reviewed` and `license-reviewed` criteria for `cargo vet` + CI: Add workflow that runs `cargo vet --locked` + qa: Add audits for the crates directly maintained by the ECC core team + book: Add section about auditing Rust dependencies + qa: Fix `qa/zcash/create_benchmark_archive.py` script + qa: Generalise `extract_benchmark_data` in `performance-measurements.sh` + bench: Support multiple trees in FakeCoinsViewDB + bench: Add `ConnectBlock` benchmark using block 1708048 + cargo vet fmt + Upgrade to `orchard 0.2.0` + Batch-validate Orchard proofs as well as Orchard signatures + test: Load the proof verification keys in Boost tests + bench: Add `ConnectBlock` benchmark using block 1723244 + Use batch validation for Sapling proofs and signatures + qa: Reformat for latest cargo-vet + qa: Postpone dependency updates + Update release notes + qa: Add native_cxxbridge and rustcxx to update checker + Move "previous coinbase" UI monitoring into ThreadNotifyWallets + miner: Disable proof and signature checks in CreateNewBlock + wallet: Comment out slow assertion + Add missing release note entries for 5.1.0 + qa: Postpone latest `cxx` update + make-release.py: Versioning changes for 5.1.0. + make-release.py: Updated manpages for 5.1.0. + +Jesse Cohen (1): + Annotate AssertLockHeld() with ASSERT_CAPABILITY() for thread safety analysis + +John Newbery (1): + [logging] Comment all continuing logs. + +João Barbosa (1): + Remove unused fTry from push_lock + +Kris Nuttycombe (28): + Fix incorrect links in 5.0.0 release notes. + Fix inconsistent caplitalization in copyright notices. + scripted-diff: Update Zcash copyrights to 2022 + scripted-diff: Add 2016-2022 copyright headers for files added/modified in 2016 + scripted-diff: Add 2017-2022 copyright headers for files added/modified in 2017 + scripted-diff: Add 2018-2022 copyright headers for files added/modified in 2018 + scripted-diff: Add 2019-2022 copyright headers for files added/modified in 2019 + scripted-diff: Add 2020-2022 copyright headers for files added/modified in 2020 + scripted-diff: Add 2021-2022 copyright headers for files added/modified in 2021 + Ensure that anchor depth is > 0 when selecting an Orchard anchor. + Add configure~ to .gitignore + Return an error if attempting to use z_shieldcoinbase for Orchard shielding. + Only return active protocol components from z_gettreestate. + Revert "Only return active protocol components from z_gettreestate." + Only return `skipHash` for Orchard & Sapling roots at heights >= activation. + Add a CLI flag to preferentially send V4 tx. + Revert "Make `-reindex` and `-reindex-chainstate` imply `-rescan`" + Do not attempt to begin a rescan if reindexing. + Disable wallet commands that are unavailable in safe mode during -reindex + Guard map accesses. + Mark the `dumpwallet` RPC method as disabled. + Add a clock for testing with an offset from the system clock. + Apply suggestions from code review + Note that `gettransaction` doesn't provide shielded info in RPC help. + Deprecate the `vjoinsplit` field of `gettransaction` results. + Revert "Merge pull request #6037 from nuttycom/feature/clock_capability" + Replace "Disabled" Orchard AuthValidator with std::nullopt + Ensure that the node has position information before attempting to read block data. + +Marco Falke (3): + qa: Initialize lockstack to prevent null pointer deref + sync: Add RecursiveMutex type alias + doc: Add comment to cs_main and mempool::cs + +Matt Corallo (8): + Split CNode::cs_vSend: message processing and message sending + Make the cs_sendProcessing a LOCK instead of a TRY_LOCK + Lock cs_vSend and cs_inventory in a consistent order even in TRY + Always enforce lock strict lock ordering (try or not) + Fixup style a bit by moving { to the same line as if statements + Further-enforce lockordering by enforcing directly after TRY_LOCKs + Fix -Wthread-safety-analysis warnings. Change the sync.h primitives to std from boost. + Fix fast-shutdown hang on ThreadImport+GenesisWait + +Pieter Wuille (2): + Use a signal to continue init after genesis activation + Do diskspace check before import thread is started + +Russell Yanofsky (5): + Add unit test for DEBUG_LOCKORDER code + MOVEONLY Move AnnotatedMixin declaration + Make LOCK, LOCK2, TRY_LOCK work with CWaitableCriticalSection + Use LOCK macros for non-recursive locks + scripted-diff: Small locking rename + +Sean Bowe (8): + Fix "transparent" example that should be "p2pkh" + Make shielded requirements error "debug" level rather than an error. + Introduce new Sapling verification API via cxx and switch consensus rules to use the new API. + Enable ZIP 216 for blocks prior to NU5 activation + Remove the old Sapling verification FFI APIs. + cargo fmt + Address clippy lints. + Update minimum chain work and set NU5 activation block hash for mainnet + +Thomas Snider (1): + Switched sync.{cpp,h} to std threading primitives. + +Marshall Gaucher (2): + add rpc parallel test group logic + Update walletbackup.py + +practicalswift (3): + Remove unused code + Use -Wthread-safety-analysis if available (+ -Werror=thread-safety-analysis if --enable-werror) + Fix typos + +sasha (3): + make-release.py: Versioning changes for 5.1.0-rc1. + make-release.py: Updated manpages for 5.1.0-rc1. + make-release.py: Updated release notes and changelog for 5.1.0-rc1. + +Ying Tong Lai (3): + Add orchard_bundle FFI. + Use orchard_bundle ffi in getrawtransaction. + Test getrawtransaction in wallet_orchard.py + diff --git a/doc/release-notes/release-notes-5.2.0-rc1.md b/doc/release-notes/release-notes-5.2.0-rc1.md new file mode 100644 index 000000000..e49669463 --- /dev/null +++ b/doc/release-notes/release-notes-5.2.0-rc1.md @@ -0,0 +1,200 @@ +Notable changes +=============== + +Node Performance Improvements +----------------------------- + +This release makes several changes to improve the performance of node operations. +These include: + +- Backported CuckooCache from upstream to improve the performance of signature + caching. + +- Added caching of proof and signature validation results for Sapling and + Orchard to eliminate redundant computation. + +- Backported SHA-256 assembly optimizations from upstream. + +Wallet Performance Improvements +------------------------------- + +This release makes several changes to improve the performance of wallet operations. +These include: + +- We now parallelize and batch trial decryption of Sapling outputs. + +- We now prune witness data in the wallet for notes spent more than 100 blocks + in the past, so that we can avoid unnecessarily updating those witnesses. + In order to take advantage of this performance improvement, users will need + to start their nodes with `-rescan` the first time . + +- The process for incrementing the witnesses for notes the wallet is tracking + has been optimized to avoid redundant passes over the wallet. + +- Removed an assertion that was causing a slowdown in wallet scanning post-NU5. + +RPC Interface Changes +===================== + +- A `version` field was added to the result for the `gettransaction` RPC call to + avoid the need to make an extra call to `getrawtransaction` just to retrieve + the version. + +Fixes +===== + +- Fixed a regression that caused an incorrect process name to appear in the + process list. + +Changelog +========= + +Aditya Kulkarni (1): + Add tx version + +Ben Woosley (1): + build: Detect gmtime_* definitions via configure + +Chun Kuan Lee (1): + Use __cpuid_count for gnu C to avoid gitian build fail. + +Cory Fields (2): + time: add runtime sanity check + build: always attempt to enable targeted sse42 cxxflags + +Daira Hopwood (3): + This reverts part of 1f1810c37d00cb46d00d8553e6de3c6fdb991010 in #5959. Leaving the main thread unnamed causes it to be displayed as the executable name (i.e. `zcashd`) or command line in process monitoring tools. fixes #6066 + Apply doc suggestions from code review + Use crossbeam-channel instead of std::sync::mpsc. + +Dan Raviv (1): + Fix header guards using reserved identifiers + +Gregory Maxwell (1): + Add an explanation of quickly hashing onto a non-power of two range. + +Hennadii Stepanov (1): + Use correct C++11 header for std::swap() + +Jack Grigg (16): + lint: Fix include guards + wallet: Prune witnesses for notes spent more than 100 blocks ago + wallet: Make `{Increment, Decrement}NoteWitnesses`-internal helpers static + Cache Sapling and Orchard bundle validation + Add bundle kind to `BundleValidityCache` initialization log message + wallet: Throw error if `ReadBlockFromDisk` fails + wallet: Improve documentation of `SproutNotData` and `SaplingNoteData` + Move explicit instantiations for `BundleValidityCache` into `zcash/cache.cpp` + bench: Fix ConnectBlock large block benchmarks + wallet: Add `BatchScanner` interface to `CValidationInterface` + wallet: Pass `Consensus::Params` into `CWallet::FindMySaplingNotes` + wallet: Migrate `CWallet` to `CValidationInterface::InitBatchScanner` + rust: Implement multithreaded batched trial decryption for Sapling + wallet: Use batch trial decryption for Sapling outputs + wallet: Enforce an assumption about how wallet data evolves + wallet: Domain-separate batched txids with a "block tag" + +Jeremy Rubin (4): + Add CuckooCache implementation and replace the sigcache map_type with it + Add unit tests for the CuckooCache + Decrease testcase sizes in cuckoocache tests + Deduplicate SignatureCacheHasher + +Jim Posen (1): + scripted-diff: Move util files to separate directory. + +Jon Layton (1): + doc: Doxygen-friendly CuckooCache comments + +Kris Nuttycombe (15): + scripted-diff: Move utiltest to src/util + Add a clock for testing with an offset from the system clock. + Apply suggestions from code review + Add persistent Sprout test data. + Remove the temporary test that was used for setup of the cached Sprout fixtures. + Add RPC test initialization using the persisted Sprout chains. + Update sprout_sapling_migration test to use persisted sprout chains. + Update feature_zip239 test to use persisted sprout chains. + Add missing header to util/time.h + Update finalsaplingroot test to use persisted sprout chains. + Update getblocktemplate test to use persisted sprout chain + Replace setup_clean_chain with cache_behavior in rpc test init. + qa: Postpone recent native_rust, native_cxxbridge and rustcxx updates + make-release.py: Versioning changes for 5.2.0-rc1. + make-release.py: Updated manpages for 5.2.0-rc1. + +Luke Dashjr (3): + configure: Invert --enable-asm help string since default is now enabled + configure: Skip assembly support checks, when assembly is disabled + configure: Initialise assembly enable_* variables + +Marshall Gaucher (2): + Update entrypoint.sh + Update contrib/docker/entrypoint.sh + +Pieter Wuille (34): + Allow non-power-of-2 signature cache sizes + Do not store Merkle branches in the wallet. + Avoid duplicate CheckBlock checks + Add merkle.{h,cpp}, generic merkle root/branch algorithm + Switch blocks to a constant-space Merkle root/branch algorithm. + Add FastRandomContext::rand256() and ::randbytes() + scripted-diff: Rename cuckoo tests' local rand context + Merge test_random.h into test_bitcoin.h + Add various insecure_rand wrappers for tests + scripted-diff: use insecure_rand256/randrange more + Replace more rand() % NUM by randranges + Replace rand() & ((1 << N) - 1) with randbits(N) + Use randbits instead of ad-hoc emulation in prevector tests + scripted-diff: Use randbits/bool instead of randrange where possible + scripted-diff: Use new naming style for insecure_rand* functions + Support multi-block SHA256 transforms + Add SHA256 dispatcher + Add SSE4 based SHA256 + Add selftest for SHA256 transform + Protect SSE4 code behind a compile-time flag + Benchmark Merkle root computation + Refactor SHA256 code + Specialized double sha256 for 64 byte inputs + Use SHA256D64 in Merkle root computation + 4-way SSE4.1 implementation for double SHA256 on 64-byte inputs + 8-way AVX2 implementation for double SHA256 on 64-byte inputs + [MOVEONLY] Move unused Merkle branch code to tests + Enable double-SHA256-for-64-byte code on 32-bit x86 + Improve coverage of SHA256 SelfTest code + For AVX2 code, also check for AVX, XSAVE, and OS support + [Refactor] CPU feature detection logic for SHA256 + Add SHA256 implementation using using Intel SHA intrinsics + Use immintrin.h everywhere for intrinsics + Avoid non-trivial global constants in SHA-NI code + +Wladimir J. van der Laan (2): + build: Rename --enable-experimental-asm to --enable-asm and enable by default + build: Mention use of asm in summary + +furszy (3): + Fix missing vector include and vector type definition + Rework Sprout and Sapling witnesses increment and cache workflow, so it does not loop over the entire wallet txs map indiscriminately. + Use references instead of pointers where possible. + +instagibbs (1): + Return useful error message on ATMP failure + +nathannaveen (1): + chore: Set permissions for GitHub actions + +practicalswift (1): + Use explicit casting in cuckoocache's compute_hashes(...) to clarify integer conversion + +sasha (3): + Patch smoke_tests.py to properly handle changes in minconf behavior + Improve smoke_test.py wait_for_balance message in the minconf!=1 case + Patch smoke_tests.py to require 4 confirmations for z_mergetoaddress + +Jack Grigg (2): + Improve bundlecache documentation + Minor fixes to documentation + +Zancas Wilcox (1): + match the actual two hyphen flag + diff --git a/doc/release-notes/release-notes-5.2.0.md b/doc/release-notes/release-notes-5.2.0.md new file mode 100644 index 000000000..f5b938ec6 --- /dev/null +++ b/doc/release-notes/release-notes-5.2.0.md @@ -0,0 +1,211 @@ +Notable changes +=============== + +Node Performance Improvements +----------------------------- + +This release makes several changes to improve the performance of node operations. +These include: + +- Backported CuckooCache from upstream to improve the performance of signature + caching. + +- Added caching of proof and signature validation results for Sapling and + Orchard to eliminate redundant computation. + +- Backported SHA-256 assembly optimizations from upstream. + +Wallet Performance Improvements +------------------------------- + +This release makes several changes to improve the performance of wallet operations. +These include: + +- We now parallelize and batch trial decryption of Sapling outputs. + +- We now prune witness data in the wallet for notes spent more than 100 blocks + in the past, so that we can avoid unnecessarily updating those witnesses. + In order to take advantage of this performance improvement, users will need + to start their nodes with `-rescan` one time, in order to ensure that witnesses + for spent notes are in the wallet are properly pruned. + +- The process for incrementing the witnesses for notes the wallet is tracking + has been optimized to avoid redundant passes over the wallet. + +- Removed an assertion that was causing a slowdown in wallet scanning post-NU5. + +RPC Interface Changes +===================== + +- A `version` field was added to the result for the `gettransaction` RPC call to + avoid the need to make an extra call to `getrawtransaction` just to retrieve + the version. + +Fixes +===== + +- Fixed a regression that caused an incorrect process name to appear in the + process list. + +Changelog +========= + +Aditya Kulkarni (1): + Add tx version + +Ben Woosley (1): + build: Detect gmtime_* definitions via configure + +Chun Kuan Lee (1): + Use __cpuid_count for gnu C to avoid gitian build fail. + +Cory Fields (2): + time: add runtime sanity check + build: always attempt to enable targeted sse42 cxxflags + +Daira Hopwood (5): + This reverts part of 1f1810c37d00cb46d00d8553e6de3c6fdb991010 in #5959. Leaving the main thread unnamed causes it to be displayed as the executable name (i.e. `zcashd`) or command line in process monitoring tools. fixes #6066 + Apply doc suggestions from code review + Use crossbeam-channel instead of std::sync::mpsc. + Update cxx to 1.0.72. + Narrow the use of `#![allow(clippy::too_many_arguments)]` in src/rust/src/sapling.rs. + +Dan Raviv (1): + Fix header guards using reserved identifiers + +Gregory Maxwell (1): + Add an explanation of quickly hashing onto a non-power of two range. + +Hennadii Stepanov (1): + Use correct C++11 header for std::swap() + +Jack Grigg (16): + lint: Fix include guards + wallet: Prune witnesses for notes spent more than 100 blocks ago + wallet: Make `{Increment, Decrement}NoteWitnesses`-internal helpers static + Cache Sapling and Orchard bundle validation + Add bundle kind to `BundleValidityCache` initialization log message + wallet: Throw error if `ReadBlockFromDisk` fails + wallet: Improve documentation of `SproutNotData` and `SaplingNoteData` + Move explicit instantiations for `BundleValidityCache` into `zcash/cache.cpp` + bench: Fix ConnectBlock large block benchmarks + wallet: Add `BatchScanner` interface to `CValidationInterface` + wallet: Pass `Consensus::Params` into `CWallet::FindMySaplingNotes` + wallet: Migrate `CWallet` to `CValidationInterface::InitBatchScanner` + rust: Implement multithreaded batched trial decryption for Sapling + wallet: Use batch trial decryption for Sapling outputs + wallet: Enforce an assumption about how wallet data evolves + wallet: Domain-separate batched txids with a "block tag" + +Jeremy Rubin (4): + Add CuckooCache implementation and replace the sigcache map_type with it + Add unit tests for the CuckooCache + Decrease testcase sizes in cuckoocache tests + Deduplicate SignatureCacheHasher + +Jim Posen (1): + scripted-diff: Move util files to separate directory. + +Jon Layton (1): + doc: Doxygen-friendly CuckooCache comments + +Kris Nuttycombe (18): + scripted-diff: Move utiltest to src/util + Add a clock for testing with an offset from the system clock. + Apply suggestions from code review + Add persistent Sprout test data. + Remove the temporary test that was used for setup of the cached Sprout fixtures. + Add RPC test initialization using the persisted Sprout chains. + Update sprout_sapling_migration test to use persisted sprout chains. + Update feature_zip239 test to use persisted sprout chains. + Add missing header to util/time.h + Update finalsaplingroot test to use persisted sprout chains. + Update getblocktemplate test to use persisted sprout chain + Replace setup_clean_chain with cache_behavior in rpc test init. + qa: Postpone recent native_rust, native_cxxbridge and rustcxx updates + Update release notes for v5.2.0. + make-release.py: Versioning changes for 5.2.0-rc1. + make-release.py: Updated manpages for 5.2.0-rc1. + make-release.py: Updated release notes and changelog for 5.2.0-rc1. + Fix incomplete release notes for witness pruning. + +Luke Dashjr (3): + configure: Invert --enable-asm help string since default is now enabled + configure: Skip assembly support checks, when assembly is disabled + configure: Initialise assembly enable_* variables + +Marshall Gaucher (2): + Update entrypoint.sh + Update contrib/docker/entrypoint.sh + +Pieter Wuille (34): + Allow non-power-of-2 signature cache sizes + Do not store Merkle branches in the wallet. + Avoid duplicate CheckBlock checks + Add merkle.{h,cpp}, generic merkle root/branch algorithm + Switch blocks to a constant-space Merkle root/branch algorithm. + Add FastRandomContext::rand256() and ::randbytes() + scripted-diff: Rename cuckoo tests' local rand context + Merge test_random.h into test_bitcoin.h + Add various insecure_rand wrappers for tests + scripted-diff: use insecure_rand256/randrange more + Replace more rand() % NUM by randranges + Replace rand() & ((1 << N) - 1) with randbits(N) + Use randbits instead of ad-hoc emulation in prevector tests + scripted-diff: Use randbits/bool instead of randrange where possible + scripted-diff: Use new naming style for insecure_rand* functions + Support multi-block SHA256 transforms + Add SHA256 dispatcher + Add SSE4 based SHA256 + Add selftest for SHA256 transform + Protect SSE4 code behind a compile-time flag + Benchmark Merkle root computation + Refactor SHA256 code + Specialized double sha256 for 64 byte inputs + Use SHA256D64 in Merkle root computation + 4-way SSE4.1 implementation for double SHA256 on 64-byte inputs + 8-way AVX2 implementation for double SHA256 on 64-byte inputs + [MOVEONLY] Move unused Merkle branch code to tests + Enable double-SHA256-for-64-byte code on 32-bit x86 + Improve coverage of SHA256 SelfTest code + For AVX2 code, also check for AVX, XSAVE, and OS support + [Refactor] CPU feature detection logic for SHA256 + Add SHA256 implementation using using Intel SHA intrinsics + Use immintrin.h everywhere for intrinsics + Avoid non-trivial global constants in SHA-NI code + +Sean Bowe (2): + make-release.py: Versioning changes for 5.2.0. + make-release.py: Updated manpages for 5.2.0. + +Wladimir J. van der Laan (2): + build: Rename --enable-experimental-asm to --enable-asm and enable by default + build: Mention use of asm in summary + +furszy (3): + Fix missing vector include and vector type definition + Rework Sprout and Sapling witnesses increment and cache workflow, so it does not loop over the entire wallet txs map indiscriminately. + Use references instead of pointers where possible. + +instagibbs (1): + Return useful error message on ATMP failure + +nathannaveen (1): + chore: Set permissions for GitHub actions + +practicalswift (1): + Use explicit casting in cuckoocache's compute_hashes(...) to clarify integer conversion + +sasha (4): + Patch smoke_tests.py to properly handle changes in minconf behavior + Improve smoke_test.py wait_for_balance message in the minconf!=1 case + Patch smoke_tests.py to require 4 confirmations for z_mergetoaddress + Add cuckoocache.h to Makefile.am + +Jack Grigg (2): + Improve bundlecache documentation + Minor fixes to documentation + +Zancas Wilcox (1): + match the actual two hyphen flag + diff --git a/doc/release-notes/release-notes-5.3.0-rc1.md b/doc/release-notes/release-notes-5.3.0-rc1.md new file mode 100644 index 000000000..a737bc179 --- /dev/null +++ b/doc/release-notes/release-notes-5.3.0-rc1.md @@ -0,0 +1,176 @@ +Notable changes +=============== + +Wallet Performance Improvements +------------------------------- + +`zcashd 5.2.0` improved the performance of wallet scanning with multithreaded +batched trial decryption of Sapling outputs. However, for some nodes this +resulted in growing memory usage that would eventually cause an OOM abort. We +have identified the cause of the growth, and made significant improvements to +reduce the memory usage of the batch scanner. In addition, the batch scanner now +has a memory limit of 100 MiB. + +`zcashd` now reports the following new metrics when `-prometheusport` is set: + +- (counter) `zcashd.wallet.batchscanner.outputs.scanned` +- (gauge) `zcashd.wallet.batchscanner.size.transactions` +- (gauge) `zcashd.wallet.batchscanner.usage.bytes` +- (gauge) `zcashd.wallet.synced.block.height` + +RPC Interface +------------- + +- The `finalorchardroot` field in the `getblock` result and the + `orchard.commitments.finalRoot` field in the `z_gettreestate` result have + been changed to match the byte ordering used for the `orchard.anchor` + field in the `getrawtransaction` result. These previously produced different + hash values from the `orchard.anchor` field due to having been byte-flipped + in their internal representation in zcashd. + +Changelog +========= + +Alex (1): + build: update book.yml Signed-off-by: sashashura <93376818+sashashura@users.noreply.github.com> + +Alex Wied (2): + cuckoocache: Add missing header + build: Reorder link targets to properly build on Nix + +Andrés G. Aragoneses (1): + autogen.sh: warn about needing autoconf if autoreconf is not found + +Ben Woosley (1): + doc: Correct spelling errors in comments + +Conrado Gouvea (1): + Include algorithm.h in cuckoocache.h + +Daira Hopwood (8): + Add contrib/debian/copyright entry for crc32c. + Apply suggestions from code review + Update doc/book/src/user/security-warnings.md + Update librustzcash commit and adapt to changes in `DiversifierKey`. + Avoid an implicit clone of the Orchard bundle in ContextualCheckTransaction. + Use prepared epks and ivks in trial decryption. + Audit dependency updates. + Include memory usage of the `tags` vector. This fixes *one* of the bugs pointed out by @str4d at https://github.com/zcash/zcash/pull/6156/files#r979122874 + +DeckerSU (2): + miner: fix MAXSOLS + test_framework: fix AttributeError in sapling_spends_compact_digest + +Greg Pfeil (11): + Eliminate indirection for debug log + Define some basic cross-editor configuration + Canonicalize some user-provided paths + Add an `rpc-tests` make target + Add simplejson to requirements for rpc-tests + Also canonicalize paramsdir. + Backport tor.md changes from readthedocs + Don't recommend -reindex-chainstate. + Add a finalorchardroot RPC test + Fix finalorchardroot serialization + Apply suggestions from code review + +Hennadii Stepanov (5): + Enable ShellCheck rules + script: Lint Gitian descriptors with ShellCheck + script: Enable SC2006 rule for Gitian scripts + script: Enable SC2155 rule for Gitian scripts + script: Enable SC2001 rule for Gitian scripts + +Jack Grigg (52): + Squashed 'src/leveldb/' changes from f545dfabff..f8ae182c1e + Squashed 'src/crc32c/' content from commit 224988680f + depends: Update Rust to 1.62.1 + depends: Update Clang / libcxx to LLVM 14.0.6 + depends: Update Rust to 1.63.0 + CI: Migrate to published versions of cargo-vet + rust: Update some of the pinned dependencies + rust: Add `zcash-inspect` binary for inspecting Zcash data + rust: Add P2PKH signature checking to `zcash-inspect` + rust: Add address inspection to `zcash-inspect` + rust: Add mnemonic phrase inspection to `zcash-inspect` + rust: Simplify `next_pow2` in `zcash-inspect` + rust: Place tighter bound on encoded heights in `zcash-inspect` + lint: Fix shell lints + CI: Enforce shell lints to prevent regression + lint: Fix ShellCheck lints in Zcash scripts + lint: Disable some ShellChecks on Gitian descriptors + rust: Add shielded sighash to `zcash-inspect` output for txs + rust: `zcash-inspect` 32-byte hex as maybe a commitment or nullifier + build: Build Rust library and binaries at the same time + rust: Migrate to latest `zcash_primitives` revision + rust: Migrate Rust tests to latest `zcash_primitives` revision + wallet: Use `auto&` to avoid copying inside `ThreadNotifyWallets` + wallet: Refactor `ThreadNotifyWallets` to support batch memory limits + wallet: Add dynamic memory usage tracking to `BatchScanner` + wallet: Collect metrics on the number of scanned outputs + wallet: Set a memory limit of 100 MiB for batch scanning + wallet: Only store successful trial decryptions in batch scanner + depends: Update Rust to 1.64.0 + qa: Postpone dependencies that require CMake + qa: Postpone Clang 15 to retain LLVM 14 pin + depends: Update cxx to 1.0.76 + depends: Update Boost to 1.80.0 + Fix clippy lints + qa: Add audit policies for patched Rust crates + metrics: Add gauge for the height to which the wallet is synced + wallet: Move heap tracking of batch tasks behind a trait + wallet: Correctly track heap usage of batch items + wallet: Improve estimation of `rayon` spawned task size + Squashed 'src/secp256k1/' changes from a4abaab793..efad3506a8 + Squashed 'src/secp256k1/' changes from efad3506a8..1758a92ffd + build: Disable secp256k1 OpenSSL tests + wallet: Remove lock on cs_main from CWallet::ChainTip + rust: Update to `metrics 0.20` + depends: Update cxx to 1.0.78 + qa: Postpone Clang 15.0.2 + rust: Update to `cpufeatures 0.2.5` + qa: Recommend cargo-upgrades instead of cargo-outdated + rust: Audit some dependency updates + rust: Update remaining dependencies + make-release.py: Versioning changes for 5.3.0-rc1. + make-release.py: Updated manpages for 5.3.0-rc1. + +James White (1): + Add IPv6 support to qos.sh + +Kris Nuttycombe (7): + Update `z_sendmany` help to clarify what happens when sending from a UA + Revert "redirect and update source documentation" + Fix documentation line wrapping + Backport changes from zcash.readthedocs.io + Move restored documentation into the zcashd book + Replace manual mangement of the Sapling proving context with cxx + Apply suggestions from code review + +Luke Dashjr (2): + Bugfix: Only use git for build info if the repository is actually the right one + Bugfix: Detect genbuild.sh in repo correctly + +Marco Falke (1): + Remove script to clean up datadirs + +Nathan Wilcox (1): + Update rust.md + +Pieter Wuille (1): + libsecp256k1 no longer has --with-bignum= configure option + +Wladimir J. van der Laan (6): + build: Update build system for new leveldb + doc: Add crc32c subtree to developer notes + test: Add crc32c to subtree check linter + test: Add crc32c exception to various linters and generation scripts + build: CRC32C build system integration + build: Get rid of `CLIENT_DATE` + +sasha (1): + Make RUST_DIST in Makefile.am refer to rust-toolchain.toml (baf7d9e) + +user (1): + README.md: Clarify distinction between protocol vs zcashd implementation; link to Zebra; line wrapping. + diff --git a/doc/release-notes/release-notes-5.3.0.md b/doc/release-notes/release-notes-5.3.0.md new file mode 100644 index 000000000..e2e5435be --- /dev/null +++ b/doc/release-notes/release-notes-5.3.0.md @@ -0,0 +1,192 @@ +Notable changes +=============== + +Wallet Performance Improvements +------------------------------- + +`zcashd 5.2.0` improved the performance of wallet scanning with multithreaded +batched trial decryption of Sapling outputs. However, for some nodes this +resulted in growing memory usage that would eventually cause an OOM abort. We +have identified the cause of the growth, and made significant improvements to +reduce the memory usage of the batch scanner. In addition, the batch scanner now +has a memory limit of 100 MiB. + +`zcashd` now reports the following new metrics when `-prometheusport` is set: + +- (counter) `zcashd.wallet.batchscanner.outputs.scanned` +- (gauge) `zcashd.wallet.batchscanner.size.transactions` +- (gauge) `zcashd.wallet.batchscanner.usage.bytes` +- (gauge) `zcashd.wallet.synced.block.height` + +RPC Interface +------------- + +- The `finalorchardroot` field in the `getblock` result and the + `orchard.commitments.finalRoot` field in the `z_gettreestate` result have + been changed to match the byte ordering used for the `orchard.anchor` + field in the `getrawtransaction` result. These previously produced different + hash values from the `orchard.anchor` field due to having been byte-flipped + in their internal representation in zcashd. + +Changelog +========= + +Alex (1): + build: update book.yml Signed-off-by: sashashura <93376818+sashashura@users.noreply.github.com> + +Alex Wied (2): + cuckoocache: Add missing header + build: Reorder link targets to properly build on Nix + +Andrés G. Aragoneses (1): + autogen.sh: warn about needing autoconf if autoreconf is not found + +Ben Woosley (1): + doc: Correct spelling errors in comments + +Conrado Gouvea (1): + Include algorithm.h in cuckoocache.h + +Daira Hopwood (9): + Add contrib/debian/copyright entry for crc32c. + Apply suggestions from code review + Update doc/book/src/user/security-warnings.md + Update librustzcash commit and adapt to changes in `DiversifierKey`. + Avoid an implicit clone of the Orchard bundle in ContextualCheckTransaction. + Use prepared epks and ivks in trial decryption. + Audit dependency updates. + Include memory usage of the `tags` vector. This fixes *one* of the bugs pointed out by @str4d at https://github.com/zcash/zcash/pull/6156/files#r979122874 + Always use a tuple as right argument of % in new Python code. + +DeckerSU (2): + miner: fix MAXSOLS + test_framework: fix AttributeError in sapling_spends_compact_digest + +Greg Pfeil (20): + Eliminate indirection for debug log + Define some basic cross-editor configuration + Canonicalize some user-provided paths + Add an `rpc-tests` make target + Add simplejson to requirements for rpc-tests + Also canonicalize paramsdir. + Backport tor.md changes from readthedocs + Don't recommend -reindex-chainstate. + Add a finalorchardroot RPC test + Fix finalorchardroot serialization + Apply suggestions from code review + Fix display of binary name in error messages. + Address review feedback and fixed test failures + Add test for `zcashd --help` + Fix `zcashd --help` + Apply suggestions from code review + Qualify a `string` + Don’t define wallet-needing code when --disable-wallet + make-release.py: Versioning changes for 5.3.0. + make-release.py: Updated manpages for 5.3.0. + +Hennadii Stepanov (5): + Enable ShellCheck rules + script: Lint Gitian descriptors with ShellCheck + script: Enable SC2006 rule for Gitian scripts + script: Enable SC2155 rule for Gitian scripts + script: Enable SC2001 rule for Gitian scripts + +Jack Grigg (53): + Squashed 'src/leveldb/' changes from f545dfabff..f8ae182c1e + Squashed 'src/crc32c/' content from commit 224988680f + depends: Update Rust to 1.62.1 + depends: Update Clang / libcxx to LLVM 14.0.6 + depends: Update Rust to 1.63.0 + CI: Migrate to published versions of cargo-vet + rust: Update some of the pinned dependencies + rust: Add `zcash-inspect` binary for inspecting Zcash data + rust: Add P2PKH signature checking to `zcash-inspect` + rust: Add address inspection to `zcash-inspect` + rust: Add mnemonic phrase inspection to `zcash-inspect` + rust: Simplify `next_pow2` in `zcash-inspect` + rust: Place tighter bound on encoded heights in `zcash-inspect` + lint: Fix shell lints + CI: Enforce shell lints to prevent regression + lint: Fix ShellCheck lints in Zcash scripts + lint: Disable some ShellChecks on Gitian descriptors + rust: Add shielded sighash to `zcash-inspect` output for txs + rust: `zcash-inspect` 32-byte hex as maybe a commitment or nullifier + build: Build Rust library and binaries at the same time + rust: Migrate to latest `zcash_primitives` revision + rust: Migrate Rust tests to latest `zcash_primitives` revision + wallet: Use `auto&` to avoid copying inside `ThreadNotifyWallets` + wallet: Refactor `ThreadNotifyWallets` to support batch memory limits + wallet: Add dynamic memory usage tracking to `BatchScanner` + wallet: Collect metrics on the number of scanned outputs + wallet: Set a memory limit of 100 MiB for batch scanning + wallet: Only store successful trial decryptions in batch scanner + depends: Update Rust to 1.64.0 + qa: Postpone dependencies that require CMake + qa: Postpone Clang 15 to retain LLVM 14 pin + depends: Update cxx to 1.0.76 + depends: Update Boost to 1.80.0 + Fix clippy lints + qa: Add audit policies for patched Rust crates + metrics: Add gauge for the height to which the wallet is synced + wallet: Move heap tracking of batch tasks behind a trait + wallet: Correctly track heap usage of batch items + wallet: Improve estimation of `rayon` spawned task size + Squashed 'src/secp256k1/' changes from a4abaab793..efad3506a8 + Squashed 'src/secp256k1/' changes from efad3506a8..1758a92ffd + build: Disable secp256k1 OpenSSL tests + wallet: Remove lock on cs_main from CWallet::ChainTip + rust: Update to `metrics 0.20` + depends: Update cxx to 1.0.78 + qa: Postpone Clang 15.0.2 + rust: Update to `cpufeatures 0.2.5` + qa: Recommend cargo-upgrades instead of cargo-outdated + rust: Audit some dependency updates + rust: Update remaining dependencies + make-release.py: Versioning changes for 5.3.0-rc1. + make-release.py: Updated manpages for 5.3.0-rc1. + make-release.py: Updated release notes and changelog for 5.3.0-rc1. + +James White (1): + Add IPv6 support to qos.sh + +Kris Nuttycombe (12): + Update `z_sendmany` help to clarify what happens when sending from a UA + Revert "redirect and update source documentation" + Fix documentation line wrapping + Backport changes from zcash.readthedocs.io + Move restored documentation into the zcashd book + Replace manual mangement of the Sapling proving context with cxx + Apply suggestions from code review + Update and/or postpone dependencies for 5.3.0 + Vet cxxbridge upgrade. + Update to released versions of librustzcash crates. + Certify librustzcash crate upgrades. + Fix clippy lints. + +Luke Dashjr (2): + Bugfix: Only use git for build info if the repository is actually the right one + Bugfix: Detect genbuild.sh in repo correctly + +Marco Falke (1): + Remove script to clean up datadirs + +Nathan Wilcox (1): + Update rust.md + +Pieter Wuille (1): + libsecp256k1 no longer has --with-bignum= configure option + +Wladimir J. van der Laan (6): + build: Update build system for new leveldb + doc: Add crc32c subtree to developer notes + test: Add crc32c to subtree check linter + test: Add crc32c exception to various linters and generation scripts + build: CRC32C build system integration + build: Get rid of `CLIENT_DATE` + +sasha (1): + Make RUST_DIST in Makefile.am refer to rust-toolchain.toml (baf7d9e) + +user (1): + README.md: Clarify distinction between protocol vs zcashd implementation; link to Zebra; line wrapping. + diff --git a/doc/release-notes/release-notes-5.3.1-rc1.md b/doc/release-notes/release-notes-5.3.1-rc1.md new file mode 100644 index 000000000..fe841d4dc --- /dev/null +++ b/doc/release-notes/release-notes-5.3.1-rc1.md @@ -0,0 +1,99 @@ +Notable changes +=============== + +Fixed +----- + +This release fixes an error "Assertion `uResultHeight == rewindHeight` failed" (#5958) +that could sometimes happen when restarting a node. + +Memory Usage Improvement +------------------------ + +The memory usage of zcashd has been reduced by not keeping Equihash solutions for all +block headers in memory. + +Changelog +========= + +Daira Hopwood (14): + Always use a tuple as right argument of % in new Python code. + Report the prevout for each transparent input as it is being checked + Update authors of librustzcash to include Greg Pfeil. + Ensure that the optimization of not scanning blocks prior to the wallet's birthday does not cause us to try to "rewind" the Orchard wallet to a height after its current checkpoint. + Improve a comment about the wallet birthday scanning optimization. + Add release notes for the fix to #5958. + Fix a Markdown syntax error + Error reporting improvements. + Fix a dependency of the `show_help` RPC test on the number of cores, and an incompatibility with Python 3.9 in the test framework that affected the `receivedby` extended RPC test. + Avoid storing the Equihash solution in a CBlockIndex object once it has been written to the leveldb database. + Improve handling of database read errors. + Add Prometheus metrics so we have more visibility into what is going on with the Equihash solution trimming: + Declare `CBlockTreeDB::Read*` methods as `const` when they are trivially so. + Update constants + +Greg Pfeil (39): + Fix display of binary name in error messages. + Address review feedback and fixed test failures + Check dependency updates on the correct branch + updatecheck: fix GitHub auth + updatecheck: simplify token handling + updatecheck: support XDG-based token location + `zcash --help` test improvements + Remove the PR template + Apply suggestions from code review + Small formatting change + Improve z_sendmany documentation + Avoid inconsistent Python lookup + Propagate asOfHeight to all relevant RPC calls + Implement `asOfHeight` + Add additional asOfHeight tests + Don’t ignore asOfHeight in IsSpent calls + Extract asOfHeight info from RPC calls + Ignore mempool when asOfHeight is set + Fix calls that should have specified asOfHeight + GetUnconfirmedBalance should not take asOfHeight + Require minconf > 0 when asOfHeight is provided + Add error cases and default to `asOfHeight` + Work around #6262 in wallet_listunspent + Don’t trust mempool tx when using `asOfHeight` + Apply suggestions from code review + Add matured_at_height test helper + Add FIXMEs to repair comments after #6262 is fixed + Update src/rpc/server.cpp + Apply suggestions from code review + Fix small error in code review suggestions + Revert change to getbalance minconf + Revert getinfo support of asOfHeight + Change asOfHeight to use -1 as default + Change asOfHeight to preserve Bitcoin compat + Apply suggestions from code review + Simplify filtering AvailableCoins by destination + Postpone dependency updates for v5.3.1 + make-release.py: Versioning changes for 5.3.1-rc1. + make-release.py: Updated manpages for 5.3.1-rc1. + +Jack Grigg (1): + Place zcashd.debug.* metrics behind a -debugmetrics config option + +Kris Nuttycombe (3): + Add extra detail related to transparent inputs and outputs. + Add `unspent_as_of` argument to `listunspent` + Add RPC test for wallet_listunspent changes + +Miodrag Popović (2): + FindNextBlocksToDownload(): Fetch active consensus params to read nMinimumChainWork + Headers sync timeout: Use EstimateNetHeight() for closer approximation of remaining headers to download + +Suhas Daftuar (2): + Delay parallel block download until chain has sufficient work + Add timeout for headers sync + +idm (1): + fix aarch64 dependency native clang download URL + +sasha (3): + Update gitian-linux-parallel.yml + Fix gitian version string issue by reverting the GIT_DIR backport commit + Remove `git_check_in_repo` from genbuild.sh to fix gitian version string + diff --git a/doc/release-notes/release-notes-5.3.1.md b/doc/release-notes/release-notes-5.3.1.md new file mode 100644 index 000000000..0b1c23103 --- /dev/null +++ b/doc/release-notes/release-notes-5.3.1.md @@ -0,0 +1,135 @@ +Notable changes +=============== + +Fixed +----- + +This release fixes an error "Assertion `uResultHeight == rewindHeight` failed" (#5958) +that could sometimes happen when restarting a node. + +Memory Usage Improvement +------------------------ + +The memory usage of zcashd has been reduced by not keeping Equihash solutions for all +block headers in memory. + +RPC changes +----------- + +The following RPC methods that query wallet state now support an optional `asOfHeight` +parameter, to execute the query as if it were run when the blockchain was at the height +specified by this argument: + +* `getbalance` +* `getreceivedbyaddress` +* `gettransaction` (*) +* `getwalletinfo` +* `listaddressgroupings` +* `listreceivedbyaddress` (*) +* `listsinceblock` (*) +* `listtransactions` +* `listunspent` (*) +* `z_getbalanceforaccount` +* `z_getbalanceforviewingkey` +* `z_getmigrationstatus` +* `z_getnotescount` +* `z_listreceivedbyaddress` +* `z_listunspent` + +(*) For these methods, additional parameters have been added to maintain +compatibility of parameter lists with Bitcoin Core. Default values should be +passed for these additional parameters in order to use `asOfHeight`. See the +[RPC documentation](https://zcash.github.io/) for details. + +Changelog +========= + +Daira Hopwood (21): + Always use a tuple as right argument of % in new Python code. + Report the prevout for each transparent input as it is being checked + Update authors of librustzcash to include Greg Pfeil. + Ensure that the optimization of not scanning blocks prior to the wallet's birthday does not cause us to try to "rewind" the Orchard wallet to a height after its current checkpoint. + Improve a comment about the wallet birthday scanning optimization. + Add release notes for the fix to #5958. + Fix a Markdown syntax error + Error reporting improvements. + Fix a dependency of the `show_help` RPC test on the number of cores, and an incompatibility with Python 3.9 in the test framework that affected the `receivedby` extended RPC test. + Avoid storing the Equihash solution in a CBlockIndex object once it has been written to the leveldb database. + Improve handling of database read errors. + Add Prometheus metrics so we have more visibility into what is going on with the Equihash solution trimming: + Declare `CBlockTreeDB::Read*` methods as `const` when they are trivially so. + Update constants + Add release notes for #6122 (`asOfHeight` RPC parameters). + Update release notes: z_getnotescount already had the minconf parameter + Add release notes for #6122 (`asOfHeight` RPC parameters). + Update release notes: z_getnotescount already had the minconf parameter + Bump timestamps and add libcxx/native_clang 15.0.6 in `postponed-updates.txt`. + make-release.py: Versioning changes for 5.3.1. + make-release.py: Updated manpages for 5.3.1. + +Greg Pfeil (40): + Fix display of binary name in error messages. + Address review feedback and fixed test failures + Check dependency updates on the correct branch + updatecheck: fix GitHub auth + updatecheck: simplify token handling + updatecheck: support XDG-based token location + `zcash --help` test improvements + Remove the PR template + Apply suggestions from code review + Small formatting change + Improve z_sendmany documentation + Avoid inconsistent Python lookup + Propagate asOfHeight to all relevant RPC calls + Implement `asOfHeight` + Add additional asOfHeight tests + Don’t ignore asOfHeight in IsSpent calls + Extract asOfHeight info from RPC calls + Ignore mempool when asOfHeight is set + Fix calls that should have specified asOfHeight + GetUnconfirmedBalance should not take asOfHeight + Require minconf > 0 when asOfHeight is provided + Add error cases and default to `asOfHeight` + Work around #6262 in wallet_listunspent + Don’t trust mempool tx when using `asOfHeight` + Apply suggestions from code review + Add matured_at_height test helper + Add FIXMEs to repair comments after #6262 is fixed + Update src/rpc/server.cpp + Apply suggestions from code review + Fix small error in code review suggestions + Revert change to getbalance minconf + Revert getinfo support of asOfHeight + Change asOfHeight to use -1 as default + Change asOfHeight to preserve Bitcoin compat + Apply suggestions from code review + Simplify filtering AvailableCoins by destination + Postpone dependency updates for v5.3.1 + make-release.py: Versioning changes for 5.3.1-rc1. + make-release.py: Updated manpages for 5.3.1-rc1. + make-release.py: Updated release notes and changelog for 5.3.1-rc1. + +Jack Grigg (1): + Place zcashd.debug.* metrics behind a -debugmetrics config option + +Kris Nuttycombe (3): + Add extra detail related to transparent inputs and outputs. + Add `unspent_as_of` argument to `listunspent` + Add RPC test for wallet_listunspent changes + +Miodrag Popović (2): + FindNextBlocksToDownload(): Fetch active consensus params to read nMinimumChainWork + Headers sync timeout: Use EstimateNetHeight() for closer approximation of remaining headers to download + +Suhas Daftuar (2): + Delay parallel block download until chain has sufficient work + Add timeout for headers sync + +idm (1): + fix aarch64 dependency native clang download URL + +sasha (3): + Update gitian-linux-parallel.yml + Fix gitian version string issue by reverting the GIT_DIR backport commit + Remove `git_check_in_repo` from genbuild.sh to fix gitian version string + diff --git a/doc/release-notes/release-notes-5.3.2.md b/doc/release-notes/release-notes-5.3.2.md new file mode 100644 index 000000000..73d736490 --- /dev/null +++ b/doc/release-notes/release-notes-5.3.2.md @@ -0,0 +1,26 @@ +Notable changes +=============== + +Fixed +----- + +This is a hotfix release that fixes a regression in memory usage during +Initial Block Download. The regression was indirectly caused by a change +to prioritize downloading headers (PR #6231), introduced in release 5.3.1. +It caused memory usage for new nodes to spike to roughly 11 GiB about an +hour after starting Initial Block Download. + +The issue fixed by this release does not affect nodes that start from +a fully synced chain, or that had sufficient memory available to get +past the memory usage spike. + +Changelog +========= + +Daira Hopwood (5): + Revert "Headers-first fix" + Add release notes for the IBD memory spike issue. + Postpone updates. + make-release.py: Versioning changes for 5.3.2. + make-release.py: Updated manpages for 5.3.2. + diff --git a/doc/release-notes/release-notes-5.3.3.md b/doc/release-notes/release-notes-5.3.3.md new file mode 100644 index 000000000..51053c239 --- /dev/null +++ b/doc/release-notes/release-notes-5.3.3.md @@ -0,0 +1,36 @@ +Notable changes +=============== + +This hotfix remediates memory exhaustion vulnerabilities that zcashd inherited +as a fork of bitcoind. These bugs could allow an attacker to use peer-to-peer +messages to fill the memory of a node, resulting in a crash. + + +Changelog +========= + +Daira Hopwood (3): + Enable a CRollingBloomFilter to be reset to a state where it takes little memory. + Ensure that CNode::{addrKnown, filterInventoryKnown} immediately take little memory when we disconnect the node. + Improve the encapsulation of `CNode::filterInventoryKnown`. + +Greg Pfeil (1): + Remove `ResetRequestCount` + +Jon Atack (1): + p2p, rpc, test: address rate-limiting follow-ups + +Kris Nuttycombe (4): + Update release notes for v5.3.3 hotfix + Postpone dependency updates. + make-release.py: Versioning changes for 5.3.3. + make-release.py: Updated manpages for 5.3.3. + +Matt Corallo (1): + Remove useless mapRequest tracking that just effects Qt display. + +Pieter Wuille (3): + Rate limit the processing of incoming addr messages + Randomize the order of addr processing + Add logging and addr rate limiting statistics + diff --git a/doc/release-notes/release-notes-5.4.0-rc1.md b/doc/release-notes/release-notes-5.4.0-rc1.md new file mode 100644 index 000000000..0365dbe13 --- /dev/null +++ b/doc/release-notes/release-notes-5.4.0-rc1.md @@ -0,0 +1,202 @@ +Notable changes +=============== + +Fixes +----- + +This release fixes an issue that could potentially cause a node to crash with the +log message "The wallet's best block hash `` was not detected in restored +chain state. Giving up; please restart with `-rescan`." + +RPC Changes +----------- + +- `z_sendmany` will no longer select transparent coinbase when "ANY\_TADDR" is + used as the `fromaddress`. It was already documented to do this, but the + previous behavior didn’t match. When coinbase notes were selected in this + case, they would (properly) require that the transaction didn’t have any + change, but this could be confusing, as the documentation stated that these + two conditions (using "ANY\_TADDR" and disallowing change) wouldn’t coincide. + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `gbt_oldhashes`: the `finalsaplingroothash`, `lightclientroothash`, and + `blockcommitmentshash` fields in the output of `getblocktemplate` have been + replaced by the `defaultroots` field. + +The following previously-deprecated features have been disabled by default, and +will be removed in 18 weeks: + +- `legacy_privacy` +- `getnewaddress` +- `getrawchangeaddress` +- `z_getbalance` +- `z_gettotalbalance` +- `z_getnewaddress` +- `z_listaddresses` +- `addrtype` +- `wallettxvjoinsplit` + +The following previously-deprecated features have been removed: + +- `dumpwallet` +- `zcrawreceive` +- `zcrawjoinsplit` +- `zcrawkeygen` + +Platform Support +---------------- + +- CentOS 8 has been removed from the list of supported platforms. It reached EoL + on December 31st 2021, and does not satisfy our Tier 2 policy requirements. + +Changelog +========= + +Alex Morcos (3): + Make accessing mempool parents and children public + Expose FormatStateMessage + Rewrite CreateNewBlock + +Carl Dong (4): + depends: More robust cmake invocation + depends: Cleanup CMake invocation + depends: Prepend CPPFLAGS to C{,XX}FLAGS for CMake + depends: Specify LDFLAGS to cmake as well + +Daira Hopwood (6): + Add tl::expected. refs #4816 + The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). + Refactor HaveShieldedRequirements to use tl::expected (example with a void T) and rename it to CheckShieldedRequirements. + tl::expected follow-up to address @str4d's comments. + Cleanup after removing dumpwallet. + Change the time that the wallet will wait for the block index to load from 5 minutes to 2 hours. + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Greg Pfeil (22): + Add PrivacyPolicyMeet + Remove trailing whitespace in fetch-params.sh + Migrate fetch-params.sh to bash + Scope the fetch-params lock file to the user + Update comments to match changed tests + Put utf8.h in the correct place + Don’t select transparent coinbase with ANY_TADDR + Update failing tests after fixing ANY_TADDR behavior + Apply suggestions from code review + Apply suggestions from code review + Appease ShellCheck + Defer fixing docker/entrypoint.sh lint failure + Apply suggestions from code review + Fix a minor bug in docker/entrypoint.sh + Improve PrivacyPolicy comments + Apply suggestions from code review + Add release notes + Update src/wallet/asyncrpcoperation_sendmany.cpp + Fix a missing newline in the RPC docs + No longer test_received_sprout + Use cached sprout addresses rather than funding + Update overwinter test to not shield to Sprout + +Jack Grigg (39): + test: Handle mining slow start inside `CreateNewBlock_validity` + test: Improve CreateNewBlock_validity exception checks + txdb: Remove const annotation from blockinfo iterator type + Remove `dumpwallet` RPC method + qa: Refactor `wallet_deprecation` test to simplify deprecation changes + Remove `zcraw*` RPC methods + txdb: Clean up for loop syntax in `WriteBatchSync` + Disable previously-deprecated features by default + Deprecate old hash fields of `getblocktemplate` + qa: Change show_help RPC test to print out differences + qa: Update mempool_packages RPC test after deprecation ratcheting + qa: Import Rust crate audits from Firefox + qa: Import Rust crate audits from the Bytecode Alliance + qa: Import Rust crate audits from Embark Studios + qa: Remove audit-as-crates-io for non-third-party crates + cargo update + zcash_primitives 0.9 + clearscreen 2.0 + depends: googletest 1.12.1 + Remove CentOS 8 as a supported platform + depends: native_zstd 1.5.2 + depends: native_ccache 4.6.3 + depends: Add package for native_cmake 3.25.1 + depends: Force cmake to install libzstd in lib/ + build-aux: Update Boost macros to latest serials + build: Bump required Boost version + depends: Force Boost library to be installed in lib/ + depends: Add tl_expected to update checker + depends: Boost 1.81.0 + depends: utfcpp 3.2.3 + qa: Postpone LLVM 15 and CCache 4.7 updates + depends: Update cxx to 1.0.83 + cargo update + Document -clockoffset option + qa: Update show_help RPC test + doc: Fix arguments to make-release.py in hotfix process + depends: CMake 3.25.2 + make-release.py: Versioning changes for 5.4.0-rc1. + make-release.py: Updated manpages for 5.4.0-rc1. + +James O'Beirne (2): + Clarify help messages for path args to mention datadir prefix + Add AbsPathForConfigVal to consolidate datadir prefixing for path args + +Kris Nuttycombe (6): + Add TransactionStrategy::IsCompatibleWith + Modify TransactionBuilder to use the standard default fee. + Factor out memo parsing from asyncrpcoperation_sendmany + Remove mergetoaddress_sprout test as sending to Sprout is no longer supported. + Remove wallet_shieldcoinbase_sprout test. + Update `mergetoaddress_mixednotes.py` to no longer send to Sprout. + +Marco Falke (4): + [init] Add missing help for args + [init] Help Msg: Use Params(CBaseChainParams::MAIN) + Clarify mocktime help message + init: Fix help message for checkblockindex + +Marius Kjærstad (5): + Hardened checkpoint update at block 1860000 for mainnet + Update src/chainparams.cpp + Some more formatting changes to chainparams.cpp + Forgot to add 0x + Add some more historical checkpoints + +Mark Friedenbach (1): + Prevent block.nTime from decreasing + +Marshall Gaucher (4): + Update zcash-build-bench.yml + Update README.md + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml + +Michał Janiszewski (1): + Update debian/compat to version 13 + +Russell Yanofsky (2): + depends: Add CMake helper for building packages + depends: Set CMAKE_INSTALL_RPATH for native packages + +Suhas Daftuar (3): + Track transaction packages in CTxMemPoolEntry + Add test showing bug in mempool packages + Fix mempool package tracking edge case + +Wladimir J. van der Laan (1): + rpc: Write authcookie atomically + +Marshall Gaucher (2): + add basic tekton zcash env + update memory targets with heaptrack + diff --git a/doc/release-notes/release-notes-5.4.0-rc2.md b/doc/release-notes/release-notes-5.4.0-rc2.md new file mode 100644 index 000000000..879629cf0 --- /dev/null +++ b/doc/release-notes/release-notes-5.4.0-rc2.md @@ -0,0 +1,262 @@ +Notable changes +=============== + +Fixes +----- + +This release fixes an issue that could potentially cause a node to crash with the +log message "The wallet's best block hash `` was not detected in restored +chain state. Giving up; please restart with `-rescan`." + +Transparent pool and chain supply tracking +------------------------------------------ + +Since v2.0.0, `zcashd` has tracked the change in value within the Sprout and +Sapling shielded pools for each block; v5.0.0 added the Orchard pool. This +release completes the set, by tracking the change in value within the +"transparent" pool (more precisely, the value stored in Bitcoin-style UTXOs). + +`zcashd` also now tracks the change in "chain supply" for each block, defined as +the sum of coinbase output values, minus unclaimed fees. This is precisely equal +to the sum of the value in the transparent and shielded pools, and equivalent to +the sum of all unspent coins/notes on the chain. It is bounded above by the +theoretical maximum supply, but in practice is lower due to, for example, miners +not claiming transaction fees. + +> Bitcoin-style consensus rules implement fees as an imbalance between spent +> coins/notes and newly-created coins/notes. The consensus rules require that a +> coinbase transaction's outputs have a total value no greater than the sum of +> that block's subsidy and the fees made available by the transactions in the +> block. However, the consensus rules do not require that all of the available +> funds are claimed, and a miner can create coinbase transactions with lower +> value in the outputs (though in the case of Zcash, the consensus rules do +> require the transaction to include [ZIP 1014](https://zips.z.cash/zip-1014) +> Funding Stream outputs). + +After upgrading to v5.4.0, `zcashd` will start tracking changes in transparent +pool value and chain supply from the height at which it is restarted. Block +heights prior to this will not have any information recorded. To track changes +from genesis, and thus monitor the total transparent pool size and chain supply, +you will need to restart your node with the `-reindex` option. + +RPC Changes +----------- + +- `z_sendmany` will no longer select transparent coinbase when "ANY\_TADDR" is + used as the `fromaddress`. It was already documented to do this, but the + previous behavior didn’t match. When coinbase notes were selected in this + case, they would (properly) require that the transaction didn’t have any + change, but this could be confusing, as the documentation stated that these + two conditions (using "ANY\_TADDR" and disallowing change) wouldn’t coincide. +- A new value pool object with `"id": "transparent"` has been added to the + `valuePools` list in `getblockchaininfo` and `getblock`. +- A new `chainSupply` key has been added to `getblockchaininfo` and `getblock` + to report the total chain supply as of that block height (if tracked), and the + change in chain supply caused by the block (for `getblock`, if measured). + +Mining +------- + +- Changes to `getblocktemplate` have been backported from upstream Bitcoin Core, + to significantly improve its performance by doing more work ahead of time in + the mempool (and reusing the work across multiple `getblocktemplate` calls). + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `gbt_oldhashes`: the `finalsaplingroothash`, `lightclientroothash`, and + `blockcommitmentshash` fields in the output of `getblocktemplate` have been + replaced by the `defaultroots` field. + +The following previously-deprecated features have been disabled by default, and +will be removed in 18 weeks: + +- `legacy_privacy` +- `getnewaddress` +- `getrawchangeaddress` +- `z_getbalance` +- `z_gettotalbalance` +- `z_getnewaddress` +- `z_listaddresses` +- `addrtype` +- `wallettxvjoinsplit` + +The following previously-deprecated features have been removed: + +- `dumpwallet` +- `zcrawreceive` +- `zcrawjoinsplit` +- `zcrawkeygen` + +Platform Support +---------------- + +- CentOS 8 has been removed from the list of supported platforms. It reached EoL + on December 31st 2021, and does not satisfy our Tier 2 policy requirements. + +Changelog +========= + +Alex Morcos (3): + Make accessing mempool parents and children public + Expose FormatStateMessage + Rewrite CreateNewBlock + +Alfredo Garcia (1): + Add chain supply and transparent value to block index. + +Carl Dong (4): + depends: More robust cmake invocation + depends: Cleanup CMake invocation + depends: Prepend CPPFLAGS to C{,XX}FLAGS for CMake + depends: Specify LDFLAGS to cmake as well + +Daira Hopwood (6): + Add tl::expected. refs #4816 + The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). + Refactor HaveShieldedRequirements to use tl::expected (example with a void T) and rename it to CheckShieldedRequirements. + tl::expected follow-up to address @str4d's comments. + Cleanup after removing dumpwallet. + Change the time that the wallet will wait for the block index to load from 5 minutes to 2 hours. + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Greg Pfeil (22): + Add PrivacyPolicyMeet + Remove trailing whitespace in fetch-params.sh + Migrate fetch-params.sh to bash + Scope the fetch-params lock file to the user + Update comments to match changed tests + Put utf8.h in the correct place + Don’t select transparent coinbase with ANY_TADDR + Update failing tests after fixing ANY_TADDR behavior + Apply suggestions from code review + Apply suggestions from code review + Appease ShellCheck + Defer fixing docker/entrypoint.sh lint failure + Apply suggestions from code review + Fix a minor bug in docker/entrypoint.sh + Improve PrivacyPolicy comments + Apply suggestions from code review + Add release notes + Update src/wallet/asyncrpcoperation_sendmany.cpp + Fix a missing newline in the RPC docs + No longer test_received_sprout + Use cached sprout addresses rather than funding + Update overwinter test to not shield to Sprout + +Jack Grigg (45): + test: Handle mining slow start inside `CreateNewBlock_validity` + test: Improve CreateNewBlock_validity exception checks + txdb: Remove const annotation from blockinfo iterator type + Remove `dumpwallet` RPC method + qa: Refactor `wallet_deprecation` test to simplify deprecation changes + Remove `zcraw*` RPC methods + txdb: Clean up for loop syntax in `WriteBatchSync` + Disable previously-deprecated features by default + Deprecate old hash fields of `getblocktemplate` + qa: Change show_help RPC test to print out differences + qa: Update mempool_packages RPC test after deprecation ratcheting + qa: Import Rust crate audits from Firefox + qa: Import Rust crate audits from the Bytecode Alliance + qa: Import Rust crate audits from Embark Studios + qa: Remove audit-as-crates-io for non-third-party crates + cargo update + zcash_primitives 0.9 + clearscreen 2.0 + depends: googletest 1.12.1 + Remove CentOS 8 as a supported platform + depends: native_zstd 1.5.2 + depends: native_ccache 4.6.3 + depends: Add package for native_cmake 3.25.1 + depends: Force cmake to install libzstd in lib/ + build-aux: Update Boost macros to latest serials + build: Bump required Boost version + depends: Force Boost library to be installed in lib/ + depends: Add tl_expected to update checker + depends: Boost 1.81.0 + depends: utfcpp 3.2.3 + qa: Postpone LLVM 15 and CCache 4.7 updates + depends: Update cxx to 1.0.83 + cargo update + Document -clockoffset option + qa: Update show_help RPC test + doc: Fix arguments to make-release.py in hotfix process + depends: CMake 3.25.2 + make-release.py: Versioning changes for 5.4.0-rc1. + make-release.py: Updated manpages for 5.4.0-rc1. + make-release.py: Updated release notes and changelog for 5.4.0-rc1. + depends: Update cxx to 1.0.87 + metrics: Update `zcash.pool.value.zatoshis` gauge for transparent pool + Update release notes with notable changes for v5.4.0 + make-release.py: Versioning changes for 5.4.0-rc2. + make-release.py: Updated manpages for 5.4.0-rc2. + +James O'Beirne (2): + Clarify help messages for path args to mention datadir prefix + Add AbsPathForConfigVal to consolidate datadir prefixing for path args + +Kris Nuttycombe (14): + Add TransactionStrategy::IsCompatibleWith + Modify TransactionBuilder to use the standard default fee. + Factor out memo parsing from asyncrpcoperation_sendmany + Remove mergetoaddress_sprout test as sending to Sprout is no longer supported. + Remove wallet_shieldcoinbase_sprout test. + Update `mergetoaddress_mixednotes.py` to no longer send to Sprout. + Verify sum of pool balances against chain total supply. + Apply suggestions from code review + Add script for verifying block rewards and fees not claimed by miners. + Apply suggestions from code review + Remove unnecessary delta_count variable. + Replace fix-copyright-headers.py with a script that creates a scripted-diff git commit. + scripted-diff: Update Zcash copyrights to 2023 + Apply suggestions from code review + +Marco Falke (4): + [init] Add missing help for args + [init] Help Msg: Use Params(CBaseChainParams::MAIN) + Clarify mocktime help message + init: Fix help message for checkblockindex + +Marius Kjærstad (5): + Hardened checkpoint update at block 1860000 for mainnet + Update src/chainparams.cpp + Some more formatting changes to chainparams.cpp + Forgot to add 0x + Add some more historical checkpoints + +Mark Friedenbach (1): + Prevent block.nTime from decreasing + +Marshall Gaucher (4): + Update zcash-build-bench.yml + Update README.md + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml + +Michał Janiszewski (1): + Update debian/compat to version 13 + +Russell Yanofsky (2): + depends: Add CMake helper for building packages + depends: Set CMAKE_INSTALL_RPATH for native packages + +Suhas Daftuar (3): + Track transaction packages in CTxMemPoolEntry + Add test showing bug in mempool packages + Fix mempool package tracking edge case + +Wladimir J. van der Laan (1): + rpc: Write authcookie atomically + +Marshall Gaucher (2): + add basic tekton zcash env + update memory targets with heaptrack + diff --git a/doc/release-notes/release-notes-5.4.0-rc3.md b/doc/release-notes/release-notes-5.4.0-rc3.md new file mode 100644 index 000000000..c2db126f5 --- /dev/null +++ b/doc/release-notes/release-notes-5.4.0-rc3.md @@ -0,0 +1,288 @@ +Notable changes +=============== + +Fixes +----- + +This release fixes an issue that could potentially cause a node to crash with the +log message "The wallet's best block hash `` was not detected in restored +chain state. Giving up; please restart with `-rescan`." + +Transparent pool and chain supply tracking +------------------------------------------ + +Since v2.0.0, `zcashd` has tracked the change in value within the Sprout and +Sapling shielded pools for each block; v5.0.0 added the Orchard pool. This +release completes the set, by tracking the change in value within the +"transparent" pool (more precisely, the value stored in Bitcoin-style UTXOs). + +`zcashd` also now tracks the change in "chain supply" for each block, defined as +the sum of coinbase output values, minus unclaimed fees. This is precisely equal +to the sum of the value in the transparent and shielded pools, and equivalent to +the sum of all unspent coins/notes on the chain. It is bounded above by the +theoretical maximum supply, but in practice is lower due to, for example, miners +not claiming transaction fees. + +> Bitcoin-style consensus rules implement fees as an imbalance between spent +> coins/notes and newly-created coins/notes. The consensus rules require that a +> coinbase transaction's outputs have a total value no greater than the sum of +> that block's subsidy and the fees made available by the transactions in the +> block. However, the consensus rules do not require that all of the available +> funds are claimed, and a miner can create coinbase transactions with lower +> value in the outputs (though in the case of Zcash, the consensus rules do +> require the transaction to include [ZIP 1014](https://zips.z.cash/zip-1014) +> Funding Stream outputs). + +After upgrading to v5.4.0, `zcashd` will start tracking changes in transparent +pool value and chain supply from the height at which it is restarted. Block +heights prior to this will not have any information recorded. To track changes +from genesis, and thus monitor the total transparent pool size and chain supply, +you would need to restart your node with the `-reindex` option. + +Wallet Performance Fixes +------------------------ + +The 100MiB memory limit for the batch scanner has been replaced by a 1000-block +limit. This eliminates an expensive call to determine the current memory usage +of the batch scanner. + +The following associated metric has been removed from the set of metrics +reported when `-prometheusport` is set: + +- (gauge) `zcashd.wallet.batchscanner.usage.bytes` + +RPC Changes +----------- + +- `z_sendmany` will no longer select transparent coinbase when "ANY\_TADDR" is + used as the `fromaddress`. It was already documented to do this, but the + previous behavior didn’t match. When coinbase notes were selected in this + case, they would (properly) require that the transaction didn’t have any + change, but this could be confusing, as the documentation stated that these + two conditions (using "ANY\_TADDR" and disallowing change) wouldn’t coincide. +- A new value pool object with `"id": "transparent"` has been added to the + `valuePools` list in `getblockchaininfo` and `getblock`. +- A new `chainSupply` key has been added to `getblockchaininfo` and `getblock` + to report the total chain supply as of that block height (if tracked), and the + change in chain supply caused by the block (for `getblock`, if measured). + +Mining +------- + +- Changes to `getblocktemplate` have been backported from upstream Bitcoin Core, + to significantly improve its performance by doing more work ahead of time in + the mempool (and reusing the work across multiple `getblocktemplate` calls). + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `gbt_oldhashes`: the `finalsaplingroothash`, `lightclientroothash`, and + `blockcommitmentshash` fields in the output of `getblocktemplate` have been + replaced by the `defaultroots` field. + +The following previously-deprecated features have been disabled by default, and +will be removed in 18 weeks: + +- `legacy_privacy` +- `getnewaddress` +- `getrawchangeaddress` +- `z_getbalance` +- `z_gettotalbalance` +- `z_getnewaddress` +- `z_listaddresses` +- `addrtype` +- `wallettxvjoinsplit` + +The following previously-deprecated features have been removed: + +- `dumpwallet` +- `zcrawreceive` +- `zcrawjoinsplit` +- `zcrawkeygen` + +Platform Support +---------------- + +- CentOS 8 has been removed from the list of supported platforms. It reached EoL + on December 31st 2021, and does not satisfy our Tier 2 policy requirements. + +Changelog +========= + +Alex Morcos (3): + Make accessing mempool parents and children public + Expose FormatStateMessage + Rewrite CreateNewBlock + +Alfredo Garcia (1): + Add chain supply and transparent value to block index. + +Carl Dong (4): + depends: More robust cmake invocation + depends: Cleanup CMake invocation + depends: Prepend CPPFLAGS to C{,XX}FLAGS for CMake + depends: Specify LDFLAGS to cmake as well + +Daira Hopwood (7): + Add tl::expected. refs #4816 + The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). + Refactor HaveShieldedRequirements to use tl::expected (example with a void T) and rename it to CheckShieldedRequirements. + tl::expected follow-up to address @str4d's comments. + Cleanup after removing dumpwallet. + Change the time that the wallet will wait for the block index to load from 5 minutes to 2 hours. + Postpone updates for 5.4.0. + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Greg Pfeil (23): + Add PrivacyPolicyMeet + Remove trailing whitespace in fetch-params.sh + Migrate fetch-params.sh to bash + Scope the fetch-params lock file to the user + Update comments to match changed tests + Put utf8.h in the correct place + Don’t select transparent coinbase with ANY_TADDR + Update failing tests after fixing ANY_TADDR behavior + Apply suggestions from code review + Apply suggestions from code review + Appease ShellCheck + Defer fixing docker/entrypoint.sh lint failure + Apply suggestions from code review + Fix a minor bug in docker/entrypoint.sh + Improve PrivacyPolicy comments + Apply suggestions from code review + Add release notes + Update src/wallet/asyncrpcoperation_sendmany.cpp + Fix a missing newline in the RPC docs + No longer test_received_sprout + Use cached sprout addresses rather than funding + Update overwinter test to not shield to Sprout + Support Bash 3.2 in fetch-params.sh + +Jack Grigg (47): + test: Handle mining slow start inside `CreateNewBlock_validity` + test: Improve CreateNewBlock_validity exception checks + txdb: Remove const annotation from blockinfo iterator type + Remove `dumpwallet` RPC method + qa: Refactor `wallet_deprecation` test to simplify deprecation changes + Remove `zcraw*` RPC methods + txdb: Clean up for loop syntax in `WriteBatchSync` + Disable previously-deprecated features by default + Deprecate old hash fields of `getblocktemplate` + qa: Change show_help RPC test to print out differences + qa: Update mempool_packages RPC test after deprecation ratcheting + qa: Import Rust crate audits from Firefox + qa: Import Rust crate audits from the Bytecode Alliance + qa: Import Rust crate audits from Embark Studios + qa: Remove audit-as-crates-io for non-third-party crates + cargo update + zcash_primitives 0.9 + clearscreen 2.0 + depends: googletest 1.12.1 + Remove CentOS 8 as a supported platform + depends: native_zstd 1.5.2 + depends: native_ccache 4.6.3 + depends: Add package for native_cmake 3.25.1 + depends: Force cmake to install libzstd in lib/ + build-aux: Update Boost macros to latest serials + build: Bump required Boost version + depends: Force Boost library to be installed in lib/ + depends: Add tl_expected to update checker + depends: Boost 1.81.0 + depends: utfcpp 3.2.3 + qa: Postpone LLVM 15 and CCache 4.7 updates + depends: Update cxx to 1.0.83 + cargo update + Document -clockoffset option + qa: Update show_help RPC test + doc: Fix arguments to make-release.py in hotfix process + depends: CMake 3.25.2 + make-release.py: Versioning changes for 5.4.0-rc1. + make-release.py: Updated manpages for 5.4.0-rc1. + make-release.py: Updated release notes and changelog for 5.4.0-rc1. + qa: Enable RPC test execution to be overridden from Python + depends: Postpone cxx update + metrics: Update `zcash.pool.value.zatoshis` gauge for transparent pool + Update release notes with notable changes for v5.4.0 + make-release.py: Versioning changes for 5.4.0-rc2. + make-release.py: Updated manpages for 5.4.0-rc2. + make-release.py: Updated release notes and changelog for 5.4.0-rc2. + +James O'Beirne (2): + Clarify help messages for path args to mention datadir prefix + Add AbsPathForConfigVal to consolidate datadir prefixing for path args + +Kris Nuttycombe (24): + Add TransactionStrategy::IsCompatibleWith + Modify TransactionBuilder to use the standard default fee. + Factor out memo parsing from asyncrpcoperation_sendmany + Remove mergetoaddress_sprout test as sending to Sprout is no longer supported. + Remove wallet_shieldcoinbase_sprout test. + Update `mergetoaddress_mixednotes.py` to no longer send to Sprout. + Verify sum of pool balances against chain total supply. + Apply suggestions from code review + Add script for verifying block rewards and fees not claimed by miners. + Apply suggestions from code review + Remove unnecessary delta_count variable. + Replace fix-copyright-headers.py with a script that creates a scripted-diff git commit. + scripted-diff: Update Zcash copyrights to 2023 + Apply suggestions from code review + Enable tests of chain supply & transparent pool balance. + Update doc/release-notes.md + Fixes an error in `zcash-cli help` following the removal of `dumpwallet`. + Allow rescan to exit in the case that Ctrl-C is pressed. + Fetch recently conflicted transactions incrementally in ThreadNotifyWallet. + Bound wallet batch scanner size to 1000 blocks instead of 100 MiB + Remove unused DEFAULT_BATCHSCANNERMEMLIMIT constant. + Tolerate missing cached conflict data in ThreadNotifyWallets + make-release.py: Versioning changes for 5.4.0-rc3. + make-release.py: Updated manpages for 5.4.0-rc3. + +Marco Falke (4): + [init] Add missing help for args + [init] Help Msg: Use Params(CBaseChainParams::MAIN) + Clarify mocktime help message + init: Fix help message for checkblockindex + +Marius Kjærstad (5): + Hardened checkpoint update at block 1860000 for mainnet + Update src/chainparams.cpp + Some more formatting changes to chainparams.cpp + Forgot to add 0x + Add some more historical checkpoints + +Mark Friedenbach (1): + Prevent block.nTime from decreasing + +Marshall Gaucher (4): + Update zcash-build-bench.yml + Update README.md + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml + +Michał Janiszewski (1): + Update debian/compat to version 13 + +Russell Yanofsky (2): + depends: Add CMake helper for building packages + depends: Set CMAKE_INSTALL_RPATH for native packages + +Suhas Daftuar (3): + Track transaction packages in CTxMemPoolEntry + Add test showing bug in mempool packages + Fix mempool package tracking edge case + +Wladimir J. van der Laan (1): + rpc: Write authcookie atomically + +Marshall Gaucher (2): + add basic tekton zcash env + update memory targets with heaptrack + diff --git a/doc/release-notes/release-notes-5.4.0-rc4.md b/doc/release-notes/release-notes-5.4.0-rc4.md new file mode 100644 index 000000000..41a83b8a7 --- /dev/null +++ b/doc/release-notes/release-notes-5.4.0-rc4.md @@ -0,0 +1,300 @@ +Notable changes +=============== + +Fixes +----- + +This release fixes an issue that could potentially cause a node to crash with the +log message "The wallet's best block hash `` was not detected in restored +chain state. Giving up; please restart with `-rescan`." + +Additionally, a bug that could cause an assertion failure during reindexing has +been fixed. See [#6387](https://github.com/zcash/zcash/pull/6387) for details. + +Transparent pool and chain supply tracking +------------------------------------------ + +Since v2.0.0, `zcashd` has tracked the change in value within the Sprout and +Sapling shielded pools for each block; v5.0.0 added the Orchard pool. This +release completes the set, by tracking the change in value within the +"transparent" pool (more precisely, the value stored in Bitcoin-style UTXOs). + +`zcashd` also now tracks the change in "chain supply" for each block, defined as +the sum of coinbase output values, minus unclaimed fees. This is precisely equal +to the sum of the value in the transparent and shielded pools, and equivalent to +the sum of all unspent coins/notes on the chain. It is bounded above by the +theoretical maximum supply, but in practice is lower due to, for example, miners +not claiming transaction fees. + +> Bitcoin-style consensus rules implement fees as an imbalance between spent +> coins/notes and newly-created coins/notes. The consensus rules require that a +> coinbase transaction's outputs have a total value no greater than the sum of +> that block's subsidy and the fees made available by the transactions in the +> block. However, the consensus rules do not require that all of the available +> funds are claimed, and a miner can create coinbase transactions with lower +> value in the outputs (though in the case of Zcash, the consensus rules do +> require the transaction to include [ZIP 1014](https://zips.z.cash/zip-1014) +> Funding Stream outputs). + +After upgrading to v5.4.0, `zcashd` will start tracking changes in transparent +pool value and chain supply from the height at which it is restarted. Block +heights prior to this will not have any information recorded. To track changes +from genesis, and thus monitor the total transparent pool size and chain supply, +you would need to restart your node with the `-reindex` option. + +Wallet Performance Fixes +------------------------ + +The 100MiB memory limit for the batch scanner has been replaced by a 1000-block +limit. This eliminates an expensive call to determine the current memory usage +of the batch scanner. + +The following associated metric has been removed from the set of metrics +reported when `-prometheusport` is set: + +- (gauge) `zcashd.wallet.batchscanner.usage.bytes` + +RPC Changes +----------- + +- `z_sendmany` will no longer select transparent coinbase when "ANY\_TADDR" is + used as the `fromaddress`. It was already documented to do this, but the + previous behavior didn’t match. When coinbase notes were selected in this + case, they would (properly) require that the transaction didn’t have any + change, but this could be confusing, as the documentation stated that these + two conditions (using "ANY\_TADDR" and disallowing change) wouldn’t coincide. +- A new value pool object with `"id": "transparent"` has been added to the + `valuePools` list in `getblockchaininfo` and `getblock`. +- A new `chainSupply` key has been added to `getblockchaininfo` and `getblock` + to report the total chain supply as of that block height (if tracked), and the + change in chain supply caused by the block (for `getblock`, if measured). + +Mining +------- + +- Changes to `getblocktemplate` have been backported from upstream Bitcoin Core, + to significantly improve its performance by doing more work ahead of time in + the mempool (and reusing the work across multiple `getblocktemplate` calls). + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `gbt_oldhashes`: the `finalsaplingroothash`, `lightclientroothash`, and + `blockcommitmentshash` fields in the output of `getblocktemplate` have been + replaced by the `defaultroots` field. + +The following previously-deprecated features have been disabled by default, and +will be removed in 18 weeks: + +- `legacy_privacy` +- `getnewaddress` +- `getrawchangeaddress` +- `z_getnewaddress` +- `z_listaddresses` +- `addrtype` +- `wallettxvjoinsplit` + +The following previously-deprecated features have been removed: + +- `dumpwallet` +- `zcrawreceive` +- `zcrawjoinsplit` +- `zcrawkeygen` + +Platform Support +---------------- + +- CentOS 8 has been removed from the list of supported platforms. It reached EoL + on December 31st 2021, and does not satisfy our Tier 2 policy requirements. + +Changelog +========= + +Alex Morcos (3): + Make accessing mempool parents and children public + Expose FormatStateMessage + Rewrite CreateNewBlock + +Alfredo Garcia (1): + Add chain supply and transparent value to block index. + +Carl Dong (4): + depends: More robust cmake invocation + depends: Cleanup CMake invocation + depends: Prepend CPPFLAGS to C{,XX}FLAGS for CMake + depends: Specify LDFLAGS to cmake as well + +Daira Hopwood (7): + Add tl::expected. refs #4816 + The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). + Refactor HaveShieldedRequirements to use tl::expected (example with a void T) and rename it to CheckShieldedRequirements. + tl::expected follow-up to address @str4d's comments. + Cleanup after removing dumpwallet. + Change the time that the wallet will wait for the block index to load from 5 minutes to 2 hours. + Postpone updates for 5.4.0. + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Greg Pfeil (23): + Add PrivacyPolicyMeet + Remove trailing whitespace in fetch-params.sh + Migrate fetch-params.sh to bash + Scope the fetch-params lock file to the user + Update comments to match changed tests + Put utf8.h in the correct place + Don’t select transparent coinbase with ANY_TADDR + Update failing tests after fixing ANY_TADDR behavior + Apply suggestions from code review + Apply suggestions from code review + Appease ShellCheck + Defer fixing docker/entrypoint.sh lint failure + Apply suggestions from code review + Fix a minor bug in docker/entrypoint.sh + Improve PrivacyPolicy comments + Apply suggestions from code review + Add release notes + Update src/wallet/asyncrpcoperation_sendmany.cpp + Fix a missing newline in the RPC docs + No longer test_received_sprout + Use cached sprout addresses rather than funding + Update overwinter test to not shield to Sprout + Support Bash 3.2 in fetch-params.sh + +Jack Grigg (50): + test: Handle mining slow start inside `CreateNewBlock_validity` + test: Improve CreateNewBlock_validity exception checks + txdb: Remove const annotation from blockinfo iterator type + Remove `dumpwallet` RPC method + qa: Refactor `wallet_deprecation` test to simplify deprecation changes + Remove `zcraw*` RPC methods + txdb: Clean up for loop syntax in `WriteBatchSync` + Disable previously-deprecated features by default + Deprecate old hash fields of `getblocktemplate` + qa: Change show_help RPC test to print out differences + qa: Update mempool_packages RPC test after deprecation ratcheting + qa: Import Rust crate audits from Firefox + qa: Import Rust crate audits from the Bytecode Alliance + qa: Import Rust crate audits from Embark Studios + qa: Remove audit-as-crates-io for non-third-party crates + cargo update + zcash_primitives 0.9 + clearscreen 2.0 + depends: googletest 1.12.1 + Remove CentOS 8 as a supported platform + depends: native_zstd 1.5.2 + depends: native_ccache 4.6.3 + depends: Add package for native_cmake 3.25.1 + depends: Force cmake to install libzstd in lib/ + build-aux: Update Boost macros to latest serials + build: Bump required Boost version + depends: Force Boost library to be installed in lib/ + depends: Add tl_expected to update checker + depends: Boost 1.81.0 + depends: utfcpp 3.2.3 + qa: Postpone LLVM 15 and CCache 4.7 updates + depends: Update cxx to 1.0.83 + cargo update + Document -clockoffset option + qa: Update show_help RPC test + doc: Fix arguments to make-release.py in hotfix process + depends: CMake 3.25.2 + make-release.py: Versioning changes for 5.4.0-rc1. + make-release.py: Updated manpages for 5.4.0-rc1. + make-release.py: Updated release notes and changelog for 5.4.0-rc1. + qa: Enable RPC test execution to be overridden from Python + depends: Postpone cxx update + metrics: Update `zcash.pool.value.zatoshis` gauge for transparent pool + Update release notes with notable changes for v5.4.0 + make-release.py: Versioning changes for 5.4.0-rc2. + make-release.py: Updated manpages for 5.4.0-rc2. + make-release.py: Updated release notes and changelog for 5.4.0-rc2. + qa: Add RPC test reproducing the Orchard reindex issue + Fix return type of `orchard_wallet_reset` + Reset Orchard wallet state in `CWallet::ClearNoteWitnessCache` + +James O'Beirne (2): + Clarify help messages for path args to mention datadir prefix + Add AbsPathForConfigVal to consolidate datadir prefixing for path args + +Kris Nuttycombe (32): + Add TransactionStrategy::IsCompatibleWith + Modify TransactionBuilder to use the standard default fee. + Factor out memo parsing from asyncrpcoperation_sendmany + Remove mergetoaddress_sprout test as sending to Sprout is no longer supported. + Remove wallet_shieldcoinbase_sprout test. + Update `mergetoaddress_mixednotes.py` to no longer send to Sprout. + Verify sum of pool balances against chain total supply. + Apply suggestions from code review + Add script for verifying block rewards and fees not claimed by miners. + Apply suggestions from code review + Remove unnecessary delta_count variable. + Replace fix-copyright-headers.py with a script that creates a scripted-diff git commit. + scripted-diff: Update Zcash copyrights to 2023 + Apply suggestions from code review + Enable tests of chain supply & transparent pool balance. + Update doc/release-notes.md + Fixes an error in `zcash-cli help` following the removal of `dumpwallet`. + Allow rescan to exit in the case that Ctrl-C is pressed. + Fetch recently conflicted transactions incrementally in ThreadNotifyWallet. + Bound wallet batch scanner size to 1000 blocks instead of 100 MiB + Remove unused DEFAULT_BATCHSCANNERMEMLIMIT constant. + Tolerate missing cached conflict data in ThreadNotifyWallets + make-release.py: Versioning changes for 5.4.0-rc3. + make-release.py: Updated manpages for 5.4.0-rc3. + make-release.py: Updated release notes and changelog for 5.4.0-rc3. + Defer z_getbalance and z_gettotalbalance disablement. + Patch uses of `sprintf` in `zeromq` that break the build on macOS + Patch zeromq to check the return value of snprintf where necessary. + Postpone rustcxx and native_cxxbridge versions 1.0.89 + Add #6387 fix to v5.4.0 release notes. + make-release.py: Versioning changes for 5.4.0-rc4. + make-release.py: Updated manpages for 5.4.0-rc4. + +Marco Falke (4): + [init] Add missing help for args + [init] Help Msg: Use Params(CBaseChainParams::MAIN) + Clarify mocktime help message + init: Fix help message for checkblockindex + +Marius Kjærstad (5): + Hardened checkpoint update at block 1860000 for mainnet + Update src/chainparams.cpp + Some more formatting changes to chainparams.cpp + Forgot to add 0x + Add some more historical checkpoints + +Mark Friedenbach (1): + Prevent block.nTime from decreasing + +Marshall Gaucher (4): + Update zcash-build-bench.yml + Update README.md + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml + +Michał Janiszewski (1): + Update debian/compat to version 13 + +Russell Yanofsky (2): + depends: Add CMake helper for building packages + depends: Set CMAKE_INSTALL_RPATH for native packages + +Suhas Daftuar (3): + Track transaction packages in CTxMemPoolEntry + Add test showing bug in mempool packages + Fix mempool package tracking edge case + +Wladimir J. van der Laan (1): + rpc: Write authcookie atomically + +Marshall Gaucher (2): + add basic tekton zcash env + update memory targets with heaptrack + diff --git a/doc/release-notes/release-notes-5.4.0.md b/doc/release-notes/release-notes-5.4.0.md new file mode 100644 index 000000000..e3cf4dfce --- /dev/null +++ b/doc/release-notes/release-notes-5.4.0.md @@ -0,0 +1,311 @@ +Notable changes +=============== + +Fixes +----- + +This release fixes an issue that could potentially cause a node to crash with the +log message "The wallet's best block hash `` was not detected in restored +chain state. Giving up; please restart with `-rescan`." + +Additionally, a bug that could cause an assertion failure during reindexing has +been fixed. See [#6387](https://github.com/zcash/zcash/pull/6387) for details. + +### Known issues + +- When `zcashd` is started with `-reindex`, until the node's chain tip catches + back up to the main chain, RPC calls might block for long periods of time (or + time out), and the wallet's view of the chain may lag significantly behind the + node's chain tip. See [#6406](https://github.com/zcash/zcash/pull/6406) for + details and the fix (which will be included in the next release). + +Transparent pool and chain supply tracking +------------------------------------------ + +Since v2.0.0, `zcashd` has tracked the change in value within the Sprout and +Sapling shielded pools for each block; v5.0.0 added the Orchard pool. This +release completes the set, by tracking the change in value within the +"transparent" pool (more precisely, the value stored in Bitcoin-style UTXOs). + +`zcashd` also now tracks the change in "chain supply" for each block, defined as +the sum of coinbase output values, minus unclaimed fees. This is precisely equal +to the sum of the value in the transparent and shielded pools, and equivalent to +the sum of all unspent coins/notes on the chain. It is bounded above by the +theoretical maximum supply, but in practice is lower due to, for example, miners +not claiming transaction fees. + +> Bitcoin-style consensus rules implement fees as an imbalance between spent +> coins/notes and newly-created coins/notes. The consensus rules require that a +> coinbase transaction's outputs have a total value no greater than the sum of +> that block's subsidy and the fees made available by the transactions in the +> block. However, the consensus rules do not require that all of the available +> funds are claimed, and a miner can create coinbase transactions with lower +> value in the outputs (though in the case of Zcash, the consensus rules do +> require the transaction to include [ZIP 1014](https://zips.z.cash/zip-1014) +> Funding Stream outputs). + +After upgrading to v5.4.0, `zcashd` will start tracking changes in transparent +pool value and chain supply from the height at which it is restarted. Block +heights prior to this will not have any information recorded. To track changes +from genesis, and thus monitor the total transparent pool size and chain supply, +you would need to restart your node with the `-reindex` option. + +Wallet Performance Fixes +------------------------ + +The 100MiB memory limit for the batch scanner has been replaced by a 1000-block +limit. This eliminates an expensive call to determine the current memory usage +of the batch scanner. + +The following associated metric has been removed from the set of metrics +reported when `-prometheusport` is set: + +- (gauge) `zcashd.wallet.batchscanner.usage.bytes` + +RPC Changes +----------- + +- `z_sendmany` will no longer select transparent coinbase when "ANY\_TADDR" is + used as the `fromaddress`. It was already documented to do this, but the + previous behavior didn’t match. When coinbase notes were selected in this + case, they would (properly) require that the transaction didn’t have any + change, but this could be confusing, as the documentation stated that these + two conditions (using "ANY\_TADDR" and disallowing change) wouldn’t coincide. +- A new value pool object with `"id": "transparent"` has been added to the + `valuePools` list in `getblockchaininfo` and `getblock`. +- A new `chainSupply` key has been added to `getblockchaininfo` and `getblock` + to report the total chain supply as of that block height (if tracked), and the + change in chain supply caused by the block (for `getblock`, if measured). + +Mining +------- + +- Changes to `getblocktemplate` have been backported from upstream Bitcoin Core, + to significantly improve its performance by doing more work ahead of time in + the mempool (and reusing the work across multiple `getblocktemplate` calls). + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `gbt_oldhashes`: the `finalsaplingroothash`, `lightclientroothash`, and + `blockcommitmentshash` fields in the output of `getblocktemplate` have been + replaced by the `defaultroots` field. + +The following previously-deprecated features have been disabled by default, and +will be removed in 18 weeks: + +- `legacy_privacy` +- `getnewaddress` +- `getrawchangeaddress` +- `z_getnewaddress` +- `z_listaddresses` +- `addrtype` +- `wallettxvjoinsplit` + +The following previously-deprecated features have been removed: + +- `dumpwallet` +- `zcrawreceive` +- `zcrawjoinsplit` +- `zcrawkeygen` + +Platform Support +---------------- + +- CentOS 8 has been removed from the list of supported platforms. It reached EoL + on December 31st 2021, and does not satisfy our Tier 2 policy requirements. + +Changelog +========= + +Alex Morcos (3): + Make accessing mempool parents and children public + Expose FormatStateMessage + Rewrite CreateNewBlock + +Alfredo Garcia (1): + Add chain supply and transparent value to block index. + +Carl Dong (4): + depends: More robust cmake invocation + depends: Cleanup CMake invocation + depends: Prepend CPPFLAGS to C{,XX}FLAGS for CMake + depends: Specify LDFLAGS to cmake as well + +Daira Hopwood (7): + Add tl::expected. refs #4816 + The std::expected proposal has unnecessary instances of undefined behaviour for operator->, operator*, and error(). Make these into assertion failures (this still conforms to the proposal). + Refactor HaveShieldedRequirements to use tl::expected (example with a void T) and rename it to CheckShieldedRequirements. + tl::expected follow-up to address @str4d's comments. + Cleanup after removing dumpwallet. + Change the time that the wallet will wait for the block index to load from 5 minutes to 2 hours. + Postpone updates for 5.4.0. + +Dimitris Apostolou (2): + Fix typos + Fix typos + +Greg Pfeil (23): + Add PrivacyPolicyMeet + Remove trailing whitespace in fetch-params.sh + Migrate fetch-params.sh to bash + Scope the fetch-params lock file to the user + Update comments to match changed tests + Put utf8.h in the correct place + Don’t select transparent coinbase with ANY_TADDR + Update failing tests after fixing ANY_TADDR behavior + Apply suggestions from code review + Apply suggestions from code review + Appease ShellCheck + Defer fixing docker/entrypoint.sh lint failure + Apply suggestions from code review + Fix a minor bug in docker/entrypoint.sh + Improve PrivacyPolicy comments + Apply suggestions from code review + Add release notes + Update src/wallet/asyncrpcoperation_sendmany.cpp + Fix a missing newline in the RPC docs + No longer test_received_sprout + Use cached sprout addresses rather than funding + Update overwinter test to not shield to Sprout + Support Bash 3.2 in fetch-params.sh + +Jack Grigg (52): + test: Handle mining slow start inside `CreateNewBlock_validity` + test: Improve CreateNewBlock_validity exception checks + txdb: Remove const annotation from blockinfo iterator type + Remove `dumpwallet` RPC method + qa: Refactor `wallet_deprecation` test to simplify deprecation changes + Remove `zcraw*` RPC methods + txdb: Clean up for loop syntax in `WriteBatchSync` + Disable previously-deprecated features by default + Deprecate old hash fields of `getblocktemplate` + qa: Change show_help RPC test to print out differences + qa: Update mempool_packages RPC test after deprecation ratcheting + qa: Import Rust crate audits from Firefox + qa: Import Rust crate audits from the Bytecode Alliance + qa: Import Rust crate audits from Embark Studios + qa: Remove audit-as-crates-io for non-third-party crates + cargo update + zcash_primitives 0.9 + clearscreen 2.0 + depends: googletest 1.12.1 + Remove CentOS 8 as a supported platform + depends: native_zstd 1.5.2 + depends: native_ccache 4.6.3 + depends: Add package for native_cmake 3.25.1 + depends: Force cmake to install libzstd in lib/ + build-aux: Update Boost macros to latest serials + build: Bump required Boost version + depends: Force Boost library to be installed in lib/ + depends: Add tl_expected to update checker + depends: Boost 1.81.0 + depends: utfcpp 3.2.3 + qa: Postpone LLVM 15 and CCache 4.7 updates + depends: Update cxx to 1.0.83 + cargo update + Document -clockoffset option + qa: Update show_help RPC test + doc: Fix arguments to make-release.py in hotfix process + depends: CMake 3.25.2 + make-release.py: Versioning changes for 5.4.0-rc1. + make-release.py: Updated manpages for 5.4.0-rc1. + make-release.py: Updated release notes and changelog for 5.4.0-rc1. + qa: Enable RPC test execution to be overridden from Python + depends: Postpone cxx update + metrics: Update `zcash.pool.value.zatoshis` gauge for transparent pool + Update release notes with notable changes for v5.4.0 + make-release.py: Versioning changes for 5.4.0-rc2. + make-release.py: Updated manpages for 5.4.0-rc2. + make-release.py: Updated release notes and changelog for 5.4.0-rc2. + qa: Add RPC test reproducing the Orchard reindex issue + Fix return type of `orchard_wallet_reset` + Reset Orchard wallet state in `CWallet::ClearNoteWitnessCache` + make-release.py: Versioning changes for 5.4.0. + make-release.py: Updated manpages for 5.4.0. + +James O'Beirne (2): + Clarify help messages for path args to mention datadir prefix + Add AbsPathForConfigVal to consolidate datadir prefixing for path args + +Kris Nuttycombe (33): + Add TransactionStrategy::IsCompatibleWith + Modify TransactionBuilder to use the standard default fee. + Factor out memo parsing from asyncrpcoperation_sendmany + Remove mergetoaddress_sprout test as sending to Sprout is no longer supported. + Remove wallet_shieldcoinbase_sprout test. + Update `mergetoaddress_mixednotes.py` to no longer send to Sprout. + Verify sum of pool balances against chain total supply. + Apply suggestions from code review + Add script for verifying block rewards and fees not claimed by miners. + Apply suggestions from code review + Remove unnecessary delta_count variable. + Replace fix-copyright-headers.py with a script that creates a scripted-diff git commit. + scripted-diff: Update Zcash copyrights to 2023 + Apply suggestions from code review + Enable tests of chain supply & transparent pool balance. + Update doc/release-notes.md + Fixes an error in `zcash-cli help` following the removal of `dumpwallet`. + Allow rescan to exit in the case that Ctrl-C is pressed. + Fetch recently conflicted transactions incrementally in ThreadNotifyWallet. + Bound wallet batch scanner size to 1000 blocks instead of 100 MiB + Remove unused DEFAULT_BATCHSCANNERMEMLIMIT constant. + Tolerate missing cached conflict data in ThreadNotifyWallets + make-release.py: Versioning changes for 5.4.0-rc3. + make-release.py: Updated manpages for 5.4.0-rc3. + make-release.py: Updated release notes and changelog for 5.4.0-rc3. + Defer z_getbalance and z_gettotalbalance disablement. + Patch uses of `sprintf` in `zeromq` that break the build on macOS + Patch zeromq to check the return value of snprintf where necessary. + Postpone rustcxx and native_cxxbridge versions 1.0.89 + Add #6387 fix to v5.4.0 release notes. + make-release.py: Versioning changes for 5.4.0-rc4. + make-release.py: Updated manpages for 5.4.0-rc4. + make-release.py: Updated release notes and changelog for 5.4.0-rc4. + +Marco Falke (4): + [init] Add missing help for args + [init] Help Msg: Use Params(CBaseChainParams::MAIN) + Clarify mocktime help message + init: Fix help message for checkblockindex + +Marius Kjærstad (5): + Hardened checkpoint update at block 1860000 for mainnet + Update src/chainparams.cpp + Some more formatting changes to chainparams.cpp + Forgot to add 0x + Add some more historical checkpoints + +Mark Friedenbach (1): + Prevent block.nTime from decreasing + +Marshall Gaucher (4): + Update zcash-build-bench.yml + Update README.md + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build.yml + Update contrib/ci-builders/tekton/tekton-labs/tasks/zcash-build-test.yml + +Michał Janiszewski (1): + Update debian/compat to version 13 + +Russell Yanofsky (2): + depends: Add CMake helper for building packages + depends: Set CMAKE_INSTALL_RPATH for native packages + +Suhas Daftuar (3): + Track transaction packages in CTxMemPoolEntry + Add test showing bug in mempool packages + Fix mempool package tracking edge case + +Wladimir J. van der Laan (1): + rpc: Write authcookie atomically + +Marshall Gaucher (2): + add basic tekton zcash env + update memory targets with heaptrack + diff --git a/doc/release-notes/release-notes-5.4.1.md b/doc/release-notes/release-notes-5.4.1.md new file mode 100644 index 000000000..d3f2c675c --- /dev/null +++ b/doc/release-notes/release-notes-5.4.1.md @@ -0,0 +1,46 @@ +Notable changes +=============== + +`allowdeprecated` in `zcash.conf` +--------------------------------- + +In v5.0.0 a [feature deprecation framework](https://zcash.github.io/zcash/user/deprecation.html) +was released, to enable `zcashd` features to be formally deprecated and removed: + +- In stage 1, a feature is marked as deprecated, but otherwise left as-is. It + remains in this stage for at least 18 weeks. +- In stage 2, the feature is default-disabled, but can be re-enabled with the + `-allowdeprecated` config option. It remains in this stage for at least 18 + weeks. +- Finally, the feature is removed - either entirely, or (e.g. in the case of RPC + methods that were inherited from Bitcoin Core) with a "tombstone" left to + inform users of the removal (and what to use instead if applicable). + +Config options can be specified either as a `zcashd` argument (`-option=value`) +or in `zcash.conf` (as a `option=value` line). However, due to a bug in the +implementation, `allowdeprecated=feature` lines in `zcash.conf` were ignored. +The bug went unnoticed until v5.4.0, in which the first group of features moved +from stage 1 to stage 2. This hotfix release fixes the bug. + +Fixed RPC blocking and wallet view lag on reindex +------------------------------------------------- + +The known issue reported in the v5.4.0 release notes has been fixed. + + +Changelog +========= + +Jack Grigg (8): + Sleep for 200us before each ActivateBestChainStep call + Load `-allowdeprecated` settings after reading the config file + qa: Refactor `wallet_deprecation` test to extract common logic + qa: Extend `wallet_deprecation` to test `allowdeprecated` in config file + Write release notes for v5.4.1 + Postpone dependency updates for v5.4.1 + make-release.py: Versioning changes for 5.4.1. + make-release.py: Updated manpages for 5.4.1. + +Jack Grigg (1): + Adjust documentation of 200µs sleep + diff --git a/doc/release-notes/release-notes-5.4.2.md b/doc/release-notes/release-notes-5.4.2.md new file mode 100644 index 000000000..0deb12c8a --- /dev/null +++ b/doc/release-notes/release-notes-5.4.2.md @@ -0,0 +1,36 @@ +Notable changes +=============== + +This hotfix remediates memory exhaustion vulnerabilities that zcashd inherited +as a fork of bitcoind. These bugs could allow an attacker to use peer-to-peer +messages to fill the memory of a node, resulting in a crash. + + +Changelog +========= + +Daira Hopwood (3): + Enable a CRollingBloomFilter to be reset to a state where it takes little memory. + Ensure that CNode::{addrKnown, filterInventoryKnown} immediately take little memory when we disconnect the node. + Improve the encapsulation of `CNode::filterInventoryKnown`. + +Greg Pfeil (1): + Remove `ResetRequestCount` + +Jon Atack (1): + p2p, rpc, test: address rate-limiting follow-ups + +Kris Nuttycombe (4): + Update release notes for v5.3.3 hotfix + Postpone dependency updates for v5.4.2 hotfix. + make-release.py: Versioning changes for 5.4.2. + make-release.py: Updated manpages for 5.4.2. + +Matt Corallo (1): + Remove useless mapRequest tracking that just effects Qt display. + +Pieter Wuille (3): + Rate limit the processing of incoming addr messages + Randomize the order of addr processing + Add logging and addr rate limiting statistics + diff --git a/doc/release-notes/release-notes-5.5.0-rc1.md b/doc/release-notes/release-notes-5.5.0-rc1.md new file mode 100644 index 000000000..bff4a9d7b --- /dev/null +++ b/doc/release-notes/release-notes-5.5.0-rc1.md @@ -0,0 +1,407 @@ +Notable changes +=============== + +RPC Changes +----------- + +- `getdeprecationinfo` has several changes: + - It now returns additional information about currently deprecated and + disabled features. + - A new `end_of_service` object that contains both the block height for + end-of-service and the estimated time that the end-of-service halt is + expected to occur. Note that this height is just an approximation and + will change over time as the end-of-service block height approaches, + due to the variability in block times. The + `end_of_service` object is intended to replace the `deprecationheight` + field; see the [Deprecations](#deprecations) section for additional detail. + - This RPC method was previously only available for mainnet nodes; it is now + also available for testnet and regtest nodes, in which case it does not + return end-of-service halt information (as testnet and regtest nodes do not + have an end-of-service halt feature.) +- Several `z_sendmany`, `z_shieldcoinbase` and `z_mergetoaddress` failures have + moved from synchronous to asynchronous, so while you should already be + checking the async operation status, there are now more cases that may trigger + failure at that stage. +- The `AllowRevealedRecipients` privacy policy is now required in order to choose a + transparent change address for a transaction. This will only occur when the wallet + is unable to construct the transaction without selecting funds from the transparent + pool, so the impact of this change is that for such transactions, the user must specify + `AllowFullyTransparent`. +- The `z_shieldcoinbase` and `z_mergetoaddress` RPC methods now support an + optional privacy policy. +- The `estimatepriority` RPC call has been removed. +- The `priority_delta` argument to the `prioritisetransaction` RPC call now has + no effect and must be set to a dummy value (0 or null). + +Changes to Transaction Fee Selection +------------------------------------ + +- The `-mintxfee` and `-sendfreetransactions` options have been removed. These + options used to instruct the wallet's legacy transaction creation APIs + (`sendtoaddress`, `sendmany`, and `fundrawtransaction`) to increase fees to + this limit and to use a zero fee for "small" transactions that spend "old" + inputs, respectively. They will now cause a warning on node startup if used. + +Changes to Block Template Construction +-------------------------------------- + +We now use a new block template construction algorithm documented in +[ZIP 317](https://zips.z.cash/zip-0317#recommended-algorithm-for-block-template-construction). + +- This algorithm no longer favours transactions that were previously considered + "high priority" because they spent older inputs. The `-blockprioritysize` config + option, which configured the portion of the block reserved for these transactions, + has been removed and will now cause a warning if used. +- The `-blockminsize` option, which configured the size of a portion of the block + to be filled regardless of transaction fees or priority, has also been removed + and will cause a warning if used. +- A `-blockunpaidactionlimit` option has been added to control the limit on + "unpaid actions" that will be accepted in a block for transactions paying less + than the ZIP 317 fee. This defaults to 50. + +Removal of Priority Estimation +------------------------------ + +- Estimation of "priority" needed for a transaction to be included within a target + number of blocks, and the associated `estimatepriority` RPC call, have been + removed. The format for `fee_estimates.dat` has also changed to no longer save + these priority estimates. It will automatically be converted to the new format + which is not readable by prior versions of the software. The `-txconfirmtarget` + config option is now obsolete and has also been removed. It will cause a + warning if used. + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `deprecationinfo_deprecationheight`: The `deprecationheight` field of + `getdeprecationinfo` has been deprecated and replaced by the `end_of_service` + object. + +Changelog +========= + +ANISH M (3): + use SOURCES_PATH instead of local git DEPENDS_SOURCES_DIR + report the git-derived version in metrics screen + Update src/metrics.cpp by removing v prefix. + +Alex Morcos (14): + Refactor CreateNewBlock to be a method of the BlockAssembler class + FIX: Account for txs already added to block in addPriorityTxs + FIX: correctly measure size of priority block + [rpc] Remove estimatepriority. + [mining] Remove -blockprioritysize. + [debug] Change -printpriority option + [cleanup] Remove estimatePriority + [rpc] sendrawtransaction no longer bypasses minRelayTxFee + [test] Remove priority from tests + [rpc] Remove priority information from mempool RPC calls + [rpc] Remove priorityDelta from prioritisetransaction + [cleanup] Remove coin age priority completely. + Allow setting minrelaytxfee to 0 + Update example zcash.conf + +Daira Emma Hopwood (34): + Remove unnecessary #include. + Adjust indentation to be consistent without changing existing code. + Repair show_help RPC test. + Fix bit-rotted code in miner tests. + Implement ZIP 317 computations. + `cargo update` + Add audits for updates to futures-* 0.3.28 and redjubjub 0.7.0. + Add `examine`, a wrapper around `std::visit` that reverses the arguments. + Use the new `examine` macro to replace all instances of `std::visit(match {...}, specimen)`, improving code readability. + Refactoring to avoid duplicated code. + Refactoring to avoid an unnecessary temporary. + Refactor that avoids using exceptions for local flow control and is simpler. + Correct the documentation of `-rpcconnect` in the example `zcash.conf`. `-rpcconnect` is only used by `zcash-cli`. + Change ZIP 401 mempool limiting to use conventional fee. + Change ZIP 401 mempool limiting to use constants decided in zcash/zips#565. + Warn on node startup if the removed `-blockprioritysize` option is set to a non-zero value. + Log (at the mempool DEBUG level) when a transaction cannot be accepted to the mempool because its modified fee is below the minimum relay fee. + Fix the dust threshold rate to three times 100 zats/1000 bytes. (We express it that way rather than 300 zats/1000 bytes, because the threshold is always rounded to an integer and then multiplied by 3.) + Fix some messages, comments, and documentation that: * used "fee" to mean "fee rate", "kB" to mean 1000 bytes, "satoshis" to mean zatoshis, or that incorrectly used "BTC" in place of "ZEC"; * used obsolete concepts such as "zero fee" or "free transaction"; or * did not accurately document their applicability. + Fix tests that failed due to the minimum relay fee being enforced. + Fix miner_tests btest. + Fix mempool_packages and prioritisetransaction RPC tests. + Implement `GetUnpaidActionCount` and `GetWeightRatio` for ZIP 317. + ZIP 317 block construction algorithm. This breaks tests which are repaired in subsequent commits. + Add assertions that `GetRandInt*` functions are called with `nMax >= 0`. All existing uses have been checked to ensure they are consistent with this assertion. + Repair `miner_tests.py` btest. + Repair some RPC tests. + mergetoaddress_helper.py: Use `generate_and_check` helper to mine a block and make sure that it contains the expected number of transactions. + mergetoaddress_helper.py: use Decimal for amounts and integers otherwise. + Remove the implementation of score-based block template construction and the `-blockminsize` option. + Add a `-blockunpaidactionlimit` config option to configure the per-block limit on unpaid actions for ZIP 317 block template construction. + miner_tests.cpp improvements. + random.h documentation improvements. + Fix/suppress clippy warnings. + +Daira Hopwood (9): + Use a more recent URL format for GitHub release archives. + Clarify that patches to a dependency are under the same license as that dependency. + Update copyright date and email for tl_expected. + Use the same convention for the tl_expected download files as for native_cctools + Refactoring to split the weighted tx tree out of mempool_limit.{cpp,h} and make it more reusable. + Minor optimization to weighted_map::remove + This PR doesn't bring in any ZIP 317 changes yet + Another minor optimization + Change spelling of prioritisation in an error message + +DeckerSU (1): + InsertBlockIndex: pass const reference on hash, instead of hash + +Dimitris Apostolou (3): + Fix typo + Update documentation link + Fix typos + +Evan Klitzke (1): + Fix automake warnings when running autogen.sh + +Greg Pfeil (81): + Show in-progress tests when rpc-tests is interrupted + Make extra newline more explicit + Apply suggestions from code review + Make pool selection order more flexible + Simplify diversifier_index_t handling + Update tests for async z_sendmany + Limit UTXOs + Some orchard fixes for wallet_tx_builder + Return anchorHeight from ResolveInputsAndPayments + Refactoring InsufficientFundsError + Ensure we don’t make Orchard change pre-NU5 + Test updates for z_sendmany WalletTxBuilder changes + Fix weakened privacy policy for transparent change + Fix some overly-strict privacy policies in btest + Apply suggestions from code review + Unify requireTransparentCoinbase handling + Rename `Get*Balance` to `Get*Total` + Remove changes that aren’t needed by z_sendmany + Improve GetRequiredPrivacyPolicy + Add release notes for (a)sync z_sendmany changes + Assert that we get a change addr for any selector + Don’t pass PrivacyPolicy to selector constructor + Address comments on WalletTxBuilder introduction + Make RPC test output more deterministic + Update WalletTxBuilder based on review + Clarify `AddressResolutionError` + Don’t permit user-provided “internal” payments + Address WalletTxBuilder PR feedback + Ensure that a WalletTxBuilder tx balances + Additional z_sendmany test cases + Address WalletTxBuilder review feedback + Apply suggestions for WalletTxBuilder from code review + Simplify SelectOVKs + Have GetRecipientPools return a copy + Remove CWallet member from WalletTxBuilder + Improve taddr no-memo check + Update src/wallet/rpcwallet.cpp + Lock notes (except Orchard) in wallet_tx_builder + Improve Doxygen for note locking + Require `AllowRevealedRecipients` for t-change + Update release-notes for transparent change restriction + Correct EditorConfig for Makefiles + Split C++ generated from Rust into own lib + Simplify canResolveOrchard logic + Support ZIP 317 fees in the zcashd wallet + Correct change handling for ZIP 317 fees + Address review feedback re: ZIP 317 in wallet + Revert "Add `AllowRevealedSenders` to fix `mempool_nu_activation.py`" + Eliminate LegacyCompat–ZTXOSelector cycle + Simplify client.cpp + Enrich zcash-cli arg conversion + Better messages on client-side zcash-cli errors + Fix accidental reversion of #6409 + Remove unnecessary explicit privacy policy + Use examine instead of std::visit + Simplify some vector initialization + Fix edge case revealed by #6409 + Rename Arg* to Param + Adjust wallet absurd fee check for ZIP 317 + Address review feedback for ZIP 317 fees in wallet + Address more ZIP 317 fee feedback + Fix zcash-cli crash when printing help message + Use null as the ZIP 317 fee sentinel instead of -1 + Add z_sendmany RPC examples with fee field + Have z_shieldcoinbase use WalletTxBuilder + Address review feedback on z_shieldcoinbase + Fix an incorrect error message in a test + Minor improvements to z_shieldcoinbase + Support ZIP 317 fees for legacy wallet operations + Remove `-mintxfee` config option + Address review comments re: legacy wallet ZIP 317 + Remove `-txconfirmtarget` config option + Restore previous `-maxtxfee` bound + Correct -maxtxfee lower bound diagnostic messages + WalletTxBuilder support for net payments + fixup! WalletTxBuilder support for net payments + Don’t test “Insufficient funds” for `z_shieldcoinbase` + Update z_mergetoaddress to use WalletTxBuilder + Many z_mergetoaddress updates + Avoid extra copy in ResolveInputsAndPayments + Address z_mergetoaddress review feedback + +Jack Grigg (77): + rust: Add `cxx` version of `RustStream` + rust: Migrate `OrchardMerkleFrontier` to `cxx` + CreateNewBlock: Leave more space for Orchard shielded coinbase + Retroactively enable ZIP 216 before NU5 activation + rust: Compile with ThinLTO + depends: Update Rust to 1.67.1 + depends: Update Clang / libcxx to LLVM 15.0.6 + Fix 1.67.1 clippy lints + depends: Evaluate `native_packages` before `packages` + qa: Fix year in postponement lines + qa: Fix `google/leveldb` tag parsing in `updatecheck.py` + qa: Handle commit IDs correctly to `updatecheck.py` + depends: `cxx 1.0.91` + depends: `native_zstd 1.5.4` + `cargo vet regenerate imports` + qa: Import Rust crate audits from ISRG + `cargo update` + qa: Postpone LevelDB 1.23 + book: Add page with release support details and EoS halt heights + Update release support book page in release process + depends: Update Rust to 1.68.0 + qa: Replace Firefox audits with aggregated Mozilla audits in registry + qa: Import Rust crate audits from ChromeOS + Move `fEnableAddrTypeField` outside `ENABLE_WALLET` + `s/string/std::string` in `init.cpp` + CI: Check that the PR branch has a sufficiently recent base for Tekton + CI: Fix permissions for Checks workflow + Add `CChainParams::RustNetwork` + wallet: Consolidate `CWalletTx` Sapling output decryption methods + wallet: Use `zcash_note_encryption` in `CWalletTx::DecryptSaplingNote` + wallet: Use `CWalletTx::DecryptSaplingNote` in more places + wallet: Use `zcash_note_encryption` in `CWallet::FindMySaplingNotes` + wallet: Use `zcash_note_encryption` in `CWalletTx::RecoverSaplingNote` + wallet: Remove recipient-side `SaplingNotePlaintext::decrypt` + CI: Fetch all history for "recent base" check + CI: Include explicit `failure()` condition in "recent base" check + CI: Use `github.head_ref` instead of `HEAD` for "recent base" check + book: Add End-of-Support heights for v5.3.3 and v5.4.2 + CI: Remove most usages of `actions-rs` actions + CI: Migrate to `cargo-vet 0.5` + cargo vet prune + CI: Provide `write` permission for `pull-requests` + CI: Check out both the base and PR branches for "recent base" check + Migrate to `zcash_primitives 0.10` + depends: `cxx 1.0.92` + depends: CMake 3.26.0 + depends: Postpone CCache updates again + cargo update + Use `RandomInvalidOutputDescription()` everywhere it makes sense + Merge most `cxx::bridge` definitions into a single bridge + Expand `CppStream` to cover all `Stream`-like C++ types + Migrate `OrchardMerkleFrontier` to use new `CppStream` APIs + build: Tolerate split LLVM versions + Use `cxx` bridge for all Orchard bundle inspection and validation + gtest: Minor improvements to `CoinsTests` + rust: Migrate Ed25519 FFI to `cxx` + Tell `cargo-vet` to ignore patched dependencies + cargo-vet: Regenerate imports + cargo-vet: Switch to Google's aggregated audits + More crate audits + Migrate to published `orchard 0.4` + qa: Fix update checker to handle `native_clang` version format + depends: CMake 3.26.3 + depends: Rust 1.68.2 + depends: `native_zstd 1.5.5` + depends: `cxx 1.0.94` + qa: Postpone dependencies we aren't updating + cargo update + Use published `zcash_primitives 0.11` and `zcash_proofs 0.11` + test: Avoid generating a chain fork in `mempool_packages` RPC test + test: Sync blocks before invalidating them in `mempool_packages` RPC test + depends: Boost 1.82.0 + qa: Postpone Clang 16.0.2 + cargo update + depends: Rust 1.69.0 + make-release.py: Versioning changes for 5.5.0-rc1. + make-release.py: Updated manpages for 5.5.0-rc1. + +Kris Nuttycombe (26): + Fix potential path or symlink traversal + Add a docker-compose.yml for prometheus/grafana metrics collection. + Apply suggestions from code review + Make all CCoinsView methods pure-virtual. + Remove `FakeCoinsViewDB` as it is identical to `CCoinsViewDummy` + Postpone dependency updates. + make-release.py: Versioning changes for 5.3.3. + make-release.py: Updated manpages for 5.3.3. + make-release.py: Updated release notes and changelog for 5.3.3. + Set urgency to `high` in Debian changelog. + Add information about deprecated features to `deprecationinfo` results. + Apply suggestions from code review + Add a wallet-aware transaction builder. + Use WalletTxBuilder for z_sendmany + Allow selectors to require transparent coinbase + Fix a longstanding zcashd build warning + Fix `make distclean` to recursively remove `rust/gen` + Improve const-ness of CChainParams retrieval by network ID + Explicitly provide CChainParams to `EnforceNodeDeprecation` + revert broken "safe extract" functionality in golden tests. + Refactor RPC privacyPolicy handling + Update to use the `ff 0.13` dependency stack. + Add `AllowRevealedSenders` to fix `mempool_nu_activation.py` + Calculate convential fee in `CreateTransaction` before stripping sigs. + Fix formating of money strings. + Use the conventional fee for prioritisation in prioritisetransactions.py + +Luke Dashjr (1): + RPC/Mining: Restore API compatibility for prioritisetransaction + +Marco Falke (1): + wallet: Remove sendfree + +Marius Kjærstad (2): + New checkpoint at block 2000000 for mainnet + Update estimated number of transactions due to Blossom NU + +Miodrag Popović (2): + Fix for broken cross-build to Windows target on Ubuntu 22.04 and Debian 11 + Update depends/hosts/mingw32.mk to use posix variant library path + +Sean Bowe (1): + Add additional audits. + +Suhas Daftuar (4): + Add tags to mempool's mapTx indices + Fix mempool limiting for PrioritiseTransaction + Use fee deltas for determining mempool acceptance + Remove GetMinRelayFee + +TrellixVulnTeam (1): + Adding tarfile member sanitization to extractall() + +Wladimir J. van der Laan (1): + Merge #7730: Remove priority estimation + +Yasser Isa (1): + DOWNLOAD_URL dynamic in fetch-params.sh + +cronicc (1): + Fix Horizen Security contact email + +instagibbs (2): + Gave miner test values constants for less error-prone values. + Corrected values + +sasha (6): + Partially revert PR #6384, but only for URLs using a git commit hash + Download `native_cctools` and its `libtapi` to meaningful filenames + Better error messages if proof parameters aren't loaded + Enable the (existing) custom error message for the invalid checksum case + Re-download parameters if they already exist but don't have correct sums + Alias Sasha->sasha in release-notes.py to avoid authors.md split + +Jack Grigg (2): + Improvements to code comments + Adjust documentation + diff --git a/doc/release-notes/release-notes-5.5.0-rc2.md b/doc/release-notes/release-notes-5.5.0-rc2.md new file mode 100644 index 000000000..f94ccaba9 --- /dev/null +++ b/doc/release-notes/release-notes-5.5.0-rc2.md @@ -0,0 +1,458 @@ +Notable changes +=============== + +RPC Changes +----------- + +- `getdeprecationinfo` has several changes: + - It now returns additional information about currently deprecated and + disabled features. + - A new `end_of_service` object that contains both the block height for + end-of-service and the estimated time that the end-of-service halt is + expected to occur. Note that this height is just an approximation and + will change over time as the end-of-service block height approaches, + due to the variability in block times. The + `end_of_service` object is intended to replace the `deprecationheight` + field; see the [Deprecations](#deprecations) section for additional detail. + - This RPC method was previously only available for mainnet nodes; it is now + also available for testnet and regtest nodes, in which case it does not + return end-of-service halt information (as testnet and regtest nodes do not + have an end-of-service halt feature.) +- Several `z_sendmany`, `z_shieldcoinbase` and `z_mergetoaddress` failures have + moved from synchronous to asynchronous, so while you should already be + checking the async operation status, there are now more cases that may trigger + failure at that stage. +- The `AllowRevealedRecipients` privacy policy is now required in order to choose a + transparent change address for a transaction. This will only occur when the wallet + is unable to construct the transaction without selecting funds from the transparent + pool, so the impact of this change is that for such transactions, the user must specify + `AllowFullyTransparent`. +- The `z_shieldcoinbase` RPC method now supports an optional memo. +- The `z_shieldcoinbase` and `z_mergetoaddress` RPC methods now support an + optional privacy policy. +- The `z_mergetoaddress` RPC method can now merge _to_ UAs and can also send + between different shielded pools (when `AllowRevealedAmounts` is specified). +- The `estimatepriority` RPC call has been removed. +- The `priority_delta` argument to the `prioritisetransaction` RPC call now has + no effect and must be set to a dummy value (0 or null). + +Changes to Transaction Fee Selection +------------------------------------ + +- The zcashd wallet now uses the conventional transaction fee calculated according + to [ZIP 317](https://zips.z.cash/zip-0317) by default. This conventional fee + will be used unless a fee is explicitly specified in an RPC call, or for the + wallet's legacy transaction creation APIs (`sendtoaddress`, `sendmany`, and + `fundrawtransaction`) when the `-paytxfee` option is set. +- The `-mintxfee` and `-sendfreetransactions` options have been removed. These + options previously instructed the legacy transaction creation APIs to increase + fees to this limit and to use a zero fee for "small" transactions that spend + "old" inputs, respectively. They will now cause a warning on node startup if + used. + + +Changes to Block Template Construction +-------------------------------------- + +We now use a new block template construction algorithm documented in +[ZIP 317](https://zips.z.cash/zip-0317#recommended-algorithm-for-block-template-construction). + +- This algorithm no longer favours transactions that were previously considered + "high priority" because they spent older inputs. The `-blockprioritysize` config + option, which configured the portion of the block reserved for these transactions, + has been removed and will now cause a warning if used. +- The `-blockminsize` option, which configured the size of a portion of the block + to be filled regardless of transaction fees or priority, has also been removed + and will cause a warning if used. +- A `-blockunpaidactionlimit` option has been added to control the limit on + "unpaid actions" that will be accepted in a block for transactions paying less + than the ZIP 317 fee. This defaults to 50. + +Change to Transaction Relay Policy +---------------------------------- + +The allowance for "free transactions" in mempool acceptance and relay has been +removed. All transactions must pay at least the minimum relay threshold, currently +100 zatoshis per 1000 bytes up to a maximum of 1000 zatoshis, in order to be +accepted and relayed. (Individual nodes can change this using `-minrelaytxfee` +but in practice the network default needs to be adhered to.) This policy is under +review and [might be made stricter](https://zips.z.cash/zip-0317#transaction-relaying); +if that happens then the ZIP 317 conventional fee will still be sufficient for +mempool acceptance and relay. + +Removal of Priority Estimation +------------------------------ + +Estimation of "priority" needed for a transaction to be included within a target +number of blocks, and the associated `estimatepriority` RPC call, have been +removed. The format for `fee_estimates.dat` has also changed to no longer save +these priority estimates. It will automatically be converted to the new format +which is not readable by prior versions of the software. The `-txconfirmtarget` +config option is now obsolete and has also been removed. It will cause a +warning if used. + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `deprecationinfo_deprecationheight`: The `deprecationheight` field of + `getdeprecationinfo` has been deprecated and replaced by the `end_of_service` + object. + +Changelog +========= + +ANISH M (3): + use SOURCES_PATH instead of local git DEPENDS_SOURCES_DIR + report the git-derived version in metrics screen + Update src/metrics.cpp by removing v prefix. + +Alex Morcos (14): + Refactor CreateNewBlock to be a method of the BlockAssembler class + FIX: Account for txs already added to block in addPriorityTxs + FIX: correctly measure size of priority block + [rpc] Remove estimatepriority. + [mining] Remove -blockprioritysize. + [debug] Change -printpriority option + [cleanup] Remove estimatePriority + [rpc] sendrawtransaction no longer bypasses minRelayTxFee + [test] Remove priority from tests + [rpc] Remove priority information from mempool RPC calls + [rpc] Remove priorityDelta from prioritisetransaction + [cleanup] Remove coin age priority completely. + Allow setting minrelaytxfee to 0 + Update example zcash.conf + +Charlie O'Keefe (1): + Add reference in Makefile.am to zip317.h + +Daira Emma Hopwood (38): + Remove unnecessary #include. + Adjust indentation to be consistent without changing existing code. + Repair show_help RPC test. + Fix bit-rotted code in miner tests. + Implement ZIP 317 computations. + `cargo update` + Add audits for updates to futures-* 0.3.28 and redjubjub 0.7.0. + Add `examine`, a wrapper around `std::visit` that reverses the arguments. + Use the new `examine` macro to replace all instances of `std::visit(match {...}, specimen)`, improving code readability. + Refactoring to avoid duplicated code. + Refactoring to avoid an unnecessary temporary. + Refactor that avoids using exceptions for local flow control and is simpler. + Correct the documentation of `-rpcconnect` in the example `zcash.conf`. `-rpcconnect` is only used by `zcash-cli`. + Change ZIP 401 mempool limiting to use conventional fee. + Change ZIP 401 mempool limiting to use constants decided in zcash/zips#565. + Warn on node startup if the removed `-blockprioritysize` option is set to a non-zero value. + Log (at the mempool DEBUG level) when a transaction cannot be accepted to the mempool because its modified fee is below the minimum relay fee. + Fix the dust threshold rate to three times 100 zats/1000 bytes. (We express it that way rather than 300 zats/1000 bytes, because the threshold is always rounded to an integer and then multiplied by 3.) + Fix some messages, comments, and documentation that: * used "fee" to mean "fee rate", "kB" to mean 1000 bytes, "satoshis" to mean zatoshis, or that incorrectly used "BTC" in place of "ZEC"; * used obsolete concepts such as "zero fee" or "free transaction"; or * did not accurately document their applicability. + Fix tests that failed due to the minimum relay fee being enforced. + Fix miner_tests btest. + Fix mempool_packages and prioritisetransaction RPC tests. + Implement `GetUnpaidActionCount` and `GetWeightRatio` for ZIP 317. + ZIP 317 block construction algorithm. This breaks tests which are repaired in subsequent commits. + Add assertions that `GetRandInt*` functions are called with `nMax >= 0`. All existing uses have been checked to ensure they are consistent with this assertion. + Repair `miner_tests.py` btest. + Repair some RPC tests. + mergetoaddress_helper.py: Use `generate_and_check` helper to mine a block and make sure that it contains the expected number of transactions. + mergetoaddress_helper.py: use Decimal for amounts and integers otherwise. + Remove the implementation of score-based block template construction and the `-blockminsize` option. + Add a `-blockunpaidactionlimit` config option to configure the per-block limit on unpaid actions for ZIP 317 block template construction. + miner_tests.cpp improvements. + random.h documentation improvements. + Fix/suppress clippy warnings. + Improve the `show_help.py` RPC test to include `-help-debug` (needed to test the help change in the next commit). + Improve `-printpriority` output to log the modified fee, conventional fee, size, logical action count, and unpaid action count. This reflects the changes to use the ZIP 317 block construction algorithm and de-emphasise fee rate. + Fix a build regression if `--disable-mining` is selected. + Fix a build regression if both `--disable-mining` and `--disable-wallet` are selected. + +Daira Hopwood (9): + Use a more recent URL format for GitHub release archives. + Clarify that patches to a dependency are under the same license as that dependency. + Update copyright date and email for tl_expected. + Use the same convention for the tl_expected download files as for native_cctools + Refactoring to split the weighted tx tree out of mempool_limit.{cpp,h} and make it more reusable. + Minor optimization to weighted_map::remove + This PR doesn't bring in any ZIP 317 changes yet + Another minor optimization + Change spelling of prioritisation in an error message + +DeckerSU (1): + InsertBlockIndex: pass const reference on hash, instead of hash + +Dimitris Apostolou (3): + Fix typo + Update documentation link + Fix typos + +Evan Klitzke (1): + Fix automake warnings when running autogen.sh + +Greg Pfeil (86): + Show in-progress tests when rpc-tests is interrupted + Make extra newline more explicit + Apply suggestions from code review + Make pool selection order more flexible + Simplify diversifier_index_t handling + Update tests for async z_sendmany + Limit UTXOs + Some orchard fixes for wallet_tx_builder + Return anchorHeight from ResolveInputsAndPayments + Refactoring InsufficientFundsError + Ensure we don’t make Orchard change pre-NU5 + Test updates for z_sendmany WalletTxBuilder changes + Fix weakened privacy policy for transparent change + Fix some overly-strict privacy policies in btest + Apply suggestions from code review + Unify requireTransparentCoinbase handling + Rename `Get*Balance` to `Get*Total` + Remove changes that aren’t needed by z_sendmany + Improve GetRequiredPrivacyPolicy + Add release notes for (a)sync z_sendmany changes + Assert that we get a change addr for any selector + Don’t pass PrivacyPolicy to selector constructor + Address comments on WalletTxBuilder introduction + Make RPC test output more deterministic + Update WalletTxBuilder based on review + Clarify `AddressResolutionError` + Don’t permit user-provided “internal” payments + Address WalletTxBuilder PR feedback + Ensure that a WalletTxBuilder tx balances + Additional z_sendmany test cases + Address WalletTxBuilder review feedback + Apply suggestions for WalletTxBuilder from code review + Simplify SelectOVKs + Have GetRecipientPools return a copy + Remove CWallet member from WalletTxBuilder + Improve taddr no-memo check + Update src/wallet/rpcwallet.cpp + Lock notes (except Orchard) in wallet_tx_builder + Improve Doxygen for note locking + Require `AllowRevealedRecipients` for t-change + Update release-notes for transparent change restriction + Correct EditorConfig for Makefiles + Split C++ generated from Rust into own lib + Simplify canResolveOrchard logic + Support ZIP 317 fees in the zcashd wallet + Correct change handling for ZIP 317 fees + Address review feedback re: ZIP 317 in wallet + Revert "Add `AllowRevealedSenders` to fix `mempool_nu_activation.py`" + Eliminate LegacyCompat–ZTXOSelector cycle + Simplify client.cpp + Enrich zcash-cli arg conversion + Better messages on client-side zcash-cli errors + Fix accidental reversion of #6409 + Remove unnecessary explicit privacy policy + Use examine instead of std::visit + Simplify some vector initialization + Fix edge case revealed by #6409 + Rename Arg* to Param + Adjust wallet absurd fee check for ZIP 317 + Address review feedback for ZIP 317 fees in wallet + Address more ZIP 317 fee feedback + Fix zcash-cli crash when printing help message + Use null as the ZIP 317 fee sentinel instead of -1 + Add z_sendmany RPC examples with fee field + Have z_shieldcoinbase use WalletTxBuilder + Address review feedback on z_shieldcoinbase + Fix an incorrect error message in a test + Minor improvements to z_shieldcoinbase + Support ZIP 317 fees for legacy wallet operations + Remove `-mintxfee` config option + Address review comments re: legacy wallet ZIP 317 + Remove `-txconfirmtarget` config option + Restore previous `-maxtxfee` bound + Correct -maxtxfee lower bound diagnostic messages + WalletTxBuilder support for net payments + fixup! WalletTxBuilder support for net payments + Don’t test “Insufficient funds” for `z_shieldcoinbase` + Update z_mergetoaddress to use WalletTxBuilder + Many z_mergetoaddress updates + Avoid extra copy in ResolveInputsAndPayments + Address z_mergetoaddress review feedback + Allow explicit “no memo” in z_mergetoaddress + Add `memo` parameter to `z_shieldcoinbase` + Support UA destinations in `z_mergetoaddress` + Include Orchard dest in z_mergetoaddress estimation + Update release notes + +Jack Grigg (90): + rust: Add `cxx` version of `RustStream` + rust: Migrate `OrchardMerkleFrontier` to `cxx` + CreateNewBlock: Leave more space for Orchard shielded coinbase + Retroactively enable ZIP 216 before NU5 activation + rust: Compile with ThinLTO + depends: Update Rust to 1.67.1 + depends: Update Clang / libcxx to LLVM 15.0.6 + Fix 1.67.1 clippy lints + depends: Evaluate `native_packages` before `packages` + qa: Fix year in postponement lines + qa: Fix `google/leveldb` tag parsing in `updatecheck.py` + qa: Handle commit IDs correctly to `updatecheck.py` + depends: `cxx 1.0.91` + depends: `native_zstd 1.5.4` + `cargo vet regenerate imports` + qa: Import Rust crate audits from ISRG + `cargo update` + qa: Postpone LevelDB 1.23 + book: Add page with release support details and EoS halt heights + Update release support book page in release process + depends: Update Rust to 1.68.0 + qa: Replace Firefox audits with aggregated Mozilla audits in registry + qa: Import Rust crate audits from ChromeOS + Move `fEnableAddrTypeField` outside `ENABLE_WALLET` + `s/string/std::string` in `init.cpp` + CI: Check that the PR branch has a sufficiently recent base for Tekton + CI: Fix permissions for Checks workflow + Add `CChainParams::RustNetwork` + wallet: Consolidate `CWalletTx` Sapling output decryption methods + wallet: Use `zcash_note_encryption` in `CWalletTx::DecryptSaplingNote` + wallet: Use `CWalletTx::DecryptSaplingNote` in more places + wallet: Use `zcash_note_encryption` in `CWallet::FindMySaplingNotes` + wallet: Use `zcash_note_encryption` in `CWalletTx::RecoverSaplingNote` + wallet: Remove recipient-side `SaplingNotePlaintext::decrypt` + CI: Fetch all history for "recent base" check + CI: Include explicit `failure()` condition in "recent base" check + CI: Use `github.head_ref` instead of `HEAD` for "recent base" check + book: Add End-of-Support heights for v5.3.3 and v5.4.2 + CI: Remove most usages of `actions-rs` actions + CI: Migrate to `cargo-vet 0.5` + cargo vet prune + CI: Provide `write` permission for `pull-requests` + CI: Check out both the base and PR branches for "recent base" check + Migrate to `zcash_primitives 0.10` + depends: `cxx 1.0.92` + depends: CMake 3.26.0 + depends: Postpone CCache updates again + cargo update + Use `RandomInvalidOutputDescription()` everywhere it makes sense + Merge most `cxx::bridge` definitions into a single bridge + Expand `CppStream` to cover all `Stream`-like C++ types + Migrate `OrchardMerkleFrontier` to use new `CppStream` APIs + build: Tolerate split LLVM versions + Use `cxx` bridge for all Orchard bundle inspection and validation + gtest: Minor improvements to `CoinsTests` + rust: Migrate Ed25519 FFI to `cxx` + Tell `cargo-vet` to ignore patched dependencies + cargo-vet: Regenerate imports + cargo-vet: Switch to Google's aggregated audits + More crate audits + Migrate to published `orchard 0.4` + qa: Fix update checker to handle `native_clang` version format + depends: CMake 3.26.3 + depends: Rust 1.68.2 + depends: `native_zstd 1.5.5` + depends: `cxx 1.0.94` + qa: Postpone dependencies we aren't updating + cargo update + Use published `zcash_primitives 0.11` and `zcash_proofs 0.11` + test: Avoid generating a chain fork in `mempool_packages` RPC test + test: Sync blocks before invalidating them in `mempool_packages` RPC test + depends: Boost 1.82.0 + qa: Postpone Clang 16.0.2 + cargo update + depends: Rust 1.69.0 + make-release.py: Versioning changes for 5.5.0-rc1. + make-release.py: Updated manpages for 5.5.0-rc1. + make-release.py: Updated release notes and changelog for 5.5.0-rc1. + make-release.py: Updated book for 5.5.0-rc1. + CI: Add a GitHub Actions workflow that builds zcashd for platform tiers + CI: Add caching to build workflow + depends: Ensure `native_cxxbridge` source is fetched for `rustcxx` + depends: Don't build BDB utilities on macOS + depends: Remove Fortran and LLDB components from staged `native_clang` + CI: Build with `--with-libs`, `--disable-wallet`, and `--disable-mining` + Fix `make-release.py` to write correct halt height into book + Update v5.5.0 release notes + build: Fix MinGW cross-compilation with `--disable-wallet` + make-release.py: Versioning changes for 5.5.0-rc2. + make-release.py: Updated manpages for 5.5.0-rc2. + +Kris Nuttycombe (26): + Fix potential path or symlink traversal + Add a docker-compose.yml for prometheus/grafana metrics collection. + Apply suggestions from code review + Make all CCoinsView methods pure-virtual. + Remove `FakeCoinsViewDB` as it is identical to `CCoinsViewDummy` + Postpone dependency updates. + make-release.py: Versioning changes for 5.3.3. + make-release.py: Updated manpages for 5.3.3. + make-release.py: Updated release notes and changelog for 5.3.3. + Set urgency to `high` in Debian changelog. + Add information about deprecated features to `deprecationinfo` results. + Apply suggestions from code review + Add a wallet-aware transaction builder. + Use WalletTxBuilder for z_sendmany + Allow selectors to require transparent coinbase + Fix a longstanding zcashd build warning + Fix `make distclean` to recursively remove `rust/gen` + Improve const-ness of CChainParams retrieval by network ID + Explicitly provide CChainParams to `EnforceNodeDeprecation` + revert broken "safe extract" functionality in golden tests. + Refactor RPC privacyPolicy handling + Update to use the `ff 0.13` dependency stack. + Add `AllowRevealedSenders` to fix `mempool_nu_activation.py` + Calculate convential fee in `CreateTransaction` before stripping sigs. + Fix formating of money strings. + Use the conventional fee for prioritisation in prioritisetransactions.py + +Luke Dashjr (1): + RPC/Mining: Restore API compatibility for prioritisetransaction + +Marco Falke (1): + wallet: Remove sendfree + +Marius Kjærstad (2): + New checkpoint at block 2000000 for mainnet + Update estimated number of transactions due to Blossom NU + +Miodrag Popović (2): + Fix for broken cross-build to Windows target on Ubuntu 22.04 and Debian 11 + Update depends/hosts/mingw32.mk to use posix variant library path + +Sean Bowe (1): + Add additional audits. + +Suhas Daftuar (4): + Add tags to mempool's mapTx indices + Fix mempool limiting for PrioritiseTransaction + Use fee deltas for determining mempool acceptance + Remove GetMinRelayFee + +TrellixVulnTeam (1): + Adding tarfile member sanitization to extractall() + +Wladimir J. van der Laan (1): + Merge #7730: Remove priority estimation + +Yasser Isa (1): + DOWNLOAD_URL dynamic in fetch-params.sh + +cronicc (1): + Fix Horizen Security contact email + +instagibbs (2): + Gave miner test values constants for less error-prone values. + Corrected values + +sasha (6): + Partially revert PR #6384, but only for URLs using a git commit hash + Download `native_cctools` and its `libtapi` to meaningful filenames + Better error messages if proof parameters aren't loaded + Enable the (existing) custom error message for the invalid checksum case + Re-download parameters if they already exist but don't have correct sums + Alias Sasha->sasha in release-notes.py to avoid authors.md split + +Jack Grigg (4): + Improvements to code comments + Adjust documentation + z_mergetoaddress: Include Sapling output padding in size estimate + test: Fix copyright years in new RPC tests + +teor (1): + Replace custom zcash_script TxInputStream with RustDataStream + diff --git a/doc/release-notes/release-notes-5.5.0-rc3.md b/doc/release-notes/release-notes-5.5.0-rc3.md new file mode 100644 index 000000000..3dadc1f19 --- /dev/null +++ b/doc/release-notes/release-notes-5.5.0-rc3.md @@ -0,0 +1,467 @@ +Notable changes +=============== + +RPC Changes +----------- + +- `getdeprecationinfo` has several changes: + - It now returns additional information about currently deprecated and + disabled features. + - A new `end_of_service` object that contains both the block height for + end-of-service and the estimated time that the end-of-service halt is + expected to occur. Note that this time is just an approximation and + will change over time as the end-of-service block height approaches, + due to the variability in block times. The + `end_of_service` object is intended to replace the `deprecationheight` + field; see the [Deprecations](#deprecations) section for additional detail. + - This RPC method was previously only available for mainnet nodes; it is now + also available for testnet and regtest nodes, in which case it does not + return end-of-service halt information (as testnet and regtest nodes do not + have an end-of-service halt feature.) +- Several `z_sendmany`, `z_shieldcoinbase` and `z_mergetoaddress` failures have + moved from synchronous to asynchronous, so while you should already be + checking the async operation status, there are now more cases that may trigger + failure at that stage. +- The `AllowRevealedRecipients` privacy policy is now required in order to choose a + transparent change address for a transaction. This will only occur when the wallet + is unable to construct the transaction without selecting funds from the transparent + pool, so the impact of this change is that for such transactions, the user must specify + `AllowFullyTransparent`. +- The `z_shieldcoinbase` RPC method now supports an optional memo. +- The `z_shieldcoinbase` and `z_mergetoaddress` RPC methods now support an + optional privacy policy. +- The `z_mergetoaddress` RPC method can now merge _to_ UAs and can also send + between different shielded pools (when `AllowRevealedAmounts` is specified). +- The `estimatepriority` RPC call has been removed. +- The `priority_delta` argument to the `prioritisetransaction` RPC call now has + no effect and must be set to a dummy value (0 or null). + +Changes to Transaction Fee Selection +------------------------------------ + +- The zcashd wallet now uses the conventional transaction fee calculated according + to [ZIP 317](https://zips.z.cash/zip-0317) by default. This conventional fee + will be used unless a fee is explicitly specified in an RPC call, or for the + wallet's legacy transaction creation APIs (`sendtoaddress`, `sendmany`, and + `fundrawtransaction`) when the `-paytxfee` option is set. +- The `-mintxfee` and `-sendfreetransactions` options have been removed. These + options previously instructed the legacy transaction creation APIs to increase + fees to this limit and to use a zero fee for "small" transactions that spend + "old" inputs, respectively. They will now cause a warning on node startup if + used. + + +Changes to Block Template Construction +-------------------------------------- + +We now use a new block template construction algorithm documented in +[ZIP 317](https://zips.z.cash/zip-0317#recommended-algorithm-for-block-template-construction). + +- This algorithm no longer favours transactions that were previously considered + "high priority" because they spent older inputs. The `-blockprioritysize` config + option, which configured the portion of the block reserved for these transactions, + has been removed and will now cause a warning if used. +- The `-blockminsize` option, which configured the size of a portion of the block + to be filled regardless of transaction fees or priority, has also been removed + and will cause a warning if used. +- A `-blockunpaidactionlimit` option has been added to control the limit on + "unpaid actions" that will be accepted in a block for transactions paying less + than the ZIP 317 fee. This defaults to 50. + +Change to Transaction Relay Policy +---------------------------------- + +The allowance for "free transactions" in mempool acceptance and relay has been +removed. All transactions must pay at least the minimum relay threshold, currently +100 zatoshis per 1000 bytes up to a maximum of 1000 zatoshis, in order to be +accepted and relayed. (Individual nodes can change this using `-minrelaytxfee` +but in practice the network default needs to be adhered to.) This policy is under +review and [might be made stricter](https://zips.z.cash/zip-0317#transaction-relaying); +if that happens then the ZIP 317 conventional fee will still be sufficient for +mempool acceptance and relay. + +Removal of Priority Estimation +------------------------------ + +Estimation of "priority" needed for a transaction to be included within a target +number of blocks, and the associated `estimatepriority` RPC call, have been +removed. The format for `fee_estimates.dat` has also changed to no longer save +these priority estimates. It will automatically be converted to the new format +which is not readable by prior versions of the software. The `-txconfirmtarget` +config option is now obsolete and has also been removed. It will cause a +warning if used. + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `deprecationinfo_deprecationheight`: The `deprecationheight` field of + `getdeprecationinfo` has been deprecated and replaced by the `end_of_service` + object. + +Changelog +========= + +ANISH M (3): + use SOURCES_PATH instead of local git DEPENDS_SOURCES_DIR + report the git-derived version in metrics screen + Update src/metrics.cpp by removing v prefix. + +Alex Morcos (14): + Refactor CreateNewBlock to be a method of the BlockAssembler class + FIX: Account for txs already added to block in addPriorityTxs + FIX: correctly measure size of priority block + [rpc] Remove estimatepriority. + [mining] Remove -blockprioritysize. + [debug] Change -printpriority option + [cleanup] Remove estimatePriority + [rpc] sendrawtransaction no longer bypasses minRelayTxFee + [test] Remove priority from tests + [rpc] Remove priority information from mempool RPC calls + [rpc] Remove priorityDelta from prioritisetransaction + [cleanup] Remove coin age priority completely. + Allow setting minrelaytxfee to 0 + Update example zcash.conf + +Charlie O'Keefe (1): + Add reference in Makefile.am to zip317.h + +Daira Emma Hopwood (38): + Remove unnecessary #include. + Adjust indentation to be consistent without changing existing code. + Repair show_help RPC test. + Fix bit-rotted code in miner tests. + Implement ZIP 317 computations. + `cargo update` + Add audits for updates to futures-* 0.3.28 and redjubjub 0.7.0. + Add `examine`, a wrapper around `std::visit` that reverses the arguments. + Use the new `examine` macro to replace all instances of `std::visit(match {...}, specimen)`, improving code readability. + Refactoring to avoid duplicated code. + Refactoring to avoid an unnecessary temporary. + Refactor that avoids using exceptions for local flow control and is simpler. + Correct the documentation of `-rpcconnect` in the example `zcash.conf`. `-rpcconnect` is only used by `zcash-cli`. + Change ZIP 401 mempool limiting to use conventional fee. + Change ZIP 401 mempool limiting to use constants decided in zcash/zips#565. + Warn on node startup if the removed `-blockprioritysize` option is set to a non-zero value. + Log (at the mempool DEBUG level) when a transaction cannot be accepted to the mempool because its modified fee is below the minimum relay fee. + Fix the dust threshold rate to three times 100 zats/1000 bytes. (We express it that way rather than 300 zats/1000 bytes, because the threshold is always rounded to an integer and then multiplied by 3.) + Fix some messages, comments, and documentation that: * used "fee" to mean "fee rate", "kB" to mean 1000 bytes, "satoshis" to mean zatoshis, or that incorrectly used "BTC" in place of "ZEC"; * used obsolete concepts such as "zero fee" or "free transaction"; or * did not accurately document their applicability. + Fix tests that failed due to the minimum relay fee being enforced. + Fix miner_tests btest. + Fix mempool_packages and prioritisetransaction RPC tests. + Implement `GetUnpaidActionCount` and `GetWeightRatio` for ZIP 317. + ZIP 317 block construction algorithm. This breaks tests which are repaired in subsequent commits. + Add assertions that `GetRandInt*` functions are called with `nMax >= 0`. All existing uses have been checked to ensure they are consistent with this assertion. + Repair `miner_tests.py` btest. + Repair some RPC tests. + mergetoaddress_helper.py: Use `generate_and_check` helper to mine a block and make sure that it contains the expected number of transactions. + mergetoaddress_helper.py: use Decimal for amounts and integers otherwise. + Remove the implementation of score-based block template construction and the `-blockminsize` option. + Add a `-blockunpaidactionlimit` config option to configure the per-block limit on unpaid actions for ZIP 317 block template construction. + miner_tests.cpp improvements. + random.h documentation improvements. + Fix/suppress clippy warnings. + Improve the `show_help.py` RPC test to include `-help-debug` (needed to test the help change in the next commit). + Improve `-printpriority` output to log the modified fee, conventional fee, size, logical action count, and unpaid action count. This reflects the changes to use the ZIP 317 block construction algorithm and de-emphasise fee rate. + Fix a build regression if `--disable-mining` is selected. + Fix a build regression if both `--disable-mining` and `--disable-wallet` are selected. + +Daira Hopwood (9): + Use a more recent URL format for GitHub release archives. + Clarify that patches to a dependency are under the same license as that dependency. + Update copyright date and email for tl_expected. + Use the same convention for the tl_expected download files as for native_cctools + Refactoring to split the weighted tx tree out of mempool_limit.{cpp,h} and make it more reusable. + Minor optimization to weighted_map::remove + This PR doesn't bring in any ZIP 317 changes yet + Another minor optimization + Change spelling of prioritisation in an error message + +DeckerSU (1): + InsertBlockIndex: pass const reference on hash, instead of hash + +Dimitris Apostolou (3): + Fix typo + Update documentation link + Fix typos + +Evan Klitzke (1): + Fix automake warnings when running autogen.sh + +Greg Pfeil (89): + Show in-progress tests when rpc-tests is interrupted + Make extra newline more explicit + Apply suggestions from code review + Make pool selection order more flexible + Simplify diversifier_index_t handling + Update tests for async z_sendmany + Limit UTXOs + Some orchard fixes for wallet_tx_builder + Return anchorHeight from ResolveInputsAndPayments + Refactoring InsufficientFundsError + Ensure we don’t make Orchard change pre-NU5 + Test updates for z_sendmany WalletTxBuilder changes + Fix weakened privacy policy for transparent change + Fix some overly-strict privacy policies in btest + Apply suggestions from code review + Unify requireTransparentCoinbase handling + Rename `Get*Balance` to `Get*Total` + Remove changes that aren’t needed by z_sendmany + Improve GetRequiredPrivacyPolicy + Add release notes for (a)sync z_sendmany changes + Assert that we get a change addr for any selector + Don’t pass PrivacyPolicy to selector constructor + Address comments on WalletTxBuilder introduction + Make RPC test output more deterministic + Update WalletTxBuilder based on review + Clarify `AddressResolutionError` + Don’t permit user-provided “internal” payments + Address WalletTxBuilder PR feedback + Ensure that a WalletTxBuilder tx balances + Additional z_sendmany test cases + Address WalletTxBuilder review feedback + Apply suggestions for WalletTxBuilder from code review + Simplify SelectOVKs + Have GetRecipientPools return a copy + Remove CWallet member from WalletTxBuilder + Improve taddr no-memo check + Update src/wallet/rpcwallet.cpp + Lock notes (except Orchard) in wallet_tx_builder + Improve Doxygen for note locking + Require `AllowRevealedRecipients` for t-change + Update release-notes for transparent change restriction + Correct EditorConfig for Makefiles + Split C++ generated from Rust into own lib + Simplify canResolveOrchard logic + Support ZIP 317 fees in the zcashd wallet + Correct change handling for ZIP 317 fees + Address review feedback re: ZIP 317 in wallet + Revert "Add `AllowRevealedSenders` to fix `mempool_nu_activation.py`" + Eliminate LegacyCompat–ZTXOSelector cycle + Simplify client.cpp + Enrich zcash-cli arg conversion + Better messages on client-side zcash-cli errors + Fix accidental reversion of #6409 + Remove unnecessary explicit privacy policy + Use examine instead of std::visit + Simplify some vector initialization + Fix edge case revealed by #6409 + Rename Arg* to Param + Adjust wallet absurd fee check for ZIP 317 + Address review feedback for ZIP 317 fees in wallet + Address more ZIP 317 fee feedback + Fix zcash-cli crash when printing help message + Use null as the ZIP 317 fee sentinel instead of -1 + Add z_sendmany RPC examples with fee field + Have z_shieldcoinbase use WalletTxBuilder + Address review feedback on z_shieldcoinbase + Fix an incorrect error message in a test + Minor improvements to z_shieldcoinbase + Support ZIP 317 fees for legacy wallet operations + Remove `-mintxfee` config option + Address review comments re: legacy wallet ZIP 317 + Remove `-txconfirmtarget` config option + Restore previous `-maxtxfee` bound + Correct -maxtxfee lower bound diagnostic messages + WalletTxBuilder support for net payments + fixup! WalletTxBuilder support for net payments + Don’t test “Insufficient funds” for `z_shieldcoinbase` + Update z_mergetoaddress to use WalletTxBuilder + Many z_mergetoaddress updates + Avoid extra copy in ResolveInputsAndPayments + Address z_mergetoaddress review feedback + Allow explicit “no memo” in z_mergetoaddress + Add `memo` parameter to `z_shieldcoinbase` + Support UA destinations in `z_mergetoaddress` + Include Orchard dest in z_mergetoaddress estimation + Update release notes + Support privacyPolicy parameters in zcash-cli + Treat "F6" in RPC calls as if no memo were provided + Support nullable strings in `zcash-cli` + +Jack Grigg (92): + rust: Add `cxx` version of `RustStream` + rust: Migrate `OrchardMerkleFrontier` to `cxx` + CreateNewBlock: Leave more space for Orchard shielded coinbase + Retroactively enable ZIP 216 before NU5 activation + rust: Compile with ThinLTO + depends: Update Rust to 1.67.1 + depends: Update Clang / libcxx to LLVM 15.0.6 + Fix 1.67.1 clippy lints + depends: Evaluate `native_packages` before `packages` + qa: Fix year in postponement lines + qa: Fix `google/leveldb` tag parsing in `updatecheck.py` + qa: Handle commit IDs correctly to `updatecheck.py` + depends: `cxx 1.0.91` + depends: `native_zstd 1.5.4` + `cargo vet regenerate imports` + qa: Import Rust crate audits from ISRG + `cargo update` + qa: Postpone LevelDB 1.23 + book: Add page with release support details and EoS halt heights + Update release support book page in release process + depends: Update Rust to 1.68.0 + qa: Replace Firefox audits with aggregated Mozilla audits in registry + qa: Import Rust crate audits from ChromeOS + Move `fEnableAddrTypeField` outside `ENABLE_WALLET` + `s/string/std::string` in `init.cpp` + CI: Check that the PR branch has a sufficiently recent base for Tekton + CI: Fix permissions for Checks workflow + Add `CChainParams::RustNetwork` + wallet: Consolidate `CWalletTx` Sapling output decryption methods + wallet: Use `zcash_note_encryption` in `CWalletTx::DecryptSaplingNote` + wallet: Use `CWalletTx::DecryptSaplingNote` in more places + wallet: Use `zcash_note_encryption` in `CWallet::FindMySaplingNotes` + wallet: Use `zcash_note_encryption` in `CWalletTx::RecoverSaplingNote` + wallet: Remove recipient-side `SaplingNotePlaintext::decrypt` + CI: Fetch all history for "recent base" check + CI: Include explicit `failure()` condition in "recent base" check + CI: Use `github.head_ref` instead of `HEAD` for "recent base" check + book: Add End-of-Support heights for v5.3.3 and v5.4.2 + CI: Remove most usages of `actions-rs` actions + CI: Migrate to `cargo-vet 0.5` + cargo vet prune + CI: Provide `write` permission for `pull-requests` + CI: Check out both the base and PR branches for "recent base" check + Migrate to `zcash_primitives 0.10` + depends: `cxx 1.0.92` + depends: CMake 3.26.0 + depends: Postpone CCache updates again + cargo update + Use `RandomInvalidOutputDescription()` everywhere it makes sense + Merge most `cxx::bridge` definitions into a single bridge + Expand `CppStream` to cover all `Stream`-like C++ types + Migrate `OrchardMerkleFrontier` to use new `CppStream` APIs + build: Tolerate split LLVM versions + Use `cxx` bridge for all Orchard bundle inspection and validation + gtest: Minor improvements to `CoinsTests` + rust: Migrate Ed25519 FFI to `cxx` + Tell `cargo-vet` to ignore patched dependencies + cargo-vet: Regenerate imports + cargo-vet: Switch to Google's aggregated audits + More crate audits + Migrate to published `orchard 0.4` + qa: Fix update checker to handle `native_clang` version format + depends: CMake 3.26.3 + depends: Rust 1.68.2 + depends: `native_zstd 1.5.5` + depends: `cxx 1.0.94` + qa: Postpone dependencies we aren't updating + cargo update + Use published `zcash_primitives 0.11` and `zcash_proofs 0.11` + test: Avoid generating a chain fork in `mempool_packages` RPC test + test: Sync blocks before invalidating them in `mempool_packages` RPC test + depends: Boost 1.82.0 + qa: Postpone Clang 16.0.2 + cargo update + depends: Rust 1.69.0 + make-release.py: Versioning changes for 5.5.0-rc1. + make-release.py: Updated manpages for 5.5.0-rc1. + make-release.py: Updated release notes and changelog for 5.5.0-rc1. + make-release.py: Updated book for 5.5.0-rc1. + CI: Add a GitHub Actions workflow that builds zcashd for platform tiers + CI: Add caching to build workflow + depends: Ensure `native_cxxbridge` source is fetched for `rustcxx` + depends: Don't build BDB utilities on macOS + depends: Remove Fortran and LLDB components from staged `native_clang` + CI: Build with `--with-libs`, `--disable-wallet`, and `--disable-mining` + Fix `make-release.py` to write correct halt height into book + Update v5.5.0 release notes + build: Fix MinGW cross-compilation with `--disable-wallet` + make-release.py: Versioning changes for 5.5.0-rc2. + make-release.py: Updated manpages for 5.5.0-rc2. + make-release.py: Updated release notes and changelog for 5.5.0-rc2. + make-release.py: Updated book for 5.5.0-rc2. + +Kris Nuttycombe (29): + Fix potential path or symlink traversal + Add a docker-compose.yml for prometheus/grafana metrics collection. + Apply suggestions from code review + Make all CCoinsView methods pure-virtual. + Remove `FakeCoinsViewDB` as it is identical to `CCoinsViewDummy` + Postpone dependency updates. + make-release.py: Versioning changes for 5.3.3. + make-release.py: Updated manpages for 5.3.3. + make-release.py: Updated release notes and changelog for 5.3.3. + Set urgency to `high` in Debian changelog. + Add information about deprecated features to `deprecationinfo` results. + Apply suggestions from code review + Add a wallet-aware transaction builder. + Use WalletTxBuilder for z_sendmany + Allow selectors to require transparent coinbase + Fix a longstanding zcashd build warning + Fix `make distclean` to recursively remove `rust/gen` + Improve const-ness of CChainParams retrieval by network ID + Explicitly provide CChainParams to `EnforceNodeDeprecation` + revert broken "safe extract" functionality in golden tests. + Refactor RPC privacyPolicy handling + Update to use the `ff 0.13` dependency stack. + Add `AllowRevealedSenders` to fix `mempool_nu_activation.py` + Calculate convential fee in `CreateTransaction` before stripping sigs. + Fix formating of money strings. + Use the conventional fee for prioritisation in prioritisetransactions.py + `z_sendmany` now accepts 6 parameters, not 5. + make-release.py: Versioning changes for 5.5.0-rc3. + make-release.py: Updated manpages for 5.5.0-rc3. + +Luke Dashjr (1): + RPC/Mining: Restore API compatibility for prioritisetransaction + +Marco Falke (1): + wallet: Remove sendfree + +Marius Kjærstad (2): + New checkpoint at block 2000000 for mainnet + Update estimated number of transactions due to Blossom NU + +Miodrag Popović (2): + Fix for broken cross-build to Windows target on Ubuntu 22.04 and Debian 11 + Update depends/hosts/mingw32.mk to use posix variant library path + +Sean Bowe (1): + Add additional audits. + +Suhas Daftuar (4): + Add tags to mempool's mapTx indices + Fix mempool limiting for PrioritiseTransaction + Use fee deltas for determining mempool acceptance + Remove GetMinRelayFee + +TrellixVulnTeam (1): + Adding tarfile member sanitization to extractall() + +Wladimir J. van der Laan (1): + Merge #7730: Remove priority estimation + +Yasser Isa (1): + DOWNLOAD_URL dynamic in fetch-params.sh + +cronicc (1): + Fix Horizen Security contact email + +instagibbs (2): + Gave miner test values constants for less error-prone values. + Corrected values + +sasha (6): + Partially revert PR #6384, but only for URLs using a git commit hash + Download `native_cctools` and its `libtapi` to meaningful filenames + Better error messages if proof parameters aren't loaded + Enable the (existing) custom error message for the invalid checksum case + Re-download parameters if they already exist but don't have correct sums + Alias Sasha->sasha in release-notes.py to avoid authors.md split + +Jack Grigg (4): + Improvements to code comments + Adjust documentation + z_mergetoaddress: Include Sapling output padding in size estimate + test: Fix copyright years in new RPC tests + +teor (2): + Replace custom zcash_script TxInputStream with RustDataStream + Change module comment in bridge.rs to doc comment + diff --git a/doc/release-notes/release-notes-5.5.0.md b/doc/release-notes/release-notes-5.5.0.md new file mode 100644 index 000000000..e2b14c59b --- /dev/null +++ b/doc/release-notes/release-notes-5.5.0.md @@ -0,0 +1,479 @@ +Notable changes +=============== + +RPC Changes +----------- + +- `getdeprecationinfo` has several changes: + - It now returns additional information about currently deprecated and + disabled features. + - A new `end_of_service` object that contains both the block height for + end-of-service and the estimated time that the end-of-service halt is + expected to occur. Note that this time is just an approximation and + will change over time as the end-of-service block height approaches, + due to the variability in block times. The + `end_of_service` object is intended to replace the `deprecationheight` + field; see the [Deprecations](#deprecations) section for additional detail. + - This RPC method was previously only available for mainnet nodes; it is now + also available for testnet and regtest nodes, in which case it does not + return end-of-service halt information (as testnet and regtest nodes do not + have an end-of-service halt feature.) +- Several `z_sendmany`, `z_shieldcoinbase` and `z_mergetoaddress` failures have + moved from synchronous to asynchronous, so while you should already be + checking the async operation status, there are now more cases that may trigger + failure at that stage. +- The `AllowRevealedRecipients` privacy policy is now required in order to choose a + transparent change address for a transaction. This will only occur when the wallet + is unable to construct the transaction without selecting funds from the transparent + pool, so the impact of this change is that for such transactions, the user must specify + `AllowFullyTransparent`. +- The `z_shieldcoinbase` RPC method now supports an optional memo. +- The `z_shieldcoinbase` and `z_mergetoaddress` RPC methods now support an + optional privacy policy. +- The `z_mergetoaddress` RPC method can now merge _to_ UAs and can also send + between different shielded pools (when `AllowRevealedAmounts` is specified). +- The `estimatepriority` RPC call has been removed. +- The `priority_delta` argument to the `prioritisetransaction` RPC call now has + no effect and must be set to a dummy value (0 or null). + +Changes to Transaction Fee Selection +------------------------------------ + +- The zcashd wallet now uses the conventional transaction fee calculated according + to [ZIP 317](https://zips.z.cash/zip-0317) by default. This conventional fee + will be used unless a fee is explicitly specified in an RPC call, or for the + wallet's legacy transaction creation APIs (`sendtoaddress`, `sendmany`, and + `fundrawtransaction`) when the `-paytxfee` option is set. +- The `-mintxfee` and `-sendfreetransactions` options have been removed. These + options previously instructed the legacy transaction creation APIs to increase + fees to this limit and to use a zero fee for "small" transactions that spend + "old" inputs, respectively. They will now cause a warning on node startup if + used. + + +Changes to Block Template Construction +-------------------------------------- + +We now use a new block template construction algorithm documented in +[ZIP 317](https://zips.z.cash/zip-0317#recommended-algorithm-for-block-template-construction). + +- This algorithm no longer favours transactions that were previously considered + "high priority" because they spent older inputs. The `-blockprioritysize` config + option, which configured the portion of the block reserved for these transactions, + has been removed and will now cause a warning if used. +- The `-blockminsize` option, which configured the size of a portion of the block + to be filled regardless of transaction fees or priority, has also been removed + and will cause a warning if used. +- A `-blockunpaidactionlimit` option has been added to control the limit on + "unpaid actions" that will be accepted in a block for transactions paying less + than the ZIP 317 fee. This defaults to 50. + +Change to Transaction Relay Policy +---------------------------------- + +The allowance for "free transactions" in mempool acceptance and relay has been +removed. All transactions must pay at least the minimum relay threshold, currently +100 zatoshis per 1000 bytes up to a maximum of 1000 zatoshis, in order to be +accepted and relayed. (Individual nodes can change this using `-minrelaytxfee` +but in practice the network default needs to be adhered to.) This policy is under +review and [might be made stricter](https://zips.z.cash/zip-0317#transaction-relaying); +if that happens then the ZIP 317 conventional fee will still be sufficient for +mempool acceptance and relay. + +Removal of Priority Estimation +------------------------------ + +Estimation of "priority" needed for a transaction to be included within a target +number of blocks, and the associated `estimatepriority` RPC call, have been +removed. The format for `fee_estimates.dat` has also changed to no longer save +these priority estimates. It will automatically be converted to the new format +which is not readable by prior versions of the software. The `-txconfirmtarget` +config option is now obsolete and has also been removed. It will cause a +warning if used. + +[Deprecations](https://zcash.github.io/zcash/user/deprecation.html) +-------------- + +The following features have been deprecated, but remain available by default. +These features may be disabled by setting `-allowdeprecated=none`. 18 weeks +after this release, these features will be disabled by default and the following +flags to `-allowdeprecated` will be required to permit their continued use: + +- `deprecationinfo_deprecationheight`: The `deprecationheight` field of + `getdeprecationinfo` has been deprecated and replaced by the `end_of_service` + object. + +Changelog +========= + +ANISH M (3): + use SOURCES_PATH instead of local git DEPENDS_SOURCES_DIR + report the git-derived version in metrics screen + Update src/metrics.cpp by removing v prefix. + +Alex Morcos (14): + Refactor CreateNewBlock to be a method of the BlockAssembler class + FIX: Account for txs already added to block in addPriorityTxs + FIX: correctly measure size of priority block + [rpc] Remove estimatepriority. + [mining] Remove -blockprioritysize. + [debug] Change -printpriority option + [cleanup] Remove estimatePriority + [rpc] sendrawtransaction no longer bypasses minRelayTxFee + [test] Remove priority from tests + [rpc] Remove priority information from mempool RPC calls + [rpc] Remove priorityDelta from prioritisetransaction + [cleanup] Remove coin age priority completely. + Allow setting minrelaytxfee to 0 + Update example zcash.conf + +Charlie O'Keefe (1): + Add reference in Makefile.am to zip317.h + +Daira Emma Hopwood (38): + Remove unnecessary #include. + Adjust indentation to be consistent without changing existing code. + Repair show_help RPC test. + Fix bit-rotted code in miner tests. + Implement ZIP 317 computations. + `cargo update` + Add audits for updates to futures-* 0.3.28 and redjubjub 0.7.0. + Add `examine`, a wrapper around `std::visit` that reverses the arguments. + Use the new `examine` macro to replace all instances of `std::visit(match {...}, specimen)`, improving code readability. + Refactoring to avoid duplicated code. + Refactoring to avoid an unnecessary temporary. + Refactor that avoids using exceptions for local flow control and is simpler. + Correct the documentation of `-rpcconnect` in the example `zcash.conf`. `-rpcconnect` is only used by `zcash-cli`. + Change ZIP 401 mempool limiting to use conventional fee. + Change ZIP 401 mempool limiting to use constants decided in zcash/zips#565. + Warn on node startup if the removed `-blockprioritysize` option is set to a non-zero value. + Log (at the mempool DEBUG level) when a transaction cannot be accepted to the mempool because its modified fee is below the minimum relay fee. + Fix the dust threshold rate to three times 100 zats/1000 bytes. (We express it that way rather than 300 zats/1000 bytes, because the threshold is always rounded to an integer and then multiplied by 3.) + Fix some messages, comments, and documentation that: * used "fee" to mean "fee rate", "kB" to mean 1000 bytes, "satoshis" to mean zatoshis, or that incorrectly used "BTC" in place of "ZEC"; * used obsolete concepts such as "zero fee" or "free transaction"; or * did not accurately document their applicability. + Fix tests that failed due to the minimum relay fee being enforced. + Fix miner_tests btest. + Fix mempool_packages and prioritisetransaction RPC tests. + Implement `GetUnpaidActionCount` and `GetWeightRatio` for ZIP 317. + ZIP 317 block construction algorithm. This breaks tests which are repaired in subsequent commits. + Add assertions that `GetRandInt*` functions are called with `nMax >= 0`. All existing uses have been checked to ensure they are consistent with this assertion. + Repair `miner_tests.py` btest. + Repair some RPC tests. + mergetoaddress_helper.py: Use `generate_and_check` helper to mine a block and make sure that it contains the expected number of transactions. + mergetoaddress_helper.py: use Decimal for amounts and integers otherwise. + Remove the implementation of score-based block template construction and the `-blockminsize` option. + Add a `-blockunpaidactionlimit` config option to configure the per-block limit on unpaid actions for ZIP 317 block template construction. + miner_tests.cpp improvements. + random.h documentation improvements. + Fix/suppress clippy warnings. + Improve the `show_help.py` RPC test to include `-help-debug` (needed to test the help change in the next commit). + Improve `-printpriority` output to log the modified fee, conventional fee, size, logical action count, and unpaid action count. This reflects the changes to use the ZIP 317 block construction algorithm and de-emphasise fee rate. + Fix a build regression if `--disable-mining` is selected. + Fix a build regression if both `--disable-mining` and `--disable-wallet` are selected. + +Daira Hopwood (10): + Use a more recent URL format for GitHub release archives. + Clarify that patches to a dependency are under the same license as that dependency. + Update copyright date and email for tl_expected. + Use the same convention for the tl_expected download files as for native_cctools + Refactoring to split the weighted tx tree out of mempool_limit.{cpp,h} and make it more reusable. + Minor optimization to weighted_map::remove + This PR doesn't bring in any ZIP 317 changes yet + Another minor optimization + Change spelling of prioritisation in an error message + Correction "height" -> "time" in release notes + +DeckerSU (1): + InsertBlockIndex: pass const reference on hash, instead of hash + +Dimitris Apostolou (3): + Fix typo + Update documentation link + Fix typos + +Evan Klitzke (1): + Fix automake warnings when running autogen.sh + +Greg Pfeil (89): + Show in-progress tests when rpc-tests is interrupted + Make extra newline more explicit + Apply suggestions from code review + Make pool selection order more flexible + Simplify diversifier_index_t handling + Update tests for async z_sendmany + Limit UTXOs + Some orchard fixes for wallet_tx_builder + Return anchorHeight from ResolveInputsAndPayments + Refactoring InsufficientFundsError + Ensure we don’t make Orchard change pre-NU5 + Test updates for z_sendmany WalletTxBuilder changes + Fix weakened privacy policy for transparent change + Fix some overly-strict privacy policies in btest + Apply suggestions from code review + Unify requireTransparentCoinbase handling + Rename `Get*Balance` to `Get*Total` + Remove changes that aren’t needed by z_sendmany + Improve GetRequiredPrivacyPolicy + Add release notes for (a)sync z_sendmany changes + Assert that we get a change addr for any selector + Don’t pass PrivacyPolicy to selector constructor + Address comments on WalletTxBuilder introduction + Make RPC test output more deterministic + Update WalletTxBuilder based on review + Clarify `AddressResolutionError` + Don’t permit user-provided “internal” payments + Address WalletTxBuilder PR feedback + Ensure that a WalletTxBuilder tx balances + Additional z_sendmany test cases + Address WalletTxBuilder review feedback + Apply suggestions for WalletTxBuilder from code review + Simplify SelectOVKs + Have GetRecipientPools return a copy + Remove CWallet member from WalletTxBuilder + Improve taddr no-memo check + Update src/wallet/rpcwallet.cpp + Lock notes (except Orchard) in wallet_tx_builder + Improve Doxygen for note locking + Require `AllowRevealedRecipients` for t-change + Update release-notes for transparent change restriction + Correct EditorConfig for Makefiles + Split C++ generated from Rust into own lib + Simplify canResolveOrchard logic + Support ZIP 317 fees in the zcashd wallet + Correct change handling for ZIP 317 fees + Address review feedback re: ZIP 317 in wallet + Revert "Add `AllowRevealedSenders` to fix `mempool_nu_activation.py`" + Eliminate LegacyCompat–ZTXOSelector cycle + Simplify client.cpp + Enrich zcash-cli arg conversion + Better messages on client-side zcash-cli errors + Fix accidental reversion of #6409 + Remove unnecessary explicit privacy policy + Use examine instead of std::visit + Simplify some vector initialization + Fix edge case revealed by #6409 + Rename Arg* to Param + Adjust wallet absurd fee check for ZIP 317 + Address review feedback for ZIP 317 fees in wallet + Address more ZIP 317 fee feedback + Fix zcash-cli crash when printing help message + Use null as the ZIP 317 fee sentinel instead of -1 + Add z_sendmany RPC examples with fee field + Have z_shieldcoinbase use WalletTxBuilder + Address review feedback on z_shieldcoinbase + Fix an incorrect error message in a test + Minor improvements to z_shieldcoinbase + Support ZIP 317 fees for legacy wallet operations + Remove `-mintxfee` config option + Address review comments re: legacy wallet ZIP 317 + Remove `-txconfirmtarget` config option + Restore previous `-maxtxfee` bound + Correct -maxtxfee lower bound diagnostic messages + WalletTxBuilder support for net payments + fixup! WalletTxBuilder support for net payments + Don’t test “Insufficient funds” for `z_shieldcoinbase` + Update z_mergetoaddress to use WalletTxBuilder + Many z_mergetoaddress updates + Avoid extra copy in ResolveInputsAndPayments + Address z_mergetoaddress review feedback + Allow explicit “no memo” in z_mergetoaddress + Add `memo` parameter to `z_shieldcoinbase` + Support UA destinations in `z_mergetoaddress` + Include Orchard dest in z_mergetoaddress estimation + Update release notes + Support privacyPolicy parameters in zcash-cli + Treat "F6" in RPC calls as if no memo were provided + Support nullable strings in `zcash-cli` + +Jack Grigg (92): + rust: Add `cxx` version of `RustStream` + rust: Migrate `OrchardMerkleFrontier` to `cxx` + CreateNewBlock: Leave more space for Orchard shielded coinbase + Retroactively enable ZIP 216 before NU5 activation + rust: Compile with ThinLTO + depends: Update Rust to 1.67.1 + depends: Update Clang / libcxx to LLVM 15.0.6 + Fix 1.67.1 clippy lints + depends: Evaluate `native_packages` before `packages` + qa: Fix year in postponement lines + qa: Fix `google/leveldb` tag parsing in `updatecheck.py` + qa: Handle commit IDs correctly to `updatecheck.py` + depends: `cxx 1.0.91` + depends: `native_zstd 1.5.4` + `cargo vet regenerate imports` + qa: Import Rust crate audits from ISRG + `cargo update` + qa: Postpone LevelDB 1.23 + book: Add page with release support details and EoS halt heights + Update release support book page in release process + depends: Update Rust to 1.68.0 + qa: Replace Firefox audits with aggregated Mozilla audits in registry + qa: Import Rust crate audits from ChromeOS + Move `fEnableAddrTypeField` outside `ENABLE_WALLET` + `s/string/std::string` in `init.cpp` + CI: Check that the PR branch has a sufficiently recent base for Tekton + CI: Fix permissions for Checks workflow + Add `CChainParams::RustNetwork` + wallet: Consolidate `CWalletTx` Sapling output decryption methods + wallet: Use `zcash_note_encryption` in `CWalletTx::DecryptSaplingNote` + wallet: Use `CWalletTx::DecryptSaplingNote` in more places + wallet: Use `zcash_note_encryption` in `CWallet::FindMySaplingNotes` + wallet: Use `zcash_note_encryption` in `CWalletTx::RecoverSaplingNote` + wallet: Remove recipient-side `SaplingNotePlaintext::decrypt` + CI: Fetch all history for "recent base" check + CI: Include explicit `failure()` condition in "recent base" check + CI: Use `github.head_ref` instead of `HEAD` for "recent base" check + book: Add End-of-Support heights for v5.3.3 and v5.4.2 + CI: Remove most usages of `actions-rs` actions + CI: Migrate to `cargo-vet 0.5` + cargo vet prune + CI: Provide `write` permission for `pull-requests` + CI: Check out both the base and PR branches for "recent base" check + Migrate to `zcash_primitives 0.10` + depends: `cxx 1.0.92` + depends: CMake 3.26.0 + depends: Postpone CCache updates again + cargo update + Use `RandomInvalidOutputDescription()` everywhere it makes sense + Merge most `cxx::bridge` definitions into a single bridge + Expand `CppStream` to cover all `Stream`-like C++ types + Migrate `OrchardMerkleFrontier` to use new `CppStream` APIs + build: Tolerate split LLVM versions + Use `cxx` bridge for all Orchard bundle inspection and validation + gtest: Minor improvements to `CoinsTests` + rust: Migrate Ed25519 FFI to `cxx` + Tell `cargo-vet` to ignore patched dependencies + cargo-vet: Regenerate imports + cargo-vet: Switch to Google's aggregated audits + More crate audits + Migrate to published `orchard 0.4` + qa: Fix update checker to handle `native_clang` version format + depends: CMake 3.26.3 + depends: Rust 1.68.2 + depends: `native_zstd 1.5.5` + depends: `cxx 1.0.94` + qa: Postpone dependencies we aren't updating + cargo update + Use published `zcash_primitives 0.11` and `zcash_proofs 0.11` + test: Avoid generating a chain fork in `mempool_packages` RPC test + test: Sync blocks before invalidating them in `mempool_packages` RPC test + depends: Boost 1.82.0 + qa: Postpone Clang 16.0.2 + cargo update + depends: Rust 1.69.0 + make-release.py: Versioning changes for 5.5.0-rc1. + make-release.py: Updated manpages for 5.5.0-rc1. + make-release.py: Updated release notes and changelog for 5.5.0-rc1. + make-release.py: Updated book for 5.5.0-rc1. + CI: Add a GitHub Actions workflow that builds zcashd for platform tiers + CI: Add caching to build workflow + depends: Ensure `native_cxxbridge` source is fetched for `rustcxx` + depends: Don't build BDB utilities on macOS + depends: Remove Fortran and LLDB components from staged `native_clang` + CI: Build with `--with-libs`, `--disable-wallet`, and `--disable-mining` + Fix `make-release.py` to write correct halt height into book + Update v5.5.0 release notes + build: Fix MinGW cross-compilation with `--disable-wallet` + make-release.py: Versioning changes for 5.5.0-rc2. + make-release.py: Updated manpages for 5.5.0-rc2. + make-release.py: Updated release notes and changelog for 5.5.0-rc2. + make-release.py: Updated book for 5.5.0-rc2. + +Kris Nuttycombe (33): + Fix potential path or symlink traversal + Add a docker-compose.yml for prometheus/grafana metrics collection. + Apply suggestions from code review + Make all CCoinsView methods pure-virtual. + Remove `FakeCoinsViewDB` as it is identical to `CCoinsViewDummy` + Postpone dependency updates. + make-release.py: Versioning changes for 5.3.3. + make-release.py: Updated manpages for 5.3.3. + make-release.py: Updated release notes and changelog for 5.3.3. + Set urgency to `high` in Debian changelog. + Add information about deprecated features to `deprecationinfo` results. + Apply suggestions from code review + Add a wallet-aware transaction builder. + Use WalletTxBuilder for z_sendmany + Allow selectors to require transparent coinbase + Fix a longstanding zcashd build warning + Fix `make distclean` to recursively remove `rust/gen` + Improve const-ness of CChainParams retrieval by network ID + Explicitly provide CChainParams to `EnforceNodeDeprecation` + revert broken "safe extract" functionality in golden tests. + Refactor RPC privacyPolicy handling + Update to use the `ff 0.13` dependency stack. + Add `AllowRevealedSenders` to fix `mempool_nu_activation.py` + Calculate convential fee in `CreateTransaction` before stripping sigs. + Fix formating of money strings. + Use the conventional fee for prioritisation in prioritisetransactions.py + `z_sendmany` now accepts 6 parameters, not 5. + make-release.py: Versioning changes for 5.5.0-rc3. + make-release.py: Updated manpages for 5.5.0-rc3. + make-release.py: Updated release notes and changelog for 5.5.0-rc3. + make-release.py: Updated book for 5.5.0-rc3. + make-release.py: Versioning changes for 5.5.0. + make-release.py: Updated manpages for 5.5.0. + +Luke Dashjr (1): + RPC/Mining: Restore API compatibility for prioritisetransaction + +Marco Falke (1): + wallet: Remove sendfree + +Marius Kjærstad (2): + New checkpoint at block 2000000 for mainnet + Update estimated number of transactions due to Blossom NU + +Miodrag Popović (2): + Fix for broken cross-build to Windows target on Ubuntu 22.04 and Debian 11 + Update depends/hosts/mingw32.mk to use posix variant library path + +Sean Bowe (1): + Add additional audits. + +Suhas Daftuar (4): + Add tags to mempool's mapTx indices + Fix mempool limiting for PrioritiseTransaction + Use fee deltas for determining mempool acceptance + Remove GetMinRelayFee + +TrellixVulnTeam (1): + Adding tarfile member sanitization to extractall() + +Wladimir J. van der Laan (1): + Merge #7730: Remove priority estimation + +Yasser Isa (1): + DOWNLOAD_URL dynamic in fetch-params.sh + +cronicc (1): + Fix Horizen Security contact email + +instagibbs (2): + Gave miner test values constants for less error-prone values. + Corrected values + +sasha (13): + Partially revert PR #6384, but only for URLs using a git commit hash + Download `native_cctools` and its `libtapi` to meaningful filenames + Better error messages if proof parameters aren't loaded + Enable the (existing) custom error message for the invalid checksum case + Re-download parameters if they already exist but don't have correct sums + Alias Sasha->sasha in release-notes.py to avoid authors.md split + Update `smoke_tests.py` to run against 5.5.0, using `allowdeprecated` + Use more restrictive privacy policies in `smoke_tests.py` + Use default values for `z_mergetoaddress` again + Don't hardcode 0.00001 explicitly + Change output format for `smoke_tests.py` + `DEFAULT_FEE` -> `LEGACY_DEFAULT_FEE` in `smoke_tests.py` + use `AllowRevealedRecipients` in `smoke_tests.py` case 4w + +Jack Grigg (4): + Improvements to code comments + Adjust documentation + z_mergetoaddress: Include Sapling output padding in size estimate + test: Fix copyright years in new RPC tests + +teor (2): + Replace custom zcash_script TxInputStream with RustDataStream + Change module comment in bridge.rs to doc comment + diff --git a/doc/release-notes/release-notes-5.5.1.md b/doc/release-notes/release-notes-5.5.1.md new file mode 100644 index 000000000..484fb78e7 --- /dev/null +++ b/doc/release-notes/release-notes-5.5.1.md @@ -0,0 +1,31 @@ +Notable changes +=============== + +Fixes +----- + +Fixes an issue that could cause a node to crash if the privacy policy does not +include `AllowRevealedRecipients` when attempting to create a transaction that +results in transparent change. See +[#6662](https://github.com/zcash/zcash/pull/6662) for details. + +Also corrects an underestimate of the [ZIP 317](https://zips.z.cash/zip-0317) +conventional fee when spending UTXOs, which can result in mining of the +transaction being delayed or blocked. See +[#6660](https://github.com/zcash/zcash/pull/6660) for details. + +Changelog +========= + +Greg Pfeil (10): + Add a test for WalletTxBuilder with legacy account + Handle errors when getting change addr for account + Test that WalletTxBuilder uses correct ZIP 317 fee + Correct fee calculation for vin in tx creation + Calculate consensusBranchId sooner + Extract fee check from test + Delay postponed dependencies + Add release notes for v5.5.1 + make-release.py: Versioning changes for 5.5.1. + make-release.py: Updated manpages for 5.5.1. + diff --git a/doc/release-notes/release-notes-5.6.0-rc1.md b/doc/release-notes/release-notes-5.6.0-rc1.md new file mode 100644 index 000000000..ad45948dd --- /dev/null +++ b/doc/release-notes/release-notes-5.6.0-rc1.md @@ -0,0 +1,195 @@ +Notable changes +=============== + +Change to Transaction Relay Policy +---------------------------------- + +Transactions paying less than the [ZIP 317](https://zips.z.cash/zip-0317) +conventional fee to the extent that they have more than `-txunpaidactionlimit` +unpaid actions (default: 50) will not be accepted to the mempool or relayed. +For the default values of `-txunpaidactionlimit` and `-blockunpaidactionlimit`, +these transactions would never be mined by the ZIP 317 block construction +algorithm. (If the transaction has been prioritised by `prioritisetransaction`, +the modified fee is used to calculate the number of unpaid actions.) + +Removal of Fee Estimation +------------------------- + +The `estimatefee` RPC call, which estimated the fee needed for a transaction to +be included within a target number of blocks, has been removed. The fee that +should be paid under normal circumstances is the ZIP 317 conventional fee; it +is not possible to compute that without knowing the number of logical actions +in a transaction, which was not an input to `estimatefee`. The `fee_estimates.dat` +file is no longer used. + +Privacy Policy Changes +---------------------- + + The `AllowRevealedSenders` privacy policy no longer allows sending from + multiple taddrs in the same transaction. This now requires + `AllowLinkingAccountAddresses`. Care should be taken in using + `AllowLinkingAccountAddresses` too broadly, as it can also result in linking + UAs when transparent funds are sent from them. The practical effect is that an + explicit privacy policy is always required for `z_mergetoaddress`, +`z_sendmany`, and `z_shieldcoinbase` when sending from multiple taddrs, even +when using wildcards like `*` and `ANY_TADDR`. + +Platform Support +---------------- + +- Ubuntu 18.04 LTS has been removed from the list of supported platforms. It + reached End of Support on May 31st 2023, and no longer satisfies our Tier 2 + policy requirements. + +Changelog +========= + +Daira Emma Hopwood (8): + Remove fee estimation. + Rename DEFAULT_FEE to LEGACY_DEFAULT_FEE in C++ code and RPC tests. Also remove DEFAULT_FEE_ZATS in RPC tests which was unused. + Fix a false positive duplicate-#include lint. + Avoid calling `ParseNonRFCJSONValue` for string-only parameters. Follow-up to #6617. + Transactions paying less than the ZIP 317 conventional fee to the extent that they have more than `-txunpaidactionlimit` unpaid actions, will now not be accepted to the mempool or relayed. For the default values of `-txunpaidactionlimit` and `-blockunpaidactionlimit`, these transactions would never be mined by the ZIP 317 block construction algorithm. (If the transaction has been prioritised by `prioritisetransaction`, the modified fee is used to calculate the number of unpaid actions.) + Improve handling of UAs as account proxies + Restructure InvalidFunds error message + Reformat InvalidFunds error message (this only changes indentation). + +Daira Hopwood (4): + Correct "height" -> "time" in release notes + Link to ZIP 317 in the release notes + Use `DisplayMoney` to simplify constructing an error message + Change incorrect uses of "is not" to "!=". + +DeckerSU (1): + txdb: remove consistency checks + +Greg Pfeil (24): + Clarify `wallet_doublespend` RPC test + Replace `zec_in_zat` with pre-existing `COIN` + Reduce ZEC ⇒ ZAT conversions + Reduce the scope of some constants + Encapsulate memos + Include `memoStr` in RPC results with `memo` + Centralize ReceiverType conversions + Display pass ratio in RPC test summary + Print all invalid receivers when there’s a failure + Fix macOS build on CI + Remove GitHub check for recent-enough branch + Fix missing includes on macOS build + Enable & error on all un-violated warnings + Move warning flags to configure.ac + Update comments on disabled warnings + Fix a minor bug in an error message + Document the Sprout cache used for RPC tests + Make `./configure` quieter by default + Share RPC param table between client and server + Better error for “wrong number of params” in RPC + Improve CONFIGURE_FLAGS handling in build.sh + Reword RPC error messege for wrong number of params + Strengthen AllowRevealedSenders + Have COutput carry its CTxDestination + +Hennadii Stepanov (1): + Use C++17 [[fallthrough]] attribute, and drop -Wno-implicit-fallthrough + +Jack Grigg (34): + Squashed 'src/secp256k1/' changes from 1758a92ffd..be8d9c262f + Squashed 'src/secp256k1/' changes from be8d9c262f..0559fc6e41 + Squashed 'src/secp256k1/' changes from 0559fc6e41..8746600eec + Squashed 'src/secp256k1/' changes from 8746600eec..44c2452fd3 + Squashed 'src/secp256k1/' changes from 44c2452fd3..21ffe4b22a + rust: Migrate to `secp256k1 0.26`, `hdwallet 0.4` + Clear out v5.5.0 release notes + Place Sapling {Spend, Output}Description fields behind getters + Place `vShieldedSpend`, `vShieldedOutput` behind getters + Remove Ubuntu 18.04 as a supported platform + contrib: Update `contrib/devtools/symbol-check.py` + Add Ubuntu 22.04 as a Tier 3 platform + build: Consensus: Move Bitcoin script files from consensus to its own module/package + build: Use libtool for linking `librustzcash.a` to the C++ code + build: Fix `--with-libs` linking errors for MinGW cross-compilation + rust: Add `CBLAKE2bWriter` support to `CppStream` + Pass `CChainParams` into `TransactionBuilder` instead of `Consensus::Params` + Pass ExtSK into `TransactionBuilder::AddSaplingSpend` instead of ExpSK + test: Use correct transaction version for Orchard in `TxWithNullifiers` + builder: Use Rust to compute shielded signature hash for v3-v4 txs + builder: Remove `anchor` argument from `TransactionBuilder::AddSaplingSpend` + mempool: Refactor `CTxMemPool::checkNullifiers` to use a template + wallet: Introduce `libzcash::nullifier_t` typedef + builder: Move all fields in `TransactionBuilder` move constructors + rust: Add new structs and functions required for Sapling oxidation + Oxidise the Sapling bundles + Oxidise the Sapling benchmarks and remaining tests + Remove now-unused Sapling logic + test: Use `!=` instead of `is not` in `final*root` RPC tests + Remove `TransactionBuilder` default constructor + test: Some minor cleanups + test: Fix non-conflicting merge conflict + rpc: Add `z_getsubtreesbyindex` RPC method + rpc: Add `trees` field to `getblock` RPC output + +Jorge Timón (3): + Build: Consensus: Move consensus files from common to its own module/package + Build: Libconsensus: Move libconsensus-ready files to the consensus package + Build: Consensus: Make libbitcoinconsensus_la_SOURCES fully dynamic and dependend on both crypto and consensus packages + +Kris Nuttycombe (19): + Note when (not) to apply the "add release notes" part of the release process. + Add a useful comment about the CheckProofOfWork check in LoadBlockIndexGuts + Add golden tests for Orchard wallet state at the zcashd v5.6.0 boundary. + Persist data for wallet_golden_5_6_0 RPC test + Apply suggestions from code review + Fix a nondeterministic error in wallet tests caused by output shuffling. + Fix nondeterminism in `WalletTests.UpdatedSaplingNoteData` + Upgrade to the latest incrementalmerkletree & bridgetree versions. + Regenerate cargo-vet exemptions + Add Orchard subtree roots to the coins view. + Fix a potential null-pointer dereference. + Use a `limit` parameter instead of `end_index` for `z_getsubtreesbyindex` + Remove `depth` property from `z_getsubtreesbyindex` result & fix docs. + Update to released versions of patch dependencies. + Update audits for upgraded dependencies. + Update RPC tests to enable `-lightwalletd` flag where needed. + Update native_cmake, native_cxxbridge, and native_rust and postpone other required updates. + make-release.py: Versioning changes for 5.6.0-rc1. + make-release.py: Updated manpages for 5.6.0-rc1. + +Marshall Gaucher (1): + Update performance-measurements.sh + +Pieter Wuille (4): + Remove --disable-openssl-tests for libsecp256k1 configure + Adapt to libsecp256k1 API changes + Add secp256k1_selftest call + scripted-diff: rename privkey with seckey in secp256k1 interface + +Sean Bowe (12): + Add support for storing Sapling/Orchard subtree roots in leveldb. + Add tests and fix bugs in implementation of CCoinsView subtree storage. + Minor improvements suggested during code review. + Minor documentation improvements suggested during review. + Minor fixes suggested from code review. + Remove unnecessary dependencies pulled in by proptest. + Store 2^16 subtree roots for the Sapling note commitment tree in the coins database. + Address comments raised during code review. + Automatically migrate old coins database to account for complete subtrees for Sapling and Orchard + Guard all subtree-related functionality behind lightwallet experimental feature flag. + Apply suggestions from code review. + Add UI messages surrounding RegenerateSubtrees. + +dismad (1): + Update README.md + +ebfull (2): + Simplify logic paths in `GetSubtreeData` + Minor documentation typo fixes + +fanquake (1): + build: remove some no-longer-needed var unexporting from configure + +practicalswift (1): + Remove unreachable code (g_rpcSignals.PostCommand) + +teor (1): + Change module comment in bridge.rs to doc comment + diff --git a/doc/release-notes/release-notes-5.6.0.md b/doc/release-notes/release-notes-5.6.0.md new file mode 100644 index 000000000..e9cb7f61c --- /dev/null +++ b/doc/release-notes/release-notes-5.6.0.md @@ -0,0 +1,232 @@ +Notable changes +=============== + +Change to Transaction Relay Policy +---------------------------------- + +Transactions paying less than the [ZIP 317](https://zips.z.cash/zip-0317) +conventional fee to the extent that they have more than `-txunpaidactionlimit` +unpaid actions (default: 50) will not be accepted to the mempool or relayed. +For the default values of `-txunpaidactionlimit` and `-blockunpaidactionlimit`, +these transactions would never be mined by the ZIP 317 block construction +algorithm. (If the transaction has been prioritised by `prioritisetransaction`, +the modified fee is used to calculate the number of unpaid actions.) + +Removal of Fee Estimation +------------------------- + +The `estimatefee` RPC call, which estimated the fee needed for a transaction to +be included within a target number of blocks, has been removed. The fee that +should be paid under normal circumstances is the ZIP 317 conventional fee; it +is not possible to compute that without knowing the number of logical actions +in a transaction, which was not an input to `estimatefee`. The `fee_estimates.dat` +file is no longer used. + +RPC Changes +----------- + +A new RPC method, `z_getsubtreesbyindex`, has been added to the RPC interface. +This method is only enabled when running with the `-experimentalfeatures=1` and +`-lightwalletd=1` node configuration options. This method makes available to the +caller precomputed node values within the Sapling and Orchard note commitment +trees. Wallets can make use of these precomputed values to make their existing +notes spendable without needing to fully scan the sub-trees whose roots +correspond to the returned node values. + +In conjunction with this change, the `getblock` RPC method now returns an +additional `trees` field as part of its result. The value for this field is an +object that contains the final sizes of the Sapling and Orchard note commitment +trees after the block's note commitments have been appended to their respective +trees. + +Error reporting has also been improved for a number of RPC methods. + +Privacy Policy Changes +---------------------- + +The `AllowRevealedSenders` privacy policy no longer allows sending from +multiple taddrs in the same transaction. This now requires +`AllowLinkingAccountAddresses`. Care should be taken in using +`AllowLinkingAccountAddresses` too broadly, as it can also result in linking +UAs when transparent funds are sent from them. The practical effect is that an +explicit privacy policy is always required for `z_mergetoaddress`, +`z_sendmany`, and `z_shieldcoinbase` when sending from multiple taddrs, even +when using wildcards like `*` and `ANY_TADDR`. + +Wallet Updates +-------------- + +A number of libraries that zcashd relies upon have been updated as part of this +release, including some changes that result in updates to wallet serialization +formats for Orchard note commitment tree data. As always, it is recommended +that users back up their wallets prior to upgrading to a new release to help +guarantee the continued availability of their funds. + +Platform Support +---------------- + +- Ubuntu 18.04 LTS has been removed from the list of supported platforms. It + reached End of Support on May 31st 2023, and no longer satisfies our Tier 2 + policy requirements. + +Changelog +========= + +Daira Emma Hopwood (9): + Remove fee estimation. + Rename DEFAULT_FEE to LEGACY_DEFAULT_FEE in C++ code and RPC tests. Also remove DEFAULT_FEE_ZATS in RPC tests which was unused. + Fix a false positive duplicate-#include lint. + Avoid calling `ParseNonRFCJSONValue` for string-only parameters. Follow-up to #6617. + Transactions paying less than the ZIP 317 conventional fee to the extent that they have more than `-txunpaidactionlimit` unpaid actions, will now not be accepted to the mempool or relayed. For the default values of `-txunpaidactionlimit` and `-blockunpaidactionlimit`, these transactions would never be mined by the ZIP 317 block construction algorithm. (If the transaction has been prioritised by `prioritisetransaction`, the modified fee is used to calculate the number of unpaid actions.) + Improve handling of UAs as account proxies + Restructure InvalidFunds error message + Reformat InvalidFunds error message (this only changes indentation). + contrib/debian/copyright: give more precise information for src/secp256k1 + +Daira Hopwood (4): + Correct "height" -> "time" in release notes + Link to ZIP 317 in the release notes + Use `DisplayMoney` to simplify constructing an error message + Change incorrect uses of "is not" to "!=". + +DeckerSU (1): + txdb: remove consistency checks + +Greg Pfeil (24): + Clarify `wallet_doublespend` RPC test + Replace `zec_in_zat` with pre-existing `COIN` + Reduce ZEC ⇒ ZAT conversions + Reduce the scope of some constants + Encapsulate memos + Include `memoStr` in RPC results with `memo` + Centralize ReceiverType conversions + Display pass ratio in RPC test summary + Print all invalid receivers when there’s a failure + Fix macOS build on CI + Remove GitHub check for recent-enough branch + Fix missing includes on macOS build + Enable & error on all un-violated warnings + Move warning flags to configure.ac + Update comments on disabled warnings + Fix a minor bug in an error message + Document the Sprout cache used for RPC tests + Make `./configure` quieter by default + Share RPC param table between client and server + Better error for “wrong number of params” in RPC + Improve CONFIGURE_FLAGS handling in build.sh + Reword RPC error messege for wrong number of params + Strengthen AllowRevealedSenders + Have COutput carry its CTxDestination + +Hennadii Stepanov (1): + Use C++17 [[fallthrough]] attribute, and drop -Wno-implicit-fallthrough + +Jack Grigg (34): + Squashed 'src/secp256k1/' changes from 1758a92ffd..be8d9c262f + Squashed 'src/secp256k1/' changes from be8d9c262f..0559fc6e41 + Squashed 'src/secp256k1/' changes from 0559fc6e41..8746600eec + Squashed 'src/secp256k1/' changes from 8746600eec..44c2452fd3 + Squashed 'src/secp256k1/' changes from 44c2452fd3..21ffe4b22a + rust: Migrate to `secp256k1 0.26`, `hdwallet 0.4` + Clear out v5.5.0 release notes + Place Sapling {Spend, Output}Description fields behind getters + Place `vShieldedSpend`, `vShieldedOutput` behind getters + Remove Ubuntu 18.04 as a supported platform + contrib: Update `contrib/devtools/symbol-check.py` + Add Ubuntu 22.04 as a Tier 3 platform + build: Consensus: Move Bitcoin script files from consensus to its own module/package + build: Use libtool for linking `librustzcash.a` to the C++ code + build: Fix `--with-libs` linking errors for MinGW cross-compilation + rust: Add `CBLAKE2bWriter` support to `CppStream` + Pass `CChainParams` into `TransactionBuilder` instead of `Consensus::Params` + Pass ExtSK into `TransactionBuilder::AddSaplingSpend` instead of ExpSK + test: Use correct transaction version for Orchard in `TxWithNullifiers` + builder: Use Rust to compute shielded signature hash for v3-v4 txs + builder: Remove `anchor` argument from `TransactionBuilder::AddSaplingSpend` + mempool: Refactor `CTxMemPool::checkNullifiers` to use a template + wallet: Introduce `libzcash::nullifier_t` typedef + builder: Move all fields in `TransactionBuilder` move constructors + rust: Add new structs and functions required for Sapling oxidation + Oxidise the Sapling bundles + Oxidise the Sapling benchmarks and remaining tests + Remove now-unused Sapling logic + test: Use `!=` instead of `is not` in `final*root` RPC tests + Remove `TransactionBuilder` default constructor + test: Some minor cleanups + test: Fix non-conflicting merge conflict + rpc: Add `z_getsubtreesbyindex` RPC method + rpc: Add `trees` field to `getblock` RPC output + +Jorge Timón (3): + Build: Consensus: Move consensus files from common to its own module/package + Build: Libconsensus: Move libconsensus-ready files to the consensus package + Build: Consensus: Make libbitcoinconsensus_la_SOURCES fully dynamic and dependend on both crypto and consensus packages + +Kris Nuttycombe (26): + Note when (not) to apply the "add release notes" part of the release process. + Add a useful comment about the CheckProofOfWork check in LoadBlockIndexGuts + Add golden tests for Orchard wallet state at the zcashd v5.6.0 boundary. + Persist data for wallet_golden_5_6_0 RPC test + Apply suggestions from code review + Fix a nondeterministic error in wallet tests caused by output shuffling. + Fix nondeterminism in `WalletTests.UpdatedSaplingNoteData` + Upgrade to the latest incrementalmerkletree & bridgetree versions. + Regenerate cargo-vet exemptions + Add Orchard subtree roots to the coins view. + Fix a potential null-pointer dereference. + Use a `limit` parameter instead of `end_index` for `z_getsubtreesbyindex` + Remove `depth` property from `z_getsubtreesbyindex` result & fix docs. + Update to released versions of patch dependencies. + Update audits for upgraded dependencies. + Update RPC tests to enable `-lightwalletd` flag where needed. + Update native_cmake, native_cxxbridge, and native_rust and postpone other required updates. + make-release.py: Versioning changes for 5.6.0-rc1. + make-release.py: Updated manpages for 5.6.0-rc1. + make-release.py: Updated release notes and changelog for 5.6.0-rc1. + make-release.py: Updated book for 5.6.0-rc1. + Add a step for checking/updating the release notes to the release process. + Update release notes for 5.6.0 release. + Revert "Update native_rust" and postpone the upgrade. + make-release.py: Versioning changes for 5.6.0. + make-release.py: Updated manpages for 5.6.0. + +Marshall Gaucher (1): + Update performance-measurements.sh + +Pieter Wuille (4): + Remove --disable-openssl-tests for libsecp256k1 configure + Adapt to libsecp256k1 API changes + Add secp256k1_selftest call + scripted-diff: rename privkey with seckey in secp256k1 interface + +Sean Bowe (13): + Add support for storing Sapling/Orchard subtree roots in leveldb. + Add tests and fix bugs in implementation of CCoinsView subtree storage. + Minor improvements suggested during code review. + Minor documentation improvements suggested during review. + Minor fixes suggested from code review. + Remove unnecessary dependencies pulled in by proptest. + Store 2^16 subtree roots for the Sapling note commitment tree in the coins database. + Address comments raised during code review. + Automatically migrate old coins database to account for complete subtrees for Sapling and Orchard + Guard all subtree-related functionality behind lightwallet experimental feature flag. + Apply suggestions from code review. + Add UI messages surrounding RegenerateSubtrees. + Add test for new IncrementalMerkleTree methods. + +dismad (1): + Update README.md + +ebfull (2): + Simplify logic paths in `GetSubtreeData` + Minor documentation typo fixes + +fanquake (1): + build: remove some no-longer-needed var unexporting from configure + +practicalswift (1): + Remove unreachable code (g_rpcSignals.PostCommand) + +teor (1): + Change module comment in bridge.rs to doc comment + diff --git a/doc/release-notes/release-notes-5.6.1.md b/doc/release-notes/release-notes-5.6.1.md new file mode 100644 index 000000000..c9f15cbc5 --- /dev/null +++ b/doc/release-notes/release-notes-5.6.1.md @@ -0,0 +1,38 @@ +Notable changes +=============== + +Fixes +----- + +Fixes an issue introduced in v5.6.0 that could cause loss of data from the +wallet's Orchard note commitment tree. Users upgrading directly from v5.5.0 +should upgrade directly to v5.6.1. Wallets that were previously upgraded to +v5.6.0 whose wallets contained unspent Orchard notes at the time of the upgrade +will be automatically re-scanned on startup to repair the corrupted note +commitment tree. + +Also, the `height` parameter to the `getblocksubsidy` RPC call had accidentally +been made required instead of optional as part of the v5.5.0 upgrade. This +hotfix restores `height` to being treated as an optional parameter. + +Changelog +========= + +Kris Nuttycombe (13): + Add `getblocksubsidy` checks to `nuparams` test. + Restore `height` parameter to being optional in `getblocksubsidy` RPC. + Re-create serialized v5.5.0 Orchard wallet state. + Remove -regtestwalletsetbestchaineveryblock after golden state generation. + Enable mining to Orchard on regtest + Add persistent example of corrupted Orchard wallet state post v5.6.0 + Update wallet_golden_5_6_0 test to fail due to Orchard wallet parsing errors. + Add a test demonstrating inability to spend from the tarnished state. + Fix Orchard bridgetree parsing. + Trigger a rescan on wallet load if spend information is missing from the wallet. + Update changelog & postpone updates for v5.6.1 hotfix. + make-release.py: Versioning changes for 5.6.1. + make-release.py: Updated manpages for 5.6.1. + +Sean Bowe (1): + Add sapling.h and rpc/common.h to makefile sources. + diff --git a/doc/release-process.md b/doc/release-process.md new file mode 100644 index 000000000..00b8e0011 --- /dev/null +++ b/doc/release-process.md @@ -0,0 +1,247 @@ +Release Process +==================== +Meta: There should always be a single release engineer to disambiguate responsibility. + +If this is a hotfix release, please see the [Hotfix Release +Process](https://github.com/zcash/zcash/blob/master/doc/hotfix-process.md) documentation +before proceeding. + +## Pre-release + +### Github Milestone + +Ensure all goals for the github milestone are met. If not, remove tickets +or PRs with a comment as to why it is not included. (Running out of time +is a common reason.) + +### Pre-release checklist: + +Check that dependencies are properly hosted. + +Check that there are no surprising performance regressions. + +Update `src/chainparams.cpp` nMinimumChainWork with information from the getblockchaininfo rpc. + +Check that dependencies are up-to-date or have been postponed: + +``` +$ ./qa/zcash/updatecheck.py +``` + +You can optionally create a file `~/.local/share/zcash/updatecheck/token` (or +`$XDG_DATA_HOME/zcash/updatecheck/token` if the `XDG_DATA_HOME` environment +variable is set) to avoid running into GitHub rate limiting. Create an +unprivileged personal access token on GitHub and copy the value into the file. + +If there are updates that have not been postponed, review their changelogs +for urgent security fixes, and if there aren't any, postpone the update by +adding a line to `qa/zcash/postponed-updates.txt`. + +### Protocol Safety Checks: + +If this release changes the behavior of the protocol or fixes a serious +bug, verify that a pre-release PR merge updated `PROTOCOL_VERSION` in +`version.h` correctly. + +If this release breaks backwards compatibility or needs to prevent +interaction with software forked projects, change the network magic +numbers. Set the four `pchMessageStart` in `CTestNetParams` in +`chainparams.cpp` to random values. + +Both of these should be done in standard PRs ahead of the release +process. If these were not anticipated correctly, this could block the +release, so if you suspect this is necessary, double check with the +whole engineering team. + +## Release dependencies + +The release script has the following dependencies: + +- `help2man` +- `debchange` (part of the devscripts Debian package) +- the python modules `progressbar2` (optional - displays a progress bar), + `requests` and `xdg` + +## Versioning + +Zcash version identifiers have the format `vX.Y.Z` with the following conventions: + +* Increments to the `X` component (the "major version") correspond to network + upgrades. A network upgrade occurs only when there is a change to the + consensus rules. +* Increments to the `Y` component (the "minor version") correspond to regular + Zcash releases. These occur approximately every 6 weeks and may include breaking + changes to public APIs. +* Increments to the `Z` component occur only in the case of hotfix releases. + +## Release candidate & release process + +Identify the commit from which the release stabilization branch will be made. +Release stabilization branches are used so that development can proceed +unblocked on the `master` branch during the release candidate testing and +bug-fixing process. By convention, release stabilization branches are named +`version-X.Y.0` where `X` and `Y` are the major and minor versions for the +release. + +In the commands below, and must identify `git` tags +prefixed with the character `v`, i.e. `v1.0.9` (not `1.0.9`). is a +`git` hash identifying the commit on which a release stabilization or release +branch will be based. It is recommended to use the entire hash value to +identify the commit, although a prefix of at least 10 characters is also +permitted. + +### Create the release stabilization branch + +Having identified the commit from which the release will be made, the release +manager constructs the release stabilization branch as follows: + + $ git checkout -b version-X.Y.0 + $ git push 'git@github.com:zcash/zcash' $(git rev-parse --abbrev-ref HEAD) + +### Review & update the release notes + +Now is the time to make sure that all of the changes since the previous release +are property represented in `doc/release-notes.md`. Determine the tag that will +be used for the `RELEASE_FROM` value by manually searching for the tag for the +latest full release in the list obtained by running + + $ git tag -l --sort=-taggerdate + +and then finding the most recent non-release-candidate version. If you have a +git remote for the upstream `bitcoin-core` repository, be aware that Bitcoin +tags will also appear in this list. Then, skim the full diff since the last +release and make certain that all user-visible changes are properly documented +in `doc/release-notes.md`. + + $ git diff ..HEAD + +If you make any changes to the release notes, add commits to do so as +necessary, but do NOT push these commits to the `version-X.Y.Z` branch on the +upstream repository; they will be included in the release branch that will be +created in the next step. + +### Create the release candidate branch + +Run the release script to create the first release candidate. This will create +a branch based upon the specified commit ID, then commit standard automated +changes to that branch locally: + + $ ./zcutil/make-release.py + +Examples: + + $ ./zcutil/make-release.py 600c4acee1 v1.1.0-rc1 v1.0.0 v1.0.0 280300 + $ ./zcutil/make-release.py b89b48cda1 v1.1.0 v1.1.0-rc1 v1.0.0 300600 + +### Create, Review, and Merge the release branch pull request + +Review the automated changes in git: + + $ git log version-X.Y.0..HEAD + +Push the resulting branch to github: + + $ git push 'git@github.com:$YOUR_GITHUB_NAME/zcash' $(git rev-parse --abbrev-ref HEAD) + +Then create the PR on github targeting the `version-X.Y.0` branch. Complete the +standard review process and wait for CI to complete. + +## Make a tag for the tip of the release candidate branch + +NOTE: This has changed from the previously recommended process. The tag should +be created at the tip of the automatically-generated release branch created by +the release script; this ensures that any changes made to the release +stabilization branch since the initiation of the release process are not +accidentally tagged as being part of the release as a consequence of having +been included in a merge commit. + +Check the last commit on the local and remote versions of the release branch to +make sure they are the same: + + $ git log -1 + +If you haven't previously done so, set the gpg key id you intend to use for +signing: + + git config --global user.signingkey + +Then create the git tag. The `-s` means the release tag will be signed. Enter +"Release ." and save when prompted for a commit message. **CAUTION:** +Remember the `v` at the beginning here: + + $ git tag -s vX.Y.Z-rcN + $ git push origin vX.Y.Z-rcN + +## Merge the release candidate branch to the release stabilization branch + +Once CI has completed and the release candidate branch has sufficient approving +reviews, merge the release candidate branch back to the release stabilization +branch. Testing proceeds as normal. Any changes that need to be made during the +release candidate period are made by submitting PRs targeting the release +stabilization branch. + +Subsequent release candidates, and the creation of the final release, follow +the same process as for release candidates, omitting the `-rcN` suffix for the +final release. + +## Make and deploy deterministic builds + +- Run the [Gitian deterministic build environment](https://github.com/zcash/zcash-gitian) +- Compare the uploaded [build manifests on gitian.sigs](https://github.com/zcash/gitian.sigs) +- If all is well, the DevOps engineer will build the Debian packages and update the + [apt.z.cash package repository](https://apt.z.cash). + +## Add release notes to GitHub + +The following part of the release process applies only to final releases, not +release candidates. + +- Go to the [GitHub tags page](https://github.com/zcash/zcash/tags). +- Click "Add release notes" beside the tag for this release. +- Copy the release blog post into the release description, and edit to suit + publication on GitHub. See previous release notes for examples. +- Click "Publish release" if publishing the release blog post now, or + "Save draft" to store the notes internally (and then return later to publish + once the blog post is up). + +Note that some GitHub releases are marked as "Verified", and others as +"Unverified". This is related to the GPG signature on the release tag - in +particular, GitHub needs the corresponding public key to be uploaded to a +corresponding GitHub account. If this release is marked as "Unverified", click +the marking to see what GitHub wants to be done. + +## Post Release Task List + +### Merge the release stabilization branch + +Once the final release branch has merged to the release stabilization branch, a +new PR should be opened for merging the release stabilization branch into +master. This may require fixing merge conflicts (e.g. changing the version +number in the release stabilization branch to match master, if master is +ahead). Such conflicts **MUST** be addressed with additional commits to the +release stabilization branch; specifically, the branch **MUST NOT** be rebased +on master. + +Once any conflicts have been resolved, the release stabilization branch should +be merged back to the `master` branch, and then deleted. + +### Deploy testnet + +Notify the Zcash DevOps engineer/sysadmin that the release has been tagged. They update +some variables in the company's automation code and then run an Ansible playbook, which: + +* builds Zcash based on the specified branch +* deploys it as a public service (e.g. testnet.z.cash, mainnet.z.cash) +* often the same server can be re-used, and the role idempotently handles upgrades, but if + not then they also need to update DNS records +* possible manual steps: blowing away the `testnet3` dir, deleting old parameters, + restarting DNS seeder. + +Verify that nodes can connect to the mainnet and testnet servers. + +Update the [Zcashd Full Node and CLI](https://zcash.readthedocs.io/en/latest/rtd_pages/zcashd.html) +documentation on ReadTheDocs to give the new version number. + +### Publish the release announcement (blog, github, zcash-dev, slack) + +## Celebrate diff --git a/doc/translation_strings_policy.md b/doc/translation_strings_policy.md new file mode 100644 index 000000000..c370dba24 --- /dev/null +++ b/doc/translation_strings_policy.md @@ -0,0 +1,71 @@ +*** Warning: This document has not been updated for Zcash and may be inaccurate. *** + +Translation Strings Policy +=========================== + +This document provides guidelines for internationalization of the Bitcoin Core software. + +How to translate? +------------------ + +To mark a message as translatable + +- In non-GUI source code (under `src`): use `_("...")` + +No internationalization is used for e.g. developer scripts outside `src`. + +Strings to be translated +------------------------- + +On a high level, these strings are to be translated: + +- GUI strings, anything that appears in a dialog or window + +- Command-line option documentation + +### GUI strings + +Anything that appears to the user in the GUI is to be translated. This includes labels, menu items, button texts, tooltips and window titles. +This includes messages passed to the GUI through the UI interface through `InitMessage`, `ThreadSafeMessageBox` or `ShowProgress`. + +### Command-line options + +Documentation for the command line options in the output of `--help` should be translated as well. + +Make sure that default values do not end up in the string, but use string formatting like `strprintf(_("Threshold for disconnecting misbehaving peers (default: %u)"), 100)`. Putting default values in strings has led to accidental translations in the past, and forces the string to be retranslated every time the value changes. + +Do not translate messages that are only shown to developers, such as those that only appear when `--help-debug` is used. + +General recommendations +------------------------ + +### Avoid unnecessary translation strings + +Try not to burden translators with translating messages that are e.g. slight variations of other messages. +In the GUI, avoid the use of text where an icon or symbol will do. +Make sure that placeholder texts in forms don't end up in the list of strings to be translated (use ``). + +### Make translated strings understandable + +Try to write translation strings in an understandable way, for both the user and the translator. Avoid overly technical or detailed messages + +### Do not translate internal errors + +Do not translate internal errors, or log messages, or messages that appear on the RPC interface. If an error is to be shown to the user, +use a generic message, then log the detailed message to the log. E.g. "Error: A fatal internal error occurred, see debug.log for details". +This helps troubleshooting; if the error is the same for everyone, the likelihood is increased that it can be found using a search engine. + +### Avoid fragments + +Avoid dividing up a message into fragments. Translators see every string separately, so may misunderstand the context if the messages are not self-contained. + +### Avoid HTML in translation strings + +There have been difficulties with use of HTML in translation strings; translators should not be able to accidentally affect the formatting of messages. +This may sometimes be at conflict with the recommendation in the previous section. + +### String freezes + +During a string freeze (often before a major release), no translation strings are to be added, modified or removed. + +This can be checked by executing `make translate` in the `src` directory, then verifying that `bitcoin_en.ts` remains unchanged. diff --git a/doc/unit-tests.md b/doc/unit-tests.md new file mode 100644 index 000000000..9410b4407 --- /dev/null +++ b/doc/unit-tests.md @@ -0,0 +1,17 @@ +Compiling/running automated tests +--------------------------------- + +Automated tests will be automatically compiled if dependencies were met in configure +and tests weren't explicitly disabled. + +There are two scripts for running tests: + +* ``qa/zcash/full_test_suite.py``, to run the main test suite +* ``qa/pull-tester/rpc-tests.sh``, to run the RPC tests. + +The main test suite uses two different testing frameworks. Tests using the Boost +framework are under ``src/test/``; tests using the Google Test/Google Mock +framework are under ``src/gtest/`` and ``src/wallet/gtest/``. The latter framework +is preferred for new Zcash unit tests. + +RPC tests are implemented in Python under the ``qa/rpc-tests/`` directory. diff --git a/doc/zmq.md b/doc/zmq.md new file mode 100644 index 000000000..25a649ffe --- /dev/null +++ b/doc/zmq.md @@ -0,0 +1,122 @@ +# Block and Transaction Broadcasting With ZeroMQ + +[ZeroMQ](https://zeromq.org) is a lightweight wrapper around TCP +connections, inter-process communication, and shared-memory, providing +various message-oriented semantics such as publish/subscribe, +request/reply, and push/pull. + +The Zcash daemon can be configured to act as a trusted "border +router", implementing the Zcash wire protocol and relay, making +consensus decisions, maintaining the local blockchain database, +broadcasting locally generated transactions into the network, and +providing a queryable RPC interface to interact on a polled basis for +requesting blockchain related data. However, there exists only a +limited service to notify external software of events like the arrival +of new blocks or transactions. + +The ZeroMQ facility implements a notification interface through a set +of specific notifiers. Currently there are notifiers that publish +blocks and transactions. This read-only facility requires only the +connection of a corresponding ZeroMQ subscriber port in receiving +software; it is not authenticated nor is there any two-way protocol +involvement. Therefore, subscribers should validate the received data +since it may be out of date, incomplete or even invalid. + +ZeroMQ sockets are self-connecting and self-healing; that is, +connections made between two endpoints will be automatically restored +after an outage, and either end may be freely started or stopped in +any order. + +Because ZeroMQ is message oriented, subscribers receive transactions +and blocks all-at-once and do not need to implement any sort of +buffering or reassembly. + +## Prerequisites + +The ZeroMQ feature in Zcash requires the ZeroMQ API >= 4.0.0 +[libzmq](https://github.com/zeromq/libzmq/releases), which you will +need to install if you are not using the depends system. +Typically, it is packaged by distributions as something like +*libzmq5-dev*. The C++ wrapper for ZeroMQ is *not* needed. + +In order to run the example Python client scripts in contrib/ one must +also install *python3-zmq*, though this is not necessary for daemon +operation. + +## Security WARNING + +Enabling this feature even on the loopback interface only (e.g. binding +it to localhost or 127.0.0.1) will still expose it to the wilds of the +Internet, because of an attack vector called DNS rebinding. DNS +rebinding allows an attacker located remotely on the Internet to trick +applications that you're running on the same computer as zcashd to +contact your supposedly localhost-only ZMQ port, then, depending on the +program they may be able to attempt to attack it. + +Do not enable this feature unless you are sure that you know what you +are doing, and that you have a strong reason for thinking that you are +not vulnerable to this type of attack. + +## Enabling + +By default, the ZeroMQ feature is automatically compiled in if the +necessary prerequisites are found. To disable, use --disable-zmq +during the *configure* step of building zcashd: + + $ ./configure --disable-zmq (other options) + +To actually enable operation, one must set the appropriate options on +the commandline or in the configuration file. + +## Usage + +Currently, the following notifications are supported: + + -zmqpubhashtx=address + -zmqpubhashblock=address + -zmqpubrawblock=address + -zmqpubrawtx=address + +The socket type is PUB and the address must be a valid ZeroMQ socket +address. The same address can be used in more than one notification. + +For instance: + + $ zcashd -zmqpubhashtx=tcp://127.0.0.1:28332 \ + -zmqpubrawtx=ipc:///tmp/zcashd.tx.raw + +Each PUB notification has a topic and body, where the header +corresponds to the notification type. For instance, for the +notification `-zmqpubhashtx` the topic is `hashtx` (no null +terminator) and the body is the hexadecimal transaction hash (32 +bytes). + +These options can also be provided in zcash.conf. + +ZeroMQ endpoint specifiers for TCP (and others) are documented in the +[ZeroMQ API](http://api.zeromq.org/4-0:_start). + +Client side, then, the ZeroMQ subscriber socket must have the +ZMQ_SUBSCRIBE option set to one or either of these prefixes (for +instance, just `hash`); without doing so will result in no messages +arriving. Please see `contrib/zmq/zmq_sub.py` for a working example. + +## Remarks + +From the perspective of zcashd, the ZeroMQ socket is write-only; PUB +sockets don't even have a read function. Thus, there is no state +introduced into zcashd directly. Furthermore, no information is +broadcast that wasn't already received from the public P2P network. + +No authentication or authorization is done on connecting clients; it +is assumed that the ZeroMQ port is exposed only to trusted entities, +using other means such as firewalling. + +Note that when the block chain tip changes, a reorganisation may occur +and just the tip will be notified. It is up to the subscriber to +retrieve the chain from the last known block to the new tip. + +There are several possibilities that ZMQ notification can get lost +during transmission depending on the communication type you are +using. zcashd appends an up-counting sequence number to each +notification which allows listeners to detect lost notifications. diff --git a/libzcash_script.pc.in b/libzcash_script.pc.in new file mode 100644 index 000000000..bd288484f --- /dev/null +++ b/libzcash_script.pc.in @@ -0,0 +1,10 @@ +prefix=@prefix@ +exec_prefix=@exec_prefix@ +libdir=@libdir@ +includedir=@includedir@ + +Name: Zcash transparent script verification library +Description: Library for verifying scripts against the Zcash consensus protocol. +Version: @PACKAGE_VERSION@ +Libs: -L${libdir} -lzcash_script +Cflags: -I${includedir} diff --git a/qa/README.md b/qa/README.md new file mode 100644 index 000000000..a68ba38fd --- /dev/null +++ b/qa/README.md @@ -0,0 +1,91 @@ +The [pull-tester](/qa/pull-tester/) folder contains a script to call +multiple tests from the [rpc-tests](/qa/rpc-tests/) folder. + +Every pull request to the zcash repository is built and run through +the regression test suite. You can also run all or only individual +tests locally. + +Test dependencies +================= +Before running the tests, the following must be installed. + +Unix +---- +The python3-zmq library and simplejson are required. On Ubuntu or Debian they +can be installed via: +``` +sudo apt-get install python3-simplejson python3-zmq +``` + +OS X +------ +``` +pip3 install pyzmq simplejson +``` + +Running tests +============= + +You can run any single test by calling + + RPC_TEST= make rpc-tests + +Or you can run any combination of tests by calling + + RPC_TEST=" ..." make rpc-tests + +Run the regression test suite with + + make rpc-tests + +Run all possible tests with + + RPC_TEST="--extended" make rpc-tests + +You can also run the tests directly using `qa/pull-tester/rpc-tests.py` instead +of `make`, but that won't ensure that zcashd is up-to-date with any changes. + +By default, tests will be run in parallel. To specify how many jobs to run, +append `--jobs=n` (default n=4). + +If you want to create a basic coverage report for the RPC test suite, append `--coverage`. + +Possible options, which apply to each individual test run: + +``` + -h, --help show this help message and exit + --nocleanup Leave zcashds and test.* datadir on exit or error + --noshutdown Don't stop zcashds after the test execution + --srcdir=SRCDIR Source directory containing zcashd/zcash-cli + (default: ../../src) + --tmpdir=TMPDIR Root directory for datadirs + --tracerpc Print out all RPC calls as they are made + --coveragedir=COVERAGEDIR + Write tested RPC commands into this directory +``` + +If you set the environment variable `PYTHON_DEBUG=1` you will get some debug +output (example: `PYTHON_DEBUG=1 qa/pull-tester/rpc-tests.py wallet`). + +A 200-block -regtest blockchain and wallets for four nodes +is created the first time a regression test is run and +is stored in the cache/ directory. Each node has the miner +subsidy from 25 mature blocks (25*10=250 ZEC) in its wallet. + +After the first run, the cache/ blockchain and wallets are +copied into a temporary directory and used as the initial +test state. + +If you get into a bad state, you should be able +to recover with: + +```bash +rm -rf cache +killall zcashd +``` + +Writing tests +============= +You are encouraged to write tests for new or existing features. +Further information about the test framework and individual RPC +tests is found in [qa/rpc-tests](/qa/rpc-tests). diff --git a/qa/pull-tester/rpc-tests.py b/qa/pull-tester/rpc-tests.py new file mode 100755 index 000000000..787b6d5de --- /dev/null +++ b/qa/pull-tester/rpc-tests.py @@ -0,0 +1,525 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2016 The Bitcoin Core developers +# Copyright (c) 2020-2022 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +""" +rpc-tests.py - run regression test suite + +This module calls down into individual test cases via subprocess. It will +forward all unrecognized arguments onto the individual test scripts. + +RPC tests are disabled on Windows by default. Use --force to run them anyway. + +For a description of arguments recognized by test scripts, see +`qa/pull-tester/test_framework/test_framework.py:BitcoinTestFramework.main`. + +""" + +import argparse +import configparser +import os +import time +import shutil +import sys +import subprocess +import tempfile +import re + +SERIAL_SCRIPTS = [ + # These tests involve enough shielded spends (consuming all CPU + # cores) that we can't run them in parallel. + 'mergetoaddress_sapling.py', + 'mergetoaddress_ua_nu5.py', + 'mergetoaddress_ua_sapling.py', + 'wallet_shieldingcoinbase.py', +] + +BASE_SCRIPTS= [ + # Scripts that are run by the travis build process + # Longest test should go first, to favor running tests in parallel + # vv Tests less than 5m vv + 'wallet.py', + 'sprout_sapling_migration.py', + 'remove_sprout_shielding.py', + 'mempool_packages.py', + # vv Tests less than 2m vv + 'mergetoaddress_mixednotes.py', + 'wallet_shieldcoinbase_sapling.py', + 'wallet_shieldcoinbase_ua_sapling.py', + 'wallet_shieldcoinbase_ua_nu5.py', + 'turnstile.py', + 'walletbackup.py', + 'zkey_import_export.py', + 'prioritisetransaction.py', + 'wallet_changeaddresses.py', + 'wallet_listreceived.py', + 'mempool_tx_expiry.py', + 'finalsaplingroot.py', + 'finalorchardroot.py', + 'wallet_orchard.py', + 'wallet_overwintertx.py', + 'wallet_persistence.py', + 'wallet_listnotes.py', + 'wallet_listunspent.py', + 'wallet_golden_5_6_0.py', + 'wallet_tarnished_5_6_0.py', + # vv Tests less than 60s vv + 'orchard_reorg.py', + 'fundrawtransaction.py', + 'reorg_limit.py', + 'mempool_limit.py', + 'p2p-fullblocktest.py', + # vv Tests less than 30s vv + 'wallet_1941.py', + 'wallet_accounts.py', + 'wallet_addresses.py', + 'wallet_anchorfork.py', + 'wallet_changeindicator.py', + 'wallet_deprecation.py', + 'wallet_doublespend.py', + 'wallet_import_export.py', + 'wallet_isfromme.py', + 'wallet_orchard_change.py', + 'wallet_orchard_init.py', + 'wallet_orchard_persistence.py', + 'wallet_orchard_reindex.py', + 'wallet_nullifiers.py', + 'wallet_sapling.py', + 'wallet_sendmany_any_taddr.py', + 'wallet_treestate.py', + 'wallet_unified_change.py', + 'listtransactions.py', + 'mempool_resurrect_test.py', + 'txn_doublespend.py', + 'txn_doublespend.py --mineblock', + 'getchaintips.py', + 'rawtransactions.py', + 'getrawtransaction_insight.py', + 'rest.py', + 'mempool_spendcoinbase.py', + 'mempool_reorg.py', + 'mempool_nu_activation.py', + 'httpbasics.py', + 'multi_rpc.py', + 'zapwallettxes.py', + 'proxy_test.py', + 'merkle_blocks.py', + 'signrawtransactions.py', + 'signrawtransaction_offline.py', + 'key_import_export.py', + 'nodehandling.py', + 'reindex.py', + 'addressindex.py', + 'spentindex.py', + 'timestampindex.py', + 'decodescript.py', + 'blockchain.py', + 'disablewallet.py', + 'keypool.py', + 'getblocktemplate.py', + 'getmininginfo.py', + 'bip65-cltv-p2p.py', + 'bipdersig-p2p.py', + 'invalidblockrequest.py', + 'invalidtxrequest.py', + 'p2p_nu_peer_management.py', + 'rewind_index.py', + 'p2p_txexpiry_dos.py', + 'p2p_txexpiringsoon.py', + 'p2p_node_bloom.py', + 'regtest_signrawtransaction.py', + 'shorter_block_times.py', + 'mining_shielded_coinbase.py', + 'coinbase_funding_streams.py', + 'framework.py', + 'sapling_rewind_check.py', + 'feature_zip221.py', + 'feature_zip239.py', + 'feature_zip244_blockcommitments.py', + 'upgrade_golden.py', + 'nuparams.py', + 'post_heartwood_rollback.py', + 'feature_logging.py', + 'feature_walletfile.py', + 'wallet_parsing_amounts.py', + 'wallet_broadcast.py', + 'wallet_z_sendmany.py', + 'wallet_zero_value.py', + 'threeofthreerestore.py', + 'show_help.py', + 'errors.py', +] + +ZMQ_SCRIPTS = [ + # ZMQ test can only be run if bitcoin was built with zmq-enabled. + # call rpc_tests.py with --nozmq to explicitly exclude these tests. + "zmq_test.py"] + +EXTENDED_SCRIPTS = [ + # These tests are not run by the travis build process. + # Longest test should go first, to favor running tests in parallel + 'pruning.py', + # vv Tests less than 5m vv + # vv Tests less than 2m vv + 'getblocktemplate_longpoll.py', + # vv Tests less than 60s vv + 'rpcbind_test.py', + # vv Tests less than 30s vv + 'getblocktemplate_proposals.py', + 'forknotify.py', + 'hardforkdetection.py', + 'invalidateblock.py', + 'receivedby.py', + 'maxblocksinflight.py', +# 'forknotify.py', + 'p2p-acceptblock.py', + 'maxuploadtarget.py', + 'wallet_db_flush.py', +] + +ALL_SCRIPTS = SERIAL_SCRIPTS + BASE_SCRIPTS + ZMQ_SCRIPTS + EXTENDED_SCRIPTS + +def main(): + # Parse arguments and pass through unrecognised args + parser = argparse.ArgumentParser(add_help=False, + usage='%(prog)s [rpc-test.py options] [script options] [scripts]', + description=__doc__, + epilog=''' + Help text and arguments for individual test script:''', + formatter_class=argparse.RawTextHelpFormatter) + parser.add_argument('--coverage', action='store_true', help='generate a basic coverage report for the RPC interface') + parser.add_argument('--deterministic', '-d', action='store_true', help='make the output a bit closer to deterministic in order to compare runs.') + parser.add_argument('--exclude', '-x', help='specify a comma-seperated-list of scripts to exclude. Do not include the .py extension in the name.') + parser.add_argument('--extended', action='store_true', help='run the extended test suite in addition to the basic tests') + parser.add_argument('--force', '-f', action='store_true', help='run tests even on platforms where they are disabled by default (e.g. windows).') + parser.add_argument('--help', '-h', '-?', action='store_true', help='print help text and exit') + parser.add_argument('--jobs', '-j', type=int, default=4, help='how many test scripts to run in parallel. Default=4.') + parser.add_argument('--machines', '-m', type=int, default=-1, help='how many machines to shard the tests over. must also provide individual shard index. Default=-1 (no sharding).') + parser.add_argument('--rpcgroup', '-r', type=int, default=-1, help='individual shard index. must also provide how many machines to shard the tests over. Default=-1 (no sharding).') + parser.add_argument('--nozmq', action='store_true', help='do not run the zmq tests') + args, unknown_args = parser.parse_known_args() + + # Create a set to store arguments and create the passon string + tests = set(arg for arg in unknown_args if arg[:2] != "--") + passon_args = [arg for arg in unknown_args if arg[:2] == "--"] + + # Read config generated by configure. + config = configparser.ConfigParser() + config.read_file(open(os.path.dirname(__file__) + "/tests_config.ini")) + + enable_wallet = config["components"].getboolean("ENABLE_WALLET") + enable_utils = config["components"].getboolean("ENABLE_UTILS") + enable_bitcoind = config["components"].getboolean("ENABLE_BITCOIND") + enable_zmq = config["components"].getboolean("ENABLE_ZMQ") and not args.nozmq + + if config["environment"]["EXEEXT"] == ".exe" and not args.force: + # https://github.com/bitcoin/bitcoin/commit/d52802551752140cf41f0d9a225a43e84404d3e9 + # https://github.com/bitcoin/bitcoin/pull/5677#issuecomment-136646964 + print("Tests currently disabled on Windows by default. Use --force option to enable") + sys.exit(0) + + if not (enable_wallet and enable_utils and enable_bitcoind): + print("No rpc tests to run. Wallet, utils, and bitcoind must all be enabled") + print("Rerun `configure` with -enable-wallet, -with-utils and -with-daemon and rerun make") + sys.exit(0) + + # python3-zmq may not be installed. Handle this gracefully and with some helpful info + if enable_zmq: + try: + import zmq + zmq # Silences pyflakes + except ImportError: + print("ERROR: \"import zmq\" failed. Use --nozmq to run without the ZMQ tests." + "To run zmq tests, see dependency info in /qa/README.md.") + raise + + # Build list of tests + if tests: + # Individual tests have been specified. Run specified tests that exist + # in the ALL_SCRIPTS list. Accept the name with or without .py extension. + test_list = [t for t in ALL_SCRIPTS if + (t in tests or re.sub(".py$", "", t) in tests)] + + print("Running individually selected tests: ") + for t in test_list: + print("\t" + t) + else: + # No individual tests have been specified. Run base tests, and + # optionally ZMQ tests and extended tests. + test_list = SERIAL_SCRIPTS + BASE_SCRIPTS + if enable_zmq: + test_list += ZMQ_SCRIPTS + if args.extended: + test_list += EXTENDED_SCRIPTS + # TODO: BASE_SCRIPTS and EXTENDED_SCRIPTS are sorted by runtime + # (for parallel running efficiency). This combined list will is no + # longer sorted. + + # Remove the test cases that the user has explicitly asked to exclude. + if args.exclude: + for exclude_test in args.exclude.split(','): + if exclude_test + ".py" in test_list: + test_list.remove(exclude_test + ".py") + + if not test_list: + print("No valid test scripts specified. Check that your test is in one " + "of the test lists in rpc-tests.py, or run rpc-tests.py with no arguments to run all tests") + sys.exit(0) + + if args.help: + # Print help for rpc-tests.py, then print help of the first script and exit. + parser.print_help() + subprocess.check_call((config["environment"]["SRCDIR"] + '/qa/rpc-tests/' + test_list[0]).split() + ['-h']) + sys.exit(0) + + + if (args.rpcgroup == -1) != (args.machines == -1): + print("ERROR: Please use both -m and -r options when using parallel rpc_groups.") + sys.exit(0) + if args.machines == 0: + print("ERROR: -m/--machines must be greater than 0") + sys.exit(0) + if args.machines > 0 and (args.rpcgroup >= args.machines): + print("ERROR: -r/--rpcgroup must be less than -m/--machines") + sys.exit(0) + if args.rpcgroup != -1 and args.machines != -1 and args.machines > args.rpcgroup: + # Ceiling division using floor division, by inverting the world. + # https://stackoverflow.com/a/17511341 + k = -(len(test_list) // -args.machines) + split_list = list(test_list[i*k:(i+1)*k] for i in range(args.machines)) + tests_to_run = split_list[args.rpcgroup] + else: + tests_to_run = test_list + all_passed = run_tests( + RPCTestHandler, + tests_to_run, + config["environment"]["SRCDIR"], + config["environment"]["BUILDDIR"], + config["environment"]["EXEEXT"], + args.jobs, + args.coverage, + args.deterministic, + passon_args) + sys.exit(not all_passed) + +def run_tests(test_handler, test_list, src_dir, build_dir, exeext, jobs=1, enable_coverage=False, deterministic=False, args=[]): + BOLD = ("","") + if os.name == 'posix': + # primitive formatting on supported + # terminal via ANSI escape sequences: + BOLD = ('\033[0m', '\033[1m') + + #Set env vars + if "ZCASHD" not in os.environ: + os.environ["ZCASHD"] = build_dir + '/src/zcashd' + exeext + + tests_dir = src_dir + '/qa/rpc-tests/' + + flags = ["--srcdir={}/src".format(build_dir)] + args + flags.append("--cachedir=%s/qa/cache" % build_dir) + + if enable_coverage: + coverage = RPCCoverage() + flags.append(coverage.flag) + print("Initializing coverage directory at %s\n" % coverage.dir) + else: + coverage = None + + if len(test_list) > 1 and jobs > 1: + # Populate cache + subprocess.check_output([tests_dir + 'create_cache.py'] + flags) + + #Run Tests + time_sum = 0 + time0 = time.time() + + job_queue = test_handler(jobs, tests_dir, test_list, flags) + + max_len_name = len(max(test_list, key=len)) + total_count = 0 + passed_count = 0 + results = [] + try: + for _ in range(len(test_list)): + (name, stdout, stderr, passed, duration) = job_queue.get_next(deterministic) + time_sum += duration + + print('\n' + BOLD[1] + name + BOLD[0] + ":") + print('' if passed else stdout + '\n', end='') + print('' if stderr == '' else 'stderr:\n' + stderr + '\n', end='') + print("Pass: %s%s%s" % (BOLD[1], passed, BOLD[0]), end='') + if deterministic: + print("\n", end='') + else: + print(", Duration: %s s" % (duration,)) + total_count += 1 + if passed: + passed_count += 1 + + new_result = "%s | %s" % (name.ljust(max_len_name), str(passed).ljust(6)) + if not deterministic: + new_result += (" | %s s" % (duration,)) + results.append(new_result) + except (InterruptedError, KeyboardInterrupt): + print('\nThe following tests were running when interrupted:') + for j in job_queue.jobs: + print("•", j[0]) + print('\n', end='') + + all_passed = passed_count == total_count + + if all_passed: + success_rate = "True" + else: + success_rate = "%d/%d" % (passed_count, total_count) + header = "%s | PASSED" % ("TEST".ljust(max_len_name),) + footer = "%s | %s" % ("ALL".ljust(max_len_name), str(success_rate).ljust(6)) + if not deterministic: + header += " | DURATION" + footer += " | %s s (accumulated)\nRuntime: %s s" % (time_sum, int(time.time() - time0)) + print( + BOLD[1] + header + BOLD[0] + "\n\n" + + "\n".join(sorted(results)) + "\n" + + BOLD[1] + footer + BOLD[0]) + + if coverage: + coverage.report_rpc_coverage() + + print("Cleaning up coverage data") + coverage.cleanup() + + return all_passed + +class RPCTestHandler: + """ + Trigger the testscrips passed in via the list. + """ + + def __init__(self, num_tests_parallel, tests_dir, test_list=None, flags=None): + assert(num_tests_parallel >= 1) + self.num_jobs = num_tests_parallel + self.tests_dir = tests_dir + self.test_list = test_list + self.flags = flags + self.num_running = 0 + # In case there is a graveyard of zombie bitcoinds, we can apply a + # pseudorandom offset to hopefully jump over them. + # (625 is PORT_RANGE/MAX_NODES) + self.portseed_offset = int(time.time() * 1000) % 625 + self.jobs = [] + + def start_test(self, args, stdout, stderr): + return subprocess.Popen( + args, + universal_newlines=True, + stdout=stdout, + stderr=stderr) + + def get_next(self, deterministic): + while self.num_running < self.num_jobs and self.test_list: + # Add tests + self.num_running += 1 + t = self.test_list.pop(0) + port_seed = ["--portseed={}".format(len(self.test_list) + self.portseed_offset)] + log_stdout = tempfile.SpooledTemporaryFile(max_size=2**16) + log_stderr = tempfile.SpooledTemporaryFile(max_size=2**16) + self.jobs.append((t, + time.time(), + self.start_test((self.tests_dir + t).split() + self.flags + port_seed, + log_stdout, + log_stderr), + log_stdout, + log_stderr)) + # Run serial scripts on their own. We always run these first, + # so we won't have added any other jobs yet. + if t in SERIAL_SCRIPTS: + break + if not self.jobs: + raise IndexError('pop from empty list') + while True: + # Return first proc that finishes + time.sleep(.5) + for j in self.jobs: + (name, time0, proc, log_out, log_err) = j + if proc.poll() is not None: + log_out.seek(0), log_err.seek(0) + [stdout, stderr] = [l.read().decode('utf-8') for l in (log_out, log_err)] + log_out.close(), log_err.close() + passed = stderr == "" and proc.returncode == 0 + self.num_running -= 1 + self.jobs.remove(j) + return name, stdout, stderr, passed, int(time.time() - time0) + if not deterministic: + print('.', end='', flush=True) + + +class RPCCoverage(object): + """ + Coverage reporting utilities for pull-tester. + + Coverage calculation works by having each test script subprocess write + coverage files into a particular directory. These files contain the RPC + commands invoked during testing, as well as a complete listing of RPC + commands per `bitcoin-cli help` (`rpc_interface.txt`). + + After all tests complete, the commands run are combined and diff'd against + the complete list to calculate uncovered RPC commands. + + See also: qa/rpc-tests/test_framework/coverage.py + + """ + def __init__(self): + self.dir = tempfile.mkdtemp(prefix="coverage") + self.flag = '--coveragedir=%s' % self.dir + + def report_rpc_coverage(self): + """ + Print out RPC commands that were unexercised by tests. + + """ + uncovered = self._get_uncovered_rpc_commands() + + if uncovered: + print("Uncovered RPC commands:") + print("".join((" - %s\n" % i) for i in sorted(uncovered))) + else: + print("All RPC commands covered.") + + def cleanup(self): + return shutil.rmtree(self.dir) + + def _get_uncovered_rpc_commands(self): + """ + Return a set of currently untested RPC commands. + + """ + # This is shared from `qa/rpc-tests/test-framework/coverage.py` + reference_filename = 'rpc_interface.txt' + coverage_file_prefix = 'coverage.' + + coverage_ref_filename = os.path.join(self.dir, reference_filename) + coverage_filenames = set() + all_cmds = set() + covered_cmds = set() + + if not os.path.isfile(coverage_ref_filename): + raise RuntimeError("No coverage reference found") + + with open(coverage_ref_filename, 'r', encoding='utf8') as f: + all_cmds.update([i.strip() for i in f.readlines()]) + + for root, dirs, files in os.walk(self.dir): + for filename in files: + if filename.startswith(coverage_file_prefix): + coverage_filenames.add(os.path.join(root, filename)) + + for filename in coverage_filenames: + with open(filename, 'r', encoding='utf8') as f: + covered_cmds.update([i.strip() for i in f.readlines()]) + + return all_cmds - covered_cmds + + +if __name__ == '__main__': + main() diff --git a/qa/pull-tester/tests_config.ini.in b/qa/pull-tester/tests_config.ini.in new file mode 100644 index 000000000..8794fa3a8 --- /dev/null +++ b/qa/pull-tester/tests_config.ini.in @@ -0,0 +1,19 @@ +# Copyright (c) 2013-2016 The Bitcoin Core developers +# Copyright (c) 2020-2022 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +# These environment variables are set by the build process and read by +# rpc-tests.py + +[environment] +SRCDIR=@abs_top_srcdir@ +BUILDDIR=@abs_top_builddir@ +EXEEXT=@EXEEXT@ + +[components] +# Which components are enabled. These are commented out by `configure` if they were disabled when running config. +@ENABLE_WALLET_TRUE@ENABLE_WALLET=true +@BUILD_BITCOIN_UTILS_TRUE@ENABLE_UTILS=true +@BUILD_BITCOIND_TRUE@ENABLE_BITCOIND=true +@ENABLE_ZMQ_TRUE@ENABLE_ZMQ=true diff --git a/qa/rpc-tests/.gitignore b/qa/rpc-tests/.gitignore new file mode 100644 index 000000000..0d20b6487 --- /dev/null +++ b/qa/rpc-tests/.gitignore @@ -0,0 +1 @@ +*.pyc diff --git a/qa/rpc-tests/README.md b/qa/rpc-tests/README.md new file mode 100644 index 000000000..315feae71 --- /dev/null +++ b/qa/rpc-tests/README.md @@ -0,0 +1,108 @@ +Regression tests +================ + +### [test_framework/test_framework.py](test_framework/test_framework.py) +Base class for RPC regression tests. + +### [test_framework/util.py](test_framework/util.py) +Generally useful functions. + +### [test_framework/mininode.py](test_framework/mininode.py) +Basic code to support p2p connectivity to a bitcoind. + +### [test_framework/comptool.py](test_framework/comptool.py) +Framework for comparison-tool style, p2p tests. + +### [test_framework/script.py](test_framework/script.py) +Utilities for manipulating transaction scripts (originally from python-bitcoinlib) + +### [test_framework/blockstore.py](test_framework/blockstore.py) +Implements disk-backed block and tx storage. + +### [test_framework/key.py](test_framework/key.py) +Wrapper around OpenSSL EC_Key (originally from python-bitcoinlib) + +### [test_framework/bignum.py](test_framework/bignum.py) +Helpers for script.py + +### [test_framework/blocktools.py](test_framework/blocktools.py) +Helper functions for creating blocks and transactions. + +P2P test design notes +--------------------- + +## Mininode + +* ```mininode.py``` contains all the definitions for objects that pass +over the network (```CBlock```, ```CTransaction```, etc, along with the network-level +wrappers for them, ```msg_block```, ```msg_tx```, etc). + +* P2P tests have two threads. One thread handles all network communication +with the bitcoind(s) being tested (using python's asyncore package); the other +implements the test logic. + +* ```NodeConn``` is the class used to connect to a bitcoind. If you implement +a callback class that derives from ```NodeConnCB``` and pass that to the +```NodeConn``` object, your code will receive the appropriate callbacks when +events of interest arrive. NOTE: be sure to call +```self.create_callback_map()``` in your derived classes' ```__init__``` +function, so that the correct mappings are set up between p2p messages and your +callback functions. + +* You can pass the same handler to multiple ```NodeConn```'s if you like, or pass +different ones to each -- whatever makes the most sense for your test. + +* Call ```NetworkThread.start()``` after all ```NodeConn``` objects are created to +start the networking thread. (Continue with the test logic in your existing +thread.) + +* RPC calls are available in p2p tests. + +* Can be used to write free-form tests, where specific p2p-protocol behavior +is tested. Examples: ```p2p-accept-block.py```, ```maxblocksinflight.py```. + +## Comptool + +* Testing framework for writing tests that compare the block/tx acceptance +behavior of a bitcoind against 1 or more other bitcoind instances, or against +known outcomes, or both. + +* Set the ```num_nodes``` variable (defined in ```ComparisonTestFramework```) to start up +1 or more nodes. If using 1 node, then ```--testbinary``` can be used as a command line +option to change the bitcoind binary used by the test. If using 2 or more nodes, +then ```--refbinary``` can be optionally used to change the bitcoind that will be used +on nodes 2 and up. + +* Implement a (generator) function called ```get_tests()``` which yields ```TestInstance```s. +Each ```TestInstance``` consists of: + - a list of ```[object, outcome, hash]``` entries + * ```object``` is a ```CBlock```, ```CTransaction```, or + ```CBlockHeader```. ```CBlock```'s and ```CTransaction```'s are tested for + acceptance. ```CBlockHeader```s can be used so that the test runner can deliver + complete headers-chains when requested from the bitcoind, to allow writing + tests where blocks can be delivered out of order but still processed by + headers-first bitcoind's. + * ```outcome``` is ```True```, ```False```, or ```None```. If ```True``` + or ```False```, the tip is compared with the expected tip -- either the + block passed in, or the hash specified as the optional 3rd entry. If + ```None``` is specified, then the test will compare all the bitcoind's + being tested to see if they all agree on what the best tip is. + * ```hash``` is the block hash of the tip to compare against. Optional to + specify; if left out then the hash of the block passed in will be used as + the expected tip. This allows for specifying an expected tip while testing + the handling of either invalid blocks or blocks delivered out of order, + which complete a longer chain. + - ```sync_every_block```: ```True/False```. If ```False```, then all blocks + are inv'ed together, and the test runner waits until the node receives the + last one, and tests only the last block for tip acceptance using the + outcome and specified tip. If ```True```, then each block is tested in + sequence and synced (this is slower when processing many blocks). + - ```sync_every_transaction```: ```True/False```. Analogous to + ```sync_every_block```, except if the outcome on the last tx is "None", + then the contents of the entire mempool are compared across all bitcoind + connections. If ```True``` or ```False```, then only the last tx's + acceptance is tested against the given outcome. + +* For examples of tests written in this framework, see + ```invalidblockrequest.py``` and ```p2p-fullblocktest.py```. + diff --git a/qa/rpc-tests/addressindex.py b/qa/rpc-tests/addressindex.py new file mode 100755 index 000000000..6d5251e63 --- /dev/null +++ b/qa/rpc-tests/addressindex.py @@ -0,0 +1,389 @@ +#!/usr/bin/env python3 +# Copyright (c) 2019 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . +# +# Test addressindex generation and fetching for insightexplorer or lightwalletd +# +# RPCs tested here: +# +# getaddresstxids +# getaddressbalance +# getaddressdeltas +# getaddressutxos +# getaddressmempool + + +from test_framework.test_framework import BitcoinTestFramework + +from test_framework.util import ( + assert_equal, + start_nodes, + stop_nodes, + connect_nodes, + wait_bitcoinds +) + +from test_framework.script import ( + CScript, + OP_HASH160, + OP_EQUAL, + OP_DUP, + OP_DROP, +) + +from test_framework.mininode import ( + COIN, + CTransaction, + CTxIn, CTxOut, COutPoint, +) + +from binascii import hexlify, unhexlify + + +class AddressIndexTest(BitcoinTestFramework): + + def __init__(self): + super().__init__() + self.num_nodes = 4 + self.cache_behavior = 'clean' + + def setup_network(self): + base_args = [ + '-minrelaytxfee=0', + '-debug', + '-txindex', + '-experimentalfeatures', + '-allowdeprecated=getnewaddress', + ] + # -insightexplorer causes addressindex to be enabled (fAddressIndex = true) + args_insight = base_args + ['-insightexplorer'] + # -lightwallet also causes addressindex to be enabled + args_lightwallet = base_args + ['-lightwalletd'] + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, [args_insight] * 3 + [args_lightwallet]) + + connect_nodes(self.nodes[0], 1) + connect_nodes(self.nodes[0], 2) + connect_nodes(self.nodes[0], 3) # node3 is only for testing lightwalletd + + self.is_network_split = False + self.sync_all() + + def run_test(self): + + # helper functions + def getaddresstxids(node_index, addresses, start, end): + return self.nodes[node_index].getaddresstxids({ + 'addresses': addresses, + 'start': start, + 'end': end + }) + + def getaddressdeltas(node_index, addresses, start, end, chainInfo=None): + params = { + 'addresses': addresses, + 'start': start, + 'end': end, + } + if chainInfo is not None: + params.update({'chainInfo': chainInfo}) + return self.nodes[node_index].getaddressdeltas(params) + + # default received value is the balance value + def check_balance(node_index, address, expected_balance, expected_received=None): + if isinstance(address, list): + bal = self.nodes[node_index].getaddressbalance({'addresses': address}) + else: + bal = self.nodes[node_index].getaddressbalance(address) + assert_equal(bal['balance'], expected_balance) + if expected_received is None: + expected_received = expected_balance + assert_equal(bal['received'], expected_received) + + # begin test + + self.nodes[0].generate(105) + self.sync_all() + assert_equal(self.nodes[0].getbalance(), 5 * 10) + assert_equal(self.nodes[1].getblockcount(), 105) + assert_equal(self.nodes[1].getbalance(), 0) + + # only the oldest 5; subsequent are not yet mature + unspent_txids = [u['txid'] for u in self.nodes[0].listunspent()] + + # Currently our only unspents are coinbase transactions, choose any one + tx = self.nodes[0].getrawtransaction(unspent_txids[0], 1) + + # It just so happens that the first output is the mining reward, + # which has type pay-to-public-key-hash, and the second output + # is the founders' reward, which has type pay-to-script-hash. + addr_p2pkh = tx['vout'][0]['scriptPubKey']['addresses'][0] + addr_p2sh = tx['vout'][1]['scriptPubKey']['addresses'][0] + + # Check that balances from mining are correct (105 blocks mined); in + # regtest, all mining rewards from a single call to generate() are sent + # to the same pair of addresses. + check_balance(1, addr_p2pkh, 105 * 10 * COIN) + check_balance(1, addr_p2sh, 105 * 2.5 * COIN) + + # Multiple address arguments, results are the sum + check_balance(1, [addr_p2sh, addr_p2pkh], 105 * 12.5 * COIN) + + assert_equal(len(self.nodes[1].getaddresstxids(addr_p2pkh)), 105) + assert_equal(len(self.nodes[1].getaddresstxids(addr_p2sh)), 105) + # test getaddresstxids for lightwalletd + assert_equal(len(self.nodes[3].getaddresstxids(addr_p2pkh)), 105) + assert_equal(len(self.nodes[3].getaddresstxids(addr_p2sh)), 105) + + # only the oldest 5 transactions are in the unspent list, + # dup addresses are ignored + height_txids = getaddresstxids(1, [addr_p2pkh, addr_p2pkh], 1, 5) + assert_equal(sorted(height_txids), sorted(unspent_txids)) + + height_txids = getaddresstxids(1, [addr_p2sh], 1, 5) + assert_equal(sorted(height_txids), sorted(unspent_txids)) + + # each txid should appear only once + height_txids = getaddresstxids(1, [addr_p2pkh, addr_p2sh], 1, 5) + assert_equal(sorted(height_txids), sorted(unspent_txids)) + + # do some transfers, make sure balances are good + txids_a1 = [] + addr1 = self.nodes[1].getnewaddress() + expected = 0 + expected_deltas = [] # for checking getaddressdeltas (below) + for i in range(5): + # first transaction happens at height 105, mined in block 106 + txid = self.nodes[0].sendtoaddress(addr1, i + 1) + txids_a1.append(txid) + self.nodes[0].generate(1) + self.sync_all() + expected += i + 1 + expected_deltas.append({ + 'height': 106 + i, + 'satoshis': (i + 1) * COIN, + 'txid': txid, + }) + check_balance(1, addr1, expected * COIN) + assert_equal(sorted(self.nodes[0].getaddresstxids(addr1)), sorted(txids_a1)) + assert_equal(sorted(self.nodes[1].getaddresstxids(addr1)), sorted(txids_a1)) + + # Restart all nodes to ensure indices are saved to disk and recovered + stop_nodes(self.nodes) + wait_bitcoinds() + self.setup_network() + + bal = self.nodes[1].getaddressbalance(addr1) + assert_equal(bal['balance'], expected * COIN) + assert_equal(bal['received'], expected * COIN) + assert_equal(sorted(self.nodes[0].getaddresstxids(addr1)), sorted(txids_a1)) + assert_equal(sorted(self.nodes[1].getaddresstxids(addr1)), sorted(txids_a1)) + + # Send 3 from addr1, but -- subtlety alert! -- addr1 at this + # time has 4 UTXOs, with values 1, 2, 3, 4. Sending value 3 requires + # using up the value 4 UTXO, because of the tx fee + # (the 3 UTXO isn't quite large enough). + # + # The txid from sending *from* addr1 is also added to the list of + # txids associated with that address (test will verify below). + + addr2 = self.nodes[2].getnewaddress() + txid = self.nodes[1].sendtoaddress(addr2, 3) + self.sync_all() + + # the one tx in the mempool refers to addresses addr1 and addr2, + # check that duplicate addresses are processed correctly + mempool = self.nodes[0].getaddressmempool({'addresses': [addr2, addr1, addr2]}) + assert_equal(len(mempool), 3) + # test getaddressmempool for lightwalletd node + mempool = self.nodes[3].getaddressmempool({'addresses': [addr2, addr1, addr2]}) + assert_equal(len(mempool), 3) + + # addr2 (first arg) + assert_equal(mempool[0]['address'], addr2) + assert_equal(mempool[0]['satoshis'], 3 * COIN) + assert_equal(mempool[0]['txid'], txid) + + # addr1 (second arg) + assert_equal(mempool[1]['address'], addr1) + assert_equal(mempool[1]['satoshis'], (-4) * COIN) + assert_equal(mempool[1]['txid'], txid) + + # addr2 (third arg) + assert_equal(mempool[2]['address'], addr2) + assert_equal(mempool[2]['satoshis'], 3 * COIN) + assert_equal(mempool[2]['txid'], txid) + + # a single address can be specified as a string (not json object) + addr1_mempool = self.nodes[0].getaddressmempool(addr1) + assert_equal(len(addr1_mempool), 1) + # Don't check the timestamp; it's local to the node, and can mismatch + # due to propagation delay. + del addr1_mempool[0]['timestamp'] + for key in addr1_mempool[0].keys(): + assert_equal(mempool[1][key], addr1_mempool[0][key]) + + tx = self.nodes[0].getrawtransaction(txid, 1) + assert_equal(tx['vin'][0]['address'], addr1) + assert_equal(tx['vin'][0]['value'], 4) + assert_equal(tx['vin'][0]['valueSat'], 4 * COIN) + + txids_a1.append(txid) + expected_deltas.append({ + 'height': 111, + 'satoshis': (-4) * COIN, + 'txid': txid, + }) + self.sync_all() # ensure transaction is included in the next block + self.nodes[0].generate(1) + self.sync_all() + + # the send to addr2 tx is now in a mined block, no longer in the mempool + mempool = self.nodes[0].getaddressmempool({'addresses': [addr2, addr1]}) + assert_equal(len(mempool), 0) + + # Test DisconnectBlock() by invalidating the most recent mined block + tip = self.nodes[1].getchaintips()[0] + for i in range(self.num_nodes): + node = self.nodes[i] + # the value 4 UTXO is no longer in our balance + check_balance(i, addr1, (expected - 4) * COIN, expected * COIN) + check_balance(i, addr2, 3 * COIN) + + assert_equal(node.getblockcount(), 111) + node.invalidateblock(tip['hash']) + assert_equal(node.getblockcount(), 110) + + mempool = node.getaddressmempool({'addresses': [addr2, addr1]}) + assert_equal(len(mempool), 2) + + check_balance(i, addr1, expected * COIN) + check_balance(i, addr2, 0) + + # now re-mine the addr1 to addr2 send + self.nodes[0].generate(1) + self.sync_all() + for node in self.nodes: + assert_equal(node.getblockcount(), 111) + + mempool = self.nodes[0].getaddressmempool({'addresses': [addr2, addr1]}) + assert_equal(len(mempool), 0) + + # the value 4 UTXO is no longer in our balance + check_balance(2, addr1, (expected - 4) * COIN, expected * COIN) + + # Ensure the change from that transaction appears + tx = self.nodes[0].getrawtransaction(txid, 1) + change_vout = list(filter(lambda v: v['valueZat'] != 3 * COIN, tx['vout'])) + change = change_vout[0]['scriptPubKey']['addresses'][0] + + # test getaddressbalance + for node in (2, 3): + bal = self.nodes[node].getaddressbalance(change) + assert(bal['received'] > 0) + + # the inequality is due to randomness in the tx fee + assert(bal['received'] < (4 - 3) * COIN) + assert_equal(bal['received'], bal['balance']) + assert_equal(self.nodes[2].getaddresstxids(change), [txid]) + + # Further checks that limiting by height works + + # various ranges + for i in range(5): + height_txids = getaddresstxids(1, [addr1], 106, 106 + i) + assert_equal(height_txids, txids_a1[0:i+1]) + + height_txids = getaddresstxids(1, [addr1], 1, 108) + assert_equal(height_txids, txids_a1[0:3]) + + # Further check specifying multiple addresses + txids_all = list(txids_a1) + txids_all += self.nodes[1].getaddresstxids(addr_p2pkh) + txids_all += self.nodes[1].getaddresstxids(addr_p2sh) + multitxids = self.nodes[1].getaddresstxids({ + 'addresses': [addr1, addr_p2sh, addr_p2pkh] + }) + # No dups in return list from getaddresstxids + assert_equal(len(multitxids), len(set(multitxids))) + + # set(txids_all) removes its (expected) duplicates + assert_equal(set(multitxids), set(txids_all)) + + # test getaddressdeltas + for node in (1, 3): + deltas = self.nodes[node].getaddressdeltas({'addresses': [addr1]}) + assert_equal(len(deltas), len(expected_deltas)) + for i in range(len(deltas)): + assert_equal(deltas[i]['address'], addr1) + assert_equal(deltas[i]['height'], expected_deltas[i]['height']) + assert_equal(deltas[i]['satoshis'], expected_deltas[i]['satoshis']) + assert_equal(deltas[i]['txid'], expected_deltas[i]['txid']) + + # 106-111 is the full range (also the default) + deltas_limited = getaddressdeltas(1, [addr1], 106, 111) + assert_equal(deltas_limited, deltas) + + # only the first element missing + deltas_limited = getaddressdeltas(1, [addr1], 107, 111) + assert_equal(deltas_limited, deltas[1:]) + + deltas_limited = getaddressdeltas(1, [addr1], 109, 109) + assert_equal(deltas_limited, deltas[3:4]) + + # the full range (also the default) + deltas_info = getaddressdeltas(1, [addr1], 106, 111, chainInfo=True) + assert_equal(deltas_info['deltas'], deltas) + + # check the additional items returned by chainInfo + assert_equal(deltas_info['start']['height'], 106) + block_hash = self.nodes[1].getblockhash(106) + assert_equal(deltas_info['start']['hash'], block_hash) + + assert_equal(deltas_info['end']['height'], 111) + block_hash = self.nodes[1].getblockhash(111) + assert_equal(deltas_info['end']['hash'], block_hash) + + # Test getaddressutxos by comparing results with deltas + utxos = self.nodes[3].getaddressutxos(addr1) + + # The value 4 note was spent, so won't show up in the utxo list, + # so for comparison, remove the 4 (and -4 for output) from the + # deltas list + deltas = self.nodes[1].getaddressdeltas({'addresses': [addr1]}) + deltas = list(filter(lambda d: abs(d['satoshis']) != 4 * COIN, deltas)) + assert_equal(len(utxos), len(deltas)) + for i in range(len(utxos)): + assert_equal(utxos[i]['address'], addr1) + assert_equal(utxos[i]['height'], deltas[i]['height']) + assert_equal(utxos[i]['satoshis'], deltas[i]['satoshis']) + assert_equal(utxos[i]['txid'], deltas[i]['txid']) + + # Check that outputs with the same address in the same tx return one txid + # (can't use createrawtransaction() as it combines duplicate addresses) + addr = "t2LMJ6Arw9UWBMWvfUr2QLHM4Xd9w53FftS" + addressHash = unhexlify("97643ce74b188f4fb6bbbb285e067a969041caf2") + scriptPubKey = CScript([OP_HASH160, addressHash, OP_EQUAL]) + # Add an unrecognized script type to vout[], a legal script that pays, + # but won't modify the addressindex (since the address can't be extracted). + # (This extra output has no effect on the rest of the test.) + scriptUnknown = CScript([OP_HASH160, OP_DUP, OP_DROP, addressHash, OP_EQUAL]) + unspent = list(filter(lambda u: u['amount'] >= 4, self.nodes[0].listunspent())) + tx = CTransaction() + tx.vin = [CTxIn(COutPoint(int(unspent[0]['txid'], 16), unspent[0]['vout']))] + tx.vout = [ + CTxOut(1 * COIN, scriptPubKey), + CTxOut(2 * COIN, scriptPubKey), + CTxOut(7 * COIN, scriptUnknown), + ] + tx = self.nodes[0].signrawtransaction(hexlify(tx.serialize()).decode('utf-8')) + txid = self.nodes[0].sendrawtransaction(tx['hex'], True) + self.nodes[0].generate(1) + self.sync_all() + + assert_equal(self.nodes[1].getaddresstxids(addr), [txid]) + check_balance(2, addr, 3 * COIN) + + +if __name__ == '__main__': + AddressIndexTest().main() diff --git a/qa/rpc-tests/bip65-cltv-p2p.py b/qa/rpc-tests/bip65-cltv-p2p.py new file mode 100755 index 000000000..e114500b8 --- /dev/null +++ b/qa/rpc-tests/bip65-cltv-p2p.py @@ -0,0 +1,99 @@ +#!/usr/bin/env python3 +# Copyright (c) 2015-2016 The Bitcoin Core developers +# Copyright (c) 2017-2022 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +from test_framework.test_framework import ComparisonTestFramework +from test_framework.util import hex_str_to_bytes, start_nodes +from test_framework.mininode import CTransaction, NetworkThread +from test_framework.blocktools import create_coinbase, create_block +from test_framework.comptool import TestInstance, TestManager +from test_framework.script import CScript, OP_1NEGATE, OP_NOP2, OP_DROP +from io import BytesIO + +''' +This test is meant to exercise BIP65 (CHECKLOCKTIMEVERIFY). +Connect to a single node. +Mine a coinbase block, and then ... +Mine 1 version 4 block. +Check that the CLTV rules are enforced. + +TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py. +''' + +class BIP65Test(ComparisonTestFramework): + + def setup_network(self): + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, + extra_args=[[ + '-debug', + '-whitelist=127.0.0.1', + '-allowdeprecated=getnewaddress', + ]], + binary=[self.options.testbinary]) + self.is_network_split = False + + def run_test(self): + test = TestManager(self, self.options.tmpdir) + test.add_all_connections(self.nodes) + NetworkThread().start() # Start up network handling in another thread + test.run() + + def create_transaction(self, node, coinbase, to_address, amount): + from_txid = node.getblock(coinbase)['tx'][0] + inputs = [{ "txid" : from_txid, "vout" : 0}] + outputs = { to_address : amount } + rawtx = node.createrawtransaction(inputs, outputs) + signresult = node.signrawtransaction(rawtx) + tx = CTransaction() + f = BytesIO(hex_str_to_bytes(signresult['hex'])) + tx.deserialize(f) + return tx + + def invalidate_transaction(self, tx): + ''' + Modify the signature in vin 0 of the tx to fail CLTV + + Prepends -1 CLTV DROP in the scriptSig itself. + ''' + tx.vin[0].scriptSig = CScript([OP_1NEGATE, OP_NOP2, OP_DROP] + + list(CScript(tx.vin[0].scriptSig))) + + def get_tests(self): + self.coinbase_blocks = self.nodes[0].generate(1) + self.nodes[0].generate(100) + height = 102 # height of the next block to build + hashTip = self.nodes[0].getbestblockhash() + hashFinalSaplingRoot = int("0x" + self.nodes[0].getblock(hashTip)['finalsaplingroot'] , 0) + self.tip = int("0x" + hashTip , 0) + self.nodeaddress = self.nodes[0].getnewaddress() + + '''Check that the rules are enforced.''' + for valid in (True, False): + spendtx = self.create_transaction(self.nodes[0], + self.coinbase_blocks[0], + self.nodeaddress, 1.0) + if not valid: + self.invalidate_transaction(spendtx) + spendtx.rehash() + + gbt = self.nodes[0].getblocktemplate() + self.block_time = gbt["mintime"] + 1 + self.block_bits = int("0x" + gbt["bits"], 0) + + block = create_block(self.tip, create_coinbase(height), + self.block_time, self.block_bits, + hashFinalSaplingRoot) + block.nVersion = 4 + block.vtx.append(spendtx) + block.hashMerkleRoot = block.calc_merkle_root() + block.rehash() + block.solve() + self.block_time += 1 + self.tip = block.sha256 + yield TestInstance([[block, valid]]) + + +if __name__ == '__main__': + BIP65Test().main() diff --git a/qa/rpc-tests/bipdersig-p2p.py b/qa/rpc-tests/bipdersig-p2p.py new file mode 100755 index 000000000..e5cefd12a --- /dev/null +++ b/qa/rpc-tests/bipdersig-p2p.py @@ -0,0 +1,106 @@ +#!/usr/bin/env python3 +# Copyright (c) 2015-2016 The Bitcoin Core developers +# Copyright (c) 2017-2022 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +from test_framework.test_framework import ComparisonTestFramework +from test_framework.util import hex_str_to_bytes, start_nodes +from test_framework.mininode import CTransaction, NetworkThread +from test_framework.blocktools import create_coinbase, create_block +from test_framework.comptool import TestInstance, TestManager +from test_framework.script import CScript +from io import BytesIO + + +''' +This test is meant to exercise BIP66 (DER SIG). +Connect to a single node. +Mine a coinbase block, and then ... +Mine 1 version 4 block. +Check that the DERSIG rules are enforced. + +TODO: factor out common code from {bipdersig-p2p,bip65-cltv-p2p}.py. +''' +class BIP66Test(ComparisonTestFramework): + + def setup_network(self): + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir, + extra_args=[[ + '-debug', + '-whitelist=127.0.0.1', + '-allowdeprecated=getnewaddress', + ]], + binary=[self.options.testbinary]) + self.is_network_split = False + + def run_test(self): + test = TestManager(self, self.options.tmpdir) + test.add_all_connections(self.nodes) + NetworkThread().start() # Start up network handling in another thread + test.run() + + def create_transaction(self, node, coinbase, to_address, amount): + from_txid = node.getblock(coinbase)['tx'][0] + inputs = [{ "txid" : from_txid, "vout" : 0}] + outputs = { to_address : amount } + rawtx = node.createrawtransaction(inputs, outputs) + signresult = node.signrawtransaction(rawtx) + tx = CTransaction() + f = BytesIO(hex_str_to_bytes(signresult['hex'])) + tx.deserialize(f) + return tx + + def invalidate_transaction(self, tx): + ''' + Make the signature in vin 0 of a tx non-DER-compliant, + by adding padding after the S-value. + + A canonical signature consists of: + <30> <02> <02> + ''' + scriptSig = CScript(tx.vin[0].scriptSig) + newscript = [] + for i in scriptSig: + if (len(newscript) == 0): + newscript.append(i[0:-1] + '\0' + i[-1]) + else: + newscript.append(i) + tx.vin[0].scriptSig = CScript(newscript) + + def get_tests(self): + self.coinbase_blocks = self.nodes[0].generate(1) + self.nodes[0].generate(100) + height = 102 # height of the next block to build + hashTip = self.nodes[0].getbestblockhash() + hashFinalSaplingRoot = int("0x" + self.nodes[0].getblock(hashTip)['finalsaplingroot'], 0) + self.tip = int("0x"+hashTip , 0) + self.nodeaddress = self.nodes[0].getnewaddress() + + '''Check that the rules are enforced.''' + for valid in (True, False): + spendtx = self.create_transaction(self.nodes[0], + self.coinbase_blocks[0], + self.nodeaddress, 1.0) + if not valid: + self.invalidate_transaction(spendtx) + spendtx.rehash() + + gbt = self.nodes[0].getblocktemplate() + self.block_time = gbt["mintime"] + 1 + self.block_bits = int("0x" + gbt["bits"], 0) + + block = create_block(self.tip, create_coinbase(height), + self.block_time, self.block_bits, + hashFinalSaplingRoot) + block.nVersion = 4 + block.vtx.append(spendtx) + block.hashMerkleRoot = block.calc_merkle_root() + block.rehash() + block.solve() + self.tip = block.sha256 + yield TestInstance([[block, valid]]) + + +if __name__ == '__main__': + BIP66Test().main() diff --git a/qa/rpc-tests/blockchain.py b/qa/rpc-tests/blockchain.py new file mode 100755 index 000000000..695542e48 --- /dev/null +++ b/qa/rpc-tests/blockchain.py @@ -0,0 +1,53 @@ +#!/usr/bin/env python3 +# Copyright (c) 2014-2016 The Bitcoin Core developers +# Copyright (c) 2018-2022 The Zcash developers +# Distributed under the MIT software license, see the accompanying +# file COPYING or https://www.opensource.org/licenses/mit-license.php . + +# +# Test RPC calls related to blockchain state. Tests correspond to code in +# rpc/blockchain.cpp. +# + +import decimal + +from test_framework.test_framework import BitcoinTestFramework +from test_framework.util import ( + assert_equal, + start_nodes, + connect_nodes_bi, +) + +class BlockchainTest(BitcoinTestFramework): + """ + Test blockchain-related RPC calls: + + - gettxoutsetinfo + + """ + + def __init__(self): + super().__init__() + self.num_nodes = 2 + + def setup_network(self, split=False): + self.nodes = start_nodes(self.num_nodes, self.options.tmpdir) + connect_nodes_bi(self.nodes, 0, 1) + self.is_network_split = False + self.sync_all() + + def run_test(self): + node = self.nodes[0] + res = node.gettxoutsetinfo() + + assert_equal(res['total_amount'], decimal.Decimal('2143.75000000')) # 144*12.5 + 55*6.25 + assert_equal(res['transactions'], 200) + assert_equal(res['height'], 200) + assert_equal(res['txouts'], 343) # 144*2 + 55 + assert_equal(res['bytes_serialized'], 14819), # 32*199 + 48*90 + 49*54 + 27*55 + assert_equal(len(res['bestblock']), 64) + assert_equal(len(res['hash_serialized']), 64) + + +if __name__ == '__main__': + BlockchainTest().main() diff --git a/qa/rpc-tests/cache/golden-v5.6.0/cache_config.json b/qa/rpc-tests/cache/golden-v5.6.0/cache_config.json new file mode 100644 index 000000000..d462171bb --- /dev/null +++ b/qa/rpc-tests/cache/golden-v5.6.0/cache_config.json @@ -0,0 +1,3 @@ +{ + "cache_time": 1687296923.7459898 +} \ No newline at end of file diff --git a/qa/rpc-tests/cache/golden-v5.6.0/chain_cache.tar.gz b/qa/rpc-tests/cache/golden-v5.6.0/chain_cache.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..74a21b0beb71b0b8bc3a3bbc81e2d8f363cd456b GIT binary patch literal 345574 zcmV)#K##v4iwFpt8MO*VPj}zE_7jX0PNj$RFz%0DEdWrcXxM}bax6; zA}tLP(jrO-NOy;zgmiaEhje#`Al-3g`*F^>W2`;a;WEy?_bd@nRG%R*7It1z8z&1JQ$aRvULJNnZa#JnW*$y9URFLfc)-8q|M!LEzu+_OD>V-f*ZnIS z4;SnI`uacWJR9eIVdLVyj|FUOTpZj0Qm+5X`fuy(RW@qK&QO^?xV+b8@oY$A5MXu0Qdg^}n+I z{~Q1RjsO3~|3C4clbMx=m6e^B>)-hQ-=G*7+FDyUIx(9VI{m*F|2et-XZ&Zoum69- zKij|Y|G%Q-Z3-IzF46UzjO99vvS1bcA&|F{45 zZ~Omm`~QDy|2dfXIR3Q%+`Rv`|NkA@|NHTugPFuuP7jYYVcchrV0bO@y;5=!F6(kgt$h*xrE{pVYtuz>F=>xF_zRuRKu zqW{Xg6vsX>S6$8}XMD|-JM}JjAuhNd?9Wf^<44N!>3{2+fKUYkyMF}-^dt)0{~?}B zF6MrB(1&>ETwjsX#U$@&B_xe_&al7&pVD>Y`*+~vVw%IQnl9_0r_=grS0-EFamLMh6L<&oZXm{8f|khu$?96~g=ArQ7OJ>nRC&Ko8{ZJ~T_ z`SYd8-!Pk;2UNkPUa(olM4<$H28C$(1r?d?dZ&VMZmJt~9#2N}GDUBr6m~+Yw8|9`^c4TDqSGvP%aIoJ6}&d3zxowi zOxW&v`|^^WBr@dg1;inc=U)1rBQ%Z`xz z_XORwdlw?H`UgxIQD!e$7OaEQ!G{9_QF)l`uktS}m{GvxHb1ZQC)lMaRkZz}Ph29h z=K+PtnDY=5TS%&0uev)n4WL$ydAZCqywesOyuXDl*f3GvBfX}GFp-SNrxC7w*G^N3E&@pfuJqb8H_V_aIi4hI5NL;N}g_Nr(zVg$n*yhPCU?q zwRv`{2rgKhWoY@LP7#A{OE`#*?Kn3{xu!iX^qQ}NXLw>XV3^W;J(-X?OQp9Sc6U!7tL8R;%O5>X2XB4X|j zUf*4YaeB)g0tduvhG)d}F;7NhXCQX_Ez^aI+*BsJGkzK;DC^x)uFUU6F|vNh?;Qdb z4WV3UgkO=DE>>A`wq@crhx#G9lHPLdSyD6^oKHW9GwH8S5G3X=Te7Z6tZl|5XD(vnzroT&x8o|0U zK7AzO3m}N6-aYQLX7YV}H`wNcg_Vj^MhWUqM*I{GwZF3zeKu@o-i{5y@~8V5gKl_u zK}s`S&4z{Mgh;e)(CBG#WZ;z-5ib+5O(t7Ux~nlS?kP%j*RNfWjsgntBGfU!7X9>d}$EhUpc{kyQUd#8e+TT$(oB;OCRDukQ#hjdEfAk~HMU ztsK$KF0oU;!QwCz^hiW)Ac*ezL8PZQ+D@N@?EC0~h>Zv9_7|RvC<@6R;4da4WCP}> zp5&qpTPAiD6BJ+&HtR4q7|81mQ=BAyV79R4P`$w{=Bm{YCE@1p{yb@0FE)*ztbm~T z6ci$U?q5VWz#TnB-0;ke$_K)wV|_j}9*NMF(cUTSZx**{QTMI0s%G+Gofi!}tfIO5 zV0!j*e;mTqqh;YrK0aDYM4TLR`i3`;MAQL-Ncv(<<5aj}sysjBo6YE}7El);N ztt^>DOb=QA08>#`#3%o@H+`LIJoGnAUt)ZYA;}n|CNnF%jpuAm+uhedBr4Ms8d{X& zFFDBSQ@x0Bp8U7JK_M3Zg9r{l=%d-fIM)4)XI!ornLj3lh9Uc-1j5Mr(01?7z?>4> zt@|zJNkp2M*hT!!k0LTja|*jxV`?iAJR&kSOfRt158rk_5>XcjVy2ok`TN81BN4b8 z$Hw9q@g2I!=_e!ha9w}NA7yNZw^!eT19NH>l@g@oaj=eQPkWY>cv=D|v2c5JT(@`j zax;;IKa?SMZy?>zN|Jg*%v+!j9NN|$6rxn#Uqozx*1)ZsEV`WxV`EB)L?_tZiQ8ON zSzTwy7U_wt~N^|Y)WQcxRYk_6zb0FHZo>gATcSByG)MgnR}iDJC+xIF63{3~cjP>65x|041O z{AQ&3G0Y74Qaa3fjET0;12%WcuUT_m@VXXY+#|9`v7**_?Z`oB{wN>ftzgV2-F|*G ztSr(ZM$;UvQ|9FC-TO$ymp~BL4bro@{#Gf12IPb~fKcfee`BbMD-y|k6C&cBB(w&c8xY%3t*BuF6JOw-vX zHgy4o2wU*bu=s7l;S@*2hnBboq2Wrw4&|IFSBk7v(yF!*A>FsmlAYXJUIF>zJO`*p z*of;4xL9;6F=M)gF>$yw2=QpwTiCOYL^J?`csQMwqaBZnw+4pGE+5HQcrClT{A5Jd zItetZV3RJIJeI`k1H!P0JZ91(QAV0eDUPrmHexuFa?)zcxzRQ8K)M3B+-tJCkl)=p zzxlVko45Q_5fxiOA*TL=s0hF(bszkJk)?*#5y7!+Dc9gw`9`~g;yP!gE^GV`BFxOk zu{amagL=ZzY1}pS_fg7d=i|M;9s|k)n(CRHX2O?Dl8;1u1q87PhK#VHxx5eNP=KAD zKo{P_gCXPpF{02vh>8q_`D6gssMr^7ViE-jI6ET{=BeSSJNcgxr0d?ifJX1oLXV+5 zHvvcqIx)hlz%!%OC#M93AS;?c@1G~Lm4ia${Qega1F%M-h;m!AcZd(Bfta8Wb&7!$ z{xa(`qYq2YyRY|IUHx+}a;u*Ld59>n&S2kSq z7#a}8RjXdZ1&`I2;VhNL?>H3fz%04vo~-Cm^sxg+4PKy^_ZC8_{n9K^oLD$Chcq#K zj2gRg=QZHhWEB2%f~SxUn$bKebs`(2pLj0QC5$UU>sbo%WWo?A#h!l@aRBzeyqJDa z87qLBCYG_t;N=C*?N5a^i-OsAB>%YY;}lEVNa*QwR`WKEUzk`8(=m``o79?kBp6&% zlPVGh2q`sLJXR4Mh~l;uMwwZT;Dk&w)YLUQtL?T|bKH{^*RW@?6NsKU!)A?Cv+2|9 zMO4m5N!Bniz6@^{)Wh*WFy2r{px%vyo4Qo5D8uS_^J6NtztH7#R+=uNN>Vc}$f)?L z@UJ2)Y4+&H!2mL&yuwvVJKDB$=Kd#5xHTMAZix# zc2=wS6Y99cn0(b1qC`n!te(5aDq;XpblHHGa-ijKSAS-Yu~n%>hD*(x`eenXa+7DQ zpH$S|1~78ic_TY?(>BRBT&f~F2f?Mqqjy3YQmBjLOv-JyZol!JIqDXV_CnC}LNv|& z)`b`CAlyg+O7XPtp@BvlaILE+o>y7@=!|L}(StnnnL%E~j;kT67&`G@(P~T+?4u6P zK6Y21O`N`t$1uTinRkpdR2&bL`j;w+vO~U+$0}k1QKY{MOr(S_-Zs@u)u#3VWD5Hw zKs;G7eVb+;QmfnCcvI$s3k!~Y$WMBh)O|8rX<;KqFfD#)KBhu!HG&|CCX;~r;SjCb znj;tUCSpyrQwR7nOWbcDyE!36e-+UIO_$oAczV+aa-xnjKc0!qH=HltF>&Js^G`Am z+{Z=V$(tAEah(^a+VJNzIQ*jDslNAEt`pcgYO*F@rJVe7E_wS{MJ!;c9C=gk*^s<< zFsb^A?4d)fvjn6hPgYbumvqUgYm>&}QW!(jO$}~0=N;AW(M6~)V`O~I zSw%yWDs-4*b<*qD)P>)`btI^M8b@Au@TCEiB6;y&MKZvrC9f3$8LgQGHR6J#f=xqn zM;zT|E~vQppls$piYNoY90vzps^_Bhno$}I%n|QU7otiWoKE?I=ntskqa9-|upX<3 z4Medb7D5qubYX(*3!!8|lof^wJ)rB!ityab0Zxan%=e6O*vSiH?8233{BoXi;dPNy zRURpogF(o&s8!X6OkH`cd`77HrsgXu!LO$=7+|O@@-xU<2Md&9b@4+kN3|iugXB_^ zZU*VwmPpci2E8nUFxN|&P-5*)S-Td831Jv&iH&#=|~EWLYv3) zpb1hS6)W(uia0d*ReX=4e*iF(qs^vUm!%t@rraghO z#N&qrsOeOC(}I|4&Y$5tY7u`>bfYjQ+{V|nWFgGRtXoO5^?$E_?UrY#_(IJPl%i6} zUqvv0ZJMryIj8)5LBZR^=et5@rg>e<4(2Am0!1B2?kD~Dpf#6A8q0$C&&LlwW_6(K zvWTjn>8xj=TyZRMU#ssPM9e-`5f_LeWc9i!;T3?Uh3Wh14(W60s&=-XCo3jP8XBgP zjAmzOFa2^vS6!cyYrLF3PMUf*TtFnhG1wI-Mf>`PQFMp{*4N*deU6y*W*5y(_S4OB+!Q&$(C`Ht=hpd==M~27BtATW7 zFJ}QUu<-JQ0Bp<`=M!%6zN7y4b5`S{f>?K5p#96a$#o4hbV6IGJYQ%_b5pfyERe2#&s zkURy!@`~aZfw@PwVO69BfbO*IQP2k-zf^Jkyl>)$X$Y!c7STy~RpWA10w)HX~W3%fJ-v8Ws4>V{WouvDKsBE4l?UfyX)TcwsB- zcrDH9w3x%`&7yYpFMQrYrs32hXQMk)f2<-A5JkT2&;^|1mdQ^_5XBU^ilSj_?~0zR zIQcs5V!Y2cf}P91&a&~+DQ3F+OM_Y-p=QMu7VkW=}?5IK1RXQI|&wYrs8%8Tcq){nju;$FF=F~(QNR! z;C|d%eRW-GXzO{-8k$KStx39zrr85Z@pZ+6qD*P-9i}7Jv}ti{g9h5GFsN2dS9Q@e zSiIwqPxrmWH>}xCkW3?kr;VbQZQn-sQ1M=Rbx$)vxJ);t4IPw(XtGE z&dv{3VZeWPRz84TC;mF0|H+D9#bnNYg?=w`w8U)w;f=5}J!?MO&im|CQWdjNx5yPy ze?|R(gZBEf{wdotTTg?_rMaB7VozQ$zC_)2fb(}qI9dORgCaEQY zzq-X$+{_+ZGGi`Rw(9WQx6!)bb&j$F?JXpc-SL#v36_V50i%=A;$&s7nA_Dap?0Bu z55ZS3YDT#;#fv z&Q}=?a(i(c5aGV!hd>T8S8c9I9UK3;?{yz()`#@#+y8x_SMf$`D8^Gh3+nVP16wyn2Id3 z(a0J4o>IGoiGf*(Y>#1o10x7`2-0;cvHdWp-hr>W1Q?~Z3V9qHj#@8v7vdo(YF@kq zrAS}(SMg8#e{5byo?zT!gH^bJklXEdBTRR4IJ%U*M_AeYM-j6BWfCIH4#F~$1*3p^ zWyS6wRH<^XLjzJb4u&zAn)=lNbw$hu&@oLCM2$%CEtRe*vMPK)j5zFjTcbf>0m98u> zJd;~-?I$Z<8_#9x!s!f+s=27a zH&MK%d&Sx%Co?9flOKeg^ws6~5pW{pjVO+gwY~wn%oiHE;svFSVUJa$1fnQH89Ld7 zmi;TuJeMT@@K~Bb$R^;)iZ^-s*@1OJUbM*P1>)Q@))F{?H^pzGNRhnChSsDjpcX$y zb*rU+cihdyU+Gv35ni=f!evZU1@KqB{r$Cvf(Df0uj+?38bB$6Zo{LgH(bbk0cQ7# zr66goe4jE)9`b{w(EXytzAj6w6hZGH>=v~>u8CN%L?%y*mmdOZAsB?eTr`x+)o>+0 zR*?#bV($R_xjL)%e!f>FDm?^Eg?k}0=93lu?=G*10(fy9KXsZWS3BT+U2%5%gw#4Y zq}=h+kY^0gd{)6`yZ3?abtg5}txm>j$$P$I;n=12kY9HPB`ZpvpcH*;{wl%%P@dKF zFn@Ax?dPa%^1;GdBNcrM>b}3&7C7)R#W3;`VW;7)Ez1A*9#oxz!lL6NUQ*SAT0 z@NdOhCR#S1ie59S38(lus!~Ha-jx1WMH*l;sm#G*2A$GZ##FG^bJA}iz+8roo~)?9 zSvgJ#w$3!+qa^oDsw`wQx~PglBlI zeNs;@d55UrHwuBGeYD24fcd+_EHTAUab#8_@$L-g(K#JjAc{HZ-utAqbugC=^6A}X zyiV#q#1l_eq$MZDIZYuXc@;~HtT`-LWLemhVsxYIa`!c3uD!z_-hpWEKk0Wkc zf2<-suz44pL_Hm@gajWBsLWP_#e#LY!>8vLH8@s1FFbmT<8HM{QN|{YTi%j|%!!N& zz^5fjU0}rk4v7L+X;#=85$;sN#O6C&o+s~}BbO=rv&4)vsc6SlgHmK~eAwcW|A9&< ztKZ3kv#_y8;kNsj&5~bt7JXS-<+3X6zNa%HyHQqaN}tZre=aN)V73&1u}D@;5o7vJ znXVSTdi%`7@6ow#W*~~tfqW(G(XDMXa_Hu~PT)}W?_ourtf)5cmlDOT7_&as8uk8j zsC*b(BO|)K@FkB=$&0mNP1s~=&hYfx&OLWZ*Hv{|J9oyj7s?WA2;Si0N8An1#D9TO zgl_n&hy*w=;PUzPJBf8DcgVw)Co$5#?WzQave7_Sp}gmQ1Xz$eyG+;m?!DL)org>q z`$+*l&J5dORE+z!m{oDgp0Hiq#$y#3fhcP7T#>p-&^qE{iBHdB4f;h zq|Lk&Zz}bi?O5gng^orUPW-Jb`7e$$4D1hAh8e|=Rb&F9SgP%C4LPP$W}aXwJ!9qb z99H21?a7L8naxWMyJwAk1<(|HXpxwiFSw~y@;;OM5_iI;&CdbQvTT(H z1ltYnipxlo!l&FOWQW%5sG>nGM(+BjMhgQ@f(nc-X(6QyTY7iE)O*XY(I%&Z^TB-#QVVV2RRzFXG_Tb%<^U+s{pY2T*azKHFh!+WeE3lK%l>0%D{ zW*!2c8IcfjhwM!4l0BX$E57xUp~IXkw?~Na?i}qcPNNf#A;SLXlSlc{9aDdw4H~Yi z@S^BW%OjB!JA)0$<_*{=BKAV7myML_YbOep(PL1GFPk2EIar{w470^o@*Vy~eEvqnvSgG(5W1lK^T3_OL$wre!o`8g-oiAwl zv5Krf6q9R8`u3Kjl^3Vsn%v%dNu4ET7d%-}vH@z)e~Ekrjv48YQb#9+at1omc!yl1 z5}P_kHM0l#GH@yA7TSDqHjbGJ+e57sDr^*OzIr`Fkm7`+O7#{Ql;UyILpI`5n%A?P ze$$Yk%;m)u zpi3Tr!=QJ%*?p`c8xTcvNV)lT!IB>vFotlmAq=))0y1S!R*cIY>zxw9%Ob=C*jDic zb!SJ%fo}`(#c0edy_M7V0561?u>}u^dC|F{OGY?URS8`}IZ|4v?fMC=XSDbAx*sUT zpymff9_=G$!|8W{1)J^7SyBE>s(psK2VH(sW}?a3_x(leP-~SPv9IIg^l;cQHyx_t z2rbVO2IpAYFDc{)^|BS2>GU3}$PPr&XTo`O%(qk1E(@(6>5a#-k<&QdlNIqy5Unll zCclF-OS(s2oxgTBmKHd*h-E{F4TsGaj~ z{ZX$K4amIm3{UWzRSm?{Ds2LpS-%{A=*u39d#oY{5XEo!a>wW%;x%;E8H#PWr5S@O%L5F~~o9$oTfA6gTvaf3-FCree1{{Ro!&g%0V))J z^ZP6<%4h1Mt5EeNq`2hY9E_g3(A18jHz!~8?Z!3E@|vXM66GJA>*fSDcB%A>ZyT7H z-*S5c!31XX`n7U#{L|;7t$QK6GU9&W7+GDdo1Q!;SG1ZaB=)nsGh~}O#eWZu9!hTc zwRca{--N>7n0YHP+eF8Fy=@7sJtquOzgO`Pl%hiGUqv*)w7=>n+7qa%SI7aTdO8(O z&V%W9unAM;jgHz|_igltl^IQryNWFi?$6p$nH`c-kZZaq5eDx{uD% zasgW#vA>ji`59?tQVUxXV}aEef%JX!lNBq-T8C;Pto_CCu@K)r*NI1x)Zs~oy%|3G zdJKu?LkOWrK}LxfT=`OhDJ)qH{anzq)sW7*q4}4@1Xq;ZTqYbS#pQn#aRF9iuvd9E zjQIJ3ZE^iGxb?m~;6GzudInC(SNxJl#IN|G=9fHV%EnC!A4i{~Y@vWs2`lv<%uF|rzLIS#tPVre1Bo{nqV zLtHExi180^ncILGWLj8b?*DeOwDM!C8NYP7YVy9P1FaLwVqAJt;X)_>EA7KOWLXUY z14H6~)y$1taxA62L>3mLACFb!0iwtvL%y^?@CGJu0bRf?v$eUR>8tUR6+6kv)ne9E zlUnV6uYC;(;dw!L6B6z8!#^XJ*Onml4#ue)N^aJjr}{0cuN;m0+qh*eWk~5t`h3HR zm@3G4{B}@^$UpunG63AQdB0p-FjPXUl5Lb2Of?n^g(%{>$!BCIpxkF8z+xF$uEaK1G1re5@ib5XCw{XzLfntRWjK#qZL?v$A|DXNvB_MSq9Mno z$mE55cZ(cEJgJeVk6kc~zQ(C4_Lpj~T{fRwC<|=Uni&Ldr@z9Ln8(e07Xom4Q_)$1 zM`+y9a3BkoG)G3@6G%9qmx+OKts)J0(*bgKIe+_KMNL50((GH6VMHZI#SQJ%6I^E= zp&wKuk_K{QvW#u85qxLXH-+~Sn*K^9v|@H;bA(ox%ZO*h|jUYVAJsRcOI+A z4@7aa)4Hm__y(QC|#6amh*t-7?2y-2LDl%04zFuT90=G}E(Gp=NACjfIgzeGv9Q5z`aI2+Z*2`1Epxz z@mCQFKs~CEhz_&vb8OmkempzH%}i_2l*ew7WerK8e;*eu#L3xn*E`GMRCiIa(k7s!d?Yq@PU2DCJb`EL4V%$>?Q2#dzmP(Yx$!n%i-`FET{Qm2;?PESPNkZJyuZ=h$89;!p>s;*FKJQ&qlYEiC|I> zDd8t8Vy(opR1g{p^pYb6yqB(0%n!+Dy>ma8IdUN!f8P8F(jIvtILpDv1`$lTrfB-= zW+U1NP@W-$V;A^RvjX$G6)45X&WAIxc3CJ!4-Fbkg19i0Zb`TLC0{vl+FGFXb?dNN z-p@yuhJ+1Ir{aaNR7FmT*R2sTBScF~Qmj1B7UMjfeKS$9msRjsMIj)Hi>o<@Sv}Rs zt?Vb`VKeG*h;O| z@5f_E3|!up>Fo*!s!5oFiGRYJV`uRB@kwqTlp<}{UqyJpON^|L5bdAjs|G0_Gy{W< zRlUtqY$Jk84%Jj{@3Rq;QKewHYi+_smd-7OR--spRV}pb@kkj$d6DOfr0 z#4dv})4|=*o$C!rtDxSY`7M4q?r|N}Wg_AE%nfd)|2-0vVq@1sPbci|O^`~2 zkW`yKgvwkC9 zDzzhCmCqH}hZ9-A#+}7MkQn-|NZB)53a|9rIaQMWvsy}es`YH$raDwIKBj#t$oXiE z?uT6W>e`#%gn1!=)!l=T+{UB?bo!~?OKfjWl@^pQ_p9Tf#3^D@9ATP?*Qxl2@qc9j z;LK%jp?NTjkMs>FPGN;^#eY9mQ51-x_e#YQ=P_8s^QnM>fh%T#LXA|hCo482kF8g1 z=X|Ln(S)h-;$JjO9^!ZS+NLw*2Jlbs{EmE?+L5A&A%4)+;IcnDYz&r8AtohdDlBS9 z=^vl_>o*1{#qI8g6WSOr3LR8TnAGT56?kA&xJwOND%d*tV&0USuN>WvqXiB0_eH*B ze3UGhoratvz8ivZNq?D{BT5wtzvSob*Q-Q<|5!yaAc{XyXVI*KsMi<=#nrK=EB!oJ z+E<>e_$FE9tRg#-@>+d`qYPVD1|Xg#Sy52h<~#x)E{~)S?!Ah!sbE2B@bjQ6zfk*q z*cS&YCqBtF{q%d_A7J;EjK0QmeZf-1W z_i-^lgPR;YVaW=gKxZu4e9Y?*E7XA4A;Kqmh=7z+mV`g*6|7xc4|=lVd;aU+bV}lPtrA|ZwBUV%QZ7FvL&a;#Ui`|G z&AswLsvq|>Ubk@Zb5E>HQ>pMFn#^ZZMt_#?YO8c>tU9#j3rew|_hDAQy2PRZ0Y?ZM zmPWh&JO*B`-^kV)KtP<6U2Dts7WSt@jRR;F>xKL0o`5>Q1ch zVf|vRTQBeD>BImVlfA1*Nqz5@k?J#=&hY&d8Rvrg(|jq9bp86M#)jyR2d&q~25zF* zyYdKzXd96c9!K6GZc~iH>L85|q-Lb=qLAP~4xMtT?(a6g?f_ zmBq*r2jipp_2sKpLmi)_b{Ux-6Vr*Y5k$OU&5Hh=Wr<<*uZU-6uLuJbKC*GOVHr*D z(b#j3snvl}oa}p8c_-Z^%pIEN%wMsG*()g%#?5)vXFs+GIa4b`df#6J3!nb}W%UfM z1$ij?#hNpYv{8WjV-=-=DBkWY#rlOTxdjTm6Eg<$hfD_h zcJ^dNL5=Wz41Q?#kQhYzWr{{LseCkIh(MMfMX0W4L?e@cl1YVvnr((7=VzD7b1w`w zq1O_N@JVZ*P0OCQhFj)`fl{>Xf5>&`qPkz!XB6yG)mY2($DWY7)G+TbY+@6=eYdc1 zzry6_7UvK#c0>X4TT?6vq5~FkR5$~7Lvu0ZCVbCck}u_gLn@C|lmT`sax(?7){ikh zLC3`e0Jj!}Y^@LOlNGPZ?RNr5-G%@fUCGLvyHj*lwR*W)9p5VpFryuj?ZA9}o0vu{ z+!~JU^MytOW1HCoQ8AgVY5eL|uaTwBB?LezLJmCibWA8ugTGOrTd$pgW&Xr97vEsp z@(SykXX;p05x>tbUd@)gKT1w|D?&?0^pT0~D-5_FzM@lw7?B^;w_Z-i$QJp5$12JK zQ9OA!aQkef)zMvCQiQzb;I_=Ysp`p!(sMy1NUpvDN#$aQ*W@J%Y$zlXTd$>lr_kxc zfODk6u|XMqd!{3bx;ZXCPp-T{-HKdNnK<^o#eaVgHRy7}8I)q;KZ;lYR26(AO*C~k zoFHG+ADf%w(#mx7kV1GB$2O%?_ieP^j~@;mCf4#0g-8U8G1NAEkYy6TjO6ntZlDlr z1&6NotFs@gCHPfeSh>+vyy1zo80_acz1(uL5!9k zrN9E0uJgLDZc%aeQ)`h!Fc)txS5EY8owJ-nV&dIM=|)qri)**ivF20Fef*(7DYE{2 z*n1_!e!cvS*q!?agF>LwPYdK4fw29RYI8-XS#lj3c|n_^-+W%Y=4f ztcZ#74Ytrtu~%p}kY6*tjz3mW9*E*@xDZulDy-J~0r@#X=Yjp;YxdJ8E5>WX5*4M{ zXjtmxYLA+$%Fb@UyxV;}NBVZ0#Nib8HT1J`eNWsr^HXzd*3Qt$?@1oefS#aGoyAxZ zs05kqT^3M^9sek*0U|G;&%rm`!Svk}`#*5>w%IM%*Y*@EptWVSi}Sjbs;Sr zJnsZ7C!F%T8DlpSb%eZzK`H7DKJ>bkL;*boy27WtyEj?vKF3EXUeuY-_$ZW^>BhE#T z(+At_pquXZIvMRxR>Y)kL!(fRdO<2D!}8sZ1b)D{%L?q9xdoJHPIN5<8|b8FOz(udpn9ZO}plb@_eeTsnkt1+J0*>lU7LNKdL5;;&9>pR9$#A&*) z8+RA{?6*lH*6*s5^85;3E&ZEY&pe4U+}qpyrQ!GlXQ-NVKq&?e{Z-@zNOZD7-<1sT z370JJ24*OtK;XN(Qov1le1_?M_eYVki-4#Cv5<<4u3K(FY{?7hgxWd7gG+v@{Dg^k zla~X6uMFq0ips!tuzi!)ix3Uv6C*4rIh}QKEl7rqdHM$7Iq$DH0Dq ztkYTVM%4KYAhShj6qAY@ukH&zfw+xRL_L2CZ*hOl7(_4b0wn(}Upk_avJ!;2_C_HY zX`0<+47a!|kN1>fOiZnT@naQLfGBQI#WtBx-5u4q#l64c;e$2IL&ABoVx$-?*;w(! z012~*$q@7x^{ifV=(5_BF0rODsaw(1Tz1JYQ-SlOiaI zr`!Ep0WwQl{*NLNK-JdcjH5X+G{)AujFh@vea@nGhl}*q*~O5r>ps6of_rn!=`!Yl zHvt>{X1Du-jSwq9^(eVQP>x#>Yaj>NG-mLzioh;(8RMzo*KpdpnLfH=L!H_9s7<~F z{$xdy7p=z7*p!E_LuTiOaFb+Fkho)G-~|{RcCOBuxM~2k12AKG6F&l-60?OuSQphB zr^zvSxnDG7(0WG^Ky^WaQj{C{t4IYHax54c&-%FcX-2!r-?2#leO+sEb&QvCk3V?Z zeNV^uH7<7cTHOUzVqUdlD86DMMvQ^;55#WguVmk6&JPC$2pAu$2<%1|BRQnslQ0W4 zj*)k>Vt6^WW|B-#&qlDl8ob>~H2-1D`KFUL;5E|9KmcZ~=9ouI9!-YgxdkMDr-8qL z0<@Q1(x+duMNp1wRuk4LP7#@d&EtL_s(xc;C_4qvWWs`Ig=yeIAKsV`L0mmJxoe8-!Zo43)IgRYX71xgWd z?4hSqzU*OU@)0LYl6>THN&Lb|{h5S*7;O(V*lefqy`pZMl5bzo)@Rsp=|Ts?ZO3Kk zoxM4 z=v09{2pgajGshlI_jPKhwOxI^IX%N)!!xK;aB+7o2ytg!;l{nnP;ws^*#=q2uyeVbv;#Kb9rk+>hK|6MSKXpGEAq7-s|f5?mod`S?o96^6|d!-z-6VW8gcr} ziYF@qa=RBo?s&W@Q_o%s<%9LIeMobHhCC3tbng6(IZq2G!2+9TBIjTkNz>+hE+oC7 z9(fd0x@;`_Zcp|0N~Mtmlp^o=!*0qcg!qmR;as^s&zaY!WOfsyW^Ke97t?3`yzB0> z5s<%OLbLK~C+e^md#N3~JiMB4Cz0qgl0G_(;32`yjcA2xpFdU+*tIUp+T9Wi7LMzL zZ?GmEevB&FA9Z3pSusC@#bm@vH$hNvSHzuqkTOLy`}Lp;nA^fuT6MGEI1(j$#cuqt z7UFr>?PX;GjsVG+!Z~U%E|V<69a&Mu{s&Ns1LF^Ik?S->JUw)_&fc4YPDa+j^mkVR z3~JoP=Vzkd6z*pXW;{tuh7)4$D7RPiel+-Q9235UM?fzO?4PI8B}z4A!~lzatRk>` zU8eEzzJAoBPAuQ%zBrdB4JCDbf%s%aFJFIy)bs*JpI}b5h!19m5Zvb#rKY1q6In67 z07Dx@)jUJ(^)bBAco)Bjs^x`6JO%sUvjZ%S(m~ASBpL4mP>LoK4>_I8Ti!^saFpq| z*nwrqF)*~=9ADo;c|Fz<=`PRv8cosN)CxZJVGYjapeffbDQO?tX*=b>Qjud7p|uUt zQM$0(>amKzE_UHE^QhL=I@bL9(bbA}^$d0q9_Q&NWTk)$sjCmH874+>gtZh=CzJd7 zW7a9F6%}1=QfnF(!Li>s%Dq&M=S>{NTz6E}*~rR`QQa?}JDW}q9soB>_jTpzw+|&* z03lBUs?w`e)@HjQW#5M;g zkyogr!l&X5SYo*75Ms@f*M#c0%#a2tjFXR51a`H{=u34TNT}0oyQ}aWaht=GPsU0V zPd{neS~I5shR_JX6;2mD0s5EaUZATd(woLO!ZqJ*UoTjTVZ5WyZw69mN3HXbQdm5f zkSe>U0omUwZg1DN;{8Tj@N4# zs-?1tI+a1cSjg!X}-V^NRW2`)=xdG0)-ICS3ujKyOHP@-1)MjN)*wt zAMh-BH4BbQS?ONUgu$SsgvI6-$BBgF136pC7Qf;)?#D{m7BR7QBIR$&g}RS!qk&!S zVh$&cV>utSRwI8?{XUcMxn{`5)sq!JVi9RI8*^kY-ZVSM^_OOe4VLm!b*0nlCXZEPo zyB=!@*2EbMKBFy4RBGUP`L@dap41%F1wR_ul4O2T%$FZowxUv4Y|gyIXKtVbUUbyy zugzR^zj~}9u-jcCzQ|b=MK-qpLO{L0d^3?L=dG)JrE} z1XN~drV&B^jr0ix*zZ$8h< z;otq>x0v=RYc4<+H@0NO*l#$1UQZ^&6=en18zzkgRTSO49VbhdSi@d`X;uVoB5?v$ zxPl;g#-xuoa}JcE_sm~KWPl$7u_zo=sv~!^+&BAQeMk!X-7-+wo4q;Ulx6qV0GjuH zTmE2QlTX>Gbg79vFm*@uj@S|Nm#nNV{Z9gqbH5Ga-p48eyWd5*Okz&!b#bw(IXHtG zGH-h7AX4+w+vuD3os;Z(W3L#{J3Ld#o9G?V1H206O)?rj#jA&@K@Iwb_|~;rh9P=6 zzq1oYRbcRC&G_PxoUC4kx(3ng0dlWC=ImcZI)HQ1!IvMo*o~yG97KGBsicyloDFn3 zRezI+^xW@Y11EU#ozxJr&yPqrc_!x!ek=(JaTnjJsu!l5P)oXMf}jV6=CO)~Konbz zsJ6u9Vt?ORLPzZML8Dmw4EX(IMYG*Zir%=8$TLWelPwfy!)}Z3$Jv>HMQn+{$z!Ji z@CYOlA+M##nBJ6&7rBB6Gm@QHd2)I)W8WK^2r66CK<2vhW*_1rrLAQS!hvqrW#cba zzQz8?R>9YOrp#O)JK7GFFIJPWx!ve| ziKO#bMI&IRwMA95`Llq3p>NlKC@NC=9!dO?`pJsg>hPS1&&q2CrShrx=IJ+>g^GV# zgm~2pi@3_+veY6e>&gmQ;nA7D0Nge^`kJEeio3nvf7A~E+D46Adb$} z1?QRa3TE7T&WTBJoB!xDOpJjj+QAF0r9ui-x{dcvsX${2d|>X-e6nJAP<=3TR1J@S zqd5g{WKSDLfsE7=2kz7nZgs!o_bH@hs#1Kvj(k6&&lgi;+5}rogt1$cNni5M=7!qx ztSY~QQXHRqSYcw`r8`IVk=S)*<%$=fSok$0_S{J7l$Y1AAQZqVDFG>#}5Bw z#Z;)~?~YgW9ENX|dOY<-mB-)Bv)S*|(9ciN0BE8eU=k$o^py9U5_g#u;2FcMgESYs zH;G}HrgSJYsRx7ULFRO<=O0FZ5e4Y)-1OsO0y7zH>9h_=OrztdSC?-vm^SDCW8Q@{ zH7P(j^X5HtAH-<|RqjnTBF)8uFBR?2N^}+k*fWM@yOqZ(ngUTg`fi$w@OkF_o}JM! z#xuu&=Tt{eUo(~??8a+{68Fio%HaPZ?XQEXYU2h_d(++B-3`(ujf8Y}N=SDr2-4Es zDIp!w4bt5y-AGG+FYlx8H)jqrd-m~9XP(h{u378e>;5GIVd-?pibAkenE6Qd=zZ++ z$UYSKwMsA>&iM$uIWg-J7<>C*YFPQ}#h9i*&X!+jh6)^!z!bq(|JLawsxok=>ds?Y z@XQ-oT6rV!&Gc?+X}B`2o~k!LD-Mnkd>3Gkb%jM5Q$iy`6Uu^To?Ux zPE-YT4635}3yNd`%vuw*O0EH~j}SLtp$NcpKcxP%B6eY;k2qCUEHo0~12XQ9TT(J@ zREkJ=iv>%<=*@9Fn8g&vqY0+E(>>-Llcn^%T*1s-Yn5RNE?lcehP!4Qpf|vz)xSBw zca9}su`&khbtXbdo%AO|IdmjhNX19V++5= z+e^^M-xP^LdFzh8VoWD$FDvyF&4fq(o{~GD@xE6oD%LGr@O~DFrvei;$`4m}AO#l% zdFNX_Fh%CIzwyP!a877=0`*(Cw0aLO_k)J%)3qJwNdq*5cI>C;XVF0{pp*T<;wR3N zW!v^AYwmM6+UcQe)h3J_`d*?YiqTFwkRxLjFDRO4i=Pw`l;Ul*vTxqkg+!(m`TqMo z+W14&G_()T7yO}47txkl6AK1TfxvyI_*+@E6~D+7@a26X<-2>011c0Wgo3Ou3K~r` z;NHJPN+Y6f4mPl9Q-LXVul;?a7XaHOd<&B4R-{A62an)JUO)Lb5|| zzqCEHvt&E`@A+si8jo8RjL8qH$qqQqd7?cw#l4VC%bqj&VH zqfn+8ef}=eW0kKn%?BPh3aB>C_Rj#OsQvSACiOZ^dr}vLE-H3FJYHhUTGr-mSbKw! z&cc!R<=}J106jtO*O&f}1yH^;gsj6U2KUesTbWtOh$i7^l31-+OjLsupekCuph%1O zUi^CFTM6gu&iHoO+^>U!h%o=&O-W!*cYbc~&jn@E5Xu#B=RX$p_P!KClvixbG7;Go zEXJ(g-#?};$Cx7vUv&`Ny@s6`ok9GUa@m`puCJp0Kp2zP%YopuIoF) z?x(2z@up1cZG#bbxY_rASxDSOxa~t&M=BRV^vEv+kuX*wNSSzcEE-ZrdP zm$N(Fw4A>nxNIQ=TA&c$S?j9hwM1MC^4-PerRw-$$-eZEl&<tx6Ujs#bSf??)2o36-PE%Wq_N7b6Z)Mk0=T9rUa|`!F$jP2oUg~ z?bF|zIf#6hsHejVGzVDqM^O{tHro1-nQoz|&Nh;rR@D|V{6zSqJO6$?EU7n_>Z|2tHPa33toYE++p87r4v>GNZC{%0)S5q)=_+|PB=?R! zvq>IJdthnipB2}T9cMif`peH1`ZObhNe6AHQSB|b??}bG$ql60d*BYLQoK~Yr}kHP zbEPoOH}Dr8?0p&o*D&wkKzI$IO9gZXoAl;?ij;uy77HeZQOW^RsDZ7DEPk&64cVyz z4rK>u7Vzh21OR6m)#zd(LYg8cjD8(kicjj>pX+r8HJ~cmz4R>V zy-vrBF)=pw;ltm^w<>9~kNEk|iWD6(lB=Up{2xqs+dH9`^w70J-594YREYRVt;iaZF(pd6$2Q^{ooyif!?E6{wQ(--bN?X5eoTczws%7 z4*HJXIBq8`dZQO7Owa!&`MG{E!xYoMv5L$M)dpH-x_d#Q8^$PP#8fb{YlTz}YqgU& z2m<8&F7_{VQ#!&eKzk9OYr8|z*a z|A@Ja-G|Un>i=aAK@V=HUwBzx|6yG!?4>6sXn)Q0&Azd5xC^82fbSgels;aB?GXH?(Wx*hFkVY_ROs04SjG;P2~ zdx0s!Z~v#L0I0OzRv}^~LMKL?3WA}P*>f317EpUHc5aoR^E|H`yhR=1BL`xEukL{s zx~nY)+6V;m!2Q^$EY%$`SM)^H>BKz96Av6;P;6Hz!gWsMc(X%A+^>r)hRfGK8e|IHZKe;*PzRFnD4F3!+1)7^ohH2;02w3!a&V^xLA|0p7E zDX>x?;og)nb5Q$j`bN5~BdtJ8zUifiI6<~i(dXAVzyo<3gwqR(V6Ut2%cGEgSfd6_ zn!p@h8;HN6`uBYFg!;mTN#!P4f8ATOrcnJYxS4QH!U_C({d`zW&1G0Z;VhilV5%iV zLVO`M=4mxLB1yi80)N;Lgs+MTIP^fHv|Ky?DT)H1*^As&UA9}d2_d*oy1vT?6@S8c zpBH&5x8L}@a07t7TF0h6*>ZyV3XX%kp|#!ua5)h-8Bj(+g@gbfLS1$X#RjUP^9zbd z>D-cD1)3qwTypa2=uojw?^tdBS&^)n4jVJd#)}`mMW+LPT(r&$^@p8~j?^!!;0PRd zJ|sSmlvMthOYZ_f!`~Ru3iG`A`_|lslZh&SChW;q(1EjntmSY{A+;+X; zbu;F&ysV=lAeL{2i_ZFm0()Z<~p103+I$#Z|@f5B%OaK(`7}PD_h{Skg!SSKV zM}*9IHxsUmz6<4RkhA)(FDR1p-}}mKqAaI7r*kmn1_9hHhX1{T?QvKEB~pVXjY{A> zSiZ8kx7)AZjEmYyRcr+@b1+NykTL7=)w21H7w&twp|pfsfQgC+;~yz2@;2Igu34-M z=D-wx@BZI52>(qV6fHZkx$PEp4{{;6;A-_pxJKE$?xRlz&s{@bQJBRM0v+}+jYgV` zk`^X&37<0g99e8uxri!p$GY~5QWro~bbCSZedt#kI?7AiHUDtq>hA_8T4`Ic|EzeX zysCqpB|kJMD>{d}Tm_s4BCAjaB`bN5SRQ-q;_FwF{0=(mpenk*6zlGlh$rS_nlJO9sr#~a zx_Ql4GWhScwB_h29B$%0xn`r=$!A^C3D)1wKadlZqQe`Bn)R^&Vhz3?c#a3 zYd;H@@;Bk#FAuky{?@z`;T5HF0;Wj0|97W`)m>g2XC>bz%snkM)#ZIkRc*zP5^H+y zc{ugQ=O`^F*TXxPE0TRwYWVnIB1tSF#E^e_%cL}OV&OT5TJzh{8*8~iq zBgr!5<6p}KP^k^^hrPD{XT`3S#!o8aPVLSnB`z}yh-)%m?=(6}3J#lDhL3w4D!?Xr zML4K>bsJO+eBF;!ysnXc6%Z=I+)pWZw=9zReUbvE*tq|9`bK&Vd0)i9E-|C^%qh6$ z&XxSE58=1>9B1rD`p*?6nAN>B3A#8g=dU^QxXi_~i`ZFzUkKO7gJ1rNTl%#G@6tO6 z^10~wf+Fk4^1JsaAG0KDaJTEfpTOziKqmjQq8!RRwMB@LaFtE@6J`d$*r`CIa`h`p@DwEu)JWo9bl(i?jVHFn{F|b9Je&XlkE`){x+l3@A zfRIIC`4mnr5ZJN@s-o9R)lP^>i*OO)gP*r9JlLCUkyX*>eEwOH&eHuVagiaC=MLLX zz@w&7&~#pRC+_DLIpJ;3SlA2*up&9ku5eu4O}N|aT{x&c-(^5cS99an1TkvvxUeY% zV2axZe}7#nP(&$$$uo`@C+-l#P`^8S$k>MM8lIp>su?6c$8-dT?nTS&`}L7VlZi|( z^;wdTSgj`vpaUytm_MI1MQ$i`v+-Q(e^cA@BwNtXKv6 z&R3N5c+-!=j|Q1hcU*C7yUo}o=e6iaJihP@8n_o9d!V#uIaF16s`hz2kFs|EYnLP( z#6_tv%@w*J>M>x7-iLqdx<4&I3KJ&6I!jCauJZhSngumGar}C<#Qbvy;`81s1OhvL zqb9u!~qhi z&}R?E?OFz{3(OMgUm<}`g8BM?iW6*~i3`%pd^VW(XpiT?xCA2lO<{bh+U&29)Rf$+&BzT*id;DRmB*yR6q?1@e;OeROi}3g@3}a+ z#H-ZDs`3;y9>JI0kqKQ&Jy(XNcOsN!h7cdzDugHwvEh?6z} zBd^8E(Ek2L>eV*g5@?E0;2!`lFftKeox7^x!q(nJ#xkp`gONuIB>XdDl>)marc1=i zkC7j4jOQb!eLJ6pQY%#NPC^GpkqNlL8 znr?DHv6IFlCD}$W%W{Kn{(<8E{!)L=g`tafuFi=beDhwRvYOJDiDDkg@p7J3-FBLz zgBc=4Ei&+Z1d|2w>}%X|A!yW+R$2O)c%{|ZGet=KBk(w2j0t}jnE_oj-?7x;FoO9- zn3lQ{zrm0xFPgoFhdnSrIsV_yArCoOWvI*XV-oQ#^%+8?=@4ji1J7JW57pn8KgPoI zt~1&SL1p~(5~D(hKYjFZW0%sUN!>n(!y`44Rt?#cTOJkkuHt3#w z!};i&)z@51&C*G$STzN^$af+DQvYalEGY~KzMHit*3QAwRgT`a~fLGyJB z+dVvqJfAF48|I9BqB*FHfiE%62JGebs&6SRoANGA@(MiU8I866Gh+hY2fyAMfVc|& zBd`2Tq^qpGe@5Tb@UYQHt|nY-3=$#YGc6>W3LoERf7A(iUT0va zO=9HO{!l~u6W%2OnwzMD{B)?0+IJw?ghG9gOXY1K79*_W$YcI4(|{$Wnw zmDj_TA_@xoKQpF|{dg5%4C@oSC-LNB&iJk6P5zF%Ch6he`fISa8`Kbl3YnUfvAze0 zR9#>Yt5#k{i@r2(N;y8EG@J)>#%6*8V>~|l`!qtfmkF1UlB#Ij8t!{+Gj1QxJ=igv zCx;1VMQA@ijsA1Dr&fgXL6p+JGq7FhPHc#GkZ5ufk*bY(1}#)AA8F`vL1heniLv=m zD*h4P2cLugsccbXmKYr=QR1H&A=km*QtDG^U4Ivk&^8i>8(8Fm(0` zy!ZmM0VWyQp_?DH$gP4fEY4QpE_ULzL2zTlJoaq}&@sQC&i|$kGT$NU23=%*A@Gn# zmu`RZ*QI%S6;e4i>E(&^{8B@ZN(SZn?Ve4-e93QCGEFPNM*S(i!roLdj6{H0)eui0 z)7J?qW5`R4)4t(}^midThv!W_^PCLQCEq%o{+Y4fy}22jU?~jS6U742Y7Gx>1Fef% z6`~==!sfL|cQ^cHj>5>&Aw>l!8Fo{RmKaZN@jjb zBVddb|Ht@ypEV?Zz#b~6y#d$eYrRx%>Xc%|;PGL9S&#ekOC92XHz{1Ytcc31Oqf%< z0)c=umQ~fWa3$MBGQBn*CtL@W2r6UPON<4MC$s*ftgYCUxzS>#2pvSPY83vNaZ-}C z;%x*I|GV1rvuX+bdXr_i!^dws^~M=-14RL1U`w=kKHioW$9*4rtiC}IHP!fXoKJsT zBgP#JiKYvKxdp~3dHFX=#zi~8@Z)-|Sd7uu-mwz)Ht7Aw6Jsk@)Pnmr&z17vn6M<( z*3={-toEv^Q!XLz`XI!uEYDJH+W2g${79<<1wRs`0GFum(Q=_ypa$9 zsGkQVUH+L-zvJh11evu5hv*Tk5dg%{WfYd9+RcBsat?(m z=D2T~^E%c#3kJY>*tK6zRK;@wU2MMee~exuf+(ReC%zHEdz-DUzQxE!@H*+8`t|pP z)z8h+Sf&|*0Y?iriM-Z0wt=aV6iqzMzZUX1GsLEn{4R;#)INp%1eG!3CB~+Y*!GbsQ(A9c5lH#9fMT zT85iqv~FdwzP5JJCW7YRmBF=PgXs1Gmd`mUA23G8tH1dJNQXl#u|v{PzB)f*+8f43 ziD@@Rft?}fSS;bA=a;$wU#H=*4dy4N{pYxIsbRhf*f7X@@EYTQJQ@AGSQis(8<0PE zB41*RR1KBrFA1?;&f(cWh-KPCtuq?=XU4(iS-Bb{Xy$o`B#jB&!rKopHQm{7jJ^fP zyX&CcdIEB8DZg=RpBqnZPBKnV5pM9f^lTpyo{tTW$94gQZjI$Z0bopn2U_a@#{Tf&c#Qw*zX?Wh=@y93uL(_rWrO^Z?v?$bjG$ z``f$}jvXStAy65=yu@fySKmK)YTjfj6FPRAv-mpUgTw##?Xx8RH%V|pSxU>%$Iz3N zl@wD7D$z+SIpV$eul8z7VKCJn;2)0$hqfH_UGNK*{Wj}cDAp?0ms>VMh$ z0^Nk1as4-H+ZAGM(mka^Ov_MQNAMjTsc6UI_EUWjsgsS~tLHm)Mih4KWlzp7Q6-r} z?YkD|X^ieXgW|vwq@VoqDe>D3pCu+iWsLg62===5HPv6nO(S1tg@Ymyuju+uDdK3w z33!XN!KFZ$INqnssUb(Is&rYn7x{{67(ww%QnH{hN_;i^aYgEaAUxV%ZWKVVf$ep) zzr{3?o7St=Q^Qauh+W9XblMpQwAt#_@4szAIyI^TX%+}L;DH-*ZtcVosKj|cN#UWI z5Qwq<_a|gfnnc8X&7=|LWJp^{aslB0dUz~O$_+U}n_md!+*GIxZXQ&o=$Dwb1k%5o zsVpq>NcbYqJV0OUBq-SeWeVFS0mvuc6Xo*z2Mya_(-?HzbBGc3ehsGQwFMIeKo_`z zf47nu#7Hx@(=|-Pf@FFp7%U!SM=ZZQ;Ht_OrA#W!VQ~C$lG2#qWM=`t02M^hM4$r==CYUBr znPOgIV*d_zqJF=Ub#W_|{*H}+92;wZ0VoqW>NgBmnYm!g1}yb299xBWiOaVhi=EBv zEe#}%LLp$(7f45O)BOG&IZWk93UH_&>d8@~^%E*Z08#SZKRvnK2 z)`)y(#V_JP*C9mLFmrIV)s*-PRHnF>nEVsviMv}M%u=+7C8qg5IQ-rub_L4BD(q8p zC2$vCnfm4Gw;vNVUblaKatqhI$n;VV*5VUb#qWC_swL(GVV5wMfO-jashI+r*d3Q* z8KD)gtbHM%O(x;De@E)ZmqQo^lCIP@@&#vt@lnJ!s%o`X@cc4{*LfBF{4{mT`c%Y4 zz(HJPxy-W9J_AFJC4Lc~xNtRph9+eaEp#`h4nE1?wrg9@_=~AJ1 zjN5ZbLu`7_rjC?k$NO5kE!V7sFHl_Ai;D|D$8&wZ`#VCjyhEdw{5?WVR&zbJL!Aql z_q1k@Cbh(Ck$b>%%M#>WgQnyV0rfZ zF^@lTE<$Vl(nKuVq^Hm~XGg0Dco;TI%f~wp3M=I&E9w-Trr(uG>8u(Dd%Hhm^(Z7;&#Iqfcx4dL`(D z+Gx~fIJ7DDL1jvMiK*RibEC^fZr=^3m_5IB=pvqJy#*-Ko#DL->RLS2{jwoM^_xHr zfC|Sr&pdb5g3s)!H2E9wW{tU_LIEa-M_m0mM-jHP;_s}h^7gXo52Yp9a-$z4fiZ3V zVKN6$)6LWGDzE3REO8-ob@ykqG44wR4t|pvW8v?Aewq?tZnD;cG<vDLn9ht zdn9IFU#rEEq0h@UIisvc$AQX}{1Q`aGltyxp$y|5e~p1ti41C0S=KyICS5Uz*TOxe zu1!bZ_F2^W&LVicX5y%FesQey#%xeIg5ic7Xa2nMPmVu8Gn~NBt+FdLbdekk-UMXS zJqfp$ngV0;eE8e5I<`b6frA7&v-~!t5IH(W96CrLC^wBp*Ne2N;5qBB0*fr4u~U1A zfwksQnSWDXi=MlP@4u?7l1SS$$G(2&KGX^-Q_4$BZOPsW3m3ZOyCT)HC=)Wr7MPO^e?RokF_;@v7_LQ+tDC4(7lh3$-oP4YH$kmyK_mV;w$sD5OH1<4 zbN+bRv-`wf|6csVJlX~@Ce+8jD?aOBFS0o~?w!==ecYi(f0qnxpB0eIs>*haYK=bs z(n)ALjGuNvO(M0fI7^mZfgyu0V<$)DZ1$WZFihi(qkM4r0V-4KOH7c1fFZ=RF62~L z^*(9QWvgn)s$if@-9lffVI$yZKP7GM_6~flEi`h}8kH+C@oA2}0!R3OH2r(yFlvQ~ z)5yGXbeoa=slBQEJ4t8&;~@6K#uu>*J77!&kAG7tdbGlt0^qF=$z;KnW{>M6xbMFj zz+u$3#mT&W?yiC%Lxn^8Xic?^6}ddFELNm*@XGw0Q0gcY!Go8(R`4I!H*6X1P#3r3v6LxKVxg(wF3di5%$}PR{y+l8B=Gbf6Dz>G+9pp-_mfRq z+85cWR=taT)(8Kep`A{48hWBtn?zvjw%;)Fv&>Bsw*U2*rKmiBq>WC~*qpiLV; ztp}3xAA!o0{u0yuMR~#5U89GOu?4G2e6jC7+5?z_?v_7PAnQ{&u&@6L@ZU zHYG2g{Y4WNvkL~U+nWC(!XasMo0Vfp#x)@c>4R& zK|8ZLeLW9c7gC!FwzV$4)oX6}O=d_choal~yeS)!7TH%#4q8VT*&3b+%SI&89#sW{ zO_D>~r=D%x=^=pofxin>ri_=ErlauVXRaK#@j__if|5SQ5%;Sc17*tR6ozpM+w~^< zf$RnFI1ehmzl*)_H$&0rxk;k>Rt45Bnjho~SxFY%T(v0Xu}yKRq?u(Jc%`qh44I)e zd(i`o$pR4bCy-+Il&WF=69dYpsEGM@J{OGTm#?qtLkU|}H9Ui!pQhcuUloVC3R#dN zw1kyMXv{)6Uej<=6ps_p@nVr0`JggozQkl^)#ly$@$ksT^{dpxxh?$TC`K(% zCIMtvsw&*F*_@q}T<8Nb8BF0Q%+e+&6|ODDF0a;mc+-!rZ-mEl=*lPki(5VGy7P=N z)HK)P-w0!QD`dTc@i=B zXPo=aFXND9L{$#+1sEe}QxK&oDS<%-(GRbONU&X+w&%}4Wy*Sq3B$AgcM7dug#C;# zCX+^r;SePTF;J!tl%9q@CAVzvaFa$W&2?H2xxBiUZ>zRM8|aZHTyl`+tDTo(+~XDCcra){d* zgj7EG{g~K2COyXz2zUh^XK)LTi#@G-^8ta5aBizO0cdv(J$THYBm5oH2$Jb+jle1G zW^R>lIqRb;1vdg0nvI{JgxmAe1SW-c{ca_shguzppio?F@|I#+oiQJf5VHszKd< z-E+aOxqbRp5!VQQ2cg7qFSDQ!UVNYuZrp6qY$`@5V@53~{fKSpr;aGl!PV`5m{daNl3KE zF;PgdCPYyV@}im@TQNCJL3|m_5IowyufC1%sM*r?7)+gPYUpGxXf0R+#ua&c5?br& z4}meML;S}?3pndUNp#oigm*Tmp(FEOANahI%DGDa>Q#%NkmvvQ4Tj!sOg0orLBS$v z&KX3?8l&TV8g?OuhG6BRQYOHy_Yb)Ml_~EfCizZM%5x^D@F(^I;w7QnUzeDExImfQ z&E2lC&^ymDwXLeP)Q}~o^t6X_TXGlcAZ`c)kbi;m`-^bkC_d!VCiuNYga*{wcHoj8 zEaTKLRUWuR59k3+?jQbPf&`#?a&?|+$9yKH1Y>pI3G9CUCiMCt zM_QUXr3i|5yNmw!k;3YD&hoz4&<+u+w8?4$$|F}~AP0H#Ut;p$Ck@#L3-l&D36tw` zTwV>W36KQJbWY1G5I@jTmK8=?*zee9tWOHDw^hW;PaBW-eFxhEOmvc?(f(cK*n!yv z^7?*Mi<#}*NO%fbhH8SZFrjiaJuoJJ$e2IXii7i&y_ZT9zvsM~<~)w61cQSG5_GVo zBiw2ZQlI-LQ5DL;#*I;I=ecqtjmI2J6rG)Q%Li7 zQTMN|w!d!1$iC{c7c~?eR0CzICC9%}*#7_%0xRca)?q#onKBSM@1NY0sYJRcn0z@fo%*=CF`1FeY56m_LCOdRL0?+(+fP1*KJn zie=IU_?x(53^~&2%G^261@GYOfCaJh>7)(3+F$8g2-%gYtWtVoT|{UQ@~;?15mPjR zc7j1=Dtw8_#q^h{gDMdWu5Gf*7a}xe(%v*#{>YGVTDm$`2&?!KgEDCmHi(RAEYR} zz4`2VTR>ghTKDPOYy;)Yes-5!L$B@U2mxS9jsL^x&~XPUtyDw|3^!H-_=?J7PE`Z! zDdoVJE-%Y=gBz$!UteO%3FtZrIJiA z+@@r*T$RsU#BOmP@#uft2+-@aWY=J6=uNqj3FWv9CBgXe^kg=)r}`sxn7IX7rUe+2 zICRXPGPt`qp_pV}Lrt7xxg%}H@I(eFFP|Wh#0xvyyqD%r|$8sx}^WWtE>T0(K3L36zNj{!^%i ze2?NHTGf@)f+U>nHlYB9v#qGOKp_v`Cut;fwfGb)cZApq|7{usEzvVPz^ycLbG(mT z!R)8z9*R9+ObdUQ7yuY4-kGy`D1daMKACg_ZgYd;rl~;~#)GYOvF90S0RQnB5jydv zc9^F%LCC)R*fpXB8LWOLlISgZ*)K@`-4U;!KxHa^iK(;yK+)B{{sM13KrxtqzLNv- zjTBHO+Y>wrhb}Sg_cAJcoQldl?>9%RR%B^jyZxqWl|GH5y5@!h4ZB-YpQ8NU^i5EiN?u}W*!caFyfqr) zz1dsGcppSJKdTM=PIqHoFQoW|LZFBD>L!0#ysZe8J(u2KN-@a2rW@EicE_Ieu=(=H31sEgoge5(#?)_VU+A+Q@s~iaQH2qx;}op z6)$Fep{eLY9RA#eNF=49l=nL7RCPGVbDKs-_7tU6VONAWyl-7Xn@VR|!s;`~mC&Ux zF*{|jFIg)Ziqkv>jXyYP{WH(J5z!*b~PrMsL&i{>mhf@7YO<77iJ*k{6s_Ytf`YZakLBm`M(PrnWF0`ZLC_*F{{ z@R>d{fLx;c?IkAcT7lM5Xb+O?rt#0lW}{^Cn}j_;nf!x`1I%49XdL_8m5j2fy;^fS z72Q(Q-#EvWrM+S*fjFFTUFI(j8K5!LcbseL8uV<2Kt_FP$M0Bi({(E~2O8vMhx?BS zA22(jTeW{qUKX-0g1eu#_$pCUd6moXZR;;0j+y5Vf(sOk=ne4XP$k=CrK_Q`;XY_* zIq!TsBQtSwGI&{&@*bHjP?^eJEVZD$Q{sffQcC=BQc&@R(yu7E0r=IosVB8vY_`Re z%Xkm+#!vmQ+YwVd4VstyvG&+P#h3*`nys!2uz*?XM99$M-L_|mLqz+2hD~`_yr;Tx zYM}sV4Z)8;Oh^Eqs%_=l8=RRe)5}ajSPS>9HEzwJhHlHc`MmSzv+3)2LJfq1^&zHh zQmxoE9b5!YsmAFn3Up73c3Fu59VZFX4X8}zFEP2Pc#Fxp71gU0FgH_RuAoY&d@=;e zL>CONYn({$b>*hmbZ5F=7IybYjY@#&Y=~?QpIe}W_;K*}qMDcrl66_|D3!kMbdz&S zv`@u zSRPgw#}20oDSsu(qj@|#+YL(h5EHup&!-YCHRFxtyyk- zOyZ)5*K7EtfnQd<>ea~XI|4=xVCQ+d{qK?hcO%Y*$Q$dFGQkUpkluUd%}W^nNVlROtCk1SOdlsiV*XsB4xLH_QSDyxm;2n z@6Smdh1(oE%ch$rc&N-ztj|-fU{-a6jrmNgESXleF=DkPG@np*VJz8NwIV#asFkMbG(>xN@T^3w+y+# zS*;ZqQyt>pBRpTPt0)NkLmLf?iRI*I>gCe4CB`M z^nJ+6Yzbm$KMkA0R@fWIl$K=1F8~7MqQaV&n2aSv(D)>?WYi+uWDl9)QP6PU$~+YbE5RUc9o@P-xbMW6ca6xvOcbU%n-Zv= zg}Z7KnUQxUW;Fq=Z<0g$k4YTBSm76ipBGgkR8-!^cC>_?4M}eR+)xN}}2zU$E#JAAUh=KV) zrklT>XC>kRl!>ryuT$pK9V%N1bGVKCleHhV$y>_ixB)1{-CtFwh0tZ;ljka%Hgq}^ zR$LinOkcju6%!vc@|HC#k{rJE6Dk45wEl;QA26Ty{+f58$bTwP>}yldq3omdCadWT z^P}=Q4eoQE?tN)0q?9&>KJ@9%Rf77;=M%`%4V_bNJup#3UDM{cp?(uNP?_ppVtSC+ ztmzh0z}XD1gZ(NSLJXtT9|@ExVFXgwDI6@Nm`rCMgWC3o>gdm(xkY4_t{$osN#o#P zH+Ir+cz0W`&ekk=;cY0lAK#pB2=@{5_*Jki>AqUz2gc-%{2vnzV3kSpax)3bGW(BLSI7bgC6^?9KvW&c$m-yqDAG}nO-oX_@NEQQPxa>8`WV4>0>UR6+H zWf91kmHL;M@Z|Ia1A19>FL#P+>}nfiflc&TWf?;ii5$3q{J3Uo?iVZdUwN z8Fdi$GxoeWYaHgOpiaP+M+ zX@RCGBi64~e_P0?!jwVAt0ZlQ=~;nu-80Jad^VBwdnQgJFD@fVyAk_`SxxSs=WVNR zEgm&7QCE{|R@YDTdxOgK{Us*vW!dg@k>Hy+GZZl-vjrTiqC9n=Om??K??rl3t|{=N z=In>ymqks2F%Oc#V%CUOLko|eVBF%;!umv^dcK;Q-qFq)a~u)H-(lRdGO8NAQ;lfY zya&dV_lF4{@M)^dV%CcEVe_02&KhGO(#RiNU$YT2#X>&(xzP=LL$?nVvv33 zi#eX&`S`F`Iey)>#b}raTs3K~0@E9AXbq9V@i154l0ao@e2Izq4Jx8CSP=Bhpt(E6 zt8M+A$pJ{9OnGIQO-l;BrC=;-<0eb2C0!0p))pZ*%s<{Uaju(HLG3R$L~(^oLX9-C zjl^}nGDw}*O2i5>M?0kG)Gz5ajR3|phWa;qIiJHtCtPq)H^yA@jg2OyhGJis zRVS>(b65_7B3|_tMRco+j3nXh%zc%}CGt_}!}VwFL34Jp>{KW2959eS2%27EN}&D8 zdz7Q?%T3AFX-;MFjwxY45h#<*?|`=s(**AoN#h|WeM!JK)!o_cXU@VR9!zWnii?p9 z2KVValno0oes~mURp5RotfNffbdskbco-0FsfgbO#$=B69}_xY)X}~(-qAmO8zD0v z-s2tOMABCT&$tCcF4Xhv=a(*J{DJy}FS{FG%Y?)D01AbYY1H_!eq>elf`e`1H-drW zGRSivnqOjalAK+4;v?EbaiYq0mg>;vh{XY37q0&FmJ=iNGdO%`{aU_uCHZHBAprM% z8N@v|S}O(`#)IrJJuG@&_GpiK$>yn<;`4|#Fu_Y=fBhT$Bx27m_Krt~8>mooQH@o1 zB4}NBn)G_;{*P!hpfa_*#8e}9Si)gBt1Or6Gpxfn35Yj7-UiAvPFi?KB;e6+K*6m8 zXYLbKxx~x+duywye86eVw?ZA^Pm(}g`-Vuk`1jo)~8Cg@pqi2 zKa1^h?=djU6M$ZQX)*quO=?gSd)C|G`u!O3>pit&Rz3Z(l-wDXQ#;U?&m%Y?;Z;sQ z8(k z>Ui>OX+W8@)Rjay%s$SU#H1Jo1+xmihDF*6LXEBr!Y>!r0s9I@FKg`@PupaP%aik>DZ;%HOvng;z zHc+MU-m{ z^u{D_exK3f^aiW2G{we`PJ(8&N;DsB2}=fZ5*U*zX3U>v3=i>^GEM+UK)1im?AR_0 zAwBWAD*+|2Y!aPiU%cm`>jVs`4o8G{p|lzJqo%R7v0ccd)BIhILgkBC>ESE2 z`UchupfYv5#8jQwVPhbZFm`|+%;|r(t-P|fJq)}eWls^D8>;9_zY?-;d1xM|r15bi zcBD$lW@HB{32isRo_29yYk2LORMDtA94^nmWuE(*KXnsR(!6k!JU`+d%e_y)g zyKnD5EbVNC#xV^aI6a(f7;wX~#6!+`# zQON0Lf;1Y$Rx{1CQ3NVe=Sxf-V5UD{+8RYH+i@koWU8h+aQUGDW!k>gQm-j@*YkJ4_I z5ol)R1J>WnN=%`W{SE0_h8Vc-p5r>@)fbFZ&T+J~%dsS^=elqt+yPbp$Kr+}vhFIO zDK8V=1)5X2Rt?5bDQ*4(6a3&>VK_`K{duVpb*h-@bqYP&O?IX2U8>md(FD9Tw9zzzZgC%ak-aANi z(#P6u_8DvHxCH5Hcj@v64CygQI@>*Mu^9yhj4B7xfL6 zpqp5PeO{Hy5r9v=^8m>3ys%7|J6aHvf_q0(7gvLQaQB99NkM$SBMjuv%bu5*)Z6eX zZGWDF*HnEBM<1%9ugZAy4fuBxo{*z$Z|q|@Z3P4TRHrk-Hw}45Im#_)rC>Bt-UI|x z=WOR7v8-Lv2}b7B!Rk?w#klw2$N52aRvp6*V^WyFm_%{@emAvJ*rMAR%qdJEj>QEc zf1EmOkB{cgnq{eOyM7)A0bL8@26z(eFoCUGsXB#^jLs*_+869P6lDCSSFsaUC;-k0 z^4Zk;VuV0#Kag9ldiX>mB}A%!OmvnaPZubYOQ&#)jxCdQpMxpb(J~JIp7*x>L58HW z3)X%s13(`7s~v>Z+x}wBjC~JCJC5%0$=E8ESDT)1t<(lhc)KLY|2(c8L@`Z@bY%&eLM_$_CL?`cc8^s<%N z$MhyO01_4=iVlyXm|+rOSm{J;2uv`{{)%lU!}z}67+9kmuJ%-w@M8YV?rR8tHJktN zs#*$5^!MA6hT7<=BZN4r`NCPP_s<^$0O8E5XitYOR`H$6WF2*w;TwjZQ(RqS118hV zeb{ID$7RtV$D8{9GLaf&q5oyNTSE(Xr9KNjoGgFEBZv!0che{RA5;JTo9P49e@uZ~ z?~c$CV36I*VeHF%Y0e&rzdNH@%CxGe(pnat+dvsP*lMJe5o0u3F>h}{d@zwcmtR=t z(~O3z<(QJ0sQ9sL*EmdIRbR5z-L+$)O74EhQq(?-8yX{v|Fa|e#Aa9p@9*cO#uaDD z$`t<*7qziLKk}DV$Aofud=+DqfX#?+&zBXVjuX+)tH40wUDO)zGcL|VWP)J*m@S)c z&RBMD6-A!D_AP*e$TaYm>3j13pUFMw`(y%LG%j0LSk@K6`Y3xNHu`@|1OLyz1L}YN zF?gCn>YA~c&gVa$Jy)jSO{munAFPW{pcf)un;Q}a%Y990Ov{>Cu8?N++tgs^xK$&6!hYF#5xZ`b5a7id<3;@&%jANuXxzK_rG9L{dlY! zz%c~~#5x(*j*)T07Q-%aA^v~`BLjEA^C!C3AiKA*p^>*Fin*JX{e60=;Y8tDq2iw_ zOS${}zxO}?Bskys_3H>MjSp&xzI*A~M|1o_RG~35TCrcy%ZhT>SQz^^h>$AQC?v!& zsOjzEMn>z3{eNJmvy|G`;MPWmJm6lEW}LxI48yOZ=8~VzXGPvM8wYQ~wb-o);W$1x z<*^;n%o3T2E@VE!!1!jMGx0YR7X3he>wxZ;!0^CrMF25n$F`<%Dzti-Re>a-P+44a z)f*&Dr+u+lqbL6XSGbmM7+HAT!AeaNzwqh%0H;dinD57ARtx**#;B{j2Q?>w((Tl@PD>|?`Q(kLUL)hZ8+;6D~&@y-B@WF9X!@pH4)*xpN z<_+B4N(@sENwq^@DQHl$P@TZrxAVOFl0nl z2}#`rW#3BpD&}`Nm|A9tl$8R|$BJ@U^UWh&`c&e`8lA=8T`x56ny5T+SAPx0#E4Gt z8L6v^mTmlY!G~MOMxK-Rs9t}=KUa?aQo?qc- zjScZW2AHikz(1LH4M3}0r>>ATRDvQ%f^ZQFcZg3$DnD#|beeeHaUd9lcb#WB>MK@F z^B~~7wtf~2a2wO=W8_Q^>jh&5m~1AT<|e*DydQa-W9<^4-?5_{q^@#(kT?_wIXI)%}n$Rwjb0{AwyB6?}l`yQwWEst3F8&Y)JKjl2 zr7zx2pOdeMS-{HZm!i96Bi`U4rwB3exa%DGz{twJxugTp@;<4RK4>3`9+TdZS0Duyyc*L6c5MBRXi=@GdQtif2#j_?9}U9zs&jOE`dd6BBR6 zZ)>cqyyY^UfVjWuPO}N0)uQ5jI*M^ip2hCKa&_e370)GylElI836Hdx=R0%iWUZ z=BZ4_h$8!5f+tzElGaAdmCWmv=8Q|dzK}BDuukfs7Zdx1p%~8{{R#4fs z16bpWG8w2&ufnN}0tcrF9>u3$bRqNT2)W5Y6yIll@byc2+p%|ih|bbUv4m=lfn@Yf z18bJ>6FM}$f-vA+A5>s&RiSc0R*9%db!?f$feIKJh+2G%oBbmb{n~~W@guVy3jE72 zJ*|*OVdg$qOOAtQNpOo@B0tzo@D-Ea-gDf8JP+9E$2H8qOBoVGu|eHJeW(#)2Cjhz zyW0}lL8{mGNl0`xbu+==Mo@HfK7%h;xj;smu=gB1E~37+h;OFUBlw|Cyhxpf z(?zL?{_(*wml}ImJQ7PErOz%rQ1m6bvQSTC9yJ1UpYB^7 z(>`97B`9P0qE5gReQ|l84FBjqZ)IGob)TisRvuV?ajt47m8c`gR78cX7u+9xq=E~5?7^k{;ccvR*jOjCrwAW?$i&wfo`l(`iBL0|Lx){?%8Va@KuTujVC1z&oB-_MQ8d-o$!bukji0?u$S9r>@&siS0l+}|jYy7h6` z_dPDNxb~84WXuTIJ?h>B#yZ`g|1rRU_7le@6HHOsKw#XcDhY}kwdAKP)oF|H9>cjr zZz*Y7iuh_cAtI9&);N&2-QJa%d(k{T9iK=y(}iXHAxR3&2<&bu8&!1=OE*#JP=Z%| zYlntF>n8JVo4JpRN}Y$toqC%6wJeq+-#UDwhLqbqY84RVNH#2J!hew)74GR%i7`J3 zd3=YzT?I8B~KT%&AvwbMwO}c3b;Hd%qj2RdA0x0dqL@?DiuGgbtmQYN!gw^wBP6wNuCM z{bR8H$heDX7e5~we#%``8tna)8dRa#kAu^hOpVN#wL@Zrp>y8%s=lWQI^xA?-0`|e zQUK^PVcVHHgp;JQXJoHhrb3GRvJZf0AAC+RF8I-CHPIi|D79;qlUtZimijDuLS2tf z>5RMXesDrnyFQ8h4)un>f>B1**YnoD6}w>aF(fG5PH#W@NKbYTe z+wkh2TW+EgYCM#}o8@jHmuXjN7NXLnSAxeF@?TGIQ<^Au0>sTckOX zv#lQd0}O*uvygGUFFCky;@1AE`vJL{L8EmcIAL?gY2-vIN1V2R-5HFD0x=JHaid2u zY$?+7)ly~5PX*}F4RBC(b-^UC+&_A3k8{mu85QHg6Cgp!0(v;{K>m&1ucI^4Dm=jC zqVKK@4EI4ZGCSZUqiT;gztt|N*2*V}MIe6JaRa&ztyo5=E$u8`L+Y3Da941t9U1`W zsQ3i#$>a?rUh7>Ll<=E+?jkj~+!G6CJi0VW$TFM!o`sNZ&&FiegxA)Z>pPm6Az4ts z2ULXJUm&+_<3WOq-3n-L>#L|ct<~$Ko4Pl2-lF4qt*`8&U7$s*pL8tJ=pZ)+6uWRuJ^68cz6{VYh-}7O*&~Iq_S2(|N;{yHZ-UQQG%R*xt`Lj(S2HU)x9& zsBU>V(k;Yjq*a8c+fPFK*mWi3N^8+s0ptqZj0CImYI^3#z89Z?EMcL28B!nZ!G-t& z$P#yEK5Z`k@#-I%Ryh&;4;u6CU-!)On2SUelBW*Bc{TWJ78Qds=vbi zN@88V8Y+Z{)xwD(?dg9Y7Ku^xK^;cXPtc$f*QkHbad5(Z>GxwmGqlvFBX|5eo+|KqAQUZu zkl)#NZ6vq*@^36lC~{Ffdf-}4P5Sa~8BtG=pgKOuy{QC7wI#Um*o>g%aAq^W?qvoO zle-9m{}R&PqY9$<9`o*@7Q#{RgpfQaISxR)d8)nKJSRT5x8+vFSI7 z{gpC%A}N^iJC`Zly$>6}_B9G#oNSF6Dqg#Ri><8}-A4-8 zW?5!j#7fa3mlA-o5G@JC5GQRPNd@fKTFRu$@iw zuMSES+zFXTE)?8!J{%aF{s%jfy|XTxXk&^J(il#=Z~#^dNoIS45rzH?K(_l#pUqIS z6^FTu$DQ#nR4_rp=QXq$he^4vn8e5dkoe?z(OkD2Y?6Vx?qK ztJB`UN&QwrcGKus5@)8Ri;d}7QRbg4gw~q8_1;hVRpU1rB-4l|lgybR3MeHPkAH0` zY5&xO*JS!Z_JZ6h@>1y%yRcG#>nfTi2~i&Q(;0v$@@bO6kOtwxIg>Ch5qh;Sy&z0o z(BO(TF&*cwa>)JH9hr!)+B#5D-A6UvPt(^-pXWNwJ(E%E;Fp$r{m=qhgTPeybJ|k+ zy}BI{8qZ{#C_<#|>%tU?c@>Q{+zA^^U7U_SyCM4yv##-fUJz2o4K*XVWQ9j`L1T%w zSc(U{R;`9r`1L% ze_ho4pD8hv07&z3W-+sMv@LDDt%)5@{4sye4-bZxv<_HbfL=fS5Gv7u&>cT5wq5(A zmTJ`-6kmnEemq17FK?z7Hh9nm5u<n&q^(!NZ7FitKdLqO9`XyK;9 zVE-h*k%xpAgjxiI#C!G;DWa^A&AgL#K4M9%7{dt&*8TI52vW*^-s`$>;pl}op~XobUqb@sCZ&WU&>_yjwc?3+%}1H{nfyU0kPvtgH{I<`fA=jQBcabnIsuH{PzV9 z>6CYJX7U{McvG00c>C>JMw6`WDEjjrJ&gEswFuFHuy9jX{@vcj8RB*R;>M+)&MtZ8xlERJ6kB}sj8Yy_}em)Fwk*h{{ zHrM!Fa*^(+*%xvdu;f4%FuMlOHQYo$uF|OSP^b%|2SDE*`iJ-zTH0&x;se)lky6ox zexdF=#$wCD^fXM6@T4rgTMK*4|D{j)ku!s^QdG{{E5sFd$yFPo}A+wOPJ+W1;4To@dK3fu7`SLJU;I)tc5{QirN! z--_e+RoY!*TsD7d+!7OaFa{E^WHvb0jFka$0IhOCjUXpY!7#{a4@kxDlqeyelXJOS z@_Cx}QTD0)LENUgtEzaEw%V$)@s)B|TmbX$!!w(QbsnY(GN)6>j&Xm^7h1sP)w^DU zDToBS(?YdeBIu)=<{w~-PDYD`2BhrCeP#*lolrB{0fwKyV7iGKFsRS9ngFmRV(H;pNWb*WMYWt zVGN}Ar+Q>{s0RyY@aL-l9SY7wOhQJ1)Xf!gEvhyTno73x+}?QaHMN8tk-uuG^!OILpFxh{s>Lka($f z2$W$Nf8B@{EPlKtlOjVD&z4yYlRoHh_Y;$hz%9yiU_oc!N=Tj_xb=u|A|-Te#17lj zxlj_pOn%FhFhwv#KoBz6On@4q^1t=l4A*jz`$PDoN(X^y&g2-ZK`76d{Y6b;>5VYE zR(T3Rr=F9`f#9oteL}`|xd%7t+Kcpt9Nzo`J2?+EcEYj1nD%M4RM6Fc*BUv=t!gBRbl$0vs!j6B$3_e(brxPIoAkU0hh%jt5AAk-&wPQ z>r-@(oOI*;(50AcvaBve#yDFyTo%vwQ8?Wvd^^(w!@KR1yO%*qfvNax0WwwC7+=PpRIhJ%_V z`EG;EBeqc9WfMq1-P5z!!kJzTgl1|je4dV91I{?-*NAl>^9u6aQYQ2*nnG-1!tIgs=3&@vsBY&i9KaK@Orv=p14yU+;Hd;3exL zU7kkDLC>7174sap>vA&y+ss(gEEpBlZv`c`)aATkX%S4L)VtIrv(9LPb${ zvLUxi*}+`LjqPz0!w4-n6HxyT{@O7#3Ax{L5=G4DIoSy#Zf8(ZZi{7yqW@3L?~`gv z;A~>~x6}~Ml+qwltDb?lj9(AA8aDSqY$#ii+J=7FitL*`)eNb)5bul@EXZmBGlUNm zM?ZD5ZP3&AWze_cFzT+}`rNT<3Jb(pF+mKvC3AOJR1;$^anQsJE#eXUPJJrRr-ojJ z8nD|>x);GO9S@TfKWMdxUXgE0CBJ++lR~$V;*LiJlQ}hlH_N-m#M91j^V@g?p_4^w z&%RuJ=3eeY3tafD1c3EEaBFH&G^II<%!!>H^igZGuuEs4|0zhFmPfQJi*A&iLxn48 z*2q4gDN~CK#++KzgmkSaq(z& zNH-bjm9+&Sw6kYqXk9b7QTMliMmHJUtPhA0-2OZ*10UCH_2o((f23WIDd+G2oGJ zq53>;b)}EepUH7O;=FT;a^!CE0uT`z*|8r7jGpiaDfE(i)HZzJ9YKtsx&GPIOh9QS z008>d+~?~;-I^V+S(c)=8?SbSfyd5F9h#W1dR#m#&l}J`p8{8RydoQ6 z2G%ewQUUn4v{3%m$++@jdCrd*+g8;}17SW~J@T3znI9z%d?iV=Dpc9%cLjANfkGe; zm-W_8!)ZR@)w>J5gd^+`cqxcXn7eK-?nn_JdyJq9N<(t^RIa)gVUWwK{v|idq_p z8N3HUhN(YVEP|#?-_c;c07;=q zP*}h!4x>`DA^q|q095vXVl?Q&jS2iTP2vw9nzWwH^lo^?TF?uLbxv{^*a}|gnkyy# z+Pl_~*mv5=6d*Uq7|H>vF#korV)UK0QeyHKIj1RQCI+H$(@ix?4R6*c=lZi=Q|!6( zby$Re+c2U=Zw(fBgkC8ez&nvf3id4DBS1`6I3@jj_J>l-uWPrOjRInP5)oO5ndKc9F{3!U_6DlMpS zK3rcht*{ImG9uM@Af(wmb|cT~QL~;g7)>)sox~sQQU4dzu$ERl^8Bu&qUc>$EpZDS zad`U71Wj6W9KOp0a`;Dh8`xIw)#oea8NPa73?u?-hUnbPh2`2LEykmu*H;VSK3O9m zExc{Cc8n-L@E5QcIj#1+3|3@XODu`TC;{Zgg@L5qe*e_Xkn|o=_^ASI7zy~kWh+rJzx|B zKXozQXfhS8n2$L|R4oGq^OEOEWraCsUJ;F*JNEV~GDqBPU2Oy+XfT+{P znHrzWtTF*VIZtooh%QedWvz|9$$_DlmbnpGb-KB>CO2rJBFxvno7+si!Ru7DKkrk1 zG@H9-2|)g92(;N@Lx5joQw1+}nuTE}{CGDrXn6=>R3 zdYY$U5wex~VND5ltRL|02#QB7Cnn6GZ-F{o9f83H!{;h|_EVWO3(?UNY6Z|`iVejC zMgCY7p#1}tXjQ_`@Z-Qwc{SgQ(Y`&oOF2Gf4G%^wCl96J_$2tbLMm>x;Yn-419jIp z)`RA&+hx}oiD3jkC8@rSGSWzxyxcsJA`^VnvS9sZjO6&fF%C*DoXiJTW`HT7t!$E8 zi5&@);5PxsyVAL6yc@g*k5@4UiMRU{tsf2Yb+9dM@Ce}1oP5?$D?N15O6@OFWU=?C zkyJ)rp*W*85%l=idV2C7RXmpK=a zIU^MV?3`c3Gc~_j7wCt?a_nM#9gy30(YJ3ZHU9!HZt5pOe@uXTYS@OShw=5IL2XpZ zTP*nM)ZD|`RRE;l0CERMzRH^V`SiF}juHU|Uvr?A=CSHIV%Is$4_`mix|FxhnGbj( z!0*I54XI#FT;@%k%q|RKpcTke)Y}D@ic0xL&ZFU|(IRdRpBf*8k1<&brRMsGCTSrA z@9)HHgk0_&wK_y&wi>@hm)uh|Ys63zRsiX4-F-o=h*Ylz3BDT|nDY#fjaJxR1t_F7 zVwMe86}`jc+Gv0QEqr`=t3{oE5+evPXQ#8=5XfX{=Afix!Bt_|P4mtIE886{VhnGq zq8axegf0PS1GfP`#2v*)NB4PuCmUa?5;2^+9CfK)VqHdD;1hz86E6*K3+L7S9;L0| ziAOhTV_7dD2LZq~FYQsA3F(=GYGou2VS^;43kh0uG4tGG^trlBe?A~>ZX$Pgsh52c zCxUUWBMi1Uf_H>zuirlkIn@>)Hlnun3{)9l#e;Sg3r<>yg8H*&z0AmxSuiLoeTN zk#P62{&99#JWvlpv|lD=8H`rJETV=N6W(2YpC~vHTPIr{>P-o)KK}9~b5^;Jt>qc# zTx~^_y?q^aMkDgJC?(-9uJw|_kI7Jqk_A?dFpX%0vE4+vp(u`{ih6|5O>a9K)NrJe zBIK}1OM}nOZ&)U2%)1lJpV|6%E>*w;gx)*t=C5Eoz-&Vua9|Uww49@8Ar=MA^7cV} zcd2FR42td99jMwMlXd>z3QKZg-))2eqyS2?d{}}~ z2qy?u@(wug(_c|cIRSlCX$eNdq2mQyPBnyKqF-|cYk2jS)-2EL^96aY6o5akv^N@< z+vm3J(4hkS+F-W|u7+!J+07n2=pVcBi+7-l@MU@_P>K`qyP@+SGU>(Mh^7a=n0*6KA6BEN87SYmTP8QToG79s~ejEB?XvAj$} zG`^t;NgY&=4bB^vudsR6SXaz!}#6RZP+%K zC^I1C% zau)gW$jAE58Na^#tnvBSfN@J37m8BXIg;p#y5Zy4WU~_tFFb*s>{&m3xv>7rVcn4Y z5A*Lx51WV&0S0o+G94F)mZ`vEMpD|`~dSm*y*$p?Xhx=WnX96UlhhVN+7Gw0lgfX_}0 zo4V4~#SEHh^5S-=6%ih`~AJ(udxmFc*i$} zBwWC(0%JZGVb$2AkeR~8O${}*0bWDIagA`F)j?@YaIxlRVTD<^k6Q)@)=3zI8Q=tu zBR45!SwxCV8OPE~&xIZQ?eI)X9WqhIZx_R@FbrKYX%nHDL;UB82f%k#h)&QH+ssi} z;SN;nWZa~EKq+RLln8d=xF;J1Zs%Qmg5nWhU^QVzCImq0`J}svlm1hENFBu+_aPi^q_x59(Th-Bf5z2UbNvZsYaaNehZAIE3=O8_c&) zhFcnj(Q7T;5J2Dg!o5p|mTMU5xiG(xDLLWvZ_P$MSfstBSo;HVC{`N)%*6At#+|@D(j3so=FU zk8Sa0?{oAc)4nVX6WhOug;K|Oq*Vplsz9;jl?h0hpBZ#$Lp@H=2A2B0;7{}%4 zb*i(y6oL6NYkMEFx1^-Ks3Bw`j9b=~;}ny|7Tdz12X(R{G)R6fKqab3aPnX^Yk#?z z*PwHJy^#%!o4hf;;gsmmi4E=ivOmY}$%dFpG-!&)%}ho9q28bw2Pa<(#6Q-E^_whfpcx#cM)|Is7eX66Nnn@qM&!v8=2~x zOp+O#XdPl)tOt(A7e^S}>TXrSz@7>IW53aU02DV@m^rkuVfvl#=1(p%%(Nu*Bj}^Y zh~{ADG*e#GYoD0DeUc+(WKl(rpk0+R(M_zdmGahvl6ApTU+ZUV*FgZIv-<&dqgcv4 z!7u(0xC}C29WI@~<7ykWR={%95Nz?Y=8^e(B!i=vyfVc$v6*s;|f= zDMo74#}mqh%y7by7?k>JUB8pbU2+dr`+UCpJx;28A1^{d;BU>1=^sIxu#-sLBvKxV z?(2K>JQLQUz(eN=l+(!0m(qzQyYTg(=Ea6%G)+FBL^j}Ol|ZWcAuGk(_X~<+zL1eX zF5X3`RbI;tX~1(?{}oko{|m!)`rloHfer6I9ce+0>O66?7^UzZ&(fcl(Ezr zef!CCkf%`FZ5}?N`QRQ`^f5C-{z<2uKypZ82zp2W0WTJ~@m;M1e09aM^?z}B=!ptd zfi&{PqkNZF>jL$dn~6x`@LkP=VgQc+U_6tkIm(&ET{>EoJWp@Xa*Hp*_Vq0%s*FgG z_fFmKl7W>jQW_|WT42^zBC<`&PzBq3dbt3~&*MAPMTAl-6%o9IM#h&{5T{}oHlPl~ z@_`u;oNL!htl5q*(vqccsh4V%fuSE#Yc9~2QSO#S81A5W0>6h3qI!w#%sUZe-?Yj^ z8DRx;InWbvQK_xX&%EJnK&w#$W2#@k#`D>5->p^<>Eyklhfb!doKUh^oxuUNI_bOs3dO2)jpt+whXs!@OD?X%qb!G3gF8eg`sEs@hY6?;Cg2wjMS`Y{gN-ME(r^8CY2X0 zP0_@_yVO#|sNCl>fx}oBOUz2Oep_Y08ia_Snz7W7Iil5o5y<~LaaLH@l{+0m`h#>F zNMs{aK9w4Lp>)3bIl(I8y9eDa5q}JD&d18I3){6sT;?WH5d9s|K737BqRkYEyM1CRD&*C`K=1maKe0tApjAx&M^mh-Oy%?@En9;q{= zi0nI-S`ZKQ)VORkg5352kbjCKQc_{44G<$8J!Sj)XHova*e8*YVlI1sSxl|6Ack9l=|(wV!3TLXn7zgcl`9l99MVvg2l~ch-bDqk-7f zlv>?)+B$FwbA!tX=xPHTbc&XR8$@-rSFJ@q+ezh@BBHc@=u9$(sFrhmsmvQ zk8#Z*M5jVVQCT_1og9{tyVI0764CpDL=ea0V{BcZonak@l>&DPTvl&nO}h)ykuP2+ z;b5PjqWClE1!+#JT?d@r0JbQ03+SDoKgSO`IRO>EL^ioieDg8}A0flW%!Ymf?5Hb9 zxz@JmN|sGehqu7J!U;B@K%}v8?8G0^gi{d{1YCq14Uw=?R$y4jRS00FpNO%V74`jC zm<;*kBtaI?N@<@|F?&emvC=*N{3`DpHB~Pl(!VAbwaU7IgEyTIi`LpYx~3 z_uC02t%gTOkH1HPjM!JnKfWeC2y4|Gx0c>S^`4kP28D#$T-Rq=Mfe4^Ov~e)Lc~h>p8$^b)tM3UJ`xpAWmPT9fKB;vNC zQ0o2V5U!>4?r*%SfMPhxsCtJojt!j9I22JyKz;j1d!;4$tvovQxOk%3621E6x>TrT ziLfTjicUnd>HPf7%d3N|dW zm{*g>_-~)=05+I2SIkc;Wb(7beiFmsOGQWOlK8H|^-s2{q*@FhtSR--#l4_X8h2Pl zB3@ZV;BXAShDNS+`tN`#)NkZMnQSzW#W`mPQMv>J8e-#mhy_6f;3; zuk76F%7TlDe9%JNSqIAuD{Z)EAch%2v@ar` z^uCtH(@m*^9f~8 z|7ONrqcH7sz})KBCpy}h|GkP&z`Hu^ z0<9&g0YVMsfQv8Vv7ykJum~6Dw`38*W|yrAN;Qn)5lZ3F6SDKrJzhwa2}wiqBF7;- zjD}$qsknw$w5Y8g#L*z8`lk{lA!n{UaqS*tL$ep#@;Ms@4pbmBWy>k#JN>-WNjdfp zCExAL>+yMep;fwX)3tDrg3RjVn>aW2#_k>cC*^X_0u2Z$7i^$>?7LLKrX;q1YVA53HhaMEb@j=0J{d~pHr zqL`!I7Vg|Af+o1~Zwvo!0Z(ZFC^y_v%_xrdAp{oQ}YrB0JIP?<6QH?+{+uzT@ zf0#n=y+UZ2AnBw%b%+lPIPdJBRQ#D2D92_!EIUI@?lxD!XGe z^@J{{PN!~N2c5*br^CowJ$4XdviJuuDgLm=c6qF(tjSIFNTIOF+rFf^Nv$Gowt zIFYym^J&7LzVz>G2o8;WorIDaPgtEC!*EgOK_=>(JDmPCI3GjFk)M|l0TkwKW?c?m zV(qe7lTBaf97JY(c|w`5KnQw5q(KLxhzkDrO<4A_tA*2!49Hxn!b}wVXGJ^Ipjsz} zmH_nH6zz;|M<{4PxQ_OH4~Y?%4(xPryXBV4>11Lzk>+p(jzDHv&^jSuk93-dajiPO z@p^>CR|Zf;mi|#--vkm9lSw;RX>{}_Ud4fdI}P29jfF~KYL|Sw_9@x2>-&7pYwQ_KhD?+*n&f*H+7^f!ut{6%5#INlV$|UgK29 zSo^mhVOGyN18!)**e3+Tq;&skHx@&`wu67o5(OC+n<{Af@(C>a#m+y#wQBvG5+Hh- zXJjljw_$g^vhuRM5V>zS10Dy1!w=|DnvE`E@5xSnAmoDHyiP7D-d*$XOa|t)f0))f z$*t^cyz)cab2GkNI4sext?{BPC|Gg?Sv`CW`-@r0hY^NpTb#Xrjh4~@&FpCIciihQ z@OnSMnT*?dW2-F}rG-9u)x~fW@+T|xOh~E~lYS#@s^0!s8&sGNAW>*xH1zEI4P*{@ zJC!TflcZp%th-_(LEXu0PcC=NSO3-y!C0upTq4`|V5H>$B&Mw1N3_h!?lDr37YhcOr`EDu?w0?S#Dz-1jgmhK6c7`;;^0x z6{6QxpE~*fg_pCYO9Yq0yw4E8E9kRbEm`NN7X`hbUU;=5S!;Ea33Sr4>(yxd5Y6S3VwckrNx0ji8@~HaB%{Heri5g z0N&T>w~CTjj!EGK6+h-odzO-8*+ApNMyY%D(pIUfX3HI2KVHQ61D&^6xo|;tzS$&uqc9U5L2hiPbv%uTJ z=+T(esQ+*EtxQ;y)VAWfGv{s9ftc7agX;Td~`TDjm+ zK!DY87c?d^E#NjC$&YwJl`TC;V|Zgrf2U6{niL22K%BT6g`s_Z=)u!1-YDmwU{=U3o!E$W9kYF4wnvqZp~a3&EwX(r*}TQAR10@*dYWZ{0&)Cn(iMWa7f=FL<~Ej(e^dtl%wj3}CiDsj+=Y z%s5DA>#6-6^A>qw+uPy~@N z`t1(&BARom!S?z{-v<>*F`OxXtGoeAFLeX`y(ij5HD2p*vpNN6CrFr(em?wb8a>|NHUw_$z9ck@B zNQqOAp-2$cEWx30Lrf6_PlS*0H4XFP80Lz3aTZ5ETp+)E;Y-QFDF*<`eNSH9>G=F) z!h_(quESqdGty7}eq0qhzT45X&GAr%86a_Xo5&~guJjhZf7(H8)lM`|qFl~=8Q;j)G2w`I zV)7yg+1pid*=Sg3v@nB*`K|#gZ#TPNq|4*W=6C@`*K@NkFcRBQyVa8-&mZD%ho;X_ zW$rf#JPb#fx>|L*#rBusEvetb)ozwxz}(V=XSV8jS0timdW_%W*x8_RIe%v7c=VXW zIK1RsD-i<7M7L@b8H?Fjsd&2^IaDJ;VS9RHiM>krxrHvun1-Q(z+hH@mQ&@s)Q(O- zH-Ae+NN}&)jWayvqTf4s(|zk@ z&S}08z{4k?rgIUyA`!CHY_5BWB5=;F1$;G7dqPo_!N{y<8(-iz9HkSrnXj*x2{W-8 zut}ig3I~Y15odi@j57Z;*BzCZjUy5aVXO&Di#K8x;%Gh6H&#kjqlL^>B+Dup8hu#6 z`ZHs6aMOID{t3UGm}yy+PBw7N`C&Vc7{c?tsB^q1C#3SbW}GjS^jxAhOqI%qd*-6E zk8!v$(&{ZkI6~?^OayXIIw+ufGSoFrSCA>Wt6Q=uk(`Lcrqq-InE7T<`#l3zV)xUF z$p#2)V^)o4nee3&-7J7Wf(T0p_jW!B)D2T~vlo*cd#8EA!t15q(xl|P_XFcS3Sg>$ zstPb}Ch3tUw)z_=eOrQ;1wKw^#I%5PfNiWnIv(dS;6WN3`Z{vpFLC2`5BZPoT zucDo+dcod-JB|TPOI0R$iC}@`>Csp{Ngv=Nqo!-@v~pn`f?Vze%mL5qlPg+U%w%#= z>dG4yo?477W3}XXXPK~!?B0)8Fo>d`yyWl_IG@@=zPq{MwTU6$|{E9272MmO0*W_U&FJFFIKYRjY&Ii z;L;I}kMoS_wFWxz2QF|>nOMGBCKd6v@_^vr&dEsDa#!P|QhR@zfGdH-V7=_@;Qhsa z6vE;>zd(62J&w*t?BiJ%y|>%M1_~jV)&a`eh>O1Y2FkO1qqN@I z;6v2j%(aw1utE~JehNXyye5|a^aj+fR=?y&f5HLx1=y=$Go_h-b`iPAYXRUKXb+Q@ z2`+bbWwLZ4^~NoS)6MD8iAB9@Pizcn(&sS3|8(VjSSOzr$WeWZ)02rpVWNfOOTyZ0oDv)57 z_S8e)U^4?uuV|rDSMAgU5AHu*$sJ-eYcbL_aPRxxve< zQt&T^?lhM;UY4FUqYa7~;`Q6>r} zOI*hx>@z*eSPE%B)eobYYIdG64kBV)3+p^Fq66wM)#%R+RQ@4#r06NYu zq(x?>YZz7-@$o?KXUel5XhjbsXZH4o*5Gn^!r{1rOtK80VM{Be$KaTIA5NRghAi5&qiAl$ul+AcQp4DzT=9|JVQPO z+5C`Ids-kYycw!}#x*%Lp7~p!say@+0{A`%5n*{FADrH($t8bnj4{Mlj_gP_bV&Nt zsfP>775a;&BB-hkK=u1h5vqS4$kFSP5UNo zwVtYBF@$itR#r#xL``RO#vwf&p4bDo9pMx&>-$kY1eF8B^-f!J9L=$Iz zceAR*Oid#H4hbzfebceqO~JBvQ3ZV8Rl5RH966;#2h6DDoMj#}h+m=h!NG(oL>isN ztl5HA3HKxl)UMlIX#G?-8uT@_r;6N1FIOn?`;p+sNov3j3kH-%hBT{p5|~&_AcMD( zlnK~RklSMmc=U7Kt{V9mR#I5$gReqF7-{|Qy)M@pspzkxkN5Yws&&5c?J)9(c7w!S zp1mR!EX8B%7D~cA$c<}s+B~;no4+i)e}|!fkf0$7ISmUFFiAM3yM~wg^J5pHyVOHm zR#{<)XhLW=i4Zm%sHo;a*3*aBbv| zWN&WwPn#sCJJ;&y*YuL53bAQ#sXt3U@SN0fhvKjd`*X9eRYTATxo(r=1#NyR3|E`< z#4KB#SkMq{hrC&?XwZ% zg*DgcBUwv2=1sLH1p1;Sf(7-E@PiPxJ$Nydi8b&)t;Z04Uq`VRrnyvbxIe^>AbRel z|D0i4T+KS=BSn@eR4fM~fa{}(?G+@a(a6-t14;L7Ne6yOOHz5>gpyqym?3p$tyPQC zJ2io=_+f*0y+q?Dm#BIIOJH^Th)YIA1A(S(PvJo7)LgB0nLA=d53_&vZ7fnQ#qyU< zGvK=fmjTU)+S><~xh06Yg(`*G*>BRY=%hlIN;^IHADo+8RJEazW42T&vi0Rl9hUrks0vn9%V3? zb!8{(b%2ij;5n6wQZ%G-^kzqxA?z^GbTRg%?`~tD(bFZT2s~+xmc$FH} z%a7WU?|i-t!Bg(*8w|O5MukzixSPTFo9_0+wP@-^m8<8!(HAn-J#Gwjuk;;*R=2c* zIw>$tH08uZ0_LBvx(`K+>TPYi2~d4GU9+_#+qbPoxk+PMm4*z~uq7VM)3!v#66>T7 zf_SqLkaVtBigUZ35GajhpT#G{vr}m%)B8%lJ2yYxwOIk#9L(r)&NIAntpCM4rSSdF zW+y>a&MB2TLeA-;fotYLSEp}OiH?E_bS`r$04g&Rnw!NDQy0{ekSu8nIcJqPnwsrh z%y4cSzJwQn+fI#8^#ITMh&_fN#DGs;-?mCZ>BWTIvT&-iP3gG6^+JtrNfYaTU+L)5 zr6t~+%U7duDyp2H^W%^Yok^JbyE7V@_5ar~6XYh!2F4|5AL_Fh`-~DgqY5M=o zJU#u74!S$Ce}j5)ds^?&jLX7Te%C*^b5brhXT;mzKVR+63g#rQ%9ueD0=Tv?fgwE$ zB@3vzxbV*6U5MH7(#Z!PlMjeuGyhe4d`#^G%wGU4xA$zdA-9~cclXPX`bxS&!^3vP z60q2SYeq|2l)xoe(TinHRT|=sMY09FTx|rnA`gU(s{4#`fv63%-A>wOHOy-1f2rl*F z9Jfi1)Pu3Z6bPrVDxuoRvsakH(i_E}@H&;Vw=or*Q#Sk)0%f(jgSaRO#sx)r_Bo-n zrqkwz3GbAQb3VSSYNB(!v?C`LuOB>nM)>TkyI7nClwqNgOpq`Ss4MYl$KD};NUf-M z1ZwL`Dwe#EMj`0q=Zzgc<@3Kl10nTu~*EZ}48O_CRpCGVl! z$3XV7bSg7l^b2MLW^vMZJ7N&vEv&`#iRcazJ+}O(*-rJ%8lwU0#Khpi8;XaI6s?$L zS8X7@)`{QFk>6srKJ{Cjn|zfg95i|g4rt@XuN9=sv?zglT8T!^#-a+}viTlT) z5>X<=kw?l|j$r5}*vXsE2b~8cz?4$+e9slR8d)}OBBT|S&c?ay)OQDJZhSwA zZn&!=+=MKx#5pmM8Ilc$1ljaClyIZ*mg1x)66nbi9Vf@HNGivu1;~+x%1ENP8fZQZ z<5}oFfwZ`*WOj;5Z5hh$76}R2lVCv>Xe)bUsD<%ABcan6LUK-6D+@i;^qcN_sPwMqW_-mvKy+J)uQ2G`@2TKizYLNCc=qb7R@?5 z34)>Pzt7T;35*H(fmkBPA8eix*0sW|F8vwVJ{_=>1@)_>wBO)tIE3z+S8@E~h!pR@ zI596eIG+=KcCBuPzHIRVzhc}Y={7`XINk=e*BQ#|+JsQvaa@~3%(9FwrT={dgf8A3 z8AM@XG5HALi>J2fO%H{R%?T$?iDiS0^n$eA5Z0a%iaNr|ckVO^As|Y)nVeME5fz$a z)9W`c|EdavdR8ISaQd5siX-&|5=*_5R74icGR|Gq4uwrng2WtR_YWuOMN!fE1MxC0?kqk z&v6HxkvNpOf*+7QVu%jbQ19I}cNE&Gm%$^z#UA6pO?Ed^O+TtX~+Uq@rjsp$&ea zys+`55r`qT=s=m7{THW%58tyfH0)U^j4{-dEMBLjn}alx^8l(w zk`>a1pmO=JG%u5{RT$RwR%#yPtta0`iiRXNRS1tVZ9_z6md0rk{%zkpmw7aHzMTosy{}87M(3w~r2-iWaIX5Uz!20$507qJL^jr4{1K z^K!&kNhqC@+MM0Dg|fDN6l3gs3}QVpD9n4-E&KF*Vd_Xf>D+^L-UK$qkTKyzKH-tO z%zB$1u=*8}srXAPeo`2Pzw4w)(eHl4CGM?LnGyRk+1WJ_RD0K2U1DPm=<}I{31(=r!&!j!yRYL;hfyc(l2s3IyJh!Q)Z&r8GF4I*^#8 zNw}hxc$}Nf*z{N_8KpW_GPXGGT!bGJxE{pIxL17W|A-QsB|Veo3r7ZDb-CiTLXSqU zS%?H+KCIEJ5$cu9#qb#-MNusLkg;`09<%0f?F7aYF{?cJO> zGASSHRhzfz*0gIVgN-p0+GJ)r!nY;Ma7JYVsrkVxsyp|EF?Y-NGc-$>Wxa-csta|} z(`xIfV4z738n)NJ6dXK@a{y$5#qLoquGzs3mNyP9CG?9m9Q5c;{6_220!SSsFz~KC zv4uve!7&xF3>0Jul=T+4m=WP^B3R3k809dvO9R512&j0?bl~za%Rg_vA!LWGWNlft zv|ki4SJmBWG#&jz*8F2kl1|ozVj$3w2geD(`sd1(CL;Af9gt5ZBNmoo>@X(dvG5xr z#l`Dc7S>5b|7rM<%+Y*KwL-r@q8@=tHMcS)D}&0ER_{i_IbNxz*ksvsNV{ zu%=Vk*4iLDACMa!kg2IcoH9WEnXap&(kH`E)BL{}Lf(B=SM5XB*bG za5!>YW-FD*ne1Oy>45-ugK_U(MT!WMrSs>960bn| zrF0{9$Jls-pnuD;(W^IeDr+sgoPnidoQbOm+OoAhZDY<1yqG5VBA=F+!(k-G9A$w< zg`h`u`lPiV>lGTyDok~d!@k6C60@!um;&cwf|dVKH@(Y5M<2B&wmVKi#Od3rwH3BE ze#vMj#%9z#aUSiFsbVBt<0#tZNtjO+qEC`LDD2O|XhD5OK?;IW^1#O2Z!D;nWjL&v z3$p{e7K?WCq=ygeXN8%CLoP2pV53_u!M^#cbzY;;DlXC-Cu;5M2hYq<4KZ71LAl|eLEQJ zNVq`xjRMWt2YzCBIL(B*KE>9AYPDG(B;i-E$&nLsXZjG}yeJ-- z#0a#Qt0eAbr&{1bLBqXLq5|*d>BJCwof^!8-?Z<4yO3+F+~G?E5nK=ibmqM+z*o-t zv9fUW2}smGCmzwXO!yN0rfXE#Qe1ss`HV5fTXuLJZn;Zj9S<9k@dcOkGHmW3=Kh9R zrCG27*eUWqRf1|J^MZoftGwdCM|Im5c}nwt30Vu}o~(tb;VpC9N;dksV^TvC!IkHN zFbCMEe#pn2Z?S-pA*1m=Xv{Y}LXisMi^f4eU~CPJ+E#yB2^i|Wv@iodyeo}#g0(L0 z`DcVw%>Gf&z6Lb-bS&nihM@4pbIbiHQ2tp}o>{qBgQL+o(m#*LEKG>7oy+*nHsBla z|GsIKqUCj_A}d;(wUaC@6qb|45=|j}`XV!=<Ou+QVpYP@D=4&tW(7^L(OoL)6<|C$ppjl$x)rQu@Z<8V44sUk z@lnKnlo`@thc?92g(j(^I%Ml$Z9}wcs%B~HN`N)E~^Q z@+P6aA}%msv^`_F{tt}F93&|fClg9Zzj}DI=!v)yQDIJhnMhTDUXeOUT9p4&V;Hu* zH(GkweKwe&iEq2mok!F=!iih33ZeYeEY*f@q^DNy<%#dTKFc> z&C;A=`PdCTd{h&7A#E!g^D84fBI`=ftdPjx&bzZgR1-_uQGMNA zny zkVV%&i*@PMM{$wrk;3wNywYIv-tp59`YsZl8O^a;;kdi)Fn&8eGtr>?CoR%v!WVU^ z$z`$1WrAr7sMy&wPuw4xre1l7e2=DkQD8+oRl-(Z{B^np^H1YR^7m~D7#}QRtAf`j zjNB*nSd7I0s$fM-!%NNtg>7I)0m%?uZ>~WNy<|1V8d6i!094En2(4;734rb|@At(?WxNljL70ayT zRf8LbBPpyHE83PrJk9BVO}9 z3JK4MSYPcGj(k1m$dqWplYugQziCSWga*D(#q00D4GpRk88`{bZ<97i1;Pl!AB+&j zui97~q4$5h!d!Btop%^{0GKeiqHLjJzkVOFAi&VXBtFa>=WOn88;Swr^BC1qtV0HMHl!n#2^hbTwyoRNsA3U)-QlCrX7!-DT~FYUswM z>)f4LdaxqIsB1ny{esjIq)bI$RH zMvYbJyX+_JR^OJh5s!Epwkfl@{Wk3e?O~J`iSJ(NZk*&E1XAk8>z%(7s%us#8~=_* zD7Sdt3GpZ8QeNRSzvp3$FHs*Nze0Vy?f+C4A=TRn{o z1QbU-yDo}oN{>dU5y+#iy_0txB{0FHoh5s_=g)K)B18#zXzMhv@R4POB6EGX8Y6`z z4T@B@Bv z8_k!IRkvet$)^qp3?B$V_lW(anp!mPJhrVPWofdXnPnpsRO@vN3S;!Lmig^IN;J!n zo>-kzQ@{o~Krh(2Ri3w>wsxM7o{FlKevy*kEUz}kYvmh4Ck+|^rf}5Lj0U+|(h_lD z;M_QcE{tGSLp0F{lPTzDOBzWv8pv=JN;#3yUv5zBVEvTFim{L?nG?!eAYha98<7U> zr-^?IXu21#F1$bsM{Sj!a=yA7fDJKE_M}&66yYi;N><3Pkl7oalTXz#p}W2_%3zf#`Zp!UZ}kVioEcC&^Z@3jqHk|Hji zCT0uw;+B^?`d=b1C&4>Lloz2JLgyq*g-2LC3y*#Bi1EtQcbXqU(>)F6cQ{KG7|VTF zOmS7sVsI&qog7QK#QicJ6&>{vK|UN_1vq4IWlA#?5Q2t3+ApO0Bh5~+paHNDe&F02 zT+GoUf-%l~T>0icz~7M6hxpKA-7Cmm9k&Zz*^9q>Rf<5ZBh#V0Iv^h?WI^Lh!)qk`A*h`d+3l@#9NrcDP$&5m zXa~)T>=-X;3|7S>gIo$1f!#QD_UZx2j5TrwW3S64egVY4*a)min?+Q-rTa^y9nfZ* zsgKKHcKF1QXz2&RaVKvFmfs31Pz4F{h6Ur7YCS*kwk1+w;ZeiMnzj?N;Ub2*FJ3uu z&i;7f%~!2k7P!KnKDs8M(V%$MgrOz=XjAR=Z`EGjx_nzHWWI6VS!E3a1qI?NW?*-Z zB36~GYSf%8w{W1H6rwnegpfmFU7@n55k)r90)@LPbNuRacXOVz+Z5)E*9l{=Mm$D2 zrfW#w#b!e`51ey79PEGeOfzRO#TTT|2`ZA{G?v=g!r3;{!ZCDHcS55(nJ}1JmNLuVkf*O!cRms-o7-yQQ*bf|et; z_aij`BYlenR!&Wa{wLdpsL?p6)U6E#fAg#Mb$8OC<9j6;+mlNYSreKDmU8XrG>?p2 zg*dRrY>I08H(Y_K!P?qa3T*W)RgPSHzJ=-di->jqLza3B z;h;Dng^0RwI?|hz<3+a?mII?{JibrG@Dz>rZ{PRprMw0?-qBC=pmLp2)veJN@R(pa zwK`5#hAJzOXGo8iM^!*bKZ+2gIhR`H-N*qkhg2y--v#1#{fQF(#2+$Hf%*(elwD`n z{$vA?ku&@HxbZ2V@S2g3JFfQISCMMJ83w-gXCM{0MR@4OvzcPl%YxANyy15NuYrc5 z2AG3|WqjPi>_E{nyK$X@yb_cx%BEOzC$vC@zKr@Q1baybNRf3?k9p-s#nA?amIqz| ziN<=)zJ;Z`y?E_C1@2_ADAwf&`~A7X#LYqiNz6OPc5zOZ3pJrJLrkIs|FW9tlfLJ( zTrNpJXW4$wnuR;P1+v}jLTpJ>Y0<&5gk{V7&N8P!4U2=%ls1a24!0Zj&<1UOWDJXF z(<@X+;}cd*2qBQB?Jv2(B_aaox@q&j2C%LkJ}A;7n5cVDvSIFJHJiXW2fgub@Gxt{ ziX=+;WlU>okh|cBy3gkarCY?&hgJ3$H*zvao&!!MG^p9b>Ps%#v;`23{b}rm#r&6X zGcC(PoD2r1rPrf>d3%mn{0P9gL%T{MNL6d(OwH?sn79+LLgpDU#QfB~&*SmP(Hc_$ z@P1KMM(brrLd0auQq{h#n^)9`rqO?a?omkPRs{nF27|~Hgek&ut3}CB|NVnO9i#FH zu3t%-&>O#4_9cO4B0DHZWg??zyb8TcVZe3v`R)2Eaf~uer4C1+a`;LC;Ku4ZoiG0C ze1aM47HB5KoRxqmR<($0(Eqt|KIP2;_QtQS+_-SVrw{@U_J8!x#ByIWq+G9qu53K zJBr4uNiq$drm%VGm*gVn0dZvc2RYR^k&BH{%5VmnD@mwYVG6^E$P?Ul-`4CEH|Tgo zntmte?MF(&ruU3aW;_80;uaq}_tx{r#wPPgF{=&ex;#~?hkVEr_rAFcynqmyQZ`-u z>U?Om@2t`wm5P-Cbt9&&o4SJv&BP9qSk|)thsFqe>uowzpnpW~m)6pINb z!4$99rdL#s5DW8V5$hxI3Fzh?@9^&J9yFtJvC`$FsYHjJza}*70}hKu*q)gUmwjJx zZ{|TyzWpncxayq_NFVY>6;;)+4nnqa;xW$MfAtB*=PWB$yFzsDEmRA_LHV6n z2-SqZl`Bz$c3DG{OQfE-iAS9iGj9P<##mvsLr*9`sv)UVlSGg>eSCLSNs@l^w?Be` z75lC3*R~S>6uxK>JqHHxQUhBx)h0cj=B-avi<=ouVC z7O0|DlBEM|!vM+CKt^SScMY6|Gilv;z^N~fZ@O>0IN#Z1q{ml>*C`3&|E`4LVFs<3MehXnv6Iu~mg$K8o6ecW(vgyte; zhP@CT?A~J{-7Hpq4SRlEPLC*Hnl%9rAEpxz%8+B6Zu#r{v((Cj{S()V#APwiRU{E* zi$o_cDy{6A)@o=Ne9KZTAg7FWXT0z$*kv&A<6h(7q?~|zzuGB{k&PgfQcpr)Aoih(E&$+;JXk2fz=aH2v$B9pzpu+sriS-)4RE{Az zxnXu7#rVJj$uxW4bJ~wRSETnizwA{0sbP{c#q3D5Hz>X~WQ`=CZpeSULJ9K3?E_ml z$?6I`p>vwZ&$Sa*CW5-+6~~Xyz8fF!{tV=5XI-H%$}ENG)hx&jUf&oSBw%(5T41<| z{caUOm;dpe=Oeqraxr;3Rg&;0@p)ngN@LFPKGoRX+qCubE)0b95A(FdGF7spUO68= zj+9128{P%Hh{si{wQh^@V`F_+%FfzQjDCWf3>!wY_&~S%Euv47k<$7X5U*fYb+ZCN zH8Maj5oy)*2$SE8xT+=7{%p>%>Q2nNjS{N7>fEW~2ZX(0o`x02(P}=(a+A%o2Q=Iu zlyuCHv`xFgNL?ROjKHHadTIbNt17)7P8yz#Z9YtM!b&V$^AQ*X{a|d&Py;;~+fm%O zG7K?>uOAd2(qvCbrUel3OXSQAEurLK&cm;e^*vqkF1Y}oG4{-R`A2!dg=MZZ)B#m# zwS}zSPVGPReJ#Z!Yik&j9ctm?z2f=m8i(Yfx)H39yIpon!l9USYZ=y=`SDg49{IzX z*JBbQhJK7C8yN`QhII*t$!use6cfw1HzmrT_icCn()Mzc3?277{?|!-=viD} zxqbd+yutsthuaNyvnuzMa>)2$-->iKs;iQE_v{4{Pu~~85AYbr5cXB|-h_y-glm|@ zQO`c@?;8A}|JRhOF-HD@&B!SI2*Pk2x`z?aX7d;Fif_ii+41Z>yCR>VQN65-0vny3 za3>jh=@*d><;o?&sWL8AvOcl@Rj3lj^L;&z*t8X=u1p!$O7-dhOw26u+nEy~pty-Z z4*45`4ANJC2v?R6wYb`HP>FA;jFB9q20?QJ2|Tku6B3a34L{n)CrnR{*01cgfidZ~ z+6+&n;gw{Y#$**9(0R`|$TZN1q2jfhPn|b3s4G*US!u`e7$iSCrj7vvwMET%#Bm+c`3+QC@+LKid+)e8@lURBb|pp31`TyyzC;Ux08_ zMif5x5Q(1PJQxegLd4%Hqm8$dPQ|o29W@_j=&!7hgSm??zP>{v8fZOB5Jw(nuG@`Aw)+Lj>2iNd*Ds+Y zoiLHIRlo5?U5?KA`1Uoz!%OsfKKscwpjbRUOND<(-7=buRV-0`!zI#V2<&sRN3 z14IQH?cn=HloNMDOtwG!%2W< zbMdKjGjoF9kjrwVi`a&l<-sVQ{`v&#QFcd)KRlwsp}WOneh!17=QHpD^HlpI52r`6 zc}O59-b7xzP|NItC%)DpXjWR()Tp(N_0I{QH}Nc%5zKP^4le~w0uN43g;|II5P4($ z1kt(iP$~3o6%M$S%)oNR(?aHMl zA|Vcaxbgn$S}p0MR39`7?M-C{Gh9o(UZ7wY zh!oeAIJMUOhQ7T^Wni+RW@mxgfX4OjLhD2bUvPOVZ0B91e(f^j7opJ+D$r{ZWFyx@ z;WUW=9XzHd#X?ArV*0Y)9l1{e33y`Rx-U+Tn^MOX8bl&k#-W zW%r49uNeO0andY|WIhddjR%!Fg#T`%D&OV29rzD}cQ(|eh6HL`LyTMxp?BwcR?mDI z$!zUs0-kL4Z-BJZ(2^nLzz~u*rP9W+N)=MXhiZHqKCLu5qcRlj=e2v9C9BDl3I!&0 z(5Y>sA%>>jGCRQ-pIAyh&4bK#xx0l3_3P#8STqh$)i~efm0|BiRJGF@t$AC=tkIrM z?iY3Pz_1aORu?^?fuc_e#RWN$qzf7a+p=vA+?el#@G}o5GU05X|4f?2YXS)aW#fyK zXCnpz#7?_o<%^m6qv66VEL4$&=?H{jY2{_MI$%1g@sO$k9l`wSJk9ID5CVx2F(RKV zm@67tGPFrbA@B47Ox_xVC>)IuSZ`MFQ;yRppe~gLV`EOQywAr85eX3pq|culOm5FC zoAXCKSDTaY&(2c`wKeUaRjplcuxd- zxwKhz1X>N>T#x6RzW$KL@V&`Qv^D!wAk`@mkG{Hp&R9FGc_!=+LV1rS-mXTSp})T8 ztOy7pe$Byow}mqp#9_~_N_ai1E50E-EP<4RW1Al5f37;*3!F1vIpDbhg-?GXx=u^d z1C!06&e8))#WYILki+V?-8xbYfS7qRfuidj6nl;y=bsy#Z7X*%y|OgS=&Q?+)6YEU z2f!*rI{;SY%J>>40QVYjo8p)^x{*9PFoB1>;+zAl82wjRsgC-via$o3r`>l3_1yv< z>HeYd9L{HsLstoc82VmgL*Ev`6f4pm-F`(lXKT~#|2I8V%2VG+O?Bnn3D8g16; z!qy)JSN&qB}WSsaeO`M1Zv`v zXoCY@Ha1=jrTw)~c=psq1cd{WLzgSGh~7=JmUGLJP{^I>m=YY<9z=zD#tgG^% zh>OXij}nvvGpK3tVbgn5?I~0eT%A?BIh_YJa~A4qY_-jckf3Stv#?WpQXD)Uf|kdv zHI{gznQ7d!7eTn28cFb>^_3vHf=X>GM|kZd^Ren3E3M`E#;i|t@;Zo?p$2C(T&%EH zogk?D@b^TN+v<9r&pLZrI3FuQY!sE? zmZ)yqu`qeRGdFr6vfXrZY!f9Ue&JiT_pV6Jp!-5#hqzB`r3g3PcG0606>c{*4CxB4mu^aBu8r1_C|x zL^QnbW-*m*g#OzO>U9$w$99+(}_mY?> zW=G{&MsUC%FN^fU$wM?h4#h9^b%~SYlDyZ{oWtNqCYBYlT+j5l;HC|HeD!)6CG~^_b=e%m}qUhs(=?J{`LcOqZ`bq z1~W-cQrD4z(LA5M>+h+CFGCR~bIP?T*o2XzM1>FRp7*Z2*|FQ`b^sN)Y;e5a0qBLG z;HryzwRsuByw}GTbbJ{-l=i16>XJ$!bqYK153tPd~MgbwF;Y)U)VcODZ`H(J63#bY>^jGyvLyg#gdCx1FDX) zAtvjBZ!dP>M=QJ2Q!f7PGi%HstF_}fo}*+cSa}YSFX!3ZAnZHsGhW^qc$l@tOxpMX zg}-(7Z^{P17>a;ngw_cTxoO@z@}Emr5~4almsgdgkKv7wjzNJTQ3;)@kQf)gPE&5* zfGR@L9{=s59now`%PsPoq3;577a${>_W0y`f96qY$WQjtlXF>7S?)ZP`}#0VNb-U5H4^hVb8>8D1fRKs!1p zHO%tM9(KLXp<1R(%(FSOxA-XgrC#h<2nath;ZGOyla9;<@ySR5Lbxt=C&uqLW*kKw zB{||Ow{Ai7iv9Sbf4vju4*DkI6Z@wYvipLqQ9Q5pzHn*H@1vS5EF`X@&G<}_-HP-pN*ho$_M75Vf!*rHhv_1FKQB41%%H#DK*AWEI?NYoW<;nXz$BQdM0f7 zF7MtlogG`3YhRNymWs@Ua4VLWmKB!y92j;78Xr5&rDhZ>X$K@TGW zCxP0Yzd2_A z+e>=09TXbx+HPz&uNOTwS4at?R1yG6FXx`VnD)axxpGlY*kIVVQ1*7=LB9f`a{Pz; zvQcH=7>i{I7-)WWp|Hi^3mu&Z8EBw12h$#ufgI%KaAwb26NtW=EX3WpPfM1TrOd@1 zvR6%sNUmFg=m!xQFOL8l1rl>Hi`YdbFe&+6%9`VBBL-f!F`E-dy4GUz@{~z$3;N05 z)WOLmKS#CR5q|o%zhEVkJ#=7Kg{R%shp+MkNqCFa)J>J z-AwU>3Zu`&QQ)vREU|;GzS%JOiDaicVb+k?+)nT|`e%l7&$-i&DjDgD44J^)>h{3` zCnrA4EST9ntH+Ieelr$mpeH9nd25$C8Sx1=Zz};lNYQsNJ`EaB*okifmypAM?-#{4 zpH0f?p&>_65>}>uKx7x_j&m|OK%7jwfaww{pktl^4_%{KC%8#DK*C^-jfBxhy1z^? zzqln-bq9<@YbE<4u4hj`XM9&#K*G;M%l!KSmui%}>|<56B*CzfZIZA#$Tc`UpadS$ z08hjL|Fn=?_?=tDkOY;)A9^$lpQMn~ ze2JIPJ*OMK1=4z?{!2XMO-Wm#7Z!a*-!Y+11mv#v7++1Vyy+i!jX!_2XZrkwl6~=P z+}HXM_k3==&Idy`F__hSa5G3VipcA)C#U1Pj_SOWy_jl097se-J*;uq@44*)=Pmf-v)B7TK?V*D?6T!4ejxcWs$!NRkmf+ER( zQiTOSy8aO9jb?h*$WTA`snZV54*|%8rAq&@JYDY`*Xb#<<-eD64MeY(dclp2^U@y? zav{*s_ciaNVI!NPUMBUWQg}p2 zl&6Evyr7q_<&7&K6Atut>gtw3WI9J*=E%5wly9ve$f4(-|g_*(ld&Vh7m#jB*{2aKq-yT zsRqWLwuLh$xFg?IslM;_YoPM8{w}U%iD{?<@?W0{*I|m-G#p_k4*bluavepW1>@~c ze8eDuF(l_}ro1*;`(>!8C8fA>;L&=F+2I#_+@<25rQhFvNwr#sryNVC02+da2yTee z^=)}mEU)BWZ~J@>4!Whs9juI>0BaMJMHmtu>}hnu*M@s>+rvi?;MgOe%4f?oM-_zA zH2zln%sXtj?FrPSfCV1tyx`e#y!n8?1~NnZ>Esi371kFW+Xa_L&Pyd`}!D8#aM7z5+P7|kx=+H-#*2#;k7#@5|66=}a zyL9EYrB+!*ZSsdS&(x?%MIC&8zx8uFGs1a3j4x0 zb}nYJtBMUnXeT+Vm5(Kf=!_u*P{!gksxSRr_BC!izA=|`ckl5#3fZxlfdIz_TrM6Q zXQX7v#x3eLvOy{^Fa2M^O_K2ed4ptLId~~xIgVB>tPDH>4I`h9=tem0kU^n?sQF3Z zN*E9%u&iIMmr!4_Z5Fe@tYR07Nyy3*piIz)=40_eF8n0mPbwmM!e14toT?>_2K&xd zujVJlU`7jBj;ZL*p3;1UQA3(i1!XQ18<#AZ!jofU3eb1?QxE&M8;QhBY?!20$(e@Q z>0n?JeCwELb%PfWYn488OKf|K7&c|Zn4LIKCfI(vOFWW6yrzQr%l*bz_|Vi zXg3z|L<@Y;?mR^Wawk|gtZs^VclF;H*&sB^!sgo#yWLdQS<(ix3?yX z!7&98|EWw*$I` z@h`90j6INXc^P&HTVedriMunKxwX%p4ziuC?TUgMX81wEx9f) zT22K{g&wAMkT$KfX#x`&rzPxvuC$cbNA?02eKEUW|D4}?$rJ)>+KKNpa0t@d1!;d7%}HKSn>Ee5r=cF|Eq$mpgXCi zg7?*s>HZ8C;Nc3Jg@)oZB*`8%`F%NkE<5CI>2Uz{X^X{4%n_EaN!t9L_&6DOYJxTn{PaGZyY@`$L6 zRwjZ85XzE*Y7x}@QD1}Eh>mzKhoVa=X_XC&v5S&rlBO+N)~zDVRhrKhDzWCi=9_=# zJ#HXKJ5l&_Rivl)8|8VMYDBCS^DB5|(l3N&*6GM*=N-P)MvwD6{&w@W9i=L|Bt_C6 z++=Hibz9>R{LTa9c+aVAtBII^G+3@~%+ln9dFJ*wJ4?3y{unaYtZ9k^z#Pe7V$GiM zk^ILmAmcPqg~blay$KkRp)^QI9=UyB9L-V(iSOalTDcALGHBo{EM9@^d!l!@2C8_o zGL*K0Jj6c-9Z&xHEz6=5EtyeEloO`YCB*oV^A6KVKQOAmKvN|lmgbJi*7MKw8BP^I zaD}0|<+s9Isⅆ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

Q7B>$5v!3} zCkR+<1ESbDN67mpsc8504f|IFG*mDlJ+ovZb|Ib8vWZ8;rm05@REgc01phwVE$I5q z1>ZbOK18z;RG>w1MkU@b&W9O)9uAm-Sj1F;HlCbFhXC z#fS1Be@q$D?Re32A+N6wEVw_|ZvIJjI-j zcb*|?aqg1Ei?N3?y)6tt!Ul|{MB2zFQ9TpqUv}nA8&^twlLU~LvDWbT#uNPV_pL6? zSGi9%`yXVi^}9(u_XeBILy&bbgt^x{sei^1BF#aodqS09*ct{FkTDxo`#qv+Ju*EB z>tK16UQ`nD2kUMrs!Q44k*pBmH*toKocWlJKT0NtB`%dpN6{I2Wa(6L?-7!zBg}xI zj4LrvEJliVhf=KQ$z{mRl5)gB+v{$Vx7uA3^{0D^-=*+(TI}I3>p{yCp3o97z!P}` z6(oWXZ+d2ItFVL5(o!oVdcN6h*7h;0PH#Eo=^`kfP*ElHI3m4cCABzFp(m%c*4yao zV4*j~SVxOLrvPgk8=Ydqf3jIHc+c;>NPV9x39ib_)Of#S6i!g75a=eUr71!MJp;dQ z*kOMs0R6DsE8pGQ45jd8B)RC>i0T|N7kO_mGSJsCq+627R2_5whNz4r+yEt~8#O_n zM;3l^7nZ51my7cpv$B&KqljxrSPxkCCXpgEX&`^xOr9V7(i6bp~n&O)4*!&d`SPGSy-`&gesOJM6f}sC1;&kfQrfw}J z3Mbaha0L?#kB_^GR7>ZU>0aIrgN3Ni0{pA1<1mpQ!w6xe zuH6C$Vkbv}CYJrYXIDDKngAyyINSY6HJs#7hO^svPa&iShv}+FDh@!uP_gJc;9hJ~ zbHT-aMK+J4GRL)9x4Bpzt84!y`^(kVzeC=b`(gQn<*AzQkg8}U;5_ncz3JCx=GXhX zmAa5ADnU1x$3Rl$mz_%GHCo368q!5)SQ#R66)Xdz+pl2uBTStEB1WIDV{Uy|T0gG7 z%iGsgXmu#h8=YPMcsbadTH*yG5hLOD9kTSngM%jfU`KFE<>3MiB>P9?nHrB>{PEFY zkVzrs++9nG!$`#C+h{e1PkWTM+|m5AMDwJKcCXllP*IJjrsA(Kp$M{^AxKYNFOyX0 zb|_|&HvgmawLcSEzxiU)CO|#OKcd22z%LmslNM!%LDGGc2;q;gCe7s!lJ#L|qbb^~-Q7vzVCingh|F)tXXbg?5$JFmpLNBC;mXR;zDI<3 z&};FJ5BpWPJcL-azoW#A%~!VD1F2R2dN5oFHX3c ze#)+)w$oR;KP<{!Sl$)E-gDq@>g$|;@`@*n`!x{X5&+x>{)bOiU{v26I-Y2{XfcWQ z{~KX{5^?jl4r4`Js#?Y)R_i}FN)hLF@<;9W!7J%e70&|o{gIrWuJvOa|u)dLOV1ipV*pW)p}It-u-G7ofVY+6(V>MllJZ_MoHC5GE80{P-g5=j|ejWMmAsW{-5ffrw849F?-Z+GQRWHCF6#`c?caS zWc%i0V#*Ym>swRuSjj)UUpCau4p3N5h_oTlg7O-)SX7TGI?>E&BqN#)xWnuvH zvh@|9avO=;cOh8z^Zb*qD_TlLpW8vH9}uJTmS1^w>CiQm+gdgUxuM7GA5Mv6Uv3_Z zX0xS0f@;AkgqN`c_qy4!ap(>4xTXF7FyR5T-~SfoXbAx}7Q6(fR!Asq65#~&lF|GY z5>Ji#rx1aGc*Fk-jdOxZ)iAH=gLIn`couY_ai#jW5cwpTVHMZ&X6|p9#Qu&+?BAKF zV5?yW+Lg5LRq3$&^u?dSI9R zytk9gX-JB)d9yIhmTo2aGujW~2}G{EoA4OaBBU5rL|;~xQWO(m3Z#xW{jai?2A7pi(nobNrVa#ET9cbYcvcn%%+NPnOj4ZjV$rdaFYlA*l`sVMqb zXbkmRP*6w%j-U*u(y=~?(d_I$Rqzf&e_0R-Up zM6hc|iegk?^>(vivJ!Isc_vm?Q_i3b z#p?*Q62sZ##N%O^*2>zi1ZZL?N_`vMg^XAzq3ds%B>s*`;@_F}N`Y%&C`+NSujcT( zs$xm>&k_l71X`)Hhx3oCCg_2KCHvd1+JxwScNE()DCP+vDqMS6Ojs2f6Y6G=Bdv4B zf6f;01`gwL9O#?nf|OxRjs`@MqShrW^>|lq!m!EwhY1>huQgPRiZlw^q?6Lct)qIw$-_ z;HoVu4J=AGcJ%nUT#<&DJucOoakv!KN<$f2ISYxnugB{^H3&$+2KBpW3KP&4Ye~Av z`G1(008ovhDZkInkr%LmqPf7YrZR+a)o>QtK+@A)5!Gc-!jSm9h2<8Gqqb5 zJb(#%_wI#g3?>rG)+`M*y0cE~?B|hV+_}P4fd0YQr?!&Xe&xz6W&-SXNMWIa6x1zz*e@0g_johicF|7gwRsJ>aZ9pT(>ZDoEtH^eyCv+?;*f3A{L5zz3n zCyIicCkDTL__QKCV3qH;yl_iBPL5q$!q1ZjtaQc={=yp#C@;tE@eM+vw6d!A>Ihnj zuk|d$O=Dl*>d1eXAONT@RJ4C)k8XM(aIRG4#3(7njlbtlLPgDx&87ZfDoWsFybnG3 z;b$&x3B9-*@&)Ev@cXmaT+@e2C+Z6fIdN6`w@fmB$0YObOy1t%9Qf(rWFJm-navJR zVDXc)6MZ1~b_a|K`uVy(U}F)tg+)5=ZxwzadKA@~r=oSvo4+nb@F#=gjFdYzZ+;uY z$TnWoC1@Q=r4x#n+m!HVv3eMnRuke$p_Jcg}&-3fg#NRD8|CUMa z@0jHNovCv*v=0_6dF#758q`|;q)M8Lw6=aCmlY@+p%h0i64?J-i}EQ-sN%Z`U6^B|1?WNl!Yjm3UxS5%09Gjw{$gxl;PUq zbfbu6@-Gmm#Ckl@=_O74EtCA;G0Fcs6N5kgQdc8VO(mWO5PkY~tUN@D%MOHS)6pJq zjzM<=C|jbKY`^C*Q4knUj6EXH1HIrwb!u~bm)mNqpxICO%3YY|piga`vLPLQz=TmA zy!QQ(=cS5EW-``*lspOVrpx~@@c_1`in{2i0RzccM7l!ta1 zYoNhjyIgfz5!{S>ob5aJ`ob$JB3#{$vqJtkpcXxM7o}(YcJLu9YP;{4FqH!fU`0j! zU6OR%Grnm@x(E^f`3$#*0roD*3})W-{+ab#Jtz=i)s``ZMyuyPOr!vd@+1}e2HP6h zfZ4pWK7CnMgp6a)Jl|(4UvNeLOw+sQ8l#9VA_U4%grbH{Dy;(YfH;F`k;ex=>I#C~ z6VV{J)Za2G{vDIzzcXD~gMDVdcn}g2w7B=^hxYQV&*C!a*51UzgFLGV&w-YNl#eo% zM+tEYsxrgXznnoRYali&5cvJrkg|s^G1$49m6w;CEq(iyK63cRAZ3O9;RlD2hzr;` zX_1$x!cP4U6EFagUAZG%wS3md(jERzeWz)*>UpU^Ch=3$tj9kc%24#uRn5kA0}uG; zs*gf>_nK_PHL59vjUh44dzC5IyeFRD0U%-mjzSU3^tCR45$9p}8e-{U0V=fWbYFJI+A)ub|NEFQtw= zyrhy^kDuid>C9h7)0CMf3S!x-e=UWs-luu} zZF`&Yf0!6T|2Gq_qE?Z>iyc`;R+Wx!6&T^~VVH^kW>WsYx3_uy&oWSrTA8RSaIqaj zvU34Tkqc1vVVc|>U};W@Uc?whvj@M&pTM}cWAlq0U*u&iJbPJg{ykmVAeI|VADXu~ z^i-BvhYZ}!tjcD%@2_y1M?pf@3DY|_A_bZV6VsAX+4%D7vXB_=yR9ZK+?&lu{6&yh z35QR~%U;kx_&@luQQR;I;K)1c!3ngIlN+926A=N<5q#JXM=(;h5>6~x8K(@bCAGK;&H3m)F2(bbvI})Gmv4TxQ_IK9P6@TDyDs7))+oYg^viO z?@cqWSTk9m z-{uOcojzVrh(#iY;YLmKRU1Q6*I9cT;j7 z-}6{>m{%QK5PprxNc`0eqDC|b;o{P*TT&N>939Hepn@*n`nn;3RB=AVMQkTE&Toiy zVLqQ2)4%u|sp1oL%~p zRc(x)4VwY=81p!-w=Iu{zUV=6PON$ch8pvRR+xFB9KSo^l_J<9Yg$ktxrFMb-KZos z$#>h)dG{o69Tgaot50({&Z4*x6&iG*MMOWlvxFb{Y?-!lfY8Dm|>2TDKo$jn)hyq716U1 z?ES$z(`r5_Z5~0CDgv}t#j;}{BYk+U9_kgp?6-W9a`~{dR~q3?_jJ~kTIP0QrWO{L z1Z`=qPpqc_b|VeEJv#MIz#1|AX`&08mt5|+Z-*X{|9(4ESI50 zFHUb%ZL^eXGba2FTsR)}381c_w@sTZ8b2n4N#~an#M%bFytVb+nyR0xy4{~zRhW3% zYA58wcB~GA1)Lsa;mw#)b}GKx6bm@)55BD^jteDcy=Mpx&E)ide7n%TJ+Ge;jFye5 zKm6eBzT7f8oacdE^l)4W-6SMWP3f&`Vl+C4*4#PKjNyU>T~CYOK|-J?ELP|&Cgqs< zX0h99?$Hl!+;;^L4p+uB_;m;vgP+xmztO6=`N%q$vxGWe5Z@l%=`YB%)er1H@%scA zl&+VWEnse@ue_=Z>^79|S2kUb6H9X`f)B`R7*7123)~X>z?qE0ur>AiudDQ~46f3p zCIXr@j>-nKs@gFqR1o6i!fqXJXx&^P_l;sVln#K~4eo3a1@BClV08|tz6iTu;(#-U zGiHiFSTP9X{zm&0E?US7X8h;i9?GbzZQa;V#GD?=9r&+DbPkm=!)aL9IVdxh!T!mQ z91klnJ2@Zal$zL=A`X~7QsnYKUM?-7MfZdc?K$qwCxo$(aX0mI>kqwJvr%BJ%Zz0a zL1JHkZ;#}bx{v%n7`|##8f0FZ4qK7RE&G)4ss%7=n8#dqa(+ubfe->?JI)r_uQKJ% zUcr7vtaWL32HcL5D6cO^Zaxin3w2mUbhJ#9lki*lvwzUpi?+r1Of(%Vt`$`a8a@dn+PP&3dvVyc%i9P?WWD;S4dYBJo(a|M9@XHK#pyg6eL zJI1mo>~2WbHJKfr5?Uzc)0Xlee0ZHlF1HKzdA5Vq$Htpgym%vDf)=A$cX>3}3>|a# zOt2)&(?qFBKZN2{%`0OYW>PMom7vg`;Ji)9Q-v@(X;D4C3TV3P-83{&xoofAX7Kxk z`DE55)7k>>5UNf$+_^ByZ_1gs2*A1Ubf0LB5n#cK|7# zkUHFvSk$JA%BkB5Wy2hGG@19*6FybQyl}D)fwU|Bj*NC&;W~eXBl@xNSi%$y3THGX=C1CrU0s7)=7ntfSBcTJ3 z&`q*1k^X@+@KnXLvxev#?f?&4$E0Au2{&T#k?2;3+rcYAtiME~w#j{N^gHG5^N*yg z@J>NbW&&}z{|t%q!oh#!!Qpes10#_C_l`5?z-B9#rMzh0$xdgc=o9tpEX+-uNRjej zH^or58z1${00+8)HnI+1uKjz0puniTdH>!EDc=d$B8BK>$UwP;B$57lhkQ{8Rl%rN zKJ$`hd{Rac0-m@1{@8Zn9K0FTfjAWv$nVL`Rz^`Xdx$lttG245UVU}tKzz6>H z71SN`a=~VP^Knzj?1Yzl3J>M^5;FgBF_MTE9s#?2z6^zD@fuXJG1Es4(sL#thTA^| ztx6NMK`y;;o`9>4CP0QqMyou^WMA-EYwr6lvph2&zb-79GzMF%dGng|vzZ8(wwyMn zmweqi&0;K@*Y?>YB0PQYXS(UwN%P=Vs~fjjG$5vu!D6D@q!T}7c&kW73d|u$%V=~$ zIHz#aFgM^uI;zI{H`^F}muwS0379*Udu7mWjGohnkdq&yRJaF%5D4wFZ?y!p$}FY` zxSpCKOj7kM)}!}=ji^MXVjenAfGs7;f`J0(_Br!R{TGs@ssPaKuFOJBf4-@*TfxAT zex0IVtc4|l5a2TikNN3lEyyt~NOZ(ZvBa21|POK}{XKQIfO3E{1*VWNxPOzCYafa}N{JfHZ zRj{EQ%Njybx3!>~T$0f^`~a}CfcMG|VV6ZgF4)Js*Sr>A=cHNGqRyZP z6ot7xAYdKk)Snpe%D(anVVZOtKr zlUo**kBN(%2xuO3Ui#>p`+luZHhV^^C*tY@5@SBCZT+B~^9#(j9mP;mhz~N$^_t=B zC(+SN&1-F0@H~20IwS=*LSiSSgkpp}2eMV7UA_t)g|TeiI1S&|AOwm@;-eXjxZD3x z@J=C7Kvz)Kaf4QMtjFWjUWZ%pN|t|IHm4mS?ipSO!eK z=sDEqPB7aXFpK(v!fnyC|9zyMnb=lvJ@|{LX3wC#DiDtEcgx6A@!+FP{YecJa=n`5 z*nH>2d6g}}j5RcQk#mcL`T?HbhTzb-dMrsiXbOu71@G=a&k;LO!twba=ODItcLSyV zi0|%(hkZz-OCG93H=Hz?A`t`ZksyadovDQscUGgrQt|;j`@y= z{h&L^M}EK=mZgKNTJA`X?1u7u!}=hyDQiVf$1y0D7%dqQIYeakv4BDmt3y3{&GM|ye?YH z6|riCZ|ycVXv;bJ@o!3wF#plCLH}ii>JgaxS_2z-WV!6nVUiM`@2HcH)P&7iK$y+B z(t@&bheueN+;?^8pFoBoiInuqfls4{`dSg2PQdtp2@oLTR%LwPqqenP4$-W=Y(}pH z1%HTI_*s=bsnL)$DL^1>PHe0*H3fJ05Ualsi1huhQG?*c0ZNNlu!bQ z@D!DfsH$>IfaEJ?r2`%n>O~lIsT^VTxFNwS?da-_R-bmWF(H_W)O>1;&NxHp{UoAx z4J;%?@TmE-9k>qe?q*IN^JM$XW=lR4&6{6u&Di*z@)C)&rL+xwVQAG<YiS0NMRW_xO*mV&K^0s zW(m?jTKN9NSxhI0N$y-pS3L|oo3ha4%{X_cltb#;!=)ex;LcX@*6*~Q3gY{TC9kkd zfH-hWV9v;mI(y2YNWK8C5U48up0agS!qO$J*aq+MUC71BLH5p8r)gPAp;MPfBQ!Vc zO+8%YBRB9h6cftc(KaQkhcugH&xI}ArE{25=yr`Q&N-EC@Go%Gwd}t(+qfo;8JBvR z4T7W}gr>9ASi~0oE%sVr(xA+EMKt;ny#0aMUw545s1kFQM#5|dxq@+LQR=9O2cm*L zZ-b*-*ni0DbtTU@QMh+&1vhGHbBsfnDOf$i-aIik#6Nf3E}qVhx~`2M>AGW<&rX6V zokx<1@BMKY#Iqk88fAGH-~3G2vIEVU^3ac3oIpkpEZ8n)%6i_(#pwv@4cWP>ak7eR zct(1ZfP<8qX^<6HoMV;m}egUo&Z zDdIY#p$F~ugyaF#R2(6zt|5P$qx}3)lzQa{p>TaO66_fUiU)(hN@t1yFmlRAQ0Caj zc|ffZrJdNI-Cc$BkVN8JoI{rNi$oD4gt(gp@7n0#UV_3>U|r(MAS^$}vs64I5fTsg zX21&0aCNggm5IJ1qIdG-{}n9h41{#h&(Cu}Ncnlhcx(Ln_Av5x)%QF2~BO4Q() ze~ryfIAkldH&HNn8iNoyIIDEd_0a%)5366B=Vcu1#6k*V8&v1BHsU(VL|XunKu>cB zmKcV@ni^9nYugw0L}z=oE;vlIJc3jM^|qJWy-8hc7`}HWWlP!fTwz*}V#G$*Me!4A zs8Va}{nU|q%$i2)l~QODdheP^(Y-yWH~m@Tk?HLYIUCggn1GzfAkz|Mlr%)-#2PC- zkSM|wb*2>2>M-*zAfuk${{a@8&!)IwCGVK6MHcoKCl_a9YZ#rmUWcDOi+2&hpfd{O zwi_;X+?s$*xLW@Pq1=S&wq*tA!ptRi41R53(}UDs30_{4(zRry@v4{`^z0B`+TjsvPDv z3h6Q4(adh{<7%{rp#sjx#L4xh%Wx}R|4ZjEN2YzduaN8@Aj87Jk<&4$B0}D_v@GJ| zP!??%E=tVMoa{Vi)8n#E61P`UQ~0uW83%i0 zF`46F`AyZNZ#S--R3KZnKSsK8PGd6nOcL)3zHT;@E{7<9rV+B40(Xfr#&pVLm^B6M zXRQ0o>DO-E`d**FB-SErwRrVPklF-Z?nkYFbK6;tO7b^LHAK~m7WS;ijU@5_^F_>@ zXwaA^zr!!M2X~9At(gE@*EVMDCO#UOK*cIpPk(ol$PW^v`e|KZD{Zmf*m|Syu*=D4 zCaO&fmrI2?8V0@EsTr$yQA1XOpW{Z#k967-yq%%$Ha~=Kh4!EB&`NqlAPx6eL~(bM zPcybSZAfQ$imJxzAV+yGuC8tjL{CuGuZL?j_61ZT;)$A>rmyJ>p z(Qfun&sygK#{bgbtNgn3(0sRbWeNns8r$NRBiRn826=R5!X~d0q)B{@&nUAu+#P!W zlYK-*?t+Rx*ra~d6&Kqe|E3z3Mq;UpOTewXOQaSLxF(_`O1G1Jf~qhuAtHOO`21ti z1i6Bu&y-tE*v~a<7We4G2x@|}miMRUaf@GoOby`x4Ta(2=z*<3+#KAru9T@AttdkT z5u?p4d;teUcwg})*Fyv$>$5tGT0IdIqA!&ksemKBAS>n!g_S|wh-x>~n41tdi>)HI z`8w1CA<(azZ1`T7d8L9W#oA?shJYk!jOJQ=_iYviKt7dic-4>tZB#BqN`v(W(^FgM zIk+3O$MsbMQivGMCwa$$y3*Ga2W>m8|6o`Mmo01xBISe%G2c7R7jWmBPqfutx{A$~ zfdZSdUAIj^N3pN;`X$)$HiOvJ_TGlL!aDc>sv&%v>Of9cpkMq1!b-8d_hJ1H<;z&_ zvRs(mMV*v$;qFWW@OB{_`bJiTd6A81TEt5;uIMNl>nEjS^}rAm%k`@@rbak$13qp` zu-I$#QES%&3pz(JfBj17tFVah9;|aQHruLU??~cTXR(I_S=T5jB}qto@pMw3i614m z*jwr>la27qG7IK-WBH!WCsnT}_8XF_$C#IjRqi(DlucD7o2Z@+c&JIw4#~@ro(=`* zlQGfR*=}?cMExqBzJZ7qE^XO-h7Utc=YFOT`?G(#bk@2vL$Xd8i!wr=afR_D_^89L zym~HShr+aAaR>VMi&?RpmE$Fd*H9lb=6s4^{5;H#0<$LJ7=iG35i5hJZ0K(ppR0^u%>krQd=?(-~F1S>HU^4JLq>MTbX1&*|;Qjp%V zj09MTEuyRBq030&Ci26R?+plzpXZUa(q(V>i3Bwr?A_&498J_H@Pv@y5ZobnaCZyt z5ZocSyR%4ecU^38cXxMpcXxv8viG^~A93r}Tl9zdI@Q0KQ{8jA=k%4pHG=ybszFWh z8QWLst%bzQ1%i5916Sr53QoWm=s1)49v7fQD}$eRhU*YLj;c&1NNIcdlt!RFZh2e# zo9?*RkqbFumnoc>nTX%wY>oNC$e#JlU9Q`ndB1hzUw3NY&rf)zut*Fhk9_+q?PCd9 zD1>4QF}o9+0%S|-C6roQjhh;HHc_?U+x%z=4{D_^ZAIh~DMY+Ph%_1BrEcp@=Fe%R zCJ`j3gqDz*$BG92%m{p9Tr9Qwl%4Dw3-_md8vYX+nT+&lVpc(veEE!gvK)%$WF%U{ zVF-WqKZ4{i>X*-We3sC>h`=o&OxJ32T5vB7~ z94pMkqXCX;3anpr@@u!c6a54j|GZS?8|GGy{4m>!Nc&ter%27`UPbg6i|sEGa;keX ztChP0DyA5wr4^6_&e!y$REB-?TLZ34DSIIXk4x%-kPUL4a2#-{)=8Laz4z(!QCX7W z32SF^kzEfJW3|etC6t-Ga`8Z4$kAHD_xZy^^uN~y%#Q0{M);XJzo`RTM7?S3zsTOU z8l>UaF2Fo;F^z;x{(J@|K1B5LmH@J3dz4X3geZZdW^f^$s^nzo&=qDt#D4wMa%K&R zG8P!#s>104$=>OyqyW|D_lVm@7`oTG1&5Gy!~J)q z=IzAf&u~luqo2_~dG@K<=>>D~Yb6Vr$q(d)+~bf4l4!kZL^uSUsVu(R6_;9Ip2%1@ zoQn=uJ<+%&Fh!Wy*%-F8AX{n#obFh{V-QC1q~aI+d1B>3k41snFEM!C`Z5+${4M2x zT$bP8)}8Z5qDdKk?zjPpHYrx7;Gz!d%v3$$mdO`!W6?8u*F!w$J4VUzha)7CP&TlD8*&zmJMu z;3Ir0xzfp@Xy_nZGxh1t%Ky|@yz-t=qFA?5e$>X*R?ehYnm9$G#84$0e$p41KAD<1 zI`#9m0kWBc!-V~)m56M@|EQJ<^Wc~flI!JqblkxZ3LA>^M@>m?vmXrPMMXBs6yJhV z)^yi#@%1c}6JJ4l8mEkzsPbL=wVZp6X4JdW(@Lc_z3al6&!xFy$P2|XUw{$zR*`^8-!5Z#5orDD1WUVYBaLIil*$ocl?y|ZP|Kp-@U}%!} zmrh;89X?BWZz}rmOadnWsr7r2Utp zoXds2VhmeW2)rKZ4fXf2&*Xe;zI;Oj5Dhq&yKyd2SjeY9ia@KyhJE%{_UrVF7(Oq7 zv|0YeU4(v{=+?)2YVc31F7M-MbniJ?B~z=DMhR-!Lo{h7o%2h8`xQSBZ$A>#!ey-T3C81 zVLs&A%m{)eFT!wGt2kK28mrKM5*jkqwaddnlYWY11&Hy;PWvYWN_(MADmK~U716po z?=K1e?i+}>WvyhHzGhld@T8V5;xw-`g^O~LM@_aSSpT=IDjc)>&w{%0npC$~9V`Gg zogu!u@oA*t-`ly*}a@3W?wNtL<(=2Og#0c=4gaXjD2`^x)ervs}5y!)KfRr6um< z^JnRwGNkQC?oCH^b>3fEQW#)eb90Y=@#V{u1<`nB*KnsEcRkiPzfQ3v)1Ex#DG?`r zb{7%yqniy`^v2lpCvh|+s}maa*M6Dzp>8Jn%;G!0l7I2q-DfM@xX6{dA&O9- z%;Kf%Gc?nkcAabSGa-qNWKI?}27sX9Qm`q3T!8CJlY!18Zf-8KvO>T396owIOVn&= z>Go<4Q#oBIpbpQckuk~lAVv(xZzioh566!AGuit151?+;tzsDv<1#<&+T?p zVd3xU(X|kd;BAAT%srfTpZjlh%>Sa39Q8q0mg@C`{X>$ny{(@dch47{)9l>RS3v30 z$cRY`OS8q3$x2~sPr*!kYm!*Mgs_KuONiVgGmfb~4NQ4f!*@vJoF<3YxqtWOZVdVx zJrK|&b&BVyJL>29E7|+vCtl35#ScKoWO-T&=v!<^q6tU)+|hs2v4D!vA6I@bXu(rc z-Xk%+ZB3x{tz6#~IlunG$Em7B@@3zK;pNZMlXXEwR%}taD5R|R_1y~K1%H?xhw&Bb z`A0ttFO$N|r$sp=wOsDCv@pDH6wj%gXX2qsqXiY$LinZK%0xz4+3<(Mx_`KxpA7l$ zAGpv4edRt)nN+%{I2Pcw7wJe9c|prW09EjEq!52suH?c<1^_+B^BZs5? z#Ul&6)4}_!UhlvoQW9JXqOafSkX_ru!Tq&sey;wG*9F_Hj1hmcTr-S3U*v3?aO@Pp zmqw%-T1Fchb-7mHq*cw{z~|x<;U^KTb)dPkME+O*Jg-%eB2L#rOe*$U4T=foaw#_K zPjWtII=a_(fMD{Jqj-mOSZ8(q@D0vFCI%}vO2Fd<)F3N#WkRdG76Et|`jqv45H@F~P>*NbJ-4{c&%sK{UF2SLP3EA>uTo^TUf#-{{_S&r1Wc+OL<*%*0Qkf3Z${O z&&}$1Qzhss_G?N~H@20Z4g;kXdTyNP>eGn`1Ti<6d$<0)u(<;ET>abilF6PhLi(=1 zM&BDY9xil!x5&+|GRPz)k}^NSuErxunDTYFfaJa)AEOEM_|x4BQ9x(GGfUWwnzp$H?5y)^Ni0@{u-89x3C^E4sx#NVz`|8%}sG>qb#mM9G0}}?**&Sztc3e7*DyT zHiO}(jkG@Qfyz}0%=4*+0&oU3=|c+*eH`UeF^jWWbcETjO#0HlM;^#Gojcg7YTzGB z5CVmkHD_4~nJ6t8`JA$Vw>9G7f#I*sOqvBjWI0|MQ`{VC#Ql)MF!(j5r{sT$HtFn& zC)imE%VZ9z#thbHhQE|DiqH3qC|(@ha~?@&VJ#QVzeV4-d>_a8opf(`fz0m%cw7C4?dtZX*Kt%LTLNs9d~y%` zUkrCkqk%pbmr2|e4`#I9HKR#YLs#_oi*7C{I-!tG#kqCXRn7}Gnx(w$2Wpuu9?#o( z066W!x&|^=8`0S1)wOZ|0OVb2!B{oX?^Bl-wZUs>(DUQ((DVLRtl%}E>sCcH#nR{) zBW%}nsmftFybW^lRiS-r*yw8`?AU1j(}KIglf3$msd6>5p6q2K8j#_3UcyXWMU{Vf z_oxR%(9?OjjCBcme>B$^j_m!6smxya(t8skrOgP^dmnjo)J}6w=b|h3S$w^vqLaU# zy>2I=kI(%!*!8MwJm_H-^A%$P6FfPxO}g{Ux+pkfHrgBPVu*sV-e79iG_}ZBv0^AY z+z+tR(@mMbKR&og^2DNj7TVwL;y_6rkeg_-umL{C9G+wITe%r)^xvav5)ZjdWN{pu zwiE>fvv=t(vFxO5VHw-K?9Nt;p&yZV)NoIYmLN>Zp5tKEFxjP>@XBmTUYcv1L9E!$ zpIH?uK!QR`rD_4$cw&ZacauDBCU@Z}=vU`Im#^pRPyAfY^e*vrDnzGgdxq)=%2ewY zR!t{{Q23|wUV^Pq5r`XjlPTZcZq7Vd!Q5qf^UD%eEJUln0kWWyoFsht)TC;sw_YuP zR_A8fMGsHKe|u!#mIkssgi$yyy&eCZ$BZ?UpkDtoOzCiV))vT^^OcO6enkLnPGsB< zpWocNf)itH$1m4|>XOQ_aw)IBkbYYL-Cp5lfzBe%FN!u1Sj*QJeJOiUqR&@Eae}!d*$$7f+%~3#3 zH*0uT?JVkRW(BcaK%RE0D{Qy^SN&D`ENw6Etx20Ys^$HHrkV2S9?j?VL&~O$RdI)P zj704Ev-=J&JB;E>`oQ|b^*2@KwMytBz@un_ug%DUxopih5va9xNtl$(~ zWV;9F)P6$dRrI?4#e;uLXVm!n$sEE=UC7~^(;1bEIEY${-@xUq6@&kUy(RAGzmgqP ztQ!`cd{#viU7S4C%>O+I3P$C&BQtnB*UqQ2dx5p&uFVbFH~>6|V1}p0G#V;yq7z;K zbf>(gM9tI1S$y6)11IyEdC`#9om#w5L0Kfw+_*!fp7!=I*TZRu4hXI~-f$aD*TvT_ z*>H534G03afll8>;{F1MU@rAMT2J!ju)jeX_|)15|7Mq%2)`4|WxI9DlznMaK%RJ% zUqCkLdiOdHX#m+0)$@Xf9<;zPE|N~ZlXn;?lk`86SS}^InhR@&(3Mq*?Kxf^EnK3h zIF&VSSc3Qk=Q@Y-`h41x&z9&hE5SOxgE>@XjsvR2islOqn)Fc0YFdhiL2&F}Ty>*k z+Ul=W`VQjCiug($xQr^$`?OV}sNHK9`p5Z8BgZ<dmsF8bZ-K(U$?D8c$JZUOX z$;&?`b`vG0uVtUgJB9-ik0a|i-m9c%6`^;H5-qk$cjRteMatP0KK%D4y*~qkIVb;V zc4o=VWj+6N5N){mn5)R+b>I|;`87YqNTSm$@1fi#W8{9KQV|7l5gWSb0k`R65>7F&8SG7i&+34rx9sPr(`U-SN2F4=KZmo; z1In!v=W%E9NrN(^hZDzd_d9bzj5>gITaSwwz*Se`yxrUr#}o@DyyV)$aEeEfcq7qf zzFr;@bD7O0Qovc8A;)s3ioPCep+jb$;0y=v;TZCfFN!<3H#wf_?ZM=o%ZL&wc9BXfC9*0>$ImbR&Qfv9#kbz>~VsRT}_V z24{V3QrmjjK53mgFLn%~0l%IXh`aF)emh!w-b|QvdS7_-(0x zsqP~Ywp{=e*^=TXhqQBtZKz@E{p#}jeOq9;pfZA+JBWN zhA`ZGVzg5)mv$FeQt)T;To(Bx1VC;+^9i&h+}c&Tzi%yz=0+ywsXc%^|Aq5(`c;7k zx2Hi;=+Y%*v1{7zCamF-?Uc20l+({6gi(*3PGlQgA%jegWXV%@wEJ`opha9K@FF?1 zUIItO3|;WBoC<}Y^c}LVs9Ec7Sc2snt$*LP9kTZtu@2~D0_n$U#R|SLw($x&<(UD~ zU{r{J0MD{-9_hwh)h)-TmFdcm=NI0N-~mQ_c9+%8BCA=yxgm}+K9kj(5xK@qo{o#V zUcSfKtPQkxnQ1}nz@$)+j^Smv{C$G=@usw1VN(`}dTOJwE2UNY3KXFh*j4k#C970D zk7aXWv+cCUvI@IorsblXt?T~G)6}K6C}r|~+=ml_PzE6C==8Q;*T(f%FizvPw;#Kq z?IWvv@BrA)%LualyfgYUkkxa-K)<$j{xt4}$GCN~VRe?pNAw~H)I%(OQeO7YeoHa5 zQ=m^?78JXN!Q~tdYp{?`& z6mz;!*5G?1GWcx>lDRIMnUGR)d&`={)lz?54lvN|q~o#J|97b0(Q#KaNbi(!IsN!z z)y2`)ZUZ=-u7hhCRRDndr0Nj5fUMhxVAL4FRxNX{&W0+JF!?Q8)8$rEvr^7=wTjmF$1pJ;Pt*B+P-D2AdaPcjx`!=urrB6&vN`afs5TdFdE?TKd; zeD9ZoM5v?H#P`=n))#hdfugkv8;?Se=JU{^P}ie1=Z=Hu#lHp{WPKcG_P!ljVu`Ld zkDSWaS@7HHT?_Y11`m(pcAad=mzzVLJBj`KAfr{#q(``Uz)9Z{;UXsLIMn@Y6L z!AX;aX|N9_I-@I3(!=C|OVd~e!d6`COuKxDPZ*6pL-E8cJ5ugLrrZOK;nKdz=?g>v z>(fX35cm-I5cm-I5cm-I5cm-I5cm-I5cm-Ie=G2W0!TG9K!0VPWA!i~`X_@vjun zpFbCTrTA)*4;_c0XhF?Ad2ln(G37I59O?AHt2fyx;QN-`b>K+1bbmj2|)qw6f1?ww* zQgA~l8|!+%hlCt5k`8#z^j+sxlvf8P=7-)@K~S;2$HiiS?|osjUEUyD9%kxi2$%lR z3>=M{{-F@>3;i260CqA4g!ui1*hWtSQA|TeNA^bj6&oE5yzo8%pJ%Uu49N8c(8gS1S0b43(c*BxzzUxdW#$Oy%km>3(Fw9Amppm;O1TP zT>ilfd4nd5pPv~ZyjO1Aw4JO>v0)@*eg|_y+d&_Ch{}&?%vTzJGFxqJ(IKjpd-80B zL0-)5Ei{|sEJX>qj+5_#oLEtmtiQ-gicU{o_o9D^!kDNR=&b?Hwzg267thD zCGd-jWs8bd+oGy{!2XPDfo9i{%jIdMUn-j#!Rx?K_o*}LauE`|eSu#cc@fhYylmEt zXS(|C7w;+X48U`b%4DLJ?9x#)D(dE5Z8)>WQ}w{m*sZaEFjP=~<)-J|g7kvOY|Ck& zyJh93_z86jjCT!3etv#=B5cele2P@aN{#_AB|dZT8NW@?nAt5;#+#fn28-l-2JDW! zkgLmul|IMR1a=H2^ni?>YoY3alfcG} z`K+eG2|2?vF=a+?x8dizQ(1QOZh{h2j>ht7tmB4z%-DnzX1Yr+YJ0A}Z8+MLffdMg z3;z3M*~+sB6PY@;{LbvH{Exh>Jb{c$oU^Sjb5*<|g8SZYsMV3pH@Bfc38tDsdGVF1 z@#@nl^B;oOyIxGsEVOa-wmDqEHgS(Ts8|hC8KI;7T2nPLlrJzpS@(A&W%seeq3_RZ z`wG9cOfg$hF64qZuzccJVkZuVb}?#Or9!P&5$Hp&)Gd3yPVN;wCaebQKI87$ZKjJK zicsXY_#>Kz^mEjTBQ@5IUAX7ExyR0y9|Z)GGJ07ZN|iMkfZf^HgJ{`H z#X25fI_LN(i?F4v*vv42d1;jLI8MO3OndlrA)5K0_F&}%$WxE+(R?)})1+gX6HbNx zSz1<7G=Pz$tNa`*t+Veae6h*;3gaA_|3 z%HqDH9M?`{kJ!STfS#5{l}CC^ABh~1#C`W~e{I@FEC7=ey538OBD9hvBb%Ro zj<<5NStDrtPL!(3_NhUO>YdGy;sRg8!zGB`QYGgRN60h&^qUKmVHmYn{855E(oUsX z{cK2~`jJxS`w!|FL`>P^k_8rNFTYB0QuZ!ZqhI^FNAZB=%N;7U-*cXaW@F*i36UeP z1N~AJ6E}DIK!b;jH0qLS{&wGymB?Z{2i4TEJ&!#ibFJKFsU#JYN&N9VlP1-l5fWbQv9Q3osCYo$oJ8U=QWQbre91&?KLv4Ua^7q)WI=i_4o1A^;Qv2l7&cZN~XmR!XWkAnSt6hAxNdP~yeT#EH4XYM} zM_BCvd+bC$y3gBb&uMANip*kD>nU zcaYbOy3vz9dX(7HN*K8?Zux<6j5Z(9ZEs2}D*7VDbGEo)mZ0(vtikeMOfqNV@9!Om z;&rR3KYC1`)pQ`uEUl#co?u=!I_UTF`uWk&6u+CYf?bxvD~<%w;g%R>Y1&{nka7;z zQsNw$Zkxc;cXC{69w2p1d)=~IXu+_$#|n<^PX)U!MDhkb{$DxZAv;^DTboV6S2C4# zq)`TJOMeAjO<11tbjBZ`WnM#C)2)(jj6o5+E3sm~@Mi_ z?>8?hNyLt`N7le6@ZEX%Be+NTTzw9g_&JsqNI~Fq*}Lf`%C#)u0-L`6?8=}PJ&zv6Ao&Bn?PXoKxhdn3Qw_F z_jPMC`U890-?2sZ4FlJX{Y}Txw08J2vq>P?RGvQ<(P=%=ZXPT28c?shW0GNK+C7=f zW=*%uN%={T3v65pQ(;2@r59n*)LEu2sy`njDF9Wt$m?`|tObYZz=l%VNn={PD z>vrbRW*%E;Q-v)oXj|oW%NeQz*;;r&&eI_ESiZtHvVFqbeo9s@B;B}3!FOaN;+ibO zbtCCfeDtl-czeUs-jfJ3yTy)r7F@07*45zEA34o{LxA&GgZ23*BJrFD@(7y@bmbG= z$FTCeVbv0=;^&rCF68CH#Ug-zL8RKy>T+0bWhULyaKtG3>ODB8@qA#}w~_%0p`;-N zNLQLev0~zQNyX|M(Gz;u)~YohW-z7A5eXF#)>yl*hsWDt-{RPnx$`vOS-|7WzWVMq z5gfu*>k6UAmxqXSRbB}&?lmEeU%88`D&Kl9L@lblCgI9MH|dWHPs|VRd^Ph;XC?iX zlb?24&w_=1(vvvkn82NJP<()_AtJ)*@k{F>$TY;#d^%@u7NS9M5)wLy{J6h8mnp$Zo*{kli0aqo9X!{FqOF`kW zjk8$qlbf1wl;k`w4bYlL^56%%`N6Ssl15>d!|ZT(gs-(?*QvVsvP~u;V{}A6Uu&2;;y|A+JYW41E*WHTSQ?{KprB3}i zpv?L6h)j$V`*Eqt!xhwDoH!FTZNPz&A1^Y@))UTH5^LghB@_kQBm=$jJ4dm_NKz_u zZPV_MqeIpFRj2!zF|YsggA+VbNW`0}R(c;D*l&p$24x!RQvemgT=4LU!y{N3(GR`T ztGIH)?e> zuxfJSiU8BIZp5K=j!j17@6z30cDBLQ7SDSzyK`Ba(g&>vd~7I-@+n8P4T}NFG_YR# z6AsMEtGWof1bcn(oO0o-6p}7_me%s!`gK-Voz?O0p$ngkbA!I@CX54FOb)J>E<#QSf;RwsZ;QrZX=k6%zcf%>137R%!J9mqYy$gU}zri7Bs_-aINV{4U{4b&?9l`I=^5(76kP zmuK8WrM~5`?!c4+BD>3X3v$9+j@=@&SNAc6Qj~zinssGiBO_PxJ5A;tCZTbDfE!J?9N zWK{p!;?|>71!}MKxT6Lt)L+gL?MSGTg#ov~d1z1)-hDP zF}93Z&pJY(c(dk%qk&O?(yq9$orv15a%#6<<*r*NEqdKOVzQFodvvSA=)JmMBwTBY z67^26`Uv%v&Lkq_`2`ZWT2EMY^eL3U@dd&RP+_ufWd(}aO4>K4wW|u2oJE@7@gAFi zL_`S4Hg4KSHSP`crQ`EYP^ao>j(TdR*C&{VxYW=HSA$pi&_?Q0NJgq)iQ|JuFR6OgXjR!FYd5aEouHi@ zD=iR}AH-(}sf|vyiFiz;30D3lmHRh4MlLqd*f>p&3ks=|-wLdhkwyX1z(pgj0vfx` zd1cE7?OSl8KZJu-*QhVb^Of;0v?_pyKYLA&Kz0Zw_|hIn%DJnV*`?n#3n1-0h3{ua zx=ICJ9_64Z8y72@cBS2tHY1(g9o%WxZZ#W%s(IC+%>e?0+T_ZzAzbD>rts-M#H#%l zsWCN1_BuTx!51cn;g+sa7z?hia5fqHH-D!#l6y@iDEroS%5AV)M%D?)n>3QDYX6(m zwfBG+8*$!$Y)X5u0wsIUuTT2O_VmkM% z8+vRrJ(C^As}{DM?HY?GDF}ojaa7Ffy^YmqH=5?Th}Kc7+??yVqA}g%3yYPk$CKv; zpU;QFYM+l_%Io$?TgHfK6c(|o#b+Cm(>l-CT!Z&_pBI~4_{P1^llZuXPrG=V(*XLPGV4Jzt=W)Q!TA0 z=LA))wz}q%KgA7?KK{gHk@*3py0hx&`!g>)P2h@wN8cU}JMZI4FQJXEeDyT9U`=-s zT}4M;WwoCcRCU}=f__^!yPP+mUPgj@$XIXO7I?icOr8@{Z(MSIx*@V8NKkAcMP7(2 zq-JrL^EkCE(7mW&pOA-`btAiB53Ow5xWDYI`0y@L%G@O0gM`XN$N30T{g>f{GB&!{M0={WN+fHw}_e+XW=wxeSB7(o>Y|fGUO8e zXnKHm_l;_}<(EEpo*kF|cdQ*RJEG{ikxdiQ;x(H|kebRH5~oPb+TTl4~CW-5Iu;)Ori2u^~}u_Ux%VZTi#zs5I4}XUMUuXdx=C0(lkTFG9&B1$;21m7iQfR=`XI6P;6hNCi3PVE+ z$Ua{zw?5*oS~XNiMASh$iV`&1ff3)e{FutzFqpr4t)$i$5>dC}jR@m*v{}8n%2#o> z=w{(dyDS_2s((*w zVEIZs_hh7}0wPOVJjMbxc=Zk)FS1zCJH{xJy|T5mU=OMCH3ZMr70T{Ku9q}vNB5x^ znwV0Z{u~2rV%w?y%Z==w2L=BSCH?o1fX&l~*GY1KjBz8|CTlk71r*X@yhQ%-s9Xi< z4?IH8x_@SG)fZ%Qk=}buXn>ey3_l^fi`||goy;Q|XmGqibB6rvI(|NDNT*f*4ad=m z(v}vY?f*u+C=3~Ee{cJhIm*z*?SQ@i3!129~j9WLBgV4Dr1iw40fx|4NRIW0E@!Eb*wQXSsDh2U%{2SA$`>oIQ#2lq3~0AuxJmGTa#ubE5jqFkj))bRMpJf+&s>eFG$ z&GrlQSE9P-Ubu7wNWsqq_yIjR++FtPzXlx;;}WRk_4-78-pb5WMD8QE0y{zL3YLP^ zj39->Suin&{C(kHm`AoX6?N=nnVUV#~dqO?LmH0}=fD>>PWr%H;ul2X|J;HUyUTc{d`c zO~r!lVu~2kdw6`lUa_Jq^Gu4mw;hnnv{aOssX90iot#)YUE5y`BT}1q6KZb>gZZi` zBH&Chmj>DR*Z-ZhJniw6L*}(raADe~w`-Mm=82gpS3xGkLVOYlzUSpHLXpsZL@FkJkbA$~MY!5Q@`Py5L~F4`qbCM8z@cjRU!>+ zcA^fmaqFLI*=vFnN>ZxiHkh}dZgoUp0Yv6~L^vBSZKp0dCLDDYQO`Gh6GV{!M-;hm zaGJleTC2^OTobex4N@R&b$VTBa6FmgVy-4swoNg!GkWDXwy2l3Pe%C4&}{v2_=|BQ z7w;gH^|gu%0W$cRm(U|0s^kT&MB{E^pyk=mB#=hN-W_JqI|<+HtiXH>DK|836;Lvg zLkTJI0%AX+d4U!8+bCXwEN-hAU@*M|hTedS^w(2jbprB5GpMOY7*O!!L=Xc`@iUh#vJ?9K)sl z{)-+3L@ONCCiX9iGoU2;c&GYyBfoh$NTxC$5vEU_50m7g;J@{TQ)GvxNM{lj*W*6_ z`0~ZWlabX!#q=bFSn~Y8?^<7+JLfVb=?Oxmj|kW18-F4t+S^(w2g`|2K6Rx=nE9PRa7vafeXar z@4G0x3}mkO$A9=YXz*w~cp(G$6!h>GRAI5U;B=0M{S7`q6BrDD5xNpL&noP$u&;~;JQk+7524s;}qk*Jb0tPCGndg@=>APt@5{{t;s+FT6bRuZXE?A2x z@~Z5YKZ^t}bX+0%+R$yH`%+MO(hn#ez9Bc%;mYfKn0o0$vh(|=Q%@V)qUxlz@q%rG zwoyPI5FIZI8<;8qJX_BNv7%d@GmKYzDFHVO9Cg~Am=vO=~W~fkHRbx z_b&RGAoQ!Eo%L)}mf||B3B0Y6TUl#H+x)(9L2hul&X9(9Nx97=l$H6*D{Tesk|}Py zS6-E=MQvO3E@2KJF{|yKsV?5i9?NFL`8^XBjg%>T2JBQxE(Wd|%`Lva({+hI_7XTL#H~68mqRU04#}=wgQ$ARB`B76 z#7_skWl;_FEVZ#>rzrI`uKf?*C3pt-4b!tDHy6 za=$gb32uB3uT}j2$jnaF2ZDl|eZsQq^F;ND&r9O>h2;by+ z<|PHiTN)`%u!RZB&OfoKoL33bcmI}LFK&~;47Ne-bE~{PucZ+PiQ8Wo&?+~wnBRf1 z7L?wEJg;6?1m^A^HxT>1t%vBrm~B)gQI)0^6H z=ow_i95$!nnAcJ|h%SYPyg;8AV}HpQ$&XVF=c} zz!|JI`ZH<-I{I;Ved9GR8yfV`&PWR!X$J{OVMrPKJkST z&B0!j%)zhLbti*cK${r>`<^ifD+(fTpvW5waOE23M$Vl{qo@ARY6|RCSuwcyM!BmW zr_@k*UDmH&ezE;{5N(ener#PDZr^1O5-GVceLIUywT z%nXH>hRThV%jNN68pB^&Yu$XI}>u3uUGa6QSKYQB1M zV^cY^vv|GnvI_M}b7{V7(j3CgfI35N2~}GwG2LRJPux9*-*H-l(-@UbSV`dxU+=7w z=1ME47q@->q>v$1E2_7QEMu}gxk1T%%)KZ^j+`SWw*zj+BgSpE1MDd08+^96e zKi`WgOM|1T#uJSc{T**+_&3?=QeS4;s}#L_iS|+cjES#|J_(6hX~J^Y<>;dwcbQie ztwW;3DZ7!5wmE>;Wn?`;0B{$r7-a@&dQYngjG$Sr!%iIQYWteq;Y(@*p1M5_4n

xeEzpu#=tI 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≺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%0AWca2FI}F_>$cfI88mRQ1-`q7W(R_nfY784 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 )aNeR6|{gQEjAwH?9EMoLD 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.$x)>QQ_$q92G&DI8g_AO>3; zNWh*|3Z%6t>CPolX1^dYItO{WoIDx8Sm(##;Q~( zU_2u}$H;|!yVQ7KL_wRt0O<`V%A#oO3MFzz0NTKz;!D=x^^@INu3d_cAO^+rXMf@Q z)1}GwEY5C;&R#4P-<#GWaKip|kZj60#VqBzxIAzErLwCBIXDN*(l`QzGf0P-HqfhY z7*43WA1>us`h}j;O?TGnVQtt`%ajyenO9{ALYPo(61hY<{jG+<9r;?zC~%C3&4oy$xP7 zMFlc2ix=Jg_se@h*j+7L9hX^Gvn4~IE7v^?d20HdWne*FH9Y;1YI_8HZ^{Kr)R@vF z3G?@Swir?-*i8x^v4z+uE=0{_7>A~12p~vMzkTIWWVPW^q-zK@6;BW+4v>Ks+4r^N z(_g1L<)>pqt6Nf;v%%9V;M3_WdW^KtJu1G{>hg<&bVgW`=l!1w7v-mK%}SMb!Nh%gAt{csOnRo~sDQ%1wkzrs|9kJ!BLkp-@CeiX(qz^SCer*tMj`JDfhp04&3BMZdo z-Wthk?I4TU*r~av1aHKP%68Y;A88rU>REf4=Z^iyT})u0%%umXSeRkp=3~_b1fl3L z>DIaqLi=gl5CoWd{H~S%3$tXB(yxD@c6B`@c8$n}9iv6cq{O+^I81>!JGOqTvr&aB z@Ew$8n@;9qR?Y?KF2GAq^dmPgPEYh;fjmPH>^;Krc;aUeHD{}aL=xVB<{>*&Y__Rwijb9 zw@~dRvSY#V$OKs0zp0xUmoaB61CN=#XS`Pt_`Jy=pGO&D^!oeZP1trJRQofTnZJNG zNrz;SjDQiE0oMLXd5k9tmRD6I5a%UYtCR&M-8WphY0LQNFoLS$X3cP$=1%c!#p(mk zrEh|8RzJ=e`_#=+yuU1SWn?0>j)hesH?C8PhLs>5<24|xvLRDB*C)-+1iyXFp7rYF z>>Dh8-_)DyJ2ogVm4hdwtNiK)7RF>SOP|Sw0etVs342@#a6;sV@>+7#k!24)-kFdE z-Ev(wVU43YtA`p?t~ug$0dnIC;H9J&Y?2nSi~d4{_aVG>JPe`%2s9TTtfFi!Y5|Y5 zY1@14#yoT|j=`wF15(F$mjHUQ*sn~J(b696`B_%hL;h_{Fk7QZCGJW;*Qip}*vmFQu&BK)ueN?l2Z-R_hA6 zVxzXs#?BAz;ee6b*}Pd*KgUR}aRFrBTeG=W7W-*0oVfkU3j2L|!biLK8(D!iBV60I%wsw<5$u4Fn$%rpaq~E_%7` zgkaWz3Wi5w>t2ZXvK>PST+LEI-R$S-jPpt+-t9B~iUUqiEHaX>8(|RiM0xe29go@8 z@4wQd$ooMtsNeclm7NGJ6z)YMS4v8D;{{w^)m&|}P?S^~K4#Ap7=IRPbWeBPZo6&^ z3VEn((^i8qUy`U{JjGx1ERA)vqM-^buv;mk1FY)D`}FP=0l=ohM0B~h=mlBvJ>Xd$ zV|Bh`#&qB&`>qK)4?*?S>E!q7%EXDQ%7`hnHc=BP^35O8@*atC5rrA|H)XOXgy-%L zo=sc1K?5MmS%>ozFf~-*4GWk6fIa6L06OF7v^F#Lt=8z5$A;Kt(^}8>z}i8-P1SiK zp5{s=bac(SDAGvN9W+7}et6Ui4}S6%Ln}1#qiGj8-?qu`r{C2vkp_hU1xc-jriu8{ zsGQQ$AdlE1a;nSTC7m2grM=upflAu3wqALQwu!DOm+`45K?P|X*KEu;h9CRIy(oz# zCQ~byc_;kvAC#(VyoZ89MD!V}RFqHP8F$;ZNyIEpuR<5K=q%_ZD2LR|4A>GI!8h?6 z%#PkE7km(0e8U87#dEH&9xXRdT{lK~)1W~s;Z_}*zM=%?2sQ*vb{%InfQ!Vrr09?x ztgQ%G2-J>1WM_s8Vg6z)IH^F0OjppWWE@^#;Dx^9lw3BRDb+H5A*v8J^r$ZAKVPYY z8D924o=wOEx`i)(=<)%9t5M50V&kqMz3>Q%lXgfu{rUFAP{~CI8Nbu&RJFjA1xjQQhnWgqdi29dLm`jn2$3Nb9pyEDLyW z1Hdoq-XZxb5B;Duze+EK_VQ1}vwCRF?uaa^q? zSNr)kel@XK9H1Vc;D5AZf9Jl!Tn8D+&cz~=x4QWuDp%fGk*!t)@YxT{y&An&08Jif z=ngA(zp;Uf<SN!o!JO2h(9!lejg-eVpbWY(dZ%V220y|2?6+!(`sQ|rqN!N&|R*O^xsE&N>J zj3r96jo9&s{XV#t2*t%@=feM|9FdEUI#0*OvNO$42Iv^}Ln&I3f#z~)N0 zRJpUG^Cj4*)#U8dK?~Wtz?VqY{dB7{=*1Ag7TTKhkACG@v*V{+dbyY!Xc!ER0$#7Y znm>h4cFhLz^Y9&)p2f>Nr<|a}wlJDulo1|*7>49{7R{KjYFSpaE+zm|E#hKf!ZGAA zcf=>@!JyPz+N8C)4L8&M3i2NYcXfm^C)vRM1ekWG? zureY7?57^~Hm6eD1FVF#i@wTpv!^xomZ9meaHE7dn52CzUMpej2Edp~b9Z(6wmtc? z8S4#1>g;_2=akbQF_1iYgvF0~(SZ8QVOlDqdwu$K)vQBAkzVuzTe19{*#5lxlAyI; z&Ioe_xV#SImmq(;w>}$NP}X|8h4Hsu>)z7<=}8F}mu>=k!!#iSmN5$@ha`4pokQJt zJ*ozLxjBk)@oWrV0!(NQA}h>>1Zib9u@CP2R5p@3=BO@^_d!Cc^t`ksb0xMLI^$3W zrBMWERJVw$0^b2{b6GGHASrf1c^8XY9Xm9?n3z!t(>y6&6)vK{P0;J{cGI)z5$4)b z@{FM2t`6=A2hBNmJj0Q5E~&LD+@ae0(R&TvHPd>&ol&ZXE^}h(4TyCKk^Bbxz*fiY z-lPH+fH7r5rfP8rGjL@+4Fm+gi>~uY6Y4EhcnuBF%%Kqnv6xjfB3LZRL#KD)7Ij3q z5%4SZU*H`rHqIa>Ta_TP%ZXpOl5okenTSPpAbt$mK11!rc=QB87;p$Rv814_CBgwL zN2nb8I>3ckOa}lMke&po2jE+(uA6F5wA2>MCNV(Qr+Z(_0dM6cKaYtsneGFuncr|O zr6bd(35bKFN+<$EkzItfu1J*Pp!R?Q8$5s^OFEo(rmS5U64Xa0bYP52oY&ofit27N zR#9;;c2!MG^0njc-3RA<0(>y!fIclvB4-NcJZPQjZ@)2|S$sqoc$pGG-DaS3&}u_z z#MVLi+}<&T+CSGz(I3!imXV&7Re`{Br$eBH9dCl4l>K9Ew zXVKgg7CXjX+Mq23WMs}2$xj$t1S2P>?7KR(o$Q4{HbC5W;rgidKKHUZKAQpqY@+*2=o%SL1L*65GoDH7 z;r0Rro6pC3;^-kW`=UX-oQ)idaEw4me;4dCzgnh#&9x7OJ4#j#^%Z7#HOMDH#};`A z^EnQvbt@7wK+Yg!VZ(A16i}{agaf@yr_prs?H3L8c)WPvx?akifO#^3obVi=@$5Na z$tv>tS>7_YVGVTZH~?7csp7FlHhuvyNaD*N&#oA!Rf|)As$gkmHFXn0z|d)m%u|Xw z@X_IucQ|#ry>4tNa*wbq%}&x=st3m#@Nm7*CW0Oc zUL?j{HY*#_`xIFs;2<$0cUMml=!^xP^~-{REbA1lQhY6^cY23r{~=$H&wmfqE+A*Ic4cL|`xQJ1SBX z2hJsSy`~p`p-spjdbLF+m%yaW6Q$B=u}T3Kihd&QFwnfUTn^*_sRYXJXNF9iVrM>j|1awy~#fsZXD%FbcnL&9}c{#0c%sL=IA z9OoCOrSb=ycrRBTO^LHO6|E*B%X0+RV#_%07hggjy{VNDt?qzoOIstU4y-JuBzecz zrC;;QMf}29@Ex&i>ucYc@AY=P5J-x|Ty~8$*8#n)S^bg;c)wT4sLaGLbS$cq>Tc)1GEu-D5>*O;kUeDlUeWp@`a&$e#(0O} zQYO9Z7xKkB zK{uu}iMd%yW$hWFZs6sF0z9_Nq0r6!MX zr-_2PmXgN24^bYb3!mIG;arT~Z`AJS&|p^*^~wUNr+1jl`61(gXEUdXcG3hmsQM?u zB&*&D<7J3Nt*5%S>`2mlJ_R3B;sydohFDnaFs8+4J}E`tu!5*>=*xe(1;cRq&H}5r z#;5PYGKT=P2e;E zHClmSpVtUiqq$Mh;bf_j!?o?0$2>${o{#y zY9opfr5V+oxYwl~tQq;*1mHA98zNsbO@GC+gf8!t2pbt|Aad2}d0CB^dF%410+F32 z@ows6D;;9PE}T(Ty&S2TE*TiSGWvdPhpo-Un}&mJr%7WZ(00M z?+jJ?h%!aPNxaPmH#-!~0%QKtzJR<-mjiK)Gpg&Uh|q?*%a}e6__$eUG5u;0D>`g= z8|e^0jB@!FDQD1=FHP}o8PH(*;3Si}w@=}nJm>d8NyhMLm0(iEt1cfuLAfPIp-;l| zy9RH?I4^7lzg6r1Oqs<^|1I-IRfYQx?-CHg1N@gi|LpCbNCmt<>L;)O;1i;?3$Iz3LZE-f zr~Up4J0J$R!#P`t>*mG~fRiM7?b>^&f_R#;XDT?;8FYDe%W0QEE2yg)$Gg zrdLLYeu!%I5|R8PKR}(`bPjlXCtTM^n4jbty1~*(cc0@w9TIB2e4wz#+9f-WgRZCw=|Ua$uzj z+&JUnY9qzaYgxc9u7!R|1H%LDQ)ESWc)AikrMs3u2?hb8UOT|Qg!cV@Do}rB_JRBr zvk&;Mn0>&1#q0zAD`p?yUordsu=uM%0q|Er2l%U?{t-0%KVL!wzkOeo21j$>ZZ>-1 zUT-|$FM`BKIDAN6^neD!@8HKoa>D=s60U%PDyNpjq7+*LukO`dr$Iw4PZ?)aUtgV2 zlA}+s0sh_<^xxhj`193>zuuy-@xVHey@cAYAJ-Pu;V;Ov*$3=DK64BVO4mb8_`ey3 zf7#K$4ig~Z-*Nh@I05|k#o-U{|0jTw|C9#$XV=32DQZZ60uKD{Kkz@f4f0Rkg8q|} zVE^Qs-zRHh(0@O`|K1|_zdPxFY7r3S&zH#m;36RUe(3!Zz*a!Sbd;C?0hk)R5Cq zLgp`vsQiKO?Rm59K*@;(^xyaJ`+cppH9ub8-ElwP7OKU2V8X^C&M?FQa30I%W-hi8 z$s+fkq**}V|1gdGzo!TNS9sV!f0bnb{Z*C$@K;&JAGw{<=TDGcqD`Mxziup(iO_Lp zcijn96$C?&sm|uF_Ze#J-x^L{91-xV4BmWDqh(?%agn&|{VYF#6@osu=T~IJNeB6t z9RVMXIYh^E{y1yWf#?|7+$*?VQ6@I1g-(Pf5P2FN$RPc{7DT@vD&$|KhW}Cl|5fVv zFAe`Hwfrl?-$TImkB##m8~Y#6{}1e4mEjfRm!^ozEUM}xL`s8*Kozu1)bE7#%8bfo z#06W;iznq=c4l+QTKgmW8|AvoA01M6X?R#Da85>roaBN!U$P8nidPnF^IysZvnG12 zD0#uCy^FU}rE7k~bSklv$P1H_#sNN(bj`_sH@e&1`T&T_Y2w)e+7N3U1&u4J_30|Y z`tjmxDnAn0E?uS10uPy!iv;(IM2)X36&r`Y-A!S(TJ@k4djr{ogl@b|AS$J z?CxX3*L$skDuIpYp`K|9!F}izAc*prVxTl2?i+j|vDOqd@KVt($B{vA1m7kP1s+tq zIGcC>tp|)sYhNpvR?KPXgYS%?w`FmJ!K2anin5h9?;#}xjFSEz) zhw=|GNTwNo7hEAj(TFYRBuS<=%v%saTnBt$*I|94Snh%n+u;}Q#cNcBNjkmEvg?_y z%aqkuo`6|jEbMN0lX*$?4EW@OX~uz%!)9DrPk}woG2z*Ew*4GZ^1%*d z8W@$I+Nesw{6I1NeCcKws;zi}9BoFZZa+j4(iputs8f5|EHAb=tN z1ZkFApeStJN){ED%bI~mLKY~^q4^#qM$>k`P6PD)GAz`CM`Y!2xVJ5rTIopJy5I8~ zF=#^N0mEB+iWBm)p|$N^h*m#|ESS*dxk#10q|q)OYQg{|{00kf`i42yq@T4KRkgN{ zGr`VJ`cIUSEFH~4QE*F%eh$`Y`FLWFG!BkU=~LFHzT7c<8E+3s?G8X>@-k}Ok0mP~ zlWWu1BVDBCfREg)y0p;#rC09^x56GC2wWMtSLyvpB{^}m$q9eZ-uX=>xrcqyCrRya zPpk7 zilEAu(}K&uAxYz&&_RpAK?8y23EGFI%d&lpmtxFM`+AC~Y}goJ3y%3P)xryQ8>VpV zK3E@2psuzSIAt_nK*Y`FPmO=`+)bf9=G*X(nO>}x0KLi$A?w|&dlM(mj)G6**(gRX zbT2q6&7e7c(v=`pOgH8c#0e3$VsFaRW52wZYv9TC3(COS+zz(ZLE}LnyI;X!S92Z~ zw2EdgPu8|KXRbaS_982XcR#}#n7xlgZB~;eT!BMEU_LSB6A>cw3eEy=Gb{V11cPT% zSua8_GH~%r!)}jzxu%yRNKxa1>v= zd2e=4dSiCZ=ceH(nU28@X;KI~oEaIe>fN1kfc^5VG&^be6?_HO`ZkDqBsoDgko_pf zrui9i)lL@asVpYWSNB>65_k-`hD5J`yu3beXe%oa0O%*xf5Y^`r`E+!QCiWf+pfG>lhk(5bRjla;_zf zo>KSnjR*dvBTdO=3R5woHenUyyH~q+_EuaK+_4 zo}p*gLqaeyV%MhAg>PoAER!b&*ztPENavX*;8rVmBSNHfG-)V=ymyEsu@Wb!lJ(AG zzVD9tVjo2~Fm%JrWjR=MNfZu%h}rJu8tZZINTwoA;We&tBF_XK2F)<4A3ZliV$m|x zDfRXtErI1@-!dmSNvLGA-pDkd*T6t?hup%#ZwVj&gA*LFiu_T*t~c zV_XT*_$~)sQc5hUE;z%<)Q!r7f5v>$I~h=d;nt|k@zTeZJaGw&nyVkm5`snD?Ge9t z;cnAS&2rKh-ik5EV zra^-@lELC>7VKMQQ0{XTN*bhGciJ%g%ajOS`T2T+hukwVaz~LSU>*wKg8Y6TW-zV+ zS2LWz*{n3~#PhYK#ZH{ceRwZ~+4=4M{AM!|t(DRAL(li*<4>`AKO;kv_4-jcUja1lQo`?!Ne^Gd>uKJp5;NxCM8GB>A7K#zW5?m zo{H@s)wnNnz$S1Rh&TlFH#?!y3qX7#2r2mHUCJw3CDH)O^IIMezkWigu|(nrXnr_( z5`n{`%ID;K!w`dcx9-F$1$--Hfmr_uPS5T>vo4K!J2eKdiLhsvduNBq8${@OjbRRd z&7f%8h;n723;;l+a6eg7sJpFRf< zB{S@=c6%x;t%LR${>wkX=!3;1y`DTRT1Mx4e?}MuPDJXjI6%B-S3pP68j#a1MNO8Z z*n02@k7C8|UEGbD$KNnDH`vx~po5Re@Vs&%`J5ANu!?ALY~TA5Uwzohz0APx5`!og#f3*%8-YDIA(GUBSl^yD%&0 zIUVRD8~Y?HBg#y}7m*#B+&7GAv^Uv0GpYrAe6Df`b88;}Pk{7;kfHm|pM7Xr3m7xv1a;hD50hWzqRcXFxp$7|u57g)ssB8SdWYP| z#n}w39%OHX459NhhV(5mD~pPDmdHhnok&s>VH|UHNYVmr@|j(GAxss`t&y)-U%Z7+ z>Ylg!{)YSLm!{;lpIYh`Upw5;Bs9V7iir6Jjn^`0?E$GjGo0DTKc-wU@ayTg&Ct(F zse7{NsoI=vP4`dq)8aXjahJ3tPhVd7G8Y^cX#xrdCd(&taaJ7Q80LAnB@*%;N_F-3 zOKH@SQe988C>X%FIGDQ?Ub)(VH%eQ6?7LHrYU!u;_IRqnrg$VHz6dI!1}nbAaR6v{ z_)|Lkru)MAg?Re;MrIGxgzBo-Ntt-(t`+@^qxAE3`rbLbwln^mvO+gBNY_v^j@bn; zIXeqzUQ8#P3dw~L!1g0ljRm9ylIi9N23-URDn$9wwsgcnKon(m<1!1E%i&$RciLWE z@@Sb(A{Rtml0@xR;8!t>VC%DVWi3}krMY*=60{UaY8E3PXTfRF41ViO)y9GYaZ|;J zrMtq3VG2|xhGs;xDf{NvE7hqY0%2^mGBwz3DiC_yTc%7{Ym;Ok+|uDKz6SKX-Ge-~ z1Q+ay`x^->lQF5{cK0|c&GvJQb?bRcy#ShGxIyDVU%N-fWL|P*rS#XaG@#iC$&C|u zk{k)k>6%b*cy|J_4*A5i#bEJxe_bMJA3`DBoJ%9Rhr`m$2Dd>aG3suHuQdoRLtlSx ztE#Nd?c$jH1Sxt=VBXxkl(aTc>BYzHW!kpBFwcHg?_7cE6145v zdu;@)uE7(c8+3@C>$_HFT~jJ^1xjUZ$V7#4wyA(MKIAI|WCorQ4 z+a;>R^YsfxB)RXXgJum=M%%RH3fzG`sH{LjEH}+yFE#_9MxuAzMnc-45y$!izCDRU zq!vtEpACzriwm2CIgHlKdGEs7U3WpatB09J`>sOGaXej-UC@sVe4BarRk~*2l`F;b zyN2>^>Qm*`%vNB>k>k}MQd7ZMufBuX=l~X|3p2%pWnv%?L3-tR&ZJK4M(e2Q(@d;F zEFUT^Sp`|JiIk!%7@`MIF)W%M_VS5MYsyPM`m7x8Gl^nx>d8U1G zuvkvJLHldCn8-zbS}=i(So=x=7h97Gu=RRPD_{UgP7ulJwmXr(f$KH38=&6)cm2=) z+Zq7JANs$j)C4ai2~dClzj(zM9qW`U%zNIFn`@6@8q@0?4>sEwg=SQt8IJ_XfiR6` zj(Fwj2`_2KE~&6%hAYKsUZll&2Vlj}fwYPM-&B1nk2G57#~}W;B6iSLO4&H?DG^Mz z2UECeA}KORG$9HwD%ZrNVcvH&3n(qF3b;ku=*%c0IgQj1<8gQ#S%833fP$v6^|1KIC1?t;}!vY;H4bL`YI5~BPuvNI*7P-$?2J_VOV*g`xs)msz8nsi!BRV8( z(-R`VfrOVsH7Ci0V3nCQ&nmC`Yau`~;leM)glj9D<(^JNH?A`=KK!`bG%mq!JD07X zvvq5E%BP5*$9bWcV2q=c`$7Y`HI(X+HRvT5h#s|xD9_BmX4V2c?yrf^Dg##RevV## zR?%*TW!(#MP!e^pnqIk|h)8IcDKoMN26zz9L1I!Nc)~+a{x^UGrbHE_z4T9Yi-Qsm zF`WFE_NqUMdpa?N)ofc_DAJaK)qkm^G(gt1&ulBm#b}5^Z?x5YuOL+1MrlDxG)T01 z_8(lGiXk=TErd-UN(a2;QSqiDoT#KTe&#Wb_pcY^&Xw8S7W7Uw@f7W24mq!ao-!Ob z<&v$w5PYP0Q7xwHr3PX03KTY0yUW;>-{jS&OZ3rU`$gIwNhd5)lT}xy@!)$)V#y25`XGksL(a-5NN(#${+GV zokFo}9!9d5{_*}eMB=I2*5*l%y9%;JAVcRa#z_0ogKL<;s6(eNpLEdT_*=>r!!*{s zb2~gkfX<)bs{<-#OF!YD3t-KN#3qt$7@O&>ok|p$Hh4=)GY(uo2#LuiR@(Qww?FBE zA(PwRz#={2u3^>bemtU1EI@3;SjjT4fZOhOvG-zg0~Qy6WVsJ5qn&`~$im7HtKA zmO{zKT09%!G0?cmwb9y3*c$2jh3eDrt`V=#JOlz$j#yOZNs5HVfozo?%qp23N(mEn3z1$;vu7eMERp| zJNPydR)9GO9h=1vR>w^`)gS-@3lu#0EjsuKxyz-kLEuNH^yp-=XEXTVyhd|-<@4xi z97>x}rmG;RfK?IA9OV|Y39a4xruBokGDnNRq8~@NGRk=1#jE=?7~EFU*HbGCj+LzH zH4$%K3mLa4xKx~cADwia9D!~Sh-WTR0K?!-A`tHV?AU{=J_-+AicOW3I?kJ2J~)XY z9P3vx`Jke8o8oBZ=egUvJHSmgt;MN7Cycr2k>R#QJ9=wK)5x&!;9U9jV`pgUR+d`K zI6*mM2s6i(rXRJ%W*8Y*j_ii;Y{H`+A{aL_@QaF-rNstS7jF%AMcQ@2wR5u(>I}x` zH_5V$3Bp*rd}aL&3#?}LCJZNi0{t;YTP`9t{plp435QY}AgU%G7v>n;QcY9tVq#wE z{7k6w0!o}I+1my8Xgjvm#_kVZSbnzAT{eg*b_||vLf|cOEIUe>3&3)&#>bC2r9Irj z1H+ov)>yu!ev(R-p090E{`jcbR7>%(lNMQ}?Wp4g%3tbXq-g{Oc3>A5c2k5BR+KjQ z*HD*Z%ZFZ|0uk+8F{W-VzAqrc$eq0Iq1QvcjSCGZ^#CDlJEox0zdS4k1-xUwbz@AA zr(=AlCqpkb6O(<7kwll70WdxQ-vGN&1+yLfP8D3XerJ&Q?tE!PYrYqLrbxM1+%ph- zVivJk^InGfuI=C23BCp0N@+LH@)ln`@q`5?Zv@D&vL9R6`$Rz3> zBJ4wU0*8>aCnrK1B5@bD?*<0eO`xiVQyC5>1$edSNS=WJ&UJkygw95v@u}rwJQ94XSnk@stviR6ia@_L^&qY;F58w9oT`IY}2xa0-I%)5_xPm>vS^|{T<9F z1}FNHi$Wf)j#8K%T#u=_QP;ci$1YqJu|Xlwwk_c0A^^sRp;*iHG3vsC0LO~%U=hqC zR`u>m5Fje|>lKqgDQo;-5MFK1)>LGApDRpyFcocZ>r06lRO?_CS~In8Hy?yUwAJPX z)9>gmOG;8O)*V`BrrS6&oO=bI6KbwmXzBE}By`_W;WoHz6;paTcTHPtZde(oXPPe* z6QXskHBd?HpP;@63T#U3wfp`wyrUFmh>>b&>hV|DfuCm%`l_N~$grZi52(h7r}ggo z!Od+w{kH9=clk|8yC`Ex=VOhMnxK1*@JC<2Hp|)O#eNtP--nE8v-e5F%^Y|Wm3tK$ ze`g54Ca$?g%3A^z$yoHc2z-T_hm$vhUITx|4NN!SIuQFmh9F0pZ?$ETW)eU`K0r*c?6Feeb|I}(W@TQ+4%Xm69UnGJAh#+LyhonOgrY?pvi<5Y> z?8#inslVDAx6c-|&)k)A6>c!(o6gNSSjyfH??Ju}_rs+)8>wvE z9^7uZwmj7E8S@;3X)!JrdvTb^`t=iPfEtvU%_`NLQLui!PmVZnr#>iUpC7St>y zipATc^{47Fri2XLz8a3a=A@!hGd?ayTVTJ7x@nD@ zX(@pueLh{fL(G{h%HVkQ=#{v0;O{h=i_*;G(KbPa* zq3Y0mI1n2y2M;X+Flz-Y?(da4HgxzTTWDak21ge)O8C(uN%bmJ(Gg6IhPmc0SFVc7 zyz(|(P;g^YjMKVQ4<_|q^n8amMGb(7uj=$bA|bzUqE$|)G+phCc66@dlOXj-s*hnj z9fb=8%*vqvaFgSI(sI?_57O-^i{v+PlmKPf4{rX^^D|zSY#5w)rQ#y#$uboh(;D1M zWLQoGX6_kqmWC-gk*p|1jF=6DE%CgDS_#_H__UFMI9 zRz(*Eh%knBymJ@UzP+G2-3Ug&d0HQ4h&zM=xT0(?=z`?=I_h+ZaVKtBEdutiLv*mY z8*Wjqz#peHFay%Q%{3e324H~b9$sQxf?X?pMq=S0I)U9~Sg1}&_@AJVVZ4LDWmYfH z@Jf^% zh|Lz~l9i`ZeDm2V?xZnB6aXz;?*o%4tUsI)55^+cNGiNynN;TaVfF#BdaNjD}HP~|?xWC~Ah{XBj{!Z9ijwf9hejl}2WgHoYX<%QeP zzdWsU&&9E_jq8Ge27<^o(6vY3Gky>zq%ge8;x*SP8)2E0r6^)eg#@UgJoKGp#rN3O z>9Tv4<<-F{{|cZjT?NKC|0=NnM;Mk%f$R~mFu6E}#KL`0A--fM~crYzsl2mr)KhJ4Y63fP3~SKa=*nCXll1%Jaoxfw#>7 zPH@@-=n+^CywXbA-#mk+sar@6hd!n>zHlerLz$??4etgyN56$Z`N@{x!1SZJpn~D0 z=Lx63p%7;*6#(2smy4F8K63hqEC~ne8)$4@vUTW`u(((6wqPGTJ=29vXJ|BHs`j|H z0;h@MceZJhUt*z#3W>oW7E8RAsf4j^<08M

<#;1#Lc`3W*ll4e;5fbckkpws(lw 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

Q`DEbHG44Oie-3X&`v$7WF9L`VQGaPG`s|IS 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 XKXCZJT<<=dzaS{_mWn25Atv}gBWf16 literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/golden-v5.6.0/node3_wallet.tar.gz b/qa/rpc-tests/cache/golden-v5.6.0/node3_wallet.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..b978070d3d0f27bee715f8e6d34a7d8dabc358a1 GIT binary patch literal 21144 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 literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/sprout/README.md b/qa/rpc-tests/cache/sprout/README.md new file mode 100644 index 000000000..2450b99cc --- /dev/null +++ b/qa/rpc-tests/cache/sprout/README.md @@ -0,0 +1,10 @@ +# Sprout cache contents + +This Sprout cache was created in 5d44ce318eb1916340e680b944b78cb5175468f9 by +`create_sprout_chains.py`, which was added in the same commit (and removed +shortly after). If changes are needed, the script can be updated and run from +that commit – it’s no longer possible to send funds to Sprout in the master +branch. + +The cache contains one Sprout address per node on nodes [0..3]. Each address +contains a single 50 ZEC note. diff --git a/qa/rpc-tests/cache/sprout/chain_cache.tar.gz b/qa/rpc-tests/cache/sprout/chain_cache.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..7ded2979ae05442837550039046bb7d474dfe7eb GIT binary patch literal 118769 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%0AFh0Gm8}AcBRWmY{q2^88yx#z& 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

qct&m>$mbVBH^Y%bwdoxZN?b+#>HMV=Su5?bS>o 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 U1pmhgcE%G`_Z_1NJ`fW84;ziVo&W#< literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/sprout/node1_wallet.tar.gz b/qa/rpc-tests/cache/sprout/node1_wallet.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e38e28219bef114ecd68f97bd16514922f34d11f GIT binary patch literal 24058 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 Rv|tF9{4LrC!~O}ze*sfOI+_3g literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/sprout/node3_wallet.tar.gz b/qa/rpc-tests/cache/sprout/node3_wallet.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..ff883e6f8561a4075384ffc57683c77b80492f85 GIT binary patch literal 22023 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%0Df_}bECAB zzq#J`@G_Q1=5=3r?19a>URV2i4>?8C=11I4Dd4-qpV2%e= z$hwPz6-O&Iy3NRD_jZ} z8jfKAmV(4WaR4cC7c&yvE~*T3=FX{iIaz3=cy{l5eiv8z+2iB12p zZ?~2MBi4x@qL8-3O8FtWTzx;bfDQdBT^$5VrK_Z#P`DqQly)BfYDQbK3_k;^v3$q9 z)~=7r$t-YH|7F4U`N$=FPd=SJ@T?fm4Ys#Ny9Bp6hi?}E3Ni%WNiL3 z!!Xp!57(z=B=44=>F-4Zh%|aJa}UGrCw4k*W6G?7j?1kbIDZH^$bSIM4f#a+kA;3d z5{DmZFlTq=fzk?Y^$yno{R>_XtoP+(gsHPo^rjo%L3aeq;JIStolkT8Z3g3GiP6r2R+WNGe!t^N`qMsPT$Kbq zCNa>t#`EaB>%nZxdHL*#XBGal10w;99)ZQyBpt-{lS*)V4~zm(Q*XARWAbEXx@M-c z1k&RRORURN;-IM(mRaTGXU?lT$Ra>rJ{L>zcjYy_@vNfnhjL~v&G}>k1^K%-Feg=C zO(!zyb6g4!t4`pieMcWbDiwXt}s<2A3u!p<{zCw zQXZbm5j=5^bB7G7lw+ykI<2Zft!$6*ICRg+%d_6#Uk|~vuP-|}3666GU)vvNn|wzP zY3)B9ff*UiTV)^c+}*>Pq$HmB%JL50omoDhfw63yU7ePP`M@@JS_VLS>d~_x!{e;Bc z#fR3tbW$yeJ2q((Qho^QMDnsan*+X0pg0b3D-e>BAvtBYTht%&{6o}cnu^93b? zVJ=etXAQ7R73G)D`&9OYp5e{!0mEZ@J9bxOewEo!IPTQ>G9039^S*<;Pd1fb><8

rn}0~7~YpC1Y7$)UoaHv2)-6S(QS1#(`a z?G~7}cur6PMAdIM?J-Q2)1`}tl2R`-d8^v1F+k5nWeklhez%}B^{|N*Dl+9i7&u6i3PX2~Lh%VT zn5W68r4R>C5`eq-thf~b|)F^ zkg#Mf@j_Wy!$|_iUszEk+@D*0SBc3O_yLH_2QAvb!j{ApI*4HEiprp9rmN7qCS{~5 z7NBSAJZ!;{#?(oT2qd~@j@W`@T;W)tK!_TLw%m|#l)u~W&-2J=e0<^!V@qUP5FL82 z%p8W=oqCR~ELH{D{5s*u7p`S4x|PO4VWn=t(Pie(@nu@E%aBslwn%KGZR>o=svSOCvo( zinpG1p`|o>8-%NYs0RhsK6b8*=Vm4FL;IGGtbH*+`=$ z>AV;gD`JqNGQtKW@77wja*3`#glu#W*rNz6PEao+W2v`?&<7v-9_!J6$@G^r(> zID4MRXpE&Qmi@6lJT5^KT-vOrnxd6$yvtRW=yxd4R&LO0_QlF5M}OU-KJw+UEQv{7 z?FlO0c!@IcN6wM84rm6sZYtvix?HGDW4XE3^=tBejOx^vbL;(XEV8E9KH9 zhUTu@wk^VW>WK#x6=jusqhV0fy{SPm4*k;INDR1R4e=p(pzJl;l);X7wE(CIqWqGZ z;%5uX%#xqoC0V&IoxJI?YxZk<%oP#*xbg4?a%0yTyQdv)e?*EpKSp09MEEAdiSVfY z+j+`>rvEd{348XJcXS$m1-WhmJ}S``EE&yer2gEs=c zNlvm$=wl(_wuLBb>BZlDh|?m?W}fZwT?B6&Q}Kwp6;T!nv^g>#){{0K>scx-&6&qU zbAIubf)=tK^Y-o`V_nNr3(=YTk-ka#r#;1kT zw|L|q|DH&DuR2JI>2?^ZSskORTUDWBj;Odbf#fD(WC5%lc#m7(K^XJ?DwgaW+d>2N zVsueG)a=kM+{2MH7ZUQ!CLYeTf;Uj0tx9_!GhqIkV&|tFZw1Z66aFb-f6J78iiUaR zDfB!`d#J}tfFeoZKl4j=Uz&9vB6`THGLvMul?sG6SaYnq&*?ZtJbr(tTd@)qD0GcP z25`M_k`d@NWV2Ro=;JKoq>kn_t9hD3)~{)=tGq3H02kE5c;&4GFfPUuP3qvU^foAT z9FrkR10)?`yHHd)cx3Cp9i{J;tn&OSb^7gBvtb=DI%JFB~uZ2-? z-uwF9dwUt{4>l|FWJ=yz&j`{JkH<$JX{e`QqRwWeJAL2yjx4JFw!Xx0Faa8cr^SG> zhXx@#gk#oa)_TYFBgA_l9FN>v1WcYBmx?n*)k3pgcn>fOeBgJdMqbDw#Lbe%Ea!DS zR-;LI_+YbM53!LaI?(hQZQNuqfUqhqP$@(Klbb5YODc$l%;ryHMJc@eZ}&SgS@S(T zU(2;c!Q!X$3O$!u*8ntaP~oi7)6DA@IcU8mb2y?mpN+E6qrTM+A~gzj{8cZ^2#9W- zq={Q??Grk-bdOcI-Mh5#B^g7Rvy(%ggCDHvifCPorm9iXIT+9zIA63z2Qp`nozXNo zh2gTA5!igWN>MI`LTQKhZQP5c!-$tn#djoCP3reckrURf>%RGhtQRBSp6n|xc%Guu zSoyg3yFrlk5(oNSAa0gXO5K>mPW6g;*f9VJhvVKQ2ZKeEMQ?vX8{#@Lu6L6wIMwp7dSttS}ep$rijbi_;T1I zPNZ&Q6W`SEJno z*BTz32rn&?vn+sy6LiBYep(VHXaTO{m5wx*$ZwmfJG+f4%!fnTqA1Jqz|AW8?6g9!<3H;ua5 zfa$76-f&#mjrgLTx+PtI2#c-Mo!b&1Jig)n+IN@Bn)XwUkA{1O%#rRX-JP(HkLE@P+jj0Lehte!d4zpCG|f`h>EY$_6DOxKBaOQ?#}kqzPIVE-W9-Fr5pyGZXC(#1 zhMkzG+P{4Pdp6wIcu|4TVOAvZTM?6emQVD9Ef$jJkvK4U!Kqx%0iAJP$vszC^GIpY%)NP8QiDiARlvhGBuhG4Dk=n*)l#dydz8uRk; z5%20VnRw`x2!z7!ugIN#U3{N@-<0vluQi>;1nMc@x3kHuP8FN#<}1(7bc0Ix1DHSNSTtT4mq0 z2fPP|$T!U6QqylKNAU{vV>YcW-Y2yC7bN}Y1O%|ZdHN_?f-U$e`0hL44b><9TF5?O3 zr305#QR2xNt8u-dL@|X-37b>ZWVsMbK45T{dk-;jyy+?z&p}`-x=1WtEAH+ZPY_JA z3us5!S}|s6QD=_I+MegHU3U;f*GRBjzK3A+QlvWH|UPP+r6G+Z3w76eB;dk z?AbjurU}GZ_^kPG+_~hfOqdT?u{jzaN5ec_@Pqwqkx+2gz9JpYBJaxI<%#|Xxu{}a zc4Iti85C%{kM{7Z$6DfACBK29>QQ@Z4{`4KcT{b%l@W=Vmc+6~=(R5igFTXP1K9?1 zV~rM#k<(~2FR#9o7JLlCYxXA3ZB&;|fd?vGqfO$66&ao(3#x%=WFOaJ#;KNbeSNk5 z_hzQz2k+Cg^co^!k~q&;V00<&(7{qC#C}f?bk@-vxMbiNwY`mcM_{Bj$V+)Q(`(j8 zF;=Z!GNoxE*|m(*j_KU6zC#?@ltioJ zZxQ-XXoP1Ngfw;5a3$%38}ZPC0L}_+)uh!Ro7vFtox2oa(8*o6MZrlgL5$?xwcEHe zxtsWz3?X+E(v3u>qe;)b8y$+oamIb z4@LIII&6G?8UMrpGu;Pvm2jqQkH&G)r%hjdrN+Q28H>>dkS-5`lgrVPv|0A+L>Kuf zT#;U{q;7E@5w?nx&)f|} zqV=7_oR2#eucV;4?{*v>p11{*#NZ=txkykgiih|fKUPn%zzeAT;C)r!0;T@#6FTHshYSE1nC)!=nX-^CkV+5 zO~6E19uD6-ACBr&cyR)n-MG3|y4jlA)NPb_T;%9eD_6vxDm?itd2ZlZmo+Sb6V-yf z&~EZOH38?9q+g+gK_D~Gw>MIWK&><(L&?*q!3&Yc5DOeGaporNBK1_wrr9GA4jJ&` zE+7?jyHKg;HU31FFf5N$vy!l#`a8(=RHxCRz>X#px64}w z3J*dnIQjeH?A{G2{S22}p4uewa|i;B-no~_>BsJ73vatQ6NJ7*PorQg5f4NIdR-Ge z@J{OU04z}SZAeJ8E52KgB#FC-qo2Dn+BWk5zAC7#)T73ZJ z!KmH$!Os~r{Y0$>(A*A^9Vl^%pU(@j5 z+_o)o{8xmT2@sP~t#vo#bOL`xA!uA8W<8Q3=uLjblaeHSO6#o;e{(akG) zk9M3%CWzKCB;hk3omES`eZ+6hqC^3W)90SqZ`O8*(M8lgJl{a$&Rz1==2EX+HCpL0;|jj&lm$n%~T~UytABo?jpr3##mkd0_<2 zNh?R6&&`tBB28D-K9F@tcsW&%aNF_MJU8s9iT0IJMg=-vW6k4-c@kWB3ly#g32TNd zXQ$!%wPyC{rq+x;#1vv;_74;e%10hGd6toq+QEa;^be(9H0Mi3^7Pzi1mF-g(U3W_ z3=sIdYmED-g4JOe?WhWLi&S!)nXlCGD@Z274lNIMx4Hj#f0WGiv(zh--{r!%wmR>S zwnbY(?&$R@{xNN>x?|-mxtnqylFLo1azk*x&E7a!Cu5AZYg z-^}aP3C!*)a|a;9*#cMoe(^Af;CTxFaMKMNec^Z*7Pf%|xQ+TQ`q9)3LM>DLD|i~f z{<#KMR|x{(K|X5eK(CYR3@dXf!qT(Q1CLfVMI)-0uxki7oQ`S@D`SCa8gP_^2>Mzq zHe&`P-n5Q1pcVui=g1LHgaA{=DE~`Qgxi(Gqn#2hHqq1uFG&#K;%21)4XJPCFy^~k z5k8e%)M=thDBp!^e;$C)%#s^N>k!rnClhkogMhi70%slzpS;cXQ5zG1aQHaHn7UNf zod^-30U=HnKDvhLmR4!|gk(QLb9wmZs*3C(927!d5JIA&7P2jpd@}<0BclJcNdH<) ze=WYhmegNM?XP8WZ8`q6eEwSDf34)dR{meB`mfb~ZH@f3rhhC{fG(h?4L}WVVP)%L z?#yCq{>0qY%!EbE^~dj4_F}dU4t7#MU*hPEgj<36%@193B_V(j)&!3tifvPc^8DcA zq#O{NQbtm`HqwwJ#yl+LfpFt$102x!uRqsfY5*#n30*4iuUkPGbpbVi5zgeMe)YhM zznwoXQA7#MtwRP~+H;btZxa4w=8~xm?0lPaIcTqXV`6_NfQ= z!0&(xZxT=V>rJm>V9I_zl_me{sj4cN!k<@G^Xr+F37F!a&kX*0=H)k-zrFP$go(qo}G<@odZDW{;&7~ zTpzm_JO6llz`y6g!AEK5Vr6G8%+ABd%gM&e$<5F5;}I7h2M-G1&+-5KVPflGYV(-Y z%HGV}o%N^q@w3=ESVCR?dHyEv?7ZCn+fVTEL)v)&>|8$&4t6fE{Bv_~a{?&Y{+04? z@9N^>Vd`M_&;H*{um4|qq_3*py9EIHTr<-x%vknt|Na#C2M}ocQ}1btW6>@Gfxdse z1Pgu%{-+g<=VuzZBM0ii`(a1_-F*Ia9+1jJo#ahARsP+hH6HYr@A)=4a4_9_;o4Nu z%C>x4LvB&ShQaz(d{*%@0hhezl7qU{An}bN6DL_1iAYr$-j3?N3_C;eVVHdVbeHd- z(An8irJjYKbl2q)T5WgX)7SvS0;Sn@TM%$J`bAIgaI*?$ zx#7EPG^Yl?SvvmFonj(o>YP|d_umosGV14=p4OH_-1djfv`^$7)ZfK1U|BE(h$in; zf-@9n0o^dYCAz~{hn;!OZ>n4m5R$PISFSvr+9}n-N8q^{Z8!hXk^MjRje?TglL-to zPE(?#q^NJ5x=b6e&AP6nmb)WL4=l9m8%z6duSA&8gi}3JA+T8zlMI$7;L|cG1FhKh zod=dP1RLdu8+6_iI6J3mOG(1UI5H?QOd*oYkYm_z^fPvlru}t=e~y2bX zf9!wkzkiAS$NL}bKQ3+-Hg0Zi9{xY(-@l#xC$6rdBB`kM-y#41h5g6I#=-V?`;UVi zZ2$fE6Z~WU{VNUyQAHUkNmaGGKZ)S|BlLgt{~!JT@2dYf_<1;ZI9d33c-a1gfBp^i zzr2#T+<%k&|Cjoo?U(-l@h>}A{<*k#*#GGNKllGX_y7MH|BwHV|M%~C|Cj#nlK=ne z{?E_E>505{@=ew{@FMsu(ceb*(q_lOgq@>|N`6nl{vvdB#$@1V-jk|1=F2*Ld=9Dyi0+itI z-NoGOKL_FB;pAh30ECC{hs8i?;^AWcm{LjZKgZ(X;${2CPa|P&YwluB>EhvNF3d?u z!}U+k{ZBs3^>f+4U&J5%|Nl+@|JnclACrH+|K0!N<7H>z;Nj=|@yj0r;NMXHvpCqA z{m>d2D;PMg7|VC%PU)wjE2h? z)1K6%Fe)yVmi@$!3H7)iPzN#41bl@qmi(qlY1DYi3%vlL&m&J~%r>qvB@4?zXbWcS z5CgR?xoqt;X%4HTK0QY8*e$@>ly=}S#1o`03qSX(uib1n8hAl?q~@*1$*^^3) zTy)Ahn7->dA#>nv!C?A6NV9e^UjQxM+eGeg;SiopNgkhZsmi zj(J|9R``Na`@V;Vy+MQJyev0WmQopaNZN;BpqwnkKyAp51JVv|RjKd2xFe?3JW`N& z%osDI=FOf_@Q_5J2S5y@BkYd+A*GT&S9r)sd1C*=#;r1xCs%|c!Srl`Pw4|rAO>Q4 zf(hSIXFu4$a+}}q6TNBc@aNlI3B+mmeM?@5fwo`D+P--3l%Ck8Ew^*EXVd0O z)86e{&*YQu)#Ne7AJRb#6hvgWFqoa*eCs2J{Rur&R0R>Ny!hf#QW|Ya9H@KN4q_mQ zP06_n^{o{e!qq?kmQtLC`QmvoX3|~RoK;dAp~eT08(K51-Sss+%UN(NJ8qNs${fv4 z0{aYjNw*mnXd8>BLLoOsSNXK{Q(!6G8O$?TIbwTPe{1yly2FjK_ z3);dk=sWnN=Nu#5>|D)JUcmy3KWh4}G&qvu|KL_TRxkQo%a5c??gjF@fpa|VxG2-? znA4ywjoN!#OZ$R;@vFdl5D0<_nih>u%zhpuTw4tg` zz)RrwZ4ee?XO7Z~iLB-9g{}7R4orDEMlRYKUdmvQGS0gBdgOa~I4jwg6N= zV+OQ{y_{M(#%kNVKYE;L4L9s@*T_7VTe}f*gPoPNH0R7Y07+|s0ZxIBuYHrmd1m*c zXOw&ctBecm>_qM_!lUU7R?5jUZxFlF{wRUm|lpAov3xoeoOLJV~2OSarW z+b|YMVC50PAiUd;Xoyi3%2tC;fhjqH&j1TC5VET)S^p?^U|*)!c{I^Xd~1i`^ZYM; zuZ4~b?sIVxSl8D5a&% z!#I))AC3|;@}}iyJ}`5t&Qv$OkD^{J7Nvw3Nc}{}oG@5R0f+H4hUM<1EfS1Ui_i?} zSZwnUU99AY1;jw4RY`;G%txBzSiudp`D)eA6kI<&GF?VgH#M$9b?k0}T(5};233wU z74^NmFySu+TwqymS52b6(M&T{D8%wYID_2H3Rp}BxZoTgBNd;X z{Vs@&0eIyMF_3f+74KW>N-@7NnOVdV*W%1wbl#+??dE%RN46nhx5ps{qJQ&=Rg1a) zz_5XBreY5#t}Wh&VS>Mn&L^)d&u*Uu9%3MyytPX7(c?vnzI6`nB;+K3jyBouhS zKiMH;yysCr?NX2MAvb@|cYpce^J&PxY$bctHUE9t_HS$N(2HBjV$>LCw7mr!U(t$S zTX0!KGeQiMBi>HgJN8;vsZ17-Ma?*G*tYFWIZ@0>wp$(clq!T9Vj%g|5treRxq=3v zFVj!X+@o5rim28iiQRR!RcANOt=k|5!bP88*sXUG?6GMyiJPuGdPXrbywxA!Ui63! z&$KLA4Pqed$6Cq+B6e>d_vzM>@}#zEM;uHxDSrEgkR-y=T(FQ1F;KEQ3Vi5(#!}*f zku%Z?Ej{OWl8MYFg@7N?fvR^CG9KgxyD%$kSJu`Lm%3SeQ~4!^Da1ewl~rHu0sFOi^y98RaK#=>I}MmAy3+J*=1V7i zSl;K5-$s-QBR|MFnLPMTE=j1-9kv$aluM~^c5i$=RsI3u?NP{$Q8M8?!!)-hyPP2( zgTwLt{x-6aLc(4vrL~fECDY~vh=DW)iC~)-F)gcB)NKyOdtW}_knRcdRW+jda1_zp z|GEoeAlQ^VBx~_Rvr+X!e3~(1TxGu{!}S#&jj=taQBn8`$Zu?);CsK%KM%}*yf7fj zf|A%HC!US?zu3DIsGi#W;s1Rb3`LQslm;rIxs;?LO6CxWG$>S*G!P*}%G7`&QIWBP z$V_AinUXmrGDN0Ii6lMueU9@u&;P%E|9k(|?|;r(&pPkdx?6p_yVhr4d$+Io+S`*= z6(>sG?&~vdTA{b_A|lu8=(lrjGe_2>^r_pODj(}`>-{CAk~x`L=MNoU^eIGeptIR^ z%jC}6EDt?a+ipgnjFM*Nl=|@cr{7MeR1ci9Z=dixd*9W>qP`18oZdFg)^dhw;KCu# z#w@$?^~Q_rSL>qRZdS1u97v|dZq&$e^X`3ntt^;|K69k?6RTksqh|G6V5kw1qJdXeb={`ys($_zul_VV|bwNnkT~7 zAO~;jSoMC2n%9XwQGIR)x0YNH|2(Jc`yTywvI_^ie5@=uP+67N+Kta{Pw6<0SCiu6dWVM8pWUv?oA<9caa?l# zJ&!L6UK%gH#wQCO91m?HzfLFm(#EXO6Rw_oJ6rSPejB%!Z^HHzq)#|4He|5yJG-NI zf%JqM8}7|==&skWA+uILyw6Xoz%OlNR<<3x==@CKi<$S^p0Lufbh^3n&h52_%@T(i z-mmU_-SxZe>`%2ayIN^jA7v zo8L|A*2j=nE8dlstv1#!O~`j|;};}+U1V`-)w-KreSIUsOzhSTy_x1ae}Zj}C_8J~ z{Lc@DT)xS>Em1dHa~N+z+dx@Wy49EUx07z|-#$EJ>R$iwyxn8-ldoNW zCOFW!X2r6XKTD>W_&#}fqr>CD=Q_x`SjHc0uh=!jzA3dSS#TgfIg5iW0WKQud*4(} z>|>j}=D2Lr0_SU5T9@?l=gsgDzLp)@XXDD!3$`7`pP!@}WbJ+EbZE%zz(Mii(#e$z zj=O9W-eFg@kCpD#sV2<1R}X84T?cN6KQr*D^WT3xwJ2!*&CREs1P2Gk_3 zxv%OvD07m}LrL>Z%6T1&-x+N7*6vy+eDR=c;IT-VBjqu#$NMTyzddA}xxeSx;D+{= zk#pAcK5u63BfJx#)z*1#>a)C{k7o=UR5#X&Hu!FfS)15Bz5Vqc1>XZc2@dq!Vz$wP z%uIbv%iNTvm&1({?#bOa=>I5orcAl^NAWgp!q?Yq3ln|hQ*QP(Kh@7)T+Uzq?1(!> zk0y-Vs_!(zX`-a?)%Am?Uz+4UOpeNq+8x>b{)^FptL#s%>-24W!hPk-yK2S>-^y?* zs<6T?!sCeEQcaanYG>Bv?;BASRC6F?t5Qy6Q$~#Ni|tsN9(sSz;n@@GXT%ORj8pg6 z8u}zS^?q)^wk;j}o;eF299K!j+76l7<*GvN){Ne#7T>Zws9~~fRhOf~dmYwLEPbRX zIFOsogy6n?9gRAc69PyXBTwT^md-2e69c3nuU^S!pF4syUSmmpMJbN=Sh@Y$p?dbx~ix5-uSZU zR{LGi%@bs%dkCM=GO}!3u3d2~%dO)Ddl#$a?W`_bka4U1@}=NX(5wt;;WJv*cUrcmC82zfYHdk;U zQ9(ox&!-nkM_6r_JpA#S*1pgFFZL)umYkur|4HNKX+s4E>VN83anzex;^T(RUB9w< z(&PQx4r|rOD@|A{z3b!IZ>@ySjOyJmcNiPDBlw1ShL%mtAk8nX7mQ_#zgC!?-L_-5 z*F@n{_1>LUeX`2EV&7!q=`eKRg!bkSZfzJLJ6-pX^q_rXkM9*;9}WDzB<@AYwAteW z-mR_Icj#q0)xx2Ek)rw1+0_px_sxYJR1JaMniekLhI4`QhW8^ zgk=_&AL~%}^tQloMeT3kcbkL1_fJbEYN-Gx(k4@j(?Qz?A6 zkJ*(fk&}s~-k8ZHGrAPb@{+b3pwKn6M^$|MX5)8}39E&7Mq_M`>5M&KJ?QeAjMHC? zEvzQ5zvR@(GNiZs>?;b%*II<{hpd*6+7*^Kt*b|{%INK4))6OEUtNwmBrV%#af|kD zovwld4L+E=?qq56LW54dZn>0i=vvu%?!lW6?=LhC?k;h>U0hq?Lx@826Jm+IMJCtU zxHjJTwtMb2-+(K(mWSEr6hE`r|62GC1SOL`?xp+oKg;PG(9iCG>Lg#qlDNwFRFBr) zcQlh5FFX=H%2t0_H08SE_PKkemmTXIzDEC<_;Ztr(rW`Jh2B5a99$!ObA|M3%L@%7 zEn6Pg*o;|ZxhlNQezsW6<5T;dtrsp`AKX9I;KlAO3WFz9 z^*?$#Z{1vJmG=V$2O4*F#LQ=^odyrx8Z^yt;l5`DZcAh{hJ;L;({ENvox*eB_tDA6 zjhY$T^9RVK)^Bn?ereKz$^|+uNAIlM)=%E*`j9H&yI6bHC&i}CI?x<1mM>?g((Ije zSCrq^hgH6SfPl2Lib#XBv?wXv($dn+&?rcEH%NEKP{YvOUBl2dz|af~!#uo=XRY6P z0q2js*1hg?&fcHv>fdu&+vP~b#%~ivEN`sv=ivqGJX*sTbRIr08MA{{%<`@;UP>4I zp_mX*!qZ4Rb=B$SE}W(5{-dbXWb7WEc3{42G8V0qxbT51MJGK=%)|=t* z9NtMwf49@s(&v9I3sD~H*yQ}W6~F}U(Vu)K_?1EGQVhY&%O4oO9ZhrMpwB?#|@Ha z3M_V_aNXs(xVry1R45%>s@b(C85r4k>6pRspJzgDzpr}&)~_pdiZ_SEdTzh%rHTQB z-k=b>*ag@uyx#Ng8MlF`qQA^24GKS zL9$uZZK1#RiSw`REA5BzGAo6YSg@_xUdS-Ij{Dpz!TlVH?cu zhZ+EliShI|eC5brrr)#2Lf^ZtMOk6nGTd_IcurG_E;?#|8lS4$?$K#5>IaF;H1y&# zWzTV{vrv7rOi8X10@dXmPTK_Uq7*_8aG*nOD|^e!(?XmW!jTru##uIuBx!;+h{JCV ztM0V9Lh@d$r^KCgJpA^py+^4oN;hb*+OF5C5gG=4-$Yr_Ru7$m~EbkR?&iaH7O z@CR<|x?DJ$K$U?`-OpsL!fYV3o=fI0=ps0aC)1SY$26C9k9*KRR0Hm6y4|X#R!d87 z#X+n?m9OQfqv!4Z^ER~CZ}2H;R`aCe@bDE3+UYPK*=btDG)M>W`Er?zN?1~x$Z02G z|0`>=?Oc2jyz{r4jZowi&)KKrQ@QQvP352cwgtqis2a7SQaJwA(L;b!M%;)VN0anOruSS0^J)rJ`2BN$#!m8S;k|r zBllkYd;@)U-h<$b^jn+ ze{gb5L&vlxlhgO>5a1|3fh(4?MNZnH>ZIk@uUPS0JU~ucAt|?S$hOe+m0xuab{ST* zkQMwR-=60Ifxt?x`muk$@zv@kbu5AY);_s=w-G`S*mGOqDiNYkZbbjy`OLF>C;V`a zC_%}q1nJ(MZmp-jej2>-#nj4B&nxL9JfNNbr~Z&#D#J22_9dh#)n0_$*uv}ciZS9B za50iKXzsV-p_##;V>4b{UYns-+^)b>0ABTy^a6SiZeT-1b-NBWHcw zVXcWf7(PrV$X2rWy%C?qn&ZI~s;CkU5CvXtRL{>k@XI|ciR-!Ln({}n^nDB324}F@%#5Ub`bbC`Nxc0#!s6u}yv~PiqV_kN2 z1VYy)>g5u@!R}R*<~>I3$@Xrm7h%L8K`J9se20zMSYGv}`SKx4INi295W}Lh@8giz z!9sIKM9Kc8EQ{M_ADe`ekcs!CD%z3W zAJ=7qx9z#$1cc3A!nsTPZSQOsv-h6w7bFQz=9V)&>FK2r&_(Ux01OiG4Xy*73>Y%9wgf{$&(sLR4=3c3o3urRNq{M5o}n}3rA zo7AVf%D2mnHwHh#bCnxXjMyMr8aw)myXw*!ks9mA*;hY2C7N!sQtvwHF@wY+V#+2; zJJH2Tk?R|TH53$JJlgm3+n%Lo$%{Veku@IPAU$7)1(e}xYFVYxMU&@P#s}=km+}2` zrf`a$66Y$uFggBN zooI0ijqGLKgze5UIbN(5&$P|&85*GBT981-_cC5z7S6P@+_98N5aBF0rd_PGU z1_o(%LcI{}(Y=P9eiCbU@_U^Qct9#Q-PMQh2$!ka6-3b@VOWj5XJKQ7PJ?Aku;Shz zx4-xP%4r%V?E%TL)Z&g2rNauNYE5^K7ijnsFq_H8)$yBaOj4Pe4bbkXIpl)WcX+UMEQ29>fYoBUoJb`sJG7iS!_w2?@c6``L*qX%u-Y zUceXsP@ixYO{?BI6IvSwMJ|V=m&j##ZU$`*GwYsUh(an3p=RMPo~t#GLOs{u-u=24 z)zmNQV+-a?dRmWOwl0CWuPO-IGXL6DRogN(D=rp-cXk29&(X7w`@c)#c1HQN&q^UGUT)8*Z_l2*sP38Gj| z72rH*^R2H|>#kj2pH{QwYKnLny@}_cC-ONxpQ}#^((ij+C5lQ=6A@E?w6bebmcI|u zAfcuXQM_`D|L(S+-Vlj%r2538OLA{Kqu}@f#RVHeXNDIC;LB95iFbpRoUg#In{T4N zR^Y7^V+t2(_rT)gj;Y%nY#i?%D?PV+SN`3Uh*(_F@R@hfA+5 z*xQJss$y||Q^;F9!|;+Bt03_r9O$Py-g86ufC~C1nC0M}u_MrWBZ@7i=;pp(pD}~n zYkc09?V*XBf`j$FUe&tIX(kU#eQ0ZOa`RC=$j9v=DEE!5inl2AouSjeIu*1}r06)w&q64-e3*Sq>e+Xy1lsr_k#Wtc0&uJ_;dwh|ueolzt?iXi_a_3= z1afMCFAVNgM$`(-Zw`m+vZfLTp%w*3hOQjKu5w=67IwO8TPGgLSc49Gu;U{?v}w~v z@F}x564c1k?SlQ3QK1-*)tNW_awiqTns|1M9dwlO{PUg~$M(4;1@$rH-}j2VIrPb( zT3nw!ecZmU_7Tbctx+|i;?+7_>z%xmjdt?(6@-meT#u;7E3v&&ylAq_Fo+RpGj{q{ zAueX+h7(K9&oytbPqxxL%9_}FjnmmHaxx1y@T*@rX+I0@SGnDp!81&e(OIVzd0&Ri zo3ZCyOyX1k@E+x}KXw!)pA`jna)+V!$G(n3l2$mWB9mPpBqEZ3zVS=1dSr~brwHI z2E>vjb$g7Z`9-Ry%v_gZQA9zTGE;Pf5s-)*aB4aI8wYU;==ehU?DE!UF#gQGU`TLq2jC03AE_qpy18Cddv0b%B&@cs z`ZSf(`uOaOK{y*2!9tWRjEzeIDm3?M*9+&O^qa8(5{92@RZCD&>+L%O$O`_0Fawv< zA{s;<_vT!Z5Zhpl&1-QAYx^eCNSkRjV~ElOiP%Tb9o^$qW{<(HNW9AF{H_tDKfki4 z7|)Gjf3T5?rF7Mst$OPrR2PIFWGR1hxCE#VxLnA$fX3j$W3yDOq3?Fwi(x5#NA3W} zWB*Le_Kg%+=Ag(e-_Qq|)~1u}v(OWf398lBSVP^>km?93OeSbyfKl_o*AvzA@JN2! zl8H%*N8GZMPklco4OuU_p(!G$1MP&QqifcN)A zualb$O5knlXUDpkunX1JbZxeems2d?5EB*4-GaF_xrN>)CU*>zjOwegdgL&prTcE% znIj@$JY`QHxp;-wWx;J+4KQON5}Kp8LupsJ=UUQ-$V0_o8?tp)$|)_e_!|Gw>Yu#M zJO*$$)bci_9ZOjJC^XW}sFO+jIyqJ=nOhVYi%UR?R13IQDJo0M++uU98H}}MR1@or zK2*$Bj!xYFYq4xVDlX*_kO_>GH1Aj(uxr)U=@a9kg#)xNS zwz2u;NPt59Q?tim>7drX8W9rbz>z4>o&?VU6pN}NOc$GOX8fOX=Mgz`t7%}3*@z84 zZdzwkilvsXWa{tyM=ST4v18Q#$ZPaq2gxs?^VuISY;B>lw)td6K;CgxmZjO=-O{JF7<2sg5|FNB9pK z0BGKK6W-*-2?P$cbqrYKY=_0;lG!)jB#parsD<&^&H0i(9Q{?7-E9AJm7RNB$H}E| z8C|D12X66LC>TgYCaH6d*BAl3eYVXu;qfn7?Zo2{T>&dgN=(%1Hj~Cvw}xtN4&N`1 z%O7T&6!0~5a00|qF1m?ovZEroXiu^dTLBu8tFwd7t`tM^}Ac&PY#>g{0<;s-%?Cl4#ZwXxhfm|Wx5$yfy&5?XH-sTCv@^kz*wpIRY(19x&D{T z+xDKnj;RpJdex^qeCOmQVNH9k@~c;EG$}>3`*shv)JF-B4+Bd9Bu24Ice>O+8mYt% zYE4%6M<@TQcFVC%Kl3)Jn;lc;En)MeX6}$2@u2au*dN6>*)oheU7@@8K;#T=AbD?6 z|FTI1tn0V(Xd>`d?-e=^jZHP26kIR%q6G3{2O~Y)Md0jrri)uSLDbkD5hUUgH{KUM z%Q1V!)y2qUUl~{kZEJyTX~3oGO7ye_A*Sx}`o{-aN?Xpr zB=nz~uGd$W4{Mu7iAXkk<2wSWb?PtN|1^5_!}s!w0YC*BUfctO0R3*g&z^zIl(LaWmC;m! ztRGlxs{WeIhBvS87KwbVY{xUE(Q1IqC7~ZpU8?u{Gw>ONKhlDQha|qQ-frF+q|17k z03R^16Uyl%)QeXfo#uV}*Y}H0BE0DqCe04kH;7zvxHNir0&vk4RaF-Ya>i#Ix<&d| zSLYs9^S1h40F7=7?-r zpG066&zlDtH3-9&^~Ap;mf)!Kb_^Bvc8`;l9f%EEjksDyb&JTd(qRk9XQjNNkou1!wQbFvxKr{Z zc=;tq@a*a;mvQq{W53nozqqu~`o++l;AjX@CEXE)1H(fMpTFQ~hRmTIi6BR~X<`6aYZkpH5jC-Xj)u-|c+P}HzcKXY3C#;ABvXPAhr7sK8x zSYqSH?A?SJ*C@PZ#lDl|jG^;l=(;bABLm}_#OgQ}o$$GE@822FeojfOr7Zd`n}Woa z^V-v!r}$#2Xyn`I2SeCTgIYFVm39+l zr``Unez2gXzOHu7ET{0UK6LjE_6?s?uSZAMadm05oGybH$y_#jWD*3f@~8Hc5?|QN z>CMK6H!GGBu#<`#=eCcSx^qFLjn`m~-}wQn+1$_;zwS`J`TlGzl=)&iE?k;3qp@{z zv&rf^9By~Zco^5bDT9If5BPza;pE+NMt(?kkFm{?;T>YnR^mSOq!o!!-$eZ}TE1W) zABX|dZ#y|&&4w@LFyZEYQ(p#|FV12EVo#9?2@-`Uql##CXb$Hrrv_Maf91Bb;w+-Yr3kbr-bL{4fSUwaHcVCbN0RpmFaa5X6e!79y0IjfHg zEaQ+f$jwgI6Jbtml=tR?^d@0T2v^JOg!y*uUpf=v$wAVQ&YM#4Gxo;=$Szqfw(y9` z6p=V(Ri^$Fci+SQ9TWLIwhIYBCRcamKoG8B`1eH5f;W^bH3Y}e)+)N?p`bV9U|-)s zR4z*Cld>O+F0jgTVxEE52q-Mhp@~>M;CzhYuRPA7)ZJ(?h2dU@$>*|SR7NNb+Octt zsYSx_-#;j!9?eSNY64shP4xAPx0RD}*;`Bty|T#xu%wFymF1Kn&K}^vvGJL2Pgy~% z>5O^B*a|?=TMgk1kD|O37)m)N{036t%x#Lbo6j(?8iyF zT%@QY*m-lNzJ*BD#Rx)O+y-P-Z9Kl~LQN&gEbY}Q-2r&0xw;Y+ilcyx(; zhfN~xK8r6>@M$Zn?3I1gef#Wx>wgvaUj_bG zf&W$D|9=HGB%YYKe>T4`)i@0v8i~&aq4@_t-M6EU+T-KP4&jplj{#;3BxYvZ(PsgJ zm@n~gu5ll?&(L`R0VH_Qzg5A%4;KdZQ0$8A<4Q_Vuh_@NIL4xjSZL7CJ3t+NB|e^$ zI9Z#5vt1JA${XO)hs?}O)E#6gzh+t@0NpMjPMwJwUaG8#Kd0Y?j`bAQq=ig_8y>Jj zffy=_7W+MoJCm&grXa~`0HnL<7wgDRxZQ2&KSyPtrU(d{U~ zJQNz(h(tC&t$Jx7dwoNg`c5uPQW#(#vAm~Z{6B9!N+d`$ZhZ#3easR z!FySx5ZpMd?&I&mXZs4e@8D#m25Gb8G zhl|tY7_~W-XMSN=GY<`6ncFf-WDf5g` z%LfZsxp}`e5+ACbVK`A5DP?Mp5wq^)Ijwp%=!HTROw-d#pP+B1zg*pt zR8uIa3MCb{s-P8$TJ2`;{Ix!23;#7v?cnP~Z4$;)=m24yMAaSL`;%NkLPF6J;0(?M z>L!x;tRL$}$3@HeONO}}G+#L^bDQ9q8M|wqc4_0rsLpNUwU6VoQUMQ4H#z~0;Cs*k z8ukXv8Muk=d|8q0k)&qe=q-0~Kn(YcFgK>?n$6W$Z(GFp(IANWZC9WaKzLYZlP zdCDT^SA}GkN^d#Rqstq(7COhF!c6%C;1aYfKx?jgJiVD|KRn~Zxx#jZ(Jtct9%mU%)AnVXp>BL+O2Mnc<-`Nt@RiHbu$-dLHK4&CE9dJ&}?%E634D z(`xFM~@T>S(+Cn}LaoZXu=P7sJ&5P>%UGS{%cXM+@s~Gbvu|3_5MuF34+|Dx2 z$;T)W;sUenk9Frin5OTc*0QWQAh4BnCW{0%)Sm(=;8a_&AI?j`xwyPSqj{nK;jSu| zc@MBM&G5=`RP+};m&9qEb%9!Aaqy zWztNIoBN82y!Pnrzi;QO&QrNS!tAa2q^-b@f7U~vd{)v(m2 zce_hzKlqNW#}R)&-3GNr?G!q+D!EYedH78IF1f42Fs;uFkP@HMo=GcXydJqsiT*VV zZ|zaL^t%03NB-kKS!%c2a^3sCF*7!QH(rzB+O&c(o} zh1KMhr~WEPKaFSOwCw^@V}@bJU5W@i^XLWt&oO%+TDDaL9?y~&!+>OSjwv|l=^4fU zd*8Y7Z@Vk!raYevj1l_gJB!^x08npi_McT(f#awYfIgrUczfi`&o9^Etm0-o-3+y+ z5H+TQ{y0Q-`pTDJC(Z}T=q_t3&KsL(pS1m`;WlzkOlN)stn|k^=CmDyAD5KO8pxWw z!dG#?_Hp$%bi&144@}9*9i!0Nx*sA%rV@Mfq*0OQfPZwyYU{d64c3N%7%1Du~$`ySHw*bu$AxLAA=I4(Wvp9)Nctn7=zO(Y5vmEl6+z{nUY4)6lw{3nrv z(wVyJip*pwd9)jP-FwBmqTFvKR%B3uR(uN4d^#S>-99_Fl?BdrUu6|9Y^-6v2hg2z zy!3x#SibD4G1L03bzs)0+La?vBf`l41eRiZ{D-RO_U8R2Mp+YX6~B z2%FL7zMQOE^DP^61(W>l8TrgB7a}LCJPOj03krt{q+|fVnJ^x@o~}is$7bce zB;Xno^Xn4c=w7o1ZY^^21WYkho44*IIwu&?>>N!l`-^%C4!EtpC9#-ZLHoJbN>?Y8 zKR4O!U-sgX1$By=esf!_rnUT_6>x;k=Qc-Fo;dnNOT7cD10Uz9M7gH3*Zu08zjP5@ zqwok3Ab7cNH^kd}u4vcnNgLXf1|;)KkOzr3tY(4aUFm5fX2Y|K-ACPS29B(H1vqfw z#A4%;A95NEpS);|`Ee0mi!_Sk-p$F2=~tC*@sj(tTGa3eJyNZ&!UUdHE6yrA=Z5se z5n?OFvcm(Zc2x(*aC6h<+6qluUbUL0_moBZ!--j^{==`Du9lE%Lnc4vhoZ5ot?!uj zBKfoxmH1y{qDDOSjh9ni$BMX^o@U^CQ(7;RFxq@&9d#h2PHQUYT6yfs>4R6ilG3TC zr>ju?wM%piy*$f~pUv69YV)(#68c%O?sT%7Ydc&^?bYH)0PjE3Df11_ToK+9Owt5m^;p3cYJx`+Fsw2+n zd1S<}ZuDR`ouflL;Xd{W$8J}>si-#cV0|lboj#Ph)5a`dzS};|cPV_`nxXRvVq9o0 z_M@oFBR{JJ@`bD-lP;pl$7hbr+m6)*Qc}x$XdjUi?J?QKWk`y<+aO)Qs9^aD*}M)~ zE}v<28~lyfxBPaqT*`Voc?L^=yLvQf=i{iGsI%xlFn5p%uc?;M&1mJR=?XxZ)7O<+ zk!ye*p`u^-_H~+*11wfY-kLc=B#WX4T(v8gK8y2iP1It`Sn((tD@;(EROJflD3Ttd z7RtB($tP6lmo+D@YdHFD1~!`nA%40;RLX7H#H)!(z-ujzy3&FYlS;BtN7vK~mQ_X| zi;gx2MA9FhBtBv9EMg?A0%S~Tss?kpFnA2%R`A|$O2)bIa$NO=1FD>2FUE9EPR!S_mt%OfA@5nJpaz^?oj%K3 zB=KH`CC0HVukZn2ap$k0)(L`>G{|MQ_Sim{t*hChzPLBQ%_ehJXT-={Q^M_Z(_PN8 zAZj2kBruX?1${Z2k$eE(QpukC!TAxb;d8%{ow6W;&1Z>~(oBZ0*W|W| zj{~#^+D)(<#4UU1Wi`nD+aCj3u$n4lDH-h_gt1Znz@LjjS#PwUv&TzH?>z?BY2vtS z05!5-c80hc#3}HY;~SI>Pdj{8`feBY2OYFoVK=7h_Q8?_BK-b^6v#!u!!ofA3oa@d z7H|~~TD4hMo3OFCx0Hj*GlFD{;0qkqyI0G^gd*i3RT%-JN|GNsFB5N&(z4s9quDjL zS<}CSN)M;c>2wMV3a}@ADtKnwD~6`$e`?nxvJI@9sIFdByIve&!E36hk65>P?uDAQ z^-@=4=U^cR69$)E)B1x@JYjp2PiDtkO}rJRdxR(A+PAw6A8N|1p1yVRhmn-~8asaS zto5ga{8E>ru7%guShbLD1C#FGHP22NhatAeXSu^X`TJ$#tb!|aHijhyHHX(?Uy>3! z_{EXp2o;Xf^x_>lnQRQ`T)p(?d-7^a`SlIf-7ab<8f zq~w>u@u2lVN&uj8T^;`2yP+bt<@)}bKGc8g<~H_CwgHpFb??TtHag7*HmfWU@%P&A9A!!ypC{q%~HWoJ?z^Y6d}Y`3sl!OIWCsGo*%@gR}?@ku}K`wWj^+iMVsOf16~DD*M>`kxP~HxMI*6Lv0}R4+zPTH!uI zM?n|Ci{ipTRGNuatZ)IiCjdf96*ry<@ZOfPB`4lWZRYgHieolE6a7FQkS=3p{<4W ziqSgl^h$nFTwMIEY2DXmEJ_}iXZ<7pfu=vm*p}`u>zB%{KEHH20oij%%d21c!V3nb z|AdI}%3o@NH;DyH=q9L$S)y-e1ZDn_ec`^GKbiFX9U3(IEikBe;69)v5O2Ekg_C08 z-WS@VC&_r1k|%F~*CxG+-&U$LPBu=gC&XAt!oekL1WOzZHjYr;!j?sUOeA_vJTp?4 z1F{vlhbWk^cH=!rzbXWYw(>y*y|Asf2x1t2gDO+aD7E&YE|OT^L75&#YoE3HybTAX zR>NXt5?h@v1?i%q;_X}9)W5b!B8hg|`Ked)OSm3%%%-R#`GOb=F{2v?*VD?w1EL!R zKm6BsdMqd=v*Jf|2}d>&s|8Smt~sZT^ih!_!=KBjOHDcv-nXbm-u9PR&LIk=aulzY`+B)}f9VnnJjVU}CgaPS3$O{BBUKLm_Bj2wu-B5m<6jMb_!X2EkeQqJ zhk3|qvL#@$^8Deuv9}A&spoqUXcBE&Nc+AO?Y~LKU)ma5g%sje;sP(N6ja@b@(E-{ zm2R{u93dn%wH!PrW{6?gH!AeZxZhou9%jG8%w$3_EH{7l(+J67wYqtf#`f{^IQbn% zXiVjAnEfRT=*c(G2Zf)O297%O{{~1LIFQom=noC^6No}oEMf>ER?L@l2)|;R&~1!F zRz2N^7C`r9s>WT~8Wna&g|jZ_LRMAirm^Kt!dgshJS_ZIzl$8X*5ORB5odf$qq&ZW znI#YZp4s@%o@bduVH=U9L}z zuA-K#!!@&hhNOirC%f|cZjnR3m+pq4Qbm6y2v>}}QY7p>{FioADt`Cg^hHytwlK6r znB`x#9pr=QE6naxxI&KfdYlMI12x}Dx+#$pWy%eXdM)A&rLd6!PR(vyXz-Bkpw>`n za3XfuZ<4e+i+&|9kh3^M6ZE^A7Be%xB~-)N!1++L*XQd}Jw-4k0y8m+^JS2(%2;Ajv}lgt3hmNi zg7&CE@Nx%0d^E_mIXLsFVUvz({>2~*Oj4?o-VQFH6ScIg+UfJ}7V5h(>5 z(V**j?Bq9aG|&R+l%gDZE#b7}Ek1P>LIZsBwms2sSoGJkyl5FdEHs6hZUAY}^O^8Z zq|4lr5lb&B#Y1)mgBm&7Z@9FGxjlVxd9pt3ubl_Gu+(_kW<2XdGY@p`|J5kdBGGv> zR&EF3{jsOrZcW%$4kgIPzQl|1Y4%CeTp-^CXx}t$uGA1Wz)v;_FM6}=+QBVR!$i+o zZ@19N6UxlFE+?tqKyxo!ySazuGejA}*bh3adAzR!93g|*tOd0$6eSzK=of^?@@Jpa zgTrG>jHJ)drxl#}CTVQ`ds4Xx+BR1mr0F(SBm+O=1X?1T$dXH1MqlupyVB0fNZ%_u zl-sb(nwI!|BDI}Nc}Oy?I~kF(((Huz@_sDv<5-rT2tTxE%DVtSdBElwitzohD>&t0RX9BDa_;qN z?3vFUdrnX{F&hOF73y~1Qz)PQ>37xDYd30>^7 z^>;PP_?evdRg{C`)}IJ>v^`$fdF|)D-45&y;R@rw$S(G2AP29|jjw$KK3Gk^L3%Fc z(tl;)J-bHUqGz+1`9KUb;p%MnrxI3z?uD82nEyBDd$RmKWXYC=Fy7Sd79_ z{h5FE+x(?_lBsx@l3R0E_}omycMX-}pI`oiP>4ceohwnxQBuzg(xgXSr!qefVbiCo z1ZfZhoQ-`0lJvJV5k22LKKtTxHf+jNR*b!1ZrdN9NYb(4Ws*tOCvIwc;yJbR*1Qsa z8~bcPmJkeE2v|0Ze~i%ybGEz=WH-3u-=8)5+K`TcWwoB0QPuT;{w5jtzJ})4Gy}dj zqpwh%LEorJ=(FR3^O+ZWtbusX8*Hw?<`s$>I?v|)BBgL9{u?<{Q2$%wr$HbT;qJWZ zKZ6xJyzNf5z)=} zoxrBz=HwQtIg|^8NJC!ltZK@9Opz9)R2B@Cypc;vM3oSbv{wF9l>GGlKks;NVs75m zfb2Dn&z4xZmBxSk|BBSqM{v@q_eArDGLSj}Jh7CUV(;g1p0~eo13l}>ugX2NdlvMS z^49ivZ~LqShko<c0xs7LDS(86^Ri{r}kUsNaIO_mQFr7gr-)VqfRH{<0+WJSkXz z5#dT`zRt+cD2lpJMAh~R?bc(-e@ZIHGa331wh?Y`lenUV0}|M9!dAN0{TTl>&c3ZD zG;b3!Q`5xTJ!8T=wf@g`AU!`_tB7b&Ot}iHp~j0YHAft&xtx>mdBSw&tD!W(SXXzs zt!9_j!_tTuiBGK;s{f;({9-Q?S%$<*=cl{j$C`Gg*l|4UPtRw4aGxL$vpr&8AqfUC*)9_7STkng#5Aq7#s6o}3XxW5emGm6$HFz+Y4s2oiEVb2z|L*$(0K!DCkv(pZ^83`s z!)8FEnpFZasp)5#E}8c{_n3Qp1$*)P7`v~%RIVPd7YVN+-qru^==X}*<0vS;Bdj5=OndhzF7CLiQ~}YJ zahZ9o5xGlTvZmncTT#gP_KXh9?=_s`qR|gw>b`7bUCe4D)cQR8&h%gM6;m1#9)ODp z*ss+xEzjHf50q==gm7#8m(Lq%)oZr%YGeJImj>r=&kiZI96p()T6HJAxNDwi!a&0O zPi)IxA#-S-h`5oe71f((q3LAPiSq>9`XlN?gC7|=uspp8Ez;g`)Q$2eZjAo3X!zje zRdnF$WgYgJh9v!tBu4c^@XoLS&VXF5vlhcnOUET)i}}Q3R&QKt_p!6XZ~n2JJZ!9I z*!O&oNuR1LBg^&v-s&j)xiPE=WCN99%T(<8n78bw|0aJ{@pG%B4l&^!a=#d+W1CC;gR3{KmDj{PU=h=wgU4Q6*}y0o-E{{@=6iTInht)eQTS{X&xw^3;F)1pbt+@DoC~m`O9#DY*1jnV-iuBjLrS%*Y|PF6*l5 z1LReI$=JsGUBL$*y+?bE!T7pK^9Ls-`0^lS5T!_qSN)1bf|YPKm3^rWPXuk`8r0fz4v*@7#-e-MM~6<`qZWLesabh*@Ok=J@Vg2 zVo8bP$|^0}so25b0VAd`@%IA$Bw*aY zsR=vzh_z>hB5d4A>==9b3NPr*#dS8lkc0V)1V>((Ju0i; z6|SwV27`|x0`@toY8>XC9|DFT{CZI1yAg@fgS-Ykz~2C+0jv@{%w;+^r@!nuOh+jw z{fOJO7ede9f9u45(d=YM^pgLkl+1K4`x)!lP9fICs5u*mCGqUByfE|nVytO{72g=} zwdmWuLBnzxOY@&sPT=iSHK5e58HzrZ%qEDMTtUm?c|572j+yhVWQ05)pkF);q@i z1Bj!-{39^)2Z}Y9n?;ojgR*+PF7vMoAg3j!%6pN);h>f4bpY3f-(O}1kKa=|=AmjM zpz6!Wc=vbpuZ2H(Y6s$v>$GEsY>(btskUL~a#|mO@vnW&gKls4DWSU9XOD|`KpmDC(Le`$oV(Xl`7z8UpVp(@?WKmD0o2-{BL_y>I1 zp_2iIM;;*TPGzC|HysOZ#GxSpO{(Q+Tz!9Nr7S%gjq3|A#`{ktS~35US0Vl(7N_q* z`xM_(KqY2eqhGt)&ZXFigYqhMIPdw+pzkiLl4XP9-wo6CKk3&Lte?ZRxSJBa)+OtR zpW%FG-yMDE*AT`L&(Bydov!`{PTx;lp8W{@FlcTQox6giz4_Dqc;IJ!>O(hV%g#`& z+14wtsh(uj;qWs*Rdz&XSvKignPT112Pow}x{Pdk;lrWf&Y|a(V^sN2T189iQ?%tP zp-fd$kn@EvAMH#Irc_sPc4QjW^n2^b`BfC6D2J|}(3$7o>BIz~$y!g8{0CiM5oX2z z)H~UVgED7Tk3V4K73Kab)MIX28sNS1ejrO;or{o&snq4xc_}*8(y0pfeDx0^S@Y)A z_lAzA#*r&ymdhPq^^xydEFq>Iq1yz|g={77oQiM$TdX4G-kb5LN=0Pr0tZLomF#~L z={aA{XkEH&P&|`3uSCEQ|6B5#tj&C_s&?Xq`CcKbB0TSP4TS@d z-)CMN$ME!z!m&S}m!HzAVM+!3>sC55 zIA=&y7Fz!EJG!g;7W`fc>b`$IGR6PJ7n?&~f6Mu|f?84D+>4G%J{CfPWaU6h@t%`S zDv!04xHu*kRx|9l%ArxRA>oS>=|n=bdn$zrdgWQ|OY91|D-1PqL3)>u^4NX;g$wWh zh#;ta@t5-=-a5wj)$~t|PB~&u{j}_%csp`rbWy3&p}9xS!jsNG_PT#`hf^!vTEK!L zqV2tT1K!lL+wTu(FE>{oD#pp>DLlb%s&JWsna6ThBqO&_0qVb!y%aZN`%#4AAKuqK zj+oxopak^`R);y(pN<9Zessl8d!t^sh(vLaDD_E5r1(kp9j~rrXKZ=vPBxyVCtneS zr~dNrkRkimi5>W{rChOd_*s$}$P=NFw{E6sGE4SC{hfx>boW)}A~I9N~v?7Pf8L(90fX(2P}vC>e*cj^2dv4KA1Gz39?o3zOW9Q z^(A1P^1=qGX31-;SEMRUFOQ2^dF(KI%6Vd7W>EaqzTCYIqhPEQ!GGrzFSo1g5!ryO zU9SA|z4MFK`5#$v>QC+1O2srin@iakz~yz{**R1)?dD;y)Mk&mejznc2qMJ-+%fF&Y)lZ>Ly* zJZ6RTa5Lu)V8ZJ&@HWLUHL6ztJ-7I7!qNRLh37A44vS~O^y4R%w@wRseeESY%oa7l z%C$dJ9nM0T3#*#G6U1`*zVsvc0#3bVUc_>J5i^g{!R^t}EXgcNb3Mv?3k%G*NlN=a z0D3@$zZz`(eE2rmGc>MoWpU}DvUAkgFGB8`F@lve`G8-5=N}1_%%6;X!Q0{{G@Bzb^up)AMkG28x;} z#((DFx`_>`#)K9E0XUdNhXbgVwpLrZV9-S3V-ruWTBCija7}4TKq`V@o{I(YDME1p zXt`5sueEaR9iy6aN5IvQY{P(`t>m6D6t({E!2K5@9NY#f9Ngi5Qv*}Xih|q8jt;qM zLy&RK&OSSbzVM^=-+T6qrM%CxHMz!~|ImYzu>r2{=Z=dd+-Ohw-{E^dDtY)tND!I+ z^~*yPKn2cT1aUB_lDyhJGvjvuy}^0n?bmsP?fWx(R&tER#R4#ZSzM}u3h1(PpgFvn zE9ku`49BFi%wS-|KFKS<(wZK|`0z^b`Ve5aQy@pvo;v9F#IZQ)m0L$uqSP+a)C?2_ z&_RNlPJ~TSIr?01D4&L<;3;SD3t5JFyxZMQ?MEIF>P!OkFb5L8V2ae!$)7F=4MxN>BTgQ8d z&{VB7`AzT&RSQ6d*#KdJ>oz*dtT2q(K_16sWs{7x;awBiUr2w3?;mSX3B~b>e}M9x zSYtG`+@$ZsUPfUM=g5owOwqOGfp%6v0j>&zBYljDHD(%PD=yrskgG42>G=oy$;GdUc@C_`5hxCiEJzF5E9Uv&&x+D0x$8p2X(P&Q%&DA zN%Yy~Kl>>NANm!p)*?GN6A-y~R)AqIeYRR&`c%9pu}dkpXm}Xo0ThC^;I`TGl1uMN z^XJr4#YpZyk&p4;-P~A?Y-6ES7IkWypDh8Lp%Fls zZaZA9U)+qBG0#sqg&kj+oG;H8tXI7Dbu4o+;$gd?k52&jKM1_Sg*nsBX3A~x%I{ka5rK1N_58u0pbyS*SflmE!Li9=1L~|LHX#3v(PG1)^NGM=>%8$2@NO zv{f7)G$}f&CRJZWmf_SGck{;wQwh+9c~RxI^EaFKrBI*OQpdLoipi-VV*W6#I~^#A zL9pOH%ss~Sl*Ajkq{WP8VrNT2N_v14R^|US$Pax+`bI(m=Sr8RAlvCbt4ac3vn@%K11{KW66fX4+j*`(iMXgi`*=cu!rt9%6!T~TC^-p zmH{4d8Fx!VY<9ULKnF7@L_ip;Zr(Y3534i;PCgTDZvVb_MiDqZztMm4B?o9s9N3xx zk6@<#TQ=5v7TEF33L&WldtoWd(>NVC_U_j_5?65%=OaXUaXJ7dtgS2v5rlbZBAPax z!QkA>U!wSBo00mtULbK0L#eKl&`~?B&shzC0dq(62UY+6@HobGG=p*6z7#X#$*X0| zhQS%Q{G$5nU8}LTQyM_io$Ax9W9mx8{x%QjmTM$2U}|n}6rN-X z5S{aDbWTjL(qRY8V6Gu9&`h;Ogji9AO#x4m*V}6^E^AC3U;X8Hn?wCxmvSFhcL?ae zGt;&fZ{8^sMR_!Ae@^KQmtpc{DYUWI<@9g={;P3Cf?0zq1FYuv_pXw1)*KY4}KY5 z?7c9{T+BMl;wVtxl-I_1n)Bs^8bwklS*QZAzk`lKkNc&MFis`W7To`Ytzv)Q&a@v2 zG`KI5GLy}V4^S04JZTvybmgq)41S>>A@)?GJ@Q!`VM-H#lYYOP**l0s+rxxVnjY9$q(<^(a)I!%# zpoPGF!|Q!|RKFxrUy+r?1>>X{_da>z1^y)mtG21Nc1-iyCE#)|QVvyUHoII8cC%_x zy1q7ut&+AG_(BA38|#_rn9{IUv_Rc}!0u53<$BrQnke6_gdIR8Y{ zxs3ztchHj|+qs{0*EQxX1m=DS2w&xyj&(pAs3F}tEN;c8$KOEp;&1u8rS1Z+_}(&d z9?}%5t&fIB6qcR<+a2`pnU4hq$s`Zg0TM2yc-D$bh5Z#M(6{$SecmKXE&MBCOY0wW zKwkF|(El0z9bw*~y8!;?!Az@36`%sMT)4f#=!-zPVJCU?4rzF_@EIw7jiYi2H@BOf z{{CVz0!_2NG4SG!q3bus2CqCzs<#(42ITf-3w0ElkDxH5zD=3Fcph!0l#NJ%xS>mV zCqo`pD(t1-HP{~W#qh#gJui<3tnaWJNHVhPrpnA#Q@q@MV>r$TIj~Yf!M;7n@e||< zmG`Ygs)Tl z+ojZzYwY73f`SZoT4er>Mo8}fyOn61m3f(<{U#k{R^=F zGfmmv{(n8V)dZu0|Nb{681S_Cb}M+m8vd5@OG=ZkzXnPx41(U}xlpQy!;u~pdu@GJ zTe}bk8t=IOTB|JgakqF%+6o6pNq&?he)5wX3isPm`9|Rz$vaEYkKL!lBC*XQRL0@U zn-&x4mp;-0f-Mn&zzWQ{IGFA^1IO`S*Q^cJ$?D6l*JtL2CcmBeeU!)cj4d*Yb?{e= z62N>%kd5N>*i(lDrT*e=0=up*KpiIxb#@I0stXB{WY($n*jfC8^mZrrfvEVyk449% zN>2Zzt1Yybn;!#4Fz2E+prJd4On;&zi?53@v!{Ca`ek{ZCdpS+Pf)e?K`v~&r2#>h zJ%JjS^MZ!|&gw{MVcJ!Mf2A`v`q}E<-m+;ofskiGjrc=HE*E%oe`1_&%pCX<&+f@T zfAjaT6f1Q?^0E*PaEsj^9$9xW_IOk<|K6a(W8!e4;{g4aG}4xxRO69z02c7+{tYG5 z0C%4?m&{3I^l;mb%Xy50)sIw@6)0ZexU zaekohE|nIJaBsZo@L8RVqV$s$gF^7O+lVq(w$McU=I%I(VlE|k@1M?;CV``_dRsw_11$Eqh zwo$pxc^fZrQ--&^CQQ(dYK3oSqcK8ogInW2Hah1N%A@KMt^~hh3D5Yc^VL(%YQDp> z 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 Zic(3 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

syF-VF}uEa`dVKc(8 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≷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%0D$s#c)o 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 @-Bd%OIAq-;KTVSfvIKw{F!+ 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

o@;(|E|Q|lx-_kmJ8Gn=4?Czu6yfqDck?C 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 S-`4T61HBrMgM%WEit>NCM9?Sz literal 0 HcmV?d00001 diff --git a/qa/rpc-tests/cache/tarnished-v5.6.0/cache_config.json b/qa/rpc-tests/cache/tarnished-v5.6.0/cache_config.json new file mode 100644 index 000000000..e29dca7f1 --- /dev/null +++ b/qa/rpc-tests/cache/tarnished-v5.6.0/cache_config.json @@ -0,0 +1,3 @@ +{ + "cache_time": 1687307359.731706 +} \ No newline at end of file diff --git a/qa/rpc-tests/cache/tarnished-v5.6.0/chain_cache.tar.gz b/qa/rpc-tests/cache/tarnished-v5.6.0/chain_cache.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..e6a3698ecd5b17ba9581e7f77ad18cddeec02cf4 GIT binary patch literal 361686 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�#_VOOjX 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%0DF%ZzN zAN(P)G)NBg3EOHAOH)0ImYp}FPX4ztGGDrN`rt_%5qhSGo1La(Kz&b4q%{Q?3MQVtTPpAWn#|mHX449tRaAT!YW9-%y6u7Iv_84w{bwIRlCgds+*ypw%?{ z`Es^>x$_Mfu$S4nya$=q!0i1b>T_B&5sDlV0t-p0Ux*M{*Kn42TiH3cr5HR@D*BQ7 zQGrX}ns)mDRc~WNK-=C5zNSN)gSJZgX~xDWjVPULps@pGVDpw0 zmJ;9JG#tnUJ`5u#7;tqUM<^n*$e#*p(3foN3hqV25;PNkTgTGSgJ8$WRd6k9_LjL< zY(`3GB||d#p}o07l;WSmN{fASW8})p3E0p#29}=v2tZq;pX&uL6Y8Api4qS{QEN02N zpDD-van-BEBC?jG)&F5JY%FIFE5`3xcwfmt?=H&YHo~MOq$C8^Tx!%N}H)CIX4n{Llhy)M!)(!c+a`?Ouc#JNU~o=s=f8a%{UHK zgD$19ZJ^!a9AslH6X5a=I%XN9Bv7yT6?5ngQ?cg5kyXqYGONqtCa4mXsAc+FyxBF# zrwPe^Ki({5i?K*jA`9z_Cw4YDDKOkZ%e>rc3_x7bPmlm@hYvI%Nv5NhK%gP3l~|4I`16(sd%1Hw3JGSbAuP0w$k6`mrwm zG1|c_Xy>RwsFf;wRJ__c&`hBCDsW0FiHOj1N(<7Jq{mZswjEF1qKpncF^%zA!3O&T z^afciS?dfG@Sr1~s?Naf4WycD7Jm%ed)uOa3iBDZbtWw1l6>bh0~@`OD?b0}96hH2 z5`u{lyDoz+Vk>KPg*++1j@Lt0Cf_U(w?@$$5hAs-SyM6eqf;cAl{it2tZxDHV{hCS z`#92pp$BF@+rhG1qG%9A%yuu&M4x+CG7WJWuW6kVc{cDUc$QJ)_@xCBi=XWNpxD-rQu1~lXwHXmJUa59aOs}6We+C z(iKenV#bwyigR{GgYVZ(dA#iMe{MyPV%fa&>$_ku3!}fCqg@sSAPK)4GTx=wI$iE;XcNS{_=A!^EDjf7+>KX#i0FebzqmVC*lHo76?!m>PsCZy$H&>H$7@xtFFy?$1WoJLIfYA6nmH8AoGxeqR`SOJY82R?~6XYWrmP-5PIA)S0>b znX%rO!}VSMxnspm>+=nBpG|EzRqOc_Lfm@D*O^=8SrM#aT6)})kr)2ti!Wm3snqdV zgZnxUYzmi&h(kbsyBj962*f9Xkcw~7t+J|JDg&Uhu=4>(j}T2pk?& zAvaeVLk#A_x(lle@V$ryV&e}uJ-hqth79K2^fdxi)ls!d3ubjZqPtxI0a5*+D|+n-is@sqi8M2*|w4vOLANT_@qaPQcyQ{ zlh%nerq(9gh7EMc2^pSO9weW0k_}cdEspI+|7r*@*Viah4wZ7-@4h=Q{5Yy&a0A-_ z|2jTy?#HekRxkb0WAzKAQs5~*X}xLE_t9N(gVmzpNwZaaEU`=T!rrsNezNf|vT~xV zbbJxH;i&_o*d}|^?Q`Qgz^9jLhj6!!LGVOKKRE7dnzc2qvpT@oQ75RAPJ5VwY8MrjnP2-Ccf!5 z&*MnaQQ6s4v~xr*V(dhcS_l)EYr~S3Xj3ojI*Z|IXl_k>B?jWHd{Pg*6%V)E$3I$< zJAUeE+k72x!&A@%bE_g2n>1c4pmm3&{>*UZqyH(nV&FG3@mpbES5gmTGt+gsJ6i5v z=w~JKBoi*_$)3Kv3gs?1EHVTX4ottEEyP)IfMb~#;Fd|qdnq+EKCWa?OUv{;&7)xe z&sI%sJ*3!Q|~Mp?NW#a4IDi zM*%yIQ8gEl7D;AWCK>b)B&ZM-#@aIwhX7Gj*iFhUU9Lv<=ssxs^vGjmyNFy6^+=L* z+JN80FhZ=)GgP!)5tZjZAWP9wC8=4Aft&?rL^JuVv(%aj55>)tBA4%rCPyexnHX9S z(WdQN-mcZAiwT7P56bQ-ShTfC7xc7k+qP}nwr!hh+O}<5YuaAZw(V0ps{ZPZ=-ww{ zU5~pba(tOL`6jk{xjO6)6$m}<9a9#pjcE!HZrR8dUn6?{-eEplqAT{q!>xq1>6lbW zhete>R>uX#ADekA{Xm)$xFM4vKl>-f6kc)_<&3wnbfDQ^k{hS+B)Jk+)3xE?@E!zY zoeD|mi=pBP0eVC-zJx-0xmU(?k4I%$jqXFrV$?kh-|G-uMt%X@*45cvJ0-CN3s&d& z;|KjSn;|}~-9x8Dx9AYP zH}`GKdS+A>ij*qckV%T;Y*T^j$b&ipS7V^74e*+1I1ynGr!b?5JEdyG^9>8eBzYgG zL*|WB#yhm+irhiHsH{LjEVnISueO7r#-jJ!#zH!vzfKGW{d$vzNiCVUz8V+L78f=N za~W-z^FM@jy6;19*N(D`58Q-W;(5BGx}l#K_%`$LtM$ymt5!n0SSF6%JFNP*a`{M@Wz>5^>#mz%qqV zK_1FD79^7Kj|??uv!?So6Va9k^R=N?5VS8^#U$z~uGz?^YSy~I6F2u}wq*5$a#A{b zY~MSz#DaNS;W8Tz5kIwJ-FhQYaHIuW%1k9OK6h@!Yv%fFM7w`HLiK`kN(2{AXFM+> zO)fB1-?kdmA7|2<)9LuVNRW>TaIqDV4gBhnlc1HxN{MB_Jl8orT&$qop#2#sA#zoi z7EB}~*11;1#nz$%Y`a<44je?17eunY>q+8o9#*#%fJ zawM%Lz&F#F$|sExS{=gQQNj+{N-ZDfJtKn2@nnirOCm)Ei6KM*M&+8gGRhBDw}jH> zs)Spljme58lGjWNGZ}}+kpl=k11N0HDCZD35j*ht4(O(lRiwUqJSx=X()4OahLhKD zj97!aYnA_cW3WiOCxplbZRM5BJDbWDeYZFWioIGFf)r0y)47^*t6?p5vma3cgr zCS3Hblz3x}v)tQ-=+1R6#)lt&m(C?9y?fOLI$OV6>tkkU`A9)+DHFfzc?iE7|Y3z>7ce+(%Xe8tZvupN|C-4s_~nqv}IPI8jAs z^1@@15YQmVohQ4uBj}T2>LuFG9ClF+J!Ld_#wAyCDfmS5s#ZeRM-9T{9VBd`exJFg zu*qvcm*lI<_CwkcMJFs$n_W^yH$Y^X4;$3)ebQ$TdUpgs(I-g76uVI_-^W++?AL@$ z#981Z5|{+(S-zp&+NjVhPKC7ag=X{+5d62#pQz+%C^BpvxEd+MufW(l#7)A*?x(*hGpg zV+*~FbEy*325)Iu=AqjsAu-v+O2J#e30>oC_0xC}R zak86F-7)Ns1TpF@_nI~tqdu@D%1$_R(QjE|)fEY=qAdR4sh$Z+J5^K)9E~CqN4TA~ zYU8MMj6ZktTQ$_6YtDXpzZ)J}R-p^y&{hy=DU@w(#B&gyf=sGS@6TVlLs@~pPH)1Q z+ThJLX#)aSTblW!$Tm)pjjOy*Ow?{Fnd`;59+o$-0G`L%X=%!DyI$H(U5aOg+#S!} zHyj%hmoHrIAG{T!K|^?iiOHiZA2SO{R6dJ#Lhqtr1(-w7v002@b=_ss3168V3G_lhyz-C& z8HR3?fN&pX#~$4bPsEl}59^F5Evn0B&<=Ezbft zVJys!jdm_pN`BPhNMv#H!%54bGCO+vS zf^jngzp7eWS#D5u^VVWlrr#9axU?9f&R~2=OO|I&5XRXTs2FTmVzsb0V>lZS7>qI6 zaS^c@OeYgfIF{K0Q8oLzGRNYUX_;}C5c5(OWI-7R>;*t4xQ^?dTe^0STZ zu|Z6+WAN+{0&kIH*;C410#_Y%`GF>w*@)jCTg1tGB zfZvxgR9uHw{b)pxrV|+2gI!+QPZ3I3Q`+L+KwXV3A9;fc{OaI}HFJ0Mdj%0j?&9?b zzZv#xT4+RR00?W}H3OCT@w6Ng@QIV|!I&P;zzC)%LoYEGlY5JmM3wSym3uZD3eiw^NegSx zaAUG}$}*)3oct=C2rntTJcGJXzAZb%H2MJ|;!|z{hmf>4_m>Vt(jIRAEex!?Ky@vr z3LH!-@LKV)0s{e@+n<#%I$HzA=hn~hC`_uRDf&BVfw6AQ=8S30yBa5#$-8J^EGcfj z^1HcxdPEVDHK@-O1u`tr`UF9?u#(jJyxWiW*zkzki(71eYbJT--=hMe(%PVvUFBOz9ZujF)-MB1b zLqeeKTfoc30E~~raaMoEsEY~%oho}mMKF(9HF~N*fT%ofR!oDWZ16)tcy+wm(vazW zuQBPtRCT~@t|VqqZ9-XS&DEuEKM99vYb*+TbUz}_5`kF3d=4^W^gHU({dV+R>KC~ zye+bfr(63?B1nJ;LY8wxIt*dvYBaMri8srh!iAjn)6ukZzMymNp`539i=ohbVZovB z*r(gw8f^GUhnm%J{*znz((eJn1v{Zr6kd~7D z*65+)m^cXHk%pW+M@x3br{x$+><>|Q?QwH$Wsu~r=PM70Inza19PeKJQV$ON-6jiB znwflB7e~Wk=;vD}8U2>0PvXNBR8i{ozBdwwJ-e?^t@pFiaagf7rxx4cmUBs(FSPBK zi@vS$!Ah*^bPjcLKXXq3Ol*{Kj$hiHcg#FgoqCUlVj~sc;pG74ZGa^MeNrbzj$dR8 zjf^(n=%U7ntG$v`Z$g!wq10%Y>mKqIYPifR@6&~ax3(oXZA%ScQXj=H_jps(0GRk{ z&W|J#3Ja&&6@<#uH7;n!7plIAQct7?7$(!vxKO~X9Et$9xdErG*Bt{OJzjE1{u9TE zP*wxr7N5P_336m3;KVDHm&wmoY0#K9;NBu5@~SX%FMzW&OeslZ#py)adc|nEuB`q0A@zE{7y;*LeVHNd z5engobG)GoQ|9ZbGbF~Hx#hG8*dvb6!RBtcMY)1j&uCxda0MR|Y#kd5! zSNe^`B0+S6ddjg-ossarKp`V|hk(niU!mcZCC#leW*IHF=EkW_7BlSffodqDc@&WZ z@NZjm7ZWlvp;hrncK7NGNr}TNTGC~vM(+_@EH5Oh&ZhY0b5uP@V~r^QTDd+3Cs9~e zT@Vk)ezB2MddD%T%{|`2Mh(Gl3*vBb-|LLt;sHY$lMN_0{my0f%Y2q;N-m_zdy35x zp4!?zc}K!At_XMV)Od@+=jDS^rBvgE+cmg4tMbUhv9^ovhJglx$T8G&K;Jic6egrF zy3gjd&@KPXGATz<%$f!XP)&K{H_3|cxue@{|02h$i&OC(NL#iBjB)W@Y6*@oBA*J` zD`07Qc>;-r`>0Buy`je=T7b&}iI3W;r#uzT@&r$w)Gg#06=S_^+kk**^k>8lf;>O7 z0%&%QEZh+H{7Ydb{bgMsb=i&Qo5K=shXI`6tQXKTr~!DTjdY-822D$^h#U@mOnH3a zUc8qwNu3+s9deF-3xo2DEzyx_wWY9<;kEY}XP~hNXDkf>+*FT?mZKqR`j{*k2TK|> zu0F*kd`ei{yKhIZAD*7+(zYu+1~E-%Tt|`9R4JHk+Vn>(+(V1h>$!+%p~DcLZAzDDrgvwTh<%En<60IwTynoNF2v)#Dj6)|D|p@4<4H?u z`gf9JYT+)&8KkR_ZzJ6;+b%Lbe?di(pY7;cpVY<}$E_7UFI_bHnPn7xw$X$x0QA|X zA-AX^EYcrvgkaDeLoF*ZvOE#KCzLgZjGI`VI3HP8kh`$&-$dn!+0e1I@A5X)SnF)m zHagy78PGu*_R`*pCxF{inCeqU#ZGGA^CSwNrg^^rhVPI~TejS1j&XGkZ zRU3L|^f$_qVjBR0AP*(^=+{PAq-l=3LEH7}oYt9Y3KP~Ca|wpqCOnbxf54O{lZKu7 zY;9o)LC)lV;1Sa(ZB}6TRKgECV(Fl!MIS%o$;(m*Qu* zSb`s*!pNg^j6_t^mMO44hUl#^TU_Phq{C!@LqG$Wlsme!uOfo=Id|}iNapzWelI5V zJX<1x5Er%rpY5`P_&70PYAO3*uD6fYU>`A2i`GgzIC{aK9hPBsUFO{G)k@D3!Ft#^ zzn7m2#tUB(7gqYp&k}aXm}9mNivB_ix}~w=h(QZGivHBrjcn^pVeYXngABS9CD{ zYJpInm@9N^U{NZ964eHLXz}dCJ@@(MRL!+!I3b9>CBY8_UMRl9_D2jlu{W~cE6P(~ zPt?1C7aQof8yuAZlYzM7*lAgG+NqCiz}%%F;UF1>m=i;Y>Ma)BRn9lCnQDk-yYsg2 zii82(yF)u&xQc$Dr&0Zqb>Ggpv^pgc(833Y8MT7wrw;itMA?WRjtn=T8JT*Eo8R=) z3^r@iP7Or{(ubvt7t+QE1lM%OKAflJ`gI?LJx0_5dXK;GqSBl7zByloeG&4<^bRnW zuBNOL6rDrIUl8yMOI5{&D2YAZlDvl<^}_3uBC#K-jKp>l78^)SGs0D!URx)$l}E;nEZ7q zC?&K(FiamU#*dp)7%?t`VG%dNC8iRD#5Tz43!3X-@|@EA&+kSfETGL8c) z#JCPTy#+7{8B-6n)*~L^_-5eik?FH4%krvH)GDplv`fcN9$< z!652OOmg7y)+mImZ1NZ`k|s(8K2wfDP`^GgkA&0}=}POl2~V~c&Fai|+Yg2qG<=VF zNjwry3FAmxo|PdiC8sJtuvNIR!pNKH{oHzlM+}wG3Ik9~;r;zbQK5W&499vvTLdLSCiA7b^s%183?iGlS(jEJReqtV)Uf#KoZisZ^>E_PPn+=)bdqNa%3V64@8;!O3%3-66b z!0%eb7DB!8cLStrEOX~vhF268FzhV50dobWH0`utg(e_YNl4;}Jpp_BF_|gAqwp&l zqs<8iDTH%MPGMC!fMy`+YAj*Ln^3S1?VD(3t6V{(E+C$v;5bbRv3yU-;-3($CPU21 zqctF|HkL&d{y35A=9pfoU{P5-aCwsVMHj?X&JMH7Ckg9%YVK#Q%YEU<>w1@LQS{N2 z)EJ|iCkOr3&KB&L={I#_Z;B_Py7VCrczsDA{MofYO$IRCWNPm#a64hS=cGF!0u<%g zyqU9ZKH7DobBvdvh4I^Kq1f9S5)DR! z$J?T_SWLlEj=Q+Ln21CxUaXgr$p*Z(so>J+JuQyR;iX%T+_UzlcLEZrEl)0w*0O7I z876%EqR$;zn{@u0d}sCS49Q||-Xt0p2$9tRBUpf=E6+4i zwTqag>(Lha>j-aS3p-L>vQ#^Otuj3sFI(a(6wup31XTC}+4eW^AWd`JG+M=gZ{<|? zA!W+@O~)fDK_dbvL5QDCVW1|~9-)b!9zVy%W*7|@kd&Sfjnn0-R2=L!ZA8jZm_;bL z$r+I|3c7Q|oY#zcJsSCOB%!qwM{zvAOf*JH51YTM(N3&c4Tk6gH@|cP0~@Fc5n<~~ zVNjMPql{?9`RKcOLemeFYvr-Zyi%pX2PVjlA%*0e9=hIZ z6$F_hDe2M~`j1ijABEl>cGHtcCI#~PRngGf4m?PBif)k;PeKaqL=;JK^Al#pp}|Gt zW4U;btO6_gLE`w-31I}iVohUZxybD0o_7huUxBEt9GQjr`Y>glh=e8X2tcZ_-}eT^ zbV#?CkuZx+j&SmIoC-l0HLhihT6iR*aR@OM=4e)!0Y;0LR3NTY{Y10D7rMvPb2x0p zRg{ubIhki$kicY(SgC@e@XrYK0Wo{whFy%yImGu8tK@Ij_a*^aD(w^#f$WbbkJzqqwO>_^=?z)f={&23rKMHdX zEG4KseK+@n`7gi7YwM8KJLUR4aENagdLa;0RQ`Bzb#;2-;432(EVwF861}oh4P7P- zpW2i>gEOQB^&Go*5J{$6FNoLllzUMud|C3ZML{9elcw3NgHV&C(3*~{>=Ggwm47(U z=xBPaff%AoEEES+CWw2bi*shCX?2z7AIcZ`X6&2tygriBGKzr7*L{J6OtCO~$za*A zy8DovuZ@4aBZ$tswnawc>Esq;Rf(aaQc+Y(C)3nO+%J1+b@6tzo8fmgGw?4Q84Z5} z=YywFDLzg!@G__S2v{dH=q5mp8+^BL={OD8IqW?n1&BSHCVdU4Y4LhnwS59qhBk@G zhF&u%WGJEW680HQOO1U$hhdklUDR+)X7c2-@ypIe zRq%bW-jL1Xo4(?{AzUOG_o`X-P|8tI0Ms*x)ooOoe$$)zubJ?gIcim%czJ`^+@h4F z(vTTxg)WHRSJnj}LlWdM=SWC>)Y!rFkzWMf&Lnl!6mO0^5uhuI6MBznV*&6iVk(W+ zDWlmLH z^Se`fO|vYbvj%2s>(ylPDMgkV=1&YlHrhtmCt>!S3? z2Te_9FcKYDG!3q!f0s~u!oG(YIp1S6qUQwqn zycMe&0;WWxT2!ID!AKKIEUw?(OPAX}tD+3j&KpTWVG+}lZ?zg;w1;o!U?=&M*5Cc6 zzG1r=FE|f67eIrbQG*c~-KAzan zu%sW%7$g0dqb*?$_{nMdmQEs#C3D;3&TH08j1J{>Zca!O-!rH=wd{??JgWfIozcQ< zYsK`zkY-=6{c?3}P{=XFqzwG7cbn~KLT4Ci=U^CnO9Nt|AZ@B*@UN4DjdSNR{#Zw3 zi=kL3d{l)NNEc(*Io28K2g(4kulIt+4spHjWJcHwi#vQ86JCDA;C496wScV;`qOO3 z*-?ky9y3lBrv&IYy*TuQGE(7V`Na-6Kmc3qUnNM zo)E;Cihf1jGT$^ogfvq9~jZHHbE7DecIM}N_05U zKfiwK-?ozFLUS4h^Tph=w&SN=G4O|8sS2qVVtvZm0Nape&etw(40#%Dc=(v?SLLH~ zHW)RzPU0m+40X#m!m}{;imU6)W7M6o#xu5bEXfA9uq@R-+ffQ?s&Y50Ng_Wtl*0{#R~r(yE_CX-vWk~2&8LYC&; zTIf2WPw8RYYAqv{5i9F{4K=dzWX!_SC#T?xGS=1*4CwIR%QxZ`6CAz&6Zb(>gk7!s z)2C*OGO?Ods|xVUV16RpXHgiQ*$o6ic?7uZ&8xC{4^jWS`h4WUrnxasEJ%T`V0Qs> z@Xb4^S&}`Zjl3AZN?%Zzj~osrbJ1f&M_(rTQxOz_t8_icrLTklrmg#UMKB0SRcC5d}FgcI;B$VfyPyMFe=CG0wXlW`{ zMgOFJpX`bG@!@{uR?8a<5*DCqoVW)l*tz!p8ef>aweN@+0dYXj9X=;JnxTq)ep$ZB zM8k(5ax0vV5FE5>OV?(aSOO0m9UMfzd=XeD5OhY%_S}a(slme^2p^iG)qm%WCKK%g zb}T8*>xrYfh@we_e}AS4dl7?0k$sw4Kn>7G0w7&{$&42ZPK5a`Z438hc8P}g|GmP_ zZu^ksM1$q7R)$>)fPsxzMQDmpHb+rSCp~(+AlB!wU1WtIabF=*Dcx#fMBm*5K zh;h0d9_D&IbLc{X8dh@CPAXTva0-RTj{5DqWRh{lAAjQCuiU zPzK;)rm|p|1x8052w^5ah9{sLf12gD{t0X86|LWQwQWN~iBEil!o~Mq#@U{HQ3>W9 zu~R>%$7B<87XIr^fAaso750DM%_jf%O@FeD_ZhPg+5xV(N8&)=i707gZ)vu)FZ*sb zajt2de&|K&R7_xrDll}5=s+)IA0h4b9CYOhuX5fZHC(Q>V;(0~dE|m7=!4Mf%tN*% zQqFe`7s%11sHx$jT0%FH$^o1IVFChJTPoxCNyAv4hUGLf9F#TD7{Iaq1tlNJNFPM_ z&q4H&DEu}#H1S`EF~&JfKN*yoxR@F&Eu_mf^SHm&^wsHG`TshFg!b>4X#X!^Ep8s- zn|FX>19o;kSg)l8&md-dpOg#kkYzcG`+pQV$?u$__7XVZTEmWkr;m?-|8=_bWw>=E2kMwuEr&%Kr_y4#BB#A92_F~+%%W=yUbx=l(O zkV~+{`fOAo`So$e z#6bkQDJA+o&*pz46Z=B2Gm&gShxVK&SV<2l({;L+b+rxA3oH03g7|+v;O`0 z2`PCipB_}E=J^{e#VoVX3{Za+Rc|}-yMw(Nr2Icj*Z_RXhRMv6weVcEw?S^g7WeM9 zz=F`CCUiTgg-rjXkVHaq7yQ|-TQ?HaS+2b1mK*{dKT!ebNr*WiwlcTF&1@S3tUvfy9l52D*!e&6q5gOEmBUU&*y$_mKVfiZ=R zXjEzIYU}<&FeuwDlgyjc5~&@)CF|ByYRHL$xMC?pD8!7#%#2cJirq04xjg>pDw8(< zdl3EiY7F5`DDl2=^EiIfDDr^>)6u2S^x>(+vANSf)f6b19c*g)r3hwL$~?fkJUf9u z9vde_^Z24mq`K$nJbVLw^|wq^f5$}i?@ZRiEi%e&n`YcBfPI=b05A zB?5a*nt)NpGA4@hjSy=4T@B!=s85{-AIImjqwYPMfv^B3$R2sK(;LnMSURwfZhfDO zdPsfX&*Yr2(IijS)Fo&SOxOQm@&@<-nh(i1Mvfg%b0l7Ph{9;M1Y><+3TdNuxs zX;g+1g6ErBjh36^J1OV%#Q~HGn<0Yyk9aMF3YlK8)cEqRzh$ESJ0|LXX9}@k)&q-4 z09*T`8O~tJgDi#pW$zMOKa1XRvgDh>0*%ZCH?=@KaMFa_U;|}rQB<>BK1a9I|Fp;r zL9E07i}}RAKh4J5;#H5&!g%9a%Ytgy*3o`{pGUBV5JEujhyOoJxByK^zXpPei^xy1 z%jU^RfDs-#T!5b_Ig)PNG&%k`h>oMpZ}3dznJ;FDXK#Uu9ykZ}*7m~+9T+o#t&*Xh zWX*5_`?pLqf5$}g?@YH7V8KduAxI*UJZ^c7zSz(^u#<>t6Si`5{slX%I$*7eVD)Cg zgmr0>h&@Y~HdL6;MC2-Zz80i&+7Ym#zNEC#T6es5x{msd2`X7y!b{8w1BI&%b9oCc z$9E?#Pk6Tf!$bmb$)6cNwk;U`(~FO<5G}fYEFBpCyl-rbNXB0G&)cM3$2D+Hl#+p% z9K#yee;Kg>C8wRl(%B%^hOQ1KMcoRIUGuk0^nb@h|L;tuJ);@!77wtAd%Ha#Xt~an zM{{)fmnUTuCoe{0?E;V;M*^oFtrFaP#;I#$`SA)(4*hi;s}wSf^OH5S^nwQVs5NJQBo8+OO?g|65I`e#t3}p2(FNDi&pjBvQUT(mBmr zZ>2>w&^HPHjF+FJxqv0hefz|83CYhR&(4b&FS+gJY7>U>A_pkc%`c6d=6}n?@OMlM z|ISqPj0Tf4sPIbmTECU>v@?RFXEikMZ@`IjqX@Q-AOyDV`KsXBOm;iLc0Bp}0WG({ z73%#uzY_K7x4jdWwcYpb!Riv>;`9Mw�_Dlt)wVB=Q9hRIl1ohh0uxwiMrgn8*Rj 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